瀏覽代碼

feat: stash

chenhao 2 年之前
父節點
當前提交
5235bd52fb
共有 100 個文件被更改,包括 2234 次插入461 次删除
  1. 17 1
      .eslintrc.cjs
  2. 1 0
      .gitignore
  3. 1 0
      .npmrc
  4. 0 1
      .vscode/extensions.json
  5. 13 0
      electron-builder.json5
  6. 16 0
      electron-plugin.ts
  7. 5 0
      electron/electron.d.ts
  8. 76 0
      electron/main/main.ts
  9. 64 0
      electron/main/public/loading.html
  10. 75 0
      electron/preload/preload.ts
  11. 二進制
      electron/preload/public/fonts/DOUYU-Font.woff2
  12. 二進制
      electron/preload/public/fonts/SourceHanSansCN-Bold.otf
  13. 二進制
      electron/preload/public/fonts/SourceHanSansCN-Heavy.otf
  14. 二進制
      electron/preload/public/fonts/SourceHanSansCN-Medium.otf
  15. 二進制
      electron/preload/public/fonts/SourceHanSansCN-Normal.otf
  16. 0 1
      index.html
  17. 28 18
      package.json
  18. 372 381
      pnpm-lock.yaml
  19. 1 1
      postcss.config.cjs
  20. 11 0
      server.config.ts
  21. 13 4
      src/App.vue
  22. 21 0
      src/api/check.ts
  23. 0 5
      src/api/common.ts
  24. 16 0
      src/api/exam.ts
  25. 20 0
      src/api/expert.ts
  26. 10 0
      src/api/index.ts
  27. 53 0
      src/api/marking.ts
  28. 9 0
      src/api/message.ts
  29. 23 0
      src/api/question.ts
  30. 12 0
      src/api/role.ts
  31. 65 0
      src/api/statistics.ts
  32. 16 0
      src/api/subject.ts
  33. 43 0
      src/api/system.ts
  34. 45 0
      src/api/user.ts
  35. 11 0
      src/assets/icons/mark-back.svg
  36. 11 0
      src/assets/icons/mark-background-color.svg
  37. 5 0
      src/assets/icons/mark-bookmark.svg
  38. 11 0
      src/assets/icons/mark-center.svg
  39. 7 0
      src/assets/icons/mark-delete.svg
  40. 12 0
      src/assets/icons/mark-example.svg
  41. 12 0
      src/assets/icons/mark-front-color.svg
  42. 15 0
      src/assets/icons/mark-problem.svg
  43. 16 0
      src/assets/icons/mark-refresh.svg
  44. 11 0
      src/assets/icons/mark-remark.svg
  45. 11 0
      src/assets/icons/mark-rotate.svg
  46. 11 0
      src/assets/icons/mark-scale-down.svg
  47. 11 0
      src/assets/icons/mark-scale-up.svg
  48. 11 0
      src/assets/icons/mark-standard.svg
  49. 11 0
      src/assets/icons/message.svg
  50. 12 0
      src/assets/icons/nav-analysis.svg
  51. 14 0
      src/assets/icons/nav-data.svg
  52. 13 0
      src/assets/icons/nav-exam.svg
  53. 12 0
      src/assets/icons/nav-expert.svg
  54. 12 0
      src/assets/icons/nav-marking.svg
  55. 12 0
      src/assets/icons/nav-quality.svg
  56. 12 0
      src/assets/icons/nav-standard.svg
  57. 12 0
      src/assets/icons/nav-training.svg
  58. 13 0
      src/assets/icons/nav-user.svg
  59. 1 0
      src/assets/icons/preview.svg
  60. 14 0
      src/assets/icons/question.svg
  61. 1 0
      src/assets/icons/right.svg
  62. 11 0
      src/assets/icons/setting.svg
  63. 12 0
      src/assets/icons/toggle-panel.svg
  64. 二進制
      src/assets/images/AB培训卷.png
  65. 二進制
      src/assets/images/CET成绩导出.png
  66. 二進制
      src/assets/images/RF卷.png
  67. 二進制
      src/assets/images/background.png
  68. 二進制
      src/assets/images/empty.png
  69. 二進制
      src/assets/images/nav-page-card.png
  70. 二進制
      src/assets/images/专家卷挑选.png
  71. 二進制
      src/assets/images/个人统计.png
  72. 二進制
      src/assets/images/主观题校验.png
  73. 二進制
      src/assets/images/仲裁卷.png
  74. 二進制
      src/assets/images/导入培训卷RF卷.png
  75. 二進制
      src/assets/images/强制考核分发.png
  76. 二進制
      src/assets/images/强制考核卷.png
  77. 二進制
      src/assets/images/抽查情况统计.png
  78. 二進制
      src/assets/images/查看培训记录.png
  79. 二進制
      src/assets/images/查看样卷.png
  80. 二進制
      src/assets/images/标准卷.png
  81. 二進制
      src/assets/images/正常评卷.png
  82. 二進制
      src/assets/images/科目管理.png
  83. 二進制
      src/assets/images/科目进度收尾.png
  84. 二進制
      src/assets/images/考试批次管理.png
  85. 二進制
      src/assets/images/自定义查询.png
  86. 二進制
      src/assets/images/自查一致性分析.png
  87. 二進制
      src/assets/images/评分标准.png
  88. 二進制
      src/assets/images/评卷数据导入.png
  89. 二進制
      src/assets/images/重评卷.png
  90. 二進制
      src/assets/images/问题卷.png
  91. 二進制
      src/assets/images/雷同卷.png
  92. 二進制
      src/assets/mock/SAMPA-1.jpg
  93. 109 0
      src/assets/styles/app.scss
  94. 260 0
      src/assets/styles/common-var.scss
  95. 174 0
      src/assets/styles/element/custom.scss
  96. 44 5
      src/assets/styles/element/index.scss
  97. 224 0
      src/assets/styles/helper.scss
  98. 0 44
      src/assets/styles/reset.scss
  99. 0 0
      src/assets/styles/theme.scss
  100. 80 0
      src/assets/styles/var.scss

+ 17 - 1
.eslintrc.cjs

@@ -3,18 +3,34 @@ module.exports = {
   env: {
     browser: true,
     node: true,
+    es6: true,
   },
-  extends: ['eslint:recommended', 'plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
   parser: 'vue-eslint-parser',
   parserOptions: {
     parser: '@typescript-eslint/parser',
+    ecmaFeatures: {
+      tsx: true,
+      jsx: true,
+    },
   },
+  extends: [
+    'plugin:vue/vue3-recommended',
+    'plugin:@typescript-eslint/recommended',
+    'prettier',
+    'plugin:prettier/recommended',
+  ],
   plugins: ['vue', '@typescript-eslint', 'prettier'],
   rules: {
+    '@typescript-eslint/no-explicit-any': 0,
+    '@typescript-eslint/no-unused-vars': 0,
+    '@typescript-eslint/no-empty-interface': 0,
     'prettier/prettier': ['error'],
+    'vue/v-slot-style': 0,
+    'vue/require-explicit-emits': 0,
     'vue/html-indent': ['error', 2],
     'vue/multi-word-component-names': 0,
     'vue/component-name-in-template-casing': ['error', 'kebab-case'],
+    'vue/one-component-per-file': 0,
   },
   globals: {},
 }

+ 1 - 0
.gitignore

@@ -10,6 +10,7 @@ lerna-debug.log*
 node_modules
 dist
 dist-ssr
+release
 *.local
 
 # Editor directories and files

+ 1 - 0
.npmrc

@@ -1 +1,2 @@
+ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
 enable-pre-post-scripts = true

+ 0 - 1
.vscode/extensions.json

@@ -5,6 +5,5 @@
     "esbenp.prettier-vscode",
     "phoenisx.cssvar",
     "ionutvmi.path-autocomplete",
-    "antfu.unocss",
   ]
 }

+ 13 - 0
electron-builder.json5

@@ -0,0 +1,13 @@
+{
+  appId: 'cet.marking',
+  productName: 'CET阅卷系统',
+  artifactName: '${productName}_${version}.${ext}',
+  directories: {
+    output: 'release',
+  },
+  files: ['dist/**/*'],
+  win: {
+    target: 'portable',
+    requestedExecutionLevel: 'highestAvailable',
+  },
+}

+ 16 - 0
electron-plugin.ts

@@ -0,0 +1,16 @@
+import { PluginOption } from 'vite'
+import VitePluginELectron from 'vite-use-electron'
+
+const useElectronPlugin: () => PluginOption = () =>
+  VitePluginELectron({
+    main: {
+      entry: 'electron/main/main',
+      publicDir: 'electron/main/public',
+    },
+    preload: {
+      entry: 'electron/preload/preload',
+      publicDir: 'electron/preload/public',
+    },
+  })
+
+export default useElectronPlugin

+ 5 - 0
electron/electron.d.ts

@@ -0,0 +1,5 @@
+declare namespace NodeJS {
+  interface ProcessEnv {
+    PRELOAD_PATH: string
+  }
+}

+ 76 - 0
electron/main/main.ts

@@ -0,0 +1,76 @@
+import { app, BrowserWindow, clipboard } from 'electron'
+import { resolve } from 'path'
+import installDevTool, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
+import path from 'path'
+
+if (!app.requestSingleInstanceLock()) {
+  app.quit()
+  process.exit(0)
+}
+
+async function createWindow() {
+  const loadingView = new BrowserWindow({
+    width: 520,
+    height: 150,
+    frame: false,
+    resizable: false,
+    transparent: true,
+    show: true,
+    webPreferences: {
+      preload: path.join(__dirname, '../preload/preload'),
+    },
+  })
+  loadingView.loadFile(resolve(__dirname, 'loading.html'))
+  const image = clipboard.readImage()
+  const mainWin = new BrowserWindow({
+    title: 'Electron Window',
+    show: false,
+    width: 1680,
+    height: 880,
+    icon: image,
+    frame: false,
+    center: true,
+    resizable: false,
+    fullscreen: false,
+    fullscreenable: true,
+    alwaysOnTop: false,
+    useContentSize: true,
+    transparent: true,
+    webPreferences: {
+      devTools: true,
+      nodeIntegration: false,
+      contextIsolation: true,
+      webSecurity: false,
+      experimentalFeatures: true,
+      navigateOnDragDrop: false,
+      disableHtmlFullscreenWindowResize: false,
+      preload: path.join(__dirname, '../preload/preload'),
+    },
+  })
+
+  mainWin.setMenu(null)
+
+  mainWin.webContents.on('before-input-event', (event, input) => {
+    if (input.key === 'F12') {
+      mainWin.webContents.openDevTools()
+    }
+  })
+
+  mainWin.on('ready-to-show', () => {
+    loadingView.destroy()
+    mainWin.show()
+  })
+
+  if (app.isPackaged) {
+    mainWin.loadFile(resolve(__dirname, '../index.html'))
+  } else {
+    installDevTool(VUEJS_DEVTOOLS)
+    process.env.WEB_DEV_INDEX_URL && mainWin.loadURL(process.env.WEB_DEV_INDEX_URL)
+  }
+}
+
+app.on('window-all-closed', () => {
+  if (process.platform !== 'darwin') app.quit()
+})
+
+app.whenReady().then(createWindow)

