完成学生作业成绩查询页面一半左右部分,优化删除了部分不需要的路由(自己之前写的)

由于部分页面设计调用了ElementUI库,在拉取代码后请记得重新下载新的依赖:
控制台输入pnpm i即可。
This commit is contained in:
musteven 2025-03-23 22:18:14 +08:00
parent 17213b11e7
commit 4903141e28
18 changed files with 734 additions and 52 deletions

View File

@ -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),//获取学生当前报告成绩排名
} }

View File

@ -3,7 +3,8 @@ import '@/styles/reset.css'
import 'uno.css' import 'uno.css'
import '@/styles/global.scss' import '@/styles/global.scss'
import 'virtual:svg-icons-register' import 'virtual:svg-icons-register'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { createApp } from 'vue' import { createApp } from 'vue'
import { setupRouter } from '@/router' import { setupRouter } from '@/router'
import { setupStore } from '@/store' import { setupStore } from '@/store'
@ -21,6 +22,7 @@ async function setupApp() {
await setupRouter(app) await setupRouter(app)
app.use(dispatchEventStrage) app.use(dispatchEventStrage)
app.use(ElementPlus)
app.mount('#app') app.mount('#app')
} }

View File

@ -39,54 +39,42 @@ const paginationReactive = reactive({
}) })
const onStartExam = async (exam) => {//点击进入控件的逻辑 const onStartExam = async (exam) => {//点击进入控件的逻辑
const { status, id, type } = exam const { id } = exam
try { try {
await api.addExamInfo({ id }) // await api.addExamInfo({ id })
if (type == 'iTraining') { const examId = exam.id
router.push({ name: 'TrainingIndex', params: { examId: id } }) router.push({ name: 'ReportSubmit', params: { examId } })
} else {
router.push({ name: 'ContestIndex', params: { examId: id } })
}
} catch (err) { } catch (err) {
console.log(err) console.log(err)
} }
} }
const onViewScore = (exam) => {//点击成绩控件的逻辑 const onViewScore = (exam) => {//点击成绩控件的逻辑
var trainingViewScore = '' // var trainingViewScore = ''
if (exam.type == 'iTraining') { // if (exam.type == 'iTraining') { //貌似是?测试模式
trainingViewScore = 'iTraining' // trainingViewScore = 'iTraining'
} else { // } else {
trainingViewScore = exam.studentViewScore // trainingViewScore = exam.studentViewScore
} // }
const examId = exam.id const examId = exam.id
const problemNum = exam.problemNum
switch (trainingViewScore) { router.push({ name: 'UserScoreAndRank', params: { examId }, query: { fromclient: false } });
case 'System':
if (parseInt(problemNum) <= 10) { // switch (trainingViewScore) {
router.push({ name: 'ContestScoreRankStatus', params: { examId }, query: { fromclient: false } }) // case 'NewScorePage': // 直接转向成绩排名页面
} else { // router.push({ name: 'UserScoreAndRank', params: { examId }, query: { fromclient: false } });
router.push({ name: 'ContestScoreTop10', params: { examId }, query: { fromclient: false } }) // break
} // case 'iTraining':
break // router.push({ name: 'TrainingScoreTrainRank', params: { examId }, query: { fromclient: false } })
case 'RankAndStatus': // break
router.push({ name: 'ContestScoreRankStatus', params: { examId }, query: { fromclient: false } }) // case 'NoScorePage':
break // $message.warning("当前作业不能查看成绩");
case 'OnlyRank': // break
router.push({ name: 'ContestScoreOnlyRank', params: { examId }, query: { fromclient: false } }) // default:
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:
}
} }
@ -153,7 +141,6 @@ const columns = [
] ]
const queryByPage = async (currentPage) => {//进入页面加载逻辑 const queryByPage = async (currentPage) => {//进入页面加载逻辑
loading.value = true loading.value = true
//先清理所有定时器 //先清理所有定时器

View File

@ -0,0 +1,92 @@
<template>
<p>Basic link button</p>
<div class="mb-4">
<el-button
v-for="button in buttons"
:key="button.text"
:type="button.type"
link
>
{{ button.text }}
</el-button>
</div>
<p>Disabled link button</p>
<div>
<el-button
v-for="button in buttons"
:key="button.text"
:type="button.type"
link
disabled
>
{{ button.text }}
</el-button>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import api from '@/api/user';
import {useRoute} from 'vue-router';
const route = useRoute()
const { examId } = route.params
const loading = ref(true);
const examScores = ref([]);
const examName = ref("");
const notifyMsg = ref("");
const paginationReactive = reactive({
page: 1,
pageSize: 50,
showSizePicker: true,
pageSizes: [50, 100, 150],
itemCount: 0,
prefix: () => {
return '查询出 ' + total + '条记录';
},
onChange: (page) => {
paginationReactive.page = page;
queryExamScores()
},
onUpdatePageSize: (pageSize) => {
paginationReactive.pageSize = pageSize;
paginationReactive.page = 1;
queryExamScores()
}
});
// 列配置
const columns = [
// ... 列配置
];
// 查询成绩的函数
const queryExamScores = async () => {
// ... 查询逻辑
};
// 行键函数
const rowKey = (rowData) => {
return rowData.id;
};
// 生命周期钩子
onMounted(() => {
console.log('Received examId:', examId); // 输出接收到的 examId
// ... 挂载逻辑
});
const buttons = [
{ type: '', text: 'plain' },
{ type: 'primary', text: 'primary' },
{ type: 'success', text: 'success' },
{ type: 'info', text: 'info' },
{ type: 'warning', text: 'warning' },
{ type: 'danger', text: 'danger' },
]
</script>
<style scoped>
/* 样式可以根据需要添加 */
</style>

View File

@ -112,5 +112,31 @@ export default {
keepAlive: true, 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,
},
},
], ],
} }

