guhongwei 3 лет назад
Родитель
Сommit
ee8338b4f5

+ 43 - 14
public/index.html

@@ -1,17 +1,46 @@
 <!DOCTYPE html>
 <html lang="">
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title>加载中...</title>
-  </head>
-  <body>
-    <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-    </noscript>
-    <div id="app"></div>
-    <!-- built files will be auto injected -->
-  </body>
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title>加载中...</title>
+  <style>
+    div::-webkit-scrollbar {
+      width: 10px;
+      height: 10px;
+      /**/
+    }
+
+    div::-webkit-scrollbar-track {
+      background: rgb(239, 239, 239);
+      border-radius: 2px;
+    }
+
+    div::-webkit-scrollbar-thumb {
+      background: #bfbfbf;
+      border-radius: 10px;
+    }
+
+    div::-webkit-scrollbar-thumb:hover {
+      background: #333;
+    }
+
+    div::-webkit-scrollbar-corner {
+      background: #179a16;
+    }
+  </style>
+</head>
+
+<body>
+  <noscript>
+    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+        Please enable it to continue.</strong>
+  </noscript>
+  <div id="app"></div>
+  <!-- built files will be auto injected -->
+</body>
+
 </html>

+ 65 - 0
src/layout/register/admin-1.vue

@@ -0,0 +1,65 @@
+<template>
+  <div id="admin-1">
+    <el-col :span="12">
+      <el-form-item label="用户姓名" prop="form">
+        <el-input v-model="form.name" placeholder="请输入用户姓名"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="登录密码" prop="password" v-if="!form.id">
+        <el-input v-model="form.password" placeholder="请输入登录密码" show-password></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="身份证" prop="card">
+        <el-input v-model="form.card" placeholder="请输入身份证"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input v-model="form.email" placeholder="请输入电子邮箱"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="联系地址" prop="addr">
+        <el-input v-model="form.addr" placeholder="请输入联系地址"></el-input>
+      </el-form-item>
+    </el-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'admin-1',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 159 - 0
src/layout/register/expert-1.vue