+ 64 - 0
electron/main/public/loading.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>loading</title>
+    <style>
+      * {
+        margin: 0;
+        padding: 0;
+        box-sizing: border-box;
+        user-select: none;
+      }
+      .content {
+        width: 520px;
+        height: 150px;
+        text-align: center;
+        margin: 0;
+        transform: translateZ(0);
+        color: #0091ff;
+        font-weight: 700;
+        display: inline-block;
+        letter-spacing: -4px;
+        font-size: 72px;
+        font-family: DouYu;
+        text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa,
+          0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3),
+          0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.2),
+          0 20px 20px rgba(0, 0, 0, 0.15);
+        text-shadow: 0 1px 0 rgb(115, 176, 233), 0 2px 0 #6b83ee, 0 3px 0 rgb(214, 153, 153), 0 4px 0 #48a8b4,
+          0 5px 0 rgb(115, 199, 164), 0 6px 1px rgba(47, 125, 228, 0.1), 0 0 5px rgba(0, 0, 0, 0.1),
+          0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25),
+          0 10px 10px rgba(0, 0, 0, 0.2), 0 20px 20px rgba(0, 0, 0, 0.15);
+      }
+      span {
+        display: inline-block;
+        animation: leSnake 1.5s ease-in-out;
+        animation-iteration-count: infinite;
+      }
+
+      @keyframes leSnake {
+        from,
+        to {
+          transform: translateY(0px);
+        }
+        50% {
+          transform: translateY(30px);
+        }
+      }
+    </style>
+  </head>
+
+  <body>
+    <h1 class="content leSnake">
+      <span class="letter" style="animation-delay: 100ms">C</span
+      ><span class="letter" style="animation-delay: 250ms">E</span
+      ><span class="letter" style="animation-delay: 400ms; letter-spacing: 6px">T</span
+      ><span class="letter" style="animation-delay: 550ms">电</span
+      ><span class="letter" style="animation-delay: 700ms">子</span
+      ><span class="letter" style="animation-delay: 850ms">阅</span
+      ><span class="letter" style="animation-delay: 1000ms">卷</span>
+    </h1>
+  </body>
+</html>

+ 75 - 0
electron/preload/preload.ts

@@ -0,0 +1,75 @@
+import path from 'path'
+function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) {
+  return new Promise((resolve) => {
+    if (condition.includes(document.readyState)) {
+      resolve(true)
+    } else {
+      document.addEventListener('readystatechange', () => {
+        if (condition.includes(document.readyState)) {
+          resolve(true)
+        }
+      })
+    }
+  })
+}
+
+const fontWeights: [number, string][] = [
+  [400, 'Normal'],
+  [500, 'Medium'],
+  [600, 'Medium'],
+  [700, 'Bold'],
+  [800, 'Heavy'],
+  [900, 'Heavy'],
+]
+
+const fontHanSanAbsolute = (weight: string) =>
+  `file://${path.resolve(__dirname, `fonts/SourceHanSansCN-${weight}.otf`)}`
+
+function prefetchFontLink(fontPath: string) {
+  const link = document.createElement('link')
+  link.rel = 'prefetch'
+  link.href = fontPath
+  link.as = 'font'
+  link.type = 'font/otf'
+  link.crossOrigin = 'crossOrigin'
+  return link
+}
+
+function setFontFace(fontFamily: string, weight: number, fontPath: string) {
+  return `
+    @font-face {
+      font-family: ${fontFamily};
+      src: url(${fontPath});
+      font-weight: ${weight};
+    }
+  `
+}
+
+function provideHanSansFont() {
+  const prefetchFragment = document.createDocumentFragment()
+  const style = document.createElement('style')
+  let styleContent = ''
+  fontWeights.forEach(([weight, type]) => {
+    const fontPath = fontHanSanAbsolute(type).replace(/\\/g, '/')
+    prefetchFragment.append(prefetchFontLink(fontPath))
+    styleContent += setFontFace('HanSan', weight, fontPath)
+  })
+  style.innerHTML = styleContent
+  document.head.insertBefore(prefetchFragment, null)
+  document.head.appendChild(style)
+}
+
+function provideDouYuFont() {
+  const fontDouYuAbsolute = `file://${path.resolve(__dirname, `fonts/DOUYU-Font.woff2`)}`.replace(/\\/g, '/')
+  const prefetchLink = prefetchFontLink(fontDouYuAbsolute)
+  const style = document.createElement('style')
+  style.innerHTML = setFontFace('DouYu', 700, fontDouYuAbsolute)
+  document.head.insertBefore(prefetchLink, null)
+  document.head.appendChild(style)
+}
+
+domReady().then(() => {
+  /** provideFont */
+  provideHanSansFont()
+  provideDouYuFont()
+})

二進制
electron/preload/public/fonts/DOUYU-Font.woff2


二進制
electron/preload/public/fonts/SourceHanSansCN-Bold.otf


二進制
electron/preload/public/fonts/SourceHanSansCN-Heavy.otf


二進制
electron/preload/public/fonts/SourceHanSansCN-Medium.otf


二進制
electron/preload/public/fonts/SourceHanSansCN-Normal.otf


+ 0 - 1
index.html

@@ -2,7 +2,6 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>CET阅卷</title>
   </head>

+ 28 - 18
package.json

