zhangjie 2 éve
szülő
commit
78164bd404

+ 53 - 52
package.json

@@ -1,52 +1,53 @@
-{
-  "name": "eds-web",
-  "version": "1.0.0",
-  "scripts": {
-    "start": "npm run serve",
-    "serve": "vue-cli-service serve",
-    "build": "vue-cli-service build",
-    "lint": "vue-cli-service lint",
-    "test:unit": "vue-cli-service test:unit"
-  },
-  "dependencies": {
-    "core-js": "^3.6.5",
-    "deepmerge": "^4.2.2",
-    "element-ui": "^2.14.1",
-    "js-md5": "^0.7.3",
-    "jsbarcode": "^3.11.3",
-    "vue": "^2.6.11",
-    "vue-ls": "^3.2.2",
-    "vue-router": "^3.2.0",
-    "vuex": "^3.4.0",
-    "axios": "^0.18.0",
-    "cropperjs": "^1.5.1",
-    "crypto-js": "^4.0.0"
-  },
-  "devDependencies": {
-    "@vue/cli-plugin-babel": "~4.5.0",
-    "@vue/cli-plugin-eslint": "~4.5.0",
-    "@vue/cli-plugin-router": "~4.5.0",
-    "@vue/cli-plugin-vuex": "~4.5.0",
-    "@vue/cli-service": "~4.5.0",
-    "@vue/eslint-config-prettier": "^6.0.0",
-    "babel-eslint": "^10.1.0",
-    "eslint": "^6.7.2",
-    "eslint-plugin-prettier": "^3.1.3",
-    "eslint-plugin-vue": "^6.2.2",
-    "lint-staged": "^9.5.0",
-    "prettier": "^1.19.1",
-    "sass": "^1.26.5",
-    "sass-loader": "^8.0.2",
-    "vue-template-compiler": "^2.6.11",
-    "terser-webpack-plugin": "^1.2.3"
-  },
-  "gitHooks": {
-    "pre-commit": "lint-staged"
-  },
-  "lint-staged": {
-    "*.{js,vue}": [
-      "vue-cli-service lint",
-      "git add"
-    ]
-  }
-}
+{
+  "name": "eds-web",
+  "version": "1.0.0",
+  "scripts": {
+    "start": "npm run serve",
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint",
+    "test:unit": "vue-cli-service test:unit"
+  },
+  "dependencies": {
+    "axios": "^0.18.0",
+    "core-js": "^3.6.5",
+    "cropperjs": "^1.5.1",
+    "crypto-js": "^4.0.0",
+    "deepmerge": "^4.2.2",
+    "element-ui": "^2.14.1",
+    "js-md5": "^0.7.3",
+    "jsbarcode": "^3.11.3",
+    "qs": "^6.11.0",
+    "vue": "^2.6.11",
+    "vue-ls": "^3.2.2",
+    "vue-router": "^3.2.0",
+    "vuex": "^3.4.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-plugin-vuex": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "@vue/eslint-config-prettier": "^6.0.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-prettier": "^3.1.3",
+    "eslint-plugin-vue": "^6.2.2",
+    "lint-staged": "^9.5.0",
+    "prettier": "^1.19.1",
+    "sass": "^1.26.5",
+    "sass-loader": "^8.0.2",
+    "terser-webpack-plugin": "^1.2.3",
+    "vue-template-compiler": "^2.6.11"
+  },
+  "gitHooks": {
+    "pre-commit": "lint-staged"
+  },
+  "lint-staged": {
+    "*.{js,vue}": [
+      "vue-cli-service lint",
+      "git add"
+    ]
+  }
+}

+ 2 - 8
pnpm-lock.yaml

@@ -21,6 +21,7 @@ specifiers:
   jsbarcode: ^3.11.3
   lint-staged: ^9.5.0
   prettier: ^1.19.1
+  qs: ^6.11.0
   sass: ^1.26.5
   sass-loader: ^8.0.2
   terser-webpack-plugin: ^1.2.3
@@ -39,6 +40,7 @@ dependencies:
   element-ui: registry.npmmirror.com/element-ui/2.15.10_vue@2.7.13
   js-md5: registry.npmmirror.com/js-md5/0.7.3
   jsbarcode: registry.npmmirror.com/jsbarcode/3.11.5
