Michael Wang 3 anni fa
parent
commit
3a56031b8f

+ 72 - 0
.eslintrc.js

@@ -0,0 +1,72 @@
+/**
+ * @type {import("eslint").Linter.Config}
+ */
+module.exports = {
+  root: true,
+  env: {
+    node: true,
+    browser: true,
+    "vue/setup-compiler-macros": true,
+  },
+  parser: "@typescript-eslint/parser",
+  parserOptions: {
+    ecmaVersion: "2021",
+    sourceType: "module",
+    ecmaFeatures: {
+      jsx: true,
+    },
+    tsconfigRootDir: "./",
+    project: ["tsconfig.json"],
+    extraFileExtensions: [".vue"],
+  },
+  plugins: ["@typescript-eslint"],
+  extends: [
+    "eslint:recommended",
+    "plugin:@typescript-eslint/recommended",
+    "plugin:@typescript-eslint/recommended-requiring-type-checking",
+    "plugin:vue/vue3-recommended",
+    "prettier",
+  ],
+  rules: {
+    // 和 $ref let 冲突, fixed vue@3.2.26
+    // "prefer-const": "off",
+    "@typescript-eslint/no-explicit-any": "off",
+    "@typescript-eslint/ban-ts-comment": "off",
+    "@typescript-eslint/no-unsafe-assignment": "off",
+    "@typescript-eslint/no-unsafe-member-access": "off",
+    "@typescript-eslint/restrict-plus-operands": "off",
+    "@typescript-eslint/restrict-template-expressions": "off",
+    "@typescript-eslint/no-non-null-assertion": "off",
+    // 一处使用hypen和一处不使用hypen,让字符搜索变得困难
+    "vue/attribute-hyphenation": ["error", "never"],
+    "vue/v-on-event-hyphenation": ["error", "never", { autofix: true }],
+    "vue/no-v-html": "off",
+  },
+  ignorePatterns: [".eslintrc.js", "vite.config.ts", "src/test"],
+  overrides: [
+    {
+      files: ["src/**/**.vue"],
+      parser: "vue-eslint-parser",
+      parserOptions: {
+        parser: {
+          // Script parser for `<script>`
+          js: "espree",
+
+          // Script parser for `<script lang="ts">`
+          ts: "@typescript-eslint/parser",
+
+          // Script parser for vue directives (e.g. `v-if=` or `:attribute=`)
+          // and vue interpolations (e.g. `{{variable}}`).
+          // If not specified, the parser determined by `<script lang ="...">` is used.
+          "<template>": "espree",
+        },
+        project: ["tsconfig.json"],
+      },
+      globals: {
+        $ref: true,
+        $computed: true,
+        $$: true,
+      },
+    },
+  ],
+};

+ 0 - 460
.pnpm-debug.log