@@ -1,30 +1,36 @@
 {
-  "name": "cet-mark-paper",
+  "name": "cet-marking-web",
   "private": true,
-  "version": "0.0.0",
-  "type": "module",
+  "version": "0.0.1",
+  "description": "CET阅卷系统",
+  "main": "dist/main/main.js",
   "scripts": {
     "start": "vite",
+    "start:web": "cross-env ONLY_WEB=1 vite",
     "build": "vue-tsc --noEmit && vite build",
+    "electron-builder": "electron-builder",
+    "electron": "electron dist/main/main.js",
     "preview": "vite preview",
     "prepare": "husky install"
   },
   "dependencies": {
-    "@element-plus/icons-vue": "^2.0.9",
-    "@vueuse/core": "^9.2.0",
-    "axios": "^0.27.2",
-    "copy-to-clipboard": "^3.3.2",
-    "crypto-js": "^4.1.1",
-    "dayjs": "^1.11.5",
-    "echarts": "^5.3.3",
-    "element-plus": "^2.2.16",
-    "lodash-es": "^4.17.21",
-    "pinia": "^2.0.22",
-    "vue": "^3.2.37",
-    "vue-echarts": "^6.2.3",
-    "vue-router": "^4.1.5"
+    "@element-plus/icons-vue": "2.0.10",
+    "@vueuse/core": "9.3.0",
+    "axios": "0.27.2",
+    "big.js": "^6.2.1",
+    "copy-to-clipboard": "3.3.2",
+    "crypto-js": "4.1.1",
+    "dayjs": "1.11.5",
+    "echarts": "5.4.0",
+    "element-plus": "2.2.17",
+    "lodash-es": "4.17.21",
+    "pinia": "2.0.23",
+    "vue": "3.2.40",
+    "vue-echarts": "6.2.3",
+    "vue-router": "4.1.5"
   },
   "devDependencies": {
+    "@types/big.js": "^6.1.6",
     "@types/crypto-js": "^4.1.1",
     "@types/lodash-es": "^4.17.6",
     "@typescript-eslint/eslint-plugin": "^5.38.0",
@@ -32,7 +38,11 @@
     "@vitejs/plugin-vue": "^3.1.0",
     "@vitejs/plugin-vue-jsx": "^2.0.1",
     "autoprefixer": "^10.4.10",
+    "cross-env": "^7.0.3",
     "cssnano": "^5.1.13",
+    "electron": "19.0.10",
+    "electron-builder": "^23.6.0",
+    "electron-devtools-installer": "^3.2.0",
     "eslint": "^8.23.1",
     "eslint-config-prettier": "^8.5.0",
     "eslint-plugin-prettier": "^4.2.1",
@@ -43,13 +53,13 @@
     "prettier": "^2.7.1",
     "sass": "^1.54.9",
     "typescript": "^4.6.4",
-    "unocss": "^0.45.21",
     "unplugin-element-plus": "^0.4.1",
     "unplugin-vue-setup-extend-plus": "^0.3.2",
     "vite": "^3.1.0",
     "vite-plugin-eslint": "^1.8.1",
     "vite-plugin-svg-icons": "^2.0.1",
-    "vue-tsc": "^0.40.4"
+    "vite-use-electron": "^0.0.2",
+    "vue-tsc": "^0.40.13"
   },
   "lint-staged": {
     "**/*.{js,jsx,ts,tsx,vue}": [

文件差異過大導致無法顯示
+ 372 - 381
pnpm-lock.yaml


+ 1 - 1
postcss.config.cjs

@@ -4,7 +4,7 @@ module.exports = {
     ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}),
     'postcss-px-to-viewport-8-plugin': {
       unitToConvert: 'px',
-      viewportWidth: 1920,
+      viewportWidth: 1680,
       unitPrecision: 5,
       propList: ['*'],
       viewportUnit: 'vw',

+ 11 - 0
server.config.ts

@@ -0,0 +1,11 @@
+import type { ServerOptions } from 'vite'
+
+const server: ServerOptions = {
+  proxy: {
+    '^/?api/': {
+      target: 'http://192.168.10.41:7201',
+    },
+  },
+}
+
+export default server

+ 13 - 4
src/App.vue

@@ -1,9 +1,18 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { ElConfigProvider } from 'element-plus'
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+
+if (mainStore.loginInfo) {
+  mainStore.getMyUserInfo()
+}
+</script>
 
 <template>
-  <div class="main">
-    <RouterView />
-  </div>
+  <el-config-provider :locale="zhCn">
+    <RouterView></RouterView>
+  </el-config-provider>
 </template>
 
 <style scoped lang="scss"></style>

+ 21 - 0
src/api/check.ts

@@ -0,0 +1,21 @@
+import { DefineApiModule, ForceCheck } from 'api-type'
+
+const ForceCheckApi: DefineApiModule<ForceCheck.ApiMap> = {
+  /** 获取考核组 */
+  getForceCheckGroupList: {
+    url: '/api/force/group/list',
+  },
+  /** 获取分发进度 */
+  getHandOutProgressList: {
+    url: '/api/force/group/markers',
+  },
+  /** 分发强制考核卷 */
+  handOutForceCheck: {
+    url: '/api/force/group/dispense',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+}
+
+export default ForceCheckApi

+ 0 - 5
src/api/common.ts

@@ -1,5 +0,0 @@
-import request from '@/plugins/request'
-
-/**
- * @description 获取用户信息
- */

+ 16 - 0
src/api/exam.ts

@@ -0,0 +1,16 @@
+import { DefineApiModule, Exam } from 'api-type'
+
+const ExamApi: DefineApiModule<Exam.ApiMap> = {
+  /** 删除考试 */
+  deleteExam: '/api/exam/delete',
+  /** 获取考试信息 */
+  getExamInfo: '/api/exam/info',
+  /** 查询考试列表 */
+  getExamList: '/api/exam/page',
+  /** 新增/修改考试 */
+  saveExamInfo: '/api/exam/save',
+  /** 启用/禁用考试 */
+  toggleEnableExam: '/api/exam/toggle',
+}
+
+export default ExamApi

+ 20 - 0
src/api/expert.ts

@@ -0,0 +1,20 @@
+import { DefineApiModule, Expert } from 'api-type'
+
+const ExpertApi: DefineApiModule<Expert.ApiMap> = {
+  /** AB培训卷 */
+  getSampleList: '/api/reference/paper/sample/page',
+  /** RF卷 */
+  getRfSampleList: '/api/reference/paper/rf/page',
+  /** 修改分数 */
+  updateMarkScore: '/api/reference/paper/score',
+  /** 标准卷 */
+  getStandardList: '/api/reference/paper/standard/page',
+  /** 转为样卷 */
+  transformStandardToSample: '/api/reference/paper/standard/to/rf',
+  /** 强制考核卷 */
+  getExpertAssessList: '/api/reference/paper/force/page',
+  /** 专家挑选卷 */
+  getExpertPickList: '/api/reference/paper/page',
+}
+
+export default ExpertApi

+ 10 - 0
src/api/index.ts

@@ -0,0 +1,10 @@
+import { DefineApiModule, ApiMap } from 'api-type'
+
+const apiModules = import.meta.glob<Record<'default', object>>('./*.ts', { eager: true })
+
+export default Object.values(apiModules).reduce((maps, module) => {
+  return {
+    ...maps,
+    ...(module.default || {}),
+  }
+}, {}) as DefineApiModule<ApiMap>

+ 53 - 0
src/api/marking.ts

@@ -0,0 +1,53 @@
+import { DefineApiModule, Marking } from 'api-type'
+
+const MarkingApi: DefineApiModule<Marking.ApiMap> = {
+  /** 自定义查询 - 抽查 */
+  getCustomQueryTasks: '/api/custom/query/page',
+  /** 自定义查询 - 保存为快捷查询 */
+  setCustomQueryConfig: {
+    url: '/api/custom/query/save',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  /** 自定义查询 - 获取快捷查询列表 */
+  getCustomQueryConfigList: '/api/custom/query/list',
+  /** 查看评分标准 */
+  getMarkingStandard: '/api/mark/markstandard',
+  /** 获取评卷任务 */
+  getMarkingTask: '/api/mark/task',
+  /** 提交评卷任务 */
+  submitMarkTask: '/api/mark/submit',
+  /** 获取评卷进度 */
+  getMarkStatus: '/api/mark/status',
+  /** 获取回评历史 */
+  getMarkHistory: '/api/mark/remark',
+  /** 问题卷列表 */
+  getProblemHistory: '/api/problem/history/page',
+  /** 问题卷打分 */
+  markProblemPaper: '/api/problem/history/mark',
+  /** 通过taskId 查询给分记录 */
+  getMarkScoreHistoryListWithTask: '/api/mark/history/task',
+  /** 通过secretNumber 查询给分记录 */
+  getMarkScoreHistoryListWithSecret: '/api/mark/history/secretNumber',
+  /** 打回 */
+  rejectMarkHistory: '/api/problem/history/reject',
+  /** 仲裁卷 */
+  getArbitrationList: '/api/arbitration/page',
+  /** 仲裁卷打分 */
+  markArbitrationPaper: '/api/arbitration/mark',
+  /** 仲裁卷浏览 */
+  viewArbitrationPaper: '/api/arbitration/view',
+  /** 重评卷列表 */
+  getReMarkPaperList: '/api/re/mark/page',
+  /** 重评卷打分 */
+  markReMarkPaper: '/api/re/mark/mark',
+  /** 重评卷确认 */
+  confirmReMarkPaper: '/api/re/mark/confirm',
+  /** 查看培训记录 */
+  viewTrainingRecord: '/api/mark/sample/history',
+  /** 查看样卷 */
+  viewSamplePaper: '/api/mark/rf',
+}
+
+export default MarkingApi

+ 9 - 0
src/api/message.ts

@@ -0,0 +1,9 @@
+import { DefineApiModule, Message } from 'api-type'
+
+const MessageApi: DefineApiModule<Message.ApiMap> = {
+  getUserHistory: '/api/message/history',
+  getHistory: '/api/message/list',
+  sendMessage: '/api/message/send',
+}
+
+export default MessageApi

+ 23 - 0
src/api/question.ts

@@ -0,0 +1,23 @@
+import { DefineApiModule, Question } from 'api-type'
+
+const QuestionApi: DefineApiModule<Question.ApiMap> = {
+  deleteSubQuestion: '/api/question/sub/delete',
+  editSubQuestion: '/api/question/sub/edit',
+  getSubQuestionList: '/api/question/sub/list',
+  addMainQuestion: {
+    url: '/api/question/main/save',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  editMainQuestion: {
+    url: '/api/question/main/update',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  getMainQuestionInfo: '/api/question/main/info',
+  getMainQuestionList: '/api/question/main/list',
+}
+
+export default QuestionApi

+ 12 - 0
src/api/role.ts

@@ -0,0 +1,12 @@
+import { DefineApiModule, Role } from 'api-type'
+
+const RoleApi: DefineApiModule<Role.ApiMap> = {
+  /** 获取角色列表 */
+  getRoleList: '/api/role/list',
+  /** 获取角色权限 */
+  getRolePrivilege: '/api/role/privilege',
+  /** 设置角色权限 */
+  setRolePrivilege: '/api/role/privilege/save',
+}
+
+export default RoleApi

+ 65 - 0
src/api/statistics.ts

@@ -0,0 +1,65 @@
+import { DefineApiModule, Statistics } from 'api-type'
+
+const StatisticsApi: DefineApiModule<Statistics.ApiMap> = {
+  /** 质量统计-自查一致性分析 */
+  selfCheckAnalysis: {
+    url: '/api/statistic/check/analysis',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  /** 质量统计-自查一致性分析-离差列表 */
+  /** 质量统计-抽查情况统计 */
+  /** 决策分析-评卷进度统计(整体) */
+  getMarkProgress: '/api/statistic/marking/progress',
+  /** 决策分析-评卷进度统计(按小组) */
+  getMarkProgressByGroup: '/api/statistic/marking/progress/by/group',
+  /** 决策分析-评卷进度统计(按评卷员) */
+  getMarkProgressByMarker: '/api/statistic/marking/progress/by/marker',
+  /** 决策分析-评卷进度统计导出(按评卷员) */
+  exportMarkProgressByMarker: {
+    url: '/api/statistic/marking/progress/by/marker/export',
+    download: true,
+  },
+  /** 质量统计-科目进度收尾 */
+  /** 决策分析-小组监控 */
+  getGroupMonitor: {
+    url: '/api/statistic/monitor/for/group',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  /** 决策分析-监控统计(整体) */
+  getStatistics: {
+    url: '/api/statistic/monitor/list',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  /** 决策分析-监控统计(按小组) */
+  getStatisticsByGroup: {
+    url: '/api/statistic/monitor/list/by/group',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+  /** 决策分析-监控统计导出(按小组) */
+  exportStatisticsByGroup: {
+    url: '/api/statistic/monitor/list/by/group/export',
+    download: true,
+  },
+  /** 决策分析-监控统计(按评卷员) */
+  /** 决策分析-监控统计导出(按评卷员) */
+  /** 决策分析-监控统计客观题&主观题分数分布 */
+  /** 培训监控 */
+  getTrainingMonitor: '/api/train/monitor/list',
+  /** 个人统计(评卷员) */
+  getPersonalStatistic: {
+    url: '/api/statistic/personal/result',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
+}
+
+export default StatisticsApi

+ 16 - 0
src/api/subject.ts

@@ -0,0 +1,16 @@
+import { DefineApiModule, Subject } from 'api-type'
+
+const SubjectApi: DefineApiModule<Subject.ApiMap> = {
+  /** 删除科目 */
+  deleteSubject: '/api/subject/delete',
+  /** 获取科目信息 */
+  getSubjectInfo: '/api/subject/info',
+  /** 查询科目列表 */
+  getSubjectList: '/api/subject/page',
+  /** 新增/修改科目 */
+  saveSubjectInfo: '/api/subject/save',
+  /** 启用/禁用科目 */
+  toggleEnableSubject: '/api/subject/toggle',
+}
+
+export default SubjectApi

+ 43 - 0
src/api/system.ts

@@ -0,0 +1,43 @@
+import { DefineApiModule, System } from 'api-type'
+
+const SystemApi: DefineApiModule<System.ApiMap> = {
+  /** 评卷数据导入 */
+  importMarkingData: {
+    url: '/api/student/import',
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    },
+  },
+  /** 获取培训卷RF卷评分标准路径 */
+  getImportFilePath: '/api/reference/paper/file/path',
+  /** 导入培训卷 */
+  importSamplePaper: {
+    url: '/api/reference/paper/import/samp',
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    },
+  },
+  /** 导入培训卷 */
+  importRfPaper: {
+    url: '/api/reference/paper/import/rf',
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    },
+  },
+  /** 导入评分标准 */
+  importMarkStandard: {
+    url: '/xxx/xx',
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    },
+  },
+  /** CET成绩列表 */
+  getCetScoreList: '/api/student/page',
+  /** CET成绩导出接口 */
+  exportCetScoreList: {
+    url: '/api/student/export',
+    download: true,
+  },
+}
+
+export default SystemApi

+ 45 - 0
src/api/user.ts

@@ -0,0 +1,45 @@
+import { DefineApiModule, User } from 'api-type'
+
+const UserApi: DefineApiModule<User.ApiMap> = {
+  /** 登录 */
+  userLogin: {
+    url: '/api/auth/login',
+    noAuth: true,
+  },
+  /** 登出 */
+  userLogout: '/api/auth/logout',
+  /** 导入用户 */
+  importUser: '/api/user/import',
+  /** 导入用户 */
+  exportUser: '/api/user/export',
+  /** 下载用户导入模板 */
+  downloadUserTemplate: '/api/user/import/template',
+  /** 查询当前用户信息 */
+  getMyUserInfo: '/api/user/my/info',
+  /** 查询指定用户信息 */
+  getUserInfo: '/api/user/info',
+  /** 查询用户列表 */
+  getUserList: '/api/user/page',
+  /** 修改用户密码 */
+  updateUserPwd: '/api/user/password',
+  /** 重置指定用户密码 */
+  resetUsersPwd: '/api/user/reset/passwd',
+  /** 启用/禁用 用户 */
+  toggleEnableUsers: '/api/user/toggle',
+  /** 新增/修改用户信息 */
+  saveUserInfo: '/api/user/save',
+  /** 批量创建用户 */
+  bulkSaveUser: '/api/user/batch/create',
+  /** 超管选择考试 */
+  checkExam: '/api/auth/exam',
+  /** 修改用户姓名 */
+  updateUserName: '/api/user/modify/name',
+  /** 获取用户菜单 */
+  getUserPrivilege: '/api/user/privilege',
+  /** 获取评卷员分组 */
+  getMarkerTree: '/api/user/marker/group',
+  /** 获取评卷员 */
+  getMarkerList: '/api/user/marker/list',
+}
+
+export default UserApi

+ 11 - 0
src/assets/icons/mark-back.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="10px" height="8px" viewBox="0 0 10 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-1</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-153.000000, -52.000000)" fill="currentColor">
+            <g id="编组" transform="translate(153.000000, 52.000000)">
+                <path d="M5,0 L5,3 L9.5,3 C9.77614237,3 10,3.22385763 10,3.5 L10,4.5 C10,4.77614237 9.77614237,5 9.5,5 L5,5 L5,8 L0,4 L5,0 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-background-color.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="10px" height="10px" viewBox="0 0 10 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-6</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-413.000000, -51.000000)" fill="currentColor" fill-rule="nonzero">
+            <g id="编组" transform="translate(413.000000, 51.000000)">
+                <path d="M3.65329513,6.13445378 L4.98567335,2.46498599 L5.01432665,2.46498599 L6.30372493,6.13445378 L3.65329513,6.13445378 Z M3.86819484,0 L0,10 L2.26361032,10 L3.06590258,7.77310924 L6.89111748,7.77310924 L7.66475645,10 L10,10 L6.1747851,0 L3.86819484,0 Z" id="形状"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 5 - 0
src/assets/icons/mark-bookmark.svg

@@ -0,0 +1,5 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg t="1667439186072" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <path fill="currentColor" d="M768 170.666667v648.106666l-188.16-117.333333a128 128 0 0 0-135.68 0L256 818.773333V170.666667h512m0-85.333334H256a85.333333 85.333333 0 0 0-85.333333 85.333334v725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667 42.666667 42.666667 0 0 0 22.613334-6.4l253.44-158.72a42.666667 42.666667 0 0 1 45.226666 0l253.44 158.72A42.666667 42.666667 0 0 0 810.666667 938.666667a42.666667 42.666667 0 0 0 42.666666-42.666667V170.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z" p-id="16761"></path>
+</svg>

+ 11 - 0
src/assets/icons/mark-center.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-11</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-281.000000, -49.000000)" fill="currentColor">
+            <g id="编组" transform="translate(281.000000, 49.000000)">
+                <path d="M3.5,0 L10.5,0 C10.7761424,-5.07265313e-17 11,0.223857625 11,0.5 L11,1.5 C11,1.77614237 10.7761424,2 10.5,2 L3.5,2 C3.22385763,2 3,1.77614237 3,1.5 L3,0.5 C3,0.223857625 3.22385763,5.07265313e-17 3.5,0 Z M3.5,6 L10.5,6 C10.7761424,6 11,6.22385763 11,6.5 L11,7.5 C11,7.77614237 10.7761424,8 10.5,8 L3.5,8 C3.22385763,8 3,7.77614237 3,7.5 L3,6.5 C3,6.22385763 3.22385763,6 3.5,6 Z M3.5,12 L10.5,12 C10.7761424,12 11,12.2238576 11,12.5 L11,13.5 C11,13.7761424 10.7761424,14 10.5,14 L3.5,14 C3.22385763,14 3,13.7761424 3,13.5 L3,12.5 C3,12.2238576 3.22385763,12 3.5,12 Z M0.5,3 L13.5,3 C13.7761424,3 14,3.22385763 14,3.5 L14,4.5 C14,4.77614237 13.7761424,5 13.5,5 L0.5,5 C0.223857625,5 3.38176876e-17,4.77614237 0,4.5 L0,3.5 C-3.38176876e-17,3.22385763 0.223857625,3 0.5,3 Z M0.5,9 L13.5,9 C13.7761424,9 14,9.22385763 14,9.5 L14,10.5 C14,10.7761424 13.7761424,11 13.5,11 L0.5,11 C0.223857625,11 3.38176876e-17,10.7761424 0,10.5 L0,9.5 C-3.38176876e-17,9.22385763 0.223857625,9 0.5,9 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 7 - 0
src/assets/icons/mark-delete.svg

@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+  <svg t="1667440845155" fill="currentColor" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16">
+    <path d="M942.656 96.448 561.984 96.64 561.728 46.72c0-25.664-20.224-46.464-45.184-46.464-0.768 0-1.408 0.384-2.176 0.448-0.768 0-1.408-0.448-2.176-0.448-24.96 0-45.248 20.8-45.248 46.464L467.2 96.64 81.344 96.832c-25.024 0-45.248 20.864-45.248 46.464 0 25.664 20.224 46.4 45.248 46.4l48.768 0 0.32 692.16L130.56 881.856l0 49.152c0 51.008 40.448 92.288 90.432 92.288L266.24 1023.296l0 0.384 497.536-0.32 0-0.064 45.248 0c49.664 0 89.92-40.896 90.432-91.52L899.2 283.264c0-25.472-20.224-46.208-45.248-46.208-25.088 0-45.248 20.672-45.248 46.208l0.32 583.36c-4.8 53.696-26.56 64.448-89.28 64.448l1.152 0-421.696 0.256 11.008-0.256c-62.528 0-84.352-10.752-89.28-63.936L220.608 189.632l722.048-0.32c25.024 0 45.248-20.8 45.248-46.464S967.616 96.448 942.656 96.448z" p-id="18503"></path>
+    <path d="M401.28 232.512c-24.96 0-45.248 20.8-45.248 46.4l0.448 559.104c0 25.6 20.224 46.4 45.248 46.4 24.96 0 45.248-20.736 45.248-46.4L446.528 278.912C446.528 253.312 426.24 232.512 401.28 232.512z" p-id="18504"></path>
+    <path d="M627.456 232.512c-24.96 0-45.248 20.8-45.248 46.4l0.448 559.104c0 25.6 20.224 46.4 45.248 46.4s45.184-20.736 45.184-46.4l-0.384-559.104C672.704 253.312 652.416 232.512 627.456 232.512z" p-id="18505"></path>
+  </svg>

+ 12 - 0
src/assets/icons/mark-example.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="12px" height="14px" viewBox="0 0 12 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-10</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-586.000000, -49.000000)">
+            <g id="编组" transform="translate(586.000000, 49.000000)">
+                <path d="M12,12 C12,13.1045695 11.1045695,14 10,14 L2,14 C0.8954305,14 1.3527075e-16,13.1045695 0,12 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 L8,0 L12,4 L12,12 Z" id="形状结合" fill="currentColor"></path>
+                <polygon id="矩形" fill="#DDDDDD" points="8 0 12 4 8 4"></polygon>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/mark-front-color.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-5</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-369.000000, -50.000000)">
+            <g id="编组" transform="translate(369.000000, 50.000000)">
+                <rect id="矩形备份" fill="#FF723B" x="0" y="10" width="10" height="2" rx="0.5"></rect>
+                <path d="M3.65329513,4.90756303 L4.98567335,1.9719888 L5.01432665,1.9719888 L6.30372493,4.90756303 L3.65329513,4.90756303 Z M3.86819484,0 L0,8 L2.26361032,8 L3.06590258,6.21848739 L6.89111748,6.21848739 L7.66475645,8 L10,8 L6.1747851,0 L3.86819484,0 Z" id="形状" fill="currentColor" fill-rule="nonzero"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 15 - 0
src/assets/icons/mark-problem.svg

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="14px" viewBox="0 0 16 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-9</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-540.000000, -49.000000)">
+            <g id="编组" transform="translate(540.000000, 49.000000)">
+                <rect id="矩形" stroke="currentColor" stroke-width="2" x="1" y="3" width="14" height="10" rx="2"></rect>
+                <path d="M7,11 C6.44771525,11 6,10.5522847 6,10 C6,9.44771525 6.44771525,9 7,9 L8,9 L8,6 C8,5.44771525 8.44771525,5 9,5 C9.55228475,5 10,5.44771525 10,6 L10,10 L10,10 C10,10.5128358 9.61395981,10.9355072 9.11662113,10.9932723 L9,11 L9,11 L7,11 Z" id="形状结合" fill="currentColor" transform="translate(8.000000, 8.000000) rotate(45.000000) translate(-8.000000, -8.000000) "></path>
+                <path d="M2,1 L14,1 C15.1045695,1 16,1.8954305 16,3 L16,5 L16,5 L0,5 L0,3 C-1.3527075e-16,1.8954305 0.8954305,1 2,1 Z" id="矩形" fill="currentColor"></path>
+                <rect id="矩形" fill="#999999" x="4" y="0" width="2" height="3" rx="1"></rect>
+                <rect id="矩形备份-4" fill="#999999" x="10" y="0" width="2" height="3" rx="1"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 16 - 0
src/assets/icons/mark-refresh.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="12px" height="10px" viewBox="0 0 12 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-7</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-456.000000, -51.000000)">
+            <g id="编组" transform="translate(456.000000, 51.000000)" fill="currentColor" fill-rule="nonzero">
+                <g id="形状结合">
+                    <path d="M11.6416244,5 C11.8395498,5 12,5.15650206 12,5.34955713 L12,5.34955713 L12,9.01990708 C11.9979859,9.15975621 11.910702,9.28497219 11.7781112,9.33822497 C11.6455204,9.39147776 11.4931495,9.36251492 11.3907615,9.26459709 L11.3907615,9.26459709 L10.3514722,8.21592567 C8.86339088,9.61816695 6.78078572,10.24738 4.74061911,9.91112086 C2.70045251,9.57486166 0.945434675,8.31313355 0.0123358048,6.51183462 C-0.0171346283,6.43838071 0.00748778807,6.35477575 0.0724327821,6.30777644 C0.137377776,6.26077712 0.226549055,6.262032 0.29007691,6.31083927 C2.69073662,8.40112222 6.25220906,8.60035161 8.88213218,6.79148032 L8.88213218,6.79148032 L7.66365512,5.59424713 C7.56639361,5.49905069 7.53369926,5.35789479 7.57955744,5.23116047 C7.62541563,5.10442614 7.74170462,5.01455872 7.87868048,5 L7.87868048,5 Z M1.6485278,1.78407433 C3.13660912,0.381833049 5.21921428,-0.247380047 7.25938089,0.0888791449 C9.29954749,0.425138337 11.0545653,1.68686645 11.9876642,3.48816538 C12.0171346,3.56161929 11.9925122,3.64522425 11.9275672,3.69222356 C11.8626222,3.73922288 11.7734509,3.737968 11.7099231,3.68916073 C9.30926338,1.59887778 5.74779094,1.39964839 3.11786782,3.20851968 L3.11786782,3.20851968 L4.33634488,4.40575287 C4.43360639,4.50094931 4.46630074,4.64210521 4.42044256,4.76883953 C4.37458437,4.89557386 4.25829538,4.98544128 4.12131952,5 L4.12131952,5 L0.358375597,5 C0.160450225,5 0,4.84349794 0,4.65044287 L0,4.65044287 L0,0.980092919 C0.00201409986,0.840243793 0.0892979967,0.715027808 0.221888812,0.661775025 C0.354479628,0.608522243 0.506850505,0.637485078 0.609238532,0.735402915 L0.609238532,0.735402915 Z"></path>
+                </g>
+            </g>
+            <g id="icon-刷新" transform="translate(456.000000, 51.000000)" fill="currentColor" fill-rule="nonzero">
+                <path d="M11.6416244,5 C11.8395498,5 12,5.15650206 12,5.34955713 L12,5.34955713 L12,9.01990708 C11.9979859,9.15975621 11.910702,9.28497219 11.7781112,9.33822497 C11.6455204,9.39147776 11.4931495,9.36251492 11.3907615,9.26459709 L11.3907615,9.26459709 L10.3514722,8.21592567 C8.86339088,9.61816695 6.78078572,10.24738 4.74061911,9.91112086 C2.70045251,9.57486166 0.945434675,8.31313355 0.0123358048,6.51183462 C-0.0171346283,6.43838071 0.00748778807,6.35477575 0.0724327821,6.30777644 C0.137377776,6.26077712 0.226549055,6.262032 0.29007691,6.31083927 C2.69073662,8.40112222 6.25220906,8.60035161 8.88213218,6.79148032 L8.88213218,6.79148032 L7.66365512,5.59424713 C7.56639361,5.49905069 7.53369926,5.35789479 7.57955744,5.23116047 C7.62541563,5.10442614 7.74170462,5.01455872 7.87868048,5 L7.87868048,5 Z M1.6485278,1.78407433 C3.13660912,0.381833049 5.21921428,-0.247380047 7.25938089,0.0888791449 C9.29954749,0.425138337 11.0545653,1.68686645 11.9876642,3.48816538 C12.0171346,3.56161929 11.9925122,3.64522425 11.9275672,3.69222356 C11.8626222,3.73922288 11.7734509,3.737968 11.7099231,3.68916073 C9.30926338,1.59887778 5.74779094,1.39964839 3.11786782,3.20851968 L3.11786782,3.20851968 L4.33634488,4.40575287 C4.43360639,4.50094931 4.46630074,4.64210521 4.42044256,4.76883953 C4.37458437,4.89557386 4.25829538,4.98544128 4.12131952,5 L4.12131952,5 L0.358375597,5 C0.160450225,5 0,4.84349794 0,4.65044287 L0,4.65044287 L0,0.980092919 C0.00201409986,0.840243793 0.0892979967,0.715027808 0.221888812,0.661775025 C0.354479628,0.608522243 0.506850505,0.637485078 0.609238532,0.735402915 L0.609238532,0.735402915 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-remark.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="10px" viewBox="0 0 14 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-8</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-497.000000, -51.000000)" fill="currentColor">
+            <g id="编组" transform="translate(497.000000, 51.000000)">
+                <path d="M14,0 L14,10 L8,6.25 L8,10 L0,5 L8,0 L8,3.75 L14,0 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-rotate.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-4</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-324.000000, -50.000000)" fill="currentColor">
+            <g id="编组" transform="translate(324.000000, 50.000000)">
+                <path d="M11,5.27083333 C11.5522847,5.27083333 12,5.71854858 12,6.27083333 L12,10.0208333 C12,10.5731181 11.5522847,11.0208333 11,11.0208333 L4,11.0208333 C3.44771525,11.0208333 3,10.5731181 3,10.0208333 L3,6.27083333 C3,5.71854858 3.44771525,5.27083333 4,5.27083333 L11,5.27083333 Z M10,7.1875 L5,7.1875 L5,9.10416667 L10,9.10416667 L10,7.1875 Z M6.5,-0.00403977619 C6.6047152,-0.00403977619 6.70678767,0.0288369724 6.79181802,0.0899525381 L9.43511974,1.98982565 C9.65935159,2.15099229 9.71047605,2.4634195 9.5493094,2.68765136 C9.51768501,2.73165051 9.4791189,2.77021663 9.43511974,2.80184102 L6.79181802,4.70171413 C6.56758617,4.86288077 6.25515896,4.81175632 6.09399231,4.58752447 C6.03287675,4.50249411 6,4.40042164 6,4.29570644 L6,3.35416667 L3.91666667,3.35416667 C2.90852784,3.35416667 2.08218028,4.13250762 2.00576654,5.12104696 L2,5.27083333 L2,7.64583333 C2,7.92197571 1.77614237,8.14583333 1.5,8.14583333 L0.5,8.14583333 C0.223857625,8.14583333 3.38176876e-17,7.92197571 0,7.64583333 L0,5.27083333 C-2.59268938e-16,3.15374179 1.71624179,1.4375 3.83333333,1.4375 L6,1.4375 L6,0.495960224 C6,0.219817849 6.22385763,-0.00403977619 6.5,-0.00403977619 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-scale-down.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="10px" height="2px" viewBox="0 0 10 2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-3</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-241.000000, -55.000000)" fill="currentColor">
+            <g id="编组" transform="translate(241.000000, 55.000000)">
+                <rect id="矩形" x="0" y="0" width="10" height="2" rx="0.5"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-scale-up.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="10px" height="10px" viewBox="0 0 10 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-2</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-197.000000, -51.000000)" fill="currentColor">
+            <g id="编组" transform="translate(197.000000, 51.000000)">
+                <path d="M5.5,0 C5.77614237,-5.07265313e-17 6,0.223857625 6,0.5 L6,4 L9.5,4 C9.77614237,4 10,4.22385763 10,4.5 L10,5.5 C10,5.77614237 9.77614237,6 9.5,6 L6,6 L6,9.5 C6,9.77614237 5.77614237,10 5.5,10 L4.5,10 C4.22385763,10 4,9.77614237 4,9.5 L4,6 L0.5,6 C0.223857625,6 3.38176876e-17,5.77614237 0,5.5 L0,4.5 C-3.38176876e-17,4.22385763 0.223857625,4 0.5,4 L4,4 L4,0.5 C4,0.223857625 4.22385763,5.07265313e-17 4.5,0 L5.5,0 Z" id="形状结合"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/mark-standard.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="4px" height="12px" viewBox="0 0 4 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷图标-8</title>
+    <g id="评卷员" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="B-评卷员-2" transform="translate(-510.000000, -22.000000)" fill="currentColor">
+            <g id="编组" transform="translate(510.000000, 22.000000)">
+                <path d="M0,5 C-6.76353751e-17,4.44771525 0.44771525,4 1,4 L3,4 C3.55228475,4 4,4.44771525 4,5 L4,6 C4,6.55228475 3.55228475,7 3,7 L3,10.5 C3,11.3284271 2.32842712,12 1.5,12 C0.671572875,12 1.01453063e-16,11.3284271 0,10.5 L0,5 Z M1.5,0 C2.32842712,-1.52179594e-16 3,0.671572875 3,1.5 C3,2.32842712 2.32842712,3 1.5,3 C0.671572875,3 1.01453063e-16,2.32842712 0,1.5 C-1.01453063e-16,0.671572875 0.671572875,1.52179594e-16 1.5,0 Z" id="形状结合" transform="translate(2.000000, 6.000000) scale(-1, 1) translate(-2.000000, -6.000000) "></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 11 - 0
src/assets/icons/message.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="16px" viewBox="0 0 14 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>铃铛</title>
+    <g id="评卷员" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="B-评卷员-2" transform="translate(-1445.000000, -20.000000)" fill="#888888">
+            <g id="编组" transform="translate(1445.000000, 20.000000)">
+                <path d="M7,16 C6.25996375,16 5.61380357,15.5980687 5.26790938,15.0005962 L8.73209062,15.0005962 C8.38619643,15.5980687 7.74003625,16 7,16 Z M0,14 C-6.76353751e-17,13.4477153 0.44771525,13 1,13 L1,7 C1,4.38442963 2.67362191,2.15975461 5.00838632,1.33845432 C5.088647,0.586479877 5.72583364,1.42212053e-16 6.5,0 L7.5,0 C8.27416636,-1.42212053e-16 8.911353,0.586479877 8.99150137,1.33938107 C11.3263781,2.15975461 13,4.38442963 13,7 L13,13 C13.5522847,13 14,13.4477153 14,14 C14,14.5522847 13.5522847,15 13,15 L1,15 C0.44771525,15 6.76353751e-17,14.5522847 0,14 Z M7,3 C4.85780461,3 3.10892112,4.68396847 3.00489531,6.80035966 L3,7 L3,13 L11,13 L11,7 C11,4.790861 9.209139,3 7,3 Z" id="提示"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-analysis.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>决策分析-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -47.000000)" fill="none" stroke="currentColor" stroke-width="2">
+            <g id="编组" transform="translate(40.000000, 47.000000)">
+                <rect id="矩形" x="1" y="1" width="8" height="8" rx="3.5"></rect>
+                <rect id="矩形" x="5" y="5" width="8" height="8" rx="3.5"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 14 - 0
src/assets/icons/nav-data.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>数据管理-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -227.000000)">
+            <g id="编组" transform="translate(40.000000, 227.000000)">
+                <rect id="矩形" stroke="currentColor" stroke-width="2" x="1" y="1" width="12" height="12" rx="4"></rect>
+                <rect id="矩形" fill="currentColor" x="3" y="6" width="2" height="4" rx="1"></rect>
+                <rect id="矩形备份-3" fill="currentColor" x="6" y="4" width="2" height="6" rx="1"></rect>
+                <rect id="矩形备份-4" fill="currentColor" x="9" y="7" width="2" height="3" rx="1"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 13 - 0
src/assets/icons/nav-exam.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>考试管理-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -197.000000)">
+            <g id="编组" transform="translate(40.000000, 197.000000)">
+                <rect id="矩形" fill="currentColor" x="4" y="4" width="6" height="2" rx="1"></rect>
+                <rect id="矩形备份-2" fill="currentColor" x="4" y="7" width="6" height="2" rx="1"></rect>
+                <rect id="矩形" stroke="currentColor" stroke-width="2" x="1" y="1" width="12" height="12" rx="4"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-expert.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>专家卷浏览-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -137.000000)" stroke="currentColor" stroke-width="2">
+            <g id="编组" transform="translate(40.000000, 137.000000)">
+                <rect id="矩形" fill-opacity="0" fill="none" x="5" y="7" width="4" height="6" rx="2"></rect>
+                <rect id="矩形" fill="none" x="1" y="1" width="12" height="8" rx="3"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-marking.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评阅试卷-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -107.000000)">
+            <g id="编组" transform="translate(40.000000, 107.000000)">
+                <rect id="矩形" stroke="#666666" stroke-width="2" fill-opacity="0" fill="#D8D8D8" x="1" y="1" width="12" height="12" rx="4"></rect>
+                <path d="M4,6 L4,4 L8.171,3.99957288 L9,3.17157288 L10.4142136,4.58578644 L9,5.99857288 L9,6 L4,6 Z M4,10 L4,8 L8.171,7.99957288 L9,7.17157288 L10.4142136,8.58578644 L9,9.99857288 L9,10 L4,10 Z" id="形状结合" fill="currentColor"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-quality.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>质量统计-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -167.000000)">
+            <g id="编组" transform="translate(40.000000, 167.000000)">
+                <rect id="矩形" stroke="#666666" stroke-width="2" fill-opacity="0" fill="currentColor" x="1" y="1" width="12" height="12" rx="6"></rect>
+                <path d="M7,0 C10.8659932,-7.10171439e-16 14,3.13400675 14,7 L14,7 L14,7 L7,7 L7,0 Z" id="矩形" fill="currentColor"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-standard.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>评卷标准-选中</title>
+    <g id="评卷员" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="B-评卷员-5" transform="translate(-36.000000, -134.000000)">
+            <g id="编组" transform="translate(36.000000, 134.000000)">
+                <rect id="矩形" stroke="currentColor" stroke-width="2" x="1" y="1" width="12" height="12" rx="4"></rect>
+                <polygon id="星形" fill="currentColor" points="7 9.39743823 4.64885899 10.236068 4.71990075 7.74084916 3.19577393 5.76393202 5.59082117 5.06043173 7 3 8.40917883 5.06043173 10.8042261 5.76393202 9.28009925 7.74084916 9.35114101 10.236068"></polygon>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/nav-training.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title> 培训监控-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -77.000000)">
+            <g id="编组" transform="translate(40.000000, 77.000000)">
+                <rect id="矩形" stroke="currentColor" stroke-width="2" fill-opacity="0" fill="none" x="1" y="1" width="12" height="12" rx="6"></rect>
+                <circle id="椭圆形" stroke="currentColor" stroke-width="2" fill="" cx="7" cy="7" r="2"></circle>
+            </g>
+        </g>
+    </g>
+</svg>

