From fe91cc994c78b15bbc4e974e4d7c0eb1177a7a10 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 29 五月 2024 14:44:21 +0800
Subject: [PATCH] 页面整合

---
 src/views/index.vue                                |   21 
 src/views/Manage/Education/TeacherDetail.vue       |  367 +
 src/views/Teach/Teach.vue                          |  247 +
 src/components/Choice/SingleItem.vue               |  745 +++
 src/views/Manage/TestPaper/index.vue               |  248 +
 src/views/Exam/Index.vue                           |   18 
 src/layout/index.vue                               |   13 
 src/const/crud/admin/user.js                       |  196 
 src/components/error-page/404.vue                  |   91 
 src/components/PageHeader/index.vue                |   48 
 src/components/editor/RichText.vue                 |  114 
 src/views/Exam/MyExam/BeginExam.vue                |  172 
 src/design/index.scss                              |    1 
 src/views/mine/StudyParticulars.vue                |  159 
 src/views/dashboard/index.vue                      |  561 +-
 src/components/upload/excel.vue                    |  147 
 src/const/crud/admin/post.js                       |   57 
 src/views/Manage/ExaminationManagement/index.vue   |  244 +
 src/views/Teach/Index.vue                          |   20 
 src/components/upload/SingleUpload.vue             |  119 
 src/views/Manage/Timetable/index.vue               |  457 +
 src/const/crud/admin/client.js                     |  135 
 src/components/basic-container/main.vue            |   40 
 src/const/errorCode.js                             |   13 
 src/const/crud/admin/dict.js                       |  125 
 src/const/crud/admin/sys-public-param.js           |  111 
 src/views/Manage/CreditHour/index.vue              |  141 
 src/const/crud/admin/role.js                       |   91 
 src/const/website.js                               |   35 
 src/views/Manage/Index.vue                         |   18 
 src/const/iconList.js                              |   47 
 src/views/Manage/TestPaper/TestPaperGeneration.vue |  304 +
 src/views/Exam/MyExam/MyExam.vue                   |  255 +
 src/main.js                                        |    1 
 src/components/error-page/500.vue                  |  112 
 src/components/error-page/403.vue                  |  129 
 src/views/Manage/ScoreInquiry/index.vue            |  234 
 src/const/crud/gen/form.js                         |   57 
 src/const/crud/admin/log.js                        |   74 
 src/const/crud/admin/token.js                      |   57 
 src/views/Manage/TestPaper/QuestionBank.vue        |  262 +
 package-lock.json                                  | 1599 ++++++
 src/components/DictResolver/index.js               |    0 
 src/utils/store.js                                 |  121 
 dist_electron/index.js                             |    4 
 src/components/particulars/introduce.vue           |   61 
 src/design/style.scss                              |   81 
 src/layout/components/Navbar.vue                   |  477 +
 src/views/Manage/Announce/index.vue                |  266 +
 src/const/crud/gen/gen.js                          |  227 
 src/components/MailManagement/index.vue            |  296 +
 src/design/style.min.css                           |    1 
 src/router.js                                      |  319 
 src/components/Echarts/index.vue                   |   49 
 src/components/PopUp/classPopUp.vue                |  299 +
 src/utils/mock/home.js                             |   32 
 src/views/Manage/AttendanceRecord/index.vue        |  164 
 dist_electron/package.json                         |   20 
 src/views/mine/index.vue                           |  280 +
 src/design/style.css                               |   77 
 src/views/Home/Home.vue                            |  316 +
 src/components/editor/index.vue                    |   78 
 src/views/Exam/Exam.vue                            |  248 +
 src/views/Manage/ClassManagement/Class.vue         |  290 +
 src/views/Manage/ClassManagement/index.vue         |   12 
 src/components/DictTag/index.vue                   |    0 
 src/const/crud/admin/file.js                       |   96 
 src/views/Manage/Email/index.vue                   |   91 
 src/components/iframe/main.vue                     |  129 
 src/background.js                                  |    1 
 src/components/PopUp/Question.vue                  |  175 
 src/components/Header/index.vue                    |  398 +
 src/views/user/student/list.vue                    |    2 
 src/components/particulars/photoWall.vue           |   39 
 src/views/Manage/Education/TeacherManage.vue       |  300 +
 src/utils/validate.js                              |  282 
 /dev/null                                          |  161 
 src/views/Manage/Manage.vue                        |  801 +++
 src/views/user/admin/list.vue                      |    2 
 package.json                                       |   17 
 src/views/Manage/ClassManagement/ClassStaff.vue    |  230 
 src/components/editor/LICENSE                      |  193 
 src/App.vue                                        |   25 
 83 files changed, 13,635 insertions(+), 910 deletions(-)

diff --git a/dist_electron/index.js b/dist_electron/index.js
index 95f0e8c..a946280 100644
--- a/dist_electron/index.js
+++ b/dist_electron/index.js
@@ -1751,7 +1751,7 @@
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue_cli_plugin_electron_builder_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-cli-plugin-electron-builder/lib */ \"./node_modules/vue-cli-plugin-electron-builder/lib/index.js\");\n/* harmony import */ var electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! electron-devtools-installer */ \"./node_modules/electron-devtools-installer/dist/index.js\");\n/* harmony import */ var electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\n\nconst isDevelopment = \"development\" !== 'production'\nlet mainWindow = null;\n// Scheme must be registered before the app is ready\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"protocol\"].registerSchemesAsPrivileged([\n  { scheme: 'app', privileges: { secure: true, standard: true } }\n])\n\nasync function createWindow () {\n  // Create the browser window.\n  const win = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\n    width: electron__WEBPACK_IMPORTED_MODULE_0__[\"screen\"].getPrimaryDisplay().workAreaSize.width,\n    height: electron__WEBPACK_IMPORTED_MODULE_0__[\"screen\"].getPrimaryDisplay().workAreaSize.height,\n    // transparent:true,\n    icon: '/src/favicon.ico',\n    fullscreen: true,\n    webPreferences: {\n\n      // Use pluginOptions.nodeIntegration, leave this alone\n      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info\n      //  娓叉煋杩涚▼ 寮�鍚痭ode妯″潡锛屼娇寰桱S涓彲浠ヤ娇鐢╪ode鐨刴odel\n      nodeIntegration: true,\n      //鏉ユ墦寮�remote妯″潡锛屼娇寰楁覆鏌撹繘绋嬩腑鍙互璋冪敤涓昏繘绋嬬殑鏂规硶\n      enableRemoteModule: true,\n      // 鎺у埗涓婁笅鏂囬殧绂籠n      contextIsolation: false,\n      // 棰勫姞杞絓n      preload: path__WEBPACK_IMPORTED_MODULE_3___default.a.join(__dirname, 'preload.js'),\n      webSecurity: false\n    }\n  })\n\n  if (true) {\n    // Load the url of the dev server if in development mode\n    await win.loadURL(\"http://localhost:8002\")\n    if (!process.env.IS_TEST) win.webContents.openDevTools()\n  } else {}\n  return win;\n}\n\n// Quit when all windows are closed.\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('window-all-closed', () => {\n  // On macOS it is common for applications and their menu bar\n  // to stay active until the user quits explicitly with Cmd + Q\n  if (process.platform !== 'darwin') {\n    electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n  }\n})\n\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('activate', () => {\n  // On macOS it's common to re-create a window in the app when the\n  // dock icon is clicked and there are no other windows open.\n  if (electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].getAllWindows().length === 0) createWindow()\n})\n\n// This method will be called when Electron has finished\n// initialization and is ready to create browser windows.\n// Some APIs can only be used after this event occurs.\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('ready', async () => {\n  if (isDevelopment && !process.env.IS_TEST) {\n    // Install Vue Devtools\n    // try {\n    //   await installExtension(VUEJS_DEVTOOLS);\n\n    // } catch (e) {\n    //   console.error('Vue Devtools failed to install:', e.toString());\n    // }\n  }\n  mainWindow = await createWindow();\n  mainWindow.setTitle(\"姹熻タ鍩庣\"); //璁剧疆绋嬪簭Title\n\n  electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('closeWindow', async () => {\n    console.log('closeWindow');\n    mainWindow.hide();\n    mainWindow.close();\n    // await mainWindow.close()\n  });\n});\n\n// Exit cleanly on request from parent process in development mode.\nif (isDevelopment) {\n  if (process.platform === 'win32') {\n    process.on('message', (data) => {\n      if (data === 'graceful-exit') {\n        electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n      }\n    })\n  } else {\n    process.on('SIGTERM', () => {\n      electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n    })\n  }\n}\n\n\n//# sourceURL=webpack:///./src/background.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue_cli_plugin_electron_builder_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-cli-plugin-electron-builder/lib */ \"./node_modules/vue-cli-plugin-electron-builder/lib/index.js\");\n/* harmony import */ var electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! electron-devtools-installer */ \"./node_modules/electron-devtools-installer/dist/index.js\");\n/* harmony import */ var electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(electron_devtools_installer__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\n\nconst isDevelopment = \"development\" !== 'production'\nlet mainWindow = null;\n// Scheme must be registered before the app is ready\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"protocol\"].registerSchemesAsPrivileged([\n  { scheme: 'app', privileges: { secure: true, standard: true } }\n])\n\nasync function createWindow () {\n  // Create the browser window.\n  const win = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\n    width: electron__WEBPACK_IMPORTED_MODULE_0__[\"screen\"].getPrimaryDisplay().workAreaSize.width,\n    height: electron__WEBPACK_IMPORTED_MODULE_0__[\"screen\"].getPrimaryDisplay().workAreaSize.height,\n    // transparent:true,\n    icon: '/src/favicon.ico',\n    fullscreenable: true,\n    fullscreen: false,\n    webPreferences: {\n\n      // Use pluginOptions.nodeIntegration, leave this alone\n      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info\n      //  娓叉煋杩涚▼ 寮�鍚痭ode妯″潡锛屼娇寰桱S涓彲浠ヤ娇鐢╪ode鐨刴odel\n      nodeIntegration: true,\n      //鏉ユ墦寮�remote妯″潡锛屼娇寰楁覆鏌撹繘绋嬩腑鍙互璋冪敤涓昏繘绋嬬殑鏂规硶\n      enableRemoteModule: true,\n      // 鎺у埗涓婁笅鏂囬殧绂籠n      contextIsolation: false,\n      // 棰勫姞杞絓n      preload: path__WEBPACK_IMPORTED_MODULE_3___default.a.join(__dirname, 'preload.js'),\n      webSecurity: false\n    }\n  })\n\n  if (true) {\n    // Load the url of the dev server if in development mode\n    await win.loadURL(\"http://localhost:8002\")\n    if (!process.env.IS_TEST) win.webContents.openDevTools()\n  } else {}\n  return win;\n}\n\n// Quit when all windows are closed.\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('window-all-closed', () => {\n  // On macOS it is common for applications and their menu bar\n  // to stay active until the user quits explicitly with Cmd + Q\n  if (process.platform !== 'darwin') {\n    electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n  }\n})\n\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('activate', () => {\n  // On macOS it's common to re-create a window in the app when the\n  // dock icon is clicked and there are no other windows open.\n  if (electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].getAllWindows().length === 0) createWindow()\n})\n\n// This method will be called when Electron has finished\n// initialization and is ready to create browser windows.\n// Some APIs can only be used after this event occurs.\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('ready', async () => {\n  if (isDevelopment && !process.env.IS_TEST) {\n    // Install Vue Devtools\n    // try {\n    //   await installExtension(VUEJS_DEVTOOLS);\n\n    // } catch (e) {\n    //   console.error('Vue Devtools failed to install:', e.toString());\n    // }\n  }\n  mainWindow = await createWindow();\n  mainWindow.setTitle(\"姹熻タ鍩庣\"); //璁剧疆绋嬪簭Title\n\n  electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('closeWindow', async () => {\n    console.log('closeWindow');\n    mainWindow.hide();\n    mainWindow.close();\n    // await mainWindow.close()\n  });\n});\n\n// Exit cleanly on request from parent process in development mode.\nif (isDevelopment) {\n  if (process.platform === 'win32') {\n    process.on('message', (data) => {\n      if (data === 'graceful-exit') {\n        electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n      }\n    })\n  } else {\n    process.on('SIGTERM', () => {\n      electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\n    })\n  }\n}\n\n\n//# sourceURL=webpack:///./src/background.js?");
 
 /***/ }),
 
@@ -1762,7 +1762,7 @@
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-eval("module.exports = __webpack_require__(/*! D:\\Codes\\xzs\\source\\vue\\xzs-admin\\src\\background.js */\"./src/background.js\");\n\n\n//# sourceURL=webpack:///multi_./src/background.js?");
+eval("module.exports = __webpack_require__(/*! D:\\Codes\\jxkg-ui-new\\src\\background.js */\"./src/background.js\");\n\n\n//# sourceURL=webpack:///multi_./src/background.js?");
 
 /***/ }),
 
diff --git a/dist_electron/package.json b/dist_electron/package.json
index a29f166..11a57cc 100644
--- a/dist_electron/package.json
+++ b/dist_electron/package.json
@@ -13,13 +13,23 @@
     "build:prod": "vue-cli-service build --mode prod",
     "build:test": "vue-cli-service build --mode test",
     "electron:build": "vue-cli-service electron:build",
-    "electron:serve": "vue-cli-service electron:serve",
+    "electron:serve": "vue-cli-service electron:serve" ,
     "postinstall": "electron-builder install-app-deps",
     "postuninstall": "electron-builder install-app-deps"
   },
   "main": "background.js",
   "dependencies": {
+    "@riophae/vue-treeselect": "^0.4.0",
+    "@smallwei/avue": "2.8.23",
+    "@sscfaith/avue-form-design": "1.4.8",
+    "@wangeditor/editor": "^5.1.0",
+    "@wangeditor/editor-for-vue": "^1.0.1",
+    "animate.css": "^4.1.1",
+    "avue-plugin-ueditor": "^0.0.6",
     "axios": "^0.19.2",
+    "babel-polyfill": "^6.26.0",
+    "classlist-polyfill": "^1.2.0",
+    "crypto-js": "^3.1.9-1",
     "clipboard": "^2.0.11",
     "codemirror": "^5.65.16",
     "core-js": "^3.37.1",
@@ -28,16 +38,24 @@
     "echarts": "^5.5.0",
     "element-ui": "^2.15.14",
     "file-saver": "^2.0.5",
+    "fs": "^0.0.1-security",
     "fuse.js": "^6.6.2",
     "husky": "^7.0.4",
+    "mockjs": "^1.1.0",
     "js-cookie": "2.2.0",
     "jszip": "^3.10.1",
+    "node-sass": "^6.0.1",
     "normalize.css": "8.0.1",
     "nprogress": "0.2.0",
+    "path-browserify": "^1.0.1",
     "path-to-regexp": "^6.2.2",
+    "rebuild": "^0.1.2",
+    "sass-loader": "^10.0.1",
     "screenfull": "^5.2.0",
     "script-loader": "^0.7.2",
+    "supvue-ui": "^0.2.0",
     "vue": "^2.7.16",
+    "vue-axios": "^2.1.4",
     "vue-count-to": "^1.0.13",
     "vue-router": "^3.6.5",
     "vuex": "^3.6.2",
diff --git a/package-lock.json b/package-lock.json
index 340d0f3..34a3455 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,25 +10,43 @@
       "hasInstallScript": true,
       "license": "AGPL-3.0",
       "dependencies": {
+        "@riophae/vue-treeselect": "^0.4.0",
+        "@smallwei/avue": "2.8.23",
+        "@sscfaith/avue-form-design": "1.4.8",
+        "@wangeditor/editor": "^5.1.0",
+        "@wangeditor/editor-for-vue": "^1.0.1",
+        "animate.css": "^4.1.1",
+        "avue-plugin-ueditor": "^0.0.6",
         "axios": "^0.19.2",
+        "babel-polyfill": "^6.26.0",
+        "classlist-polyfill": "^1.2.0",
         "clipboard": "^2.0.11",
         "codemirror": "^5.65.16",
         "core-js": "^3.37.1",
+        "crypto-js": "^3.1.9-1",
         "driver.js": "^0.9.8",
         "dropzone": "^5.9.3",
         "echarts": "^5.5.0",
         "element-ui": "^2.15.14",
         "file-saver": "^2.0.5",
+        "fs": "^0.0.1-security",
         "fuse.js": "^6.6.2",
         "husky": "^7.0.4",
         "js-cookie": "2.2.0",
         "jszip": "^3.10.1",
+        "mockjs": "^1.1.0",
+        "node-sass": "^6.0.1",
         "normalize.css": "8.0.1",
         "nprogress": "0.2.0",
+        "path-browserify": "^1.0.1",
         "path-to-regexp": "^6.2.2",
+        "rebuild": "^0.1.2",
+        "sass-loader": "^10.0.1",
         "screenfull": "^5.2.0",
         "script-loader": "^0.7.2",
+        "supvue-ui": "^0.2.0",
         "vue": "^2.7.16",
+        "vue-axios": "^2.1.4",
         "vue-count-to": "^1.0.13",
         "vue-router": "^3.6.5",
         "vuex": "^3.6.2",
@@ -1776,7 +1794,6 @@
       "version": "7.24.6",
       "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.6.tgz",
       "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==",
-      "dev": true,
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -2266,6 +2283,24 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/@riophae/vue-treeselect": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
+      "integrity": "sha512-J4atYmBqXQmiPFK/0B5sXKjtnGc21mBJEiyKIDZwk0Q9XuynVFX6IJ4EpaLmUgL5Tve7HAS7wkiGGSti6Uaxcg==",
+      "dependencies": {
+        "@babel/runtime": "^7.3.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.3",
+        "easings-css": "^1.0.0",
+        "fuzzysearch": "^1.0.3",
+        "is-promise": "^2.1.0",
+        "lodash": "^4.0.0",
+        "material-colors": "^1.2.6",
+        "watch-size": "^2.0.0"
+      },
+      "peerDependencies": {
+        "vue": "^2.2.0"
+      }
+    },
     "node_modules/@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz",
@@ -2273,6 +2308,56 @@
       "dev": true,
       "engines": {
         "node": ">=6"
+      }
+    },
+    "node_modules/@smallwei/avue": {
+      "version": "2.8.23",
+      "resolved": "https://registry.npmmirror.com/@smallwei/avue/-/avue-2.8.23.tgz",
+      "integrity": "sha512-moO/wtekk7dMnmCpIIE13i81tlzuL6VTqHY2KCELlBK2FzyDfndCW304+NpWWaenW+2wtzOfgsGOCuSSVfwzzQ==",
+      "dependencies": {
+        "axios": "^0.21.1",
+        "countup.js": "^1.9.3",
+        "dayjs": "^1.10.4",
+        "deepmerge": "^3.1.0",
+        "element-ui": "^2.15.1",
+        "nprogress": "^0.2.0",
+        "vue": "^2.5.17",
+        "vuedraggable": "^2.17.0"
+      }
+    },
+    "node_modules/@smallwei/avue/node_modules/axios": {
+      "version": "0.21.4",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz",
+      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+      "dependencies": {
+        "follow-redirects": "^1.14.0"
+      }
+    },
+    "node_modules/@smallwei/avue/node_modules/deepmerge": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-3.3.0.tgz",
+      "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@smallwei/avue/node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
       }
     },
     "node_modules/@soda/friendly-errors-webpack-plugin": {
@@ -2363,6 +2448,15 @@
       "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
       "dev": true
     },
+    "node_modules/@sscfaith/avue-form-design": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmmirror.com/@sscfaith/avue-form-design/-/avue-form-design-1.4.8.tgz",
+      "integrity": "sha512-+b9Sj+9PlGFqs062v2tfpwTk+dN/Kx8iyTXdruScY063zvK6o5ezHWz4RgoUbx1qNsfKHzpF2IxkYtWBhefqrA==",
+      "dependencies": {
+        "monaco-editor": "^0.27.0",
+        "vuedraggable": "^2.24.3"
+      }
+    },
     "node_modules/@szmarczak/http-timer": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
@@ -2383,6 +2477,11 @@
       "engines": {
         "node": ">= 10"
       }
+    },
+    "node_modules/@transloadit/prettier-bytes": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
     },
     "node_modules/@types/body-parser": {
       "version": "1.19.5",
@@ -2421,6 +2520,11 @@
       "dependencies": {
         "@types/ms": "*"
       }
+    },
+    "node_modules/@types/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
     },
     "node_modules/@types/express": {
       "version": "4.17.21",
@@ -2670,6 +2774,56 @@
       "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
       "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
       "dev": true
+    },
+    "node_modules/@uppy/companion-client": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+      "dependencies": {
+        "@uppy/utils": "^4.1.2",
+        "namespace-emitter": "^2.0.1"
+      }
+    },
+    "node_modules/@uppy/core": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+      "dependencies": {
+        "@transloadit/prettier-bytes": "0.0.7",
+        "@uppy/store-default": "^2.1.1",
+        "@uppy/utils": "^4.1.3",
+        "lodash.throttle": "^4.1.1",
+        "mime-match": "^1.0.2",
+        "namespace-emitter": "^2.0.1",
+        "nanoid": "^3.1.25",
+        "preact": "^10.5.13"
+      }
+    },
+    "node_modules/@uppy/store-default": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+    },
+    "node_modules/@uppy/utils": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+      "dependencies": {
+        "lodash.throttle": "^4.1.1"
+      }
+    },
+    "node_modules/@uppy/xhr-upload": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+      "dependencies": {
+        "@uppy/companion-client": "^2.2.2",
+        "@uppy/utils": "^4.1.2",
+        "nanoid": "^3.1.25"
+      },
+      "peerDependencies": {
+        "@uppy/core": "^2.3.3"
+      }
     },
     "node_modules/@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.4.0",
@@ -3283,6 +3437,156 @@
       "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
       "dev": true
     },
+    "node_modules/@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "dependencies": {
+        "is-url": "^1.2.4"
+      },
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.throttle": "^4.1.1",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "dependencies": {
+        "prismjs": "^1.23.0"
+      },
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "dependencies": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      },
+      "peerDependencies": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/editor": {
+      "version": "5.1.23",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+      "dependencies": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "^1.1.7",
+        "@wangeditor/code-highlight": "^1.0.3",
+        "@wangeditor/core": "^1.1.19",
+        "@wangeditor/list-module": "^1.0.5",
+        "@wangeditor/table-module": "^1.1.4",
+        "@wangeditor/upload-image-module": "^1.0.2",
+        "@wangeditor/video-module": "^1.1.4",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/editor-for-vue": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA==",
+      "peerDependencies": {
+        "@wangeditor/editor": ">=5.1.0",
+        "vue": "^2.6.14"
+      }
+    },
+    "node_modules/@wangeditor/list-module": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/table-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/upload-image-module": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
+      "peerDependencies": {
+        "@uppy/core": "^2.0.3",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "1.x",
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.foreach": "^4.5.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/video-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
+      "peerDependencies": {
+        "@uppy/core": "^2.1.4",
+        "@uppy/xhr-upload": "^2.0.7",
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.9.0",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@@ -3624,6 +3928,11 @@
       "engines": {
         "node": ">=0.4.2"
       }
+    },
+    "node_modules/animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
     },
     "node_modules/ansi-align": {
       "version": "3.0.1",
@@ -4268,6 +4577,35 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/avue-plugin-ueditor": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmmirror.com/avue-plugin-ueditor/-/avue-plugin-ueditor-0.0.6.tgz",
+      "integrity": "sha512-mq0+yDRj+xPxiMm8KbkRp4bni1PREeKZSnuAAu3npvRuYX+hEJPH3/saNtpocr7unRpQz7IS7EFHGdN4xhwJ8w==",
+      "dependencies": {
+        "axios": "^0.18.0",
+        "vue": "^2.5.17",
+        "vue-quill-editor": "^3.0.6",
+        "vue-router": "^3.0.1"
+      }
+    },
+    "node_modules/avue-plugin-ueditor/node_modules/axios": {
+      "version": "0.18.1",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.18.1.tgz",
+      "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==",
+      "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410",
+      "dependencies": {
+        "follow-redirects": "1.5.10",
+        "is-buffer": "^2.0.2"
+      }
+    },
+    "node_modules/avue-plugin-ueditor/node_modules/is-buffer": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz",
+      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -4384,6 +4722,28 @@
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
+    },
+    "node_modules/babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==",
+      "dependencies": {
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "regenerator-runtime": "^0.10.5"
+      }
+    },
+    "node_modules/babel-polyfill/node_modules/core-js": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+      "hasInstallScript": true
+    },
+    "node_modules/babel-polyfill/node_modules/regenerator-runtime": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+      "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w=="
     },
     "node_modules/babel-runtime": {
       "version": "6.26.0",
@@ -5364,7 +5724,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
       "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
-      "dev": true,
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -5709,6 +6068,11 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/classlist-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+      "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+    },
     "node_modules/clean-css": {
       "version": "4.2.4",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz",
@@ -5971,7 +6335,6 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
       "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
-      "dev": true,
       "engines": {
         "node": ">=0.8"
       }
@@ -6093,8 +6456,7 @@
     "node_modules/commander": {
       "version": "2.17.1",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
-      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
-      "dev": true
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
     },
     "node_modules/commondir": {
       "version": "1.0.1",
@@ -6170,6 +6532,11 @@
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "dev": true
+    },
+    "node_modules/compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
@@ -6575,6 +6942,11 @@
         "node": ">=4"
       }
     },
+    "node_modules/countup.js": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-1.9.3.tgz",
+      "integrity": "sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A=="
+    },
     "node_modules/crc": {
       "version": "3.8.0",
       "resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz",
@@ -6685,6 +7057,11 @@
       "engines": {
         "node": "*"
       }
+    },
+    "node_modules/crypto-js": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-3.3.0.tgz",
+      "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
     },
     "node_modules/crypto-random-string": {
       "version": "2.0.0",
@@ -6976,6 +7353,18 @@
       "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==",
       "dev": true
     },
+    "node_modules/d": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+      "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+      "dependencies": {
+        "es5-ext": "^0.10.64",
+        "type": "^2.7.2"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
     "node_modules/dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
@@ -7029,6 +7418,11 @@
       "engines": {
         "node": ">= 0.4"
       }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.11",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.11.tgz",
+      "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
     },
     "node_modules/de-indent": {
       "version": "1.0.2",
@@ -7109,7 +7503,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz",
       "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
-      "dev": true,
       "dependencies": {
         "is-arguments": "^1.1.1",
         "is-date-object": "^1.0.5",
@@ -7307,7 +7700,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
-      "dev": true,
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -7321,7 +7713,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
       "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
-      "dev": true,
       "dependencies": {
         "define-data-property": "^1.0.1",
         "has-property-descriptors": "^1.0.0",
@@ -7681,6 +8072,14 @@
       "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
       "dev": true
     },
+    "node_modules/dom7": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+      "dependencies": {
+        "ssr-window": "^3.0.0-alpha.1"
+      }
+    },
     "node_modules/domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -7786,6 +8185,11 @@
         "readable-stream": "^2.0.0",
         "stream-shift": "^1.0.0"
       }
+    },
+    "node_modules/easings-css": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/easings-css/-/easings-css-1.0.0.tgz",
+      "integrity": "sha512-7Uq7NdazNfVtr0RNmPAys8it0zKCuaqxJStYKEl72D3j4gbvXhhaM7iWNbqhA4C94ygCye6VuyhzBRQC4szeBg=="
     },
     "node_modules/easy-stack": {
       "version": "1.0.1",
@@ -8477,7 +8881,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
       "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
-      "dev": true,
       "dependencies": {
         "get-intrinsic": "^1.2.4"
       },
@@ -8489,7 +8892,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
@@ -8543,12 +8945,49 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/es5-ext": {
+      "version": "0.10.64",
+      "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+      "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "esniff": "^2.0.1",
+        "next-tick": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/es6-error": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz",
       "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
       "dev": true,
       "optional": true
+    },
+    "node_modules/es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "node_modules/es6-symbol": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+      "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+      "dependencies": {
+        "d": "^1.0.2",
+        "ext": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
     },
     "node_modules/escalade": {
       "version": "3.1.2",
@@ -9107,6 +9546,20 @@
         "node": ">=4"
       }
     },
+    "node_modules/esniff": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+      "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+      "dependencies": {
+        "d": "^1.0.1",
+        "es5-ext": "^0.10.62",
+        "event-emitter": "^0.3.5",
+        "type": "^2.7.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/espree": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/espree/-/espree-5.0.1.tgz",
@@ -9219,6 +9672,15 @@
       "dev": true,
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
       }
     },
     "node_modules/event-pubsub": {
@@ -9445,11 +9907,18 @@
       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "dev": true
     },
+    "node_modules/ext": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+      "dependencies": {
+        "type": "^2.7.2"
+      }
+    },
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
     },
     "node_modules/extend-shallow": {
       "version": "3.0.2",
@@ -9574,6 +10043,11 @@
       "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
+    },
+    "node_modules/fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
     },
     "node_modules/fast-glob": {
       "version": "2.2.7",
@@ -10113,6 +10587,11 @@
         "readable-stream": "^2.0.0"
       }
     },
+    "node_modules/fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmmirror.com/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+    },
     "node_modules/fs-extra": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz",
@@ -10174,8 +10653,7 @@
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
     "node_modules/function.prototype.name": {
       "version": "1.1.6",
@@ -10201,8 +10679,7 @@
     "node_modules/functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "dev": true
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     },
     "node_modules/fuse.js": {
       "version": "6.6.2",
@@ -10211,6 +10688,11 @@
       "engines": {
         "node": ">=10"
       }
+    },
+    "node_modules/fuzzysearch": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/fuzzysearch/-/fuzzysearch-1.0.3.tgz",
+      "integrity": "sha512-s+kNWQuI3mo9OALw0HJ6YGmMbLqEufCh2nX/zzV5CrICQ/y4AwPxM+6TIiF9ItFCHXFCyM/BfCCmN57NTIJuPg=="
     },
     "node_modules/gauge": {
       "version": "2.7.4",
@@ -10309,7 +10791,6 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
       "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
-      "dev": true,
       "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
@@ -10591,7 +11072,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
       "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-      "dev": true,
       "dependencies": {
         "get-intrinsic": "^1.1.3"
       }
@@ -10730,7 +11210,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
-      "dev": true,
       "dependencies": {
         "es-define-property": "^1.0.0"
       }
@@ -10739,7 +11218,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
       "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
@@ -10748,7 +11226,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
       "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
@@ -10757,7 +11234,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dev": true,
       "dependencies": {
         "has-symbols": "^1.0.3"
       },
@@ -10852,7 +11328,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -10996,6 +11471,11 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/html-void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
     },
     "node_modules/html-webpack-plugin": {
       "version": "3.2.0",
@@ -11276,6 +11756,14 @@
         "url": "https://github.com/sponsors/typicode"
       }
     },
+    "node_modules/i18next": {
+      "version": "20.6.1",
+      "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "dependencies": {
+        "@babel/runtime": "^7.12.0"
+      }
+    },
     "node_modules/iconv-corefoundation": {
       "version": "1.1.7",
       "resolved": "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
@@ -11354,6 +11842,15 @@
       "version": "3.0.6",
       "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
       "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
+    },
+    "node_modules/immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/immer"
+      }
     },
     "node_modules/import-cwd": {
       "version": "2.1.0",
@@ -11707,7 +12204,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz",
       "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -11847,7 +12343,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -11930,6 +12425,11 @@
       "engines": {
         "node": ">=0.10.0"
       }
+    },
+    "node_modules/is-hotkey": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
     },
     "node_modules/is-installed-globally": {
       "version": "0.4.0",
@@ -12073,11 +12573,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-promise": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz",
+      "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+    },
     "node_modules/is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -12154,6 +12658,11 @@
       "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
       "dev": true
+    },
+    "node_modules/is-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
     },
     "node_modules/is-weakref": {
       "version": "1.0.2",
@@ -12700,20 +13209,38 @@
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "node_modules/lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
     "node_modules/lodash.defaultsdeep": {
       "version": "4.6.1",
       "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
       "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
       "dev": true
+    },
+    "node_modules/lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "node_modules/lodash.kebabcase": {
       "version": "4.1.1",
@@ -12738,6 +13265,16 @@
       "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
+    },
+    "node_modules/lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "node_modules/lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
     "node_modules/lodash.transform": {
       "version": "4.6.0",
@@ -12869,6 +13406,11 @@
       "engines": {
         "node": ">=10"
       }
+    },
+    "node_modules/material-colors": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
+      "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
     },
     "node_modules/md5.js": {
       "version": "1.3.5",
@@ -13066,6 +13608,14 @@
       "dev": true,
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+      "dependencies": {
+        "wildcard": "^1.1.0"
       }
     },
     "node_modules/mime-types": {
@@ -13370,6 +13920,22 @@
         "mkdirp": "bin/cmd.js"
       }
     },
+    "node_modules/mockjs": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz",
+      "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+      "dependencies": {
+        "commander": "*"
+      },
+      "bin": {
+        "random": "bin/random"
+      }
+    },
+    "node_modules/monaco-editor": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.27.0.tgz",
+      "integrity": "sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ=="
+    },
     "node_modules/move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -13425,6 +13991,11 @@
         "object-assign": "^4.0.1",
         "thenify-all": "^1.0.0"
       }
+    },
+    "node_modules/namespace-emitter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
     },
     "node_modules/nan": {
       "version": "2.19.0",
@@ -13491,6 +14062,11 @@
       "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
       "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
       "dev": true
+    },
+    "node_modules/next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
     "node_modules/nice-try": {
       "version": "1.0.5",
@@ -13631,6 +14207,12 @@
         "ieee754": "^1.1.4",
         "isarray": "^1.0.0"
       }
+    },
+    "node_modules/node-libs-browser/node_modules/path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true
     },
     "node_modules/node-libs-browser/node_modules/punycode": {
       "version": "1.4.1",
@@ -13958,7 +14540,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14033,7 +14614,6 @@
       "version": "1.1.6",
       "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz",
       "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1"
@@ -14046,7 +14626,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
@@ -14248,6 +14827,14 @@
       "dev": true,
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/optimist": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmmirror.com/optimist/-/optimist-0.3.7.tgz",
+      "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==",
+      "dependencies": {
+        "wordwrap": "~0.0.2"
       }
     },
     "node_modules/optionator": {
@@ -14481,6 +15068,11 @@
         "no-case": "^2.2.0"
       }
     },
+    "node_modules/parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@@ -14578,10 +15170,9 @@
       }
     },
     "node_modules/path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
-      "dev": true
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
     },
     "node_modules/path-dirname": {
       "version": "1.0.2",
@@ -15644,6 +16235,15 @@
         "posthtml-render": "^1.0.6"
       }
     },
+    "node_modules/preact": {
+      "version": "10.22.0",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.22.0.tgz",
+      "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/preact"
+      }
+    },
     "node_modules/prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -15685,6 +16285,14 @@
       "dependencies": {
         "lodash": "^4.17.20",
         "renderkid": "^2.0.4"
+      }
+    },
+    "node_modules/prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+      "engines": {
+        "node": ">=6"
       }
     },
     "node_modules/process": {
@@ -15881,6 +16489,37 @@
       "engines": {
         "node": ">=8"
       }
+    },
+    "node_modules/quill": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "dependencies": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      }
+    },
+    "node_modules/quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "dependencies": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/quill/node_modules/eventemitter3": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz",
+      "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
     },
     "node_modules/randombytes": {
       "version": "2.1.0",
@@ -16106,6 +16745,20 @@
         "node": ">=8.10.0"
       }
     },
+    "node_modules/rebuild": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/rebuild/-/rebuild-0.1.2.tgz",
+      "integrity": "sha512-EtDZ5IapND57htCrOOcfH7MzXCQKivzSZUIZIuc8H0xDHfmi9HDBZIyjT7Neh5GcUoxQ6hfsXluC+UrYLgGbZg==",
+      "dependencies": {
+        "optimist": "0.3.x"
+      },
+      "bin": {
+        "rebuild": "cli.js"
+      },
+      "engines": {
+        "node": ">=0.8.8"
+      }
+    },
     "node_modules/redent": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz",
@@ -16140,8 +16793,7 @@
     "node_modules/regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
-      "dev": true
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
     },
     "node_modules/regenerator-transform": {
       "version": "0.15.2",
@@ -16169,7 +16821,6 @@
       "version": "1.5.2",
       "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
       "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.6",
         "define-properties": "^1.2.1",
@@ -16904,6 +17555,14 @@
         "raw-loader": "~0.5.1"
       }
     },
+    "node_modules/scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "dependencies": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
     "node_modules/scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npmmirror.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -17169,7 +17828,6 @@
       "version": "1.2.2",
       "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
       "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
-      "dev": true,
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -17186,7 +17844,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
       "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
-      "dev": true,
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -17335,6 +17992,43 @@
         "node": ">=6"
       }
     },
+    "node_modules/slate": {
+      "version": "0.72.8",
+      "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+      "dependencies": {
+        "immer": "^9.0.6",
+        "is-plain-object": "^5.0.0",
+        "tiny-warning": "^1.0.3"
+      }
+    },
+    "node_modules/slate-history": {
+      "version": "0.66.0",
+      "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+      "dependencies": {
+        "is-plain-object": "^5.0.0"
+      },
+      "peerDependencies": {
+        "slate": ">=0.65.3"
+      }
+    },
+    "node_modules/slate-history/node_modules/is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/slate/node_modules/is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -17367,6 +18061,14 @@
       "engines": {
         "node": ">= 6.0.0",
         "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/snabbdom": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
+      "engines": {
+        "node": ">=12.17.0"
       }
     },
     "node_modules/snapdragon": {
@@ -17577,6 +18279,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "node_modules/source-list-map": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -17782,6 +18489,11 @@
       "engines": {
         "node": ">=0.10.0"
       }
+    },
+    "node_modules/ssr-window": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
     "node_modules/ssri": {
       "version": "8.0.1",
@@ -18103,6 +18815,24 @@
       "engines": {
         "node": ">= 0.4"
       }
+    },
+    "node_modules/supvue-ui": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/supvue-ui/-/supvue-ui-0.2.0.tgz",
+      "integrity": "sha512-qqadrZURj/IVYPc63YpJgwVFeqDQEcrd0Ij3MeP/zzcVAulC/8b8rhmMFasWT9dg9FRIw+KIX1+fMAdeuAA3QQ==",
+      "dependencies": {
+        "core-js": "^2.6.5",
+        "element-ui": "^2.15.6",
+        "vue": "^2.6.10",
+        "vue-router": "^3.0.3"
+      }
+    },
+    "node_modules/supvue-ui/node_modules/core-js": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+      "hasInstallScript": true
     },
     "node_modules/svg-baker": {
       "version": "1.7.0",
@@ -18966,6 +19696,11 @@
       "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
       "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
     },
+    "node_modules/tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
     "node_modules/tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
@@ -19226,6 +19961,11 @@
       "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
       "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
       "dev": true
+    },
+    "node_modules/type": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
+      "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
     },
     "node_modules/type-check": {
       "version": "0.3.2",
@@ -20021,6 +20761,14 @@
         "csstype": "^3.1.0"
       }
     },
+    "node_modules/vue-axios": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/vue-axios/-/vue-axios-2.1.5.tgz",
+      "integrity": "sha512-th5xVbInVoyIoe+qY+9GCflEVezxAvztD4xpFF39SRQYqpoKD2qkmX8yv08jJG9a2SgNOCjirjJGSwg/wTrbmA==",
+      "peerDependencies": {
+        "vue": ">= 1.0.0"
+      }
+    },
     "node_modules/vue-cli-plugin-electron-builder": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/vue-cli-plugin-electron-builder/-/vue-cli-plugin-electron-builder-2.1.1.tgz",
@@ -20646,6 +21394,19 @@
         "node": ">=4.0.0"
       }
     },
+    "node_modules/vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      },
+      "engines": {
+        "node": ">= 4.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
     "node_modules/vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz",
@@ -20749,6 +21510,14 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "dependencies": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "node_modules/vuex": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
@@ -20756,6 +21525,11 @@
       "peerDependencies": {
         "vue": "^2.0.0"
       }
+    },
+    "node_modules/watch-size": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/watch-size/-/watch-size-2.0.0.tgz",
+      "integrity": "sha512-M92R89dNoTPWyCD+HuUEDdhaDnh9jxPGOwlDc0u51jAgmjUvzqaEMynXSr3BaWs+QdHYk4KzibPy1TFtjLmOZQ=="
     },
     "node_modules/watchpack": {
       "version": "1.7.5",
@@ -21629,6 +22403,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/wildcard": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+    },
     "node_modules/wmf": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
@@ -21652,6 +22431,14 @@
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wordwrap": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.3.tgz",
+      "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==",
+      "engines": {
+        "node": ">=0.4.0"
       }
     },
     "node_modules/worker-farm": {
@@ -23213,7 +24000,6 @@
       "version": "7.24.6",
       "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.6.tgz",
       "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==",
-      "dev": true,
       "requires": {
         "regenerator-runtime": "^0.14.0"
       }
@@ -23600,11 +24386,61 @@
         }
       }
     },
+    "@riophae/vue-treeselect": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
+      "integrity": "sha512-J4atYmBqXQmiPFK/0B5sXKjtnGc21mBJEiyKIDZwk0Q9XuynVFX6IJ4EpaLmUgL5Tve7HAS7wkiGGSti6Uaxcg==",
+      "requires": {
+        "@babel/runtime": "^7.3.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.3",
+        "easings-css": "^1.0.0",
+        "fuzzysearch": "^1.0.3",
+        "is-promise": "^2.1.0",
+        "lodash": "^4.0.0",
+        "material-colors": "^1.2.6",
+        "watch-size": "^2.0.0"
+      }
+    },
     "@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz",
       "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
       "dev": true
+    },
+    "@smallwei/avue": {
+      "version": "2.8.23",
+      "resolved": "https://registry.npmmirror.com/@smallwei/avue/-/avue-2.8.23.tgz",
+      "integrity": "sha512-moO/wtekk7dMnmCpIIE13i81tlzuL6VTqHY2KCELlBK2FzyDfndCW304+NpWWaenW+2wtzOfgsGOCuSSVfwzzQ==",
+      "requires": {
+        "axios": "^0.21.1",
+        "countup.js": "^1.9.3",
+        "dayjs": "^1.10.4",
+        "deepmerge": "^3.1.0",
+        "element-ui": "^2.15.1",
+        "nprogress": "^0.2.0",
+        "vue": "^2.5.17",
+        "vuedraggable": "^2.17.0"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.21.4",
+          "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz",
+          "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+          "requires": {
+            "follow-redirects": "^1.14.0"
+          }
+        },
+        "deepmerge": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-3.3.0.tgz",
+          "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA=="
+        },
+        "follow-redirects": {
+          "version": "1.15.6",
+          "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+          "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
+        }
+      }
     },
     "@soda/friendly-errors-webpack-plugin": {
       "version": "1.8.1",
@@ -23675,6 +24511,15 @@
       "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
       "dev": true
     },
+    "@sscfaith/avue-form-design": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmmirror.com/@sscfaith/avue-form-design/-/avue-form-design-1.4.8.tgz",
+      "integrity": "sha512-+b9Sj+9PlGFqs062v2tfpwTk+dN/Kx8iyTXdruScY063zvK6o5ezHWz4RgoUbx1qNsfKHzpF2IxkYtWBhefqrA==",
+      "requires": {
+        "monaco-editor": "^0.27.0",
+        "vuedraggable": "^2.24.3"
+      }
+    },
     "@szmarczak/http-timer": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
@@ -23689,6 +24534,11 @@
       "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz",
       "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
       "dev": true
+    },
+    "@transloadit/prettier-bytes": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
     },
     "@types/body-parser": {
       "version": "1.19.5",
@@ -23727,6 +24577,11 @@
       "requires": {
         "@types/ms": "*"
       }
+    },
+    "@types/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
     },
     "@types/express": {
       "version": "4.17.21",
@@ -23975,6 +24830,53 @@
       "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
       "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
       "dev": true
+    },
+    "@uppy/companion-client": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+      "requires": {
+        "@uppy/utils": "^4.1.2",
+        "namespace-emitter": "^2.0.1"
+      }
+    },
+    "@uppy/core": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+      "requires": {
+        "@transloadit/prettier-bytes": "0.0.7",
+        "@uppy/store-default": "^2.1.1",
+        "@uppy/utils": "^4.1.3",
+        "lodash.throttle": "^4.1.1",
+        "mime-match": "^1.0.2",
+        "namespace-emitter": "^2.0.1",
+        "nanoid": "^3.1.25",
+        "preact": "^10.5.13"
+      }
+    },
+    "@uppy/store-default": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+    },
+    "@uppy/utils": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+      "requires": {
+        "lodash.throttle": "^4.1.1"
+      }
+    },
+    "@uppy/xhr-upload": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+      "requires": {
+        "@uppy/companion-client": "^2.2.2",
+        "@uppy/utils": "^4.1.2",
+        "nanoid": "^3.1.25"
+      }
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.4.0",
@@ -24458,6 +25360,93 @@
       "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
       "dev": true
     },
+    "@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "requires": {
+        "is-url": "^1.2.4"
+      }
+    },
+    "@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "requires": {
+        "prismjs": "^1.23.0"
+      }
+    },
+    "@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "requires": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      }
+    },
+    "@wangeditor/editor": {
+      "version": "5.1.23",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+      "requires": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "^1.1.7",
+        "@wangeditor/code-highlight": "^1.0.3",
+        "@wangeditor/core": "^1.1.19",
+        "@wangeditor/list-module": "^1.0.5",
+        "@wangeditor/table-module": "^1.1.4",
+        "@wangeditor/upload-image-module": "^1.0.2",
+        "@wangeditor/video-module": "^1.1.4",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "@wangeditor/editor-for-vue": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA==",
+      "requires": {}
+    },
+    "@wangeditor/list-module": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
+      "requires": {}
+    },
+    "@wangeditor/table-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
+      "requires": {}
+    },
+    "@wangeditor/upload-image-module": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
+      "requires": {}
+    },
+    "@wangeditor/video-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
+      "requires": {}
+    },
     "@webassemblyjs/ast": {
       "version": "1.9.0",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@@ -24759,6 +25748,11 @@
       "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz",
       "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
       "dev": true
+    },
+    "animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
     },
     "ansi-align": {
       "version": "3.0.1",
@@ -25281,6 +26275,33 @@
         "possible-typed-array-names": "^1.0.0"
       }
     },
+    "avue-plugin-ueditor": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmmirror.com/avue-plugin-ueditor/-/avue-plugin-ueditor-0.0.6.tgz",
+      "integrity": "sha512-mq0+yDRj+xPxiMm8KbkRp4bni1PREeKZSnuAAu3npvRuYX+hEJPH3/saNtpocr7unRpQz7IS7EFHGdN4xhwJ8w==",
+      "requires": {
+        "axios": "^0.18.0",
+        "vue": "^2.5.17",
+        "vue-quill-editor": "^3.0.6",
+        "vue-router": "^3.0.1"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.18.1",
+          "resolved": "https://registry.npmmirror.com/axios/-/axios-0.18.1.tgz",
+          "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==",
+          "requires": {
+            "follow-redirects": "1.5.10",
+            "is-buffer": "^2.0.2"
+          }
+        },
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+        }
+      }
+    },
     "aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -25369,6 +26390,28 @@
       "dev": true,
       "requires": {
         "@babel/helper-define-polyfill-provider": "^0.6.2"
+      }
+    },
+    "babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==",
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "regenerator-runtime": "^0.10.5"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w=="
+        }
       }
     },
     "babel-runtime": {
@@ -26183,7 +27226,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
       "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
-      "dev": true,
       "requires": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -26446,6 +27488,11 @@
         }
       }
     },
+    "classlist-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+      "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+    },
     "clean-css": {
       "version": "4.2.4",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz",
@@ -26647,8 +27694,7 @@
     "clone": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
-      "dev": true
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
     },
     "clone-response": {
       "version": "1.0.3",
@@ -26749,8 +27795,7 @@
     "commander": {
       "version": "2.17.1",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
-      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
-      "dev": true
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
     },
     "commondir": {
       "version": "1.0.1",
@@ -26816,6 +27861,11 @@
           "dev": true
         }
       }
+    },
+    "compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
     },
     "concat-map": {
       "version": "0.0.1",
@@ -27142,6 +28192,11 @@
         "parse-json": "^4.0.0"
       }
     },
+    "countup.js": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-1.9.3.tgz",
+      "integrity": "sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A=="
+    },
     "crc": {
       "version": "3.8.0",
       "resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz",
@@ -27241,6 +28296,11 @@
         "randombytes": "^2.0.0",
         "randomfill": "^1.0.3"
       }
+    },
+    "crypto-js": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-3.3.0.tgz",
+      "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
     },
     "crypto-random-string": {
       "version": "2.0.0",
@@ -27469,6 +28529,15 @@
       "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==",
       "dev": true
     },
+    "d": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+      "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+      "requires": {
+        "es5-ext": "^0.10.64",
+        "type": "^2.7.2"
+      }
+    },
     "dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
@@ -27510,6 +28579,11 @@
         "es-errors": "^1.3.0",
         "is-data-view": "^1.0.1"
       }
+    },
+    "dayjs": {
+      "version": "1.11.11",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.11.tgz",
+      "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
     },
     "de-indent": {
       "version": "1.0.2",
@@ -27569,7 +28643,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz",
       "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
-      "dev": true,
       "requires": {
         "is-arguments": "^1.1.1",
         "is-date-object": "^1.0.5",
@@ -27723,7 +28796,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
-      "dev": true,
       "requires": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -27734,7 +28806,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
       "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
-      "dev": true,
       "requires": {
         "define-data-property": "^1.0.1",
         "has-property-descriptors": "^1.0.0",
@@ -28041,6 +29112,14 @@
         }
       }
     },
+    "dom7": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+      "requires": {
+        "ssr-window": "^3.0.0-alpha.1"
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -28133,6 +29212,11 @@
         "readable-stream": "^2.0.0",
         "stream-shift": "^1.0.0"
       }
+    },
+    "easings-css": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/easings-css/-/easings-css-1.0.0.tgz",
+      "integrity": "sha512-7Uq7NdazNfVtr0RNmPAys8it0zKCuaqxJStYKEl72D3j4gbvXhhaM7iWNbqhA4C94ygCye6VuyhzBRQC4szeBg=="
     },
     "easy-stack": {
       "version": "1.0.1",
@@ -28697,7 +29781,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
       "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
-      "dev": true,
       "requires": {
         "get-intrinsic": "^1.2.4"
       }
@@ -28705,8 +29788,7 @@
     "es-errors": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "dev": true
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
     },
     "es-object-atoms": {
       "version": "1.0.0",
@@ -28748,12 +29830,42 @@
         "is-symbol": "^1.0.2"
       }
     },
+    "es5-ext": {
+      "version": "0.10.64",
+      "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+      "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "esniff": "^2.0.1",
+        "next-tick": "^1.1.0"
+      }
+    },
     "es6-error": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz",
       "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
       "dev": true,
       "optional": true
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+      "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+      "requires": {
+        "d": "^1.0.2",
+        "ext": "^1.7.0"
+      }
     },
     "escalade": {
       "version": "3.1.2",
@@ -29191,6 +30303,17 @@
       "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
       "dev": true
     },
+    "esniff": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+      "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+      "requires": {
+        "d": "^1.0.1",
+        "es5-ext": "^0.10.62",
+        "event-emitter": "^0.3.5",
+        "type": "^2.7.2"
+      }
+    },
     "espree": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/espree/-/espree-5.0.1.tgz",
@@ -29273,6 +30396,15 @@
       "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
       "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
       "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
     },
     "event-pubsub": {
       "version": "4.3.0",
@@ -29466,11 +30598,18 @@
         }
       }
     },
+    "ext": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+      "requires": {
+        "type": "^2.7.2"
+      }
+    },
     "extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
     },
     "extend-shallow": {
       "version": "3.0.2",
@@ -29575,6 +30714,11 @@
       "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
+    },
+    "fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
     },
     "fast-glob": {
       "version": "2.2.7",
@@ -30020,6 +31164,11 @@
         "readable-stream": "^2.0.0"
       }
     },
+    "fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmmirror.com/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+    },
     "fs-extra": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz",
@@ -30068,8 +31217,7 @@
     "function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
     "function.prototype.name": {
       "version": "1.1.6",
@@ -30092,13 +31240,17 @@
     "functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "dev": true
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     },
     "fuse.js": {
       "version": "6.6.2",
       "resolved": "https://registry.npmmirror.com/fuse.js/-/fuse.js-6.6.2.tgz",
       "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA=="
+    },
+    "fuzzysearch": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/fuzzysearch/-/fuzzysearch-1.0.3.tgz",
+      "integrity": "sha512-s+kNWQuI3mo9OALw0HJ6YGmMbLqEufCh2nX/zzV5CrICQ/y4AwPxM+6TIiF9ItFCHXFCyM/BfCCmN57NTIJuPg=="
     },
     "gauge": {
       "version": "2.7.4",
@@ -30178,7 +31330,6 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
       "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
-      "dev": true,
       "requires": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
@@ -30403,7 +31554,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
       "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-      "dev": true,
       "requires": {
         "get-intrinsic": "^1.1.3"
       }
@@ -30516,7 +31666,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
-      "dev": true,
       "requires": {
         "es-define-property": "^1.0.0"
       }
@@ -30524,20 +31673,17 @@
     "has-proto": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
-      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
-      "dev": true
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
     },
     "has-symbols": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "dev": true
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
     },
     "has-tostringtag": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dev": true,
       "requires": {
         "has-symbols": "^1.0.3"
       }
@@ -30616,7 +31762,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
       "requires": {
         "function-bind": "^1.1.2"
       }
@@ -30732,6 +31877,11 @@
       "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz",
       "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
       "dev": true
+    },
+    "html-void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
     },
     "html-webpack-plugin": {
       "version": "3.2.0",
@@ -30949,6 +32099,14 @@
       "resolved": "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz",
       "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ=="
     },
+    "i18next": {
+      "version": "20.6.1",
+      "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "requires": {
+        "@babel/runtime": "^7.12.0"
+      }
+    },
     "iconv-corefoundation": {
       "version": "1.1.7",
       "resolved": "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
@@ -31006,6 +32164,11 @@
       "version": "3.0.6",
       "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
       "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
+    },
+    "immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
     },
     "import-cwd": {
       "version": "2.1.0",
@@ -31283,7 +32446,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz",
       "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -31399,7 +32561,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
       "requires": {
         "has-tostringtag": "^1.0.0"
       }
@@ -31455,6 +32616,11 @@
       "requires": {
         "is-extglob": "^2.1.1"
       }
+    },
+    "is-hotkey": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
     },
     "is-installed-globally": {
       "version": "0.4.0",
@@ -31560,11 +32726,15 @@
         "isobject": "^3.0.1"
       }
     },
+    "is-promise": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz",
+      "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+    },
     "is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -31623,6 +32793,11 @@
       "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
       "dev": true
+    },
+    "is-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
     },
     "is-weakref": {
       "version": "1.0.2",
@@ -32076,20 +33251,38 @@
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
     },
     "lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
     "lodash.defaultsdeep": {
       "version": "4.6.1",
       "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
       "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
       "dev": true
+    },
+    "lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "lodash.kebabcase": {
       "version": "4.1.1",
@@ -32114,6 +33307,16 @@
       "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
     "lodash.transform": {
       "version": "4.6.0",
@@ -32220,6 +33423,11 @@
           "optional": true
         }
       }
+    },
+    "material-colors": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
+      "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
     },
     "md5.js": {
       "version": "1.3.5",
@@ -32382,6 +33590,14 @@
       "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "dev": true
+    },
+    "mime-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+      "requires": {
+        "wildcard": "^1.1.0"
+      }
     },
     "mime-types": {
       "version": "2.1.35",
@@ -32624,6 +33840,19 @@
         "minimist": "^1.2.6"
       }
     },
+    "mockjs": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz",
+      "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+      "requires": {
+        "commander": "*"
+      }
+    },
+    "monaco-editor": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.27.0.tgz",
+      "integrity": "sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ=="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -32677,6 +33906,11 @@
         "thenify-all": "^1.0.0"
       }
     },
+    "namespace-emitter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+    },
     "nan": {
       "version": "2.19.0",
       "resolved": "https://registry.npmmirror.com/nan/-/nan-2.19.0.tgz",
@@ -32724,6 +33958,11 @@
       "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
       "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
       "dev": true
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
     "nice-try": {
       "version": "1.0.5",
@@ -32838,6 +34077,12 @@
             "ieee754": "^1.1.4",
             "isarray": "^1.0.0"
           }
+        },
+        "path-browserify": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
+          "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+          "dev": true
         },
         "punycode": {
           "version": "1.4.1",
@@ -33092,8 +34337,7 @@
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
     },
     "object-copy": {
       "version": "0.1.0",
@@ -33152,7 +34396,6 @@
       "version": "1.1.6",
       "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz",
       "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1"
@@ -33161,8 +34404,7 @@
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     },
     "object-visit": {
       "version": "1.0.1",
@@ -33320,6 +34562,14 @@
           "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
           "dev": true
         }
+      }
+    },
+    "optimist": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmmirror.com/optimist/-/optimist-0.3.7.tgz",
+      "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==",
+      "requires": {
+        "wordwrap": "~0.0.2"
       }
     },
     "optionator": {
@@ -33501,6 +34751,11 @@
         "no-case": "^2.2.0"
       }
     },
+    "parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
     "parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@@ -33586,10 +34841,9 @@
       "dev": true
     },
     "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
-      "dev": true
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
     },
     "path-dirname": {
       "version": "1.0.2",
@@ -34512,6 +35766,11 @@
         "posthtml-render": "^1.0.6"
       }
     },
+    "preact": {
+      "version": "10.22.0",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.22.0.tgz",
+      "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw=="
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -34539,6 +35798,11 @@
         "lodash": "^4.17.20",
         "renderkid": "^2.0.4"
       }
+    },
+    "prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
     },
     "process": {
       "version": "0.11.10",
@@ -34707,6 +35971,36 @@
       "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-4.0.1.tgz",
       "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
       "dev": true
+    },
+    "quill": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "requires": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      },
+      "dependencies": {
+        "eventemitter3": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz",
+          "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+        }
+      }
+    },
+    "quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "requires": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      }
     },
     "randombytes": {
       "version": "2.1.0",
@@ -34896,6 +36190,14 @@
         "picomatch": "^2.2.1"
       }
     },
+    "rebuild": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/rebuild/-/rebuild-0.1.2.tgz",
+      "integrity": "sha512-EtDZ5IapND57htCrOOcfH7MzXCQKivzSZUIZIuc8H0xDHfmi9HDBZIyjT7Neh5GcUoxQ6hfsXluC+UrYLgGbZg==",
+      "requires": {
+        "optimist": "0.3.x"
+      }
+    },
     "redent": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz",
@@ -34924,8 +36226,7 @@
     "regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
-      "dev": true
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
     },
     "regenerator-transform": {
       "version": "0.15.2",
@@ -34950,7 +36251,6 @@
       "version": "1.5.2",
       "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
       "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.6",
         "define-properties": "^1.2.1",
@@ -35532,6 +36832,14 @@
         "raw-loader": "~0.5.1"
       }
     },
+    "scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "requires": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npmmirror.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -35765,7 +37073,6 @@
       "version": "1.2.2",
       "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
       "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
-      "dev": true,
       "requires": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -35779,7 +37086,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
       "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
-      "dev": true,
       "requires": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -35905,6 +37211,38 @@
       "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
       "dev": true
     },
+    "slate": {
+      "version": "0.72.8",
+      "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+      "requires": {
+        "immer": "^9.0.6",
+        "is-plain-object": "^5.0.0",
+        "tiny-warning": "^1.0.3"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
+    "slate-history": {
+      "version": "0.66.0",
+      "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+      "requires": {
+        "is-plain-object": "^5.0.0"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
     "slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -35930,6 +37268,11 @@
       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
       "dev": true,
       "optional": true
+    },
+    "snabbdom": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q=="
     },
     "snapdragon": {
       "version": "0.8.2",
@@ -36105,6 +37448,11 @@
           "dev": true
         }
       }
+    },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
     },
     "source-list-map": {
       "version": "2.0.1",
@@ -36284,6 +37632,11 @@
         "safer-buffer": "^2.0.2",
         "tweetnacl": "~0.14.0"
       }
+    },
+    "ssr-window": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
     "ssri": {
       "version": "8.0.1",
@@ -36545,6 +37898,24 @@
       "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true
+    },
+    "supvue-ui": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/supvue-ui/-/supvue-ui-0.2.0.tgz",
+      "integrity": "sha512-qqadrZURj/IVYPc63YpJgwVFeqDQEcrd0Ij3MeP/zzcVAulC/8b8rhmMFasWT9dg9FRIw+KIX1+fMAdeuAA3QQ==",
+      "requires": {
+        "core-js": "^2.6.5",
+        "element-ui": "^2.15.6",
+        "vue": "^2.6.10",
+        "vue-router": "^3.0.3"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        }
+      }
     },
     "svg-baker": {
       "version": "1.7.0",
@@ -37255,6 +38626,11 @@
       "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
       "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
     },
+    "tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
@@ -37465,6 +38841,11 @@
       "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
       "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
       "dev": true
+    },
+    "type": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
+      "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
     },
     "type-check": {
       "version": "0.3.2",
@@ -38141,6 +39522,12 @@
         }
       }
     },
+    "vue-axios": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/vue-axios/-/vue-axios-2.1.5.tgz",
+      "integrity": "sha512-th5xVbInVoyIoe+qY+9GCflEVezxAvztD4xpFF39SRQYqpoKD2qkmX8yv08jJG9a2SgNOCjirjJGSwg/wTrbmA==",
+      "requires": {}
+    },
     "vue-cli-plugin-electron-builder": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/vue-cli-plugin-electron-builder/-/vue-cli-plugin-electron-builder-2.1.1.tgz",
@@ -38610,6 +39997,15 @@
         }
       }
     },
+    "vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      }
+    },
     "vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz",
@@ -38669,11 +40065,24 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "vuex": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
       "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
       "requires": {}
+    },
+    "watch-size": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/watch-size/-/watch-size-2.0.0.tgz",
+      "integrity": "sha512-M92R89dNoTPWyCD+HuUEDdhaDnh9jxPGOwlDc0u51jAgmjUvzqaEMynXSr3BaWs+QdHYk4KzibPy1TFtjLmOZQ=="
     },
     "watchpack": {
       "version": "1.7.5",
@@ -39372,6 +40781,11 @@
         "string-width": "^4.0.0"
       }
     },
+    "wildcard": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+    },
     "wmf": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
@@ -39388,6 +40802,11 @@
       "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true
     },
+    "wordwrap": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.3.tgz",
+      "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw=="
+    },
     "worker-farm": {
       "version": "1.7.0",
       "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz",
diff --git a/package.json b/package.json
index 7f08ed2..031071f 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,17 @@
   },
   "main": "background.js",
   "dependencies": {
+    "@riophae/vue-treeselect": "^0.4.0",
+    "@smallwei/avue": "2.8.23",
+    "@sscfaith/avue-form-design": "1.4.8",
+    "@wangeditor/editor": "^5.1.0",
+    "@wangeditor/editor-for-vue": "^1.0.1",
+    "animate.css": "^4.1.1",
+    "avue-plugin-ueditor": "^0.0.6",
     "axios": "^0.19.2",
+    "babel-polyfill": "^6.26.0",
+    "classlist-polyfill": "^1.2.0",
+    "crypto-js": "^3.1.9-1",
     "clipboard": "^2.0.11",
     "codemirror": "^5.65.16",
     "core-js": "^3.37.1",
@@ -28,16 +38,23 @@
     "echarts": "^5.5.0",
     "element-ui": "^2.15.14",
     "file-saver": "^2.0.5",
+    "fs": "^0.0.1-security",
     "fuse.js": "^6.6.2",
     "husky": "^7.0.4",
+    "mockjs": "^1.1.0",
     "js-cookie": "2.2.0",
     "jszip": "^3.10.1",
+    "node-sass": "^6.0.1",
     "normalize.css": "8.0.1",
     "nprogress": "0.2.0",
+    "path-browserify": "^1.0.1",
     "path-to-regexp": "^6.2.2",
+    "rebuild": "^0.1.2",
     "screenfull": "^5.2.0",
     "script-loader": "^0.7.2",
+    "supvue-ui": "^0.2.0",
     "vue": "^2.7.16",
+    "vue-axios": "^2.1.4",
     "vue-count-to": "^1.0.13",
     "vue-router": "^3.6.5",
     "vuex": "^3.6.2",
diff --git a/src/App.vue b/src/App.vue
index ec9032c..5aff9e3 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,5 +1,7 @@
 <template>
-  <div id="app">
+  <div
+    id="app"
+  >
     <router-view />
   </div>
 </template>
@@ -9,3 +11,24 @@
   name: 'App'
 }
 </script>
+
+<style lang="scss">
+#app {
+  width: 100%;
+  height: 100%;
+  // 鍏抽棴婊氬姩
+  overflow-x: hidden;
+  background-image:url('./assets/img/loginBackground.jpg');
+  background-size: cover;
+}
+// 淇敼婊氬姩鏉℃牱寮�
+#app::-webkit-scrollbar {
+  width: 4px;
+}
+#app::-webkit-scrollbar-track {
+  background-color: #ccc;
+}
+#app::-webkit-scrollbar-thumb {
+  background-color: #666;
+}
+</style>
diff --git a/src/background.js b/src/background.js
index f8a6669..b397c41 100644
--- a/src/background.js
+++ b/src/background.js
@@ -18,6 +18,7 @@
     height: screen.getPrimaryDisplay().workAreaSize.height,
     // transparent:true,
     icon: '/src/favicon.ico',
+    fullscreenable: true,
     fullscreen: false,
     webPreferences: {
 
diff --git a/src/components/Choice/SingleItem.vue b/src/components/Choice/SingleItem.vue
new file mode 100644
index 0000000..3067a11
--- /dev/null
+++ b/src/components/Choice/SingleItem.vue
@@ -0,0 +1,745 @@
+<template>
+  <div class="paper-main">
+    <div class="paper-content">
+      <!-- 璇曢 -->
+      <div
+        ref="paperContent"
+        class="paper-left"
+      >
+        <div
+          class="subject"
+          v-for="item in convertDatas"
+        >
+          <div class="subject-title">
+            <h2>{{item.name}}</h2>
+            <span>锛堝叡 {{item.count}} 棰橈紝鍚堣 {{item.totalScore}} 鍒嗭級</span>
+          </div>
+          <el-card
+            class="box-card"
+            v-for="(sub,index) in item.childs"
+            :id="item.code+(index+1)"
+          >
+            <div
+              slot="header"
+              class="clearfix"
+            >
+              <el-tag
+                effect="dark"
+                style="margin-right:10px"
+              > {{sub.no}} </el-tag>
+              <span>{{sub.subject}}</span>
+              <span>({{sub.totalScore}}鍒�)</span>
+              <div
+                v-if="type===2 || type===3"
+                style="float: right; padding: 3px 0"
+              >
+                <el-radio-group v-model="sub.isHook">
+                  <el-radio-button
+                    :disabled="disabledRead"
+                    :label="1"
+                    @change.native="isHookButtionCheck(sub)"
+                  ><i class="el-icon-check" /></el-radio-button>
+                  <el-radio-button
+                    :disabled="disabledRead"
+                    :label="2"
+                    @change.native="isHookButtionCheck(sub)"
+                  ><i class="el-icon-close" /></el-radio-button>
+                </el-radio-group>
+                <div
+                  v-if="sub.type===1 ||sub.type===2||sub.type===3"
+                  style="display: inline;"
+                >
+                  <el-input
+                    :disabled="true"
+                    v-model="sub.score"
+                    style="width:50px"
+                  ></el-input><span>鍒�</span>
+                </div>
+                <div
+                  v-else
+                  style="display: inline;"
+                >
+                  <el-input
+                    :disabled="disabledRead"
+                    v-model="sub.score"
+                    style="width:50px"
+                  ></el-input><span>鍒�</span>
+                </div>
+
+              </div>
+            </div>
+            <el-radio-group
+              v-if="sub.type===1"
+              v-model="sub.examineAnswer"
+            >
+              <el-radio
+                :disabled="disabledAnswer"
+                v-for="o in sub.answers"
+                :label="o.no"
+                class="answer-radio"
+                @change="answerButtionCheck($event,item,sub)"
+              >{{o.no}}.{{o.answer}}</el-radio>
+            </el-radio-group>
+            <el-checkbox-group
+              v-if="sub.type===2"
+              v-model="sub.examineAnswer"
+            >
+              <el-checkbox
+                :disabled="disabledAnswer"
+                v-for="o in sub.answers"
+                :label="o.no"
+                class="answer-checkbox"
+                @change="answerButtionCheck($event,item,sub)"
+              >{{o.no}}.{{o.answer}}</el-checkbox>
+            </el-checkbox-group>
+            <el-radio-group
+              v-if="sub.type===3"
+              v-model="sub.examineAnswer"
+            >
+              <el-radio
+                :disabled="disabledAnswer"
+                label="瀵�"
+                class="answer-radio"
+                @change="answerButtionCheck($event,item,sub)"
+              >瀵�</el-radio>
+              <el-radio
+                :disabled="disabledAnswer"
+                label="閿�"
+                class="answer-radio"
+                @change="answerButtionCheck($event,item,sub)"
+              >閿�</el-radio>
+            </el-radio-group>
+            <el-input
+              :disabled="disabledAnswer"
+              v-if="sub.type===4"
+              type="textarea"
+              :rows="2"
+              v-model="sub.examineAnswer"
+              resize="none"
+              maxlength="150"
+              @blur="answerButtionCheck($event,item,sub)"
+            > </el-input>
+            <el-input
+              :disabled="disabledAnswer"
+              v-if="sub.type===5"
+              type="textarea"
+              :rows="10"
+              v-model="sub.examineAnswer"
+              resize="none"
+              maxlength="2000"
+              @blur="answerButtionCheck($event,item,sub)"
+            > </el-input>
+            <div
+              v-if="type!==1"
+              class="subject-remark"
+            >
+              <div class="item">
+                <span class="title">鑰冪敓绛旀锛�</span>
+                <span>{{converAnswerStr(sub.examineAnswer)}}</span>
+              </div>
+              <div class="item">
+                <span class="title">姝g‘绛旀锛�</span>
+                <span>{{converAnswerStr(sub.correctAnswer)}}</span>
+              </div>
+              <div class="item">
+                <span class="title">鑰冪敓绛旀锛�</span>
+                <span>{{sub.answerAnalysis}}</span>
+              </div>
+            </div>
+          </el-card>
+        </div>
+      </div>
+      <!-- 绛旈鍗� -->
+      <div
+        ref="paperLeft"
+        class="paper-right"
+      >
+        <div class="paper-title">
+          <h1><i class="el-icon-s-grid"></i>绛旈鍗�
+            <span class="downTime"><i
+                class="el-icon-alarm-clock"
+                style=" color: #000; font-weight: bold; font-size: 24px;margin-right: 10px;"
+              ></i>{{hour? hourString+':'+minuteString+':'+secondString : minuteString+':'+secondString}}</span>
+          </h1>
+        </div>
+        <el-collapse v-model="answerCardActiveName">
+          <el-collapse-item
+            v-for="item in convertDatas"
+            :name="item.code"
+          >
+            <template slot="title">
+              <h2>{{item.name}}</h2>
+              <span>鍏眥{item.count}}棰�</span>
+            </template>
+            <el-button
+              class="answer-button"
+              circle
+              size="small"
+              v-for="index of item.count"
+              :id="'answer'+item.code+index"
+              @click.native="jump(item.code+index)"
+            >{{index}}</el-button>
+          </el-collapse-item>
+        </el-collapse>
+      </div>
+
+    </div>
+    <div class="paper-footer">
+      <el-button
+        v-if="type===1"
+        type="success"
+        @click.native="btnClick('handPaper')"
+      >浜ゅ嵎</el-button>
+      <el-button
+        v-if="type===2"
+        type="success"
+        @click.native="btnClick('readPaper')"
+      >闃呭嵎</el-button>
+      <el-button
+        v-if="type===2"
+        type="success"
+        @click.native="btnClick('readPaperUpper')"
+      >涓婁竴涓�</el-button>
+      <el-button
+        v-if="type===2"
+        type="success"
+        @click.native="btnClick('readPaperNext')"
+      >涓嬩竴涓�</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "examinationPaper",
+  props: {
+    //璇曞嵎绫诲瀷 1 鑰冭瘯 2 闃呭嵎 3 鏌ョ湅
+    type: {
+      type: Number,
+      default: 2,
+    },
+    //鏁版嵁婧�
+    dataSource: {
+      type: Object,
+      default: () => {
+        return {
+          //璇曞嵎ID
+          paperId: "",
+          //璇曞嵎鍚嶇О
+          paperName: "",
+          //鑰冪敓ID
+          examineId: "",
+          //鑰冪敓鍚嶇О
+          examineName: "",
+          //鍒嗘暟
+          score: null,
+          //鑰冭瘯鏃堕暱(鍒嗛挓)
+          examDuration: null,
+          //浜ゅ嵎鏃堕棿
+          submissionTime: "",
+          //棰樼洰闆嗗悎
+          list: [
+            {
+              //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+              type: null,
+              //棰樺彿
+              no: null,
+              //棰樼洰
+              subject: "",
+              //棰樼洰鎬诲垎
+              totalScore: null,
+              //绛旀闆嗗悎
+              answers: [
+                {
+                  //绛旀搴忓彿
+                  no: "",
+                  //绛旀
+                  answer: "",
+                },
+              ],
+              //鑰冪敓绛旀
+              examineAnswer: null,
+              //姝g‘绛旀
+              correctAnswer: null,
+              //绛旀瑙f瀽
+              answerAnalysis: "",
+              //鏄惁瀵归敊  1.瀵� 2.閿�
+              isHook: null,
+              //寰楀垎
+              score: null,
+            },
+          ],
+        };
+      },
+    },
+  },
+  data() {
+    return {
+      //鍊掕灏忔椂
+      hour: "",
+      //鍊掕鍒嗛挓
+      minute: "",
+      //鍊掕绉�
+      second: "",
+      //璁℃椂鍣�
+      promiseTimer: "",
+      //鏁版嵁婧�
+      tempDataSource: {},
+      //绛旈鍗℃縺娲婚」
+      answerCardActiveName: [],
+      //缁勮鍚庢暟鎹泦
+      convertDatas: [],
+      //绂佹绛旈
+      disabledAnswer: false,
+      //绂佹闃呭嵎
+      disabledRead: false,
+    };
+  },
+  watch: {
+    dataSource(newValue, oldValue) {
+      Object.assign(this.tempDataSource, newValue);
+      this.convertData();
+    },
+  },
+  created() {
+    Object.assign(this.tempDataSource, this.dataSource);
+    this.convertData();
+    if (this.type === 2) {
+      this.disabledAnswer = true;
+    }
+    if (this.type === 3) {
+      this.disabledAnswer = true;
+      this.disabledRead = true;
+    }
+  },
+  computed: {
+    hourString() {
+      return this.hour < 10 ? "0" + this.hour : "" + this.hour;
+    },
+    minuteString() {
+      return this.minute < 10 ? "0" + this.minute : "" + this.minute;
+    },
+    secondString() {
+      return this.second < 10 ? "0" + this.second : "" + this.second;
+    },
+  },
+  mounted() {
+    if (this.type === 1) {
+      let remainTime = this.dataSource.examDuration * 60;
+      if (remainTime > 0) {
+        this.hour = Math.floor((remainTime / 3600) % 24);
+        this.minute = Math.floor((remainTime / 60) % 60);
+        this.second = Math.floor(remainTime % 60);
+        this.countDowm();
+      }
+    }
+
+    if (this.type === 2 || this.type === 3) {
+      this.convertDatas.forEach((t) => {
+        t.childs.forEach((c) => {
+          this.answerButtionCheck(c.examineAnswer, t, c);
+        });
+      });
+    }
+  },
+  methods: {
+    /**
+     * 鎸夐挳鐐瑰嚮浜嬩欢
+     */
+    btnClick(type) {
+      console.log(this.tempDataSource);
+      switch (type) {
+        //浜ゅ嵎
+        case "handPaper":
+          this.$emit("PaperHand", this.tempDataSource);
+          break;
+        //闃呭嵎
+        case "readPaper":
+          this.$emit("paperRead", this.tempDataSource);
+          break;
+        //闃呭嵎 涓婁竴涓�
+        case "readPaperUpper":
+          this.$emit("paperReadUpper");
+          break;
+        //闃呭嵎 涓嬩竴涓�
+        case "readPaperNext":
+          this.$emit("paperReadNext");
+          break;
+      }
+    },
+    /**
+     * 閿氱偣瀹氫綅
+     */
+    // 杩欏効灏辨槸瀹氫綅
+    jump(postion) {
+      console.log("postion", postion);
+      let jump = this.$refs.paperContent.querySelectorAll("#" + postion);
+      // 鑾峰彇闇�瑕佹粴鍔ㄧ殑璺濈
+      // 鐖剁洅瀛愬埌娴忚鍣ㄩ《閮ㄧ殑璺濈
+      let subjectTitleTop = this.$refs.paperContent.offsetTop;
+      // 瀵瑰簲鐨勫厓绱犲埌娴忚鍣ㄩ《閮ㄧ殑璺濈
+      let total = jump[0].offsetTop;
+      //瀹炵幇form閿氱偣瀹氫綅锛堜娇鐢ㄥ綋鍓嶈窛绂诲噺鍘荤埗鍏冪礌鍒伴《閮ㄨ窛绂伙級
+      this.$refs.paperContent.scrollTop = total - subjectTitleTop;
+    },
+    /**
+     *瀵归敊閫夋嫨
+     */
+    isHookButtionCheck(val) {
+      console.log(val, "val");
+      if (val.type === 1 || val.type === 2 || val.type === 3) {
+        if (val.isHook === 1) {
+          val.score = val.totalScore;
+        }
+        if (val.isHook === 2) {
+          val.score = 0;
+        }
+      }
+    },
+    /**
+     *绛旈鍗¢�変腑
+     */
+    answerButtionCheck(value, parent, child) {
+      console.log(value, parent, child);
+      let answerId = "answer" + parent.code + child.no;
+      let but = this.$refs.paperLeft.querySelectorAll("#" + answerId);
+      if (but.length > 0) {
+        if (but[0].className.indexOf("answer-button-check") > -1) {
+          if (child.examineAnswer && child.examineAnswer.length == 0) {
+            but[0].classList.remove("answer-button-check");
+          }
+        } else {
+          if (child.examineAnswer && child.examineAnswer.length > 0) {
+            but[0].classList.add("answer-button-check");
+          }
+        }
+      }
+    },
+    /**
+     * 杞崲绛旀
+     */
+    converAnswerStr(answer) {
+      if (answer instanceof Array) {
+        return answer.join("  ");
+      }
+      return answer;
+    },
+    /**
+     * 杞崲鏁版嵁
+     */
+    convertData() {
+      let sorted = this.groupBy(this.tempDataSource.list, function (item) {
+        return [item.type];
+      });
+      this.convertDatas = [];
+      this.answerCardActiveName = [];
+      this.orderBy(sorted, "key", "asc");
+      sorted.forEach((item) => {
+        let totalScore = 0;
+        item.value.forEach((t) => {
+          totalScore += t.totalScore;
+        });
+        switch (item.key) {
+          case "[1]":
+            this.convertDatas.push({
+              name: "鍗曢�夐",
+              code: "Single",
+              count: item.value.length,
+              totalScore: totalScore,
+              childs: item.value,
+            });
+            this.answerCardActiveName.push("Single");
+            break;
+          case "[2]":
+            this.convertDatas.push({
+              name: "澶氶�夐",
+              code: "Multiple",
+              count: item.value.length,
+              totalScore: totalScore,
+              childs: item.value,
+            });
+            this.answerCardActiveName.push("Multiple");
+            break;
+          case "[3]":
+            this.convertDatas.push({
+              name: "鍒ゆ柇棰�",
+              code: "Judgment",
+              count: item.value.length,
+              totalScore: totalScore,
+              childs: item.value,
+            });
+            this.answerCardActiveName.push("Judgment");
+            break;
+          case "[4]":
+            this.convertDatas.push({
+              name: "濉┖棰�",
+              code: "Blank",
+              count: item.value.length,
+              totalScore: totalScore,
+              childs: item.value,
+            });
+            this.answerCardActiveName.push("Blank");
+            break;
+          case "[5]":
+            this.convertDatas.push({
+              name: "绠�绛旈",
+              code: "Answer",
+              count: item.value.length,
+              totalScore: totalScore,
+              childs: item.value,
+            });
+            this.answerCardActiveName.push("Answer");
+            break;
+        }
+      });
+      console.log(this.convertDatas);
+    },
+    /**
+     * 鎺掑簭
+     * @param {} datas 鏁扮粍
+     * @param {} col 鍒�
+     * @param {} type 绫诲瀷 desc,asc
+     * @returns {}
+     */
+    orderBy(datas, col, type) {
+      let m;
+      for (let i = 0; i < datas.length; i++) {
+        for (let k = 0; k < datas.length; k++) {
+          if (type === "asc") {
+            if (datas[i][col] < datas[k][col]) {
+              m = datas[k];
+              datas[k] = datas[i];
+              datas[i] = m;
+            }
+          } else if (type === "desc") {
+            if (datas[i][col] > datas[k][col]) {
+              m = datas[k];
+              datas[k] = datas[i];
+              datas[i] = m;
+            }
+          }
+        }
+      }
+      return datas;
+    },
+    /**
+     * 鍒嗙粍
+     * @param array 鏁版嵁闆�
+     * @param f 鍑芥暟
+     * let sorted = groupBy(list, function(item){ return [item.name];});
+     */
+    groupBy(array, f) {
+      const groups = {};
+      const keyValues = [];
+      array.forEach(function (o) {
+        const group = JSON.stringify(f(o));
+        groups[group] = groups[group] || [];
+        groups[group].push(o);
+      });
+      Object.keys(groups).map(function (group) {
+        return keyValues.push({ key: group, value: groups[group] });
+      });
+      return keyValues;
+    },
+    /**
+     * 鍊掕鏃�
+     */
+    countDowm() {
+      let self = this;
+      clearInterval(this.promiseTimer);
+      this.promiseTimer = setInterval(function () {
+        if (self.hour === 0 && self.minute === 0 && self.second === 0) {
+          self.disabledAnswer = true;
+        }
+        if (self.hour === 0) {
+          if (self.minute !== 0 && self.second === 0) {
+            self.second = 59;
+            self.minute -= 1;
+          } else if (self.minute === 0 && self.second === 0) {
+            self.second = 0;
+            self.$emit("countDowmEnd", true);
+            clearInterval(self.promiseTimer);
+          } else {
+            self.second -= 1;
+          }
+        } else {
+          if (self.minute !== 0 && self.second === 0) {
+            self.second = 59;
+            self.minute -= 1;
+          } else if (self.minute === 0 && self.second === 0) {
+            self.hour -= 1;
+            self.minute = 59;
+            self.second = 59;
+          } else {
+            self.second -= 1;
+          }
+        }
+      }, 1000);
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.paper-main {
+  overflow: hidden;
+  .paper-header {
+    width: 100%;
+    height: 60px;
+    background-color: #f7f7f7;
+    position: absolute;
+    top: 0;
+    z-index: 1000;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+    -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+  }
+  .paper-content {
+    display: flex;
+    // margin-top: 60px;
+    .paper-left {
+      flex: 1;
+      padding: 10px;
+      overflow-x: hidden;
+      overflow-y: auto;
+      border: 1px solid #e4e4e4;
+      border-top: none;
+      height: 580px;
+    }
+    .paper-right {
+      height: 580px;
+      width: 300px;
+      overflow-x: hidden;
+      overflow-y: auto;
+      box-sizing: border-box;
+      padding: 10px;
+      border: 1px solid #e4e4e4;
+      border-top: none;
+    }
+  }
+}
+
+.paper-footer {
+  line-height: 60px;
+  overflow: hidden;
+  box-sizing: border-box;
+  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+  -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+  text-align: center;
+}
+
+.paper-title {
+  padding-left: 10px;
+  width: 100%;
+  height: 45px;
+  line-height: 45px;
+  /* background: #f7f7f7; */
+}
+
+.paper-title h1 {
+  font-size: 1.2em;
+  margin: 0;
+}
+
+.downTime {
+  color: rgb(230, 93, 110);
+  font-size: 24px;
+  font-weight: bold;
+  float: right;
+  line-height: 1em;
+}
+.answer-button {
+  padding: 0px;
+  color: #0a0a0a;
+  /* background-color: #ffffff; */
+  border-color: #e4e4e4;
+  margin-left: 10px;
+  width: 30px;
+  height: 30px;
+}
+.answer-button:hover {
+  /* background: #ecf1ef; */
+  border-color: #e4e4e4;
+  color: #0a0a0a;
+}
+.answer-button-check {
+  background: #13ce66;
+  border-color: #30b08f;
+}
+
+// 鍗曢�夋牱寮�
+.answer-radio {
+  display: list-item;
+  margin: 5px 0px;
+  list-style: none;
+}
+
+// 澶氶�夋牱寮�
+.answer-checkbox {
+  display: list-item;
+  margin: 5px 0px;
+  list-style: none;
+}
+
+.subject-title {
+  padding-left: 10px;
+  width: 100%;
+  height: 45px;
+  line-height: 45px;
+  /* background: #f7f7f7; */
+  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+  -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+}
+.subject-title h2 {
+  font-size: 16px;
+  display: inline-block;
+}
+.subject-title span {
+  font-size: 16px;
+  display: inline-block;
+}
+
+.subject-remark {
+  /* background: #f7f7f7; */
+}
+.subject-remark .item {
+  display: block;
+  padding: 5px;
+}
+.subject-remark .title {
+  font-weight: bold;
+}
+.el-radio >>> .el-radio__input.is-checked .el-radio__inner {
+  background-color: #13ce66;
+  border-color: #13ce66;
+}
+
+.el-radio-button >>> .el-radio-button__inner {
+  padding: 10px;
+}
+
+.el-collapse-item h2 {
+  width: 150px;
+  font-size: 14px;
+  display: inline-block;
+}
+.el-form--label-top >>> .el-form-item__label {
+  float: none;
+  display: inline-block;
+  text-align: left;
+  padding: 0px;
+}
+
+.el-card {
+  margin: 10px;
+}
+
+.el-card >>> .el-card__header {
+  /* background-color: #ffffff; */
+  padding: 0px 10px;
+  line-height: 35px;
+  font-size: 16px;
+}
+.el-card >>> .el-card__body {
+  padding: 5px 20px;
+}
+</style>
diff --git a/src/components/DictResolver/index.js b/src/components/DictResolver/index.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/components/DictResolver/index.js
diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/components/DictTag/index.vue
diff --git a/src/components/Echarts/index.vue b/src/components/Echarts/index.vue
new file mode 100644
index 0000000..7957727
--- /dev/null
+++ b/src/components/Echarts/index.vue
@@ -0,0 +1,49 @@
+<template>
+  <div
+    :id="id"
+    class="chartStyle"
+  ></div>
+</template>
+
+<script>
+//椤甸潰寮曠敤
+import * as echarts from "echarts";
+export default {
+  props: ["echartObj", "id"],
+  data() {
+    return {
+      myChart: {},
+    };
+  },
+  created() {
+    this.$nextTick(() => {
+      this.loadEchart();
+    });
+  },
+
+  mounted() {
+    let _this = this;
+    window.onresize = function () {
+      _this.myChart.resize();
+    };
+  },
+  methods: {
+    loadEchart() {
+      // 鍔ㄦ�佺粦瀹欼d鍚嶈繖鏍峰氨鑳借В鍐充紶澶氫釜Echarts杩囨潵鍚庡彧鏄剧ず涓�涓棶棰�
+      this.myChart = echarts.init(document.getElementById(this.id));
+      console.log(this.echartObj);
+      this.myChart.setOption({
+        // 娣诲姞浼犲叆鐨勫璞′腑闇�瑕佺殑灞炴��
+        ...this.echartObj,
+      });
+    },
+  },
+};
+</script>
+
+<style scoped>
+.chartStyle {
+  width: 100%;
+  height: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/Header/index.vue b/src/components/Header/index.vue
new file mode 100644
index 0000000..7a47e7d
--- /dev/null
+++ b/src/components/Header/index.vue
@@ -0,0 +1,398 @@
+<template>
+  <div>
+    <div class="h">
+      <div class="h-title">
+        <img
+          src="@/assets/img/logo.jpg"
+          alt=""
+        >
+        <p>姹熻タ璇煶瑙嗛鍩硅绯荤粺</p>
+      </div>
+      <div class="h-list">
+        <div
+          class="h-list-con"
+          :class="titleNum == 1 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(1)"
+        >
+          绯荤粺棣栭〉
+        </div>
+        <div
+          class="h-list-con"
+          :class="titleNum == 2 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(2)"
+        >
+          鑰冭瘯
+        </div>
+        <div
+          class="h-list-con"
+          :class="titleNum == 3 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(3)"
+        >
+          鏁欏
+        </div>
+        <div
+          class="h-list-con"
+          :class="titleNum == 4 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(4)"
+        >
+          搴旂敤绠$悊
+        </div>
+      </div>
+      <div
+        style="width:210px; display:flex; align-items:center"
+        class="op"
+      >
+        <div>
+          <svg
+            t="1651734628449"
+            class="icon"
+            viewBox="0 0 1024 1024"
+            version="1.1"
+            xmlns="http://www.w3.org/2000/svg"
+            p-id="2227"
+            width="24"
+            height="24"
+          >
+            <path
+              d="M236.539274 477.852272c17.253966 0 31.233352-13.980409 31.233352-31.233352 0-110.680798 64.816215-197.723224 173.372629-232.82058 14.792914-4.77884 23.811312-19.713994 21.168112-35.026748-0.426719-2.480494-0.64059-4.900613-0.64059-7.197936 0-24.614607 22.683628-44.63457 50.561559-44.63457 27.858488 0 50.53086 20.018939 50.53086 44.63457 0 2.379187-0.203638 4.727675-0.599657 7.005554-2.745531 15.535835 6.537903 30.674627 21.615297 35.290761 110.202914 33.714869 173.402305 118.550023 173.402305 232.748948 0 17.253966 13.980409 31.233352 31.234375 31.233352s31.233352-13.980409 31.233352-31.233352c0-133.414569-72.349795-238.259452-194.876386-284.724717-5.174859-54.537104-53.673433-97.422843-112.541169-97.422843-59.062164 0-107.691721 43.149752-112.623034 97.921193-120.482025 47.999201-194.306404 154.959258-194.306404 284.226367C205.305923 463.871863 219.285309 477.852272 236.539274 477.852272z"
+              p-id="2228"
+              fill="#707070"
+            ></path>
+            <path
+              d="M819.911812 602.309842l0-55.889915c0-17.253966-13.980409-31.233352-31.233352-31.233352s-31.234375 13.980409-31.234375 31.233352l0 67.988464c0 7.80885 2.928702 15.34243 8.204869 21.097504 40.10951 43.780109 86.381369 99.497085 95.105055 116.89329-0.315178 10.827603-3.345188 13.552667-32.586163 13.552667L196.820668 765.951853c-26.983561 0-31.671327-7.259334-32.484855-13.735839 9.17087-17.701151 55.381331-73.072249 95.449909-116.669186 5.306866-5.765307 8.245801-13.30912 8.245801-21.137413l0-67.988464c0-17.253966-13.980409-31.233352-31.233352-31.233352s-31.233352 13.980409-31.233352 31.233352l0 55.848982C101.69617 716.315362 101.69617 737.829352 101.69617 748.300844c0 38.727023 24.991184 80.117712 95.124498 80.117712l631.347179 0c23.5166 0 95.094822 0 95.094822-80.117712C923.262668 737.788419 923.262668 716.202799 819.911812 602.309842z"
+              p-id="2229"
+              fill="#707070"
+            ></path>
+            <path
+              d="M400.99993 366.001835c-17.253966 0-31.233352 13.980409-31.233352 31.234375l0 30.470989c0 17.253966 13.980409 31.234375 31.233352 31.234375s31.234375-13.980409 31.234375-31.234375l0-30.470989C432.234305 379.982244 418.253896 366.001835 400.99993 366.001835z"
+              p-id="2230"
+              fill="#707070"
+            ></path>
+            <path
+              d="M623.957885 366.001835c-17.253966 0-31.234375 13.980409-31.234375 31.234375l0 30.470989c0 17.253966 13.980409 31.234375 31.234375 31.234375 17.253966 0 31.233352-13.980409 31.233352-31.234375l0-30.470989C655.19226 379.982244 641.21185 366.001835 623.957885 366.001835z"
+              p-id="2231"
+              fill="#707070"
+            ></path>
+            <path
+              d="M512.170892 598.435605c43.963281 0 75.105558-30.318516 86.574774-48.223305 9.222035-14.396895 5.03262-33.358759-9.242502-42.763966-14.305821-9.405207-33.593096-5.38873-43.159986 8.764618-0.132006 0.193405-13.614066 19.754926-34.172287 19.754926-19.989263 0-32.43369-18.117636-33.267685-19.378349-9.181103-14.407128-28.285207-18.809391-42.834574-9.750061-14.650675 9.099239-19.155269 28.356838-10.044774 43.007513C437.238272 567.892985 467.99374 598.435605 512.170892 598.435605z"
+              p-id="2232"
+              fill="#707070"
+            ></path>
+            <path
+              d="M601.661066 856.999498c-15.179724-8.225335-34.131355-2.593058-42.346457 12.576433-9.292644 17.142425-27.248597 27.79709-46.871517 27.79709-19.530822 0-37.476543-10.67513-46.830585-27.848255-8.256034-15.149025-27.217898-20.741393-42.366923-12.495592-15.149025 8.256034-20.741393 27.217898-12.495592 42.366923 20.304442 37.283138 59.275012 60.444651 101.6931 60.444651 42.560328 0 81.561597-23.180955 101.794407-60.494793C622.453624 884.176464 616.821347 865.224834 601.661066 856.999498z"
+              p-id="2233"
+              fill="#707070"
+            ></path>
+          </svg>
+        </div>
+        <div style="margin:0 30px;">
+          <svg
+            t="1651734671187"
+            class="icon"
+            viewBox="0 0 1024 1024"
+            version="1.1"
+            xmlns="http://www.w3.org/2000/svg"
+            p-id="3098"
+            width="24"
+            height="24"
+          >
+            <path
+              d="M511.175727 63.057151c-248.402463 0-449.734888 201.352891-449.734888 449.734888 0 248.387114 201.332425 449.740004 449.734888 449.740004 248.366647 0 449.738981-201.352891 449.738981-449.740004C960.914708 264.410042 759.542374 63.057151 511.175727 63.057151L511.175727 63.057151zM511.175727 925.048337c-227.684606 0-412.257322-184.564529-412.257322-412.256298 0-227.688699 184.573739-412.255275 412.257322-412.255275 227.687676 0 412.260391 184.566576 412.260391 412.255275C923.436118 740.482785 738.863403 925.048337 511.175727 925.048337L511.175727 925.048337zM511.175727 925.048337"
+              p-id="3099"
+              fill="#707070"
+            ></path>
+            <path
+              d="M477.49565 650.367371c-0.225127-7.990998-0.336668-13.950733-0.336668-17.922185 0-23.479761 3.347235-43.725874 9.984399-60.796668 4.874007-12.869099 12.757558-25.806759 23.588231-38.904055 7.938809-9.531074 22.288632-23.477714 42.989093-41.745776 20.703531-18.257829 34.196847-32.835849 40.384779-43.664475 6.183839-10.835789 9.29776-22.686698 9.29776-35.55989 0-23.252587-9.072633-43.72792-27.219945-61.309344-18.150382-17.581424-40.439014-26.423813-66.808592-26.423813-25.464975 0-46.734394 7.995091-63.805188 23.928992-17.068747 15.933901-28.242228 40.832987-33.573653 74.747401l-61.479213-7.313569c5.559623-45.428655 22.0062-80.195483 49.341778-104.355743 27.335578-24.159236 63.520709-36.238342 108.4899-36.238342 47.642067 0 85.638449 12.985756 113.998357 38.903032 28.354791 25.919323 42.533722 57.284681 42.533722 94.0357 0 21.264303-4.989641 40.886199-14.97404 58.809407-9.979282 17.921161-29.489638 39.755446-58.468646 65.448618-19.452028 17.353227-32.212656 30.05655-38.168298 38.280862-5.958712 8.224312-10.437723 17.58654-13.331633 28.247344-2.888793 10.662851-4.536316 27.897374-4.988618 51.836599l-57.45455 0L477.494627 650.367371 477.49565 650.367371z"
+              p-id="3100"
+              fill="#707070"
+            ></path>
+            <path
+              d="M473.811748 770.316254 473.811748 702.21011 541.923008 702.21011 541.923008 770.316254 473.811748 770.316254 473.811748 770.316254Z"
+              p-id="3101"
+              fill="#707070"
+            ></path>
+          </svg>
+        </div>
+        <!-- <div @click="handleSetting">
+          <img
+            src="https://img1.baidu.com/it/u=272523489,3471024224&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
+            style="width:24px;height:24px; border-radius:20px;"
+            alt=""
+          >
+        </div> -->
+        <el-dropdown
+          trigger="click"
+          placement="top"
+        >
+          <div>
+            <img
+              :src="avatar"
+              style="width:24px;height:24px; border-radius:20px;"
+              alt=""
+            >
+          </div>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="getMine('/mine')"
+                >
+                  涓汉璁剧疆
+                </div>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="getMine('/study-particulars')"
+                >
+                  瀛︿範妗f
+                </div>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="() => checkCloseDialog = true"
+                >
+                  閫�鍑虹郴缁�
+                </div>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+
+      <!-- <div
+        class="setting"
+        :style="`height:${settingHeight}px`"
+        v-show="settingHeight !== 0"
+      >
+        <div
+          class="setting-con"
+          @click="getMine"
+        >
+          涓汉璁剧疆
+        </div>
+        <div
+          class="setting-con"
+          @click="() => checkCloseDialog = true"
+        >
+          閫�鍑虹郴缁�
+        </div>
+      </div> -->
+    </div>
+    <s-dialog
+      v-model="checkCloseDialog"
+      style="z-index:2"
+      title="纭畾鍏抽棴绯荤粺锛�"
+      width="200px"
+    >
+      <div style="display:flex; justify-content:space-between; padding:10px 10px;">
+        <s-button
+          colorType="default"
+          size="small"
+          @click="() => checkCloseDialog = false"
+        >鍙栨秷</s-button>
+        <s-button
+          colorType="deepBlue"
+          size="small"
+          @click="closeSystem"
+        >纭畾</s-button>
+      </div>
+    </s-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import { getStore } from "@/utils/store";
+// 娉ㄩ噴鍚庡彲娴忚鍣ㄦ祴璇�
+import { app, ipcRenderer } from "electron";
+export default {
+  data() {
+    return {
+      // titleNum:1,
+      settingHeight: 0,
+      checkCloseDialog: false,
+      // 澶村儚
+      avatar: require("../../assets/img/avatarIcon.png"),
+    };
+  },
+  methods: {
+    handleTitleNum(num) {
+      switch (num) {
+        case 1:
+          this.$router.push("/");
+          break;
+        case 2:
+          this.$router.push("/exam");
+          break;
+        case 3:
+          this.$router.push("/teach");
+          break;
+        case 4:
+          this.$router.push("/manage");
+        default:
+          break;
+      }
+    },
+    handleSetting() {
+      clearInterval(this.st);
+      this.t = setInterval(() => {
+        this.settingHeight += 2;
+        if (this.settingHeight >= 80) {
+          this.settingHeight = 80;
+          window.addEventListener("click", this.handleClick);
+          clearInterval(this.t);
+        }
+      }, 1);
+    },
+    handleClick(e) {
+      if (e.target.className !== "setting-con" && this.settingHeight == 80) {
+        this.settinghidden();
+      }
+    },
+    settinghidden() {
+      document.removeEventListener("click", this.handleClick);
+      clearInterval(this.t);
+      this.st = setInterval(() => {
+        this.settingHeight -= 2;
+        if (this.settingHeight <= 0) {
+          this.settingHeight = 0;
+          clearInterval(this.st);
+        }
+      }, 1);
+    },
+    closeSystem() {
+      // _app.destroy()
+      // ipcRenderer.send('closeWindow')
+      // app.quit()
+    },
+    handleClick(e) {
+      if (e.target.className !== "setting-con" && this.settingHeight == 80) {
+        this.settinghidden();
+      }
+    },
+    settinghidden() {
+      document.removeEventListener("click", this.handleClick);
+      clearInterval(this.t);
+      this.st = setInterval(() => {
+        this.settingHeight -= 2;
+        if (this.settingHeight <= 0) {
+          this.settingHeight = 0;
+          clearInterval(this.st);
+        }
+      }, 1);
+    },
+    closeSystem() {
+      // _app.destroy()
+      //娉ㄩ噴鍚庡彲娴忚鍣ㄦ祴璇�
+      ipcRenderer.send("closeWindow");
+      app.quit();
+    },
+    // 涓汉璁剧疆
+    getMine(i) {
+      this.$router.push(i);
+    },
+  },
+  computed: {
+    ...mapGetters({
+      titleNum: "GET_HEADER_NUM",
+      userInfo: "userInfo",
+    }),
+  },
+  created() {
+    // this.titleNum = this.$store.getters.getHeader
+  },
+  mounted() {
+    console.log(this.$store);
+    // 璁剧疆澶村儚
+    this.avatar = this.userInfo.avatar ? this.userInfo.avatar : this.avatar;
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.h {
+  width: 100vw;
+  background: white;
+  box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.2);
+  height: 75px;
+  display: flex;
+  justify-content: space-between;
+  position: fixed;
+  z-index: 999;
+  &-title {
+    display: flex;
+    align-items: center;
+    margin-left: 50px;
+
+    & img {
+      width: 50px;
+      height: 50px;
+    }
+  }
+
+  &-list {
+    // margin:0 auto;
+    display: flex;
+
+    &-con {
+      // width:
+      font-size: 20px;
+      line-height: 70px;
+      font-weight: 500;
+      color: #aaa;
+      margin: 0 50px;
+      cursor: pointer;
+
+      &-act {
+        border-bottom: 5px solid rgba(16, 71, 247, 1);
+
+        color: rgba(16, 71, 247, 1);
+      }
+    }
+  }
+}
+
+.setting {
+  position: absolute;
+  right: 69px;
+  top: 55px;
+  box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+  height: 80px;
+  overflow: hidden;
+
+  // &-con {
+  // width: 80px;
+  // height: 30px;
+
+  // background: white;
+  // cursor: pointer;
+  // text-align: center;
+  // line-height: 30px;
+  // padding: 5px 2px;
+
+  // &:hover {
+  //   background: rgb(240, 240, 240);
+  // }
+  // }
+}
+
+.op {
+  & div {
+    cursor: pointer;
+  }
+}
+
+// 涓嬫媺妗嗘牱寮�
+.example-showcase .el-dropdown + .el-dropdown {
+  margin-left: 15px;
+}
+.example-showcase .el-dropdown-link {
+  cursor: pointer;
+  color: var(--el-color-primary);
+  display: flex;
+  align-items: center;
+}
+</style>
diff --git a/src/components/MailManagement/index.vue b/src/components/MailManagement/index.vue
new file mode 100644
index 0000000..a0d308d
--- /dev/null
+++ b/src/components/MailManagement/index.vue
@@ -0,0 +1,296 @@
+<template>
+  <div>
+    <el-row :gutter="6">
+      <el-col :span="2">
+        <el-select
+          v-model="isSelect"
+          placeholder="璇烽�夋嫨"
+          @change='toggleSelection(isSelect)'
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-col>
+      <el-col :span="2">
+        <el-button
+          class="btn-style"
+          @click="deleteUserInfo(tableData)"
+          :plain="true"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="2">
+        <el-button class="btn-style">涓炬姤</el-button>
+      </el-col>
+      <el-col :span="2">
+        <el-select
+          v-model="isSelect"
+          placeholder="宸茶"
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-col>
+      <el-col :span="2">
+        <el-select
+          v-model="isSelect"
+          placeholder="绉诲姩鑷�"
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-col>
+      <el-col :span="2">
+        <el-button class="btn-style">鍒锋柊</el-button>
+      </el-col>
+    </el-row>
+    <div></div>
+    <p class="p">鏈�12淇℃湭璇�</p>
+    <el-table
+      ref="multipleTable"
+      :data="tableData"
+      tooltip-effect="dark"
+      style="width: 100%"
+      @selection-change="handleSelectionChange"
+      :show-header="false"
+    >
+      <el-table-column
+        type="selection"
+        width="55"
+      >
+      </el-table-column>
+      <el-table-column
+        label="鍙戜欢浜�"
+        prop="name"
+        width="120"
+        style="display:flex"
+      >
+        <template slot-scope="scope">
+          <div class="flex">
+            <span v-if="scope.row.isRead">
+              <svg
+                t="1653636878260"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="3051"
+                width="20"
+                height="20"
+              >
+                <path
+                  d="M874.666667 375.189333V746.666667a64 64 0 0 1-64 64H213.333333a64 64 0 0 1-64-64V375.189333l64 54.250667V746.666667h597.333334V429.44l64-54.250667zM810.666667 213.333333a64.789333 64.789333 0 0 1 22.826666 4.181334 63.616 63.616 0 0 1 26.794667 19.413333 64.32 64.32 0 0 1 9.344 15.466667c2.773333 6.570667 4.48 13.696 4.906667 21.184L874.666667 277.333333v21.333334L553.536 572.586667a64 64 0 0 1-79.893333 2.538666l-3.178667-2.56L149.333333 298.666667v-21.333334a63.786667 63.786667 0 0 1 35.136-57.130666A63.872 63.872 0 0 1 213.333333 213.333333h597.333334z m-9.6 64h-578.133334L512 523.882667 801.066667 277.333333z"
+                  p-id="3052"
+                ></path>
+              </svg>
+            </span>
+            <span v-else>
+              <svg
+                t="1653637372549"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="3206"
+                width="20"
+                height="20"
+              >
+                <path
+                  d="M874.666667 375.189333V746.666667a64 64 0 0 1-64 64H213.333333a64 64 0 0 1-64-64V375.189333l266.090667 225.6a149.333333 149.333333 0 0 0 193.152 0L874.666667 375.189333zM810.666667 213.333333a64.789333 64.789333 0 0 1 22.826666 4.181334 63.616 63.616 0 0 1 26.794667 19.413333 64.32 64.32 0 0 1 9.344 15.466667c2.773333 6.570667 4.48 13.696 4.906667 21.184L874.666667 277.333333v21.333334L553.536 572.586667a64 64 0 0 1-79.893333 2.538666l-3.178667-2.56L149.333333 298.666667v-21.333334a63.786667 63.786667 0 0 1 35.136-57.130666A63.872 63.872 0 0 1 213.333333 213.333333h597.333334z"
+                  p-id="3207"
+                ></path>
+              </svg>
+            </span>
+            <span style="margin-left: 10px">{{ scope.row.name }}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="isSignificance"
+        label="閲嶈鎬�"
+        width="120"
+      >
+        <!-- 鏃楀笢 -->
+        <template slot-scope="scope">
+          <div @click="handleClick(scope.row)">
+            <span v-if="scope.row.isSignificance">
+              <svg
+                t="1653625549692"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="10042"
+                width="20"
+                height="20"
+              >
+                <path
+                  d="M824.32 178.176c-5.12 2.048-12.8 5.12-23.04 8.192-10.24 3.584-22.016 6.656-34.816 10.24s-28.672 6.144-47.104 8.192c-18.432 2.048-36.864 3.584-55.808 3.584-11.776 0-42.496-2.56-59.904-7.168-40.96-11.264-61.952-16.896-61.952-16.896l-59.392-19.968c-19.968-6.656-40.448-12.288-61.952-16.896-20.992-4.096-41.472-6.144-59.904-6.144-18.944 0-37.888 1.024-56.32 3.584-18.432 2.56-34.304 5.12-46.592 8.192-11.776 2.56-23.552 6.144-35.328 10.24-11.264 4.096-18.944 6.656-22.016 8.192-3.584 1.536-6.144 2.56-7.68 3.584v673.792c0 9.216 3.072 17.408 9.728 24.064 6.656 6.656 14.336 9.728 23.552 9.728 9.216 0 17.408-3.072 23.552-9.728 6.656-6.656 9.728-14.336 9.728-24.064V624.64c33.792-7.68 67.584-11.264 100.864-11.264 28.672 0.512 50.176 4.608 59.904 7.168l61.952 16.896 59.392 19.456c20.48 6.656 40.96 12.288 61.952 16.896 21.504 4.608 41.472 7.168 59.904 7.168 18.944 0 37.888-1.024 56.32-3.584 18.944-2.56 34.304-5.12 46.592-8.192 11.776-2.56 23.552-6.144 35.328-10.24 11.264-4.096 18.944-6.656 22.016-8.192 3.584-1.536 6.144-2.56 7.68-3.584V175.104l-6.656 3.072z"
+                  p-id="10043"
+                  fill="#d81e06"
+                ></path>
+              </svg>
+            </span>
+            <span v-else>
+              <svg
+                t="1653629871679"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="10738"
+                width="20"
+                height="20"
+              >
+                <path
+                  d="M360.56779688 208.62508741c-34.36511523 0-67.99940039 4.49782689-100.94584596 13.48810643v333.59686817c33.63428515-6.63120457 67.31156078-10.00054371 100.94584596-10.00054443 24.86970288 0 49.77702271 2.80509595 74.67359472 8.53888501 24.89119848 5.7284148 53.1786045 13.8212788 84.93745191 24.38069213 4.05180591 1.46165942 11.60729444 4.04643164 22.72020458 7.75431739 11.15052563 3.81536083 19.28100586 6.51835596 24.45055103 8.20033837 5.21253491 1.68735668 12.77339771 3.933583 22.76856787 6.85690186 9.9736753 2.91794459 18.36209473 4.94384789 25.10614795 6.28728443 6.7548003 1.34881079 14.55210816 2.58477222 23.26832642 3.70788575 8.74846094 1.12848706 17.07776929 1.68735668 25.00942065 1.68735668 34.34899389 0 68.00477393-4.37960401 100.94584596-13.36988354v-333.7097168a512.70387084 512.70387084 0 0 1-100.94584596 10.11339306c-24.9180669 0-49.81463891-2.92331885-74.67359472-8.65173364-24.87507714-5.73378833-53.1893523-13.8212788-84.91595705-24.38069214a3468.10913109 3468.10913109 0 0 1-22.7846892-7.75431738 3037.58598023 3037.58598023 0 0 0-24.46129882-8.09286401c-5.16954517-1.68198315-12.74115503-3.92820948-22.71483032-6.8515276-9.9736753-2.92331885-18.34597412-5.05669653-25.1115215-6.40550732-6.77092164-1.23596215-14.52523901-2.47192359-23.26832641-3.70788573a196.76513648 196.76513648 0 0 0-25.00404711-1.68735669zM360.56779688 141.21142578c18.55555005 0 38.5835066 2.36444921 59.95490039 6.96437695 21.36064599 4.72352416 41.97971484 10.33909033 61.79272191 16.85744556l59.39065651 19.77539087s20.62444238 5.61556616 61.81959106 16.85207202c41.17365308 11.23650586 61.17474121 13.59558082 59.92803125 6.96437623 18.93708569 0 37.60548438-1.12311352 56.00519604-3.36933984 18.43195362-2.24622632 34.09642749-5.05132227 47.09552247-8.42603566 12.99372143-3.36933983 24.55802613-6.63120457 34.81650977-9.99517016 10.25311011-3.37471337 17.92682152-6.17980933 23.00501294-8.43678344l7.36203393-3.36396631V646.82732324c-1.75184132 0.89741553-4.38497827 2.13337768-7.88866089 3.59503711-3.53055176 1.46165942-10.93557617 4.15928028-22.22044604 8.20033911a361.85203222 361.85203222 0 0 1-35.35925807 10.22624097c-12.2790127 2.92331885-27.75003199 5.62093969-46.43992552 8.09286402a428.23393481 428.23393481 0 0 1-56.37061037 3.70788574c-18.56092358 0-38.56201172-2.36444921-59.93340551-7.08259912a580.568927 580.568927 0 0 1-61.81959106-16.85207203l-59.39065651-19.66791576-61.79809545-16.95954713c-41.18977441-11.12365723-61.17474121-13.48810643-59.94952685-6.96975048-33.47844678 0-67.13422681 3.82073437-100.94584596 11.34935449v224.60652221c0 9.32882543-3.28873316 17.30346656-9.88769507 23.82182251-6.57209277 6.63120457-14.50374415 9.88769508-23.79495409 9.8876958-9.2858357 0-17.21748706-3.25649121-23.79495338-9.8876958C195.55076001 866.38252319 192.26202685 858.40788208 192.26202685 849.07905664V175.033792c1.75184132-0.90278978 4.40647314-2.13875122 7.91015577-3.60041065 3.50905689-1.45628588 10.91408129-4.26675536 22.19895117-8.20033838a361.85203222 361.85203222 0 0 1 35.35925806-10.22624169c12.30588183-2.91794459 27.79302172-5.61556616 46.41843066-8.08748976A429.46989625 429.46989625 0 0 1 360.546302 141.21142578h0.02149488z"
+                  p-id="10739"
+                ></path>
+              </svg>
+            </span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="headline"
+        show-overflow-tooltip
+      >
+      </el-table-column>
+      <el-table-column
+        prop="time"
+        label="鍙戜欢鏃堕棿"
+        show-overflow-tooltip
+        align="right"
+      >
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      options: [
+        { lable: 1, value: "鍏ㄩ��" },
+        { lable: 2, value: "鍏ㄤ笉閫�" },
+      ],
+      isSelect: "",
+      // 琛ㄦ牸
+
+      deleteIds: [],
+      tableData: [
+        {
+          id: 1,
+          // 鏄惁閫夋嫨
+          isCondition: false,
+          // 閲嶈鎬�
+          isSignificance: false,
+          // 鍙戜欢浜�
+          name: "鐜嬪皬铏�",
+          headline: "鏈夊叧鏀惧亣娉ㄦ剰浜嬮」鐨勯�氱煡",
+          // 鍙戜欢鏃堕棿
+          time: "浠婂ぉ",
+          // 鏄惁宸茶
+          isRead: false,
+        },
+        {
+          id: 2,
+          // 鏄惁閫夋嫨
+          isCondition: false,
+          // 閲嶈鎬�
+          isSignificance: false,
+          // 鍙戜欢浜�
+          name: "寮犱笁",
+          headline: "鏈夊叧鏀惧亣娉ㄦ剰浜嬮」鐨勯�氱煡",
+          // 鍙戜欢鏃堕棿
+          time: "鏄ㄥぉ",
+          // 鏄惁宸茶
+          isRead: true,
+        },
+      ],
+      multipleSelection: [],
+    };
+  },
+  methods: {
+    // 鏃楀笢鍙樻崲
+    handleClick(row) {
+      this.tableData.filter((item) => {
+        if (item.id == row.id) item.isSignificance = !row.isSignificance;
+      });
+    },
+    // 鍒ゆ柇鏄惁鍏ㄩ��
+    toggleSelection(rows) {
+      if (rows == "鍏ㄩ��") {
+        this.tableData.forEach((row) => {
+          this.$refs.multipleTable.toggleRowSelection(row);
+        });
+      } else if (rows == "鍏ㄤ笉閫�") {
+        this.$refs.multipleTable.clearSelection();
+      }
+    },
+    // 鑾峰彇閫変腑鐨勮鏁�
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    // 鍒犻櫎
+    deleteUserInfo() {
+      // 鍒ゆ柇鏄惁閫夋嫨閭欢
+      if (!this.multipleSelection.length) {
+        this.$message({
+          message: "鏈�夋嫨浠讳綍閭欢",
+          type: "warning",
+        });
+        return;
+      }
+      // 鑾峰彇瑕佸垹闄ょ殑id
+      for (var i = 0; i < this.multipleSelection.length; i++) {
+        var j = i;
+        var id = this.multipleSelection[j].id;
+        this.deleteIds.push(id);
+      }
+    },
+  },
+
+  // created() {
+  //   //浣跨敤鍙屽悜缁戝畾缁欎笅鎷夊垪琛ㄨ缃竴涓粯璁ゅ��
+  //   this.isSelect = this.options[0].value;
+  // },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.bg-purple {
+  background: #d3dce6;
+}
+
+.btn-style {
+  width: 100%;
+}
+.p {
+  border-bottom: 1px solid rgb(189, 188, 188);
+  padding-bottom: 10px;
+}
+ul {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+</style>
diff --git a/src/components/PageHeader/index.vue b/src/components/PageHeader/index.vue
new file mode 100644
index 0000000..91e37be
--- /dev/null
+++ b/src/components/PageHeader/index.vue
@@ -0,0 +1,48 @@
+<template>
+  <div class="main-title">
+    <p>{{title}}</p>
+    <div
+      class="back"
+      @click="goBack"
+    ><svg
+        t="1651823534392"
+        class="icon"
+        viewBox="0 0 1024 1024"
+        version="1.1"
+        content-inquire
+        xmlns="http://www.w3.org/2000/svg"
+        p-id="1892"
+        width="20"
+        height="20"
+      >
+        <path
+          d="M896 544H250.4l242.4 242.4L448 832 173.6 557.6 128 512l45.6-45.6L448 192l45.6 45.6L250.4 480H896v64z"
+          p-id="1893"
+          fill="#515151"
+        ></path>
+      </svg></div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["title"],
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    // 鏀瑰彉Table鏌愪竴鍒楃殑鑳屾櫙棰滆壊
+    // columnIndex涓哄垪涓嬫爣
+    columnbackgroundStyle({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex == 0) {
+        //璁╀笅鏍囦负1鐨勫垪鏁拌儗鏅鑹叉樉绀轰负绾㈣壊锛堥鑹茶嚜瀹氫箟鏍规嵁澶у闇�姹傛潵锛�
+        return "background:#82bbd7;";
+      }
+    },
+  },
+};
+</script>
+
+<style>
+</style>
\ No newline at end of file
diff --git a/src/components/PopUp/Question.vue b/src/components/PopUp/Question.vue
new file mode 100644
index 0000000..3501e3e
--- /dev/null
+++ b/src/components/PopUp/Question.vue
@@ -0,0 +1,175 @@
+<template>
+  <el-dialog
+    title="褰曞叆棰樼洰"
+    :visible.sync="dialogFormVisible"
+    width='700px'
+    center
+  >
+    <el-form :model="form">
+      <el-form-item :label-width="formLabelWidth">
+        <div>棰樼洰锛�</div>
+        <el-input
+          v-model="form.topic"
+          type="textarea"
+          :rows="4"
+          resize='none'
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          style="width:500px"
+        />
+      </el-form-item>
+      <el-form-item :label-width="formLabelWidth">
+        <div>绉戠洰锛�</div>
+        <el-select
+          v-model="form.subject"
+          placeholder="璇烽�夋嫨"
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item :label-width="formLabelWidth">
+        <div>鍙傝�冪瓟妗堬細</div>
+        <el-input
+          v-model="form.reference"
+          type="textarea"
+          :rows="4"
+          resize='none'
+          placeholder="璇蜂互绌烘牸闅斿紑"
+          style="width:500px"
+        />
+      </el-form-item>
+      <el-form-item :label-width="formLabelWidth">
+        <div>鍒嗗�硷細</div>
+        <el-select
+          v-model="form.score"
+          placeholder="璇烽�夋嫨"
+        >
+          <el-option
+            v-for="item in scores"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <div
+      slot="footer"
+      class="dialog-footer"
+    >
+      <el-button
+        type="primary"
+        @click="setGoods()"
+        style="margin-right:300px"
+      >纭� 瀹�</el-button>
+      <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      //寮圭獥妗�
+      form: {
+        //   棰樼洰
+        topic: "",
+        // 绉戠洰
+        subject: "",
+        // 鍙傝�冪瓟妗�
+        reference: "",
+        // 鍒嗗��
+        score: "",
+      },
+      // 绉戠洰涓嬫媺妗嗗��
+      options: [
+        {
+          value: "1",
+          label: "璇枃",
+        },
+        {
+          value: "2",
+          label: "鏁板",
+        },
+        {
+          value: "3",
+          label: "鑻辫",
+        },
+        {
+          value: "4",
+          label: "鍦扮悊",
+        },
+        {
+          value: "5",
+          label: "鐗╃悊",
+        },
+      ],
+      //   鍒嗗�肩殑涓嬫媺妗�
+      scores: [
+        {
+          value: "1",
+          label: "1",
+        },
+        {
+          value: "1.5",
+          label: "1.5",
+        },
+        {
+          value: "2",
+          label: "2",
+        },
+        {
+          value: "2.5",
+          label: "2.5",
+        },
+      ],
+      //   寮圭獥妗嗙殑鏉′欢
+      dialogFormVisible: false,
+      formLabelWidth: "120px",
+    };
+  },
+  methods: {
+    showDialog() {
+      this.dialogFormVisible = true;
+      //   娓呯┖杈撳叆妗�
+      this.form = {
+        //   棰樼洰
+        topic: "",
+        // 绉戠洰
+        subject: "",
+        // 鍙傝�冪瓟妗�
+        reference: "",
+        // 鍒嗗��
+        score: "",
+      };
+    },
+    // 鐐瑰嚮纭鎸夐挳杩斿洖form琛ㄥ崟鍊肩粰璋冪敤鑰�
+    setGoods() {
+      this.$emit("children", this.form);
+      //   鍏抽棴寮圭獥
+      this.dialogFormVisible = false;
+      //   娓呯┖杈撳叆妗�
+      this.form = {
+        //   棰樼洰
+        topic: "",
+        // 绉戠洰
+        subject: "",
+        // 鍙傝�冪瓟妗�
+        reference: "",
+        // 鍒嗗��
+        score: "",
+      };
+    },
+  },
+};
+</script>
+
+<style>
+</style>
\ No newline at end of file
diff --git a/src/components/PopUp/classPopUp.vue b/src/components/PopUp/classPopUp.vue
new file mode 100644
index 0000000..a7ec397
--- /dev/null
+++ b/src/components/PopUp/classPopUp.vue
@@ -0,0 +1,299 @@
+<!-- 鐝骇瀵硅瘽妗� -->
+<template>
+  <el-dialog
+    title="鏂板鏁欏笀"
+    :visible.sync="dialogFormVisible"
+    width="40%"
+  >
+    <!-- <el-form
+      :label-position="labelPosition"
+      label-width="80px"
+      :model="form"
+    >
+      
+      <el-form-item label="娲诲姩鍖哄煙">
+        <el-input></el-input>
+      </el-form-item>
+      <el-form-item label="娲诲姩褰㈠紡">
+        <el-input></el-input>
+      </el-form-item>
+    </el-form> -->
+    <el-form
+      :label-position="labelPosition"
+      label-width="80px"
+      :model="form"
+    >
+      <el-row
+        :gutter="24"
+        style="margin:auto"
+      >
+        <el-col :span="12">
+          <el-form-item label="濮撳悕">
+            <el-input v-model="form.name"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鐢靛瓙閭">
+            <el-input
+              type="email"
+              v-model="form.email"
+            ></el-input>
+          </el-form-item>
+
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鑱旂郴鐢佃瘽">
+            <el-input v-model="form.phone"></el-input>
+          </el-form-item>
+
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鎬у埆">
+            <el-select
+              style="width:100%"
+              v-model="form.sex"
+              placeholder="璇烽�夋嫨"
+            >
+              <el-option
+                v-for="item in sex"
+                :key="item.id"
+                :label="item.label"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鎵�灞為儴闂�">
+            <el-select
+              style="width:100%"
+              v-model="form.branch"
+              placeholder="璇烽�夋嫨"
+            >
+              <el-option
+                v-for="item in sex"
+                :key="item.id"
+                :label="item.label"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鏁欒偛">
+            <el-select
+              style="width:100%"
+              v-model="form.education"
+              placeholder="璇烽�夋嫨"
+            >
+              <el-option
+                v-for="item in educations"
+                :key="item.id"
+                :label="item.label"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍑虹敓鏃ユ湡">
+            <el-date-picker
+              style="width:100%"
+              value-format="yyyy-MM-dd"
+              v-model="form.birth"
+              type="date"
+              placeholder="閫夋嫨鏃ユ湡"
+            >
+            </el-date-picker>
+          </el-form-item>
+
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍔犲叆鏃ユ湡">
+            <el-date-picker
+              style="width:100%"
+              value-format="yyyy-MM-dd"
+              v-model="form.joiningDate"
+              type="date"
+              placeholder="閫夋嫨鏃ユ湡"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-col
+        :span="24"
+        class="demo-type flex uploadingImg"
+      >
+        <el-avatar
+          style="margin-right:20px"
+          :size="60"
+          :src="url"
+          @error="errorHandler"
+        >
+          <!-- <img :src="url" /> -->
+        </el-avatar>
+        <el-upload
+          class="upload-demo"
+          action="https://jsonplaceholder.typicode.com/posts/"
+          :on-change="handleChange"
+          :file-list="fileList"
+        >
+          <el-button
+            size="small"
+            type="text"
+            style="color:rgb(245, 155, 34);font-size: 14px;"
+          >閫夋嫨鍥剧墖</el-button>
+          <div
+            slot="tip"
+            class="el-upload__tip"
+            style="color:darkgrey;font-size: 12px; margin-top: 0;"
+          >鍥剧墖澶у皬璇峰湪1M浠ュ唴锛屼粎鏀寔JPG銆丣PEG銆丳NG鏍煎紡</div>
+        </el-upload>
+      </el-col>
+    </el-form>
+    <div
+      slot="footer"
+      class="dialog-footer"
+    >
+      <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+      <el-button
+        type="primary"
+        @click="setGoods()"
+      >纭� 瀹�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 瀵归綈鏂瑰紡
+      labelPosition: "top",
+      dialogFormVisible: false,
+      form: {},
+      formLabelWidth: "120px",
+      //   鎬у埆
+      sex: [
+        {
+          id: "1",
+          label: "鐢�",
+        },
+        {
+          id: "2",
+          label: "濂�",
+        },
+      ],
+      //   澶村儚
+      url: "https://img1.baidu.com/it/u=2029513305,2137933177&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=472",
+      educations: [
+        {
+          id: "2-1",
+          label: "鏈",
+        },
+        {
+          id: "2-2",
+          label: "纭曞+",
+        },
+        {
+          id: "2-3",
+          label: "鏈",
+        },
+      ],
+      form: {
+        //   濮撳悕
+        name: "",
+        // 閭
+        email: "",
+        // 鑱總闆昏┍
+        phone: "",
+        // 鎬у埆
+        sex: "",
+        // 閮ㄩ棬
+        branch: "",
+        // 鏁欒偛
+        education: "",
+        // 鍑虹敓鏃ユ湡
+        birth: "",
+        // 鍔犲叆鏃ユ湡
+        joiningDate: "",
+      },
+    };
+  },
+  methods: {
+    showDialog() {
+      this.dialogFormVisible = true;
+      //   娓呯┖杈撳叆妗�
+      this.form = {};
+    },
+    // 鐐瑰嚮纭鎸夐挳杩斿洖form琛ㄥ崟鍊肩粰璋冪敤鑰�
+    setGoods() {
+      this.$emit("children", this.form);
+      //   鍏抽棴寮圭獥
+      this.dialogFormVisible = false;
+      //   娓呯┖杈撳叆妗�
+      this.form = {
+        //   棰樼洰
+        topic: "",
+        // 绉戠洰
+        subject: "",
+        // 鍙傝�冪瓟妗�
+        reference: "",
+        // 鍒嗗��
+        score: "",
+      };
+    },
+    // 閿欒
+    errorHandler() {
+      return true;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.el-row {
+  margin-bottom: 20px;
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+.el-col {
+  border-radius: 4px;
+}
+.bg-purple-dark {
+  background: #99a9bf;
+}
+.bg-purple {
+  background: #d3dce6;
+}
+.bg-purple-light {
+  background: #e5e9f2;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.row-bg {
+  padding: 10px 0;
+  background-color: #f9fafc;
+}
+
+// 璁剧疆杈撳叆妗嗙殑杈硅窛
+.el-form-item {
+  margin-bottom: 0;
+}
+// 涓婁紶澶村儚
+.uploadingImg {
+  padding-top: 10px;
+  padding-left: 20px;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/basic-container/main.vue b/src/components/basic-container/main.vue
new file mode 100644
index 0000000..de593f3
--- /dev/null
+++ b/src/components/basic-container/main.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="basic-container"
+       :class="{'basic-container--block':block}">
+    <el-card>
+      <slot></slot>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "basicContainer",
+  props: {
+    block: {
+      type: Boolean,
+      default: false,
+    }
+  }
+};
+</script>
+
+<style lang="scss">
+.basic-container {
+  padding: 8px 10px;
+  border-radius: 10px;
+  box-sizing: border-box;
+  .el-card {
+    width: 100%;
+  }
+  &:first-child {
+    padding-top: 0;
+  }
+  &--block {
+    height: 100%;
+    .el-card {
+      height: 100%;
+    }
+  }
+}
+</style>
diff --git a/src/components/editor/LICENSE b/src/components/editor/LICENSE
new file mode 100644
index 0000000..56fa242
--- /dev/null
+++ b/src/components/editor/LICENSE
@@ -0,0 +1,193 @@
+source https://gitee.com/elunez/eladmin-web
+
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+   Copyright 2019 Zheng Jie
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/src/components/editor/RichText.vue b/src/components/editor/RichText.vue
new file mode 100644
index 0000000..25b6d50
--- /dev/null
+++ b/src/components/editor/RichText.vue
@@ -0,0 +1,114 @@
+<template>
+  <div style="border: 1px solid #ccc;">
+    <Toolbar
+      style="border-bottom: 1px solid #ccc"
+      :editor="editor"
+      :defaultConfig="toolbarConfig"
+      :mode="mode"
+    />
+    <Editor
+      style="height:300px;  overflow-y: hidden;"
+      v-model="html"
+      :defaultConfig="editorConfig"
+      :mode="mode"
+      @onCreated="onCreated"
+      @onChange="onChange"
+    />
+  </div>
+</template>
+
+<script>
+import Vue from "vue";
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+
+export default Vue.extend({
+  components: { Editor, Toolbar },
+  data() {
+    return {
+      editor: null,
+      html: "<p></p>",
+      toolbarConfig: {},
+      editorConfig: { placeholder: "璇疯緭鍏ュ唴瀹�...", MENU_CONF: {} },
+      mode: "default", // or 'simple'
+    };
+  },
+  methods: {
+    onCreated(editor) {
+      this.editor = Object.seal(editor); // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊
+    },
+    onChange(editor) {
+      console.log("onChange", editor.children);
+    },
+  },
+  mounted() {
+    this.editorConfig.MENU_CONF["uploadImage"] = {
+      // 涓婁紶鍦板潃
+      server: "",
+      // form-data fieldName 锛岄粯璁ゅ�� 'wangeditor-uploaded-image'
+      fieldName: "your-custom-name",
+
+      // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 2M
+      maxFileSize: 1 * 1024 * 1024, // 1M
+
+      // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 100
+      maxNumberOfFiles: 10,
+
+      // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['image/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+      allowedFileTypes: ["image/*"],
+
+      // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+      meta: {
+        token: "xxx",
+        otherKey: "yyy",
+      },
+
+      // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+      metaWithUrl: false,
+
+      // 鑷畾涔夊鍔� http  header
+      headers: {
+        Accept: "text/x-json",
+        otherKey: "xxx",
+      },
+      // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+      withCredentials: true,
+
+      // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉�
+      timeout: 5 * 1000, // 5 绉�
+      // 涓婁紶涔嬪墠瑙﹀彂
+      onBeforeUpload(file) {
+        // file 閫変腑鐨勬枃浠讹紝鏍煎紡濡� { key }
+        return file;
+
+        // 鍙互 return
+        // 1. return file 鎴栬�� new 涓�涓� file 锛屾帴涓嬫潵灏嗕笂浼�
+        // 2. return false 锛屼笉涓婁紶杩欎釜 file
+      },
+      // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+      onProgress(progress) {
+        // progress 鏄� 0-100 鐨勬暟瀛�
+        console.log("progress", progress);
+      },
+      // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+      onSuccess(file, res) {
+        console.log(`${file.name} 涓婁紶鎴愬姛`, res);
+      },
+      // 鍗曚釜鏂囦欢涓婁紶澶辫触
+      onFailed(file, res) {
+        console.log(`${file.name} 涓婁紶澶辫触`, res);
+      },
+      // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+      onError(file, err, res) {
+        console.log(`${file.name} 涓婁紶鍑洪敊`, err, res);
+      },
+    };
+  },
+  beforeDestroy() {
+    const editor = this.editor;
+    if (editor == null) return;
+    editor.destroy(); // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒
+  },
+});
+</script>
+
+<style src="@wangeditor/editor/dist/css/style.css"></style>
diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue
new file mode 100644
index 0000000..3e70ac8
--- /dev/null
+++ b/src/components/editor/index.vue
@@ -0,0 +1,78 @@
+<template>
+  <div class="json-editor">
+    <textarea ref="textarea" />
+  </div>
+</template>
+ 
+<script>
+import CodeMirror from "codemirror";
+import "codemirror/lib/codemirror.css";
+// 鏇挎崲涓婚杩欓噷闇�淇敼鍚嶇О
+import "codemirror/theme/idea.css";
+import "codemirror/mode/clike/clike";
+export default {
+  props: {
+    value: {
+      type: String,
+      required: true,
+    },
+    height: {
+      type: String,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      editor: false,
+    };
+  },
+  watch: {
+    value(value) {
+      const editorValue = this.editor.getValue();
+      if (value !== editorValue) {
+        this.editor.setValue(this.value);
+      }
+    },
+    height(value) {
+      this.editor.setSize("auto", this.height);
+    },
+  },
+  mounted() {
+    this.editor = CodeMirror.fromTextArea(this.$refs.textarea, {
+      mode: "text/x-java",
+      lineNumbers: true,
+      lint: true,
+      lineWrapping: true,
+      tabSize: 2,
+      cursorHeight: 0.9,
+      // 鏇挎崲涓婚杩欓噷闇�淇敼鍚嶇О
+      theme: "idea",
+      readOnly: true,
+    });
+    this.editor.setSize("auto", this.height);
+    this.editor.setValue(this.value);
+  },
+  methods: {
+    getValue() {
+      return this.editor.getValue();
+    },
+  },
+};
+</script>
+ 
+<style scoped>
+.json-editor {
+  height: 100%;
+  margin-bottom: 10px;
+}
+.json-editor >>> .CodeMirror {
+  font-size: 14px;
+  overflow-y: auto;
+  font-weight: normal;
+}
+.json-editor >>> .CodeMirror-scroll {
+}
+.json-editor >>> .cm-s-rubyblue span.cm-string {
+  color: #f08047;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/error-page/403.vue b/src/components/error-page/403.vue
new file mode 100644
index 0000000..0f418d2
--- /dev/null
+++ b/src/components/error-page/403.vue
@@ -0,0 +1,129 @@
+<template>
+  <div class="error403">
+    <div class="error403-body-con">
+      <el-card class="box-card">
+        <div class="error403-body-con-title">4
+          <span class="error403-0-span">
+            <i class="icon-quanxian"></i>
+          </span>
+          <span class="error403-key-span">
+            <i class="icon-iconset0216"></i>
+          </span>
+        </div>
+        <p class="error403-body-con-message">You don't have permission</p>
+        <div class="error403-btn-con">
+          <el-button @click="goHome" size="large" style="width: 200px;" type="text">杩斿洖棣栭〉</el-button>
+          <el-button @click="backPage" size="large" style="width: 200px;margin-left: 40px;" type="primary">杩斿洖涓婁竴椤�</el-button>
+        </div>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Error403",
+  methods: {
+    backPage() {
+      this.$router.go(-1);
+    },
+    goHome() {
+      this.$router.push({
+        path: "/"
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@keyframes error403animation {
+  0% {
+    transform: rotateZ(0deg);
+  }
+  40% {
+    transform: rotateZ(-20deg);
+  }
+  45% {
+    transform: rotateZ(-15deg);
+  }
+  50% {
+    transform: rotateZ(-20deg);
+  }
+  55% {
+    transform: rotateZ(-15deg);
+  }
+  60% {
+    transform: rotateZ(-20deg);
+  }
+  100% {
+    transform: rotateZ(0deg);
+  }
+}
+.error403 {
+  &-body-con {
+    width: 700px;
+    height: 500px;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    &-title {
+      text-align: center;
+      font-size: 240px;
+      font-weight: 700;
+      color: #2d8cf0;
+      height: 260px;
+      line-height: 260px;
+      margin-top: 40px;
+      .error403-0-span {
+        display: inline-block;
+        position: relative;
+        width: 170px;
+        height: 170px;
+        border-radius: 50%;
+        border: 20px solid #ed3f14;
+        color: #ed3f14;
+        margin-right: 10px;
+        i {
+          display: inline-block;
+          font-size: 120px !important;
+          position: absolute;
+          left: 50%;
+          top: 50%;
+          transform: translate(-50%, -50%);
+        }
+      }
+      .error403-key-span {
+        display: inline-block;
+        position: relative;
+        width: 100px;
+        height: 190px;
+        border-radius: 50%;
+        margin-right: 10px;
+        i {
+          display: inline-block;
+          font-size: 190px !important;
+          position: absolute;
+          left: 20px;
+          transform: translate(-50%, -60%);
+          transform-origin: center bottom;
+          animation: error403animation 2.8s ease 0s infinite;
+        }
+      }
+    }
+    &-message {
+      display: block;
+      text-align: center;
+      font-size: 30px;
+      font-weight: 500;
+      letter-spacing: 4px;
+      color: #dddde2;
+    }
+  }
+  &-btn-con {
+    text-align: center;
+    padding: 20px 0;
+    margin-bottom: 40px;
+  }
+}
+</style>
diff --git a/src/components/error-page/404.vue b/src/components/error-page/404.vue
new file mode 100644
index 0000000..db25d10
--- /dev/null
+++ b/src/components/error-page/404.vue
@@ -0,0 +1,91 @@
+<template>
+  <div class="error404">
+    <div class="error404-body-con">
+      <el-card class="box-card">
+        <div class="error404-body-con-title">4
+          <span>0</span>4</div>
+        <p class="error404-body-con-message">YOU&nbsp;&nbsp;LOOK&nbsp;&nbsp;LOST</p>
+        <div class="error404-btn-con">
+          <el-button @click="goHome" size="large" style="width: 200px;" type="text">杩斿洖棣栭〉</el-button>
+          <el-button @click="backPage" size="large" style="width: 200px;margin-left: 40px;" type="primary">杩斿洖涓婁竴椤�</el-button>
+        </div>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Error404",
+  methods: {
+    backPage() {
+      this.$router.go(-1);
+    },
+    goHome() {
+      this.$router.push({
+        path: "/"
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@keyframes error404animation {
+  0% {
+    transform: rotateZ(0deg);
+  }
+  20% {
+    transform: rotateZ(-60deg);
+  }
+  40% {
+    transform: rotateZ(-10deg);
+  }
+  60% {
+    transform: rotateZ(50deg);
+  }
+  80% {
+    transform: rotateZ(-20deg);
+  }
+  100% {
+    transform: rotateZ(0deg);
+  }
+}
+.error404 {
+  &-body-con {
+    width: 700px;
+    height: 500px;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    &-title {
+      text-align: center;
+      font-size: 240px;
+      font-weight: 700;
+      color: #2d8cf0;
+      height: 260px;
+      line-height: 260px;
+      margin-top: 40px;
+      span {
+        display: inline-block;
+        color: #19be6b;
+        font-size: 230px;
+        animation: error404animation 3s ease 0s infinite alternate;
+      }
+    }
+    &-message {
+      display: block;
+      text-align: center;
+      font-size: 30px;
+      font-weight: 500;
+      letter-spacing: 12px;
+      color: #dddde2;
+    }
+  }
+  &-btn-con {
+    text-align: center;
+    padding: 20px 0;
+    margin-bottom: 40px;
+  }
+}
+</style>
diff --git a/src/components/error-page/500.vue b/src/components/error-page/500.vue
new file mode 100644
index 0000000..aaecade
--- /dev/null
+++ b/src/components/error-page/500.vue
@@ -0,0 +1,112 @@
+<template>
+  <div class="error500">
+    <div class="error500-body-con">
+      <el-card class="box-card">
+        <div class="error500-body-con-title">
+          5
+          <span class="error500-0-span">
+            <i class="icon-debug"></i>
+          </span>
+          <span class="error500-0-span">
+            <i class="icon-debug"></i>
+          </span>
+        </div>
+        <p class="error500-body-con-message">Oops! the server is wrong</p>
+        <div class="error500-btn-con">
+          <el-button @click="goHome" size="large" style="width: 200px;" type="text">杩斿洖棣栭〉</el-button>
+          <el-button @click="backPage" size="large" style="width: 200px;margin-left: 40px;" type="primary">杩斿洖涓婁竴椤�</el-button>
+        </div>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Error500",
+  methods: {
+    backPage() {
+      this.$router.go(-1);
+    },
+    goHome() {
+      this.$router.push({
+        path: "/"
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@keyframes error500animation {
+  0% {
+    transform: rotateZ(0deg);
+  }
+  20% {
+    transform: rotateZ(-10deg);
+  }
+  40% {
+    transform: rotateZ(5deg);
+  }
+  60% {
+    transform: rotateZ(-5deg);
+  }
+  80% {
+    transform: rotateZ(10deg);
+  }
+  100% {
+    transform: rotateZ(0deg);
+  }
+}
+.error500 {
+  &-body-con {
+    width: 700px;
+    height: 500px;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    &-title {
+      text-align: center;
+      font-size: 240px;
+      font-weight: 700;
+      color: #2d8cf0;
+      height: 260px;
+      line-height: 260px;
+      margin-top: 40px;
+      .error500-0-span {
+        display: inline-block;
+        position: relative;
+        width: 170px;
+        height: 170px;
+        border-radius: 50%;
+        border: 20px solid #ed3f14;
+        color: #ed3f14;
+        margin-right: 10px;
+        i {
+          display: inline-block;
+          font-size: 120px !important;
+          position: absolute;
+          bottom: -43px;
+          left: 20px;
+          transform-origin: center bottom;
+          animation: error500animation 3s ease 0s infinite alternate;
+        }
+      }
+    }
+    &-message {
+      display: block;
+      text-align: center;
+      font-size: 30px;
+      font-weight: 500;
+      letter-spacing: 4px;
+      color: #dddde2;
+    }
+  }
+  &-btn-con {
+    text-align: center;
+    padding: 20px 0;
+    margin-bottom: 40px;
+  }
+}
+</style>
+
diff --git a/src/components/iframe/main.vue b/src/components/iframe/main.vue
new file mode 100644
index 0000000..fb1432f
--- /dev/null
+++ b/src/components/iframe/main.vue
@@ -0,0 +1,129 @@
+<template>
+  <div>
+    <basic-container>
+      <iframe v-if="$route.query.src"
+              :src='$route.query.src'
+              class="iframe"
+              ref="iframe"></iframe>
+      <iframe v-else
+              :src="urlPath"
+              class="iframe"
+              ref="iframe"></iframe>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+export default {
+  name: 'AvueIframe',
+  data () {
+    return {
+      urlPath: this.getUrlPath() //iframe src 璺緞
+    }
+  },
+  created () {
+    NProgress.configure({ showSpinner: false })
+  },
+  mounted () {
+    this.load()
+    this.resize()
+  },
+  props: ['routerPath'],
+  watch: {
+    $route: function () {
+      this.load()
+    },
+    routerPath: function () {
+      // 鐩戝惉routerPath鍙樺寲锛屾敼鍙榮rc璺緞
+      this.urlPath = this.getUrlPath()
+    }
+  },
+  components: {
+    ...mapGetters(['screen']),
+  },
+  methods: {
+    // 鏄剧ず绛夊緟妗�
+    show () {
+      NProgress.start()
+    },
+    // 闅愯棌绛夊緟鐙�
+    hide () {
+      NProgress.done()
+    },
+    // 鍔犺浇娴忚鍣ㄧ獥鍙e彉鍖栬嚜閫傚簲
+    resize () {
+      window.onresize = () => {
+        this.iframeInit()
+      }
+    },
+    // 鍔犺浇缁勪欢
+    load () {
+      this.show()
+      var flag = true //URL鏄惁鍖呭惈闂彿
+      if (this.$route.query.src.indexOf('?') == -1) {
+        flag = false
+      }
+      var list = []
+      for (var key in this.$route.query) {
+        if (key != 'src' && key != 'name') {
+          list.push(`${key}= this.$route.query[key]`)
+        }
+      }
+      list = list.join('&').toString()
+      if (flag) {
+        this.$route.query.src = `${this.$route.query.src}${
+          list.length > 0 ? `&list` : ''
+          }`
+      } else {
+        this.$route.query.src = `${this.$route.query.src}${
+          list.length > 0 ? `?list` : ''
+          }`
+      }
+      //瓒呮椂5s鑷姩闅愯棌绛夊緟妗嗭紝鍔犲己鐢ㄦ埛浣撻獙
+      let time = 5
+      const timeFunc = setInterval(() => {
+        time--
+        if (time == 0) {
+          this.hide()
+          clearInterval(timeFunc)
+        }
+      }, 1000)
+      this.iframeInit()
+    },
+    //iframe绐楀彛鍒濆鍖�
+    iframeInit () {
+      const iframe = this.$refs.iframe
+      const clientHeight = document.documentElement.clientHeight - (screen > 1 ? 200 : 130);
+      iframe.style.height = `${clientHeight}px`
+      if (iframe.attachEvent) {
+        iframe.attachEvent('onload', () => {
+          this.hide()
+        })
+      } else {
+        iframe.onload = () => {
+          this.hide()
+        }
+      }
+    },
+    getUrlPath: function () {
+      //鑾峰彇 iframe src 璺緞
+      let url = window.location.href
+      url = url.replace('/myiframe', '')
+      return url
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.iframe {
+  width: 100%;
+  height: 100%;
+  border: 0;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/particulars/introduce.vue b/src/components/particulars/introduce.vue
new file mode 100644
index 0000000..1cd4279
--- /dev/null
+++ b/src/components/particulars/introduce.vue
@@ -0,0 +1,61 @@
+<template>
+  <div>
+    <div>
+      <p
+        v-for="(p,index) in Introduces.p"
+        :key="index"
+        class="indent"
+      >{{p}}</p>
+    </div>
+    <div
+      v-for="(item,index) in Introduces.skill"
+      :key="index"
+      class="Introduces_style"
+    >
+      <p>{{item.title}}</p>
+      <div>
+        <span
+          class="title-style"
+          v-for="(a) in item.all"
+          :key="a"
+        >{{a}}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["Introduces"],
+};
+</script>
+
+<style scoped lang="scss">
+// 鍏充簬
+.indent {
+  font-size: 16px;
+  // 棣栬缂╄繘
+  text-indent: 24px;
+  color: #7f7f7f;
+  // 璁剧疆琛岄珮锛屾拺寮�琛岄珮
+  line-height: 20px;
+}
+.Introduces_style {
+  & > div {
+    display: flex;
+    flex-wrap: wrap;
+  }
+
+  //鎶�鑳�
+  .title-style {
+    padding: 10px 16px;
+    background-color: #d7d7d7;
+    border-radius: 20px;
+    font-size: 14px;
+    margin-right: 16px;
+    margin-bottom: 16px;
+    min-width: 120px;
+    text-align: center;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/components/particulars/photoWall.vue b/src/components/particulars/photoWall.vue
new file mode 100644
index 0000000..4c07739
--- /dev/null
+++ b/src/components/particulars/photoWall.vue
@@ -0,0 +1,39 @@
+<template>
+  <div class="photo">
+    <div
+      class="photo-item"
+      v-for="urls in PhotoWalls"
+      :key="urls.url"
+    >
+      <el-image :src="urls.url"></el-image>
+      <p class="photo-item-title">{{urls.title}}</p>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["PhotoWalls"],
+  data() {
+    return {};
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.photo {
+  display: flex;
+  justify-content: space-between;
+  overflow: auto;
+  flex-wrap: wrap;
+  &-item {
+    width: 444px;
+    // height: 450px;
+    // 鍥剧墖涓嬫爣棰�
+    &-title {
+      // background-color: red;
+      text-align: center;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/components/upload/SingleUpload.vue b/src/components/upload/SingleUpload.vue
new file mode 100644
index 0000000..e405bbc
--- /dev/null
+++ b/src/components/upload/SingleUpload.vue
@@ -0,0 +1,119 @@
+<template>
+  <el-upload
+    :action="uploadAction"
+    :on-remove="handleRemove"
+    :on-success="handleSuccess"
+    :on-exceed="handleExceed"
+    :on-error="handleError"
+    :show-file-list="false"
+    :file-list="state.filered"
+    :multiple='false'
+    limit.number=1
+  >
+    <img
+      v-if="imageUrl"
+      :src="imageUrl"
+      class="avatar"
+    >
+    <i
+      v-else
+      class="el-icon-plus avatar-uploader-icon"
+    ></i>
+  </el-upload>
+</template>
+
+<script>
+export default {
+  props: {
+    //   涓婁紶鍥剧墖鐨勬帴鍙e湴鍧�
+    uploadAction: {
+      type: String,
+      required: true,
+    },
+    // 涓婁紶鎴愬姛鐨勫洖璋冨嚱鏁�
+    successCallBack: {
+      type: Function,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      imageUrl: "",
+      state: {
+        fileList: [],
+      },
+    };
+  },
+  methods: {
+    // 涓婁紶鎴愬姛
+    handleSuccess(response, file, fileList) {
+      console.log(response, file, fileList);
+      // 鍒ゆ柇锛屽鏋滆繑鍥�1锛屽氨鏄垚鍔�
+      if (response.status === 1) {
+        // this.imageUrl = URL.createObjectURL(file.raw);
+        // 濡傛灉鏂规硶瀛樺湪锛屽皢鎵ц
+        this.successCallBack && this.successCallBack(response.data);
+        // 鎻愮ず
+        this.$message({
+          message: "涓婁紶鎴愬姛",
+          type: "error",
+          duration: 1000, //鏄剧ず鏃堕棿
+        });
+      }
+    },
+    // 涓婁紶澶辫触
+    handleError(err, file, fileList) {
+      console.log(this.uploadAction, "this.uploadAction");
+      // 鎻愮ず
+      this.$message({
+        message: "涓婁紶澶辫触锛岃閲嶆柊涓婁紶",
+        type: "error",
+        duration: 1000, //鏄剧ず鏃堕棿
+      });
+    },
+    // 鍒犻櫎鍥剧墖
+    handleRemove(file, fileList) {
+      // 濡傛灉鐘舵�佺爜涓簊uccess
+      console.log((file, fileList));
+      this.successCallBack && this.successCallBack(null);
+    },
+    //鏂囦欢瓒呭嚭涓暟
+    handleExceed(files, fileList) {
+      // 鎻愮ず
+      this.$message({
+        message: "鍙兘涓婁紶涓�寮犲浘鐗�",
+        type: "info",
+        duration: 1000, //鏄剧ず鏃堕棿
+      });
+      console.log(files, fileList);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  border: 1px solid #dcdfe6;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/upload/excel.vue b/src/components/upload/excel.vue
new file mode 100644
index 0000000..b6ae41f
--- /dev/null
+++ b/src/components/upload/excel.vue
@@ -0,0 +1,147 @@
+<template>
+  <div>
+    <!-- 瀵煎叆瀵硅瘽妗� -->
+    <el-dialog
+      :title="title"
+      :visible.sync="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="headers"
+        :action="url"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :on-error="handleFileError"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+          <em>鐐瑰嚮涓婁紶</em>
+        </div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+          <el-link
+            type="primary"
+            :underline="false"
+            style="font-size:12px;vertical-align: baseline;"
+            @click="downExcelTemp"
+            v-if="tempUrl"
+          >涓嬭浇妯℃澘
+          </el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+        <el-button @click="upload.open = false">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!--鏍¢獙澶辫触閿欒鏁版嵁-->
+    <el-dialog title="鏍¢獙澶辫触鏁版嵁" :visible.sync="errorVisible">
+      <el-table :data="errorData">
+        <el-table-column
+          property="lineNum"
+          label="琛屽彿"
+          width="50"
+        ></el-table-column>
+        <el-table-column
+          property="errors"
+          label="閿欒鎻忚堪"
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            <el-tag
+              type="danger"
+              v-for="error in scope.row.errors"
+              :key="error"
+            >{{ error }}
+            </el-tag
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import store from "@/store";
+
+export default {
+  name: "ExcelUpload",
+  components: {},
+  props: {
+    url: {
+      type: String
+    },
+    title: {
+      type: String
+    },
+    tempUrl: {
+      type: String
+    },
+    tempName: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      upload: {
+        open: false,
+        isUploading: false
+      },
+      errorVisible: false,
+      errorData: []
+    };
+  },
+  computed: {
+    headers: function () {
+      return {
+        Authorization: "Bearer " + store.getters.access_token
+      };
+    }
+  },
+  methods: {
+    downExcelTemp() {
+      this.downBlobFile(this.tempUrl, {}, this.tempName);
+    },
+    handleFileUploadProgress() {
+      this.upload.isUploading = true;
+    },
+    handleFileError() {
+      this.$message.error('涓婁紶澶辫触,鏁版嵁鏍煎紡涓嶅悎娉�!')
+      this.upload.open = false;
+    },
+    handleFileSuccess(response) {
+      this.upload.isUploading = false;
+      this.upload.open = false;
+      this.$refs.upload.clearFiles();
+      // 鏍¢獙澶辫触
+      if (response.code === 1) {
+        this.$message.error("瀵煎叆澶辫触锛屼互涓嬫暟鎹笉鍚堟硶");
+        this.errorVisible = true;
+        this.errorData = response.data;
+        this.$refs.upload.clearFiles();
+      } else {
+        this.$message.success("瀵煎叆鎴愬姛");
+        // 鍒锋柊琛ㄦ牸
+        this.$emit("refreshDataList");
+      }
+    },
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    show() {
+      this.upload.isUploading = false;
+      this.upload.open = true;
+    }
+  }
+};
+</script>
diff --git a/src/const/crud/admin/client.js b/src/const/crud/admin/client.js
new file mode 100644
index 0000000..12ce9ec
--- /dev/null
+++ b/src/const/crud/admin/client.js
@@ -0,0 +1,135 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+import {getObj} from '@/api/admin/client'
+
+const DIC = {
+  vaild: [{
+    label: '鍚�',
+    value: 'false'
+  }, {
+    label: '鏄�',
+    value: 'true'
+  }]
+}
+
+var validateClient = (rule, value, callback) => {
+  getObj(value).then(response => {
+    if (window.boxType === 'edit') {
+      return callback()
+    }
+    const result = response.data.data
+    if (result.length !== 0) {
+      callback(new Error('瀹㈡埛绔凡瀛樺湪'))
+    } else {
+      callback()
+    }
+  })
+}
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  searchMenuSpan: 6,
+  align: 'center',
+  column: [{
+    width: 150,
+    label: '缂栧彿',
+    prop: 'clientId',
+    align: 'center',
+    sortable: true,
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏lientId',
+      trigger: 'blur'
+    }, {validator: validateClient, trigger: 'blur'}]
+  }, {
+    label: '瀵嗛挜',
+    prop: 'clientSecret',
+    align: 'center',
+    sortable: true,
+    overHidden: true,
+    width: 120,
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏lientSecret',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鍩�',
+    prop: 'scope',
+    align: 'center',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏cope',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鎺堟潈妯″紡',
+    prop: 'authorizedGrantTypes',
+    align: 'center',
+    overHidden: true,
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ユ巿鏉冩ā寮�',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鍥炶皟鍦板潃',
+    prop: 'webServerRedirectUri',
+    align: 'center',
+    hide: true
+  }, {
+    label: '鏉冮檺',
+    prop: 'authorities',
+    align: 'center',
+    hide: true
+  }, {
+    label: '鑷姩鏀捐',
+    prop: 'autoapprove',
+    align: 'center',
+    type: 'radio',
+    border: true,
+    dicData: DIC.vaild,
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨鏄惁鏀捐',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '浠ょ墝鏃舵晥',
+    prop: 'accessTokenValidity',
+    align: 'center',
+  }, {
+    label: '鍒锋柊鏃舵晥',
+    prop: 'refreshTokenValidity',
+    align: 'center',
+  }, {
+    label: '鎵╁睍淇℃伅',
+    prop: 'additionalInformation',
+    align: 'center',
+    hide: true
+  }, {
+    label: '璧勬簮ID',
+    prop: 'resourceIds',
+    align: 'center',
+    hide: true
+  }]
+}
diff --git a/src/const/crud/admin/dict.js b/src/const/crud/admin/dict.js
new file mode 100644
index 0000000..1b2094c
--- /dev/null
+++ b/src/const/crud/admin/dict.js
@@ -0,0 +1,125 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  refreshBtn: false,
+  showClomnuBtn: false,
+  searchMenuSpan: 6,
+  searchSize: 'mini',
+  column: [{
+    label: '绫诲瀷',
+    prop: 'type',
+    search: true,
+    editDisabled: true,
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ュ瓧鍏哥被鍨�',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鎻忚堪',
+    prop: 'description',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ュ瓧鍏告弿杩�',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '瀛楀吀绫诲瀷',
+    prop: 'systemFlag',
+    type: 'radio',
+    dicUrl: '/admin/dict/type/dict_type',
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨瀛楀吀绫诲瀷',
+      trigger: 'blur'
+    }],
+    search: true
+  }, {
+    label: '澶囨敞淇℃伅',
+    prop: 'remark'
+  }, {
+    width: 150,
+    label: '鍒涘缓鏃堕棿',
+    prop: 'createTime',
+    type: 'datetime',
+    addDisplay: false,
+    editDisabled: true,
+    format: 'yyyy-MM-dd HH:mm',
+    valueFormat: 'yyyy-MM-dd HH:mm:ss'
+  }]
+}
+
+export const tableDictItemOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  refreshBtn: false,
+  showClomnuBtn: false,
+  searchSize: 'mini',
+  column: [{
+    label: '绫诲瀷',
+    prop: 'type',
+    addDisabled: true,
+    editDisabled: true
+  }, {
+    width: 150,
+    label: '鏁版嵁鍊�',
+    prop: 'value',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ユ暟鎹��',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鏍囩鍚�',
+    prop: 'label',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ユ爣绛惧悕',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鎻忚堪',
+    prop: 'description',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ュ瓧鍏告弿杩�',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鎺掑簭',
+    prop: 'sortOrder',
+    type: 'number',
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ユ帓搴�',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '澶囨敞淇℃伅',
+    prop: 'remark'
+  }]
+}
diff --git a/src/const/crud/admin/file.js b/src/const/crud/admin/file.js
new file mode 100644
index 0000000..c53932c
--- /dev/null
+++ b/src/const/crud/admin/file.js
@@ -0,0 +1,96 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  viewBtn:false,
+  searchMenuSpan: 6,
+  editBtn:false,
+  saveBtn: false,
+  addBtn: true,
+  column: [
+	  {
+      label: '缂栧彿',
+      prop: 'id',
+      hide: true,
+      addDisplay: false
+    },
+    {
+      hide: true,
+      label: '闄勪欢涓婁紶',
+      prop: 'imgUrl',
+      type: 'upload',
+      loadText: '闄勪欢涓婁紶涓紝璇风◢绛�',
+      span: 24,
+      propsHttp: {
+        res: 'data'
+      },
+      tip: '涓婁紶鍚屾鑷虫枃浠舵湇鍔″櫒',
+      action: "/admin/sys-file/upload"
+    },
+    {
+      label: '绌洪棿',
+      prop: 'bucketName',
+      overHidden:true,
+      addDisplay: false
+    },
+	  {
+      label: '鏂囦欢鍚�',
+      prop: 'fileName',
+      overHidden:true,
+      search: true,
+      addDisplay: false
+    },
+	  {
+      label: '鍘熸枃浠跺悕',
+      prop: 'original',
+      overHidden:true,
+      addDisplay: false
+    },
+	  {
+      label: '鏂囦欢绫诲瀷',
+      prop: 'type',
+      addDisplay: false
+    },
+	  {
+      label: '鏂囦欢澶у皬',
+      prop: 'fileSize',
+      addDisplay: false
+    },
+    {
+      label: '涓婁紶浜�',
+      prop: 'createBy',
+      addDisplay: false
+    },
+    {
+      width: 180,
+      label: '鍒涘缓鏃堕棿',
+      prop: 'createTime',
+      type: 'datetime',
+      format: 'yyyy-MM-dd HH:mm',
+      valueFormat: 'yyyy-MM-dd HH:mm:ss',
+      editDisabled: true,
+      addDisplay: false,
+      span: 24,
+    }
+  ]
+}
diff --git a/src/const/crud/admin/log.js b/src/const/crud/admin/log.js
new file mode 100644
index 0000000..137c216
--- /dev/null
+++ b/src/const/crud/admin/log.js
@@ -0,0 +1,74 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  menuWidth: 150,
+  align: 'center',
+  refreshBtn: true,
+  searchMenuSpan: 6,
+  showClomnuBtn: false,
+  searchSize: 'mini',
+  addBtn: false,
+  editBtn: false,
+  viewBtn: true,
+  props: {
+    label: 'label',
+    value: 'value'
+  },
+  column: [{
+    label: '绫诲瀷',
+    prop: 'type',
+    type: 'select',
+    dicUrl: '/admin/dict/type/log_type',
+    search: true
+  }, {
+    label: '鏍囬',
+    prop: 'title'
+  }, {
+    label: 'IP鍦板潃',
+    prop: 'remoteAddr'
+  }, {
+    label: '璇锋眰鏂瑰紡',
+    prop: 'method'
+  }, {
+    label: '瀹㈡埛绔�',
+    prop: 'serviceId'
+  }, {
+    width: 80,
+    label: '璇锋眰鏃堕棿',
+    prop: 'time'
+  }, {
+    width: 150,
+    label: '鍒涘缓鏃堕棿',
+    prop: 'createTime',
+    type: 'datetime',
+    format: 'yyyy-MM-dd HH:mm',
+    valueFormat: 'yyyy-MM-dd HH:mm:ss',
+    rangeSeparator: '-',
+    search: true,
+    searchRange: true
+  }, {
+    width: 180,
+    label: '寮傚父鏃ュ織',
+    prop: 'exception',
+    hide: true
+  }]
+}
diff --git a/src/const/crud/admin/post.js b/src/const/crud/admin/post.js
new file mode 100644
index 0000000..548e3b9
--- /dev/null
+++ b/src/const/crud/admin/post.js
@@ -0,0 +1,57 @@
+export const tableOption = {
+  "border": true,
+  "index": true,
+  "indexLabel": "搴忓彿",
+  "stripe": true,
+  addBtn: false,
+  "menuAlign": "center",
+  "align": "center",
+  "searchMenuSpan": 6,
+  dialogWidth: '50%',
+  "column": [
+    {
+      "type": "input",
+      "label": "宀椾綅鍚嶇О",
+      "prop": "postName",
+      span: 24,
+      rules: [{
+        required: true,
+        message: '璇疯緭鍏ュ矖浣嶅悕绉�',
+        trigger: 'blur'
+      }]
+    },
+    {
+      "type": "input",
+      "label": "宀椾綅鏍囪瘑",
+      "prop": "postCode",
+      span: 24,
+      rules: [{
+        required: true,
+        message: '璇疯緭鍏ュ矖浣嶆爣璇�',
+        trigger: 'blur'
+      }]
+    },
+    {
+      "type": "textarea",
+      "label": "宀椾綅鎻忚堪",
+      "prop": "remark",
+      "hide":true,
+      span: 24
+    },
+    {
+      "type": "input-number",
+      "label": "宀椾綅鎺掑簭",
+      "prop": "postSort",
+      "hide":true,
+      span:6
+    },
+    {
+      "type": "input",
+      "label": "鍒涘缓鏃堕棿",
+      "prop": "createTime",
+      "addDisplay": false,
+      "editDisabled": true,
+      span: 24
+    }
+  ]
+}
diff --git a/src/const/crud/admin/role.js b/src/const/crud/admin/role.js
new file mode 100644
index 0000000..5d132d1
--- /dev/null
+++ b/src/const/crud/admin/role.js
@@ -0,0 +1,91 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  editBtn: false,
+  delBtn: false,
+  searchMenuSpan: 6,
+  menuWidth: 300,
+  dialogWidth: '50%',
+  align: 'center',
+  addBtn: false,
+  viewBtn: true,
+  column: [{
+    label: '瑙掕壊鍚嶇О',
+    prop: 'roleName',
+    span: 24,
+    rules: [{
+      required: true,
+      message: '瑙掕壊鍚嶇О涓嶈兘涓虹┖',
+      trigger: 'blur'
+    },
+      {
+        min: 3,
+        max: 20,
+        message: '闀垮害鍦� 3 鍒� 20 涓瓧绗�',
+        trigger: 'blur'
+      }]
+  }, {
+    width: 120,
+    label: '瑙掕壊鏍囪瘑',
+    prop: 'roleCode',
+    span: 24,
+    editDisabled: true,
+    rules: [{
+      required: true,
+      message: '瑙掕壊鏍囪瘑涓嶈兘涓虹┖',
+      trigger: 'blur'
+    },
+      {
+        min: 3,
+        max: 20,
+        message: '闀垮害鍦� 3 鍒� 20 涓瓧绗�',
+        trigger: 'blur'
+      }
+    ]
+  }, {
+    width: 150,
+    label: '瑙掕壊鎻忚堪',
+    prop: 'roleDesc',
+    overHidden: true,
+    span: 24,
+    rules: [{
+      required: true,
+      message: '瑙掕壊鎻忚堪涓嶈兘涓虹┖',
+      trigger: 'blur'
+    },
+      {
+        min: 3,
+        max: 100,
+        message: '闀垮害鍦� 3 鍒� 100 涓瓧绗�',
+        trigger: 'blur'
+      }]
+  }, {
+    label: '鍒涘缓鏃堕棿',
+    prop: 'createTime',
+    type: 'datetime',
+    format: 'yyyy-MM-dd HH:mm',
+    valueFormat: 'yyyy-MM-dd HH:mm:ss',
+    editDisplay: false,
+    addDisplay: false,
+    span: 24
+  }]
+}
diff --git a/src/const/crud/admin/sys-public-param.js b/src/const/crud/admin/sys-public-param.js
new file mode 100644
index 0000000..62b8f97
--- /dev/null
+++ b/src/const/crud/admin/sys-public-param.js
@@ -0,0 +1,111 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+import { rule } from "@/util/validateRules";
+
+import {getObj} from '@/api/admin/sys-public-param'
+
+
+var validateParam = (rule, value, callback) => {
+  getObj(value).then(response => {
+    if (window.boxType === 'edit') callback()
+    const result = response.data.data
+    if (result !== null) {
+      callback(new Error('鍙傛暟閿凡缁忓瓨鍦�'))
+    } else {
+      callback()
+    }
+  })
+}
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  searchMenuSpan: 6,
+  column: [
+    {
+      label: '鍚嶇О',
+      search: true,
+      prop: 'publicName',
+      rules: [
+        { required: true, message: '璇疯緭鍚嶇О', trigger: 'blur' },
+        { max: 30, message: '闀垮害鍦� 30 涓瓧绗�', trigger: 'blur' },
+        { validator: rule.validatorNameCn, trigger: 'blur'}
+      ]
+    },
+    {
+      label: '閿�',
+      prop: 'publicKey',
+      rules: [
+        { required: true, message: '璇疯緭鍏ラ敭', trigger: 'blur' },
+        { validator: rule.validatorKey, trigger: 'blur'},
+        { validator: validateParam, trigger: 'blur'},
+      ]
+
+    },
+    {
+      label: '鍊�',
+      overHidden: true,
+      prop: 'publicValue',
+      rules: [
+        { required: true, message: '璇疯緭鍏ュ��', trigger: 'blur' }
+      ]
+    },
+    {
+      label: '缂栫爜',
+      prop: 'validateCode'
+    },
+    {
+      label: '绫诲瀷',
+      prop: 'systemFlag',
+      type: 'select',
+      dicUrl: '/admin/dict/type/dict_type',
+      rules: [{
+        required: true,
+        message: '璇疯緭鍏ョ被鍨�',
+        trigger: 'blur'
+      }],
+      search: true
+    },
+    {
+      label: '鐘舵��',
+      prop: 'status',
+      width: 80,
+      type: 'select',
+      dicUrl: '/admin/dict/type/status_type',
+      rules: [
+        { required: true, message: '璇疯緭鍏ュ��', trigger: 'blur' }
+      ]
+    },
+    {
+      label: '绫诲瀷',
+      prop: 'publicType',
+      width: 80,
+      type: 'select',
+      dicUrl: '/admin/dict/type/param_type',
+      rules: [{
+        required: true,
+        message: '璇烽�夋嫨绫诲瀷',
+        trigger: 'blur'
+      }]
+    }
+    // 鐪佺暐 ...
+  ]
+}
diff --git a/src/const/crud/admin/token.js b/src/const/crud/admin/token.js
new file mode 100644
index 0000000..5ab2620
--- /dev/null
+++ b/src/const/crud/admin/token.js
@@ -0,0 +1,57 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  searchMenuSpan: 6,
+  viewBtn: false,
+  addBtn: false,
+  editBtn: false,
+  column: [{
+    label: '鐢ㄦ埛ID',
+    prop: 'id',
+    align: 'center',
+    slot: true
+  }, {
+    label: '鐢ㄦ埛鍚�',
+    prop: 'username',
+    align: 'center',
+    slot: true
+  },{
+    label: "瀹㈡埛绔�",
+    prop: "clientId",
+    align: "center"
+  }, {
+    label: '浠ょ墝',
+    prop: 'access_token',
+    align: 'center',
+    overHidden: true
+  }, {
+    label: '绫诲瀷',
+    prop: 'token_type',
+    align: 'center'
+  }, {
+    label: '杩囨湡鏃堕棿',
+    prop: 'expires_in',
+    align: 'center'
+  }]
+}
diff --git a/src/const/crud/admin/user.js b/src/const/crud/admin/user.js
new file mode 100644
index 0000000..c966c89
--- /dev/null
+++ b/src/const/crud/admin/user.js
@@ -0,0 +1,196 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+import {getDetails} from '@/api/admin/user'
+
+export const validateUsername = (rule, value, callback) => {
+  if (!value) {
+    return callback(new Error('璇疯緭鍏ョ敤鎴峰悕'))
+  }
+  getDetails(value).then(response => {
+    if (window.boxType === 'edit') callback()
+    let result = response.data.data
+    if (result !== null) {
+      callback(new Error('鐢ㄦ埛鍚嶅凡缁忓瓨鍦�'))
+    } else {
+      callback()
+    }
+  })
+}
+
+// 璁剧疆瀵嗙爜鏍¢獙瑙勫垯
+export const checkPassword = (rule, value, callback) => {
+  if (window.boxType === 'edit') {
+    return callback()
+  }
+  if (!value) {
+    callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+  } else if (value.length <= 6) {
+    callback(new Error('璇疯緭鍏�6浣嶄互涓婂瘑鐮�'))
+  } else {
+    callback()
+  }
+}
+
+// 璁剧疆鎵嬫満鍙风殑楠岃瘉瑙勫垯
+export const checkPhone = (rule, value, callback) => {
+  if (!value) {
+    callback(new Error('璇疯緭鍏ヨ仈绯绘柟寮�'))
+  } else {
+    const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
+    if (reg.test(value)) {
+      callback()
+    } else {
+      return callback(new Error('璇疯緭鍏ユ纭殑鐢佃瘽'))
+    }
+  }
+}
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  searchMenuSpan: 6,
+  dialogWidth: '50%',
+  editBtn: false,
+  delBtn: false,
+  align: 'center',
+  addBtn: false,
+  column: [{
+    fixed: true,
+    label: 'id',
+    prop: 'userId',
+    span: 24,
+    hide: true,
+    editDisplay: false,
+    addDisplay: false
+  }, {
+    fixed: true,
+    label: '鐢ㄦ埛鍚�',
+    prop: 'username',
+    editDisabled: true,
+    slot: true,
+    search: true,
+    span: 24,
+    rules: [{
+      required: true,
+      message: '璇疯緭鍏ョ敤鎴峰悕'
+    },
+      {
+        min: 3,
+        max: 20,
+        message: '闀垮害鍦� 3 鍒� 20 涓瓧绗�',
+        trigger: 'blur'
+      },
+      {validator: validateUsername, trigger: 'blur'}
+    ]
+  }, {
+    label: '瀵嗙爜',
+    prop: 'password',
+    type: 'password',
+    value: '',
+    hide: true,
+    span: 24,
+    rules: [{validator: checkPassword, trigger: 'blur'}]
+  }, {
+    label: '鎵�灞為儴闂�',
+    prop: 'deptId',
+    formslot: true,
+    slot: true,
+    span: 24,
+    hide: true,
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨閮ㄩ棬',
+      trigger: 'change'
+    }]
+  }, {
+    label: '鎵嬫満鍙�',
+    prop: 'phone',
+    value: '',
+    span: 24,
+    rules: [{
+      required: true,
+      message: '鎵嬫満鍙蜂笉鑳戒负绌�',
+      trigger: 'blur'
+    }, {
+      validator: checkPhone,
+      trigger: 'blur'
+    }]
+  }, {
+    label: '瑙掕壊',
+    prop: 'role',
+    formslot: true,
+    slot: true,
+    overHidden: true,
+    span: 24,
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨瑙掕壊',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '閮ㄩ棬',
+    prop: 'deptName',
+    overHidden: true,
+    addDisplay: false,
+    editDisplay: false,
+    span: 24,
+  }, {
+    label: '宀椾綅',
+    prop: 'post',
+    width: 168,
+    overHidden: true,
+    formslot: true,
+    slot: true,
+    span: 24,
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨宀椾綅',
+      trigger: 'blur'
+    }]
+  }, {
+    label: '鐘舵��',
+    prop: 'lockFlag',
+    type: 'radio',
+    slot: true,
+    border: true,
+    span: 24,
+    rules: [{
+      required: true,
+      message: '璇烽�夋嫨鐘舵��',
+      trigger: 'blur'
+    }],
+    dicData: [{
+      label: '鏈夋晥',
+      value: '0'
+    }, {
+      label: '閿佸畾',
+      value: '9'
+    }]
+  }, {
+    width: 120,
+    label: '鍒涘缓鏃堕棿',
+    prop: 'createTime',
+    type: 'datetime',
+    format: 'yyyy-MM-dd',
+    editDisabled: true,
+    addDisplay: false,
+    span: 24
+  }]
+}
diff --git a/src/const/crud/gen/form.js b/src/const/crud/gen/form.js
new file mode 100644
index 0000000..818c6af
--- /dev/null
+++ b/src/const/crud/gen/form.js
@@ -0,0 +1,57 @@
+/*
+ *    Copyright (c) 2018-2025, test All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: test
+ */
+
+export const tableOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  viewBtn: true,
+  editBtn: false,
+  addBtn: false,
+  searchMenuSpan: 6,
+  column: [
+    {
+      label: 'ID',
+      prop: 'id',
+      hide: true,
+    },
+    {
+      label: '琛ㄥ悕绉�',
+      prop: 'tableName'
+    },
+    {
+      label: '鍒涘缓鏃堕棿',
+      prop: 'createTime',
+      type: 'datetime',
+      format: 'yyyy-MM-dd HH:mm:ss',
+      valueFormat: 'yyyy-MM-dd HH:mm:ss'
+    },
+    {
+      label: '琛ㄥ崟淇℃伅',
+      prop: 'formInfo',
+      overHidden: true,
+      width: 500,
+      type: 'textarea',
+      minRows: 3,
+      row: true,
+      span: 24
+    }
+  ]
+}
diff --git a/src/const/crud/gen/gen.js b/src/const/crud/gen/gen.js
new file mode 100644
index 0000000..e247ba9
--- /dev/null
+++ b/src/const/crud/gen/gen.js
@@ -0,0 +1,227 @@
+/*
+ *    Copyright (c) 2018-2025, test All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the jxkg4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: test
+ */
+
+/**
+ *
+ * @param {鏍¢獙鏁版嵁婧愬悕} rule
+ * @param {*} value
+ * @param {*} callback
+ */
+var validateDsName = (rule, value, callback) => {
+  var re = /(?=.*[a-z])(?=.*_)/;
+  if (value && (!(re).test(value))) {
+    callback(new Error('鏁版嵁婧愬悕绉颁笉鍚堟硶, 缁勫悕_鏁版嵁婧愬悕褰㈠紡'))
+  } else {
+    callback()
+  }
+}
+
+export const tableOption = {
+  selection: true,
+  border: true,
+  index: true,
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  addBtn: false,
+  editBtn: false,
+  delBtn: false,
+  searchMenuSpan: 6,
+  column: [{
+    label: '琛ㄥ悕绉�',
+    prop: 'tableName',
+    align: 'center'
+  }, {
+    label: '琛ㄦ敞閲�',
+    prop: 'tableComment',
+    align: 'center'
+  }, {
+    label: '琛ㄧ紪鐮�',
+    prop: 'tableCollation',
+    align: 'center'
+  }, {
+    label: '绱㈠紩',
+    prop: 'engine',
+    align: 'center'
+  }, {
+    type: 'datetime',
+    valueFormat: 'timestamp',
+    format: 'yyyy-MM-dd hh:mm:ss',
+    label: '鍒涘缓鏃堕棿',
+    prop: 'createTime',
+    align: 'center'
+  }]
+}
+
+export const formOption = {
+  submitBtn: false,
+  emptyBtn: false,
+  submitText: '鐢熸垚',
+  column: [
+    {
+      label: '琛ㄥ悕绉�',
+      prop: 'tableName',
+      disabled: true
+    }, {
+      label: '鍖呭悕',
+      prop: 'packageName',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '浣滆��',
+      prop: 'author',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '妯″潡',
+      prop: 'moduleName',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '琛ㄥ墠缂�',
+      prop: 'tablePrefix',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '娉ㄩ噴',
+      prop: 'comments',
+      placeholder: '鍙负绌猴紝鍔犺浇琛ㄥ娉�'
+    }, {
+      label: '鍓嶇椋庢牸',
+      prop: 'style',
+      type: 'radio',
+      border: true,
+      span: 24,
+      dicData: [{
+        label: '鍘熺敓ELEMENT',
+        value: '1'
+      }, {
+        label: '鏁版嵁椹卞姩AVUE',
+        value: '0'
+      }]
+    }
+  ]
+}
+export const formBatchOption = {
+  submitText: '鐢熸垚',
+  column: [
+    {
+      label: '琛ㄥ悕绉�',
+      prop: 'tableName',
+      disabled: true,
+      minRows: 2,
+      type: 'textarea',
+      row: true,
+      span: 24
+    },
+    {
+      label: '鍖呭悕',
+      prop: 'packageName',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '浣滆��',
+      prop: 'author',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '妯″潡',
+      prop: 'moduleName',
+      placeholder: '鍙负绌猴紝鍔犺浇绯荤粺榛樿閰嶇疆'
+    }, {
+      label: '娉ㄩ噴',
+      prop: 'comments',
+      placeholder: '鍙负绌猴紝鍔犺浇琛ㄥ娉�'
+    }, {
+      label: '鍓嶇椋庢牸',
+      prop: 'style',
+      type: 'radio',
+      span: 24,
+      border: true,
+      dicData: [{
+        label: '鍘熺敓ELEMENT',
+        value: '1'
+      }, {
+        label: '鏁版嵁椹卞姩AVUE',
+        value: '0'
+      }]
+    }
+  ]
+}
+
+export const tableDsOption = {
+  border: true,
+  index: true,
+  indexLabel: '搴忓彿',
+  stripe: true,
+  menuAlign: 'center',
+  align: 'center',
+  column: [
+    {
+      label: '涓婚敭',
+      prop: 'id',
+      hide: true,
+      addDisplay: false,
+      editDisplay: false
+    },
+    {
+      label: '鍚嶇О',
+      prop: 'name',
+      rules: [
+        {required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur'},
+        {max: 32, message: '闀垮害鍦� 32 涓瓧绗�', trigger: 'blur'},
+        {validator: validateDsName, trigger: 'blur'}
+      ]
+    },
+    {
+      label: 'jdbcUrl',
+      prop: 'url',
+      type: 'textarea',
+      span: 24,
+      row: true,
+      minRows: 2,
+      overHidden: true,
+      rules: [
+        {required: true, message: '璇疯緭鍏dbcUrl', trigger: 'blur'}
+      ]
+    },
+    {
+      label: '鐢ㄦ埛鍚�',
+      prop: 'username',
+      rules: [
+        {required: true, message: '璇疯緭鍏ョ敤鎴峰悕', trigger: 'blur'},
+        {max: 64, message: '闀垮害鍦� 64 涓瓧绗�', trigger: 'blur'}
+      ]
+    },
+    {
+      label: '瀵嗙爜',
+      prop: 'password',
+      rules: [
+        {required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur'},
+        {max: 64, message: '闀垮害鍦� 64 涓瓧绗�', trigger: 'blur'}
+      ]
+    },
+    {
+      label: '鍒涘缓鏃堕棿',
+      prop: 'createTime',
+      addDisplay: false,
+      editDisplay: false,
+      overHidden: true
+    },
+    {
+      label: '鏇存柊鏃堕棿',
+      prop: 'updateTime',
+      overHidden: true,
+      addDisplay: false,
+      editDisplay: false
+    }
+  ]
+}
diff --git a/src/const/errorCode.js b/src/const/errorCode.js
new file mode 100644
index 0000000..75e0301
--- /dev/null
+++ b/src/const/errorCode.js
@@ -0,0 +1,13 @@
+export default {
+  '000': '鎿嶄綔澶绻侊紝璇峰嬁閲嶅璇锋眰',
+  '401': '褰撳墠鎿嶄綔娌℃湁鏉冮檺',
+  '403': '褰撳墠鎿嶄綔娌℃湁鏉冮檺',
+  '404': '璧勬簮涓嶅瓨鍦�',
+  '417': '鏈粦瀹氱櫥褰曡处鍙凤紝璇蜂娇鐢ㄥ瘑鐮佺櫥褰曞悗缁戝畾',
+  '423': '婕旂ず鐜涓嶈兘鎿嶄綔锛屽闇�浜嗚В鑱旂郴鍐峰喎',
+  '426': '鐢ㄦ埛鍚嶄笉瀛樺湪鎴栧瘑鐮侀敊璇�',
+  '428': '楠岃瘉鐮侀敊璇�,璇烽噸鏂拌緭鍏�',
+  '429': '璇锋眰杩囬绻�',
+  '479': '婕旂ず鐜锛屾病鏈夋潈闄愭搷浣�',
+  'default': '绯荤粺鏈煡閿欒,璇峰弽棣堢粰绠$悊鍛�'
+}
diff --git a/src/const/iconList.js b/src/const/iconList.js
new file mode 100644
index 0000000..90efcee
--- /dev/null
+++ b/src/const/iconList.js
@@ -0,0 +1,47 @@
+export default [
+  {
+    label: '闃块噷浜戝浘鏍�',
+    list: [
+      'icon-quanxianguanli',
+      'icon-yonghuguanli',
+      'icon-jiaoseguanli',
+      'icon-web-icon-',
+      'icon-xitongguanli',
+      'icon-rizhiguanli',
+      'icon-navicon-zdgl',
+      'icon-weibiaoti46',
+      'icon-miyue',
+      'icon-shouji',
+      'icon-miyue',
+      'icon-denglvlingpai',
+      'icon-luyou',
+      'icon-msnui-supervise',
+      'icon-server',
+      'icon-wendang',
+      'icon-gtsquanjushiwufuwuGTS',
+      'icon-caidanguanli',
+      'icon-guanwang',
+      'icon-guanwangfangwen',
+      'icon-guiji',
+      'icon-fensiguanli',
+      'icon-gongzhonghao',
+      'icon-anniu_weixincaidanlianjie',
+      'icon-weixincaidan',
+      'icon-xiaoxiguanli',
+      'icon-zhexiantu',
+      'icon-canshu',
+      'icon-erji-zuhushouye',
+      'icon-pay6zhifu',
+      'icon-zhifuqudaoguanli',
+      'icon-dingdan',
+      'icon-tuikuan',
+      'icon-webicon14',
+      'icon-shouyintai',
+      'icon-wenjianguanli',
+      'icon-mysql',
+      'icon-shejiyukaifa-',
+      'icon-record',
+      'icon-biaodanbiaoqian'
+    ]
+  }
+]
diff --git a/src/const/website.js b/src/const/website.js
new file mode 100644
index 0000000..186e062
--- /dev/null
+++ b/src/const/website.js
@@ -0,0 +1,35 @@
+export default {
+  year: "2022", // 棣栭〉鏄剧ず鐨勬椂闂�
+  version: "v3.4.8", // 鎺у埗棣栭〉鏄剧ず鐨勭増鏈彿
+  logo: "Jxkg",   // 渚ц竟鏍忔悳绱㈢殑鏃跺�欓《閮ㄥ睍绀虹殑鏂囨
+  key: "jxkg", //閰嶇疆涓婚敭,鐩墠鐢ㄤ簬瀛樺偍
+  title: "姹熻タ绌虹",
+  register: true, //鏄惁寮�鍚敞鍐�
+  formLoginClient: 'pig:pig',// 鐢ㄦ埛鍚嶅瘑鐮佺櫥褰曠殑 client 淇℃伅
+  smsLoginClient: 'app:app',// 楠岃瘉鐮佺櫥褰曠殑 client 淇℃伅
+  remainingTime: 1800000, // token 鍓╀綑澶氬皯姣鎵ц鍒锋柊
+  whiteList: ["/login", "/404", "/401", "/lock"], // 閰嶇疆鏃犳潈闄愬彲浠ヨ闂殑椤甸潰
+  whiteTagList: ["/login", "/404", "/401", "/lock"], // 閰嶇疆涓嶆坊鍔爐ags椤甸潰 锛�'/advanced-router/mutative-detail/*'鈥斺��*涓洪�氶厤绗︼級
+  lockPage: "/lock",
+  tokenTime: 6000,
+  statusWhiteList: [428],
+  // 閰嶇疆棣栭〉涓嶅彲鍏抽棴
+  isFirstPage: false,
+  fistPage: {
+    label: "棣栭〉",
+    value: "/dashboard/index",
+    params: {},
+    query: {},
+    group: [],
+    close: false
+  },
+  // 閰嶇疆鑿滃崟鐨勫睘鎬�
+  menu: {
+    props: {
+      label: "label",
+      path: "path",
+      icon: "icon",
+      children: "children"
+    }
+  }
+};
diff --git a/src/design/index.scss b/src/design/index.scss
new file mode 100644
index 0000000..974f2dc
--- /dev/null
+++ b/src/design/index.scss
@@ -0,0 +1 @@
+@import './style.scss';
diff --git a/src/design/style.css b/src/design/style.css
new file mode 100644
index 0000000..fc59a6b
--- /dev/null
+++ b/src/design/style.css
@@ -0,0 +1,77 @@
+@charset "UTF-8";
+.c0 {
+  background-image: url("../assets/img/loginBackground.jpg");
+  height: 100vh;
+  background-size: cover;
+}
+
+.c {
+  width: 100vw;
+  height: 100%;
+}
+
+.bg {
+  width: 100%;
+  height: 100vh;
+  background: rgba(255, 255, 255, 0.2);
+  display: flex;
+  justify-content: center;
+}
+
+.main {
+  margin-top: 70px;
+}
+
+.main .main-title {
+  border-left: 5px solid #1047f7;
+  padding-left: 10px;
+  margin: 20px 0;
+  position: relative;
+}
+
+.main .main-title p {
+  font-weight: 700;
+}
+
+.deepBlue {
+  background: #1047f7;
+  color: white;
+  border: none;
+}
+
+.deepBlue:hover {
+  background-color: #2d5cf8;
+  color: white;
+}
+
+.flex {
+  display: flex;
+}
+
+.back {
+  position: absolute;
+  top: 0px;
+  left: -30px;
+  cursor: pointer;
+}
+
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+
+/* //element-ui table鐨勫幓闄ゅ彸渚ф粴鍔ㄦ潯鐨勬牱寮� */
+::-webkit-scrollbar {
+  width: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: #666;
+}
+
+ul, li {
+  list-style: none;
+}
diff --git a/src/design/style.min.css b/src/design/style.min.css
new file mode 100644
index 0000000..7bc4c33
--- /dev/null
+++ b/src/design/style.min.css
@@ -0,0 +1 @@
+.c0{background-image:url("../assets/img/loginBackground.jpg");height:100vh;background-size:cover}.c{width:100vw;height:100%}.bg{width:100%;height:100vh;background:rgba(255,255,255,0.2);display:flex;justify-content:center}.main{margin-top:70px}.main .main-title{border-left:5px solid #1047f7;padding-left:10px;margin:20px 0;position:relative}.main .main-title p{font-weight:700}.deepBlue{background:#1047f7;color:white;border:none}.deepBlue:hover{background-color:#2d5cf8;color:white}.flex{display:flex}.back{position:absolute;top:0px;left:-30px;cursor:pointer}.content{width:1262px;margin-bottom:80px;background-color:#fff;padding:20px 40px;border-radius:10px}::-webkit-scrollbar{width:4px}::-webkit-scrollbar-thumb{background-color:#666}ul,li{list-style:none}
diff --git a/src/design/style.scss b/src/design/style.scss
new file mode 100644
index 0000000..dd05819
--- /dev/null
+++ b/src/design/style.scss
@@ -0,0 +1,81 @@
+// 鑳屾櫙鍥�
+.c0{
+        background-image:url('../assets/img/loginBackground.jpg');
+        height:100vh;
+        background-size: cover;
+}
+
+// 鑳屾櫙鍥�
+.c{
+    // background-image:url('../assets/img/loginBackground.jpg');
+    width:100vw;
+    height:100%;
+    // background-size: cover;
+}
+.bg{
+    width:100%;
+    height:100vh;
+    background: rgba(255,255,255,0.2);
+    display: flex;
+    justify-content: center;
+
+}
+
+.main{
+  margin-top: 70px;
+// 杩斿洖涓婁竴闋佺殑妯e紡
+.main-title {
+  border-left: 5px solid rgb(16, 71, 247);
+  padding-left: 10px;
+  margin: 20px 0;
+  position: relative;
+  & p {
+    font-weight: 700;
+  }
+}
+}
+
+// 鎸夐挳
+.deepBlue{
+    background:rgb(16,71,247);
+    color:white;
+    border:none;
+    &:hover{
+        background-color:rgb(45, 92, 248) ;
+        color:white;
+    }
+}
+.flex{
+    display: flex;
+}
+
+
+  .back {
+    position: absolute;
+    top: 0px;
+    left: -30px;
+    cursor: pointer;
+  }
+
+  // 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+
+/* //element-ui table鐨勫幓闄ゅ彸渚ф粴鍔ㄦ潯鐨勬牱寮� */
+::-webkit-scrollbar {
+  width: 4px;
+}
+// ::-webkit-scrollbar-track {
+//   background-color: #ccc;
+// }
+::-webkit-scrollbar-thumb {
+  background-color: #666;
+}
+ul,li{
+  list-style: none;
+}
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 5fd5250..a12d2ed 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -1,145 +1,376 @@
 <template>
-  <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
-
-    <div class="right-menu">
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-        <div class="avatar-wrapper">
-          <span>{{userName}}</span>
-          <i class="el-icon-caret-bottom" />
+  <div>
+    <div class="h">
+      <div class="h-title">
+        <img
+          src="@/assets/img/logo.jpg"
+          alt=""
+        >
+        <p>姹熻タ璇煶瑙嗛鍩硅绯荤粺</p>
+      </div>
+      <div class="h-list">
+        <div
+          class="h-list-con"
+          :class="titleNum == 1 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(1)"
+        >
+          绯荤粺棣栭〉
         </div>
-        <el-dropdown-menu slot="dropdown">
-          <router-link to="/profile/index">
-            <el-dropdown-item>涓汉淇℃伅</el-dropdown-item>
-          </router-link>
-          <router-link to="/">
-            <el-dropdown-item>涓婚〉</el-dropdown-item>
-          </router-link>
-          <el-dropdown-item  @click.native="logout"  divided>閫�鍑�</el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
+        <div
+          class="h-list-con"
+          :class="titleNum == 2 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(2)"
+        >
+          鑰冭瘯
+        </div>
+        <div
+          class="h-list-con"
+          :class="titleNum == 3 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(3)"
+        >
+          鏁欏
+        </div>
+        <div
+          class="h-list-con"
+          :class="titleNum == 4 ? ' h-list-con-act ' : ''"
+          @click="handleTitleNum(4)"
+        >
+          搴旂敤绠$悊
+        </div>
+      </div>
+      <div
+        style="width:210px; display:flex; align-items:center"
+        class="op"
+      >
+        <div>
+          <svg
+            t="1651734628449"
+            class="icon"
+            viewBox="0 0 1024 1024"
+            version="1.1"
+            xmlns="http://www.w3.org/2000/svg"
+            p-id="2227"
+            width="24"
+            height="24"
+          >
+            <path
+              d="M236.539274 477.852272c17.253966 0 31.233352-13.980409 31.233352-31.233352 0-110.680798 64.816215-197.723224 173.372629-232.82058 14.792914-4.77884 23.811312-19.713994 21.168112-35.026748-0.426719-2.480494-0.64059-4.900613-0.64059-7.197936 0-24.614607 22.683628-44.63457 50.561559-44.63457 27.858488 0 50.53086 20.018939 50.53086 44.63457 0 2.379187-0.203638 4.727675-0.599657 7.005554-2.745531 15.535835 6.537903 30.674627 21.615297 35.290761 110.202914 33.714869 173.402305 118.550023 173.402305 232.748948 0 17.253966 13.980409 31.233352 31.234375 31.233352s31.233352-13.980409 31.233352-31.233352c0-133.414569-72.349795-238.259452-194.876386-284.724717-5.174859-54.537104-53.673433-97.422843-112.541169-97.422843-59.062164 0-107.691721 43.149752-112.623034 97.921193-120.482025 47.999201-194.306404 154.959258-194.306404 284.226367C205.305923 463.871863 219.285309 477.852272 236.539274 477.852272z"
+              p-id="2228"
+              fill="#707070"
+            ></path>
+            <path
+              d="M819.911812 602.309842l0-55.889915c0-17.253966-13.980409-31.233352-31.233352-31.233352s-31.234375 13.980409-31.234375 31.233352l0 67.988464c0 7.80885 2.928702 15.34243 8.204869 21.097504 40.10951 43.780109 86.381369 99.497085 95.105055 116.89329-0.315178 10.827603-3.345188 13.552667-32.586163 13.552667L196.820668 765.951853c-26.983561 0-31.671327-7.259334-32.484855-13.735839 9.17087-17.701151 55.381331-73.072249 95.449909-116.669186 5.306866-5.765307 8.245801-13.30912 8.245801-21.137413l0-67.988464c0-17.253966-13.980409-31.233352-31.233352-31.233352s-31.233352 13.980409-31.233352 31.233352l0 55.848982C101.69617 716.315362 101.69617 737.829352 101.69617 748.300844c0 38.727023 24.991184 80.117712 95.124498 80.117712l631.347179 0c23.5166 0 95.094822 0 95.094822-80.117712C923.262668 737.788419 923.262668 716.202799 819.911812 602.309842z"
+              p-id="2229"
+              fill="#707070"
+            ></path>
+            <path
+              d="M400.99993 366.001835c-17.253966 0-31.233352 13.980409-31.233352 31.234375l0 30.470989c0 17.253966 13.980409 31.234375 31.233352 31.234375s31.234375-13.980409 31.234375-31.234375l0-30.470989C432.234305 379.982244 418.253896 366.001835 400.99993 366.001835z"
+              p-id="2230"
+              fill="#707070"
+            ></path>
+            <path
+              d="M623.957885 366.001835c-17.253966 0-31.234375 13.980409-31.234375 31.234375l0 30.470989c0 17.253966 13.980409 31.234375 31.234375 31.234375 17.253966 0 31.233352-13.980409 31.233352-31.234375l0-30.470989C655.19226 379.982244 641.21185 366.001835 623.957885 366.001835z"
+              p-id="2231"
+              fill="#707070"
+            ></path>
+            <path
+              d="M512.170892 598.435605c43.963281 0 75.105558-30.318516 86.574774-48.223305 9.222035-14.396895 5.03262-33.358759-9.242502-42.763966-14.305821-9.405207-33.593096-5.38873-43.159986 8.764618-0.132006 0.193405-13.614066 19.754926-34.172287 19.754926-19.989263 0-32.43369-18.117636-33.267685-19.378349-9.181103-14.407128-28.285207-18.809391-42.834574-9.750061-14.650675 9.099239-19.155269 28.356838-10.044774 43.007513C437.238272 567.892985 467.99374 598.435605 512.170892 598.435605z"
+              p-id="2232"
+              fill="#707070"
+            ></path>
+            <path
+              d="M601.661066 856.999498c-15.179724-8.225335-34.131355-2.593058-42.346457 12.576433-9.292644 17.142425-27.248597 27.79709-46.871517 27.79709-19.530822 0-37.476543-10.67513-46.830585-27.848255-8.256034-15.149025-27.217898-20.741393-42.366923-12.495592-15.149025 8.256034-20.741393 27.217898-12.495592 42.366923 20.304442 37.283138 59.275012 60.444651 101.6931 60.444651 42.560328 0 81.561597-23.180955 101.794407-60.494793C622.453624 884.176464 616.821347 865.224834 601.661066 856.999498z"
+              p-id="2233"
+              fill="#707070"
+            ></path>
+          </svg>
+        </div>
+        <div style="margin:0 30px;">
+          <svg
+            t="1651734671187"
+            class="icon"
+            viewBox="0 0 1024 1024"
+            version="1.1"
+            xmlns="http://www.w3.org/2000/svg"
+            p-id="3098"
+            width="24"
+            height="24"
+          >
+            <path
+              d="M511.175727 63.057151c-248.402463 0-449.734888 201.352891-449.734888 449.734888 0 248.387114 201.332425 449.740004 449.734888 449.740004 248.366647 0 449.738981-201.352891 449.738981-449.740004C960.914708 264.410042 759.542374 63.057151 511.175727 63.057151L511.175727 63.057151zM511.175727 925.048337c-227.684606 0-412.257322-184.564529-412.257322-412.256298 0-227.688699 184.573739-412.255275 412.257322-412.255275 227.687676 0 412.260391 184.566576 412.260391 412.255275C923.436118 740.482785 738.863403 925.048337 511.175727 925.048337L511.175727 925.048337zM511.175727 925.048337"
+              p-id="3099"
+              fill="#707070"
+            ></path>
+            <path
+              d="M477.49565 650.367371c-0.225127-7.990998-0.336668-13.950733-0.336668-17.922185 0-23.479761 3.347235-43.725874 9.984399-60.796668 4.874007-12.869099 12.757558-25.806759 23.588231-38.904055 7.938809-9.531074 22.288632-23.477714 42.989093-41.745776 20.703531-18.257829 34.196847-32.835849 40.384779-43.664475 6.183839-10.835789 9.29776-22.686698 9.29776-35.55989 0-23.252587-9.072633-43.72792-27.219945-61.309344-18.150382-17.581424-40.439014-26.423813-66.808592-26.423813-25.464975 0-46.734394 7.995091-63.805188 23.928992-17.068747 15.933901-28.242228 40.832987-33.573653 74.747401l-61.479213-7.313569c5.559623-45.428655 22.0062-80.195483 49.341778-104.355743 27.335578-24.159236 63.520709-36.238342 108.4899-36.238342 47.642067 0 85.638449 12.985756 113.998357 38.903032 28.354791 25.919323 42.533722 57.284681 42.533722 94.0357 0 21.264303-4.989641 40.886199-14.97404 58.809407-9.979282 17.921161-29.489638 39.755446-58.468646 65.448618-19.452028 17.353227-32.212656 30.05655-38.168298 38.280862-5.958712 8.224312-10.437723 17.58654-13.331633 28.247344-2.888793 10.662851-4.536316 27.897374-4.988618 51.836599l-57.45455 0L477.494627 650.367371 477.49565 650.367371z"
+              p-id="3100"
+              fill="#707070"
+            ></path>
+            <path
+              d="M473.811748 770.316254 473.811748 702.21011 541.923008 702.21011 541.923008 770.316254 473.811748 770.316254 473.811748 770.316254Z"
+              p-id="3101"
+              fill="#707070"
+            ></path>
+          </svg>
+        </div>
+        <!-- <div @click="handleSetting">
+          <img
+            src="https://img1.baidu.com/it/u=272523489,3471024224&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
+            style="width:24px;height:24px; border-radius:20px;"
+            alt=""
+          >
+        </div> -->
+        <el-dropdown
+          trigger="click"
+          placement="top"
+        >
+          <div>
+            <img
+              :src="avatar"
+              style="width:24px;height:24px; border-radius:20px;"
+              alt=""
+            >
+          </div>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="getMine('/mine')"
+                >
+                  涓汉璁剧疆
+                </div>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="getMine('/study-particulars')"
+                >
+                  瀛︿範妗f
+                </div>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <div
+                  class="setting-con"
+                  @click="() => checkCloseDialog = true"
+                >
+                  閫�鍑虹郴缁�
+                </div>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+
+      <!-- <div
+        class="setting"
+        :style="`height:${settingHeight}px`"
+        v-show="settingHeight !== 0"
+      >
+        <div
+          class="setting-con"
+          @click="getMine"
+        >
+          涓汉璁剧疆
+        </div>
+        <div
+          class="setting-con"
+          @click="() => checkCloseDialog = true"
+        >
+          閫�鍑虹郴缁�
+        </div>
+      </div> -->
     </div>
+    <s-dialog
+      v-model="checkCloseDialog"
+      style="z-index:2"
+      title="纭畾鍏抽棴绯荤粺锛�"
+      width="200px"
+    >
+      <div style="display:flex; justify-content:space-between; padding:10px 10px;">
+        <s-button
+          colorType="default"
+          size="small"
+          @click="() => checkCloseDialog = false"
+        >鍙栨秷</s-button>
+        <s-button
+          colorType="deepBlue"
+          size="small"
+          @click="closeSystem"
+        >纭畾</s-button>
+      </div>
+    </s-dialog>
   </div>
 </template>
 
 <script>
-import { mapGetters, mapMutations } from 'vuex'
-import loginApi from '@/api/login'
-import Breadcrumb from '@/components/Breadcrumb'
-import Hamburger from '@/components/Hamburger'
-
+import { mapGetters } from "vuex";
+// 娉ㄩ噴鍚庡彲娴忚鍣ㄦ祴璇�
+// import { app, ipcRenderer } from "electron";
 export default {
-  components: {
-    Breadcrumb,
-    Hamburger
-  },
-  computed: {
-    ...mapGetters([
-      'sidebar',
-      'device',
-      'userName'
-    ])
+  data () {
+    return {
+      // titleNum:1,
+      settingHeight: 0,
+      checkCloseDialog: false,
+      // 澶村儚
+      avatar: require("../../assets/img/avatarIcon.png"),
+    };
   },
   methods: {
-    toggleSideBar () {
-      this.$store.dispatch('app/toggleSideBar')
+    handleTitleNum(num) {
+      switch (num) {
+        case 1:
+          this.$router.push("/");
+          break;
+        case 2:
+          this.$router.push("/exam");
+          break;
+        case 3:
+          this.$router.push("/teach");
+          break;
+        case 4:
+          this.$router.push("/manage");
+        default:
+          break;
+      }
     },
-    logout () {
-      let _this = this
-      loginApi.logout().then(function (result) {
-        if (result && result.code === 1) {
-          _this.clearLogin()
-          _this.$router.push({ path: '/login' })
+    handleSetting() {
+      clearInterval(this.st);
+      this.t = setInterval(() => {
+        this.settingHeight += 2;
+        if (this.settingHeight >= 80) {
+          this.settingHeight = 80;
+          window.addEventListener("click", this.handleClick);
+          clearInterval(this.t);
         }
-      })
+      }, 1);
     },
-    ...mapMutations('user', ['clearLogin'])
-  }
-}
+    handleClick(e) {
+      if (e.target.className !== "setting-con" && this.settingHeight == 80) {
+        this.settinghidden();
+      }
+    },
+    settinghidden() {
+      document.removeEventListener("click", this.handleClick);
+      clearInterval(this.t);
+      this.st = setInterval(() => {
+        this.settingHeight -= 2;
+        if (this.settingHeight <= 0) {
+          this.settingHeight = 0;
+          clearInterval(this.st);
+        }
+      }, 1);
+    },
+    closeSystem() {
+      // _app.destroy()
+      //娉ㄩ噴鍚庡彲娴忚鍣ㄦ祴璇�
+      // ipcRenderer.send("closeWindow");
+      // app.quit();
+    },
+    // 涓汉璁剧疆
+    getMine(i) {
+      this.$router.push(i);
+    },
+  },
+  computed: {
+    ...mapGetters({
+      titleNum: "GET_HEADER_NUM",
+      userInfo: "userInfo",
+    }),
+  },
+  created() {
+    // this.titleNum = this.$store.getters.getHeader
+  },
+  mounted() {
+    console.log(this.$store);
+    // 璁剧疆澶村儚
+    this.avatar = this.userInfo.avatar ? this.userInfo.avatar : this.avatar;
+  },
+};
 </script>
 
-<style lang="scss" scoped>
-.navbar {
-  height: 50px;
+<style scoped lang="scss">
+.h {
+  width: 100vw;
+  background: white;
+  box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.2);
+  height: 75px;
+  display: flex;
+  justify-content: space-between;
+  position: fixed;
+  z-index: 999;
+  &-title {
+    display: flex;
+    align-items: center;
+    margin-left: 50px;
+
+    & img {
+      width: 50px;
+      height: 50px;
+    }
+  }
+
+  &-list {
+    // margin:0 auto;
+    display: flex;
+
+    &-con {
+      // width:
+      font-size: 20px;
+      line-height: 70px;
+      font-weight: 500;
+      color: #aaa;
+      margin: 0 50px;
+      cursor: pointer;
+
+      &-act {
+        border-bottom: 5px solid rgba(16, 71, 247, 1);
+
+        color: rgba(16, 71, 247, 1);
+      }
+    }
+  }
+}
+
+.setting {
+  position: absolute;
+  right: 69px;
+  top: 55px;
+  box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+  height: 80px;
   overflow: hidden;
-  position: relative;
-  background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
 
-  .hamburger-container {
-    line-height: 46px;
-    height: 100%;
-    float: left;
+  // &-con {
+  // width: 80px;
+  // height: 30px;
+
+  // background: white;
+  // cursor: pointer;
+  // text-align: center;
+  // line-height: 30px;
+  // padding: 5px 2px;
+
+  // &:hover {
+  //   background: rgb(240, 240, 240);
+  // }
+  // }
+}
+
+.op {
+  & div {
     cursor: pointer;
-    transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
-
-    &:hover {
-      background: rgba(0, 0, 0, .025)
-    }
   }
+}
 
-  .breadcrumb-container {
-    float: left;
-  }
-
-  .errLog-container {
-    display: inline-block;
-    vertical-align: top;
-  }
-
-  .right-menu {
-    float: right;
-    height: 100%;
-    line-height: 50px;
-
-    &:focus {
-      outline: none;
-    }
-
-    .right-menu-item {
-      display: inline-block;
-      padding: 0 8px;
-      height: 100%;
-      font-size: 18px;
-      color: #5a5e66;
-      vertical-align: text-bottom;
-
-      &.hover-effect {
-        cursor: pointer;
-        transition: background .3s;
-
-        &:hover {
-          background: rgba(0, 0, 0, .025)
-        }
-      }
-    }
-
-    .avatar-container {
-      margin-right: 30px;
-
-      .avatar-wrapper {
-        margin-top: 5px;
-        position: relative;
-
-        .user-avatar {
-          cursor: pointer;
-          width: 40px;
-          height: 40px;
-          border-radius: 10px;
-        }
-
-        .el-icon-caret-bottom {
-          cursor: pointer;
-          position: absolute;
-          right: -20px;
-          top: 25px;
-          font-size: 12px;
-        }
-      }
-    }
-  }
+// 涓嬫媺妗嗘牱寮�
+.example-showcase .el-dropdown + .el-dropdown {
+  margin-left: 15px;
+}
+.example-showcase .el-dropdown-link {
+  cursor: pointer;
+  color: var(--el-color-primary);
+  display: flex;
+  align-items: center;
 }
 </style>
diff --git a/src/layout/index.vue b/src/layout/index.vue
index 86d3b47..7a304f6 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -1,23 +1,18 @@
 <template>
   <div :class="classObj" class="app-wrapper">
     <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
-    <sidebar class="sidebar-container" />
-    <div  class="hasTagsView main-container">
-      <div class="fixed-header">
+    <div>
+      <div >
         <navbar />
-        <tags-view/>
       </div>
       <app-main />
-      <div class="foot-copyright">
-        <span>Copyright 漏2019-2024 姝︽眽鎬濈淮璺宠穬绉戞妧鏈夐檺鍏徃 鐗堟潈鎵�鏈�</span>
-      </div>
       <back-to-top :visibility-height="100" :back-position="0" transition-name="fade" ref="backTop"/>
     </div>
   </div>
 </template>
 
 <script>
-import { AppMain, Navbar, Sidebar, TagsView } from './components'
+import { AppMain, Navbar } from './components'
 import ResizeMixin from './mixin/ResizeHandler'
 import { mapState } from 'vuex'
 import BackToTop from '@/components/BackToTop'
@@ -26,8 +21,6 @@
   components: {
     AppMain,
     Navbar,
-    Sidebar,
-    TagsView,
     BackToTop
   },
   mixins: [ResizeMixin],
diff --git a/src/main.js b/src/main.js
index 4f3e6b0..6812e71 100644
--- a/src/main.js
+++ b/src/main.js
@@ -10,6 +10,7 @@
 import './icons' // icon
 import NProgress from 'nprogress' // progress bar
 import 'nprogress/nprogress.css' // progress bar style
+import './design/index.scss'
 
 Vue.use(Element, {
   size: 'medium' // set element-ui default size
diff --git a/src/router.js b/src/router.js
index b567245..42a63a2 100644
--- a/src/router.js
+++ b/src/router.js
@@ -36,234 +36,171 @@
       }
     ]
   },
-  {
-    path: '/user',
-    component: Layout,
-    name: 'UserPage',
-    meta: {
-      title: '鐢ㄦ埛绠$悊',
-      icon: 'users'
-    },
-    children: [
-      {
-        path: 'student/list',
-        component: () => import('@/views/user/student/list'),
-        name: 'UserStudentPageList',
-        meta: { title: '瀛︾敓鍒楄〃', noCache: true }
-      },
-      {
-        path: 'student/edit',
-        component: () => import('@/views/user/student/edit'),
-        name: 'UserStudentEdit',
-        meta: { title: '瀛︾敓缂栬緫', noCache: true, activeMenu: '/user/student/list' },
-        hidden: true
-      },
-      {
-        path: 'admin/list',
-        component: () => import('@/views/user/admin/list'),
-        name: 'UserAdminPageList',
-        meta: { title: '绠$悊鍛樺垪琛�', noCache: true }
-      },
-      {
-        path: 'admin/edit',
-        component: () => import('@/views/user/admin/edit'),
-        name: 'UserAdminEdit',
-        meta: { title: '绠$悊鍛樼紪杈�', noCache: true, activeMenu: '/user/admin/list' },
-        hidden: true
-      }
-    ]
-  },
+  // 寮�濮嬭�冭瘯
   {
     path: '/exam',
+    name: 'exam',
     component: Layout,
-    name: 'ExamPage',
-    meta: {
-      title: '鍗烽绠$悊',
-      icon: 'exam'
-    },
     children: [
       {
-        path: 'paper/list',
-        component: () => import('@/views/exam/paper/list'),
-        name: 'ExamPaperPageList',
-        meta: { title: '璇曞嵎鍒楄〃', noCache: true }
+        path: '/',
+        name: 'examIndex',
+        component: () => import('@/views/Exam/Exam.vue')
       },
       {
-        path: 'paper/edit',
-        component: () => import('@/views/exam/paper/edit'),
-        name: 'ExamPaperEdit',
-        meta: { title: '璇曞嵎缂栬緫', noCache: true, activeMenu: '/exam/paper/list' },
-        hidden: true
+        path: 'myexam',
+        name: 'myexam',
+        component: () => import('@/views/Exam/MyExam/MyExam.vue'),
+
       },
+      // 寮�濮嬭�冭瘯
       {
-        path: 'question/list',
-        component: () => import('@/views/exam/question/list'),
-        name: 'ExamQuestionPageList',
-        meta: { title: '棰樼洰鍒楄〃', noCache: true }
-      },
-      {
-        path: 'question/edit/singleChoice',
-        component: () => import('@/views/exam/question/edit/single-choice'),
-        name: 'singleChoicePage',
-        meta: { title: '鍗曢�夐缂栬緫', noCache: true, activeMenu: '/exam/question/list' },
-        hidden: true
-      },
-      {
-        path: 'question/edit/multipleChoice',
-        component: () => import('@/views/exam/question/edit/multiple-choice'),
-        name: 'multipleChoicePage',
-        meta: { title: '澶氶�夐缂栬緫', noCache: true, activeMenu: '/exam/question/list' },
-        hidden: true
-      },
-      {
-        path: 'question/edit/trueFalse',
-        component: () => import('@/views/exam/question/edit/true-false'),
-        name: 'trueFalsePage',
-        meta: { title: '鍒ゆ柇棰樼紪杈�', noCache: true, activeMenu: '/exam/question/list' },
-        hidden: true
-      },
-      {
-        path: 'question/edit/gapFilling',
-        component: () => import('@/views/exam/question/edit/gap-filling'),
-        name: 'gapFillingPage',
-        meta: { title: '濉┖棰樼紪杈�', noCache: true, activeMenu: '/exam/question/list' },
-        hidden: true
-      },
-      {
-        path: 'question/edit/shortAnswer',
-        component: () => import('@/views/exam/question/edit/short-answer'),
-        name: 'shortAnswerPage',
-        meta: { title: '绠�绛旈缂栬緫', noCache: true, activeMenu: '/exam/question/list' },
-        hidden: true
+        path: 'beginexam',
+        name: 'BeginExam',
+        component: () => import('@/views/Exam/MyExam/BeginExam.vue')
       }
+    ],
+  },
+  {
+    path: '/teach',
+    name: 'teach',
+    component: Layout,
+    children: [
+      {
+        path: '/',
+        name: 'examIndex',
+        component: () => import('@/views/Teach/Teach.vue')
+      },
     ]
   },
   {
-    path: '/task',
+    path: '/manage',
+    name: 'manage',
     component: Layout,
-    name: 'TaskPage',
-    meta: {
-      title: '浠诲姟绠$悊',
-      icon: 'task'
-    },
-    alwaysShow: true,
     children: [
+      // 搴旂敤绠$悊
       {
-        path: 'list',
-        component: () => import('@/views/task/list'),
-        name: 'TaskListPage',
-        meta: { title: '浠诲姟鍒楄〃', noCache: true }
+        path: '/',
+        name: 'manageIndex',
+        component: () => import('@/views/Manage/Manage.vue')
       },
+      // 鏁欏笀绠$悊
       {
-        path: 'edit',
-        component: () => import('@/views/task/edit'),
-        name: 'TaskEditPage',
-        meta: { title: '浠诲姟鍒涘缓', noCache: true }
-      }
-    ]
-  },
-  {
-    path: '/education',
-    component: Layout,
-    name: 'EducationPage',
-    meta: {
-      title: '鏁欒偛绠$悊',
-      icon: 'education'
-    },
-    alwaysShow: true,
-    children: [
-      {
-        path: 'subject/list',
-        component: () => import('@/views/education/subject/list'),
-        name: 'EducationSubjectPage',
-        meta: { title: '瀛︾鍒楄〃', noCache: true }
+        path: 'teacher-manage',
+        name: 'teacherManage',
+        component: () => import('@/views/Manage/Education/TeacherManage.vue')
       },
+      // 鏁欏笀浠嬬粛
       {
-        path: 'subject/edit',
-        component: () => import('@/views/education/subject/edit'),
-        name: 'EducationSubjectEditPage',
-        meta: { title: '瀛︾缂栬緫', noCache: true, activeMenu: '/education/subject/list' },
-        hidden: true
-      }
-    ]
-  },
-  {
-    path: '/answer',
-    component: Layout,
-    name: 'AnswerPage',
-    meta: {
-      title: '鎴愮哗绠$悊',
-      icon: 'answer'
-    },
-    alwaysShow: true,
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/answer/list'),
-        name: 'AnswerPageList',
-        meta: { title: '绛斿嵎鍒楄〃', noCache: true }
-      }
-    ]
-  },
-  {
-    path: '/message',
-    component: Layout,
-    name: 'MessagePage',
-    meta: {
-      title: '娑堟伅涓績',
-      icon: 'message'
-    },
-    alwaysShow: true,
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/message/list'),
-        name: 'MessageListPage',
-        meta: { title: '娑堟伅鍒楄〃', noCache: true }
+        path: 'teacher-detail',
+        name: 'teacherDetail',
+        component: () => import('@/views/Manage/Education/TeacherDetail.vue')
       },
+      // 鑰冨嫟璁板綍鏄庣粏
       {
-        path: 'send',
-        component: () => import('@/views/message/send'),
-        name: 'MessageSendPage',
-        meta: { title: '娑堟伅鍙戦��', noCache: true }
+        path: 'attendance-record',
+        name: 'attendanceRecord',
+        component: () => import('@/views/Manage/AttendanceRecord/index.vue')
+      },
+      // 鎴愮哗鏌ヨ
+      {
+        path: 'score-inquiry',
+        name: 'ScoreInquiry',
+        component: () => import('@/views/Manage/ScoreInquiry/index.vue')
+      },
+      // 瀛﹀垎璁$畻瑙勫垯
+      {
+        path: 'credit-hour',
+        name: 'CreditHour',
+        component: () => import('@/views/Manage/CreditHour/index.vue')
+      },
+      // 璇曞嵎绠$悊
+      {
+        path: 'test-paper',
+        name: 'TestPaper',
+        component: () => import('@/views/Manage/TestPaper/index.vue'),
+      },
+      // 棰樺簱绠$悊
+      {
+        path: 'question-bank',
+        name: 'QuestionBank',
+        component: () => import('@/views/Manage/TestPaper/QuestionBank.vue'),
+      },
+      // 璇曞嵎鐢熸垚
+      {
+        path: 'test-paper-generation',
+        name: 'TestPaperGeneration',
+        component: () => import('@/views/Manage/TestPaper/TestPaperGeneration.vue')
+      },
+      // 鐝骇绠$悊
+      {
+        path: 'class-management',
+        name: 'ClassManagement',
+        component: () => import('@/views/Manage/ClassManagement/index.vue'),
+        children: [
+          {
+            path: '/',
+            name: 'ClassManagementIndex',
+            component: () => import('@/views/Manage/ClassManagement/Class.vue')
+          }, {
+            path: 'Class-staff',
+            name: 'ClassStaff',
+            component: () => import('@/views/Manage/ClassManagement/ClassStaff.vue')
+          }
+        ]
+      },
+      // 鍙戝竷鍏憡
+      {
+        path: 'Announce',
+        name: 'announce',
+        component: () => import('@/views/Manage/Announce/index.vue'),
+      },
+      // 璇剧▼琛�
+      {
+        path: 'timetable',
+        name: 'Timetable',
+        component: () => import('@/views/Manage/Timetable/index.vue'),
+      },
+      // 鐢靛瓙閭欢
+      {
+        path: 'email',
+        name: 'Email',
+        component: () => import('@/views/Manage/Email/index.vue'),
+      },
+      // 鑰冭瘯绠$悊
+      {
+        path: 'examination-management',
+        name: 'ExaminationManagement',
+        component: () => import('@/views/Manage/ExaminationManagement/index.vue'),
       }
-    ]
+
+    ],
   },
+  // 涓汉璧勬枡
   {
-    path: '/log',
+    path: '/mine',
+    name: 'mine',
     component: Layout,
-    name: 'LogPage',
-    meta: {
-      title: '鏃ュ織涓績',
-      icon: 'log'
-    },
-    alwaysShow: true,
     children: [
       {
-        path: 'user/list',
-        component: () => import('@/views/log/list'),
-        name: 'LogUserPage',
-        meta: { title: '鐢ㄦ埛鏃ュ織', noCache: true }
+        path: '/mine',
+        name: 'mine',
+        component: () => import('@/views/mine/index.vue')
       }
     ]
   },
+  // 瀛︿範妗f
   {
-    path: '/profile',
+    path: '/study-particulars',
+    name: 'StudyParticulars',
     component: Layout,
-    hidden: true,
     children: [
       {
-        path: 'index',
-        component: () => import('@/views/profile/index'),
-        name: 'Profile',
-        meta: { title: '涓汉绠�浠�', icon: 'user', noCache: true }
+        path: '/study-particulars',
+        name: 'Study-particulars',
+        component: () => import('@/views/mine/StudyParticulars.vue')
       }
     ]
-  },
-  { path: '*',
-    hidden: true,
-    component: () => import('@/views/error-page/404'),
-    meta: { title: '404', noCache: true }
   }
 ]
 
diff --git a/src/utils/mock/home.js b/src/utils/mock/home.js
new file mode 100644
index 0000000..31f3709
--- /dev/null
+++ b/src/utils/mock/home.js
@@ -0,0 +1,32 @@
+const Mock = require('mockjs');
+let listStudent = Mock.mock({
+    // key 涓� studentsArr, value 涓轰竴涓暟缁勩�傛暟缁勪腑闅忔満鐢熸垚 10 涓璞�
+    "studentsArr|20": [{
+        // id 
+        "id|+1": 1,
+        // 闅忔満浜х敓涓�涓腑鏂囧悕
+        "name": "@cname()",
+        // 鐝骇
+        "className|1": ['楂樹簩锛�3锛夌彮', '楂樹簩锛�4锛夌彮', '楂樹簩锛�5锛夌彮', '楂樹簩锛�6锛夌彮', '楂樹簩锛�7锛夌彮', '楂樹簩锛�8锛夌彮', '楂樹笁锛�1锛夌彮', '楂樹笁锛�2锛夌彮', '楂樹笁锛�3锛夌彮', '楂樹笁锛�4锛夌彮', '楂樹笁锛�5锛夌彮', '楂樹笁锛�6锛夌彮', '楂樹笁锛�7锛夌彮', '楂樹笁锛�8锛夌彮', '楂樹竴锛�1锛夌彮', '楂樹竴锛�2锛夌彮', '楂樹竴锛�3锛夌彮', '楂樹竴锛�4锛夌彮', '楂樹竴锛�5锛夌彮', '楂樹竴锛�6锛夌彮', '楂樹竴锛�7锛夌彮', '楂樹竴锛�8锛夌彮'],
+        // 鍏ュ鏃堕棿
+        "inTime": "@date()",
+        // 闅忔満浜х敓涓�涓腑鏂囧悕
+        "teacher": "@cname()",
+    }]
+});
+let listTeacher = Mock.mock({
+    // key 涓� studentsArr, value 涓轰竴涓暟缁勩�傛暟缁勪腑闅忔満鐢熸垚 10 涓璞�
+    "TeachersArr|20": [{
+        // id 
+        "id|+1": 1,
+        // 闅忔満浜х敓涓�涓腑鏂囧悕
+        "name": "@cname()",
+        // 宸ラ緞
+        "workTIme|0-30": 1,
+        "students|0-999": 1,
+    }]
+});
+let countStudent = Mock.mock({
+    "countStudent|100-9999": 1,
+});
+export { listStudent, listTeacher, countStudent };
\ No newline at end of file
diff --git a/src/utils/store.js b/src/utils/store.js
new file mode 100644
index 0000000..d7a1544
--- /dev/null
+++ b/src/utils/store.js
@@ -0,0 +1,121 @@
+import {
+  validatenull
+} from '@/utils/validate';
+import website from '@/const/website';
+
+const keyName = website.key + '-';
+/**
+ * 瀛樺偍localStorage
+ */
+export const setStore = (params = {}) => {
+  let {
+    name,
+    content,
+    type,
+  } = params;
+  name = keyName + name;
+  let obj = {
+    dataType: typeof (content),
+    content: content,
+    type: type,
+    datetime: new Date().getTime()
+  };
+  if (type) window.sessionStorage.setItem(name, JSON.stringify(obj));
+  else window.localStorage.setItem(name, JSON.stringify(obj));
+};
+/**
+ * 鑾峰彇localStorage
+ */
+
+export const getStore = (params = {}) => {
+  let {
+    name,
+    debug
+  } = params;
+  name = keyName + name;
+  let obj = {},
+    content;
+  obj = window.sessionStorage.getItem(name);
+  if (validatenull(obj)) obj = window.localStorage.getItem(name);
+  if (validatenull(obj)) return;
+  try {
+    obj = JSON.parse(obj);
+  } catch {
+    return obj;
+  }
+  if (debug) {
+    return obj;
+  }
+  if (obj.dataType == 'string') {
+    content = obj.content;
+  } else if (obj.dataType == 'number') {
+    content = Number(obj.content);
+  } else if (obj.dataType == 'boolean') {
+    content = eval(obj.content);
+  } else if (obj.dataType == 'object') {
+    content = obj.content;
+  }
+  return content;
+};
+/**
+ * 鍒犻櫎localStorage
+ */
+export const removeStore = (params = {}) => {
+  let {
+    name,
+    type
+  } = params;
+  name = keyName + name;
+  if (type) {
+    window.sessionStorage.removeItem(name);
+  } else {
+    window.localStorage.removeItem(name);
+  }
+
+};
+
+/**
+ * 鑾峰彇鍏ㄩ儴localStorage
+ */
+export const getAllStore = (params = {}) => {
+  let list = [];
+  let {
+    type
+  } = params;
+  if (type) {
+    for (let i = 0; i <= window.sessionStorage.length; i++) {
+      list.push({
+        name: window.sessionStorage.key(i),
+        content: getStore({
+          name: window.sessionStorage.key(i),
+          type: 'session'
+        })
+      });
+    }
+  } else {
+    for (let i = 0; i <= window.localStorage.length; i++) {
+      list.push({
+        name: window.localStorage.key(i),
+        content: getStore({
+          name: window.localStorage.key(i),
+        })
+      });
+
+    }
+  }
+  return list;
+
+};
+
+/**
+ * 娓呯┖鍏ㄩ儴localStorage
+ */
+export const clearStore = (params = {}) => {
+  let { type } = params;
+  if (type) {
+    window.sessionStorage.clear();
+  } else {
+    window.localStorage.clear();
+  }
+
+};
diff --git a/src/utils/validate.js b/src/utils/validate.js
index 691c604..e4cc5d5 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -1,89 +1,255 @@
 /**
- * Created by PanJiaChen on 16/11/18.
+ * 閭
+ * @param {*} s
  */
-
-/**
- * @param {string} path
- * @returns {Boolean}
- */
-export function isExternal (path) {
-  return /^(https?:|mailto:|tel:)/.test(path)
+export function isEmail (s) {
+  return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
 }
 
 /**
- * @param {string} str
- * @returns {Boolean}
+ * 鎵嬫満鍙风爜
+ * @param {*} s
  */
-export function validUsername (str) {
-  // eslint-disable-next-line camelcase
+export function isMobile (s) {
+  return /^1[0-9]{10}$/.test(s)
+}
+
+/**
+ * 鐢佃瘽鍙风爜
+ * @param {*} s
+ */
+export function isPhone (s) {
+  return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
+}
+
+/**
+ * URL鍦板潃
+ * @param {*} s
+ */
+export function isURL (s) {
+  return /^http[s]?:\/\/.*/.test(s)
+}
+
+export function isvalidUsername (str) {
   const valid_map = ['admin', 'editor']
   return valid_map.indexOf(str.trim()) >= 0
 }
 
-/**
- * @param {string} url
- * @returns {Boolean}
- */
-export function validURL (url) {
-  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
-  return reg.test(url)
+/* 鍚堟硶uri */
+export function validateURL (textval) {
+  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+  return urlregex.test(textval)
 }
 
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validLowerCase (str) {
+/* 灏忓啓瀛楁瘝 */
+export function validateLowerCase (str) {
   const reg = /^[a-z]+$/
   return reg.test(str)
 }
 
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validUpperCase (str) {
+/* 澶у啓瀛楁瘝 */
+export function validateUpperCase (str) {
   const reg = /^[A-Z]+$/
   return reg.test(str)
 }
 
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validAlphabets (str) {
+/* 澶у皬鍐欏瓧姣� */
+export function validatAlphabets (str) {
   const reg = /^[A-Za-z]+$/
   return reg.test(str)
 }
 
-/**
- * @param {string} email
- * @returns {Boolean}
- */
-export function validEmail (email) {
-  // eslint-disable-next-line no-useless-escape
-  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
-  return reg.test(email)
+/* 楠岃瘉pad杩樻槸pc */
+export const vaildatePc = function () {
+  const userAgentInfo = navigator.userAgent
+  const Agents = ['Android', 'iPhone',
+    'SymbianOS', 'Windows Phone',
+    'iPad', 'iPod'
+  ]
+  let flag = true
+  for (var v = 0; v < Agents.length; v++) {
+    if (userAgentInfo.indexOf(Agents[v]) > 0) {
+      flag = false
+      break
+    }
+  }
+  return flag
 }
 
 /**
- * @param {string} str
- * @returns {Boolean}
+ * validate email
+ * @param email
+ * @returns {boolean}
  */
-export function isString (str) {
-  if (typeof str === 'string' || str instanceof String) {
-    return true
+export function validateEmail (email) {
+  const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+  return re.test(email)
+}
+
+/**
+ * 鍒ゆ柇韬唤璇佸彿鐮�
+ */
+export function cardid (code) {
+  let list = []
+  let result = true
+  let msg = ''
+  var city = {
+    11: '鍖椾含',
+    12: '澶╂触',
+    13: '娌冲寳',
+    14: '灞辫タ',
+    15: '鍐呰挋鍙�',
+    21: '杈藉畞',
+    22: '鍚夋灄',
+    23: '榛戦緳姹� ',
+    31: '涓婃捣',
+    32: '姹熻嫃',
+    33: '娴欐睙',
+    34: '瀹夊窘',
+    35: '绂忓缓',
+    36: '姹熻タ',
+    37: '灞变笢',
+    41: '娌冲崡',
+    42: '婀栧寳 ',
+    43: '婀栧崡',
+    44: '骞夸笢',
+    45: '骞胯タ',
+    46: '娴峰崡',
+    50: '閲嶅簡',
+    51: '鍥涘窛',
+    52: '璐靛窞',
+    53: '浜戝崡',
+    54: '瑗胯棌 ',
+    61: '闄曡タ',
+    62: '鐢樿們',
+    63: '闈掓捣',
+    64: '瀹佸',
+    65: '鏂扮枂',
+    71: '鍙版咕',
+    81: '棣欐腐',
+    82: '婢抽棬',
+    91: '鍥藉 '
+  }
+  if (!validatenull(code)) {
+    if (code.length == 18) {
+      if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
+        msg = '璇佷欢鍙风爜鏍煎紡閿欒'
+      } else if (!city[code.substr(0, 2)]) {
+        msg = '鍦板潃缂栫爜閿欒'
+      } else {
+        // 18浣嶈韩浠借瘉闇�瑕侀獙璇佹渶鍚庝竴浣嶆牎楠屼綅
+        code = code.split('')
+        // 鈭�(ai脳Wi)(mod 11)
+        // 鍔犳潈鍥犲瓙
+        var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
+        // 鏍¢獙浣�
+        var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x']
+        var sum = 0
+        var ai = 0
+        var wi = 0
+        for (var i = 0; i < 17; i++) {
+          ai = code[i]
+          wi = factor[i]
+          sum += ai * wi
+        }
+        if (parity[sum % 11] != code[17]) {
+          msg = '璇佷欢鍙风爜鏍¢獙浣嶉敊璇�'
+        } else {
+          result = false
+        }
+      }
+    } else {
+      msg = '璇佷欢鍙风爜闀垮害涓嶄负18浣�'
+    }
+  } else {
+    msg = '璇佷欢鍙风爜涓嶈兘涓虹┖'
+  }
+  list.push(result)
+  list.push(msg)
+  return list
+}
+
+/**
+ * 鍒ゆ柇鎵嬫満鍙风爜鏄惁姝g‘
+ */
+export function isvalidatemobile (phone) {
+  let list = []
+  let result = true
+  let msg = ''
+  var isPhone = /^0\d{2,3}-?\d{7,8}$/
+  // 澧炲姞134 鍑忓皯|1349[0-9]{7}锛屽鍔�181,澧炲姞145锛屽鍔�17[678]
+  if (!validatenull(phone)) {
+    if (phone.length == 11) {
+      if (isPhone.test(phone)) {
+        msg = '鎵嬫満鍙风爜鏍煎紡涓嶆纭�'
+      } else {
+        result = false
+      }
+    } else {
+      msg = '鎵嬫満鍙风爜闀垮害涓嶄负11浣�'
+    }
+  } else {
+    msg = '鎵嬫満鍙风爜涓嶈兘涓虹┖'
+  }
+  list.push(result)
+  list.push(msg)
+  return list
+}
+
+/**
+ * 鍒ゆ柇濮撳悕鏄惁姝g‘
+ */
+export function validatename (name) {
+  var regName = /^[\u4e00-\u9fa5]{2,4}$/
+  if (!regName.test(name)) return false
+  return true
+}
+
+/**
+ * 鍒ゆ柇鏄惁涓烘暣鏁�
+ */
+export function validatenum (num, type) {
+  let regName = /[^\d.]/g
+  if (type == 1) {
+    if (!regName.test(num)) return false
+  } else if (type == 2) {
+    regName = /[^\d]/g
+    if (!regName.test(num)) return false
+  }
+  return true
+}
+
+/**
+ * 鍒ゆ柇鏄惁涓哄皬鏁�
+ */
+export function validatenumord (num, type) {
+  let regName = /[^\d.]/g
+  if (type == 1) {
+    if (!regName.test(num)) return false
+  } else if (type == 2) {
+    regName = /[^\d.]/g
+    if (!regName.test(num)) return false
+  }
+  return true
+}
+
+/**
+ * 鍒ゆ柇鏄惁涓虹┖
+ */
+export function validatenull (val) {
+  if (typeof val === 'boolean') {
+    return false
+  }
+  if (typeof val === 'number') {
+    return false
+  }
+  if (val instanceof Array) {
+    if (val.length == 0) return true
+  } else if (val instanceof Object) {
+    if (JSON.stringify(val) === '{}') return true
+  } else {
+    if (val == 'null' || val == null || val == 'undefined' || val == undefined || val == '') return true
+    return false
   }
   return false
-}
-
-/**
- * @param {Array} arg
- * @returns {Boolean}
- */
-export function isArray (arg) {
-  if (typeof Array.isArray === 'undefined') {
-    return Object.prototype.toString.call(arg) === '[object Array]'
-  }
-  return Array.isArray(arg)
 }
diff --git a/src/views/Exam/Exam.vue b/src/views/Exam/Exam.vue
new file mode 100644
index 0000000..0900d96
--- /dev/null
+++ b/src/views/Exam/Exam.vue
@@ -0,0 +1,248 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-title">
+          <p>鍦ㄧ嚎棰勭害</p>
+        </div>
+        <div class="main-1">
+          <div class="main-btn">
+            <el-button
+              class="deepBlue"
+              @click="routerTo('/exam/myexam')"
+            >鎴戠殑鑰冭瘯</el-button>
+          </div>
+          <div>
+            <div class="flex mian-1-top">
+              <p>鑰冭瘯鍚嶇О锛�</p>
+              <input type="text">
+              <el-select
+                style="margin-right:20px;"
+                placeholder="璇烽�夋嫨绉戠洰"
+                v-model="searchData.subject"
+              >
+                <el-option
+                  label="璇枃"
+                  value="1"
+                ></el-option>
+                <el-option
+                  label="鏁板"
+                  value="2"
+                ></el-option>
+                <el-option
+                  label="鑻辫"
+                  value="3"
+                ></el-option>
+              </el-select>
+              <el-button class="deepBlue">鏌ヨ</el-button>
+            </div>
+            <div>
+              <el-table :data="tableData">
+                <el-table-column
+                  label="棰勭害鑰冭瘯鍚嶇О"
+                  prop="name"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鍦扮偣"
+                  prop="site"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯绉戠洰"
+                  prop="subject"
+                ></el-table-column>
+                <el-table-column
+                  label="浜烘暟涓婄嚎"
+                  prop="personNum"
+                ></el-table-column>
+                <el-table-column label="鐘舵��">
+                  <template slot-scope="scope">
+                    <p
+                      v-if="scope.row.type===1"
+                      style="color:#31c160"
+                    >鑰冭瘯涓�</p>
+                    <p
+                      v-if="scope.row.type===2"
+                      style="color:#0049ff"
+                    >鏈紑濮�</p>
+                    <p
+                      v-if="scope.row.type===3"
+                      style="color:red"
+                    >宸茬粨鏉�</p>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鏃堕棿"
+                  prop="ctime"
+                ></el-table-column>
+                <el-table-column label="鎿嶄綔">
+                  <template slot-scope="scope">
+                    <s-button
+                      class="deepBlue"
+                      colorType="blue"
+                      v-if="scope.row.type===2"
+                    >棰勭害</s-button>
+                    <s-button
+                      colorType="darkBlue"
+                      disabled
+                      v-else
+                    >棰勭害</s-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="1000"
+              >
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      searchData: {
+        subject: null,
+      },
+      tableData: [
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 3,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+      ],
+      pageData: {
+        size: 7,
+        page: 1,
+      },
+    };
+  },
+  methods: {
+    routerTo(url) {
+      this.$router.push(url);
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+// .c{
+//     background-image:url('../../assets/img/loginBackground.jpg');
+//     width:100vw;
+//     height:calc(100vh - 75px);
+//     background-size: cover;
+// }
+// .bg{
+//     width:100%;
+//     height:100%;
+//     background: rgba(255,255,255,0.2);
+//     display: flex;
+//     justify-content: center;
+
+// }
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 32px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Exam/Index.vue b/src/views/Exam/Index.vue
new file mode 100644
index 0000000..35175ca
--- /dev/null
+++ b/src/views/Exam/Index.vue
@@ -0,0 +1,18 @@
+<template>
+  <div>
+    <router-view>
+
+    </router-view>
+  </div>
+</template>
+
+<script>
+export default {
+  created() {
+    this.$store.commit("SET_HEADER_NUM", 2);
+  },
+};
+</script>
+
+<style>
+</style>
diff --git a/src/views/Exam/MyExam/BeginExam.vue b/src/views/Exam/MyExam/BeginExam.vue
new file mode 100644
index 0000000..e8d3d60
--- /dev/null
+++ b/src/views/Exam/MyExam/BeginExam.vue
@@ -0,0 +1,172 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <SingleItem
+          :data-source="paperData"
+          :type='type'
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// 寮曞叆鍗曢��
+import SingleItem from "@/components/Choice/SingleItem.vue";
+export default {
+  components: {
+    SingleItem,
+  },
+  data() {
+    return {
+      //璇曞嵎绫诲瀷 1 鑰冭瘯 2 闃呭嵎 3 鏌ョ湅
+      type: 2,
+      paperData: {
+        //璇曞嵎ID
+        paperId: "1",
+        //璇曞嵎鍚嶇О
+        paperName: "娴嬭瘯璇曞嵎",
+        //鑰冪敓ID
+        examineId: "1000",
+        //鑰冪敓鍚嶇О
+        examineName: "寮犱笁",
+        //鍒嗘暟
+        score: 80,
+        //鑰冭瘯鏃堕暱
+        examDuration: 90,
+        //浜ゅ嵎鏃堕棿
+        submissionTime: "2019-11-25 16:30:26",
+        //棰樼洰闆嗗悎
+        list: [
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 2,
+            no: 1,
+            subject: "浠ヤ笅灞炰簬鍗楁柟鐢电綉鍛樺伐鑱屼笟鎿嶅畧涓槑鏂囪瀹氱殑鏈�",
+            totalScore: 6,
+            answers: [
+              { no: "A", answer: "鐑埍绁栧浗銆佺儹鐖卞崡缃戙�佺儹鐖卞矖浣�" },
+              { no: "B", answer: "閬电邯瀹堟硶銆佸繝浜庤亴瀹堛�佷护琛岀姝�" },
+              { no: "C", answer: "瀹㈡埛鑷充笂銆佽瘹瀹炲畧淇°�佷紭璐ㄦ湇鍔�" },
+            ],
+            examineAnswer: ["A", "B"],
+            correctAnswer: ["A", "B", "C"],
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 2,
+            score: 0,
+          },
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 2,
+            no: 2,
+            subject: "浠ヤ笅灞炰簬鍗楁柟鐢电綉鍛樺伐鑱屼笟鎿嶅畧涓槑鏂囪瀹氱殑鏈�",
+            totalScore: 6,
+            answers: [
+              { no: "A", answer: "鐑埍绁栧浗銆佺儹鐖卞崡缃戙�佺儹鐖卞矖浣�" },
+              { no: "B", answer: "閬电邯瀹堟硶銆佸繝浜庤亴瀹堛�佷护琛岀姝�" },
+              { no: "C", answer: "瀹㈡埛鑷充笂銆佽瘹瀹炲畧淇°�佷紭璐ㄦ湇鍔�" },
+            ],
+            examineAnswer: ["A", "B"],
+            correctAnswer: ["A", "B", "C"],
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 2,
+            score: 0,
+          },
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 1,
+            no: 1,
+            subject:
+              "鍦ㄧ敓浜х鐞嗕俊鎭郴缁熶腑锛屼笅鍒楁搷浣滄楠よ兘姝g‘灏嗗伐鍗曟帹杩涙祦绋嬬殑鏄�",
+            totalScore: 1,
+            answers: [
+              { no: "A", answer: "鍦ㄥ伐鍏锋爮涓偣鍑烩�渨orkflow鈥濇爣绛�" },
+              { no: "B", answer: "鍦ㄧ己闄峰崟鐣岄潰涓偣鍑烩�滄帹杩涙祦绋嬧�濇寜閽�" },
+              { no: "C", answer: "鍦ㄧ己闄峰崟鐣岄潰涓偣鍑烩�滄彁浜も�濇寜閽�" },
+            ],
+            examineAnswer: "A",
+            correctAnswer: "B",
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 2,
+            score: 0,
+          },
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 1,
+            no: 2,
+            subject:
+              "鍦ㄨ惀閿�绯荤粺涓煡璇㈠鎴锋湁鏃犳瑺璐广�佷綑棰濆強鎶勮〃鏁版嵁鎺ュ緟瀹㈡埛鏃跺簲鍋氬埌鍝簺鏈�鍩烘湰鐨勭ぜ浠紵",
+            totalScore: 5,
+            answers: [
+              { no: "A", answer: "璧疯韩銆佸井绗戙�佺ず鍧愩�侀棶鍊欏鎴�" },
+              { no: "B", answer: "鍧愮潃锛岄棶鍊欏鎴�" },
+              { no: "C", answer: "璇烽棶闇�瑕佸姙鐞嗕粈涔堜笟鍔�" },
+            ],
+            examineAnswer: "A",
+            correctAnswer: "A",
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 1,
+            score: 5,
+          },
+
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 3,
+            no: 1,
+            subject: "璁板綍涓�娆′笌浜烘湁鏁堟矡閫氱殑妗堜緥",
+            totalScore: 10,
+            answers: [],
+            examineAnswer: "瀵�",
+            correctAnswer: "瀵�",
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 1,
+            score: 10,
+          },
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 4,
+            no: 1,
+            subject: "鎵撴嫑鍛肩殑鏂瑰紡涓�鑸湁",
+            totalScore: 10,
+            answers: [],
+            examineAnswer: "瀵掓殑寮�",
+            correctAnswer: ["瀵掓殑寮�", "闂�欏紡", "鑷存剰寮�", "鑷寸ぜ寮�"],
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 1,
+            score: 10,
+          },
+          {
+            //棰樼洰绫诲瀷 1.鍗曢�夐 2.澶氶�夐 3.鍒ゆ柇棰� 4.濉┖棰� 5.绠�绛旈
+            type: 5,
+            no: 1,
+            subject: "璇风畝鍗曡涓�涓嬩綘瀵圭ぜ浠殑璁よ瘑涓庣悊瑙�",
+            totalScore: 10,
+            answers: [],
+            examineAnswer: "瀵掓殑寮�",
+            correctAnswer: "",
+            answerAnalysis: "绛旀瑙f瀽.......",
+            isHook: 1,
+            score: 10,
+          },
+        ],
+      },
+    };
+  },
+  methods: {
+    paperRead(e) {
+      console.log(e, 120);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.main {
+  width: 1227px;
+  background: white;
+  box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+  border-radius: 10px;
+  padding: 32px 40px 0 40px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Exam/MyExam/MyExam.vue b/src/views/Exam/MyExam/MyExam.vue
new file mode 100644
index 0000000..80d3ae6
--- /dev/null
+++ b/src/views/Exam/MyExam/MyExam.vue
@@ -0,0 +1,255 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-title">
+          <p>鎴戠殑鑰冭瘯</p>
+        </div>
+        <div class="main-1">
+          <div class="main-btn">
+            <el-button
+              class="deepBlue"
+              @click="() => this.$router.push('/exam')"
+            >鍦ㄧ嚎棰勭害</el-button>
+          </div>
+          <div>
+            <div class="flex mian-1-top">
+              <p>鑰冭瘯鍚嶇О锛�</p>
+              <input type="text">
+              <el-select
+                style="margin-right:20px;"
+                placeholder="璇烽�夋嫨绉戠洰"
+                v-model="searchData.subject"
+              >
+                <el-option
+                  label="璇枃"
+                  value="1"
+                ></el-option>
+                <el-option
+                  label="鏁板"
+                  value="2"
+                ></el-option>
+                <el-option
+                  label="鑻辫"
+                  value="3"
+                ></el-option>
+              </el-select>
+              <el-button class="deepBlue">鏌ヨ</el-button>
+            </div>
+            <div>
+              <el-table :data="tableData">
+                <el-table-column
+                  label="棰勭害鑰冭瘯鍚嶇О"
+                  prop="name"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鍦扮偣"
+                  prop="site"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯绉戠洰"
+                  prop="subject"
+                ></el-table-column>
+                <el-table-column
+                  label="浜烘暟涓婄嚎"
+                  prop="personNum"
+                ></el-table-column>
+                <el-table-column label="鐘舵��">
+                  <template slot-scope="scope">
+                    <p
+                      v-if="scope.row.type===1"
+                      style="color:#31c160"
+                    >鑰冭瘯涓�</p>
+                    <p
+                      v-if="scope.row.type===2"
+                      style="color:#0049ff"
+                    >鏈紑濮�</p>
+                    <p
+                      v-if="scope.row.type===3"
+                      style="color:red"
+                    >宸茬粨鏉�</p>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鏃堕棿"
+                  prop="ctime"
+                ></el-table-column>
+                <el-table-column
+                  label="鎿嶄綔"
+                  width="220px;"
+                >
+                  <template slot-scope="scope">
+                    <div style="display:flex; justify-content:space-between">
+                      <s-button
+                        class="deepBlue"
+                        colorType="blue"
+                        v-if="scope.row.type===2"
+                        @click="$router.push('/exam/beginexam')"
+                      >寮�濮嬭�冭瘯</s-button>
+                      <s-button
+                        colorType="darkBlue"
+                        disabled
+                        v-else
+                      >寮�濮嬭�冭瘯</s-button>
+                      <s-button
+                        colorType="red"
+                        v-if="scope.row.type===2"
+                      >缁撴潫鑰冭瘯</s-button>
+                      <s-button
+                        colorType="darkBlue"
+                        disabled
+                        v-else
+                      >缁撴潫鑰冭瘯</s-button>
+
+                    </div>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="1000"
+              >
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      searchData: {
+        subject: null,
+      },
+      tableData: [
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 2,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 3,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "璇枃",
+          site: "鏈烘埧301",
+          subject: "璇枃",
+          personNum: 21,
+          type: 1,
+          ctime: "2022-5-10 14:00",
+        },
+      ],
+      pageData: {
+        size: 7,
+        page: 1,
+      },
+    };
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+
+// .bg{
+//     width:100%;
+//     height:100%;
+//     background: rgba(255,255,255,0.2);
+//     display: flex;
+//     justify-content: center;
+
+// }
+.main {
+  margin-top: 100px;
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 32px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
new file mode 100644
index 0000000..4e4ab66
--- /dev/null
+++ b/src/views/Home/Home.vue
@@ -0,0 +1,316 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="m1">
+          <div
+            class="card"
+            style="width:310px; margin-bottom:20px;"
+          >
+            <p class="card-title">瀛︾敓鎬绘暟</p>
+            <p class="card-num">3250</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:75%; background:rgb(99,1,190)"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞75%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鏂扮敓</p>
+            <p class="card-num">230</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:50%;"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞50%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鎬昏绋�</p>
+            <p class="card-num">3</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:76%; background:rgb(16,71,247)"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞75%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鏀惰垂</p>
+            <p class="card-num">锟�355000.00</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:56%; background:rgb(245,155,34)"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞56%</p>
+          </div>
+        </div>
+        <div class="m2 card">
+          <p class="card-title">鏀跺叆/璐圭敤鎶ュ憡</p>
+          <img
+            src="@/assets/img/1.jpg"
+            alt=""
+          >
+        </div>
+        <div class="m3 card">
+          <p
+            class="card-title"
+            style="margin-bottom:20px;"
+          >鑰佸笀鍚嶅崟</p>
+          <div class="scrollBar">
+            <div
+              class="m3-con"
+              v-for="(item) in state.listTeachers"
+              :key="item.id"
+            >
+              <div style="display:flex">
+                <img
+                  src="https://img1.baidu.com/it/u=842647274,1455615798&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
+                  alt=""
+                >
+                <div style="margin-left:10px;">
+                  <p class="m3-con-name">{{item.name}}</p>
+                  <p class="m3-con-d">宸ラ緞锛歿{item.workTIme}}骞�<span style="margin-left:50px;">瀛︾敓锛歿{item.students}}涓�</span></p>
+                </div>
+              </div>
+              <div class="m3-con-b">
+                <el-button type="text">鏌ョ湅</el-button>
+              </div>
+            </div>
+          </div>
+          <div
+            class="m3-btn"
+            style="border-top:1px solid #EBEEF5"
+          >
+            <button
+              class="content_padding"
+              @click="$router.push('/manage/teacher-manage')"
+            >鏌ョ湅鎵�鏈�</button>
+          </div>
+        </div>
+        <div class="m4 card">
+          <p
+            class="card-title"
+            style="margin-bottom:20px;"
+          >瀛︾敓鍚嶅崟</p>
+          <el-table
+            :data="state.listStudents"
+            height="80%"
+          >
+            <el-table-column
+              label="瀛︾敓鍚嶇О"
+              prop="name"
+            ></el-table-column>
+            <el-table-column
+              label="鐝骇"
+              prop="className"
+            ></el-table-column>
+            <el-table-column
+              label="鐝富浠�"
+              prop="teacher"
+            ></el-table-column>
+            <el-table-column
+              label="鍏ュ鏃堕棿"
+              prop="inTime"
+            ></el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              width="60px"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  style="color:#f59b22"
+                  type="text"
+                  @click="viewDetails(1)"
+                >鏌ョ湅</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="m3-btn m4-btn content_padding">
+            <button>鏌ョ湅鎵�鏈�</button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// import { createNamespacedHelpers } from "vuex";
+// const a = createNamespacedHelpers("home");
+// console.log(a, "a");
+// 闅忔満 mock
+import { listStudent, listTeacher, countStudent } from "@/utils/mock/home";
+export default {
+  data() {
+    return {
+      state: {
+        // 瀛︾敓鍚嶅崟
+        listStudents: listStudent.studentsArr,
+        // 鑰佸笀鍚嶅崟
+        listTeachers: listTeacher.TeachersArr,
+        // 瀛︾敓鎬绘暟
+        countStudents: countStudent.countStudent,
+      },
+    };
+  },
+  computed: {
+    // ...mapState(["listStudents", "listTeachers", "countStudents"]),
+  },
+  methods: {
+    // ...mapActions(["getListStudents", "getListTeachers", "getCountStudents"]),
+    // 鏌ョ湅璇︽儏
+    viewDetails(v) {
+      console.log(v);
+    },
+  },
+  mounted() {
+    // this.getListStudents();
+    // this.getListTeachers();
+    // this.getCountStudents();
+    // console.log(this.listStudents, "+++++++++++++++");
+    // this.getAll();
+  },
+  created() {},
+};
+</script>
+<style scoped lang="scss">
+.main {
+  margin-top: 100px;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 1300px;
+}
+.m1 {
+  display: flex;
+  flex-wrap: wrap;
+  width: 640px;
+  justify-content: space-between;
+  align-items: baseline;
+  margin-bottom: 20px;
+}
+.card {
+  background: white;
+  border-radius: 10px;
+  padding: 10px 20px;
+  box-sizing: border-box;
+  display: inline-block;
+
+  &-title {
+    font-size: 16px;
+    color: #777;
+    margin-bottom: 0;
+  }
+  &-num {
+    font-size: 32px;
+    font-weight: 700;
+    margin: 5px 0;
+  }
+  &-d {
+    color: #777;
+    font-size: 12px;
+    margin-top: 5px;
+  }
+}
+.bar {
+  width: 100%;
+  height: 10px;
+  background-color: rgb(242, 242, 242);
+  &-r {
+    background-color: red;
+    height: 100%;
+  }
+}
+.m2 {
+  width: 630px;
+  height: 324px;
+  margin-bottom: 20px;
+}
+.m3 {
+  width: 467px;
+  height: 590px;
+  &-con {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    margin-bottom: 15px;
+    justify-content: space-between;
+    & img {
+      width: 34px;
+      height: 34px;
+      border-radius: 34px;
+    }
+    & p {
+      margin: 0;
+    }
+    &-d {
+      color: #777;
+      font-size: 12px;
+    }
+    &-b {
+      // margin-left: ;
+      color: #f59b22;
+    }
+  }
+  &-btn {
+    display: flex;
+    justify-content: center;
+    & > button {
+      width: 175px;
+      height: 39px;
+      border-color: rgba(16, 71, 247, 1);
+      background: none;
+      border-radius: 5px;
+      color: rgba(16, 71, 247, 1);
+      transition: 0.2s;
+      cursor: pointer;
+      &:hover {
+        background: rgba(16, 71, 247, 1);
+        color: white;
+      }
+    }
+  }
+}
+.m4 {
+  width: 790px;
+  height: 590px;
+  &-btn {
+    margin-top: 10px;
+  }
+}
+.scrollBar {
+  height: 80%;
+  overflow: auto;
+}
+// 婊氬姩鏉�
+.scrollBar::-webkit-scrollbar {
+  width: 0px;
+  height: 0px;
+}
+
+//闅愯棌婊氬姩鏉�
+/deep/.el-table__body-wrapper::-webkit-scrollbar {
+  width: 0;
+}
+
+.content_padding {
+  margin: 20px 0;
+}
+</style>
diff --git a/src/views/Manage/Announce/index.vue b/src/views/Manage/Announce/index.vue
new file mode 100644
index 0000000..cafb777
--- /dev/null
+++ b/src/views/Manage/Announce/index.vue
@@ -0,0 +1,266 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="鍙戝竷鍏憡" />
+        <!-- 鍐呭 -->
+        <div class="content">
+          <el-form
+            :model="ruleForm"
+            :rules="rules"
+            ref="ruleForm"
+            label-width="100px"
+            class="demo-ruleForm"
+          >
+            <el-form-item
+              label="鏍囬"
+              prop="name"
+            >
+              <el-input
+                v-model="ruleForm.name"
+                placeholder="璇风粰鍏憡璧蜂竴涓爣棰�"
+              ></el-input>
+            </el-form-item>
+            <el-form-item
+              label="鍙戝竷浜�"
+              prop="publisher"
+            >
+              <el-input
+                v-model="ruleForm.publisher"
+                placeholder="璇疯緭鍏ュ彂甯冧汉"
+              ></el-input>
+            </el-form-item>
+            <el-form-item
+              label="鍙戝竷浜�"
+              prop="publisher"
+            >
+              <el-select
+                v-model="value"
+                placeholder="璇烽�夋嫨"
+                class="el-input"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item
+              label="娲诲姩褰㈠紡"
+              prop="desc"
+            >
+              <rich-text />
+            </el-form-item>
+
+            <el-form-item
+              label="灏侀潰浠ュ強鎽樿"
+              prop="publisher"
+            >
+              <el-row :gutter="24">
+
+                <el-col
+                  :span="6"
+                  style="padding-left:0"
+                >
+                  <single-upload
+                    :success-call-back="getCategoryImg"
+                    upload-action="https://jsonplaceholder.typicode.com/posts/"
+                  />
+                </el-col>
+                <el-col :span="13">
+                  <el-input
+                    type="textarea"
+                    v-model="ruleForm.desc"
+                    :rows="9"
+                    placeholder="閫夊~锛屾憳瑕佷細鍦ㄦ秷鎭枃绔犲鐨勫満鏅嚎璺紝甯姪璇昏�呭揩閫熶簡瑙e唴瀹癸紝濡備笉濉啓鍒欓粯璁ゆ姄鍙栨鏂囧墠64瀛�"
+                  ></el-input>
+                </el-col>
+              </el-row>
+
+            </el-form-item>
+            <el-form-item style="margin-left: 100px;display: flex;">
+              <el-button
+                type="primary"
+                style="min-width:120px;min-height: 50px;"
+                class="btn-style"
+                @click="submitForm('ruleForm')"
+              >绔嬪嵆鍒涘缓</el-button>
+              <el-button
+                @click="resetForm('ruleForm')"
+                size="medium"
+                style="min-width:120px;min-height: 50px;"
+              >淇濆瓨涓鸿崏绋�</el-button>
+              <el-button
+                @click="resetForm('ruleForm')"
+                style="min-width:120px;min-height: 50px;"
+              >棰勮</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+
+    </div>
+
+  </div>
+
+</template>
+
+
+<script>
+// 寮曞叆瀵屾枃鏈�
+import RichText from "../../../components/editor/RichText.vue";
+// 寮曞叆灏侀潰涓婁紶
+import SingleUpload from "@/components/upload/SingleUpload.vue";
+export default {
+  components: {
+    RichText,
+    SingleUpload,
+  },
+  data() {
+    return {
+      //鍥剧墖涓婁紶
+      imageUrl: "",
+      dialogImageUrl: "",
+      dialogVisible: false,
+      disabled: false,
+      options: [
+        {
+          value: "閫夐」1",
+          label: "榛勯噾绯�",
+        },
+        {
+          value: "閫夐」2",
+          label: "鍙岀毊濂�",
+        },
+        {
+          value: "閫夐」3",
+          label: "铓典粩鐓�",
+        },
+        {
+          value: "閫夐」4",
+          label: "榫欓』闈�",
+        },
+        {
+          value: "閫夐」5",
+          label: "鍖椾含鐑ら腑",
+        },
+      ],
+      value: "",
+      ruleForm: {
+        name: "",
+        publisher: "",
+        desc: "",
+      },
+      rules: {
+        name: [{ required: true, message: "鏍囬涓嶈兘涓虹┖", trigger: "blur" }],
+        desc: [{ required: true, message: "璇峰~鍐欐椿鍔ㄥ舰寮�", trigger: "blur" }],
+      },
+    };
+  },
+  methods: {
+    // handleAvatarSuccess(res, file) {
+    //   this.imageUrl = URL.createObjectURL(file.raw);
+    // },
+    // beforeAvatarUpload(file) {
+    //   const isJPG = file.type === "image/jpeg";
+    //   const isLt2M = file.size / 1024 / 1024 < 2;
+    //   console.log(isJPG, isLt2M, "Lt2M");
+    //   if (!isJPG) {
+    //     this.$message.error("涓婁紶澶村儚鍥剧墖鍙兘鏄� JPG 鏍煎紡!");
+    //   }
+    //   if (!isLt2M) {
+    //     this.$message.error("涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 2MB!");
+    //   }
+    //   return isJPG && isLt2M;
+    // },
+
+    // 鍥剧墖涓婁紶
+    getCategoryImg(data) {
+      console.log(data, "Img");
+    },
+
+    // 绔嬪埢鍒涘缓
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          console.log(this.ruleForm);
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 40px 140px;
+  border-radius: 10px;
+  //   璁剧疆搴旇鐨勬牱寮�
+  .font-style {
+    font-weight: bold;
+    font-size: 18px;
+    & > span {
+      color: #777777;
+      font-size: 14px;
+      margin-left: 10px;
+    }
+  }
+  //   璁剧疆姣忎釜鍙宠竟鐨剆pan
+  .span-right-style {
+    margin-left: 10px;
+  }
+}
+
+.el-input {
+  width: 360px;
+}
+
+// 涓婁紶鏍峰紡
+// .avatar-uploader .el-upload {
+//   border-radius: 6px;
+//   cursor: pointer;
+//   position: relative;
+//   overflow: hidden;
+// }
+// .avatar-uploader .el-upload:hover {
+//   border-color: #409eff;
+// }
+// .avatar-uploader-icon {
+//   font-size: 28px;
+//   color: #8c939d;
+//   width: 178px;
+//   height: 178px;
+//   line-height: 178px;
+//   text-align: center;
+// }
+// .avatar {
+//   width: 178px;
+//   height: 178px;
+//   display: block;
+// }
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/AttendanceRecord/index.vue b/src/views/Manage/AttendanceRecord/index.vue
new file mode 100644
index 0000000..dcdbc58
--- /dev/null
+++ b/src/views/Manage/AttendanceRecord/index.vue
@@ -0,0 +1,164 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="鑰冨嫟璁板綍鏄庣粏" />
+        <div class="content flex">
+          <!-- 鏌ヨ -->
+          <div class="content-inquire">
+            <el-form
+              :inline="true"
+              :model="formInline"
+              class="demo-form-inline"
+            >
+              <el-form-item
+                style="margin-right:30px"
+                v-for="(item,index) in inquire"
+                :label="item.title"
+                :key="item.id"
+              >
+                <el-select
+                  v-model="formInline[index]"
+                  placeholder="璇烽�夋嫨"
+                >
+                  <el-option
+                    v-for="i in item.arr"
+                    :key="i.id"
+                    :label="i.label"
+                    :value="i.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item style="width: 350px;text-align: end;">
+                <el-input
+                  v-model="input"
+                  placeholder="璇疯緭鍏ュ唴瀹�"
+                ></el-input>
+              </el-form-item>
+            </el-form>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      formInline: {
+        // 鐝骇
+        grade: "",
+        region: "",
+        clockingIn: "",
+      },
+      //   杈撳叆妗�
+      input: "",
+      //   鏌ヨ妗�
+      inquire: [
+        {
+          id: 1,
+
+          title: "骞寸骇",
+          arr: [
+            {
+              id: "1-1",
+              value: "閫夐」1",
+              label: "鍏ㄩ儴",
+            },
+            {
+              id: "1-2",
+              value: "閫夐」2",
+              label: "鐝骇1",
+            },
+            {
+              id: "1-3",
+              value: "閫夐」3",
+              label: "鐝骇1",
+            },
+          ],
+        },
+        {
+          id: 2,
+
+          title: "鐝骇",
+          //鑰冨嫟
+          arr: [
+            {
+              id: "2-1",
+
+              value: "閫夐」1",
+              label: "鍏ㄩ儴",
+            },
+            {
+              id: "2-2",
+
+              value: "閫夐」2",
+              label: "鑰冨嫟涓�",
+            },
+            {
+              id: "2-3",
+
+              value: "閫夐」3",
+              label: "鑰冨嫟浜�",
+            },
+          ],
+        },
+        {
+          title: "鑰冨嫟",
+          id: 3,
+          arr: [
+            {
+              id: "3-1",
+              value: "閫夐」1",
+              label: "鍏ㄩ儴",
+            },
+            {
+              id: "3-2",
+              value: "閫夐」2",
+              label: "鎸夋棩鏈�",
+            },
+            {
+              id: "3-3",
+              value: "閫夐」3",
+              label: "鎸夋棩鏈�",
+            },
+          ],
+        },
+      ],
+    };
+  },
+  created() {
+    //浣跨敤鍙屽悜缁戝畾缁欎笅鎷夊垪琛ㄨ缃竴涓粯璁ゅ��
+    this.formInline.grade = this.options[0].label;
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.content {
+  width: 1262px;
+  justify-content: space-between;
+  margin-bottom: 80px;
+  //   鏌ヨ
+  .content-inquire {
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/ClassManagement/Class.vue b/src/views/Manage/ClassManagement/Class.vue
new file mode 100644
index 0000000..a4c8e74
--- /dev/null
+++ b/src/views/Manage/ClassManagement/Class.vue
@@ -0,0 +1,290 @@
+<!-- 鐝骇绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <TitleIndex title='鐝骇绠$悊' />
+        <div class="main-1">
+          <div
+            class="main-btn flex"
+            style="justify-content:space-between"
+          >
+            <div>
+              <s-button
+                colorType="deepBlue"
+                style="margin-right:20px;"
+                @click="$router.push('/manage/class-management/Class-staff')"
+              >鏂板鐝骇</s-button>
+            </div>
+            <div
+              class="flex"
+              style="align-items:center"
+            >
+              <p style="padding-right:10px">鎺掑簭鏂瑰紡</p>
+              <el-select>
+                <el-option></el-option>
+              </el-select>
+              <p style="margin-left:20px;margin-right: 10px;">鎵�鍦ㄥ崟浣�</p>
+              <el-select>
+                <el-option></el-option>
+              </el-select>
+            </div>
+          </div>
+          <div>
+            <div>
+              <el-table
+                :data="tableData"
+                border
+                :row-style="{height:'42px'}"
+                :cell-style="{padding: '0'}"
+              >
+                <el-table-column
+                  align="center"
+                  label="鐝骇"
+                  prop="class"
+                  width="80px"
+                ></el-table-column>
+                <el-table-column
+                  label="骞寸骇"
+                  align="center"
+                  width="80px"
+                  prop="grade"
+                ></el-table-column>
+                <el-table-column
+                  width="100px"
+                  align="center"
+                  label="鍗曚綅"
+                  prop="unit"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="100px"
+                  label="鏁欏笀"
+                  prop="teacher"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="120px"
+                  label="鑱旂郴鐢佃瘽"
+                  prop="phone"
+                ></el-table-column>
+                <el-table-column
+                  width="140px"
+                  label="鐢靛瓙閭欢"
+                  align="center"
+                  prop="email"
+                ></el-table-column>
+                <el-table-column
+                  width="90px"
+                  label="寮�鐝椂闂�"
+                  align="center"
+                  prop="openingTime"
+                ></el-table-column>
+                <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-button>鐝骇楠岃瘉</el-button>
+                    <el-button>閫氱煡</el-button>
+                    <el-button @click="routersTo()">鎴愬憳绠$悊</el-button>
+                    <el-button>娣诲姞鎴愬憳</el-button>
+                    <el-select
+                      v-model="value"
+                      style="width:74px;margin-left: 10px;"
+                      placeholder="閫夋嫨"
+                    >
+                      <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="1000"
+              >
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      value: "",
+      searchData: {
+        subject: null,
+      },
+      tableData: [
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+        {
+          class: "杞欢宸ョ▼",
+          grade: "2019绾�",
+          unit: "铻轰笣閮�",
+          teacher: "绉嬫ⅷ鑶�",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          openingTime: "2022/3/29",
+        },
+      ],
+      pageData: {
+        size: 7,
+        page: 1,
+      },
+    };
+  },
+  methods: {
+    // // 鏌ョ湅璇︽儏
+    // detailsTo() {
+    //   this.$router.push({
+    //     name: "teacherDetail",
+    //   });
+    // },
+    // 璺宠浆(鏌ョ湅鐝骇浜哄憳鎯呭喌)
+    routersTo() {
+      this.$router.push({
+        name: "ClassStaff",
+      });
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 30px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    // height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 10px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/ClassManagement/ClassStaff.vue b/src/views/Manage/ClassManagement/ClassStaff.vue
new file mode 100644
index 0000000..b6849c8
--- /dev/null
+++ b/src/views/Manage/ClassManagement/ClassStaff.vue
@@ -0,0 +1,230 @@
+<!-- 鐝骇浜哄憳绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <TitleIndex title="鐝骇浜哄憳绠$悊" />
+        <div class="content">
+          <!-- 鐝骇鍚嶇О -->
+          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
+            <span>{{title}}</span>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table
+            :header-cell-style="getRowClass"
+            :row-style="{height:'38px'}"
+            :cell-style="{padding: '0'}"
+            :data="tableData"
+            border
+            style="width: 100%;"
+          >
+            <el-table-column
+              align="center"
+              prop="id"
+              label="瀛﹀彿"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="name"
+              label="濮撳悕"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="sex"
+              label="鎬у埆"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="phone"
+              label="鐢佃瘽"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="condition"
+              label="涓婄嚎鎯呭喌"
+            >
+            </el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              align="center"
+              width="300px"
+            >
+              <el-button type="warning">缂栬緫</el-button>
+              <el-button type="danger">鍒犻櫎</el-button>
+              <el-button type="primary">鍒嗛厤瑙掕壊</el-button>
+            </el-table-column>
+          </el-table>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <el-pagination
+              style="margin:auto"
+              background
+              :page-size="10"
+              layout="prev, pager, next, jumper"
+              :total="100"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+
+    </div>
+    <PopUp
+      ref="popUp"
+      @children="parentGoods"
+    />
+  </div>
+</template>
+<script>
+// 寮曞叆褰堝嚭绐楀彛绲勪欢
+import PopUp from "../../../components/PopUp/Question.vue";
+export default {
+  // 娉ㄥ唽
+  components: {
+    PopUp,
+  },
+  data() {
+    return {
+      // 鐝骇鍚嶇О
+      title: "19绾ц蒋浠跺洓鐝�",
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+        {
+          id: 1,
+          name: "寮犱笁",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鏉庡洓",
+          sex: "濂�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鐜嬩簲",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "鏈笂绾�",
+        },
+        {
+          id: 1,
+          name: "寮犱笁",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鏉庡洓",
+          sex: "濂�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鐜嬩簲",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "鏈笂绾�",
+        },
+        {
+          id: 1,
+          name: "寮犱笁",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鏉庡洓",
+          sex: "濂�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "宸蹭笂绾�",
+        },
+        {
+          id: 1,
+          name: "鐜嬩簲",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "鏈笂绾�",
+        },
+        {
+          id: 1,
+          name: "鐜嬩簲",
+          sex: "鐢�",
+          phone: "12345678977",
+          // 鏄惁涓婄嚎
+          condition: "鏈笂绾�",
+        },
+      ],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+
+    // 鐢熸垚璇曞嵎
+    getCreate() {
+      // 璺宠浆鍒扮敓鎴愰〉闈�
+      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
+      this.$router.push({
+        path: "/manage/test-paper-generation",
+      });
+    },
+
+    // 鐐瑰嚮鍚庤皟鐢ㄥ脊绐楃粍浠剁殑鏂规硶,寮�鍚脊绐�
+    getDialogFormVisible() {
+      this.$refs.popUp.showDialog();
+    },
+    // 寮圭獥
+    // 鎺ユ敹寮圭獥缁勪欢杩斿洖鐨勮〃鍗曞��
+    parentGoods(obj) {
+      console.log(obj, "寮圭獥缁勪欢鐨勮〃鍗曞��");
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/Manage/ClassManagement/index.vue b/src/views/Manage/ClassManagement/index.vue
new file mode 100644
index 0000000..6b8da30
--- /dev/null
+++ b/src/views/Manage/ClassManagement/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <div>
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style>
+</style>
diff --git a/src/views/Manage/CreditHour/index.vue b/src/views/Manage/CreditHour/index.vue
new file mode 100644
index 0000000..a3f6202
--- /dev/null
+++ b/src/views/Manage/CreditHour/index.vue
@@ -0,0 +1,141 @@
+<!-- 瀛﹀垎璁$畻瑙勫垯 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <TitleIndex title="瀛﹀垎璁$畻瑙勫垯" />
+        <!-- 鍐呭 -->
+        <div class="content">
+          <p class="font-style">搴旇瀛﹀垎璁$畻瑙勫垯<span>* 鍑哄嫟璇炬椂*鍒�/璇炬椂</span></p>
+
+          <el-form
+            :label-position="labelPosition"
+            label-width="100px"
+            :model="formLabelAlign"
+            :inline="true"
+            class="demo-form-inline"
+          >
+            <el-form-item
+              class="flex"
+              style=" border-bottom:1px solid rgb(202 201 201);;padding-bottom:40px"
+            >
+              <el-checkbox v-model="checked">鍑哄嫟璇炬椂:</el-checkbox>
+              <span style="padding-right:10px">+</span>
+              <el-input v-model="formLabelAlign.name"></el-input>
+              <span class="span-right-style">鍒�/璇炬椂</span>
+            </el-form-item>
+            <div>
+              <p class="font-style">瀹炶瀛﹀垎璁$畻瑙勫垯<span>*搴旇瀛﹀垎-鎵e垎椤�=鎵e垎鍚堣</span></p>
+              <el-form-item class="flex">
+                <el-checkbox v-model="checked">鍑虹幇1娆℃椃璇撅紝瀹炶瀛﹀垎涓�0</el-checkbox>
+                <el-checkbox v-model="checked">鍑虹幇瓒呭亣锛屽疄璁板鍒嗕负0<span style="font-size:12px"> (璇峰亣鏃堕棿瓒呰繃鍑哄嫟璇炬椂鐨�1/7)</span></el-checkbox>
+              </el-form-item>
+              <el-form-item class="flex">
+                <el-checkbox v-model="checked">杩熷埌鎵e垎:</el-checkbox>
+                <span style="padding-right:10px">-</span>
+                <el-input v-model="formLabelAlign.name"></el-input>
+                <span class="span-right-style">鍒�/璇炬椂</span>
+              </el-form-item>
+              <el-form-item class="flex">
+                <el-checkbox v-model="checked">鏃╅��鎵e垎:</el-checkbox>
+                <span style="padding-right:10px">-</span>
+                <el-input v-model="formLabelAlign.name"></el-input>
+                <span class="span-right-style">鍒�/璇炬椂</span>
+              </el-form-item>
+              <el-form-item class="flex">
+                <el-checkbox v-model="checked">璇峰亣鎵e垎:</el-checkbox>
+                <span style="padding-right:10px">-</span>
+                <el-input v-model="formLabelAlign.name"></el-input>
+                <span class="span-right-style">鍒�/璇炬椂</span>
+              </el-form-item>
+              <el-form-item class="flex">
+                <el-checkbox v-model="checked">鏃疯鎵e垎:</el-checkbox>
+                <span style="padding-right:10px">-</span>
+                <el-input v-model="formLabelAlign.name"></el-input>
+                <span class="span-right-style">鍒�/璇炬椂</span>
+              </el-form-item>
+            </div>
+            <el-form-item style="padding-top:40px">
+              <el-button
+                type="primary"
+                style="width:100px"
+              >淇濆瓨</el-button>
+              <el-button style="width:100px">鍙栨秷</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+
+    </div>
+
+  </div>
+
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      checked: false,
+      form: {
+        name: "",
+        region: "",
+        date1: "",
+        date2: "",
+        delivery: false,
+        type: [],
+        resource: "",
+        desc: "",
+      },
+      labelPosition: "right",
+      formLabelAlign: {
+        name: "",
+        region: "",
+        type: "",
+      },
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 40px 140px;
+  border-radius: 10px;
+  //   璁剧疆搴旇鐨勬牱寮�
+  .font-style {
+    font-weight: bold;
+    font-size: 18px;
+    & > span {
+      color: #777777;
+      font-size: 14px;
+      margin-left: 10px;
+    }
+  }
+  //   璁剧疆姣忎釜鍙宠竟鐨剆pan
+  .span-right-style {
+    margin-left: 10px;
+  }
+}
+
+.el-input {
+  width: 180px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/Education/TeacherDetail.vue b/src/views/Manage/Education/TeacherDetail.vue
new file mode 100644
index 0000000..58e57d0
--- /dev/null
+++ b/src/views/Manage/Education/TeacherDetail.vue
@@ -0,0 +1,367 @@
+<!-- 鏁欏笀浠嬬粛 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="鏁欏笀浠嬬粛" />
+        <div class="content flex">
+          <div class="left">
+            <!-- 宸﹁竟涓婇儴鍒� -->
+            <div class="left-top">
+              <div class="avatar">
+                <!-- 澶村儚 -->
+                <div class="block">
+                  <el-avatar
+                    :size="80"
+                    :src="all.url"
+                  ></el-avatar>
+                </div>
+                <span class="name">{{all.name}}</span>
+                <span
+                  class="title"
+                  style="font-size:14px; color: #444444;"
+                >{{all.title}}</span>
+              </div>
+              <div
+                class="table-style flex"
+                v-for="(item,index) in all.data"
+                :key="index"
+              >
+                <span>{{item.name}}</span>
+                <span class="table-style-title">{{item.title}}</span>
+              </div>
+            </div>
+            <!-- 宸﹁竟涓嬮儴鍒� -->
+            <div
+              class="left-top"
+              style="margin-top:10px;padding-bottom: 10px;"
+            >
+              <div style=" border-bottom: 1px solid rgb(228, 225, 225);padding: 10px;">
+                <div>鍏充簬鑰佸笀</div>
+                <p class="indent">{{all.intro}}</p>
+              </div>
+              <div
+                class="table-style flex"
+                v-for="(item,index) in all.data1"
+                :key="index"
+              >
+                <span>{{item.name}}</span>
+                <span class="table-style-title">{{item.title}}</span>
+              </div>
+              <div class="flex flex-box">
+                <div class="flex flex-style flex-style-left">
+                  <span>1000</span>
+                  <span>灏忔椂</span>
+                  <span>鎺堣鏃堕暱</span>
+                </div>
+                <div class="flex flex-style">
+                  <span>120</span>
+                  <span>椤�</span>
+                  <span>鑾峰鏁伴噺</span>
+                </div>
+                <div class="flex flex-style">
+                  <span>8494</span>
+                  <span>鏉�</span>
+                  <span>濂借瘎鏁伴噺</span>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="right">
+            <el-tabs
+              v-model="activeName"
+              @tab-click="handleClick"
+            >
+              <el-tab-pane
+                label="鏁欏笀浠嬬粛"
+                name="introduce"
+              ></el-tab-pane>
+              <el-tab-pane
+                label="鐓х墖澧�"
+                name="photoWall"
+              ></el-tab-pane>
+            </el-tabs>
+            <!-- 浠嬬粛 -->
+            <Introduce
+              v-show="activeName=='introduce'"
+              :Introduces='all.Introduces'
+            />
+            <!-- 鐓х墖澧� -->
+            <photo-wall
+              v-show="activeName=='photoWall'"
+              :PhotoWalls="all.PhotoWalls"
+            />
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import Introduce from "../../../components/particulars/introduce.vue";
+import photoWall from "../../../components/particulars/photoWall.vue";
+export default {
+  components: {
+    Introduce,
+    photoWall,
+  },
+  data() {
+    return {
+      searchData: {
+        subject: null,
+      },
+      all: {
+        name: "缃楁浖缃楀叞",
+        title: "楂樼骇鏁欏笀",
+        url: "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png",
+        data: [
+          {
+            name: "鍔犲叆鏃堕棿",
+            title: "2022-05-22",
+          },
+          {
+            name: "宸ラ緞",
+            title: "20骞�",
+          },
+          {
+            name: "瀛︾敓",
+            title: "1000浜�",
+          },
+        ],
+        //鍏充簬--浠嬬粛
+        intro:
+          "鏄竴浣嶆繁鍙楀鐢熷枩鐖卞拰淇′换鐨勫ソ鑰佸笀锛佽�佸笀鑻辫涓撲笟瀛﹀+锛岃嫳璇笓涓氬叓绾с�傚叿鏈変赴瀵岀殑鑰堕瞾瑙嗙嚎鑻辫鏁欏缁忛獙銆傚杽浜庡彂鐜板瀛愮殑鎬ф牸鐗圭偣锛屾姄浣忓瀛愮殑瀛︿範鍏磋叮",
+        data1: [
+          {
+            name: "鎬у埆",
+            title: "鐢�",
+          },
+          {
+            name: "鏁欒偛",
+            title: "鍗氬+瀛︿綅",
+          },
+          {
+            name: "鑱旂郴鐢佃瘽",
+            title: "183-9848-9373",
+          },
+          {
+            name: "鐢靛瓙閭",
+            title: "info@example.com",
+          },
+          {
+            name: "鑱旂郴鍦板潃",
+            title: "鏄庡競椹帿鎷夎矾111鍙�",
+          },
+          {
+            name: "鑱旂郴鐢佃瘽",
+            title: "183-9848-9373",
+          },
+        ],
+        // 鏁欏笀浠嬬粛鐨勫唴瀹�
+        Introduces: {
+          p: [
+            "鑻辫涓撲笟瀛﹀+锛岃嫳璇笓涓氬叓绾э紝璇劅鍜岃嫳鏂囪〃杈捐兘鍔涙瘮杈冨己銆備粠浜嬪皯鍎胯嫳璇暀瀛﹀伐浣滃骞达紝缁忛獙涓板瘜銆傜儹鐖卞皯鍎胯嫳璇暀鑲诧紝鍠勪簬瑙傚療瀛╁瓙瀛︿範涓殑浼樼偣涓庢綔鍔涳紝骞跺皢鑷繁鍙戠幇鐨勯棶棰樹笌瀹堕暱娌熼�氥�佹湁閽堝鎬у湴甯姪瀛╁瓙鎻愰珮銆傚緢娆h祻涔熶竴鐩村疄璺电潃绔ヨ瘽澶х帇閮戞笂娲佺殑涓�鍙ヨ瘽鈥滃ソ瀛╁瓙閮芥槸榧撳姳鍑烘潵鐨勶紒",
+            "闀挎湡浠庝簨浜庡皯鍎胯嫳璇暀瀛﹀伐浣滐紝鏈変赴瀵岀殑鎺堣缁忛獙銆傝嫳璇姛搴曟墡瀹烇紝鍙戦煶鏍囧噯锛岃〃杈炬祦鍒┿�傛�ф牸娲绘臣寮�鏈楋紝瀵瑰瀛愰ケ鍚儹鎯呬笌鐖卞績锛屽杽浜庝笌瀛╁瓙浜ゆ祦銆傝璇炬�濊矾娓呮櫚锛岃鐪熻礋璐o紝娣卞彈灏忔湅鍙嬪拰瀹堕暱鐨勫枩鐖憋紒鈥滄案杩滅敤娆h祻鐨勭溂鍏夌湅瀛︾敓锛屾案杩滅敤瀹藉鐨勫績鎬侀潰瀵瑰鐢燂紒",
+            '瀛︾敓鐪奸噷鐨勬垜锛屾槸涓�涓嚜鐒朵紭闆呫�佸厖婊$儹鎯呫�佺儹鐖辩敓娲汇�佺儹鐖卞鐢熴�佺儹鐖辨暀鑲插伐浣滅殑濂借�佸笀銆備粬浠锛�"鎮ㄧ殑鐑儏鐐圭噧鎴戜滑姣忎竴涓汉瀵圭敓娲荤殑鐖憋紝鎮ㄦ暀瀛︾殑涓ヨ皑锛岄灜绛栨垜浠瘡涓�涓汉璁ょ湡姹傜煡锛屾偍浼橀泤鐨勪妇姝紝褰卞搷鎴戜滑姣忎竴涓汉鍘昏拷姹傚績鐏电殑楂樿吹"銆� 鍦ㄥ鐢熺溂閲岋紝鎴戞槸閭d釜璇惧爞涓婃縺鎯呭洓灏勩�佺煡璇嗘笂鍗氾紝瀵硅嚜宸辩殑鏁欎笌浠栦滑鐨勫杩戜箮涓ヨ嫑鐨勫笀闀匡紱鏄竴涓鍫傚鍧︾巼闅忔�э紝鍙互娴烽様澶╃┖鐣呰亰澶╀笅鐨勬湅鍙嬶紱鏄偅绉佸簳涓嬬粏蹇冨叧鎬�锛岃兘璇夊績澹扮殑鐭ュ繁銆備粬浠锛屽湪浜虹敓杩欐牱涓�娈电壒娈婄殑缁忓巻涓紝鏈変竴浣嶆偍杩欐牱鐨勬暀甯堬紝鏄棤姣斿垢杩愬拰骞哥鐨勩��',
+          ],
+          skill: [
+            {
+              title: "鎶�鑳�",
+              all: ["鑻辫鍔熷簳鎵庡疄", "澶栨暀鑰佸笀", "绉戝鍙楁暀"],
+            },
+            {
+              title: "鎶�鑳�",
+              all: ["鑻辫", "娉曡", "涓枃"],
+            },
+          ],
+        },
+        // 鐓х墖澧�
+        PhotoWalls: [
+          {
+            url: "https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+          {
+            url: "https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg",
+            title: "鏁欏笀鐢熸椿",
+          },
+        ],
+      },
+      //閰嶇疆鏍囩椤�
+      activeName: "introduce",
+    };
+  },
+  methods: {
+    routerTo(url) {
+      this.$router.push(url);
+    },
+    handleClick() {
+      console.log(this.activeName, "activeName");
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.content {
+  width: 1262px;
+  justify-content: space-between;
+  margin-bottom: 80px;
+  background-color: transparent;
+  padding: 0;
+  // 宸﹁竟
+  & > .left {
+    width: 260px;
+    .left-top {
+      background-color: #fff;
+      border-radius: 5px;
+      padding: 10px;
+      // 澶村儚
+      & > .avatar {
+        margin: 0 auto;
+        width: 236px;
+        height: 198px;
+        background: rgb(242, 242, 242);
+        border-radius: 5px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        // 鍥剧墖
+        & > .avatar-img {
+          width: 88px;
+          height: 88px;
+          border-radius: 50%;
+        }
+        & > .name {
+          font-size: 20px;
+          padding: 10px 0;
+        }
+        & > .title {
+          font-size: 14px;
+          color: #444444;
+        }
+      }
+    }
+    // 鎺堣鏃堕暱绛夎缃�
+    .flex-style {
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      padding-top: 20px;
+      border-left: 1px solid rgb(224, 224, 224);
+      flex: 1;
+      // span 閫氱敤
+      & > span {
+        font-size: 14px;
+        color: #333333;
+      }
+      // 绗竴涓猻pan
+      & > span:first-child {
+        font-size: 16px;
+        color: rgb(16, 71, 247);
+      }
+      & > span:nth-child(2) {
+        color: rgb(170, 170, 170);
+        padding-bottom: 10px;
+      }
+    }
+    .flex-style-left {
+      border-left: none;
+    }
+    .table-style {
+      justify-content: space-between;
+      align-items: center;
+      padding: 0 10px;
+      height: 40px;
+      border-bottom: 1px solid rgb(239, 239, 239);
+      &:last-child {
+        border: none;
+      }
+      .table-style-title {
+        color: #aaaaaa;
+      }
+    }
+    .flex-box {
+      justify-content: space-between;
+    }
+  }
+  //   鍙宠竟
+  & > .right {
+    margin-left: 20px;
+    flex: 1;
+    background-color: #fff;
+    padding: 30px;
+    border-radius: 5px;
+  }
+}
+// .c {
+//   background-image: url("../../assets/loginBackground.jpg");
+//   width: 100vw;
+//   // height: calc(100vh - 75px);
+//   height: 100%;
+//   background-size: cover;
+// }
+// .bg {
+//   width: 100%;
+//   height: 100%;
+//   background: rgba(255, 255, 255, 0.2);
+//   display: flex;
+//   justify-content: center;
+// }
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0 0 0;
+    position: relative;
+    & p {
+      font-weight: 700;
+    }
+  }
+}
+.back {
+  position: absolute;
+  top: 0px;
+  left: -30px;
+}
+// 鍏充簬
+.indent {
+  font-size: 12px;
+  // 棣栬缂╄繘
+  text-indent: 24px;
+  color: #7f7f7f;
+  // 璁剧疆琛岄珮锛屾拺寮�琛岄珮
+  line-height: 20px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/Education/TeacherManage.vue b/src/views/Manage/Education/TeacherManage.vue
new file mode 100644
index 0000000..2ce241f
--- /dev/null
+++ b/src/views/Manage/Education/TeacherManage.vue
@@ -0,0 +1,300 @@
+<!-- 鏁欏笀绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="鏁欏笀绠$悊" />
+        <div class="main-1">
+          <div
+            class="main-btn flex"
+            style="justify-content:space-between"
+          >
+            <div>
+              <s-button
+                colorType="deepBlue"
+                style="margin-right:20px;"
+                @click="getPopUp"
+              >鏂板鏁欏笀</s-button>
+              <s-button
+                colorType="deepBlue"
+                style="margin-right:20px;"
+                plain
+              >鎵归噺瀵煎嚭</s-button>
+              <s-button
+                colorType="deepBlue"
+                plain
+              >鎵归噺瀵煎叆</s-button>
+            </div>
+            <div
+              class="flex"
+              style="align-items:center"
+            >
+              <p>鎺掑簭鏂瑰紡</p>
+              <el-select>
+                <el-option></el-option>
+              </el-select>
+              <p style="margin-left:20px;">鎵�鍦ㄥ崟浣�</p>
+              <el-select>
+                <el-option></el-option>
+              </el-select>
+            </div>
+          </div>
+          <div>
+            <div>
+              <el-table
+                :data="tableData"
+                :row-style="{height:'40px'}"
+                :cell-style="{padding: '0'}"
+              >
+                <el-table-column
+                  type="selection"
+                  width="55"
+                ></el-table-column>
+                <el-table-column
+                  label="鍚嶅瓧"
+                  prop="name"
+                ></el-table-column>
+                <el-table-column
+                  label="閮ㄩ棬"
+                  prop="department"
+                ></el-table-column>
+                <el-table-column
+                  label="鎬у埆"
+                  prop="sex"
+                ></el-table-column>
+                <el-table-column
+                  label="鏁欒偛"
+                  prop="education"
+                ></el-table-column>
+                <el-table-column
+                  label="鑱旂郴鐢佃瘽"
+                  prop="phone"
+                ></el-table-column>
+                <el-table-column
+                  label="鐢靛瓙閭欢"
+                  prop="email"
+                ></el-table-column>
+                <!-- <el-table-column label="鐢靛瓙閭欢" prop="personNum"></el-table-column> -->
+                <el-table-column
+                  label="鍔犲叆鏃堕棿"
+                  prop="ctime"
+                ></el-table-column>
+                <el-table-column label="鎿嶄綔">
+                  <template slot-scope="scope">
+                    <el-button
+                      type="text"
+                      style="color:rgb(245, 155, 34)"
+                      autofocus
+                      @click="detailsTo"
+                    >鏌ョ湅</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="1000"
+              >
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+    <ClassPopUp
+      ref="popUp"
+      @children="parentGoods"
+    />
+  </div>
+</template>
+
+<script>
+import ClassPopUp from "./../../../components/PopUp/classPopUp.vue";
+export default {
+  // 娉ㄥ唽
+  components: {
+    ClassPopUp,
+  },
+
+  data() {
+    return {
+      searchData: {
+        subject: null,
+      },
+      tableData: [
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+        {
+          name: "寮犺�佸笀",
+          department: "鏁欑爺缁�",
+          sex: "鐢�",
+          education: "纭曞+瀛︿綅",
+          phone: "182-9384-9302",
+          email: "info@exaple.com",
+          ctime: "2022-5-10 14:00",
+        },
+      ],
+      pageData: {
+        size: 7,
+        page: 1,
+      },
+    };
+  },
+  methods: {
+    routerTo(url) {
+      this.$router.push(url);
+    },
+    // 鏌ョ湅璇︽儏
+    detailsTo() {
+      this.$router.push({
+        name: "teacherDetail",
+      });
+    },
+    // 鐐瑰嚮鍚庤皟鐢ㄥ脊绐楃粍浠剁殑鏂规硶,寮�鍚脊绐�
+    getPopUp() {
+      this.$refs.popUp.showDialog();
+    },
+    // 寮圭獥
+    // 鎺ユ敹寮圭獥缁勪欢杩斿洖鐨勮〃鍗曞��
+    parentGoods(obj) {
+      console.log(obj, "寮圭獥缁勪欢鐨勮〃鍗曞��");
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+// .c{
+//     background-image:url('../../assets/img/loginBackground.jpg');
+//     width:100vw;
+//     height:calc(100vh - 75px);
+//     background-size: cover;
+// }
+// .bg{
+//     width:100%;
+//     height:100%;
+//     background: rgba(255,255,255,0.2);
+//     display: flex;
+//     justify-content: center;
+
+// }
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    // height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 22px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/Email/index.vue b/src/views/Manage/Email/index.vue
new file mode 100644
index 0000000..3c95a23
--- /dev/null
+++ b/src/views/Manage/Email/index.vue
@@ -0,0 +1,91 @@
+<!-- 鐢靛瓙閭 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-title">
+          <p>鐢靛瓙閭</p>
+          <div
+            class="back"
+            @click="goBack"
+          ><svg
+              t="1651823534392"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              content-inquire
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="1892"
+              width="20"
+              height="20"
+            >
+              <path
+                d="M896 544H250.4l242.4 242.4L448 832 173.6 557.6 128 512l45.6-45.6L448 192l45.6 45.6L250.4 480H896v64z"
+                p-id="1893"
+                fill="#515151"
+              ></path>
+            </svg></div>
+        </div>
+        <div class="content">
+          <template class="flex">
+            <el-tabs tab-position="left">
+              <el-tab-pane label="鏀朵欢绠�(123)">
+                <MailManagenment />
+              </el-tab-pane>
+              <el-tab-pane label="宸插彂閫�"></el-tab-pane>
+              <el-tab-pane label="閲嶈淇℃伅"></el-tab-pane>
+              <el-tab-pane label="鑽夌绠�"></el-tab-pane>
+              <el-tab-pane label="鍥炴敹绔�"></el-tab-pane>
+            </el-tabs>
+          </template>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import MailManagenment from "../../../components/MailManagement/index.vue";
+export default {
+  components: { MailManagenment },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+  //   flex-wrap: wrap;
+  //   justify-content: space-around;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+    position: relative;
+    & p {
+      font-weight: 700;
+    }
+  }
+}
+.back {
+  position: absolute;
+  top: 0px;
+  left: -30px;
+}
+</style>
+
+
diff --git a/src/views/Manage/ExaminationManagement/index.vue b/src/views/Manage/ExaminationManagement/index.vue
new file mode 100644
index 0000000..c7518d8
--- /dev/null
+++ b/src/views/Manage/ExaminationManagement/index.vue
@@ -0,0 +1,244 @@
+<!-- 鑰冭瘯绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <TitleIndex title='鑰冭瘯绠$悊' />
+        <div class="main-1">
+          <div
+            class="main-btn flex"
+            style="justify-content:space-between"
+          >
+            <div>
+              <s-button
+                colorType="deepBlue"
+                style="margin-right:20px;"
+              >鏂板鑰冭瘯</s-button>
+            </div>
+          </div>
+          <div>
+            <div>
+              <el-table
+                :data="tableData"
+                border
+                :row-style="{height:'42px'}"
+                :cell-style="{padding: '0'}"
+              >
+                <el-table-column
+                  align="center"
+                  label="鑰冭瘯鍚嶇О"
+                  prop="title"
+                  width="80px"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鍦扮偣"
+                  align="center"
+                  width="80px"
+                  prop="place"
+                ></el-table-column>
+                <el-table-column
+                  width="100px"
+                  align="center"
+                  label="鑰冭瘯绉戠洰"
+                  prop="subjects"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="100px"
+                  label="浜烘暟涓婇檺"
+                  prop="num"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="120px"
+                  label="鐘舵��"
+                  prop="condition"
+                >
+                  <template slot-scope="scope">
+                    <span :class="{}">宸插紑濮�</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  width="140px"
+                  label="鑰冭瘯鏃堕棿"
+                  align="center"
+                  prop="time"
+                ></el-table-column>
+                <el-table-column
+                  width="90px"
+                  label="鑰冭瘯鏃堕暱"
+                  align="center"
+                  prop="duration"
+                ></el-table-column>
+                <el-table-column
+                  width="90px"
+                  label="璇曞嵎鍚嶇О"
+                  align="center"
+                  prop="paperName"
+                ></el-table-column>
+                <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <el-button>鐝骇楠岃瘉</el-button>
+                    <el-button>閫氱煡</el-button>
+                    <el-button @click="routersTo()">鎴愬憳绠$悊</el-button>
+                    <el-button>娣诲姞鎴愬憳</el-button>
+                    <el-select
+                      v-model="value"
+                      style="width:74px;margin-left: 10px;"
+                      placeholder="閫夋嫨"
+                    >
+                      <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="1000"
+              >
+              </el-pagination>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      value: "",
+      searchData: {
+        subject: null,
+      },
+      tableData: [
+        {
+          title: "璇枃01",
+          //   鍦扮偣
+          place: "鏈烘埧416",
+          //   绉戠洰
+          subjects: "璇枃",
+          // 浜烘暟
+          num: "25",
+          //   鐘舵��
+          condition: false,
+          //   鏃堕棿
+          time: "2022-3-30 12:00",
+          //   鏃堕暱
+          duration: "90",
+          paperName: "璇枃娴嬭瘯鍗�",
+        },
+        {
+          title: "璇枃01",
+          //   鍦扮偣
+          place: "鏈烘埧416",
+          //   绉戠洰
+          subjects: "璇枃",
+          // 浜烘暟
+          num: "25",
+          //   鐘舵��
+          condition: true,
+          //   鏃堕棿
+          time: "2022-3-30 12:00",
+          //   鏃堕暱
+          duration: "90",
+          paperName: "璇枃娴嬭瘯鍗�",
+        },
+      ],
+      pageData: {
+        size: 7,
+        page: 1,
+      },
+    };
+  },
+  methods: {
+    // // 鏌ョ湅璇︽儏
+    // detailsTo() {
+    //   this.$router.push({
+    //     name: "teacherDetail",
+    //   });
+    // },
+    // 璺宠浆(鏌ョ湅鐝骇浜哄憳鎯呭喌)
+    routersTo() {
+      this.$router.push({
+        name: "ClassStaff",
+      });
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 30px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    // height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 10px;
+    margin-bottom: 20px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+  .conditon_Style1 {
+    color: red;
+  }
+  .conditon_Style2 {
+    color: aqua;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/Index.vue b/src/views/Manage/Index.vue
new file mode 100644
index 0000000..0c554a0
--- /dev/null
+++ b/src/views/Manage/Index.vue
@@ -0,0 +1,18 @@
+<template>
+  <div>
+    <router-view>
+
+    </router-view>
+  </div>
+</template>
+
+<script>
+export default {
+  created() {
+    this.$store.commit("SET_HEADER_NUM", 4);
+  },
+};
+</script>
+
+<style>
+</style>
diff --git a/src/views/Manage/Manage.vue b/src/views/Manage/Manage.vue
new file mode 100644
index 0000000..ba4d18f
--- /dev/null
+++ b/src/views/Manage/Manage.vue
@@ -0,0 +1,801 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-title">
+          <p>搴旂敤绠$悊</p>
+        </div>
+        <div class="main-1">
+          <div class="main-t">
+            鏁欒偛鏈嶅姟
+          </div>
+          <div class="main-1-list">
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/attendance-record')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鑰冨嫟璁板綍鏄庣粏</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>璇峰亣绠$悊</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/score-inquiry')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鎴愮哗鏌ヨ</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/credit-hour')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>瀛﹀垎璁$畻瑙勫垯</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>缃戜笂鎶ュ悕</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/timetable')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>璇剧▼琛�</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鍥句功绠$悊</p>
+            </div>
+            <div
+              class="main-1-con"
+              key=""
+              @click="routersTo('/manage/test-paper')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>璇曞嵎绠$悊</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鏁欏璧勬簮</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/class-management')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鐝骇绠$悊</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/examination-management')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鑰冭瘯绠$悊</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>璇句欢鍒朵綔</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/teacher-manage')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鏁欏笀绠$悊</p>
+            </div>
+            <!-- 棰樺簱绠$悊 -->
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/question-bank')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>棰樺簱绠$悊</p>
+            </div>
+          </div>
+        </div>
+
+        <div class="main-1">
+          <div class="main-t">
+            鍚庡嫟绠$悊
+          </div>
+          <div class="main-1-list">
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/email')"
+            >
+              <div class="icon-bg1 icon-bg2">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鐢靛瓙閭欢</p>
+            </div>
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/Announce')"
+            >
+              <div class="icon-bg1 icon-bg2">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>鍙戝竷鍏憡</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1 icon-bg2">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>璐㈠姟绠$悊</p>
+            </div>
+            <div class="main-1-con">
+              <div class="icon-bg1 icon-bg2">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>棰勭害璁㈤</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {
+    routersTo(url) {
+      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
+      this.$router.push({
+        path: url,
+      });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.icon-bg1 {
+  width: 22px;
+  height: 22px;
+  background: rgb(254, 155, 34);
+  border-radius: 22px;
+  // padding-left:5px;
+  // padding-bottom:5px;
+  box-sizing: border-box;
+  & svg {
+    margin-left: 7px;
+    margin-top: -7px;
+  }
+}
+.icon-bg2 {
+  background: rgb(2, 191, 191);
+}
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-t {
+    font-size: 16px;
+    margin-bottom: 20px;
+  }
+  &-1 {
+    &-list {
+      display: flex;
+      flex-wrap: wrap;
+      width: 1130px;
+    }
+    &-con {
+      width: 250px;
+      height: 105px;
+      background: white;
+      margin-right: 20px;
+      margin-bottom: 20px;
+      border-radius: 10px;
+      box-shadow: 2px 2px 2px 2px rgba(0, 0, 0, 0.2);
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      cursor: pointer;
+      & p {
+        margin-left: 20px;
+        font-size: 14px;
+      }
+
+      &:hover {
+        box-shadow: 3px 3px 3px 3px rgba(0, 0, 0, 0.2);
+      }
+    }
+  }
+}
+// .c{
+//     background-image:url('../../assets/img/loginBackground.jpg');
+//     width:100vw;
+//     height:calc(100vh - 75px);
+//     background-size: cover;
+
+// }
+// .bg{
+//     width:100%;
+//     height:100%;
+//     background: rgba(255,255,255,0.2);
+//     display: flex;
+//     justify-content: center;
+
+// }
+</style>
\ No newline at end of file
diff --git a/src/views/Manage/ScoreInquiry/index.vue b/src/views/Manage/ScoreInquiry/index.vue
new file mode 100644
index 0000000..ac665ed
--- /dev/null
+++ b/src/views/Manage/ScoreInquiry/index.vue
@@ -0,0 +1,234 @@
+<!-- 鎴愮哗鏌ヨ -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="鎴愮哗鏌ヨ" />
+        <div class="content">
+          <!-- 鎼滅储 -->
+          <div>
+            <el-form
+              :inline="true"
+              :model="formLabelAlign"
+              class="demo-form-inline"
+              :label-position="labelPosition"
+              label-width="80px"
+            >
+              <el-form-item label="娲诲姩鍖哄煙">
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="娲诲姩鍖哄煙"
+                >
+                  <el-option
+                    label="鍖哄煙涓�"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="鍖哄煙浜�"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="娲诲姩鍖哄煙">
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="娲诲姩鍖哄煙"
+                >
+                  <el-option
+                    label="鍖哄煙涓�"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="鍖哄煙浜�"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="瀛﹀彿">
+                <el-input v-model="formLabelAlign.type"></el-input>
+              </el-form-item>
+              <el-form-item label="">
+                <el-button
+                  style="width:100px;margin-top: 42px;"
+                  type="primary"
+                  size="small"
+                >鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <!-- 淇敼琛ㄦ牸鐨勯珮搴� -->
+          <!-- :row-style="{height:'30px'}"
+            :cell-style="{padding: '0'}" -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;"
+            :row-style="{height:'34px'}"
+            :cell-style="{padding: '0'}"
+          >
+            <el-table-column
+              prop="date"
+              label="瀛﹀勾"
+              width="100"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              label="瀛︽湡"
+              width="150"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="address"
+              label="瀛﹀彿"
+              width="150"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="date"
+              label="璇剧▼鍚嶇О"
+              width="180"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              label="鏄惁鍚堟牸"
+              width="100"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="address"
+              label="鎴愮哗"
+            >
+            </el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  @click="handleEdit(scope.$index, scope.row)"
+                >鏌ョ湅璇曞嵎</el-button>
+                <el-button
+                  size="mini"
+                  type="danger"
+                  @click="handleDelete(scope.$index, scope.row)"
+                >瀵煎嚭璇曞嵎</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <el-pagination
+              style="margin:auto"
+              background
+              :page-size="10"
+              layout="prev, pager, next, jumper"
+              :total="100"
+            >
+            </el-pagination>
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      labelPosition: "top",
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+        {
+          date: "2016-05-02",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-04",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-01",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-03",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-02",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-04",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-01",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-03",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-02",
+          name: "鐜嬪皬铏�",
+          address: "1234568798788",
+        },
+        {
+          date: "2016-05-04",
+          name: "鐜嬪皬铏�",
+          address: "5252252552555",
+        },
+      ],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/Manage/TestPaper/QuestionBank.vue b/src/views/Manage/TestPaper/QuestionBank.vue
new file mode 100644
index 0000000..b4f6d6b
--- /dev/null
+++ b/src/views/Manage/TestPaper/QuestionBank.vue
@@ -0,0 +1,262 @@
+<!-- 椤屽韩绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 寰呰繑鍥炵殑鏍囬 -->
+        <TitleIndex title="棰樺簱绠$悊" />
+        <div class="content">
+          <!-- 璇曞嵎鐢熸垚鎸夐挳 -->
+          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
+            <el-button
+              type="primary"
+              @click="getDialogFormVisible"
+            >褰曞叆棰樼洰</el-button>
+          </div>
+          <!-- 鎼滅储 -->
+          <div>
+            <el-form
+              :inline="true"
+              :model="formLabelAlign"
+              class="demo-form-inline"
+              label-width="80px"
+            >
+              <el-form-item>
+                <el-input
+                  v-model="formLabelAlign.type"
+                  placeholder="棰樼洰鍚�"
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="鍏ㄩ儴绉戠洰"
+                >
+                  <el-option
+                    label="鍏ㄩ儴绉戠洰"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="璇枃"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鏁板"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鑻辫"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="閫夋嫨棰�"
+                >
+                  <el-option
+                    label="閫夋嫨棰�"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="闂瓟棰�"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鍒ゆ柇棰�"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+
+              <el-form-item label="">
+                <el-button
+                  style="width:100px;"
+                  type="primary"
+                  size="small"
+                >鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table
+            :header-cell-style="getRowClass"
+            :data="tableData"
+            border
+            style="width: 100%;"
+          >
+            <el-table-column
+              align="center"
+              prop="title"
+              label="棰樼洰鍚�"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="subject"
+              label="绉戠洰"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="type"
+              label="棰樼洰绫诲瀷"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="score"
+              label="鍙傝�冪瓟妗�"
+            >
+            </el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              align="center"
+            >
+              <el-button type="text">缂栬緫</el-button>
+              <el-button type="text">鍒犻櫎</el-button>
+            </el-table-column>
+          </el-table>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <el-pagination
+              style="margin:auto"
+              background
+              :page-size="10"
+              layout="prev, pager, next, jumper"
+              :total="100"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+
+    </div>
+    <PopUp
+      ref="popUp"
+      @children="parentGoods"
+    />
+  </div>
+</template>
+<script>
+// 寮曞叆褰堝嚭绐楀彛绲勪欢
+import PopUp from "../../../components/PopUp/Question.vue";
+export default {
+  // 娉ㄥ唽
+  components: {
+    PopUp,
+  },
+  data() {
+    return {
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A", "B"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: ["A"],
+        },
+      ],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+
+    // 鐢熸垚璇曞嵎
+    getCreate() {
+      // 璺宠浆鍒扮敓鎴愰〉闈�
+      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
+      this.$router.push({
+        path: "/manage/test-paper-generation",
+      });
+    },
+
+    // 鐐瑰嚮鍚庤皟鐢ㄥ脊绐楃粍浠剁殑鏂规硶,寮�鍚脊绐�
+    getDialogFormVisible() {
+      this.$refs.popUp.showDialog();
+    },
+    // 寮圭獥
+    // 鎺ユ敹寮圭獥缁勪欢杩斿洖鐨勮〃鍗曞��
+    parentGoods(obj) {
+      console.log(obj, "寮圭獥缁勪欢鐨勮〃鍗曞��");
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/Manage/TestPaper/TestPaperGeneration.vue b/src/views/Manage/TestPaper/TestPaperGeneration.vue
new file mode 100644
index 0000000..3b9bbc4
--- /dev/null
+++ b/src/views/Manage/TestPaper/TestPaperGeneration.vue
@@ -0,0 +1,304 @@
+<!-- 璇曞嵎鐢熸垚 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title="璇曞嵎鐢熸垚" />
+        <div class="content">
+          <!-- 鎼滅储 -->
+          <div>
+            <el-form
+              :inline="true"
+              :model="formLabelAlign"
+              class="demo-form-inline"
+              label-width="80px"
+            >
+              <el-form-item>
+                <el-input
+                  v-model="formLabelAlign.type"
+                  placeholder="棰樼洰鍚�"
+                ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="棰樼洰绫诲瀷"
+                >
+                  <el-option
+                    label="鍏ㄩ儴棰樼洰"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="閫夋嫨棰�"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="鍒ゆ柇棰�"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="绠�鍗曢"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="鍏ㄩ儴绉戠洰"
+                >
+                  <el-option
+                    label="鍏ㄩ儴绉戠洰"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="璇枃"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鏁板"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+
+              <el-form-item label="">
+                <el-button
+                  style="width:100px;"
+                  type="primary"
+                  size="small"
+                >鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table
+            :row-style="{height:'38px'}"
+            :cell-style="{padding: '0'}"
+            ref="multipleTable"
+            :data="tableData"
+            tooltip-effect="dark"
+            style="width: 100%"
+            @selection-change="handleSelectionChange"
+            border
+          >
+            <el-table-column
+              align="center"
+              type="selection"
+              width="55"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="title"
+              label="棰樼洰鍚�"
+              align="center"
+              width="220"
+              min-width="180"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="type"
+              label="棰樼洰绫诲瀷"
+              align="center"
+              width="120"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="subject"
+              label="绉戠洰"
+              show-overflow-tooltip
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="score"
+              label="鍒嗗��"
+              show-overflow-tooltip
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="reference"
+              label="鍙傝�冪瓟妗�"
+              show-overflow-tooltip
+            >
+            </el-table-column>
+          </el-table>
+          <div style="margin-top: 20px;text-align: center;">
+            <el-button type="primary">鐢熸垚璇曞嵎</el-button>
+          </div>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <el-pagination
+              style="margin:auto"
+              background
+              :page-size="10"
+              layout="prev, pager, next, jumper"
+              :total="100"
+            >
+            </el-pagination>
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+        {
+          // 閫夋嫨
+          isChoice: false,
+          //   棰樼洰鍚嶇О
+          title: "绉嬫ⅷ鑶�",
+          type: "鍒ゆ柇棰�",
+          subject: "璇枃",
+          score: "1",
+          reference: "A",
+        },
+      ],
+      //鎻愪氦鎸夐挳
+      multipleSelection: [],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+
+    // 閫夋嫨
+    handleSelectionChange(val) {
+      console.log(val, "val");
+      this.multipleSelection = val;
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/Manage/TestPaper/index.vue b/src/views/Manage/TestPaper/index.vue
new file mode 100644
index 0000000..f6cf92e
--- /dev/null
+++ b/src/views/Manage/TestPaper/index.vue
@@ -0,0 +1,248 @@
+<!-- 璇曞嵎绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title='璇曞嵎绠$悊' />
+        <div class="content">
+          <!-- 璇曞嵎鐢熸垚鎸夐挳 -->
+          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
+            <el-button
+              type="primary"
+              @click="getCreate"
+            >璇曞嵎鐢熸垚</el-button>
+          </div>
+
+          <!-- 鎼滅储 -->
+          <div>
+            <el-form
+              :inline="true"
+              :model="formLabelAlign"
+              class="demo-form-inline"
+              label-width="80px"
+            >
+              <el-form-item>
+                <el-input v-model="formLabelAlign.type"></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="鍏ㄩ儴绉戠洰"
+                >
+                  <el-option
+                    label="鍏ㄩ儴绉戠洰"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="璇枃"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鏁板"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鑻辫"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-select
+                  v-model="formLabelAlign.region"
+                  placeholder="閫夋嫨棰�"
+                >
+                  <el-option
+                    label="閫夋嫨棰�"
+                    value="shanghai"
+                  ></el-option>
+                  <el-option
+                    label="闂瓟棰�"
+                    value="beijing"
+                  ></el-option>
+                  <el-option
+                    label="鍒ゆ柇棰�"
+                    value="beijing"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+
+              <el-form-item label="">
+                <el-button
+                  style="width:100px;"
+                  type="primary"
+                  size="small"
+                >鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table
+            :header-cell-style="getRowClass"
+            :data="tableData"
+            border
+            style="width: 100%;"
+            :row-style="{height:'40px'}"
+            :cell-style="{padding: '0'}"
+          >
+            <el-table-column
+              align="center"
+              prop="title"
+              label="璇曞嵎鍚�"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="type"
+              label="棰樼洰绫诲瀷"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="subject"
+              label="绉戠洰"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="score"
+              label="鍒嗗��"
+            >
+            </el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              align="center"
+            >
+              <el-button type="text">棰勮</el-button>
+              <el-button type="text">缂栬緫</el-button>
+              <el-button type="text">鍒犻櫎</el-button>
+            </el-table-column>
+          </el-table>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <el-pagination
+              style="margin:auto"
+              background
+              :page-size="10"
+              layout="prev, pager, next, jumper"
+              :total="100"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+
+    </div>
+
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+        {
+          title: "褰揂涓嶣涓�璧蜂慨璺�",
+          type: "閫夋嫨棰�",
+          subject: "璇枃",
+          score: 100,
+        },
+      ],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    //鎻愪氦鎸夐挳
+    onSubmit() {
+      console.log("submit!");
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+
+    // 鐢熸垚璇曞嵎
+    getCreate() {
+      // 璺宠浆鍒扮敓鎴愰〉闈�
+      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
+      this.$router.push({
+        path: "/manage/test-paper-generation",
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/Manage/Timetable/index.vue b/src/views/Manage/Timetable/index.vue
new file mode 100644
index 0000000..4cdbc2d
--- /dev/null
+++ b/src/views/Manage/Timetable/index.vue
@@ -0,0 +1,457 @@
+<!-- 璇剧▼琛� -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 甯﹁繑鍥炵殑鏍囬 -->
+        <TitleIndex title='璇剧▼琛�' />
+        <div class="content">
+          <el-form
+            ref="form"
+            :model="form"
+            label-width="80px"
+          >
+            <p>鍩烘湰淇℃伅</p>
+            <el-form-item label="璇捐〃鍚嶇О">
+              <el-input
+                style="width:20%"
+                placeholder="璇疯緭鍏ヨ绋嬪悕瀛�"
+              ></el-input>
+            </el-form-item>
+            <p>涓婅鏃堕棿</p>
+            <el-row :gutter="20">
+              <el-col :span="10">
+                <el-form-item label="涓婂崍">
+                  <el-time-picker
+                    :picker-options="{selectableRange: '08:30 - 12:00'}"
+                    placeholder="寮�濮嬫椂闂�"
+                    class="time"
+                  >
+                  </el-time-picker>
+                  <span class="span">鑷�</span>
+                  <el-time-picker
+                    :picker-options="{selectableRange: '13:30 - 6:30'}"
+                    placeholder="缁撴潫鏃堕棿"
+                    class="time"
+                  >
+                  </el-time-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="10">
+                <el-form-item label="涓嬪崍">
+                  <el-time-picker
+                    :picker-options="{selectableRange: '08:30 - 12:00'}"
+                    placeholder="寮�濮嬫椂闂�"
+                    class="time"
+                  >
+                  </el-time-picker>
+                  <span class="span">鑷�</span>
+                  <el-time-picker
+                    :picker-options="{selectableRange: '13:30 - 6:30'}"
+                    placeholder="缁撴潫鏃堕棿"
+                    class="time"
+                  >
+                  </el-time-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="10">
+                <el-form-item label="鏅氫笂">
+                  <el-time-picker
+                    :picker-options="{selectableRange: '08:30 - 12:00'}"
+                    placeholder="寮�濮嬫椂闂�"
+                    class="time"
+                  >
+                  </el-time-picker>
+                  <span class="span">鑷�</span>
+                  <el-time-picker
+                    :picker-options="{selectableRange: '13:30 - 6:30'}"
+                    placeholder="缁撴潫鏃堕棿"
+                    class="time"
+                  >
+                  </el-time-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+          <p>璇剧▼琛�</p>
+          <div>
+            <el-button type="primary">缂栬緫璇捐〃</el-button>
+            <el-button>瀵煎叆璇捐〃</el-button>
+            <el-button>瀵煎嚭璇捐〃</el-button>
+            <el-select
+              v-model="value"
+              placeholder="璇烽�夋嫨"
+              style="float:right"
+            >
+              <el-option>
+              </el-option>
+            </el-select>
+          </div>
+          <el-table
+            :cell-style="columnbackgroundStyle"
+            :data="tableData"
+            height="400"
+            border
+            style="width: 100%;margin: 20px 0;"
+            :row-style="{height:'100px'}"
+          >
+            <el-table-column
+              prop="date"
+              label="鏃堕棿/鏃ユ湡"
+              width="180"
+            >
+            </el-table-column>
+            <el-table-column label="涓婂崍(9:00-11:30)">
+              <template slot-scope="scope">
+                <el-row :gutter="24">
+                  <el-col
+                    :span="item.id*6"
+                    v-for="item in scope.row.arr"
+                  >
+                    <div class="grid-content bg-purple flex">
+                      <span>璇剧▼鍚嶇О</span>
+                      <span>{{item.course}}</span>
+                      <span>鑰佸笀</span>
+                      <span>{{item.name}}</span>
+                    </div>
+                  </el-col>
+                </el-row>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鍗堜紤"
+              width="100px"
+            >
+            </el-table-column>
+            <el-table-column label="涓婂崍(13:00-18:30)">
+              <template slot-scope="scope">
+                <el-row :gutter="24">
+                  <el-col
+                    :span="item.id*6"
+                    v-for="item in scope.row.arr1"
+                  >
+                    <div class="grid-content bg-purple flex">
+                      <span>璇剧▼鍚嶇О</span>
+                      <span>{{item.course}}</span>
+                      <span>鑰佸笀</span>
+                      <span>{{item.name}}</span>
+                    </div>
+                  </el-col>
+                </el-row>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      form: {},
+      tableData: [
+        {
+          date: "6鏈�17(鍛ㄤ竴)",
+          arr: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 2,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          arr1: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀18(鍛ㄤ簩)",
+          arr: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 2,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          arr1: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀19 (鍛ㄤ笁)",
+          arr: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 2,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          arr1: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀20(鍛ㄥ洓)",
+          arr: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 2,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          arr1: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀21(鍛ㄤ簲)",
+          arr: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          arr1: [
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+            {
+              id: 1,
+              course: "璇枃",
+              name: "寮犺�佸笀",
+            },
+          ],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀22(鍛ㄥ叚)",
+          arr: [],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "鍏湀20(鍛ㄥぉ)",
+          arr: [],
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+      ],
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    // 鏀瑰彉Table鏌愪竴鍒楃殑鑳屾櫙棰滆壊
+    // columnIndex涓哄垪涓嬫爣
+    columnbackgroundStyle({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex == 0) {
+        //璁╀笅鏍囦负1鐨勫垪鏁拌儗鏅鑹叉樉绀轰负绾㈣壊锛堥鑹茶嚜瀹氫箟鏍规嵁澶у闇�姹傛潵锛�
+        return "background:#82bbd7;";
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+
+.content {
+  padding: 10px 100px;
+  //   璇剧▼琛ㄨ鎯�
+  .course_details {
+    width: 100%;
+    height: 300px;
+    border: 1px solid;
+    margin-top: 30px;
+    border-radius: 5px;
+  }
+}
+.time {
+  width: 36%;
+}
+.span {
+  padding: 0 10px;
+}
+
+// 鍒嗘爮甯冨眬
+
+.el-row {
+  margin-bottom: 20px;
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+.el-col {
+  border-radius: 4px;
+}
+.bg-purple-dark {
+  background: #99a9bf;
+}
+.bg-purple {
+  background: #d3dce6;
+  flex-direction: column;
+  padding: 10px;
+}
+.bg-purple-light {
+  background: #e5e9f2;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.row-bg {
+  padding: 10px 0;
+  background-color: #f9fafc;
+}
+</style>
diff --git a/src/views/Teach/Index.vue b/src/views/Teach/Index.vue
new file mode 100644
index 0000000..68405c7
--- /dev/null
+++ b/src/views/Teach/Index.vue
@@ -0,0 +1,20 @@
+<template>
+  <div>
+      <router-view>
+
+      </router-view>
+  </div>
+</template>
+
+<script>
+
+export default {
+    created(){
+        this.$store.commit('SET_HEADER_NUM', 3)
+    },
+}
+</script>
+
+<style>
+
+</style>
diff --git a/src/views/Teach/Teach.vue b/src/views/Teach/Teach.vue
new file mode 100644
index 0000000..ddda1d3
--- /dev/null
+++ b/src/views/Teach/Teach.vue
@@ -0,0 +1,247 @@
+<template>
+    <div class="c">
+        <div class="bg">
+            <div class="main">
+                <div class="list">
+                    <div class="card list-con" v-for="item in curriculum">
+                        <img src="@/assets/img/teach/list-card-bg.jpg" style="height:220px;width:350px" alt=""
+                            v-if="!item.start">
+                        <video :id="`video-${item.id}`" v-show="item.start" height="220px" width="350px"></video>
+                        <div class="list-con-t">
+                            <p>涓婅鏃堕棿</p>
+                            <span>{{ item.time }}</span>
+                        </div>
+                        <div class="list-con-op">
+                            <s-button colorType="default">璧勬枡涓婁紶</s-button>
+                            <s-button colorType="deepBlue" @click="handleStart(item)">寮�濮嬩笂璇�</s-button>
+                        </div>
+                    </div>
+                </div>
+                <div class="flex" style="justify-content:center;margin-top:20px;">
+                    <el-pagination background layout="prev, pager, next" :total="1000">
+                    </el-pagination>
+                </div>
+            </div>
+        </div>
+
+        <s-dialog v-model="dialog" title="璇烽�夋嫨鎺堣鏂瑰紡">
+            <template>
+                <div style="width:300px; padding:20px; justify-content:space-between" class="flex">
+                    <s-button colorType="default">璇煶鎺堣</s-button>
+                    <s-button colorType="deepBlue" @click="selectScreen">瑙嗛鎺堣</s-button>
+                </div>
+            </template>
+        </s-dialog>
+
+        <el-dialog title="閫夋嫨鎺堣灞忓箷" :visible.sync="dialogScreenVisible" width="60%">
+            <div v-for="(source, index) in sources" :key="source.id" class="sourceDiv"
+                :class="{ defaultSelect: index === selectIndex }" @click="selectSource(index, source)">
+                <video width="220" height="140" :id="`video-${source.id}`">
+                    鎮ㄧ殑娴忚鍣ㄤ笉鏀寔 video 鏍囩銆�
+                </video>
+                {{ source.name }}
+            </div>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+                <el-button type="primary" @click="dialogScreenVisible = false; screenConfirm()">纭� 瀹�</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { desktopCapturer } from 'electron';
+
+export default {
+    data () {
+        return {
+            dialog: false,
+            dialogScreenVisible: false,
+            sources: null,
+            selectIndex: 0,
+            currentSource: null,
+            currentItem: null,
+            curriculum: [
+                {
+                    id: 1,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+                {
+                    id: 2,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+                {
+                    id: 3,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+                {
+                    id: 4,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+                {
+                    id: 5,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+                {
+                    id: 6,
+                    start: false,
+                    time: '12:30 - 13:30'
+                },
+            ],
+
+        }
+    },
+    methods: {
+        handleStart (i) {
+            this.dialog = true;
+            this.currentItem = i
+        },
+        selectSource (index, source) {
+            this.selectIndex = index
+            this.currentSource = source
+        },
+        screenConfirm () {
+            this.getSource(this.currentSource, `video-${this.currentItem.id}`, true)
+        },
+        async selectScreen () {
+            this.dialog = false
+            const sources = await desktopCapturer.getSources({ types: ['window', 'screen'] })
+            this.sources = sources
+            this.getSources(sources)
+        },
+        async getSources (sources, containerId) {
+            const _this = this
+            await sources.forEach(source => {
+                _this.getSource(source, containerId)
+            })
+        },
+        async getSource (source, containerId, isPush) {
+            const constraints = {
+                audio: false,
+                video: {
+                    mandatory: {
+                        chromeMediaSource: 'desktop',
+                        chromeMediaSourceId: source.id,
+                        minWidth: 1440,
+                        maxWidth: 1920,
+                        minHeight: 900,
+                        maxHeight: 1080
+                    }
+                }
+            }
+            await this.getUserMedia(source, containerId, constraints, isPush)
+        },
+        async getUserMedia (source, containerId, constraints, isPush) {
+            const _this = this
+
+            await navigator.mediaDevices.getUserMedia(constraints)
+                .then(function (mediaStream) {
+                    if (!isPush) {
+                        _this.dialogScreenVisible = true
+                    } else {
+                        _this.dialogScreenVisible = false
+                        _this.currentItem.start = true
+                    }
+                    var video = document.getElementById(containerId ? containerId : `video-${source.id}`);
+
+                    video.srcObject = mediaStream;
+                    video.onloadedmetadata = async function (e) {
+                        video.play();
+                        if (isPush) {
+                            let stream = new MediaStream()
+                            stream.addTrack(mediaStream.getVideoTracks()[0])
+
+                            let audio1 = await getDisplayMediaSource('microphone')
+                            // if (audio1) {
+
+                            //   stream.addTrack(audio1.getAudioTracks()[0])
+
+                            //   // _this.sdk.ontrack()
+                            //   // console.log(audio1.getAudioTracks()[0])
+                            //   // mediaStream.addTrack(audio1.getAudioTracks()[0])
+                            // }
+                            let audio2 = await getDisplayMediaSource('system')
+                            // if (audio2) {
+                            //   stream.addTrack(audio2.getAudioTracks()[0])
+                            //   // 灏嗚幏鍙栫殑闊抽娴佹暟鎹坊鍔犲埌瑙嗛娴�
+                            //   // mediaStream.addTrack(audio2.getAudioTracks()[0])
+                            // }
+                            stream.addTrack(...mergeAudioStreams(audio1, audio2))
+                            startPublish(`teacher/${_this.currentItem.id}`, stream)
+                            //     // SrsRtcPublisherAsync().publish('webrtc://192.168.3.115/live/livestream', mediaStream)
+                        }
+
+                    };
+                })
+                .catch(function (err) { console.log(err.name + ": " + err.message); }); // 鎬绘槸鍦ㄦ渶鍚庢鏌ラ敊璇�
+
+        },
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.flex {
+    display: flex;
+}
+
+.card {
+    background: white;
+    box-shadow: 2px 2px 2px 2px rgba(0, 0, 0, 0.2);
+    padding: 20px;
+    box-sizing: border-box;
+    margin-bottom: 20px;
+    border-radius: 10px;
+}
+
+.list {
+    margin-top: 50px;
+    width: 1262px;
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+
+    &-con {
+        &-t {
+            &>p {
+                margin-top: 10px;
+                margin-bottom: 0px;
+            }
+
+            &>span {
+                color: #777;
+            }
+        }
+
+        &-op {
+            justify-content: space-between;
+            display: flex;
+        }
+    }
+}
+
+.sourceDiv {
+    display: inline-flex;
+    margin-right: 10px;
+    flex-direction: column;
+    padding: 5px;
+}
+
+.sourceDiv.defaultSelect {
+    background-color: cornsilk;
+}
+
+.sourceDiv:hover {
+    background-color: aliceblue;
+}
+
+.sourceDiv:active {
+    background-color: cornsilk;
+}
+</style>
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
index df4a797..4e4ab66 100644
--- a/src/views/dashboard/index.vue
+++ b/src/views/dashboard/index.vue
@@ -1,297 +1,316 @@
 <template>
-  <div class="dashboard-container">
-    <el-row :gutter="40" class="panel-group">
-      <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
-        <div class="card-panel">
-          <div class="card-panel-icon-wrapper icon-people">
-            <svg-icon icon-class="exam" class-name="card-panel-icon"/>
-          </div>
-          <div class="card-panel-description">
-            <div class="card-panel-text">
-              璇曞嵎鎬绘暟
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="m1">
+          <div
+            class="card"
+            style="width:310px; margin-bottom:20px;"
+          >
+            <p class="card-title">瀛︾敓鎬绘暟</p>
+            <p class="card-num">3250</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:75%; background:rgb(99,1,190)"
+              ></div>
             </div>
-            <count-to :start-val="0" :end-val="examPaperCount" :duration="2600" class="card-panel-num" v-loading="loading"/>
+            <p class="card-d">20澶╁唴澧炲姞75%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鏂扮敓</p>
+            <p class="card-num">230</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:50%;"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞50%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鎬昏绋�</p>
+            <p class="card-num">3</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:76%; background:rgb(16,71,247)"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞75%</p>
+          </div>
+          <div
+            class="card"
+            style="width:310px;"
+          >
+            <p class="card-title">鏀惰垂</p>
+            <p class="card-num">锟�355000.00</p>
+            <div class="bar">
+              <div
+                class="bar-r"
+                style="width:56%; background:rgb(245,155,34)"
+              ></div>
+            </div>
+            <p class="card-d">20澶╁唴澧炲姞56%</p>
           </div>
         </div>
-      </el-col>
-      <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
-        <div class="card-panel" >
-          <div class="card-panel-icon-wrapper icon-message">
-            <svg-icon icon-class="question" class-name="card-panel-icon"/>
-          </div>
-          <div class="card-panel-description">
-            <div class="card-panel-text">
-              棰樼洰鎬绘暟
+        <div class="m2 card">
+          <p class="card-title">鏀跺叆/璐圭敤鎶ュ憡</p>
+          <img
+            src="@/assets/img/1.jpg"
+            alt=""
+          >
+        </div>
+        <div class="m3 card">
+          <p
+            class="card-title"
+            style="margin-bottom:20px;"
+          >鑰佸笀鍚嶅崟</p>
+          <div class="scrollBar">
+            <div
+              class="m3-con"
+              v-for="(item) in state.listTeachers"
+              :key="item.id"
+            >
+              <div style="display:flex">
+                <img
+                  src="https://img1.baidu.com/it/u=842647274,1455615798&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
+                  alt=""
+                >
+                <div style="margin-left:10px;">
+                  <p class="m3-con-name">{{item.name}}</p>
+                  <p class="m3-con-d">宸ラ緞锛歿{item.workTIme}}骞�<span style="margin-left:50px;">瀛︾敓锛歿{item.students}}涓�</span></p>
+                </div>
+              </div>
+              <div class="m3-con-b">
+                <el-button type="text">鏌ョ湅</el-button>
+              </div>
             </div>
-            <count-to :start-val="0" :end-val="questionCount" :duration="3000" class="card-panel-num" v-loading="loading"/>
+          </div>
+          <div
+            class="m3-btn"
+            style="border-top:1px solid #EBEEF5"
+          >
+            <button
+              class="content_padding"
+              @click="$router.push('/manage/teacher-manage')"
+            >鏌ョ湅鎵�鏈�</button>
           </div>
         </div>
-      </el-col>
-      <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
-        <div class="card-panel">
-          <div class="card-panel-icon-wrapper icon-shopping">
-            <svg-icon icon-class="doexampaper" class-name="card-panel-icon"/>
-          </div>
-          <div class="card-panel-description">
-            <div class="card-panel-text">
-              绛斿嵎鎬绘暟
-            </div>
-            <count-to :start-val="0" :end-val="doExamPaperCount" :duration="3600" class="card-panel-num" v-loading="loading"/>
+        <div class="m4 card">
+          <p
+            class="card-title"
+            style="margin-bottom:20px;"
+          >瀛︾敓鍚嶅崟</p>
+          <el-table
+            :data="state.listStudents"
+            height="80%"
+          >
+            <el-table-column
+              label="瀛︾敓鍚嶇О"
+              prop="name"
+            ></el-table-column>
+            <el-table-column
+              label="鐝骇"
+              prop="className"
+            ></el-table-column>
+            <el-table-column
+              label="鐝富浠�"
+              prop="teacher"
+            ></el-table-column>
+            <el-table-column
+              label="鍏ュ鏃堕棿"
+              prop="inTime"
+            ></el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              width="60px"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  style="color:#f59b22"
+                  type="text"
+                  @click="viewDetails(1)"
+                >鏌ョ湅</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="m3-btn m4-btn content_padding">
+            <button>鏌ョ湅鎵�鏈�</button>
           </div>
         </div>
-      </el-col>
-      <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
-        <div class="card-panel">
-          <div class="card-panel-icon-wrapper icon-money">
-            <svg-icon icon-class="doquestion" class-name="card-panel-icon"/>
-          </div>
-          <div class="card-panel-description">
-            <div class="card-panel-text">
-              绛旈鎬绘暟
-            </div>
-            <count-to :start-val="0" :end-val="doQuestionCount" :duration="3200" class="card-panel-num" v-loading="loading"/>
-          </div>
-        </div>
-      </el-col>
-    </el-row>
-    <el-row class="echarts-line">
-      <div id="echarts-moth-user" style="width: 100%;height:400px;" v-loading="loading"/>
-    </el-row>
-    <el-row class="echarts-line">
-      <div id="echarts-moth-question" style="width: 100%;height:400px;" v-loading="loading"/>
-    </el-row>
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
-import resize from './components/mixins/resize'
-import CountTo from 'vue-count-to'
-import dashboardApi from '@/api/dashboard'
+// import { createNamespacedHelpers } from "vuex";
+// const a = createNamespacedHelpers("home");
+// console.log(a, "a");
+// 闅忔満 mock
+import { listStudent, listTeacher, countStudent } from "@/utils/mock/home";
 export default {
-  mixins: [resize],
-  components: {
-    CountTo
-  },
-  data () {
+  data() {
     return {
-      examPaperCount: 0,
-      questionCount: 0,
-      doExamPaperCount: 0,
-      doQuestionCount: 0,
-      echartsUserAction: null,
-      echartsQuestion: null,
-      loading: false
-    }
+      state: {
+        // 瀛︾敓鍚嶅崟
+        listStudents: listStudent.studentsArr,
+        // 鑰佸笀鍚嶅崟
+        listTeachers: listTeacher.TeachersArr,
+        // 瀛︾敓鎬绘暟
+        countStudents: countStudent.countStudent,
+      },
+    };
   },
-  mounted () {
-    // eslint-disable-next-line no-undef
-    this.echartsUserAction = echarts.init(document.getElementById('echarts-moth-user'), 'macarons')
-    // eslint-disable-next-line no-undef
-    this.echartsQuestion = echarts.init(document.getElementById('echarts-moth-question'), 'macarons')
-    let _this = this
-    this.loading = true
-    dashboardApi.index().then(re => {
-      let response = re.response
-      _this.examPaperCount = response.examPaperCount
-      _this.questionCount = response.questionCount
-      _this.doExamPaperCount = response.doExamPaperCount
-      _this.doQuestionCount = response.doQuestionCount
-      _this.echartsUserAction.setOption(this.option('鐢ㄦ埛娲昏穬搴�', '{b}鏃c}搴�', response.mothDayText, response.mothDayUserActionValue))
-      _this.echartsQuestion.setOption(this.option('棰樼洰鏈堟暟閲�', '{b}鏃c}棰�', response.mothDayText, response.mothDayDoExamQuestionValue))
-      this.loading = false
-    })
+  computed: {
+    // ...mapState(["listStudents", "listTeachers", "countStudents"]),
   },
   methods: {
-    option (title, formatter, label, vaule) {
-      return {
-        title: {
-          text: title,
-          x: 'center'
-        },
-        tooltip: {
-          trigger: 'item',
-          formatter: formatter
-        },
-        xAxis: {
-          type: 'category',
-          data: label
-        },
-        grid: {
-          left: 10,
-          right: 10,
-          bottom: 20,
-          top: 30,
-          containLabel: true
-        },
-        yAxis: {
-          type: 'value'
-        },
-        series: [{
-          data: vaule,
-          type: 'line'
-        }]
+    // ...mapActions(["getListStudents", "getListTeachers", "getCountStudents"]),
+    // 鏌ョ湅璇︽儏
+    viewDetails(v) {
+      console.log(v);
+    },
+  },
+  mounted() {
+    // this.getListStudents();
+    // this.getListTeachers();
+    // this.getCountStudents();
+    // console.log(this.listStudents, "+++++++++++++++");
+    // this.getAll();
+  },
+  created() {},
+};
+</script>
+<style scoped lang="scss">
+.main {
+  margin-top: 100px;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 1300px;
+}
+.m1 {
+  display: flex;
+  flex-wrap: wrap;
+  width: 640px;
+  justify-content: space-between;
+  align-items: baseline;
+  margin-bottom: 20px;
+}
+.card {
+  background: white;
+  border-radius: 10px;
+  padding: 10px 20px;
+  box-sizing: border-box;
+  display: inline-block;
+
+  &-title {
+    font-size: 16px;
+    color: #777;
+    margin-bottom: 0;
+  }
+  &-num {
+    font-size: 32px;
+    font-weight: 700;
+    margin: 5px 0;
+  }
+  &-d {
+    color: #777;
+    font-size: 12px;
+    margin-top: 5px;
+  }
+}
+.bar {
+  width: 100%;
+  height: 10px;
+  background-color: rgb(242, 242, 242);
+  &-r {
+    background-color: red;
+    height: 100%;
+  }
+}
+.m2 {
+  width: 630px;
+  height: 324px;
+  margin-bottom: 20px;
+}
+.m3 {
+  width: 467px;
+  height: 590px;
+  &-con {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    margin-bottom: 15px;
+    justify-content: space-between;
+    & img {
+      width: 34px;
+      height: 34px;
+      border-radius: 34px;
+    }
+    & p {
+      margin: 0;
+    }
+    &-d {
+      color: #777;
+      font-size: 12px;
+    }
+    &-b {
+      // margin-left: ;
+      color: #f59b22;
+    }
+  }
+  &-btn {
+    display: flex;
+    justify-content: center;
+    & > button {
+      width: 175px;
+      height: 39px;
+      border-color: rgba(16, 71, 247, 1);
+      background: none;
+      border-radius: 5px;
+      color: rgba(16, 71, 247, 1);
+      transition: 0.2s;
+      cursor: pointer;
+      &:hover {
+        background: rgba(16, 71, 247, 1);
+        color: white;
       }
     }
   }
 }
-</script>
-
-<style lang="scss" scoped>
-
-  .dashboard-container {
-    padding: 32px;
-    background-color: rgb(240, 242, 245);
-    position: relative;
-
-    .chart-wrapper {
-      background: #fff;
-      padding: 16px 16px 0;
-      margin-bottom: 32px;
-    }
+.m4 {
+  width: 790px;
+  height: 590px;
+  &-btn {
+    margin-top: 10px;
   }
+}
+.scrollBar {
+  height: 80%;
+  overflow: auto;
+}
+// 婊氬姩鏉�
+.scrollBar::-webkit-scrollbar {
+  width: 0px;
+  height: 0px;
+}
 
-  @media (max-width: 1024px) {
-    .chart-wrapper {
-      padding: 8px;
-    }
-  }
+//闅愯棌婊氬姩鏉�
+/deep/.el-table__body-wrapper::-webkit-scrollbar {
+  width: 0;
+}
 
-  .dashboard-editor-container {
-    padding: 32px;
-    background-color: rgb(240, 242, 245);
-    position: relative;
-
-    .github-corner {
-      position: absolute;
-      top: 0px;
-      border: 0;
-      right: 0;
-    }
-
-    .chart-wrapper {
-      background: #fff;
-      padding: 16px 16px 0;
-      margin-bottom: 32px;
-    }
-  }
-
-  @media (max-width: 1024px) {
-    .chart-wrapper {
-      padding: 8px;
-    }
-  }
-
-  .panel-group {
-    margin-top: 18px;
-
-    .card-panel-col {
-      margin-bottom: 32px;
-    }
-
-    .card-panel {
-      height: 108px;
-      cursor: pointer;
-      font-size: 12px;
-      position: relative;
-      overflow: hidden;
-      color: #666;
-      background: #fff;
-      box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);
-      border-color: rgba(0, 0, 0, .05);
-
-      &:hover {
-        .card-panel-icon-wrapper {
-          color: #fff;
-        }
-
-        .icon-people {
-          background: #40c9c6;
-        }
-
-        .icon-message {
-          background: #36a3f7;
-        }
-
-        .icon-money {
-          background: #f4516c;
-        }
-
-        .icon-shopping {
-          background: #34bfa3
-        }
-      }
-
-      .icon-people {
-        color: #40c9c6;
-      }
-
-      .icon-message {
-        color: #36a3f7;
-      }
-
-      .icon-money {
-        color: #f4516c;
-      }
-
-      .icon-shopping {
-        color: #34bfa3
-      }
-
-      .card-panel-icon-wrapper {
-        float: left;
-        margin: 14px 0 0 14px;
-        padding: 16px;
-        transition: all 0.38s ease-out;
-        border-radius: 6px;
-      }
-
-      .card-panel-icon {
-        float: left;
-        font-size: 48px;
-      }
-
-      .card-panel-description {
-        float: right;
-        font-weight: bold;
-        margin: 26px;
-        margin-left: 0px;
-
-        .card-panel-text {
-          line-height: 18px;
-          color: rgba(0, 0, 0, 0.45);
-          font-size: 16px;
-          margin-bottom: 12px;
-        }
-
-        .card-panel-num {
-          font-size: 20px;
-        }
-      }
-    }
-  }
-
-  @media (max-width: 550px) {
-    .card-panel-description {
-      display: none;
-    }
-
-    .card-panel-icon-wrapper {
-      float: none !important;
-      width: 100%;
-      height: 100%;
-      margin: 0 !important;
-
-      .svg-icon {
-        display: block;
-        margin: 14px auto !important;
-        float: none !important;
-      }
-    }
-  }
-
-  .echarts-line{
-    background:#fff;
-    padding:16px 16px 0;
-    margin-bottom:32px;
-  }
+.content_padding {
+  margin: 20px 0;
+}
 </style>
diff --git a/src/views/exam/paper/edit.vue b/src/views/exam/paper/edit.vue
deleted file mode 100644
index 9185182..0000000
--- a/src/views/exam/paper/edit.vue
+++ /dev/null
@@ -1,278 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="level" required>
-        <el-select v-model="form.level" placeholder="骞寸骇"  @change="levelChange">
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾">
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id"
-                     :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="璇曞嵎绫诲瀷锛�" prop="paperType" required>
-        <el-select v-model="form.paperType" placeholder="璇曞嵎绫诲瀷">
-          <el-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鏃堕棿闄愬埗锛�" required v-show="form.paperType===4">
-        <el-date-picker v-model="form.limitDateTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange"
-                        range-separator="鑷�" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="璇曞嵎鍚嶇О锛�"  prop="name" required>
-        <el-input v-model="form.name"/>
-      </el-form-item>
-      <el-form-item :key="index" :label="'鏍囬'+(index+1)+'锛�'" required v-for="(titleItem,index) in form.titleItems">
-        <el-input v-model="titleItem.name" style="width: 80%"/>
-        <el-button type="text" class="link-left" style="margin-left: 20px" size="mini" @click="addQuestion(titleItem)">
-          娣诲姞棰樼洰
-        </el-button>
-        <el-button type="text" class="link-left" size="mini" @click="form.titleItems.splice(index,1)">鍒犻櫎</el-button>
-        <el-card class="exampaper-item-box" v-if="titleItem.questionItems.length!==0">
-          <el-form-item :key="questionIndex" :label="'棰樼洰'+(questionIndex+1)+'锛�'"
-                        v-for="(questionItem,questionIndex) in titleItem.questionItems" style="margin-bottom: 15px">
-            <el-row>
-              <el-col :span="23">
-                <QuestionShow :qType="questionItem.questionType" :question="questionItem"/>
-              </el-col>
-              <el-col :span="1">
-                <el-button type="text" size="mini" @click="titleItem.questionItems.splice(questionIndex,1)">鍒犻櫎
-                </el-button>
-              </el-col>
-            </el-row>
-          </el-form-item>
-        </el-card>
-      </el-form-item>
-      <el-form-item label="寤鸿鏃堕暱锛�" prop="suggestTime" required>
-        <el-input v-model="form.suggestTime" placeholder="鍒嗛挓"/>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="addTitle">娣诲姞鏍囬</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog :visible.sync="questionPage.showDialog"  width="70%">
-      <el-form :model="questionPage.queryParam" ref="queryForm" :inline="true">
-        <el-form-item label="ID锛�">
-          <el-input v-model="questionPage.queryParam.id"  clearable></el-input>
-        </el-form-item>
-        <el-form-item label="棰樺瀷锛�">
-          <el-select v-model="questionPage.queryParam.questionType" clearable>
-            <el-option v-for="item in questionTypeEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="queryForm">鏌ヨ</el-button>
-        </el-form-item>
-      </el-form>
-      <el-table v-loading="questionPage.listLoading" :data="questionPage.tableData"
-                @selection-change="handleSelectionChange" border fit highlight-current-row style="width: 100%">
-        <el-table-column type="selection" width="35"></el-table-column>
-        <el-table-column prop="id" label="Id" width="60px"/>
-        <el-table-column prop="questionType" label="棰樺瀷" :formatter="questionTypeFormatter" width="70px"/>
-        <el-table-column prop="shortTitle" label="棰樺共" show-overflow-tooltip/>
-      </el-table>
-      <pagination v-show="questionPage.total>0" :total="questionPage.total"
-                  :page.sync="questionPage.queryParam.pageIndex" :limit.sync="questionPage.queryParam.pageSize"
-                  @pagination="search"/>
-      <span slot="footer" class="dialog-footer">
-          <el-button @click="questionPage.showDialog = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="confirmQuestionSelect">纭畾</el-button>
-     </span>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-
-import { mapGetters, mapState, mapActions } from 'vuex'
-import Pagination from '@/components/Pagination'
-import QuestionShow from '../question/components/Show'
-import examPaperApi from '@/api/examPaper'
-import questionApi from '@/api/question'
-
-export default {
-  components: { Pagination, QuestionShow },
-  data () {
-    return {
-      form: {
-        id: null,
-        level: null,
-        subjectId: null,
-        paperType: 1,
-        limitDateTime: [],
-        name: '',
-        suggestTime: null,
-        titleItems: []
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        level: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        paperType: [
-          { required: true, message: '璇烽�夋嫨璇曞嵎绫诲瀷', trigger: 'change' }
-        ],
-        name: [
-          { required: true, message: '璇疯緭鍏ヨ瘯鍗峰悕绉�', trigger: 'blur' }
-        ],
-        suggestTime: [
-          { required: true, message: '璇疯緭鍏ュ缓璁椂闀�', trigger: 'blur' }
-        ]
-      },
-      questionPage: {
-        multipleSelection: [],
-        showDialog: false,
-        queryParam: {
-          id: null,
-          questionType: null,
-          subjectId: 1,
-          pageIndex: 1,
-          pageSize: 5
-        },
-        listLoading: true,
-        tableData: [],
-        total: 0
-      },
-      currentTitleItem: null
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      examPaperApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          examPaperApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/paper/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    addTitle () {
-      this.form.titleItems.push({
-        name: '',
-        questionItems: []
-      })
-    },
-    addQuestion (titleItem) {
-      this.currentTitleItem = titleItem
-      this.questionPage.showDialog = true
-      this.search()
-    },
-    removeTitleItem (titleItem) {
-      this.form.titleItems.remove(titleItem)
-    },
-    removeQuestion (titleItem, questionItem) {
-      titleItem.questionItems.remove(questionItem)
-    },
-    queryForm () {
-      this.questionPage.queryParam.pageIndex = 1
-      this.search()
-    },
-    confirmQuestionSelect () {
-      let _this = this
-      this.questionPage.multipleSelection.forEach(q => {
-        questionApi.select(q.id).then(re => {
-          _this.currentTitleItem.questionItems.push(re.response)
-        })
-      })
-      this.questionPage.showDialog = false
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.level)
-    },
-    search () {
-      this.questionPage.queryParam.subjectId = this.form.subjectId
-      this.questionPage.listLoading = true
-      questionApi.pageList(this.questionPage.queryParam).then(data => {
-        const re = data.response
-        this.questionPage.tableData = re.list
-        this.questionPage.total = re.total
-        this.questionPage.queryParam.pageIndex = re.pageNum
-        this.questionPage.listLoading = false
-      })
-    },
-    handleSelectionChange (val) {
-      this.questionPage.multipleSelection = val
-    },
-    questionTypeFormatter (row, column, cellValue, index) {
-      return this.enumFormat(this.questionTypeEnum, cellValue)
-    },
-    subjectFormatter (row, column, cellValue, index) {
-      return this.subjectEnumFormat(cellValue)
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        level: null,
-        subjectId: null,
-        paperType: 1,
-        limitDateTime: [],
-        name: '',
-        suggestTime: null,
-        titleItems: []
-      }
-      this.form.id = lastId
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      paperTypeEnum: state => state.exam.examPaper.paperTypeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
-
-<style lang="scss">
-  .exampaper-item-box {
-    .q-title {
-      margin: 0px 5px 0px 5px;
-    }
-    .q-item-content {
-    }
-  }
-</style>
diff --git a/src/views/exam/paper/list.vue b/src/views/exam/paper/list.vue
deleted file mode 100644
index d766adf..0000000
--- a/src/views/exam/paper/list.vue
+++ /dev/null
@@ -1,111 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParam" ref="queryForm" :inline="true">
-      <el-form-item label="棰樼洰ID锛�">
-        <el-input v-model="queryParam.id" clearable></el-input>
-      </el-form-item>
-      <el-form-item label="骞寸骇锛�">
-        <el-select v-model="queryParam.level" placeholder="骞寸骇" @change="levelChange" clearable>
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" >
-        <el-select v-model="queryParam.subjectId"  clearable>
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鏌ヨ</el-button>
-        <router-link :to="{path:'/exam/paper/edit'}" class="link-left">
-          <el-button type="primary">娣诲姞</el-button>
-        </router-link>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
-      <el-table-column prop="id" label="Id" width="90px"/>
-      <el-table-column prop="subjectId" label="瀛︾" :formatter="subjectFormatter" width="120px" />
-      <el-table-column prop="name" label="鍚嶇О"  />
-      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="160px"/>
-      <el-table-column  label="鎿嶄綔" align="center"  width="160px">
-        <template slot-scope="{row}">
-          <el-button size="mini" @click="$router.push({path:'/exam/paper/edit',query:{id:row.id}})" >缂栬緫</el-button>
-          <el-button size="mini" type="danger"  @click="deletePaper(row)" class="link-left">鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
-                @pagination="search"/>
-  </div>
-</template>
-
-<script>
-import { mapGetters, mapState, mapActions } from 'vuex'
-import Pagination from '@/components/Pagination'
-import examPaperApi from '@/api/examPaper'
-
-export default {
-  components: { Pagination },
-  data () {
-    return {
-      queryParam: {
-        id: null,
-        level: null,
-        subjectId: null,
-        pageIndex: 1,
-        pageSize: 10
-      },
-      subjectFilter: null,
-      listLoading: true,
-      tableData: [],
-      total: 0
-    }
-  },
-  created () {
-    this.initSubject()
-    this.search()
-  },
-  methods: {
-    submitForm () {
-      this.queryParam.pageIndex = 1
-      this.search()
-    },
-    search () {
-      this.listLoading = true
-      examPaperApi.pageList(this.queryParam).then(data => {
-        const re = data.response
-        this.tableData = re.list
-        this.total = re.total
-        this.queryParam.pageIndex = re.pageNum
-        this.listLoading = false
-      })
-    },
-    deletePaper (row) {
-      let _this = this
-      examPaperApi.deletePaper(row.id).then(re => {
-        if (re.code === 1) {
-          _this.search()
-          _this.$message.success(re.message)
-        } else {
-          _this.$message.error(re.message)
-        }
-      })
-    },
-    levelChange () {
-      this.queryParam.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.queryParam.level)
-    },
-    subjectFormatter  (row, column, cellValue, index) {
-      return this.subjectEnumFormat(cellValue)
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapGetters('exam', ['subjectEnumFormat']),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/components/Show.vue b/src/views/exam/question/components/Show.vue
deleted file mode 100644
index 2b7e9c9..0000000
--- a/src/views/exam/question/components/Show.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-<template>
-  <div style="line-height:1.8">
-    <div v-if="qType==1" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-      <div class="q-content">
-          <span :key="item.id" v-for="item in question.items" class="q-item-contain">
-            <span class="q-item-prefix">{{item.prefix}}</span>
-            <span v-html="item.content" class="q-item-content"></span>
-          </span>
-      </div>
-    </div>
-    <div v-else-if="qType==2" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-      <div class="q-content">
-          <span :key="item.id" v-for="item in question.items" class="q-item-contain">
-            <span class="q-item-prefix">{{item.prefix}}</span>
-            <span v-html="item.content" class="q-item-content"></span>
-          </span>
-      </div>
-    </div>
-    <div v-else-if="qType==3" v-loading="qLoading">
-      <div class="q-title" v-html="question.title" style="display: inline;margin-right: 10px"/>
-      <span>锛�</span>
-      <span :key="item.id" v-for="item in question.items">
-        <span v-html="item.content" class="q-item-content"></span>
-       </span>
-      <span>锛�</span>
-    </div>
-    <div v-else-if="qType==4" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-    </div>
-    <div v-else-if="qType==5" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-    </div>
-    <div v-else>
-    </div>
-  </div>
-
-</template>
-
-<script>
-export default {
-  name: 'QuestionShow',
-  props: {
-    question: {
-      type: Object,
-      default: function () {
-        return {}
-      }
-    },
-    qLoading: {
-      type: Boolean,
-      default: false
-    },
-    qType: {
-      type: Number,
-      default: 0
-    }
-  },
-  methods: {}
-}
-</script>
diff --git a/src/views/exam/question/edit/gap-filling.vue b/src/views/exam/question/edit/gap-filling.vue
deleted file mode 100644
index 29e98b5..0000000
--- a/src/views/exam/question/edit/gap-filling.vue
+++ /dev/null
@@ -1,240 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading"  :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="gradeLevel" required>
-        <el-select v-model="form.gradeLevel" placeholder="骞寸骇" @change="levelChange">
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾" >
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺共锛�" prop="title" required>
-        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
-      </el-form-item>
-      <el-form-item label="濉┖绛旀锛�" required>
-        <el-form-item :label="item.prefix" :key="item.prefix"  v-for="item in form.items"  label-width="50px" class="question-item-label">
-          <el-input v-model="item.content"   @focus="inputClick(item,'content')"  class="question-item-content-input"  style="width: 80%"/>
-          <span class="question-item-span">鍒嗘暟锛�</span><el-input-number v-model="item.score" :precision="1" :step="1" :max="100"  ></el-input-number>
-        </el-form-item>
-      </el-form-item>
-      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
-        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
-      </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
-        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
-      <el-form-item label="闅惧害锛�" required>
-        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="showQuestion">棰勮</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
-      <Ueditor @ready="editorReady"/>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
-        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import QuestionShow from '../components/Show'
-import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
-import questionApi from '@/api/question'
-
-export default {
-  components: {
-    Ueditor, QuestionShow
-  },
-  data () {
-    return {
-      form: {
-        id: null,
-        questionType: 4,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        gradeLevel: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        title: [
-          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
-        ],
-        analyze: [
-          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
-        ],
-        score: [
-          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
-        ]
-      },
-      richEditor: {
-        dialogVisible: false,
-        object: null,
-        parameterName: '',
-        instance: null
-      },
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      questionApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    editorReady (instance) {
-      this.richEditor.instance = instance
-      let currentContent = this.richEditor.object[this.richEditor.parameterName]
-      this.richEditor.instance.setContent(currentContent)
-      // 鍏夋爣瀹氫綅鍒癠editor
-      this.richEditor.instance.focus(true)
-    },
-    inputClick (object, parameterName) {
-      this.richEditor.object = object
-      this.richEditor.parameterName = parameterName
-      this.richEditor.dialogVisible = true
-    },
-    editorConfirm () {
-      let content = this.richEditor.instance.getContent()
-      if (this.richEditor.parameterName === 'title') { // 棰樺共鐨勬纭瓟妗堥噸缃�
-        if (this.questionItemReset(content)) {
-          this.richEditor.object[this.richEditor.parameterName] = content
-          this.richEditor.dialogVisible = false
-        } else {
-
-        }
-      } else {
-        this.richEditor.object[this.richEditor.parameterName] = content
-        this.richEditor.dialogVisible = false
-      }
-    },
-    questionItemReset (content) {
-      let spanRegex = new RegExp('<span class="gapfilling-span (.*?)">(.*?)<\\/span>', 'g')
-      let _this = this
-      let newFormItem = []
-      let gapfillingItems = content.match(spanRegex)
-      if (gapfillingItems === null) {
-        this.$message.error('璇锋彃鍏ュ~绌�')
-        return false
-      }
-      gapfillingItems.forEach(function (span, index) {
-        let pairRegex = /<span class="gapfilling-span (.*?)">(.*?)<\/span>/
-        pairRegex.test(span)
-        newFormItem.push({ id: null, itemUuid: RegExp.$1, prefix: RegExp.$2, content: '', score: '0' })
-      })
-
-      newFormItem.forEach(function (item) {
-        _this.form.items.some((oldItem, index) => {
-          if (oldItem.itemUuid === item.itemUuid) {
-            item.content = oldItem.content
-            item.id = oldItem.id
-            item.score = oldItem.score
-            return true
-          }
-        })
-      })
-      _this.form.items = newFormItem
-      return true
-    },
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          questionApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
-    },
-    showQuestion () {
-      this.questionShow.dialog = true
-      this.questionShow.qType = this.form.questionType
-      this.questionShow.question = this.form
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        questionType: 4,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      }
-      this.form.id = lastId
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/edit/multiple-choice.vue b/src/views/exam/question/edit/multiple-choice.vue
deleted file mode 100644
index 8ed8651..0000000
--- a/src/views/exam/question/edit/multiple-choice.vue
+++ /dev/null
@@ -1,237 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading"  :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="gradeLevel" required>
-        <el-select v-model="form.gradeLevel" placeholder="骞寸骇"  @change="levelChange">
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾" >
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺共锛�" prop="title" required>
-        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
-      </el-form-item>
-      <el-form-item label="閫夐」锛�" required>
-        <el-form-item :label="item.prefix" :key="item.prefix"  v-for="(item,index) in form.items"  label-width="50px" class="question-item-label">
-          <el-input v-model="item.prefix"  style="width:50px;" />
-          <el-input v-model="item.content"   @focus="inputClick(item,'content')"  class="question-item-content-input"/>
-          <el-button type="danger" size="mini" class="question-item-remove" icon="el-icon-delete" @click="questionItemRemove(index)"></el-button>
-        </el-form-item>
-      </el-form-item>
-      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
-        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
-      </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
-        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
-      <el-form-item label="闅惧害锛�" required>
-        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
-      </el-form-item>
-      <el-form-item label="姝g‘绛旀锛�" prop="correctArray" required>
-        <el-checkbox-group v-model="form.correctArray">
-          <el-checkbox v-for="item in form.items" :label="item.prefix" :key="item.prefix">{{item.prefix}}</el-checkbox>
-        </el-checkbox-group>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="questionItemAdd">娣诲姞閫夐」</el-button>
-        <el-button type="success" @click="showQuestion">棰勮</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
-      <Ueditor @ready="editorReady"/>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
-        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import QuestionShow from '../components/Show'
-import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
-import questionApi from '@/api/question'
-
-export default {
-  components: {
-    Ueditor, QuestionShow
-  },
-  data () {
-    return {
-      form: {
-        id: null,
-        questionType: 2,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { id: null, prefix: 'A', content: '' },
-          { id: null, prefix: 'B', content: '' },
-          { id: null, prefix: 'C', content: '' },
-          { id: null, prefix: 'D', content: '' }
-        ],
-        analyze: '',
-        correct: '',
-        correctArray: [],
-        score: '',
-        difficult: 0
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        gradeLevel: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        title: [
-          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
-        ],
-        analyze: [
-          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
-        ],
-        score: [
-          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
-        ],
-        correctArray: [
-          { required: true, message: '璇烽�夋嫨姝g‘绛旀', trigger: 'change' }
-        ]
-      },
-      richEditor: {
-        dialogVisible: false,
-        object: null,
-        parameterName: '',
-        instance: null
-      },
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      questionApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    editorReady (instance) {
-      this.richEditor.instance = instance
-      let currentContent = this.richEditor.object[this.richEditor.parameterName]
-      this.richEditor.instance.setContent(currentContent)
-      // 鍏夋爣瀹氫綅鍒癠editor
-      this.richEditor.instance.focus(true)
-    },
-    inputClick (object, parameterName) {
-      this.richEditor.object = object
-      this.richEditor.parameterName = parameterName
-      this.richEditor.dialogVisible = true
-    },
-    editorConfirm () {
-      let content = this.richEditor.instance.getContent()
-      this.richEditor.object[this.richEditor.parameterName] = content
-      this.richEditor.dialogVisible = false
-    },
-    questionItemRemove (index) {
-      this.form.items.splice(index, 1)
-    },
-    questionItemAdd () {
-      let items = this.form.items
-      let newLastPrefix
-      if (items.length > 0) {
-        let last = items[items.length - 1]
-        newLastPrefix = String.fromCharCode(last.prefix.charCodeAt() + 1)
-      } else {
-        newLastPrefix = 'A'
-      }
-      items.push({ id: null, prefix: newLastPrefix, content: '' })
-    },
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          questionApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
-    },
-    showQuestion () {
-      this.questionShow.dialog = true
-      this.questionShow.qType = this.form.questionType
-      this.questionShow.question = this.form
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        questionType: 2,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { id: null, prefix: 'A', content: '' },
-          { id: null, prefix: 'B', content: '' },
-          { id: null, prefix: 'C', content: '' },
-          { id: null, prefix: 'D', content: '' }
-        ],
-        analyze: '',
-        correct: '',
-        correctArray: [],
-        score: '',
-        difficult: 0
-      }
-      this.form.id = lastId
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/edit/short-answer.vue b/src/views/exam/question/edit/short-answer.vue
deleted file mode 100644
index 6f96816..0000000
--- a/src/views/exam/question/edit/short-answer.vue
+++ /dev/null
@@ -1,201 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="gradeLevel" required>
-        <el-select v-model="form.gradeLevel"   placeholder="骞寸骇"  @change="levelChange">
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾" >
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺共锛�" prop="title" required>
-        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
-      </el-form-item>
-      <el-form-item label="绛旀锛�" prop="correct" required>
-        <el-input v-model="form.correct"   @focus="inputClick(form,'correct')" />
-      </el-form-item>
-      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
-        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
-      </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
-        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
-      <el-form-item label="闅惧害锛�" required>
-        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="showQuestion">棰勮</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
-      <Ueditor @ready="editorReady"/>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
-        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import QuestionShow from '../components/Show'
-import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
-import questionApi from '@/api/question'
-
-export default {
-  components: {
-    Ueditor, QuestionShow
-  },
-  data () {
-    return {
-      form: {
-        id: null,
-        questionType: 5,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        gradeLevel: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        title: [
-          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
-        ],
-        correct: [
-          { required: true, message: '璇疯緭鍏ョ瓟妗�', trigger: 'blur' }
-        ],
-        analyze: [
-          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
-        ],
-        score: [
-          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
-        ]
-      },
-      richEditor: {
-        dialogVisible: false,
-        object: null,
-        parameterName: '',
-        instance: null
-      },
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      questionApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    editorReady (instance) {
-      this.richEditor.instance = instance
-      let currentContent = this.richEditor.object[this.richEditor.parameterName]
-      this.richEditor.instance.setContent(currentContent)
-      // 鍏夋爣瀹氫綅鍒癠editor
-      this.richEditor.instance.focus(true)
-    },
-    inputClick (object, parameterName) {
-      this.richEditor.object = object
-      this.richEditor.parameterName = parameterName
-      this.richEditor.dialogVisible = true
-    },
-    editorConfirm () {
-      let content = this.richEditor.instance.getContent()
-      this.richEditor.object[this.richEditor.parameterName] = content
-      this.richEditor.dialogVisible = false
-    },
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          questionApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        questionType: 5,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      }
-      this.form.id = lastId
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
-    },
-    showQuestion () {
-      this.questionShow.dialog = true
-      this.questionShow.qType = this.form.questionType
-      this.questionShow.question = this.form
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/edit/single-choice.vue b/src/views/exam/question/edit/single-choice.vue
deleted file mode 100644
index 6b017a6..0000000
--- a/src/views/exam/question/edit/single-choice.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="gradeLevel" required>
-        <el-select v-model="form.gradeLevel" placeholder="骞寸骇"  @change="levelChange" clearable>
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾" >
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺共锛�" prop="title" required>
-        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
-      </el-form-item>
-      <el-form-item label="閫夐」锛�" required>
-        <el-form-item :label="item.prefix" :key="item.prefix"  v-for="(item,index) in form.items"  label-width="50px" class="question-item-label">
-          <el-input v-model="item.prefix"  style="width:50px;" />
-          <el-input v-model="item.content"   @focus="inputClick(item,'content')"  class="question-item-content-input"/>
-           <el-button type="danger" size="mini" class="question-item-remove" icon="el-icon-delete" @click="questionItemRemove(index)"></el-button>
-        </el-form-item>
-      </el-form-item>
-      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
-        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
-      </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
-        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
-      <el-form-item label="闅惧害锛�" required>
-        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
-      </el-form-item>
-      <el-form-item label="姝g‘绛旀锛�" prop="correct" required>
-        <el-radio-group v-model="form.correct">
-          <el-radio  v-for="item in form.items"  :key="item.prefix"  :label="item.prefix">{{item.prefix}}</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="questionItemAdd">娣诲姞閫夐」</el-button>
-        <el-button type="success" @click="showQuestion">棰勮</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
-      <Ueditor @ready="editorReady"/>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
-        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import QuestionShow from '../components/Show'
-import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
-import questionApi from '@/api/question'
-
-export default {
-  components: {
-    Ueditor, QuestionShow
-  },
-  data () {
-    return {
-      form: {
-        id: null,
-        questionType: 1,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { prefix: 'A', content: '' },
-          { prefix: 'B', content: '' },
-          { prefix: 'C', content: '' },
-          { prefix: 'D', content: '' }
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        gradeLevel: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        title: [
-          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
-        ],
-        analyze: [
-          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
-        ],
-        score: [
-          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
-        ],
-        correct: [
-          { required: true, message: '璇烽�夋嫨姝g‘绛旀', trigger: 'change' }
-        ]
-      },
-      richEditor: {
-        dialogVisible: false,
-        object: null,
-        parameterName: '',
-        instance: null
-      },
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      questionApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    editorReady (instance) {
-      this.richEditor.instance = instance
-      let currentContent = this.richEditor.object[this.richEditor.parameterName]
-      this.richEditor.instance.setContent(currentContent)
-      // 鍏夋爣瀹氫綅鍒癠editor
-      this.richEditor.instance.focus(true)
-    },
-    inputClick (object, parameterName) {
-      this.richEditor.object = object
-      this.richEditor.parameterName = parameterName
-      this.richEditor.dialogVisible = true
-    },
-    editorConfirm () {
-      let content = this.richEditor.instance.getContent()
-      this.richEditor.object[this.richEditor.parameterName] = content
-      this.richEditor.dialogVisible = false
-    },
-    questionItemRemove (index) {
-      this.form.items.splice(index, 1)
-    },
-    questionItemAdd () {
-      let items = this.form.items
-      let newLastPrefix
-      if (items.length > 0) {
-        let last = items[items.length - 1]
-        newLastPrefix = String.fromCharCode(last.prefix.charCodeAt() + 1)
-      } else {
-        newLastPrefix = 'A'
-      }
-      items.push({ id: null, prefix: newLastPrefix, content: '' })
-    },
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          questionApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        questionType: 1,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { prefix: 'A', content: '' },
-          { prefix: 'B', content: '' },
-          { prefix: 'C', content: '' },
-          { prefix: 'D', content: '' }
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      }
-      this.form.id = lastId
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
-    },
-    showQuestion () {
-      this.questionShow.dialog = true
-      this.questionShow.qType = this.form.questionType
-      this.questionShow.question = this.form
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/edit/true-false.vue b/src/views/exam/question/edit/true-false.vue
deleted file mode 100644
index 65d5c05..0000000
--- a/src/views/exam/question/edit/true-false.vue
+++ /dev/null
@@ -1,215 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading"  :rules="rules">
-      <el-form-item label="骞寸骇锛�" prop="gradeLevel" required>
-        <el-select v-model="form.gradeLevel" placeholder="骞寸骇"  @change="levelChange">
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�" prop="subjectId" required>
-        <el-select v-model="form.subjectId" placeholder="瀛︾" >
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺共锛�" prop="title" required>
-        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
-      </el-form-item>
-      <el-form-item label="閫夐」锛�" required>
-        <el-form-item :label="item.prefix" :key="item.prefix"  v-for="(item) in form.items"  label-width="50px" class="question-item-label">
-          <el-input v-model="item.prefix"  style="width:50px;" />
-          <el-input v-model="item.content"   @focus="inputClick(item,'content')"  class="question-item-content-input"/>
-        </el-form-item>
-      </el-form-item>
-      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
-        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
-      </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
-        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
-      <el-form-item label="闅惧害锛�" required>
-        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
-      </el-form-item>
-      <el-form-item label="姝g‘绛旀锛�" prop="correct" required>
-        <el-radio-group v-model="form.correct">
-          <el-radio  v-for="item in form.items"  :key="item.prefix"  :label="item.prefix">{{item.prefix}}</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
-        <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="success" @click="showQuestion">棰勮</el-button>
-      </el-form-item>
-    </el-form>
-    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
-      <Ueditor @ready="editorReady"/>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
-        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import QuestionShow from '../components/Show'
-import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
-import questionApi from '@/api/question'
-
-export default {
-  components: {
-    Ueditor, QuestionShow
-  },
-  data () {
-    return {
-      form: {
-        id: null,
-        questionType: 3,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { id: null, prefix: 'A', content: '鏄�' },
-          { id: null, prefix: 'B', content: '鍚�' }
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      },
-      subjectFilter: null,
-      formLoading: false,
-      rules: {
-        gradeLevel: [
-          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
-        ],
-        subjectId: [
-          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
-        ],
-        title: [
-          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
-        ],
-        analyze: [
-          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
-        ],
-        score: [
-          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
-        ],
-        correct: [
-          { required: true, message: '璇烽�夋嫨姝g‘绛旀', trigger: 'change' }
-        ]
-      },
-      richEditor: {
-        dialogVisible: false,
-        object: null,
-        parameterName: '',
-        instance: null
-      },
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    let id = this.$route.query.id
-    let _this = this
-    this.initSubject(function () {
-      _this.subjectFilter = _this.subjects
-    })
-    if (id && parseInt(id) !== 0) {
-      _this.formLoading = true
-      questionApi.select(id).then(re => {
-        _this.form = re.response
-        _this.formLoading = false
-      })
-    }
-  },
-  methods: {
-    editorReady (instance) {
-      this.richEditor.instance = instance
-      let currentContent = this.richEditor.object[this.richEditor.parameterName]
-      this.richEditor.instance.setContent(currentContent)
-      // 鍏夋爣瀹氫綅鍒癠editor
-      this.richEditor.instance.focus(true)
-    },
-    inputClick (object, parameterName) {
-      this.richEditor.object = object
-      this.richEditor.parameterName = parameterName
-      this.richEditor.dialogVisible = true
-    },
-    editorConfirm () {
-      let content = this.richEditor.instance.getContent()
-      this.richEditor.object[this.richEditor.parameterName] = content
-      this.richEditor.dialogVisible = false
-    },
-    submitForm () {
-      let _this = this
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          this.formLoading = true
-          questionApi.edit(this.form).then(re => {
-            if (re.code === 1) {
-              _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
-            } else {
-              _this.$message.error(re.message)
-              this.formLoading = false
-            }
-          }).catch(e => {
-            this.formLoading = false
-          })
-        } else {
-          return false
-        }
-      })
-    },
-    resetForm () {
-      let lastId = this.form.id
-      this.$refs['form'].resetFields()
-      this.form = {
-        id: null,
-        questionType: 3,
-        gradeLevel: null,
-        subjectId: null,
-        title: '',
-        items: [
-          { id: null, prefix: 'A', content: '鏄�' },
-          { id: null, prefix: 'B', content: '鍚�' }
-        ],
-        analyze: '',
-        correct: '',
-        score: '',
-        difficult: 0
-      }
-      this.form.id = lastId
-    },
-    levelChange () {
-      this.form.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
-    },
-    showQuestion () {
-      this.questionShow.dialog = true
-      this.questionShow.qType = this.form.questionType
-      this.questionShow.question = this.form
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' }),
-    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionTypeEnum: state => state.exam.question.typeEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/exam/question/list.vue b/src/views/exam/question/list.vue
deleted file mode 100644
index 36bb9c4..0000000
--- a/src/views/exam/question/list.vue
+++ /dev/null
@@ -1,161 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParam" ref="queryForm" :inline="true">
-      <el-form-item label="棰樼洰ID锛�">
-        <el-input v-model="queryParam.id" clearable></el-input>
-      </el-form-item>
-      <el-form-item label="棰樼洰鍐呭锛�">
-        <el-input v-model="queryParam.content" clearable></el-input>
-      </el-form-item>
-
-      <el-form-item label="骞寸骇锛�">
-        <el-select v-model="queryParam.level" placeholder="骞寸骇"  @change="levelChange" clearable>
-          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀛︾锛�">
-        <el-select v-model="queryParam.subjectId" clearable>
-          <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id"
-                     :label="item.name+' ( '+item.levelName+' )'"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="棰樺瀷锛�">
-        <el-select v-model="queryParam.questionType" clearable>
-          <el-option v-for="item in questionType" :key="item.key" :value="item.key" :label="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="submitForm">鏌ヨ</el-button>
-        <el-popover placement="bottom" trigger="click">
-          <el-button type="warning" size="mini" v-for="item in editUrlEnum" :key="item.key"
-                     @click="$router.push({path:item.value})">{{item.name}}
-          </el-button>
-          <el-button slot="reference" type="primary" class="link-left">娣诲姞</el-button>
-        </el-popover>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
-      <el-table-column prop="id" label="Id" width="90px"/>
-      <el-table-column prop="subjectId" label="瀛︾" :formatter="subjectFormatter" width="120px"/>
-      <el-table-column prop="questionType" label="棰樺瀷" :formatter="questionTypeFormatter" width="70px"/>
-      <el-table-column prop="shortTitle" label="棰樺共" show-overflow-tooltip/>
-      <el-table-column prop="score" label="鍒嗘暟" width="60px"/>
-      <el-table-column prop="difficult" label="闅惧害" width="60px"/>
-      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="160px"/>
-      <el-table-column label="鎿嶄綔" align="center" width="220px">
-        <template slot-scope="{row}">
-          <el-button size="mini"   @click="showQuestion(row)">棰勮</el-button>
-          <el-button size="mini"  @click="editQuestion(row)">缂栬緫</el-button>
-          <el-button size="mini"  type="danger" @click="deleteQuestion(row)" class="link-left">鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
-                @pagination="search"/>
-    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
-      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { mapGetters, mapState, mapActions } from 'vuex'
-import Pagination from '@/components/Pagination'
-import QuestionShow from './components/Show'
-import questionApi from '@/api/question'
-
-export default {
-  components: { Pagination, QuestionShow },
-  data () {
-    return {
-      queryParam: {
-        id: null,
-        questionType: null,
-        level: null,
-        subjectId: null,
-        pageIndex: 1,
-        pageSize: 10
-      },
-      subjectFilter: null,
-      listLoading: true,
-      tableData: [],
-      total: 0,
-      questionShow: {
-        qType: 0,
-        dialog: false,
-        question: null,
-        loading: false
-      }
-    }
-  },
-  created () {
-    this.initSubject()
-    this.search()
-  },
-  methods: {
-    submitForm () {
-      this.queryParam.pageIndex = 1
-      this.search()
-    },
-    search () {
-      this.listLoading = true
-      questionApi.pageList(this.queryParam).then(data => {
-        const re = data.response
-        this.tableData = re.list
-        this.total = re.total
-        this.queryParam.pageIndex = re.pageNum
-        this.listLoading = false
-      })
-    },
-    levelChange () {
-      this.queryParam.subjectId = null
-      this.subjectFilter = this.subjects.filter(data => data.level === this.queryParam.level)
-    },
-    addQuestion () {
-      this.$router.push('/exam/question/edit/singleChoice')
-    },
-    showQuestion (row) {
-      let _this = this
-      this.questionShow.dialog = true
-      this.questionShow.loading = true
-      questionApi.select(row.id).then(re => {
-        _this.questionShow.qType = re.response.questionType
-        _this.questionShow.question = re.response
-        _this.questionShow.loading = false
-      })
-    },
-    editQuestion (row) {
-      let url = this.enumFormat(this.editUrlEnum, row.questionType)
-      this.$router.push({ path: url, query: { id: row.id } })
-    },
-    deleteQuestion (row) {
-      let _this = this
-      questionApi.deleteQuestion(row.id).then(re => {
-        if (re.code === 1) {
-          _this.search()
-          _this.$message.success(re.message)
-        } else {
-          _this.$message.error(re.message)
-        }
-      })
-    },
-    questionTypeFormatter (row, column, cellValue, index) {
-      return this.enumFormat(this.questionType, cellValue)
-    },
-    subjectFormatter (row, column, cellValue, index) {
-      return this.subjectEnumFormat(cellValue)
-    },
-    ...mapActions('exam', { initSubject: 'initSubject' })
-  },
-  computed: {
-    ...mapGetters('enumItem', ['enumFormat']),
-    ...mapState('enumItem', {
-      questionType: state => state.exam.question.typeEnum,
-      editUrlEnum: state => state.exam.question.editUrlEnum,
-      levelEnum: state => state.user.levelEnum
-    }),
-    ...mapGetters('exam', ['subjectEnumFormat']),
-    ...mapState('exam', { subjects: state => state.subjects })
-  }
-}
-</script>
diff --git a/src/views/index.vue b/src/views/index.vue
new file mode 100644
index 0000000..504a0da
--- /dev/null
+++ b/src/views/index.vue
@@ -0,0 +1,21 @@
+<template>
+  <div>
+    <v-header />
+    <router-view v-if="!$route.meta.$keepAlive" />
+  </div>
+</template>
+
+<script>
+
+import vHeader from "../components/Header/index.vue";
+
+export default {
+  components: {
+    vHeader
+  },
+  name: "index",
+};
+</script>
+
+<style lang="scss">
+</style>
diff --git a/src/views/mine/StudyParticulars.vue b/src/views/mine/StudyParticulars.vue
new file mode 100644
index 0000000..32936d9
--- /dev/null
+++ b/src/views/mine/StudyParticulars.vue
@@ -0,0 +1,159 @@
+<!-- 瀛︿範妗f -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <TitleIndex title="瀛︿範妗f" />
+        <!-- 鍐呭 -->
+        <div class="flex content">
+          <Echarts
+            v-for="(item,index) in arr"
+            :key="index"
+            :id='item.echartsId'
+            :echartObj="item.echartObj"
+            :style="{width: '40%', height: '500px'}"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+
+<script>
+import Echarts from "../../components/Echarts/index.vue";
+export default {
+  components: {
+    Echarts,
+  },
+  data() {
+    return {
+      arr: [
+        // 鏌辩姸鍥�
+        {
+          echartsId: "myBar",
+          echartObj: {
+            legend: {
+              bottom: "0",
+              left: "center",
+            },
+            tooltip: {
+              trigger: "axis",
+              axisPointer: {
+                type: "shadow",
+              },
+            },
+            // 璁剧疆鍥捐〃鐨勫ぇ灏�
+            grid: {
+              left: "3%",
+              right: "4%",
+              bottom: "10%",
+              containLabel: true,
+            },
+            xAxis: [
+              {
+                type: "category",
+                data: ["涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀"],
+                axisTick: {
+                  alignWithLabel: true,
+                },
+              },
+            ],
+            yAxis: [
+              {
+                type: "value",
+              },
+            ],
+            series: [
+              {
+                name: "瀛︿範鏃堕暱",
+                type: "bar",
+                barWidth: "50%",
+                data: [10, 52, 200, 334, 390, 330],
+              },
+            ],
+          },
+        },
+        {
+          // 浼犵粰Echarts鐨処d涓轰簡鑳藉鍚屾椂娓叉煋澶氫釜锛屽鏋滀笉浼犲彧浼氭樉绀烘渶鍚庝竴涓�
+          echartsId: "myChart",
+          // echarts 灞曠ず鏁版嵁
+          echartObj: {
+            legend: {
+              left: "center",
+              top: "bottom",
+            },
+            color: ["#fe5c30", "#fe812d", "#ffce2c", "#01c5d2", "#4f71ef"],
+            series: [
+              // 楗肩姸鍥�
+              {
+                type: "pie",
+                radius: [0, 90],
+                center: ["50%", "50%"],
+                roseType: "area",
+                data: [
+                  { value: 25, name: "JAVA" },
+                  { value: 15, name: "JavaScript" },
+                  { value: 20, name: "PHP" },
+                  { value: 25, name: "React" },
+                  { value: 15, name: "MySQL" },
+                ],
+                label: {
+                  normal: {
+                    formatter: ["{b|{b}}", "{d|{d}%}"].join("\n"),
+                    rich: {
+                      d: {
+                        // color: 'rgb(241,246,104)',
+                        fontSize: 15,
+                        fontWeight: "bold",
+                        lineHeight: 2,
+                      },
+                      b: {
+                        // color: 'rgb(98,137,169)',
+                        fontSize: 13,
+                        height: 40,
+                      },
+                    },
+                  },
+                },
+                labelLine: {
+                  normal: {
+                    lineStyle: {
+                      color: "#ccc",
+                    },
+                    smooth: 0,
+                    length: 20,
+                    length2: 10,
+                  },
+                },
+              },
+            ],
+          },
+        },
+      ],
+    };
+  },
+  methods: {
+    open() {
+      this.dialogVisible = true;
+      this.creatQrCode();
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 40px 140px;
+  border-radius: 10px;
+}
+.flex {
+  display: flex;
+  justify-content: space-between;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/mine/index.vue b/src/views/mine/index.vue
new file mode 100644
index 0000000..4ebf796
--- /dev/null
+++ b/src/views/mine/index.vue
@@ -0,0 +1,280 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- <div class="main-title">
+          <p>鐝骇绠$悊</p>
+        </div> -->
+        <div class="main-title">
+          <p>涓汉鍩烘湰淇℃伅</p>
+          <div
+            class="back"
+            @click="goBack"
+          ><svg
+              t="1651823534392"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              content-inquire
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="1892"
+              width="20"
+              height="20"
+            >
+              <path
+                d="M896 544H250.4l242.4 242.4L448 832 173.6 557.6 128 512l45.6-45.6L448 192l45.6 45.6L250.4 480H896v64z"
+                p-id="1893"
+                fill="#515151"
+              ></path>
+            </svg></div>
+        </div>
+        <div class="main-1">
+          <el-row>
+            <el-form
+              ref="form"
+              label-width="80px"
+              v-loading="loading"
+            >
+              <el-form-item
+                label="澶村儚:"
+                style="margin-bottom:0"
+              >
+                <el-upload
+                  class="
+                  avatar-uploader"
+                  action="https://jsonplaceholder.typicode.com/posts/"
+                  :show-file-list="false"
+                  :on-success="handleAvatarSuccess"
+                  :before-upload="beforeAvatarUpload"
+                >
+                  <img
+                    v-if="state.avatar"
+                    :src="state.avatar"
+                    class="avatar"
+                  >
+                  <i
+                    v-else
+                    class="el-icon-plus avatar-uploader-icon"
+                  ></i>
+                </el-upload>
+              </el-form-item>
+              <el-col :span="12">
+
+                <el-form-item label="鐢ㄦ埛鍚�:">
+                  <el-input
+                    class="input-style"
+                    v-model="state.username"
+                    :readonly='true'
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="骞撮緞">
+                  <el-input
+                    class="input-style"
+                    v-model.number="state.age"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="閮ㄩ棬">
+                  <el-input
+                    class="input-style"
+                    v-model="state.deptId"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item
+                  label="鎬у埆"
+                  prop="resource"
+                >
+                  <el-radio-group v-model="state.sex">
+                    <el-radio label="1">鐢�</el-radio>
+                    <el-radio label="2">濂�</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鐢佃瘽鍙风爜:">
+                  <el-input
+                    class="input-style"
+                    v-model="state.phone"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="鍏磋叮鐖卞ソ:">
+                  <el-input class="input-style"></el-input>
+                </el-form-item>
+                <el-form-item label="涓汉绠�浠�:">
+                  <el-input
+                    class="input-style"
+                    type="textarea"
+                    :rows="4"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    v-model="state.description"
+                  >
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item size="large">
+                  <el-button
+                    style="margin-left: 360px;"
+                    type="primary"
+                    @click="onSubmit"
+                  >淇濆瓨淇敼</el-button>
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </el-row>
+
+        </div>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      // 淇敼鐨勬暟鎹�
+      state: {},
+      loading: false,
+    };
+  },
+  methods: {
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+
+    // 澶村儚淇敼
+    handleAvatarSuccess(res, file) {
+      this.state.avatar = URL.createObjectURL(file.raw);
+    },
+    beforeAvatarUpload(file) {
+      const isJPG = file.type;
+      const isLt2M = file.size / 1024 / 1024 < 2;
+
+      //   if (!isJPG) {
+      //     this.$message.error("涓婁紶澶村儚鍥剧墖鍙兘鏄� JPG 鏍煎紡!");
+      //   }
+      if (!isLt2M) {
+        this.$message.error("涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 2MB!");
+      }
+      return isJPG && isLt2M;
+    },
+
+    // 淇敼鎻愪氦
+    // async onSubmit() {
+    //   this.loading = true;
+    //   // 鎻愪氦
+    //   let data = await putObj(this.state);
+    //   if (data.status === 200) {
+    //     this.$message({
+    //       message: "淇敼鎴愬姛",
+    //       type: "success",
+    //     });
+    //   } else {
+    //     this.$message({
+    //       message: "淇敼澶辫触",
+    //       type: "error",
+    //     });
+    //   }
+    //   this.loading = false;
+    // },
+
+    // 璧嬮粯璁ゅ��
+    getState() {
+      this.state = {
+        ...this.userInfo,
+        // 璁剧疆澶村儚
+        avatar: this.state.avatar
+          ? this.state.avatar
+          : require("../../assets/img/avatarIcon.png"),
+      };
+    },
+  },
+  computed: {
+    ...mapGetters({
+      userInfo: "userInfo",
+    }),
+  },
+  mounted() {
+    this.getState();
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 80px;
+  height: 80px;
+  display: block;
+  border-radius: 50%;
+}
+
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 30px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    // height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 60px 100px 0 100px;
+  }
+  &-btn {
+    padding-bottom: 10px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+.input-style {
+  max-width: 220px;
+}
+.el-form-item {
+  margin-bottom: 30px !important;
+}
+</style>
diff --git a/src/views/user/admin/list.vue b/src/views/user/admin/list.vue
index 84c860d..1ec3a28 100644
--- a/src/views/user/admin/list.vue
+++ b/src/views/user/admin/list.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParam" ref="queryForm" :inline="true">
-      <el-form-item label="鐢ㄦ埛鍚嶏細">
+      <el-form-item label="鐢ㄦ埛锛�">
         <el-input v-model="queryParam.userName"></el-input>
       </el-form-item>
       <el-form-item>
diff --git a/src/views/user/student/list.vue b/src/views/user/student/list.vue
index 85005d9..2ebdfb3 100644
--- a/src/views/user/student/list.vue
+++ b/src/views/user/student/list.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParam" ref="queryForm" :inline="true">
-      <el-form-item label="鐢ㄦ埛鍚嶏細">
+      <el-form-item label="鐢ㄦ埛锛�">
         <el-input v-model="queryParam.userName"></el-input>
       </el-form-item>
       <el-form-item>

--
Gitblit v1.8.0