浏览代码

feat:工作桌面首页联调

yangfeng 1 年之前
父节点
当前提交
f6d5180c60

+ 27 - 0
apps/bigmember_pc/src/api/modules/workspace.js

@@ -103,3 +103,30 @@ export function getWhatIsWorkspace() {
     method: 'get'
   })
 }
+
+// 工作台首页-要闻
+export function getWorkspaceNews() {
+  return request({
+    baseURL: '/front',
+    url: '/project/importantNews',
+    method: 'get'
+  })
+}
+
+// 工作台首页-行业分析简报
+export function getWorkspaceIndustryReport() {
+  return request({
+    baseURL: '/front',
+    url: '/project/deskAnalysisReport',
+    method: 'get'
+  })
+}
+
+// 工作台首页-我的企业关注、项目关注、标讯收藏、认领等权益数量(客户监控在另外接口返回)
+export function getWorkspaceEquityCount() {
+  return request({
+    baseURL: '/bigmember',
+    url: '/project/meMonitoring',
+    method: 'get'
+  })
+}

+ 5 - 1
apps/bigmember_pc/src/store/workspace.js

@@ -9,6 +9,8 @@ import projectFollow from './workspace/project-follow'
 import entFollow from './workspace/ent-follow'
 import dataReport from './workspace/data-report'
 import asideOthers from './workspace/aside-others'
+import importantNews from './workspace/important-news'
+import industryReport from './workspace/industry-report'
 
 export default {
   namespaced: true,
@@ -55,6 +57,8 @@ export default {
     entFollow,
     dataReport,
     asideOthers,
-    customerWatcher
+    customerWatcher,
+    importantNews,
+    industryReport
   }
 }

+ 60 - 0
apps/bigmember_pc/src/store/workspace/important-news.js

@@ -0,0 +1,60 @@
+// 要闻
+import { getWorkspaceNews } from '@/api/modules'
+
+export default {
+  namespaced: true,
+  state: () => ({
+    params: {
+      pageNum: 0,
+      pageSize: 10
+    },
+    loading: true,
+    loaded: false,
+    list: []
+  }),
+  mutations: {
+    changeList(state, list = []) {
+      if (Array.isArray(list)) {
+        state.list = list
+      }
+    },
+    changeLoading(state, f = false) {
+      state.loading = f
+    },
+    changeLoaded(state, f = false) {
+      state.loaded = f
+    }
+  },
+  actions: {
+    async getList({ state, dispatch }) {
+      const { params } = state
+      await dispatch('doRequest', params)
+    },
+    async doRequest({ commit }, payload) {
+      try {
+        commit('changeLoading', true)
+        commit('changeLoaded', false)
+        const { data = [], error_code: code } = await getWorkspaceNews(payload)
+        if (code === 0 && data.length) {
+          const list = data.map((v) => {
+            return {
+              ...v,
+              // visited,
+              _id: v._id,
+              title: v.s_title,
+              time: v.time ? v.time : 0
+            }
+          })
+          commit('changeList', list)
+        }
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+        return data || []
+      } catch (error) {
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+        console.log(error)
+      }
+    }
+  }
+}

+ 61 - 0
apps/bigmember_pc/src/store/workspace/industry-report.js

@@ -0,0 +1,61 @@
+// 周报月报
+import { getWorkspaceIndustryReport } from '@/api/modules'
+
+export default {
+  namespaced: true,
+  state: () => ({
+    params: {
+      pageNum: 0,
+      pageSize: 10
+    },
+    loading: true,
+    loaded: false,
+    list: []
+  }),
+  mutations: {
+    changeList(state, list = []) {
+      if (Array.isArray(list)) {
+        state.list = list
+      }
+    },
+    changeLoading(state, f = false) {
+      state.loading = f
+    },
+    changeLoaded(state, f = false) {
+      state.loaded = f
+    }
+  },
+  actions: {
+    async getList({ state, dispatch }) {
+      const { params } = state
+      await dispatch('doRequest', params)
+    },
+    async doRequest({ commit }, payload) {
+      try {
+        commit('changeLoading', true)
+        commit('changeLoaded', false)
+        const { data = [], error_code: code } =
+          await getWorkspaceIndustryReport(payload)
+        if (code === 0 && data.length) {
+          const list = data.map((v) => {
+            return {
+              ...v,
+              // visited,
+              title: v.title,
+              url: v.url,
+              time: v.time ? v.time : 0
+            }
+          })
+          commit('changeList', list)
+        }
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+        return data || []
+      } catch (error) {
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+        console.log(error)
+      }
+    }
+  }
+}