+  qs: registry.npmmirror.com/qs/6.11.0
   vue: registry.npmmirror.com/vue/2.7.13
   vue-ls: registry.npmmirror.com/vue-ls/3.2.2
   vue-router: registry.npmmirror.com/vue-router/3.6.5_vue@2.7.13
@@ -3685,7 +3687,6 @@ packages:
     dependencies:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
       get-intrinsic: registry.npmmirror.com/get-intrinsic/1.1.3
-    dev: true
 
   registry.npmmirror.com/call-me-maybe/1.0.2:
     resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz}
@@ -6503,7 +6504,6 @@ packages:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz}
     name: function-bind
     version: 1.1.1
-    dev: true
 
   registry.npmmirror.com/function.prototype.name/1.1.5:
     resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz}
@@ -6551,7 +6551,6 @@ packages:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
       has: registry.npmmirror.com/has/1.0.3
       has-symbols: registry.npmmirror.com/has-symbols/1.0.3
-    dev: true
 
   registry.npmmirror.com/get-own-enumerable-property-symbols/3.0.2:
     resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz}
@@ -6812,7 +6811,6 @@ packages:
     name: has-symbols
     version: 1.0.3
     engines: {node: '>= 0.4'}
-    dev: true
 
   registry.npmmirror.com/has-tostringtag/1.0.0:
     resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz}
@@ -6869,7 +6867,6 @@ packages:
     engines: {node: '>= 0.4.0'}
     dependencies:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
-    dev: true
 
   registry.npmmirror.com/hash-base/3.1.0:
     resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz}
@@ -9040,7 +9037,6 @@ packages:
     resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz}
     name: object-inspect
     version: 1.12.2
-    dev: true
 
   registry.npmmirror.com/object-is/1.1.5:
     resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz}
@@ -10241,7 +10237,6 @@ packages:
     engines: {node: '>=0.6'}
     dependencies:
       side-channel: registry.npmmirror.com/side-channel/1.0.4
-    dev: true
 
   registry.npmmirror.com/qs/6.5.3:
     resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz}
@@ -11084,7 +11079,6 @@ packages:
       call-bind: registry.npmmirror.com/call-bind/1.0.2
       get-intrinsic: registry.npmmirror.com/get-intrinsic/1.1.3
       object-inspect: registry.npmmirror.com/object-inspect/1.12.2
-    dev: true
 
   registry.npmmirror.com/signal-exit/3.0.7:
     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz}

BIN
public/favicon.ico


+ 67 - 11
src/constants/menus-data.js

@@ -7,38 +7,94 @@ export default [
     type: "MENU"
   },
   {
-    id: "2",
+    id: "101",
     parentId: "1",
-    name: "考务数据对接",
-    url: "business",
+    name: "超管中心",
+    url: "super",
+    type: "MENU"
+  },
+  {
+    id: "10101",
+    parentId: "101",
+    name: "授权管理",
+    type: "MENU",
+    url: "AuthSet"
+  },
+  {
+    id: "102",
+    parentId: "1",
+    name: "基础配置",
+    url: "base",
     type: "MENU"
   },
   {
-    id: "3",
-    parentId: "2",
+    id: "10201",
+    parentId: "102",
+    name: "学期管理",
+    type: "MENU",
+    url: "SemesterManage"
+  },
+  {
+    id: "10202",
+    parentId: "102",
+    name: "考试类型管理",
+    type: "MENU",
+    url: "ExamTypeManage"
+  },
+  {
+    id: "10203",
+    parentId: "102",
     name: "用户管理",
     type: "MENU",
     url: "UserManage"
   },
   {
-    id: "4",
-    parentId: "2",
+    id: "103",
+    parentId: "1",
+    name: "考务数据对接",
+    url: "business",
+    type: "MENU"
+  },
+  {
+    id: "10301",
+    parentId: "103",
     name: "设置定时任务",
     type: "MENU",
     url: "TimeTaskManage"
   },
   {
-    id: "5",
-    parentId: "2",
+    id: "10302",
+    parentId: "103",
     name: "考务数据列表",
     type: "MENU",
     url: "BusinessDataManage"
   },
   {
-    id: "6",
-    parentId: "2",
+    id: "10303",
+    parentId: "103",
     name: "下载列表",
     type: "MENU",
     url: "DownloadManage"
+  },
+  {
+    id: "104",
+    parentId: "1",
+    name: "成绩回传",
+    type: "MENU",
+    url: "score"
+  },
+  {
+    id: "10401",
+    parentId: "104",
+    name: "云阅卷数据管理",
+    type: "MENU",
+    url: "EcsDataManage"
+  },
+  {
+    id: "10402",
+    parentId: "104",
+    name: "回传数据管理",
+    type: "MENU",
+    url: "DataReturnManage"
   }
 ];

