From 465d4d7b4aa7d063db87c2637db7885c2cbae394 Mon Sep 17 00:00:00 2001 From: MomoWen Date: Fri, 19 Dec 2025 00:58:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=98=E5=BA=93=E5=AF=BC=E5=85=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=8C=E6=88=90=EF=BC=8C=E8=80=83=E8=AF=95=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controllers/adminController.ts | 19 + api/controllers/adminUserController.ts | 61 +++ api/controllers/examTaskController.ts | 25 ++ api/controllers/quizController.ts | 151 ++++++- api/controllers/userController.ts | 35 ++ api/models/examTask.ts | 290 ++++++++++++-- api/models/question.ts | 39 +- api/models/questionCategory.ts | 51 ++- api/models/quiz.ts | 31 +- api/models/user.ts | 74 +++- api/server.ts | 9 +- data/survey.db | Bin 229376 -> 516096 bytes data/~$题库导出_1766067180492.xlsx | Bin 0 -> 165 bytes data/题库导出_1766067180492.xlsx | Bin 0 -> 23255 bytes .../fix-quizpage-useeffect-bug/proposal.md | 13 + .../specs/quiz/spec.md | 17 + .../fix-quizpage-useeffect-bug/tasks.md | 8 + src/layouts/AdminLayout.tsx | 6 +- src/pages/HomePage.tsx | 44 ++- src/pages/admin/AdminDashboardPage.tsx | 150 ++++++- src/pages/admin/AdminLoginPage.tsx | 97 ++++- src/pages/admin/ExamSubjectPage.tsx | 333 ++++++++++++++-- src/pages/admin/ExamTaskPage.tsx | 115 +++++- src/pages/admin/QuestionCategoryPage.tsx | 21 +- src/pages/admin/QuizConfigPage.tsx | 66 ++-- src/pages/admin/UserManagePage.tsx | 369 ++++++++++++++++-- src/services/api.ts | 4 +- 27 files changed, 1851 insertions(+), 177 deletions(-) create mode 100644 data/~$题库导出_1766067180492.xlsx create mode 100644 data/题库导出_1766067180492.xlsx create mode 100644 openspec/changes/fix-quizpage-useeffect-bug/proposal.md create mode 100644 openspec/changes/fix-quizpage-useeffect-bug/specs/quiz/spec.md create mode 100644 openspec/changes/fix-quizpage-useeffect-bug/tasks.md diff --git a/api/controllers/adminController.ts b/api/controllers/adminController.ts index a3b99d8..fc6b164 100644 --- a/api/controllers/adminController.ts +++ b/api/controllers/adminController.ts @@ -105,6 +105,25 @@ export class AdminController { } } + // 获取活跃任务统计数据 + static async getActiveTasksStats(req: Request, res: Response) { + try { + const { ExamTaskModel } = await import('../models/examTask'); + const stats = await ExamTaskModel.getActiveTasksWithStats(); + + res.json({ + success: true, + data: stats + }); + } catch (error: any) { + console.error('获取活跃任务统计数据失败:', error); + res.status(500).json({ + success: false, + message: error.message || '获取活跃任务统计数据失败' + }); + } + } + // 修改管理员密码 static async updatePassword(req: Request, res: Response) { try { diff --git a/api/controllers/adminUserController.ts b/api/controllers/adminUserController.ts index ec7d9c9..a7fe3fb 100644 --- a/api/controllers/adminUserController.ts +++ b/api/controllers/adminUserController.ts @@ -83,6 +83,67 @@ export class AdminUserController { } } + // 更新用户信息 + static async updateUser(req: Request, res: Response) { + try { + const { id } = req.params; + const { name, phone, password } = req.body; + + const user = await UserModel.findById(id); + if (!user) { + return res.status(404).json({ + success: false, + message: '用户不存在' + }); + } + + // 准备更新数据 + const updateData: Partial<{ name: string; phone: string; password: string }> = {}; + if (name !== undefined) updateData.name = name; + if (phone !== undefined) updateData.phone = phone; + if (password !== undefined) updateData.password = password; + + // 更新用户 + const updatedUser = await UserModel.update(id, updateData); + + res.json({ + success: true, + data: updatedUser + }); + } catch (error: any) { + // 处理手机号已存在的错误 + if (error.message === '手机号已存在') { + return res.status(400).json({ + success: false, + message: '手机号已存在' + }); + } + + // 处理SQLITE_CONSTRAINT_UNIQUE错误 + if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') { + return res.status(400).json({ + success: false, + message: '手机号已存在' + }); + } + + // 处理数据验证错误 + if (error.message.includes('姓名长度必须在2-20个字符之间') || + error.message.includes('手机号格式不正确')) { + return res.status(400).json({ + success: false, + message: error.message + }); + } + + // 处理其他错误 + res.status(500).json({ + success: false, + message: error.message || '更新用户失败' + }); + } + } + static async importUsers(req: Request, res: Response) { try { const file = (req as any).file; diff --git a/api/controllers/examTaskController.ts b/api/controllers/examTaskController.ts index 7d1baa7..349d4f6 100644 --- a/api/controllers/examTaskController.ts +++ b/api/controllers/examTaskController.ts @@ -141,4 +141,29 @@ export class ExamTaskController { }); } } + + static async getTaskUsers(req: Request, res: Response) { + try { + const { id } = req.params; + + if (!id) { + return res.status(400).json({ + success: false, + message: '任务ID不能为空' + }); + } + + const userIds = await ExamTaskModel.getTaskUsers(id); + + res.json({ + success: true, + data: userIds + }); + } catch (error: any) { + res.status(500).json({ + success: false, + message: error.message || '获取任务用户失败' + }); + } + } } \ No newline at end of file diff --git a/api/controllers/quizController.ts b/api/controllers/quizController.ts index 012cec7..46ac1d9 100644 --- a/api/controllers/quizController.ts +++ b/api/controllers/quizController.ts @@ -43,23 +43,142 @@ export class QuizController { }); } - const questions: Awaited> = []; - - for (const [type, ratio] of Object.entries(subject.typeRatios)) { - if (ratio <= 0) continue; - const typeScore = Math.floor((ratio / 100) * subject.totalScore); - const avgScore = 10; - const count = Math.max(1, Math.round(typeScore / avgScore)); - - const categories = Object.entries(subject.categoryRatios) - .filter(([, r]) => r > 0) - .map(([c]) => c); - - const qs = await QuestionModel.getRandomQuestions(type as any, count, categories); - questions.push(...qs); + let questions: Question[] = []; + const remainingScore = subject.totalScore; + + // 构建包含所有类别的数组,根据比重重复对应次数 + const allCategories: string[] = []; + for (const [category, catRatio] of Object.entries(subject.categoryRatios)) { + if (catRatio > 0) { + // 根据比重计算该类别应占的总题目数比例 + const count = Math.round((catRatio / 100) * 100); // 放大100倍避免小数问题 + for (let i = 0; i < count; i++) { + allCategories.push(category); + } + } + } + + // 确保总题目数至少为1 + if (allCategories.length === 0) { + allCategories.push('通用'); + } + + // 按题型分配题目 + for (const [type, typeRatio] of Object.entries(subject.typeRatios)) { + if (typeRatio <= 0) continue; + + // 计算该题型应占的总分 + const targetTypeScore = Math.round((typeRatio / 100) * subject.totalScore); + let currentTypeScore = 0; + let typeQuestions: Question[] = []; + + // 尝试获取足够分数的题目 + while (currentTypeScore < targetTypeScore) { + // 随机选择一个类别 + const randomCategory = allCategories[Math.floor(Math.random() * allCategories.length)]; + + // 获取该类型和类别的随机题目 + const availableQuestions = await QuestionModel.getRandomQuestions( + type as any, + 10, // 一次获取多个,提高效率 + [randomCategory] + ); + + if (availableQuestions.length === 0) { + break; // 该类型/类别没有题目,跳过 + } + + // 过滤掉已选题目 + const availableUnselected = availableQuestions.filter(q => + !questions.some(selected => selected.id === q.id) + ); + + if (availableUnselected.length === 0) { + break; // 没有可用的新题目了 + } + + // 选择分数最接近剩余需求的题目 + const remainingForType = targetTypeScore - currentTypeScore; + const selectedQuestion = availableUnselected.reduce((prev, curr) => { + const prevDiff = Math.abs(remainingForType - prev.score); + const currDiff = Math.abs(remainingForType - curr.score); + return currDiff < prevDiff ? curr : prev; + }); + + // 添加到题型题目列表 + typeQuestions.push(selectedQuestion); + currentTypeScore += selectedQuestion.score; + + // 防止无限循环 + if (typeQuestions.length > 100) { + break; + } + } + + questions.push(...typeQuestions); + } + + // 如果总分不足,尝试补充题目 + let totalScore = questions.reduce((sum, q) => sum + q.score, 0); + while (totalScore < subject.totalScore) { + // 获取所有类型的随机题目 + const allTypes = Object.keys(subject.typeRatios).filter(type => subject.typeRatios[type] > 0); + if (allTypes.length === 0) break; + + const randomType = allTypes[Math.floor(Math.random() * allTypes.length)]; + const availableQuestions = await QuestionModel.getRandomQuestions( + randomType as any, + 10, + allCategories + ); + + if (availableQuestions.length === 0) break; + + // 过滤掉已选题目 + const availableUnselected = availableQuestions.filter(q => + !questions.some(selected => selected.id === q.id) + ); + + if (availableUnselected.length === 0) break; + + // 选择分数最接近剩余需求的题目 + const remainingScore = subject.totalScore - totalScore; + const selectedQuestion = availableUnselected.reduce((prev, curr) => { + const prevDiff = Math.abs(remainingScore - prev.score); + const currDiff = Math.abs(remainingScore - curr.score); + return currDiff < prevDiff ? curr : prev; + }); + + questions.push(selectedQuestion); + totalScore += selectedQuestion.score; + + // 防止无限循环 + if (questions.length > 200) { + break; + } + } + + // 如果总分超过,尝试移除一些题目 + while (totalScore > subject.totalScore) { + // 找到最接近剩余差值的题目 + const excessScore = totalScore - subject.totalScore; + let closestIndex = -1; + let closestDiff = Infinity; + + for (let i = 0; i < questions.length; i++) { + const diff = Math.abs(questions[i].score - excessScore); + if (diff < closestDiff) { + closestDiff = diff; + closestIndex = i; + } + } + + if (closestIndex === -1) break; + + // 移除该题目 + totalScore -= questions[closestIndex].score; + questions.splice(closestIndex, 1); } - - const totalScore = questions.reduce((sum, q) => sum + q.score, 0); res.json({ success: true, diff --git a/api/controllers/userController.ts b/api/controllers/userController.ts index 3f25333..6042053 100644 --- a/api/controllers/userController.ts +++ b/api/controllers/userController.ts @@ -30,6 +30,15 @@ export class UserController { }); } catch (error: any) { console.error('创建用户失败:', error); + + // 处理手机号唯一约束错误 + if (error.code === 'SQLITE_CONSTRAINT' || error.message.includes('手机号已存在')) { + return res.status(400).json({ + success: false, + message: '该手机号已被注册,请使用其他手机号' + }); + } + res.status(500).json({ success: false, message: error.message || '创建用户失败' @@ -115,4 +124,30 @@ export class UserController { }); } } + + static async getUsersByName(req: Request, res: Response) { + try { + const { name } = req.params; + + if (!name || typeof name !== 'string') { + return res.status(400).json({ + success: false, + message: '姓名不能为空' + }); + } + + const users = await UserModel.findByName(name); + + res.json({ + success: true, + data: users + }); + } catch (error: any) { + console.error('根据姓名查询用户失败:', error); + res.status(500).json({ + success: false, + message: error.message || '根据姓名查询用户失败' + }); + } + } } \ No newline at end of file diff --git a/api/models/examTask.ts b/api/models/examTask.ts index 2b4a02c..5d3d802 100644 --- a/api/models/examTask.ts +++ b/api/models/examTask.ts @@ -40,9 +40,27 @@ export interface TaskReport { }>; } +export interface ActiveTaskStat { + taskId: string; + taskName: string; + subjectName: string; + totalUsers: number; + completedUsers: number; + completionRate: number; + passRate: number; + excellentRate: number; + startAt: string; + endAt: string; +} + export class ExamTaskModel { - static async findAll(): Promise { - const sql = ` + static async findAll(): Promise<(TaskWithSubject & { + completedUsers: number; + passRate: number; + excellentRate: number; + })[]> { + // 1. 先获取所有任务的基本信息 + const baseTasks = await all(` SELECT t.id, t.name, @@ -51,14 +69,112 @@ export class ExamTaskModel { t.end_at as endAt, t.created_at as createdAt, s.name as subjectName, - COUNT(DISTINCT etu.user_id) as userCount + COUNT(DISTINCT etu.user_id) as userCount, + s.total_score as totalScore FROM exam_tasks t JOIN exam_subjects s ON t.subject_id = s.id LEFT JOIN exam_task_users etu ON t.id = etu.task_id GROUP BY t.id ORDER BY t.created_at DESC - `; - return query(sql); + `); + + // 2. 为每个任务计算完成人数、合格率和优秀率 + const tasksWithStats: any[] = []; + for (const task of baseTasks) { + // 获取该任务的详细报表数据 + const report = await this.getReport(task.id); + + // 计算合格率(得分率60%以上) + const passingUsers = report.details.filter((d: any) => { + if (d.score === null) return false; + return (d.score / task.totalScore) >= 0.6; + }).length; + + const passRate = report.totalUsers > 0 + ? Math.round((passingUsers / report.totalUsers) * 100) + : 0; + + // 计算优秀率(得分率80%以上) + const excellentUsers = report.details.filter((d: any) => { + if (d.score === null) return false; + return (d.score / task.totalScore) >= 0.8; + }).length; + + const excellentRate = report.totalUsers > 0 + ? Math.round((excellentUsers / report.totalUsers) * 100) + : 0; + + tasksWithStats.push({ + ...task, + completedUsers: report.completedUsers, + passRate, + excellentRate + }); + } + + return tasksWithStats; + } + + static async getActiveTasksWithStats(): Promise { + const now = new Date().toISOString(); + + // 1. 获取当前时间有效的任务,包括开始和结束时间 + const activeTasks = await all(` + SELECT + t.id, t.name as taskName, s.name as subjectName, s.total_score as totalScore, + t.start_at as startAt, t.end_at as endAt + FROM exam_tasks t + JOIN exam_subjects s ON t.subject_id = s.id + WHERE t.start_at <= ? AND t.end_at >= ? + ORDER BY t.created_at DESC + `, [now, now]); + + const stats: ActiveTaskStat[] = []; + + for (const task of activeTasks) { + // 2. 获取每个任务的详细报告数据 + const report = await this.getReport(task.id); + + // 3. 计算完成率 + const completionRate = report.totalUsers > 0 + ? Math.round((report.completedUsers / report.totalUsers) * 100) + : 0; + + // 4. 计算合格率(得分率60%以上) + const passingUsers = report.details.filter(d => { + if (d.score === null) return false; + return (d.score / task.totalScore) >= 0.6; + }).length; + + const passRate = report.totalUsers > 0 + ? Math.round((passingUsers / report.totalUsers) * 100) + : 0; + + // 5. 计算优秀率(得分率80%以上) + const excellentUsers = report.details.filter(d => { + if (d.score === null) return false; + return (d.score / task.totalScore) >= 0.8; + }).length; + + const excellentRate = report.totalUsers > 0 + ? Math.round((excellentUsers / report.totalUsers) * 100) + : 0; + + stats.push({ + taskId: task.id, + taskName: task.taskName, + subjectName: task.subjectName, + totalUsers: report.totalUsers, + completedUsers: report.completedUsers, + completionRate, + passRate, + excellentRate, + startAt: task.startAt, + endAt: task.endAt + }); + } + + return stats; } static async findById(id: string): Promise { @@ -140,6 +256,16 @@ export class ExamTaskModel { await run(`DELETE FROM exam_tasks WHERE id = ?`, [id]); } + static async getTaskUsers(taskId: string): Promise { + const rows = await all(` + SELECT user_id as userId + FROM exam_task_users + WHERE task_id = ? + `, [taskId]); + + return rows.map(row => row.userId); + } + static async getReport(taskId: string): Promise { const task = await this.findById(taskId); if (!task) throw new Error('任务不存在'); @@ -209,23 +335,141 @@ export class ExamTaskModel { if (!subject) throw new Error('科目不存在'); const { QuestionModel } = await import('./question'); - const questions: Awaited> = []; - - for (const [type, ratio] of Object.entries(subject.typeRatios)) { - if (ratio <= 0) continue; - const typeScore = Math.floor((ratio / 100) * subject.totalScore); - const avgScore = 10; - const count = Math.max(1, Math.round(typeScore / avgScore)); - - const categories = Object.entries(subject.categoryRatios) - .filter(([, r]) => r > 0) - .map(([c]) => c); - - const qs = await QuestionModel.getRandomQuestions(type as any, count, categories); - questions.push(...qs); + let questions: Awaited> = []; + + // 构建包含所有类别的数组,根据比重重复对应次数 + const allCategories: string[] = []; + for (const [category, catRatio] of Object.entries(subject.categoryRatios)) { + if (catRatio > 0) { + // 根据比重计算该类别应占的总题目数比例 + const count = Math.round((catRatio / 100) * 100); // 放大100倍避免小数问题 + for (let i = 0; i < count; i++) { + allCategories.push(category); + } + } + } + + // 确保总题目数至少为1 + if (allCategories.length === 0) { + allCategories.push('通用'); + } + + // 按题型分配题目 + for (const [type, typeRatio] of Object.entries(subject.typeRatios)) { + if (typeRatio <= 0) continue; + + // 计算该题型应占的总分 + const targetTypeScore = Math.round((typeRatio / 100) * subject.totalScore); + let currentTypeScore = 0; + let typeQuestions: Awaited> = []; + + // 尝试获取足够分数的题目 + while (currentTypeScore < targetTypeScore) { + // 随机选择一个类别 + const randomCategory = allCategories[Math.floor(Math.random() * allCategories.length)]; + + // 获取该类型和类别的随机题目 + const availableQuestions = await QuestionModel.getRandomQuestions( + type as any, + 10, // 一次获取多个,提高效率 + [randomCategory] + ); + + if (availableQuestions.length === 0) { + break; // 该类型/类别没有题目,跳过 + } + + // 过滤掉已选题目 + const availableUnselected = availableQuestions.filter(q => + !questions.some(selected => selected.id === q.id) + ); + + if (availableUnselected.length === 0) { + break; // 没有可用的新题目了 + } + + // 选择分数最接近剩余需求的题目 + const remainingForType = targetTypeScore - currentTypeScore; + const selectedQuestion = availableUnselected.reduce((prev, curr) => { + const prevDiff = Math.abs(remainingForType - prev.score); + const currDiff = Math.abs(remainingForType - curr.score); + return currDiff < prevDiff ? curr : prev; + }); + + // 添加到题型题目列表 + typeQuestions.push(selectedQuestion); + currentTypeScore += selectedQuestion.score; + + // 防止无限循环 + if (typeQuestions.length > 100) { + break; + } + } + + questions.push(...typeQuestions); + } + + // 如果总分不足,尝试补充题目 + let totalScore = questions.reduce((sum, q) => sum + q.score, 0); + while (totalScore < subject.totalScore) { + // 获取所有类型的随机题目 + const allTypes = Object.keys(subject.typeRatios).filter(type => subject.typeRatios[type] > 0); + if (allTypes.length === 0) break; + + const randomType = allTypes[Math.floor(Math.random() * allTypes.length)]; + const availableQuestions = await QuestionModel.getRandomQuestions( + randomType as any, + 10, + allCategories + ); + + if (availableQuestions.length === 0) break; + + // 过滤掉已选题目 + const availableUnselected = availableQuestions.filter(q => + !questions.some(selected => selected.id === q.id) + ); + + if (availableUnselected.length === 0) break; + + // 选择分数最接近剩余需求的题目 + const remainingScore = subject.totalScore - totalScore; + const selectedQuestion = availableUnselected.reduce((prev, curr) => { + const prevDiff = Math.abs(remainingScore - prev.score); + const currDiff = Math.abs(remainingScore - curr.score); + return currDiff < prevDiff ? curr : prev; + }); + + questions.push(selectedQuestion); + totalScore += selectedQuestion.score; + + // 防止无限循环 + if (questions.length > 200) { + break; + } + } + + // 如果总分超过,尝试移除一些题目 + while (totalScore > subject.totalScore) { + // 找到最接近剩余差值的题目 + const excessScore = totalScore - subject.totalScore; + let closestIndex = -1; + let closestDiff = Infinity; + + for (let i = 0; i < questions.length; i++) { + const diff = Math.abs(questions[i].score - excessScore); + if (diff < closestDiff) { + closestDiff = diff; + closestIndex = i; + } + } + + if (closestIndex === -1) break; + + // 移除该题目 + totalScore -= questions[closestIndex].score; + questions.splice(closestIndex, 1); } - - const totalScore = questions.reduce((sum, q) => sum + q.score, 0); return { questions, @@ -241,9 +485,9 @@ export class ExamTaskModel { FROM exam_tasks t INNER JOIN exam_task_users tu ON t.id = tu.task_id INNER JOIN exam_subjects s ON t.subject_id = s.id - WHERE tu.user_id = ? AND t.start_at <= ? AND t.end_at >= ? + WHERE tu.user_id = ? AND t.start_at <= ? ORDER BY t.start_at DESC - `, [userId, now, now]); + `, [userId, now]); return rows.map(row => ({ id: row.id, diff --git a/api/models/question.ts b/api/models/question.ts index 12b6a07..faa12a5 100644 --- a/api/models/question.ts +++ b/api/models/question.ts @@ -47,18 +47,43 @@ export class QuestionModel { return this.findById(id) as Promise; } - // 批量创建题目 + // 批量创建题目 - 优化为使用事务批量插入 static async createMany(questions: CreateQuestionData[]): Promise<{ success: number; errors: string[] }> { const errors: string[] = []; let success = 0; - for (let i = 0; i < questions.length; i++) { - try { - await this.create(questions[i]); - success++; - } catch (error: any) { - errors.push(`第${i + 1}题: ${error.message}`); + // 使用事务提高性能 + try { + // 开始事务 + await run('BEGIN TRANSACTION'); + + const sql = ` + INSERT INTO questions (id, content, type, options, answer, score, category) + VALUES (?, ?, ?, ?, ?, ?, ?) + `; + + for (let i = 0; i < questions.length; i++) { + try { + const question = questions[i]; + const id = uuidv4(); + const optionsStr = question.options ? JSON.stringify(question.options) : null; + const answerStr = Array.isArray(question.answer) ? JSON.stringify(question.answer) : question.answer; + const category = question.category && question.category.trim() ? question.category.trim() : '通用'; + + // 直接执行插入,不调用单个create方法 + await run(sql, [id, question.content, question.type, optionsStr, answerStr, question.score, category]); + success++; + } catch (error: any) { + errors.push(`第${i + 1}题: ${error.message}`); + } } + + // 提交事务 + await run('COMMIT'); + } catch (error: any) { + // 回滚事务 + await run('ROLLBACK'); + errors.push(`事务错误: ${error.message}`); } return { success, errors }; diff --git a/api/models/questionCategory.ts b/api/models/questionCategory.ts index 129a3ab..27cdc2b 100644 --- a/api/models/questionCategory.ts +++ b/api/models/questionCategory.ts @@ -8,9 +8,56 @@ export interface QuestionCategory { } export class QuestionCategoryModel { + // 获取所有题目类别,包括从题目表中聚合的新类别 static async findAll(): Promise { - const sql = `SELECT id, name, created_at as createdAt FROM question_categories ORDER BY created_at DESC`; - return query(sql); + try { + // 1. 首先从题目表中聚合所有唯一类别 + const questionCategoriesSql = ` + SELECT DISTINCT category as name + FROM questions + WHERE category IS NOT NULL AND category != '' + `; + const questionCategories = await query(questionCategoriesSql); + + // 2. 获取现有类别表中的类别 + const existingCategoriesSql = ` + SELECT id, name, created_at as createdAt + FROM question_categories + ORDER BY created_at DESC + `; + const existingCategories = await query(existingCategoriesSql); + + // 3. 创建现有类别名称的映射,用于快速查找 + const existingCategoryNames = new Set(existingCategories.map(cat => cat.name)); + + // 4. 找出题目表中存在但类别表中不存在的新类别 + const newCategories = questionCategories.filter(qCat => !existingCategoryNames.has(qCat.name)); + + // 5. 批量创建新类别 + if (newCategories.length > 0) { + await run('BEGIN TRANSACTION'); + + const createSql = `INSERT INTO question_categories (id, name) VALUES (?, ?)`; + for (const newCat of newCategories) { + await run(createSql, [uuidv4(), newCat.name]); + } + + await run('COMMIT'); + + // 6. 重新获取所有类别,包括新创建的 + return this.findAll(); + } + + // 如果没有新类别,直接返回现有类别 + return existingCategories; + } catch (error: any) { + // 如果事务失败,回滚 + await run('ROLLBACK'); + console.error('获取题目类别失败:', error); + // 回退到原始逻辑 + const sql = `SELECT id, name, created_at as createdAt FROM question_categories ORDER BY created_at DESC`; + return query(sql); + } } static async findById(id: string): Promise { diff --git a/api/models/quiz.ts b/api/models/quiz.ts index 55be9d9..96eb94c 100644 --- a/api/models/quiz.ts +++ b/api/models/quiz.ts @@ -142,13 +142,15 @@ export class QuizModel { } // 获取所有答题记录(管理员用) - static async findAllRecords(limit = 10, offset = 0): Promise<{ records: QuizRecord[]; total: number }> { + static async findAllRecords(limit = 10, offset = 0): Promise<{ records: any[]; total: number }> { const recordsSql = ` SELECT r.id, r.user_id as userId, u.name as userName, u.phone as userPhone, r.total_score as totalScore, r.correct_count as correctCount, r.total_count as totalCount, - r.created_at as createdAt + r.created_at as createdAt, r.subject_id as subjectId, s.name as subjectName, + r.task_id as taskId FROM quiz_records r JOIN users u ON r.user_id = u.id + LEFT JOIN exam_subjects s ON r.subject_id = s.id ORDER BY r.created_at DESC LIMIT ? OFFSET ? `; @@ -160,8 +162,29 @@ export class QuizModel { get(countSql) ]); + // 对于每条记录,计算该考试任务的参与人数 + const processedRecords = await Promise.all(records.map(async (record) => { + let examCount = 0; + if (record.taskId) { + // 统计该任务的参与人数 + const taskCountSql = `SELECT COUNT(DISTINCT user_id) as count FROM quiz_records WHERE task_id = ?`; + const taskCountResult = await get(taskCountSql, [record.taskId]); + examCount = taskCountResult.count || 0; + } else if (record.subjectId) { + // 统计该科目的参与人数 + const subjectCountSql = `SELECT COUNT(DISTINCT user_id) as count FROM quiz_records WHERE subject_id = ?`; + const subjectCountResult = await get(subjectCountSql, [record.subjectId]); + examCount = subjectCountResult.count || 0; + } + + return { + ...record, + examCount + }; + })); + return { - records, + records: processedRecords, total: countResult.total }; } @@ -215,7 +238,7 @@ export class QuizModel { averageScore: number; typeStats: Array<{ type: string; total: number; correct: number; correctRate: number }>; }> { - const totalUsersSql = `SELECT COUNT(DISTINCT user_id) as total FROM quiz_records`; + const totalUsersSql = `SELECT COUNT(*) as total FROM users`; const totalRecordsSql = `SELECT COUNT(*) as total FROM quiz_records`; const averageScoreSql = `SELECT AVG(total_score) as average FROM quiz_records`; diff --git a/api/models/user.ts b/api/models/user.ts index 3a04a90..ed211ad 100644 --- a/api/models/user.ts +++ b/api/models/user.ts @@ -43,6 +43,58 @@ export class UserModel { await run(`DELETE FROM users WHERE id = ?`, [id]); } + // 更新用户信息 + static async update(id: string, data: Partial): Promise { + // 验证数据 + const errors = this.validateUserData(data as CreateUserData); + if (errors.length > 0) { + throw new Error(errors.join(', ')); + } + + // 检查手机号唯一性 + if (data.phone !== undefined) { + const existingUser = await this.findByPhone(data.phone); + if (existingUser && existingUser.id !== id) { + throw new Error('手机号已存在'); + } + } + + // 构建更新字段 + const fields: string[] = []; + const values: any[] = []; + + if (data.name !== undefined) { + fields.push('name = ?'); + values.push(data.name); + } + + if (data.phone !== undefined) { + fields.push('phone = ?'); + values.push(data.phone); + } + + if (data.password !== undefined) { + fields.push('password = ?'); + values.push(data.password); + } + + if (fields.length === 0) { + return this.findById(id) as Promise; + } + + values.push(id); + const sql = `UPDATE users SET ${fields.join(', ')} WHERE id = ?`; + + await run(sql, values); + const updatedUser = await this.findById(id); + + if (!updatedUser) { + throw new Error('用户不存在'); + } + + return updatedUser; + } + static async findById(id: string): Promise { const sql = `SELECT id, name, phone, password, created_at as createdAt FROM users WHERE id = ?`; const user = await get(sql, [id]); @@ -55,6 +107,12 @@ export class UserModel { return user || null; } + static async findByName(name: string): Promise { + const sql = `SELECT id, name, phone, password, created_at as createdAt FROM users WHERE name = ?`; + const users = await query(sql, [name]); + return users || []; + } + static async findAll(limit = 10, offset = 0): Promise<{ users: User[]; total: number }> { const usersSql = ` SELECT id, name, phone, password, created_at as createdAt @@ -75,15 +133,21 @@ export class UserModel { }; } - static validateUserData(data: CreateUserData): string[] { + // 验证用户数据,支持部分数据验证 + static validateUserData(data: Partial): string[] { const errors: string[] = []; - if (!data.name || data.name.length < 2 || data.name.length > 20) { - errors.push('姓名长度必须在2-20个字符之间'); + // 只验证提供了的数据 + if (data.name !== undefined) { + if (data.name.length < 2 || data.name.length > 20) { + errors.push('姓名长度必须在2-20个字符之间'); + } } - if (!data.phone || !/^1[3-9]\d{9}$/.test(data.phone)) { - errors.push('手机号格式不正确,请输入11位中国手机号'); + if (data.phone !== undefined) { + if (!/^1[3-9]\d{9}$/.test(data.phone)) { + errors.push('手机号格式不正确,请输入11位中国手机号'); + } } return errors; diff --git a/api/server.ts b/api/server.ts index 57224fb..22ea1e5 100644 --- a/api/server.ts +++ b/api/server.ts @@ -38,6 +38,7 @@ const apiRouter = express.Router(); apiRouter.post('/users', UserController.createUser); apiRouter.get('/users/:id', UserController.getUser); apiRouter.post('/users/validate', UserController.validateUserInfo); +apiRouter.get('/users/name/:name', UserController.getUsersByName); // 题库管理 apiRouter.get('/questions', QuestionController.getQuestions); @@ -66,6 +67,8 @@ apiRouter.delete('/admin/subjects/:id', adminAuth, ExamSubjectController.deleteS // 考试任务 apiRouter.get('/exam-tasks', ExamTaskController.getTasks); +apiRouter.get('/admin/tasks', adminAuth, ExamTaskController.getTasks); +apiRouter.get('/admin/tasks/:id/users', adminAuth, ExamTaskController.getTaskUsers); apiRouter.get('/exam-tasks/user/:userId', ExamTaskController.getUserTasks); apiRouter.post('/admin/tasks', adminAuth, ExamTaskController.createTask); apiRouter.put('/admin/tasks/:id', adminAuth, ExamTaskController.updateTask); @@ -74,6 +77,7 @@ apiRouter.get('/admin/tasks/:id/report', adminAuth, ExamTaskController.getTaskRe // 用户管理 apiRouter.get('/admin/users', adminAuth, AdminUserController.getUsers); +apiRouter.put('/admin/users/:id', adminAuth, AdminUserController.updateUser); apiRouter.delete('/admin/users', adminAuth, AdminUserController.deleteUser); apiRouter.get('/admin/users/export', adminAuth, AdminUserController.exportUsers); apiRouter.post('/admin/users/import', adminAuth, upload.single('file'), AdminUserController.importUsers); @@ -89,9 +93,10 @@ apiRouter.get('/quiz/records', adminAuth, QuizController.getAllRecords); // 管理员相关 apiRouter.post('/admin/login', AdminController.login); -apiRouter.get('/admin/config', adminAuth, AdminController.getQuizConfig); -apiRouter.put('/admin/config', adminAuth, AdminController.updateQuizConfig); apiRouter.get('/admin/statistics', adminAuth, AdminController.getStatistics); +apiRouter.get('/admin/active-tasks', adminAuth, AdminController.getActiveTasksStats); +apiRouter.put('/admin/config', adminAuth, AdminController.updateQuizConfig); +apiRouter.get('/admin/config', adminAuth, AdminController.getQuizConfig); apiRouter.put('/admin/password', adminAuth, AdminController.updatePassword); apiRouter.get('/admin/configs', adminAuth, AdminController.getAllConfigs); diff --git a/data/survey.db b/data/survey.db index 75c64169994510e82bb4b12fb31b11446460d85c..fdabc1956d7d3fa603875bf18ea280b4a1b838f1 100644 GIT binary patch literal 516096 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

