Răsfoiți Sursa

学校管理

zhangjie 2 ani în urmă
părinte
comite
e0bd1e0cb1

+ 0 - 6
src/constants/adminNavs.js

@@ -23,12 +23,6 @@ const navs = [
     name: "系统角色管理",
     name: "系统角色管理",
     url: "SystemRoleManage"
     url: "SystemRoleManage"
   },
   },
-  {
-    id: "5",
-    parentId: "1",
-    name: "菜单管理",
-    url: "SchoolMenuManage"
-  },
   {
   {
     id: "6",
     id: "6",
     parentId: "1",
     parentId: "1",

+ 11 - 0
src/constants/enumerate.js

@@ -13,6 +13,17 @@ export const BOOLEAN_TYPE = {
   1: "是"
   1: "是"
 };
 };
 
 
+export const OPEN_STATUS = [
+  {
+    label: "开启",
+    value: true
+  },
+  {
+    label: "关闭",
+    value: false
+  }
+];
+
 // 审核状态
 // 审核状态
 export const AUDITING_STATUS = {
 export const AUDITING_STATUS = {
   START: "待审核",
   START: "待审核",

+ 51 - 13
src/modules/admin/api.js

@@ -28,20 +28,7 @@ export const deleteMenu = id => {
   return $post("/api/admin/sys/privilege/remove", { id });
   return $post("/api/admin/sys/privilege/remove", { id });
 };
 };
 
 
-// school-menu-manage
-export const schoolMenuTree = () => {
-  return $post("/api/admin/menu/custom/list", {});
-};
-export const schoolSelectedMenuTree = schoolId => {
-  return $postParam("/api/admin/menu/custom/get_school_custom_privileges", {
-    schoolId
-  });
-};
-export const updateSchoolMenu = datas => {
-  return $post("/api/admin/menu/custom/save", datas);
-};
 // auth-set
 // auth-set
-// school-menu-manage
 export const authSelect = () => {
 export const authSelect = () => {
   return $post("/api/admin/auth/select", {});
   return $post("/api/admin/auth/select", {});
 };
 };
@@ -67,3 +54,54 @@ export const schoolSync = () => {
 export const updateSchool = datas => {
 export const updateSchool = datas => {
   return $post("/api/admin/menu/custom/save", datas);
   return $post("/api/admin/menu/custom/save", datas);
 };
 };
+// school-set
+export const schoolSetCheckInfo = schoolId => {
+  return $postParam("/api/admin/set/user/select", { schoolId });
+};
+export const schoolSetCheckUpdate = datas => {
+  return $postParam("/api/admin/set/user/save", datas);
+};
+export const sysCustomMenuList = () => {
+  return $postParam("/api/admin/set/menu/custom/list", {});
+};
+export const schoolSetMenuInfo = schoolId => {
+  return $postParam("/api/admin/set/menu/custom/get_school_custom_privileges", {
+    schoolId
+  });
+};
+export const schoolSetMenuUpdate = datas => {
+  return $postParam("/api/admin/set/menu/custom/save", datas);
+};
+export const sysPaperSizeList = () => {
+  return $postParam("/api/admin/set/paper/sys/select", {});
+};
+export const schoolSetPaperInfo = schoolId => {
+  return $postParam("/api/admin/set/paper/select", {
+    schoolId
+  });
+};
+export const schoolSetPaperUpdate = datas => {
+  return $postParam("/api/admin/set/paper/save", datas);
+};
+export const sysCustomRoleList = () => {
+  return $postParam("/api/admin/set/role/custom/list", {});
+};
+export const schoolSetRoleInfo = schoolId => {
+  return $postParam("/api/admin/set/role/custom/get_school_custom_roles", {
+    schoolId
+  });
+};
+export const schoolSetRoleUpdate = datas => {
+  return $postParam("/api/admin/set/role/custom/save", datas);
+};
+export const schoolSetSyncInfo = schoolId => {
+  return $postParam("/api/admin/set/sync/select", {
+    schoolId
+  });
+};
+export const schoolSetSyncUpdate = datas => {
+  return $postParam("/api/admin/set/sync/save", datas);
+};
+export const schoolSetDataBackup = schoolId => {
+  return $postParam("/api/admin/set/backup", { schoolId });
+};

+ 108 - 0
src/modules/admin/components/ModifySchoolSet.vue

@@ -0,0 +1,108 @@
+<template>
+  <el-dialog
+    class="modify-school-set"
+    :visible.sync="modalIsShow"
+    :title="title"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    fullscreen
+    @opened="visibleChange"
+  >
+    <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" :school="school"></component>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import SchoolSetCheck from "./school/SchoolSetCheck.vue";
+import SchoolSetData from "./school/SchoolSetData.vue";
+import SchoolSetMenu from "./school/SchoolSetMenu.vue";
+import SchoolSetPaper from "./school/SchoolSetPaper.vue";
+import SchoolSetRole from "./school/SchoolSetRole.vue";
+import SchoolSetSync from "./school/SchoolSetSync.vue";
+
+export default {
+  name: "modify-school-set",
+  components: {
+    SchoolSetCheck,
+    SchoolSetData,
+    SchoolSetMenu,
+    SchoolSetPaper,
+    SchoolSetRole,
+    SchoolSetSync
+  },
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      curTab: "check",
+      tabs: [
+        {
+          name: "用户验证配置",
+          val: "check"
+        },
+        {
+          name: "菜单管理",
+          val: "menu"
+        },
+        {
+          name: "角色管理",
+          val: "role"
+        },
+        {
+          name: "试卷规格配置",
+          val: "paper"
+        },
+        {
+          name: "同步配置",
+          val: "sync"
+        },
+        {
+          name: "数据还原",
+          val: "data"
+        }
+      ]
+    };
+  },
+  computed: {
+    compName() {
+      return `school-set-${this.curTab}`;
+    },
+    title() {
+      return `学校设置--${this.school.name}`;
+    }
+  },
+  methods: {
+    visibleChange() {},
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    selectMenu(tab) {
+      this.curTab = tab;
+    }
+  }
+};
+</script>

+ 111 - 0
src/modules/admin/components/school/SchoolSetCheck.vue

@@ -0,0 +1,111 @@
+<template>
+  <div class="school-set-check">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="240px"
+    >
+      <el-form-item
+        prop="accountSmsVerify"
+        label="用户/密码模式是否开启短信验证:"
+      >
+        <el-radio-group v-model="modalForm.accountSmsVerify">
+          <el-radio
+            v-for="item in OPEN_STATUS"
+            :key="item.value"
+            :label="item.value"
+            >{{ item.label }}</el-radio
+          >
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item
+        prop="teachcloudExchangeHostUrl"
+        label="第三方统一身份认证地址:"
+      >
+        <el-input
+          v-model="modalForm.teachcloudExchangeHostUrl"
+          placeholder="请输入调用地址"
+          clearable
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :loading="loading" @click="confirm"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { OPEN_STATUS } from "../../../../constants/enumerate";
+import { schoolSetCheckInfo, schoolSetCheckUpdate } from "../../api";
+
+export default {
+  name: "school-set-check",
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      modalForm: {
+        accountSmsVerify: false, //用户/密码模式是否开启短信验证,true为开启,false为关闭
+        teachcloudExchangeHostUrl: "" //第三方统一身份认证地址
+      },
+      OPEN_STATUS,
+      rules: {
+        accountSmsVerify: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value && value !== false) {
+                return callback(new Error(`请选择是否开启短信验证`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ],
+        teachcloudExchangeHostUrl: [
+          {
+            required: true,
+            message: "请输入第三方统一身份认证地址",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  mounted() {
+    this.getSchoolCheckInfo();
+  },
+  methods: {
+    async getSchoolCheckInfo() {
+      const data = await schoolSetCheckInfo(this.school.id);
+      this.modalForm = this.$objAssign(this.modalForm, data);
+    },
+    async confirm() {
+      const valid = await this.$refs.modalFormComp.validate();
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+      const datas = { ...this.modalForm, schoolId: this.school.id };
+      const res = await schoolSetCheckUpdate(datas).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+
+      this.$message.success("修改成功!");
+    }
+  }
+};
+</script>

+ 53 - 0
src/modules/admin/components/school/SchoolSetData.vue

@@ -0,0 +1,53 @@
+<template>
+  <div class="school-set-data">
+    <el-button type="primary" :loading="loading" @click="confirm"
+      >清除基础数据</el-button
+    >
+    <p class="tips-info tips-error">
+      注意:执行该操作,会将该单位下配置的基础数据全部清除,进入初始状态,请谨慎操作,该操作不可恢复!
+    </p>
+  </div>
+</template>
+
+<script>
+import { schoolSetDataBackup } from "../../api";
+
+export default {
+  name: "school-set-data",
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false
+    };
+  },
+  methods: {
+    async confirm() {
+      const confirm = await this.$confirm(
+        `确定要清除当前学校的基础数据集吗?`,
+        "提示",
+        {
+          type: "warning"
+        }
+      ).catch(() => {});
+      if (confirm !== "confirm") return;
+
+      if (this.loading) return;
+      this.loading = true;
+
+      const res = await schoolSetDataBackup(this.school.id).catch(() => {});
+      this.loading = false;
+
+      if (!res) return;
+
+      this.$message.success("操作成功!");
+    }
+  }
+};
+</script>

+ 83 - 0
src/modules/admin/components/school/SchoolSetMenu.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="school-set-menu">
+    <privilege-set
+      v-if="menus && menus.length"
+      ref="PrivilegeSet"
+      :menus="menus"
+    ></privilege-set>
+
+    <el-button type="primary" :loading="loading" @click="confirm"
+      >保存</el-button
+    >
+  </div>
+</template>
+
+<script>
+import {
+  sysCustomMenuList,
+  schoolSetMenuInfo,
+  schoolSetMenuUpdate
+} from "../../api";
+import PrivilegeSet from "../../../base/components/PrivilegeSet";
+
+export default {
+  name: "school-set-menu",
+  components: { PrivilegeSet },
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      menus: [],
+      privilegeIds: [],
+      loading: false
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      await this.getPrivileges();
+      await this.getSchoolMenuInfo();
+      this.$nextTick(() => {
+        this.$refs.PrivilegeSet.buildTableData(this.privilegeIds);
+      });
+    },
+    async getPrivileges() {
+      const needHideModules = ["common", "customer"];
+      const data = await sysCustomMenuList();
+      const menus = data.customPrivilegeList || [];
+
+      this.menus = menus
+        .filter(item => !needHideModules.includes(item.url))
+        .map(item => {
+          item.parentId = null;
+          return item;
+        });
+    },
+    async getSchoolMenuInfo() {
+      const data = await schoolSetMenuInfo(this.school.id);
+      this.privilegeIds = data.privilegeIdList || [];
+    },
+    async confirm() {
+      if (this.loading) return;
+      this.loading = true;
+      const privilegeIds = this.$refs.PrivilegeSet.getSelectedPrivilegeIds();
+      const res = await schoolSetMenuUpdate({
+        schoolId: this.school.id,
+        privilegeIds: privilegeIds
+      }).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+
+      this.$message.success("修改成功!");
+    }
+  }
+};
+</script>

+ 93 - 0
src/modules/admin/components/school/SchoolSetPaper.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="school-set-paper">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="180px"
+    >
+      <el-form-item prop="pdfSize" label="允许上传试卷规格">
+        <el-checkbox-group v-model="modalForm.pdfSize">
+          <el-checkbox v-for="item in sysPdfSize" :key="item" :label="item">{{
+            item
+          }}</el-checkbox>
+        </el-checkbox-group>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :loading="loading" @click="confirm"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {
+  sysPaperSizeList,
+  schoolSetPaperInfo,
+  schoolSetPaperUpdate
+} from "../../api";
+
+export default {
+  name: "school-set-paper",
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      modalForm: {
+        pdfSize: []
+      },
+      sysPdfSize: [],
+      rules: {
+        pdfSize: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error(`请选择允许上传试卷规格`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      const paperData = await sysPaperSizeList();
+      this.sysPdfSize = paperData.sysPdfSize;
+      const data = await schoolSetPaperInfo(this.school.id);
+      this.modalForm.pdfSize = data.pdfSize;
+    },
+    async confirm() {
+      const valid = await this.$refs.modalFormComp.validate();
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+
+      let datas = { pdfSize: this.modalForm.pdfSize, schoolId: this.school.id };
+      const res = await schoolSetPaperUpdate(datas).catch(() => {});
+      this.loading = false;
+
+      if (!res) return;
+
+      this.$message.success("修改成功!");
+    }
+  }
+};
+</script>

+ 99 - 0
src/modules/admin/components/school/SchoolSetRole.vue

@@ -0,0 +1,99 @@
+<template>
+  <div class="school-set-role">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="140px"
+    >
+      <el-form-item prop="roleIds" label="系统角色管理">
+        <el-checkbox-group v-model="modalForm.roleIds">
+          <el-checkbox
+            v-for="item in roleList"
+            :key="item.id"
+            :label="item.id"
+            >{{ item.name }}</el-checkbox
+          >
+        </el-checkbox-group>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :loading="loading" @click="confirm"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {
+  sysCustomRoleList,
+  schoolSetRoleInfo,
+  schoolSetRoleUpdate
+} from "../../api";
+
+export default {
+  name: "school-set-role",
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      modalForm: {
+        roleIds: []
+      },
+      roleList: [],
+      rules: {
+        roleIds: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error(`请选择系统角色管理`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      const roleData = await sysCustomRoleList();
+      this.roleList = roleData || [];
+      const data = await schoolSetRoleInfo(this.school.id);
+      this.modalForm.roleIds = data.roleIdList;
+    },
+    async confirm() {
+      const valid = await this.$refs.modalFormComp.validate();
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+
+      let datas = {
+        roleIds: this.modalForm.roleIds,
+        schoolId: this.school.id
+      };
+      const res = await schoolSetRoleUpdate(datas).catch(() => {});
+      this.loading = false;
+
+      if (!res) return;
+
+      this.$message.success("修改成功!");
+    }
+  }
+};
+</script>

+ 123 - 0
src/modules/admin/components/school/SchoolSetSync.vue

@@ -0,0 +1,123 @@
+<template>
+  <div class="school-set-sync">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="100px"
+    >
+      <el-form-item
+        v-for="field in fields"
+        :key="field"
+        :prop="field"
+        :label="names[field] + ':'"
+      >
+        <el-radio-group v-model="checkSet[field]" @change="resetVal(field)">
+          <el-radio
+            v-for="item in OPEN_STATUS"
+            :key="item.value"
+            :label="item.value"
+            >{{ item.label }}</el-radio
+          >
+        </el-radio-group>
+        <br />
+        <el-input
+          v-model="modalForm[field]"
+          placeholder="请输入调用地址"
+          clearable
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :loading="loading" @click="confirm"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { schoolSetSyncInfo, schoolSetSyncUpdate } from "../../api";
+
+export default {
+  name: "school-set-sync",
+  props: {
+    school: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      modalForm: {},
+      fields: [
+        "question.host.url",
+        "cloudmark.host.url",
+        "teachcloud.report.host.url"
+      ],
+      names: {
+        "question.host.url": "题库",
+        "cloudmark.host.url": "云阅卷",
+        "teachcloud.report.host.url": "教研分析"
+      },
+      checkSet: {},
+      rules: {}
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      const res = await schoolSetSyncInfo(this.school.id);
+      const syncServicePaths = res.syncServicePaths
+        ? JSON.parse(res.syncServicePaths)
+        : {};
+      this.fields.forEach(field => {
+        this.$set(this.modalForm, field, syncServicePaths[field]);
+        this.$set(this.checkSet, field, !!syncServicePaths[field]);
+
+        this.rules[field] = [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value && this.checkSet[field]) {
+                return callback(
+                  new Error(`请输入${this.names[field]}请求地址`)
+                );
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ];
+      });
+      Object.entries(syncServicePaths).forEach(([k, v]) => {
+        this.modalForm[k] = v;
+        this.checkSet[k] = !!v;
+      });
+    },
+    resetVal(field) {
+      if (!this.checkSet[field]) this.modalForm[field] = "";
+    },
+    async confirm() {
+      const valid = await this.$refs.modalFormComp.validate();
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+      const datas = { ...this.modalForm, schoolId: this.school.id };
+      const res = await schoolSetSyncUpdate(datas).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+
+      this.$message.success("修改成功!");
+    }
+  }
+};
+</script>