View File

@ -0,0 +1,11 @@
<template>
<p>此处布置班级排名表格</p>
</template>
<script>
</script>
<style scoped>
</style>

View File

@ -0,0 +1,97 @@
<template xmlns:dark="http://www.w3.org/1999/xhtml">
<div class="page-content">
<h2 class="title">
{{ title }}成绩列表
</h2>
<div class="score-info">
<p class="personal-score">个人成绩:</p>
<p>成绩:{{ score }}</p>
<p>排名:{{ rank }}</p>
</div>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import api from '@/api/user';
import {useRoute} from 'vue-router';
const route = useRoute()
const examId = route.params.examId;
const title = ref(""); // 从API获取的作业名称
const score = ref(0); // 个人得分
const rank = ref(0); // 个人排名
const paginationReactive = reactive({
page: 1,
pageSize: 50,
showSizePicker: true,
pageSizes: [50, 100, 150],
itemCount: 0,
prefix: () => {
return '查询出 ' + total + '条记录';
},
onChange: (page) => {
paginationReactive.page = page;
queryExamScores()
},
onUpdatePageSize: (pageSize) => {
paginationReactive.pageSize = pageSize;
paginationReactive.page = 1;
queryExamScores()
}
});
// 列配置
const columns = [
// ... 列配置
];
// 查询个人成绩的函数
const queryExamScores = async () => {
const res = await api.getStudentRank({
params: { examId }
});
title.value = res.data.title; // 更新作业名称
score.value = res.data.score; // 更新个人得分
rank.value = res.data.rank; // 更新个人排名
};
// 行键函数
const rowKey = (rowData) => {
return rowData.id;
};
// 生命周期钩子
onMounted(() => {
queryExamScores(); // 挂载时查询成绩
});
</script>
<style scoped>
.page-content {
width: 40%;
margin-left: 15px;
}
.title {
padding-left: 0px;
font-size: 22px;
font-weight: normal;
color: #333;
margin-bottom: 20px;
}
.score-info {
text-align: left;
}
.score-info p {
margin: 10px 0;
}
.score-info .personal-score {
font-size: 18px; /* 更大的字体大小 */
}
</style>

View File

@ -0,0 +1,30 @@
<template>
<CommonPage show-footer :show-header="false">
<div class="layout-container">
<UserPersonalRank class="personal-rank" />
<ClassScore class="class-score" />
</div>
</CommonPage>
</template>
<script setup>
import UserPersonalRank from '@/views/user/score-rank/components/personal-rank.vue'
import ClassScore from '@/views/user/score-rank/components/class-score.vue'
</script>
<style scoped>
.layout-container {
display: flex; /* 使用 Flexbox 布局 */
height: 100%; /* 设置容器高度为 100% */
}
.personal-rank {
flex: 0 0 40%; /* UserPersonalRank 占据 40% 的空间 */
/* 其他样式,例如 padding, margin 等 */
}
.class-score {
flex: 0 0 60%; /* ClassScore 占据 60% 的空间 */
/* 其他样式,例如 padding, margin 等 */
}
</style>