+ 21 - 3
src/constants/privilege.js

@@ -1,10 +1,28 @@
-export default {
-  ADMIN: ["data", "business", "UserManage"],
+export const rolePrivilege = {
+  ADMIN: [
+    "data",
+    "base",
+    "SemesterManage",
+    "ExamTypeManage",
+    "UserManage",
+    "business",
+    "TimeTaskManage",
+    "BusinessDataManage",
+    "DownloadManage",
+    "score",
+    "EcsDataManage",
+    "DataReturnManage"
+  ],
   IMPLEMENT: [
     "data",
     "business",
     "TimeTaskManage",
     "BusinessDataManage",
-    "DownloadManage"
+    "DownloadManage",
+    "score",
+    "EcsDataManage",
+    "DataReturnManage"
   ]
 };
+
+export const adminPrivilege = ["data", "super", "AuthSet"];

+ 1 - 1
src/main.js

@@ -15,7 +15,7 @@ import "./assets/styles/index.scss";
 
 Vue.use(ElementUI, { size: "small" });
 
-Vue.use(VueLocalStorage, { storage: "session" });
+Vue.use(VueLocalStorage, { namespace: "vs_", storage: "session" });
 Vue.use(globalVuePlugins);
 
 Vue.prototype.GLOBAL = GLOBAL;

+ 1 - 113
src/modules/admin/api.js

@@ -1,116 +1,4 @@
-import { $postParam, $post } from "@/plugins/axios";
-
-// user --------------------------------->
-// user-manage
-export const userListPage = datas => {
-  return $postParam("/api/sys_user/page", datas);
-};
-export const updateUser = datas => {
-  return $post("/api/sys_user/save", datas);
-};
-export const ableUser = ({ id, enable }) => {
-  return $post("/api/sys_user/enable", { id, enable });
-};
-export const resetPwd = id => {
-  return $post("/api/sys_user/reset_password", { id });
-};
-export const userRoleListPage = () => {
-  return $postParam("/api/sys_role/list", {});
-};
-
-export const updatePwd = datas => {
-  return $post("/api/admin/sys/user/update_password", datas);
-};
-export const userBindRoles = ({ id, roleIds }) => {
-  return $post("/api/admin/sys/user/bind_roles", { id, roleIds });
-};
-
-export const syncUserToEcs = () => {
-  return $postParam("/api/admin/sys/user/push", {});
-};
-export const roleUserTree = () => {
-  return $postParam("/api/admin/sys/user/org-tree", {});
-};
-
-// role-manage
-export const roleListPage = datas => {
-  return $postParam("/api/admin/sys/role/list", datas);
-};
-export const ableRole = ({ id, enable }) => {
-  return $post("/api/admin/sys/role/enable", { id, enable });
-};
-export const updateRole = datas => {
-  return $post("/api/admin/sys/role/save", datas);
-};
-export const deleteRole = id => {
-  return $postParam("/api/admin/sys/role/remove", { id });
-};
-export const userBoundRoles = userId => {
-  return $postParam("/api/admin/sys/role/get_user_roles", { userId });
-};
-// role-user-manage
-export const roleGroupList = datas => {
-  return $postParam("/api/admin/sys/role/group/list", datas);
-};
-export const updateRoleGroup = datas => {
-  return $post("/api/admin/sys/role/group/save", datas);
-};
-// menu-manage
-export const menuAuthList = datas => {
-  return $postParam("/api/admin/sys/privilege/list_auth", datas);
-};
-export const privilegeList = datas => {
-  return $postParam("/api/admin/sys/privilege/list", datas);
-};
-export const roleBoundPrivileges = roleId => {
-  return $postParam("/api/admin/sys/privilege/get_role_privileges", { roleId });
-};
-// organization-manage
-export const organizationList = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
-};
-export const organizationFindByTypeList = datas => {
-  return $postParam("/api/admin/sys/org/find_by_type", datas);
-};
-export const updateOrganization = datas => {
-  return $post("/api/admin/sys/org/save", datas);
-};
-export const ableOrganization = ({ id, enable }) => {
-  return $post("/api/admin/sys/org/enable", { id, enable });
-};
-export const deleteOrganization = id => {
-  return $post("/api/admin/sys/org/remove", { id });
-};
-
-// semester-manage
-export const semesterListQuery = datas => {
-  return $postParam("/api/admin/basic/semester/query", datas);
-};
-export const examSemesterList = datas => {
-  return $postParam("/api/admin/basic/semester/list", datas);
-};
-export const deleteSemester = id => {
-  return $postParam("/api/admin/basic/semester/delete", { id });
-};
-export const updateSemester = datas => {
-  return $post("/api/admin/basic/semester/save", datas);
-};
-export const semesterSetInUsed = id => {
-  return $postParam("/api/admin/basic/semester/set_in_used", { id });
-};
-
-// exam-type-manage
-export const examTypeListQuery = datas => {
-  return $postParam("/api/admin/paper/exam_type/page", datas);
-};
-export const deleteExamType = ids => {
-  return $postParam("/api/admin/paper/exam_type/delete", {
-    ids: ids.join()
-  });
-};
-export const updateExamType = datas => {
-  return $post("/api/admin/paper/exam_type/save", datas);
-};
+import { $post } from "@/plugins/axios";
 
 // auth-set
 export const authSelect = () => {

+ 16 - 24
src/modules/admin/router.js

@@ -1,27 +1,19 @@
-import UserManage from "./views/UserManage.vue";
 import AuthSet from "./views/AuthSet.vue";
-import SemesterManage from "./views/SemesterManage.vue";
-import ExamTypeManage from "./views/ExamTypeManage.vue";
 
-export default [
-  {
-    path: "/admin/user-manage",
-    name: "UserManage",
-    component: UserManage
-  },
-  {
-    path: "/admin/auth-set",
-    name: "AuthSet",
-    component: AuthSet
-  },
-  {
-    path: "/admin/semester-manage",
-    name: "SemesterManage",
-    component: SemesterManage
+import Home from "@/views/Home.vue";
+
+export default {
+  path: "/admin",
+  name: "Admin",
+  component: Home,
+  props: {
+    super: true
   },
-  {
-    path: "/admin/exam-type-manage",
-    name: "ExamTypeManage",
-    component: ExamTypeManage
-  }
-];
+  children: [
+    {
+      path: "auth-set",
+      name: "AuthSet",
+      component: AuthSet
+    }
+  ]
+};

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

@@ -7,6 +7,114 @@ export const examQuery = datas => {
   return $postParam("/api/exam_type/list", datas);
 };
 
+// user --------------------------------->
+// user-manage
+export const userListPage = datas => {
+  return $postParam("/api/sys_user/page", datas);
+};
+export const updateUser = datas => {
+  return $post("/api/sys_user/save", datas);
+};
+export const ableUser = ({ id, enable }) => {
+  return $post("/api/sys_user/enable", { id, enable });
+};
+export const resetPwd = id => {
+  return $post("/api/sys_user/reset_password", { id });
+};
+export const userRoleListPage = () => {
+  return $postParam("/api/sys_role/list", {});
+};
+
+export const userBindRoles = ({ id, roleIds }) => {
+  return $post("/api/admin/sys/user/bind_roles", { id, roleIds });
+};
+
+export const syncUserToEcs = () => {
+  return $postParam("/api/admin/sys/user/push", {});
+};
+export const roleUserTree = () => {
+  return $postParam("/api/admin/sys/user/org-tree", {});
+};
+
+// role-manage
+export const roleListPage = datas => {
+  return $postParam("/api/admin/sys/role/list", datas);
+};
+export const ableRole = ({ id, enable }) => {
+  return $post("/api/admin/sys/role/enable", { id, enable });
+};
+export const updateRole = datas => {
+  return $post("/api/admin/sys/role/save", datas);
+};
+export const deleteRole = id => {
+  return $postParam("/api/admin/sys/role/remove", { id });
+};
+export const userBoundRoles = userId => {
+  return $postParam("/api/admin/sys/role/get_user_roles", { userId });
+};
+// role-user-manage
+export const roleGroupList = datas => {
+  return $postParam("/api/admin/sys/role/group/list", datas);
+};
+export const updateRoleGroup = datas => {
+  return $post("/api/admin/sys/role/group/save", datas);
+};
+// menu-manage
+export const menuAuthList = datas => {
+  return $postParam("/api/admin/sys/privilege/list_auth", datas);
+};
+export const privilegeList = datas => {
+  return $postParam("/api/admin/sys/privilege/list", datas);
+};
+export const roleBoundPrivileges = roleId => {
+  return $postParam("/api/admin/sys/privilege/get_role_privileges", { roleId });
+};
+// organization-manage
+export const organizationList = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
+};
+export const organizationFindByTypeList = datas => {
+  return $postParam("/api/admin/sys/org/find_by_type", datas);
+};
+export const updateOrganization = datas => {
+  return $post("/api/admin/sys/org/save", datas);
+};
+export const ableOrganization = ({ id, enable }) => {
+  return $post("/api/admin/sys/org/enable", { id, enable });
+};
+export const deleteOrganization = id => {
+  return $post("/api/admin/sys/org/remove", { id });
+};
+
+// semester-manage
+export const semesterListQuery = datas => {
+  return $postParam("/api/admin/basic/semester/query", datas);
+};
+export const examSemesterList = datas => {
+  return $postParam("/api/admin/basic/semester/list", datas);
+};
+export const deleteSemester = id => {
+  return $postParam("/api/admin/basic/semester/delete", { id });
+};
+export const updateSemester = datas => {
+  return $post("/api/admin/basic/semester/save", datas);
+};
+export const semesterSetInUsed = id => {
+  return $postParam("/api/admin/basic/semester/set_in_used", { id });
+};
+
+// exam-type-manage
+export const examTypeListQuery = datas => {
+  return $postParam("/api/admin/paper/exam_type/page", datas);
+};
+export const deleteExamType = ids => {
+  return $postParam("/api/admin/paper/exam_type/delete", {
+    ids: ids.join()
+  });
+};
+export const updateExamType = datas => {
+  return $post("/api/admin/paper/exam_type/save", datas);
+};
 // setting --------------------------------->
 // time-task
 export const timeTaskList = datas => {

+ 0 - 0
src/modules/admin/components/ModifyExamType.vue → src/modules/base/components/ModifyExamType.vue


+ 0 - 0
src/modules/admin/components/ModifySemester.vue → src/modules/base/components/ModifySemester.vue


+ 1 - 1
src/modules/admin/components/ModifyUser.vue → src/modules/base/components/ModifyUser.vue

@@ -73,7 +73,7 @@
 </template>
 
 <script>
-import { updateUser } from "../../base/api";
+import { updateUser } from "../api";
 import { password } from "@/plugins/formRules";
 import { ABLE_TYPE } from "@/constants/enumerate";
 

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

@@ -1,8 +1,27 @@
+import UserManage from "./views/UserManage.vue";
+import SemesterManage from "./views/SemesterManage.vue";
+import ExamTypeManage from "./views/ExamTypeManage.vue";
+
 import TimeTaskManage from "./views/TimeTaskManage.vue";
 import BusinessDataManage from "./views/BusinessDataManage.vue";
 import DownloadManage from "./views/DownloadManage.vue";
 
 export default [
+  {
+    path: "/base/user-manage",
+    name: "UserManage",
+    component: UserManage
+  },
+  {
+    path: "/base/semester-manage",
+    name: "SemesterManage",
+    component: SemesterManage
+  },
+  {
+    path: "/base/exam-type-manage",
+    name: "ExamTypeManage",
+    component: ExamTypeManage
+  },
   {
     path: "/base/time-task-manage",
     name: "TimeTaskManage",

+ 0 - 0
src/modules/admin/views/ExamTypeManage.vue → src/modules/base/views/ExamTypeManage.vue


+ 0 - 0
src/modules/admin/views/SemesterManage.vue → src/modules/base/views/SemesterManage.vue


+ 0 - 0
src/modules/admin/views/UserManage.vue → src/modules/base/views/UserManage.vue


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

@@ -31,3 +31,6 @@ export const getEnums = type => {
 export const schoolList = () => {
   return $postParam("/api/basic_school/list", {});
 };
+export const updatePwd = datas => {
+  return $post("/api/admin/sys/user/update_password", datas);
+};

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

@@ -1,6 +1,7 @@
 import LoginHome from "./views/LoginHome";
 import Login from "./views/Login";
 import ForgetPwd from "./views/ForgetPwd";
+import SelectSchool from "./views/SelectSchool";
 
 export default {
   path: "/login-home",
@@ -23,6 +24,15 @@ export default {
         title: "忘记密码",
         noRequire: true
       }
+    },
+    {
+      path: "/select-school",
+      name: "SelectSchool",
+      component: SelectSchool,
+      meta: {
+        title: "选择学校",
+        noRequire: true
+      }
     }
   ]
 };

+ 9 - 3
src/modules/login/views/Login.vue

@@ -97,9 +97,15 @@ export default {
       this.$ls.set("user", data, this.GLOBAL.authTimeout);
       this.$ls.set("token", data.accessToken, this.GLOBAL.authTimeout);
 
-      this.$router.push({
-        name: "Home"
-      });
+      if (data.roleList && data.roleList.includes("ADMIN")) {
+        this.$router.push({
+          name: "SelectSchool"
+        });
+      } else {
+        this.$router.push({
+          name: "Home"
+        });
+      }
     }
   }
 };

+ 1 - 2
src/modules/base/components/ResetPwd.vue → src/modules/login/views/ResetPwd.vue

@@ -86,8 +86,7 @@
 </template>
 
 <script>
-import { updatePwd } from "../api";
-import { getSmsCodeForBind } from "@/modules/login/api";
+import { updatePwd, getSmsCodeForBind } from "../api";
 import { password, phone, smscode } from "@/plugins/formRules";
 import { Base64 } from "@/plugins/crypto";
 import fetchSmsMixins from "@/modules/login/fetchSmsMixins";

+ 76 - 0
src/modules/login/views/SelectSchool.vue

@@ -0,0 +1,76 @@
+<template>
+  <div class="select-school login login-box">
+    <div class="login-theme"></div>
+    <div class="login-body">
+      <div class="login-title">
+        <h1>选择学校</h1>
+      </div>
+      <div class="school-form">
+        <el-form ref="modalFormComp" :model="modalForm" :rules="rules">
+          <el-form-item prop="schoolId">
+            <school-select
+              v-model="modalForm.schoolId"
+              style="width:100%;"
+              @change="schoolChange"
+            ></school-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button style="width:100%;" type="primary" @click="confirm"
+              >进入学校</el-button
+            >
+          </el-form-item>
+          <el-form-item>
+            <el-button style="width:100%;" type="warning" @click="toAdmin"
+              >进入超管中心<i class="el-icon-arrow-right"></i
+            ></el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "select-school",
+  data() {
+    return {
+      schools: [],
+      modalForm: { schoolId: "" },
+      curSchool: {},
+      rules: {
+        schoolId: [{ required: true, message: "请选择学校", trigger: "change" }]
+      }
+    };
+  },
+  created() {
+    this.$ls.remove("schoolId");
+    this.$ls.remove("schoolName");
+    this.$ls.remove("schoolLogo");
+  },
+  methods: {
+    schoolChange(school) {
+      this.curSchool = school;
+    },
+    toAdmin() {
+      this.$router.push({ name: "Admin" });
+    },
+    async confirm() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      this.$ls.set(
+        "schoolId",
+        this.modalForm.schoolId,
+        this.GLOBAL.authTimeout
+      );
+      this.$ls.set("schoolName", this.curSchool.name, this.GLOBAL.authTimeout);
+      this.$ls.set("schoolLogo", this.curSchool.logo, this.GLOBAL.authTimeout);
+
+      this.$router.push({
+        name: "Home"
+      });
+    }
+  }
+};
+</script>

