Parcourir la source

Merge branch 'feature/v1.0.30' into dev/v1.0.30_zsy

# Conflicts:
#	apps/bigmember_pc/src/views/business/detail.vue
zhangsiya il y a 1 an
Parent
commit
181d5420d3
26 fichiers modifiés avec 814 ajouts et 42 suppressions
  1. 2 1
      .vscode/settings.json
  2. 1 0
      apps/bigmember_pc/config/proxy.js
  3. 1 0
      apps/bigmember_pc/src/api/modules/index.js
  4. 11 0
      apps/bigmember_pc/src/api/modules/message.js
  5. 8 0
      apps/bigmember_pc/src/api/modules/pay.js
  6. BIN
      apps/bigmember_pc/src/assets/images/icon/fireworks.png
  7. BIN
      apps/bigmember_pc/src/assets/images/workspace/my-claim.png
  8. BIN
      apps/bigmember_pc/src/assets/images/workspace/my-collect.png
  9. BIN
      apps/bigmember_pc/src/assets/images/workspace/my-customer.png
  10. BIN
      apps/bigmember_pc/src/assets/images/workspace/my-gen.png
  11. BIN
      apps/bigmember_pc/src/assets/images/workspace/my-project.png
  12. BIN
      apps/bigmember_pc/src/assets/images/workspace/shangjiqingbao.png
  13. 0 0
      apps/bigmember_pc/src/store/workspace/account-info.js
  14. 6 2
      apps/bigmember_pc/src/store/workspace/common-use.js
  15. 2 2
      apps/bigmember_pc/src/store/workspace/subscribe.js
  16. 87 0
      apps/bigmember_pc/src/views/workspace/components/AccountInfo.vue
  17. 38 0
      apps/bigmember_pc/src/views/workspace/components/AnalysisReport.vue
  18. 181 0
      apps/bigmember_pc/src/views/workspace/components/BusinessToDo.vue
  19. 81 0
      apps/bigmember_pc/src/views/workspace/components/ChatList.vue
  20. 54 9
      apps/bigmember_pc/src/views/workspace/components/CommonUse.vue
  21. 148 0
      apps/bigmember_pc/src/views/workspace/components/MyUseCount.vue
  22. 38 0
      apps/bigmember_pc/src/views/workspace/components/NewsList.vue
  23. 1 1
      apps/bigmember_pc/src/views/workspace/components/SubscribeList.vue
  24. 44 26
      apps/bigmember_pc/src/views/workspace/dashboard.vue
  25. 110 0
      apps/bigmember_pc/src/views/workspace/ui/ChatItem.vue
  26. 1 1
      apps/bigmember_pc/src/views/workspace/ui/WorkspaceCard.vue

+ 2 - 1
.vscode/settings.json

@@ -1,3 +1,4 @@
 {
-    "prettier.endOfLine": "lf"
+    "prettier.endOfLine": "lf",
+    "files.eol": "\n"
 }

+ 1 - 0
apps/bigmember_pc/config/proxy.js

@@ -16,6 +16,7 @@ const PrefixAPIS = [
   '/userCenter',
   '/jyMerge',
   '/jyapi',
+  '/message',
   // 资源
   '/commonFunctions',
   '/common-module'

+ 1 - 0
apps/bigmember_pc/src/api/modules/index.js

@@ -27,3 +27,4 @@ export * from './course'
 export * from './jyMerge'
 export * from './crmApplication'
 export * from './pay'
+export * from './message'

+ 11 - 0
apps/bigmember_pc/src/api/modules/message.js

@@ -0,0 +1,11 @@
+import request from '@/api'
+
+// 获取聊天会话列表
+export function getUserSessionList(data) {
+  return request({
+    baseURL: '/jyapi',
+    url: '/message/userList',
+    method: 'post',
+    data
+  })
+}

+ 8 - 0
apps/bigmember_pc/src/api/modules/pay.js

@@ -48,3 +48,11 @@ export function filePackUseHistory(data) {
     data
   })
 }
+
+export function getUserAccountShow() {
+  return request({
+    baseURL: '/jypay',
+    url: '/user/account/show',
+    method: 'POST'
+  })
+}

