wuhongyu 5 年之前
父節點
當前提交
5d488cb5f1

文件差異過大導致無法顯示
+ 0 - 12043
package-lock.json


+ 12 - 3
src/layout/common/top.vue

@@ -6,8 +6,14 @@
           <span class="date">{{ data }}</span>
         </el-col>
         <el-col :span="12" class="login">
-          <el-button size="mini" @click="$router.push({ path: '/login' })">登录</el-button>
-          <el-button size="mini" @click="$router.push({ path: '/register' })">注册</el-button>
+          <span v-if="user.uid == null">
+            <el-button size="mini" @click="$router.push({ path: '/login' })">登录</el-button>
+            <el-button size="mini" @click="$router.push({ path: '/register' })">注册</el-button>
+          </span>
+          <span v-else>
+            <span style="padding:0 15px 0 0;">{{ user.name }}</span>
+            <el-button @click="$router.push({ path: '/pcenter/index' })">个人中心</el-button>
+          </span>
         </el-col>
       </div>
     </el-col>
@@ -31,6 +37,7 @@
 
 <script>
 import moment from 'moment';
+import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'logo',
   props: {},
@@ -44,7 +51,9 @@ export default {
   created() {
     this.searchdate();
   },
-  computed: {},
+  computed: {
+    ...mapState(['user']),
+  },
   methods: {
     searchdate() {
       let date = moment().format('YYYY-MM-DD ');

+ 21 - 4
src/router/index.js

@@ -1,5 +1,6 @@
 import Vue from 'vue';
 import VueRouter from 'vue-router';
+import store from '@/store/index';
 
 Vue.use(VueRouter);
 
@@ -12,6 +13,7 @@ const routes = [
   // 登录
   {
     path: '/login',
+    name: 'login',
     meta: { title: '登录', subSite: true },
     component: () => import('../views/login.vue'),
   },
@@ -76,7 +78,7 @@ const routes = [
   // 个人中心
   {
     path: '/pcenter/index',
-    name: '个人中心',
+    name: 'pcenter_center',
     component: () => import('../views/pcenter/index.vue'),
   },
 ];
@@ -86,8 +88,23 @@ const router = new VueRouter({
   base: process.env.NODE_ENV === 'development' ? '' : process.env.VUE_APP_ROUTER,
   routes,
 });
-// const router = new VueRouter({
-//   routes,
-// });
+router.beforeEach((to, form, next) => {
+  if (to.name === 'pcenter_center') {
+    store.commit('setUser');
+    if (to.name === 'login') {
+      next();
+      return;
+    }
+    let user = store.state.user;
+    if (user) {
+      next();
+    }
+    //下面是没登录的情况,需要跳转页面到用户未登录页
+    else next({ name: 'login' });
+  } else {
+    store.commit('setUser');
+    next();
+  }
+});
 
 export default router;

+ 2 - 0
src/store/index.js

@@ -5,6 +5,7 @@ import * as umutations from './user/mutations';
 import registers from './registers';
 import department from './department';
 import level from './level';
+import login from './login';
 
 Vue.use(Vuex);
 
@@ -14,6 +15,7 @@ export default new Vuex.Store({
   actions: {},
   modules: {
     registers,
+    login,
     department,
     level,
   },

+ 90 - 0
src/store/login.js

@@ -0,0 +1,90 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import axios from 'axios';
+import _ from 'lodash';
+import { Notification } from 'element-ui';
+const jwt = require('jsonwebtoken');
+Vue.use(Vuex);
+const api = {
+  interface: `/api/count/user/login`,
+  logout: '/api/count/user/logout',
+  updatePassword: '/api/count/user/uppasswd',
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  /**
+    user:Object required 登陆信息 
+    router:router 如果跳转就传
+    path:String 跳转到的路由位置
+    needReturn: Boolean 是否返回结果
+    typeCheck: Boolean 是否检查身份对应匹配的前端项目
+    isWx: Boolean 是否是微信登陆
+    needNotice:Boolean 是否需要提示
+   */
+  async login({ commit, dispatch }, { user, router, path = '/', needReturn = false, typeCheck = false, isWx = false, needNotice = true }) {
+    let res;
+    //wx登陆,openid存在,user中是openid和qrcode;正常登陆,user中是mobile和passwd
+    res = await this.$axios.$post(`${api.interface}`, user);
+    const setUser = async (token, commit) => {
+      localStorage.setItem('token', token);
+    };
+    let userInfo = {};
+    if (res.errcode == '0') {
+      setUser(res.data, commit);
+      Notification({
+        title: '登录成功',
+        type: 'success',
+        duration: 2000,
+      });
+      return true;
+    } else {
+      if (needReturn) return res;
+      else {
+        Notification({
+          title: '登录失败',
+          message: `失败原因:${res.errmsg || '登陆失败'}`,
+          type: 'error',
+        });
+        return false;
+      }
+    }
+  },
+  async logout({ commit }, payload) {
+    let key = localStorage.removeItem('token');
+    const res = await this.$axios.$post(api.logout, { key: key });
+    commit('deleteUser');
+  },
+  async update({ commit }, payload) {
+    let res = await this.$axios.$post(`${api.updatePassword}`, {
+      data: payload,
+    });
+    return res;
+  },
+  async bind({ commit }, payload) {
+    let res = await this.$axios.$post(`${api.bind}`, payload);
+    return res;
+  },
+  async userBind({ commit }, payload) {
+    let res = await this.$axios.$post(`${api.userBind}`, payload);
+    return res;
+  },
+  async getQrcode({ commit }, payload) {
+    let res = await this.$axios.$get(`${api.connection}`);
+    if (res.errcode === 0) return res.data;
+    else {
+      console.warn('请求qrcode失败');
+    }
+  },
+  async wxCheck({ commit }, payload) {
+    let res = await this.$axios.$post(`${api.wxCheck}`, payload);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 1 - 1
src/store/user/mutations.js

@@ -1,7 +1,7 @@
 const jwt = require('jsonwebtoken');
 export const setUser = (state, payload) => {
   let res = true;
-  //登陆时
+  // 登陆时;
   if (payload) {
     state.token = payload;
   } else {

+ 0 - 1
src/store/user/state.js

@@ -1,2 +1 @@
 export const user = {};
-export const menuList = [];

+ 12 - 3
src/views/login.vue

@@ -48,6 +48,7 @@ import top from '@/layout/common/top.vue';
 import menus from '@/layout/common/menus.vue';
 import foot from '@/layout/common/foot.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: login } = createNamespacedHelpers('login');
 export default {
   name: 'login',
   props: {},
@@ -65,12 +66,20 @@ export default {
       },
     };
   },
-  created() {},
+  created() {
+    console.log(this.user);
+  },
   methods: {
+    ...login({ toLogin: 'login' }),
     submitForm(formName) {
-      this.$refs[formName].validate(valid => {
+      this.$refs[formName].validate(async valid => {
         if (valid) {
-          alert('submit!');
+          let res = await this.toLogin({ user: this.form });
+          if (res) {
+            this.$router.push({ path: '/' });
+          } else {
+            // this.$router.push({ path: '/login' });
+          }
         } else {
           console.log('error submit!!');
           return false;

+ 28 - 7
src/views/pcenter/index.vue

@@ -64,25 +64,27 @@
             </el-col>
             <el-col :span="18" class="right">
               <span v-if="columnName == '基本信息'">
-                基本信息
+                <el-col :span="24" class="infoTop"> <span>|</span><span>基本信息</span> </el-col>
+                <pinfo></pinfo>
               </span>
               <span v-else-if="columnName == '需求管理'">
-                需求管理
+                <el-col :span="24" class="infoTop"> <span>|</span><span>需求管理</span> </el-col>
               </span>
               <span v-else-if="columnName == '信息管理'">
-                信息管理
+                <el-col :span="24" class="infoTop"> <span>|</span><span>信息管理</span> </el-col>
               </span>
               <span v-else-if="columnName == '人员管理'">
-                人员管理
+                <el-col :span="24" class="infoTop"> <span>|</span><span>人员管理</span> </el-col>
               </span>
               <span v-else-if="columnName == '部门管理'">
-                部门管理
+                <el-col :span="24" class="infoTop"> <span>|</span><span>部门管理</span> </el-col>
               </span>
               <span v-else-if="columnName == '职务管理'">
-                职务管理
+                <el-col :span="24" class="infoTop"> <span>|</span><span>职务管理</span> </el-col>
               </span>
               <span v-else-if="columnName == '修改密码'">
-                修改密码
+                <el-col :span="24" class="infoTop"> <span>|</span><span>修改密码</span> </el-col>
+                <uppasswd></uppasswd>
               </span>
               <span v-else-if="columnName == '退出登录'">
                 退出登录
@@ -103,6 +105,8 @@
 <script>
 import top from '@/layout/common/top.vue';
 import foot from '@/layout/common/foot.vue';
+import pinfo from '@/views/pcenter/pinfo.vue';
+import uppasswd from '@/views/pcenter/uppasswd.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'detail',
@@ -110,6 +114,8 @@ export default {
   components: {
     top,
     foot,
+    pinfo,
+    uppasswd,
   },
   data: function() {
     return {
@@ -209,4 +215,19 @@ export default {
     height: 135px;
   }
 }
+.infoTop {
+  height: 50px;
+  border-bottom: 1px dashed #ccc;
+  margin: 0 auto;
+  margin-bottom: 20px;
+  float: none;
+  width: 98%;
+  padding: 20px 0 5px 0;
+}
+.infoTop span {
+  font-size: 20px;
+  color: #005293;
+  font-weight: bold;
+  margin-right: 10px;
+}
 </style>

+ 154 - 0
src/views/pcenter/pinfo.vue

@@ -0,0 +1,154 @@
+<template>
+  <div id="pinfo">
+    <el-row>
+      <el-col :span="24">
+        <el-form ref="form" :model="form" label-width="120px" :rules="rules">
+          <el-form-item label="用户名:" prop="name">
+            <el-input v-model="form.name"></el-input>
+          </el-form-item>
+          <el-form-item label="手机号:" prop="phone">
+            <el-input v-model="form.phone"></el-input
+            ><span style="color:red;"
+              ><i class="el-icon-warning" style="margin-right:5px;"></i>如果您修改手机号,那么登录时使用的手机号也会发生变更,请谨慎修改!</span
+            >
+          </el-form-item>
+          <el-form-item label="身份证号:" prop="id_number">
+            <el-input v-model="form.id_number" @input="inputIdnumber()"></el-input>
+          </el-form-item>
+          <el-form-item label="出生年月" prop="birthday">
+            <el-date-picker disabled v-model="form.birthday" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" placeholder="请选择选择日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="性别" prop="gender">
+            <el-radio-group disabled v-model="form.gender">
+              <el-radio label="男">男</el-radio>
+              <el-radio label="女">女</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="家庭住址:">
+            <el-input v-model="form.address"></el-input>
+          </el-form-item>
+          <el-form-item label="部门:">
+            <el-select v-model="form.dept_id" filterable placeholder="请选择部门">
+              <el-option v-for="(item, index) in deptList" :key="index" :label="item.name" :value="item._id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="职务:">
+            <el-select v-model="form.level_id" filterable placeholder="请选择职务">
+              <el-option v-for="(item, index) in levelList" :key="index" :label="item.name" :value="item._id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="邮箱" prop="email">
+            <el-input v-model="form.email"></el-input>
+          </el-form-item>
+          <el-form-item label="头像" prop="img_url">
+            <upload :limit="1" :data="form.img_url" type="img_url" :url="'/files/count/upload'" @upload="uploadSuccess"></upload>
+          </el-form-item>
+          <el-form-item label="职称级别">
+            <el-input v-model="form.level"></el-input>
+          </el-form-item>
+          <el-form-item label="职称名称">
+            <el-input v-model="form.levelname"></el-input>
+          </el-form-item>
+          <el-form-item label="院校">
+            <el-input v-model="form.school"></el-input>
+          </el-form-item>
+          <el-form-item label="学历">
+            <el-select v-model="form.education" placeholder="请选择学历">
+              <el-option v-for="(item, index) in educationList" :key="index" :label="item.name" :value="item.name"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="学位">
+            <el-select v-model="form.degree" placeholder="请选择学位">
+              <el-option v-for="(item, index) in degreeList" :key="index" :label="item.name" :value="item.name"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="专业">
+            <el-input v-model="form.major"></el-input>
+          </el-form-item>
+          <el-form-item label="从事专业">
+            <el-input v-model="form.profession"></el-input>
+          </el-form-item>
+          <el-form-item label="工作简历">
+            <el-input v-model="form.resume" type="textarea"></el-input>
+          </el-form-item>
+          <el-form-item label="项目">
+            <el-input v-model="form.project" type="textarea"></el-input>
+          </el-form-item>
+          <el-form-item label="学术成就">
+            <el-input v-model="form.academic" type="textarea"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/uploadone.vue';
+export default {
+  name: 'pinfo',
+  props: {},
+  components: { upload },
+  data: () => ({
+    form: {},
+    deptList: [],
+    levelList: [],
+    educationList: [{ name: '中专及以上' }, { name: '大专及以上' }, { name: '本科及以上' }, { name: '研究生及以上' }],
+    degreeList: [{ name: '博士学位' }, { name: '硕士学位' }, { name: '学士学位' }, { name: '其他' }],
+    rules: {
+      name: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
+      id_number: [
+        { required: true, message: '请输入身份证号', trigger: 'blur' },
+        {
+          pattern: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/,
+          message: '请输入有效的身份证号',
+        },
+      ],
+      phone: [
+        { required: true, message: '请输入手机号', trigger: 'blur' },
+        { pattern: /^1\d{10}$/, message: '请输入有效的手机号' },
+      ],
+      gender: [{ required: true, message: '请选择性别', trigger: 'blur' }],
+      birthday: [{ required: true, message: '请选择出生年月', trigger: 'blur' }],
+      email: [{ required: false }, { pattern: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/, message: '请输入有效的邮箱' }],
+    },
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    inputIdnumber() {
+      let card = this.form.id_number;
+      if (card.length == 18) {
+        let birth = card.substring(6, 10) + '-' + card.substring(10, 12) + '-' + card.substring(12, 14);
+        let gender = parseInt(card.substr(16, 1)) % 2 == 1 ? '男' : '女';
+        let myDate = new Date();
+        let month = myDate.getMonth() + 1;
+        let day = myDate.getDate();
+        let age = myDate.getFullYear() - card.substring(6, 10) - 1;
+        if (card.substring(10, 12) < month || (card.substring(10, 12) == month && card.substring(12, 14) <= day)) {
+          age++;
+        }
+        this.form.birthday = birth;
+        this.form.gender = gender;
+      }
+    },
+    onSubmit() {},
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-input__inner {
+  width: 600px;
+}
+/deep/ .el-textarea__inner {
+  width: 600px;
+}
+</style>

+ 61 - 0
src/views/pcenter/uppasswd.vue

@@ -0,0 +1,61 @@
+<template>
+  <div id="uppasswd">
+    <el-row>
+      <el-col :span="24">
+        <el-form ref="form" :model="form" label-width="120px" :rules="rules">
+          <el-form-item label="新密码" prop="newpasswd">
+            <el-input v-model="form.newpasswd" show-password></el-input>
+          </el-form-item>
+          <el-form-item label="确认密码" prop="newpasswd">
+            <el-input v-model="form._newpasswd" @input="insurePasswd()" show-password></el-input>
+            <span v-if="display" style="color:red;"
+              ><i class="el-icon-warning" style="margin-right:5px;"></i>两次输入密码不一致,请检查两次输入的密码并重新输入!</span
+            >
+          </el-form-item>
+          <el-form-item label="旧密码" prop="oldpasswd">
+            <el-input v-model="form.oldpasswd" show-password></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'uppasswd',
+  props: {},
+  components: {},
+  data: () => ({
+    form: {},
+    rules: {
+      newpasswd: [{ required: true, message: '请输入新密码', trigger: 'blur' }],
+      oldpasswd: [{ required: true, message: '请输入旧密码', trigger: 'blur' }],
+    },
+    display: false,
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    insurePasswd() {
+      let newpasswd = this.form.newpasswd;
+      let _newpasswd = this.form._newpasswd;
+      if (newpasswd != _newpasswd) {
+        this.display = true;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-input__inner {
+  width: 600px;
+}
+/deep/.el-form-item__content {
+  width: 600px;
+}
+</style>

+ 0 - 1
src/views/register.vue

@@ -240,7 +240,6 @@ export default {
             this.$router.push({ path: '/login' });
           }
         } else {
-          console.log('error submit!!');
           return false;
         }
       });