guhongwei 3 years ago
parent
commit
82d8bc3d08

+ 6 - 0
src/router/index.js

@@ -90,6 +90,12 @@ const twoweb = [
     meta: { title: '创新服务' },
     component: () => import('../views/twoweb/service/index.vue'),
   },
+  {
+    path: '/twoweb/service/list',
+    name: 'twoweb_service_list',
+    meta: { title: '创新服务' },
+    component: () => import('../views/twoweb/service/list.vue'),
+  },
   {
     path: '/twoweb/service/project',
     name: 'twoweb_service_project_index',

+ 3 - 0
src/store/index.js

@@ -67,6 +67,8 @@ import mechanism from '@common/src/store/mechanism';
 // 科教之旅
 import Medium from '@common/src/store/kjzl/Medium';
 import Order from '@common/src/store/kjzl/Order';
+// 科技评价
+import achieveApply from '@common/src/store/achieve/achieve_apply.js';
 
 Vue.use(Vuex);
 
@@ -114,5 +116,6 @@ export default new Vuex.Store({
     // 科教之旅
     Medium,
     Order,
+    achieveApply,
   },
 });

+ 217 - 0
src/views/twoweb/service/detail-model/model-0.vue

@@ -0,0 +1,217 @@
+<template>
+  <div id="model-0">
+    <el-row type="flex" justify="end">
+      <el-col :span="2">
+        <slot></slot>
+      </el-col>
+    </el-row>
+    <el-col :span="24" class="two">
+      <el-col :span="24" class="two_1">
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果编号</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.achieve_num || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果名称</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.achieve_name || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果类别</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.achieve_type || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果形式</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.achieve_form || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果取得时间</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.achieve_date || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">申请人</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.apply_personal || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">申请人电话</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.apply_phone || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">申请单位</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.apply_company || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">地址</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.address || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">申请人单位(属性)</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.apply_nature || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">联系人</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.contacts || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">联系电话</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.phone || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">邮箱</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.email || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">传真</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.fax || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">评价目的</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.objective || '暂无' }}</el-col>
+        </el-col>
+        <el-col :span="12" class="two_12">
+          <el-col :span="5" class="left">成果所处阶段</el-col>
+          <el-col :span="19" class="right textOver">{{ data.basic.stage || '暂无' }}</el-col>
+        </el-col>
+      </el-col>
+      <el-col :span="24" class="two_2">
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>成果简介</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.achieve_brief || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>应用领域和技术原理</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.field || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>性能指标</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.kpi_index || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>与国内外同类技术比较</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.compare || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>成果的创造性,先进性</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.advanced || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>作用意义</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.sense || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>推广应用的范围,条件和前景</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.prospect || '暂无' }}
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="downInfo">
+          <el-col :span="5" class="tit">
+            <h2>存在的问题和改进意见</h2>
+          </el-col>
+          <el-col :span="19" class="info">
+            {{ data.brief.opinion || '暂无' }}
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-0',
+  props: {
+    data: { type: Object, default: () => {} },
+  },
+  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>
+.two {
+  .two_1 {
+    margin: 10px 0 0 0;
+    .two_12 {
+      .left {
+        height: 40px;
+        line-height: 40px;
+        border: 1px solid #ccc;
+        font-size: 12px;
+        text-align: center;
+        color: #666;
+      }
+      .right {
+        height: 40px;
+        line-height: 40px;
+        border: 1px solid #ccc;
+        font-size: 14px;
+        padding: 0 5px;
+        color: #000;
+        font-weight: bold;
+      }
+    }
+  }
+  .two_2 {
+    margin: 10px 0 0 0;
+    .downInfo {
+      border: 1px solid #ccc;
+      .tit {
+        height: 150px;
+        text-align: center;
+        border-right: 1px solid #ccc;
+      }
+      .info {
+        font-size: 16px;
+        padding: 10px;
+        height: 150px;
+        overflow-y: auto;
+        line-height: 25px;
+      }
+    }
+  }
+}
+</style>

+ 46 - 0
src/views/twoweb/service/detail-model/model-1.vue

@@ -0,0 +1,46 @@
+<template>
+  <div id="model-1">
+    <el-row type="flex" justify="end">
+      <el-col :span="2">
+        <slot></slot>
+      </el-col>
+    </el-row>
+    <el-col :span="24" class="two" style="margin:10px 0 0 0;">
+      <techolInfo :form="data" :showBtn="false"></techolInfo>
+    </el-col>
+  </div>
+</template>
+
+<script>
+import techolInfo from '@c/detail-model/techolInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-1',
+  props: {
+    data: { type: Object, default: () => {} },
+  },
+  components: {
+    techolInfo,
+  },
+  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></style>