+ 2 - 0
src/router.js

@@ -6,6 +6,7 @@ import NotFound from "./views/404.vue";
 
 import login from "./modules/login/router";
 // module-example
+import admin from "./modules/admin/router";
 import base from "./modules/base/router";
 
 // ignore NavigationDuplicated. https://github.com/vuejs/vue-router/issues/2881
@@ -36,6 +37,7 @@ let router = new Router({
       component: Home,
       children: [...base]
     },
+    { ...admin },
     { ...login },
     {
       path: "*",

+ 33 - 7
src/views/Home.vue

@@ -3,6 +3,10 @@
     <div class="home-header">
       <div class="head-user menu-list">
         <ul>
+          <li @click="toSelectSchool" title="切换学校">
+            <i class="el-icon-s-home"></i>
+            <span>{{ schoolName || "切换学校" }}</span>
+          </li>
           <li class="menu-item menu-item-account" @click="toResetPwd">
             <i class="icon icon-account"></i>
             <span :title="username">{{ username }}</span>
@@ -29,6 +33,7 @@
         text-color="#434656"
         router
         :default-active="curRouteName"
+        :default-openeds="curSubMenuNames"
       >
         <template v-for="submenu in curMenu.children">
           <el-submenu
@@ -90,13 +95,19 @@
 
 <script>
 import localMenus from "@/constants/menus-data";
-import rolePrivilege from "@/constants/privilege";
+import { rolePrivilege, adminPrivilege } from "@/constants/privilege";
 import { logout } from "../modules/login/api";
-import ResetPwd from "../modules/base/components/ResetPwd";
+import ResetPwd from "../modules/login/views/ResetPwd";
 
 export default {
   name: "home",
   components: { ResetPwd },
+  props: {
+    super: {
+      type: Boolean,
+      default: false
+    }
+  },
   data() {
     const user = this.$ls.get("user", { id: "", roleList: [] });
     const IS_SUPER_ADMIN = user.roleList.includes("ADMIN");
@@ -113,6 +124,7 @@ export default {
       userRoles: user.roleList,
       userInfo: {},
       schoolLogo: this.$ls.get("schoolLogo"),
+      schoolName: this.$ls.get("schoolName"),
       IS_SUPER_ADMIN
     };
   },
@@ -129,7 +141,8 @@ export default {
     initData() {
       this.getPrivileges(localMenus);
       this.menus = this.getMenu();
-      if (this.$route.name === "Home") {
+      const MID_PAGE = ["Home", "Admin"];
+      if (MID_PAGE.includes(this.$route.name)) {
         this.toMenu(this.menus[0]);
         return;
       }
@@ -149,12 +162,18 @@ export default {
     },
     getPrivileges() {
       let privsSet = new Set();
-      this.userRoles.forEach(role => {
-        const privInfo = rolePrivilege[role];
-        privInfo.forEach(item => {
+      if (this.super) {
+        adminPrivilege.forEach(item => {
           privsSet.add(item);
         });
-      });
+      } else {
+        this.userRoles.forEach(role => {
+          const privInfo = rolePrivilege[role];
+          privInfo.forEach(item => {
+            privsSet.add(item);
+          });
+        });
+      }
 
       const privsList = Array.from(privsSet);
       this.privileges = localMenus
@@ -214,6 +233,10 @@ export default {
     },
     menuChange(menu) {
       this.curMenu = menu;
+
+      this.curSubMenuNames = this.privileges
+        .filter(item => item.parentId === menu.id)
+        .map(item => item.url);
     },
     toMenu(menu) {
       if (this.curMenu.url === menu.url) return;
@@ -257,6 +280,9 @@ export default {
       this.$ls.clear();
       this.$router.push({ name: "Login" });
     },
+    toSelectSchool() {
+      if (this.IS_SUPER_ADMIN) this.$router.push({ name: "SelectSchool" });
+    },
     toResetPwd() {
       if (this.IS_SUPER_ADMIN) return;
       this.$refs.ResetPwd.open();