浏览代码

Merge branch 'master' of http://git.cc-lotus.info/new_train/frame

reloaded 5 年之前
父节点
当前提交
311593962e
共有 9 个文件被更改,包括 254 次插入75 次删除
  1. 21 18
      components/form.md
  2. 74 55
      components/form.vue
  3. 32 1
      config/menu-config.js
  4. 2 0
      config/other.js
  5. 7 1
      layout/admin/fw-admin.vue
  6. 21 0
      store/lesson.js
  7. 9 0
      store/login.js
  8. 24 0
      store/other.js
  9. 64 0
      store/train-template.js

+ 21 - 18
components/form.md

@@ -1,13 +1,26 @@
 # 组件说明文档
-#### form.vue
-##### props
-###### fields
+### form.vue
+### props
+
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|fields|Array|`-`|是|字段相关都在这里,用来自动输出,详情见下面|
+|submitText|String|`保存`|否|默认保存按钮的文字|
+|rules|Object|`-`|否|校验规则,不会找el-form的例子,不过使用的async-validator这个依赖为基础,会写这个也可以~~(那就厉害了,反正我是不行)~~|
+|isNew|Boolean|`-`|是|修改还是添加的提示|
+|data|Object|`-`|否|修改传来的数据|
+|needSave|Boolean|false|否|是否禁用保存按钮|
+|useEnter|Boolean|true|否|使用回车提交|
+|reset|Boolean|true|否|提交后是否重置表单|
+
+
+### fields
 >Array类型 必填
 >>
 |参数|类型|默认值|是否必填|说明|
 |:-:|:-:|:-:|:-:|:-:|
 |label|String|`-`|是|显示的字段中文|
-|type|String|input|否|这个字段要用什么类型来输出 input的基本类型可选值:date,datetime,radio,checkbox,select,text(只显示值),editor(富文本编辑器)|
+|type|String|input|否|这个字段要用什么类型来输出 input的基本类型可选值:date,datetime,radio,checkbox,select,text(只显示值),editor(富文本编辑器),password|
 |required|Boolean|`-`|否|是否必须输入|
 |model|String|`-`|是|字段名|
 |placeholder|String|`-`|否|占位,正常用,只是个透传|
@@ -15,24 +28,14 @@
 |custom|Boolean|`-`|否|是否使用自定义插槽|
 |tip|String|`-`|否|提示语,例如:请输入11位电话号码|
 |labelWidth|String|`120px`|否|表单label宽度,element的,默认120px|
-|useEnter|Boolean|true|否|是否使用回车提交|
 
-###### submitText
-> String 非必填 默认值: 保存 提交按钮的文字
 
-###### rules
-> object类型 非必填 校验规则,不会找el-form的例子,不过使用的async-validator这个依赖为基础,会写这个也可以~~(那就厉害了,反正我是不行)~~
 
-###### isNew
-> Boolean类型 default=>true 用来看是不是修改
 
-###### data
-> 任意类型 原数据
 
-###### needSave
-> Boolean类型 default=>true 需不需要保存按钮
 
-##### slot
+
+### slot
 >
 |插槽名|说明|
 |:-:|:-:|
@@ -59,7 +62,7 @@
 
 
 ***
-#### upload
+### upload
 |参数|类型|默认值|是否必填|说明|
 |:-:|:-:|:-:|:-:|:-:|
 |url|String|`-`|是|上传地址|
@@ -72,7 +75,7 @@
 |tip|String|`-`|否|提示信息|
 |listType|String|picture-card|否|上传文件列表显示类型|
 
->##### method
+>### method
 >|方法名|返回参数|说明|
 |:-:|:-:|:-:|
 |upload|{type,data}|上传成功返回

+ 74 - 55
components/form.vue

@@ -1,63 +1,80 @@
 <template>
   <div id="add">
-    <el-form ref="form" :model="form" :rules="rules" :label-width="labelWidth" class="form" size="small" @submit.native.prevent :style="styles">
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      :label-width="labelWidth"
+      class="form"
+      size="small"
+      @submit.native.prevent
+      :style="styles"
+      :inline="inline"
+    >
       <template v-for="(item, index) in fields">
         <template v-if="!loading">
           <el-form-item v-if="display(item)" :key="'form-field-' + index" :label="getField('label', item)" :prop="item.model" :required="item.required">
             <template v-if="!item.custom">