@@ -0,0 +1,159 @@
+<template>
+  <div id="expert-1">
+    <el-col :span="12">
+      <el-form-item label="用户姓名" prop="name">
+        <el-input v-model="form.name" placeholder="请输入用户姓名"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="登录密码" prop="password" v-if="!form.id">
+        <el-input v-model="form.password" placeholder="请输入登录密码" show-password></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="身份证" prop="card">
+        <el-input v-model="form.card" placeholder="请输入身份证" @blur="toBlur"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="出生日期" prop="birth">
+        <el-date-picker v-model="form.birth" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date" placeholder="选择择" style="width: 100%">
+        </el-date-picker>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input v-model="form.email" placeholder="请输入电子邮箱"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="qq&微信" prop="qqwx">
+        <el-input v-model="form.qqwx" placeholder="请输入qq&微信"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="职务职称" prop="zwzc">
+        <el-input v-model="form.zwzc" placeholder="请输入职务职称"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="最高学历" prop="education">
+        <el-input v-model="form.education" placeholder="请输入最高学历"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="毕业院校" prop="school">
+        <el-input v-model="form.school" placeholder="请输入毕业院校"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="所学专业" prop="major">
+        <el-input v-model="form.major" placeholder="请输入所学专业"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="单位名称" prop="company">
+        <el-input v-model="form.company" placeholder="请输入单位名称"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="擅长领域" prop="expertise">
+        <el-input v-model="form.expertise" type="textarea" placeholder="请输入擅长领域"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="工作经历" prop="workexperience">
+        <el-input v-model="form.workexperience" type="textarea" placeholder="请输入工作经历"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="科研综述" prop="scientific">
+        <el-input v-model="form.scientific" type="textarea" placeholder="请输入科研综述"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="承担项目" prop="undertakingproject">
+        <el-input v-model="form.undertakingproject" type="textarea" placeholder="请输入承担项目"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="科技奖励" prop="scienceaward">
+        <el-input v-model="form.scienceaward" placeholder="请输入科技奖励"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="社会任职" prop="social">
+        <el-input v-model="form.social" placeholder="请输入社会任职"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="24">
+      <el-form-item label="头像" prop="icon">
+        <s-upload :limit="1" :data="form.icon" type="icon" :url="'/files/achieve/upload'" @upload="uplSuc" @delete="uplDel"></s-upload>
+      </el-form-item>
+    </el-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'expert-1',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 获取身份证信息
+    toBlur(event) {
+      let value = _.get(event.target, 'value');
+      if (value) {
+        // 获取性别
+        // if (parseInt(value.substr(16, 1)) % 2 == 1) this.$set(this.form, `gender`, '男');
+        // else this.$set(this.form, `gender`, '女');
+        // 获取出生日期
+        let birthday = '';
+        if (value != null && value != '') {
+          if (value.length == 15) {
+            birthday = '19' + value.slice(6, 12);
+          } else if (value.length == 18) {
+            birthday = value.slice(6, 14);
+          }
+          birthday = birthday.replace(/(.{4})(.{2})/, '$1-$2-');
+        }
+        this.$set(this.form, `birth`, birthday);
+      }
+    },
+    // 上传图片
+    uplSuc({ type, data }) {
+      this.$set(this.form, `${type}`, [{ name: data.name, url: data.uri }]);
+    },
+    uplDel({ type }) {
+      this.$set(this.form, `${type}`, []);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 90 - 0
src/layout/register/user-1.vue

@@ -0,0 +1,90 @@
+<template>
+  <div id="user-1">
+    <el-col :span="12">
+      <el-form-item label="用户姓名" prop="name">
+        <el-input v-model="form.name" placeholder="请输入用户姓名"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="登录密码" prop="password" v-if="!form.id">
+        <el-input v-model="form.password" placeholder="请输入登录密码" show-password></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="身份证" prop="card">
+        <el-input v-model="form.card" placeholder="请输入身份证"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input v-model="form.email" placeholder="请输入电子邮箱"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="所属行业" prop="profession">
+        <el-input v-model="form.profession" placeholder="请输入所属行业"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="所在院系" prop="school">
+        <el-input v-model="form.school" placeholder="请输入所在院系"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="所学专业" prop="major">
+        <el-input v-model="form.major" placeholder="请输入所学专业"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="职务职称" prop="zwzc">
+        <el-input v-model="form.zwzc" placeholder="请输入职务职称"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="12">
+      <el-form-item label="办公电话" prop="office_phone">
+        <el-input v-model="form.office_phone" placeholder="请输入办公电话"></el-input>
+      </el-form-item>
+    </el-col>
+    <el-col :span="24">
+      <el-form-item label="联系地址" prop="addr">
+        <el-input v-model="form.addr" placeholder="请输入联系地址"></el-input>
+      </el-form-item>
+    </el-col>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'user-1',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 5 - 0
src/plugins/components.js

@@ -2,11 +2,16 @@ import Vue from 'vue';
 import dataTable from '@common/src/components/frame/filter-page-table.vue';
 import dataForm from '@common/src/components/frame/form.vue';
 import eUpload from '@common/src/components/frame/e-upload.vue';
+import sUpload from '@common/src/components/frame/s-upload.vue';
+import eDialog from '@common/src/components/frame/e-dialog.vue';
+
 const Plugin = (vue) => {
   vue.prototype.$dev_mode = process.env.NODE_ENV === 'development';
   vue.component('data-table', dataTable);
   vue.component('data-form', dataForm);
   vue.component('eUpload', eUpload);
+  vue.component('sUpload', sUpload);
+  vue.component('eDialog', eDialog);
 };
 
 Vue.use(Plugin);

+ 51 - 19
src/router/index.js

@@ -7,18 +7,38 @@ VueRouter.prototype.push = function push(location) {
   return originalPush.call(this, location).catch((err) => err);
 };
 Vue.use(VueRouter);
+const userMenu = [];
+const adminMenu = [
+  {
+    path: '/admin/personal/user',
+    meta: { title: '个人用户' },
+    component: () => import('../views/admin/personal/user/index.vue'),
+  },
+  {
+    path: '/admin/personal/expert',
+    meta: { title: '专家用户' },
+    component: () => import('../views/admin/personal/expert/index.vue'),
+  },
+];
+const expertMenu = [];
 const web = [
   {
     path: '/',
     redirect: '/adminCenter/homeIndex',
   },
-  // 管理登录
+  // 登录
   {
     path: '/login',
     name: 'login',
     meta: { title: '管理登录' },
     component: () => import('../views/login.vue'),
   },
+  {
+    path: '/register',
+    name: 'register',
+    meta: { title: '注册' },
+    component: () => import('../views/register.vue'),
+  },
   // 管理中心
   {
     path: '/adminCenter/homeIndex',
@@ -31,6 +51,19 @@ const web = [
         meta: { title: '首页' },
         component: () => import('../views/adminCenter/homeIndex/index.vue'),
       },
+      {
+        path: '/system/basic',
+        meta: { title: '基本信息' },
+        component: () => import('../views/system/basic/index.vue'),
+      },
+      {
+        path: '/system/updatepd',
+        meta: { title: '修改密码' },
+        component: () => import('../views/system/updatepd/index.vue'),
+      },
+      ...userMenu,
+      ...adminMenu,
+      ...expertMenu,
     ],
   },
 ];