+ 43 - 0
src/views/twoweb/service/detail-model/model-2.vue

@@ -0,0 +1,43 @@
+<template>
+  <div id="model-1">
+    <el-row type="flex" justify="end">
+      <el-col :span="2">
+        <slot></slot>
+      </el-col>
+    </el-row>
+    <el-col :span="24" class="two" style="margin:10px 0 0 0;">
+      {{ data }}
+    </el-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'model-2',
+  props: {
+    data: { type: Object, default: () => {} },
+  },
+  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></style>

+ 95 - 31
src/views/twoweb/service/index.vue

@@ -13,28 +13,23 @@
           </el-col>
           <el-col :span="24" class="two">
             <el-col :span="24" class="two_1">
-              <top topText="项目征集" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
-            </el-col>
-            <el-col :span="24" class="two_1">
-              <top topText="问卷调查" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
-            </el-col>
-            <el-col :span="24" class="two_1">
-              <top topText="成果评价" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
-            </el-col>
-            <el-col :span="24" class="two_1">
-              <top topText="信息发布" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
+              <el-col :span="12" class="left">
+                <top topText="成果评价" @more="more(0)"></top>
+                <achieve-frame :list="achieveList" @detail="achDetail"></achieve-frame>
+              </el-col>
+              <el-col :span="12" class="right">
+                <top topText="科技需求" @more="more(1)"></top>
+                <techol-frame :list="techolList" @detail="tecDetail"></techol-frame>
+              </el-col>
             </el-col>
-            <el-col :span="24" class="two_1">
-              <top topText="高企申报" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
+            <el-col :span="24" class="two_2" style="display:none">
+              <el-image :src="imgUrl"></el-image>
             </el-col>
-            <el-col :span="24" class="two_1">
-              <top topText="预约服务" :userMore="false"></top>
-              <list type="1" :list="twoList" @detail="detail"></list>
+            <el-col :span="24" class="two_1 two_3" style="display:none">
+              <el-col :span="24" class="left">
+                <top topText="项目申报" @more="more(2)"></top>
+                <project-frame :list="declareList" @detail="proDetail"></project-frame>
+              </el-col>
             </el-col>
           </el-col>
         </div>
@@ -62,16 +57,23 @@
 <script>
 import info from './parts/info.vue';
 import top from './parts/top.vue';
-import list from './parts/list.vue';
+import achieveFrame from './index/achieve.vue';
+import techolFrame from './index/techol.vue';
+import projectFrame from './index/project.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: organization } = createNamespacedHelpers('organization');
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: product } = createNamespacedHelpers('product');
+const { mapActions: declare } = createNamespacedHelpers('declare');
 export default {
   name: 'index',
   props: {},
   components: {
     info,
     top,
-    list,
+    achieveFrame,
+    techolFrame,
+    projectFrame,
   },
   data: function() {
     return {
@@ -88,12 +90,38 @@ export default {
       form2: {},
       rulesForm2: {},
       // 公共信息
-      twoList: [],
+      imgUrl: require('@common/src/assets/center/cxfw.png'),
+      // 成果评价
+      achieveList: [],
+      // 科技需求
+      techolList: [],
+      // 项目申报
+      declareList: [],
     };
   },
-  created() {},
+  created() {
+    this.search();
+  },
   methods: {
     ...organization(['orgLogin', 'fetch']),
+    ...achieveApply(['query']),
+    ...product({ productQuery: 'query' }),
+    ...declare({ declareQuery: 'query' }),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit: 5, status: '7', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `achieveList`, res.data);
+      }
+      res = await this.productQuery({ skip, limit: 6, type: '0', status: '2', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `techolList`, res.data);
+      }
+      res = await this.declareQuery({ skip, limit: 6, is_cashing: '1', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `declareList`, res.data);
+      }
+    },
     // 打开弹框
     btn(data) {
       if (data.type == '1') {
@@ -128,8 +156,22 @@ export default {
         }
       });
     },