View File

@ -22,7 +22,6 @@ public class HttpInterceptorConfig extends WebMvcConfigurationSupport {
.excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser", .excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser",
"/api/user" + "/api/user" +
"/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo", "/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo",
"/api/problem/getExamList",
"/api/adminusers" + "/api/adminusers" +
"/signTeacher", "/signTeacher",
"/api/adminusers" + "/api/adminusers" +

View File

@ -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("查询成绩排名失败!");
}
}
} }

View File

@ -1,10 +1,7 @@
package com.example.aes.problem.dao; package com.example.aes.problem.dao;
import com.example.aes.problem.model.PMProblem; import com.example.aes.problem.model.*;
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.user.dao.BaseDaoI; import com.example.aes.user.dao.BaseDaoI;
import com.example.aes.user.model.Classstudents; import com.example.aes.user.model.Classstudents;
import com.example.aes.user.model.Course; import com.example.aes.user.model.Course;
@ -22,6 +19,9 @@ public interface ProblemDaoI extends BaseDaoI<Problem> {
List<ReportSubmitted> findPMProblemStatusesByStudentIdAndProblemsIds(List<Integer> problemIds, Integer studentId); List<ReportSubmitted> findPMProblemStatusesByStudentIdAndProblemsIds(List<Integer> problemIds, Integer studentId);
UReportSubmitted getScoreAndRankByIds(int problemId, int userId);
public String findProblemByTitle(String title); public String findProblemByTitle(String title);
public String findProblemByTitle(String title,Integer id); public String findProblemByTitle(String title,Integer id);
public List<Problem> findProblemIdByTitle(String title); public List<Problem> findProblemIdByTitle(String title);
@ -33,4 +33,5 @@ public interface ProblemDaoI extends BaseDaoI<Problem> {
public boolean editProblem(String title, public boolean editProblem(String title,
String description,Integer id); String description,Integer id);
public void deleteProblem(Integer id); public void deleteProblem(Integer id);
} }

View File

@ -2,10 +2,7 @@ package com.example.aes.problem.dao.impl;
import cn.hutool.poi.excel.cell.CellSetter; import cn.hutool.poi.excel.cell.CellSetter;
import com.example.aes.problem.dao.ProblemDaoI; import com.example.aes.problem.dao.ProblemDaoI;
import com.example.aes.problem.model.PMProblem; import com.example.aes.problem.model.*;
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.ReportSubmitted; import com.example.aes.problem.model.ReportSubmitted;
import com.example.aes.user.dao.BaseDaoI; import com.example.aes.user.dao.BaseDaoI;
import com.example.aes.user.dao.impl.BaseDaoImpl; import com.example.aes.user.dao.impl.BaseDaoImpl;
@ -101,6 +98,24 @@ public class ProblemDaoImpl extends BaseDaoImpl<Problem> 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<UReportSubmitted> queryResults = jdbcTemplate.query(
sql,
new Object[]{userId, problemId},
new BeanPropertyRowMapper<>(UReportSubmitted.class)
);
// 查询假定只有唯一一条数据,返回第一条记录
return queryResults.isEmpty() ? null : queryResults.get(0);
}
@Override @Override
public String findProblemByTitle(String title){ public String findProblemByTitle(String title){

View File

@ -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;//排名
}

View File

@ -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 @Override
public List<ScoringStandard> findStandardIdNoProblemId(){ public List<ScoringStandard> findStandardIdNoProblemId(){

View File

@ -37,4 +37,6 @@ public interface ProblemServiceI {
DataGrid dataGrid(List<PMProblem> pMproblems, PMProblem pMproblem); DataGrid dataGrid(List<PMProblem> pMproblems, PMProblem pMproblem);
public void findStatusByStudentIdAndProblems(Integer studentId, List<PMProblem> pMproblems); public void findStatusByStudentIdAndProblems(Integer studentId, List<PMProblem> pMproblems);
UReportSubmitted findScoreAndRankByIds(int ProblemId, int userId);
} }

6
package-lock.json generated Normal file
View File

@ -0,0 +1,6 @@
{
"name": "AUTO_SCORE",
"lockfileVersion": 2,
"requires": true,
"packages": {}
}

5
package.json Normal file
View File

@ -0,0 +1,5 @@
{
"dependencies": {
"element-plus": "^2.9.7"
}
}

376
pnpm-lock.yaml Normal file
View File

@ -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