+ 13 - 0
src/assets/icons/nav-user.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title> 用户管理-默认</title>
+    <g id="icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板" transform="translate(-40.000000, -257.000000)">
+            <g id="编组" transform="translate(40.000000, 257.000000)">
+                <circle id="椭圆形" stroke="currentColor" stroke-width="2" cx="7" cy="4" r="3"></circle>
+                <rect id="矩形" stroke="currentColor" stroke-width="2" x="1" y="9" width="12" height="4" rx="2"></rect>
+                <rect id="矩形" fill="currentColor" x="6" y="9" width="2" height="2"></rect>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 0
src/assets/icons/preview.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667813603032" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2161" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M945.92 192A14.08 14.08 0 0 1 960 206.08v611.84A14.08 14.08 0 0 1 945.92 832H78.08A14.08 14.08 0 0 1 64 817.92V206.08A14.08 14.08 0 0 1 78.08 192h867.84m0-64H78.08A78.08 78.08 0 0 0 0 206.08v611.84A78.08 78.08 0 0 0 78.08 896h867.84a78.08 78.08 0 0 0 78.08-78.08V206.08A78.08 78.08 0 0 0 945.92 128z" fill="#515151" p-id="2162"></path><path d="M64 832h611.84L320 512 64 707.2V832z m896-268.8L832 448 547.2 664.96 732.8 832H960V563.2zM192 352a96 96 0 1 0 192 0 96 96 0 1 0-192 0z" fill="#515151" p-id="2163"></path></svg>

