zhangjie 3 rokov pred
rodič
commit
8e58f179d2
36 zmenil súbory, kde vykonal 4464 pridanie a 448 odobranie
  1. 3 0
      src/assets/styles/base.scss
  2. 22 0
      src/assets/styles/common-comp.scss
  3. 1 1
      src/assets/styles/element-ui-costom.scss
  4. 2 1
      src/assets/styles/index.scss
  5. 42 0
      src/assets/styles/pages.scss
  6. 1 0
      src/assets/styles/variables.scss
  7. 211 0
      src/components/ImportFile.vue
  8. 1 1
      src/components/SemesterSelect.vue
  9. 1909 0
      src/constants/menus-data.js
  10. 0 127
      src/constants/navs.js
  11. 3 0
      src/modules/base/api.js
  12. 73 5
      src/modules/base/components/ModifyBaseConfig.vue
  13. 96 0
      src/modules/base/components/baseConfig/BlueprintConfig.vue
  14. 134 0
      src/modules/base/components/baseConfig/CommentAbility.vue
  15. 59 0
      src/modules/base/components/baseConfig/CommentConfig.vue
  16. 134 0
      src/modules/base/components/baseConfig/CommentKnowledge.vue
  17. 174 0
      src/modules/base/components/baseConfig/DiagnoseConfig.vue
  18. 157 0
      src/modules/base/components/baseConfig/DimensionAbilityList.vue
  19. 59 0
      src/modules/base/components/baseConfig/DimensionConfig.vue
  20. 184 0
      src/modules/base/components/baseConfig/DimensionKnowledgeList.vue
  21. 140 0
      src/modules/base/components/baseConfig/ModifyAbilityComment.vue
  22. 213 0
      src/modules/base/components/baseConfig/ModifyAbilityDim.vue
  23. 143 0
      src/modules/base/components/baseConfig/ModifyKnowledgeComment.vue
  24. 302 0
      src/modules/base/components/baseConfig/ModifyKnowledgeDim.vue
  25. 109 0
      src/modules/base/components/baseConfig/ProficiencyEdit.vue
  26. 95 0
      src/modules/base/components/baseConfig/defaultComment.js
  27. 26 0
      src/modules/base/components/baseConfig/dimenData.js
  28. 12 0
      src/modules/base/router.js
  29. 20 7
      src/modules/base/views/DataInitManage.vue
  30. 6 0
      src/modules/login/api.js
  31. 20 0
      src/modules/login/router.js
  32. 0 265
      src/modules/login/views/Login2.vue
  33. 52 0
      src/modules/login/views/LoginAuthen.vue
  34. 19 0
      src/modules/login/views/LogoutAuthen.vue
  35. 16 16
      src/router.js
  36. 26 25
      src/views/Home.vue

+ 3 - 0
src/assets/styles/base.scss

@@ -127,6 +127,9 @@ body {
   &-border {
     border: 1px solid $--color-border;
   }
+  &-border-bold {
+    border: 1px solid $--color-border-bold;
+  }
   &-pad {
     padding: 20px;
   }

+ 22 - 0
src/assets/styles/common-comp.scss

@@ -0,0 +1,22 @@
+// tips
+.cc-tips-error {
+  color: $--color-danger;
+}
+.cc-tips-success {
+  color: $--color-success;
+}
+
+// import-file
+.cc-import-file {
+  &-tips {
+    height: 20px;
+    line-height: 20px;
+  }
+  &-footer {
+    padding: 10px 0;
+    font-size: 14px;
+    a:hover {
+      color: $--color-primary;
+    }
+  }
+}

+ 1 - 1
src/assets/styles/element-ui-costom.scss

@@ -49,7 +49,7 @@
   }
 }
 .el-dialog__body {
-  padding: 30px 40px;
+  padding: 20px;
   position: relative;
   border-top: 1px solid $--color-border;
   color: $--color-text-dark-1;

+ 2 - 1
src/assets/styles/index.scss

@@ -1,10 +1,11 @@
 @import "./variables.scss";
+@import "./element-ui-costom.scss";
 @import "./base.scss";
 @import "./home.scss";
 
 @import "./login.scss";
 @import "./icons.scss";
 @import "./pages.scss";
+@import "./common-comp.scss";
 
-@import "./element-ui-costom.scss";
 @import "./adaptive.scss";

+ 42 - 0
src/assets/styles/pages.scss

@@ -816,6 +816,48 @@
   }
 }
 
+// modify-base-config
+.modify-base-config {
+  &.el-dialog {
+    background-color: $--color-background;
+
+    .el-dialog__body {
+      padding-top: 70px;
+    }
+  }
+}
+.proficiency-edit {
+  .el-form-item__content {
+    margin-bottom: 5px;
+  }
+}
+.rate-input {
+  .el-input-number {
+    width: 60px;
+    margin: 0 10px;
+
+    .el-input__inner {
+      padding-left: 10px;
+      padding-right: 20px;
+    }
+
+    .el-input::after {
+      content: "%";
+      display: block;
+      position: absolute;
+      right: 10px;
+      top: 50%;
+      margin-top: -8px;
+      font-size: 14px;
+      line-height: 1;
+      z-index: 9;
+    }
+  }
+  &-offset-left {
+    padding-left: 87px;
+  }
+}
+
 // frame-container
 .frame-container {
   position: relative;

+ 1 - 0
src/assets/styles/variables.scss

@@ -9,6 +9,7 @@ $--color-text-gray-4: #ccc !default;
 $--color-text-gray-5: #d3d5e0 !default;
 $--color-text-gray-6: #e0e1eb !default;
 $--color-text-gray-7: #f2f4fa !default;
+$--color-border-bold: #e6e6e6;
 $--color-border: #eff0f5;
 $--color-background: #eff0f5;
 // status

+ 211 - 0
src/components/ImportFile.vue

@@ -0,0 +1,211 @@
+<template>
+  <div :class="prefixCls">
+    <el-dialog
+      class="modify-data"
+      :visible.sync="modalIsShow"
+      :title="title"
+      top="10vh"
+      width="500px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+      @open="visibleChange"
+    >
+      <div style="footer"></div>
+      <div :class="[`${prefixCls}-body`]">
+        <el-upload
+          drag
+          :action="uploadUrl"
+          :headers="headers"
+          :max-size="maxSize"
+          :format="format"
+          :accept="accept"
+          :data="uploadDataDict"
+          :before-upload="handleBeforeUpload"
+          :on-error="handleError"
+          :on-success="handleSuccess"
+          :http-request="upload"
+          :disabled="disabled || loading"
+          :show-file-list="false"
+          ref="UploadComp"
+        >
+          <i class="el-icon-upload"></i><br />
+          <em class="el-upload__text">将文件拖到此处,或<em>点击上传</em></em>
+          <p
+            slot="tip"
+            :class="[
+              `${prefixCls}-tips`,
+              {
+                'cc-tips-success': res.success,
+                'cc-tips-error': !res.success
+              }
+            ]"
+            v-if="res.msg"
+          >
+            {{ res.msg }}
+          </p>
+        </el-upload>
+      </div>
+      <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
+        文件下载:
+        <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const prefixCls = "cc-import-file";
+
+export default {
+  name: "import-file",
+  props: {
+    title: {
+      type: String,
+      default: "文件上传"
+    },
+    downloadUrl: {
+      type: String,
+      default: ""
+    },
+    downloadFilename: String,
+    format: {
+      type: Array,
+      default() {
+        return ["jpg", "jpeg", "png"];
+      }
+    },
+    uploadUrl: {
+      type: String,
+      required: true
+    },
+    uploadData: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    maxSize: {
+      type: Number,
+      default: 20 * 1024 * 1024
+    },
+    addFilenameParam: {
+      type: String,
+      default: "filename"
+    },
+    disabled: { type: Boolean, default: false }
+  },
+  data() {
+    return {
+      prefixCls,
+      modalIsShow: false,
+      headers: {
+        md5: ""
+      },
+      loading: false,
+      uploadDataDict: {},
+      res: {
+        success: true,
+        msg: ""
+      }
+    };
+  },
+  computed: {
+    dfilename() {
+      return this.downloadFilename || this.downloadUrl.split("/").pop();
+    },
+    accept() {
+      return this.format.map(el => `.${el}`).join();
+    }
+  },
+  methods: {
+    visibleChange() {
+      this.res = {
+        success: true,
+        msg: ""
+      };
+      this.headers = { md5: "" };
+      this.loading = false;
+      this.uploadDataDict = {};
+    },
+    checkFileFormat(fileType) {
+      const _file_format = fileType
+        .split(".")
+        .pop()
+        .toLocaleLowerCase();
+      return this.format.length
+        ? this.format.some(item => item.toLocaleLowerCase() === _file_format)
+        : true;
+    },
+    async handleBeforeUpload(file) {
+      this.uploadDataDict = {
+        ...this.uploadData
+      };
+      this.uploadDataDict[this.addFilenameParam] = file.name;
+
+      if (file.size > this.maxSize) {
+        this.handleExceededSize();
+        return Promise.reject();
+      }
+
+      if (!this.checkFileFormat(file.name)) {
+        this.handleFormatError();
+        return Promise.reject();
+      }
+
+      const md5 = await fileMD5(file);
+      this.headers["md5"] = md5;
+      this.loading = true;
+
+      return true;
+    },
+    upload(options) {
+      let formData = new FormData();
+      Object.entries(options.data).forEach(([k, v]) => {
+        formData.append(k, v);
+      });
+      formData.append("file", options.file);
+      this.$emit("uploading");
+
+      return $post(options.action, formData, { headers: options.headers });
+    },
+    handleError(error) {
+      this.loading = false;
+      this.res = {
+        success: false,
+        msg: error.message
+      };
+      this.$emit("upload-error", error);
+    },
+    handleSuccess() {
+      this.loading = false;
+      this.res = {
+        success: true,
+        msg: "导入成功!"
+      };
+      this.$emit("upload-success", response);
+      this.cancel();
+    },
+    handleFormatError() {
+      this.res = {
+        success: false,
+        msg: "只支持文件格式为" + this.format.join("/")
+      };
+      this.$refs.UploadComp.clearFiles();
+    },
+    handleExceededSize() {
+      this.res = {
+        success: false,
+        msg: "文件大小不能超过" + Math.floor(this.maxSize / (1024 * 1024)) + "M"
+      };
+      this.$refs.UploadComp.clearFiles();
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    }
+  }
+};
+</script>