@@ -40,23 +73,22 @@ const router = new VueRouter({
   base: process.env.VUE_APP_ROUTER,
   routes,
 });
-// router.beforeEach((to, from, next) => {
-//   document.title = `${to.meta.title} `;
-//   const token = localStorage.getItem('token');
-//   if (to.path == '/adminCenter/homeIndex') {
-//     if (!token) {
-//       // next('/login');
-//       next();
-//     } else {
-//       let user = jwt.decode(token);
-//       store.commit('setUser', user, { root: true });
-//       next();
-//     }
-//   } else {
-//     let user = jwt.decode(token);
-//     store.commit('setUser', user, { root: true });
-//     next();
-//   }
-// });
+router.beforeEach((to, from, next) => {
+  document.title = `${to.meta.title} `;
+  const token = sessionStorage.getItem('token');
+  if (to.path == '/adminCenter/homeIndex') {
+    if (!token) {
+      next('/login');
+    } else {
+      let user = jwt.decode(token);
+      store.commit('setUser', user, { root: true });
+      next();
+    }
+  } else {
+    let user = jwt.decode(token);
+    store.commit('setUser', user, { root: true });
+    next();
+  }
+});
 
 export default router;

+ 4 - 1
src/store/index.js

@@ -2,6 +2,9 @@ import Vue from 'vue';
 import Vuex from 'vuex';
 import * as ustate from '@common/src/store/user/state';
 import * as umutations from '@common/src/store/user/mutations';
+import users from '@common/src/store/user';
+import admin from '@common/src/store/admin';
+import expert from '@common/src/store/expert';
 
 Vue.use(Vuex);
 
@@ -9,5 +12,5 @@ export default new Vuex.Store({
   state: { ...ustate },
   mutations: { ...umutations },
   actions: {},
-  modules: {},
+  modules: { users, admin, expert },
 });

+ 4 - 14
src/views/login copy.vue

@@ -1,13 +1,7 @@
 <template>
-  <div id="login">
+  <div id="index">
     <el-row>
-      <el-col :span="24" class="main">
-        <div class="w_1200">
-          <el-col :span="24" class="one">
-            <el-button type="primary" size="mini" @click="onSubmit">登录</el-button>
-          </el-col>
-        </div>
-      </el-col>
+      <el-col :span="24" class="main animate__animated animate__backInRight"> test </el-col>
     </el-row>
   </div>
 </template>
@@ -15,18 +9,14 @@
 <script>
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
-  name: 'login',
+  name: 'index',
   props: {},
   components: {},
   data: function () {
     return {};
   },
   created() {},
-  methods: {
-    onSubmit() {
-      this.$router.push({ path: '/adminCenter/homeIndex' });
-    },
-  },
+  methods: {},
   computed: {
     ...mapState(['user']),
   },

+ 122 - 0
src/views/admin/personal/user/index.vue

