浏览代码

Merge branch 'master' of http://git.cc-lotus.info/Free-cysci/cysci-website

lrf402788946 4 年之前
父节点
当前提交
94e7f996e2

+ 6 - 0
src/router/index.js

@@ -43,6 +43,12 @@ const web = [
         meta: { title: '技术超市' },
         component: () => import('../views/market/index.vue'),
       },
+      {
+        path: '/market/list',
+        name: 'market_list',
+        meta: { title: '技术超市-列表页' },
+        component: () => import('../views/market/list.vue'),
+      },
       {
         path: '/train/index',
         name: 'train_index',

+ 265 - 0
src/views/market/detail-model/model-0.vue

@@ -0,0 +1,265 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="btn">
+          <slot></slot>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="top">
+            <el-col :span="7" class="left" v-if="data.image != ''">
+              <el-carousel trigger="click" height="345px" :autoplay="false">
+                <el-carousel-item v-for="(item, index) in data.image" :key="index">
+                  <el-image :src="item.url" style="width: 99%; height: 345px; border: 1px solid #ccc"></el-image>
+                </el-carousel-item>
+              </el-carousel>
+            </el-col>
+            <el-col :span="7" v-else class="achieveImage">
+              <p class="name textOver">{{ data.name }}</p>
+              <p class="brief">{{ data.achievebrief }}</p>
+              <p class="other">
+                <span class="textOver">领域:{{ data.field }}</span>
+                <span class="textOver">联系人:{{ data.contacts }}</span>
+              </p>
+            </el-col>
+            <el-col :span="17" class="right">
+              <el-col :span="24" class="name textOver">
+                {{ data.name || '暂无' }}
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 成果单位 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.company }}
+                  <el-link v-if="data.companyweb != null || ''" :href="data.companyweb" :underline="false" target="_blank">({{ data.companyweb }})</el-link>
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 所属领域 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.field || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 合作方式 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.cooperation || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 成果状态 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.achievestatus || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 成果来源 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.achievesource || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 成果权属 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.achieveown || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 意向价格 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.intentionprice || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 联系人 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.contacts || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 联系方式 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  <el-tooltip class="item" effect="dark" placement="top">
+                    <div slot="content">{{ data.email }}/{{ data.qqwx || '暂无' }}</div>
+                    <p class="textOver">{{ data.email }}/{{ data.qqwx || '暂无' }}</p>
+                  </el-tooltip>
+                </el-col>
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 项目路演 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  <el-link :href="data.roadshow[0].url" :underline="false" v-if="data.roadshow && data.roadshow.length">观看演示文件</el-link>
+                  <el-link :underline="false" v-else>暂无</el-link>
+                </el-col>
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 专利信息 </el-col>
+                <el-col :span="20" class="otherInfo textOver" style="padding: 6px">
+                  <el-button type="primary" size="mini" @click="dialogTableVisible1 = true">专利信息</el-button>
+                </el-col>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>成果简介</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.achievebrief || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>技术特点</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.features || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>技术团队</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.team || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>商业预期</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.expect || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>合作要求</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.condition || '暂无' }}
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="专利信息" :visible.sync="dialogTableVisible1">
+      <el-table :data="data.patent" style="width: 100%" border>
+        <el-table-column prop="patentinfo" label="专利信息" align="center"> </el-table-column>
+        <el-table-column prop="patentstatus" label="专利状态" align="center"> </el-table-column>
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object, default: () => {} },
+  },
+  components: {},
+  data: function () {
+    return {
+      dialogTableVisible1: false,
+    };
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+  .info {
+    .top {
+      height: 360px;
+      overflow: hidden;
+      .right {
+        padding: 0 0 0 10px;
+        .name {
+          font-size: 18px;
+          font-weight: bold;
+          padding: 10px;
+          border: 1px solid #ccc;
+          text-align: center;
+        }
+        .otherInfo {
+          padding: 10px;
+          font-size: 16px;
+          border: 1px solid #ccc;
+        }
+      }
+      .achieveImage {
+        position: relative;
+        height: 348px;
+        background: url('~@a/achieve.png');
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+        padding: 28px 25px;
+        .name {
+          font-size: 16px;
+          font-weight: bold;
+          margin: 10px 0;
+        }
+        .brief {
+          font-size: 14px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          -webkit-line-clamp: 11;
+          word-break: break-all;
+          display: -webkit-box;
+          -webkit-box-orient: vertical;
+        }
+        .other {
+          position: absolute;
+          bottom: 10px;
+          width: 82%;
+          font-size: 14px;
+          span {
+            display: inline-block;
+            width: 100%;
+          }
+        }
+      }
+    }
+    .down {
+      margin: 0 0 15px 0;
+      .downInfo {
+        border: 1px solid #ccc;
+        .tit {
+          height: 150px;
+          line-height: 150px;
+          text-align: center;
+          border-right: 1px solid #ccc;
+        }
+        .info {
+          font-size: 16px;
+          padding: 10px;
+          min-height: 150px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 206 - 0
src/views/market/detail-model/model-1.vue

@@ -0,0 +1,206 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="btn">
+          <slot></slot>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="top">
+            <el-col :span="7" class="left">
+              <el-col :span="24" class="noImage">
+                <p>专利有效性</p>
+                <p>{{ data.term }}</p>
+              </el-col>
+            </el-col>
+            <el-col :span="17" class="right">
+              <el-col :span="24" class="name textOver">
+                {{ data.name }}
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 申请号 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.create_number || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 申请日 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.create_date || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 公开(公告)号 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.success_number || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 公开(公告)日 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.success_date || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 申请人 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.apply_personal || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 专利类型 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.type || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 发明人 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.inventor || '暂无' }}
+                </el-col>
+              </el-col>
+
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 代理人 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.agent_personal || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 代理机构 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.agent || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 地址 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.address || '暂无' }}
+                </el-col>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-col :span="24" class="downInfo">
+              <h1>摘要</h1>
+              <p>{{ data.abstract || '暂无' }}</p>
+            </el-col>
+            <el-col :span="24" class="downInfo" v-if="data.img_url && data.img_url.length > 0">
+              <h1>专利图鉴</h1>
+              <el-image :src="data.img_url[0].url"></el-image>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+  .info {
+    .top {
+      margin: 0 0 10px 0;
+      .left {
+        margin: 0 10px 0 0;
+        border: 1px solid #ccc;
+        .el-image {
+          width: 100%;
+          height: 320px;
+        }
+        .noImage {
+          height: 320px;
+          p:nth-child(1) {
+            font-size: 25px;
+            text-align: left;
+            padding: 10px;
+          }
+          p:nth-child(2) {
+            text-align: center;
+            padding: 30% 0;
+            font-size: 35px;
+            font-weight: bold;
+            color: #ff0000;
+          }
+        }
+      }
+      .right {
+        width: 638px;
+        border: 1px solid #ccc;
+        .name {
+          height: 40px;
+          line-height: 40px;
+          padding: 0 10px;
+          border-bottom: 1px solid #ccc;
+          font-size: 18px;
+          font-weight: bold;
+          text-align: center;
+        }
+        .otherInfo {
+          height: 40px;
+          line-height: 40px;
+          padding: 0 0 0 10px;
+          border-right: 1px solid #ccc;
+          border-bottom: 1px solid #ccc;
+          font-size: 16px;
+          .tooltip {
+            float: left;
+            width: 98%;
+          }
+        }
+      }
+    }
+    .down {
+      border: 1px solid #cccccc;
+      padding: 10px;
+      .downInfo {
+        margin: 0 0 15px 0;
+        border-bottom: 1px dashed #ccc;
+        p {
+          font-size: 18px;
+          line-height: 38px;
+          text-indent: 2rem;
+        }
+        h1 {
+          font-weight: 400;
+          font-size: 24px;
+          margin: 0 0 10px 0;
+        }
+      }
+    }
+  }
+}
+</style>