Q+GeA_w0 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 delta 2891 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 diff --git a/data/~$题库导出_1766067180492.xlsx b/data/~$题库导出_1766067180492.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0049f585eb9d306098662217401049cc412cfd9c GIT binary patch literal 165 ccmZQ^EXvPQAQ`YQI5HG5@~ literal 0 HcmV?d00001 diff --git a/data/题库导出_1766067180492.xlsx b/data/题库导出_1766067180492.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5cf93818dfde8630460322253e98df960f6f7b64 GIT binary patch literal 23255 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 { icon: , label: '用户管理', }, - { - key: '/admin/config', - icon: , - label: '抽题配置', - }, + { key: '/admin/statistics', icon: , diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index f4be04f..0d0cf4e 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -18,6 +18,7 @@ const HomePage = () => { const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [historyOptions, setHistoryOptions] = useState<{ value: string; label: string; phone: string }[]>([]); + const [isSearching, setIsSearching] = useState(false); useEffect(() => { // 加载历史记录 @@ -32,13 +33,19 @@ const HomePage = () => { const saveToHistory = (name: string, phone: string) => { const history: LoginHistory[] = JSON.parse(localStorage.getItem('loginHistory') || '[]'); // 移除已存在的同名记录(为了更新位置到最前,或者保持最新) - // 简单起见,如果已存在,先移除 const filtered = history.filter(item => item.name !== name); // 添加到头部 filtered.unshift({ name, phone }); // 保留前5条 const newHistory = filtered.slice(0, 5); localStorage.setItem('loginHistory', JSON.stringify(newHistory)); + + // 更新本地历史选项 + setHistoryOptions(newHistory.map(item => ({ + value: item.name, + label: item.name, + phone: item.phone + }))); }; const handleNameSelect = (value: string, option: any) => { @@ -47,6 +54,38 @@ const HomePage = () => { } }; + const handleNameChange = async (value: string) => { + if (!value) return; + + // 先检查本地历史记录 + const localOption = historyOptions.find(option => option.value === value); + if (localOption && localOption.phone) { + form.setFieldsValue({ phone: localOption.phone }); + return; + } + + // 本地没有则从服务器查询 + try { + setIsSearching(true); + const response = await userAPI.getUsersByName(value) as any; + + if (response.success && response.data && response.data.length > 0) { + // 假设返回的是数组,取第一个匹配的用户 + const user = response.data[0]; + if (user && user.phone) { + form.setFieldsValue({ phone: user.phone }); + // 将查询结果保存到本地历史记录 + saveToHistory(value, user.phone); + } + } + } catch (error: any) { + console.error('查询用户失败:', error); + // 查询失败不提示用户,保持原有逻辑 + } finally { + setIsSearching(false); + } + }; + const handleSubmit = async (values: { name: string; phone: string; password?: string }) => { try { setLoading(true); @@ -59,7 +98,7 @@ const HomePage = () => { } // 创建用户或登录 - const response = await userAPI.createUser(values) as any; + const response = await userAPI.validateUserInfo(values) as any; if (response.success) { setUser(response.data); @@ -107,6 +146,7 @@ const HomePage = () => { diff --git a/src/pages/admin/AdminDashboardPage.tsx b/src/pages/admin/AdminDashboardPage.tsx index 4db71f6..c7d58b1 100644 --- a/src/pages/admin/AdminDashboardPage.tsx +++ b/src/pages/admin/AdminDashboardPage.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { Card, Row, Col, Statistic, Button, Table, message } from 'antd'; +import { Card, Row, Col, Statistic, Button, Table, message, Tooltip } from 'antd'; import { UserOutlined, QuestionCircleOutlined, @@ -8,6 +8,7 @@ import { } from '@ant-design/icons'; import { adminAPI } from '../../services/api'; import { formatDateTime } from '../../utils/validation'; +import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip as RechartsTooltip, Legend } from 'recharts'; interface Statistics { totalUsers: number; @@ -24,11 +25,27 @@ interface RecentRecord { correctCount: number; totalCount: number; createdAt: string; + subjectName?: string; + examCount?: number; +} + +interface ActiveTaskStat { + taskId: string; + taskName: string; + subjectName: string; + totalUsers: number; + completedUsers: number; + completionRate: number; + passRate: number; + excellentRate: number; + startAt: string; + endAt: string; } const AdminDashboardPage = () => { const [statistics, setStatistics] = useState(null); const [recentRecords, setRecentRecords] = useState([]); + const [activeTasks, setActiveTasks] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { @@ -38,12 +55,16 @@ const AdminDashboardPage = () => { const fetchDashboardData = async () => { try { setLoading(true); - const statsResponse = await adminAPI.getStatistics(); + // 并行获取所有数据,提高性能 + const [statsResponse, recordsResponse, activeTasksResponse] = await Promise.all([ + adminAPI.getStatistics(), + fetchRecentRecords(), + adminAPI.getActiveTasksStats() + ]); + setStatistics(statsResponse.data); - - // 获取最近10条答题记录 - const recordsResponse = await fetchRecentRecords(); setRecentRecords(recordsResponse); + setActiveTasks(activeTasksResponse.data); } catch (error: any) { message.error(error.message || '获取数据失败'); } finally { @@ -89,6 +110,18 @@ const AdminDashboardPage = () => { return {rate}%; }, }, + { + title: '考试科目', + dataIndex: 'subjectName', + key: 'subjectName', + render: (subjectName?: string) => subjectName || '', + }, + { + title: '考试人数', + dataIndex: 'examCount', + key: 'examCount', + render: (examCount?: number) => examCount || '', + }, { title: '答题时间', dataIndex: 'createdAt', @@ -173,6 +206,113 @@ const AdminDashboardPage = () => { )} + {/* 当前有效考试任务统计 */} + {activeTasks.length > 0 && ( + + { + // 计算考试进度百分率 + const now = new Date(); + const start = new Date(record.startAt); + const end = new Date(record.endAt); + + // 计算总时长(毫秒) + const totalDuration = end.getTime() - start.getTime(); + // 计算已经过去的时长(毫秒) + const elapsedDuration = now.getTime() - start.getTime(); + // 计算进度百分率,确保在0-100之间 + const progress = Math.max(0, Math.min(100, Math.round((elapsedDuration / totalDuration) * 100))); + + return ( +
+
+
+
+ {progress}% +
+ ); + }, + }, + { + title: '考试人数统计', + key: 'statistics', + render: (_: any, record: ActiveTaskStat) => { + // 计算各类人数 + const total = record.totalUsers; + const completed = record.completedUsers; + const passed = Math.round(completed * (record.passRate / 100)); + const excellent = Math.round(completed * (record.excellentRate / 100)); + const incomplete = total - completed; + + // 准备饼图数据 + const pieData = [ + { name: '已完成', value: completed, color: '#1890ff' }, + { name: '合格', value: passed, color: '#52c41a' }, + { name: '优秀', value: excellent, color: '#fa8c16' }, + { name: '未完成', value: incomplete, color: '#d9d9d9' } + ]; + + // 只显示有数据的项 + const filteredData = pieData.filter(item => item.value > 0); + + return ( +
+ + + `${name}:${value}`} + > + {filteredData.map((entry, index) => ( + + ))} + + [`${value} 人`, '数量']} /> + `${value} ${entry.payload?.value || 0} 人`} /> + + +
+ ); + }, + }, + ]} + dataSource={activeTasks} + rowKey="taskId" + loading={loading} + pagination={false} + size="small" + /> + + )} + {/* 最近答题记录 */}
{ + try { + const records = localStorage.getItem(LOGIN_RECORDS_KEY); + return records ? JSON.parse(records) : []; + } catch (error) { + console.error('获取登录记录失败:', error); + return []; + } +}; + +// 保存登录记录到本地存储 - 不再保存密码 +const saveLoginRecord = (record: LoginRecord) => { + try { + const records = getLoginRecords(); + // 移除相同用户名的旧记录 + const filteredRecords = records.filter(r => r.username !== record.username); + // 添加新记录到开头 + const updatedRecords = [record, ...filteredRecords].slice(0, MAX_RECORDS); + localStorage.setItem(LOGIN_RECORDS_KEY, JSON.stringify(updatedRecords)); + } catch (error) { + console.error('保存登录记录失败:', error); + } +}; + const AdminLoginPage = () => { const navigate = useNavigate(); const { setAdmin } = useAdmin(); const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [loginRecords, setLoginRecords] = useState([]); + + // 初始化获取登录记录 + useEffect(() => { + setLoginRecords(getLoginRecords()); + }, []); const handleSubmit = async (values: { username: string; password: string }) => { try { @@ -15,6 +58,15 @@ const AdminLoginPage = () => { const response = await adminAPI.login(values) as any; if (response.success) { + // 保存登录记录 - 不再保存密码 + saveLoginRecord({ + username: values.username, + timestamp: Date.now() + }); + + // 更新状态 + setLoginRecords(getLoginRecords()); + setAdmin({ username: values.username, token: response.data.token @@ -29,6 +81,14 @@ const AdminLoginPage = () => { } }; + // 处理从下拉列表选择历史记录 - 不再自动填充密码 + const handleSelectRecord = (record: LoginRecord) => { + form.setFieldsValue({ + username: record.username, + password: '' // 清空密码,必须每次手动输入 + }); + }; + return (
@@ -42,7 +102,37 @@ const AdminLoginPage = () => { layout="vertical" onFinish={handleSubmit} autoComplete="off" + form={form} > + {/* 最近登录记录下拉选择 */} + {loginRecords.length > 0 && ( + + @@ -65,11 +157,14 @@ const AdminLoginPage = () => { { required: true, message: '请输入密码' }, { min: 6, message: '密码至少6个字符' } ]} + className="mb-4" > diff --git a/src/pages/admin/ExamSubjectPage.tsx b/src/pages/admin/ExamSubjectPage.tsx index 71a60b6..9feb2f8 100644 --- a/src/pages/admin/ExamSubjectPage.tsx +++ b/src/pages/admin/ExamSubjectPage.tsx @@ -1,8 +1,24 @@ import React, { useState, useEffect } from 'react'; import { Table, Button, Input, Space, message, Popconfirm, Modal, Form, InputNumber, Card, Checkbox, Progress, Row, Col } from 'antd'; -import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons'; +import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined } from '@ant-design/icons'; import api from '../../services/api'; +interface Question { + id: string; + content: string; + type: string; + options?: string[]; + answer: string | string[]; + score: number; + category: string; +} + +interface QuizPreview { + questions: Question[]; + totalScore: number; + timeLimit: number; +} + interface ExamSubject { id: string; name: string; @@ -25,6 +41,21 @@ const ExamSubjectPage = () => { const [modalVisible, setModalVisible] = useState(false); const [editingSubject, setEditingSubject] = useState(null); const [form] = Form.useForm(); + // 浏览考题相关状态 + const [previewVisible, setPreviewVisible] = useState(false); + const [quizPreview, setQuizPreview] = useState(null); + const [previewLoading, setPreviewLoading] = useState(false); + const [currentSubject, setCurrentSubject] = useState(null); + // 引入状态管理来跟踪实时的比例配置 + const [typeRatios, setTypeRatios] = useState>({ + single: 40, + multiple: 30, + judgment: 20, + text: 10 + }); + const [categoryRatios, setCategoryRatios] = useState>({ + 通用: 100 + }); // 题型配置 const questionTypes = [ @@ -58,9 +89,16 @@ const ExamSubjectPage = () => { setEditingSubject(null); form.resetFields(); // 设置默认值 + const defaultTypeRatios = { single: 40, multiple: 30, judgment: 20, text: 10 }; + const defaultCategoryRatios: Record = { 通用: 100 }; + + // 初始化状态 + setTypeRatios(defaultTypeRatios); + setCategoryRatios(defaultCategoryRatios); + form.setFieldsValue({ - typeRatios: { single: 40, multiple: 30, judgment: 20, text: 10 }, - categoryRatios: { 通用: 100 }, + typeRatios: defaultTypeRatios, + categoryRatios: defaultCategoryRatios, totalScore: 100, timeLimitMinutes: 60, }); @@ -69,12 +107,27 @@ const ExamSubjectPage = () => { const handleEdit = (subject: ExamSubject) => { setEditingSubject(subject); + + // 初始化状态,确保所有类别都有比重值 + const initialTypeRatios = subject.typeRatios || { single: 40, multiple: 30, judgment: 20, text: 10 }; + + // 初始化类别比重,确保所有类别都有值 + const initialCategoryRatios: Record = { 通用: 100 }; + // 合并现有类别比重 + if (subject.categoryRatios) { + Object.assign(initialCategoryRatios, subject.categoryRatios); + } + + // 确保状态与表单值正确同步 + setTypeRatios(initialTypeRatios); + setCategoryRatios(initialCategoryRatios); + form.setFieldsValue({ name: subject.name, totalScore: subject.totalScore, timeLimitMinutes: subject.timeLimitMinutes, - typeRatios: subject.typeRatios, - categoryRatios: subject.categoryRatios, + typeRatios: initialTypeRatios, + categoryRatios: initialCategoryRatios, }); setModalVisible(true); }; @@ -91,22 +144,33 @@ const ExamSubjectPage = () => { const handleModalOk = async () => { try { - const values = await form.validateFields(); + // 首先验证状态中的值,确保总和为100% - // 验证题型比重总和 - const typeTotal = Object.values(values.typeRatios).reduce((sum: number, val) => sum + val, 0); - if (typeTotal !== 100) { + // 验证题型比重总和(使用状态中的值,允许±0.01的精度误差) + const typeTotal = Object.values(typeRatios).reduce((sum: number, val) => sum + val, 0); + console.log('题型比重总和(状态):', typeTotal); + if (Math.abs(typeTotal - 100) > 0.01) { message.error('题型比重总和必须为100%'); return; } - // 验证类别比重总和 - const categoryTotal = Object.values(values.categoryRatios).reduce((sum: number, val) => sum + val, 0); - if (categoryTotal !== 100) { + // 验证类别比重总和(使用状态中的值,允许±0.01的精度误差) + const categoryTotal = Object.values(categoryRatios).reduce((sum: number, val) => sum + val, 0); + console.log('类别比重总和(状态):', categoryTotal); + if (Math.abs(categoryTotal - 100) > 0.01) { message.error('题目类别比重总和必须为100%'); return; } + // 然后才获取表单值,确保表单验证通过 + const values = await form.validateFields(); + + // 确保表单值与状态同步 + values.typeRatios = typeRatios; + values.categoryRatios = categoryRatios; + + console.log('最终提交的表单值:', values); + if (editingSubject) { await api.put(`/admin/subjects/${editingSubject.id}`, values); message.success('更新成功'); @@ -118,21 +182,46 @@ const ExamSubjectPage = () => { fetchSubjects(); } catch (error) { message.error('操作失败'); + console.error('操作失败:', error); } }; const handleTypeRatioChange = (type: string, value: number) => { - const currentRatios = form.getFieldValue('typeRatios') || {}; - const newRatios = { ...currentRatios, [type]: value }; + const newRatios = { ...typeRatios, [type]: value }; + setTypeRatios(newRatios); form.setFieldsValue({ typeRatios: newRatios }); }; const handleCategoryRatioChange = (category: string, value: number) => { - const currentRatios = form.getFieldValue('categoryRatios') || {}; - const newRatios = { ...currentRatios, [category]: value }; + const newRatios = { ...categoryRatios, [category]: value }; + console.log('修改类别比重:', category, value, '新的类别比重:', newRatios); + console.log('类别比重总和:', Object.values(newRatios).reduce((sum: number, val) => sum + val, 0)); + setCategoryRatios(newRatios); form.setFieldsValue({ categoryRatios: newRatios }); }; + // 浏览考题处理函数 + const handleBrowseQuestions = async (subject: ExamSubject) => { + try { + setPreviewLoading(true); + setCurrentSubject(subject); + + // 调用生成试卷API获取随机题目 + const response = await api.post('/quiz/generate', { + userId: 'admin-preview', // 使用临时用户ID + subjectId: subject.id + }); + + setQuizPreview(response.data); + setPreviewVisible(true); + } catch (error) { + message.error('生成预览题目失败'); + console.error('生成预览题目失败:', error); + } finally { + setPreviewLoading(false); + } + }; + const columns = [ { title: '科目名称', @@ -156,19 +245,77 @@ const ExamSubjectPage = () => { dataIndex: 'typeRatios', key: 'typeRatios', render: (ratios: Record) => ( -
- {ratios && Object.entries(ratios).map(([type, ratio]) => { - const typeConfig = questionTypes.find(t => t.key === type); - return ( -
- {typeConfig?.label || type} - {ratio}% -
- ); - })} +
+
+ {ratios && Object.entries(ratios).map(([type, ratio]) => { + const typeConfig = questionTypes.find(t => t.key === type); + return ( +
+ ); + })} +
+
+ {ratios && Object.entries(ratios).map(([type, ratio]) => { + const typeConfig = questionTypes.find(t => t.key === type); + return ( +
+ + {typeConfig?.label || type} + {ratio}% +
+ ); + })} +
), }, + { + title: '题目类别分布', + dataIndex: 'categoryRatios', + key: 'categoryRatios', + render: (ratios: Record) => { + // 生成不同的颜色数组 + const colors = ['#1890ff', '#52c41a', '#faad14', '#ff4d4f', '#722ed1', '#eb2f96', '#fa8c16', '#a0d911']; + return ( +
+
+ {ratios && Object.entries(ratios).map(([category, ratio], index) => ( +
+ ))} +
+
+ {ratios && Object.entries(ratios).map(([category, ratio], index) => ( +
+ + {category} + {ratio}% +
+ ))} +
+
+ ); + }, + }, { title: '创建时间', dataIndex: 'createdAt', @@ -187,6 +334,13 @@ const ExamSubjectPage = () => { > 编辑 + handleDelete(record.id)} @@ -223,6 +377,7 @@ const ExamSubjectPage = () => { }} /> + {/* 编辑/新增科目模态框 */} { - + + 题型比重配置 + sum + val, 0) === 100 ? 'text-green-600' : 'text-red-600'}`}> + 总计:{Object.values(typeRatios).reduce((sum: number, val) => sum + val, 0)}% + +
+ } + className="mb-4" + >
{questionTypes.map((type) => { - const currentRatios = form.getFieldValue('typeRatios') || {}; - const ratio = currentRatios[type.key] || 0; + const ratio = typeRatios[type.key] || 0; return (
@@ -302,19 +467,25 @@ const ExamSubjectPage = () => {
); })} -
- 总计:{Object.values(form.getFieldValue('typeRatios') || {}).reduce((sum: number, val) => sum + val, 0)}% -
- + + 题目类别比重配置 + sum + val, 0) === 100 ? 'text-green-600' : 'text-red-600'}`}> + 总计:{Object.values(categoryRatios).reduce((sum: number, val) => sum + val, 0)}% + +
+ } + >
{categories.map((category) => { - const currentRatios = form.getFieldValue('categoryRatios') || {}; - const ratio = currentRatios[category.name] || 0; + const ratio = categoryRatios[category.name] || 0; return (
@@ -341,14 +512,100 @@ const ExamSubjectPage = () => {
); })} -
- 总计:{Object.values(form.getFieldValue('categoryRatios') || {}).reduce((sum: number, val) => sum + val, 0)}% -
+ + {/* 浏览考题模态框 */} + setPreviewVisible(false)} + width={900} + footer={null} + bodyStyle={{ maxHeight: '70vh', overflowY: 'auto' }} + > + {previewLoading ? ( +
+
+

正在生成随机考题...

+
+ ) : quizPreview ? ( +
+ +
+
+ 总分: + {quizPreview.totalScore} 分 +
+
+ 时间限制: + {quizPreview.timeLimit} 分钟 +
+
+ 题目数量: + {quizPreview.questions.length} 道 +
+
+
+ +
+ {quizPreview.questions.map((question, index) => ( + +
+

+ 第 {index + 1} 题({question.score} 分) + + {question.type === 'single' ? '单选题' : + question.type === 'multiple' ? '多选题' : + question.type === 'judgment' ? '判断题' : '文字题'} + +

+ {question.category} +
+ +
{question.content}
+ + {question.options && question.options.length > 0 && ( +
+ {question.options.map((option, optIndex) => ( +
+ +
+ ))} +
+ )} + +
+ 参考答案: + + {Array.isArray(question.answer) ? + // 多选题:直接拼接答案,不需要转换 + question.answer.join(', ') : + question.type === 'judgment' ? + // 判断题:A=正确,B=错误 + (question.answer === 'A' ? '正确' : '错误') : + // 单选题:直接显示答案,不需要转换 + question.answer} + +
+
+ ))} +
+
+ ) : ( +
+ 暂无考题数据 +
+ )} +
); }; diff --git a/src/pages/admin/ExamTaskPage.tsx b/src/pages/admin/ExamTaskPage.tsx index cdbb71e..4ff091c 100644 --- a/src/pages/admin/ExamTaskPage.tsx +++ b/src/pages/admin/ExamTaskPage.tsx @@ -12,6 +12,9 @@ interface ExamTask { startAt: string; endAt: string; userCount: number; + completedUsers: number; + passRate: number; + excellentRate: number; createdAt: string; } @@ -65,15 +68,31 @@ const ExamTaskPage = () => { setModalVisible(true); }; - const handleEdit = (task: ExamTask) => { + const handleEdit = async (task: ExamTask) => { setEditingTask(task); - form.setFieldsValue({ - name: task.name, - subjectId: task.subjectId, - startAt: dayjs(task.startAt), - endAt: dayjs(task.endAt), - userIds: [], - }); + try { + // 获取任务已分配的用户列表 + const userIdsRes = await api.get(`/admin/tasks/${task.id}/users`); + const userIds = userIdsRes.data; + + form.setFieldsValue({ + name: task.name, + subjectId: task.subjectId, + startAt: dayjs(task.startAt), + endAt: dayjs(task.endAt), + userIds: userIds, + }); + } catch (error) { + message.error('获取任务用户失败'); + // 即使获取失败,也要打开模态框,只是用户列表为空 + form.setFieldsValue({ + name: task.name, + subjectId: task.subjectId, + startAt: dayjs(task.startAt), + endAt: dayjs(task.endAt), + userIds: [], + }); + } setModalVisible(true); }; @@ -143,12 +162,68 @@ const ExamTaskPage = () => { key: 'endAt', render: (text: string) => dayjs(text).format('YYYY-MM-DD HH:mm'), }, + { + title: '考试进程', + dataIndex: ['startAt', 'endAt'], + key: 'progress', + render: (_: any, record: ExamTask) => { + const now = dayjs(); + const start = dayjs(record.startAt); + const end = dayjs(record.endAt); + + let progress = 0; + if (now < start) { + // 尚未开始 + progress = 0; + } else if (now > end) { + // 已结束 + progress = 100; + } else { + // 进行中 + const totalDuration = end.diff(start, 'millisecond'); + const elapsedDuration = now.diff(start, 'millisecond'); + progress = Math.round((elapsedDuration / totalDuration) * 100); + } + + return ( +
+
+ {progress}% +
+
+
+
+
+ ); + }, + }, { title: '参与人数', dataIndex: 'userCount', key: 'userCount', render: (count: number) => `${count} 人`, }, + { + title: '已完成人数', + dataIndex: 'completedUsers', + key: 'completedUsers', + render: (count: number) => `${count} 人`, + }, + { + title: '合格率', + dataIndex: 'passRate', + key: 'passRate', + render: (rate: number) => `${rate}%`, + }, + { + title: '优秀率', + dataIndex: 'excellentRate', + key: 'excellentRate', + render: (rate: number) => `${rate}%`, + }, { title: '创建时间', dataIndex: 'createdAt', @@ -231,7 +306,17 @@ const ExamTaskPage = () => { label="考试科目" rules={[{ required: true, message: '请选择考试科目' }]} > - { + const value = option?.children as string; + return value.toLowerCase().includes(input.toLowerCase()); + }} + dropdownStyle={{ maxHeight: 300, overflow: 'auto' }} + virtual + > {subjects.map((subject) => ( {subject.name} @@ -273,6 +358,15 @@ const ExamTaskPage = () => { mode="multiple" placeholder="请选择参与用户" style={{ width: '100%' }} + showSearch + filterOption={(input, option) => { + const value = option?.children as string; + return value.toLowerCase().includes(input.toLowerCase()); + }} + maxTagCount={3} + maxTagPlaceholder={(count) => `+${count} 个用户`} + dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} + virtual > {users.map((user) => ( @@ -288,7 +382,8 @@ const ExamTaskPage = () => { title="任务报表" open={reportModalVisible} onCancel={() => setReportModalVisible(false)} - footer={null} + onOk={() => setReportModalVisible(false)} + okText="关闭" width={800} > {reportData && ( diff --git a/src/pages/admin/QuestionCategoryPage.tsx b/src/pages/admin/QuestionCategoryPage.tsx index 2f5d8ea..8bc9770 100644 --- a/src/pages/admin/QuestionCategoryPage.tsx +++ b/src/pages/admin/QuestionCategoryPage.tsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import { Table, Button, Input, Space, message, Popconfirm, Modal, Form } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons'; +import { useLocation } from 'react-router-dom'; import api from '../../services/api'; interface QuestionCategory { @@ -15,6 +16,7 @@ const QuestionCategoryPage = () => { const [modalVisible, setModalVisible] = useState(false); const [editingCategory, setEditingCategory] = useState(null); const [form] = Form.useForm(); + const location = useLocation(); // 添加路由监听 const fetchCategories = async () => { setLoading(true); @@ -28,9 +30,15 @@ const QuestionCategoryPage = () => { } }; + // 当路由变化或组件挂载时重新获取类别列表 useEffect(() => { fetchCategories(); - }, []); + }, [location.pathname]); // 监听路由变化 + + // 手动刷新类别列表 + const handleRefresh = () => { + fetchCategories(); + }; const handleCreate = () => { setEditingCategory(null); @@ -114,9 +122,14 @@ const QuestionCategoryPage = () => {

题目类别管理

- + + + +
{ const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); + // 使用state来跟踪实时配置值 + const [configValues, setConfigValues] = useState({ + singleRatio: 40, + multipleRatio: 30, + judgmentRatio: 20, + textRatio: 10, + totalScore: 100 + }); useEffect(() => { fetchConfig(); @@ -23,7 +31,9 @@ const QuizConfigPage = () => { try { setLoading(true); const response = await adminAPI.getQuizConfig(); - form.setFieldsValue(response.data); + const config = response.data; + form.setFieldsValue(config); + setConfigValues(config); // 更新state } catch (error: any) { message.error(error.message || '获取配置失败'); } finally { @@ -35,9 +45,10 @@ const QuizConfigPage = () => { try { setSaving(true); - // 验证比例总和 + // 验证比例总和(添加容错,允许±0.01的精度误差) const totalRatio = values.singleRatio + values.multipleRatio + values.judgmentRatio + values.textRatio; - if (totalRatio !== 100) { + console.log('题型比例总和:', totalRatio); + if (Math.abs(totalRatio - 100) > 0.01) { message.error('题型比例总和必须为100%'); return; } @@ -50,16 +61,18 @@ const QuizConfigPage = () => { await adminAPI.updateQuizConfig(values); message.success('配置更新成功'); + setConfigValues(values); // 更新state } catch (error: any) { message.error(error.message || '更新配置失败'); + console.error('更新配置失败:', error); } finally { setSaving(false); } }; const onValuesChange = (changedValues: any, allValues: QuizConfig) => { - // 实时更新进度条 - form.setFieldsValue(allValues); + // 只更新state,不调用setFieldsValue,避免循环更新 + setConfigValues(allValues); }; const getProgressColor = (ratio: number) => { @@ -75,7 +88,18 @@ const QuizConfigPage = () => {

设置各题型的比例和试卷总分

- + + 抽题配置 + + 比例总和:{configValues.singleRatio + configValues.multipleRatio + configValues.judgmentRatio + configValues.textRatio}% + + + } + >
{
@@ -132,8 +156,8 @@ const QuizConfigPage = () => { @@ -157,8 +181,8 @@ const QuizConfigPage = () => { @@ -182,8 +206,8 @@ const QuizConfigPage = () => { @@ -212,20 +236,6 @@ const QuizConfigPage = () => { - - -
- 比例总和: - - {(form.getFieldValue('singleRatio') || 0) + - (form.getFieldValue('multipleRatio') || 0) + - (form.getFieldValue('judgmentRatio') || 0) + - (form.getFieldValue('textRatio') || 0)}% - -
- - - @@ -233,21 +369,30 @@ const UserManagePage = () => { return (
-
-

用户管理

- - - - - - - + + + + + +
{ onChange={handleTableChange} /> + {/* 答题记录面板 */} + {selectedUser && ( +
+

+ {selectedUser.name}的答题记录 + +

+
text || '无科目', + }, + { + title: '考试任务', + dataIndex: 'taskName', + key: 'taskName', + render: (text: string) => text || '无任务', + }, + { + title: '总分', + dataIndex: 'totalScore', + key: 'totalScore', + render: (score: number) => score || 0, + }, + { + title: '得分', + dataIndex: 'obtainedScore', + key: 'obtainedScore', + render: (score: number, record: QuizRecord) => { + // 确保score有默认值 + const actualScore = score || 0; + const totalScore = record.totalScore || 0; + return ( + = totalScore * 0.6 ? 'text-green-600' : 'text-red-600'}`}> + {actualScore} + + ); + }, + }, + { + title: '得分率', + dataIndex: 'scoreRate', + key: 'scoreRate', + render: (_: any, record: QuizRecord) => { + const obtainedScore = record.obtainedScore || 0; + const totalScore = record.totalScore || 0; + const rate = totalScore > 0 ? (obtainedScore / totalScore) * 100 : 0; + return `${rate.toFixed(1)}%`; + }, + }, + { + title: '考试时间', + dataIndex: 'createdAt', + key: 'createdAt', + render: (time: string) => new Date(time).toLocaleString(), + }, + ]} + dataSource={userRecords} + rowKey="id" + loading={recordsLoading} + pagination={recordsPagination} + onChange={handleRecordsPaginationChange} + scroll={{ x: 'max-content' }} + onRow={(record) => ({ + onClick: () => handleViewRecordDetail(record.id), + style: { cursor: 'pointer' }, + })} + /> + + )} + { + + {/* 记录详情弹窗 */} + + {recordDetail && ( +
+ {/* 考试基本信息 */} +
+
+
+ + {recordDetail.subjectName || '无科目'} +
+
+ + {recordDetail.taskName || '无任务'} +
+
+ + {recordDetail.totalScore || 0} +
+
+ + {recordDetail.obtainedScore || 0} +
+
+ + {new Date(recordDetail.createdAt).toLocaleString()} +
+
+
+ + {/* 题目列表 */} +

题目详情

+
+ {recordDetail.questions && recordDetail.questions.map((item: any, index: number) => ( +
+
+
+ 第{index + 1}题 + + {item.question.type === 'single' ? '单选题' : + item.question.type === 'multiple' ? '多选题' : + item.question.type === 'judgment' ? '判断题' : '文字题'} + + {item.score}分 + + {item.isCorrect ? '答对' : '答错'} + +
+
+ +
+

题目:{item.question.content}

+
+ + {/* 显示选项(如果有) */} + {item.question.options && item.question.options.length > 0 && ( +
+

选项:

+
+ {item.question.options.map((option: string, optIndex: number) => ( +
+ + {String.fromCharCode(65 + optIndex)} + + {option} +
+ ))} +
+
+ )} + + {/* 显示答案 */} +
+
+ 正确答案: + {Array.isArray(item.question.answer) ? item.question.answer.join(', ') : item.question.answer} +
+
+ 你的答案: + {Array.isArray(item.userAnswer) ? item.userAnswer.join(', ') : item.userAnswer || '未作答'} +
+
+
+ ))} +
+
+ )} +
); }; diff --git a/src/services/api.ts b/src/services/api.ts index e883f60..a545b1d 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -4,7 +4,7 @@ const API_BASE_URL = '/api'; const api = axios.create({ baseURL: API_BASE_URL, - timeout: 10000, + timeout: 30000, // 增加超时时间到30秒 headers: { 'Content-Type': 'application/json', }, @@ -60,6 +60,7 @@ export const userAPI = { createUser: (data: { name: string; phone: string; password?: string }) => api.post('/users', data), getUser: (id: string) => api.get(`/users/${id}`), validateUserInfo: (data: { name: string; phone: string }) => api.post('/users/validate', data), + getUsersByName: (name: string) => api.get(`/users/name/${name}`), }; // 题目相关API @@ -108,6 +109,7 @@ export const adminAPI = { getQuizConfig: () => api.get('/admin/config'), updateQuizConfig: (data: any) => api.put('/admin/config', data), getStatistics: () => api.get('/admin/statistics'), + getActiveTasksStats: () => api.get('/admin/active-tasks'), updatePassword: (data: { username: string; oldPassword: string; newPassword: string }) => api.put('/admin/password', data), };