+ 14 - 0
src/assets/icons/question.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="16px" viewBox="0 0 14 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>大题</title>
+    <g id="大组长" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="A-大组长-11" transform="translate(-878.000000, -495.000000)">
+            <g id="编组-19" transform="translate(874.000000, 491.000000)">
+                <g id="编组" transform="translate(4.000000, 4.000000)">
+                    <path d="M14,14 C14,15.1045695 13.1045695,16 12,16 L2,16 C0.8954305,16 1.3527075e-16,15.1045695 0,14 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 L9,0 L14,5 L14,14 Z" id="形状结合" fill="#00BA97"></path>
+                    <polygon id="矩形" fill="#FFFFFF" transform="translate(10.500000, 3.500000) scale(-1, -1) translate(-10.500000, -3.500000) " points="8 1 13 1 13 6"></polygon>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 0
src/assets/icons/right.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667878743481" class="icon" viewBox="0 0 1466 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4083" xmlns:xlink="http://www.w3.org/1999/xlink" width="22.90625" height="16"><path d="M921.355609 7.942721L1455.961814 488.782816a30.548926 30.548926 0 0 1 0 45.212411l-534.606205 481.451074a30.548926 30.548926 0 0 1-50.711218-22.606206V603.646778a30.548926 30.548926 0 0 0-30.548926-30.548926H61.097852a61.097852 61.097852 0 1 1 0-122.195704h778.997613a30.548926 30.548926 0 0 0 30.548926-30.548926V30.548926a30.548926 30.548926 0 0 1 50.711218-22.606205z" fill="currentColor" p-id="4084"></path></svg>