@@ -0,0 +1,122 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col :span="24" class="one">
+          <data-table :fields="fields" :opera="opera" :data="list" @query="search" :total="total" @view="toView" @check="toCheck" @del="toDel">
+            <!-- <template slot="selfbtn">
+              <el-button type="primary" size="mini" @click="toAdd()">添加</el-button>
+            </template> -->
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <e-dialog :dialog="dialog" @toClose="toClose">
+      <template v-slot:info>
+        <check-1 v-if="dialog.type == '1'" :form="form" @onSubmit="checkSubmit" @toReset="toClose"></check-1>
+        <info-1 v-else-if="dialog.type == '2'" :form="form"></info-1>
+      </template>
+    </e-dialog>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('users');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    check1: () => import('./parts/check-1.vue'),
+    info1: () => import('./parts/info-1.vue'),
+  },
+  data: function () {
+    return {
+      list: [],
+      total: 0,
+      opera: [
+        { label: '信息', method: 'view' },
+        { label: '审核', method: 'check', display: (i) => i.status == '0' },
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+      ],
+      fields: [
+        { label: '用户姓名', prop: 'name', filter: 'input' },
+        { label: '手机号', prop: 'phone', filter: 'input' },
+        { label: '身份证', prop: 'card', filter: 'input' },
+        { label: '电子邮箱', prop: 'email' },
+        { label: '联系地址', prop: 'addr' },
+        { label: '所在院系', prop: 'school' },
+        { label: '所学专业', prop: 'major' },
+        { label: '职务职称', prop: 'zwzc' },
+        { label: '办公电话', prop: 'office_phone' },
+        { label: '所属行业', prop: 'profession' },
+        {
+          label: '状态',
+          prop: 'status',
+          format: (i) => (i === '0' ? '待审中' : i === '1' ? '审核通过' : '审核拒绝'),
+        },
+      ],
+      // 弹框
+      dialog: { title: '审核信息', show: false, type: '1' },
+      // 审核
+      form: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 详细信息
+    async toView({ data }) {
+      let res = await this.fetch(data._id);
+      if (this.$checkRes(res)) this.$set(this, `form`, res.data);
+      this.dialog = { title: '详细信息', show: true, type: '2' };
+    },
+    // 审核
+    async toCheck({ data }) {
+      let res = await this.fetch(data._id);
+      if (this.$checkRes(res)) this.$set(this, `form`, res.data);
+      this.dialog = { title: '审核信息', show: true, type: '1' };
+    },
+    // 提交审核
+    async checkSubmit({ data }) {
+      let res = await this.update(data);
+      if (this.$checkRes(res, '审核信息成功', '审核信息失败')) this.toClose();
+    },
+    // 删除用户
+    async toDel({ data }) {
+      let res = await this.delete(data._id);
+      if (this.$checkRes(res, '删除信息成功', '删除信息失败')) this.search();
+    },
+    // 关闭
+    toClose() {
+      this.form = {};
+      this.dialog = { title: '审核信息', show: false, type: '1' };
+      this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 72 - 0
src/views/admin/personal/user/parts/check-1.vue

@@ -0,0 +1,72 @@
+<template>
+  <div id="form-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+          <el-form-item label="用户姓名" prop="name">
+            <el-input v-model="form.name" readonly></el-input>
+          </el-form-item>
+          <el-form-item label="审核状态" prop="status">
+            <el-radio-group v-model="form.status">
+              <el-radio label="0">待审中</el-radio>
+              <el-radio label="1">审核通过</el-radio>
+              <el-radio label="2">审核拒绝</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="mini" @click="onSubmit('form')">确定</el-button>
+            <el-button type="danger" size="mini" @click="toReset('form')">取消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'form-1',
+  props: { form: { type: Object } },
+  components: {},
+  data: function () {
+    return {
+      rules: {
+        status: [{ required: true, message: '请选择状态', trigger: 'change' }],
+      },
+    };
+  },
+  created() {},
+  methods: {
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.$emit('onSubmit', { data: this.form });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    toReset(formName) {
+      this.$refs[formName].resetFields();
+      this.$emit('toReset');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 93 - 0
src/views/admin/personal/user/parts/info-1.vue

@@ -0,0 +1,93 @@
+<template>
+  <div id="info-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form :model="form" label-width="auto">
+            <el-col :span="24">
+              <el-form-item label="用户姓名" prop="name">
+                <el-input v-model="form.name" placeholder="请输入用户姓名" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="手机号" prop="phone">
+                <el-input v-model="form.phone" placeholder="请输入手机号" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="身份证" prop="card">
+                <el-input v-model="form.card" placeholder="请输入身份证" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="电子邮箱" prop="email">
+                <el-input v-model="form.email" placeholder="请输入电子邮箱" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="所属行业" prop="profession">
+                <el-input v-model="form.profession" placeholder="请输入所属行业" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="所在院系" prop="school">
+                <el-input v-model="form.school" placeholder="请输入所在院系" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="所学专业" prop="major">
+                <el-input v-model="form.major" placeholder="请输入所学专业" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="职务职称" prop="zwzc">
+                <el-input v-model="form.zwzc" placeholder="请输入职务职称" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="办公电话" prop="office_phone">
+                <el-input v-model="form.office_phone" placeholder="请输入办公电话" readonly></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="联系地址" prop="addr">
+                <el-input v-model="form.addr" placeholder="请输入联系地址" readonly></el-input>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'info-1',
+  props: {
+    form: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 77 - 21
src/views/login.vue

@@ -4,25 +4,30 @@
       <el-col :span="24" class="main" :style="{ height: clientHeight + 'px' }">
         <div class="w_1200">
           <el-col :span="24" class="info">
-            <el-form class="form" v-model="form" ref="form" :rules="rules">
-              <el-form-item label="手机号" prop="phone">
-                <el-input v-model="form.phone" placeholder="请输入手机号"></el-input>
-              </el-form-item>
-              <el-form-item label="密码" prop="password">
-                <el-input v-model="form.password" placeholder="请输入登录密码" show-password></el-input>
-              </el-form-item>
-              <el-form-item label="手机号" prop="type">
-                <el-radio-group v-model="form.type">
-                  <el-radio label="1">个人用户</el-radio>
-                  <el-radio label="2">管理用户</el-radio>
-                  <el-radio label="3">专家用户</el-radio>
-                </el-radio-group>
-              </el-form-item>
-              <el-form-item>
-                <el-button type="success" size="small" @click="onSubmit('form')">提交登录</el-button>
-                <el-button type="primary" size="small" @click="toRegister()">去注册</el-button>
-              </el-form-item>
-            </el-form>
+            <el-col :span="24" class="form">
+              <el-col :span="24" class="txt">成果评价系统</el-col>
+              <el-col :span="24" class="form_1">
+                <el-form :model="form" ref="form" :rules="rules" label-width="auto">
+                  <el-form-item label="手机号" prop="phone">
+                    <el-input v-model="form.phone" placeholder="请输入手机号" size="small"></el-input>
+                  </el-form-item>
+                  <el-form-item label="密码" prop="password">
+                    <el-input v-model="form.password" placeholder="请输入登录密码" show-password size="small"></el-input>
+                  </el-form-item>
+                  <el-form-item label="用户类别" prop="type">
+                    <el-radio-group v-model="form.type">
+                      <el-radio label="1">个人用户</el-radio>
+                      <el-radio label="2">管理用户</el-radio>
+                      <el-radio label="3">专家用户</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                  <el-col :span="24" class="btn">
+                    <el-button type="primary" size="small" @click="onSubmit('form')">提交登录</el-button>
+                    <el-button type="danger" size="small" @click="toRegister()">去注册</el-button>
+                  </el-col>
+                </el-form>
+              </el-col>
+            </el-col>
           </el-col>
         </div>
       </el-col>
@@ -33,6 +38,9 @@
 <script>
 const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: users } = createNamespacedHelpers('users');
+const { mapActions: admin } = createNamespacedHelpers('admin');
+const { mapActions: expert } = createNamespacedHelpers('expert');
 export default {
   name: 'login',
   props: {},
@@ -52,8 +60,31 @@ export default {
   },
   async created() {},
   methods: {
+    ...users({ userLogin: 'login' }),
+    ...admin({ adminLogin: 'login' }),
+    ...expert({ expertLogin: 'login' }),
+
     // 提交登录
-    async onSubmit(formname) {},
+    onSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let data = this.form;
+          let res;
+          if (data.type == '1') res = await this.userLogin(data);
+          if (data.type == '2') res = await this.adminLogin(data);
+          if (data.type == '3') res = await this.expertLogin(data);
+          if (res.errcode === 0) {
+            this.$message({ type: `success`, message: `登录成功` });
+            this.$router.push({ path: '/adminCenter/homeIndex' });
+          } else {
+            this.$message({ type: `error`, message: `${res.errmsg}` });
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
     // 去注册
     toRegister() {
       this.$router.push({ path: 'register' });
@@ -81,7 +112,32 @@ export default {
   background-size: 100% 100%;
   overflow: auto;
   .info {
-    padding: 0 10%;
+    padding: 0 30%;
+    .form {
+      height: 430px;
+      box-shadow: 0 0 5px #ccc;
+      position: relative;
+      top: 150px;
+      background-color: hsla(0, 0%, 100%, 0.6235294117647059);
+      border-radius: 10px;
+      padding: 20px;
+      .txt {
+        text-align: center;
+        font-size: 20px;
+        padding: 20px 0;
+        font-weight: 700;
+        border-bottom: 1px solid #000;
+        margin: 0 0 15px 0;
+      }
+      .form_1 {
+        .el-form-item {
+          margin: 0 0 15px 0;
+        }
+        .btn {
+          text-align: center;
+        }
+      }
+    }
   }
 }
 </style>

+ 150 - 0
src/views/register.vue

@@ -0,0 +1,150 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main" :style="{ height: clientHeight + 'px' }">
+        <div class="w_1200">
+          <el-col :span="24" class="info">
+            <el-col :span="24" class="form">
+              <el-col :span="24" class="text">注册</el-col>
+              <el-col :span="24" class="form_1">
+                <el-form :model="form" :rules="rules" ref="form" label-width="auto">
+                  <el-col :span="24" class="label">
+                    <el-form-item label="用户类别" prop="type">
+                      <el-radio-group v-model="form.type">
+                        <el-radio label="1">个人用户</el-radio>
+                        <el-radio label="2">管理用户</el-radio>
+                        <el-radio label="3">专家用户</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                  <user-1 v-if="form.type == '1'" :form="form"></user-1>
+                  <admin-1 v-else-if="form.type == '2'" :form="form"></admin-1>
+                  <expert-1 v-else-if="form.type == '3'" :form="form"></expert-1>
+                  <el-col :span="24" class="btn">
+                    <el-button type="primary" size="small" @click="onSubmit('form')">提交注册</el-button>
+                    <el-button type="danger" size="small" @click="toLogin()">去登录</el-button>
+                  </el-col>
+                </el-form>
+              </el-col>
+            </el-col>
+          </el-col>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: users } = createNamespacedHelpers('users');
+const { mapActions: admin } = createNamespacedHelpers('admin');
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    user1: () => import('@/layout/register/user-1.vue'),
+    admin1: () => import('@/layout/register/admin-1.vue'),
+    expert1: () => import('@/layout/register/expert-1.vue'),
+  },
+  data: function () {
+    return {
+      // 页面高度
+      clientHeight: '',
+      form: { type: '1' },
+      rules: {
+        type: [{ required: true, message: '请选择用户类别', trigger: 'change' }],
+        name: [{ required: true, message: '请输入用户姓名', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+        password: [{ required: true, message: '请输入登录密码', trigger: 'blur' }],
+      },
+    };
+  },
+  created() {},
+  methods: {
+    ...users({ userCreate: 'create' }),
+    ...admin({ adminCreate: 'create' }),
+    ...expert({ expertCreate: 'create' }),
+    // 提交登录
+    onSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let data = this.form;
+          let res;
+          if (data.type == '1') res = await this.userCreate(data);
+          if (data.type == '2') res = await this.adminCreate(data);
+          if (data.type == '3') res = await this.expertCreate(data);
+          if (res.errcode === 0) {
+            this.$message({ type: `success`, message: `注册成功` });
+            this.toLogin();
+          } else {
+            this.$message({ type: `error`, message: `${res.errmsg}` });
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 去登录
+    toLogin() {
+      this.$router.push({ path: 'login' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</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: hidden;
+  .info {
+    background-color: #ffffff5f;
+    box-shadow: 0 0 5px #cccccc;
+    border-radius: 5px;
+    position: relative;
+    top: 100px;
+    padding: 10px;
+    .form {
+      .text {
+        text-align: center;
+        height: 80px;
+        line-height: 80px;
+        font-size: 25px;
+        border-bottom: 1px solid #000000;
+        margin: 0 0 10px 0;
+      }
+      .form_1 {
+        height: 620px;
+        overflow-y: auto;
+        .btn {
+          text-align: center;
+        }
+      }
+    }
+  }
+}
+</style>

+ 112 - 0
src/views/system/basic/index.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col :span="24" class="one">
+          <el-form :model="form" :rules="rules" ref="form" label-width="auto">
+            <user-1 v-if="type == '1'" :form="form"></user-1>
+            <admin-1 v-else-if="type == '2'" :form="form"></admin-1>
+            <expert-1 v-else-if="type == '3'" :form="form"></expert-1>
+            <el-col :span="24" class="btn">
+              <el-button type="primary" size="small" @click="onSubmit('form')">提交保存</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: users } = createNamespacedHelpers('users');
+const { mapActions: admin } = createNamespacedHelpers('admin');
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    user1: () => import('@/layout/register/user-1.vue'),
+    admin1: () => import('@/layout/register/admin-1.vue'),
+    expert1: () => import('@/layout/register/expert-1.vue'),
+  },
+  data: function () {
+    return {
+      // 用户类别
+      type: '',
+      // 用户信息
+      form: {},
+      rules: {
+        type: [{ required: true, message: '请选择用户类别', trigger: 'change' }],
+        name: [{ required: true, message: '请输入用户姓名', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+        password: [{ required: true, message: '请输入登录密码', trigger: 'blur' }],
+      },
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...users({ userFetch: 'fetch', userUpdate: 'update' }),
+    ...admin({ adminFetch: 'fetch', adminUpdate: 'update' }),
+    ...expert({ expertFetch: 'fetch', expertUpdate: 'update' }),
+    async search() {
+      let type = sessionStorage.getItem('type');
+      if (type) this.$set(this, `type`, type);
+      let res;
+      if (type == '1') res = await this.userFetch(this.user.id);
+      else if (type == '2') res = await this.adminFetch(this.user.id);
+      else if (type == '3') res = await this.expertFetch(this.user.id);
+      if (res.errcode === 0) {
+        this.$set(this, `form`, res.data);
+      } else {
+        this.$message({ type: `error`, message: `${res.errmsg}` });
+      }
+    },
+    onSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let data = this.form;
+          let res;
+          if (this.type == '1') res = await this.userUpdate(data);
+          if (this.type == '2') res = await this.adminUpdate(data);
+          if (this.type == '3') res = await this.expertUpdate(data);
+          if (res.errcode === 0) {
+            this.$message({ type: `success`, message: `修改信息成功,重新登录方可同步信息` });
+            this.search();
+          } else {
+            this.$message({ type: `error`, message: `${res.errmsg}` });
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    .btn {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 99 - 0
src/views/system/updatepd/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col :span="24" class="one">
+          <el-form :model="form" :rules="rules" ref="form" label-width="auto">
+            <el-col :span="24">
+              <el-form-item label="新密码" prop="password">
+                <el-input v-model="form.password" placeholder="请输入新密码" show-password></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24" class="btn">
+              <el-button type="primary" size="small" @click="onSubmit('form')">提交保存</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: users } = createNamespacedHelpers('users');
+const { mapActions: admin } = createNamespacedHelpers('admin');
+const { mapActions: expert } = createNamespacedHelpers('expert');
+
+export default {
+  name: 'index',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      // 用户类别
+      type: '',
+      // 用户信息
+      form: {},
+      rules: {
+        password: [{ required: true, message: '请输入新密码', trigger: 'blur' }],
+      },
+    };
+  },
+  created() {
+    let type = sessionStorage.getItem('type');
+    if (type) this.$set(this, `type`, type);
+  },
+  methods: {
+    ...users({ userUpdatepd: 'updatepd' }),
+    ...admin({ adminUpdatepd: 'updatepd' }),
+    ...expert({ expertUpdatepd: 'updatepd' }),
+    onSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let data = this.form;
+          data._id = this.user._id;
+          let res;
+          if (this.type == '1') res = await this.userUpdatepd(data);
+          if (this.type == '2') res = await this.adminUpdatepd(data);
+          if (this.type == '3') res = await this.expertUpdatepd(data);
+          if (res.errcode === 0) {
+            this.$message({ type: `success`, message: `密码修改成功` });
+            sessionStorage.removeItem('token');
+            sessionStorage.removeItem('type');
+            this.$router.push('/login');
+          } else {
+            this.$message({ type: `error`, message: `${res.errmsg}` });
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    .btn {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 3 - 3
vue.config.js

@@ -20,10 +20,10 @@ module.exports = {
     port: '8001',
     proxy: {
       '/files': {
-        target: 'http://broadcast.waityou24.cn',
+        target: 'http://broadcast.kqyjy.com',
       },
-      'achieveAdmin/api': {
-        target: 'http://127.0.0.1:13011',
+      '/achieveAdmin/api': {
+        target: 'http://broadcast.kqyjy.com',
         changeOrigin: true,
         ws: false,
       },