@@ -1,460 +0,0 @@
-{
-  "0 debug pnpm:scope": {
-    "selected": 1
-  },
-  "1 debug pnpm:package-manifest": {
-    "initial": {
-      "name": "exam-score-statistic-web-admin",
-      "version": "0.0.0",
-      "private": "true",
-      "scripts": {
-        "start": "vite --host 0.0.0.0 --port 3030",
-        "dev": "vite --force",
-        "build": "vue-tsc --noEmit --skipLibCheck && vite build",
-        "build-without-type-check": "vite build",
-        "typecheck": "vue-tsc --noEmit",
-        "serve": "vite preview"
-      },
-      "dependencies": {
-        "@vueuse/core": "^7.3.0",
-        "@vueuse/router": "^7.3.0",
-        "ant-design-vue": "^2.2.8",
-        "axios": "^0.24.0",
-        "axios-progress-bar": "^1.2.0",
-        "axios-retry": "^3.2.0",
-        "crypto-js": "^4.1.1",
-        "echarts": "^5.2.1",
-        "js-cookie": "^3.0.1",
-        "js-md5": "^0.7.3",
-        "lodash-es": "^4.17.21",
-        "mitt": "^3.0.0",
-        "moment": "^2.29.1",
-        "pinia": "^2.0.6",
-        "qs": "^6.10.1",
-        "tailwindcss": "^3.0.1",
-        "ua-parser-js": "^1.0.2",
-        "vue": "^3.2.26",
-        "vue-echarts": "^6.0.0",
-        "vue-router": "4.0.10"
-      },
-      "devDependencies": {
-        "@types/crypto-js": "^4.0.2",
-        "@types/js-cookie": "^3.0.0",
-        "@types/js-md5": "^0.4.3",
-        "@types/lodash-es": "^4.17.5",
-        "@types/node": "^16.11.11",
-        "@types/qs": "^6.9.7",
-        "@types/ua-parser-js": "^1.0.2",
-        "@vitejs/plugin-vue": "^2.0.0",
-        "@vue/compiler-sfc": "^3.2.26",
-        "autoprefixer": "^10.4.0",
-        "postcss": "^8.4.5",
-        "typescript": "^4.5.3",
-        "unplugin-auto-import": "^0.4.10",
-        "unplugin-vue-components": "^0.17.8",
-        "vite": "^2.7.1",
-        "vue-tsc": "^0.29.8"
-      }
-    },
-    "prefix": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin"
-  },
-  "2 debug pnpm:context": {
-    "currentLockfileExists": false,
-    "storeDir": "/Users/michael/.pnpm-store/v3",
-    "virtualStoreDir": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin/node_modules/.pnpm"
-  },
-  "3 debug pnpm:stage": {
-    "prefix": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "stage": "resolution_started"
-  },
-  "4 debug pnpm:_dependency_resolved": {
-    "resolution": "registry.npmmirror.com/@types/lodash-es/4.17.5",
-    "wanted": {
-      "dependentId": ".",
-      "name": "@types/lodash-es",
-      "rawSpec": "^4.17.5"
-    }
-  },
-  "5 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@types/lodash-es/4.17.5",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "resolved"
-  },
-  "6 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@types/lodash-es/4.17.5",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "found_in_store"
-  },
-  "7 debug pnpm:_dependency_resolved": {
-    "resolution": "registry.npmmirror.com/@vueuse/core/7.3.0",
-    "wanted": {
-      "dependentId": ".",
-      "name": "@vueuse/core",
-      "rawSpec": "^7.3.0"
-    }
-  },
-  "8 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@vueuse/core/7.3.0",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "resolved"
-  },
-  "9 debug pnpm:_dependency_resolved": {
-    "resolution": "registry.npmmirror.com/@vueuse/router/7.3.0",
-    "wanted": {
-      "dependentId": ".",
-      "name": "@vueuse/router",
-      "rawSpec": "^7.3.0"
-    }
-  },
-  "10 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@vueuse/router/7.3.0",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "resolved"
-  },
-  "11 debug pnpm:_dependency_resolved": {
-    "resolution": "registry.npmmirror.com/@types/crypto-js/4.0.2",
-    "wanted": {
-      "dependentId": ".",
-      "name": "@types/crypto-js",
-      "rawSpec": "^4.0.2"
-    }
-  },
-  "12 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@types/crypto-js/4.0.2",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "resolved"
-  },
-  "13 debug pnpm:progress": {
-    "packageId": "registry.npmmirror.com/@types/crypto-js/4.0.2",
-    "requester": "/Users/michael/Documents/qmth/exam-score-statistic-web-admin",
-    "status": "found_in_store"
-  },
-  "14 error pnpm": {
-    "code": "ERR_PNPM_NO_MATCHING_VERSION",
-    "packageMeta": {
-      "name": "@types/ua-parser-js",
-      "modified": "2021-11-18T21:19:45.000Z",
-      "dist-tags": {
-        "latest": "0.7.36",
-        "ts2.0": "0.7.33",
-        "ts2.1": "0.7.33",
-        "ts2.2": "0.7.33",
-        "ts2.3": "0.7.33",
-        "ts2.4": "0.7.33",
-        "ts2.5": "0.7.33",
-        "ts2.6": "0.7.33",
-        "ts2.7": "0.7.33",
-        "ts2.8": "0.7.33",
-        "ts2.9": "0.7.33",
-        "ts3.0": "0.7.33",
-        "ts3.1": "0.7.33",
-        "ts3.2": "0.7.33",
-        "ts3.3": "0.7.35",
-        "ts3.4": "0.7.35",
-        "ts3.5": "0.7.36",
-        "ts3.6": "0.7.36",
-        "ts3.7": "0.7.36",
-        "ts3.8": "0.7.36",
-        "ts3.9": "0.7.36",
-        "ts4.0": "0.7.36",
-        "ts4.1": "0.7.36",
-        "ts4.2": "0.7.36",
-        "ts4.3": "0.7.36",
-        "ts4.4": "0.7.36",
-        "ts4.5": "0.7.36",
-        "ts4.6": "0.7.36"
-      },
-      "versions": {
-        "0.7.36": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.36",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190",
-            "size": 3510,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.36.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1620848040444
-        },
-        "0.7.35": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.35",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "cca67a95deb9165e4b1f449471801e6489d3fe93",
-            "size": 3411,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.35.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1607505549528
-        },
-        "0.7.34": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.34",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "deb8db5c45e3dfaa8d83f20b1235a5f11cd4ce40",
-            "size": 3349,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.34.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1607203923569
-        },
-        "0.7.33": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.33",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "4a92089511574e12928a7cb6b99a01831acd1dd7",
-            "size": 3241,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.33.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1555000327325
-        },
-        "0.7.32": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.32",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "8827d451d6702307248073b5d98aa9293d02b5e5",
-            "size": 3252,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.32.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1503353135132
-        },
-        "0.7.31": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.31",
-          "dependencies": {},
-          "peerDependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "d9968f144126a1909e8fe637f235d7a54066597e",
-            "size": 3202,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.31.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1499460832986
-        },
-        "0.7.13-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.13-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "1d39db6f5cc579961c3118dddfe3e9afb22ac190",
-            "size": 2620,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.13-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1463512119458
-        },
-        "0.7.14-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.14-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "52d8d36181e3b51726817e28ba64f282d0f04f43",
-            "size": 2627,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.14-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1463697415298
-        },
-        "0.7.19-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.19-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "3ae00f34f67aa1c244eaa4f62ce35cfb43c968e0",
-            "size": 2615,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.19-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1463777448283
-        },
-        "0.7.20-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.20-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "6fbf3a6abf884d4db442b7eb7f9f1545676a09c7",
-            "size": 2614,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.20-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1464156357480
-        },
-        "0.7.21-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.21-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "3a37756ca0240b3e51b8b2c20ca39ecbc0a7d548",
-            "size": 2639,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.21-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1467406234661
-        },
-        "0.7.22-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.22-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "669a115904437d1a6e4ee87997834fe08f42076f",
-            "size": 2648,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.22-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1467418406845
-        },
-        "0.7.23-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.23-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "ab2ece6474cea0171733cf6a4f53f9216dc557c7",
-            "size": 2648,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.23-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1467430675371
-        },
-        "0.7.24-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.24-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "3538103fb92db1a8d01fe18f41b7f4e8bf2c3a90",
-            "size": 2648,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.24-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1467595858116
-        },
-        "0.7.25-alpha": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.25-alpha",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "369978a81807e682c01e9f06586c4d74b71ea9c0",
-            "size": 2650,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.25-alpha.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1468013932893
-        },
-        "0.7.26": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.26",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "3ca948c5d8cb8151b0fd61dc1721e02a63b5adc4",
-            "size": 2647,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.26.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1468513005995
-        },
-        "0.7.27": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.27",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "b45f517c6b9a81908534c29fe13664238630fab5",
-            "size": 11264,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.27.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1470154427502
-        },
-        "0.7.28": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.28",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "3f0aefe25eeed14a76e6fb03e224d9d8e3af5194",
-            "size": 2660,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.28.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1471621495617
-        },
-        "0.7.29": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.29",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "c247dabdc4e1724bf783235856c989fd1c28429c",
-            "size": 2660,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.29.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1472151800628
-        },
-        "0.7.30": {
-          "name": "@types/ua-parser-js",
-          "version": "0.7.30",
-          "dependencies": {},
-          "directories": {},
-          "dist": {
-            "shasum": "9096e5552ff02f8d018a17efac69b4dc75083f8b",
-            "size": 2673,
-            "noattachment": false,
-            "tarball": "https://registry.npmmirror.com/@types/ua-parser-js/download/@types/ua-parser-js-0.7.30.tgz"
-          },
-          "_hasShrinkwrap": false,
-          "publish_time": 1474309059981
-        }
-      },
-      "cachedAt": 1639384927715
-    },
-    "pkgsStack": [],
-    "err": {
-      "name": "pnpm",
-      "message": "No matching version found for @types/ua-parser-js@^1.0.2",
-      "code": "ERR_PNPM_NO_MATCHING_VERSION",
-      "stack": "pnpm: No matching version found for @types/ua-parser-js@^1.0.2\n    at resolveNpm (/opt/homebrew/Cellar/node/17.2.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.23.6/node_modules/pnpm/dist/pnpm.cjs:85274:15)\n    at processTicksAndRejections (node:internal/process/task_queues:96:5)\n    at async Object.resolve (/opt/homebrew/Cellar/node/17.2.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.23.6/node_modules/pnpm/dist/pnpm.cjs:85458:34)\n    at async run (/opt/homebrew/Cellar/node/17.2.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.23.6/node_modules/pnpm/dist/pnpm.cjs:71162:23)"
-    }
-  }
-}

+ 2 - 2
package.json

@@ -39,12 +39,12 @@
     "@types/js-cookie": "^3.0.0",
     "@types/js-md5": "^0.4.3",
     "@types/lodash-es": "^4.17.5",
-    "@types/node": "^16.11.11",
+    "@types/node": "^16.11.13",
     "@types/qs": "^6.9.7",
     "@types/ua-parser-js": "^0.7.36",
     "@typescript-eslint/eslint-plugin": "^5.7.0",
     "@typescript-eslint/parser": "^5.7.0",
-    "@vitejs/plugin-vue": "^2.0.0",
+    "@vitejs/plugin-vue": "^2.0.1",
     "@vue/compiler-sfc": "^3.2.26",
     "@vue/runtime-core": "^3.2.26",
     "autoprefixer": "^10.4.0",

+ 8 - 8
pnpm-lock.yaml

@@ -5,12 +5,12 @@ specifiers:
   '@types/js-cookie': ^3.0.0
   '@types/js-md5': ^0.4.3
   '@types/lodash-es': ^4.17.5