-              <el-tooltip class="item" effect="dark" :content="item.tip" placement="top-start" :disabled="!item.tip">
-                <template v-if="item.type === `date` || item.type === `datetime`">
-                  <el-date-picker v-model="form[item.model]" :type="item.type" placeholder="选择择" format="yyyy-MM-dd" value-format="yyyy-MM-dd">
-                  </el-date-picker>
-                </template>
-                <template v-else-if="item.type === `year` || item.type === `week` || item.type === `day`">
-                  <el-date-picker
-                    v-model="form[item.model]"
-                    :type="item.type"
-                    placeholder="选择择"
-                    :format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
-                    :value-format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
-                  >
-                  </el-date-picker>
-                </template>
-                <template v-else-if="item.type === 'radio'">
-                  <el-radio-group v-model="form[item.model]" size="mini" v-bind="item.options">
-                    <slot name="radios" v-bind="{ item, form, fieldChange }"></slot>
-                  </el-radio-group>
-                </template>
-                <template v-else-if="item.type === 'checkbox'">
-                  <el-checkbox-group v-model="form[item.model]" v-bind="item.options">
-                    <slot name="checkboxs" v-bind="{ item, form, fieldChange }"></slot>
-                  </el-checkbox-group>
-                </template>
-                <template v-else-if="item.type === 'select'">
-                  <el-select v-model="form[item.model]" v-bind="item.options" filterable>
-                    <slot name="options" v-bind="{ item, form, fieldChange }"></slot>
-                  </el-select>
-                </template>
-                <template v-else-if="item.type === 'textarea'">
-                  <el-input v-model="form[item.model]" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }"></el-input>
-                </template>
-                <template v-else-if="item.type === 'editor'">
-                  <wang-editor v-model="form[item.model]"></wang-editor>
-                </template>
-                <template v-else-if="item.type === 'text'">
-                  <el-row>
-                    <el-col :span="24">
-                      {{ form[item.model] }}
-                    </el-col>
-                  </el-row>
-                </template>
-                <template v-else>
-                  <el-input
-                    v-model="form[item.model]"
-                    :type="getField('type', item)"
-                    :placeholder="getField('placeholder', item)"
-                    :show-password="getField('type', item) === 'password'"
-                    v-bind="item.options"
-                  ></el-input>
-                </template>
-              </el-tooltip>
+              <template v-if="item.type !== 'text'">
+                <el-tooltip class="item" effect="dark" :content="item.tip" placement="top-start" :disabled="!item.tip">
+                  <template v-if="item.type === `date` || item.type === `datetime`">
+                    <el-date-picker
+                      v-model="form[item.model]"
+                      :type="item.type"
+                      placeholder="选择择"
+                      format="yyyy-MM-dd"
+                      value-format="yyyy-MM-dd"
+                      v-bind="item.options"
+                    >
+                    </el-date-picker>
+                  </template>
+                  <template v-else-if="item.type === `year` || item.type === `week` || item.type === `day`">
+                    <el-date-picker
+                      v-model="form[item.model]"
+                      :type="item.type"
+                      placeholder="选择择"
+                      :format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
+                      :value-format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
+                      v-bind="item.options"
+                    >
+                    </el-date-picker>
+                  </template>
+                  <template v-else-if="item.type === 'radio'">
+                    <el-radio-group v-model="form[item.model]" size="mini" v-bind="item.options">
+                      <slot name="radios" v-bind="{ item, form, fieldChange }"></slot>
+                    </el-radio-group>
+                  </template>
+                  <template v-else-if="item.type === 'checkbox'">
+                    <el-checkbox-group v-model="form[item.model]" v-bind="item.options">
+                      <slot name="checkboxs" v-bind="{ item, form, fieldChange }"></slot>
+                    </el-checkbox-group>
+                  </template>
+                  <template v-else-if="item.type === 'select'">
+                    <el-select v-model="form[item.model]" v-bind="item.options" filterable clearable>
+                      <slot name="options" v-bind="{ item, form, fieldChange }"></slot>
+                    </el-select>
+                  </template>
+                  <template v-else-if="item.type === 'textarea'">
+                    <el-input clearable v-model="form[item.model]" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }"></el-input>
+                  </template>
+                  <template v-else-if="item.type === 'editor'">
+                    <wang-editor v-model="form[item.model]"></wang-editor>
+                  </template>
+                  <template v-else>
+                    <el-input
+                      clearable
+                      v-model="form[item.model]"
+                      :type="getField('type', item)"
+                      :placeholder="getField('placeholder', item)"
+                      :show-password="getField('type', item) === 'password'"
+                      v-bind="item.options"
+                    ></el-input>
+                  </template>
+                </el-tooltip>
+              </template>
+              <template v-else>
+                {{ form[item.model] }}
+              </template>
             </template>
             <template v-else>
               <slot name="custom" v-bind="{ item, form, fieldChange }"></slot>