-    // 查看详情
-    detail() {},
+    // 更多
+    more(index) {
+      this.$router.push({ path: '/twoweb/service/list', query: { index: index } });
+    },
+    // 成果评价详情
+    achDetail(data) {
+      this.$router.push({ path: '/twoweb/service/list', query: { index: 0, id: data.id } });
+    },
+    // 科技需求详情
+    tecDetail(data) {
+      this.$router.push({ path: '/twoweb/service/list', query: { index: 1, id: data.id } });
+    },
+    // 项目申报
+    proDetail(data) {
+      this.$router.push({ path: '/twoweb/service/list', query: { index: 2, id: data._id } });
+    },
   },
   computed: {
     ...mapState(['user']),
@@ -185,12 +227,34 @@ export default {
   }
   .two {
     .two_1 {
-      min-height: 90px;
+      margin: 0 0 10px 0;
+      .left {
+        width: 49%;
+        min-height: 530px;
+        background: #ffffff;
+        padding: 15px;
+        border-radius: 20px;
+        margin: 0 24px 0 0;
+        box-shadow: 0 0 5px #409eff;
+      }
+      .right {
+        width: 49%;
+        min-height: 530px;
+        background: #ffffff;
+        border-radius: 20px;
+        padding: 15px;
+        box-shadow: 0 0 5px #409eff;
+      }
+    }
+    .two_2 {
+      height: 140px;
       overflow: hidden;
-      box-shadow: 0 0 4px #409eff;
-      border-radius: 10px;
-      margin: 0 10px 10px 0;
-      padding: 10px;
+      margin: 0 0 10px 0;
+    }
+    .two_3 {
+      .left {
+        width: 100%;
+      }
     }
   }
 }

+ 106 - 0
src/views/twoweb/service/index/achieve.vue