+ 1 - 1
src/components/SemesterSelect.vue

@@ -47,7 +47,7 @@ export default {
     }
   },
   created() {
-    this.search();
+    // this.search();
   },
   methods: {
     async search() {

+ 1909 - 0
src/constants/menus-data.js

@@ -0,0 +1,1909 @@
+export default [
+  {
+    id: "1",
+    name: "教研分析",
+    url: "report",
+    type: "MENU",
+    parentId: "-1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "2",
+    name: "数据驾驶舱",
+    url: "cockpit",
+    type: "MENU",
+    parentId: "1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "3",
+    name: "全校考试总览",
+    url: "SchoolExam",
+    type: "MENU",
+    parentId: "2",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "4",
+    name: "全校课程考试分析",
+    url: "SchoolCourse",
+    type: "MENU",
+    parentId: "2",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "5",
+    name: "全校教师各课堂成绩排名",
+    url: "SchoolTeacherClassScore",
+    type: "MENU",
+    parentId: "2",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "6",
+    name: "学生",
+    url: "student",
+    type: "MENU",
+    parentId: "1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "7",
+    name: "开课成绩查询",
+    url: "TeachCollegeScore",
+    type: "MENU",
+    parentId: "6",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "8",
+    name: "考查成绩查询",
+    url: "InspectCollegeScore",
+    type: "MENU",
+    parentId: "6",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "9",
+    name: "学生报告管理",
+    url: "StudentReportManage",
+    type: "MENU",
+    parentId: "6",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "10",
+    name: "教师",
+    url: "teacher",
+    type: "MENU",
+    parentId: "1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "11",
+    name: "教师各课堂成绩排名",
+    url: "TeacherClassScore",
+    type: "MENU",
+    parentId: "10",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "12",
+    name: "我的课堂成绩排名",
+    url: "MyClassScore",
+    type: "MENU",
+    parentId: "10",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "13",
+    name: "我的课堂考试分析",
+    url: "MyClassExamView",
+    type: "MENU",
+    parentId: "10",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "14",
+    name: "课程",
+    url: "course",
+    type: "MENU",
+    parentId: "1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "15",
+    name: "考查课程考试总览",
+    url: "InspectCourseExamOverview",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "16",
+    name: "考查课程考试分析",
+    url: "InspectCourseExamAnalysis",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "17",
+    name: "开课课程考试总览",
+    url: "OwnerCourseExamOverview",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "18",
+    name: "开课课程考试分析",
+    url: "OwnerCourseExamAnalysis",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "19",
+    name: "赋分办法",
+    url: "AssignScoreAction",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "20",
+    name: "赋分即时预览",
+    url: "AssignScoreActionTry",
+    type: "MENU",
+    parentId: "14",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "21",
+    name: "数据配置",
+    url: "data",
+    type: "MENU",
+    parentId: "1",
+    sequence: 1,
+    enable: true
+  },
+  {
+    id: "22",
+    name: "数据初始化",
+    url: "DataInitManage",
+    type: "MENU",
+    parentId: "21",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  },
+  {
+    id: "23",
+    name: "分析批次管理",
+    url: "AnalysisBatchManage",
+    type: "MENU",
+    parentId: "21",
+    sequence: 1,
+    enable: true,
+    urls: [
+      {
+        id: "92",
+        name: "组织机构-查询",
+        url: "/api/admin/sys/org/list",
+        type: "URL",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "93",
+        name: "组织机构-新增/修改",
+        url: "/api/admin/sys/org/save",
+        type: "URL",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "94",
+        name: "组织机构-删除",
+        url: "/api/admin/sys/org/remove",
+        type: "URL",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      },
+      {
+        id: "371",
+        name: "根据类型查询机构",
+        url: "/api/admin/sys/org/find_by_type",
+        type: "URL",
+        parentId: "4",
+        sequence: 5,
+        enable: true
+      }
+    ],
+    buttons: [
+      {
+        id: "224",
+        name: "组织架构-添加",
+        url: "Add",
+        type: "BUTTON",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    links: [
+      {
+        id: "225",
+        name: "组织架构-+子部门",
+        url: "Add",
+        type: "LINK",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      },
+      {
+        id: "226",
+        name: "组织架构-编辑",
+        url: "Edit",
+        type: "LINK",
+        parentId: "4",
+        sequence: 2,
+        enable: true
+      },
+      {
+        id: "227",
+        name: "组织架构-删除",
+        url: "Delete",
+        type: "LINK",
+        parentId: "4",
+        sequence: 3,
+        enable: true
+      }
+    ],
+    lists: [
+      {
+        id: "228",
+        name: "组织架构-树形列表",
+        url: "List",
+        type: "LIST",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ],
+    conditions: [
+      {
+        id: "234",
+        name: "组织架构-查询条件",
+        url: "Condition",
+        type: "CONDITION",
+        parentId: "4",
+        sequence: 1,
+        enable: true
+      }
+    ]
+  }
+];

+ 0 - 127
src/constants/navs.js

@@ -1,127 +0,0 @@
-const navs = [
-  {
-    title: "教研分析",
-    name: "report",
-    icon: "icon icon-report",
-    children: [
-      {
-        title: "数据驾驶舱",
-        name: "cockpit",
-        icon: "el-icon-s-cooperation",
-        children: [
-          {
-            title: "全校考试总览",
-            router: "SchoolExam"
-          },
-          {
-            title: "全校课程考试分析",
-            router: "SchoolCourse"
-          },
-          {
-            title: "全校教师各课堂成绩排名",
-            router: "SchoolTeacherClassScore"
-          }
-        ]
-      },
-      {
-        title: "学生",
-        name: "student",
-        icon: "el-icon-s-cooperation",
-        children: [
-          {
-            title: "开课成绩查询",
-            router: "TeachCollegeScore"
-          },
-          {
-            title: "考查成绩查询",
-            router: "InspectCollegeScore"
-          },
-          {
-            title: "学生报告管理",
-            router: "StudentReportManage"
-          }
-        ]
-      },
-      {
-        title: "教师",
-        name: "teacher",
-        icon: "el-icon-s-cooperation",
-        children: [
-          {
-            title: "教师各课堂成绩排名",
-            router: "TeacherClassScore"
-          },
-          {
-            title: "我的课堂成绩排名",
-            router: "MyClassScore"
-          },
-          {
-            title: "我的课堂考试分析",
-            router: "MyClassExamView"
-          }
-        ]
-      },
-      {
-        title: "课程",
-        name: "course",
-        icon: "el-icon-s-cooperation",
-        children: [
-          {
-            title: "考查课程考试总览",
-            router: "InspectCourseExamOverview"
-          },
-          {
-            title: "考查课程考试分析",
-            router: "InspectCourseExamAnalysis"
-          },
-          {
-            title: "开课课程考试总览",
-            router: "OwnerCourseExamOverview"
-          },
-          {
-            title: "开课课程考试分析",
-            router: "OwnerCourseExamAnalysis"
-          },
-          {
-            title: "赋分办法",
-            router: "AssignScoreAction",
-            children: [
-              {
-                title: "赋分即时预览",
-                router: "AssignScoreActionTry"
-              }
-            ]
-          }
-        ]
-      }
-    ]
-  },
-  {
-    title: "基础配置",
-    name: "base",
-    icon: "icon icon-base",
-    children: [
-      {
-        title: "用户管理",
-        name: "user",
-        icon: "el-icon-user-solid",
-        children: [
-          {
-            title: "组织架构",
-            router: "OrganizationManage"
-          },
-          {
-            title: "用户管理",
-            router: "UserManage"
-          },
-          {
-            title: "角色管理",
-            router: "RoleManage"
-          }
-        ]
-      }
-    ]
-  }
-];
-
-export default navs;

+ 3 - 0
src/modules/base/api.js

@@ -67,6 +67,9 @@ export const deleteOrganization = id => {
 export const dataInitList = datas => {
   return $postParam("/api/admin/sys/org/list", datas);
 };
+export const updateKnowledgeDimension = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
+};
 
 // analysis-course-manage
 export const analysisBatchList = datas => {

+ 73 - 5
src/modules/base/components/ModifyBaseConfig.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    class="Modify-base-config"
+    custom-class="modify-base-config"
     :visible.sync="modalIsShow"
     title="基础配置"
     :close-on-click-modal="false"
@@ -8,12 +8,38 @@
     append-to-body
     fullscreen
     @opened="visibleChange"
-  ></el-dialog>
+  >
+    <div slot="title">
+      基础配置<span class="color-gray-2 ml-2">{{ insCont }}</span>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-steps :active="curStep" align-center>
+        <el-step v-for="(item, ind) in steps" :key="item.val">
+          <el-button
+            slot="title"
+            type="text"
+            :disabled="item.disabled"
+            @click="changeStep(ind)"
+            >{{ item.name }}</el-button
+          >
+        </el-step>
+      </el-steps>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <component :is="compName" :course="instance"></component>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
+import DimensionConfig from "./baseConfig/DimensionConfig.vue";
+import BlueprintConfig from "./baseConfig/BlueprintConfig.vue";
+import DiagnoseConfig from "./baseConfig/DiagnoseConfig.vue";
+import CommentConfig from "./baseConfig/CommentConfig.vue";
+
 export default {
-  name: "Modify-base-config",
+  name: "modify-base-config",
   props: {
     instance: {
       type: Object,
@@ -22,12 +48,50 @@ export default {
       }
     }
   },
+  components: {
+    DimensionConfig,
+    BlueprintConfig,
+    DiagnoseConfig,
+    CommentConfig
+  },
   data() {
     return {
-      modalIsShow: false,
-      isSubmit: false
+      modalIsShow: true,
+      isSubmit: false,
+      curStep: 0,
+      steps: [
+        {
+          name: "知识/能力维度设置",
+          val: "dimension",
+          disabled: false
+        },
+        {
+          name: "命题蓝图设置",
+          val: "blueprint",
+          disabled: false
+        },
+        {
+          name: "诊断规则定义",
+          val: "diagnose",
+          disabled: false
+        },
+        {
+          name: "评价模型设置",
+          val: "comment",
+          disabled: false
+        }
+      ]
     };
   },
+  computed: {
+    compName() {
+      const stepVal = this.steps[this.curStep].val;
+      return `${stepVal}-config`;
+    },
+    insCont() {
+      return `${this.instance.semester}-${this.instance.examName}-${this.instance.courseName}(${this.instance.courseCode})`;
+    }
+  },
   methods: {
     visibleChange() {},
     cancel() {
@@ -35,6 +99,10 @@ export default {
     },
     open() {
       this.modalIsShow = true;
+    },
+    changeStep(ind) {
+      if (ind === this.curStep) return;
+      this.curStep = ind;
     }
   }
 };

+ 96 - 0
src/modules/base/components/baseConfig/BlueprintConfig.vue

@@ -0,0 +1,96 @@
+<template>
+  <div class="blueprint-config">
+    <div class="mb-4 box-justify">
+      <el-button type="success" @click="toImport">导入</el-button>
+    </div>
+
+    <div class="part-box part-box-border-bold">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column prop="courseCode" label="课程代码"></el-table-column>
+        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
+        <el-table-column prop="courseName" label="试卷编号"> </el-table-column>
+        <el-table-column prop="courseName" label="大题号"> </el-table-column>
+        <el-table-column prop="courseName" label="小题号"> </el-table-column>
+        <el-table-column prop="courseName" label="题目类型"> </el-table-column>
+        <el-table-column prop="courseName" label="题目满分"> </el-table-column>
+        <el-table-column prop="courseName" label="计分规则"> </el-table-column>
+        <el-table-column prop="knowledgeDim" label="知识模块">
+          <template slot-scope="scope">
+            <el-select
+              v-model="scope.row.knowledgeDim"
+              placeholder="请选择"
+              filterable
+              clearable
+              multiple
+            >
+              <el-option
+                v-for="item in knowledgeList"
+                :key="item.code"
+                :value="item.code"
+                :label="item.name"
+              >
+              </el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column prop="abilityDim" label="能力模块">
+          <template slot-scope="scope">
+            <el-select
+              v-model="scope.row.abilityDim"
+              placeholder="请选择"
+              filterable
+              clearable
+              multiple
+            >
+              <el-option
+                v-for="item in abilityList"
+                :key="item.code"
+                :value="item.code"
+                :label="item.name"
+              >
+              </el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <import-file
+      ref="ImportFile"
+      title="上传文件"
+      :upload-url="uploadUrl"
+      :download-url="downloadUrl"
+      :download-filename="downloadFilename"
+      :format="['xls', 'xlsx']"
+      @upload-success="fileUploaded"
+    >
+    </import-file>
+  </div>
+</template>
+
+<script>
+import ImportFile from "@/components/ImportFile";
+
+export default {
+  name: "blueprint-config",
+  components: { ImportFile },
+  data() {
+    return {
+      dataList: [],
+      knowledgeList: [],
+      abilityList: [],
+      // upload
+      uploadUrl: "yourUploadPath",
+      downloadUrl: "",
+      downloadFilename: ""
+    };
+  },
+  methods: {
+    getList() {},
+    toImport() {
+      this.$refs.ImportFile.open();
+    },
+    fileUploaded() {}
+  }
+};
+</script>

+ 134 - 0
src/modules/base/components/baseConfig/CommentAbility.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="comment-ability">
+    <el-table ref="TableList" :data="dataList">
+      <el-table-column prop="level" label="等级" width="60"></el-table-column>
+      <el-table-column prop="level" label="划分规划" width="300">
+        <div
+          slot-scope="scope"
+          :class="[
+            'rate-input',
+            { 'rate-input-offset-left': scope.$index === 0 }
+          ]"
+        >
+          <el-input-number
+            v-if="scope.$index !== 0"
+            v-model="scope.row.startRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+          <span v-if="scope.$index !== 0">≤</span>
+          <span>百分位等级TOP</span>
+          <span>≤</span>
+          <el-input-number
+            v-model="scope.row.endRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+        </div>
+      </el-table-column>
+      <el-table-column
+        prop="levelDesc"
+        label="水平层次"
+        width="140"
+      ></el-table-column>
+      <el-table-column prop="result" label="诊断结果"></el-table-column>
+      <el-table-column prop="suggest" label="学习建议"></el-table-column>
+      <el-table-column
+        class-name="action-column"
+        label="操作"
+        width="80px"
+        align="center"
+      >
+        <template slot-scope="scope">
+          <el-button class="btn-primary" type="text" @click="toEdit(scope.row)"
+            >编辑</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
+
+    <!-- ModifyAbilityComment -->
+    <modify-ability-comment
+      ref="ModifyAbilityComment"
+      :instance="curRow"
+      :modified="modified"
+    ></modify-ability-comment>
+  </div>
+</template>
+
+<script>
+import { initAbilityList } from "./defaultComment";
+import ModifyAbilityComment from "./ModifyAbilityComment.vue";
+
+export default {
+  name: "comment-ability",
+  components: { ModifyAbilityComment },
+  props: {
+    rates: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      dataList: [],
+      curRow: {},
+      errorMsg: ""
+    };
+  },
+  mounted() {
+    const data = this.rates.length ? this.rates : initAbilityList;
+    this.dataList = data.map(item => {
+      return { ...item };
+    });
+  },
+  methods: {
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyAbilityComment.open();
+    },
+    modified(data) {
+      const ind = this.dataList.findIndex(item => item.level === data.level);
+      this.dataList[ind] = this.$objAssign(this.dataList[ind], data);
+    },
+    rateChange() {
+      const isEmpty = num => !num && num !== 0;
+
+      if (
+        this.dataList.some(
+          item => isEmpty(item.startRate) || isEmpty(item.endRate)
+        )
+      ) {
+        this.errorMsg = "请完成划分规则";
+        return;
+      }
+
+      for (let i = 0; i < this.dataList.length; i++) {
+        const item = this.dataList[i];
+        if (i) {
+          const prevItem = this.dataList[i - 1];
+          if (prevItem.endRate + 1 !== item.startRate) {
+            this.errorMsg = "请保证区间连续";
+            return;
+          }
+        }
+      }
+    }
+  }
+};
+</script>

+ 59 - 0
src/modules/base/components/baseConfig/CommentConfig.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="comment-config">
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
+
+    <component :is="compName" :course="course"></component>
+  </div>
+</template>
+
+<script>
+import CommentKnowledge from "./CommentKnowledge.vue";
+import CommentAbility from "./CommentAbility.vue";
+
+export default {
+  name: "comment-config",
+  components: { CommentKnowledge, CommentAbility },
+  props: {
+    course: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      curTab: "knowledge",
+      tabs: [
+        {
+          name: "知识维度",
+          val: "knowledge"
+        },
+        {
+          name: "能力维度",
+          val: "ability"
+        }
+      ]
+    };
+  },
+  computed: {
+    compName() {
+      return `comment-${this.curTab}`;
+    }
+  },
+  methods: {
+    selectMenu(tab) {
+      this.curTab = tab;
+    }
+  }
+};
+</script>

+ 134 - 0
src/modules/base/components/baseConfig/CommentKnowledge.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="comment-knowledge">
+    <el-table ref="TableList" :data="dataList">
+      <el-table-column prop="level" label="等级" width="60"></el-table-column>
+      <el-table-column prop="level" label="划分规划" width="280">
+        <div
+          slot-scope="scope"
+          :class="[
+            'rate-input',
+            { 'rate-input-offset-left': scope.$index === dataList.length - 1 }
+          ]"
+        >
+          <el-input-number
+            v-if="scope.$index !== dataList.length - 1"
+            v-model="scope.row.startRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+          <span v-if="scope.$index !== dataList.length - 1">≤</span>
+          <span>个人得分率</span>
+          <span v-if="scope.$index !== 0">≤</span>
+          <el-input-number
+            v-if="scope.$index !== 0"
+            v-model="scope.row.endRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+        </div>
+      </el-table-column>
+      <el-table-column
+        prop="levelDesc"
+        label="水平层次"
+        width="140"
+      ></el-table-column>
+      <el-table-column prop="result" label="诊断结果"></el-table-column>
+      <el-table-column prop="suggest" label="学习建议"></el-table-column>
+      <el-table-column
+        class-name="action-column"
+        label="操作"
+        width="80px"
+        align="center"
+      >
+        <template slot-scope="scope">
+          <el-button class="btn-primary" type="text" @click="toEdit(scope.row)"
+            >编辑</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
+    <!-- ModifyKnowledgeComment -->
+    <modify-knowledge-comment
+      ref="ModifyKnowledgeComment"
+      :instance="curRow"
+      :modified="modified"
+    ></modify-knowledge-comment>
+  </div>
+</template>
+
+<script>
+import { initKnowledgeList } from "./defaultComment";
+import ModifyKnowledgeComment from "./ModifyKnowledgeComment.vue";
+
+export default {
+  name: "comment-knowledge",
+  components: { ModifyKnowledgeComment },
+  props: {
+    rates: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      dataList: [],
+      curRow: {},
+      errorMsg: ""
+    };
+  },
+  mounted() {
+    const data = this.rates.length ? this.rates : initKnowledgeList;
+    this.dataList = data.map(item => {
+      return { ...item };
+    });
+  },
+  methods: {
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyKnowledgeComment.open();
+    },
+    modified(data) {
+      const ind = this.dataList.findIndex(item => item.level === data.level);
+      this.dataList[ind] = this.$objAssign(this.dataList[ind], data);
+    },
+    rateChange() {
+      const isEmpty = num => !num && num !== 0;
+
+      if (
+        this.dataList.some(
+          item => isEmpty(item.startRate) || isEmpty(item.endRate)
+        )
+      ) {
+        this.errorMsg = "请完成划分规则";
+        return;
+      }
+
+      for (let i = 0; i < this.dataList.length; i++) {
+        const item = this.dataList[i];
+        if (i) {
+          const prevItem = this.dataList[i - 1];
+          if (prevItem.startRate - 1 !== item.endRate) {
+            this.errorMsg = "请保证区间连续";
+            return;
+          }
+        }
+      }
+    }
+  }
+};
+</script>

