Ver código fonte

连接口 需求专家项目公司成果

zs 9 meses atrás
pai
commit
f2479e759d

+ 1 - 91
package-lock.json

@@ -819,34 +819,6 @@
         "url": "https://github.com/sponsors/kazupon"
       }
     },
-    "node_modules/@jiaminghi/bezier-curve": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/bezier-curve/-/bezier-curve-0.0.9.tgz",
-      "integrity": "sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5"
-      }
-    },
-    "node_modules/@jiaminghi/c-render": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/c-render/-/c-render-0.4.3.tgz",
-      "integrity": "sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q==",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/bezier-curve": "*",
-        "@jiaminghi/color": "*",
-        "@jiaminghi/transition": "*"
-      }
-    },
-    "node_modules/@jiaminghi/charts": {
-      "version": "0.2.18",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/charts/-/charts-0.2.18.tgz",
-      "integrity": "sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA==",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/c-render": "^0.4.3"
-      }
-    },
     "node_modules/@jiaminghi/color": {
       "version": "0.1.1",
       "resolved": "https://registry.npmmirror.com/@jiaminghi/color/-/color-0.1.1.tgz",
@@ -855,23 +827,6 @@
         "@babel/runtime": "^7.5.5"
       }
     },
-    "node_modules/@jiaminghi/data-view": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/data-view/-/data-view-2.10.0.tgz",
-      "integrity": "sha512-Cud2MTiMcqc5k2KWabR/svuVQmXHANqURo+yj40370/LdI/gyUJ6LG203hWXEnT1nMCeiv/SLVmxv3PXLScCeA==",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/charts": "*"
-      }
-    },
-    "node_modules/@jiaminghi/transition": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/transition/-/transition-1.1.11.tgz",
-      "integrity": "sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg==",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5"
-      }
-    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@@ -7897,34 +7852,6 @@
       "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.10.2.tgz",
       "integrity": "sha512-ttHCAJkRy7R5W2S9RVnN9KYQYPIpV2+GiS79T4EE37nrPyH6/1SrOh3bmdCRC1T3ocL8qCDx7x2lBJ0xaITU7Q=="
     },
-    "@jiaminghi/bezier-curve": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/bezier-curve/-/bezier-curve-0.0.9.tgz",
-      "integrity": "sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==",
-      "requires": {
-        "@babel/runtime": "^7.5.5"
-      }
-    },
-    "@jiaminghi/c-render": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/c-render/-/c-render-0.4.3.tgz",
-      "integrity": "sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q==",
-      "requires": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/bezier-curve": "*",
-        "@jiaminghi/color": "*",
-        "@jiaminghi/transition": "*"
-      }
-    },
-    "@jiaminghi/charts": {
-      "version": "0.2.18",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/charts/-/charts-0.2.18.tgz",
-      "integrity": "sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA==",
-      "requires": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/c-render": "^0.4.3"
-      }
-    },
     "@jiaminghi/color": {
       "version": "0.1.1",
       "resolved": "https://registry.npmmirror.com/@jiaminghi/color/-/color-0.1.1.tgz",
@@ -7933,23 +7860,6 @@
         "@babel/runtime": "^7.5.5"
       }
     },
-    "@jiaminghi/data-view": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/data-view/-/data-view-2.10.0.tgz",
-      "integrity": "sha512-Cud2MTiMcqc5k2KWabR/svuVQmXHANqURo+yj40370/LdI/gyUJ6LG203hWXEnT1nMCeiv/SLVmxv3PXLScCeA==",
-      "requires": {
-        "@babel/runtime": "^7.5.5",
-        "@jiaminghi/charts": "*"
-      }
-    },
-    "@jiaminghi/transition": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/@jiaminghi/transition/-/transition-1.1.11.tgz",
-      "integrity": "sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg==",
-      "requires": {
-        "@babel/runtime": "^7.5.5"
-      }
-    },
     "@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@@ -12696,4 +12606,4 @@
       }
     }
   }
-}
+}

+ 3 - 3
src/components/custom/custom-layout.vue

@@ -105,9 +105,9 @@ const search = async () => {
     else val.hover = false
   }
   data.value = menuList
