首页 学生端 plus

wqf
翁启凡 7 months ago
parent 29cf31e58e
commit 5298ae7547

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ASMSmaliIdeaPluginConfiguration">
<asm skipDebug="true" skipFrames="true" skipCode="false" expandFrames="false" />
<groovy codeStyle="LEGACY" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ExamSphere.iml" filepath="$PROJECT_DIR$/.idea/ExamSphere.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

@ -0,0 +1,5 @@
# Vue 3 + Vite
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).

@ -0,0 +1,13 @@
<!doctype html>
<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>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

@ -0,0 +1,822 @@
{
"name": "lesson2",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "lesson2",
"version": "0.0.0",
"dependencies": {
"axios": "^1.7.7",
"element-plus": "^2.8.6",
"vue": "^3.4.37",
"vue-router": "4"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.1.2",
"vite": "^5.4.1"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.24.8",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
"integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.24.7",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.25.6",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.6.tgz",
"integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.25.6"
},
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/types": {
"version": "7.25.6",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz",
"integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.24.8",
"@babel/helper-validator-identifier": "^7.24.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
"integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.8"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.12",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
"integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.6.0",
"@floating-ui/utils": "^0.2.8"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
"integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
"license": "MIT"
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.21.2",
"resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz",
"integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash": {
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
"integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
"license": "MIT"
},
"node_modules/@vitejs/plugin-vue": {
"version": "5.1.3",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz",
"integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"vite": "^5.0.0",
"vue": "^3.2.25"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.1.tgz",
"integrity": "sha512-WdjF+NSgFYdWttHevHw5uaJFtKPalhmxhlu2uREj8cLP0uyKKIR60/JvSZNTp0x+NSd63iTiORQTx3+tt55NWQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.25.3",
"@vue/shared": "3.5.1",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.1.tgz",
"integrity": "sha512-Ao23fB1lINo18HLCbJVApvzd9OQe8MgmQSgyY5+umbWj2w92w9KykVmJ4Iv2US5nak3ixc2B+7Km7JTNhQ8kSQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.5.1",
"@vue/shared": "3.5.1"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.1.tgz",
"integrity": "sha512-DFizMNH8eDglLhlfwJ0+ciBsztaYe3fY/zcZjrqL1ljXvUw/UpC84M1d7HpBTCW68SNqZyIxrs1XWmf+73Y65w==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.25.3",
"@vue/compiler-core": "3.5.1",
"@vue/compiler-dom": "3.5.1",
"@vue/compiler-ssr": "3.5.1",
"@vue/shared": "3.5.1",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.11",
"postcss": "^8.4.44",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.1.tgz",
"integrity": "sha512-C1hpSHQgRM8bg+5XWWD7CkFaVpSn9wZHCLRd10AmxqrH17d4EMP6+XcZpwBOM7H1jeStU5naEapZZWX0kso1tQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.1",
"@vue/shared": "3.5.1"
}
},
"node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/@vue/reactivity": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.1.tgz",
"integrity": "sha512-aFE1nMDfbG7V+U5vdOk/NXxH/WX78XuAfX59vWmCM7Ao4lieoc83RkzOAWun61sQXlzNZ4IgROovFBHg+Iz1+Q==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.5.1"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.1.tgz",
"integrity": "sha512-Ce92CCholNRHR3ZtzpRp/7CDGIPFxQ7ElXt9iH91ilK5eOrUv3Z582NWJesuM3aYX71BujVG5/4ypUxigGNxjA==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.1",
"@vue/shared": "3.5.1"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.1.tgz",
"integrity": "sha512-B/fUJfBLp5PwE0EWNfBYnA4JUea8Yufb3wN8fN0/HzaqBdkiRHh4sFHOjWqIY8GS75gj//8VqeEqhcU6yUjIkA==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.1",
"@vue/runtime-core": "3.5.1",
"@vue/shared": "3.5.1",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.1.tgz",
"integrity": "sha512-C5V/fjQTitgVaRNH5wCoHynaWysjZ+VH68drNsAvQYg4ArHsZUQNz0nHoEWRj41nzqkVn2RUlnWaEOTl2o1Ppg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.5.1",
"@vue/shared": "3.5.1"
},
"peerDependencies": {
"vue": "3.5.1"
}
},
"node_modules/@vue/shared": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.1.tgz",
"integrity": "sha512-NdcTRoO4KuW2RSFgpE2c+E/R/ZHaRzWPxAGxhmxZaaqLh6nYCXx7lc9a88ioqOCxCaV2SFJmujkxbUScW7dNsQ==",
"license": "MIT"
},
"node_modules/@vueuse/core": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"license": "MIT",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.7.7",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/element-plus": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.6.tgz",
"integrity": "sha512-fk5jB8V3efM02/4roZ5SWOLArgaYXbxEydZLlXSr+KPAwjNyHBlk2+HO5em8YKo5+RLBoHnn6BaThj6IE4nXoQ==",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.3.1",
"@floating-ui/dom": "^1.0.1",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.14.182",
"@types/lodash-es": "^4.17.6",
"@vueuse/core": "^9.1.0",
"async-validator": "^4.2.5",
"dayjs": "^1.11.3",
"escape-html": "^1.0.3",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/esbuild": {
"version": "0.21.5",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.21.5",
"@esbuild/android-arm": "0.21.5",
"@esbuild/android-arm64": "0.21.5",
"@esbuild/android-x64": "0.21.5",
"@esbuild/darwin-arm64": "0.21.5",
"@esbuild/darwin-x64": "0.21.5",
"@esbuild/freebsd-arm64": "0.21.5",
"@esbuild/freebsd-x64": "0.21.5",
"@esbuild/linux-arm": "0.21.5",
"@esbuild/linux-arm64": "0.21.5",
"@esbuild/linux-ia32": "0.21.5",
"@esbuild/linux-loong64": "0.21.5",
"@esbuild/linux-mips64el": "0.21.5",
"@esbuild/linux-ppc64": "0.21.5",
"@esbuild/linux-riscv64": "0.21.5",
"@esbuild/linux-s390x": "0.21.5",
"@esbuild/linux-x64": "0.21.5",
"@esbuild/netbsd-x64": "0.21.5",
"@esbuild/openbsd-x64": "0.21.5",
"@esbuild/sunos-x64": "0.21.5",
"@esbuild/win32-arm64": "0.21.5",
"@esbuild/win32-ia32": "0.21.5",
"@esbuild/win32-x64": "0.21.5"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"license": "MIT"
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
},
"node_modules/lodash-unified": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"license": "MIT",
"peerDependencies": {
"@types/lodash-es": "*",
"lodash": "*",
"lodash-es": "*"
}
},
"node_modules/magic-string": {
"version": "0.30.11",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
"integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
"license": "MIT"
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/picocolors": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
"license": "ISC"
},
"node_modules/postcss": {
"version": "8.4.45",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.45.tgz",
"integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.1",
"source-map-js": "^1.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/rollup": {
"version": "4.21.2",
"resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.21.2.tgz",
"integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.5"
},
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.21.2",
"@rollup/rollup-android-arm64": "4.21.2",
"@rollup/rollup-darwin-arm64": "4.21.2",
"@rollup/rollup-darwin-x64": "4.21.2",
"@rollup/rollup-linux-arm-gnueabihf": "4.21.2",
"@rollup/rollup-linux-arm-musleabihf": "4.21.2",
"@rollup/rollup-linux-arm64-gnu": "4.21.2",
"@rollup/rollup-linux-arm64-musl": "4.21.2",
"@rollup/rollup-linux-powerpc64le-gnu": "4.21.2",
"@rollup/rollup-linux-riscv64-gnu": "4.21.2",
"@rollup/rollup-linux-s390x-gnu": "4.21.2",
"@rollup/rollup-linux-x64-gnu": "4.21.2",
"@rollup/rollup-linux-x64-musl": "4.21.2",
"@rollup/rollup-win32-arm64-msvc": "4.21.2",
"@rollup/rollup-win32-ia32-msvc": "4.21.2",
"@rollup/rollup-win32-x64-msvc": "4.21.2",
"fsevents": "~2.3.2"
}
},
"node_modules/source-map-js": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/vite": {
"version": "5.4.3",
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.3.tgz",
"integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
"rollup": "^4.20.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^18.0.0 || >=20.0.0",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
"sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
"terser": "^5.4.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"less": {
"optional": true
},
"lightningcss": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
}
}
},
"node_modules/vue": {
"version": "3.5.1",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.1.tgz",
"integrity": "sha512-k4UNnbPOEskodSxMtv+B9GljdB0C9ubZDOmW6vnXVGIfMqmEsY2+ohasjGguhGkMkrcP/oOrbH0dSD41x5JQFw==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.1",
"@vue/compiler-sfc": "3.5.1",
"@vue/runtime-dom": "3.5.1",
"@vue/server-renderer": "3.5.1",
"@vue/shared": "3.5.1"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/vue-router": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz",
"integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.2.0"
}
}
}
}