+ 32 - 20
apps/bigmember_pc/src/store/workspace/my-customer.js

@@ -21,7 +21,8 @@ export default {
     },
     loading: true,
     loaded: false,
-    list: []
+    list: [],
+    count: 0
   }),
   mutations: {
     changeList(state, list = []) {
@@ -34,6 +35,9 @@ export default {
     },
     changeLoaded(state, f = false) {
       state.loaded = f
+    },
+    changeCount(state, count) {
+      state.count = count
     }
   },
   actions: {
@@ -45,25 +49,33 @@ export default {
       try {
         commit('changeLoading', true)
         commit('changeLoaded', false)
-        const { data = {}, error_code: code } = await customerQuery(payload)
-        if (code === 0 && data && Array.isArray(data.list)) {
-          const list = data.list.slice(0, 5).map((v) => {
-            // const visited = this.pathVisited(
-            //   this.createPathItem(
-            //     '/myCustomer/*',
-            //     `id=${v.customer_id}
-            //   )
-            // )
-            return {
-              ...v,
-              // visited,
-              _id: v.customer_id,
-              title: v.customer_name,
-              unread: false,
-              time: v.updatetime ? +new Date(v.updatetime * 1000) : 0
-            }
-          })
-          commit('changeList', list)
+        const {
+          data = {},
+          list = [],
+          error_code: code
+        } = await customerQuery(payload)
+        if (code === 0) {
+          if (Array.isArray(list)) {
+            const newList = list.slice(0, 5).map((v) => {
+              // const visited = this.pathVisited(
+              //   this.createPathItem(
+              //     '/myCustomer/*',
+              //     `id=${v.customer_id}
+              //   )
+              // )
+              return {
+                ...v,
+                // visited,
+                _id: v.customer_id,
+                title: v.customer_name,
+                unread: false,
+                time: v.updatetime ? +new Date(v.updatetime * 1000) : 0
+              }
+            })
+            commit('changeList', newList)
+          }
+          // 客户监控数量
+          commit('changeCount', data?.count)
         }
         commit('changeLoading', false)
         commit('changeLoaded', true)

+ 18 - 10
apps/bigmember_pc/src/views/workspace/components/AnalysisReport.vue

@@ -1,7 +1,7 @@
 <template>
   <ListCard
     class="news-list"
-    :list="newsList"
+    :list="list"
     title="分析报告"
     @clickListItem="clickListItem"
     @linkMore="linkMore"
@@ -15,6 +15,7 @@
 </template>
 
 <script>
+import { mapState, mapActions } from 'vuex'
 import ListCard from '../ui/ListCard'
 
 export default {
@@ -22,17 +23,24 @@ export default {
   components: {
     ListCard
   },
-  computed: {},
-  data() {
-    return {
-      loading: true,
-      loaded: false,
-      newsList: []
-    }
+  computed: {
+    ...mapState({
+      loading: (state) => state.workspace.industryReport.loading,
+      loaded: (state) => state.workspace.industryReport.loaded,
+      list: (state) => state.workspace.industryReport.list
+    })
+  },
+  created() {
+    this.getList()
   },
   methods: {
-    clickListItem(item) {},
-    linkMore() {}
+    ...mapActions('workspace/industryReport', ['getList']),
+    clickListItem(item) {
+      window.open(item.url)
+    },
+    linkMore() {
+      window.open('/hybg/')
+    }
   }
 }
 </script>

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

@@ -26,7 +26,7 @@
             ></ChatItem>
           </div>
           <div class="empty-wrapper" v-else>
-            <Empty class="empty-mini" direction="row" :mtb60="false">
+            <Empty class="empty-mini" :mtb60="false">
               <slot name="empty-content">暂无数据</slot>
             </Empty>
           </div>
@@ -40,7 +40,7 @@
             ></ChatItem>
           </div>
           <div class="empty-wrapper" v-else>
-            <Empty class="empty-mini" direction="row" :mtb60="false">
+            <Empty class="empty-mini" :mtb60="false">
               <slot name="empty-content">暂无数据</slot>
             </Empty>
           </div>

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

@@ -9,6 +9,7 @@
           v-for="(item, index) in list"
           :key="index"
           v-bind="item"
+          @click="onClickItem(item)"
         ></ChatItem>
       </div>
     </main>
@@ -44,6 +45,7 @@ export default {
         const list = data.map((v) => {
           return {
             id: v.userId,
+            userType: v.userType,
             title: v.name,
             content: v.content ? v.content.replace(/<p>/g, '') : '',
             img: v.headimg,
@@ -59,6 +61,11 @@ export default {
     getName(name) {
       if (!name) return
       return name.slice(-2)
+    },
+    onClickItem(item) {
+      window.open(
+        `/page_pc_social/customer?userId=${item.id}&userType=${item.userType}`
+      )
     }
   }
 }

+ 226 - 0
apps/bigmember_pc/src/views/workspace/components/MyEquityList.vue

@@ -0,0 +1,226 @@
+<template>
+  <section class="my-equity-list">
+    <header class="card-header">我的</header>
+    <main class="card-main">
+      <EquityItem
+        v-for="(item, index) in calcList"
+        :key="index"
+        v-bind="item"
+        v-show="item.show"
+        @click="onClickItem(item)"
+      ></EquityItem>
+    </main>
+  </section>
+</template>
+
+<script>
+import { getWorkspaceEquityCount } from '@/api/modules/'
+import { mapState, mapActions, mapGetters } from 'vuex'
+import EquityItem from '../ui/EquityItem.vue'
+import { getAssetsFile } from '@/utils'
+import { tryCallHooks } from '@jianyu/easy-inject-qiankun'
+
+export default {
+  name: 'MyEquityList',
+  components: {
+    EquityItem
+  },
+  data() {
+    return {
+      list: [
+        {
+          name: '项目进度监控',
+          count: 0,
+          unit: '个',
+          background: 'linear-gradient(#D2EEFB, #EBF6FB)',
+          icon: getAssetsFile('workspace/my-project.png'),
+          noText: '前往添加',
+          link: '/swordfish/page_big_pc/free/project_progress',
+          addLink: '/jylab/supsearch/index.html',
+          appType: 'outer',
+          addAppType: 'iframe',
+          openType: '_blank',
+          addOpenType: '_self'
+        },
+        {
+          name: '企业情报监控',
+          count: 0,
+          unit: '个',
+          background: 'linear-gradient(#D2FDEE, #ECFCF6)',
+          icon: getAssetsFile('workspace/my-gen.png'),
+          noText: '前往添加',
+          link: '/swordfish/page_big_pc/free/ent_follow',
+          addLink: '/jylab/entSearch/index.html',
+          appType: 'outer',
+          addAppType: 'iframe',
+          openType: '_blank',
+          addOpenType: '_self'
+        },
+        {
+          name: '收藏的标讯',
+          count: 0,
+          unit: '条',
+          background: 'linear-gradient(#FFEBD7, #FFF8F1)',
+          icon: getAssetsFile('workspace/my-collect.png'),
+          noText: '前往收藏',
+          link: '/swordfish/frontPage/collection/sess/index',
+          addLink: '/jylab/supsearch/index.html',
+          appType: 'outer',
+          addAppType: 'iframe',
+          openType: '_blank',
+          addOpenType: '_self'
+        },
+        {
+          name: '客户监控',
+          count: 0,
+          unit: '个',
+          background: 'linear-gradient(#FFE2DE, #FFF6F4)',
+          icon: getAssetsFile('workspace/my-customer.png'),
+          noText: '前往添加',
+          link: '/entpc/newBus/myCustomer?m1=1&m2=1',
+          addLink: '/jylab/purSearch/index.html',
+          appType: 'outer',
+          addAppType: 'iframe',
+          openType: '_blank',
+          addOpenType: '_self'
+        },
+        {
+          name: '已认领项目',
+          count: 0,
+          unit: '个',
+          background: 'linear-gradient(#FFE2DE, #FFF6F4)',
+          icon: getAssetsFile('workspace/my-claim.png'),
+          noText: '前往认领',
+          link: '/succbi/nzj/app/nzj.app/nzj_claim.spg',
+          addLink: '/succbi/nzj/app/nzj.app/nzj_search_1.spg',
+          appType: 'iframe',
+          addAppType: 'iframe',
+          addOpenType: '_self'
+        }
+      ],
+      my: {
+        claimCount: 0,
+        projectFollowCount: 0,
+        entFollowCount: 0,
+        collectCount: 0,
+        customerCount: 0
+      }
+    }
+  },
+  computed: {
+    ...mapState({
+      customerCount: (state) => state.workspace.customer.count
+    }),
+    ...mapGetters('workspace', ['myCustomerShow', 'hasMemberNJPower']),
+    calcList() {
+      const {
+        claimCount,
+        projectFollowCount,
+        entFollowCount,
+        collectCount,
+        customerCount
+      } = this.my
+      const list = this.list.map((v) => {
+        switch (v.name) {
+          case '客户监控':
+            v.show = this.myCustomerShow
+            v.count = customerCount
+            break
+          case '已认领项目':
+            v.show = this.hasMemberNJPower
+            v.count = claimCount
+            break
+          case '项目进度监控':
+            v.show = this.hasMemberNJPower
+            v.count = projectFollowCount
+            break
+          case '企业情报监控':
+            v.show = this.hasMemberNJPower
+            v.count = entFollowCount
+            break
+          case '收藏的标讯':
+            v.show = true
+            v.count = collectCount
+            break
+        }
+        return {
+          ...v
+        }
+      })
+      return list
+    }
+  },
+  created() {
+    this.getList()
+    this.getWorkspaceEquity()
+  },
+  methods: {
+    ...mapActions('workspace/customer', ['getList']),
+    async getWorkspaceEquity() {
+      this.my.customerCount = this.customerCount || 0
+      const { data } = await getWorkspaceEquityCount()
+      if (data) {
+        this.my.claimCount = data.claimCount || 0
+        this.my.projectFollowCount = data.projectFollowCount || 0
+        this.my.entFollowCount = data.entFollowCount || 0
+        this.my.collectCount = data.collectCount || 0
+      }
+    },
+    onClickItem(item) {
+      /*
+       * 前往认领to拟在建搜索(bi)
+       * 客户监控to采购单位搜索(iframe)
+       * 前往收藏to招标采购搜索(iframe)
+       * 企业情报监控to企业搜索(iframe)
+       * 项目进度监控to招标采购搜索(iframe)
+       */
+      tryCallHooks({
+        fn: () => {
+          this.$BRACE.methods.open({
+            route: {
+              link: item.count ? item.link : encodeURIComponent(item.addLink),
+              appType: item.count ? item.appType : item.addAppType,
+              openType: item.count ? item.openType : item.addOpenType
+            }
+          })
+        },
+        spareFn: () => {
+          const url = item.count ? item.link : encodeURIComponent(item.addLink)
+          if (item.count) {
+            if (item.openType === '_blank') {
+              window.open(url)
+            } else {
+              location.href = url
+            }
+          } else {
+            if (item.addOpenType === '_blank') {
+              window.open(url)
+            } else {
+              location.href = url
+            }
+          }
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@include diy-icon('blue-more', 16, 16);
+.my-equity-list {
+  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;
+  }
+}
+</style>

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

@@ -1,148 +0,0 @@
-<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>

+ 22 - 10
apps/bigmember_pc/src/views/workspace/components/NewsList.vue

@@ -1,7 +1,7 @@
 <template>
   <ListCard
     class="news-list"
-    :list="newsList"
+    :list="list"
     title="要闻"
     @clickListItem="clickListItem"
     @linkMore="linkMore"
@@ -15,6 +15,7 @@
 </template>
 
 <script>
+import { mapState, mapActions } from 'vuex'
 import ListCard from '../ui/ListCard'
 
 export default {
@@ -22,17 +23,28 @@ export default {
   components: {
     ListCard
   },
-  computed: {},
-  data() {
-    return {
-      loading: true,
-      loaded: false,
-      newsList: []
-    }
+  computed: {
+    ...mapState({
+      loading: (state) => state.workspace.importantNews.loading,
+      loaded: (state) => state.workspace.importantNews.loaded,
+      list: (state) => state.workspace.importantNews.list
+    })
+  },
+  created() {
+    this.getList()
   },
   methods: {
-    clickListItem(item) {},
-    linkMore() {}
+    ...mapActions('workspace/importantNews', ['getList']),
+    resolveLink(link) {
+      const { href } = this.$router.resolve(link)
+      return href
+    },
+    clickListItem(item) {
+      window.open(`/jySite/${item._id}.html`)
+    },
+    linkMore() {
+      window.open('/jySchool/strategy')
+    }
   }
 }
 </script>

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

@@ -56,7 +56,7 @@ export default {
       hasKey: (state) => state.workspace.subscribe.hasKey, // 是否有订阅关键词
       loading: (state) => state.workspace.subscribe.loading,
       loaded: (state) => state.workspace.subscribe.loaded,
-      subscribeList: (state) => state.workspace.subscribe.list.slice(0, 5)
+      subscribeList: (state) => state.workspace.subscribe.list.slice(0, 10)
     })
   },
   data() {

+ 3 - 3
apps/bigmember_pc/src/views/workspace/dashboard.vue

@@ -13,7 +13,7 @@
           :is="name"
         ></component>
       </div>
-      <MyUseCountVue></MyUseCountVue>
+      <MyEquityList></MyEquityList>
       <!-- <div class="main-module card-list-module" v-if="dataReportShow">
         <DataReport></DataReport>
       </div> -->
@@ -53,7 +53,7 @@ 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'
+import MyEquityList from './components/MyEquityList.vue'
 const BusinessProfile = () => import('./components/BusinessProfile.vue')
 // const MyCustomer = () => import('./components/MyCustomer.vue')
 // const CustomerWatcher = () => import('./components/CustomerWatcher.vue')
@@ -82,7 +82,7 @@ export default {
     BusinessToDo,
     NewsList,
     AnalysisReport,
-    MyUseCountVue
+    MyEquityList
   },
   computed: {
     componentsPowerMap() {

+ 4 - 2
apps/bigmember_pc/src/views/workspace/ui/ArticleItem.vue

@@ -1,6 +1,8 @@
 <template>
   <div class="article-item" :class="{ visited }" v-on="$listeners">
-    <div class="article-item-l ellipsis visited-hd">{{ title }}</div>
+    <div class="article-item-l ellipsis visited-hd" :title="title">
+      {{ title }}
+    </div>
     <div class="article-item-r">
       <span class="red-dot" v-if="read"></span>
       <span class="r-time" v-if="time">{{
@@ -21,7 +23,7 @@ export default {
       default: ''
     },
     time: {
-      type: Number,
+      type: [Number, String],
       default: 0
     },
     read: {

+ 112 - 0
apps/bigmember_pc/src/views/workspace/ui/EquityItem.vue

@@ -0,0 +1,112 @@
+<template>
+  <div
+    class="equity-item"
+    v-on="$listeners"
+    :style="{ background: background }"
+  >
+    <el-image class="equity-item-icon" :src="icon"></el-image>
+    <div class="equity-item-box">
+      <p class="item-name">{{ name }}</p>
+      <p class="item-count" v-if="count">
+        <span class="item-count-text">{{ count }}</span>
+        <span class="item-count-unit">{{ unit }}</span>
+      </p>
+      <p class="item-href" v-else>
+        <span>{{ noText }} &gt;</span>
+      </p>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Image } from 'element-ui'
+
+export default {
+  name: 'EquityItem',
+  components: {
+    [Image.name]: Image
+  },
+  props: {
+    name: {
+      type: String,
+      default: ''
+    },
+    icon: {
+      type: String,
+      default: ''
+    },
+    count: {
+      type: [Number, String],
+      default: 0
+    },
+    unit: {
+      type: String,
+      default: '个'
+    },
+    noText: {
+      type: String,
+      default: ''
+    },
+    background: {
+      type: String,
+      default: ''
+    }
+  },
+  methods: {
+    onAddClick() {
+      this.$emit('link')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.equity-item {
+  position: relative;
+  min-width: 172px;
+  max-width: 25%;
+  height: 98px;
+  border-radius: 8px;
+  flex: 1;
+  cursor: pointer;
+  &-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>

+ 6 - 4
apps/bigmember_pc/src/views/workspace/ui/ListCard.vue

@@ -137,13 +137,15 @@ export default {
 }
 
 .list-item {
-  padding: 12px 0;
+  // padding: 12px 0;
+  padding: 0;
+  margin-bottom: 8px;
   display: flex;
   justify-content: space-between;
   align-items: center;
-  &:not(.last) {
-    box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
-  }
+  // &:not(.last) {
+  //   box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
+  // }
   .list-item-l {
     margin-right: 12px;
     font-size: 14px;