-  // 基础设置
-  const result = await designStore.query({})
-  if ($checkRes(result)) configInfo.value = result.data[0] || {}
+  // // 基础设置
+  // const result = await designStore.query({})
+  // if ($checkRes(result)) configInfo.value = result.data[0] || {}
 }
 // 登录|注册
 const toLogin = (status) => {

+ 7 - 1
src/router/index.js

@@ -107,9 +107,15 @@ const router = createRouter({
     {
       path: '/demand/detail',
       name: 'demandDetail',
-      meta: { title: '产学研用协同创新数字化平台-赛事详情' },
+      meta: { title: '产学研用协同创新数字化平台-需求详情' },
       component: () => import('@/views/detail/demandDetail.vue')
     },
+    {
+      path: '/supply/detail',
+      name: 'supplyDetail',
+      meta: { title: '产学研用协同创新数字化平台-供给详情' },
+      component: () => import('@/views/detail/supplyDetail.vue')
+    },
     {
       path: '/project',
       name: 'project',

+ 4 - 1
src/views/brain/five.vue

@@ -101,7 +101,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

+ 4 - 1
src/views/brain/four.vue

@@ -101,7 +101,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

+ 4 - 1
src/views/brain/index.vue

@@ -40,7 +40,10 @@ const list = ref([
 ])
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

+ 4 - 1
src/views/brain/one.vue

@@ -101,7 +101,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

+ 4 - 1
src/views/brain/six.vue

@@ -101,7 +101,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

+ 83 - 12
src/views/brain/thr.vue

@@ -71,6 +71,11 @@
               <div class="title center">
                 <div class="titleRight">区域创新资源</div>
               </div>
+              <div class="circles">
+                <div class="circle" v-for="(item, index) in circleList" :key="index">
+                  {{ item }}
+                </div>
+              </div>
             </BorderBox13>
           </div>
           <div class="thr_2">
@@ -289,6 +294,8 @@ const list_5 = ref([
   { name: '长春市发展改革委关于长春慧天云网新能源…', person: '长春市政策-发改委', time: '2024' },
   { name: '长春市发展改革委关于长春慧天云网新能源…', person: '长春市政策-发改委', time: '2024' }
 ])
+// 区域创新资源
+const circleList = ref(['专利', '科技', '创新', '技术设备', '技术人才', '科研机构', '创新资源'])
 // 请求
 onMounted(async () => {
   getCity().then((response) => {
@@ -297,7 +304,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">
@@ -369,13 +379,15 @@ const toView = (item) => {
     z-index: 10000;
   }
   .content {
+    width: 100%;
+    height: 100%;
     .one {
       background: url(/images/brain/titleBg.svg);
       background-size: 100% 100%;
       font-size: 2.4rem;
       text-align: center;
       color: #53befe;
-      padding: 0.8rem;
+      padding: 0.8rem 0;
       span {
         letter-spacing: 0.2em;
       }
@@ -396,7 +408,7 @@ const toView = (item) => {
       display: flex;
       padding: 0.8rem 0;
       width: 100%;
-      height: 100%;
+      height: 80%;
       .thr_1 {
         width: 24%;
         height: 100%;
@@ -476,7 +488,7 @@ const toView = (item) => {
           justify-content: space-between;
           background-color: rgba($color: #18459d, $alpha: 0.3);
           padding: 0.8rem;
-          border-bottom: 0.1rem solid #18459d;
+          border-bottom: 0.3rem solid #18459d;
           -webkit-animation: twinkling 2s infinite ease-in-out; /*1秒钟的开始结束都慢的无限次动画*/
         }
         .center {
@@ -486,18 +498,18 @@ const toView = (item) => {
         @-webkit-keyframes twinkling {
           /*透明度由0到1*/
           0% {
-            border-color: #1a9cd8;
+            border-color: #612bdf;
             box-shadow:
-              0 0 10px rgba(22, 106, 185, 0.2),
-              inset 0 0 10px rgba(25, 181, 243, 0.1),
-              0 1px 0 rgb(59, 166, 228);
+              0 0 10px rgba(97, 43, 223, 0.2),
+              inset 0 0 10px rgba(97, 43, 223, 0.1),
+              0 1px 0 rgb(97, 43, 223);
           }
           100% {
-            border-color: rgb(75, 99, 235);
+            border-color: rgb(56, 201, 226);
             box-shadow:
-              0 0 25px rgba(32, 104, 238, 0.6),
-              inset 0 0 15px rgba(34, 100, 221, 0.4),
-              0 1px 0 rgb(68, 110, 250);
+              0 0 25px rgba(56, 201, 226, 0.6),
+              inset 0 0 15px rgba(56, 201, 226, 0.4),
+              0 1px 0 rgb(56, 201, 226);
           }
         }
         .select {
@@ -512,6 +524,65 @@ const toView = (item) => {
             }
           }
         }
+        .circles {
+          position: relative;
+          margin: 3.5rem 0 0 0;
+        }
+
+        .circle {
+          position: absolute;
+          width: 5rem;
+          height: 5rem;
+          line-height: 5rem;
+          text-align: center;
+          border-radius: 50%;
+          color: #fff;
+          box-shadow:
+            0 0 0.2rem #fff,
+            /* 主边框发光 */ 0 0 0.2rem #fff inset,
+            /* 内发光 */ 0 0.1rem 0.3rem #fff; /* 侧发光 */
+        }
+
+        .circle:nth-child(1) {
+          top: 4rem;
+          left: 17rem;
+          background-color: #b886f8;
+        }
+
+        .circle:nth-child(2) {
+          top: 8rem;
+          left: 14rem;
+          background-color: #4095e5;
+        }
+
+        .circle:nth-child(3) {
+          top: -1rem;
+          left: 15rem;
+          background-color: #f4ce98;
+        }
+
+        .circle:nth-child(4) {
+          top: 3rem;
+          left: 12rem;
+          background-color: #7728f5;
+        }
+
+        .circle:nth-child(5) {
+          top: 7rem;
+          left: 9rem;
+          background-color: #b4fdff;
+        }
+
+        .circle:nth-child(6) {
+          top: 2rem;
+          left: 7rem;
+          background-color: #8692c5;
+        }
+        .circle:nth-child(7) {
+          top: -2rem;
+          left: 10rem;
+          background-color: #560c9c;
+        }
         .list {
           margin: 0.5rem 0 0 0;
           padding: 0 0.5rem;

+ 9 - 9
src/views/brain/thr/echarts5.vue

@@ -1,21 +1,21 @@
 <template>
-  <div ref="echarts4" class="echarts4"></div>
+  <div ref="echarts5" class="echarts5"></div>
 </template>
 <style scoped lang="scss">
-.echarts4 {
+.echarts5 {
   height: 17.5vh;
   width: 100%;
 }
 </style>
 <script setup>
 import * as echarts from 'echarts'
-const echarts4 = ref()
+const echarts5 = ref()
 onMounted(() => {
-  echarts4View()
+  echarts5View()
 })
-function echarts4View() {
-  const myChart4 = echarts.init(echarts4.value)
-  const option4 = {
+function echarts5View() {
+  const myChart5 = echarts.init(echarts5.value)
+  const option5 = {
     tooltip: {
       // 鼠标悬浮提示数据
       trigger: 'axis',
@@ -88,9 +88,9 @@ function echarts4View() {
       }
     ]
   }
-  myChart4.setOption(option4)
+  myChart5.setOption(option5)
   window.addEventListener('resize', function () {
-    myChart4.resize()
+    myChart5.resize()
   })
 }
 </script>

+ 9 - 9
src/views/brain/thr/echarts6.vue

@@ -1,21 +1,21 @@
 <template>
-  <div ref="echarts4" class="echarts4"></div>
+  <div ref="echarts6" class="echarts6"></div>
 </template>
 <style scoped lang="scss">
-.echarts4 {
+.echarts6 {
   height: 18vh;
   width: 100%;
 }
 </style>
 <script setup>
 import * as echarts from 'echarts'
-const echarts4 = ref()
+const echarts6 = ref()
 onMounted(() => {
-  echarts4View()
+  echarts6View()
 })
-function echarts4View() {
-  const myChart4 = echarts.init(echarts4.value)
-  const option4 = {
+function echarts6View() {
+  const myChart6 = echarts.init(echarts6.value)
+  const option6 = {
     tooltip: {
       // 鼠标悬浮提示数据
       trigger: 'axis',
@@ -88,9 +88,9 @@ function echarts4View() {
       }
     ]
   }
-  myChart4.setOption(option4)
+  myChart6.setOption(option6)
   window.addEventListener('resize', function () {
-    myChart4.resize()
+    myChart6.resize()
   })
 }
 </script>

+ 96 - 0
src/views/brain/thr/echarts7.vue

@@ -0,0 +1,96 @@
+<template>
+  <div ref="echarts4" class="echarts4"></div>
+</template>
+<style scoped lang="scss">
+.echarts4 {
+  height: 18vh;
+  width: 100%;
+}
+</style>
+<script setup>
+import * as echarts from 'echarts'
+const echarts4 = ref()
+onMounted(() => {
+  echarts4View()
+})
+function echarts4View() {
+  const myChart4 = echarts.init(echarts4.value)
+  const option4 = {
+    tooltip: {
+      // 鼠标悬浮提示数据
+      trigger: 'axis',
+      backgroundColor: 'rgba(32, 33, 36,.7)',
+      borderColor: 'rgba(32, 33, 36,0.20)',
+      borderWidth: 15,
+      textStyle: {
+        // 文字提示样式
+        color: '#fff',
+        fontSize: '12'
+      },
+      axisPointer: {
+        // 坐标轴虚线
+        type: 'cross',
+        label: {
+          backgroundColor: '#6a7985'
+        }
+      }
+    },
+
+    // },
+    grid: {
+      // 控制图表的位置
+      left: '5%',
+      right: '5%',
+      top: '10%',
+      bottom: '5%',
+      containLabel: true
+    },
+    xAxis: {
+      axisLabel: {
+        // X轴线 标签修改
+        textStyle: {
+          color: 'white', //坐标值得具体的颜色
+          fontSize: '10'
+        }
+      },
+      data: ['A', 'B', 'C', 'D', 'E', 'F']
+    },
+    yAxis: {
+      axisLabel: {
+        // y轴线 标签修改
+        textStyle: {
+          color: 'white' //坐标值得具体的颜色
+        }
+      }
+    },
+    series: [
+      {
+        data: [2549, 12421, 2637, 3146, 15189, 9562],
+        type: 'bar',
+        barWidth: '48%', //调整柱状图宽度
+        itemStyle: {
+          normal: {
+            /*--------设置柱形图圆角 [左上角,右上角,右下角,左下角]-------------*/
+            borderRadius: [12, 12, 0, 0],
+            /*--------设置柱形图渐变色 -------------*/
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              {
+                offset: 0,
+                color: 'rgba(0,244,255,1)'
+              },
+              {
+                offset: 1,
+                color: 'rgba(0,77,167,1)'
+              }
+            ])
+          }
+        }
+      }
+    ]
+  }
+  myChart4.setOption(option4)
+  window.addEventListener('resize', function () {
+    myChart4.resize()
+  })
+}
+</script>

+ 4 - 1
src/views/brain/two.vue

@@ -101,7 +101,10 @@ onMounted(async () => {
 })
 // 查看
 const toView = (item) => {
-  router.push({ path: item.route })
+  router.push({ path: item.route }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">

Diferenças do arquivo suprimidas por serem muito extensas
+ 42 - 46
src/views/detail/achievementDetail.vue


+ 40 - 419
src/views/detail/company.vue

@@ -63,13 +63,7 @@
         </div>
       </el-col>
       <div class="thr">
-        <div
-          class="list"
-          :class="['list' + index]"
-          v-for="(item, index) in list"
-          :key="index"
-          @click="toView(item)"
-        >
+        <div class="list" :class="['list' + index]" v-for="(item, index) in list" :key="index" @click="toView(item)">
           <div class="name">{{ item.name || '暂无' }}</div>
           <div class="other">
             <div class="other_1">
@@ -80,15 +74,15 @@
               </el-image>
             </div>
             <div class="other_2">
-              <span class="text"><em>企业类型:</em>{{ getDict(item.pattern, 'pattern') }}</span>
-              <span class="text"><em>企业规模:</em>{{ getDict(item.scale, 'scale') }}</span>
-              <span class="text"><em>地址:</em>{{ item.address || '暂无' }}</span>
+              <span class="text"><em>企业类型:</em>{{ getDict(item.pattern, 'pattern') || '暂无' }}</span>
+              <span class="text"><em>员工人数:</em>{{ item.person || '暂无' }}人</span>
+              <span class="text"><em>地址:</em>{{ getArea(item.area) || '暂无' }}</span>
             </div>
           </div>
         </div>
       </div>
       <div class="four">
-        <el-pagination background layout="prev, pager, next" :total="1000" />
+        <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
       </div>
     </div>
   </custom-layout>
@@ -114,400 +108,9 @@ const dictDataStore = DictDataStore()
 const loading = ref(false)
 // 路由
 const router = useRouter()
-const list = ref([
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  },
-  {
-    id: 1,
-    created_time: '2024-06-02 13:46:41',
-    update_time: '2024-06-02 13:46:41',
-    data_owner: null,
-    __v: 1,
-    user: 3,
-    name: '长春市福瑞科技有限公司',
-    logo: [],
-    code: '1234567890',
-    pattern: '0',
-    scale: '0',
-    phone: '18843520013',
-    type: '3',
-    area: ['山西省', '阳泉市'],
-    representative: '张三',
-    email: 'email1233@.com',
-    person: 100,
-    register: '100',
-    create_time: '2024-04-09 00:00:00',
-    address: '吉林省长春市力旺广场',
-    brief: '简介',
-    is_show: '0',
-    companyStatus: '0',
-    status: '1'
-  }
-])
+const list = ref([])
 let skip = 0
-let limit = inject('limit')
+let limit = 15
 const total = ref(0)
 // 是否展开
 const oneShow = ref(false)
@@ -543,32 +146,40 @@ onMounted(async () => {
 })
 const searchOther = async () => {
   let result
-  // 技术领域
-  result = await dictDataStore.query({ code: 'field', is_use: '0' })
-  if ($checkRes(result)) fieldList.value = result.data
-  // 企业状态
-  result = await dictDataStore.query({ code: 'companyStatus', is_use: '0' })
-  if ($checkRes(result)) statusList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
+  // // 企业状态
+  // result = await dictDataStore.query({ code: 'companyStatus', is_use: '0' })
+  // if ($checkRes(result)) statusList.value = result.data
   // 企业类型
   result = await dictDataStore.query({ code: 'companyType', is_use: '0' })
   if ($checkRes(result)) patternList.value = result.data
-  // 企业规模
-  result = await dictDataStore.query({ code: 'companyScale', is_use: '0' })
-  if ($checkRes(result)) scaleList.value = result.data
-  // 企业所属行业
-  result = await dictDataStore.query({ code: 'companyIndustry', is_use: '0' })
-  if ($checkRes(result)) IndustryList.value = result.data
+  // // 企业规模
+  // result = await dictDataStore.query({ code: 'companyScale', is_use: '0' })
+  // if ($checkRes(result)) scaleList.value = result.data
+  // // 企业所属行业
+  // result = await dictDataStore.query({ code: 'companyIndustry', is_use: '0' })
+  // if ($checkRes(result)) IndustryList.value = result.data
   // 城市
   getCity().then((response) => (cityList.value = response.address))
 }
 const search = async (query = { skip: 0, limit }) => {
   const info = {
     skip: query.skip,
-    limit: query.limit,
-    is_show: '0',
-    status: '1'
+    limit: query.limit
+  }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    list.value = res.data
+    total.value = res.total
   }
 }
+// 地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无地区'
+}
 // 字典数据转换
 const getDict = (data, model) => {
   let res
@@ -585,6 +196,16 @@ const toView = (item) => {
 const getUrl = (item) => {
   if (item && item.length > 0) return `${import.meta.env.VITE_APP_HOST}${item[0].uri}`
 }
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
+}
 </script>
 <style scoped lang="scss">
 .main {

Diferenças do arquivo suprimidas por serem muito extensas
+ 36 - 52
src/views/detail/companyDetail.vue


+ 102 - 54
src/views/detail/demandDetail.vue

@@ -6,23 +6,32 @@
         <div class="info_2">
           <div class="area">
             <el-icon color="#0085f5"><Location /></el-icon>
-            <span>{{ info.area || '暂无' }}</span>
+            <span>{{ getArea(info.area) }}</span>
           </div>
           <div class="name">{{ info.name || '暂无' }}</div>
           <div class="other">
             <span class="other_1">{{ info.type || '暂无' }}</span>
             <div class="other_2">
               <p>
-                资金预算:<span class="moeny">{{ info.money || '暂无' }}</span>
+                资金预算:<span class="moeny">{{ info.money || '面议' }}</span>
               </p>
               <p>
                 应用行业:<span>{{ info.field || '暂无' }} </span>
               </p>
               <p>
-                截止时间:<span class="time">{{ info.time || '暂无' }}</span>
+                截止时间:<span class="time">{{ getTime(info.time) || '暂无' }}</span>
               </p>
               <p>
-                联 系 人 :<span>{{ info.person || '暂无' }}</span>
+                所属地区 :<span> {{ getArea(info.area) || '暂无' }}</span>
+              </p>
+              <p>
+                所属企业 :<span>{{ info.company || '暂无' }}</span>
+              </p>
+              <p>
+                联 系 人 :<span>{{ info.contacts || '暂无' }}</span>
+              </p>
+              <p>
+                联系电话:<span>{{ info.tel || '暂无' }}</span>
               </p>
             </div>
           </div>
@@ -30,7 +39,7 @@
         </div>
         <div class="title"><i></i>需求描述</div>
         <div class="info_3">
-          <p>{{ info.content || '暂无' }}</p>
+          <p>{{ info.brief || '暂无' }}</p>
         </div>
         <div class="title"><i></i>相关需求</div>
         <div class="info_4">
@@ -39,19 +48,19 @@
               <span>{{ item.name || '暂无' }}</span>
             </h2>
             <div class="other">
-              <span class="other_1">{{ info.type || '暂无' }}</span>
+              <span class="other_1">{{ item.type || '暂无' }}</span>
               <div class="other_2">
                 <span>应用行业:</span>
-                {{ info.field || '暂无' }}
+                {{ item.field || '暂无' }}
               </div>
               <div class="other_2">
                 <span>资金预算:</span>
-                {{ info.money || '暂无' }}
+                {{ item.money || '面议' }}
               </div>
-              <div class="other_2">
+              <div class="other_2 textOne">
                 <el-icon color="#0085f5"><Location /></el-icon>
-                {{ info.area || '暂无' }}
-                <span class="state">{{ item.status }}</span>
+                {{ getArea(item.area) }}
+                <span class="state">{{ item.status || '未解决' }}</span>
               </div>
             </div>
           </div>
@@ -62,58 +71,98 @@
 </template>
 
 <script setup>
-import match_4 from '/images/match_4.jpg'
+import { get } from 'lodash-es'
+import { DictDataStore } from '@/store/api/system/dictData'
+import { DemandStore } from '@/store/api/platform/demand'
+const store = DemandStore()
+const dictDataStore = DictDataStore()
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
+const $checkRes = inject('$checkRes')
 // 加载中
 const loading = ref(false)
 // 路由
+const route = useRoute()
 const router = useRouter()
-const info = ref({
-  name: '应用于空气膨胀压缩一体式制冷机的磁悬浮轴承关键技术需求',
-  money: '面议',
-  time: '2024-06-20',
-  field: '其他新能源',
-  person: '王**',
-  area: '吉林 长春市',
-  type: '技术难题',
-  status: '未解决',
-  content:
-    '磁悬浮轴承支撑的一体式制冷机电控系统研发、模拟测试平台研发,功率100kW,转速18 000-22 000 rpm,永磁电机效率大于95%'
+const info = ref({})
+const list = ref([])
+// 字典表
+const fieldList = ref([])
+const attributeList = ref([])
+const matureList = ref([])
+const sellList = ref([])
+const technologyList = ref([])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search()
+  await searchAchieve()
+  loading.value = false
 })
-const list = ref([
-  {
-    num: '1',
-    name: '关于异质结、钙钛矿电池的技术开发',
-    field: '其他新能源',
-    area: '吉林 长春市',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '关于膜电极检测、双极板检测需求',
-    field: '其他新能源',
-    area: '吉林 长春市',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '关于高效碱性电解槽的研发及集成需求',
-    field: '其他新能源',
-    area: '吉林 长春市',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
+const search = async () => {
+  let id = route.query.id
+  if (id) {
+    let res = await store.detail(id)
+    if (res.errcode == '0') info.value = res.data
   }
-])
+}
+const searchAchieve = async () => {
+  const data = {
+    skip: 0,
+    limit: 3,
+    is_use: '0',
+    status: '1',
+    field: info.value.field
+  }
+  const res = await store.list(data)
+  if (res.errcode == '0') list.value = res.data
+}
+const searchOther = async () => {
+  // let result
+  // // 成熟度
+  // result = await dictDataStore.query({ code: 'mature', is_use: '0' })
+  // if ($checkRes(result)) matureList.value = result.data
+  // // 出让方式
+  // result = await dictDataStore.query({ code: 'sell', is_use: '0' })
+  // if ($checkRes(result)) sellList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
+  // // 属性
+  // result = await dictDataStore.query({ code: 'attribute', is_use: '0' })
+  // if ($checkRes(result)) attributeList.value = result.data
+  // // 技术分类
+  // result = await dictDataStore.query({ code: 'technology', is_use: '0' })
+  // if ($checkRes(result)) technologyList.value = result.data
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  let res
+  if (model == 'mature') res = matureList.value.find((f) => f.value == data)
+  else if (model == 'sell') res = sellList.value.find((f) => f.value == data)
+  else if (model == 'field') res = fieldList.value.find((f) => f.value == data)
+  else if (model == 'attribute') res = attributeList.value.find((f) => f.value == data)
+  else if (model == 'technology') res = technologyList.value.find((f) => f.value == data)
+  return get(res, 'label')
+}
+// 地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无地区'
+}
+// 时间
+const getTime = (data) => {
+  if (data) return data.join('-')
+  else return '暂无'
+}
 // 查看详情
 const toView = (item) => {
-  router.push({ path: '/demand/detail', query: { id: item.id || item._id } })
+  router.push({ path: '/demand/detail', query: { id: item.id || item._id } }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
 }
 </script>
 <style scoped lang="scss">
@@ -265,8 +314,7 @@ const toView = (item) => {
               padding: 0 20px;
               height: 30px;
               line-height: 30px;
-              background-image: linear-gradient(90deg, #ff8a00 0, #ff5a00 100%),
-                linear-gradient(#ff7800, #ff7800);
+              background-image: linear-gradient(90deg, #ff8a00 0, #ff5a00 100%), linear-gradient(#ff7800, #ff7800);
               background-blend-mode: normal, normal;
               border-radius: 14px;
               border: solid 1px #e5e5e5;

+ 44 - 92
src/views/detail/expert.vue

@@ -70,16 +70,16 @@
         </div>
         <div class="twoValue">
           <div class="value" v-for="(item, index) in list" :key="index">
-            <div class="table-colunm table-colunm1">{{ item.key || '暂无' }}</div>
-            <div class="table-colunm table-colunm2">{{ item.name || '暂无' }}</div>
-            <div class="table-colunm">{{ item.area || '暂无' }}</div>
-            <div class="table-colunm">{{ item.education || '暂无' }}</div>
-            <div class="table-colunm">{{ item.field || '暂无' }}</div>
+            <div class="table-colunm table-colunm1">{{ index + 1 }}</div>
+            <div class="table-colunm textOne">{{ item.name || '暂无' }}</div>
+            <div class="table-colunm textOne table-colunm2">{{ item.work || '暂无' }}</div>
+            <div class="table-colunm textOne">{{ item.title || '暂无' }}</div>
+            <div class="table-colunm textOne">{{ item.industry || '暂无' }}</div>
             <div class="table-colunm button" @click="toView(item)">查看详情</div>
           </div>
         </div>
         <div class="twoTotal">
-          <el-pagination background layout="prev, pager, next" :total="1000" />
+          <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
         </div>
       </div>
     </div>
@@ -93,6 +93,11 @@ import { getCity } from '@/utils/city'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
+// 接口
+import { DictDataStore } from '@/store/api/system/dictData'
+import { ExpertStore } from '@/store/api/user/expert'
+const store = ExpertStore()
+const dictDataStore = DictDataStore()
 // 加载中
 const loading = ref(false)
 // 路由
@@ -130,105 +135,52 @@ const plateList = ref([
 ])
 const column = ref([
   { name: '序号', style: { width: '116px' }, key: 'key' },
-  { name: '名称', style: { width: '316px' }, key: 'name' },
-  { name: '所在地', style: { width: '216px' }, key: 'area' },
+  { name: '名称', style: { width: '216px' }, key: 'name' },
+  { name: '工作单位', style: { width: '316px' }, key: 'area' },
   { name: '学历/职称', style: { width: '216px' }, key: 'education' },
-  { name: '技术领域', style: { width: '216px' }, key: 'field' },
+  { name: '所属产业', style: { width: '216px' }, key: 'industry' },
   { name: '操作', style: { width: '216px' }, key: 'operation' }
 ])
-const list = ref([
-  {
-    key: '1',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融',
-    time: '2020-07-01'
-  },
-  {
-    key: '2',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '3',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '4',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '5',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '6',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '7',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '8',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '6',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '7',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  },
-  {
-    key: '8',
-    name: '陈教授',
-    area: '吉林长春市',
-    education: '博士',
-    field: '科技金融'
-  }
-])
+// 列表
+const list = ref([])
+let skip = 0
+let limit = 15
+const total = ref(0)
 // 请求
 onMounted(async () => {
   loading.value = true
   // 城市
-  getCity().then(
-    (response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address])
-  )
+  getCity().then((response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address]))
+  await searchOther()
+  await search({ skip, limit })
   loading.value = false
 })
+const searchOther = async () => {}
+const search = async (query = { skip: 0, limit }) => {
+  const info = {
+    skip: query.skip,
+    limit: query.limit
+  }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    list.value = res.data
+    total.value = res.total
+  }
+}
 // 查看
 const toView = (item) => {
   router.push({ path: `/expert/detail`, query: { id: item.id || item._id } })
 }
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
+}
 </script>
 <style scoped lang="scss">
 .main {

+ 51 - 27
src/views/detail/expertDetail.vue

@@ -10,18 +10,18 @@
               <div class="name">{{ info.name || '暂无' }}</div>
               <div class="brief">
                 <span>{{ info.title || '暂无' }}</span>
-                <span>{{ info.area || '暂无' }}</span>
+                <span v-if="info.area">{{ info.area || '暂无' }}</span>
               </div>
             </div>
           </div>
           <div class="infoBrief">
             <div class="Brief_1">
-              <span>科研能力</span>
-              <span>{{ info.ability || '暂无' }}</span>
+              <span>所属产业</span>
+              <span>{{ info.industry || '暂无' }}</span>
             </div>
             <div class="Brief_2">
-              <span>个人能力</span>
-              <span>{{ info.brief || '暂无' }}</span>
+              <span>工作单位</span>
+              <span>{{ info.work || '暂无' }}</span>
             </div>
           </div>
           <div class="infoOther">
@@ -50,7 +50,7 @@
           </div>
           <div class="infoOther">
             <div class="title">荣誉&成就</div>
-            <div class="content">{{ info.achievement || '暂无' }}</div>
+            <div class="content">{{ info.title || '暂无' }}</div>
           </div>
           <div class="infoOther">
             <div class="title">科研成果</div>
@@ -67,7 +67,7 @@
                 </div>
               </div>
               <div class="content_2">
-                <div class="scientific" v-for="(item, index) in info.scientific" :key="index">
+                <div class="scientific" v-for="(item, index) in scientific" :key="index">
                   {{ item || '暂无' }}
                 </div>
               </div>
@@ -84,33 +84,57 @@ import userLogo from '/images/userLogo.png'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
+// 接口
+import { DictDataStore } from '@/store/api/system/dictData'
+import { ExpertStore } from '@/store/api/user/expert'
+const store = ExpertStore()
+const dictDataStore = DictDataStore()
 // 加载中
 const loading = ref(false)
 // 路由
+const route = useRoute()
 const router = useRouter()
 const tableData = ref([
-  { company: '中国科学院固定物理研究所', num: '23' },
-  { company: '中国科学院固定物理研究所', num: '23' },
-  { company: '中国科学院固定物理研究所', num: '23' },
-  { company: '中国科学院固定物理研究所', num: '23' }
+  // { company: '中国科学院固定物理研究所', num: '45' },
+  // { company: '中国汽车工程学会', num: '30' },
+  // { company: '清华大学车辆与运载学院', num: '27' },
+  // { company: '原一汽技术中心技术中心', num: '23' }
 ])
-const info = ref({
-  name: '张教授',
-  area: '吉林长春市',
-  education: '博士',
-  title: '副教授',
-  field: '科技金融',
-  ability: '#基金项目申报##应用技术研究##产学研合作#',
-  scientific: [
-    '面向等离子体材料用先进钨复合材料的改性研究进展与趋势',
-    '湿化学法W-Re合金制备与性能',
-    '低能高通量氨离子辐照下W28Ta28V28Zr8Sc8高熵合金损伤行为研究',
-    '配位聚合物衍生的硒化锡@多孔碳纳米棒及其储钠性能研究'
-  ],
-  achievement: '中国机械工业优秀青年科技专家',
-  brief:
-    '张教授主要从事石油资产定价与预测、能源环境政策绩效评价、碳交易与碳减排机制政策等领域的研究工作。现已主持国家自然科学基金优秀青年基金项目、重点专项,国家社科基金重大项目、重点项目等重要科研任务10余项'
+const info = ref({})
+const scientific = ref([])
+// const scientific = ref(['面向等离子体材料用先进钨复合材料的改性研究进展与趋势', '湿化学法W-Re合金制备与性能', '低能高通量氨离子辐照下W28Ta28V28Zr8Sc8高熵合金损伤行为研究', '配位聚合物衍生的硒化锡@多孔碳纳米棒及其储钠性能研究'])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search()
+  loading.value = false
 })
+const search = async () => {
+  let id = route.query.id
+  if (id) {
+    let res = await store.detail(id)
+    if (res.errcode == '0') info.value = res.data
+  }
+}
+const searchOther = async () => {
+  // let result
+  // // 成熟度
+  // result = await dictDataStore.query({ code: 'mature', is_use: '0' })
+  // if ($checkRes(result)) matureList.value = result.data
+  // // 出让方式
+  // result = await dictDataStore.query({ code: 'sell', is_use: '0' })
+  // if ($checkRes(result)) sellList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
+  // // 属性
+  // result = await dictDataStore.query({ code: 'attribute', is_use: '0' })
+  // if ($checkRes(result)) attributeList.value = result.data
+  // // 技术分类
+  // result = await dictDataStore.query({ code: 'technology', is_use: '0' })
+  // if ($checkRes(result)) technologyList.value = result.data
+}
 </script>
 <style scoped lang="scss">
 .main {

+ 29 - 219
src/views/detail/project.vue

@@ -4,12 +4,7 @@
       <div class="w_1300">
         <el-col :span="24" class="one_1">
           <div class="search">
-            <el-input
-              v-model="input1"
-              size="large"
-              placeholder="请输入关键字"
-              :suffix-icon="Search"
-            >
+            <el-input v-model="input1" size="large" placeholder="请输入关键字" :suffix-icon="Search">
               <template #append>
                 <el-button type="primary" size="large">搜索</el-button>
               </template>
@@ -23,24 +18,10 @@
                 <span>行业</span>
               </div>
               <div v-if="!twoShow" class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in plateList.slice(0, 6)"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in plateList.slice(0, 6)" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
               <div v-else class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in plateList"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in plateList" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
               <div class="button">
                 <span v-if="!twoShow" @click="twoShow = true">
@@ -56,14 +37,7 @@
                 <span>技术领域</span>
               </div>
               <div class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in typeList"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in typeList" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
             </div>
             <div class="Seacher">
@@ -71,24 +45,10 @@
                 <span>所在地</span>
               </div>
               <div v-if="!oneShow" class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in cityList.slice(0, 12)"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in cityList.slice(0, 12)" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
               <div v-else class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in cityList"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in cityList" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
               <div class="button">
                 <span v-if="!oneShow" @click="oneShow = true">
@@ -104,42 +64,29 @@
                 <span>项目成熟度</span>
               </div>
               <div class="OneRight">
-                <el-checkbox
-                  class="label"
-                  v-for="(item, index) in maturityList"
-                  :key="index"
-                  v-model="checked1"
-                  :label="item.label"
-                  size="large"
-                />
+                <el-checkbox class="label" v-for="(item, index) in maturityList" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
             </div>
           </div>
           <div class="one_2_2">
-            <div
-              class="list"
-              :class="['list' + index]"
-              v-for="(item, index) in list"
-              :key="index"
-              @click="toView(item)"
-            >
-              <div class="type textOne">{{ item.type || '暂无' }}</div>
+            <div class="list" :class="['list' + index]" v-for="(item, index) in list" :key="index" @click="toView(item)">
+              <div class="type textOne">{{ item.industry || '暂无' }}</div>
               <div class="title">
                 <p class="ellipsis-3">{{ item.name || '暂无' }}</p>
               </div>
-              <div class="address textOne">
+              <div class="address">
                 <el-icon color="#595959"><Location /></el-icon>
-                <span>{{ item.area || '暂无' }}</span>
+                <span class="textOne">{{ item.main || '暂无' }}</span>
               </div>
               <div class="biaoqian textOne">
                 <span v-if="item.technology">{{ item.technology }}</span>
                 <span v-if="item.sell">{{ item.sell }}</span>
               </div>
-              <span class="state" :class="['state' + item.status]"></span>
+              <span class="state" :class="['state1']"></span>
             </div>
           </div>
           <div class="one_2_3">
-            <el-pagination background layout="prev, pager, next" :total="1000" />
+            <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
           </div>
         </el-col>
       </div>
@@ -148,17 +95,6 @@
 </template>
 
 <script setup>
-import bg_1 from '/images/project/dbhi-kcxm-item1.png'
-import bg_2 from '/images/project/dbhi-kcxm-item2.png'
-import bg_3 from '/images/project/dbhi-kcxm-item3.png'
-import bg_4 from '/images/project/dbhi-kcxm-item4.png'
-import bg_5 from '/images/project/dbhi-kcxm-item6.png'
-import bg_6 from '/images/project/dbhi-kcxm-item8.png'
-import bg_7 from '/images/project/dbhi-kcxm-item9.png'
-import bg_8 from '/images/project/dbhi-kcxm-item10.png'
-import bg_9 from '/images/project/dbhi-kcxm-item7.png'
-import bg_10 from '/images/project/dbhi-kcxm-item7.png'
-import map from '/images/project/dbhi-kcxm-item7.png'
 import { getCity } from '@/utils/city'
 const $checkRes = inject('$checkRes')
 // 接口
@@ -208,132 +144,10 @@ const industryList = ref([])
 // 字典表
 const fieldList = ref([])
 // 列表
-const list = ref([
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '1',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '3',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  },
-  {
-    name: '农特产供应链平台',
-    technology: '衣林牧业',
-    type: '农产品加工及绿色食品',
-    area: '吉林 长春市',
-    status: '2',
-    sell: '中试'
-  }
-])
+const list = ref([])
 let skip = 0
-let limit = inject('limit')
+let limit = 15
 const total = ref(0)
-const file = ref([bg_1, bg_2, bg_3, bg_4, bg_5, bg_6, bg_7, bg_8, bg_9, bg_10, bg_1, bg_2])
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -343,35 +157,31 @@ onMounted(async () => {
 })
 const searchOther = async () => {
   let result
-  // 合作类型
-  result = await dictDataStore.query({ code: 'projectType', is_use: '0' })
-  if ($checkRes(result)) projectList.value = result.data
+  // // 合作类型
+  // result = await dictDataStore.query({ code: 'projectType', is_use: '0' })
+  // if ($checkRes(result)) projectList.value = result.data
   // 成熟度
   result = await dictDataStore.query({ code: 'projectMaturity', is_use: '0' })
   if ($checkRes(result)) maturityList.value = result.data
-  // 行业分类
-  result = await dictDataStore.query({ code: 'industry', is_use: '0' })
-  if ($checkRes(result)) industryList.value = result.data
-  // 技术领域
-  result = await dictDataStore.query({ code: 'field', is_use: '0' })
-  if ($checkRes(result)) fieldList.value = result.data
+  // // 行业分类
+  // result = await dictDataStore.query({ code: 'industry', is_use: '0' })
+  // if ($checkRes(result)) industryList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
   // 城市
-  getCity().then(
-    (response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address])
-  )
+  getCity().then((response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address]))
   maturityList.value.unshift({ value: '-1', label: '不限' })
 }
 const search = async (query = { skip: 0, limit }) => {
   const info = {
     skip: query.skip,
-    limit: query.limit,
-    status: '1',
-    is_use: '0'
+    limit: query.limit
   }
   const res = await store.query(info)
   if (res.errcode == '0') {
-    // list.value = res.data
-    // total.value = res.total
+    list.value = res.data
+    total.value = res.total
   }
 }
 // 查看
@@ -473,7 +283,7 @@ const sizeChange = (limits) => {
             display: flex;
             align-items: center;
             margin: 24px 18px 0;
-            height: 80px;
+            height: 100px;
             font-size: $global-font-size-18;
             font-weight: bold;
             color: #ffffff;

Diferenças do arquivo suprimidas por serem muito extensas
+ 77 - 50
src/views/detail/projectDetail.vue


+ 326 - 0
src/views/detail/supplyDetail.vue

@@ -0,0 +1,326 @@
+<template>
+  <custom-layout class="main">
+    <el-col :span="24" class="one">
+      <div class="w_1200">
+        <div class="info_1"></div>
+        <div class="info_2">
+          <div class="area">
+            <!-- <el-icon color="#0085f5"><Location /></el-icon>
+            <span>{{ info.area || '暂无' }}</span> -->
+          </div>
+          <div class="name">{{ info.name || '暂无' }}</div>
+          <div class="other">
+            <span class="other_1">{{ info.type || '暂无' }}</span>
+            <div class="other_2">
+              <p>
+                所属产业:<span class="moeny">{{ info.industry || '暂无' }}</span>
+              </p>
+              <p>
+                应用行业:<span>{{ info.field || '暂无' }} </span>
+              </p>
+              <p>
+                截止时间:<span class="time">{{ info.time || '暂无' }}</span>
+              </p>
+              <p>
+                来源 :<span>{{ info.source || '暂无' }}</span>
+              </p>
+            </div>
+          </div>
+          <!-- <div class="state">待解决</div> -->
+        </div>
+        <div class="title"><i></i>供给描述</div>
+        <div class="info_3">
+          <p>{{ info.brief || '暂无' }}</p>
+        </div>
+        <div class="title"><i></i>相关需求</div>
+        <div class="info_4">
+          <div class="list" v-for="(item, index) in list" :key="index" @click="toView(item)">
+            <h2 class="name textMore">
+              <span>{{ item.name || '暂无' }}</span>
+            </h2>
+            <div class="other">
+              <span class="other_1">{{ item.type || '暂无' }}</span>
+              <div class="other_2">
+                <span>应用行业:</span>
+                {{ item.field || '暂无' }}
+              </div>
+              <div class="other_2">
+                <span>所属产业:</span>
+                {{ item.industry || '暂无' }}
+              </div>
+              <div class="other_2">
+                <span>来源:</span>
+                {{ item.source || '暂无' }}
+              </div>
+              <!-- <div class="other_2">
+                <el-icon color="#0085f5"><Location /></el-icon>
+                {{ item.area || '暂无' }}
+                <span class="state">{{ item.status || '未解决' }}</span>
+              </div> -->
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-col>
+  </custom-layout>
+</template>
+
+<script setup>
+import { get } from 'lodash-es'
+import { DictDataStore } from '@/store/api/system/dictData'
+import { SupplyStore } from '@/store/api/platform/supply'
+const store = SupplyStore()
+const dictDataStore = DictDataStore()
+import { UserStore } from '@/store/user'
+const userStore = UserStore()
+const user = computed(() => userStore.user)
+const $checkRes = inject('$checkRes')
+// 加载中
+const loading = ref(false)
+// 路由
+const route = useRoute()
+const router = useRouter()
+const info = ref({})
+const list = ref([])
+// 字典表
+const fieldList = ref([])
+const attributeList = ref([])
+const matureList = ref([])
+const sellList = ref([])
+const technologyList = ref([])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search()
+  await searchAchieve()
+  loading.value = false
+})
+const search = async () => {
+  let id = route.query.id
+  if (id) {
+    let res = await store.detail(id)
+    if (res.errcode == '0') info.value = res.data
+  }
+}
+const searchAchieve = async () => {
+  const data = {
+    skip: 0,
+    limit: 3,
+    is_use: '0',
+    status: '1',
+    field: info.value.field
+  }
+  const res = await store.list(data)
+  if (res.errcode == '0') list.value = res.data
+}
+const searchOther = async () => {
+  // let result
+  // // 成熟度
+  // result = await dictDataStore.query({ code: 'mature', is_use: '0' })
+  // if ($checkRes(result)) matureList.value = result.data
+  // // 出让方式
+  // result = await dictDataStore.query({ code: 'sell', is_use: '0' })
+  // if ($checkRes(result)) sellList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
+  // // 属性
+  // result = await dictDataStore.query({ code: 'attribute', is_use: '0' })
+  // if ($checkRes(result)) attributeList.value = result.data
+  // // 技术分类
+  // result = await dictDataStore.query({ code: 'technology', is_use: '0' })
+  // if ($checkRes(result)) technologyList.value = result.data
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  let res
+  if (model == 'mature') res = matureList.value.find((f) => f.value == data)
+  else if (model == 'sell') res = sellList.value.find((f) => f.value == data)
+  else if (model == 'field') res = fieldList.value.find((f) => f.value == data)
+  else if (model == 'attribute') res = attributeList.value.find((f) => f.value == data)
+  else if (model == 'technology') res = technologyList.value.find((f) => f.value == data)
+  return get(res, 'label')
+}
+// 地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无地区'
+}
+// 查看详情
+const toView = (item) => {
+  router.push({ path: '/supply/detail', query: { id: item.id || item._id } }).then(() => {
+    // 重新刷新页面
+    location.reload()
+  })
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    background: url(/images/bg-need-detail.jpg) no-repeat;
+    background-position: center top;
+    padding-bottom: 30px;
+    .info_1 {
+      padding: 30px 0;
+    }
+    .info_2 {
+      position: relative;
+      padding: 0 20px 0 50px;
+      background-color: #fff;
+      box-shadow: 0 0 13px 0 rgba(5, 88, 219, 0.18);
+      .area {
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+        padding-top: 15px;
+        margin-right: 20px;
+        font-size: $global-font-size-16;
+        span {
+          margin: 0 0 0 5px;
+        }
+      }
+      .name {
+        margin-top: 15px;
+        font-size: $global-font-size-24;
+        line-height: 36px;
+        color: #2b2b2b;
+      }
+      .other {
+        margin-top: 25px;
+        .other_1 {
+          padding: 0 10px;
+          height: 25px;
+          background-color: #e6f2fd;
+          border-radius: 2px;
+          border: solid 1px #cae0f5;
+          font-size: $global-font-size-14;
+          line-height: 25px;
+          color: #0085f5;
+        }
+        .other_2 {
+          margin: 20px 0 0 0;
+          display: flex;
+          align-items: center;
+          flex-wrap: wrap;
+          p {
+            margin-right: 20px;
+            width: 45%;
+            font-size: $global-font-size-18;
+            color: #666;
+            .moeny {
+              font-family: keyifont;
+              color: #f60;
+            }
+            span {
+              color: #2b2b2b;
+            }
+          }
+        }
+      }
+      .state {
+        background: url(/images/icon-hzxq-state2.png);
+        position: absolute;
+        left: -36px;
+        top: 0;
+        padding: 17px 10px 0;
+        width: 36px;
+        height: 94px;
+        color: #fff;
+        font-size: $global-font-size-16;
+      }
+    }
+    .title {
+      margin-top: 30px;
+      font-size: $global-font-size-20;
+      line-height: 26px;
+      color: #333;
+      i {
+        display: inline-block;
+        vertical-align: middle;
+        margin-right: 20px;
+        width: 7px;
+        height: 22px;
+        background-color: #0085f5;
+        border-radius: 3px;
+      }
+    }
+    .info_3 {
+      margin-top: 20px;
+      padding: 50px;
+      background-color: #fff;
+      border: solid 1px #dedede;
+      font-size: $global-font-size-16;
+      line-height: 30px;
+      color: #333;
+    }
+    .info_4 {
+      display: flex;
+      margin-top: 20px;
+      .list {
+        position: relative;
+        margin-right: 30px;
+        width: 380px;
+        height: 233px;
+        box-shadow: 0 0 13px 0 rgba(5, 88, 219, 0.18);
+        .name {
+          padding: 10px 20px;
+          width: 380px;
+          height: 71px;
+          background-color: #dce5ff;
+          font-size: 16px;
+          line-height: 24px;
+          color: #0d0d0d;
+          display: flex;
+          align-items: center;
+        }
+        .other {
+          height: 162px;
+          padding: 10px 20px 0 20px;
+          .other_1 {
+            padding: 0 10px;
+            height: 25px;
+            background-color: #e6f2fd;
+            border-radius: 2px;
+            border: solid 1px #cae0f5;
+            font-size: $global-font-size-14;
+            line-height: 25px;
+            color: #0085f5;
+          }
+          .other_2 {
+            display: flex;
+            align-items: center;
+            margin-top: 15px;
+            font-size: $global-font-size-16;
+            span {
+              color: #909090;
+            }
+            .state {
+              position: absolute;
+              right: 20px;
+              bottom: 15px;
+              display: inline-block;
+              vertical-align: middle;
+              padding: 0 20px;
+              height: 30px;
+              line-height: 30px;
+              background-image: linear-gradient(90deg, #ff8a00 0, #ff5a00 100%), linear-gradient(#ff7800, #ff7800);
+              background-blend-mode: normal, normal;
+              border-radius: 14px;
+              border: solid 1px #e5e5e5;
+              color: #fff;
+            }
+          }
+        }
+      }
+      .list:hover {
+        box-shadow: 0 0 5px 0 $global-color-107;
+        .name {
+          background-color: $global-color-107;
+          color: $global-color-fff;
+        }
+      }
+    }
+  }
+}
+</style>

+ 90 - 99
src/views/four/parts/index.vue

@@ -49,10 +49,10 @@
             <el-col :span="24" class="name textOne">{{ item.name || '暂无项目名称' }}</el-col>
             <el-col :span="24" class="brief textMore"> 项目介绍:{{ item.brief || '暂无项目介绍' }} </el-col>
             <el-col :span="24" class="info">
-              <div>技术成熟度:{{ getDict(item.maturity, 'maturity') }}</div>
-              <div>合作类型:{{ getDict(item.cooperate, 'cooperate') }}</div>
+              <div>项目进展:{{ item.progress || '暂无' }}</div>
+              <div>项目来源:{{ item.source || '暂无' }}</div>
             </el-col>
-            <span class="key">{{ getDict(item.type, 'type') }}</span>
+            <span class="key">{{ item.industry }}</span>
           </el-col>
         </el-col>
       </el-col>
@@ -64,38 +64,34 @@
       </el-col>
       <el-col :span="24" class="one_3">
         <el-col :span="24" class="table_1">
-          <el-col :span="2" class="title">姓名</el-col>
-          <el-col :span="3" class="title">所在地</el-col>
+          <el-col :span="3" class="title">姓名</el-col>
           <el-col :span="3" class="title">学历/职称</el-col>
-          <el-col :span="3" class="title">技术领域</el-col>
-          <el-col :span="3" class="title">工作单位</el-col>
-          <el-col :span="6" class="title">研究方向</el-col>
-          <el-col :span="4" class="title">操作</el-col>
+          <el-col :span="4" class="title">工作类型</el-col>
+          <el-col :span="5" class="title">工作单位</el-col>
+          <el-col :span="6" class="title">所属产业</el-col>
+          <el-col :span="3" class="title">操作</el-col>
         </el-col>
         <el-col :span="24" class="table_2">
           <vue3-seamless-scroll :list="exportList" :hover="true" :step="0.5" :wheel="true" :isWatch="true">
             <el-col :span="24" class="list" v-for="(item, index) in exportList" :key="index">
-              <el-col :span="2" class="content textOne">
+              <el-col :span="3" class="content textOne">
                 <el-tooltip effect="dark" :content="item.name" placement="top">
                   {{ item.name || '暂无名称' }}
                 </el-tooltip>
               </el-col>
               <el-col :span="3" class="content textOne">
-                {{ getArea(item.area) || '暂无地区' }}
-              </el-col>
-              <el-col :span="3" class="content textOne">
-                {{ getDict(item.education, 'education') || '暂无学历/职称' }}
+                {{ item.title || '暂无学历/职称' }}
               </el-col>
-              <el-col :span="3" class="content textOne">
-                {{ getDict(item.field, 'field') || '暂无技术领域' }}
+              <el-col :span="4" class="content textOne">
+                {{ item.work_type || '暂无' }}
               </el-col>
-              <el-col :span="3" class="content textOne">
+              <el-col :span="5" class="content textOne">
                 {{ item.work || '暂无工作单位' }}
               </el-col>
               <el-col :span="6" class="content textOne">
-                {{ item.direction || '暂无研究方向' }}
+                {{ item.industry || '暂无研究方向' }}
               </el-col>
-              <el-col :span="4" class="content textOne">
+              <el-col :span="3" class="content textOne">
                 <el-button @click.stop="toView(item, '1')" type="primary"> 查看详情 </el-button>
               </el-col>
             </el-col>
@@ -113,7 +109,7 @@
           <el-col :span="4" class="left">
             <el-image class="image" :src="getUrl(item.logo)" fit="fill">
               <template v-slot:error>
-                <el-image class="image" :src="match" fit="fill" />
+                <el-image class="image" :src="company" fit="fill" />
               </template>
             </el-image>
           </el-col>
@@ -125,21 +121,21 @@
               <el-tag :type="[item.companyStatus == '0' ? 'success' : 'info']">{{ getDict(item.companyStatus, 'status') }}</el-tag>
             </el-col>
             <el-col :span="24" class="right_2">
-              <el-tag type="primary">{{ getDict(item.pattern, 'pattern') }}</el-tag>
-              <el-tag type="primary">{{ getDict(item.scale, 'scale') }}</el-tag>
+              <el-tag type="primary" v-if="item.pattern">{{ getDict(item.pattern, 'pattern') }}</el-tag>
+              <el-tag type="primary" v-if="item.scale">{{ getDict(item.scale, 'scale') }}</el-tag>
             </el-col>
             <el-col :span="24" class="right_3">
               <el-col :span="6" class="info">
                 法定代表人:<span>{{ item.representative || '暂无' }}</span>
               </el-col>
-              <el-col :span="6" class="info"> 成立日期: {{ moment(item.create_time).format('YYYY-MM-DD') }} </el-col>
-              <el-col :span="8" class="info"> 统一社会信用代码:{{ item.code || '暂无' }} </el-col>
+              <el-col :span="6" class="info"> 成立日期: {{ moment(item.create_time).format('YYYY-MM-DD') || '暂无' }} </el-col>
+              <el-col :span="8" class="info">员工人数:{{ item.person || '暂无' }}人 </el-col>
             </el-col>
             <el-col :span="24" class="right_3">
               <el-col :span="6" class="info">电话:{{ item.phone || '暂无' }}</el-col>
               <el-col :span="8" class="info">邮箱:{{ item.email || '暂无' }}</el-col>
             </el-col>
-            <el-col :span="24" class="right_3"> 地址:{{ item.address || '暂无' }} </el-col>
+            <el-col :span="24" class="right_3"> 地址:{{ getArea(item.area) || '暂无' }} </el-col>
           </el-col>
         </el-col>
       </el-col>
@@ -160,7 +156,7 @@
                 {{ item.name || '暂无名称' }}
               </el-col>
               <el-col :span="7" class="other textOne">
-                {{ getDict(item.field || '暂无技术领域', 'field') }}
+                {{ item.field || '暂无技术领域' }}
               </el-col>
             </el-col>
           </vue3-seamless-scroll>
@@ -180,7 +176,7 @@
 </template>
 
 <script setup>
-import match from '/images/match.jpg'
+import company from '/images/companyLogo.jpg'
 import moment from 'moment'
 const $checkRes = inject('$checkRes')
 import { get } from 'lodash-es'
@@ -229,15 +225,15 @@ const loadingSix = ref(false)
 // 搜索
 const active = ref('0')
 const typeList = ref([
-  { url: science_1, icon: science1, title: '生物技术', type: '0' },
-  { url: science_2, icon: science2, title: '信息技术', type: '1' },
-  { url: science_3, icon: science3, title: '新材料', type: '2' },
-  { url: science_4, icon: science4, title: '新能源', type: '3' },
-  { url: science_5, icon: science5, title: '智能制造', type: '4' },
-  { url: science_6, icon: science6, title: '光电芯片', type: '5' },
-  { url: science_7, icon: science7, title: '人工智能', type: '6' },
-  { url: science_8, icon: science8, title: '航空航天', type: '7' },
-  { url: science_9, icon: science9, title: '其他', type: '8' }
+  { url: science_1, icon: science1, title: '汽车电子及新型汽车零部件', type: '0' },
+  { url: science_2, icon: science2, title: '光电子及智能传感器', type: '1' },
+  { url: science_3, icon: science3, title: '精密仪器及先进装备', type: '2' },
+  { url: science_4, icon: science4, title: '生物医药及先进医疗器械', type: '3' },
+  { url: science_5, icon: science5, title: '车规级芯片及功率半导体器件', type: '4' },
+  { url: science_6, icon: science6, title: '人工智能及智能机器人', type: '5' },
+  { url: science_7, icon: science7, title: '生物基及高性能新材料', type: '6' },
+  { url: science_8, icon: science8, title: '新能源及动力电池', type: '7' },
+  { url: science_9, icon: science9, title: '碳纤维及复合材料', type: '8' }
 ])
 const list = ref([])
 // 字典表
@@ -290,27 +286,27 @@ onMounted(async () => {
 })
 const searchOther = async () => {
   let result
-  // 学历
-  result = await dictDataStore.query({ code: 'education', is_use: '0' })
-  if ($checkRes(result)) educationList.value = result.data
-  // 合作类型
-  result = await dictDataStore.query({ code: 'projectType', is_use: '0' })
-  if ($checkRes(result)) projectList.value = result.data
-  // 成熟度
-  result = await dictDataStore.query({ code: 'projectMaturity', is_use: '0' })
-  if ($checkRes(result)) maturityList.value = result.data
-  // 行业分类
-  result = await dictDataStore.query({ code: 'industry', is_use: '0' })
-  if ($checkRes(result)) industryList.value = result.data
+  // // 学历
+  // result = await dictDataStore.query({ code: 'education', is_use: '0' })
+  // if ($checkRes(result)) educationList.value = result.data
+  // // 合作类型
+  // result = await dictDataStore.query({ code: 'projectType', is_use: '0' })
+  // if ($checkRes(result)) projectList.value = result.data
+  // // 成熟度
+  // result = await dictDataStore.query({ code: 'projectMaturity', is_use: '0' })
+  // if ($checkRes(result)) maturityList.value = result.data
+  // // 行业分类
+  // result = await dictDataStore.query({ code: 'industry', is_use: '0' })
+  // if ($checkRes(result)) industryList.value = result.data
   // 企业状态
   result = await dictDataStore.query({ code: 'companyStatus', is_use: '0' })
   if ($checkRes(result)) statusList.value = result.data
-  // 企业类型
-  result = await dictDataStore.query({ code: 'companyType', is_use: '0' })
-  if ($checkRes(result)) patternList.value = result.data
-  // 企业规模
-  result = await dictDataStore.query({ code: 'companyScale', is_use: '0' })
-  if ($checkRes(result)) scaleList.value = result.data
+  // // 企业类型
+  // result = await dictDataStore.query({ code: 'companyType', is_use: '0' })
+  // if ($checkRes(result)) patternList.value = result.data
+  // // 企业规模
+  // result = await dictDataStore.query({ code: 'companyScale', is_use: '0' })
+  // if ($checkRes(result)) scaleList.value = result.data
   // 技术领域
   result = await dictDataStore.query({ code: 'field', is_use: '0' })
   if ($checkRes(result)) fieldList.value = result.data
@@ -321,11 +317,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '汽车电子及新型汽车零部件'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -338,11 +334,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '光电子及智能传感器'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -355,11 +351,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '精密仪器及先进装备'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -372,11 +368,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '生物医药及先进医疗器械'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -389,11 +385,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '车规级芯片及功率半导体器件'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -406,11 +402,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '人工智能及智能机器人'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -423,11 +419,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '生物基及高性能新材料'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -440,11 +436,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '新能源及动力电池'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -457,11 +453,11 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9,
-        is_use: '0',
-        status: '1'
+        limit: 9
+        // is_use: '0',
+        // status: '1'
       }
-      if (active) info.type = active
+      if (active) info.industry = '碳纤维及复合材料'
       const res = await store.query(info)
       if (res.errcode == '0') {
         list.value = res.data
@@ -483,9 +479,7 @@ const searchNews = async () => {
 const searchExport = async () => {
   const info = {
     skip: 0,
-    limit: 10,
-    is_show: '0',
-    status: '1'
+    limit: 10
   }
   const res = await expertStore.query(info)
   if (res.errcode == '0') exportList.value = res.data
@@ -494,18 +488,15 @@ const searchCompany = async () => {
   const info = {
     skip: 0,
     limit: 10,
-    is_show: '0',
-    status: '1'
+    status: '0'
   }
   const res = await companyStore.query(info)
   if (res.errcode == '0') companyList.value = res.data
 }
 const searchAchieve = async () => {
   const info = {
-    skip: 0,
-    limit: 10,
-    is_use: '0',
-    status: '1'
+    skip: 20,
+    limit: 10
   }
   const res = await achievementStore.list(info)
   if (res.errcode == '0') achievementList.value = res.data

+ 38 - 89
src/views/nine/index.vue

@@ -102,22 +102,22 @@
             <div class="list_2">
               <div class="other">
                 <el-image class="image" :src="one" fit="fill" />
-                <div class="text">{{ item.technology || '暂无' }}</div>
+                <div class="text">{{ item.field || '暂无' }}</div>
               </div>
               <div class="other">
                 <el-image class="image" :src="two" fit="fill" />
-                <div class="text">{{ item.type || '暂无' }}</div>
+                <div class="text">{{ item.person || '暂无' }}</div>
               </div>
               <div class="other">
                 <el-image class="image" :src="thr" fit="fill" />
-                <div class="text">{{ item.sell || '暂无' }}</div>
+                <div class="text">{{ item.source || '暂无' }}</div>
               </div>
             </div>
           </div>
         </div>
       </div>
       <div class="four">
-        <el-pagination background layout="prev, pager, next" :total="1000" />
+        <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
       </div>
     </div>
   </custom-layout>
@@ -154,80 +154,11 @@ const router = useRouter()
 // 加载中
 const loading = ref(false)
 const file = ref([bg_1, bg_2, bg_3, bg_4, bg_5, bg_6, bg_7, bg_8, bg_9, bg_1, bg_2, bg_3])
-const list = ref([
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '深地工程综合无损检测关键技术与装备',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  },
-  {
-    name: '合成气乙醇发酵与应用',
-    technology: '工业废水处理与资源化技术',
-    type: '废弃资源综合利用业',
-    sell: '普通许可,合作开发'
-  }
-])
+// 列表
+const list = ref([])
+let skip = 0
+let limit = inject('limit')
+const total = ref(0)
 // 是否展开
 const oneShow = ref(false)
 const twoShow = ref(false)
@@ -269,39 +200,57 @@ const plateList = ref([
 onMounted(async () => {
   loading.value = true
   await searchOther()
-
   await search()
   loading.value = false
 })
-const search = async () => {}
+const search = async (query = { skip, limit }) => {
+  const info = {
+    skip: query.skip,
+    limit: query.limit
+  }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    list.value = res.data
+    total.value = res.total
+  }
+}
 const searchOther = async () => {
   let result
-  // 技术领域
-  result = await dictDataStore.query({ code: 'field', is_use: '0' })
-  if ($checkRes(result)) fieldList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
   // 成熟度
   result = await dictDataStore.query({ code: 'mature', is_use: '0' })
   if ($checkRes(result)) matureList.value = result.data
   // 出让方式
   result = await dictDataStore.query({ code: 'sell', is_use: '0' })
   if ($checkRes(result)) sellList.value = result.data
-  // 技术分类
-  result = await dictDataStore.query({ code: 'technology', is_use: '0' })
-  if ($checkRes(result)) technologyList.value = result.data
+  // // 技术分类
+  // result = await dictDataStore.query({ code: 'technology', is_use: '0' })
+  // if ($checkRes(result)) technologyList.value = result.data
   // 价格
   result = await dictDataStore.query({ code: 'money', is_use: '0' })
   if ($checkRes(result)) moneyList.value = result.data
   matureList.value.unshift({ value: '-1', label: '不限' })
   sellList.value.unshift({ value: '-1', label: '不限' })
   // 城市
-  getCity().then(
-    (response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address])
-  )
+  getCity().then((response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address]))
 }
 // 查看详情
 const toView = async (item) => {
   router.push({ path: '/achievement/detail', query: { id: item.id || item._id } })
 }
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  console.log(limits)
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
+}
 </script>
 <style scoped lang="scss">
 .main {

+ 60 - 23
src/views/thr/index.vue

@@ -1,7 +1,7 @@
 <template>
   <custom-layout class="main">
     <el-col :span="24" class="one">
-      <el-image class="image" :src="list" fit="fill" />
+      <el-image class="image" :src="lists" fit="fill" />
     </el-col>
     <el-col :span="24" class="two">
       <div class="w_1300">
@@ -26,7 +26,7 @@
 
 <script setup>
 // 图片引入
-import list from '/images/bg-tec-list.jpg'
+import lists from '/images/bg-tec-list.jpg'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
@@ -40,7 +40,9 @@ const $checkRes = inject('$checkRes')
 import { getCity } from '@/utils/city'
 import { DictDataStore } from '@/store/api/system/dictData'
 import { DemandStore } from '@/store/api/platform/demand'
+import { SupplyStore } from '@/store/api/platform/supply'
 const demandStore = DemandStore()
+const supplyStore = SupplyStore()
 const dictDataStore = DictDataStore()
 // 路由
 const route = useRoute()
@@ -79,9 +81,15 @@ const plateList = ref([
   { label: '精密仪器及先进装备', value: '10' },
   { label: '生物医药及先进医疗器械', value: '11' }
 ])
+// 列表
+const list = ref([])
+let skip = 0
+let limit = inject('limit')
+const total = ref(0)
 // 选择
 const toTab = async (status) => {
   active.value = status
+  await search()
 }
 // 请求
 onMounted(async () => {
@@ -90,35 +98,64 @@ onMounted(async () => {
     cityList.value = response.address
   })
   await searchOther()
+  await search()
 })
+const search = async (query = { skip: 0, limit }) => {
+  const info = {
+    skip: query.skip,
+    limit: query.limit,
+    is_use: '0',
+    status: '1'
+  }
+  let res
+  if (active.value == '0') res = await demandStore.list(info)
+  else res = await supplyStore.list(info)
+  if (res.errcode == '0') {
+    list.value = res.data
+    total.value = res.total
+  }
+}
 const searchOther = async () => {
   let result
-  // 是否使用
-  result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
-  if ($checkRes(result)) isUseList.value = result.data
-  // 状态
-  result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
-  if ($checkRes(result)) statusList.value = result.data
-  // 合作方式
-  result = await dictDataStore.query({ code: 'method', is_use: '0' })
-  if ($checkRes(result)) methodList.value = result.data
-  // 需求紧急度
-  result = await dictDataStore.query({ code: 'urgent', is_use: '0' })
-  if ($checkRes(result)) urgentList.value = result.data
-  // 技术领域
-  result = await dictDataStore.query({ code: 'field', is_use: '0' })
-  if ($checkRes(result)) fieldList.value = result.data
-  // 需求状态
-  result = await dictDataStore.query({ code: 'demandStatus', is_use: '0' })
-  if ($checkRes(result)) demandList.value = result.data
+  // // 是否使用
+  // result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
+  // if ($checkRes(result)) isUseList.value = result.data
+  // // 状态
+  // result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
+  // if ($checkRes(result)) statusList.value = result.data
+  // // 合作方式
+  // result = await dictDataStore.query({ code: 'method', is_use: '0' })
+  // if ($checkRes(result)) methodList.value = result.data
+  // // 需求紧急度
+  // result = await dictDataStore.query({ code: 'urgent', is_use: '0' })
+  // if ($checkRes(result)) urgentList.value = result.data
+  // // 技术领域
+  // result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  // if ($checkRes(result)) fieldList.value = result.data
+  // // 需求状态
+  // result = await dictDataStore.query({ code: 'demandStatus', is_use: '0' })
+  // if ($checkRes(result)) demandList.value = result.data
   // 城市
-  getCity().then(
-    (response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address])
-  )
+  getCity().then((response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address]))
+}
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  console.log(limits)
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
 }
 provide('plateList', plateList)
 provide('typeList', typeList)
 provide('cityList', cityList)
+provide('list', list)
+provide('total', total)
+provide('sizeChange', sizeChange)
+provide('changePage', changePage)
 </script>
 <style scoped lang="scss">
 .main {

+ 27 - 118
src/views/thr/parts/demand.vue

@@ -66,24 +66,27 @@
       </div>
       <div class="demandValue">
         <div class="value" v-for="(item, index) in list" :key="index">
-          <div class="table-colunm table-colunm1">{{ item.num || '暂无' }}</div>
-          <div class="table-colunm table-colunm2">{{ item.name || '暂无' }}</div>
-          <div class="table-colunm">{{ item.field || '暂无' }}</div>
-          <div class="table-colunm">{{ item.area || '暂无' }}</div>
-          <div class="table-colunm">{{ item.money || '暂无' }}</div>
-          <div class="table-colunm">{{ item.status || '暂无' }}</div>
-          <div class="table-colunm">{{ item.time || '暂无' }}</div>
+          <div class="table-colunm table-colunm1 textOne">{{ index + 1 }}</div>
+          <div class="table-colunm table-colunm2 textOne">{{ item.name || '暂无' }}</div>
+          <div class="table-colunm textOne">{{ item.field || '暂无' }}</div>
+          <div class="table-colunm table-colunm3 textOne">{{ getArea(item.area) }}</div>
+          <div class="table-colunm table-colunm1 textOne">{{ item.money || '面议' }}</div>
+          <div class="table-colunm table-colunm1 textOne">{{ item.status || '未解决' }}</div>
           <div class="table-colunm button" @click="toView(item)">查看详情</div>
         </div>
       </div>
       <div class="demandTotal">
-        <el-pagination background layout="prev, pager, next" :total="1000" />
+        <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
       </div>
     </div>
   </div>
 </template>
 <script setup>
 const router = useRouter()
+const list = inject('list')
+const total = inject('total')
+const sizeChange = inject('sizeChange')
+const changePage = inject('changePage')
 const plateList = inject('plateList')
 const typeList = inject('typeList')
 const cityList = inject('cityList')
@@ -92,119 +95,22 @@ const oneShow = ref(false)
 const twoShow = ref(false)
 const column = ref([
   { name: '序号', style: { width: '100px' }, key: 'num' },
-  { name: '需方名称', style: { width: '220px' }, key: 'name' },
-  { name: '行业', style: { width: '160px' }, key: 'field' },
-  { name: '所在地', style: { width: '160px' }, key: 'area' },
-  { name: '投入预算', style: { width: '160px' }, key: 'money' },
-  { name: '状态', style: { width: '160px' }, key: 'status' },
-  { name: '截至日期', style: { width: '160px' }, key: 'time' },
-  { name: '操作', style: { width: '160px' }, key: 'operation' }
-])
-const list = ref([
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  }
+  { name: '需方名称', style: { width: '250px' }, key: 'name' },
+  { name: '技术领域', style: { width: '185px' }, key: 'time' },
+  { name: '所在地', style: { width: '360px' }, key: 'area' },
+  { name: '投入预算', style: { width: '100px' }, key: 'money' },
+  { name: '状态', style: { width: '100px' }, key: 'status' },
+  { name: '操作', style: { width: '185px' }, key: 'operation' }
 ])
 // 查看详情
 const toView = (item) => {
   router.push({ path: '/demand/detail', query: { id: item.id || item._id } })
 }
+// 转换地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无'
+}
 </script>
 <style scoped lang="scss">
 .demand {
@@ -286,14 +192,17 @@ const toView = (item) => {
         justify-content: space-between;
         padding: 12px 0;
         .table-colunm {
-          width: 160px;
+          width: 185px;
           text-align: center;
         }
         .table-colunm1 {
           width: 100px !important;
         }
         .table-colunm2 {
-          width: 220px !important;
+          width: 250px !important;
+        }
+        .table-colunm3 {
+          width: 360px !important;
         }
         .button {
           cursor: pointer; /* 改变鼠标样式为手形 */

+ 25 - 119
src/views/thr/parts/supply.vue

@@ -66,24 +66,27 @@
       </div>
       <div class="demandValue">
         <div class="value" v-for="(item, index) in list" :key="index">
-          <div class="table-colunm table-colunm1">{{ item.num || '暂无' }}</div>
-          <div class="table-colunm table-colunm2">{{ item.name || '暂无' }}</div>
-          <div class="table-colunm">{{ item.field || '暂无' }}</div>
-          <div class="table-colunm">{{ item.area || '暂无' }}</div>
-          <div class="table-colunm">{{ item.money || '暂无' }}</div>
+          <div class="table-colunm table-colunm1 textOne">{{ index + 1 }}</div>
+          <div class="table-colunm table-colunm2 textOne">{{ item.name || '暂无' }}</div>
+          <div class="table-colunm textOne">{{ item.field || '暂无' }}</div>
+          <div class="table-colunm table-colunm4 textOne">{{ item.industry || '暂无' }}</div>
           <!-- <div class="table-colunm">{{ item.status || '暂无' }}</div> -->
-          <div class="table-colunm">{{ item.time || '暂无' }}</div>
-          <div class="table-colunm button" @click="toView(item)">查看详情</div>
+          <div class="table-colunm table-colunm3 textOne">{{ item.source || '暂无' }}</div>
+          <div class="table-colunm textOne table-colunm3 button" @click="toView(item)">查看详情</div>
         </div>
       </div>
       <div class="demandTotal">
-        <el-pagination background layout="prev, pager, next" :total="1000" />
+        <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
       </div>
     </div>
   </div>
 </template>
 <script setup>
 const router = useRouter()
+const list = inject('list')
+const total = inject('total')
+const sizeChange = inject('sizeChange')
+const changePage = inject('changePage')
 const plateList = inject('plateList')
 const typeList = inject('typeList')
 const cityList = inject('cityList')
@@ -92,118 +95,15 @@ const oneShow = ref(false)
 const twoShow = ref(false)
 const column = ref([
   { name: '序号', style: { width: '100px' }, key: 'num' },
-  { name: '供方内容', style: { width: '220px' }, key: 'name' },
-  { name: '行业', style: { width: '192px' }, key: 'field' },
-  { name: '所在地', style: { width: '192px' }, key: 'area' },
-  { name: '投入预算', style: { width: '192px' }, key: 'money' },
-  // { name: '状态', style: { width: '160px' }, key: 'status' },
-  { name: '截至日期', style: { width: '192px' }, key: 'time' },
-  { name: '操作', style: { width: '192px' }, key: 'operation' }
-])
-const list = ref([
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  },
-  {
-    num: '1',
-    name: '卡拉胶的应用与开发',
-    field: '其他',
-    area: '吉林长春',
-    money: '100万元',
-    status: '未解决',
-    time: '2024-6-20'
-  }
+  { name: '供方内容', style: { width: '320px' }, key: 'name' },
+  { name: '技术领域', style: { width: '220px' }, key: 'field' },
+  { name: '所属产业', style: { width: '240px' }, key: 'industry' },
+  { name: '来源', style: { width: '200px' }, key: 'source' },
+  { name: '操作', style: { width: '200px' }, key: 'operation' }
 ])
 // 查看详情
 const toView = (item) => {
-  router.push({ path: '/demand/detail', query: { id: item.id || item._id } })
+  router.push({ path: '/supply/detail', query: { id: item.id || item._id } })
 }
 </script>
 <style scoped lang="scss">
@@ -286,14 +186,20 @@ const toView = (item) => {
         justify-content: space-between;
         padding: 12px 0;
         .table-colunm {
-          width: 192px;
+          width: 220px;
           text-align: center;
         }
         .table-colunm1 {
           width: 100px !important;
         }
         .table-colunm2 {
-          width: 220px !important;
+          width: 320px !important;
+        }
+        .table-colunm3 {
+          width: 200px !important;
+        }
+        .table-colunm4 {
+          width: 240px !important;
         }
         .button {
           cursor: pointer; /* 改变鼠标样式为手形 */