@ -0,0 +1,21 @@
{
"name": "lesson2",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"axios": "^1.7.7",
"element-plus": "^2.8.6",
"vue": "^3.4.37",
"vue-router": "4"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.1.2",
"vite": "^5.4.1"
}
}

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,22 @@
<script setup>
</script>
<template>
<div id="app">
<router-view/>
</div>
</template>
<style scoped>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body, #app {
height: 100%;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

@ -0,0 +1,14 @@
import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// import App from './view/student/exam.vue'
import App from './App.vue'
import router from './router'
import './assets/styles.css';
const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.mount('#app')

@ -0,0 +1,41 @@
import axios from 'axios'
import { ElMessage } from 'element-plus';
const request = axios.create({
timeout: 3000
})
// request 拦截器
// 自请求发送前对请求做一些处理
// 统一加token对请求参数统一加密
request.interceptors.request.use(config => {
config.headers['Content-Type'] = 'application/json;charset=utf-8';
let user=localStorage.getItem("user")?JSON.parse(localStorage.getItem("user")):null
if(user){
config.headers['token'] = user.data.token; // 设置请求头
}
return config
}, error => {
return Promise.reject(error)
});
//response 拦截器
//可以在接口响应后统一处理结果
request.interceptors.response.use(
response => {
let res = response;
if(res.data.code=='500'){
ElMessage.error(res.data.msg)
}
return res;
},
error => {
console.log('err' + error)
return Promise.reject(error)
}
)
export default request

@ -0,0 +1,64 @@
import {
createRouter,
createWebHashHistory
} from "vue-router"
const router = createRouter({
history: createWebHashHistory(),
routes: [{
path: '/',
redirect: '/login' //默认页面
},
{
path: '/index',
name: 'Index',
component: () => import('./view/student/index.vue')
},
{
path: '/login',
name: 'Login',
component: () => import('./view/Login.vue')
},
{
path: '/register',
name: 'Register',
component: () => import('./view/Register.vue')
},
{
path: '/student',
name: 'Student',
component: () => import('./view/student/index.vue'),
redirect: '/student/home',
children:[
{
path: 'home',
name: 'Home',
component: () => import('./view/student/home.vue'),
},
{
path: 'personalCenter',
component: () => import('./view/student/personalCenter.vue'),
},
{
path: 'discussion',
component: () => import('./view/student/discussion.vue'),
},
{
path: 'myExam',
component: () => import('./view/student/myExam.vue'),
},
{
path: 'myScore',
component: () => import('./view/student/myScore.vue'),
},
{
path: 'exam',
name: 'Exam',
component: () => import('./view/student/exam.vue'),
}
]
},
]
})
export default router

@ -0,0 +1,79 @@
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

