lrf402788946 vor 4 Jahren
Ursprung
Commit
ae52058cb0

+ 291 - 291
src/components/common/Sidebar.vue

@@ -1,291 +1,291 @@
-<template>
-  <div class="sidebar">
-    <el-menu
-      class="sidebar-el-menu"
-      :default-active="onRoutes"
-      :collapse="collapse"
-      background-color="#324157"
-      text-color="#bfcbd9"
-      active-text-color="#20a0ff"
-      unique-opened
-      router
-    >
-      <template v-for="item in items">
-        <template v-if="item.subs">
-          <el-submenu class="second" :index="item.index" :key="item.index">
-            <template slot="title">
-              <i :class="item.icon"></i>
-              <span slot="title">
-                <span>{{ item.title }}</span>
-                <span class="num" v-bind:style="{ color: getColor(item.num) }" v-if="item.num"
-                  >[<span>{{ getNum(item.num) }}</span
-                  >]</span
-                >
-              </span>
-            </template>
-            <template v-for="subItem in item.subs">
-              <el-submenu v-if="subItem.subs" :index="subItem.index" :key="subItem.index">
-                <template slot="title">{{ subItem.title }}</template>
-                <el-menu-item v-for="(threeItem, i) in subItem.subs" :key="i" :index="threeItem.index">{{ threeItem.title }}</el-menu-item>
-              </el-submenu>
-              <el-menu-item v-else :index="subItem.index" :key="subItem.index">{{ subItem.title }}</el-menu-item>
-            </template>
-          </el-submenu>
-        </template>
-        <template v-else>
-          <el-menu-item class="first" :index="item.index" :key="item.index">
-            <i :class="item.icon"></i>
-            <span slot="title">
-              <span>{{ item.title }}</span>
-              <span class="num" v-bind:style="{ color: getColor(item.num) }" v-if="item.num"
-                >[<span>{{ getNum(item.num) }}</span
-                >]</span
-              >
-            </span>
-          </el-menu-item>
-        </template>
-      </template>
-    </el-menu>
-  </div>
-</template>
-
-<script>
-import _ from 'lodash';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: menu } = createNamespacedHelpers('menu');
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-
-import bus from '../common/bus';
-export default {
-  data() {
-    return {
-      collapse: false,
-      items: [
-        {
-          icon: 'el-icon-s-home',
-          index: 'homeIndex',
-          title: '系统首页',
-        },
-      ],
-      num: {},
-    };
-  },
-  computed: {
-    ...mapState(['user']),
-    onRoutes() {
-      return this.$route.path;
-    },
-  },
-  created() {
-    // 通过 Event Bus 进行组件间通信,来折叠侧边栏
-    bus.$on('collapse', msg => {
-      this.collapse = msg;
-      bus.$emit('collapse-content', msg);
-    });
-  },
-  methods: {
-    ...menu(['query']),
-    ...achieveApply(['queryNum']),
-    // 分配用户彩带权限
-    async getMenu() {
-      // 客户信息
-      let user = this.user;
-      let list = _.cloneDeep(this.items);
-      if (user.role == '1') {
-        let data = [
-          {
-            icon: 'el-icon-s-home',
-            index: '',
-            title: '管理员测试菜单',
-          },
-        ];
-        list.push(...data);
-        this.$set(this, `items`, _.uniqBy(list, 'index'));
-      } else if (user.role == '2') {
-        let data = [
-          { icon: 'el-icon-eleme', index: '/adminApplyExpert', title: '专家管理' },
-          { icon: 'el-icon-eleme', index: '/adminExamine', title: '初审申请书' },
-          { icon: 'el-icon-thumb', index: '/adminScore', title: '专家评' },
-          { icon: 'el-icon-orange', index: '/adminMeet', title: '专家会审' },
-          { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
-          { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
-          { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
-        ];
-        list.push(...data);
-        this.$set(this, `items`, _.uniqBy(list, 'index'));
-      } else if (user.role === '3') {
-        let data = [
-          // { icon: 'el-icon-thumb', index: '/expertScore', title: '专家评分' },
-          // { icon: 'el-icon-thumb', index: '/expertMeet', title: '专家会审' },
-          { icon: 'el-icon-thumb', index: '/expertCenter', title: '专家审核' },
-        ];
-        list.push(...data);
-        this.$set(this, `items`, _.uniqBy(list, 'index'));
-      } else {
-        // let data = [
-        //   {
-        //     icon: 'el-icon-eleme',
-        //     index: '2',
-        //     title: '申请书管理',
-        //     subs: [
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/firstApply',
-        //         title: '待审中',
-        //       },
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/updateApply',
-        //         title: '审核未通过',
-        //       },
-        //     ],
-        //   },
-        //   {
-        //     icon: 'el-icon-eleme',
-        //     index: '3',
-        //     title: '专家评分',
-        //     subs: [
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/expertExam',
-        //         title: '待评分',
-        //       },
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/noExpertScore',
-        //         title: '评分审核未通过',
-        //       },
-        //     ],
-        //   },
-        //   {
-        //     icon: 'el-icon-eleme',
-        //     index: '4',
-        //     title: '专家会审管理',
-        //     subs: [
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/expertPay',
-        //         title: '待缴费',
-        //       },
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/expertMeet',
-        //         title: '待会审',
-        //       },
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/noExpertMeet',
-        //         title: '会审未通过',
-        //       },
-        //     ],
-        //   },
-        //   { icon: 'el-icon-eleme', index: '/perfectData', title: '完善资料' },
-        //   {
-        //     icon: 'el-icon-eleme',
-        //     index: '6',
-        //     title: '证书管理',
-        //     subs: [
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/readyCert',
-        //         title: '待发证书',
-        //       },
-        //       {
-        //         icon: 'el-icon-eleme',
-        //         index: '/alreadyCert',
-        //         title: '已发证书',
-        //       },
-        //     ],
-        //   },
-        // ];
-        let data = [
-          {
-            num: 'cs',
-            icon: 'el-icon-eleme',
-            index: '2',
-            title: '我的申报',
-            subs: [
-              {
-                icon: 'el-icon-eleme',
-                index: '/nowDeclare',
-                title: '申报中',
-              },
-              {
-                icon: 'el-icon-eleme',
-                index: '/pastDeclare',
-                title: '已往申报',
-              },
-            ],
-          },
-          { num: 'pf', icon: 'el-icon-postcard', index: '/userExpertScore', title: '专家评分' },
-          { num: 'hs', icon: 'el-icon-postcard', index: '/userExpertMeet', title: '专家会审' },
-          { num: 'zs', icon: 'el-icon-medal', index: '/userCert', title: '证书管理' },
-        ];
-        list.push(...data);
-        this.$set(this, `items`, _.uniqBy(list, 'index'));
-      }
-    },
-    // 查询成果数
-    async searchNum() {
-      let role = this.user.role;
-      if (role == undefined) {
-        let res = await this.queryNum(this.user.id);
-        if (this.$checkRes(res)) {
-          this.$set(this, `num`, res.data);
-        }
-      }
-    },
-    // 分菜单成果数
-    getNum(data) {
-      if (data == 'cs') return this.num.cs;
-      else if (data == 'pf') return this.num.pf;
-      else if (data == 'hs') return this.num.hs;
-      else if (data == 'zs') return this.num.zs;
-    },
-    // 显示颜色
-    getColor(data) {
-      if (data == 'cs' && this.num.cs > 0) return '#ff0000';
-      else if (data == 'pf' && this.num.pf > 0) return '#ff0000';
-      else if (data == 'hs' && this.num.hs > 0) return '#ff0000';
-      else if (data == 'zs' && this.num.zs > 0) return '#ff0000';
-    },
-  },
-  watch: {
-    user: {
-      deep: true,
-      immediate: true,
-      handler(val) {
-        this.getMenu();
-        this.searchNum();
-      },
-    },
-  },
-};
-</script>
-
-<style lang="less" scoped>
-.sidebar {
-  display: block;
-  position: absolute;
-  left: 0;
-  top: 60px;
-  bottom: 0;
-  overflow-y: scroll;
-}
-.sidebar::-webkit-scrollbar {
-  width: 0;
-}
-.sidebar-el-menu:not(.el-menu--collapse) {
-  width: 200px;
-}
-.sidebar > ul {
-  height: 100%;
-}
-.num {
-  font-size: 16px;
-  padding: 0 10px;
-  span {
-    padding: 0 5px;
-  }
-}
-</style>
+<template>
+  <div class="sidebar">
+    <el-menu
+      class="sidebar-el-menu"
+      :default-active="onRoutes"
+      :collapse="collapse"
+      background-color="#324157"
+      text-color="#bfcbd9"
+      active-text-color="#20a0ff"
+      unique-opened
+      router
+    >
+      <template v-for="item in items">
+        <template v-if="item.subs">
+          <el-submenu class="second" :index="item.index" :key="item.index">
+            <template slot="title">
+              <i :class="item.icon"></i>
+              <span slot="title">
+                <span>{{ item.title }}</span>
+                <span class="num" v-bind:style="{ color: getColor(item.num) }" v-if="item.num"
+                  >[<span>{{ getNum(item.num) }}</span
+                  >]</span
+                >
+              </span>
+            </template>
+            <template v-for="subItem in item.subs">
+              <el-submenu v-if="subItem.subs" :index="subItem.index" :key="subItem.index">
+                <template slot="title">{{ subItem.title }}</template>
+                <el-menu-item v-for="(threeItem, i) in subItem.subs" :key="i" :index="threeItem.index">{{ threeItem.title }}</el-menu-item>
+              </el-submenu>
+              <el-menu-item v-else :index="subItem.index" :key="subItem.index">{{ subItem.title }}</el-menu-item>
+            </template>
+          </el-submenu>
+        </template>
+        <template v-else>
+          <el-menu-item class="first" :index="item.index" :key="item.index">
+            <i :class="item.icon"></i>
+            <span slot="title">
+              <span>{{ item.title }}</span>
+              <span class="num" v-bind:style="{ color: getColor(item.num) }" v-if="item.num"
+                >[<span>{{ getNum(item.num) }}</span
+                >]</span
+              >
+            </span>
+          </el-menu-item>
+        </template>
+      </template>
+    </el-menu>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: menu } = createNamespacedHelpers('menu');
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+
+import bus from '../common/bus';
+export default {
+  data() {
+    return {
+      collapse: false,
+      items: [
+        {
+          icon: 'el-icon-s-home',
+          index: 'homeIndex',
+          title: '系统首页',
+        },
+      ],
+      num: {},
+    };
+  },
+  computed: {
+    ...mapState(['user']),
+    onRoutes() {
+      return this.$route.path;
+    },
+  },
+  created() {
+    // 通过 Event Bus 进行组件间通信,来折叠侧边栏
+    bus.$on('collapse', msg => {
+      this.collapse = msg;
+      bus.$emit('collapse-content', msg);
+    });
+  },
+  methods: {
+    ...menu(['query']),
+    ...achieveApply(['queryNum']),
+    // 分配用户彩带权限
+    async getMenu() {
+      // 客户信息
+      let user = this.user;
+      let list = _.cloneDeep(this.items);
+      if (user.role == '1') {
+        let data = [
+          {
+            icon: 'el-icon-s-home',
+            index: '',
+            title: '管理员测试菜单',
+          },
+        ];
+        list.push(...data);
+        this.$set(this, `items`, _.uniqBy(list, 'index'));
+      } else if (user.role == '2') {
+        let data = [
+          { icon: 'el-icon-eleme', index: '/adminApplyExpert', title: '专家管理' },
+          { icon: 'el-icon-eleme', index: '/adminExamine', title: '形式审查' },
+          { icon: 'el-icon-thumb', index: '/adminScore', title: '专家评' },
+          { icon: 'el-icon-orange', index: '/adminMeet', title: '专家会审' },
+          { icon: 'el-icon-edit-outline', index: '/adminPerfect', title: '资料完善' },
+          { icon: 'el-icon-postcard', index: '/adminCate', title: '证书发放' },
+          { icon: 'el-icon-postcard', index: '/adminHaveCert', title: '已证书发放' },
+        ];
+        list.push(...data);
+        this.$set(this, `items`, _.uniqBy(list, 'index'));
+      } else if (user.role === '3') {
+        let data = [
+          // { icon: 'el-icon-thumb', index: '/expertScore', title: '专家评分' },
+          // { icon: 'el-icon-thumb', index: '/expertMeet', title: '专家会审' },
+          { icon: 'el-icon-thumb', index: '/expertCenter', title: '专家审核' },
+        ];
+        list.push(...data);
+        this.$set(this, `items`, _.uniqBy(list, 'index'));
+      } else {
+        // let data = [
+        //   {
+        //     icon: 'el-icon-eleme',
+        //     index: '2',
+        //     title: '申请书管理',
+        //     subs: [
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/firstApply',
+        //         title: '待审中',
+        //       },
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/updateApply',
+        //         title: '审核未通过',
+        //       },
+        //     ],
+        //   },
+        //   {
+        //     icon: 'el-icon-eleme',
+        //     index: '3',
+        //     title: '专家评分',
+        //     subs: [
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/expertExam',
+        //         title: '待评分',
+        //       },
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/noExpertScore',
+        //         title: '评分审核未通过',
+        //       },
+        //     ],
+        //   },
+        //   {
+        //     icon: 'el-icon-eleme',
+        //     index: '4',
+        //     title: '专家会审管理',
+        //     subs: [
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/expertPay',
+        //         title: '待缴费',
+        //       },
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/expertMeet',
+        //         title: '待会审',
+        //       },
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/noExpertMeet',
+        //         title: '会审未通过',
+        //       },
+        //     ],
+        //   },
+        //   { icon: 'el-icon-eleme', index: '/perfectData', title: '完善资料' },
+        //   {
+        //     icon: 'el-icon-eleme',
+        //     index: '6',
+        //     title: '证书管理',
+        //     subs: [
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/readyCert',
+        //         title: '待发证书',
+        //       },
+        //       {
+        //         icon: 'el-icon-eleme',
+        //         index: '/alreadyCert',
+        //         title: '已发证书',
+        //       },
+        //     ],
+        //   },
+        // ];
+        let data = [
+          {
+            num: 'cs',
+            icon: 'el-icon-eleme',
+            index: '2',
+            title: '我的申报',
+            subs: [
+              {
+                icon: 'el-icon-eleme',
+                index: '/nowDeclare',
+                title: '申报中',
+              },
+              {
+                icon: 'el-icon-eleme',
+                index: '/pastDeclare',
+                title: '已往申报',
+              },
+            ],
+          },
+          { num: 'pf', icon: 'el-icon-postcard', index: '/userExpertScore', title: '专家评分' },
+          { num: 'hs', icon: 'el-icon-postcard', index: '/userExpertMeet', title: '专家会审' },
+          { num: 'zs', icon: 'el-icon-medal', index: '/userCert', title: '证书管理' },
+        ];
+        list.push(...data);
+        this.$set(this, `items`, _.uniqBy(list, 'index'));
+      }
+    },
+    // 查询成果数
+    async searchNum() {
+      let role = this.user.role;
+      if (role == undefined) {
+        let res = await this.queryNum(this.user.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `num`, res.data);
+        }
+      }
+    },
+    // 分菜单成果数
+    getNum(data) {
+      if (data == 'cs') return this.num.cs;
+      else if (data == 'pf') return this.num.pf;
+      else if (data == 'hs') return this.num.hs;
+      else if (data == 'zs') return this.num.zs;
+    },
+    // 显示颜色
+    getColor(data) {
+      if (data == 'cs' && this.num.cs > 0) return '#ff0000';
+      else if (data == 'pf' && this.num.pf > 0) return '#ff0000';
+      else if (data == 'hs' && this.num.hs > 0) return '#ff0000';
+      else if (data == 'zs' && this.num.zs > 0) return '#ff0000';
+    },
+  },
+  watch: {
+    user: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.getMenu();
+        this.searchNum();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.sidebar {
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 60px;
+  bottom: 0;
+  overflow-y: scroll;
+}
+.sidebar::-webkit-scrollbar {
+  width: 0;
+}
+.sidebar-el-menu:not(.el-menu--collapse) {
+  width: 200px;
+}
+.sidebar > ul {
+  height: 100%;
+}
+.num {
+  font-size: 16px;
+  padding: 0 10px;
+  span {
+    padding: 0 5px;
+  }
+}
+</style>

+ 225 - 225
src/views/Login.vue

@@ -1,225 +1,225 @@
-<template>
-  <div id="Login">
-    <el-row>
-      <el-col :span="24" class="main" :style="{ height: clientHeight + 'px' }">
-        <div class="w_1200">
-          <el-row :gutter="20">
-            <el-col :span="10" :offset="6" class="info">
-              <el-col :span="24" class="text">
-                成果评价系统
-              </el-col>
-              <el-col :span="24" class="tabs">
-                <el-tabs v-model="active" type="card" @tab-click="changeActive">
-                  <el-tab-pane label="个人用户" name="first">
-                    <el-col :span="24" class="two">
-                      <el-form :model="webForm" :rules="rules" ref="webForm" label-width="100px">
-                        <el-form-item label="账号" prop="phone">
-                          <el-input v-model="webForm.phone" placeholder="请输入账号"></el-input>
-                        </el-form-item>
-                        <el-form-item label="密码" prop="password">
-                          <el-input v-model="webForm.password" placeholder="请输入密码" show-password></el-input>
-                        </el-form-item>
-                        <el-col :span="24" class="btn">
-                          <el-button type="primary" @click="webLogin('webForm')">确认登录</el-button>
-                        </el-col>
-                      </el-form>
-                    </el-col>
-                  </el-tab-pane>
-                  <el-tab-pane label="管理用户" name="second">
-                    <el-col :span="24" class="two">
-                      <el-form :model="form" :rules="rules" ref="form" label-width="100px">
-                        <el-form-item label="手机号" prop="code_phone">
-                          <el-input v-model="form.code_phone" placeholder="请输入手机号"></el-input>
-                        </el-form-item>
-                        <el-form-item label="密码" prop="passwd">
-                          <el-input v-model="form.passwd" placeholder="请输入密码" show-password></el-input>
-                        </el-form-item>
-                        <el-col :span="24" class="btn">
-                          <el-button type="primary" @click="adminLogin('form')">确认登录</el-button>
-                        </el-col>
-                      </el-form>
-                    </el-col>
-                  </el-tab-pane>
-                  <el-tab-pane label="专家用户" name="third">
-                    <el-col :span="24" class="two">
-                      <el-form :model="expert" ref="expert" label-width="100px">
-                        <el-form-item label="手机号" prop="phone">
-                          <el-input v-model="expert.phone" placeholder="请输入手机号"></el-input>
-                        </el-form-item>
-                        <el-form-item label="密码" prop="passwd">
-                          <el-input v-model="expert.password" placeholder="请输入密码" show-password></el-input>
-                        </el-form-item>
-                        <el-col :span="24" class="btn">
-                          <el-button type="primary" @click="toExpertLogin('form')">确认登录</el-button>
-                        </el-col>
-                      </el-form>
-                    </el-col>
-                  </el-tab-pane>
-                </el-tabs>
-              </el-col>
-            </el-col>
-          </el-row>
-        </div>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash');
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: adminLogin } = createNamespacedHelpers('adminLogin');
-const { mapActions: personal } = createNamespacedHelpers('personal');
-const { mapActions: organization } = createNamespacedHelpers('organization');
-const { mapActions: achieveExpert } = createNamespacedHelpers('achieveExpert');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'Login',
-  props: {},
-  components: {},
-  data: function() {
-    return {
-      // 页面高度
-      clientHeight: '',
-      active: 'first',
-      // 个人登录
-      webForm: {},
-      // 管理登录
-      form: {},
-      rules: {
-        code_phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
-        passwd: [{ required: true, message: '请输入密码', trigger: 'blur' }],
-        phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
-        password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
-        type: [{ required: true, message: '请选择用户类别', trigger: 'change' }],
-      },
-      // 专家登陆
-      expert: {},
-    };
-  },
-  async created() {
-    await this.changeActive();
-    await this.enterListen();
-  },
-  methods: {
-    ...personal(['perLogin']),
-    ...organization(['orgLogin']),
-    ...adminLogin(['login']),
-    ...achieveExpert({ expertLogin: 'login' }),
-    // 个人登录
-    async webLogin() {
-      let data = this.webForm;
-      console.log(data);
-      data.type = '4';
-      if (data.type == '4') {
-        let res = await this.perLogin({ user: data });
-        if (this.$checkRes(res)) {
-          this.$message.success('登录成功');
-          this.$router.push('/homeIndex');
-        }
-      } else {
-        data.institution_code = data.phone;
-        let res = await this.orgLogin({ user: data });
-        if (this.$checkRes(res)) {
-          this.$message.success('登录成功');
-          this.$router.push('/homeIndex');
-        }
-      }
-    },
-    // 管理登录
-    async adminLogin() {
-      let res = await this.login({ user: this.form });
-      if (this.$checkRes(res)) {
-        this.$message.success('登录成功');
-        this.$router.push('/homeIndex');
-      }
-    },
-    // 专家登陆
-    async toExpertLogin() {
-      let dup = _.cloneDeep(this.expert);
-      const res = await this.expertLogin(dup);
-      if (this.$checkRes(res)) {
-        this.$message.success('登录成功');
-        this.$router.push('/expertCenter');
-      }
-    },
-    enterListen() {
-      var lett = this;
-      document.onkeydown = function(e) {
-        var key = window.event.keyCode;
-        if (key == 13) {
-          if (lett.active == 'first') {
-            lett.webLogin();
-          } else if (lett.active == 'second') {
-            lett.adminLogin();
-          } else if (lett.active == 'third') {
-            lett.toExpertLogin();
-          }
-        }
-      };
-    },
-    // 选择类型
-    changeActive(active) {
-      if (active == undefined) {
-        this.$set(this, `active`, 'first');
-      } else {
-        this.$set(this, `active`, active.name);
-      }
-    },
-  },
-  mounted() {
-    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
-    this.$set(this, `clientHeight`, clientHeight);
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped>
-.w_1200 {
-  width: 1200px;
-  margin: 0 auto;
-}
-.main {
-  background-image: url(../assets/img/login-bg.jpg);
-  background-repeat: no-repeat;
-  background-size: 100% 100%;
-  overflow: auto;
-  .info {
-    height: 430px;
-    box-shadow: 0 0 5px #ccc;
-    position: relative;
-    top: 150px;
-    background-color: #ffffff9f;
-    border-radius: 10px;
-    .text {
-      text-align: center;
-      font-size: 20px;
-      padding: 20px 0;
-      font-weight: bold;
-      border-bottom: 1px solid #000;
-      margin: 0 0 15px 0;
-    }
-    .tabs {
-      padding: 0 !important;
-      /deep/.el-tabs__item {
-        width: 162px;
-        text-align: center;
-        font-size: 18px;
-        font-weight: bold;
-      }
-      .btn {
-        text-align: center;
-      }
-      .two {
-        padding: 30px 0px !important;
-      }
-    }
-  }
-}
-</style>
+<template>
+  <div id="Login">
+    <el-row>
+      <el-col :span="24" class="main" :style="{ height: clientHeight + 'px' }">
+        <div class="w_1200">
+          <el-row :gutter="20">
+            <el-col :span="10" :offset="6" class="info">
+              <el-col :span="24" class="text">
+                成果评价系统
+              </el-col>
+              <el-col :span="24" class="tabs">
+                <el-tabs v-model="active" type="card" @tab-click="changeActive">
+                  <el-tab-pane label="个人用户" name="first">
+                    <el-col :span="24" class="two">
+                      <el-form :model="webForm" :rules="rules" ref="webForm" label-width="100px">
+                        <el-form-item label="账号" prop="phone">
+                          <el-input v-model="webForm.phone" placeholder="请输入账号"></el-input>
+                        </el-form-item>
+                        <el-form-item label="密码" prop="password">
+                          <el-input v-model="webForm.password" placeholder="请输入密码" show-password></el-input>
+                        </el-form-item>
+                        <el-col :span="24" class="btn">
+                          <el-button type="primary" @click="webLogin('webForm')">确认登录</el-button>
+                        </el-col>
+                      </el-form>
+                    </el-col>
+                  </el-tab-pane>
+                  <el-tab-pane label="管理用户" name="second">
+                    <el-col :span="24" class="two">
+                      <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+                        <el-form-item label="手机号" prop="code_phone">
+                          <el-input v-model="form.code_phone" placeholder="请输入手机号"></el-input>
+                        </el-form-item>
+                        <el-form-item label="密码" prop="passwd">
+                          <el-input v-model="form.passwd" placeholder="请输入密码" show-password></el-input>
+                        </el-form-item>
+                        <el-col :span="24" class="btn">
+                          <el-button type="primary" @click="adminLogin('form')">确认登录</el-button>
+                        </el-col>
+                      </el-form>
+                    </el-col>
+                  </el-tab-pane>
+                  <el-tab-pane label="专家用户" name="third">
+                    <el-col :span="24" class="two">
+                      <el-form :model="expert" ref="expert" label-width="100px">
+                        <el-form-item label="手机号" prop="phone">
+                          <el-input v-model="expert.phone" placeholder="请输入手机号"></el-input>
+                        </el-form-item>
+                        <el-form-item label="密码" prop="passwd">
+                          <el-input v-model="expert.password" placeholder="请输入密码" show-password></el-input>
+                        </el-form-item>
+                        <el-col :span="24" class="btn">
+                          <el-button type="primary" @click="toExpertLogin('form')">确认登录</el-button>
+                        </el-col>
+                      </el-form>
+                    </el-col>
+                  </el-tab-pane>
+                </el-tabs>
+              </el-col>
+            </el-col>
+          </el-row>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: adminLogin } = createNamespacedHelpers('adminLogin');
+const { mapActions: personal } = createNamespacedHelpers('personal');
+const { mapActions: organization } = createNamespacedHelpers('organization');
+const { mapActions: achieveExpert } = createNamespacedHelpers('achieveExpert');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'Login',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      // 页面高度
+      clientHeight: '',
+      active: 'first',
+      // 个人登录
+      webForm: {},
+      // 管理登录
+      form: {},
+      rules: {
+        code_phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+        passwd: [{ required: true, message: '请输入密码', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+        password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
+        type: [{ required: true, message: '请选择用户类别', trigger: 'change' }],
+      },
+      // 专家登陆
+      expert: {},
+    };
+  },
+  async created() {
+    await this.changeActive();
+    await this.enterListen();
+  },
+  methods: {
+    ...personal(['perLogin']),
+    ...organization(['orgLogin']),
+    ...adminLogin(['login']),
+    ...achieveExpert({ expertLogin: 'login' }),
+    // 个人登录
+    async webLogin() {
+      let data = this.webForm;
+      console.log(data);
+      data.type = '4';
+      if (data.type == '4') {
+        let res = await this.perLogin({ user: data });
+        if (this.$checkRes(res)) {
+          this.$message.success('登录成功');
+          this.$router.push('/homeIndex');
+        }
+      } else {
+        data.institution_code = data.phone;
+        let res = await this.orgLogin({ user: data });
+        if (this.$checkRes(res)) {
+          this.$message.success('登录成功');
+          this.$router.push('/homeIndex');
+        }
+      }
+    },
+    // 管理登录
+    async adminLogin() {
+      let res = await this.login({ user: this.form });
+      if (this.$checkRes(res)) {
+        this.$message.success('登录成功');
+        this.$router.push('/homeIndex');
+      }
+    },
+    // 专家登陆
+    async toExpertLogin() {
+      let dup = _.cloneDeep(this.expert);
+      const res = await this.expertLogin(dup);
+      if (this.$checkRes(res)) {
+        this.$message.success('登录成功');
+        this.$router.push('/expertCenter');
+      }
+    },
+    enterListen() {
+      var lett = this;
+      document.onkeydown = function(e) {
+        var key = window.event.keyCode;
+        if (key == 13) {
+          if (lett.active == 'first') {
+            lett.webLogin();
+          } else if (lett.active == 'second') {
+            lett.adminLogin();
+          } else if (lett.active == 'third') {
+            lett.toExpertLogin();
+          }
+        }
+      };
+    },
+    // 选择类型
+    changeActive(active) {
+      if (active == undefined) {
+        this.$set(this, `active`, 'first');
+      } else {
+        this.$set(this, `active`, active.name);
+      }
+    },
+  },
+  mounted() {
+    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.w_1200 {
+  width: 1200px;
+  margin: 0 auto;
+}
+.main {
+  background-image: url(../assets/img/login-bg.jpg);
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  overflow: auto;
+  .info {
+    height: 430px;
+    box-shadow: 0 0 5px #ccc;
+    position: relative;
+    top: 150px;
+    background-color: #ffffff9f;
+    border-radius: 10px;
+    .text {
+      text-align: center;
+      font-size: 20px;
+      padding: 20px 0;
+      font-weight: bold;
+      border-bottom: 1px solid #000;
+      margin: 0 0 15px 0;
+    }
+    .tabs {
+      padding: 0 !important;
+      /deep/.el-tabs__item {
+        width: 162px;
+        text-align: center;
+        font-size: 18px;
+        font-weight: bold;
+      }
+      .btn {
+        text-align: center;
+      }
+      .two {
+        padding: 30px 0px !important;
+      }
+    }
+  }
+}
+</style>

+ 187 - 162
src/views/adminCenter/adminCate/index.vue

@@ -1,162 +1,187 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main">
-        <el-col :span="24" class="down">
-          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @file="toFile" @load="toLoad" @cert="toCert"></data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-    <el-dialog title="发放证书" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
-      <el-form>
-        <el-form-item label="成果名称">{{ getProp('basic.achieve_name') }}</el-form-item>
-        <el-timeline>
-          <el-timeline-item
-            v-for="(i, index) in line"
-            :key="`line${index}`"
-            :icon="i.status <= 0 ? 'el-icon-close ' : 'el-icon-check'"
-            :type="i.status <= 0 ? 'danger ' : 'success'"
-            size="large"
-            :timestamp="i.status <= 0 ? '' : i.create_time"
-          >
-            {{ i.step }}
-            <el-collapse v-if="i.status <= 0">
-              <el-collapse-item title="点击展开" name="1">
-                <el-table :data="i.list">
-                  <el-table-column align="center" label="时间" prop="create_time" show-overflow-tooltip></el-table-column>
-                  <el-table-column align="center" label="建议" prop="desc" show-overflow-tooltip></el-table-column>
-                </el-table>
-              </el-collapse-item>
-            </el-collapse>
-          </el-timeline-item>
-        </el-timeline>
-        <el-form-item label="是否缴费">
-          <el-checkbox v-model="cost" :label="true">已缴费</el-checkbox>
-        </el-form-item>
-        <el-form-item label="">
-          <el-button type="primary" :disabled="!cost" @click="haveCert">发放证书</el-button>
-        </el-form-item>
-      </el-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import dataTable from '@common/src/components/frame/filter-page-table.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {
-    dataTable,
-  },
-  data: function() {
-    return {
-      opera: [
-        {
-          label: '资料归档',
-          method: 'file',
-        },
-        {
-          label: '资料预览',
-          method: 'load',
-        },
-        {
-          label: '发放证书',
-          method: 'cert',
-        },
-      ],
-      fields: [
-        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true },
-        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
-        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
-      ],
-      list: [],
-      total: 0,
-      dialog: false,
-      info: {},
-      test: true,
-      cost: false,
-      line: [],
-    };
-  },
-  async created() {
-    await this.search();
-  },
-  methods: {
-    ...achieveApply(['query']),
-    ...verifyRecord({ create: 'create', getRecord: 'query' }),
-    // 查询列表
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, status: '5' });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, `total`, res.total);
-      }
-    },
-    async toCert({ data }) {
-      this.$set(this, `info`, data);
-      const records = await this.getRecord({ apply_id: data._id });
-      const order = [-1, 1, -2, 2, -3, 3, 4, -5, 5, 6]; //时间轴的顺序,如果有修改,请注意这里的逗号,少写了只会让顺序出错,不会报错,被识别成减法了(实际体验的结果)
-      if (this.$checkRes(records)) {
-        let data = _.get(records, 'data', []);
-        data = _.groupBy(data, 'status');
-        const arr = [];
-        for (const n of order) {
-          const obj = _.get(data, n);
-          if (obj) {
-            const head = _.head(obj);
-            if (!head) continue;
-            const aobj = { step: _.get(head, 'step'), create_time: _.get(head, 'create_time'), list: obj, status: _.get(head, 'status') };
-            arr.push(aobj);
-          }
-        }
-        this.$set(this, `line`, arr);
-      }
-      this.dialog = true;
-    },
-    getProp(prop) {
-      return _.get(this.info, prop, '');
-    },
-    async haveCert() {
-      const data = _.cloneDeep(this.info);
-      // 发证书
-      let dup = { status: '6' };
-      dup.apply_id = _.get(data, '_id');
-      dup.verify = _.get(this.user, 'name');
-      dup.verify_phone = _.get(this.user, 'phone');
-      dup.verify_id = _.get(this.user, '_id');
-      dup.step = '发证书';
-      const res = await this.create(dup);
-      if (this.$checkRes(res, '已确定发放证书', res.errmsg || '确定发放失败')) {
-        this.handleClose();
-        this.search();
-      }
-    },
-    handleClose() {
-      this.info = {};
-      this.line = [];
-      this.dialog = false;
-    },
-    // 资料归档
-    toFile({ data }) {
-      this.$router.push({ path: '/adminCate/detail', query: { id: data.id } });
-    },
-    // 资料预览
-    toLoad({ data }) {
-      this.$router.push({ path: '/adminCate/dataInfo', query: { id: data.id, type: '5' } });
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @file="toFile" @load="toLoad" @cert="toCert">
+            <template #custom="{item,row}">
+              <template v-if="item.prop === 'basic.achieve_num'">
+                <el-link size="mini" type="primary" @click="toApply(row)">{{ getProps(row, item.prop) }}</el-link>
+              </template>
+            </template>
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="发放证书" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
+      <el-form>
+        <el-form-item label="成果名称">{{ getProp('basic.achieve_name') }}</el-form-item>
+        <el-timeline>
+          <el-timeline-item
+            v-for="(i, index) in line"
+            :key="`line${index}`"
+            :icon="i.status <= 0 ? 'el-icon-close ' : 'el-icon-check'"
+            :type="i.status <= 0 ? 'danger ' : 'success'"
+            size="large"
+            :timestamp="i.status <= 0 ? '' : i.create_time"
+          >
+            {{ i.step }}
+            <el-collapse v-if="i.status <= 0">
+              <el-collapse-item title="点击展开" name="1">
+                <el-table :data="i.list">
+                  <el-table-column align="center" label="时间" prop="create_time" show-overflow-tooltip></el-table-column>
+                  <el-table-column align="center" label="建议" prop="desc" show-overflow-tooltip></el-table-column>
+                </el-table>
+              </el-collapse-item>
+            </el-collapse>
+          </el-timeline-item>
+        </el-timeline>
+        <el-form-item label="是否缴费">
+          <el-checkbox v-model="cost" :label="true">已缴费</el-checkbox>
+        </el-form-item>
+        <el-form-item label="">
+          <el-button type="primary" :disabled="!cost" @click="haveCert">发放证书</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
+      <detail :form="apply"></detail>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from '../parts/detail.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    detail,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '资料归档',
+          method: 'file',
+        },
+        {
+          label: '资料预览',
+          method: 'load',
+        },
+        {
+          label: '发放证书',
+          method: 'cert',
+        },
+      ],
+      fields: [
+        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
+        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
+        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
+      ],
+      list: [],
+      total: 0,
+      dialog: false,
+      info: {},
+      test: true,
+      cost: false,
+      line: [],
+      applyDialog: false,
+      apply: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...achieveApply(['query']),
+    ...verifyRecord({ create: 'create', getRecord: 'query' }),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, status: '5' });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    async toCert({ data }) {
+      this.$set(this, `info`, data);
+      const records = await this.getRecord({ apply_id: data._id });
+      const order = [-1, 1, -2, 2, -3, 3, 4, -5, 5, 6]; //时间轴的顺序,如果有修改,请注意这里的逗号,少写了只会让顺序出错,不会报错,被识别成减法了(实际体验的结果)
+      if (this.$checkRes(records)) {
+        let data = _.get(records, 'data', []);
+        data = _.groupBy(data, 'status');
+        const arr = [];
+        for (const n of order) {
+          const obj = _.get(data, n);
+          if (obj) {
+            const head = _.head(obj);
+            if (!head) continue;
+            const aobj = { step: _.get(head, 'step'), create_time: _.get(head, 'create_time'), list: obj, status: _.get(head, 'status') };
+            arr.push(aobj);
+          }
+        }
+        this.$set(this, `line`, arr);
+      }
+      this.dialog = true;
+    },
+    getProp(prop) {
+      return _.get(this.info, prop, '');
+    },
+    async haveCert() {
+      const data = _.cloneDeep(this.info);
+      // 发证书
+      let dup = { status: '6' };
+      dup.apply_id = _.get(data, '_id');
+      dup.verify = _.get(this.user, 'name');
+      dup.verify_phone = _.get(this.user, 'phone');
+      dup.verify_id = _.get(this.user, '_id');
+      dup.step = '发证书';
+      const res = await this.create(dup);
+      if (this.$checkRes(res, '已确定发放证书', res.errmsg || '确定发放失败')) {
+        this.handleClose();
+        this.search();
+      }
+    },
+    handleClose() {
+      this.info = {};
+      this.line = [];
+      this.dialog = false;
+    },
+    // 资料归档
+    toFile({ data }) {
+      this.$router.push({ path: '/adminCate/detail', query: { id: data.id } });
+    },
+    // 资料预览
+    toLoad({ data }) {
+      this.$router.push({ path: '/adminCate/dataInfo', query: { id: data.id, type: '5' } });
+    },
+    async toApply(data) {
+      this.$set(this, 'apply', data);
+      this.applyDialog = true;
+    },
+    getProps(data, prop) {
+      return _.get(data, prop);
+    },
+    applyClose() {
+      this.applyDialog = false;
+      this.apply = {};
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 103 - 78
src/views/adminCenter/adminHaveCert/index.vue

@@ -1,78 +1,103 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main">
-        <el-col :span="24" class="down">
-          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @cert="toCert" @load="toLoad"></data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import dataTable from '@common/src/components/frame/filter-page-table.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {
-    dataTable,
-  },
-  data: function() {
-    return {
-      opera: [
-        {
-          label: '资料查看',
-          method: 'load',
-        },
-        {
-          label: '证书查看',
-          method: 'cert',
-        },
-      ],
-      fields: [
-        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true },
-        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
-        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
-      ],
-      list: [],
-      total: 0,
-    };
-  },
-  async created() {
-    await this.search();
-  },
-  methods: {
-    ...achieveApply(['query']),
-    ...verifyRecord(['create']),
-    // 查询列表
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, status: '6' });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, `total`, res.total);
-      }
-    },
-    // 证书查看
-    toCert({ data }) {
-      this.$router.push({ path: '/userCommon/certDetail', query: { id: data.id } });
-    },
-    // 资料预览
-    toLoad({ data }) {
-      this.$router.push({ path: '/adminCate/dataInfo', query: { id: data.id, type: '6' } });
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @cert="toCert" @load="toLoad">
+            <template #custom="{item,row}">
+              <template v-if="item.prop === 'basic.achieve_num'">
+                <el-link size="mini" type="primary" @click="toApply(row)">{{ getProp(row, item.prop) }}</el-link>
+              </template>
+            </template>
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
+      <detail :form="apply"></detail>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from '../parts/detail.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    detail,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '资料查看',
+          method: 'load',
+        },
+        {
+          label: '证书查看',
+          method: 'cert',
+        },
+      ],
+      fields: [
+        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
+        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
+        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
+      ],
+      list: [],
+      total: 0,
+      applyDialog: false,
+      apply: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...achieveApply(['query']),
+    ...verifyRecord(['create']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, status: '6' });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 证书查看
+    toCert({ data }) {
+      this.$router.push({ path: '/userCommon/certDetail', query: { id: data.id } });
+    },
+    // 资料预览
+    toLoad({ data }) {
+      this.$router.push({ path: '/adminCate/dataInfo', query: { id: data.id, type: '6' } });
+    },
+    async toApply(data) {
+      this.$set(this, 'apply', data);
+      this.applyDialog = true;
+    },
+    getProp(data, prop) {
+      return _.get(data, prop);
+    },
+    applyClose() {
+      this.applyDialog = false;
+      this.apply = {};
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 245 - 220
src/views/adminCenter/adminMeet/index.vue

@@ -1,220 +1,245 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main">
-        <el-col :span="24" class="down">
-          <data-table
-            :fields="fields"
-            :opera="opera"
-            :data="list"
-            :total="total"
-            @query="search"
-            @change="toChange"
-            @view="toView"
-            @edit="toEdit"
-            @doc="toDoc"
-            @updoc="toUpload"
-            :operaWidth="240"
-          ></data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-    <el-dialog title="会审总结" width="40%" :visible.sync="sumDialog" @closed="handleClose" :destroy-on-close="true">
-      <data-form :data="sumForm" :fields="sumfields" :rules="{}" @save="sumSave">
-        <template #radios="{item}">
-          <template v-if="item.model === 'status'">
-            <el-radio label="5">通过</el-radio>
-            <el-radio label="-5">不通过</el-radio>
-            <el-radio label="4">资料完善</el-radio>
-          </template>
-        </template>
-      </data-form>
-    </el-dialog>
-    <el-dialog title="会审文件上传" width="40%" :visible.sync="upDialog" @closed="handleClose" :destroy-on-close="true">
-      <el-form>
-        <el-form-item label="现场测试(检测,测产)意见">
-          <upload :limit="1" :data="file.page5" type="page5" :url="'/files/achieve/apply_file/upload'" @upload="uploadSuccess" @delete="uploadDelete"></upload>
-        </el-form-item>
-        <el-form-item label="评价意见">
-          <upload :limit="1" :data="file.page6" type="page6" :url="'/files/achieve/apply_file/upload'" @upload="uploadSuccess" @delete="uploadDelete"></upload>
-        </el-form-item>
-        <el-form-item label="评价专家组名单">
-          <upload
-            :limit="1"
-            :data="file.nameList"
-            type="nameList"
-            :url="'/files/achieve/apply_file/upload'"
-            @upload="uploadSuccess"
-            @delete="uploadDelete"
-          ></upload>
-        </el-form-item>
-        <el-row type="flex" justify="center">
-          <el-button type="primary" @click="fileUpdate">保存</el-button>
-        </el-row>
-      </el-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import upload from '@common/src/components/frame/upload.vue';
-import dataTable from '@common/src/components/frame/filter-page-table.vue';
-import dataForm from '@common/src/components/frame/form.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {
-    dataTable,
-    dataForm,
-    upload,
-  },
-  data: function() {
-    return {
-      opera: [
-        {
-          label: '会审专家管理',
-          method: 'change',
-        },
-        // {
-        //   label: '查看会审记录',
-        //   method: 'view',
-        // },
-        {
-          label: '会审总结',
-          method: 'edit',
-        },
-        {
-          label: '会审文件下载',
-          method: 'doc',
-        },
-        {
-          label: '会审文件上传',
-          method: 'updoc',
-        },
-      ],
-      fields: [
-        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true },
-        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
-        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
-      ],
-      list: [],
-      total: 0,
-      // 选择会审专家
-      dialog: false,
-      form: {},
-      formfields: [{ label: '选择专家', model: 'expert', custom: true }],
-      rules: {},
-      // 专家列表
-      expertList: [
-        { id: '1', name: '专家一' },
-        { id: '2', name: '专家二' },
-      ],
-      // 会审总结
-      sumDialog: false,
-      sumForm: {},
-      sumfields: [
-        { label: '总结状态', model: 'status', type: 'radio' },
-        { label: '总结意见', model: 'desc', type: 'textarea' },
-      ],
-      // 上传upload
-      upDialog: false,
-      file: {},
-    };
-  },
-  async created() {
-    await this.search();
-  },
-  methods: {
-    ...achieveApply(['query', 'update']),
-    ...verifyRecord(['create']),
-    // 查询列表
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, status: '3' });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, `total`, res.total);
-      }
-    },
-    // 选择专家会审
-    toChange({ data }) {
-      this.$router.push({ path: '/adminMeet/expert', query: { id: data.id } });
-    },
-    // 保存专家会审列表
-    toSave({ data }) {
-      console.log(data);
-      this.handleClose();
-    },
-    // 取消选择
-    handleClose() {
-      this.file = {};
-      this.upDialog = false;
-      this.form = {};
-      this.dialog = false;
-      this.sumForm = {};
-      this.sumDialog = false;
-      this.search();
-    },
-    // 查看专家会审记录
-    toView({ data }) {
-      this.$router.push({ path: '/adminMeet/detail', query: { id: data.id } });
-    },
-    // 会审总结
-    toEdit({ data }) {
-      this.$set(this, 'form', _.cloneDeep(data));
-      this.sumDialog = true;
-    },
-    // 会审总结提交
-    async sumSave({ data }) {
-      console.log(data);
-      let dup = _.pick(data, ['desc', 'status']);
-      dup.apply_id = _.get(this.form, '_id');
-      dup.verify = _.get(this.user, 'name');
-      dup.verify_phone = _.get(this.user, 'phone');
-      dup.verify_id = _.get(this.user, '_id');
-      dup.step = '会审';
-      const res = await this.create(dup);
-      if (this.$checkRes(res, '审核成功', res.errmsg || '审核失败')) {
-        this.handleClose();
-      }
-    },
-    toDoc({ data }) {
-      this.$router.push({ path: '/adminMeet/file', query: { id: data.id } });
-    },
-    toUpload({ data }) {
-      this.upDialog = true;
-      this.$set(this, `form`, _.cloneDeep(data));
-      const file = _.get(data, 'file', {});
-      this.$set(this, `file`, file);
-    },
-    // 图片上传
-    uploadSuccess({ type, data }) {
-      this.$set(this.file, `${type}`, data.uri);
-    },
-    // 删除图片
-    uploadDelete(data) {
-      this.$set(this.file, `${data.type}`, null);
-    },
-    async fileUpdate() {
-      const file = _.cloneDeep(this.file);
-      const apply = _.cloneDeep(this.form);
-      apply.file = file;
-      const res = await this.update(apply);
-      if (this.$checkRes(res, '保存成功', '保存失败')) {
-        this.handleClose();
-      }
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <data-table
+            :fields="fields"
+            :opera="opera"
+            :data="list"
+            :total="total"
+            @query="search"
+            @change="toChange"
+            @view="toView"
+            @edit="toEdit"
+            @doc="toDoc"
+            @updoc="toUpload"
+            :operaWidth="240"
+          >
+            <template #custom="{item,row}">
+              <template v-if="item.prop === 'basic.achieve_num'">
+                <el-link size="mini" type="primary" @click="toApply(row)">{{ getProp(row, item.prop) }}</el-link>
+              </template>
+            </template>
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="会审总结" width="40%" :visible.sync="sumDialog" @closed="handleClose" :destroy-on-close="true">
+      <data-form :data="sumForm" :fields="sumfields" :rules="{}" @save="sumSave">
+        <template #radios="{item}">
+          <template v-if="item.model === 'status'">
+            <el-radio label="5">通过</el-radio>
+            <el-radio label="-5">不通过</el-radio>
+            <el-radio label="4">资料完善</el-radio>
+          </template>
+        </template>
+      </data-form>
+    </el-dialog>
+    <el-dialog title="会审文件上传" width="40%" :visible.sync="upDialog" @closed="handleClose" :destroy-on-close="true">
+      <el-form>
+        <el-form-item label="现场测试(检测,测产)意见">
+          <upload :limit="1" :data="file.page5" type="page5" :url="'/files/achieve/apply_file/upload'" @upload="uploadSuccess" @delete="uploadDelete"></upload>
+        </el-form-item>
+        <el-form-item label="评价意见">
+          <upload :limit="1" :data="file.page6" type="page6" :url="'/files/achieve/apply_file/upload'" @upload="uploadSuccess" @delete="uploadDelete"></upload>
+        </el-form-item>
+        <el-form-item label="评价专家组名单">
+          <upload
+            :limit="1"
+            :data="file.nameList"
+            type="nameList"
+            :url="'/files/achieve/apply_file/upload'"
+            @upload="uploadSuccess"
+            @delete="uploadDelete"
+          ></upload>
+        </el-form-item>
+        <el-row type="flex" justify="center">
+          <el-button type="primary" @click="fileUpdate">保存</el-button>
+        </el-row>
+      </el-form>
+    </el-dialog>
+    <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
+      <detail :form="apply"></detail>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from '../parts/detail.vue';
+import upload from '@common/src/components/frame/upload.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import dataForm from '@common/src/components/frame/form.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    dataForm,
+    upload,
+    detail,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '会审专家管理',
+          method: 'change',
+        },
+        // {
+        //   label: '查看会审记录',
+        //   method: 'view',
+        // },
+        {
+          label: '会审总结',
+          method: 'edit',
+        },
+        {
+          label: '会审文件下载',
+          method: 'doc',
+        },
+        {
+          label: '会审文件上传',
+          method: 'updoc',
+        },
+      ],
+      fields: [
+        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
+        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
+        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
+      ],
+      list: [],
+      total: 0,
+      // 选择会审专家
+      dialog: false,
+      form: {},
+      formfields: [{ label: '选择专家', model: 'expert', custom: true }],
+      rules: {},
+      // 专家列表
+      expertList: [
+        { id: '1', name: '专家一' },
+        { id: '2', name: '专家二' },
+      ],
+      // 会审总结
+      sumDialog: false,
+      sumForm: {},
+      sumfields: [
+        { label: '总结状态', model: 'status', type: 'radio' },
+        { label: '总结意见', model: 'desc', type: 'textarea' },
+      ],
+      // 上传upload
+      upDialog: false,
+      file: {},
+      applyDialog: false,
+      apply: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...achieveApply(['query', 'update']),
+    ...verifyRecord(['create']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, status: '3' });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 选择专家会审
+    toChange({ data }) {
+      this.$router.push({ path: '/adminMeet/expert', query: { id: data.id } });
+    },
+    // 保存专家会审列表
+    toSave({ data }) {
+      console.log(data);
+      this.handleClose();
+    },
+    // 取消选择
+    handleClose() {
+      this.file = {};
+      this.upDialog = false;
+      this.form = {};
+      this.dialog = false;
+      this.sumForm = {};
+      this.sumDialog = false;
+      this.search();
+    },
+    // 查看专家会审记录
+    toView({ data }) {
+      this.$router.push({ path: '/adminMeet/detail', query: { id: data.id } });
+    },
+    // 会审总结
+    toEdit({ data }) {
+      this.$set(this, 'form', _.cloneDeep(data));
+      this.sumDialog = true;
+    },
+    // 会审总结提交
+    async sumSave({ data }) {
+      console.log(data);
+      let dup = _.pick(data, ['desc', 'status']);
+      dup.apply_id = _.get(this.form, '_id');
+      dup.verify = _.get(this.user, 'name');
+      dup.verify_phone = _.get(this.user, 'phone');
+      dup.verify_id = _.get(this.user, '_id');
+      dup.step = '会审';
+      const res = await this.create(dup);
+      if (this.$checkRes(res, '审核成功', res.errmsg || '审核失败')) {
+        this.handleClose();
+      }
+    },
+    toDoc({ data }) {
+      this.$router.push({ path: '/adminMeet/file', query: { id: data.id } });
+    },
+    toUpload({ data }) {
+      this.upDialog = true;
+      this.$set(this, `form`, _.cloneDeep(data));
+      const file = _.get(data, 'file', {});
+      this.$set(this, `file`, file);
+    },
+    // 图片上传
+    uploadSuccess({ type, data }) {
+      this.$set(this.file, `${type}`, data.uri);
+    },
+    // 删除图片
+    uploadDelete(data) {
+      this.$set(this.file, `${data.type}`, null);
+    },
+    async fileUpdate() {
+      const file = _.cloneDeep(this.file);
+      const apply = _.cloneDeep(this.form);
+      apply.file = file;
+      const res = await this.update(apply);
+      if (this.$checkRes(res, '保存成功', '保存失败')) {
+        this.handleClose();
+      }
+    },
+    async toApply(data) {
+      this.$set(this, 'apply', data);
+      this.applyDialog = true;
+    },
+    getProp(data, prop) {
+      return _.get(data, prop);
+    },
+    applyClose() {
+      this.applyDialog = false;
+      this.apply = {};
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 93 - 68
src/views/adminCenter/adminPerfect/index.vue

@@ -1,68 +1,93 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main">
-        <el-col :span="24" class="down">
-          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView"></data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import dataTable from '@common/src/components/frame/filter-page-table.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {
-    dataTable,
-  },
-  data: function() {
-    return {
-      opera: [
-        {
-          label: '资料查看',
-          method: 'view',
-        },
-      ],
-      fields: [
-        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true },
-        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
-        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
-      ],
-      list: [],
-      total: 0,
-    };
-  },
-  async created() {
-    await this.search();
-  },
-  methods: {
-    ...achieveApply(['query']),
-    // 查询列表
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, status: '4' });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, `total`, res.total);
-      }
-    },
-    // 资料审核
-    toView({ data }) {
-      this.$router.push({ path: '/adminPerfect/detail', query: { id: data.id } });
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView">
+            <template #custom="{item,row}">
+              <template v-if="item.prop === 'basic.achieve_num'">
+                <el-link size="mini" type="primary" @click="toApply(row)">{{ getProp(row, item.prop) }}</el-link>
+              </template>
+            </template>
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
+      <detail :form="apply"></detail>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from '../parts/detail.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    detail,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '资料查看',
+          method: 'view',
+        },
+      ],
+      fields: [
+        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
+        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
+        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
+      ],
+      list: [],
+      total: 0,
+      applyDialog: false,
+      apply: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...achieveApply(['query']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, status: '4' });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 资料审核
+    toView({ data }) {
+      this.$router.push({ path: '/adminPerfect/detail', query: { id: data.id } });
+    },
+    async toApply(data) {
+      this.$set(this, 'apply', data);
+      this.applyDialog = true;
+    },
+    getProp(data, prop) {
+      return _.get(data, prop);
+    },
+    applyClose() {
+      this.applyDialog = false;
+      this.apply = {};
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 143 - 119
src/views/adminCenter/adminScore/index.vue

@@ -1,119 +1,143 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main">
-        <el-col :span="24" class="down">
-          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView" @edit="toEdit"></data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-    <el-dialog title="评分总结" width="40%" :visible.sync="sumDialog" @closed="handleClose" :destroy-on-close="true">
-      <data-form :data="sumForm" :fields="sumfields" :rules="{}" @save="sumSave">
-        <template #radios="{item}">
-          <template v-if="item.model === 'status'">
-            <!-- 因为不需要申请人线上证明缴费,所以跳过缴费等待步骤,直接进入会审步骤 -->
-            <el-radio label="3">通过</el-radio>
-            <el-radio label="-2">不通过</el-radio>
-          </template>
-        </template>
-      </data-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash');
-import dataForm from '@common/src/components/frame/form.vue';
-import dataTable from '@common/src/components/frame/filter-page-table.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
-const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {
-    dataTable,
-    dataForm,
-  },
-  data: function() {
-    return {
-      opera: [
-        {
-          label: '专家指派&评分查看',
-          method: 'view',
-        },
-        {
-          label: '评分总结',
-          method: 'edit',
-        },
-      ],
-      fields: [
-        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true },
-        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
-        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
-      ],
-      list: [],
-      total: 0,
-      // 会审总结
-      sumDialog: false,
-      sumForm: {},
-      sumfields: [
-        { label: '总结状态', model: 'status', type: 'radio' },
-        { label: '总结意见', model: 'desc', type: 'textarea' },
-      ],
-    };
-  },
-  async created() {
-    await this.search();
-  },
-  methods: {
-    ...achieveApply(['query']),
-    ...verifyRecord(['create']),
-    // 查询列表
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, status: '1' });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, `total`, res.total);
-      }
-    },
-    // 专家评分查看
-    toView({ data }) {
-      this.$router.push({ path: '/adminScore/detail', query: { id: data.id } });
-    },
-    // 会审总结
-    toEdit({ data }) {
-      this.$set(this, 'sumForm', _.cloneDeep(data));
-      this.sumDialog = true;
-    },
-    // 会审总结提交
-    async sumSave({ data }) {
-      let dup = _.pick(data, ['desc', 'status']);
-      dup.apply_id = _.get(data, '_id');
-      dup.verify = _.get(this.user, 'name');
-      dup.verify_phone = _.get(this.user, 'phone');
-      dup.verify_id = _.get(this.user, '_id');
-      dup.step = '评分';
-      const res = await this.create(dup);
-      if (this.$checkRes(res, '审核成功', res.errmsg || '审核失败')) {
-        this.handleClose();
-      }
-    },
-    // 取消选择
-    handleClose() {
-      this.sumForm = {};
-      this.sumDialog = false;
-      this.search();
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @view="toView" @edit="toEdit">
+            <template #custom="{item,row}">
+              <template v-if="item.prop === 'basic.achieve_num'">
+                <el-link size="mini" type="primary" @click="toApply(row)">{{ getProp(row, item.prop) }}</el-link>
+              </template>
+            </template>
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="评分总结" width="40%" :visible.sync="sumDialog" @closed="handleClose" :destroy-on-close="true">
+      <data-form :data="sumForm" :fields="sumfields" :rules="{}" @save="sumSave">
+        <template #radios="{item}">
+          <template v-if="item.model === 'status'">
+            <!-- 因为不需要申请人线上证明缴费,所以跳过缴费等待步骤,直接进入会审步骤 -->
+            <el-radio label="3">通过</el-radio>
+            <el-radio label="-2">不通过</el-radio>
+          </template>
+        </template>
+      </data-form>
+    </el-dialog>
+    <el-dialog title="成果详情" center width="80%" :close-on-click-modal="false" :visible.sync="applyDialog" destroy-on-close @closed="applyClose">
+      <detail :form="apply"></detail>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import detail from '../parts/detail.vue';
+import dataForm from '@common/src/components/frame/form.vue';
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: achieveApply } = createNamespacedHelpers('achieveApply');
+const { mapActions: verifyRecord } = createNamespacedHelpers('verifyRecord');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    dataForm,
+    detail,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '专家指派&评分查看',
+          method: 'view',
+        },
+        {
+          label: '评分总结',
+          method: 'edit',
+        },
+      ],
+      fields: [
+        { label: '成果编号', prop: 'basic.achieve_num', filter: 'input', showTip: true, custom: true },
+        { label: '成果名称', prop: 'basic.achieve_name', showTip: true },
+        { label: '成果类别', prop: 'basic.achieve_type', showTip: true },
+      ],
+      list: [],
+      total: 0,
+      // 会审总结
+      sumDialog: false,
+      sumForm: {},
+      sumfields: [
+        { label: '总结状态', model: 'status', type: 'radio' },
+        { label: '总结意见', model: 'desc', type: 'textarea' },
+      ],
+      applyDialog: false,
+      apply: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...achieveApply(['query']),
+    ...verifyRecord(['create']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, status: '1' });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 专家评分查看
+    toView({ data }) {
+      this.$router.push({ path: '/adminScore/detail', query: { id: data.id } });
+    },
+    // 会审总结
+    toEdit({ data }) {
+      this.$set(this, 'sumForm', _.cloneDeep(data));
+      this.sumDialog = true;
+    },
+    // 会审总结提交
+    async sumSave({ data }) {
+      let dup = _.pick(data, ['desc', 'status']);
+      dup.apply_id = _.get(data, '_id');
+      dup.verify = _.get(this.user, 'name');
+      dup.verify_phone = _.get(this.user, 'phone');
+      dup.verify_id = _.get(this.user, '_id');
+      dup.step = '评分';
+      const res = await this.create(dup);
+      if (this.$checkRes(res, '审核成功', res.errmsg || '审核失败')) {
+        this.handleClose();
+      }
+    },
+    // 取消选择
+    handleClose() {
+      this.sumForm = {};
+      this.sumDialog = false;
+      this.search();
+    },
+    async toApply(data) {
+      this.$set(this, 'apply', data);
+      this.applyDialog = true;
+    },
+    getProp(data, prop) {
+      return _.get(data, prop);
+    },
+    applyClose() {
+      this.applyDialog = false;
+      this.apply = {};
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 72 - 0
src/views/adminCenter/parts/detail.vue

@@ -0,0 +1,72 @@
+<template>
+  <div id="applyInfo">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="down">
+          <el-tabs v-model="active" type="card">
+            <el-tab-pane label="(一)基本信息" name="first">
+              <basic :info="form.basic"></basic>
+            </el-tab-pane>
+            <el-tab-pane label="(二)内容简介" name="second">
+              <brief :info="form.brief"></brief>
+            </el-tab-pane>
+            <el-tab-pane label="(三)主研人员名单" name="third">
+              <research :list="form.research"></research>
+            </el-tab-pane>
+            <el-tab-pane label="(四)评价委托方提供资料清单" name="fourth">
+              <detailed :linkInfo="form.datalist"></detailed>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import basic from '@/views/adminCenter/adminExamine/parts/basic.vue';
+import brief from '@/views/adminCenter/adminExamine/parts/brief.vue';
+import research from '@/views/adminCenter/adminExamine/parts/research.vue';
+import detailed from '@/views/adminCenter/adminExamine/parts/detailed.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'applyInfo',
+  props: { form: { type: Object, default: () => {} } },
+  components: { basic, brief, research, detailed },
+  data: function() {
+    return {
+      active: 'first',
+    };
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .down {
+    .fiveth {
+      padding: 0 20%;
+      .btn {
+        text-align: center;
+      }
+    }
+  }
+}
+.el-tabs {
+  /deep/.el-tabs__content {
+    height: 60vh;
+    overflow-y: auto;
+  }
+}
+</style>

+ 0 - 3
src/views/expertCenter/detail.vue

@@ -16,9 +16,6 @@
             <el-tab-pane label="(四)评价委托方提供资料清单" name="fourth">
               <detailed :linkInfo="form.datalist"></detailed>
             </el-tab-pane>
-            <el-tab-pane label="(五)专家评价" name="fifth">
-              <slot></slot>
-            </el-tab-pane>
           </el-tabs>
         </el-col>
       </el-col>