lrf402788946 %!s(int64=5) %!d(string=hai) anos
pai
achega
223047ccb1

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
     "axios": "^0.19.2",
     "core-js": "^3.4.4",
     "element-ui": "^2.13.0",
+    "jsonwebtoken": "^8.5.1",
     "lodash": "^4.17.15",
     "naf-core": "^0.1.2",
     "vue": "^2.6.10",

+ 15 - 1
src/App.vue

@@ -4,15 +4,29 @@
   </div>
 </template>
 <script>
+import { createNamespacedHelpers } from 'vuex';
+import _ from 'lodash';
+const { mapActions } = createNamespacedHelpers('login');
 export default {
   name: 'App',
   components: {},
+  created() {
+    this.toLogin();
+  },
+  methods: {
+    ...mapActions(['login']),
+    async toLogin() {
+      let object = { mobile: '13089419810', passwd: '1qaz2wsx' };
+      let res = await this.login(object);
+      if (_.isBoolean(res)) console.log('登陆成功');
+      else this.$message.warning(res.errmsg);
+    },
+  },
 };
 </script>
 
 <style lang="less">
 html {
-  overflow: hidden;
   body {
     margin: 0;
     padding: 0;

+ 22 - 1
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);
 
@@ -69,6 +70,12 @@ const routes = [
         meta: { title: '学生', sub: '详情' },
         component: () => import('@/views/student/detail.vue'),
       },
+      {
+        path: '/school/info',
+        name: 'school_info',
+        meta: { title: '学校', sub: '资料' },
+        component: () => import('@/views/info/index.vue'),
+      },
     ],
   },
 ];
@@ -78,5 +85,19 @@ const router = new VueRouter({
   base: process.env.NODE_ENV === 'development' ? '' : process.env.VUE_APP_ROOT_URL + 'school',
   routes,
 });
-
+router.beforeEach((to, form, next) => {
+  store.commit('setUser');
+  let user = store.state.user;
+  if (user) {
+    if (to.path === '/school/info') {
+      next();
+    } else {
+      let { status } = user;
+      if (status === '0') next('/school/info');
+      else next();
+    }
+  }
+  //下面是没登录的情况,需要跳转页面到用户未登录页
+  else next();
+});
 export default router;

+ 21 - 3
src/store/index.js

@@ -6,12 +6,30 @@ import trainplan from '@frame/store/trainplan';
 import classes from '@frame/store/classes';
 import schPlan from '@frame/store/sch-plan';
 import schimport from '@frame/store/sch-import';
+import login from '@frame/store/login';
 
 Vue.use(Vuex);
 
 export default new Vuex.Store({
-  state: {},
-  mutations: {},
+  modules: { student, teacher, trainplan, schPlan, schimport, classes, login },
+  state: { user: {} },
+  mutations: {
+    setUser(state, payload) {
+      let res = true;
+      //登陆时
+      if (payload) state.user = payload;
+      else {
+        //已经登陆,切换路由时取出用户信息放在总store中
+        let user = sessionStorage.getItem('user');
+        if (user) state.user = JSON.parse(user);
+        else {
+          res = false;
+          state.user = undefined;
+          console.warn('用户未登录');
+        }
+      }
+      return res;
+    },
+  },
   actions: {},
-  modules: { student, teacher, trainplan, schPlan, schimport, classes },
 });

+ 0 - 38
src/store/sch-import.js

@@ -1,38 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import _ from 'lodash';
-Vue.use(Vuex);
-const api = {
-  interface: `/api/train/school/import`,
-};
-const state = () => ({});
-const mutations = {};
-
-const actions = {
-  async query({ commit }, { skip = 0, limit, ...info } = {}) {
-    const res = await this.$axios.$get(`${api.interface}`, { skip, limit, ...info });
-    return res;
-  },
-  async create({ commit }, payload) {
-    const res = await this.$axios.$post(`${api.interface}`, payload);
-    return res;
-  },
-  async fetch({ commit }, payload) {
-    const res = await this.$axios.$get(`${api.interface}/${payload}`);
-    return res;
-  },
-  async update({ commit }, { id, ...data }) {
-    const res = await this.$axios.$post(`${api.interface}/update/${id}`, data);
-    return res;
-  },
-  async delete({ commit }, payload) {
-    const res = await this.$axios.$delete(`${api.interface}/${payload}`);
-    return res;
-  },
-};
-export default {
-  namespaced: true,
-  state,
-  mutations,
-  actions,
-};

+ 0 - 38
src/store/sch-plan.js

@@ -1,38 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import _ from 'lodash';
-Vue.use(Vuex);
-const api = {
-  interface: `/api/train/schtime`,
-};
-const state = () => ({});
-const mutations = {};
-
-const actions = {
-  async query({ commit }, { skip = 0, limit, ...info } = {}) {
-    const res = await this.$axios.$get(`${api.interface}`, { skip, limit, ...info });
-    return res;
-  },
-  async create({ commit }, payload) {
-    const res = await this.$axios.$post(`${api.interface}`, payload);
-    return res;
-  },
-  async fetch({ commit }, payload) {
-    const res = await this.$axios.$get(`${api.interface}/${payload}`);
-    return res;
-  },
-  async update({ commit }, { id, ...data }) {
-    const res = await this.$axios.$post(`${api.interface}/update/${id}`, data);
-    return res;
-  },
-  async delete({ commit }, payload) {
-    const res = await this.$axios.$delete(`${api.interface}/${payload}`);
-    return res;
-  },
-};
-export default {
-  namespaced: true,
-  state,
-  mutations,
-  actions,
-};

