Browse Source

remove year in User-Profile form

hare8999@163.com 2 years ago
parent
commit
80abee1995

+ 1 - 1
src/components/Top/index.vue

@@ -48,7 +48,7 @@
 <script>
 import { mapActions, mapGetters } from 'vuex'
 import { changeRole } from '@/api/login.js'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 
 export default {
   mixins: [loginCheckMixin],

+ 50 - 54
src/views/components/complete-profile.vue

@@ -5,12 +5,13 @@
       <el-form ref="form" :model="formData" :rules="formRules" :validate-on-rule-change="false" label-position="right"
                label-width="70px">
         <el-row :gutter="20">
-          <el-col :span="14">
+          <el-col :span="24">
             <el-form-item prop="username" label="姓 名">
               <el-input type="text" v-model="formData.username" placeholder="请输入姓名"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="10">
+          <!-- 暂时不需要学年,学年从年级上选择 -->
+          <el-col v-if="false" :span="10">
             <el-form-item prop="year" label="学 年">
               <el-select v-model="formData.year" placeholder="请选择学年">
                 <el-option v-for="(y, idx) in yearOptions" :key="idx" :label="y" :value="y"></el-option>
@@ -47,10 +48,10 @@
           <el-col :span="12">
             <el-form-item v-if="isFrontStudent" prop="clazzId" label="班 级">
               <el-cascader
-                v-model="formData.clazzId"
-                :disabled="!formData.schoolId"
-                :placeholder="formData.schoolId?'选择年级-班级':'请先选择学校'"
-                :options="classTree"
+                  v-model="formData.clazzId"
+                  :disabled="!formData.schoolId"
+                  :placeholder="formData.schoolId?'选择年级-班级':'请先选择学校'"
+                  :options="classTree"
               ></el-cascader>
             </el-form-item>
           </el-col>
@@ -59,12 +60,12 @@
           <!-- 这里的name另外定义了一个,因为内部for循环+v-model方式会引发循环赋值(uni-app的实现问题) -->
           <el-form-item prop="gradeClass" label="年级组">
             <el-cascader
-              v-model="formData.gradeClass"
-              :disabled="!formData.schoolId"
-              :options="classTree"
-              :placeholder="formData.schoolId?'选择年级组':'请先选择学校'"
-              :props="{multiple:true}"
-              class="width100"
+                v-model="formData.gradeClass"
+                :disabled="!formData.schoolId"
+                :options="classTree"
+                :placeholder="formData.schoolId?'选择年级组':'请先选择学校'"
+                :props="{multiple:true}"
+                class="width100"
             ></el-cascader>
           </el-form-item>
           <el-row :gutter="20">
@@ -76,12 +77,12 @@
             <el-col :span="18">
               <el-form-item v-if="formData.isHeadteacher" prop="headteacherClassId" label="带 班" required>
                 <el-cascader
-                  :disabled="!formData.schoolId"
-                  :options="classTree"
-                  v-model="formData.headteacherClassId"
-                  :placeholder="formData.schoolId?'选择年级-班级':'请先选择学校'"
-                  :props="{emitPath: false}"
-                  class="width100"
+                    :disabled="!formData.schoolId"
+                    :options="classTree"
+                    v-model="formData.headteacherClassId"
+                    :placeholder="formData.schoolId?'选择年级-班级':'请先选择学校'"
+                    :props="{emitPath: false}"
+                    class="width100"
                 ></el-cascader>
               </el-form-item>
             </el-col>
@@ -98,10 +99,10 @@
               <div class="fx-row fx-bet-cen">
                 <el-input type="text" v-model="formData.code" placeholder="请输入验证码" class="fx-1"></el-input>
                 <el-button
-                  type="primary"
-                  class="mx-send"
-                  :class="{'inactive':countdown>0}"
-                  @click="handleSendSms"
+                    type="primary"
+                    class="mx-send"
+                    :class="{'inactive':countdown>0}"
+                    @click="handleSendSms"
                 >{{ countdown > 0 ? `(${countdown})秒` : '获取' }}
                 </el-button>
               </div>
@@ -123,12 +124,7 @@ import transferMixin from '@/components/mx-transfer-mixin.js'
 import userValidateMixin from '@/views/components/user-validation-mixin.js'
 import { getSubjectsList } from '@/api/webApi/system'
 import { getAllGradeClasses } from '@/api/webApi/grade'
-import {
-  getAreaSchoolAndYears,
-  improveUserInfo,
-  sendSms,
-  validateSms
-} from '@/api/login'
+import { getAreaSchoolAndYears, improveUserInfo, sendSms, validateSms } from '@/api/login'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -171,9 +167,9 @@ export default {
     },
     groupedSchoolOptions() {
       return this.schoolOptions.groupBy(
-        (sc) => sc.area,
-        'label',
-        'options'
+          (sc) => sc.area,
+          'label',
+          'options'
       )
     }
   },
