diff --git a/AES-front/src/api/user.js b/AES-front/src/api/user.js index 9c4b3e7..9797a05 100644 --- a/AES-front/src/api/user.js +++ b/AES-front/src/api/user.js @@ -24,6 +24,8 @@ export default { //×÷ҵÌâĿ²¿·Ö - getExamList: (config) =>request.get('/problem/getExamList',config)//ѧÉú»ñȡ×÷ҵÁбí + getExamList: (config) => request.get('/problem/getExamList',config),//ѧÉú»ñȡ×÷ҵÁбí + + getStudentRank:(config) => request.get('/problem/getStudentRank', config),//»ñȡѧÉúµ±ǰ±¨¸æ³ɼ¨ÅÅÃû } diff --git a/AES-front/src/main.js b/AES-front/src/main.js index 3e4497c..7110bbc 100644 --- a/AES-front/src/main.js +++ b/AES-front/src/main.js @@ -3,7 +3,8 @@ import '@/styles/reset.css' import 'uno.css' import '@/styles/global.scss' import 'virtual:svg-icons-register' - +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' import { createApp } from 'vue' import { setupRouter } from '@/router' import { setupStore } from '@/store' @@ -21,6 +22,7 @@ async function setupApp() { await setupRouter(app) app.use(dispatchEventStrage) + app.use(ElementPlus) app.mount('#app') } diff --git a/AES-front/src/views/user/exam-list/index.vue b/AES-front/src/views/user/exam-list/index.vue index 704df52..5e9c96d 100644 --- a/AES-front/src/views/user/exam-list/index.vue +++ b/AES-front/src/views/user/exam-list/index.vue @@ -39,54 +39,42 @@ const paginationReactive = reactive({ }) const onStartExam = async (exam) => {//点击进入控件的逻辑 - const { status, id, type } = exam + const { id } = exam try { - await api.addExamInfo({ id }) - if (type == 'iTraining') { - router.push({ name: 'TrainingIndex', params: { examId: id } }) - } else { - router.push({ name: 'ContestIndex', params: { examId: id } }) - } + // await api.addExamInfo({ id }) + const examId = exam.id + router.push({ name: 'ReportSubmit', params: { examId } }) + } catch (err) { console.log(err) } } const onViewScore = (exam) => {//点击成绩控件的逻辑 - var trainingViewScore = '' - if (exam.type == 'iTraining') { - trainingViewScore = 'iTraining' - } else { - trainingViewScore = exam.studentViewScore - } + // var trainingViewScore = '' + // if (exam.type == 'iTraining') { //貌似是?测试模式 + // trainingViewScore = 'iTraining' + // } else { + // trainingViewScore = exam.studentViewScore + // } + const examId = exam.id - const problemNum = exam.problemNum - switch (trainingViewScore) { - case 'System': - if (parseInt(problemNum) <= 10) { - router.push({ name: 'ContestScoreRankStatus', params: { examId }, query: { fromclient: false } }) - } else { - router.push({ name: 'ContestScoreTop10', params: { examId }, query: { fromclient: false } }) - } - break - case 'RankAndStatus': - router.push({ name: 'ContestScoreRankStatus', params: { examId }, query: { fromclient: false } }) - break - case 'OnlyRank': - router.push({ name: 'ContestScoreOnlyRank', params: { examId }, query: { fromclient: false } }) - break - case 'Top10': - router.push({ name: 'ContestScoreTop10', params: { examId }, query: { fromclient: false } }) - break - case 'iTraining': - router.push({ name: 'TrainingScoreTrainRank', params: { examId }, query: { fromclient: false } }) - break - case 'NoScorePage': - $message.warning("当前作业不能查看成绩"); - break - default: - } + + router.push({ name: 'UserScoreAndRank', params: { examId }, query: { fromclient: false } }); + + // switch (trainingViewScore) { + // case 'NewScorePage': // 直接转向成绩排名页面 + // router.push({ name: 'UserScoreAndRank', params: { examId }, query: { fromclient: false } }); + // break + // case 'iTraining': + // router.push({ name: 'TrainingScoreTrainRank', params: { examId }, query: { fromclient: false } }) + // break + // case 'NoScorePage': + // $message.warning("当前作业不能查看成绩"); + // break + // default: + // } } @@ -153,7 +141,6 @@ const columns = [ ] - const queryByPage = async (currentPage) => {//进入页面加载逻辑 loading.value = true //先清理所有定时器 diff --git a/AES-front/src/views/user/report-submit/index.vue b/AES-front/src/views/user/report-submit/index.vue new file mode 100644 index 0000000..e7a1ac6 --- /dev/null +++ b/AES-front/src/views/user/report-submit/index.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/AES-front/src/views/user/route.js b/AES-front/src/views/user/route.js index 27ddaca..ceea9d3 100644 --- a/AES-front/src/views/user/route.js +++ b/AES-front/src/views/user/route.js @@ -112,5 +112,31 @@ export default { keepAlive: true, }, }, + { + name: 'ReportSubmit', + path: 'report-submit', + component: () => import('./report-submit/index.vue'), + meta: { + title: '作业详情', + icon: 'ic:baseline-table-view', + role: ['student', 'teacher', 'admin'], + requireAuth: true, + keepAlive: true, + + }, + }, + { + name: 'UserScoreAndRank', + path: 'score-rank/:examId', + component: () => import('./score-rank/index.vue'), + meta: { + title: '作业成绩', + icon: 'ic:baseline-table-view', + role: ['student', 'teacher', 'admin'], + requireAuth: true, + keepAlive: true, + + }, + }, ], } diff --git a/AES-front/src/views/user/score-rank/components/class-score.vue b/AES-front/src/views/user/score-rank/components/class-score.vue new file mode 100644 index 0000000..5f29802 --- /dev/null +++ b/AES-front/src/views/user/score-rank/components/class-score.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/AES-front/src/views/user/score-rank/components/personal-rank.vue b/AES-front/src/views/user/score-rank/components/personal-rank.vue new file mode 100644 index 0000000..476347f --- /dev/null +++ b/AES-front/src/views/user/score-rank/components/personal-rank.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/AES-front/src/views/user/score-rank/index.vue b/AES-front/src/views/user/score-rank/index.vue new file mode 100644 index 0000000..129082e --- /dev/null +++ b/AES-front/src/views/user/score-rank/index.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java b/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java index 2145a1a..0ed5cbe 100644 --- a/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java +++ b/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java @@ -22,7 +22,6 @@ public class HttpInterceptorConfig extends WebMvcConfigurationSupport { .excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser", "/api/user" + "/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo", - "/api/problem/getExamList", "/api/adminusers" + "/signTeacher", "/api/adminusers" + diff --git a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java index 0332476..84def37 100644 --- a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java +++ b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java @@ -207,5 +207,18 @@ public class ProblemController { } } - + //根据作业id和学生id获取学生当前报告成绩排名 + @GetMapping("/getStudentRank") + public RespBean getStudentRank(Integer examId,HttpServletRequest request){ + DecodeToken decodeToken = new DecodeToken(request); + String UserId = decodeToken.getUserId(); + int userId=Integer.parseInt(UserId); + UReportSubmitted ureportsubmitted= + problemServiceI.findScoreAndRankByIds(examId,userId); + if (ureportsubmitted != null) { + return RespBean.ok("查询成绩排名成功!",ureportsubmitted); + } else { + return RespBean.error("查询成绩排名失败!"); + } + } } diff --git a/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java b/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java index 4dbf5dc..067083c 100644 --- a/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java +++ b/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java @@ -1,10 +1,7 @@ package com.example.aes.problem.dao; -import com.example.aes.problem.model.PMProblem; -import com.example.aes.problem.model.PMScoringRubric; -import com.example.aes.problem.model.Problem; -import com.example.aes.problem.model.ReportSubmitted; +import com.example.aes.problem.model.*; import com.example.aes.user.dao.BaseDaoI; import com.example.aes.user.model.Classstudents; import com.example.aes.user.model.Course; @@ -22,6 +19,9 @@ public interface ProblemDaoI extends BaseDaoI { List findPMProblemStatusesByStudentIdAndProblemsIds(List problemIds, Integer studentId); + UReportSubmitted getScoreAndRankByIds(int problemId, int userId); + + public String findProblemByTitle(String title); public String findProblemByTitle(String title,Integer id); public List findProblemIdByTitle(String title); @@ -33,4 +33,5 @@ public interface ProblemDaoI extends BaseDaoI { public boolean editProblem(String title, String description,Integer id); public void deleteProblem(Integer id); + } diff --git a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java index feb1982..20511b5 100644 --- a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java +++ b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java @@ -2,10 +2,7 @@ package com.example.aes.problem.dao.impl; import cn.hutool.poi.excel.cell.CellSetter; import com.example.aes.problem.dao.ProblemDaoI; -import com.example.aes.problem.model.PMProblem; -import com.example.aes.problem.model.PMScoringRubric; -import com.example.aes.problem.model.Problem; -import com.example.aes.problem.model.ReportSubmitted; +import com.example.aes.problem.model.*; import com.example.aes.problem.model.ReportSubmitted; import com.example.aes.user.dao.BaseDaoI; import com.example.aes.user.dao.impl.BaseDaoImpl; @@ -101,6 +98,24 @@ public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ } + @Override //根据作业id和学生id获取学生当前报告成绩排名 + public UReportSubmitted getScoreAndRankByIds(int problemId, int userId) { + + String sql = "SELECT sr.*, p.title " + + "FROM submitreport sr " + + "JOIN problem p ON sr.problemId = p.id " + + "WHERE sr.studentId = ? AND sr.problemId = ?"; + + List queryResults = jdbcTemplate.query( + sql, + new Object[]{userId, problemId}, + new BeanPropertyRowMapper<>(UReportSubmitted.class) + ); + + // 查询假定只有唯一一条数据,返回第一条记录 + return queryResults.isEmpty() ? null : queryResults.get(0); + } + @Override public String findProblemByTitle(String title){ diff --git a/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java b/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java new file mode 100644 index 0000000..cd5bba7 --- /dev/null +++ b/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java @@ -0,0 +1,13 @@ +package com.example.aes.problem.model; + +import lombok.Data; + +@Data +//继承ReportSubmitted子类,用于学生成绩查询页面 +public class UReportSubmitted extends ReportSubmitted implements java.io.Serializable{ + String title;//作业标题 + int StudentId;//学生id + String StudentNo;//学号 + + int rank;//排名 +} diff --git a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java index 818fac1..abfeef5 100644 --- a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java +++ b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java @@ -168,6 +168,11 @@ public class ProblemServiceImpl implements ProblemServiceI { } } } + @Override //根据作业id和学生id获取学生当前报告成绩排名 + public UReportSubmitted findScoreAndRankByIds(int problemId, int userId) { + UReportSubmitted uReportSubmitted = problemDao.getScoreAndRankByIds(problemId, userId); + return uReportSubmitted; + } @Override public List findStandardIdNoProblemId(){ diff --git a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java index 3c1cca9..0ade6a4 100644 --- a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java +++ b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java @@ -37,4 +37,6 @@ public interface ProblemServiceI { DataGrid dataGrid(List pMproblems, PMProblem pMproblem); public void findStatusByStudentIdAndProblems(Integer studentId, List pMproblems); + + UReportSubmitted findScoreAndRankByIds(int ProblemId, int userId); } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..877f368 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "AUTO_SCORE", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..42451a2 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "element-plus": "^2.9.7" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..3ba8845 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,376 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + element-plus: + specifier: ^2.9.7 + version: 2.9.7(vue@3.5.13) + +packages: + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + element-plus@2.9.7: + resolution: {integrity: sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==} + peerDependencies: + vue: ^3.2.0 + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.10': + dependencies: + '@babel/types': 7.26.10 + + '@babel/types@7.26.10': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.5.13)': + dependencies: + vue: 3.5.13 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@sxzz/popperjs-es@2.11.7': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} + + '@types/web-bluetooth@0.0.16': {} + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.10 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.10 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13)': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13 + + '@vue/shared@3.5.13': {} + + '@vueuse/core@9.13.0(vue@3.5.13)': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13) + vue-demi: 0.14.10(vue@3.5.13) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@9.13.0(vue@3.5.13)': + dependencies: + vue-demi: 0.14.10(vue@3.5.13) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + async-validator@4.2.5: {} + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + element-plus@2.9.7(vue@3.5.13): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13) + '@floating-ui/dom': 1.6.13 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.16 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.13 + transitivePeerDependencies: + - '@vue/composition-api' + + entities@4.5.0: {} + + escape-html@1.0.3: {} + + estree-walker@2.0.2: {} + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash@4.17.21: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + memoize-one@6.0.0: {} + + nanoid@3.3.11: {} + + normalize-wheel-es@1.2.0: {} + + picocolors@1.1.1: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + source-map-js@1.2.1: {} + + vue-demi@0.14.10(vue@3.5.13): + dependencies: + vue: 3.5.13 + + vue@3.5.13: + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13) + '@vue/shared': 3.5.13