BIN
apps/bigmember_pc/src/assets/images/icon/fireworks.png


BIN
apps/bigmember_pc/src/assets/images/workspace/my-claim.png


BIN
apps/bigmember_pc/src/assets/images/workspace/my-collect.png


BIN
apps/bigmember_pc/src/assets/images/workspace/my-customer.png


BIN
apps/bigmember_pc/src/assets/images/workspace/my-gen.png


BIN
apps/bigmember_pc/src/assets/images/workspace/my-project.png


BIN
apps/bigmember_pc/src/assets/images/workspace/shangjiqingbao.png


+ 0 - 0
apps/bigmember_pc/src/store/workspace/account-info.js


+ 6 - 2
apps/bigmember_pc/src/store/workspace/common-use.js

@@ -35,7 +35,7 @@ export default {
   namespaced: true,
   state: () => ({
     platform: 'PC',
-    maxCount: Infinity,
+    maxCount: 8,
     dialogShow: false,
     menuInfoList: [], // 请求回来的原始数组
     allFunctionsContainsUsable: [], // 全部功能,包含可用的和不可用的(扁平化后)
@@ -122,6 +122,9 @@ export default {
       if (Array.isArray(list)) {
         state.mainFunctions = list
       }
+    },
+    setCommonMaxCount(state, num) {
+      state.maxCount = num
     }
   },
   actions: {
@@ -183,7 +186,8 @@ export default {
           }
         )
         if (code === 0 && data) {
-          commit('setCommonList', data)
+          commit('setCommonList', data.list)
+          commit('setCommonMaxCount', data.num)
         } else {
           commit('setCommonList', [])
         }

+ 2 - 2
apps/bigmember_pc/src/store/workspace/subscribe.js

@@ -5,7 +5,7 @@ export default {
   state: () => ({
     params: {
       pageNum: 1,
-      pageSize: 5,
+      pageSize: 10,
       format: 'table',
       area: '',
       time: ''
@@ -67,7 +67,7 @@ export default {
               _id: v._id,
               title: v.title,
               unread: false,
-              time: v.publishtime ? v.publishtime * 1000 : 0
+              time: v.publishTime ? v.publishTime * 1000 : 0
             }
           })
           // commit('changeHasKeyState', hasKey)

+ 87 - 0
apps/bigmember_pc/src/views/workspace/components/AccountInfo.vue

@@ -0,0 +1,87 @@
+<template>
+  <section class="user-info-card">
+    <h4 class="user-info-title">
+      <span class="user-info-title-fireworks"></span>
+      <span class="user-info-title-text highlight-text"
+        >欢迎您!<i class="user-nickname">{{ accountInfo.nickName }}</i></span
+      >
+    </h4>
+    <p class="user-info-line user-info-type">
+      <span class="user-info-line-label">账号类型:</span>
+      <span class="user-info-line-value">{{ accountInfo.vipType }}</span>
+    </p>
+    <p class="user-info-line user-info-time" v-if="accountInfo.vipEntTime">
+      <span class="user-info-line-label">会员服务到期时间:</span>
+      <span class="user-info-line-value">{{ accountInfo.vipEntTime }}</span>
+    </p>
+  </section>
+</template>
+
+<script>
+import { getUserAccountShow } from '@/api/modules/'
+export default {
+  name: 'UserAccount',
+  data() {
+    return {
+      accountInfo: {
+        nickName: '',
+        vipType: '',
+        vipEntTime: ''
+      }
+    }
+  },
+  mounted() {
+    this.getAccount()
+  },
+  methods: {
+    async getAccount() {
+      const { data } = await getUserAccountShow()
+      if (data) {
+        const { nickname, vipType, vipEntTime } = data
+        this.accountInfo.nickName = nickname
+        this.accountInfo.vipType = vipType
+        this.accountInfo.vipEntTime = vipEntTime
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.user-info-card {
+  padding: 12px 20px;
+  margin-bottom: 16px;
+  border-radius: 8px;
+  background: #fff;
+  .user-info-title {
+    display: flex;
+    align-items: center;
+    margin-bottom: 6px;
+    &-fireworks {
+      display: inline-block;
+      width: 24px;
+      height: 24px;
+      margin-right: 8px;
+      background: url('~@/assets/images/icon/fireworks.png') no-repeat center;
+      background-size: contain;
+    }
+    &-text {
+      font-size: 16px;
+      line-height: 24px;
+    }
+  }
+  .user-info-line {
+    font-size: 14px;
+    line-height: 22px;
+    &-label {
+      color: #999999;
+    }
+    &-value {
+      color: #1d1d1d;
+    }
+  }
+  .user-info-type {
+    margin-bottom: 4px;
+  }
+}
+</style>

+ 38 - 0
apps/bigmember_pc/src/views/workspace/components/AnalysisReport.vue

@@ -0,0 +1,38 @@
+<template>
+  <ListCard
+    class="news-list"
+    :list="newsList"
+    title="分析报告"
+    @clickListItem="clickListItem"
+    @linkMore="linkMore"
+    :loading="loading"
+    :loaded="loaded"
+  >
+    <div slot="empty-content" class="empty-content">
+      <p>暂无数据</p>
+    </div>
+  </ListCard>
+</template>
+
+<script>
+import ListCard from '../ui/ListCard'
+
+export default {
+  name: 'AnalysisReport',
+  components: {
+    ListCard
+  },
+  computed: {},
+  data() {
+    return {
+      loading: true,
+      loaded: false,
+      newsList: []
+    }
+  },
+  methods: {
+    clickListItem(item) {},
+    linkMore() {}
+  }
+}
+</script>

+ 181 - 0
apps/bigmember_pc/src/views/workspace/components/BusinessToDo.vue

@@ -0,0 +1,181 @@
+<template>
+  <section class="business-todo-card">
+    <header class="card-header">
+      <div class="card-header-tabs">
+        <span
+          :class="{ active: activeName === tab.id }"
+          v-for="tab in tabs"
+          :key="tab.id"
+          @click="onTabClick(tab.id)"
+          >{{ tab.name }}</span
+        >
+      </div>
+      <div class="card-header-more" @click="linkMore">
+        <span class="more-text">更多</span>
+        <span class="el-icon-jy-blue-more"></span>
+      </div>
+    </header>
+    <transition name="el-fade-in-linear">
+      <div>
+        <main class="card-main" v-show="activeName === '1'">
+          <div class="chat-list" v-if="businessList.length != 0">
+            <ChatItem
+              v-for="(item, index) in businessList"
+              :key="index"
+              v-bind="item"
+            ></ChatItem>
+          </div>
+          <div class="empty-wrapper" v-else>
+            <Empty class="empty-mini" direction="row" :mtb60="false">
+              <slot name="empty-content">暂无数据</slot>
+            </Empty>
+          </div>
+        </main>
+        <main class="card-main" v-show="activeName === '2'">
+          <div class="chat-list" v-if="todoList.length != 0">
+            <ChatItem
+              v-for="(item, index) in todoList"
+              :key="index"
+              v-bind="item"
+            ></ChatItem>
+          </div>
+          <div class="empty-wrapper" v-else>
+            <Empty class="empty-mini" direction="row" :mtb60="false">
+              <slot name="empty-content">暂无数据</slot>
+            </Empty>
+          </div>
+        </main>
+      </div>
+    </transition>
+  </section>
+</template>
+
+<script>
+import ChatItem from '../ui/ChatItem.vue'
+import Empty from '@/components/common/Empty.vue'
+import { getAssetsFile } from '@/utils'
+
+export default {
+  name: 'BusinessToDo',
+  components: {
+    ChatItem,
+    Empty
+  },
+  data() {
+    return {
+      tabs: [
+        { id: '1', name: '商机情报' },
+        { id: '2', name: '待办' }
+      ],
+      activeName: '1',
+      businessList: [
+        {
+          id: '11',
+          title: '您有一条新的专属商机情报',
+          time: '2020年10月8日 9:30',
+          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
+          img: getAssetsFile('workspace/shangjiqingbao.png')
+        },
+        {
+          id: '11',
+          title: '您有一条新的专属商机情报',
+          time: '2020年10月8日 9:30',
+          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
+          img: getAssetsFile('workspace/shangjiqingbao.png')
+        },
+        {
+          id: '11',
+          title: '您有一条新的专属商机情报',
+          time: '2020年10月8日 9:30',
+          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
+          img: getAssetsFile('workspace/shangjiqingbao.png')
+        },
+        {
+          id: '11',
+          title: '您有一条新的专属商机情报',
+          time: '2020年10月8日 9:30',
+          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
+          img: getAssetsFile('workspace/shangjiqingbao.png')
+        },
+        {
+          id: '11',
+          title: '您有一条新的专属商机情报',
+          time: '2020年10月8日 9:30',
+          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
+          img: getAssetsFile('workspace/shangjiqingbao.png')
+        }
+      ],
+      todoList: []
+    }
+  },
+  methods: {
+    linkMore() {},
+    onTabClick(index) {
+      this.activeName = index
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@include diy-icon('blue-more', 16, 16);
+.business-todo-card {
+  flex: 1;
+  max-width: 49%;
+  border-radius: 8px;
+  background: #fff;
+  box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.02);
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 10px 16px 10px 0;
+    &-tabs {
+      span {
+        display: inline-block;
+        padding: 0 16px;
+        font-size: 18px;
+        line-height: 28px;
+        color: #686868;
+        cursor: pointer;
+      }
+      .active {
+        position: relative;
+        color: #1d1d1d;
+        &::after {
+          position: absolute;
+          content: '';
+          left: 16px;
+          right: 16px;
+          bottom: -4px;
+          height: 2px;
+          background: $color_main;
+        }
+      }
+    }
+    &-more {
+      display: flex;
+      align-items: center;
+      font-size: 14px;
+      color: $color_main;
+      line-height: 22px;
+      cursor: pointer;
+      .more-text {
+        margin-right: 4px;
+      }
+    }
+  }
+  .card-main {
+    padding: 0 12px 16px;
+  }
+  ::v-deep {
+    .chat-item {
+      .chat-item-l {
+        width: 32px;
+        height: 32px;
+        background: transparent;
+      }
+    }
+  }
+}
+</style>

+ 81 - 0
apps/bigmember_pc/src/views/workspace/components/ChatList.vue

@@ -0,0 +1,81 @@
+<template>
+  <section class="chat-card">
+    <header class="chat-card-header">
+      <h4>聊天</h4>
+    </header>
+    <main class="chat-card-main">
+      <div class="chat-list">
+        <ChatItem
+          v-for="(item, index) in list"
+          :key="index"
+          v-bind="item"
+        ></ChatItem>
+      </div>
+    </main>
+  </section>
+</template>
+
+<script>
+import ChatItem from '../ui/ChatItem'
+import { getUserSessionList } from '@/api/modules/'
+import { dateFormatter } from '@/utils/'
+export default {
+  name: 'ChatList',
+  components: {
+    ChatItem
+  },
+  data() {
+    return {
+      list: []
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      const { data } = await getUserSessionList({
+        userType: 2,
+        queryType: 2,
+        page: 1,
+        size: 3
+      })
+      if (data) {
+        const list = data.map((v) => {
+          return {
+            id: v.userId,
+            title: v.name,
+            content: v.content ? v.content.replace(/<p>/g, '') : '',
+            img: v.headimg,
+            name: v.headimg ? '' : this.getName(v.name),
+            time: v.create_time
+              ? dateFormatter(v.create_time * 1000, 'yyyy-MM-dd')
+              : ''
+          }
+        })
+        this.list = list
+      }
+    },
+    getName(name) {
+      if (!name) return
+      return name.slice(-2)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.chat-card {
+  margin-bottom: 16px;
+  border-radius: 8px;
+  background: #fff;
+  &-header {
+    padding: 12px 20px 8px;
+    font-size: 18px;
+    line-height: 28px;
+  }
+  .chat-list {
+    padding: 0 12px 8px;
+  }
+}
+</style>

+ 54 - 9
apps/bigmember_pc/src/views/workspace/components/CommonUse.vue

@@ -1,12 +1,19 @@
 <template>
-  <WorkspaceCard class="work-common" title="常用功能">
+  <WorkspaceCard class="work-common">
+    <span slot="header-title">
+      我的常用
+      <span class="header-title-count"
+        >(<i class="highlight-text">{{ commonList.length }}</i
+        >/{{ maxCount }})</span
+      >
+    </span>
     <span slot="header-right" class="header-right-set" @click="setCommonFun"
-      ><i class="icon-set-img"></i> 设置</span
+      ><i class="icon-set-img"></i> 自定义</span
     >
     <div class="common-lists">
       <div
         class="list-item"
-        v-for="item in commonList"
+        v-for="item in calcList"
         :key="item.id"
         @click="openLink(item)"
       >
@@ -78,7 +85,10 @@
         @scroll="handleScroll($event)"
       >
         <div class="added-function">
-          <h3 class="added-title">已添加({{ addedList.length }})</h3>
+          <h3 class="added-title">
+            已添加(<span class="highlight-text">{{ addedList.length }}</span
+            >/{{ maxCount }})
+          </h3>
           <transition-group
             class="added-container"
             name="drag"
@@ -210,7 +220,8 @@ export default {
       enterIndex: '',
       tabActive: 0,
       tabFixed: false,
-      isScrollAnchor: true
+      isScrollAnchor: true,
+      calcList: []
     }
   },
   computed: {
@@ -233,6 +244,7 @@ export default {
       if (val) {
         this.addedList = JSON.parse(JSON.stringify(val))
         this.formatMainFunList(this.addedList)
+        this.computedCommonList()
       }
     },
     mainFunctions(val) {
@@ -252,8 +264,15 @@ export default {
     await this.getCanUseFunctions()
     await this.getAllFunctions({ vm: this })
   },
+  mounted() {
+    this.$nextTick(() => {
+      this.computedCommonList()
+    })
+    window.addEventListener('resize', this.computedCommonList)
+  },
   beforeDestroy() {
     window.removeEventListener('scroll', this.handleScroll)
+    window.removeEventListener('resize', this.computedCommonList)
   },
   methods: {
     ...mapMutations('workspace/commonUse', [
@@ -415,6 +434,9 @@ export default {
       this.updateMainFunStatus(item)
     },
     onAddFun(item) {
+      if (this.addedList.length >= this.maxCount) {
+        return this.$toast(`已添加满${this.maxCount}个,请移除部分功能后再添加`)
+      }
       item.status = true
       this.addedList.unshift(item)
       this.updateMainFunStatus(item)
@@ -501,6 +523,22 @@ export default {
       })
       this.transferSave(ids)
       this.$forceUpdate()
+    },
+    /**
+     * P442需求 PC端根据屏幕大小,按照展示一行的规范截取前几个展示(保证占位位一行)
+     * 1.通过获取父级盒子宽度除以单个应用宽度(120),计算出一行可展示几个应用
+     * 2.通过监听resize事件 通过屏幕宽度变化实时动态改变一行应用个数
+     */
+    calcModuleCount() {
+      const containerWidth = this.$root.$el.querySelector(
+        '.work-common .card-content'
+      ).clientWidth
+      return parseInt((containerWidth - 40) / 120)
+    },
+    computedCommonList() {
+      const column = this.calcModuleCount()
+      const calcList = this.commonList.slice(0, column)
+      this.calcList = calcList
     }
   }
 }
@@ -746,6 +784,11 @@ $main: #2cb7ca;
       }
     }
   }
+  .header-title-count {
+    font-size: 14px;
+    line-height: 22px;
+    color: #686868;
+  }
 }
 .icon-box-container {
   display: flex;
@@ -795,7 +838,8 @@ $main: #2cb7ca;
 .common-lists {
   padding: 0 20px;
   display: flex;
-  flex-wrap: wrap;
+  overflow: hidden;
+  // flex-wrap: wrap;
   .list-item,
   .list-add {
     width: 120px;
@@ -805,6 +849,7 @@ $main: #2cb7ca;
     align-items: center;
     text-align: center;
     cursor: pointer;
+    flex-shrink: 0;
   }
   .list-item {
     // flex: 1;
@@ -820,9 +865,9 @@ $main: #2cb7ca;
     font-size: 14px;
     line-height: 20px;
     color: #1d1d1d;
-    @media only screen and (max-width: 1280px) {
-      font-size: 12px;
-    }
+    // @media only screen and (max-width: 1280px) {
+    //   font-size: 12px;
+    // }
   }
   .item-img {
     width: 44px;

+ 148 - 0
apps/bigmember_pc/src/views/workspace/components/MyUseCount.vue

@@ -0,0 +1,148 @@
+<template>
+  <section class="my-use-counts">
+    <header class="card-header">我的</header>
+    <main class="card-main">
+      <div
+        class="count-item"
+        v-for="item in countsList"
+        :key="item.name"
+        :style="{ background: item.bg }"
+      >
+        <el-image class="count-item-icon" :src="item.icon"></el-image>
+        <div class="count-item-box">
+          <p class="item-name">{{ item.name }}</p>
+          <p class="item-count" v-if="item.num">
+            <span class="item-count-text">{{ item.num }}</span>
+            <span class="item-count-unit">{{ item.unit }}</span>
+          </p>
+          <p class="item-href" v-else>
+            <span>{{ item.noText }} &gt;</span>
+          </p>
+        </div>
+      </div>
+    </main>
+  </section>
+</template>
+
+<script>
+import { Image } from 'element-ui'
+import { getAssetsFile } from '@/utils'
+export default {
+  name: 'MyUseCount',
+  components: {
+    [Image.name]: Image
+  },
+  data() {
+    return {
+      countsList: [
+        {
+          name: '项目进度监控',
+          num: 10,
+          unit: '个',
+          bg: 'linear-gradient(#D2EEFB, #EBF6FB)',
+          icon: getAssetsFile('workspace/my-project.png'),
+          noText: '前往添加'
+        },
+        {
+          name: '企业情报监控',
+          num: 10,
+          unit: '个',
+          bg: 'linear-gradient(#D2FDEE, #ECFCF6)',
+          icon: getAssetsFile('workspace/my-gen.png'),
+          noText: '前往添加'
+        },
+        {
+          name: '收藏的标讯',
+          num: 5000,
+          unit: '条',
+          bg: 'linear-gradient(#FFEBD7, #FFF8F1)',
+          icon: getAssetsFile('workspace/my-collect.png'),
+          noText: '前往收藏'
+        },
+        {
+          name: '客户监控',
+          num: 0,
+          unit: '个',
+          bg: 'linear-gradient(#FFE2DE, #FFF6F4)',
+          icon: getAssetsFile('workspace/my-customer.png'),
+          noText: '前往添加'
+        },
+        {
+          name: '已认领项目',
+          num: 10,
+          unit: '个',
+          bg: 'linear-gradient(#FFE2DE, #FFF6F4)',
+          icon: getAssetsFile('workspace/my-claim.png'),
+          noText: '前往认领'
+        }
+      ]
+    }
+  },
+  mounted() {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+@include diy-icon('blue-more', 16, 16);
+.my-use-counts {
+  margin-top: 16px;
+  border-radius: 8px;
+  background: #fff;
+  .card-header {
+    padding: 12px 20px 8px;
+    font-size: 18px;
+    line-height: 28px;
+  }
+  .card-main {
+    display: flex;
+    align-items: center;
+    padding: 8px 20px 16px;
+    .count-item {
+      position: relative;
+      height: 98px;
+      border-radius: 8px;
+      flex: 1;
+      &-icon {
+        position: absolute;
+        top: 12px;
+        right: 10px;
+        width: 32px;
+        height: 32px;
+      }
+      &-box {
+        padding: 16px;
+        .item-name {
+          font-size: 14px;
+          line-height: 22px;
+          color: #686868;
+        }
+        .item-count {
+          display: flex;
+          align-items: flex-end;
+          margin-top: 8px;
+          &-text {
+            font-size: 36px;
+          }
+          &-unit {
+            font-size: 14px;
+            line-height: 22px;
+          }
+        }
+        .item-href {
+          display: flex;
+          align-items: center;
+          margin-top: 16px;
+          font-size: 16px;
+          line-height: 24px;
+          color: #1d1d1d;
+          cursor: pointer;
+        }
+      }
+      &:not(:last-child) {
+        margin-right: 12px;
+      }
+    }
+  }
+}
+</style>

+ 38 - 0
apps/bigmember_pc/src/views/workspace/components/NewsList.vue

@@ -0,0 +1,38 @@
+<template>
+  <ListCard
+    class="news-list"
+    :list="newsList"
+    title="要闻"
+    @clickListItem="clickListItem"
+    @linkMore="linkMore"
+    :loading="loading"
+    :loaded="loaded"
+  >
+    <div slot="empty-content" class="empty-content">
+      <p>暂无数据</p>
+    </div>
+  </ListCard>
+</template>
+
+<script>
+import ListCard from '../ui/ListCard'
+
+export default {
+  name: 'NewsList',
+  components: {
+    ListCard
+  },
+  computed: {},
+  data() {
+    return {
+      loading: true,
+      loaded: false,
+      newsList: []
+    }
+  },
+  methods: {
+    clickListItem(item) {},
+    linkMore() {}
+  }
+}
+</script>

+ 1 - 1
apps/bigmember_pc/src/views/workspace/components/SubscribeList.vue

@@ -2,7 +2,7 @@
   <ListCard
     class="subscribe-list"
     :list="subscribeList"
-    title="我的订阅信息"
+    title="订阅推送"
     @clickListItem="clickListItem"
     @linkMore="linkMore"
     :loading="loading"

+ 44 - 26
apps/bigmember_pc/src/views/workspace/dashboard.vue

@@ -2,10 +2,6 @@
   <el-container class="workspace-dashboard">
     <el-main>
       <CommonUse class="main-module"></CommonUse>
-      <BusinessProfile
-        v-if="businessProfileShow"
-        class="main-module"
-      ></BusinessProfile>
       <div
         class="main-module card-list-module"
         v-for="(moduleList, floor) in mainModuleList"
@@ -17,11 +13,18 @@
           :is="name"
         ></component>
       </div>
-      <div class="main-module card-list-module" v-if="dataReportShow">
+      <MyUseCountVue></MyUseCountVue>
+      <!-- <div class="main-module card-list-module" v-if="dataReportShow">
         <DataReport></DataReport>
-      </div>
+      </div> -->
+      <BusinessProfile
+        v-if="businessProfileShow"
+        class="main-module"
+      ></BusinessProfile>
     </el-main>
     <el-aside width="369px">
+      <AccountInfo></AccountInfo>
+      <ChatList></ChatList>
       <MessageTips class="aside-module"></MessageTips>
       <AsideOthers class="aside-module"></AsideOthers>
     </el-aside>
@@ -37,17 +40,23 @@ import { Container, Aside, Main } from 'element-ui'
 import MessageTips from './components/MessageTips.vue'
 import CommonUse from './components/CommonUse.vue'
 import SubscribeList from './components/SubscribeList.vue'
-import MyCollections from './components/MyCollections.vue'
-import ProjectFollow from './components/ProjectFollow.vue'
-import EntFollow from './components/EntFollow.vue'
-import DataReport from './components/DataReport.vue'
+// import MyCollections from './components/MyCollections.vue'
+// import ProjectFollow from './components/ProjectFollow.vue'
+// import EntFollow from './components/EntFollow.vue'
+// import DataReport from './components/DataReport.vue'
 import AsideOthers from './components/AsideOthers.vue'
-import ClaimList from './components/ClaimList.vue'
+// import ClaimList from './components/ClaimList.vue'
 import ActivityDialog from '@/components/ad/activity-dialog.vue'
 import GuideIntroDialog from '@/components/ad/guide-intro-dialog.vue'
+import AccountInfo from './components/AccountInfo.vue'
+import ChatList from './components/ChatList.vue'
+import BusinessToDo from './components/BusinessToDo.vue'
+import NewsList from './components/NewsList.vue'
+import AnalysisReport from './components/AnalysisReport.vue'
+import MyUseCountVue from './components/MyUseCount.vue'
 const BusinessProfile = () => import('./components/BusinessProfile.vue')
-const MyCustomer = () => import('./components/MyCustomer.vue')
-const CustomerWatcher = () => import('./components/CustomerWatcher.vue')
+// const MyCustomer = () => import('./components/MyCustomer.vue')
+// const CustomerWatcher = () => import('./components/CustomerWatcher.vue')
 export default {
   name: 'WorkspaceDashboard',
   components: {
@@ -59,27 +68,36 @@ export default {
     MessageTips,
     CommonUse,
     BusinessProfile,
-    MyCustomer,
-    CustomerWatcher,
+    // MyCustomer,
+    // CustomerWatcher,
     SubscribeList,
-    MyCollections,
-    ProjectFollow,
-    DataReport,
+    // MyCollections,
+    // ProjectFollow,
+    // DataReport,
     AsideOthers,
-    EntFollow,
-    ClaimList
+    // EntFollow,
+    // ClaimList,
+    AccountInfo,
+    ChatList,
+    BusinessToDo,
+    NewsList,
+    AnalysisReport,
+    MyUseCountVue
   },
   computed: {
     componentsPowerMap() {
       const { myCustomerShow, customerWatcherShow, hasMemberNJPower } = this
       return {
-        ClaimList: hasMemberNJPower,
-        MyCustomer: myCustomerShow,
-        CustomerWatcher: customerWatcherShow,
+        BusinessToDo: true,
+        NewsList: true,
+        // ClaimList: hasMemberNJPower,
+        // MyCustomer: myCustomerShow,
+        // CustomerWatcher: customerWatcherShow,
         SubscribeList: true,
-        MyCollections: true,
-        ProjectFollow: true,
-        EntFollow: true
+        // MyCollections: true,
+        AnalysisReport: true
+        // ProjectFollow: true,
+        // EntFollow: true
       }
     },
     mainModuleList() {

+ 110 - 0
apps/bigmember_pc/src/views/workspace/ui/ChatItem.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="chat-item" v-on="$listeners">
+    <div class="chat-item-l">
+      <img v-if="img" :src="img" alt="" />
+      <span v-else>{{ name }}</span>
+    </div>
+    <div class="chat-item-r">
+      <div class="chat-item-r-top">
+        <span class="r-title ellipsis visited-hd">{{ title }}</span>
+        <span class="r-time" v-if="time">{{ time }}</span>
+      </div>
+      <div class="chat-item-r-bottom ellipsis">{{ content }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ChatItem',
+  props: {
+    img: {
+      type: String,
+      default: ''
+    },
+    name: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    time: {
+      type: [String, Number],
+      default: 0
+    },
+    content: {
+      type: String,
+      default: ''
+    },
+    visited: {
+      type: Boolean,
+      default: false
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.chat-item {
+  padding: 8px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  cursor: pointer;
+  &-l {
+    display: flex;
+    width: 36px;
+    height: 36px;
+    justify-content: center;
+    align-items: center;
+    margin-right: 6px;
+    font-size: 13px;
+    border-radius: 50%;
+    color: #fff;
+    overflow: hidden;
+    background: #2cb7ca;
+    flex-shrink: 0;
+  }
+  &-r {
+    flex: 1;
+    width: 0;
+    &-top {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+    .r-title {
+      width: 70%;
+      font-size: 14px;
+      line-height: 22px;
+      color: #1d1d1d;
+    }
+    .r-time {
+      margin-left: 6px;
+      font-size: 12px;
+      line-height: 20px;
+      color: #999;
+      text-align: right;
+      white-space: nowrap;
+    }
+    &-bottom {
+      margin-top: 2px;
+      color: #686868;
+      font-size: 12px;
+      line-height: 18px;
+    }
+  }
+  &:hover {
+    background: #eaf8fa;
+    border-radius: 8px;
+    .r-title {
+      color: #2cb7ca;
+    }
+  }
+  &:not(:last-child) {
+    border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+  }
+}
+</style>

+ 1 - 1
apps/bigmember_pc/src/views/workspace/ui/WorkspaceCard.vue

@@ -43,7 +43,7 @@ export default {
 
 .workspace-card {
   background-color: #fff;
-  border-radius: 4px;
+  border-radius: 8px;
   box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.02);
 }
 .card-header {