@@ -206,7 +202,7 @@ export default {
         this.rawClassTree = res.data
         // 挂载动态属性,用于表单校验
         this.rawClassTree.forEach(
-          (grade) => (this.formData.gradeClass[grade.name] = [])
+            (grade) => (this.formData.gradeClass[grade.name] = [])
         )
       })
     },
@@ -235,28 +231,28 @@ export default {
           code: this.formData.code
         }
         validateSms(validateData)
-          .then((_) => {
-            // 从formData到提交结构还需要轻微转换
-            const postData = this.formDataToPostData(
-              this.formData,
-              this.rawClassTree
-            )
-            console.log(
-              'sms code valid & will post data',
-              postData
-            )
-            improveUserInfo(postData)
-              .then((res) => {
-                // reset login token
-                auth.setToken(res.data.token)
-                this.$store.dispatch('GetInfo').then((_) => {
-                  // to index page
-                  this.$emit('completed')
-                })
-              })
-              .finally(() => this.loading = false)
-          })
-          .finally(() => this.loading = false)
+            .then((_) => {
+              // 从formData到提交结构还需要轻微转换
+              const postData = this.formDataToPostData(
+                  this.formData,
+                  this.rawClassTree
+              )
+              console.log(
+                  'sms code valid & will post data',
+                  postData
+              )
+              improveUserInfo(postData)
+                  .then((res) => {
+                    // reset login token
+                    auth.setToken(res.data.token)
+                    this.$store.dispatch('GetInfo').then((_) => {
+                      // to index page
+                      this.$emit('completed')
+                    })
+                  })
+                  .finally(() => this.loading = false)
+            })
+            .finally(() => this.loading = false)
       })
     },
     beginCountDown() {

+ 152 - 147
src/views/components/user-validation-mixin.js

@@ -1,152 +1,157 @@
 export default {
-    // NOTE:有机会统一注册、用户中心的表单逻辑
-    data() {
-        return {
-            fullRules: {
-                username: [{
-                    required: true,
-                    message: '姓名必填',
-                    trigger: 'change'
-                }],
-                sex: [{
-                    required: true,
-                    message: '性别必填',
-                    trigger: 'blur'
-                }],
-                schoolId: [{
-                    required: true,
-                    message: '学校必填',
-                    trigger: 'change'
-                }],
-                subjectid: [{
-                    required: true,
-                    message: '科目必填',
-                    access: ['isFrontTeacher'],
-                    trigger: 'change',
-                    validator: (r, v, cb) => cb(v > 0 ? undefined : new Error(r.message))
-                }],
-                year: [{
-                    required: true,
-                    message: '学年必填',
-                    trigger: 'change'
-                }],
-                // sno: [{
-                //     required: true,
-                //     message: '学号必填',
-                //     access: ['isFrontStudent'],
-                //     trigger: 'blur'
-                // }],
-                clazzId: [{
-                    required: true,
-                    message: '班级必填',
-                    access: ['isFrontStudent'],
-                    trigger: 'change',
-                    validator: (r, v, cb) => cb(v?.length > 0 ? undefined : new Error(r.message))
-                }],
-                gradeClass: [{
-                    required: true,
-                    message: '年级组必填',
-                    access: ['isFrontTeacher'],
-                    trigger: 'change',
-                    validator: (r, v, cb) => cb(v?.length > 0 ? undefined : new Error(r.message))
-                }],
-                isHeadteacher: [{
-                    required: true,
-                    message: '班主任必填',
-                    access: ['isFrontTeacher'],
-                    trigger: 'change',
-                    validator: (r, v, cb) => cb()
-                }],
-                headteacherClassId: [{
-                    required: true,
-                    message: '带班必填',
-                    access: ['isFrontTeacher'],
-                    trigger: 'change',
-                    validator: (r, v, cb) => cb(v > 0 ? undefined : new Error(r.message))
-                }],
-                phoneNumber: [{
-                    required: true,
-                    message: '手机号必填',
-                    access: [],
-                    trigger: 'change'
-                }, {
-                    pattern: /^\d{11}$/,
-                    message: '手机号格式不正确',
-                    access: [],
-                    trigger: 'change'
-                }],
-                code: [{
-                    required: true,
-                    message: '验证码必填',
-                    access: [],
-                    trigger: 'change'
-                }]
-            },
-            rawClassTree: null,
-        }
-    },
-    computed: {
-        classTree() {
-            if (!this.rawClassTree?.length) return [];
-            // 转化为 element-ui 标准格式
-            return this.rawClassTree.map((grade) => ({
-                label: grade.name,
-                value: grade.grade,
-                children: grade.classList.map((clazz) => ({
-                    label: clazz.className,
-                    value: clazz.classId,
-                })),
-            }));
-        },
+  // NOTE:有机会统一注册、用户中心的表单逻辑
+  data() {
+    return {
+      fullRules: {
+        username: [{
+          required: true,
+          message: '姓名必填',
+          trigger: 'change'
+        }],
+        sex: [{
+          required: true,
+          message: '性别必填',
+          trigger: 'blur'
+        }],
+        schoolId: [{
+          required: true,
+          message: '学校必填',
+          trigger: 'change'
+        }],
+        subjectid: [{
+          required: true,
+          message: '科目必填',
+          access: ['isFrontTeacher'],
+          trigger: 'change',
+          validator: (r, v, cb) => cb(v > 0 ? undefined : new Error(r.message))
+        }],
+        year: [{
+          required: true,
+          message: '学年必填',
+          trigger: 'change'
+        }],
+        // sno: [{
+        //     required: true,
+        //     message: '学号必填',
+        //     access: ['isFrontStudent'],
+        //     trigger: 'blur'
+        // }],
+        clazzId: [{
+          required: true,
+          message: '班级必填',
+          access: ['isFrontStudent'],
+          trigger: 'change',
+          validator: (r, v, cb) => cb(v?.length > 0 ? undefined : new Error(r.message))
+        }],
+        gradeClass: [{
+          required: true,
+          message: '年级组必填',
+          access: ['isFrontTeacher'],
+          trigger: 'change',
+          validator: (r, v, cb) => cb(v?.length > 0 ? undefined : new Error(r.message))
+        }],
+        isHeadteacher: [{
+          required: true,
+          message: '班主任必填',
+          access: ['isFrontTeacher'],
+          trigger: 'change',
+          validator: (r, v, cb) => cb()
+        }],
+        headteacherClassId: [{
+          required: true,
+          message: '带班必填',
+          access: ['isFrontTeacher'],
+          trigger: 'change',
+          validator: (r, v, cb) => cb(v > 0 ? undefined : new Error(r.message))
+        }],
+        phoneNumber: [{
+          required: true,
+          message: '手机号必填',
+          access: [],
+          trigger: 'change'
+        }, {
+          pattern: /^\d{11}$/,
+          message: '手机号格式不正确',
+          access: [],
+          trigger: 'change'
+        }],
+        code: [{
+          required: true,
+          message: '验证码必填',
+          access: [],
+          trigger: 'change'
+        }]
+      },
+      rawClassTree: null
+    }
+  },
+  computed: {
+    classTree() {
+      if (!this.rawClassTree?.length) return []
+      // 转化为 element-ui 标准格式
+      return this.rawClassTree.map((grade) => ({
+        label: grade.name,
+        value: grade.grade,
+        children: grade.classList.map((clazz) => ({
+          label: clazz.className,
+          value: clazz.classId
+        }))
+      }))
+    }
+  },
+  methods: {
+    extractUserRules(form) {
+      const resultRules = {}
+      Object.keys(form).forEach(prop => {
+        const rules = this.fullRules[prop]
+        if (!rules?.length) return
+        const filterRules = rules.filter(rule => {
+          if (rule.access?.length > 0) {
+            return rule.access.some(getter => this.$store.getters[getter])
+          } else {
+            return true
+          }
+        })
+        if (filterRules.length) resultRules[prop] = filterRules
+      })
+      console.log('extractUserRules', resultRules)
+      return resultRules
     },
-    methods: {
-        extractUserRules(form) {
-            const resultRules = {}
-            Object.keys(form).forEach(prop => {
-                const rules = this.fullRules[prop]
-                if (!rules?.length) return
-                const filterRules = rules.filter(rule => {
-                    if (rule.access?.length > 0) {
-                        return rule.access.some(getter => this.$store.getters[getter])
-                    } else {
-                        return true
-                    }
-                })
-                if (filterRules.length) resultRules[prop] = filterRules
-            })
-            console.log('extractUserRules', resultRules)
-            return resultRules
-        },
-        formDataToPostData(form) {
-            const data = this.deepClone(form)
-            // subjectIds
-            if (data.subjectid) data.subjectIds = [data.subjectid]
-            // grade class
-            if (form.clazzId?.length == 2) {
-                const [gradeId, classId] = form.clazzId
-                data.gradeClass = [{
-                    grade: gradeId,
-                    classList: [{ classId }]
-                }]
-            } else if (form.gradeClass.length > 0) {
-                data.gradeClass = []
-                form.gradeClass.forEach(pair => {
-                    if (pair.length != 2) return
-                    const [gradeId, classId] = pair
-                    let exist = data.gradeClass.find(g => g.grade == gradeId)
-                    if (!exist) {
-                        exist = {
-                            grade: gradeId,
-                            classList: []
-                        }
-                        data.gradeClass.push(exist)
-                    }
-                    exist.classList.push({ classId })
-                })
-            } else {
-              delete data.gradeClass
+    formDataToPostData(form, rawClassTree) {
+      const data = this.deepClone(form)
+      let maxYear = ''
+      // subjectIds
+      if (data.subjectid) data.subjectIds = [data.subjectid]
+      // grade class
+      if (form.clazzId?.length == 2) {
+        const [gradeId, classId] = form.clazzId
+        data.gradeClass = [{
+          grade: gradeId,
+          classList: [{ classId }]
+        }]
+        maxYear = rawClassTree.find(g => g.grade == gradeId).year
+      } else if (form.gradeClass.length > 0) {
+        data.gradeClass = []
+        form.gradeClass.forEach(pair => {
+          if (pair.length != 2) return
+          const [gradeId, classId] = pair
+          let exist = data.gradeClass.find(g => g.grade == gradeId)
+          if (!exist) {
+            exist = {
+              grade: gradeId,
+              classList: []
             }
-            return data
-        }
+            data.gradeClass.push(exist)
+          }
+          exist.classList.push({ classId })
+          const currentYear = rawClassTree.find(g => g.grade == gradeId).year
+          maxYear = Math.max(currentYear, maxYear)
+        })
+      } else {
+        delete data.gradeClass
+      }
+      data.year = maxYear
+      return data
     }
+  }
 }

+ 1 - 1
src/views/evaluating/main.vue

@@ -54,7 +54,7 @@
 </template>
 <script>
 import IndexCard from '@/views/index/components/index-card.vue'
-import loginCheckMixin from '@/views/components/blocks/index-login-check-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-check-mixin'
 import { checkRole } from '@/utils/permission'
 import { mapGetters } from 'vuex'
 

+ 0 - 0
src/views/components/blocks/index-login-check-mixin.js → src/views/index/blocks/index-login-check-mixin.js


+ 0 - 0
src/views/components/blocks/index-login-interceptor-mixin.js → src/views/index/blocks/index-login-interceptor-mixin.js


+ 1 - 1
src/views/index/components/index-card-career.vue

@@ -14,7 +14,7 @@ import * as career from '@/api/webApi/career-course'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import IndexImageItem from '@/views/index/components/index-image-item'
 import transferMixin from '@/components/mx-transfer-mixin'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 
 export default {
   mixins: [transferMixin, loginCheckMixin],

+ 1 - 1
src/views/index/components/index-card-colleage.vue

@@ -13,7 +13,7 @@ import IndexCard from '@/views/index/components/index-card'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import IndexImageItem from '@/views/index/components/index-image-item'
 import transferMixin from '@/components/mx-transfer-mixin'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import { selectUniversityList } from '@/api/webApi/career-course'
 
 export default {

+ 1 - 1
src/views/index/components/index-card-elective.vue

@@ -10,7 +10,7 @@
 
 <script>
 import IndexCard from '@/views/index/components/index-card'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import IndexImageItem from '@/views/index/components/index-image-item'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import { mapGetters } from 'vuex'

+ 1 - 1
src/views/index/components/index-card-gksp.vue

@@ -14,7 +14,7 @@ import { gkVideo } from '@/api/webApi/career-news'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import IndexImageItem from '@/views/index/components/index-image-item'
 import transferMixin from '@/components/mx-transfer-mixin'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 
 export default {
   mixins: [transferMixin, loginCheckMixin],

+ 1 - 1
src/views/index/components/index-card-gktf.vue

@@ -14,7 +14,7 @@ import { gkVideo } from '@/api/webApi/career-news'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import IndexImageItem from '@/views/index/components/index-image-item'
 import transferMixin from '@/components/mx-transfer-mixin'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 
 export default {
   mixins: [transferMixin, loginCheckMixin],

+ 1 - 1
src/views/index/components/index-card-news-single.vue

@@ -16,7 +16,7 @@
 
 <script>
 import IndexCard from '@/views/index/components/index-card'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 import * as career from '@/api/webApi/career-news'
 

+ 1 - 1
src/views/index/components/index-card-news.vue

@@ -20,7 +20,7 @@
 
 <script>
 import IndexCard from '@/views/index/components/index-card'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 import * as career from '@/api/webApi/career-news'
 

+ 1 - 1
src/views/index/components/index-card-subject-query.vue

@@ -10,7 +10,7 @@
 
 <script>
 import IndexCard from '@/views/index/components/index-card'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 import IndexCardContent from '@/views/index/components/index-card-content'
 import IndexImageItem from '@/views/index/components/index-image-item'

+ 1 - 1
src/views/index/components/index-card-top.vue

@@ -14,7 +14,7 @@
 
 <script>
 import IndexCard from '@/views/index/components/index-card'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 import * as career from '@/api/webApi/career-news'
 

+ 1 - 1
src/views/index/components/index-image-item.vue

@@ -11,7 +11,7 @@
 </template>
 
 <script>
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 
 export default {

+ 1 - 1
src/views/index/components/index-preference-simulate.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script>
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import transferMixin from '@/components/mx-transfer-mixin'
 
 export default {

+ 1 - 1
src/views/index/components/login-form-banner.vue

@@ -75,7 +75,7 @@
 <script>
 /* TODO: 22.8.23 hht 这里为节省时间,全部由依赖注入主导,没有做逻辑分割 */
 import { mapGetters } from 'vuex'
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 
 export default {
   mixins: [loginCheckMixin],

+ 1 - 1
src/views/index/components/login-top-menus.vue

@@ -13,7 +13,7 @@
 </template>
 
 <script>
-import loginCheckMixin from '@/views/components/blocks/index-login-interceptor-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-interceptor-mixin'
 import { mapActions, mapGetters } from 'vuex'
 
 export default {

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

@@ -34,7 +34,7 @@ import CompleteProfile from '@/views/components/complete-profile.vue'
 import LoginTopInfo from '@/views/index/components/login-top-info'
 import LoginFormBanner from '@/views/index/components/login-form-banner'
 import LoginTopMenus from '@/views/index/components/login-top-menus'
-import loginCheckMixin from '@/views/components/blocks/index-login-check-mixin'
+import loginCheckMixin from '@/views/index/blocks/index-login-check-mixin'
 import IndexCardElective from '@/views/index/components/index-card-elective'
 import IndexCardSubjectQuery from '@/views/index/components/index-card-subject-query'
 import IndexCardElectiveTest from '@/views/index/components/index-card-elective-test'