+ 11 - 0
src/assets/icons/setting.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>设置</title>
+    <g id="大组长" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="A-大组长-1" transform="translate(-1562.000000, -76.000000)" fill="currentColor" fill-rule="nonzero">
+            <g id="编组" transform="translate(1562.000000, 76.000000)">
+                <path d="M13.8333901,8.26200628 C14.2301601,6.67488435 13.7937023,5.6390344 13.7937023,5.6390344 L12.2756109,5.56451137 C12.1425791,5.08805698 11.947752,4.63876389 11.7002145,4.22312786 L12.7243472,3.06043218 C11.8826546,1.6576722 10.8415151,1.23380406 10.8415151,1.23380406 L9.71389954,2.25593383 C9.29382843,2.01157519 8.83943352,1.82228329 8.35879192,1.6941198 L8.26203728,0.166622501 C6.67497277,-0.230208365 5.6390578,0.206372251 5.6390578,0.206372251 L5.56696854,1.674617 C5.09325681,1.79368021 4.64253613,1.96939147 4.2258912,2.20128568 L3.15852051,1.23378856 C3.15852051,1.23378856 2.11738101,1.65765669 1.27568848,3.06041668 C1.54322491,3.36408988 2.06960056,3.71276836 2.10118031,4.1592554 C2.10896285,4.26948189 1.59457107,5.57086761 1.57238618,5.57198383 L0.206317893,5.6390189 C0.206317893,5.6390189 -0.230139964,6.67485335 0.166568028,8.26199077 L1.5204199,8.3477845 C1.64827369,8.88611145 1.85345679,9.39315331 2.12511704,9.85815096 L1.23375268,10.8414612 C1.23375268,10.8414612 1.65762204,11.8825976 3.06038609,12.7242877 L4.0762866,11.8295153 C4.53654166,12.105035 5.03898057,12.3149459 5.57301473,12.448582 L5.6390578,13.7936552 C5.6390578,13.7936552 6.67495726,14.2301738 8.26203728,13.833405 L8.35100938,12.4295288 C8.89183389,12.2861568 9.39943532,12.0646031 9.86237242,11.7755028 L10.9395876,12.7243032 C12.3424136,11.8826752 12.766283,10.8414767 12.766283,10.8414767 L11.7850163,9.75896262 C12.0267712,9.32456793 12.2082036,8.85346209 12.326895,8.35744288 L13.8333901,8.26200628 Z M7.00001008,10.2609815 C5.19904974,10.2609815 3.73907938,8.80101536 3.73907938,6.99999824 C3.73907938,5.19904312 5.19904974,3.73907699 7.00001008,3.73907699 C8.80097041,3.73907699 10.2610028,5.19904312 10.2610028,6.99999824 C10.2610028,8.80103087 8.80097041,10.2609815 7.00001008,10.2609815 Z" id="形状"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/toggle-panel.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>全屏</title>
+    <g id="评卷员" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="B-评卷员-2" transform="translate(-1644.000000, -844.000000)" fill-rule="nonzero">
+            <g id="编组" transform="translate(1644.000000, 844.000000)">
+                <path d="M12.2564309,15.1227427 L3.84025841,15.1227427 C2.20915205,15.1227427 0.882827165,13.8016226 0.882827165,12.176917 L0.882827165,3.79377126 C0.882827165,2.16906569 2.20915205,0.847945564 3.84025841,0.847945564 L12.2564309,0.847945564 C13.8875372,0.847945564 15.2138646,2.16906569 15.2138646,3.79377126 L15.2138646,12.176917 C15.2159641,13.8016226 13.8875372,15.1227427 12.2564309,15.1227427 L12.2564309,15.1227427 Z M3.84025841,2.8599843 C3.32318088,2.8599843 2.90279264,3.27872285 2.90279264,3.79377126 L2.90279264,12.176917 C2.90279264,12.6919655 3.32318088,13.110704 3.84025841,13.110704 L12.2564309,13.110704 C12.7735084,13.110704 13.1938967,12.6919655 13.1938967,12.176917 L13.1938967,3.79377126 C13.1938967,3.27872285 12.7735084,2.8599843 12.2564309,2.8599843 L3.84025841,2.8599843 Z" id="形状" fill="#DDDDDD"></path>
+                <path d="M1.23385134,16 L6.11245682,16 C6.7955877,16 7.34839823,15.4493588 7.34839823,14.7689087 C7.34839823,14.0905522 6.7955877,13.5378173 6.11245682,13.5378173 L4.21650588,13.5378173 L6.94272359,10.8222978 C7.42406812,10.3428422 7.42406812,9.56189479 6.94272359,9.08243915 C6.46137906,8.60298351 5.677355,8.60298351 5.19601047,9.08243915 L2.46979276,11.8000523 L2.46979276,9.91154148 C2.46979276,9.57236326 2.33106464,9.26459042 2.10825887,9.04265899 C1.88545311,8.82072756 1.57646775,8.68254384 1.23595328,8.68254384 C0.5528224,8.68254384 5.91818474e-06,9.23318503 5.91818474e-06,9.91363517 L5.91818474e-06,14.773096 C-0.00209007121,15.4493588 0.5528224,16 1.23385134,16 Z M14.7661487,0 L9.88754318,0 C9.2044123,0 8.65160177,0.550641193 8.65160177,1.23109134 C8.65160177,1.90944779 9.2044123,2.46218267 9.88754318,2.46218267 L11.7834941,2.46218267 L9.05727641,5.17560848 C8.57593188,5.65506412 8.57593188,6.43601152 9.05727641,6.91546716 C9.53862094,7.3949228 10.322645,7.3949228 10.8039895,6.91546716 L13.5302072,4.19994766 L13.5302072,6.08845852 C13.5302072,6.42763674 13.6689354,6.73540958 13.8917411,6.95734101 C14.1145469,7.17927244 14.4235322,7.31745616 14.7640467,7.31745616 C15.4471776,7.31745616 15.9999941,6.76681497 15.9999941,6.08636483 L15.9999941,1.23109134 C16.0020901,0.550641193 15.4471776,0 14.7661487,0 L14.7661487,0 Z" id="形状" fill="#666666"></path>
+            </g>
+        </g>
+    </g>
+</svg>

二進制
src/assets/images/AB培训卷.png


二進制
src/assets/images/CET成绩导出.png


二進制
src/assets/images/RF卷.png


二進制
src/assets/images/background.png


二進制
src/assets/images/empty.png


二進制
src/assets/images/nav-page-card.png


二進制
src/assets/images/专家卷挑选.png


二進制
src/assets/images/个人统计.png


二進制
src/assets/images/主观题校验.png


二進制
src/assets/images/仲裁卷.png


二進制
src/assets/images/导入培训卷RF卷.png


二進制
src/assets/images/强制考核分发.png


二進制
src/assets/images/强制考核卷.png


二進制
src/assets/images/抽查情况统计.png


二進制
src/assets/images/查看培训记录.png


二進制
src/assets/images/查看样卷.png


二進制
src/assets/images/标准卷.png


二進制
src/assets/images/正常评卷.png


二進制
src/assets/images/科目管理.png


二進制
src/assets/images/科目进度收尾.png


二進制
src/assets/images/考试批次管理.png


二進制
src/assets/images/自定义查询.png


二進制
src/assets/images/自查一致性分析.png


二進制
src/assets/images/评分标准.png


二進制
src/assets/images/评卷数据导入.png


二進制
src/assets/images/重评卷.png


二進制
src/assets/images/问题卷.png


二進制
src/assets/images/雷同卷.png


二進制
src/assets/mock/SAMPA-1.jpg


+ 109 - 0
src/assets/styles/app.scss

@@ -0,0 +1,109 @@
+@use './helper.scss' as *;
+@use './element/custom.scss' as *;
+@font-face {
+  font-family: Emoji;
+  src: local('Apple Color Emojiji'), local('Segoe UI Emoji'), local('Segoe UI Symbol'), local('Noto Color Emoji');
+  unicode-range: U+1F000-1F644, U+203C-3299;
+}
+
+.dou-yu {
+  font-family: 'DouYu'
+}
+
+html {
+  line-height: normal;
+  -webkit-text-size-adjust: 100%;
+  height: 100%;
+  user-select: none;
+}
+
+main {
+  display: block;
+}
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+body {
+  font-family: HanSan, system-ui, —apple-system, Segoe UI, Rototo, Emoji, Helvetica, Arial, sans-serif;
+  height: 100%;
+  background-color: $BaseBgColor;
+  font-size: $BaseFont;
+  font-weight: bold;
+}
+
+input {
+  font-family: HanSan, system-ui, —apple-system, Segoe UI, Rototo, Emoji, Helvetica, Arial, sans-serif;
+}
+
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+ul {
+  list-style: none;
+}
+
+button {
+  font-family: inherit;
+}
+
+a,
+image {
+  -webkit-user-drag: none;
+}
+
+a {
+  text-decoration: none;
+}
+
+// 整个滚动条。
+::-webkit-scrollbar {
+  width: $ScrollBarThumbWidth;
+  height: $ScrollBarThumbWidth;
+  // border: $OnePixelLine;
+}
+// 滚动条上的滚动滑块。
+::-webkit-scrollbar-thumb {
+  background-color: $ScrollBarThumbColor;
+  border-radius: $ScrollBarThumbRadius;
+  &:hover {
+    background-color: $ScrollBarThumbHoverColor;
+  }
+}
+//滚动条没有滑块的轨道部分。
+::-webkit-scrollbar-track-piece {
+  border-radius: $ScrollBarThumbRadius;
+}
+//当同时有垂直滚动条和水平滚动条时交汇的部分。通常是浏览器窗口的右下角。
+::-webkit-scrollbar-corner {
+  // background-color: blue;
+}
+//出现在某些元素底角的可拖动调整大小的滑块。
+::-webkit-resizer {
+}
+
+.drag {
+  -webkit-app-region: drag;
+}
+
+.c-icon {
+  color: $NormalIconColor;
+  &:hover {
+    color: $ActiveIconColor;
+  }
+}
+
+#app {
+  height: 100%;
+}
+
+
+img {
+  pointer-events: none
+}

+ 260 - 0
src/assets/styles/common-var.scss