+ 174 - 0
src/modules/base/components/baseConfig/DiagnoseConfig.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="diagnose-config">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="180px"
+    >
+      <el-form-item prop="knowledgeTitle" label="知识:">
+        <el-input
+          v-model.trim="modalForm.knowledgeTitle"
+          placeholder="知识"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="rateSet" label="二级维度的精熟度定义:">
+        <div class="part-box part-box-pad part-box-border-bold">
+          <proficiency-edit
+            :rates="modalForm.rateSet"
+            @data-change="rateSetChange"
+          ></proficiency-edit>
+        </div>
+      </el-form-item>
+      <el-form-item prop="abilityTitle" label="能力:">
+        <el-input
+          v-model.trim="modalForm.abilityTitle"
+          placeholder="能力"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="isfuf" label="是否呈现赋分:">
+        <el-radio-group v-model="modalForm.isfuf">
+          <el-radio
+            v-for="(val, key) in BOOLEAN_TYPE"
+            :key="key"
+            :label="key * 1"
+            >{{ val }}</el-radio
+          >
+        </el-radio-group>
+        <p class="tips-info">
+          说明:若选择“是”,则考后需提供学生的赋分成绩(学号、总分),报告中的分值显示赋分后的成绩分数;若选择“否”,则报告中的分值显示卷面原始分。
+        </p>
+      </el-form-item>
+      <el-form-item prop="fullScore" label="满分:">
+        <el-input-number
+          v-model="modalForm.fullScore"
+          placeholder="请输入满分,如100"
+          :min="1"
+          :max="9999"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+        <p class="tips-info">
+          说明:若显示赋分,则填写赋分满分分值,否则填写卷面原始分满分分值。
+        </p>
+      </el-form-item>
+      <el-form-item prop="passScore" label="及格分:">
+        <el-input-number
+          v-model="modalForm.passScore"
+          placeholder="请输入及格分,如60"
+          :min="1"
+          :max="9999"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+        <p class="tips-info">
+          说明:成绩分数≥及格分数线,报告中的结果显示“通过”,否则为“不通过”。
+        </p>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { BOOLEAN_TYPE } from "@/constants/enumerate";
+import ProficiencyEdit from "./ProficiencyEdit.vue";
+
+const initModalForm = {
+  id: "",
+  knowledgeTitle: "课程标准规定的学科内容",
+  abilityTitle: "经学习与训练内化而成的心理结构",
+  isfuf: 0,
+  fullScore: 100,
+  passScore: 100,
+  rateSet: []
+};
+
+export default {
+  name: "diagnose-config",
+  components: { ProficiencyEdit },
+  data() {
+    const isEmpty = num => !num && num !== 0;
+
+    const rateSetValidator = (rule, value, callback) => {
+      if (
+        value.some(item => isEmpty(item.startRate) || isEmpty(item.endRate))
+      ) {
+        return callback(new Error("请完成精熟度定义"));
+      }
+
+      for (let i = 0; i < value.length; i++) {
+        const item = value[i];
+        if (i) {
+          const prevItem = value[i - 1];
+          if (prevItem.startRate - 1 !== item.endRate)
+            return callback(new Error("请保证区间连续"));
+        }
+      }
+
+      callback();
+    };
+    return {
+      modalForm: { ...initModalForm },
+      BOOLEAN_TYPE,
+      rules: {
+        knowledgeTitle: [
+          {
+            required: true,
+            message: "请输入知识",
+            trigger: "change"
+          },
+          {
+            max: 100,
+            message: "知识字数不能超过100",
+            trigger: "change"
+          }
+        ],
+        abilityTitle: [
+          {
+            required: true,
+            message: "请输入能力",
+            trigger: "change"
+          },
+          {
+            max: 100,
+            message: "能力字数不能超过100",
+            trigger: "change"
+          }
+        ],
+        fullScore: [
+          {
+            required: true,
+            message: "请输入满分",
+            trigger: "change"
+          }
+        ],
+        passScore: [
+          {
+            required: true,
+            message: "请输入及格分",
+            trigger: "change"
+          }
+        ],
+        rateSet: [
+          {
+            validator: rateSetValidator,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    getList() {},
+    rateSetChange(data) {
+      this.modalForm.rateSet = data;
+      this.$refs.modalFormComp.validateField("rateSet");
+    },
+    async submit() {}
+  }
+};
+</script>

+ 157 - 0
src/modules/base/components/baseConfig/DimensionAbilityList.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="dimension-ability-list">
+    <div class="mb-4 box-justify">
+      <el-button type="success" @click="toImport">导入</el-button>
+      <el-button type="primary" @click="toAdd">新增</el-button>
+    </div>
+
+    <div class="part-box part-box-border-bold dimension-table">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column prop="courseCode" label="课程代码"></el-table-column>
+        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
+        <el-table-column prop="courseName" label="一级能力维度">
+        </el-table-column>
+        <el-table-column prop="courseName" label="一级维度编号">
+        </el-table-column>
+        <el-table-column prop="courseName" label="一级维度术语解释">
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="160px"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toDelete(scope)"
+              >删除</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading || scope.row.isFirstSec"
+              @click="toUp(scope)"
+              >上移</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading || scope.row.isLastSec"
+              @click="toDown(scope)"
+              >下移</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <import-file
+      ref="ImportFile"
+      title="上传文件"
+      :upload-url="uploadUrl"
+      :upload-data="uploadData"
+      :download-url="downloadUrl"
+      :download-filename="downloadFilename"
+      :format="['xls', 'xlsx']"
+      @upload-success="fileUploaded"
+    >
+    </import-file>
+    <!-- ModifyAbilityDim -->
+    <modify-ability-dim
+      ref="ModifyAbilityDim"
+      :instance="curRow"
+      :dict-data="dataList"
+      @modified="modified"
+    ></modify-ability-dim>
+  </div>
+</template>
+
+<script>
+import ImportFile from "@/components/ImportFile";
+import ModifyAbilityDim from "./ModifyAbilityDim.vue";
+
+export default {
+  name: "dimension-ability-list",
+  components: { ImportFile, ModifyAbilityDim },
+  props: {
+    course: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      dataList: [],
+      curRow: {},
+      loading: false,
+      // upload
+      uploadUrl: "yourUploadPath",
+      downloadUrl: "/path/要下载的文件.xls",
+      downloadFilename: "要下载的文件.xls",
+      uploadData: {}
+    };
+  },
+  mounted() {
+    this.getDict();
+  },
+  methods: {
+    getList() {},
+    getDict() {},
+    toImport() {
+      this.$refs.ImportFile.open();
+    },
+    fileUploaded() {
+      this.$message.success("导入成功!");
+      this.getList();
+    },
+    modified(data) {
+      this.dataList.push(data);
+      // TODO:排序
+    },
+    toAdd() {
+      this.curRow = {
+        courseCode: this.course.courseCode,
+        courseName: this.course.courseName
+      };
+      this.$refs.ModifyAbilityDim.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyAbilityDim.open();
+    },
+    toDelete({ $index }) {
+      this.dataList.splice($index, 1);
+    },
+    toUp({ row, $index }) {
+      const pos = $index;
+      const curRowCode = row.firstCode;
+      const prevRowCode = this.dataList[$index - 1].firstCode;
+      this.dataList.splice(pos, 1);
+      this.dataList.splice(pos - 1, 0, row);
+      this.dataList[pos].firstCode = curRowCode;
+      this.dataList[pos - 1].firstCode = prevRowCode;
+    },
+    toDown({ row, $index }) {
+      const pos = $index;
+      const curRowCode = row.firstCode;
+      const nextRowCode = this.dataList[$index + 1].firstCode;
+      this.dataList.splice(pos, 1);
+      this.dataList.splice(pos, 0, row);
+      this.dataList[pos].firstCode = curRowCode;
+      this.dataList[pos + 1].firstCode = nextRowCode;
+    }
+  }
+};
+</script>

+ 59 - 0
src/modules/base/components/baseConfig/DimensionConfig.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="dimension-config">
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
+
+    <component :is="compName" :course="course"></component>
+  </div>
+</template>
+
+<script>
+import DimensionKnowledgeList from "./DimensionKnowledgeList.vue";
+import DimensionAbilityList from "./DimensionAbilityList.vue";
+
+export default {
+  name: "dimension-config",
+  components: { DimensionKnowledgeList, DimensionAbilityList },
+  props: {
+    course: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      curTab: "knowledge",
+      tabs: [
+        {
+          name: "知识维度",
+          val: "knowledge"
+        },
+        {
+          name: "能力维度",
+          val: "ability"
+        }
+      ]
+    };
+  },
+  computed: {
+    compName() {
+      return `dimension-${this.curTab}-list`;
+    }
+  },
+  methods: {
+    selectMenu(tab) {
+      this.curTab = tab;
+    }
+  }
+};
+</script>

+ 184 - 0
src/modules/base/components/baseConfig/DimensionKnowledgeList.vue

@@ -0,0 +1,184 @@
+<template>
+  <div class="dimension-knowledge-list">
+    <div class="mb-4 box-justify">
+      <el-button type="success" @click="toImport">导入</el-button>
+      <el-button type="primary" @click="toAdd">新增</el-button>
+    </div>
+
+    <div class="part-box part-box-border-bold dimension-table">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column prop="courseCode" label="课程代码"></el-table-column>
+        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
+        <el-table-column prop="firstName" label="一级知识维度">
+        </el-table-column>
+        <el-table-column prop="firstCode" label="一级维度编号">
+        </el-table-column>
+        <el-table-column prop="secondName" label="二级知识维度">
+        </el-table-column>
+        <el-table-column prop="secondCode" label="二级维度编号">
+        </el-table-column>
+        <el-table-column prop="firsetNameDesc" label="一级维度术语解释">
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="180px"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              class="btn-danger"
+              type="text"
+              :disabled="loading"
+              @click="toDelete(scope)"
+              >删除</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading || scope.row.isFirstSec"
+              @click="toUp(scope)"
+              >上移</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading || scope.row.isLastSec"
+              @click="toDown(scope)"
+              >下移</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <import-file
+      ref="ImportFile"
+      title="上传文件"
+      :upload-url="uploadUrl"
+      :upload-data="uploadData"
+      :download-url="downloadUrl"
+      :download-filename="downloadFilename"
+      :format="['xls', 'xlsx']"
+      @upload-success="fileUploaded"
+    >
+    </import-file>
+    <!-- ModifyKnowledgeDim -->
+    <modify-knowledge-dim
+      ref="ModifyKnowledgeDim"
+      :instance="curRow"
+      :dict-data="dataDict"
+      @modified="modified"
+    ></modify-knowledge-dim>
+  </div>
+</template>
+
+<script>
+import ImportFile from "@/components/ImportFile";
+import dimenData from "./dimenData";
+import ModifyKnowledgeDim from "./ModifyKnowledgeDim.vue";
+
+export default {
+  name: "dimension-knowledge-list",
+  components: { ImportFile, ModifyKnowledgeDim },
+  props: {
+    course: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      dataList: dimenData,
+      // dataList: [],
+      dataDict: [],
+      curRow: {},
+      loading: false,
+      // upload
+      uploadUrl: "yourUploadPath",
+      downloadUrl: "/path/要下载的文件.xls",
+      downloadFilename: "要下载的文件.xls",
+      uploadData: {}
+    };
+  },
+  mounted() {
+    this.getDict();
+  },
+  methods: {
+    getList() {},
+    getDict() {
+      let dataDict = {};
+      this.dataList.forEach(item => {
+        if (!dataDict[item.firstCode]) {
+          dataDict[item.firstCode] = {
+            name: item.firstName,
+            code: item.firstCode,
+            children: []
+          };
+        }
+        dataDict[item.firstCode].children.push({
+          name: item.secondName,
+          code: item.secondCode
+        });
+      });
+      this.dataDict = Object.values(dataDict);
+    },
+    toImport() {
+      this.$refs.ImportFile.open();
+    },
+    fileUploaded() {
+      this.$message.success("导入成功!");
+      this.getList();
+    },
+    modified(data) {
+      this.dataList.push(data);
+      // TODO:排序
+    },
+    toAdd() {
+      this.curRow = {
+        courseCode: this.course.courseCode,
+        courseName: this.course.courseName
+      };
+      this.$refs.ModifyKnowledgeDim.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyKnowledgeDim.open();
+    },
+    toDelete({ $index }) {
+      this.dataList.splice($index, 1);
+    },
+    toUp({ row, $index }) {
+      const pos = $index;
+      const rowSecondInd = row.secondInd;
+      const rowFirstCode = row.firstCode;
+      this.dataList.splice(pos, 1);
+      this.dataList.splice(pos - 1, 0, row);
+      this.dataList[pos - 1].secondInd = rowSecondInd - 1;
+      this.dataList[pos - 1].secondCode = `${rowFirstCode}${rowSecondInd - 1}`;
+      this.dataList[pos].secondInd = rowSecondInd;
+      this.dataList[pos].secondCode = `${rowFirstCode}${rowSecondInd}`;
+    },
+    toDown({ row, $index }) {
+      const pos = $index;
+      const rowSecondInd = row.secondInd;
+      const rowFirstCode = row.firstCode;
+      this.dataList.splice(pos, 1);
+      this.dataList.splice(pos, 0, row);
+      this.dataList[pos + 1].secondInd = rowSecondInd + 1;
+      this.dataList[pos + 1].secondCode = `${rowFirstCode}${rowSecondInd + 1}`;
+      this.dataList[pos].secondInd = rowSecondInd;
+      this.dataList[pos].secondCode = `${rowFirstCode}${rowSecondInd}`;
+    }
+  }
+};
+</script>

+ 140 - 0
src/modules/base/components/baseConfig/ModifyAbilityComment.vue

@@ -0,0 +1,140 @@
+<template>
+  <el-dialog
+    class="modify-ability-comment"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="700px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="100px"
+    >
+      <el-form-item label="等级:">
+        {{ modalForm.level }}
+      </el-form-item>
+      <el-form-item label="水平层次:">
+        {{ modalForm.levelDesc }}
+      </el-form-item>
+      <el-form-item label="划分规则:">
+        <p v-if="modalForm.level === 'A'">
+          百分位等级TOP≤{{ modalForm.endRate }}%
+        </p>
+        <p v-else>
+          {{ modalForm.startRate }}%≤百分位等级TOP≤{{ modalForm.endRate }}%
+        </p>
+      </el-form-item>
+      <el-form-item prop="result" label="诊断结果:">
+        <el-input
+          v-model.trim="modalForm.result"
+          type="textarea"
+          :autosize="{ minRows: 3, maxRows: 5 }"
+          placeholder="请输入诊断结果"
+          maxlength="9999"
+          show-word-limit
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="suggest" label="学习建议:">
+        <el-input
+          v-model.trim="modalForm.suggest"
+          type="textarea"
+          :autosize="{ minRows: 3, maxRows: 5 }"
+          placeholder="请输入学习建议"
+          maxlength="9999"
+          show-word-limit
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+const initModalForm = {
+  id: null,
+  level: "",
+  levelDesc: "",
+  startRate: "",
+  endRate: "",
+  result: "",
+  suggest: ""
+};
+
+export default {
+  name: "modify-ability-comment",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "划分规则";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: {},
+      rules: {
+        result: [
+          {
+            required: true,
+            message: "请输入诊断结果",
+            trigger: "change"
+          }
+        ],
+        suggest: [
+          {
+            required: true,
+            message: "请输入学习建议",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      this.modalForm = this.$objAssign(initModalForm, val);
+    },
+    visibleChange() {
+      this.initData(this.instance);
+      this.$nextTick(() => {
+        this.$refs.modalFormComp.clearValidate();
+      });
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      this.$emit("modified", this.modalForm);
+      this.cancel();
+    }
+  }
+};
+</script>

+ 213 - 0
src/modules/base/components/baseConfig/ModifyAbilityDim.vue

@@ -0,0 +1,213 @@
+<template>
+  <el-dialog
+    class="modify-ability-dim"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <div class="part-box part-box-pad part-box-border">
+      <el-form
+        ref="modalFormComp"
+        :model="modalForm"
+        :rules="rules"
+        label-width="140px"
+      >
+        <el-form-item prop="courseCode" label="课程代码:" required>
+          <el-input
+            v-model.trim="modalForm.courseCode"
+            placeholder="请输入课程代码"
+            readonly
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="courseName" label="课程名称:" required>
+          <el-input
+            v-model.trim="modalForm.courseName"
+            placeholder="请输入课程名称"
+            readonly
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="firstName" label="一级能力维度:">
+          <el-input
+            v-model.trim="modalForm.firstName"
+            placeholder="请输入一级能力维度"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="firstCode" label="一级维度编号:">
+          <el-input
+            v-model.trim="modalForm.firstCode"
+            placeholder="请输入一级维度编号"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="一级维度术语解释:">
+          <el-input
+            v-model.trim="modalForm.firsetNameDesc"
+            type="textarea"
+            :autosize="{ minRows: 1, maxRows: 5 }"
+            placeholder="请输入一级维度术语解释"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateKnowledgeDimension } from "../../api";
+
+const initModalForm = {
+  id: null,
+  courseName: "",
+  courseCode: "",
+  firstName: "",
+  firstCode: "",
+  firsetNameDesc: ""
+};
+
+export default {
+  name: "modify-ability-dim",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    dictData: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "能力维度";
+    }
+  },
+  data() {
+    const firstNameValidator = (rule, value, callback) => {
+      let existFirstDim = this.dictData.find(item => item.firstName === value);
+
+      if (this.isEdit) {
+        if (existFirstDim && this.instance.firstName !== value) {
+          return callback(new Error("一级能力维度已存在"));
+        }
+      } else {
+        if (existFirstDim) {
+          return callback(new Error("一级能力维度已存在"));
+        }
+      }
+
+      callback();
+    };
+    const firstCodeValidator = (rule, value, callback) => {
+      let existFirstDim = this.dictData.find(item => item.firstCode === value);
+
+      if (this.isEdit) {
+        if (existFirstDim && this.instance.firstCode !== value) {
+          return callback(new Error("一级维度编号已存在"));
+        }
+      } else {
+        if (existFirstDim) {
+          return callback(new Error("一级维度编号已存在"));
+        }
+      }
+
+      callback();
+    };
+
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: {},
+      rules: {
+        firstName: [
+          {
+            required: true,
+            message: "请输入一级能力维度",
+            trigger: "change"
+          },
+          {
+            max: 50,
+            message: "一级能力维度字数不能超过50",
+            trigger: "change"
+          },
+          {
+            validator: firstNameValidator,
+            trigger: "change"
+          }
+        ],
+        firstCode: [
+          {
+            required: true,
+            pattern: /^[A-Z]{1}$/,
+            message: "一级维度编号只能是大写字母A-Z,长度为1",
+            trigger: "change"
+          },
+          {
+            validator: firstCodeValidator,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      this.modalForm = this.$objAssign(initModalForm, val);
+    },
+    visibleChange() {
+      this.initData(this.instance);
+      this.$nextTick(() => {
+        this.$refs.modalFormComp.clearValidate();
+      });
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    dimValidate() {
+      this.$refs.modalFormComp.validateField([
+        "firstName",
+        "firstCode",
+        "secondName",
+        "secondCode"
+      ]);
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const datas = { ...this.modalForm };
+      const data = await updateKnowledgeDimension(datas).catch(() => {});
+      this.isSubmit = false;
+      if (!data) return;
+
+      this.$emit("confirm", this.modalForm);
+      this.cancel();
+    }
+  }
+};
+</script>

+ 143 - 0
src/modules/base/components/baseConfig/ModifyKnowledgeComment.vue

@@ -0,0 +1,143 @@
+<template>
+  <el-dialog
+    class="modify-knowledge-comment"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="700px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="100px"
+    >
+      <el-form-item label="等级:">
+        {{ modalForm.level }}
+      </el-form-item>
+      <el-form-item label="水平层次:">
+        {{ modalForm.levelDesc }}
+      </el-form-item>
+      <el-form-item label="划分规则:">
+        <p v-if="modalForm.startRate === 0">
+          个人得分率≥{{ modalForm.startRate }}%
+        </p>
+        <p v-else-if="modalForm.endRate === 100">
+          个人得分率≤{{ modalForm.endRate }}%
+        </p>
+        <p v-else>
+          {{ modalForm.startRate }}%≤个人得分率≤{{ modalForm.endRate }}%
+        </p>
+      </el-form-item>
+      <el-form-item prop="result" label="诊断结果:">
+        <el-input
+          v-model.trim="modalForm.result"
+          type="textarea"
+          :autosize="{ minRows: 3, maxRows: 5 }"
+          placeholder="请输入诊断结果"
+          maxlength="9999"
+          show-word-limit
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="suggest" label="学习建议:">
+        <el-input
+          v-model.trim="modalForm.suggest"
+          type="textarea"
+          :autosize="{ minRows: 3, maxRows: 5 }"
+          placeholder="请输入学习建议"
+          maxlength="9999"
+          show-word-limit
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+const initModalForm = {
+  id: null,
+  level: "",
+  levelDesc: "",
+  startRate: "",
+  endRate: "",
+  result: "",
+  suggest: ""
+};
+
+export default {
+  name: "modify-knowledge-comment",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "划分规则";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: {},
+      rules: {
+        result: [
+          {
+            required: true,
+            message: "请输入诊断结果",
+            trigger: "change"
+          }
+        ],
+        suggest: [
+          {
+            required: true,
+            message: "请输入学习建议",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      this.modalForm = this.$objAssign(initModalForm, val);
+    },
+    visibleChange() {
+      this.initData(this.instance);
+      this.$nextTick(() => {
+        this.$refs.modalFormComp.clearValidate();
+      });
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      this.$emit("modified", this.modalForm);
+      this.cancel();
+    }
+  }
+};
+</script>

+ 302 - 0
src/modules/base/components/baseConfig/ModifyKnowledgeDim.vue

@@ -0,0 +1,302 @@
+<template>
+  <el-dialog
+    class="modify-knowledge-dim"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <div class="part-box part-box-pad part-box-border">
+      <el-form
+        ref="modalFormComp"
+        :model="modalForm"
+        :rules="rules"
+        label-width="140px"
+      >
+        <el-form-item prop="courseCode" label="课程代码:" required>
+          <el-input
+            v-model.trim="modalForm.courseCode"
+            placeholder="请输入课程代码"
+            readonly
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="courseName" label="课程名称:" required>
+          <el-input
+            v-model.trim="modalForm.courseName"
+            placeholder="请输入课程名称"
+            readonly
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="firstName" label="一级知识维度:">
+          <el-input
+            v-model.trim="modalForm.firstName"
+            placeholder="请输入一级知识维度"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="firstCode" label="一级维度编号:">
+          <el-input
+            v-model.trim="modalForm.firstCode"
+            placeholder="请输入一级维度编号"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="secondName" label="二级知识维度:">
+          <el-input
+            v-model.trim="modalForm.secondName"
+            placeholder="请输入二级知识维度"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="secondCode" label="二级维度编号:">
+          <el-input
+            v-model.trim="modalForm.secondCode"
+            placeholder="请输入二级维度编号"
+            clearable
+            @change="dimValidate"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="一级维度术语解释:">
+          <el-input
+            v-model.trim="modalForm.firsetNameDesc"
+            type="textarea"
+            :autosize="{ minRows: 1, maxRows: 5 }"
+            placeholder="请输入一级维度术语解释"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateKnowledgeDimension } from "../../api";
+
+const initModalForm = {
+  id: null,
+  courseName: "",
+  courseCode: "",
+  firstName: "",
+  firstCode: "",
+  secondName: "",
+  secondCode: "",
+  firsetNameDesc: ""
+};
+
+export default {
+  name: "modify-knowledge-dim",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    dictData: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "知识维度";
+    }
+  },
+  data() {
+    const firstNameValidator = (rule, value, callback) => {
+      if (!this.modalForm.firstCode || !value) return callback();
+
+      let existFirstDim = this.dictData.find(
+        item => item.code === this.modalForm.firstCode
+      );
+      if (existFirstDim) {
+        if (existFirstDim.firstName !== value)
+          return callback(new Error("一级知识维度错误"));
+      } else {
+        existFirstDim = this.dictData.find(item => item.name === value);
+        if (existFirstDim) return callback(new Error("一级知识维度已存在"));
+      }
+
+      callback();
+    };
+
+    const secondNameValidator = (rule, value, callback) => {
+      if (
+        !this.modalForm.secondCode ||
+        !value ||
+        !this.modalForm.firstName ||
+        !this.modalForm.firstCode
+      )
+        return callback();
+
+      let existFirstDim = this.dictData.find(
+        item => item.code === this.modalForm.firstCode
+      );
+      if (existFirstDim) {
+        let existSecondDim = existFirstDim.children.find(
+          item => item.code === this.modalForm.secondCode
+        );
+        if (existSecondDim) {
+          return callback();
+        } else {
+          existSecondDim = existFirstDim.children.find(
+            item => item.name === value
+          );
+          if (existSecondDim) return callback(new Error("二级知识维度已存在"));
+        }
+      } else {
+        const secondDimExist = this.dictData.some(item =>
+          item.children.some(elem => elem.name === value)
+        );
+        if (secondDimExist) return callback(new Error("二级知识维度已存在"));
+      }
+
+      callback();
+    };
+
+    const secondCodeValidator = (rule, value, callback) => {
+      if (
+        !this.modalForm.secondCode ||
+        !value ||
+        !this.modalForm.firstName ||
+        !this.modalForm.firstCode
+      )
+        return callback();
+
+      if (value[0] !== this.modalForm.firstCode) {
+        return callback(new Error("二级维度编码首字母应该与一级维度编码一致"));
+      }
+
+      let existFirstDim = this.dictData.find(
+        item => item.code === this.modalForm.firstCode
+      );
+
+      if (existFirstDim) {
+        let existSecondDim = existFirstDim.children.find(
+          item => item.code === this.modalForm.secondCode
+        );
+        if (existSecondDim) return callback(new Error("二级维度编号已存在"));
+      }
+
+      callback();
+    };
+
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: {},
+      rules: {
+        firstName: [
+          {
+            required: true,
+            message: "请输入一级知识维度",
+            trigger: "change"
+          },
+          {
+            max: 50,
+            message: "一级知识维度字数不能超过50",
+            trigger: "change"
+          },
+          {
+            validator: firstNameValidator,
+            trigger: "change"
+          }
+        ],
+        firstCode: [
+          {
+            required: true,
+            pattern: /^[A-Z]{1}$/,
+            message: "一级维度编号只能是大写字母A-Z,长度为1",
+            trigger: "change"
+          }
+        ],
+        secondName: [
+          {
+            required: true,
+            message: "请输入二级知识维度",
+            trigger: "change"
+          },
+          {
+            max: 50,
+            message: "二级知识维度字数不能超过50",
+            trigger: "change"
+          },
+          {
+            validator: secondNameValidator,
+            trigger: "change"
+          }
+        ],
+        secondCode: [
+          {
+            required: true,
+            pattern: /^[A-Z][0-9]{1,}$/,
+            message: "二级维度编号只能是大写字母+数字",
+            trigger: "change"
+          },
+          {
+            validator: secondCodeValidator,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      this.modalForm = this.$objAssign(initModalForm, val);
+    },
+    visibleChange() {
+      this.initData(this.instance);
+      this.$nextTick(() => {
+        this.$refs.modalFormComp.clearValidate();
+      });
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    dimValidate() {
+      this.$refs.modalFormComp.validateField([
+        "firstName",
+        "firstCode",
+        "secondName",
+        "secondCode"
+      ]);
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const datas = { ...this.modalForm };
+      const data = await updateKnowledgeDimension(datas).catch(() => {});
+      this.isSubmit = false;
+      if (!data) return;
+
+      this.$emit("confirm", this.modalForm);
+      this.cancel();
+    }
+  }
+};
+</script>

+ 109 - 0
src/modules/base/components/baseConfig/ProficiencyEdit.vue

@@ -0,0 +1,109 @@
+<template>
+  <div class="proficiency-edit">
+    <el-form ref="modalFormComp" label-width="180px">
+      <el-form-item
+        v-for="(item, ind) in modalForm"
+        :key="ind"
+        :label="`${item.title}:`"
+      >
+        <div
+          :class="[
+            'rate-input',
+            { 'rate-input-offset-left': ind === modalForm.length - 1 }
+          ]"
+        >
+          <el-input-number
+            v-if="ind !== modalForm.length - 1"
+            v-model="item.startRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+          <span v-if="ind !== modalForm.length - 1">≤</span>
+          <span>个人得分率</span>
+          <span v-if="ind !== 0">≤</span>
+          <el-input-number
+            v-if="ind !== 0"
+            v-model="item.endRate"
+            placeholder="请输入"
+            :min="0"
+            :max="100"
+            :step="1"
+            step-strictly
+            size="small"
+            :controls="false"
+            @change="rateChange"
+          ></el-input-number>
+        </div>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+const initRateSet = [
+  {
+    title: "熟练掌握",
+    startRate: null,
+    endRate: 100
+  },
+  {
+    title: "较好掌握",
+    startRate: null,
+    endRate: null
+  },
+  {
+    title: "基本掌握",
+    startRate: null,
+    endRate: null
+  },
+  {
+    title: "部分掌握",
+    startRate: null,
+    endRate: null
+  },
+  {
+    title: "没有掌握,需从头再学",
+    startRate: 0,
+    endRate: null
+  }
+];
+
+export default {
+  name: "proficiency-edit",
+  props: {
+    rates: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      modalForm: [...initRateSet]
+    };
+  },
+  mounted() {
+    if (!this.rates.length) {
+      this.modalForm = initRateSet.map(item => {
+        return { ...item };
+      });
+    } else {
+      this.modalForm = this.rates.map(item => {
+        return { ...item };
+      });
+    }
+  },
+  methods: {
+    rateChange() {
+      this.$emit("data-change", this.modalForm);
+    }
+  }
+};
+</script>

+ 95 - 0
src/modules/base/components/baseConfig/defaultComment.js

@@ -0,0 +1,95 @@
+export const initKnowledgeList = [
+  {
+    level: "A",
+    startRate: 90,
+    endRate: 100,
+    levelDesc: "表现优秀水平",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "B",
+    startRate: 75,
+    endRate: 89,
+    levelDesc: "表现良好水平",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "C",
+    startRate: 55,
+    endRate: 74,
+    levelDesc: "中等水平",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "D",
+    startRate: 40,
+    endRate: 54,
+    levelDesc: "有待提高水平",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "E",
+    startRate: 0,
+    endRate: 39,
+    levelDesc: "本课程没有学好",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  }
+];
+
+export const initAbilityList = [
+  {
+    level: "A",
+    startRate: 0,
+    endRate: 20,
+    levelDesc: "优秀",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "B",
+    startRate: 21,
+    endRate: 40,
+    levelDesc: "良好",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "C",
+    startRate: 41,
+    endRate: 60,
+    levelDesc: "中等",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "D",
+    startRate: 61,
+    endRate: 80,
+    levelDesc: "中等偏下",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  },
+  {
+    level: "E",
+    startRate: 81,
+    endRate: 100,
+    levelDesc: "表现不佳",
+    result:
+      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
+    suggest: "希望你在后续课程的的学习中能够继续保持"
+  }
+];

+ 26 - 0
src/modules/base/components/baseConfig/dimenData.js

@@ -0,0 +1,26 @@
+let data = [];
+
+const codes = "ABCDEFG";
+for (let i = 0; i < 4; i++) {
+  const firstCode = codes[i];
+  const firstName = `一级知识维度${firstCode}`;
+  for (let j = 0; j < 5; j++) {
+    const ind = i * 5 + j;
+    const secondCode = `${firstCode}${j + 1}`;
+    data[ind] = {
+      id: ind,
+      courseCode: "1100860011012",
+      courseName: "大学物理B(下)",
+      firstName,
+      firstCode,
+      secondName: `二级知识维度${secondCode}`,
+      secondCode,
+      secondInd: j + 1,
+      isFirstSec: j === 0,
+      isLastSec: j === 4,
+      firsetNameDesc: `一级维度术语解释${firstCode}`
+    };
+  }
+}
+
+export default data;

+ 12 - 0
src/modules/base/router.js

@@ -2,6 +2,8 @@
 import OrganizationManage from "./views/OrganizationManage.vue";
 import RoleManage from "./views/RoleManage.vue";
 import UserManage from "./views/UserManage.vue";
+import DataInitManage from "./views/DataInitManage.vue";
+import AnalysisBatchManage from "./views/AnalysisBatchManage.vue";
 
 export default [
   {
@@ -18,5 +20,15 @@ export default [
     path: "/base/user-manage",
     name: "UserManage",
     component: UserManage
+  },
+  {
+    path: "/base/data-init-manage",
+    name: "DataInitManage",
+    component: DataInitManage
+  },
+  {
+    path: "/base/analysis-batch-manage",
+    name: "AnalysisBatchManage",
+    component: AnalysisBatchManage
   }
 ];

+ 20 - 7
src/modules/base/views/DataInitManage.vue

@@ -25,7 +25,7 @@
       <div class="part-box-action"></div>
     </div>
     <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="tasks">
+      <el-table ref="TableList" :data="dataList">
         <el-table-column
           type="index"
           label="序号"
@@ -48,7 +48,6 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="scope.row.hasReportFile"
               class="btn-primary"
               type="text"
               :disabled="loading"
@@ -56,7 +55,6 @@
               >基础配置</el-button
             >
             <el-button
-              v-if="scope.row.resetCreatePdf"
               class="btn-primary"
               type="text"
               :disabled="loading"
@@ -78,14 +76,21 @@
         </el-pagination>
       </div>
     </div>
+    <!-- ModifyBaseConfig -->
+    <modify-base-config
+      ref="ModifyBaseConfig"
+      :instance="curRow"
+    ></modify-base-config>
   </div>
 </template>
 
 <script>
 import { dataInitList } from "../api";
+import ModifyBaseConfig from "../components/ModifyBaseConfig.vue";
 
 export default {
   name: "data-init-manage",
+  components: { ModifyBaseConfig },
   data() {
     return {
       filter: {
@@ -96,13 +101,19 @@ export default {
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
-      tasks: [],
-      curTask: {},
+      dataList: [
+        {
+          id: "1",
+          semester: "第一学期",
+          examName: "期中考试"
+        }
+      ],
+      curRow: {},
       loading: false
     };
   },
   mounted() {
-    this.toPage(1);
+    // this.toPage(1);
   },
   methods: {
     async getList() {
@@ -112,7 +123,7 @@ export default {
         pageSize: this.size
       };
       const data = await dataInitList(datas);
-      this.tasks = data.records;
+      this.dataList = data.records;
       this.total = data.total;
     },
     toPage(page) {
@@ -121,6 +132,8 @@ export default {
     },
     toConfig(row) {
       console.log(row);
+      this.curRow = row;
+      this.$refs.ModifyBaseConfig.open();
     },
     async toAssignScore(row) {
       console.log(row);

+ 6 - 0
src/modules/login/api.js

@@ -39,3 +39,9 @@ export const getSysConfig = key => {
 export const getSysTime = () => {
   return $postParam("/api/admin/common/get_system_time", {});
 };
+export const loginAuthen = datas => {
+  return $postParam("/api/report/wuda/open/user/authentication/login", datas);
+};
+export const logoutAuthen = datas => {
+  return $get("/api/report/wuda/open/user/authentication/logout", datas);
+};

+ 20 - 0
src/modules/login/router.js

@@ -1,6 +1,8 @@
 import LoginHome from "./views/LoginHome";
 import Login from "./views/Login";
 import SelectSchool from "./views/SelectSchool";
+import LoginAuthen from "./views/LoginAuthen";
+import LogoutAuthen from "./views/LogoutAuthen";
 
 export default {
   path: "/login-home",
@@ -23,6 +25,24 @@ export default {
         title: "选择学校",
         noRequire: true
       }
+    },
+    {
+      path: "/login-authen/:code",
+      name: "LoginAuthen",
+      component: LoginAuthen,
+      meta: {
+        title: "第三方登录",
+        noRequire: true
+      }
+    },
+    {
+      path: "/logout-authen",
+      name: "LogoutAuthen",
+      component: LogoutAuthen,
+      meta: {
+        title: "第三方退出",
+        noRequire: true
+      }
     }
   ]
 };

+ 0 - 265
src/modules/login/views/Login2.vue

@@ -1,265 +0,0 @@
-<template>
-  <div class="login login-box">
-    <div class="login-theme"></div>
-    <div class="login-body" @keyup.enter="submit('loginForm')">
-      <div class="login-title">
-        <img v-if="schoolLogo" :src="schoolLogo" alt="学校logo" />
-        <h1 v-else>知学知考</h1>
-      </div>
-      <div class="login-form">
-        <el-form ref="loginForm" :model="loginModel" :rules="loginRules">
-          <el-form-item prop="loginName">
-            <el-input
-              v-model.trim="loginModel.loginName"
-              placeholder="请输入账号"
-              name="username"
-              clearable
-            >
-              <i class="icon icon-phone" slot="prefix"></i>
-            </el-input>
-          </el-form-item>
-          <el-form-item prop="password">
-            <el-input
-              type="password"
-              v-model.trim="loginModel.password"
-              placeholder="请输入密码"
-              clearable
-            >
-              <i class="icon icon-password" slot="prefix"></i>
-            </el-input>
-          </el-form-item>
-          <el-form-item prop="code" v-if="smsCodeRequired">
-            <div class="vlcode">
-              <div class="vlcode-right">
-                <el-button
-                  style="width:100%;"
-                  type="text"
-                  @click="fetchSmsCode"
-                  :disabled="isFetchingCode"
-                  >+{{ codeContent }}</el-button
-                >
-              </div>
-              <div class="vlcode-left">
-                <el-input
-                  v-model.trim="loginModel.code"
-                  placeholder="请输入手机验证码"
-                  name="code"
-                  clearable
-                >
-                  <i class="icon icon-checkcode" slot="prefix"></i>
-                </el-input>
-              </div>
-            </div>
-          </el-form-item>
-          <el-form-item prop="schoolCode"></el-form-item>
-          <el-form-item>
-            <el-button
-              class="login-submit-btn"
-              size="large"
-              type="info"
-              :disabled="isSubmit"
-              round
-              @click="submit('loginForm')"
-              >登录</el-button
-            >
-          </el-form-item>
-        </el-form>
-      </div>
-    </div>
-
-    <!-- 修改密码 -->
-    <reset-pwd
-      :user-info="userInfo"
-      ref="ResetPwd"
-      @modified="resetPwdSuccess"
-    ></reset-pwd>
-  </div>
-</template>
-
-<script>
-import { password, smscode } from "@/plugins/formRules";
-import { login, getSmsCode, getSchoolInfo, getSysConfig } from "../api";
-import { Base64 } from "@/plugins/crypto";
-import ResetPwd from "@/modules/base/components/ResetPwd";
-import { ORG_CODE } from "@/constants/app";
-import fetchSmsMixins from "../fetchSmsMixins";
-
-export default {
-  name: "login",
-  components: { ResetPwd },
-  mixins: [fetchSmsMixins],
-  data() {
-    return {
-      nameWaitTime: "login",
-      smsCodeRequired: false,
-      loginModel: {
-        schoolCode: ORG_CODE,
-        loginName: "",
-        code: "",
-        password: ""
-      },
-      loginRules: {
-        code: smscode,
-        password,
-        loginName: [
-          {
-            required: true,
-            message: "请输入用户名",
-            trigger: "change"
-          }
-        ],
-        schoolCode: [
-          {
-            required: true,
-            message: "学校编码缺失",
-            trigger: "change"
-          }
-        ]
-      },
-      userInfo: {},
-      roles: [],
-      isSubmit: false,
-      schoolLogo: ""
-    };
-  },
-  mounted() {
-    this.$ls.clear();
-    this.setWaitingTime();
-    this.getSchool();
-    this.getSmsCodeRequired();
-  },
-  methods: {
-    async getSmsCodeRequired() {
-      const data = await getSysConfig("sys.code.enable");
-      this.smsCodeRequired = data && data.configValue === "true";
-    },
-    async getSchool() {
-      const data = await getSchoolInfo(ORG_CODE);
-      this.$ls.set("schoolLogo", data.logo);
-      this.$ls.set("schoolName", data.name);
-      this.schoolLogo = data.logo;
-    },
-    async submit(name) {
-      const valid = await this.$refs[name].validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await login({
-        loginName: this.loginModel.loginName,
-        password: Base64(this.loginModel.password),
-        code: this.smsCodeRequired ? this.loginModel.code : null,
-        schoolCode: this.loginModel.schoolCode
-      }).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      if (data.orgInfo)
-        this.$ls.set("orgId", data.orgInfo.id, this.GLOBAL.authTimeout);
-      if (data.schoolInfo)
-        this.$ls.set("schoolId", data.schoolInfo.id, this.GLOBAL.authTimeout);
-      this.$ls.set("user", data, this.GLOBAL.authTimeout);
-
-      this.$ls.set("token", data.accessToken, this.GLOBAL.authTimeout);
-
-      // 强制修改密码和绑定手机号
-      if (
-        data.userLoginCheckResult &&
-        (!data.userLoginCheckResult.pwdCount ||
-          !data.userLoginCheckResult.mobileNumber)
-      ) {
-        this.userInfo = {
-          ...this.loginModel,
-          ...data.userLoginCheckResult
-        };
-        this.$refs.ResetPwd.open();
-        return;
-      }
-
-      if (data.roleList && data.roleList.includes("ADMIN")) {
-        this.$router.push({
-          name: "SelectSchool"
-        });
-      } else {
-        this.$router.push({
-          name: "Home"
-        });
-      }
-    },
-    resetPwdSuccess(data) {
-      if (data.orgInfo)
-        this.$ls.set("orgId", data.orgInfo.id, this.GLOBAL.authTimeout);
-      if (data.schoolInfo)
-        this.$ls.set("schoolId", data.schoolInfo.id, this.GLOBAL.authTimeout);
-      this.$ls.set("user", data, this.GLOBAL.authTimeout);
-
-      this.$ls.set("token", data.accessToken, this.GLOBAL.authTimeout);
-
-      if (data.roleList && data.roleList.includes("ADMIN")) {
-        this.$router.push({
-          name: "SelectSchool"
-        });
-      } else {
-        this.$router.push({
-          name: "Home"
-        });
-      }
-    },
-    // code valid
-    checkField(field) {
-      return new Promise((resolve, reject) => {
-        this.$refs.loginForm.validateField(field, unvalid => {
-          if (unvalid) {
-            reject();
-          } else {
-            resolve();
-          }
-        });
-      });
-    },
-    async fetchSmsCode() {
-      const validAll = [
-        this.checkField("loginName"),
-        this.checkField("password"),
-        this.checkField("schoolCode")
-      ];
-
-      let result = true;
-      await Promise.all(validAll).catch(() => {
-        result = false;
-      });
-
-      if (!result) return;
-
-      this.isFetchingCode = true;
-      const data = await getSmsCode({
-        loginName: this.loginModel.loginName,
-        schoolCode: this.loginModel.schoolCode,
-        password: Base64(this.loginModel.password)
-      }).catch(() => {
-        this.isFetchingCode = false;
-      });
-      if (!data) return;
-
-      if (data.mobileNumber) {
-        this.$message.success(
-          `已向手机尾号【${data.mobileNumber.slice(
-            -4
-          )}】成功发送短信,请在2分钟内进行验证!`
-        );
-        this.changeContent();
-      } else {
-        this.isFetchingCode = false;
-        this.$message.error("未绑定手机号,请先绑定!");
-        this.userInfo = {
-          ...data,
-          loginName: this.loginModel.loginName,
-          schoolCode: this.loginModel.schoolCode,
-          password: this.loginModel.password
-        };
-        this.$refs.ResetPwd.open();
-      }
-    }
-  }
-};
-</script>

+ 52 - 0
src/modules/login/views/LoginAuthen.vue

@@ -0,0 +1,52 @@
+<template>
+  <div class="login-authen">
+    <h1 class="color-white text-center">
+      <i class="el-icon-loading"></i> 正在登录...
+    </h1>
+  </div>
+</template>
+
+<script>
+import { loginAuthen } from "../api";
+
+export default {
+  name: "login-authen",
+  data() {
+    return {
+      code: this.$route.params.code
+    };
+  },
+  mounted() {
+    this.login();
+  },
+  methods: {
+    async login() {
+      if (!this.code) {
+        this.$notify.error({
+          title: "非法操作",
+          message: "code丢失"
+        });
+        return;
+      }
+      const data = await loginAuthen({ code: this.code });
+      if (!data) return;
+
+      if (data.orgInfo) this.$ls.set("orgId", data.orgInfo.id);
+      if (data.schoolInfo) this.$ls.set("schoolId", data.schoolInfo.id);
+      this.$ls.set("user", data);
+
+      // 强制修改密码
+      // if (!data.user.pwdUpdateTime) {
+      //   this.$refs.ResetPwd.open();
+      //   return;
+      // }
+
+      this.$ls.set("token", data.accessToken);
+
+      this.$router.push({
+        name: "Home"
+      });
+    }
+  }
+};
+</script>

+ 19 - 0
src/modules/login/views/LogoutAuthen.vue

@@ -0,0 +1,19 @@
+<template>
+  <div class="logout-authen">
+    <h1 class="color-white text-center">
+      <i class="el-icon-loading"></i> 正在退出...
+    </h1>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "logout-authen",
+  data() {
+    return {};
+  },
+  created() {
+    window.location.href = "/api/report/wuda/open/user/authentication/logout";
+  }
+};
+</script>

+ 16 - 16
src/router.js

@@ -30,7 +30,7 @@ Vue.use(Router);
 //   try_files $uri $uri/ /index.html;
 // }
 let router = new Router({
-  mode: "history",
+  // mode: "history",
   routes: [
     {
       path: "/",
@@ -54,20 +54,20 @@ let router = new Router({
 });
 
 // route interceptor
-router.beforeEach((to, from, next) => {
-  const token = Vue.ls.get("token");
-  if (to.meta.noRequire) {
-    next();
-  } else {
-    // 需要登录的路由
-    if (token) {
-      next();
-    } else {
-      // 登录失效的处理
-      Vue.ls.clear();
-      next({ name: "Login" });
-    }
-  }
-});
+// router.beforeEach((to, from, next) => {
+//   const token = Vue.ls.get("token");
+//   if (to.meta.noRequire) {
+//     next();
+//   } else {
+//     // 需要登录的路由
+//     if (token) {
+//       next();
+//     } else {
+//       // 登录失效的处理
+//       Vue.ls.clear();
+//       next({ name: "Login" });
+//     }
+//   }
+// });
 
 export default router;

+ 26 - 25
src/views/Home.vue

@@ -72,11 +72,6 @@
               :route="{ name: nav.url }"
             >
               <span>{{ nav.name }}</span>
-              <span
-                class="nav-item-info"
-                v-if="nav.url === 'WaitTask' && waitTaskCount"
-                >{{ waitTaskCount }}</span
-              >
             </el-menu-item>
           </el-submenu>
           <el-menu-item
@@ -122,7 +117,7 @@
 </template>
 
 <script>
-import { mapState, mapActions } from "vuex";
+import localMenus from "@/constants/menus-data";
 import { sysMenu, logout } from "@/modules/login/api";
 import ResetPwd from "../modules/base/components/ResetPwd";
 import { SYS_ADMIN_NAME } from "@/constants/enumerate";
@@ -168,14 +163,34 @@ export default {
       this.routerChange();
     }
   },
-  computed: {
-    ...mapState("exam", ["waitTaskCount"])
-  },
   created() {
-    this.initData();
+    this.initData1();
   },
   methods: {
-    ...mapActions("exam", ["updateWaitTaskCount"]),
+    initData1() {
+      // 开发阶段专用
+      this.initPrivilegeMap(localMenus);
+      this.privileges = this.transformMenu(localMenus);
+      this.menus = this.getMenu();
+
+      if (this.$route.name === "Home") {
+        this.toMenu(this.menus[0]);
+        return;
+      }
+
+      if (!this.validRoutes.includes(this.$route.name)) {
+        this.$router.replace({
+          name: "404"
+        });
+        return;
+      }
+
+      this.updateBreadcrumbs();
+      const curMenu = this.menus.find(
+        menu => menu.url === this.breadcrumbs[0].url
+      );
+      this.menuChange(curMenu);
+    },
     async initData() {
       const data = await sysMenu();
       this.initPrivilegeMap(data.privileges);
@@ -199,13 +214,6 @@ export default {
         menu => menu.url === this.breadcrumbs[0].url
       );
       this.menuChange(curMenu);
-
-      if (
-        this.validRoutes.includes("WaitTask") &&
-        this.curMenu.url === "exam"
-      ) {
-        this.updateWaitTaskCount();
-      }
     },
     transformMenu(list) {
       return list.map(item => {
@@ -312,13 +320,6 @@ export default {
     },
     routerChange() {
       this.updateBreadcrumbs();
-
-      if (
-        this.validRoutes.includes("WaitTask") &&
-        this.curMenu.url === "exam"
-      ) {
-        this.updateWaitTaskCount();
-      }
     },
     toLogout() {
       this.$confirm("确定要退出登录吗?", "提示", {