@ -0,0 +1,123 @@
<template>
<div class="auth-container">
<h2>登录</h2>
<el-form :model="user" :rules="rules" ref="ruleFormRef">
<el-form-item prop="username">
<el-input v-model="user.username" placeholder="请输入用户名" prefix-icon="el-icon-user" clearable class="width" />
</el-form-item>
<el-form-item prop="password">
<el-input show-password v-model="user.password" type="password" placeholder="请输入密码"
prefix-icon="el-icon-lock" clearable class="width" />
</el-form-item>
<el-form-item>
<el-button type="primary" block @click="handleLogin"></el-button>
<el-button type="text" @click="goToRegister"></el-button>
</el-form-item>
</el-form>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
import request from '../request.js'
import type { FormInstance, FormRules } from 'element-plus'
const router = useRouter()
const ruleFormRef = ref<FormInstance>()
const user = reactive({
username: '',
password: ''
})
const rules = reactive<FormRules>({
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 3, max: 8, message: '长度在3到8个字符', trigger: 'blur' },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 3, max: 8, message: '长度在3到8个字符', trigger: 'blur' },
]
})
const handleLogin = () => {
if (!ruleFormRef.value) return;
ruleFormRef.value.validate((valid) => {
if (valid) {
request({
url: "http://localhost:8080/user/login",
method: "post",
data: {
username: user.username,
password: user.password
}
}).then(res => {
if (res.data.code == '200') {
localStorage.setItem("user", JSON.stringify(res.data))
ElMessage.success("登录成功")
if(res.data.data.role=='student'){
router.push("/student/home")
}else if(res.data.data.role=='teacher'){
router.push("/teacher-home")
}else{
router.push("/admin-home")
}
} else {
ElMessage.error(res.data.msg)
}
}).catch(() => {
ElMessage.error("登录失败,请重试")
})
} else {
ElMessage.warning("用户名或密码不能为空")
}
})
}
const goToRegister = () => {
router.push('/register')
}
</script>
<style scoped>
.auth-container {
max-width: 400px;
margin: 0 auto;
padding: 2em;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
border-radius: 8px;
background-color: #fff;
}
h2 {
text-align: center;
color: #333;
margin-bottom: 1.5em;
}
.el-form-item {
margin-bottom: 1em;
}
.auth-container::before {
content: '';
background-image: url('../assets/背景1.jpg');
background-size: cover;
background-position: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 0;
opacity: 0.5;
}
.width{
width: 100%;
min-width: 280px;
}
</style>