-  '@types/node': ^16.11.11
+  '@types/node': ^16.11.13
   '@types/qs': ^6.9.7
   '@types/ua-parser-js': ^0.7.36
   '@typescript-eslint/eslint-plugin': ^5.7.0
   '@typescript-eslint/parser': ^5.7.0
-  '@vitejs/plugin-vue': ^2.0.0
+  '@vitejs/plugin-vue': ^2.0.1
   '@vue/compiler-sfc': ^3.2.26
   '@vue/runtime-core': ^3.2.26
   '@vueuse/core': ^7.3.0
@@ -71,12 +71,12 @@ devDependencies:
   '@types/js-cookie': 3.0.1
   '@types/js-md5': 0.4.3
   '@types/lodash-es': 4.17.5
-  '@types/node': 16.11.12
+  '@types/node': 16.11.13
   '@types/qs': 6.9.7
   '@types/ua-parser-js': 0.7.36
   '@typescript-eslint/eslint-plugin': 5.7.0_915acdfead96f701b1277a1a723fc8d4
   '@typescript-eslint/parser': 5.7.0_eslint@8.4.1+typescript@4.5.4
-  '@vitejs/plugin-vue': 2.0.0_vite@2.7.2+vue@3.2.26
+  '@vitejs/plugin-vue': 2.0.1_vite@2.7.2+vue@3.2.26
   '@vue/compiler-sfc': 3.2.26
   '@vue/runtime-core': 3.2.26
   autoprefixer: 10.4.0_postcss@8.4.5
@@ -271,8 +271,8 @@ packages:
   /@types/lodash/4.14.178:
     resolution: {integrity: sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==, tarball: '@types/lodash/download/@types/lodash-4.14.178.tgz'}
 
-  /@types/node/16.11.12:
-    resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==, tarball: '@types/node/download/@types/node-16.11.12.tgz'}
+  /@types/node/16.11.13:
+    resolution: {integrity: sha512-eUXZzHLHoZqj1frtUetNkUetYoJ6X55UmrVnFD4DMhVeAmwLjniZhtBmsRiemQh4uq4G3vUra/Ws/hs9vEvL3Q==, tarball: '@types/node/download/@types/node-16.11.13.tgz'}
     dev: true
 
   /@types/parse-json/4.0.0:
@@ -397,8 +397,8 @@ packages:
       eslint-visitor-keys: 3.1.0
     dev: true
 
-  /@vitejs/plugin-vue/2.0.0_vite@2.7.2+vue@3.2.26:
-    resolution: {integrity: sha512-4Xn1h9OcaAf7KYrvz2oEi52fCCCLcCzyr3pDOrzYTWrs0DrzNOXt9fT5IiGb1f/uoNTdX3aAkXVGNXrGkzF/zw==, tarball: '@vitejs/plugin-vue/download/@vitejs/plugin-vue-2.0.0.tgz'}
+  /@vitejs/plugin-vue/2.0.1_vite@2.7.2+vue@3.2.26:
+    resolution: {integrity: sha512-wtdMnGVvys9K8tg+DxowU1ytTrdVveXr3LzdhaKakysgGXyrsfaeds2cDywtvujEASjWOwWL/OgWM+qoeM8Plg==, tarball: '@vitejs/plugin-vue/download/@vitejs/plugin-vue-2.0.1.tgz'}
     engines: {node: '>=12.0.0'}
     peerDependencies:
       vite: ^2.5.10

+ 5 - 1
src/api/allAnalysisPage.ts

@@ -1,4 +1,5 @@
 import { httpApp } from "@/plugins/axiosApp";
+import { SASPaperResponse } from "@/types";
 
 /** 试卷特征数分页查询 */
 export function getSasPaperList(params: {
@@ -7,7 +8,10 @@ export function getSasPaperList(params: {
   pageNo?: number;
   pageSize?: number;
 }) {
-  return httpApp.post("/api/ess/sasPaper/page", params);
+  return httpApp.post<any, { data: SASPaperResponse }>(
+    "/api/ess/sasPaper/page",
+    params
+  );
 }
 
 /** 科目成绩(总分)频率分布-科目成绩占初试总分权重 分页查询 */

+ 12 - 12
src/components/Layout.vue

@@ -4,32 +4,32 @@
       <div class="tw-py-2 tw-flex tw-justify-center">
         <img class="qm-logo-img" />
       </div>
-      <a-menu style="width: 240px" mode="inline" :open-keys="['sub1', 'sub2']">
+      <a-menu style="width: 240px" mode="inline" :openKeys="['sub1', 'sub2']">
         <a-sub-menu key="sub1">
           <template #icon> <span class="basic-icon"></span> </template>
           <template #title>基础管理</template>
           <a-menu-item v-if="store.isSuperAdmin" key="11">
-            <router-link active-class="active-route" to="/basic/rootOrg">
+            <router-link activeClass="active-route" to="/basic/rootOrg">
               顶级机构管理
             </router-link>
           </a-menu-item>
           <a-menu-item v-if="store.isGreaterThanEqualRootOrgAdmin" key="12">
-            <router-link active-class="active-route" to="/basic/subOrg">
+            <router-link activeClass="active-route" to="/basic/subOrg">
               机构管理
             </router-link>
           </a-menu-item>
           <a-menu-item v-if="store.isGreaterThanEqualRootOrgAdmin" key="13">
-            <router-link active-class="active-route" to="/basic/role">
+            <router-link activeClass="active-route" to="/basic/role">
               角色管理
             </router-link>
           </a-menu-item>
           <a-menu-item v-if="store.isGreaterThanEqualOrgAdmin" key="14">
-            <router-link active-class="active-route" to="/basic/user">
+            <router-link activeClass="active-route" to="/basic/user">
               用户管理
             </router-link>
           </a-menu-item>
           <a-menu-item key="15">
-            <router-link active-class="active-route" to="/basic/course">
+            <router-link activeClass="active-route" to="/basic/course">
               科目管理
             </router-link>
           </a-menu-item>
@@ -39,7 +39,7 @@
           <template #title>项目管理</template>
           <a-menu-item key="21">
             <router-link
-              active-class="active-route"
+              activeClass="active-route"
               to="/project/projectManagement"
             >
               项目列表
@@ -78,9 +78,9 @@
     <a-modal
       v-model:visible="visible"
       title="修改密码"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 6 }">
         <a-form-item label="新密码">
@@ -113,15 +113,15 @@ let newPasswordCopy = $ref("");
 
 async function handleOk() {
   if (newPassword.length < 6) {
-    message.error({ content: "密码长度必须至少大于6位" });
+    void message.error({ content: "密码长度必须至少大于6位" });
     return;
   }
   if (newPassword !== newPasswordCopy) {
-    message.error({ content: "两次输入的密码不一致" });
+    void message.error({ content: "两次输入的密码不一致" });
     return;
   }
   await changePassword(newPassword);
-  message.success("密码修改成功");
+  void message.success("密码修改成功");
   visible = false;
 }
 </script>

+ 22 - 21
src/features/allAnalysis/AllAnalysis2.vue

@@ -1,11 +1,11 @@
 <template>
   <div>
     <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
-      <ProjectSelect :project-id="projectId" v-model:value="projectId" />
+      <ProjectSelect v-model:value="projectId" :projectId="projectId" />
       <span class="tw-mr-4"></span>
-      <ProjectCourseSelect :project-id="projectId" v-model:value="courseId" />
+      <ProjectCourseSelect v-model:value="courseId" :projectId="projectId" />
       <span class="tw-mr-4"></span>
-      <a-button @click="search" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="search">查询</a-button>
 
       <div class="tw-float-right tw-flex tw-gap-2">
         <a-button @click="goProjectPapers(projectId)"> 试卷列表 </a-button>
@@ -23,19 +23,19 @@
       <div v-if="activeTab === '1'">
         <a-table
           style="width: 100%; overflow-x: scroll"
-          row-key="id"
+          rowKey="id"
           :columns="columns"
           :data-source="data"
           :pagination="{
-          pageSize: pageSize,
-          current: pageNo,
-          total: totalElements,
-          showTotal: (total: number) => ``,
-          onChange: (pageNoChanged: number, pageSizeChanged: number) => {
-            pageNo = pageNoChanged; 
-            pageSize = pageSizeChanged;
-          }
-        }"
+            pageSize: pageSize,
+            current: pageNo,
+            total: totalElements,
+            showTotal: () => ``,
+            onChange: (pageNoChanged, pageSizeChanged) => {
+              pageNo = pageNoChanged;
+              pageSize = pageSizeChanged;
+            },
+          }"
         >
           <template #course="{ record }">
             <a>{{ `${record.courseName}(${record.courseCode})` }}</a>