@@ -0,0 +1,106 @@
+<template>
+  <div id="achieve">
+    <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)">
+          <el-col :span="24" class="top">
+            <el-col :span="20" class="name textOver">
+              {{ item.basic.achieve_name || '暂无' }}
+            </el-col>
+            <el-col :span="4" class="date">
+              {{ getTime(item.basic.achieve_date) || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="24" class="otherInfo"> 成果简介:{{ item.brief.achieve_brief }} </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const moment = require('moment');
+export default {
+  name: 'achieve',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 整理时间
+    getTime(data) {
+      return moment(_.get(data)).format('YYYY-MM-DD');
+    },
+    // 详情
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 10px 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 5px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      height: 40px;
+      overflow: hidden;
+      .otherInfo {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-line-clamp: 2;
+        word-break: break-all;
+        display: -webkit-box;
+        -webkit-box-orient: vertical;
+        font-size: 14px;
+        color: #666;
+      }
+    }
+  }
+  .list:nth-child(5) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 100 - 0
src/views/twoweb/service/index/project.vue

@@ -0,0 +1,100 @@
+<template>
+  <div id="project">
+    <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)">
+          <el-col :span="24" class="top">
+            <el-col :span="22" class="name">
+              {{ item.company }}
+            </el-col>
+            <el-col :span="2" class="date">
+              {{ item.is_cashing == '0' ? '未兑付' : '已兑付' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="otherInfo textOver">
+              申请人:<span>{{ item.apply_person || '暂无' }}</span>
+            </el-col>
+            <el-col :span="12" class="otherInfo textOver">
+              中介机构:<span>{{ item.medium.name || '暂无' }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'project',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 10px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:nth-child(6) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 106 - 0
src/views/twoweb/service/index/techol.vue

@@ -0,0 +1,106 @@
+<template>
+  <div id="techol">
+    <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)">
+          <el-col :span="24" class="top">
+            <el-col :span="20" class="name textOver">
+              {{ item.name || '暂无' }}
+            </el-col>
+            <el-col :span="4" class="date">
+              {{ getTime(item.create_time) || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="otherInfo textOver">
+              需求单位:<span>{{ item.company || '暂无' }}</span>
+            </el-col>
+            <el-col :span="12" class="otherInfo textOver">
+              需求程度:<span>{{ item.degreeurgency || '暂无' }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const moment = require('moment');
+export default {
+  name: 'techol',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 整理时间
+    getTime(data) {
+      return moment(_.get(data)).format('YYYY-MM-DD');
+    },
+    // 详情
+    detail(data) {
+      this.$emit('detail', data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 12px 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 10px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:nth-child(6) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 105 - 0
src/views/twoweb/service/list-model/model-0.vue

@@ -0,0 +1,105 @@
+<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="clickDetail(item.id)">
+          <el-col :span="24" class="top">
+            <el-col :span="20" class="name textOver">
+              {{ item.p1 || '暂无' }}
+            </el-col>
+            <el-col :span="4" class="date">
+              {{ getTime(item.p2) || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="24" class="otherInfo"> 成果简介:{{ item.p3 }} </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const moment = require('moment');
+export default {
+  name: 'model-0',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 整理时间
+    getTime(data) {
+      return moment(_.get(data)).format('YYYY-MM-DD');
+    },
+    clickDetail(id) {
+      // TODO:打开指定详情
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    index() {
+      return parseInt(this.$route.query.index) || 0;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .list {
+    padding: 10px 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 5px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      height: 40px;
+      overflow: hidden;
+      .otherInfo {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-line-clamp: 2;
+        word-break: break-all;
+        display: -webkit-box;
+        -webkit-box-orient: vertical;
+        font-size: 14px;
+        color: #666;
+      }
+    }
+  }
+  .list:nth-child(5) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 112 - 0
src/views/twoweb/service/list-model/model-1.vue

@@ -0,0 +1,112 @@
+<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="clickDetail(item.id)">
+          <el-col :span="24" class="top">
+            <el-col :span="20" class="name textOver">
+              {{ item.p1 || '暂无' }}
+            </el-col>
+            <el-col :span="4" class="date">
+              {{ getTime(item.p2) || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="otherInfo textOver">
+              需求单位:<span>{{ item.p3 || '暂无' }}</span>
+            </el-col>
+            <el-col :span="12" class="otherInfo textOver">
+              需求程度:<span>{{ item.p4 || '暂无' }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const moment = require('moment');
+export default {
+  name: 'model-1',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 整理时间
+    getTime(data) {
+      return moment(_.get(data)).format('YYYY-MM-DD');
+    },
+    clickDetail(id) {
+      // TODO:打开指定详情
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    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 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 10px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:nth-child(6) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 112 - 0
src/views/twoweb/service/list-model/model-2.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="model-2">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="clickDetail(item.id)">
+          <el-col :span="24" class="top">
+            <el-col :span="22" class="name">
+              {{ item.p1 }}
+            </el-col>
+            <el-col :span="2" class="date">
+              {{ item.p2 == '0' ? '未兑付' : '已兑付' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="other">
+            <el-col :span="12" class="otherInfo textOver">
+              申请人:<span>{{ item.p3 || '暂无' }}</span>
+            </el-col>
+            <el-col :span="12" class="otherInfo textOver">
+              中介机构:<span>{{ item.p4 || '暂无' }}</span>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const moment = require('moment');
+export default {
+  name: 'model-2',
+  props: {
+    list: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 整理时间
+    getTime(data) {
+      return moment(_.get(data)).format('YYYY-MM-DD');
+    },
+    clickDetail(id) {
+      // TODO:打开指定详情
+      this.$router.push({ path: './list', query: { index: this.index, id } });
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    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 0;
+    border-bottom: 1px dashed #ccc;
+    .top {
+      margin: 0 0 10px 0;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .date {
+        font-size: 14px;
+        color: #666;
+        text-align: right;
+      }
+    }
+    .other {
+      .otherInfo {
+        font-size: 14px;
+        color: #666;
+        span {
+          color: #000;
+        }
+      }
+    }
+  }
+  .list:nth-child(6) {
+    border-bottom: none;
+  }
+  .list:hover {
+    cursor: pointer;
+    .top {
+      .name {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 120 - 0
src/views/twoweb/service/list.vue

@@ -0,0 +1,120 @@
+<template>
+  <div id="list">
+    <el-row>
+      <el-col :span="24" class="main">
+        <div class="w_1200">
+          <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>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list',
+  props: {},
+  components: {
+    achieve: () => import('./list/achieve.vue'),
+    techol: () => import('./list/techol.vue'),
+    // project: () => import('./list/project.vue'),
+  },
+  data: function() {
+    return {
+      component: '',
+      menuList: [
+        { name: '成果评价', component: 'achieve', options: { useTab: false, useSearch: false, listModel: 0 } },
+        { name: '科技需求', component: 'techol', options: { useTab: false, listModel: 1 } },
+        // { name: '项目申报', component: 'project', options: { useTab: false, listModel: 2 } },
+      ],
+      squareImage: require('@p/live/square_big.png'),
+      column_name: '',
+      params: {},
+      menuColor: 'rgb(254, 149, 14)',
+    };
+  },
+  created() {},
+  methods: {
+    changeMenu(component, index) {
+      if (index !== this.menuIndex) this.$router.push({ path: './list', query: { index } });
+      this.component = component;
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    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', 'achieve'));
+      this.$set(this, 'params', params);
+      return index;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 500px;
+  padding: 10px 0;
+  .menu {
+    height: 600px;
+    overflow: hidden;
+    padding: 15px 10px;
+    background: no-repeat 100% 100%;
+    background-image: url('~@p/live/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 #2d64b3;
+      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 #2d64b3;
+    padding: 10px;
+  }
+}
+</style>

+ 95 - 0
src/views/twoweb/service/list/achieve.vue

@@ -0,0 +1,95 @@
+<template>
+  <div id="patent">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :displayBtn="true" :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>
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+export default {
+  name: 'patent',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model0: () => import('../list-model/model-0.vue'),
+    dmodel: () => import('../detail-model/model-0.vue'),
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...achieveApply(['query', 'fetch']),
+    // 查询相关
+    async search({ skip = 0, limit = 5, ...info } = {}) {
+      // TODO: 查询
+      let res = await this.query({ skip, limit, status: '7', ...info });
+      if (this.$checkRes(res)) {
+        console.log(res);
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+        // 最后结果处理方式,将显示的信息转换成固定的字段去显示
+        this.$set(this, 'list', this.translate(this.list));
+      }
+    },
+    translate(data) {
+      const list = data.map(i => {
+        const obj = { id: i.id || i._id };
+        obj.p1 = _.get(i, 'basic.achieve_name');
+        obj.p2 = _.get(i, 'basic.achieve_date');
+        obj.p3 = _.get(i, 'brief.achieve_brief');
+        return obj;
+      });
+      return list;
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    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>

+ 95 - 0
src/views/twoweb/service/list/project.vue

@@ -0,0 +1,95 @@
+<template>
+  <div id="project">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :displayBtn="true" :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>
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: declare } = createNamespacedHelpers('declare');
+export default {
+  name: 'project',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model2: () => import('../list-model/model-2.vue'),
+    dmodel: () => import('../detail-model/model-2.vue'),
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...declare(['query', 'fetch']),
+    // 查询相关
+    async search({ skip = 0, limit = 5, ...info } = {}) {
+      // TODO: 查询
+      let res = await this.query({ skip, limit: 6, is_cashing: '1', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+        // 最后结果处理方式,将显示的信息转换成固定的字段去显示
+        this.$set(this, 'list', this.translate(this.list));
+      }
+    },
+    translate(data) {
+      const list = data.map(i => {
+        const obj = { id: i.id || i._id };
+        obj.p1 = _.get(i, 'company');
+        obj.p2 = _.get(i, 'is_cashing');
+        obj.p3 = _.get(i, 'apply_person');
+        obj.p4 = _.get(i, 'medium.name');
+        return obj;
+      });
+      return list;
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    model() {
+      const moduleNumber = this.listModel || 2;
+      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>

+ 95 - 0
src/views/twoweb/service/list/techol.vue

@@ -0,0 +1,95 @@
+<template>
+  <div id="patent">
+    <list-page v-bind="$attrs" :total="total" v-if="!id" @toSearch="search">
+      <component :is="model" :list="list"></component>
+    </list-page>
+    <template v-else>
+      <dmodel :displayBtn="true" :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>
+import listPage from '@c/list/list-page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  name: 'patent',
+  props: ['listModel'],
+  components: {
+    listPage,
+    model1: () => import('../list-model/model-1.vue'),
+    dmodel: () => import('../detail-model/model-1.vue'),
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      detail: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...product(['query', 'fetch']),
+    // 查询相关
+    async search({ skip = 0, limit = 5, ...info } = {}) {
+      // TODO: 查询
+      let res = await this.query({ skip, limit: 6, type: '0', status: '2', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+        // 最后结果处理方式,将显示的信息转换成固定的字段去显示
+        this.$set(this, 'list', this.translate(this.list));
+      }
+    },
+    translate(data) {
+      const list = data.map(i => {
+        const obj = { id: i.id || i._id };
+        obj.p1 = _.get(i, 'name');
+        obj.p2 = _.get(i, 'create_time');
+        obj.p3 = _.get(i, 'company');
+        obj.p4 = _.get(i, 'degreeurgency');
+        return obj;
+      });
+      return list;
+    },
+    // 查询详情
+    async searchInfo() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `detail`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    model() {
+      const moduleNumber = this.listModel || 1;
+      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>