@ -0,0 +1,161 @@
<template>
<div class="auth-container">
<h2>注册</h2>
<el-form :model="user" :rules="rules" ref="ruleFormRef">
<el-form-item prop="username">
<el-input v-model="user.username" placeholder="请输入用户名" prefix-icon="el-icon-user" clearable class="width" />
</el-form-item>
<el-form-item prop="password">
<el-input show-password v-model="user.password" type="password" placeholder="请输入密码"
prefix-icon="el-icon-lock" clearable class="width" />
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input show-password v-model="user.confirmPassword" type="password" placeholder="请再次输入密码"
prefix-icon="el-icon-lock" clearable class="width" />
</el-form-item>
<el-radio-group v-model="radio1">
<el-radio label="student">学生</el-radio>
<el-radio label="teacher">教师</el-radio>
<el-radio label="admin">管理员</el-radio>
</el-radio-group>
<el-form-item>
<el-button type="primary" block @click="handleRegister"></el-button>
<el-button type="text" @click="goToLogin"></el-button>
</el-form-item>
</el-form>
</div>
</template>
<script lang="ts" setup>
import {reactive,ref} from 'vue'
import {ElMessage} from 'element-plus'
import {useRouter} from 'vue-router'
import request from '../request.js'
import type {FormInstance,FormRules} from 'element-plus'
const router = useRouter()
const ruleFormRef = ref < FormInstance > ()
const radio1 = ref('student');
const user = reactive({
username: '',
password: '',
confirmPassword: '',
role:''
})
const rules = reactive < FormRules > ({
username: [{
required: true,
message: '请输入用户名',
trigger: 'blur'
},
{
min: 3,
max: 8,
message: '长度在3到8个字符',
trigger: 'blur'
},
],
password: [{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
min: 3,
max: 8,
message: '长度在3到8个字符',
trigger: 'blur'
},
],
confirmPassword: [{
required: true,
message: '请再次输入密码',
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (value !== user.password) {
callback(new Error('两次输入的密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
const handleRegister = () => {
if (!ruleFormRef.value) return
ruleFormRef.value.validate((valid) => {
if (valid) {
request({
url: "http://localhost:8080/user/register",
method: "post",
data: {
username: user.username,
password: user.password,
role:radio1.value
}
}).then(res => {
if (res.data.code == '200') {
ElMessage.success("注册成功,请登录")
router.push("/login")
} else {
ElMessage.error(res.data.msg)
}
}).catch(() => {
ElMessage.error("注册失败,请重试")
})
} else {
ElMessage.warning("请检查输入的字段")
}
})
}
const goToLogin = () => {
router.push('/login')
}
</script>
<style scoped>
.auth-container {
max-width: 400px;
margin: 0 auto;
padding: 2em;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
border-radius: 8px;
background-color: #fff;
}
h2 {
text-align: center;
color: #333;
margin-bottom: 1.5em;
}
.el-form-item {
margin-bottom: 1em;
}
.auth-container::before {
content: '';
background-image: url('../assets/背景1.jpg');
background-size: cover;
background-position: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 0;
opacity: 0.5;
}
.width{
width: 100%;
min-width: 280px;
}
</style>

@ -0,0 +1,142 @@
<template>
<div class="discussion">
<div class="discussion-header">
<h1>讨论区</h1>
</div>
<div class="post-form">
<textarea placeholder="分享你的想法..." v-model="postContent"></textarea>
<button type="primary" @click="submitPost"></button>
</div>
<div class="posts" v-if="posts.length > 0">
<div class="post" v-for="(post, index) in posts" :key="index">
<div class="post-content">{{ post.content }}</div>
<div class="post-meta">
<span>{{ post.author }}</span>
<span>{{ post.date }}</span>
</div>
</div>
</div>
<div v-else class="no-posts">
<p>还没有帖子快来发表第一个吧</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {
postContent: '',
posts: [
//
{
content: '在线考试系统采用人脸识别、行为分析、声音监测等高科技手段,对考生进行实时监控,有效防止作弊行为。这些措施不仅提高了考试的公信力,还为考生创造了更加公平、透明的竞争环境。',
author: '用户A',
date: '2024-04-01'
},
{
content: '随着远程教育和在线培训的兴起越来越多的教育机构和企业开始采用在线考试系统以满足大规模、高效率的考试需求。根据艾媒咨询的数据中国SaaS行业市场规模持续增长预计在线考试SaaS行业也将迎来快速发展。',
author: '用户B',
date: '2024-04-02'
}
]
};
},
methods: {
submitPost() {
if (this.postContent.trim() === '') return;
const newPost = {
content: this.postContent,
author: '用户C', //
date: new Date().toISOString().slice(0, 10).replace(/-/g, '-')
};
this.posts.unshift(newPost); //
this.postContent = ''; //
}
}
};
</script>
<style scoped>
.discussion {
max-width: 800px;
margin: 30px auto;
padding: 20px;
background: #f9f9f9; /* 轻微的背景颜色 */
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
border-radius: 8px;
font-family: Arial, sans-serif; /* 优化字体 */
}
.discussion-header h1 {
font-size: 28px; /* 增大标题字体 */
text-align: center;
color: #333;
margin-bottom: 20px; /* 增加底部间距 */
}
.post-form textarea {
width: 100%;
padding: 12px;
margin-bottom: 15px; /* 增加底部间距 */
border: 1px solid #ccc; /* 更柔和的边框颜色 */
border-radius: 4px;
resize: vertical;
min-height: 120px; /* 调整最小高度 */
font-size: 16px; /* 增加字体大小 */
}
.post-form button {
padding: 12px 25px;
background: #28a745; /* 更清晰的颜色 */
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background 0.3s;
font-size: 16px; /* 增加字体大小 */
}
.post-form button:hover {
background: #218838; /* 加深悬停颜色 */
}
.posts {
margin-top: 30px; /* 加大顶部间距 */
}
.post {
border-bottom: 1px solid #eee;
padding: 20px 0; /* 增加上下内边距 */
}
.post:last-child {
border-bottom: none;
}
.post-content {
margin-bottom: 10px;
color: #555;
word-wrap: break-word; /* 允许换行 */
text-align: left; /* 内容左对齐 */
line-height: 1.5; /* 增加行高,提升可读性 */
}
.post-meta {
font-size: 14px;
color: #888;
display: flex;
justify-content: space-between;
}
.no-posts {
text-align: center;
margin-top: 30px; /* 增加顶部间距 */
}
.no-posts p {
color: #777;
font-size: 16px; /* 增加字体大小 */
}
</style>

@ -0,0 +1,139 @@
<template>
<div class="exam-container">
<div class="subject">{{ exams[0].subject }}</div>
<div v-if="!isExamFinished">
<div class="question-container" v-for="(question, index) in questions" :key="index">
<h2 class="question-title">{{ question.question }}</h2>
<div v-if="question.type === 'single'">
<label class="option-label" v-for="(option, optIndex) in question.options" :key="optIndex">
<input type="radio" :value="option" v-model="selectedAnswers[index]" />
{{ option }}
</label>
</div>
<div v-if="question.type === 'multiple'">
<label class="option-label" v-for="(option, optIndex) in question.options" :key="optIndex">
<input type="checkbox" :value="option" v-model="selectedAnswers[index]" />
{{ option }}
</label>
</div>
</div>
<button class="finish-button" @click="finishExam"></button>
<div class="countdown">倒计时: {{ countdown }}</div>
</div>
<div v-else>
<h2 class="end-message">考试结束</h2>
<button class="save-button" @click="saveResults"></button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
questions: [
{
question: "test1",
options: ["testanswer1"],
type: "single",
},
{
question: "test2",
options: ["testanswer2"],
type: "multiple",
},
],
exams: [
{
subject: '计算机组成原理',
major: '软件工程',
grade: '2023',
date: '2024-04-01',
time: '09:00-11:00'
},
],
selectedAnswers: Array(2).fill(null),
countdown: 60,
isExamFinished: false,
};
},
mounted() {
this.startCountdown();
},
methods: {
startCountdown() {
const interval = setInterval(() => {
if (this.countdown > 0) {
this.countdown--;
} else {
clearInterval(interval);
this.isExamFinished = true;
}
}, 1000);
},
finishExam() {
this.isExamFinished = true;
},
saveResults() {
console.log("保存考试结果", this.selectedAnswers);
},
},
};
</script>
<style>
.exam-container {
max-width: 600px;
margin: auto;
padding: 20px;
font-family: Arial, sans-serif;
}
.subject {
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
.question-container {
background: #f9f9f9;
border: 1px solid #ddd;
border-radius: 8px;
padding: 15px;
margin-bottom: 15px;
}
.question-title {
font-size: 18px;
margin: 10px 0;
}
.option-label {
display: block;
margin: 8px 0;
}
.finish-button, .save-button {
background-color: #009688;
color: white;
border: none;
padding: 10px 15px;
border-radius: 5px;
cursor: pointer;
margin-top: 10px;
}
.finish-button:hover, .save-button:hover {
background-color: #00796b;
}
.countdown {
font-size: 16px;
margin-top: 10px;
}
.end-message {
font-size: 22px;
color: #d32f2f;
}
</style>

@ -0,0 +1,190 @@
<template>
<div class="all">
<div>
<!-- 轮播图-->
<el-row class="part1">
<el-col :span="15">
<el-carousel style="height: 400px;margin-top: 50px;" :interval="10000" class="swiper">
<el-carousel-item>
<img style="width: 100%;height:100%;object-fit: contain;" src="../../assets/images/轮播图1.png"
alt="">
</el-carousel-item>
<el-carousel-item>
<img style="width: 100%;height:100%;object-fit: contain;" src="../../assets/images/轮播图2.png"
alt="">
</el-carousel-item>
<el-carousel-item>
<img style="width: 100%;height:100%;object-fit: contain;" src="../../assets/images/轮播图3.jpg"
alt="">
</el-carousel-item>
<el-carousel-item>
<img style="width: 100%;height:100%;object-fit: contain;" src="../../assets/images/轮播图4.jpg"
alt="">
</el-carousel-item>
</el-carousel>
</el-col>
<!-- 温馨提示-->
<el-col :span="9">
<el-card style="height: 400px;overflow-y: auto;" class="card1">
<el-divider><span style="font-size: 20px;">温馨提示</span></el-divider>
<el-text style="text-align: left;">
<p v-for="(tip, index) in tips" :key="index">{{ tip }}</p>
</el-text>
</el-card>
</el-col>
</el-row>
<el-row :gutter="10" style="margin-bottom: 60px;" class="part2">
<!-- 相关咨询-->
<el-col :span="15">
<div>
<el-divider><span style="font-size: 20px;">相关资讯</span></el-divider>
<el-card style="margin-bottom: 10px;" v-for="(news, index) in news" :key="index">
<h2>{{ news.title }}</h2>
<template v-for="(item, idx) in news.content" :key="idx">
<h3>{{ item.heading }}</h3>
<p>{{ item.paragraph }}</p>
</template>
</el-card>
</div>
</el-col>
<!-- 公告栏-->
<el-col :span="9" style="margin-top: 30px;">
<el-card class="announcement-card">
<el-divider><span class="announcement-title">公告栏</span></el-divider>
<div class="announcement-content">
<el-timeline>
<el-timeline-item v-for="(announcement, index) in announcements" :key="index"
:timestamp="announcement.date" placement="top">
<h4 class="announcement-heading">{{ announcement.title }}</h4>
<p class="announcement-message">{{ announcement.message }}</p>
</el-timeline-item>
</el-timeline>
</div>
</el-card>
</el-col>
</el-row>
</div>
</div>
</template>
<script setup>
import {
reactive
} from 'vue';
//
const tips = [
"ExamSphere在线考试系统温馨提示尊敬的用户您好",
"• 请遵守考试规则,诚信应考。",
"• 请确保您的设备(电脑、平板或智能手机)已安装最新版本的浏览器。",
"• 检查您的网络连接是否稳定,以避免考试过程中的中断。",
"• 请提前登录系统,熟悉考试流程和界面。合理分配答题时间,避免在某一题上花费过多时间。",
"• 如遇技术问题,请立即联系我们的技术支持团队。我们的联系方式为:",
"• 考试结束后,我们欢迎您提供反馈,以帮助我们不断改进服务。您可以通过我们的网站或直接联系客服进行反馈。",
"我们祝您考试顺利,并期待为您提供卓越的在线考试体验。",
"ExamSphere让考试更简单让学习更高效。ExamSphere团队敬上"
];
//
const news = [
{
title: "一、最新发展动态",
content: [
{
heading: "技术进步推动系统升级",
paragraph: "在线考试系统正不断融入人工智能、大数据等先进技术,实现智能化组卷、实时监控与防作弊、自动化阅卷与成绩分析等功能。这些技术的引入,不仅提高了考试的公平性和准确性,还大大减轻了教师的工作负担。"
},
{
heading: "市场需求持续增长",
paragraph: "随着远程教育和在线培训的兴起越来越多的教育机构和企业开始采用在线考试系统以满足大规模、高效率的考试需求。根据艾媒咨询的数据中国SaaS行业市场规模持续增长预计在线考试SaaS行业也将迎来快速发展。"
}
]
},
{
title: "二、系统功能特点",
content: [
{
heading: "多样化题型与组卷方式",
paragraph: "在线考试系统支持多种题型,如单选题、多选题、判断题、填空题、简答题等,满足不同考试场景的需求。系统提供多种组卷方式,如固定试卷、抽题试卷、随机试卷等,确保考试的公平性和不确定性。"
},
{
heading: "防作弊措施",
paragraph: "在线考试系统采用人脸识别、行为分析、声音监测等高科技手段,对考生进行实时监控,有效防止作弊行为。这些措施不仅提高了考试的公信力,还为考生创造了更加公平、透明的竞争环境。"
},
{
heading: "智能化阅卷与成绩分析",
paragraph: "对于客观题,系统可以自动根据预设答案进行评分,准确快速。对于主观题,系统提供评分参考和评分标准,帮助教师进行一致性评分。考试结束后,系统能够自动收集和整理考试数据,生成详尽的统计报表,为管理员提供全面的数据支持。"
}
]
}
];
//
const announcements = reactive([{
date: "2024-11-01",
title: "系统升级",
message: "系统将在本周五凌晨进行升级,届时将暂停服务。"
},
{
date: "2024-10-28",
title: "考试规则更新",
message: "请查看新的考试规则,确保遵守相关规定。"
},
{
date: "2024-10-20",
title: "技术支持联系方式",
message: "如遇问题,请联系技术支持团队,联系方式已更新。"
},
])
</script>
<style>
.all {
height: 100%;
width: 100%;
min-width: 1440px;
min-height: 100%;
display: flex;
flex-direction: row;
justify-content: center;
}
.part1 p {
font-size: 14px;
}
.part2 p {
text-indent: 2em;
text-align: left;
}
.announcement-card {
height: 100%;
overflow-y: auto;
padding: 20px;
}
.announcement-title {
font-size: 20px;
font-weight: bold;
}
.announcement-content {
margin-top: 10px;
}
.announcement-heading {
font-size: 16px;
font-weight: bold;
color: #333;
}
.announcement-message {
color: #666;
font-size: 14px;
}
</style>

@ -0,0 +1,118 @@
<template>
<div class="common-layout">
<el-container>
<el-header >
<el-row type="flex" justify="space-between" align="middle" style="min-width: 1440px;">
<div class="title">
<el-menu default-active="1" class="el-menu-horizontal">
<el-text class="logo">ExamSphere</el-text>
<router-link to="/student/home">
<el-menu-item index="1">
首页</el-menu-item>
</router-link>
<router-link to="/student/myExam">
<el-menu-item index="2">我的考试</el-menu-item>
</router-link>
<router-link to="/student/myScore">
<el-menu-item index="3">我的成绩</el-menu-item>
</router-link>
<router-link to="/student/discussion">
<el-menu-item index="4">讨论区</el-menu-item>
</router-link>
<router-link to="/student/personalCenter">
<el-menu-item index="5">个人中心</el-menu-item>
</router-link>
</el-menu>
</div>
<div class="user-info">
<el-text class="user-name">用户{{user.data.username}}</el-text>
<button @click="logout" class="exit">退出</button>
</div>
</el-row>
</el-header>
<el-main>
<router-view></router-view>
</el-main>
</el-container>
</div>
</template>
<script setup>
import { ElMessage } from 'element-plus';
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
const router=useRouter();
const user = reactive(localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null);
const logout=()=>{
router.push("/login")
localStorage.removeItem("user")
ElMessage.success("退出成功")
}
</script>
<style>
.common-layout {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.el-container {
height: 100%;
}
.el-header {
/* background-color: #c3d7df; */
padding: 0 20px;
background-color: #6D7993;
display: flex;
flex-direction: row;
justify-content: center;
}
.el-menu-horizontal {
background-color: transparent;
display: flex;
align-items: center;
border: none;
}
.logo {
font-size: 30px;
color: white;
margin-right: 20px;
}
.el-menu-item {
/* color: #1c2938; */
color: #cee3eb;
font-size: 16px;
}
.el-menu-item:hover {
background-color: #b2cbd2;
}
.title,
.user-info {
display: flex;
align-items: center;
border: 0px;
}
.user-name {
font-size: 16px;
color: white;
}
.el-main{
height: 100%;
background: url("../../assets/背景2.jpg") no-repeat center center;
background-size: cover;
}
.exit{
margin-left: 15px;
}
</style>

@ -0,0 +1,101 @@
<template>
<div class="exam-list">
<h2>考试列表</h2>
<div class="exam-card-container">
<div v-for="(exam, index) in exams" :key="index" class="exam-card">
<el-card style="max-width: 250px" :span="6">
<img
:src="exam.photo"
style="width: 100%"
/>
<div class="message">科目{{exam.subject}}</div>
<div class="message">专业{{exam.major}}</div>
<div class="message">老师{{exam.teacher}}</div>
<div class="message">年级{{exam.grade}}</div>
<div class="message">日期{{exam.date}}</div>
<div class="message">时间{{exam.time}}</div>
<el-button type="primary" @click="goToExam(exam)"></el-button>
</el-card>
</div>
</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router';
const router = useRouter();
//
const exams = [{
subject: '计算机组成原理',
photo: 'https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__480.jpg',
teacher: '张老师',
major: '软件工程',
grade: '2023',
date: '2024-04-01',
time: '09:00-11:00'
},
{
subject: '数据结构',
photo: 'https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__480.jpg',
teacher: '张老师',
major: '数字媒体技术',
grade: '2022',
date: '2024-04-15',
time: '14:00-16:00'
},
{
subject: '计算机网络',
photo: 'https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__480.jpg',
teacher: '张老师',
major: '计算机科学与技术',
grade: '2022',
date: '2024-05-01',
time: '09:00-11:00'
},
{
subject: '操作系统',
photo: 'https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__480.jpg',
teacher: '张老师',
major: '软件工程',
grade: '2023',
date: '2024-05-20',
time: '14:00-16:00'
}
];
//
const goToExam = (exam) => {
router.push({ name: "Exam", params: { exam } });
}
</script>
<style scoped>
.exam-list {
max-width: 1200px;
margin: 30px auto;
padding: 20px;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 8px;
}
.exam-list h2 {
text-align: center;
color: #333;
}
.exam-card-container {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: center;
}
.exam-card {
max-width: 250px;
margin: 10px;
}
</style>

@ -0,0 +1,82 @@
<template>
<h2>我的考试</h2>
<el-container class="grades">
<el-table :data="grades" stripe style="width: 100%">
<el-table-column prop="examDate" label="考试日期" width="180" />
<el-table-column prop="courseName" label="课程名称" width="180" />
<el-table-column prop="score" label="考试分数" />
<el-table-column label="是否及格" width="120">
<template #default="scope">
<span :class="scope.row.passed ? 'passed' : 'not-passed'">
{{ scope.row.passed ? '及格' : '不及格' }}
</span>
</template>
</el-table-column>
</el-table>
</el-container>
</template>
<script>
import { ElTable, ElTableColumn } from 'element-plus';
export default {
components: {
ElTable,
ElTableColumn
},
data() {
return {
grades: [
{
examDate: '2024-04-01',
courseName: '数据结构',
score: 85,
passed: true
},
{
examDate: '2024-04-15',
courseName: '计算机网络',
score: 72,
passed: true
},
{
examDate: '2024-05-01',
courseName: '操作系统',
score: 58,
passed: false
},
{
examDate: '2024-05-20',
courseName: '计算机组成原理',
score: 88,
passed: true
}
]
};
}
};
</script>
<style scoped>
.grades {
max-width: 800px;
height: auto;
margin: 20px auto;
padding: 20px;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 8px;
}
.grades h2 {
text-align: center;
color: #333;
}
.passed {
color: #28a745; /* 绿色 */
}
.not-passed {
color: #dc3545; /* 红色 */
}
</style>

@ -0,0 +1,98 @@
<template>
<el-row class="page">
<el-row class="block-view">
<el-row class="top">
<el-col>
<h2>个人信息</h2>
</el-col>
</el-row>
<el-row class="express-view">
<el-row class="express-no-view">
<el-text class="label">姓名</el-text>
<el-text class="info">{{ adminInfo.name }}</el-text>
</el-row>
<el-row class="express-no-view">
<el-text class="label">账号</el-text>
<el-text class="info">{{ adminInfo.username }}</el-text>
</el-row>
<el-row class="express-no-view">
<el-text class="label">邮箱</el-text>
<el-text class="info">{{ adminInfo.email }}</el-text>
</el-row>
<el-row class="express-no-view">
<el-text class="label">签名</el-text>
<el-text class="info">{{ adminInfo.signature }}</el-text>
</el-row>
</el-row>
</el-row>
</el-row>
</template>
<script setup>
import {
ref
} from 'vue';
const adminInfo = ref({
name: 'yyy',
username: '123',
email: 'admin@example.com',
signature: '致力于教育事业'
});
</script>
<style>
.page {
display: flex;
flex-direction: column;
max-width: 900px;
width: 100%;
background-color: #f9f9f9;
line-height: 24px;
padding: 20px;
border-radius: 8px;
margin: 0 auto;
}
.block-view {
width: 100%;
display: flex;
flex-direction: column;
padding: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
.top {
display: flex;
flex-direction: row;
justify-content: space-between;
padding-bottom: 15px;
color: #333;
}
.express-view {
display: flex;
flex-direction: column;
width: 100%;
}
.express-no-view {
display: flex;
flex-direction: row;
margin: 8px 0;
}
.label {
font-weight: bold;
margin-right: 12px;
color: #555;
font-size: 20px;
}
.info {
font-size: 20px;
color: #444;
}
</style>

@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
})

@ -0,0 +1,470 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/helper-string-parser@^7.24.8":
version "7.24.8"
resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz"
integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
"@babel/helper-validator-identifier@^7.24.7":
version "7.24.7"
resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz"
integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
"@babel/parser@^7.25.3":
version "7.25.6"
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.6.tgz"
integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
dependencies:
"@babel/types" "^7.25.6"
"@babel/types@^7.25.6":
version "7.25.6"
resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz"
integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
dependencies:
"@babel/helper-string-parser" "^7.24.8"
"@babel/helper-validator-identifier" "^7.24.7"
to-fast-properties "^2.0.0"
"@ctrl/tinycolor@^3.4.1":
version "3.6.1"
resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz"
integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
"@element-plus/icons-vue@^2.3.1":
version "2.3.1"
resolved "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
"@esbuild/win32-x64@0.21.5":
version "0.21.5"
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
"@floating-ui/core@^1.6.0":
version "1.6.8"
resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz"
integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
dependencies:
"@floating-ui/utils" "^0.2.8"
"@floating-ui/dom@^1.0.1":
version "1.6.12"
resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz"
integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==
dependencies:
"@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.8"
"@floating-ui/utils@^0.2.8":
version "0.2.8"
resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz"
integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
"@jridgewell/sourcemap-codec@^1.5.0":
version "1.5.0"
resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
version "2.11.7"
resolved "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz"
integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
"@rollup/rollup-win32-x64-msvc@4.21.2":
version "4.21.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz"
integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==
"@types/estree@1.0.5":
version "1.0.5"
resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/lodash-es@*", "@types/lodash-es@^4.17.6":
version "4.17.12"
resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz"
integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
dependencies:
"@types/lodash" "*"
"@types/lodash@*", "@types/lodash@^4.14.182":
version "4.17.13"
resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz"
integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==
"@types/web-bluetooth@^0.0.16":
version "0.0.16"
resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz"
integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
"@vitejs/plugin-vue@^5.1.2":
version "5.1.3"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz"
integrity sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==
"@vue/compiler-core@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.1.tgz"
integrity sha512-WdjF+NSgFYdWttHevHw5uaJFtKPalhmxhlu2uREj8cLP0uyKKIR60/JvSZNTp0x+NSd63iTiORQTx3+tt55NWQ==
dependencies:
"@babel/parser" "^7.25.3"
"@vue/shared" "3.5.1"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.0"
"@vue/compiler-dom@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.1.tgz"
integrity sha512-Ao23fB1lINo18HLCbJVApvzd9OQe8MgmQSgyY5+umbWj2w92w9KykVmJ4Iv2US5nak3ixc2B+7Km7JTNhQ8kSQ==
dependencies:
"@vue/compiler-core" "3.5.1"
"@vue/shared" "3.5.1"
"@vue/compiler-sfc@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.1.tgz"
integrity sha512-DFizMNH8eDglLhlfwJ0+ciBsztaYe3fY/zcZjrqL1ljXvUw/UpC84M1d7HpBTCW68SNqZyIxrs1XWmf+73Y65w==
dependencies:
"@babel/parser" "^7.25.3"
"@vue/compiler-core" "3.5.1"
"@vue/compiler-dom" "3.5.1"
"@vue/compiler-ssr" "3.5.1"
"@vue/shared" "3.5.1"
estree-walker "^2.0.2"
magic-string "^0.30.11"
postcss "^8.4.44"
source-map-js "^1.2.0"
"@vue/compiler-ssr@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.1.tgz"
integrity sha512-C1hpSHQgRM8bg+5XWWD7CkFaVpSn9wZHCLRd10AmxqrH17d4EMP6+XcZpwBOM7H1jeStU5naEapZZWX0kso1tQ==
dependencies:
"@vue/compiler-dom" "3.5.1"
"@vue/shared" "3.5.1"
"@vue/devtools-api@^6.6.4":
version "6.6.4"
resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/reactivity@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.1.tgz"
integrity sha512-aFE1nMDfbG7V+U5vdOk/NXxH/WX78XuAfX59vWmCM7Ao4lieoc83RkzOAWun61sQXlzNZ4IgROovFBHg+Iz1+Q==
dependencies:
"@vue/shared" "3.5.1"
"@vue/runtime-core@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.1.tgz"
integrity sha512-Ce92CCholNRHR3ZtzpRp/7CDGIPFxQ7ElXt9iH91ilK5eOrUv3Z582NWJesuM3aYX71BujVG5/4ypUxigGNxjA==
dependencies:
"@vue/reactivity" "3.5.1"
"@vue/shared" "3.5.1"
"@vue/runtime-dom@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.1.tgz"
integrity sha512-B/fUJfBLp5PwE0EWNfBYnA4JUea8Yufb3wN8fN0/HzaqBdkiRHh4sFHOjWqIY8GS75gj//8VqeEqhcU6yUjIkA==
dependencies:
"@vue/reactivity" "3.5.1"
"@vue/runtime-core" "3.5.1"
"@vue/shared" "3.5.1"
csstype "^3.1.3"
"@vue/server-renderer@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.1.tgz"
integrity sha512-C5V/fjQTitgVaRNH5wCoHynaWysjZ+VH68drNsAvQYg4ArHsZUQNz0nHoEWRj41nzqkVn2RUlnWaEOTl2o1Ppg==
dependencies:
"@vue/compiler-ssr" "3.5.1"
"@vue/shared" "3.5.1"
"@vue/shared@3.5.1":
version "3.5.1"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.1.tgz"
integrity sha512-NdcTRoO4KuW2RSFgpE2c+E/R/ZHaRzWPxAGxhmxZaaqLh6nYCXx7lc9a88ioqOCxCaV2SFJmujkxbUScW7dNsQ==
"@vueuse/core@^9.1.0":
version "9.13.0"
resolved "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz"
integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
dependencies:
"@types/web-bluetooth" "^0.0.16"
"@vueuse/metadata" "9.13.0"
"@vueuse/shared" "9.13.0"
vue-demi "*"
"@vueuse/metadata@9.13.0":
version "9.13.0"
resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz"
integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
"@vueuse/shared@9.13.0":
version "9.13.0"
resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz"
integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
dependencies:
vue-demi "*"
async-validator@^4.2.5:
version "4.2.5"
resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz"
integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
axios@^1.7.7:
version "1.7.7"
resolved "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz"
integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
dayjs@^1.11.3:
version "1.11.13"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
element-plus@^2.8.6:
version "2.8.6"
resolved "https://registry.npmjs.org/element-plus/-/element-plus-2.8.6.tgz"
integrity sha512-fk5jB8V3efM02/4roZ5SWOLArgaYXbxEydZLlXSr+KPAwjNyHBlk2+HO5em8YKo5+RLBoHnn6BaThj6IE4nXoQ==
dependencies:
"@ctrl/tinycolor" "^3.4.1"
"@element-plus/icons-vue" "^2.3.1"
"@floating-ui/dom" "^1.0.1"
"@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7"
"@types/lodash" "^4.14.182"
"@types/lodash-es" "^4.17.6"
"@vueuse/core" "^9.1.0"
async-validator "^4.2.5"
dayjs "^1.11.3"
escape-html "^1.0.3"
lodash "^4.17.21"
lodash-es "^4.17.21"
lodash-unified "^1.0.2"
memoize-one "^6.0.0"
normalize-wheel-es "^1.2.0"
entities@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
esbuild@^0.21.3:
version "0.21.5"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz"
integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
optionalDependencies:
"@esbuild/aix-ppc64" "0.21.5"
"@esbuild/android-arm" "0.21.5"
"@esbuild/android-arm64" "0.21.5"
"@esbuild/android-x64" "0.21.5"
"@esbuild/darwin-arm64" "0.21.5"
"@esbuild/darwin-x64" "0.21.5"
"@esbuild/freebsd-arm64" "0.21.5"
"@esbuild/freebsd-x64" "0.21.5"
"@esbuild/linux-arm" "0.21.5"
"@esbuild/linux-arm64" "0.21.5"
"@esbuild/linux-ia32" "0.21.5"
"@esbuild/linux-loong64" "0.21.5"
"@esbuild/linux-mips64el" "0.21.5"
"@esbuild/linux-ppc64" "0.21.5"
"@esbuild/linux-riscv64" "0.21.5"
"@esbuild/linux-s390x" "0.21.5"
"@esbuild/linux-x64" "0.21.5"
"@esbuild/netbsd-x64" "0.21.5"
"@esbuild/openbsd-x64" "0.21.5"
"@esbuild/sunos-x64" "0.21.5"
"@esbuild/win32-arm64" "0.21.5"
"@esbuild/win32-ia32" "0.21.5"
"@esbuild/win32-x64" "0.21.5"
escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
follow-redirects@^1.15.6:
version "1.15.9"
resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz"
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
form-data@^4.0.0:
version "4.0.1"
resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz"
integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
lodash-es@*, lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash-unified@^1.0.2:
version "1.0.3"
resolved "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz"
integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
lodash@*, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
magic-string@^0.30.11:
version "0.30.11"
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz"
integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
normalize-wheel-es@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz"
integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
picocolors@^1.0.1:
version "1.1.0"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz"
integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
postcss@^8.4.43, postcss@^8.4.44:
version "8.4.45"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.45.tgz"
integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.1"
source-map-js "^1.2.0"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
rollup@^4.20.0:
version "4.21.2"
resolved "https://registry.npmmirror.com/rollup/-/rollup-4.21.2.tgz"
integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==
dependencies:
"@types/estree" "1.0.5"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.21.2"
"@rollup/rollup-android-arm64" "4.21.2"
"@rollup/rollup-darwin-arm64" "4.21.2"
"@rollup/rollup-darwin-x64" "4.21.2"
"@rollup/rollup-linux-arm-gnueabihf" "4.21.2"
"@rollup/rollup-linux-arm-musleabihf" "4.21.2"
"@rollup/rollup-linux-arm64-gnu" "4.21.2"
"@rollup/rollup-linux-arm64-musl" "4.21.2"
"@rollup/rollup-linux-powerpc64le-gnu" "4.21.2"
"@rollup/rollup-linux-riscv64-gnu" "4.21.2"
"@rollup/rollup-linux-s390x-gnu" "4.21.2"
"@rollup/rollup-linux-x64-gnu" "4.21.2"
"@rollup/rollup-linux-x64-musl" "4.21.2"
"@rollup/rollup-win32-arm64-msvc" "4.21.2"
"@rollup/rollup-win32-ia32-msvc" "4.21.2"
"@rollup/rollup-win32-x64-msvc" "4.21.2"
fsevents "~2.3.2"
source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
vite@^5.0.0, vite@^5.4.1:
version "5.4.3"
resolved "https://registry.npmmirror.com/vite/-/vite-5.4.3.tgz"
integrity sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==
dependencies:
esbuild "^0.21.3"
postcss "^8.4.43"
rollup "^4.20.0"
optionalDependencies:
fsevents "~2.3.3"
vue-demi@*:
version "0.14.10"
resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz"
integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
vue-router@4:
version "4.4.5"
resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz"
integrity sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==
dependencies:
"@vue/devtools-api" "^6.6.4"
"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.4.37, vue@3.5.1:
version "3.5.1"
resolved "https://registry.npmmirror.com/vue/-/vue-3.5.1.tgz"
integrity sha512-k4UNnbPOEskodSxMtv+B9GljdB0C9ubZDOmW6vnXVGIfMqmEsY2+ohasjGguhGkMkrcP/oOrbH0dSD41x5JQFw==
dependencies:
"@vue/compiler-dom" "3.5.1"
"@vue/compiler-sfc" "3.5.1"
"@vue/runtime-dom" "3.5.1"
"@vue/server-renderer" "3.5.1"
"@vue/shared" "3.5.1"
Loading…
Cancel
Save