@@ -94,6 +111,8 @@ export default {
     labelWidth: { type: String, default: '120px' },
     useEnter: { type: Boolean, default: true },
     submitText: { type: String, default: '保存' },
+    inline: { type: Boolean, default: false },
+    reset: { type: Boolean, default: true },
   },
   components: {
     wangEditor,
@@ -146,7 +165,7 @@ export default {
       this.$refs['form'].validate(valid => {
         if (valid) {
           this.$emit(`save`, { isNew: this.isNew, data: JSON.parse(JSON.stringify(this.form)) });
-          this.$refs.form.resetFields();
+          if (this.reset) this.$refs.form.resetFields();
         } else {
           console.warn('form validate error!!!');
         }

+ 32 - 1
config/menu-config.js

@@ -34,6 +34,11 @@ export const center = [
         name: '职责说明',
         module: 'center',
       },
+      {
+        path: '/lesson/index',
+        name: '课表模板',
+        module: 'center',
+      },
     ],
   },
   {
@@ -68,7 +73,23 @@ export const center = [
     name: '计划管理',
     module: 'center',
   },
-
+  {
+    path: '',
+    name: '新计划管理',
+    module: 'center',
+    children: [
+      {
+        path: '/newPlan/index',
+        name: '年度计划',
+        module: 'center',
+      },
+      {
+        path: '/newPlan/template',
+        name: '计划模板',
+        module: 'center',
+      },
+    ],
+  },
   {
     path: '/work/index',
     name: '作业管理',
@@ -111,6 +132,11 @@ export const school = [
     name: '计划管理', //上报名单
     module: 'school',
   },
+  {
+    path: '/newPlan/index',
+    name: '新计划管理', //上报名单
+    module: 'school',
+  },
   {
     path: '/teacher/index',
     name: '教师确认',
@@ -143,6 +169,11 @@ export const director = [
     name: '计划管理', //上报名单
     module: 'director',
   },
+  {
+    path: '/newPlan/index',
+    name: '新计划管理', //上报名单
+    module: 'director',
+  },
   {
     path: '/classes/index',
     name: '班级管理',

+ 2 - 0
config/other.js

@@ -0,0 +1,2 @@
+import Vue from 'vue';
+Vue.config.jhAppKey = 'ed73fa73956ff995bad705d664002595';

+ 7 - 1
layout/admin/fw-admin.vue

@@ -20,4 +20,10 @@ export default {
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less">
+.el-select-dropdown__item {
+  &:last-child {
+    margin-bottom: 15px;
+  }
+}
+</style>

+ 21 - 0
store/lesson.js

@@ -5,6 +5,7 @@ import axios from 'axios';
 Vue.use(Vuex);
 const api = {
   interface: `/api/train/lesson`,
+  model: `/api/train/lessonmode`,
 };
 const state = () => ({});
 const mutations = {};
@@ -30,6 +31,26 @@ const actions = {
     const res = await this.$axios.$delete(`${api.interface}/${payload}`);
     return res;
   },
+  async modelQuery({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.model}`, { skip, limit, ...info });
+    return res;
+  },
+  async modelCreate({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.model}`, payload);
+    return res;
+  },
+  async modelFetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.model}/${payload}`);
+    return res;
+  },
+  async modelUpdate({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.model}/update/${id}`, data);
+    return res;
+  },
+  async modelDelete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.model}/${payload}`);
+    return res;
+  },
   async mergeRequest({ commit, dispatch }, { method, data }) {
     let toRequest = () => {
       let res = [];

+ 9 - 0
store/login.js

@@ -17,6 +17,15 @@ const state = () => ({});
 const mutations = {};
 
 const actions = {
+  /**
+    user:Object required 登陆信息 
+    router:router 如果跳转就传
+    path:String 跳转到的路由位置
+    needReturn: Boolean 是否返回结果
+    typeCheck: Boolean 是否检查身份对应匹配的前端项目
+    isWx: Boolean 是否是微信登陆
+    needNotice:Boolean 是否需要提示
+   */
   async login({ commit }, { user, router, path = '/', needReturn = false, typeCheck = true, isWx = false, needNotice = true }) {
     let res;
     //wx登陆,openid存在,user中是openid和qrcode;正常登陆,user中是mobile和passwd

+ 24 - 0
store/other.js

@@ -0,0 +1,24 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+import axios from 'axios';
+Vue.use(Vuex);
+const api = {
+  calendar: `/jh/calendar/year`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async calendar({ commit }, { key, year } = {}) {
+    const res = await this.$axios.$get(`${api.calendar}`, { key, year });
+    if (res.error_code == '0') return res.result.data;
+    else this.$message.error(res.reason || '万年历接口请求失败');
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 64 - 0
store/train-template.js

@@ -0,0 +1,64 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+import axios from 'axios';
+Vue.use(Vuex);
+const api = {
+  interface: `/api/train/trainmodel`,
+};
+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;
+  },
+  async mergeRequest({ commit, dispatch }, { method, data }) {
+    let toRequest = () => {
+      let res = [];
+      for (const i of data) {
+        res.push(dispatch(method, i));
+      }
+      return res;
+    };
+    let result = await axios.all(toRequest());
+    let newFilter = data => {
+      let res = data.map(i => {
+        let type = _.isArray(i);
+        if (!type) {
+          //fetch的多个请求 是object 将errcode为0的data取出来
+          return _.get(i, `data`, i);
+        } else {
+          //query的多个请求 array 将此数据再次走这个方法
+          return newFilter(i);
+        }
+      });
+      return res;
+    };
+    let returns = _.flattenDeep(newFilter(result));
+    return returns;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};