@@ -58,26 +58,27 @@
 <script setup lang="ts">
 import { useMainStore } from "@/store";
 import { goBack } from "@/utils/utils";
-import { watch, onMounted, ref, toRaw } from "vue";
+import { watch, onMounted } from "vue";
 import { useRoute } from "vue-router";
 import router from "@/router";
 import { getSasPaperList } from "@/api/allAnalysisPage";
 import EventBus from "@/plugins/eventBus";
 import ScoreRate from "./ScoreRate.vue";
 import ScoreFirstTryRate from "./ScoreFirstTryRate.vue";
+import { SASPaper } from "@/types";
 
 const store = useMainStore();
 store.currentLocation = "项目管理 / 项目列表 / 整体分析";
 
-let rootOrgId = $ref(undefined as unknown as number);
+// let rootOrgId = $ref(undefined as unknown as number);
 let courseId = $ref(undefined as undefined | number);
 const route = useRoute();
 const projectId = +route.params.projectId;
 
 let activeTab = $ref("1");
 
-let data = $ref([]);
-let pageSize = $ref(10);
+let data = $ref<SASPaper[]>([]);
+let pageSize = $ref<number>(10);
 let pageNo = $ref(1);
 let totalElements = $ref(0);
 
@@ -167,7 +168,7 @@ const columns = [
 ];
 
 onMounted(async () => {
-  rootOrgId = store.userInfo.rootOrgId;
+  // rootOrgId = store.userInfo.rootOrgId;
   await search();
   if (sessionStorage.getItem("allAnalysisReload")) {
     activeTab = "2";
@@ -176,11 +177,11 @@ onMounted(async () => {
 });
 
 async function goPaperAnalysis(record: any) {
-  router.push(`/project/${projectId}/paperAnalysis/${record.paperId}`);
+  await router.push(`/project/${projectId}/paperAnalysis/${record.paperId}`);
 }
 
-function goProjectPapers(id: number) {
-  router.push("/project/papers/" + id);
+async function goProjectPapers(id: number) {
+  await router.push("/project/papers/" + id);
 }
 
 function openModal() {

+ 6 - 6
src/features/allAnalysis/ScoreFirstTryRate.vue

@@ -16,7 +16,7 @@
               <a-button @click="openModal1">说明</a-button>
             </div>
           </div>
-          <table class="custom-table" v-if="item.totalRangeConfig">
+          <table v-if="item.totalRangeConfig" class="custom-table">
             <tr>
               <th>初试总分分数段</th>
               <th>人数占比(%)</th>
@@ -53,9 +53,9 @@
 
     <CommonRangeConfig
       ref="rangeConfigRef"
-      :project-id="projectId"
-      :course-id="selectedCourseId"
-      :range-config="selectedRangeConfig"
+      :projectId="projectId"
+      :courseId="selectedCourseId"
+      :rangeConfig="selectedRangeConfig"
       @updated="handleRangeConfigUpdate"
     />
   </div>
@@ -63,7 +63,7 @@
 
 <script setup lang="ts">
 import { useMainStore } from "@/store";
-import { watch, onMounted } from "vue";
+import { onMounted } from "vue";
 import { useRoute } from "vue-router";
 import {
   getSasCourseList,
@@ -125,7 +125,7 @@ async function handleRangeConfigUpdate(rangeConfig: any) {
     projectId: projectId,
     rangeConfig: JSON.stringify(rangeConfig),
   });
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 
 function scoreTitle(rangeConfig: any) {

+ 4 - 4
src/features/allAnalysis/ScoreRate.vue

@@ -91,9 +91,9 @@
 
     <CommonRangeConfig
       ref="rangeConfigRef"
-      :project-id="projectId"
-      :course-id="selectedCourseId"
-      :range-config="selectedRangeConfig"
+      :projectId="projectId"
+      :courseId="selectedCourseId"
+      :rangeConfig="selectedRangeConfig"
       @updated="handleRangeConfigUpdate"
     />
   </div>
@@ -258,7 +258,7 @@ async function handleRangeConfigUpdate(rangeConfig: any) {
     projectId: projectId,
     rangeConfig: JSON.stringify(rangeConfig),
   });
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
   sessionStorage.setItem("allAnalysisReload", "2");
   window.location.reload();
 }

+ 15 - 15
src/features/courseManagement/CourseManagement.vue

@@ -24,7 +24,7 @@
       <span class="tw-mr-4"></span>
       <StateSelect v-model:value="enable" />
       <span class="tw-mr-4"></span>
-      <a-button @click="clickSearch" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="clickSearch">查询</a-button>
     </div>
 
     <div
@@ -44,10 +44,10 @@
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="id"
+        rowKey="id"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -83,21 +83,21 @@
     <a-modal
       v-model:visible="visible"
       title="科目信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 4 }">
         <a-form-item v-show="store.isSuperAdmin" label="顶级机构">
           <RootOrgSelect
-            :disabled="!!courseObj.id"
             v-model:value="courseObj.rootOrgId"
+            :disabled="!!courseObj.id"
           />
         </a-form-item>
         <a-form-item label="科目代码">
           <a-input
-            :disabled="!!courseObj.id"
             v-model:value="courseObj.code"
+            :disabled="!!courseObj.id"
           ></a-input>
         </a-form-item>
         <a-form-item label="科目名称">
@@ -118,9 +118,9 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="批量科目导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="顶级机构">
@@ -264,7 +264,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateCourse(toRaw(courseObj));
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const initCourse = {
@@ -286,7 +286,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -303,20 +303,20 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   const res = await importCourses(rootOrgId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
     clickSearch();
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }
@@ -325,7 +325,7 @@ async function handleImport() {
 
 async function handleExport() {
   await exportCourses({ rootOrgId, name, code, type, enable });
-  message.success({ content: "导出成功" });
+  void message.success({ content: "导出成功" });
 }
 
 let selectIds = $ref<number[]>([]);

+ 9 - 9
src/features/paperAnalysis/QuestionDifficultyGroup.vue

@@ -40,7 +40,7 @@
     </div>
 
     <div class="tw-overflow-y-scroll">
-      <table class="custom-table" v-if="props.rangeConfig">
+      <table v-if="props.rangeConfig" class="custom-table">
         <tr>
           <td>大题号</td>
           <td>小题号</td>
@@ -68,20 +68,20 @@
 
     <CommonRangeConfig
       ref="rangeConfigRef"
-      :project-id="projectId"
-      :course-id="selectedCourseId"
-      :range-config="selectedRangeConfig"
+      :projectId="projectId"
+      :courseId="selectedCourseId"
+      :rangeConfig="selectedRangeConfig"
       @updated="handleRangeConfigUpdate"
     />
 
     <a-modal
       v-model:visible="visible"
       title="按本科目试卷成绩分组"
-      @ok="visible = false"
-      ok-text="确定"
-      cancel-text="取消"
+      okText="确定"
+      cancelText="取消"
       width="600px"
-      :body-style="{ height: '600px' }"
+      :bodyStyle="{ height: '600px' }"
+      @ok="visible = false"
     >
       <div style="width: 100%; height: 600px; overflow: scroll">
         <v-chart
@@ -150,7 +150,7 @@ async function handleRangeConfigUpdate(rangeConfig: any) {
     paperId: props.paperId,
     rangeConfig: JSON.stringify(rangeConfig),
   });
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 
 function scoreTitle(rangeConfig: any) {

+ 5 - 5
src/features/paperAnalysis/QuestionTypeDifficulty.vue

@@ -140,9 +140,9 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="题型设置导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="文件地址">
@@ -204,19 +204,19 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   const res = await importQuestionGroups(props.projectId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }

+ 5 - 5
src/features/paperAnalysis/QuestionTypeDiscrimination.vue

@@ -140,9 +140,9 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="题型设置导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="文件地址">
@@ -204,19 +204,19 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   const res = await importQuestionGroups(props.projectId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }

+ 4 - 4
src/features/projectDataManagement/ProjectDataManagement.vue

@@ -3,8 +3,8 @@
     <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
       项目名称
       <a-input
-        disabled
         v-model:value="project.name"
+        disabled
         class="tw-mr-4"
         style="width: 178px"
         placeholder="项目名称"
@@ -90,16 +90,16 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   await importProjectDataSource(projectId, fileToImport);
-  message.success({ content: "导入成功" });
+  void message.success({ content: "导入成功" });
 }
 
 async function handleLogsOfProject() {
   await logsOfProject(projectId);
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 </script>

+ 20 - 20
src/features/projectManagement/ProjectManagement.vue

@@ -12,7 +12,7 @@
       <span class="tw-mr-4"></span>
       <ProjectStatusSelect v-model:value="projectStatus" />
       <span class="tw-mr-4"></span>
-      <a-button @click="clickSearch" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="clickSearch">查询</a-button>
     </div>
 
     <div
@@ -25,10 +25,10 @@
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="id"
+        rowKey="id"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -74,8 +74,8 @@
                 record.status === 'FINISH' &&
                 store.isGreaterThanEqualRootOrgAdmin
               "
-              @click="selectRestartProject(record)"
               :class="[record.needCompute && 'need-compute']"
+              @click="selectRestartProject(record)"
             >
               重新计算
             </a-button>
@@ -83,9 +83,9 @@
               <template #content>
                 <div class="tw-flex tw-flex-col">
                   <a-button
-                    @click="handleLogsOfProject(record.id)"
                     type="text"
                     style="color: white"
+                    @click="handleLogsOfProject(record.id)"
                   >
                     错误报告
                   </a-button>
@@ -94,31 +94,31 @@
                       record.status !== 'PROCESSING' &&
                       store.isGreaterThanEqualRootOrgAdmin
                     "
-                    @click="goProjectDataSource(record.id)"
                     type="text"
                     style="color: white"
+                    @click="goProjectDataSource(record.id)"
                   >
                     数据管理
                   </a-button>
                   <a-button
                     v-if="record.status !== 'PROCESSING'"
-                    @click="goProjectParams(record.id)"
                     type="text"
                     style="color: white"
+                    @click="goProjectParams(record.id)"
                   >
                     参数配置
                   </a-button>
                   <a-button
-                    @click="goProjectPapers(record.id)"
                     type="text"
                     style="color: white"
+                    @click="goProjectPapers(record.id)"
                   >
                     试卷列表
                   </a-button>
                   <a-button
-                    @click="goAllAnalysis(record.id)"
                     type="text"
                     style="color: white"
+                    @click="goAllAnalysis(record.id)"
                   >
                     整体分析
                   </a-button>
@@ -134,15 +134,15 @@
     <a-modal
       v-model:visible="visible"
       title="项目信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 4 }">
         <a-form-item v-show="projectObj.id" label="项目id">
           <a-input
-            :disabled="!!projectObj.id"
             v-model:value="projectObj.id"
+            :disabled="!!projectObj.id"
           ></a-input>
         </a-form-item>
         <a-form-item label="项目名称">
@@ -154,9 +154,9 @@
     <a-modal
       v-model:visible="showRestartModalVisible"
       title="重新计算"
+      okText="确定"
+      cancelText="取消"
       @ok="handleRestartProject"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <ul class="tw-ml-4 tw-list-disc">
         <li v-if="selectedProject.changeInfo?.ITEM1">单科线</li>
@@ -288,7 +288,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateProject(toRaw(projectObj));
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const initProject = {
@@ -310,7 +310,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -324,7 +324,7 @@ async function handleDeleteProjects(ids: number[]) {
     onOk: async () => {
       await deleteProjects(ids);
       await search();
-      message.success({ content: "操作成功" });
+      void message.success({ content: "操作成功" });
     },
   });
 }
@@ -346,7 +346,7 @@ async function handleCancelProject(id: number) {
     onOk: async () => {
       await cancelProject(id);
       await search();
-      message.success({ content: "操作成功" });
+      void message.success({ content: "操作成功" });
     },
   });
 }
@@ -367,14 +367,14 @@ async function handleRestartProject() {
       await restartProject(selectedProject.id);
       await search();
       showRestartModalVisible = false;
-      message.success({ content: "操作成功" });
+      void message.success({ content: "操作成功" });
     },
   });
 }
 
 async function handleLogsOfProject(id: number) {
   await logsOfProject(id);
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 
 function goProjectDataSource(id: number) {

+ 14 - 14
src/features/projectParamsManagement/ProjectParamsManagement.vue

@@ -1,9 +1,9 @@
 <template>
   <div>
     <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
-      <ProjectCourseSelect :project-id="projectId" v-model:value="courseId" />
+      <ProjectCourseSelect v-model:value="courseId" :projectId="projectId" />
       <span class="tw-mr-4"></span>
-      <a-button @click="clickSearch" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="clickSearch">查询</a-button>
     </div>
 
     <div class="tw-my-4 tw-flex tw-gap-2">
@@ -14,7 +14,7 @@
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="id"
+        rowKey="id"
         :columns="columns"
         :data-source="data"
         :pagination="{
@@ -42,13 +42,13 @@
     <a-modal
       v-model:visible="visible"
       title="单科线设置页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
-      <a-form :label-col="{ span: 5 }">
+      <a-form :labelCol="{ span: 5 }">
         <a-form-item label="项目名称">
-          <a-input disabled v-model:value="projectObj.projectName"></a-input>
+          <a-input v-model:value="projectObj.projectName" disabled></a-input>
         </a-form-item>
         <a-form-item label="项目名称">
           <a-input
@@ -81,9 +81,9 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="单科线批量导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="文件地址">
@@ -199,7 +199,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateProjectCourse(toRaw(projectObj));
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const initProject = {
@@ -223,20 +223,20 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   const res = await importProjectParams(projectId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
     clickSearch();
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }
@@ -245,7 +245,7 @@ async function handleImport() {
 
 async function handleExport() {
   await exportProjectParams(projectId);
-  message.success({ content: "导出成功" });
+  void message.success({ content: "导出成功" });
 }
 
 async function downloadTpl() {

+ 10 - 10
src/features/rootOrg/RootOrg.vue

@@ -18,14 +18,14 @@
       <span class="tw-mr-4"></span>
       <StateSelect v-model:value="enable" />
       <span class="tw-mr-4"></span>
-      <a-button @click="clickSearch" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="clickSearch">查询</a-button>
 
-      <a-button @click="handleRootOrgSync" style="float: right">同步</a-button>
+      <a-button style="float: right" @click="handleRootOrgSync">同步</a-button>
     </div>
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="code"
+        rowKey="code"
         :columns="columns"
         :data-source="data"
         :pagination="{
@@ -55,19 +55,19 @@
     <a-modal
       v-model:visible="visible"
       title="顶级机构信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 5 }">
         <a-form-item label="顶级机构代码">
-          <a-input disabled v-model:value="rootOrgObj.code"></a-input>
+          <a-input v-model:value="rootOrgObj.code" disabled></a-input>
         </a-form-item>
         <a-form-item label="顶级机构名称">
-          <a-input disabled v-model:value="rootOrgObj.name"></a-input>
+          <a-input v-model:value="rootOrgObj.name" disabled></a-input>
         </a-form-item>
         <a-form-item label="状态">
-          <a-radio-group disabled v-model:value="rootOrgObj.enable">
+          <a-radio-group v-model:value="rootOrgObj.enable" disabled>
             <a-radio :value="true">启用</a-radio>
             <a-radio :value="false">禁用</a-radio>
           </a-radio-group>
@@ -163,7 +163,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateRootOrg({ domainName: rootOrgObj.domainName });
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const rootOrgObj = reactive({
@@ -175,6 +175,6 @@ const rootOrgObj = reactive({
 
 async function handleRootOrgSync() {
   await syncRootOrg();
-  message.success("操作成功");
+  void message.success("操作成功");
 }
 </script>

+ 2 - 2
src/features/rootOrg/RootOrgEdit.vue

@@ -18,8 +18,8 @@
           {{ codeToName(item) }}
         </div>
         <a-textarea
-          :auto-size="{ minRows: 3, maxRows: 5 }"
           v-model:value="orgPorps[item]"
+          :autoSize="{ minRows: 3, maxRows: 5 }"
         ></a-textarea>
       </div>
     </div>
@@ -49,7 +49,7 @@ onMounted(async () => {
 
 async function handleOrgPorps() {
   await saveOrgSetting(orgId, orgPorps);
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 function codeToName(item: any): any {
   return ORG_GLOSSARY[item as keyof typeof ORG_GLOSSARY];

+ 17 - 17
src/features/subOrg/SubOrg.vue

@@ -22,7 +22,7 @@
       <span class="tw-mr-4"></span>
       <StateSelect v-model:value="enable" />
       <span class="tw-mr-4"></span>
-      <a-button @click="search" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="search">查询</a-button>
     </div>
 
     <div class="tw-flex tw-gap-2 tw-my-4">
@@ -37,10 +37,10 @@
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="id"
+        rowKey="id"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -71,15 +71,15 @@
     <a-modal
       v-model:visible="visible"
       title="机构信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 4 }">
         <a-form-item v-show="store.isSuperAdmin" label="顶级机构">
           <RootOrgSelect
-            :disabled="!!orgObj.id"
             v-model:value="orgObj.rootOrgId"
+            :disabled="!!orgObj.id"
           />
         </a-form-item>
         <a-form-item label="机构名称">
@@ -87,8 +87,8 @@
         </a-form-item>
         <a-form-item label="机构编码">
           <a-input
-            :disabled="!!orgObj.id"
             v-model:value="orgObj.code"
+            :disabled="!!orgObj.id"
           ></a-input>
         </a-form-item>
         <a-form-item label="状态">
@@ -103,16 +103,16 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="批量机构导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="顶级机构">
           <RootOrgSelect
             v-show="store.isSuperAdmin"
-            :disabled="!!orgObj.id"
             v-model:value="orgObj.rootOrgId"
+            :disabled="!!orgObj.id"
           />
         </a-form-item>
         <a-form-item label="文件地址">
@@ -237,7 +237,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateSubOrg(toRaw(orgObj));
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const orgObj = reactive({
@@ -263,7 +263,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -284,7 +284,7 @@ async function handleDelOrg(ids: number[]) {
     onOk: async () => {
       await delOrgs(ids);
       await search();
-      message.success({ content: "操作成功" });
+      void message.success({ content: "操作成功" });
     },
   });
 }
@@ -296,19 +296,19 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
   (document.querySelector("#file-input") as HTMLInputElement).value = "";
   const res = await importOrgs(rootOrgId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }
@@ -317,7 +317,7 @@ async function handleImport() {
 
 async function handleExport() {
   await exportOrgs({ rootOrgId, name, code, enable: true });
-  message.success({ content: "导出成功" });
+  void message.success({ content: "导出成功" });
 }
 
 let selectIds = $ref<number[]>([]);

+ 21 - 21
src/features/userManagement/UserManagement.vue

@@ -20,11 +20,11 @@
         allowClear
       ></a-input>
       <span class="tw-mr-4"></span>
-      <RoleSelect v-model:value="roleId" :root-org-id="rootOrgId" />
+      <RoleSelect v-model:value="roleId" :rootOrgId="rootOrgId" />
       <span class="tw-mr-4"></span>
       <StateSelect v-model:value="enable" />
       <span class="tw-mr-4"></span>
-      <a-button @click="clickSearch" class="query-btn">查询</a-button>
+      <a-button class="query-btn" @click="clickSearch">查询</a-button>
     </div>
 
     <div class="tw-flex tw-gap-2 tw-my-4">
@@ -42,10 +42,10 @@
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="id"
+        rowKey="id"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -74,17 +74,17 @@
               <template #content>
                 <div class="tw-flex tw-flex-col">
                   <a-button
-                    @click="handleResetUsers([record.id])"
                     type="text"
                     style="color: white"
+                    @click="handleResetUsers([record.id])"
                   >
                     重置密码
                   </a-button>
                   <a-button
                     v-if="store.isGreaterThanEqualRootOrgAdmin"
                     type="text"
-                    @click="handleUserPrivilege(record.id)"
                     style="color: white"
+                    @click="handleUserPrivilege(record.id)"
                   >
                     权限设置
                   </a-button>
@@ -100,15 +100,15 @@
     <a-modal
       v-model:visible="visible"
       title="用户信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form :labelCol="{ span: 4 }">
         <a-form-item v-show="store.isSuperAdmin" label="顶级机构">
           <RootOrgSelect
-            :disabled="!!userObj.id"
             v-model:value="userObj.rootOrgId"
+            :disabled="!!userObj.id"
           />
         </a-form-item>
         <a-form-item label="姓名">
@@ -116,20 +116,20 @@
         </a-form-item>
         <a-form-item label="登录名">
           <a-input
-            :disabled="!!userObj.id"
             v-model:value="userObj.loginName"
+            :disabled="!!userObj.id"
           ></a-input>
         </a-form-item>
         <a-form-item label="登录密码">
           <a-input
-            :disabled="!!userObj.id"
             v-model:value="userObj.password"
+            :disabled="!!userObj.id"
           ></a-input>
         </a-form-item>
         <a-form-item label="角色">
           <RoleSelect
-            :root-org-id="userObj.rootOrgId"
             v-model:value="userObj.roleId"
+            :rootOrgId="userObj.rootOrgId"
           />
         </a-form-item>
         <a-form-item label="状态">
@@ -144,9 +144,9 @@
     <a-modal
       v-model:visible="importModalVisible"
       title="批量用户导入"
+      okText="确定"
+      cancelText="取消"
       @ok="handleImport"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form>
         <a-form-item label="顶级机构">
@@ -290,7 +290,7 @@ const handleOk = async (e: MouseEvent) => {
   await updateUser(toRaw(userObj));
   visible.value = false;
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 };
 
 const initUser = {
@@ -314,7 +314,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -334,7 +334,7 @@ async function handleResetUsers(ids: number[]) {
     onOk: async () => {
       await resetPasswords(ids);
       await search();
-      message.success({ content: "操作成功" });
+      void message.success({ content: "操作成功" });
     },
   });
 }
@@ -346,7 +346,7 @@ async function handleImport() {
     .files;
   const fileToImport = files && files[0];
   if (!fileToImport) {
-    message.warn({ content: "请选择文件" });
+    void message.warn({ content: "请选择文件" });
     return;
   }
 
@@ -355,13 +355,13 @@ async function handleImport() {
   const res = await importUsers(rootOrgId, fileToImport);
   if (!res.data.hasError) {
     importModalVisible = false;
-    message.success({ content: "导入成功" });
+    void message.success({ content: "导入成功" });
     clickSearch();
   } else {
     const msg = res.data.failRecords.map((v) =>
       h("div", `行号:${v.lineNum}, 错误:${v.msg}`)
     );
-    message.error({
+    void message.error({
       content: h("span", ["导入失败", ...msg]),
     });
   }
@@ -370,7 +370,7 @@ async function handleImport() {
 
 async function handleExport() {
   await exportUsers({ rootOrgId, name, loginName, roleId, enable });
-  message.success({ content: "导出成功" });
+  void message.success({ content: "导出成功" });
 }
 
 let selectIds = $ref<number[]>([]);

+ 13 - 13
src/features/userManagement/UserPrivilegeCourse.vue

@@ -3,17 +3,17 @@
     <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
       <a-switch v-model:checked="checked" @click="toggleAll" /> 全部科目
       <div class="tw-float-right tw-flex tw-gap-2">
-        <a-button @click="handleDeletePrivilege" :danger="true">删除</a-button>
+        <a-button :danger="true" @click="handleDeletePrivilege">删除</a-button>
         <a-button @click="showModal">添加</a-button>
       </div>
     </div>
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="courseId"
+        rowKey="courseId"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -32,9 +32,9 @@
     <a-modal
       v-model:visible="visible"
       title="信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form layout="inline">
         <a-form-item label="科目名称">
@@ -47,14 +47,14 @@
           </a-radio-group>
         </a-form-item> -->
 
-        <a-button @click="fetchData2" class="query-btn">查询</a-button>
+        <a-button class="query-btn" @click="fetchData2">查询</a-button>
       </a-form>
       <div class="tw-bg-white tw-py-5 tw-rounded-xl">
         <a-table
-          row-key="id"
+          rowKey="id"
           :columns="columns2"
           :data-source="data2"
-          :row-selection="rowSelection2"
+          :rowSelection="rowSelection2"
           :pagination="{
           pageSize: pageSize2,
           current: pageNo2,
@@ -103,7 +103,7 @@ async function toggleAll() {
     type: PRIVI_TYPE,
     userId,
   });
-  message.success({ content: "修改成功" });
+  void message.success({ content: "修改成功" });
   await search();
 }
 
@@ -177,7 +177,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -189,7 +189,7 @@ async function handleDeletePrivilege() {
     refIds: selectIds,
   });
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
   selectIds = [];
 }
 
@@ -255,7 +255,7 @@ function checkEmpty2(selectIds: number[]): boolean {
   if (selectIds2 && selectIds2.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -268,7 +268,7 @@ async function handleOk() {
   });
   await search();
   visible = false;
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 /** </Modal> */
 </script>

+ 13 - 13
src/features/userManagement/UserPrivilegeOrg.vue

@@ -3,17 +3,17 @@
     <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
       <a-switch v-model:checked="checked" @click="toggleAll" /> 全部科目
       <div class="tw-float-right tw-flex tw-gap-2">
-        <a-button @click="handleDeletePrivilege" :danger="true">删除</a-button>
+        <a-button :danger="true" @click="handleDeletePrivilege">删除</a-button>
         <a-button @click="showModal">添加</a-button>
       </div>
     </div>
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
       <a-table
-        row-key="orgId"
+        rowKey="orgId"
         :columns="columns"
         :data-source="data"
-        :row-selection="rowSelection"
+        :rowSelection="rowSelection"
         :pagination="{
           pageSize: pageSize,
           current: pageNo,
@@ -32,9 +32,9 @@
     <a-modal
       v-model:visible="visible"
       title="信息页"
+      okText="确定"
+      cancelText="取消"
       @ok="handleOk"
-      ok-text="确定"
-      cancel-text="取消"
     >
       <a-form layout="inline">
         <a-form-item label="机构名称">
@@ -47,14 +47,14 @@
           </a-radio-group>
         </a-form-item> -->
 
-        <a-button @click="fetchData2" class="query-btn">查询</a-button>
+        <a-button class="query-btn" @click="fetchData2">查询</a-button>
       </a-form>
       <div class="tw-bg-white tw-py-5 tw-rounded-xl">
         <a-table
-          row-key="id"
+          rowKey="id"
           :columns="columns2"
           :data-source="data2"
-          :row-selection="rowSelection2"
+          :rowSelection="rowSelection2"
           :pagination="{
           pageSize: pageSize2,
           current: pageNo2,
@@ -103,7 +103,7 @@ async function toggleAll() {
     type: PRIVI_TYPE,
     userId,
   });
-  message.success({ content: "修改成功" });
+  void message.success({ content: "修改成功" });
   await search();
 }
 
@@ -177,7 +177,7 @@ function checkEmpty(selectIds: number[]): boolean {
   if (selectIds && selectIds.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -189,7 +189,7 @@ async function handleDeletePrivilege() {
     refIds: selectIds,
   });
   await search();
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
   selectIds = [];
 }
 
@@ -255,7 +255,7 @@ function checkEmpty2(selectIds: number[]): boolean {
   if (selectIds2 && selectIds2.length > 0) {
     return false;
   } else {
-    message.warn({ content: "请先选择行" });
+    void message.warn({ content: "请先选择行" });
     return true;
   }
 }
@@ -268,7 +268,7 @@ async function handleOk() {
   });
   await search();
   visible = false;
-  message.success({ content: "操作成功" });
+  void message.success({ content: "操作成功" });
 }
 /** </Modal> */
 </script>

+ 15 - 9
src/plugins/axiosApp.ts

@@ -1,4 +1,3 @@
-import Vue from "vue";
 import axios from "axios";
 // @ts-ignore
 import { loadProgressBar } from "axios-progress-bar";
@@ -21,7 +20,6 @@ const config = {
   timeout: 1 * 60 * 1000, // Timeout
   withCredentials: true, // Check cross-site Access-Control
 };
-const cacheGetUrls: [RegExp] | [] = [];
 
 const _axiosApp = axios.create(config);
 axiosRetry(_axiosApp, { retries: 3, retryDelay: () => 3000 });
@@ -49,6 +47,7 @@ _axiosApp.interceptors.request.use(
     if (wk_token) {
       const completeURL = new URL("http://nasty.com" + config.url);
       const path = completeURL.pathname;
+      // @ts-ignore
       config.headers.common["Authorization"] = gToken(
         config.method?.toLowerCase() === "get" ? "get" : "post",
         path,
@@ -56,8 +55,11 @@ _axiosApp.interceptors.request.use(
         time
       );
     }
+    // @ts-ignore
     config.headers.common["platform"] = PLATFORM;
+    // @ts-ignore
     config.headers.common["deviceId"] = DEVICE_ID;
+    // @ts-ignore
     config.headers.common["time"] = time;
     return config;
   },
@@ -65,7 +67,7 @@ _axiosApp.interceptors.request.use(
     if (error.config.setGlobalMask) {
       store.globalMask = false;
     }
-    message.error({ content: error, duration: 10 });
+    void message.error({ content: error, duration: 10 });
     console.log(error);
     return Promise.reject(error);
   }
@@ -87,7 +89,7 @@ _axiosApp.interceptors.response.use(
     if (!error.response) {
       if (showErrorMessage) {
         // "Network Error" 网络不通,直接返回
-        message.error({
+        void message.error({
           content: "网络连接异常,请检查网络设置。",
           duration: 10,
         });
@@ -95,7 +97,7 @@ _axiosApp.interceptors.response.use(
       return Promise.reject(error);
     }
     // 这里是返回状态码不为200时候的错误处理
-    let status = error.response.status;
+    const status = error.response.status;
 
     // 登录失效 跳转登录页面
     if (status == 403 || status == 401) {
@@ -106,12 +108,12 @@ _axiosApp.interceptors.response.use(
       return Promise.reject(error);
     } else if (status == 405) {
       if (showErrorMessage) {
-        message.error({ content: "没有权限!", duration: 10 });
+        void message.error({ content: "没有权限!", duration: 10 });
       }
       return Promise.reject(error);
     } else if (status == 502) {
       if (showErrorMessage) {
-        message.error({ content: "服务器异常(502)!", duration: 10 });
+        void message.error({ content: "服务器异常(502)!", duration: 10 });
       }
       return Promise.reject(error);
     }
@@ -120,11 +122,14 @@ _axiosApp.interceptors.response.use(
       const data = error.response.data;
       if (data && (data.message || data.desc)) {
         if (showErrorMessage) {
-          message.error({ content: data.message || data.desc, duration: 10 });
+          void message.error({
+            content: data.message || data.desc,
+            duration: 10,
+          });
         }
       } else {
         if (showErrorMessage) {
-          message.error({
+          void message.error({
             content: "未定义异常: " + JSON.stringify(data, null, 2),
             duration: 10,
           });
@@ -135,6 +140,7 @@ _axiosApp.interceptors.response.use(
   }
 );
 
+// eslint-disable-next-line
 loadProgressBar(null, _axiosApp);
 
 export const httpApp = _axiosApp;

+ 4 - 4
src/plugins/axiosNoAuth.ts

@@ -25,7 +25,7 @@ _axiosNoAuth.interceptors.request.use(
     return config;
   },
   function (error) {
-    message.error({ content: error, duration: 10 });
+    void message.error({ content: error, duration: 10 });
     return Promise.reject(error);
   }
 );
@@ -38,7 +38,7 @@ _axiosNoAuth.interceptors.response.use(
   (error) => {
     if (!error.response) {
       // "Network Error" 网络不通,直接返回
-      message.error({
+      void message.error({
         content: "网络连接异常,请检查网络设置。",
         duration: 10,
       });
@@ -47,9 +47,9 @@ _axiosNoAuth.interceptors.response.use(
 
     const data = error.response.data;
     if (data && data.desc) {
-      message.error({ content: data.desc, duration: 10 });
+      void message.error({ content: data.desc, duration: 10 });
     } else {
-      message.error({
+      void message.error({
         content: `异常(${error.response.status}): ${error.config.url}`,
         duration: 10,
       });

+ 1 - 1
src/plugins/axiosNotice.ts

@@ -9,7 +9,7 @@ export const notifyInvalidTokenThrottled = throttle(
     if (router.currentRoute.value.name === "Login") {
       return;
     }
-    message.error({
+    void message.error({
       content: "登录失效,请重新登录!",
       duration: 10,
     });

+ 65 - 0
src/types/index.ts

@@ -107,3 +107,68 @@ export interface QuestionGroup {
   updateTime: string;
   zeroCount: number;
 }
+
+// 科目成绩(总分)频率分布-科目成绩占初试总分权重
+export interface SasCourse {
+  courseCode: string;
+  courseId: number;
+  courseName: string;
+  difficulty: number;
+  id: number;
+  projectId: number;
+  rangeConfig: string | RangeConfig[];
+  // scoreRange: string | ;
+  totalCount: number;
+  totalRangeConfig: string;
+  totalScore: number;
+  totalScoreRange: string;
+  totalScoreRangeTitle: string;
+}
+
+export interface RangeConfig {
+  type: keyof RANGE_POINT_TYPE;
+  baseScore: number;
+  adjustScore: number;
+}
+
+export interface RANGE_POINT_TYPE {
+  ZERO: "零分";
+  CUSTOM: "自定义";
+  NATIONAL_SCORE: "国家单科线";
+  RETEST_SCORE: "复试单科线";
+  NATIONAL_TOTAL_SCORE: "国家总分线";
+  RETEST_TOTAL_SCORE: "复试总分线";
+  TOTAL_SCORE_LINE: "国家满分线";
+}
+
+// 整体分析-试卷特征量数
+export interface SASPaper {
+  allRange: number;
+  avgScore: number;
+  coefficient: number;
+  courseCode: string;
+  courseId: number;
+  courseName: string;
+  difficulty: number;
+  id: number;
+  maxScore: number;
+  minScore: number;
+  paperId: number;
+  paperName: string;
+  paperType: string;
+  projectId: number;
+  reliability1: number;
+  reliability2: number;
+  stdev: number;
+  totalScore: number;
+}
+
+export interface Pagination {
+  pageNo: number;
+  pageSize: number;
+  totalElements: number;
+}
+
+export interface SASPaperResponse extends Pagination {
+  content: SASPaper[];
+}