+ 0 - 6
src/modules/admin/router.js

@@ -1,7 +1,6 @@
 import AdminUserManage from "./views/AdminUserManage.vue";
 import AdminUserManage from "./views/AdminUserManage.vue";
 import PrivilegeManage from "./views/PrivilegeManage.vue";
 import PrivilegeManage from "./views/PrivilegeManage.vue";
 import SystemRoleManage from "./views/SystemRoleManage.vue";
 import SystemRoleManage from "./views/SystemRoleManage.vue";
-import SchoolMenuManage from "./views/SchoolMenuManage.vue";
 import SchoolManage from "./views/SchoolManage.vue";
 import SchoolManage from "./views/SchoolManage.vue";
 import AuthSet from "./views/AuthSet.vue";
 import AuthSet from "./views/AuthSet.vue";
 import Admin from "./views/Admin.vue";
 import Admin from "./views/Admin.vue";
@@ -26,11 +25,6 @@ export default {
       name: "SystemRoleManage",
       name: "SystemRoleManage",
       component: SystemRoleManage
       component: SystemRoleManage
     },
     },
-    {
-      path: "school-menu-manage",
-      name: "SchoolMenuManage",
-      component: SchoolMenuManage
-    },
     {
     {
       path: "school-manage",
       path: "school-manage",
       name: "SchoolManage",
       name: "SchoolManage",

+ 11 - 2
src/modules/admin/views/SchoolManage.vue

@@ -73,16 +73,22 @@
       :instance="curSchool"
       :instance="curSchool"
       @modified="getSchools"
       @modified="getSchools"
     ></modify-school>
     ></modify-school>
+    <!-- ModifySchoolSet -->
+    <modify-school-set
+      ref="ModifySchoolSet"
+      :school="curSchool"
+    ></modify-school-set>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import { schoolList, schoolSync } from "../api";
 import { schoolList, schoolSync } from "../api";
 import ModifySchool from "../components/ModifySchool.vue";
 import ModifySchool from "../components/ModifySchool.vue";
+import ModifySchoolSet from "../components/ModifySchoolSet.vue";
 
 
 export default {
 export default {
   name: "school-manage",
   name: "school-manage",
-  components: { ModifySchool },
+  components: { ModifySchool, ModifySchoolSet },
   data() {
   data() {
     return {
     return {
       schools: [],
       schools: [],
@@ -130,7 +136,10 @@ export default {
       this.curSchool = row;
       this.curSchool = row;
       this.$refs.ModifySchool.open();
       this.$refs.ModifySchool.open();
     },
     },
-    toSet() {}
+    toSet(row) {
+      this.curSchool = row;
+      this.$refs.ModifySchoolSet.open();
+    }
   }
   }
 };
 };
 </script>
 </script>