+ 201 - 0
src/views/market/detail-model/model-2.vue

@@ -0,0 +1,201 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="btn">
+          <slot></slot>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="top">
+            <el-col :span="6" class="left">
+              <el-image :src="getImage(data.img_path)">
+                <template #error>
+                  <el-image :src="expetImg"></el-image>
+                </template>
+              </el-image>
+            </el-col>
+            <el-col :span="18" class="right">
+              <el-col :span="24" class="name textOver">
+                {{ data.name || '暂无' }}
+              </el-col>
+              <el-col :span="24">
+                <el-col :span="4" class="otherInfo textOver"> 工作单位 </el-col>
+                <el-col :span="20" class="otherInfo textOver">
+                  {{ data.company || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 毕业院校 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.school || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 最高学历 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.education || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 出生日期 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.birthDate || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 职务职称 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.zwzc || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 电子邮箱 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.email || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver"> 擅长领域 </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ data.expertise || '暂无' }}
+                </el-col>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>工作经历</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.workexperience || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>科研综述</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.scientific || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>承担项目</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.undertakingproject || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>科技奖励</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.scienceaward || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>社会任职</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ data.social || '暂无' }}
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return { expetImg: require('@a/expert.png') };
+  },
+  created() {},
+  methods: {
+    getImage(data) {
+      if (_.map(data, 'url')[0]) {
+        return _.map(data, 'url')[0];
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+  .info {
+    .top {
+      height: 230px;
+      overflow: hidden;
+      .left {
+        text-align: center;
+        .el-image {
+          width: 100%;
+          height: 220px;
+        }
+      }
+      .right {
+        padding: 0 0 0 10px;
+        .name {
+          font-size: 18px;
+          font-weight: bold;
+          padding: 10px;
+          text-align: center;
+          border: 1px solid #ccc;
+        }
+        .otherInfo {
+          font-size: 16px;
+          padding: 10px;
+          border: 1px solid #ccc;
+        }
+      }
+    }
+    .down {
+      margin: 0 0 15px 0;
+      .downInfo {
+        border: 1px solid #ccc;
+        .tit {
+          height: 150px;
+          line-height: 150px;
+          text-align: center;
+          border-right: 1px solid #ccc;
+        }
+        .info {
+          font-size: 16px;
+          padding: 10px;
+          min-height: 150px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 114 - 0
src/views/market/detail-model/model-3.vue

@@ -0,0 +1,114 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="btn">
+          <slot></slot>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="title">
+            {{ data.title }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="text">
+              信息来源:<span>{{ data.origin }}</span>
+            </el-col>
+            <el-col :span="12" class="text">
+              发布时间:<span>{{ data.publish_time }}</span>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="video" v-if="data.filepath">
+            <video :src="getImage(data.filepath)" controls="controls">your browser does not support the video tag</video>
+          </el-col>
+          <el-col :span="24" class="content">
+            <p v-html="data.content"></p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    getImage(data) {
+      if (_.map(data, 'url')[0]) {
+        return _.map(data, 'url')[0];
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+  .info {
+    .title {
+      font-size: 18px;
+      text-align: center;
+      font-weight: bold;
+      margin: 0 0 15px 0;
+    }
+    .other {
+      margin: 0 0 15px 0;
+      .text {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+        padding: 0 10px;
+        span {
+          color: #000;
+        }
+      }
+      .text:nth-child(2) {
+        text-align: left;
+      }
+    }
+    .video {
+      text-align: center;
+      height: 260px;
+      overflow: hidden;
+      margin: 0 0 15px 0;
+      video {
+        width: 50%;
+        height: 260px;
+        overflow: hidden;
+      }
+    }
+    .content {
+      font-size: 16px;
+      text-indent: 2rem;
+      margin: 0 0 15px 0;
+    }
+  }
+}
+</style>

+ 112 - 0
src/views/market/detail-model/model-4.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="btn">
+          <slot></slot>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="title">
+            {{ data.title }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="text">
+              信息来源:<span>{{ data.origin }}</span>
+            </el-col>
+            <el-col :span="12" class="text">
+              发布时间:<span>{{ data.release_time }}</span>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="content">
+            <p v-html="data.content"></p>
+          </el-col>
+          <el-col :span="24" class="image" v-if="data.image">
+            <el-carousel height="300px" :interval="2000">
+              <el-carousel-item v-for="(tag, index) in data.image" :key="index">
+                <el-image :src="tag.url"></el-image>
+              </el-carousel-item>
+            </el-carousel>
+          </el-col>
+          <el-col :span="24" class="fileUrl" v-if="data.fileUrl && data.fileUrl.length > 0">
+            <p>附件:</p>
+            <el-link :href="data.fileUrl[0].url">{{ data.fileUrl[0].name }}</el-link>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .btn {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+  .info {
+    .title {
+      font-size: 18px;
+      text-align: center;
+      font-weight: bold;
+      margin: 0 0 15px 0;
+    }
+    .other {
+      margin: 0 0 15px 0;
+      .text {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+        padding: 0 10px;
+        span {
+          color: #000;
+        }
+      }
+      .text:nth-child(2) {
+        text-align: left;
+      }
+    }
+    .content {
+      font-size: 16px;
+      text-indent: 2rem;
+      margin: 0 0 15px 0;
+    }
+    .image {
+      text-align: center;
+      padding: 0 26%;
+      .el-image {
+        width: 100%;
+        height: 100%;
+      }
+    }
+  }
+}
+</style>

+ 27 - 25
src/views/market/index.vue

@@ -5,32 +5,32 @@
         <div class="w_1200">
           <el-col :span="24" class="common one">
             <el-col :span="12" class="left">
-              <top topText="科技成果"></top>
-              <list type="1" :list="oneList"></list>
+              <top topText="科技成果" @more="more('0')"></top>
+              <list type="1" :list="oneList" @detail="detail"></list>
             </el-col>
             <el-col :span="12" class="left">
-              <top topText="专利信息"></top>
-              <list type="2" :list="twoList"></list>
+              <top topText="专利信息" @more="more('1')"></top>
+              <list type="2" :list="twoList" @detail="detail"></list>
             </el-col>
           </el-col>
           <el-col :span="24" class="common two">
             <el-col :span="12" class="left">
-              <top topText="专家智库"></top>
-              <list type="3" :list="thrList"></list>
+              <top topText="专家智库" @more="more('2')"></top>
+              <list type="3" :list="thrList" @detail="detail"></list>
             </el-col>
             <el-col :span="12" class="left">
-              <top topText="项目路演"></top>
-              <list type="4" :list="fourList"></list>
+              <top topText="项目路演" @more="more('3')"></top>
+              <list type="4" :list="fourList" @detail="detail"></list>
             </el-col>
           </el-col>
           <el-col :span="24" class="common thr">
             <el-col :span="12" class="left">
-              <top topText="科技需求"></top>
-              <list type="5" :list="fiveList"></list>
+              <top topText="科技需求" @more="more('4')"></top>
+              <list type="5" :list="fiveList" @detail="detail"></list>
             </el-col>
             <el-col :span="12" class="left">
-              <top topText="商务服务"></top>
-              <list type="6" :list="sixList"></list>
+              <top topText="商务服务" @more="more('5')"></top>
+              <list type="6" :list="sixList" @detail="detail"></list>
             </el-col>
           </el-col>
         </div>
@@ -47,6 +47,7 @@ import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: product } = createNamespacedHelpers('product');
 const { mapActions: patent } = createNamespacedHelpers('patent');
 const { mapActions: roadShow } = createNamespacedHelpers('roadShow');
+const { mapActions: expert } = createNamespacedHelpers('expert');
 
 export default {
   name: 'index',
@@ -56,19 +57,7 @@ export default {
     return {
       oneList: [],
       twoList: [],
-      thrList: [
-        {
-          img_path: require('@a/news1.jpg'),
-          name: '专家姓名',
-          zwzc: '职务职称',
-          company: '工作动态',
-        },
-        {
-          name: '6条数据',
-          zwzc: '职务职称',
-          company: '工作动态',
-        },
-      ],
+      thrList: [],
       fourList: [],
       fiveList: [],
       sixList: [],
@@ -82,6 +71,7 @@ export default {
     ...product({ productQuery: 'query' }),
     ...patent({ patentQuery: 'query' }),
     ...roadShow({ roadShowQuery: 'query' }),
+    ...expert({ expertQuery: 'query' }),
     async search({ skip = 0, limit = 10, ...info } = {}) {
       for (const val of this.productType) {
         if (val.value == '0') {
@@ -104,6 +94,18 @@ export default {
       // 项目路演
       res = await this.roadShowQuery({ skip, limit: 5, ...info });
       if (this.$checkRes(res)) this.$set(this, `fourList`, res.data);
+      // 专家智库
+      res = await this.expertQuery({ skip, limit: 6, ...info });
+      const { img_url } = res.data;
+      if (this.$checkRes(res)) this.$set(this, `thrList`, res.data);
+    },
+    // 更多
+    more(index) {
+      this.$router.push({ path: '/market/list', query: { index: index } });
+    },
+    // 详情
+    detail({ id, index }) {
+      this.$router.push({ path: '/market/list', query: { id: id, index: index } });
     },
   },
   computed: {

+ 91 - 0
src/views/market/list-model/model-0.vue

@@ -0,0 +1,91 @@
+<template>
+  <div id="model-0">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item.id)">
+          <el-col :span="24" class="title textOver">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="text textOver">
+              成果单位:<span>{{ item.company }}</span>
+            </el-col>
+            <el-col :span="12" class="text textOver">
+              发布时间:<span>{{ getDate(item.meta.createdAt) }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const moment = require('moment');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(id) {
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+    getDate(date) {
+      let newDate = moment(date).format('YYYY-MM-DD');
+      if (newDate) return newDate;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 10px;
+    border-bottom: 1px solid #ccc;
+    .title {
+      font-size: 16px;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      .text {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:hover {
+    cursor: pointer;
+    .title {
+      color: #409eff;
+      font-weight: bold;
+    }
+  }
+}
+</style>

+ 92 - 0
src/views/market/list-model/model-1.vue

@@ -0,0 +1,92 @@
+<template>
+  <div id="model-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item.id)">
+          <el-col :span="15" class="name textOver">{{ item.name }} </el-col>
+          <el-col :span="6" class="type textOver"> 专利有限性:{{ item.term }} </el-col>
+          <el-col :span="3" class="date"> {{ item.success_date }} </el-col>
+          <el-col :span="24" class="brief">
+            {{ item.abstract }}
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-1',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(id) {
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    border-bottom: 1px dashed #ccc;
+    padding: 12px 0;
+    .name {
+      font-size: 18px;
+      padding: 0 0 5px 0;
+    }
+    .type {
+      font-size: 16px;
+      text-align: left;
+      padding: 0 0 5px 0;
+    }
+    .date {
+      font-size: 16px;
+      text-align: right;
+      padding: 0 0 5px 0;
+    }
+    .brief {
+      font-size: 16px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      height: 40px;
+    }
+  }
+  .list:hover {
+    cursor: pointer;
+    .name {
+      color: #409eff;
+      font-weight: bold;
+    }
+  }
+}
+</style>

+ 107 - 0
src/views/market/list-model/model-2.vue

@@ -0,0 +1,107 @@
+<template>
+  <div id="model-2">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="12" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item.id)">
+          <el-col :span="5" class="image">
+            <el-image :src="getImage(item.img_path)">
+              <template #error>
+                <el-image :src="expetImg"></el-image>
+              </template>
+            </el-image>
+          </el-col>
+          <el-col :span="19" class="other">
+            <p class="name textOver">{{ item.name }}</p>
+            <p class="textOver">工作单位:{{ item.company || '暂无' }}</p>
+            <p class="textOver">擅长领域:{{ item.expertise || '暂无' }}</p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-2',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function () {
+    return {
+      expetImg: require('@a/expert.png'),
+    };
+  },
+  created() {},
+  methods: {
+    detail(id) {
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+    getImage(data) {
+      if (_.map(data, 'url')[0]) {
+        return _.map(data, 'url')[0];
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 10px;
+    border-bottom: 1px dashed #ccc;
+    .image {
+      .el-image {
+        border-radius: 90px;
+        width: 90px;
+        height: 90px;
+      }
+    }
+    .other {
+      padding: 0 10px;
+      p {
+        font-size: 16px;
+        color: #666;
+        padding: 0 0 10px 0;
+        span {
+          display: inline-block;
+          width: 50%;
+        }
+      }
+      p:nth-child(1) {
+        font-size: 18px;
+        color: #000;
+      }
+    }
+  }
+  .list:hover {
+    cursor: pointer;
+    .other {
+      p:nth-child(1) {
+        font-weight: bold;
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 86 - 0
src/views/market/list-model/model-3.vue

@@ -0,0 +1,86 @@
+<template>
+  <div id="model-3">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item.id)">
+          <el-col :span="24" class="title textOver">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="text textOver">
+              信息来源:<span>{{ item.origin }}</span>
+            </el-col>
+            <el-col :span="12" class="text textOver">
+              发布时间:<span>{{ item.publish_time }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-3',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(id) {
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 10px;
+    border-bottom: 1px solid #ccc;
+    .title {
+      font-size: 16px;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      .text {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:hover {
+    cursor: pointer;
+    .title {
+      color: #409eff;
+      font-weight: bold;
+    }
+  }
+}
+</style>

+ 86 - 0
src/views/market/list-model/model-4.vue

@@ -0,0 +1,86 @@
+<template>
+  <div id="model-4">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detail(item.id)">
+          <el-col :span="24" class="title textOver">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="text textOver">
+              信息来源:<span>{{ item.origin }}</span>
+            </el-col>
+            <el-col :span="12" class="text textOver">
+              发布时间:<span>{{ item.release_time }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-4',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(id) {
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 10px;
+    border-bottom: 1px solid #ccc;
+    .title {
+      font-size: 16px;
+      margin: 0 0 5px 0;
+    }
+    .other {
+      .text {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:hover {
+    cursor: pointer;
+    .title {
+      color: #409eff;
+      font-weight: bold;
+    }
+  }
+}
+</style>

+ 132 - 0
src/views/market/list.vue

@@ -0,0 +1,132 @@
+<template>
+  <div id="list">
+    <el-row>
+      <el-col :span="24" class="main">
+        <div class="w_1200">
+          <el-col :span="24" class="one">
+            <el-col :span="5" class="menu">
+              <el-image :src="squareImage"></el-image>
+              <span class="menuTitle">Menu</span>
+              <el-col :span="24" class="menuList" v-for="(item, index) in menuList" :key="index">
+                <p @click="changeMenu(item.component, index)" :style="`color:${menuIndex == index ? menuColor : ''}`">{{ item.name }}</p>
+              </el-col>
+            </el-col>
+            <el-col :span="19" class="listInfo">
+              <component :is="component" v-bind="params"></component>
+            </el-col>
+          </el-col>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list',
+  props: {},
+  components: {
+    kjcg: () => import('./list/kjcg.vue'),
+    zlxx: () => import('./list/zlxx.vue'),
+    zjzk: () => import('./list/zjzk.vue'),
+    xmlu: () => import('./list/xmlu.vue'),
+    jxxq: () => import('./list/jxxq.vue'),
+    swfw: () => import('./list/swfw.vue'),
+  },
+  data: function () {
+    return {
+      menuList: [
+        { name: '科技成果', component: 'kjcg', options: { useTab: false, listModel: 0 } },
+        { name: '专利信息', component: 'zlxx', options: { useTab: false, listModel: 1 } },
+        { name: '专家智库', component: 'zjzk', options: { useTab: false, listModel: 2 } },
+        { name: '项目路演', component: 'xmlu', options: { useTab: false, listModel: 3 } },
+        { name: '技术需求', component: 'jxxq', options: { useTab: false, listModel: 4 } },
+        { name: '商务服务', component: 'swfw', options: { useTab: false, listModel: 5 } },
+      ],
+      component: '',
+      params: {},
+      menuColor: 'rgb(254, 149, 14)',
+      squareImage: require('@a/square_big.png'),
+    };
+  },
+  created() {},
+  methods: {
+    changeMenu(component, index) {
+      if (index !== this.menuIndex) this.$router.push({ path: './list', query: { index } });
+      this.component = component;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    menuIndex() {
+      const index = this.$route.query.index || 0;
+      const obj = this.menuList[index];
+      const params = {
+        title: _.get(obj, 'name'),
+        ..._.get(obj, 'options'),
+      };
+      this.$set(this, 'component', _.get(obj, 'component', 'kjcg'));
+      this.$set(this, 'params', params);
+      return index;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 500px;
+  margin: 10px 0;
+  .one {
+    .menu {
+      height: 600px;
+      overflow: hidden;
+      padding: 15px 10px;
+      background: no-repeat 100% 100%;
+      background-image: url('~@a/menu_back.jpg');
+      box-sizing: border-box;
+      box-shadow: 0 0 10px #bbbaba;
+      .menuTitle {
+        font-size: 24px;
+        color: #92959a;
+        font-weight: bold;
+        position: relative;
+        top: -10px;
+        left: 10px;
+      }
+      .menuList {
+        height: 60px;
+        line-height: 60px;
+        border-bottom: 1px solid #409eff;
+        p {
+          font-weight: bold;
+          font-size: 18px;
+          color: #044b79;
+        }
+      }
+      .menuList:hover {
+        cursor: pointer;
+      }
+    }
+    .listInfo {
+      float: right;
+      width: 78%;
+      min-height: 600px;
+      overflow: hidden;
+      box-shadow: 0 0 10px #409eff;
+      padding: 10px;
+    }
+  }
+}
+</style>

+ 85 - 0
src/views/market/list/jxxq.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="jxxq">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize" searchModel="title">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+const { newsColumn } = require('@common/dict/index');
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: news } = createNamespacedHelpers('news');
+export default {
+  name: 'jxxq',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model2: () => import('../list-model/model-2.vue'),
+    dmodel: () => import('../detail-model/model-2.vue'),
+  },
+  data: function () {
+    return {
+      // 栏目
+      column: newsColumn,
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 4,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...news(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      info.column_name = this.column[this.listModel];
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 81 - 0
src/views/market/list/kjcg.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="kjcg">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  name: 'kjcg',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model0: () => import('../list-model/model-0.vue'),
+    dmodel: () => import('../detail-model/model-0.vue'),
+  },
+  data: function () {
+    return {
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 8,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...product(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      let res = await this.query({ skip, limit, type: 1, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 85 - 0
src/views/market/list/swfw.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="swfw">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize" searchModel="title">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+const { newsColumn } = require('@common/dict/index');
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: news } = createNamespacedHelpers('news');
+export default {
+  name: 'swfw',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model2: () => import('../list-model/model-2.vue'),
+    dmodel: () => import('../detail-model/model-2.vue'),
+  },
+  data: function () {
+    return {
+      // 栏目
+      column: newsColumn,
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 4,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...news(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      info.column_name = this.column[this.listModel];
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 81 - 0
src/views/market/list/xmlu.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="xmlu">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize" searchModel="title">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: roadShow } = createNamespacedHelpers('roadShow');
+export default {
+  name: 'xmlu',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model3: () => import('../list-model/model-3.vue'),
+    dmodel: () => import('../detail-model/model-3.vue'),
+  },
+  data: function () {
+    return {
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 7,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...roadShow(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 81 - 0
src/views/market/list/zjzk.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="zjzk">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize" searchModel="title">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'zjzk',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model2: () => import('../list-model/model-2.vue'),
+    dmodel: () => import('../detail-model/model-2.vue'),
+  },
+  data: function () {
+    return {
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 8,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...expert(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 81 - 0
src/views/market/list/zlxx.vue

@@ -0,0 +1,81 @@
+<template>
+  <div id="zlxx">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search" :pageSize="pageSize" searchModel="title">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :data="detail" v-if="detail">
+        <el-button size="mini" type="primary" @click="$router.push({ path: './list', query: { index: $route.query.index } })"> 返回</el-button>
+      </dmodel>
+    </template>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patent } = createNamespacedHelpers('patent');
+export default {
+  name: 'zlxx',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model1: () => import('../list-model/model-1.vue'),
+    dmodel: () => import('../detail-model/model-1.vue'),
+  },
+  data: function () {
+    return {
+      // 列表
+      list: [],
+      total: 0,
+      pageSize: 5,
+      // 详情
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...patent(['query', 'fetch']),
+    async search({ skip = 0, limit = this.pageSize, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    model() {
+      const moduleNumber = this.listModel || 0;
+      return `model${moduleNumber}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    id: {
+      handler(ne) {
+        if (ne) this.searchInfo();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 21 - 12
src/views/market/parts/list.vue

@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="24" class="main">
         <el-col :span="24" class="one" v-if="type == '1'">
-          <el-col :span="8" class="oneList" v-for="(item, index) in list" :key="index">
+          <el-col :span="8" class="oneList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '0')">
             <el-col :span="24" class="name textOver">
               {{ item.name }}
             </el-col>
@@ -17,8 +17,8 @@
           </el-col>
         </el-col>
         <el-col :span="24" class="one two" v-else-if="type == '2'">
-          <el-col :span="8" class="twoList" v-for="(item, index) in list" :key="index">
-            <el-image :src="item.img_url" class="image">
+          <el-col :span="8" class="twoList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '1')">
+            <el-image :src="getImage(item.img_url)" class="image">
               <template #error>
                 <el-image :src="imgUrl"></el-image>
               </template>
@@ -29,23 +29,23 @@
           </el-col>
         </el-col>
         <el-col :span="24" class="one thr" v-else-if="type == '3'">
-          <el-col :span="8" class="thrList" v-for="(item, index) in list" :key="index">
+          <el-col :span="8" class="thrList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '2')">
             <el-col :span="24" class="image">
-              <el-image :src="item.img_path">
+              <el-image :src="getImage(item.img_path)">
                 <template #error>
                   <el-image :src="expetImg"></el-image>
                 </template>
               </el-image>
             </el-col>
             <el-col :span="24" class="other">
-              <p>{{ item.name }}</p>
-              <p>{{ item.zwzc || '暂无' }}</p>
-              <p>{{ item.company || '暂无' }}</p>
+              <p class="textOver">{{ item.name }}</p>
+              <p class="textOver">{{ item.zwzc || '暂无' }}</p>
+              <p class="textOver">{{ item.company || '暂无' }}</p>
             </el-col>
           </el-col>
         </el-col>
         <el-col :span="24" class="one four" v-else-if="type == '4'">
-          <el-col :span="24" class="fourList" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="fourList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '3')">
             <el-col :span="24" class="top">
               <el-col :span="19" class="title textOver">
                 {{ item.title }}
@@ -54,11 +54,11 @@
                 <span>{{ item.publish_time || '暂无' }}</span>
               </el-col>
             </el-col>
-            <el-col :span="24" class="down"> 简介:{{ item.titlejj }} </el-col>
+            <el-col :span="24" class="down"> 简介:{{ item.titlejj || '暂无' }} </el-col>
           </el-col>
         </el-col>
         <el-col :span="24" class="one five" v-else-if="type == '5'">
-          <el-col :span="24" class="fiveList" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="fiveList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '4')">
             <el-col :span="24" class="top">
               <el-col :span="19" class="title textOver">
                 {{ item.name }}
@@ -74,7 +74,7 @@
           </el-col>
         </el-col>
         <el-col :span="24" class="one six" v-else-if="type == '6'">
-          <el-col :span="24" class="sixList" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="sixList" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item.id, '5')">
             <el-col :span="10" class="name textOver">
               {{ item.name }}
             </el-col>
@@ -94,6 +94,7 @@
 
 <script>
 var moment = require('moment');
+const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'list',
@@ -115,6 +116,14 @@ export default {
       let newsDate = moment(date).format('YYYY-MM-DD');
       if (newsDate) return newsDate;
     },
+    detailBtn(id, index) {
+      this.$emit('detail', { id: id, index: index });
+    },
+    getImage(data) {
+      if (_.map(data, 'url')[0]) {
+        return _.map(data, 'url')[0];
+      }
+    },
   },
   computed: {
     ...mapState(['user']),