@@ -0,0 +1,260 @@
+/** element-plus transition */
+$ep-transition-duration: (
+  '': 0.3s,
+  'fast': 0.2s,
+);
+
+$cst-gap-space: (
+  'extra-mini': 2px,
+  'medium-mini': 4px,
+  'mini': 6px,
+  'extra-small': 10px,
+  'small': 12px,
+  'extra-base': 16px,
+  'medium-base': 18px,
+  'base': 20px,
+  'large': 30px,
+  'super-large': 60px
+);
+
+/** element-plus font-size */
+$ep-font-size: (
+  'extra-large': 20px,
+  'large': 18px,
+  'medium': 16px,
+  'base': 14px,
+  'small': 13px,
+  'extra-small': 12px,
+);
+
+/** element-plus colors */
+$ep-colors: (
+  'primary': (
+    'base': #0091ff,
+    'light': #00C4FF,
+    'plus': #0064FF,
+  ),
+  'white': #ffffff,
+  'black': #000000,
+  'tip': (
+    'base': #E02020,
+  ),
+  'success': (
+    'base': #67c23a,
+  ),
+  'warning': (
+    'base': #e6a23c,
+  ),
+  'danger': (
+    'base': #f56c6c,
+  ),
+  'error': (
+    'base': #f56c6c,
+  ),
+  'info': (
+    'base': #909399,
+  ),
+);
+
+/** element-plus fill colors */
+$ep-fill-color: (
+  '': #f0f2f5,
+  'light': #f5f7fa,
+  'lighter': #fafafa,
+  'extra-light': #fafcff,
+  'f8': #f8f8f8,
+  'light-gray': #eee,
+  'dark': #ebedf0,
+  'darker': #e6e8eb,
+  'blank': #ffffff,
+);
+
+/** element-plus border colors */
+$ep-border-color: (
+  '': #dcdfe6,
+  'light': #e4e7ed,
+  'lighter': #eee,
+  'extra-light': #f2f6fc,
+  'dark': #d4d7de,
+  'darker': #cdd0d6,
+);
+
+/** element-plus text colors */
+$ep-text-color: (
+  'primary': #333,
+  'primary-plus': #444,
+  'regular': #666,
+  'secondary': #888,
+  'placeholder': #999,
+  'disabled': #c0c4cc,
+);
+
+
+/** element-plus button */
+$ep-button: (
+  'bg-color': map-get($ep-fill-color, 'lighter'),
+  'border-color':  map-get($ep-border-color, 'light'),
+  'text-color':  map-get($ep-text-color, 'regular'),
+);
+
+
+$cst-button-colors: (
+  'custom-1': #00ba97,
+  'special': #e5f4ff,
+);
+
+/** element-plus background colors */
+$ep-bg-color: (
+  '': #ffffff,
+  'page': #f2f3f5,
+  'overlay': #ffffff,
+);
+
+/** element-plus border radius */
+$ep-border-radius: (
+  'base': 6px,
+  'small': 4px,
+  'round': 10px,
+  'circle': 100%,
+);
+
+/** element-plus card */
+$ep-card: (
+  'border-radius': map-get($ep-border-radius, 'base'),
+  'padding': map-get($cst-gap-space, 'base'),
+  'border-color': transparent,
+  'bg-color': map-get($ep-fill-color, 'blank'),
+);
+
+/** element-plus menu */
+$ep-menu: (
+  'item-height': 38px,
+  'base-level-padding': 20px,
+  'level-padding': 40px,
+  'hover-bg-color': 'none',
+  'icon-width': 14px,
+  'hover-text-color': map-get($ep-text-color, 'regular'),
+);
+
+/** element-plus popper */
+$ep-popper: (
+  'border-radius': map-get($ep-border-radius, 'small'),
+);
+
+/** element-plus form */
+$ep-form: (
+  'label-font-size': map-get($ep-font-size, 'extra-small'),
+);
+
+/** element-plus component size */
+$ep-common-component-size: (
+  'large': 54px,
+  'default': 40px,
+  'small': 32px,
+);
+
+/** element-plus input font size */
+$ep-input-font-size: (
+  'large': 15px,
+  'default': 12px,
+  'small': 12px,
+);
+
+/** element-plus box-shadow */
+$ep-box-shadow: (
+  '': (
+    0px 12px 32px 4px rgba(0, 0, 0, 0.04),
+    0px 8px 20px rgba(0, 0, 0, 0.08),
+  ),
+  'light': (
+    0px 0px 12px rgba(0, 0, 0, 0.12),
+  ),
+  'lighter': (
+    0px 0px 6px rgba(0, 0, 0, 0.12),
+  ),
+  'dark': (
+    0px 16px 48px 16px rgba(0, 0, 0, 0.08),
+    0px 12px 32px rgba(0, 0, 0, 0.12),
+    0px 8px 16px -8px rgba(0, 0, 0, 0.16),
+  ),
+);
+
+/** element-plus table */
+$ep-table: (
+  'border-color': map-get($ep-border-color, 'lighter'),
+  'border': 1px solid map-get($ep-border-color, 'lighter'),
+  'text-color': map-get($ep-text-color, 'regular'),
+  'header-text-color': map-get($ep-text-color, 'primary-plus'),
+  'row-hover-bg-color': map-get($ep-fill-color, 'light'),
+  'current-row-bg-color': var(--el-color-primary-light-9),
+  'header-bg-color': map-get($ep-bg-color, ''),
+  'fixed-box-shadow': map-get($ep-box-shadow, 'light'),
+  'bg-color': map-get($ep-fill-color, 'blank'),
+  'tr-bg-color': map-get($ep-fill-color, 'blank'),
+  'expanded-cell-bg-color': map-get($ep-fill-color, 'blank'),
+  'fixed-left-column': inset 10px 0 10px -10px rgb(0 0 0 / 15%),
+  'fixed-right-column': inset -10px 0 10px -10px rgb(0 0 0 / 15%),
+);
+
+/** element-plus table font-size*/
+$ep-table-font-size: (
+  'large': map-get($ep-font-size, 'base'),
+  'default': map-get($ep-font-size, 'small'),
+  'small': map-get($ep-font-size, 'extra-small'),
+);
+
+/** element-plus table padding*/
+$ep-table-padding: (
+  'large': 14px 0,
+  'default': 12px 0,
+  'small': 10px 0,
+);
+
+/** element-plus table cell padding*/
+$ep-table-cell-padding: (
+  'large': 0 16px,
+  'default': 0 12px,
+  'small': 0 8px,
+);
+
+/** element-plus pagination */
+$ep-pagination: (
+  'font-size': 14px,
+  'bg-color': map-get($ep-fill-color, 'blank'),
+  'text-color': map-get($ep-text-color, 'primary'),
+  'border-radius': 3px,
+  'button-color': map-get($ep-text-color, 'primary'),
+  'button-width': 32px,
+  'button-height': 32px,
+  'button-disabled-color': map-get($ep-text-color, 'placeholder'),
+  'button-disabled-bg-color': map-get($ep-fill-color, 'blank'),
+  'button-bg-color': map-get($ep-fill-color, ''),
+  'hover-color': map-get($ep-colors, 'primary', 'base'),
+  'height-extra-small': 24px,
+  'line-height-extra-small': 24px,
+);
+
+/** element-plus dialog */
+$ep-dialog: (
+  'width': fit-content,
+  'margin-top': 15vh,
+  'bg-color': map-get($ep-fill-color, 'blank'),
+  'box-shadow': map-get($ep-box-shadow, ''),
+  'title-font-size': map-get($ep-font-size, 'base'),
+  'content-font-size': map-get($ep-font-size, 'extra-small'),
+  'font-line-height': normal,
+  'padding-primary': map-get($cst-gap-space, 'base'),
+  'border-radius': map-get($ep-border-radius, 'base'),
+  /**  custom */ //
+  'header-height': 44px,
+  'header-bg-color': map-get($ep-fill-color, 'f8'),
+  'header-font-size': map-get($ep-font-size, 'base'),
+  'header-font-color': map-get($ep-text-color, 'primary'),
+);
+
+$ep-dialog-body-padding:(
+  'small': 16px,
+  'base': 20px,
+  'medium': 30px,
+  'large': 40px
+);

+ 174 - 0
src/assets/styles/element/custom.scss