+ 75 - 0
src/views/info/index.vue

@@ -0,0 +1,75 @@
+<template>
+  <div id="index">
+    <el-card style="margin:10px;">
+      <template #header>
+        <el-row>
+          <el-col style="font-size:24px" :span="24">完善学校人员资料</el-col>
+        </el-row>
+      </template>
+      <el-row type="flex" justify="center">
+        <el-col style="font-size:24px" :span="10">
+          <data-form style="padding:20px;" :data="info" :fields="fields" :rules="rules" @save="handleSave" :isNew="true"> </data-form>
+        </el-col>
+      </el-row>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import dataForm from '@frame/components/form';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import _ from 'lodash';
+const { mapActions } = createNamespacedHelpers('login');
+
+export default {
+  metaInfo: { title: '填写资料' },
+  name: 'index',
+  props: {},
+  components: { dataForm },
+  data: () => ({
+    info: {},
+    fields: [
+      { label: '手机号', required: true, model: 'mobile', options: { minLength: 11, maxlength: 11 } },
+      { label: '密码', required: true, model: 'passwd', type: 'password' },
+    ],
+    rules: {
+      mobile: [
+        { required: true, message: '请输入手机号' },
+        { min: 11, max: 11, message: '请输入11位手机号码', trigger: 'blur' },
+      ],
+      passwd: [
+        { required: true, message: '请输入密码' },
+        { min: 6, message: '密码最少6位', trigger: 'blur' },
+      ],
+    },
+  }),
+  created() {},
+  methods: {
+    ...mapActions(['login', 'update']),
+    async handleSave({ data }) {
+      let res = await this.update({ id: this.user.id, ...data });
+      if (this.$checkRes(res)) {
+        res = await this.login(data);
+        if (!_.isBoolean(res)) this.$message.warning(res.errmsg);
+        else this.$router.push({ path: '/' });
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    mainTitle() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      let sub = meta.sub || '';
+      return `${main}${sub}`;
+    },
+    keyWord() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      return main;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 2 - 1
src/views/leave/index.vue

@@ -26,7 +26,7 @@
 <script>
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
-import { createNamespacedHelpers } from 'vuex';
+import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions } = createNamespacedHelpers('dept');
 export default {
   metaInfo: { title: '请假管理' },
@@ -58,6 +58,7 @@ export default {
   }),
   created() {},
   computed: {
+    ...mapState(['user']),
     mainTitle() {
       let meta = this.$route.meta;
       let main = meta.title || '';

+ 38 - 8
src/views/leave/stud.vue

@@ -1,9 +1,12 @@
 <template>
   <div id="stud">
-    <detail-frame :title="mainTitle" returns="/leave/list">
+    <detail-frame :title="mainTitle" returns="/leave/index">
       <data-form :data="info" :fields="fields" :needSave="false" :isNew="false">
         <template #custom="{ item, form }">
           <template v-if="item.model === 'gender'">{{ form[item.model] }}</template>
+          <template v-if="item.model === 'family_is_hard' || item.model === 'have_grant' || item.model === 'is_fine'">
+            {{ form[item.model] === '1' ? '是' : '否' }}
+          </template>
         </template>
         <template #submit>
           <el-row type="flex" justify="middle" align="center">
@@ -31,15 +34,42 @@ export default {
   props: {},
   components: { detailFrame, dataForm },
   data: () => ({
-    info: { name: '测试学生1', gender: 0, reason: '发烧', time: '2020-05-01 - 2020-05-01' },
+    info: {
+      meta: { state: 0, createdAt: '2020-02-21T02:14:33.399Z', updatedAt: '2020-02-21T02:14:33.399Z' },
+      _id: '5e4f3d096a90e861b0f30871',
+      name: '测试学生1',
+      id_number: '123456789075432356',
+      phone: '12345678901',
+      gender: '男',
+      nation: '汉族',
+      schoolid: '5e4f3d096a90e861b0f30871',
+      school_name: '测试学校',
+      major: '测试专业',
+      entry_year: '2020',
+      finish_year: '2024',
+      school_job: '测试职务',
+      qq: '111111111',
+      email: '111111111@qq.com',
+      openid: '1582250550125',
+      family_place: '测试所在地',
+      family_is_hard: '1',
+      have_grant: '1',
+      job: '职务',
+      is_fine: '1',
+      termid: '5e478e5e83f0ea554c2158eb',
+      batchid: '5e44d9bd275c2f5514ec25c5',
+      classid: '5e4df0c93ffa245d6065f526',
+      __v: 0,
+      id: '5e4f3d096a90e861b0f30871',
+    },
     fields: [
       { label: '姓名', model: 'name', type: 'text' },
       { label: '性别', model: 'gender', custom: true },
-      // { label: '民族', model: 'nation', type: 'select' },
+      { label: '民族', model: 'nation', type: 'text' },
       { label: '身份证号', model: 'id_number', options: { maxlength: 18 }, type: 'text' },
-      // { label: '学校', model: 'school_name', type: 'select' },
-      // { label: '院系', model: 'yard', type: 'select' },
-      // { label: '专业', model: 'major', type: 'select' },
+      { label: '学校', model: 'school_name', type: 'text' },
+      // { label: '院系', model: 'yard', type: 'text' },
+      // { label: '专业', model: 'major', type: 'text' },
       { label: '入学年份', model: 'entry_year', type: 'text' },
       { label: '毕业年份', model: 'finish_year', type: 'text' },
       { label: '在校曾担任何种职务', model: 'school_job', type: 'text' },
@@ -47,8 +77,8 @@ export default {
       { label: 'QQ号', model: 'qq', type: 'text' },
       { label: '邮箱', model: 'email', type: 'text' },
       { label: '家庭所在地', model: 'family_place', type: 'text' },
-      { label: '家庭是否困难', model: 'family_is_hard', type: 'text' },
-      { label: '是否获得过助学金', model: 'have_grant', type: 'text' },
+      { label: '家庭是否困难', model: 'family_is_hard', custom: true },
+      { label: '是否获得过助学金', model: 'have_grant', custom: true },
       { label: '职务', model: 'job', type: 'text' },
       { label: '期', model: 'term', type: 'text' },
       { label: '批次', model: 'batch', type: 'text' },

+ 4 - 6
src/views/plan/detail.vue

@@ -45,7 +45,7 @@ import detailFrame from '@frame/layout/admin/detail-frame';
 import calendar from '@frame/components/calendar';
 import dataTable from '@frame/components/data-table';
 import _ from 'lodash';
-import { createNamespacedHelpers } from 'vuex';
+import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions } = createNamespacedHelpers('trainplan');
 const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
 export default {
@@ -76,7 +76,6 @@ export default {
   }),
   created() {
     this.search();
-    //TODO 正常来说:我是根据计划进来的,我需要查的不仅是计划的信息,还需要根据计划id和用户id查询出我曾经添加过的信息做回显及修改
     this.searchSch();
   },
   mounted() {},
@@ -88,7 +87,7 @@ export default {
       schPlanUpdate: 'update',
     }),
     async searchSch() {
-      let res = await this.schQuery({ planid: this.id, schid: '99991' });
+      let res = await this.schQuery({ planid: this.id, schid: _.get(this.user, 'schid', '99991') });
       if (this.$checkRes(res)) {
         let data = JSON.parse(JSON.stringify(res.data));
         if (res.data.length > 0) {
@@ -206,11 +205,9 @@ export default {
         i._id ? (obj.id = i._id) : '';
         return obj;
       });
-      // TODO 修改schoolid为登录用户的id
-      let object = { year, planid: _id, remark, term: arr, schid: '99991' };
+      let object = { year, planid: _id, remark, term: arr, schid: _.get(this.user, 'schid', '99991') };
       let res;
       let msg;
-      //TODO 连接接口
       //需要找到条件判断是修改还是添加,默认先修改看看出现什么情况
       if (!schplanid) {
         res = this.schPlanCreate(object);
@@ -251,6 +248,7 @@ export default {
     },
   },
   computed: {
+    ...mapState(['user']),
     widths() {
       let width = (document.body.clientWidth - 200) * 0.5;
       return width > 400 ? width : 400;

+ 1 - 1
src/views/scganli/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div id="index">
-    <list-frame :title="mainTitle" @query="search" :needPag="false" :needFilter="false" :needAdd="false">
+    <list-frame :title="mainTitle" returns="/plan/index" @query="search" :needPag="false" :needFilter="false" :needAdd="false">
       <data-table :fields="fields" :data="list" :opera="opera" @update="toUpdate" @list="toList"></data-table>
     </list-frame>
     <el-dialog title="上传名单" :visible.sync="dialog" @close="toClose" v-if="dialog">

+ 2 - 2
src/views/student/detail.vue

@@ -39,9 +39,9 @@ export default {
     fields: [
       { label: '姓名', required: true, model: 'name' },
       { label: '性别', required: true, model: 'gender', type: 'radio' },
-      // { label: '民族', required: true, model: 'nation', type: 'select' },
+      { label: '民族', required: true, model: 'nation', type: 'select' },
       { label: '身份证号', required: true, model: 'id_number', options: { maxlength: 18 } },
-      // { label: '学校', required: true, model: 'school_name', type: 'select' },
+      { label: '学校', required: true, model: 'school_name', type: 'select' },
       // { label: '院系', required: true, model: 'yard', type: 'select' },
       // { label: '专业', required: true, model: 'major', type: 'select' },
       { label: '入学年份', required: true, model: 'entry_year', type: 'year' },