@@ -0,0 +1,174 @@
+// @use 'sass:color';
+@use '../common-var.scss' as *;
+
+@function darken($color, $weight) {
+  @return mix(#141414, $color, $weight);
+}
+
+@function tint($color, $weight) {
+  @return mix(#fff, $color, $weight);
+}
+
+@each $type in map-keys($cst-button-colors) {
+  $color: map-get($cst-button-colors, $type);
+  [#{$type}],
+  .el-button[#{$type}] {
+    --el-button-bg-color: #{$color};
+    --el-button-text-color: var(--el-color-white);
+    --el-button-border-color: #{$color};
+    --el-button-hover-bg-color: #{tint($color, 30%)};
+    --el-button-hover-text-color: var(--el-color-white);
+    --el-button-hover-border-color: #{tint($color, 30%)};
+    --el-button-active-bg-color: #{darken($color, 20%)};
+    --el-button-active-border-color: #{darken($color, 20%)};
+    &.is-disabled {
+      --el-button-disabled-bg-color: #{tint($color, 50%)};
+      --el-button-disabled-text-color: var(--el-color-white);
+      --el-button-disabled-border-color: #{tint($color, 50%)};
+    }
+    &.is-plain {
+      --el-button-bg-color: #{tint($color, 90%)};
+      --el-button-text-color: #{$color};
+      --el-button-border-color: #{tint($color, 50%)};
+      --el-button-hover-bg-color: #{$color};
+      --el-button-hover-text-color: var(--el-color-white);
+      --el-button-hover-border-color: #{$color};
+      --el-button-active-bg-color: #{darken($color, 20%)};
+      --el-button-active-border-color: #{darken($color, 20%)};
+      --el-button-active-text-color: var(--el-color-white);
+      &.is-disabled {
+        --el-button-disabled-bg-color: #{tint($color, 90%)};
+        --el-button-disabled-text-color: #{tint($color, 50%)};
+        --el-button-disabled-border-color: #{tint($color, 80%)};
+      }
+    }
+    &.is-link {
+      --el-button-text-color: #{$color};
+      --el-button-hover-text-color: #{$color};
+      --el-button-hover-link-text-color: #{darken($color, 20%)};
+      --el-button-active-color: #{darken($color, 30%)};
+    }
+    &[special] {
+      --el-button-text-color: var(--el-color-primary);
+      --el-button-hover-text-color: var(--el-color-primary);
+      --el-button-hover-bg-color: var(--el-color-primary-light-8);
+      --el-button-active-bg-color: var(--el-color-primary-light-9);
+    }
+  }
+}
+
+button.el-button {
+  &:not(.is-plain, .is-round, .is-circle) {
+    border: none;
+  }
+  &:not(.is-link) {
+    min-width: 64px;
+  }
+}
+
+/** 显示table的Card */
+.el-card[table] {
+  border: none;
+  &:not([shadow]) {
+    box-shadow: none;
+  }
+  /** table上方无操作按钮区域 */
+  &[less] {
+    .el-card__body {
+      padding-top: map-get($cst-gap-space, 'medium-mini');
+    }
+  }
+}
+
+/** 自定义pagination 样式 */
+.el-pagination {
+  margin-top: map-get($cst-gap-space, 'base');
+}
+
+/** 靠右对齐 */
+.el-pagination[right] {
+  justify-content: flex-end;
+}
+
+.el-dialog[custom] {
+  .el-dialog__header {
+    height: var(--el-dialog-header-height);
+    line-height: var(--el-dialog-header-height);
+    background-color: var(--el-dialog-header-bg-color);
+    border-radius: var(--el-dialog-border-radius) var(--el-dialog-border-radius) 0 0;
+    font-size: var(--el-dialog-header-font-size);
+    color: var(--el-dialog-header-font-color);
+    padding: 0 var(--el-dialog-padding-primary);
+    margin: 0;
+    overflow: hidden;
+    .el-dialog__headerbtn {
+      width: var(--el-dialog-header-height);
+      height: var(--el-dialog-header-height);
+      top: 0;
+    }
+  }
+
+  .el-dialog__body {
+    max-width: 100%;
+    overflow-x: auto;
+  }
+  &[unless] {
+    .el-dialog__header {
+      display: none;
+    }
+  }
+
+  &[small] .el-dialog__body {
+    padding: map-get($ep-dialog-body-padding, 'small');
+  }
+  .el-dialog__body,
+  &[base] .el-dialog__body {
+    padding: map-get($ep-dialog-body-padding, 'base');
+  }
+  &[medium] .el-dialog__body {
+    padding: map-get($ep-dialog-body-padding, 'medium');
+  }
+  &[large] .el-dialog__body {
+    padding: map-get($ep-dialog-body-padding, 'large');
+  }
+}
+
+.el-menu {
+  border-right: none;
+}
+
+.el-input-number {
+  .el-input-number__increase,
+  .el-input-number__decrease {
+    top: 3px;
+  }
+}
+
+.el-table--border::after,
+.el-table--border::before,
+.el-table--border .el-table__inner-wrapper::after,
+.el-table__inner-wrapper::before {
+  display: none;
+}
+
+.el-table__empty-block {
+  .el-table__empty-text {
+    line-height: 40px;
+  }
+}
+
+.no-mask,
+.no-mask .el-overlay-dialog {
+  pointer-events: none;
+  .el-dialog {
+    pointer-events: all;
+    .el-dialog__body {
+      max-height: calc(100vh - var(--el-dialog-header-height));
+      overflow: auto;
+    }
+  }
+}
+
+.el-popover.el-popper.color-picker-popover {
+  background-color: map-get($ep-fill-color, 'light');
+}

+ 44 - 5
src/assets/styles/element/index.scss

@@ -1,6 +1,45 @@
-@forward "element-plus/theme-chalk/src/common/var.scss" with (
-  $colors: (),
-  $button-padding-horizontal: (
-    "default": 80px,
-  )
+@use '../common-var.scss' as *;
+
+/** element - built-in */
+$form-item-margin-bottom: (
+  'large': 22px,
+  'default': 18px,
+  'small': 18px,
+);
+
+$form-item-line-height: (
+  'large': map-get($ep-common-component-size, 'large'),
+  'default': map-get($ep-common-component-size, 'default'),
+  'small': map-get($ep-common-component-size, 'small'),
+);
+
+$form-item-label-top-line-height: (
+  'large': 22px,
+  'default': 22px,
+  'small': 20px,
+);
+
+@forward 'element-plus/theme-chalk/src/common/var.scss' with (
+  $transition-duration: $ep-transition-duration,
+  $fill-color: $ep-fill-color,
+  $font-size: $ep-font-size,
+  $colors: $ep-colors,
+  $border-radius: $ep-border-radius,
+  $menu: $ep-menu,
+  $text-color: $ep-text-color,
+  $popper: $ep-popper,
+  $form: $ep-form,
+  $input-font-size: $ep-input-font-size,
+  $card: $ep-card,
+  $common-component-size: $ep-common-component-size,
+  $bg-color: $ep-bg-color,
+  $border-color: $ep-border-color,
+  $table: $ep-table,
+  $table-font-size: $ep-table-font-size,
+  $table-padding: $ep-table-padding,
+  $table-cell-padding: $ep-table-cell-padding,
+  $box-shadow: $ep-box-shadow,
+  $pagination: $ep-pagination,
+  $dialog: $ep-dialog,
+  $button: $ep-button
 );

+ 224 - 0
src/assets/styles/helper.scss

@@ -0,0 +1,224 @@
+@use './common-var.scss' as *;
+
+@function str-replace($string, $search, $replace: '') {
+  $index: str-index($string, $search);
+
+  @if $index {
+    @return str-slice($string, 1, $index - 1) + $replace +
+      str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+  }
+
+  @return $string;
+}
+
+/** display start */
+$display: inline, block, inline-block, flex, inline-flex, grid, inline-grid;
+@each $type in $display {
+  .#{$type} {
+    display: $type;
+  }
+}
+
+.hidden {
+  display: none;
+}
+/** display end */
+
+/** flex start*/
+$itemsTypes: flex-start, center, flex-end, baseline, initial;
+$justifyTypes: flex-start, center, flex-end, baseline, initial, space-between, space-around, space-evenly;
+$direction: row, row-reverse, column, column-reverse, initial;
+
+@each $type in $itemsTypes {
+  .items-#{str-replace($type,'flex-','')} {
+    align-items: $type;
+  }
+}
+@each $type in $justifyTypes {
+  .justify-#{str-replace(str-replace($type,'flex-',''),'space-','')} {
+    justify-content: $type;
+  }
+}
+@each $type in $direction {
+  .direction-#{str-replace($type,'erse','')} {
+    flex-direction: $type;
+  }
+}
+
+.flex-wrap {
+  flex-wrap: wrap;
+}
+.flex-1 {
+  flex: 1 1 0%;
+}
+.flex-auto {
+  flex: 1 1 auto;
+}
+.flex-initial {
+  flex: 0 1 auto;
+}
+.flex-none {
+  flex: none;
+}
+
+/** flex end*/
+
+/** position start */
+$position: relative, absolute, fixed, sticky, static, initial;
+@each $type in $position {
+  .#{$type} {
+    position: $type;
+  }
+}
+/** position end */
+
+/** text-align start */
+$textAlignType: left, center, right, justify, start, end;
+@each $type in $textAlignType {
+  .text-#{$type} {
+    text-align: $type;
+  }
+}
+/** text-align end */
+
+/** combination start */
+.truncate {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+/** combination end */
+
+/** margin/padding start */
+$gap-type: 'margin', 'padding';
+$direction: 'left', 'top', 'right', 'bottom';
+
+@each $type, $size
+  in map-merge(
+    $cst-gap-space,
+    (
+      'auto': auto,
+      'unset': unset
+    )
+  )
+{
+  @each $t in $gap-type {
+    .#{str-slice($t,0,1)}-#{$type} {
+      #{$t}: $size;
+    }
+    @each $d in $direction {
+      .#{str-slice($t,0,1)}-#{str-slice($d,0,1)}-#{$type} {
+        #{$t}-#{$d}: $size;
+      }
+    }
+  }
+}
+/** margin/padding end */
+
+
+/** radius start */
+@each $type, $size in $ep-border-radius {
+  .radius-#{$type} {
+      border-radius: $size;
+  }
+  .radius-lt-#{$type} {
+      border-radius: $size 0 0 0;
+  }
+  .radius-rt-#{$type} {
+      border-radius: 0 $size 0 0;
+  }
+  .radius-rb-#{$type} {
+      border-radius: 0 0 $size 0;
+  }
+  .radius-lb-#{$type} {
+      border-radius: 0 0 0 $size;
+  }
+}
+/** firadiusll end */
+
+/** fill start */
+@each $type,$color in $ep-fill-color {
+  @if($type != ''){
+    .fill-#{$type} {
+      background-color: $color;
+    }
+  } @else {
+    .fill {
+      background-color: $color;
+    }
+  }
+}
+/** fill end */
+
+/** shadow start */
+@each $type, $shadow in $ep-box-shadow {
+  @if($type != ''){
+    .shadow-#{$type} {
+      box-shadow:  $shadow;
+    }
+  } @else {
+    .shadow {
+      box-shadow:  $shadow;
+    }
+  }
+}
+/** shadow end */
+
+.full {
+  width: 100%;
+  height: 100%;
+}
+
+.full-w {
+  width: 100%;
+}
+
+.full-h {
+  height: 100%;
+}
+
+.fit-w-available {
+  width: -webkit-fill-available;
+}
+.fit-h-available {
+  height: -webkit-fill-available;
+}
+
+.scroll-auto {
+  overflow: auto;
+}
+
+.scroll-y-auto {
+  overflow-y: auto;
+}
+
+.scroll-x-auto {
+  overflow-x: auto;
+}
+
+.full-scroll-auto {
+  @extend .full;
+  @extend .scroll-auto;
+}
+
+.full-scroll-y-auto {
+  @extend .full-h;
+  @extend .scroll-y-auto;
+}
+
+.full-scroll-x-auto {
+  @extend .full-w;
+  @extend .scroll-x-auto;
+}
+
+.overflow-hidden {
+  overflow: hidden;
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.not-allow {
+  cursor: not-allowed;
+}

+ 0 - 44
src/assets/styles/reset.scss

@@ -1,44 +0,0 @@
-@use './helper.scss' as *;
-
-@font-face {
-  font-family: Emoji;
-  src: local('Apple Color Emojiji'), local('Segoe UI Emoji'), local('Segoe UI Symbol'), local('Noto Color Emoji');
-  unicode-range: U+1F000-1F644, U+203C-3299;
-}
-
-html {
-  line-height: 1.15;
-  -webkit-text-size-adjust: 100%;
-}
-
-main {
-  display: block;
-}
-
-hr {
-  box-sizing: content-box;
-  height: 0;
-  overflow: visible;
-}
-
-body {
-  font-family: system-ui, —apple-system, Segoe UI, Rototo, Emoji, Helvetica, Arial, sans-serif;
-}
-
-.font-serif {
-  font-family: Georgia, Cambria, 'Times New Roman', Times, serif;
-}
-
-.font-mono {
-  font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
-}
-
-* {
-  margin: 0;
-  padding: 0;
-  box-sizing: border-box;
-}
-
-ul {
-  list-style: none;
-}

+ 0 - 0
src/assets/styles/theme.scss


+ 80 - 0
src/assets/styles/var.scss

@@ -0,0 +1,80 @@
+// $color-white: map-get($colors, 'white') !default;
+// $color-black: map-get($colors, 'black') !default;
+// $color-primary: map-get($colors, 'primary', 'base') !default;
+// $color-success: map-get($colors, 'success', 'base') !default;
+// $color-warning: map-get($colors, 'warning', 'base') !default;
+// $color-danger: map-get($colors, 'danger', 'base') !default;
+// $color-error: map-get($colors, 'error', 'base') !default;
+// $color-info: map-get($colors, 'info', 'base') !default;
+
+// @use '@style/element/index.scss' as *;
+@use './common-var.scss' as *;
+
+/** base */
+$color--primary: map-get($ep-colors, 'primary', 'base');
+$color--primary-plus: map-get($ep-colors, 'primary', 'plus');
+$color--primary-light: map-get($ep-colors, 'primary', 'light');
+$color--white:  map-get($ep-colors, 'white');
+
+$BaseBgColor: #f2f2f2;
+$LineColor: #eee;
+$OnePixelLine: 1px solid $LineColor;
+$ShadowColor: rgba(0, 0, 0, 0.05);
+
+/** space */
+$ExtraMiniGapSpace: map-get($cst-gap-space, 'extra-mini');
+$MiniGapSpace: map-get($cst-gap-space, 'mini');
+$ExtraSmallGapSpace: map-get($cst-gap-space, 'extra-small');
+$SmallGapSpace: map-get($cst-gap-space, 'small');
+$ExtraBaseGapSpace: map-get($cst-gap-space, 'extra-base');
+$MediumBaseGapSpace: map-get($cst-gap-space, 'medium-base');
+$BaseGapSpace: map-get($cst-gap-space, 'base');
+$LargeGapSpace: map-get($cst-gap-space, 'large');
+
+/** size */
+$BaseFont: map-get($ep-font-size, 'base');
+$SmallFont: map-get($ep-font-size, 'extra-small');
+$MediumFont: map-get($ep-font-size, 'medium');
+
+/** color */
+$NormalColor: map-get($ep-text-color, 'primary');
+$NormalIconColor: map-get($ep-text-color, 'secondary');
+$ActiveIconColor: $NormalColor;
+$DangerColor: map-get($ep-colors, 'danger', 'base');
+$RegularFontColor: map-get($ep-text-color, 'regular');
+$PrimaryPlusFontColor: map-get($ep-text-color, 'primary-plus');
+
+/** common */
+$BlockTitleColor: map-get($ep-text-color, 'primary');
+
+/** layout */
+$MainLayoutHeaderHeight: 56px;
+$MainLayoutHeaderBg: $color--white;
+$MainLayoutHeaderLogoFontSize: map-get($ep-font-size, 'medium');
+$MainLayoutHeaderLogoFontColor: $color--primary-plus;
+$LayoutLeftMenuBg: $color--white;
+$LayoutLeftMenuWidth: 220px;
+$LayoutLeftMenuCollapseWidth: calc(map-get($ep-menu, 'icon-width') + map-get($ep-menu, 'base-level-padding') * 2);
+$LayoutLeftMenuTransition: map-get($ep-transition-duration, '') width ease-in-out;
+$LayoutLeftMenuRadius: map-get($ep-border-radius, 'round');
+$LayoutLeftSubMenuColor: map-get($ep-text-color, 'regular');
+$LayoutLeftMenuItemColor: map-get($ep-text-color, 'secondary');
+$LayoutLeftMenuItemHoverColor: map-get($ep-text-color, 'regular');
+$LayoutLeftMenuItemActiveColor: map-get($ep-text-color, 'primary');
+
+/** scroll bar */
+$ScrollBarThumbWidth: 8px;
+$ScrollBarThumbRadius: 4px;
+$ScrollBarThumbColor: rgba(0, 0, 0, 0.1);
+$ScrollBarThumbHoverColor: rgba(0, 0, 0, 0.15);
+
+/** form */
+$FormItemDescriptionColor: map-get($ep-text-color, 'regular');
+
+/** login */
+$LoginModalBg: $color--white;
+$LoginModalHeaderBg: linear-gradient(270deg, $color--primary-light 0%, $color--primary 100%);
+$LoginModalHeaderFontSize: map-get($ep-font-size, 'extra-large');
+$LoginModalHeaderFontColor: $color--white;
+$LoginModalHeaderHeight: 80px;
+$LoginModalRadius: map-get($ep-border-radius, 'round');

部分文件因文件數量過多而無法顯示