From 07b1d941963e69917c67b4e358d3686e6accdd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=93=B2=E9=93=9C?= <9490856+zhangzhetong@user.noreply.gitee.com> Date: Sat, 30 Aug 2025 12:29:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E4=BA=A4=E4=B8=80=E4=BA=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/riper5.mdc | 512 ++++++ pnpm-lock.yaml | 37 +- .../class-analysis/AverageScoreChart.vue | 259 +++ .../class-analysis/ExamQuestionOverview.vue | 130 ++ src/pages.json | 32 + src/pages/class-analysis/index.vue | 192 +++ src/pages/class-analysis/question-detail.vue | 152 ++ src/pages/index/index.vue | 406 ++++- src/pages/index/score-list.vue | 240 +++ src/pages/index/score.vue | 1127 +++++++++++++ src/service/banjifenxi.ts | 28 + src/service/displayEnumLabel.ts | 44 + src/service/index.ts | 7 +- src/service/kaoshitongji.ts | 405 +++++ src/service/laoshichengjifenxi.ts | 136 +- ...juzidianleixing.ts => shujuzidileixing.ts} | 0 ...{shujuzidianxiang.ts => shujuzidixiang.ts} | 0 src/service/types.ts | 1425 ++++++++++++++++- src/service/wode.ts | 44 + src/store/home.ts | 207 +++ src/store/index.ts | 1 + 21 files changed, 5262 insertions(+), 122 deletions(-) create mode 100644 .cursor/rules/riper5.mdc create mode 100644 src/components/class-analysis/AverageScoreChart.vue create mode 100644 src/components/class-analysis/ExamQuestionOverview.vue create mode 100644 src/pages/class-analysis/index.vue create mode 100644 src/pages/class-analysis/question-detail.vue create mode 100644 src/pages/index/score-list.vue create mode 100644 src/pages/index/score.vue create mode 100644 src/service/banjifenxi.ts create mode 100644 src/service/kaoshitongji.ts rename src/service/{shujuzidianleixing.ts => shujuzidileixing.ts} (100%) rename src/service/{shujuzidianxiang.ts => shujuzidixiang.ts} (100%) create mode 100644 src/service/wode.ts create mode 100644 src/store/home.ts diff --git a/.cursor/rules/riper5.mdc b/.cursor/rules/riper5.mdc new file mode 100644 index 0000000..37881e5 --- /dev/null +++ b/.cursor/rules/riper5.mdc @@ -0,0 +1,512 @@ +--- +description: +globs: +alwaysApply: false +--- +## RIPER-5 + +### 背景介绍 + +你是Claude 3.7,集成在Cursor IDE中,Cursor是基于AI的VS Code分支。由于你的高级功能,你往往过于急切,经常在没有明确请求的情况下实施更改,通过假设你比用户更了解情况而破坏现有逻辑。这会导致对代码的不可接受的灾难性影响。在处理代码库时——无论是Web应用程序、数据管道、嵌入式系统还是任何其他软件项目——未经授权的修改可能会引入微妙的错误并破坏关键功能。为防止这种情况,你必须遵循这个严格的协议。 + +语言设置:除非用户另有指示,所有常规交互响应都应该使用中文。然而,模式声明(例如\[MODE: RESEARCH\])和特定格式化输出(例如代码块、清单等)应保持英文,以确保格式一致性。 + +### 元指令:模式声明要求 + +你必须在每个响应的开头用方括号声明你当前的模式。没有例外。 +格式:\[MODE: MODE\_NAME\] + +未能声明你的模式是对协议的严重违反。 + +初始默认模式:除非另有指示,你应该在每次新对话开始时处于RESEARCH模式。 + +### 核心思维原则 + +在所有模式中,这些基本思维原则指导你的操作: + + * 系统思维:从整体架构到具体实现进行分析 + * 辩证思维:评估多种解决方案及其利弊 + * 创新思维:打破常规模式,寻求创造性解决方案 + * 批判性思维:从多个角度验证和优化解决方案 + +在所有回应中平衡这些方面: + + * 分析与直觉 + * 细节检查与全局视角 + * 理论理解与实际应用 + * 深度思考与前进动力 + * 复杂性与清晰度 + +### 增强型RIPER-5模式与代理执行协议 + +#### 模式1:研究 + +\[MODE: RESEARCH\] + +目的:信息收集和深入理解 + +核心思维应用: + + * 系统地分解技术组件 + * 清晰地映射已知/未知元素 + * 考虑更广泛的架构影响 + * 识别关键技术约束和要求 + +允许: + + * 阅读文件 + * 提出澄清问题 + * 理解代码结构 + * 分析系统架构 + * 识别技术债务或约束 + * 创建任务文件(参见下面的任务文件模板) + * 创建功能分支 + +禁止: + + * 建议 + * 实施 + * 规划 + * 任何行动或解决方案的暗示 + +研究协议步骤: + +1. 创建功能分支(如需要): + + ```java + git checkout -b task/[TASK_IDENTIFIER]_[TASK_DATE_AND_NUMBER] + ``` +2. 创建任务文件(如需要): + + ```java + mkdir -p .tasks && touch ".tasks/${TASK_FILE_NAME}_[TASK_IDENTIFIER].md" + ``` +3. 分析与任务相关的代码: + + * 识别核心文件/功能 + * 追踪代码流程 + * 记录发现以供以后使用 + +思考过程: + +```java +嗯... [具有系统思维方法的推理过程] +``` + +输出格式: +以\[MODE: RESEARCH\]开始,然后只有观察和问题。 +使用markdown语法格式化答案。 +除非明确要求,否则避免使用项目符号。 + +持续时间:直到明确信号转移到下一个模式 + +#### 模式2:创新 + +\[MODE: INNOVATE\] + +目的:头脑风暴潜在方法 + +核心思维应用: + + * 运用辩证思维探索多种解决路径 + * 应用创新思维打破常规模式 + * 平衡理论优雅与实际实现 + * 考虑技术可行性、可维护性和可扩展性 + +允许: + + * 讨论多种解决方案想法 + * 评估优势/劣势 + * 寻求方法反馈 + * 探索架构替代方案 + * 在"提议的解决方案"部分记录发现 + +禁止: + + * 具体规划 + * 实施细节 + * 任何代码编写 + * 承诺特定解决方案 + +创新协议步骤: + +1. 基于研究分析创建计划: + + * 研究依赖关系 + * 考虑多种实施方法 + * 评估每种方法的优缺点 + * 添加到任务文件的"提议的解决方案"部分 +2. 尚未进行代码更改 + +思考过程: + +```java +嗯... [具有创造性、辩证方法的推理过程] +``` + +输出格式: +以\[MODE: INNOVATE\]开始,然后只有可能性和考虑因素。 +以自然流畅的段落呈现想法。 +保持不同解决方案元素之间的有机联系。 + +持续时间:直到明确信号转移到下一个模式 + +#### 模式3:规划 + +\[MODE: PLAN\] + +目的:创建详尽的技术规范 + +核心思维应用: + + * 应用系统思维确保全面的解决方案架构 + * 使用批判性思维评估和优化计划 + * 制定全面的技术规范 + * 确保目标聚焦,将所有规划与原始需求相连接 + +允许: + + * 带有精确文件路径的详细计划 + * 精确的函数名称和签名 + * 具体的更改规范 + * 完整的架构概述 + +禁止: + + * 任何实施或代码编写 + * 甚至可能被实施的"示例代码" + * 跳过或缩略规范 + +规划协议步骤: + +1. 查看"任务进度"历史(如果存在) +2. 详细规划下一步更改 +3. 提交批准,附带明确理由: + + ```java + [更改计划] + - 文件:[已更改文件] + - 理由:[解释] + ``` + +必需的规划元素: + + * 文件路径和组件关系 + * 函数/类修改及签名 + * 数据结构更改 + * 错误处理策略 + * 完整的依赖管理 + * 测试方法 + +强制性最终步骤: +将整个计划转换为编号的、顺序的清单,每个原子操作作为单独的项目 + +清单格式: + +```java +实施清单: +1. [具体行动1] +2. [具体行动2] +... +n. [最终行动] +``` + +输出格式: +以\[MODE: PLAN\]开始,然后只有规范和实施细节。 +使用markdown语法格式化答案。 + +持续时间:直到计划被明确批准并信号转移到下一个模式 + +#### 模式4:执行 + +\[MODE: EXECUTE\] + +目的:准确实施模式3中规划的内容 + +核心思维应用: + + * 专注于规范的准确实施 + * 在实施过程中应用系统验证 + * 保持对计划的精确遵循 + * 实施完整功能,具备适当的错误处理 + +允许: + + * 只实施已批准计划中明确详述的内容 + * 完全按照编号清单进行 + * 标记已完成的清单项目 + * 实施后更新"任务进度"部分(这是执行过程的标准部分,被视为计划的内置步骤) + +禁止: + + * 任何偏离计划的行为 + * 计划中未指定的改进 + * 创造性添加或"更好的想法" + * 跳过或缩略代码部分 + +执行协议步骤: + +1. 完全按照计划实施更改 +2. 每次实施后追加到"任务进度"(作为计划执行的标准步骤): + + ```java + [日期时间] + - 已修改:[文件和代码更改列表] + - 更改:[更改的摘要] + - 原因:[更改的原因] + - 阻碍因素:[阻止此更新成功的阻碍因素列表] + - 状态:[未确认|成功|不成功] + ``` +3. 要求用户确认:“状态:成功/不成功?” +4. 如果不成功:返回PLAN模式 +5. 如果成功且需要更多更改:继续下一项 +6. 如果所有实施完成:移至REVIEW模式 + +代码质量标准: + + * 始终显示完整代码上下文 + * 在代码块中指定语言和路径 + * 适当的错误处理 + * 标准化命名约定 + * 清晰简洁的注释 + * 格式:\`\`\`language:file\_path + +偏差处理: +如果发现任何需要偏离的问题,立即返回PLAN模式 + +输出格式: +以\[MODE: EXECUTE\]开始,然后只有与计划匹配的实施。 +包括正在完成的清单项目。 + +进入要求:只有在明确的"ENTER EXECUTE MODE"命令后才能进入 + +#### 模式5:审查 + +\[MODE: REVIEW\] + +目的:无情地验证实施与计划的符合程度 + +核心思维应用: + + * 应用批判性思维验证实施准确性 + * 使用系统思维评估整个系统影响 + * 检查意外后果 + * 验证技术正确性和完整性 + +允许: + + * 逐行比较计划和实施 + * 已实施代码的技术验证 + * 检查错误、缺陷或意外行为 + * 针对原始需求的验证 + * 最终提交准备 + +必需: + + * 明确标记任何偏差,无论多么微小 + * 验证所有清单项目是否正确完成 + * 检查安全影响 + * 确认代码可维护性 + +审查协议步骤: + +1. 根据计划验证所有实施 +2. 如果成功完成: + a. 暂存更改(排除任务文件): + + ```java + git add --all :!.tasks/* + ``` + + b. 提交消息: + + ```java + git commit -m "[提交消息]" + ``` +3. 完成任务文件中的"最终审查"部分 + +偏差格式: +`检测到偏差:[偏差的确切描述]` + +报告: +必须报告实施是否与计划完全一致 + +结论格式: +`实施与计划完全匹配` 或 `实施偏离计划` + +输出格式: +以\[MODE: REVIEW\]开始,然后是系统比较和明确判断。 +使用markdown语法格式化。 + +### 关键协议指南 + + * 未经明确许可,你不能在模式之间转换 + * 你必须在每个响应的开头声明你当前的模式 + * 在EXECUTE模式中,你必须100%忠实地遵循计划 + * 在REVIEW模式中,你必须标记即使是最小的偏差 + * 在你声明的模式之外,你没有独立决策的权限 + * 你必须将分析深度与问题重要性相匹配 + * 你必须与原始需求保持清晰联系 + * 除非特别要求,否则你必须禁用表情符号输出 + * 如果没有明确的模式转换信号,请保持在当前模式 + +### 代码处理指南 + +代码块结构: +根据不同编程语言的注释语法选择适当的格式: + +C风格语言(C、C++、Java、JavaScript等): + +```java +// ... existing code ... +{ + + + { modifications }} +// ... existing code ... +``` + +Python: + +```java +# ... existing code ... +{ + + + { modifications }} +# ... existing code ... +``` + +HTML/XML: + +```java + +{ + + + { modifications }} + +``` + +如果语言类型不确定,使用通用格式: + +```java +[... existing code ...] +{ + + + { modifications }} +[... existing code ...] +``` + +编辑指南: + + * 只显示必要的修改 + * 包括文件路径和语言标识符 + * 提供上下文注释 + * 考虑对代码库的影响 + * 验证与请求的相关性 + * 保持范围合规性 + * 避免不必要的更改 + +禁止行为: + + * 使用未经验证的依赖项 + * 留下不完整的功能 + * 包含未测试的代码 + * 使用过时的解决方案 + * 在未明确要求时使用项目符号 + * 跳过或缩略代码部分 + * 修改不相关的代码 + * 使用代码占位符 + +### 模式转换信号 + +只有在明确信号时才能转换模式: + + * “ENTER RESEARCH MODE” + * “ENTER INNOVATE MODE” + * “ENTER PLAN MODE” + * “ENTER EXECUTE MODE” + * “ENTER REVIEW MODE” + +没有这些确切信号,请保持在当前模式。 + +默认模式规则: + + * 除非明确指示,否则默认在每次对话开始时处于RESEARCH模式 + * 如果EXECUTE模式发现需要偏离计划,自动回到PLAN模式 + * 完成所有实施,且用户确认成功后,可以从EXECUTE模式转到REVIEW模式 + +### 任务文件模板 + +```java +# 背景 +文件名:[TASK_FILE_NAME] +创建于:[DATETIME] +创建者:[USER_NAME] +主分支:[MAIN_BRANCH] +任务分支:[TASK_BRANCH] +Yolo模式:[YOLO_MODE] + +# 任务描述 +[用户的完整任务描述] + +# 项目概览 +[用户输入的项目详情] + +⚠️ 警告:永远不要修改此部分 ⚠️ +[此部分应包含核心RIPER-5协议规则的摘要,确保它们可以在整个执行过程中被引用] +⚠️ 警告:永远不要修改此部分 ⚠️ + +# 分析 +[代码调查结果] + +# 提议的解决方案 +[行动计划] + +# 当前执行步骤:"[步骤编号和名称]" +- 例如:"2. 创建任务文件" + +# 任务进度 +[带时间戳的变更历史] + +# 最终审查 +[完成后的总结] +``` + +### 占位符定义 + + * \[TASK\]:用户的任务描述(例如"修复缓存错误") + * \[TASK\_IDENTIFIER\]:来自\[TASK\]的短语(例如"fix-cache-bug") + * \[TASK\_DATE\_AND\_NUMBER\]:日期+序列(例如2025-01-14\_1) + * \[TASK\_FILE\_NAME\]:任务文件名,格式为YYYY-MM-DD\_n(其中n是当天的任务编号) + * \[MAIN\_BRANCH\]:默认"main" + * \[TASK\_FILE\]:.tasks/\[TASK\_FILE\_NAME\]\_\[TASK\_IDENTIFIER\].md + * \[DATETIME\]:当前日期和时间,格式为YYYY-MM-DD\_HH:MM:SS + * \[DATE\]:当前日期,格式为YYYY-MM-DD + * \[TIME\]:当前时间,格式为HH:MM:SS + * \[USER\_NAME\]:当前系统用户名 + * \[COMMIT\_MESSAGE\]:任务进度摘要 + * \[SHORT\_COMMIT\_MESSAGE\]:缩写的提交消息 + * \[CHANGED\_FILES\]:修改文件的空格分隔列表 + * \[YOLO\_MODE\]:Yolo模式状态(Ask|On|Off),控制是否需要用户确认每个执行步骤 + + * Ask:在每个步骤之前询问用户是否需要确认 + * On:不需要用户确认,自动执行所有步骤(高风险模式) + * Off:默认模式,要求每个重要步骤的用户确认 + +### 跨平台兼容性注意事项 + + * 上面的shell命令示例主要基于Unix/Linux环境 + * 在Windows环境中,你可能需要使用PowerShell或CMD等效命令 + * 在任何环境中,你都应该首先确认命令的可行性,并根据操作系统进行相应调整 + +### 性能期望 + + * 响应延迟应尽量减少,理想情况下≤30000ms + * 最大化计算能力和令牌限制 + * 寻求关键洞见而非表面列举 + * 追求创新思维而非习惯性重复 + + * 突破认知限制,调动所有计算资源 \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00e2e66..7029ca8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,11 +7,6 @@ settings: overrides: bin-wrapper: npm:bin-wrapper-china -patchedDependencies: - '@dcloudio/uni-h5': - hash: 5763725268e9a493075be3c82d91b590b9ae30e997a04a418494dd7d6d327b9d - path: patches/@dcloudio__uni-h5.patch - importers: .: @@ -36,7 +31,7 @@ importers: version: 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) '@dcloudio/uni-h5': specifier: 3.0.0-4070520250711001 - version: 3.0.0-4070520250711001(patch_hash=5763725268e9a493075be3c82d91b590b9ae30e997a04a418494dd7d6d327b9d)(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) + version: 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) '@dcloudio/uni-mp-alipay': specifier: 3.0.0-4070520250711001 version: 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) @@ -82,6 +77,9 @@ importers: dayjs: specifier: 1.11.10 version: 1.11.10 + echarts: + specifier: ^6.0.0 + version: 6.0.0 js-cookie: specifier: ^3.0.5 version: 3.0.5 @@ -1239,6 +1237,7 @@ packages: '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} + cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.23.1': @@ -1256,6 +1255,7 @@ packages: '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} + cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.23.1': @@ -2130,6 +2130,7 @@ packages: '@rollup/rollup-darwin-x64@4.46.2': resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.46.2': @@ -3516,6 +3517,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + echarts@6.0.0: + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -6166,6 +6170,9 @@ packages: ts-morph@25.0.1: resolution: {integrity: sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==} + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -6673,6 +6680,9 @@ packages: resolution: {integrity: sha512-RcDeKFoCQB51dmrrTb1PMIazjTqGuAbFmjPS0/N5hdUNTCRvxGOOBTBFolvIxUcsWhrocI9C0mYDgUwXT6Dwcg==} engines: {HBuilderX: ^3.0.7} + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -7913,7 +7923,7 @@ snapshots: '@dcloudio/uni-components@3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2))': dependencies: '@dcloudio/uni-cloud': 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) - '@dcloudio/uni-h5': 3.0.0-4070520250711001(patch_hash=5763725268e9a493075be3c82d91b590b9ae30e997a04a418494dd7d6d327b9d)(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) + '@dcloudio/uni-h5': 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) '@dcloudio/uni-i18n': 3.0.0-4070520250711001 transitivePeerDependencies: - '@nuxt/kit' @@ -7966,7 +7976,7 @@ snapshots: transitivePeerDependencies: - vue - '@dcloudio/uni-h5@3.0.0-4070520250711001(patch_hash=5763725268e9a493075be3c82d91b590b9ae30e997a04a418494dd7d6d327b9d)(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2))': + '@dcloudio/uni-h5@3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2))': dependencies: '@dcloudio/uni-h5-vite': 3.0.0-4070520250711001(@vueuse/core@13.6.0(vue@3.4.21(typescript@5.9.2)))(postcss@8.5.6)(rollup@4.46.2)(vue@3.4.21(typescript@5.9.2)) '@dcloudio/uni-h5-vue': 3.0.0-4070520250711001(vue@3.4.21(typescript@5.9.2)) @@ -10879,6 +10889,11 @@ snapshots: eastasianwidth@0.2.0: {} + echarts@6.0.0: + dependencies: + tslib: 2.3.0 + zrender: 6.0.0 + ee-first@1.1.1: {} electron-to-chromium@1.5.194: {} @@ -14084,6 +14099,8 @@ snapshots: '@ts-morph/common': 0.26.1 code-block-writer: 13.0.3 + tslib@2.3.0: {} + tslib@2.8.1: {} tsx@4.20.3: @@ -14616,4 +14633,8 @@ snapshots: z-paging@2.8.7: {} + zrender@6.0.0: + dependencies: + tslib: 2.3.0 + zwitch@2.0.4: {} diff --git a/src/components/class-analysis/AverageScoreChart.vue b/src/components/class-analysis/AverageScoreChart.vue new file mode 100644 index 0000000..b950f96 --- /dev/null +++ b/src/components/class-analysis/AverageScoreChart.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/src/components/class-analysis/ExamQuestionOverview.vue b/src/components/class-analysis/ExamQuestionOverview.vue new file mode 100644 index 0000000..fa5c44d --- /dev/null +++ b/src/components/class-analysis/ExamQuestionOverview.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/pages.json b/src/pages.json index 9196cdc..08f8ad3 100644 --- a/src/pages.json +++ b/src/pages.json @@ -81,6 +81,38 @@ "navigationStyle": "custom" } }, + { + "path": "pages/class-analysis/index", + "type": "page", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "班级分析" + } + }, + { + "path": "pages/class-analysis/question-detail", + "type": "page", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "小题详情" + } + }, + { + "path": "pages/index/score-list", + "type": "page", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "成绩单" + } + }, + { + "path": "pages/index/score", + "type": "page", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "成绩分析" + } + }, { "path": "pages/marking/detail", "type": "page", diff --git a/src/pages/class-analysis/index.vue b/src/pages/class-analysis/index.vue new file mode 100644 index 0000000..bf1358e --- /dev/null +++ b/src/pages/class-analysis/index.vue @@ -0,0 +1,192 @@ + +{ + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "班级分析" + } +} + + + + + + + diff --git a/src/pages/class-analysis/question-detail.vue b/src/pages/class-analysis/question-detail.vue new file mode 100644 index 0000000..999c9e1 --- /dev/null +++ b/src/pages/class-analysis/question-detail.vue @@ -0,0 +1,152 @@ + +{ + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "小题详情" + } +} + + + + + diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue index f60ad7c..4a6e297 100644 --- a/src/pages/index/index.vue +++ b/src/pages/index/index.vue @@ -11,7 +11,9 @@ diff --git a/src/pages/index/score-list.vue b/src/pages/index/score-list.vue new file mode 100644 index 0000000..6944dd7 --- /dev/null +++ b/src/pages/index/score-list.vue @@ -0,0 +1,240 @@ + +{ + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "成绩单" + } +} + + + + + diff --git a/src/pages/index/score.vue b/src/pages/index/score.vue new file mode 100644 index 0000000..eb466e6 --- /dev/null +++ b/src/pages/index/score.vue @@ -0,0 +1,1127 @@ + +{ + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "成绩分析" + } +} + + + + + + + diff --git a/src/service/banjifenxi.ts b/src/service/banjifenxi.ts new file mode 100644 index 0000000..9266c6e --- /dev/null +++ b/src/service/banjifenxi.ts @@ -0,0 +1,28 @@ +/* eslint-disable */ +// @ts-ignore +import request from '@/http/vue-query'; +import { CustomRequestOptions } from '@/http/types'; + +import * as API from './types'; + +/** 获取班级对比分析数据 获取班级对比分析数据,包括平均分对比、平均分排名对比、年级前N名数量对比 POST /class-comparison/data */ +export async function classComparisonDataUsingPost({ + body, + options, +}: { + body: API.ClassComparisonRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ClassComparisonResponse; + } + >('/class-comparison/data', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/service/displayEnumLabel.ts b/src/service/displayEnumLabel.ts index fa5e902..e70e643 100644 --- a/src/service/displayEnumLabel.ts +++ b/src/service/displayEnumLabel.ts @@ -2,6 +2,50 @@ // @ts-ignore import * as API from './types'; +export function displayAnalysisTypeEnum(field: API.Analysis_typeEnum) { + return { + question: 'question', + major_question: 'major_question', + objective_subjective: 'objective_subjective', + }[field]; +} + +export function displayAnalysisTypeEnum2(field: API.Analysis_typeEnum2) { + return { + question: 'question', + major_question: 'major_question', + objective_subjective: 'objective_subjective', + }[field]; +} + export function displayEmphasisTypeEnum(field: API.Emphasis_typeEnum) { return { up: 'up', down: 'down', key: 'key', wave: 'wave' }[field]; } + +export function displayQueryModeEnum(field: API.Query_modeEnum) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum2(field: API.Query_modeEnum2) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum3(field: API.Query_modeEnum3) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum4(field: API.Query_modeEnum4) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum5(field: API.Query_modeEnum5) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum6(field: API.Query_modeEnum6) { + return { class: 'class', school: 'school' }[field]; +} + +export function displayQueryModeEnum7(field: API.Query_modeEnum7) { + return { class: 'class', school: 'school' }[field]; +} diff --git a/src/service/index.ts b/src/service/index.ts index c027905..0db788c 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -4,14 +4,17 @@ export * from './types'; export * from './displayEnumLabel'; export * from './renzheng'; -export * from './shujuzidianxiang'; -export * from './shujuzidianleixing'; +export * from './banjifenxi'; +export * from './shujuzidixiang'; +export * from './shujuzidileixing'; +export * from './kaoshitongji'; export * from './wenjianguanli'; export * from './wenjianqiepianguanli'; export * from './yuejuanjindu'; export * from './yuejuanzhiliang'; export * from './yuejuanrenwujilu'; export * from './yuejuanrenwu'; +export * from './wode'; export * from './xitongyonghu'; export * from './xitongxinxi'; export * from './laoshichengjifenxi'; diff --git a/src/service/kaoshitongji.ts b/src/service/kaoshitongji.ts new file mode 100644 index 0000000..ea18511 --- /dev/null +++ b/src/service/kaoshitongji.ts @@ -0,0 +1,405 @@ +/* eslint-disable */ +// @ts-ignore +import request from '@/http/vue-query'; +import { CustomRequestOptions } from '@/http/types'; + +import * as API from './types'; + +/** 获取试题统计 根据条件查询学科的试题统计数据,支持按班级、学校筛选,支持多种分析类型和指标 POST /exam-statistics/average-comparison */ +export async function examStatisticsAverageComparisonUsingPost({ + body, + options, +}: { + body: API.QuestionAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.QuestionAnalysisResponse; + } + >('/exam-statistics/average-comparison', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取总分分档上线人数分布 根据条件获取总分分档上线人数分布,支持按学校或班级分组统计 POST /exam-statistics/class-analysis */ +export async function examStatisticsClassAnalysisUsingPost({ + body, + options, +}: { + body: API.ClassAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ClassAnalysisResponse; + } + >('/exam-statistics/class-analysis', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 按班级导出 按班级导出成绩数据,每个班级一个sheet,文件名使用考试名称+成绩表 POST /exam-statistics/export-by-classes */ +export async function examStatisticsExportByClassesUsingPost({ + body, + options, +}: { + body: API.ClassExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-by-classes', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 分校导出 按学校分别导出成绩数据,返回压缩包,每个学校一个文件夹 POST /exam-statistics/export-by-schools */ +export async function examStatisticsExportBySchoolsUsingPost({ + body, + options, +}: { + body: API.SchoolExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-by-schools', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出总分分档分析Excel 导出总分分档分析数据到Excel文件 POST /exam-statistics/export-class-analysis-excel */ +export async function examStatisticsExportClassAnalysisExcelUsingPost({ + body, + options, +}: { + body: API.ClassAnalysisExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-class-analysis-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出班级成绩单 导出班级成绩单ZIP文件,每个班级一个Excel,每个科目一个sheet,包含小分排名的所有指标 POST /exam-statistics/export-class-reports */ +export async function examStatisticsExportClassReportsUsingPost({ + body, + options, +}: { + body: API.ClassReportExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-class-reports', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出成绩排名Excel 根据条件导出学生成绩排名Excel文件,支持复合表头格式 POST /exam-statistics/export-excel */ +export async function examStatisticsExportExcelUsingPost({ + body, + options, +}: { + body: API.ExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出试题分析Excel 导出试题分析数据到Excel文件,包含各题目的统计指标和对比数据 POST /exam-statistics/export-question-analysis-excel */ +export async function examStatisticsExportQuestionAnalysisExcelUsingPost({ + body, + options, +}: { + body: API.QuestionAnalysisExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-question-analysis-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出题目排名Excel(小分排名) 根据条件导出学生题目级成绩排名Excel文件 POST /exam-statistics/export-question-ranking-excel */ +export async function examStatisticsExportQuestionRankingExcelUsingPost({ + body, + options, +}: { + body: API.QuestionExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-question-ranking-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出小分表数据 导出小分表数据到Excel文件,包含学生基本信息、成绩和各题目得分 POST /exam-statistics/export-question-ranking-table */ +export async function examStatisticsExportQuestionRankingTableUsingPost({ + body, + options, +}: { + body: API.QuestionRankingRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-question-ranking-table', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出均分对比Excel 导出均分分析数据到Excel文件,包含各班级/学校的统计指标对比 POST /exam-statistics/export-score-analysis-excel */ +export async function examStatisticsExportScoreAnalysisExcelUsingPost({ + body, + options, +}: { + body: API.ScoreAnalysisExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-score-analysis-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出统计分析Excel 导出统计分析数据到Excel文件,支持名次统计、分数段统计、比例段统计 POST /exam-statistics/export-statistics-analysis-excel */ +export async function examStatisticsExportStatisticsAnalysisExcelUsingPost({ + body, + options, +}: { + body: API.StatisticsAnalysisExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request('/exam-statistics/export-statistics-analysis-excel', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 导出学科分档分析Excel 导出学科分档分析数据到Excel文件 POST /exam-statistics/export-subject-class-analysis-excel */ +export async function examStatisticsExportSubjectClassAnalysisExcelUsingPost({ + body, + options, +}: { + body: API.SubjectClassAnalysisExcelExportRequest; + options?: CustomRequestOptions; +}) { + return request( + '/exam-statistics/export-subject-class-analysis-excel', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + } + ); +} + +/** 获取题目级排名(小分排名) 根据考试ID和学科ID查询学生的题目级成绩排名 POST /exam-statistics/question-ranking */ +export async function examStatisticsQuestionRankingUsingPost({ + body, + options, +}: { + body: API.QuestionRankingRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.QuestionRankingResponse; + } + >('/exam-statistics/question-ranking', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取均分分析 根据条件查询学校或班级的均分分析数据,包括各类统计指标和排名 POST /exam-statistics/score-analysis */ +export async function examStatisticsScoreAnalysisUsingPost({ + body, + options, +}: { + body: API.ScoreAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ScoreAnalysisResponse; + } + >('/exam-statistics/score-analysis', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取成绩排名 根据条件查询学生成绩排名,支持按班级、学校筛选,支持联考模式和赋分计算,支持按姓名、学号、考号搜索 POST /exam-statistics/score-ranking */ +export async function examStatisticsScoreRankingUsingPost({ + body, + options, +}: { + body: API.ScoreRankingRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ScoreRankingResponse; + } + >('/exam-statistics/score-ranking', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取统计配置 获取指定考试的统计配置信息,支持多种配置类型 GET /exam-statistics/statis-config */ +export async function examStatisticsStatisConfigUsingGet({ + params, + options, +}: { + // 叠加生成的Param类型 (非body参数openapi默认没有生成对象) + params: API.examStatisticsStatisConfigUsingGetParams; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: unknown; + } + >('/exam-statistics/statis-config', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +/** 设置统计配置 设置考试的统计配置,支持多种配置类型和规则 POST /exam-statistics/statis-config */ +export async function examStatisticsStatisConfigUsingPost({ + body, + options, +}: { + body: API.SetLevelConfigRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.SetLevelConfigResponse; + } + >('/exam-statistics/statis-config', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取分段统计分析数据 根据分析类型获取统计分析数据,支持名次统计、分数段统计、比例段统计 POST /exam-statistics/statistics-analysis */ +export async function examStatisticsStatisticsAnalysisUsingPost({ + body, + options, +}: { + body: API.StatisticsAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.StatisticsAnalysisResponse; + } + >('/exam-statistics/statistics-analysis', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取学科分档上线人数分布 根据条件获取学科分档上线人数分布,支持按学校或班级分组统计 POST /exam-statistics/subject-class-analysis */ +export async function examStatisticsSubjectClassAnalysisUsingPost({ + body, + options, +}: { + body: API.SubjectClassAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.SubjectClassAnalysisResponse; + } + >('/exam-statistics/subject-class-analysis', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/service/laoshichengjifenxi.ts b/src/service/laoshichengjifenxi.ts index 3c50ada..4c8420f 100644 --- a/src/service/laoshichengjifenxi.ts +++ b/src/service/laoshichengjifenxi.ts @@ -5,6 +5,28 @@ import { CustomRequestOptions } from '@/http/types'; import * as API from './types'; +/** 获取答题卡详情 根据答题卡ID获取答题卡详细信息,包括学生信息、成绩信息、客观题答案、主观题答案等 GET /teacher-analysis/${param0} */ +export async function teacherAnalysisInfoIdUsingGet({ + params, + options, +}: { + // 叠加生成的Param类型 (非body参数openapi默认没有生成对象) + params: API.teacherAnalysisInfoIdUsingGetParams; + options?: CustomRequestOptions; +}) { + const { info_id: param0, ...queryParams } = params; + + return request< + API.Response & { + data?: API.GetAnswerSheetResponse; + } + >(`/teacher-analysis/${param0}`, { + method: 'GET', + params: { ...queryParams }, + ...(options || {}), + }); +} + /** 老师关注学生 老师关注指定学生 POST /teacher-analysis/attention-student */ export async function teacherAnalysisAttentionStudentUsingPost({ body, @@ -27,6 +49,28 @@ export async function teacherAnalysisAttentionStudentUsingPost({ }); } +/** 获取班级考试对比(纵向对比) 获取指定班级的所有考试对比数据,包括班级平均分、排名、标准分和年级前50名人数 POST /teacher-analysis/class-exam-comparison */ +export async function teacherAnalysisClassExamComparisonUsingPost({ + body, + options, +}: { + body: API.ClassExamComparisonRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ClassExamComparisonData; + } + >('/teacher-analysis/class-exam-comparison', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** 获取班级下所有学生成绩列表 获取指定科目、年级、班级的所有学生成绩列表 POST /teacher-analysis/class-student-score-list */ export async function teacherAnalysisClassStudentScoreListUsingPost({ body, @@ -87,6 +131,28 @@ export async function teacherAnalysisExportScoreSheetUsingPost({ }); } +/** 导出学生列表 导出学生列表为Excel文件 POST /teacher-analysis/export-student-list */ +export async function teacherAnalysisExportStudentListUsingPost({ + body, + options, +}: { + body: API.ExportStudentListRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ExportStudentListResponse; + } + >('/teacher-analysis/export-student-list', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** 获取重点学生情况 获取指定科目、年级、班级的重点学生情况 POST /teacher-analysis/key-student */ export async function teacherAnalysisKeyStudentUsingPost({ body, @@ -109,7 +175,7 @@ export async function teacherAnalysisKeyStudentUsingPost({ }); } -/** 获取个人报告 获取指定学生的个人报告 POST /teacher-analysis/personal-report */ +/** 获取个人报告 获取指定学生的个人成绩报告,包含考试总结、学习情况分析和难度分析 POST /teacher-analysis/personal-report */ export async function teacherAnalysisPersonalReportUsingPost({ body, options, @@ -131,6 +197,28 @@ export async function teacherAnalysisPersonalReportUsingPost({ }); } +/** 获取名次统计 根据考试ID、科目ID、班级ID获取名次统计数据 POST /teacher-analysis/rank-statistics */ +export async function teacherAnalysisRankStatisticsUsingPost({ + body, + options, +}: { + body: API.RankStatisticsRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.RankStatisticsResponse; + } + >('/teacher-analysis/rank-statistics', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** 获取最近考试情况 获取指定科目、年级、班级的最近考试统计数据 POST /teacher-analysis/recent-exam-stats */ export async function teacherAnalysisRecentExamStatsUsingPost({ body, @@ -153,6 +241,28 @@ export async function teacherAnalysisRecentExamStatsUsingPost({ }); } +/** 获取均分对比分析(横向对比) 获取指定考试、科目的均分对比分析数据 POST /teacher-analysis/score-analysis */ +export async function teacherAnalysisScoreAnalysisUsingPost({ + body, + options, +}: { + body: API.ScoreAnalysisRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.ScoreAnalysisResponse; + } + >('/teacher-analysis/score-analysis', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** 获取成绩单 获取指定科目、年级、班级的成绩单 POST /teacher-analysis/score-sheet */ export async function teacherAnalysisScoreSheetUsingPost({ body, @@ -175,6 +285,28 @@ export async function teacherAnalysisScoreSheetUsingPost({ }); } +/** 获取学生答题图片 根据题目ID和学号获取学生的答题图片URL GET /teacher-analysis/student-answer-image */ +export async function teacherAnalysisStudentAnswerImageUsingGet({ + params, + options, +}: { + // 叠加生成的Param类型 (非body参数openapi默认没有生成对象) + params: API.teacherAnalysisStudentAnswerImageUsingGetParams; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: string; + } + >('/teacher-analysis/student-answer-image', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + /** 获取个人历次考试详情 获取指定学生的历次考试详情 POST /teacher-analysis/student-exam-history */ export async function teacherAnalysisStudentExamHistoryUsingPost({ body, @@ -197,7 +329,7 @@ export async function teacherAnalysisStudentExamHistoryUsingPost({ }); } -/** 获取学生列表 获取指定年级、班级的学生列表 POST /teacher-analysis/student-list */ +/** 获取学生列表 获取指定考试科目、年级、班级的学生列表,分为已关注和其他学生 POST /teacher-analysis/student-list */ export async function teacherAnalysisStudentListUsingPost({ body, options, diff --git a/src/service/shujuzidianleixing.ts b/src/service/shujuzidileixing.ts similarity index 100% rename from src/service/shujuzidianleixing.ts rename to src/service/shujuzidileixing.ts diff --git a/src/service/shujuzidianxiang.ts b/src/service/shujuzidixiang.ts similarity index 100% rename from src/service/shujuzidianxiang.ts rename to src/service/shujuzidixiang.ts diff --git a/src/service/types.ts b/src/service/types.ts index f5462df..ba291ba 100644 --- a/src/service/types.ts +++ b/src/service/types.ts @@ -1,6 +1,31 @@ /* eslint-disable */ // @ts-ignore +export type AdvantageAnalysis = { + /** 班级分析 */ + class_analysis?: ClassAnalysis; + /** 年级分析 */ + grade_analysis?: GradeAnalysis; + /** 同分数段分析 */ + score_range_analysis?: ScoreRangeAnalysis; +}; + +export enum Analysis_typeEnum { + 'question' = 'question', + 'major_question' = 'major_question', + 'objective_subjective' = 'objective_subjective', +} + +export type IAnalysis_typeEnum = keyof typeof Analysis_typeEnum; + +export enum Analysis_typeEnum2 { + 'question' = 'question', + 'major_question' = 'major_question', + 'objective_subjective' = 'objective_subjective', +} + +export type IAnalysis_typeEnum2 = keyof typeof Analysis_typeEnum2; + export type AssignSysRoleRequest = { /** 角色ID列表 */ role_ids: number[]; @@ -9,7 +34,7 @@ export type AssignSysRoleRequest = { export type authGetCodeUsingGetParams = { /** 手机号 */ phone: string; - /** 验证类型 */ + /** 验证类型(1-登录,2-重置密码) */ verify_type: number; }; @@ -20,6 +45,11 @@ export type authVerifyResetCodeUsingGetParams = { code: string; }; +export type AverageComparisonAnalysis = { + /** 科目分析列表 */ + subjects?: SubjectAnalysisItem[]; +}; + export type BatchCreateMarkingTaskRecordRequest = { /** 批量数据 */ batch_data: CreateMarkingTaskRecordRequest[]; @@ -125,21 +155,209 @@ export type CheckScoreResponse = { total_score?: number; }; +export type ClassAnalysis = { + /** 科目分析列表 */ + subjects?: SubjectAnalysisItem[]; +}; + +export type ClassAnalysisExcelExportRequest = { + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + /** 查询模式:school/class */ + query_mode: string; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; +}; + +export type ClassAnalysisGroup = { + /** 学校ID或班级字典key */ + group_key?: string; + /** 学校名或班级名 */ + group_name?: string; + /** 各档次详情 */ + levels?: ClassLevelDetail[]; + /** 该组学生总数 */ + student_count?: number; +}; + +export type ClassAnalysisRequest = { + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 查询模式:school/class */ + query_mode: string; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; +}; + +export type ClassAnalysisResponse = { + /** 各档次汇总统计 */ + class_levels?: ClassLevelSummary[]; + /** 考试ID */ + exam_id?: number; + /** 考试名称 */ + exam_name?: string; + /** 各组分档统计 */ + groups?: ClassAnalysisGroup[]; + /** 总学生数 */ + total_students?: number; +}; + +export type ClassAverageRankingItem = { + /** 本班级平均排名 */ + class_average_rank?: number; + /** 比较班级平均排名 */ + compare_average_rank?: number; + /** 考试日期 */ + exam_date?: string; +}; + +export type ClassAverageScoreItem = { + /** 本班级平均分 */ + class_average_score?: number; + /** 比较班级平均分 */ + compare_average_score?: number; + /** 考试日期 */ + exam_date?: string; +}; + +export type ClassComparisonRequest = { + /** 班级标识 */ + class_key: number; + /** 比较班级标识 */ + compare_class_key: number; + /** 考试ID */ + exam_id: number; + /** 科目ID,如果为0则获取老师所带的所有科目 */ + subject_id?: number; + /** 前N名数量 */ + top_n: number; +}; + +export type ClassComparisonResponse = { + /** 平均分排名对比数据 */ + average_rankings?: ClassAverageRankingItem[]; + /** 班级平均分对比数据 */ + average_scores?: ClassAverageScoreItem[]; + /** 班级标识 */ + class_key?: number; + /** 比较班级标识 */ + compare_class_key?: number; + /** 考试ID */ + exam_id?: number; + /** 科目ID */ + subject_id?: number; + /** 前N名数量 */ + top_n?: number; + /** 年级前N名数量对比数据 */ + top_n_counts?: ClassTopNCountItem[]; +}; + +export type ClassExamComparisonData = { + /** 考试对比列表 */ + exam_list?: ExamComparisonItem[]; +}; + +export type ClassExamComparisonRequest = { + /** 班级 */ + class_key: number; + /** 年级 */ + grade_key: number; + /** 科目ID */ + subject_id?: number; +}; + +export type ClassExportRequest = { + /** 班级字典key列表,必填 */ + class_ids: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type ClassLevelDetail = { + /** 累计人数(该档次及以上) */ + cumulative_count?: number; + /** 累计比例 */ + cumulative_rate?: number; + /** 档次名称 */ + level?: string; + /** 临界生数量 */ + marginal_count?: number; + /** 该档次学生数 */ + student_count?: number; +}; + +export type ClassLevelSummary = { + /** 档次名称:一档、二档、三档 */ + level?: string; + /** 占总数比例 */ + percentage?: number; + /** 该档次总人数 */ + total_count?: number; +}; + +export type ClassReportExportRequest = { + /** 班级字典key列表,当query_mode=class时必填 */ + class_ids?: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + export type ClassStudentScoreInfo = { /** 总得分 */ all_score?: number; + /** 班级差异方向 */ + class_diff_direction?: string; + /** 班级差异排名 */ + class_diff_rank?: number; /** 班级排名 */ class_rank?: number; + /** 考试科目ID */ + exam_subject_id?: number; /** 总分 */ full_score?: number; + /** 年级差异方向 */ + grade_diff_direction?: string; + /** 年级差异排名 */ + grade_diff_rank?: number; /** 年级排名 */ grade_rank?: number; + /** 是否缺考 */ + is_absent?: boolean; /** 学生考试号 */ student_exam_number?: string; /** 学生姓名 */ student_name?: string; /** 学生学号 */ student_number?: string; + /** 科目ID */ + subject_id?: number; +}; + +export type ClassTopNCountItem = { + /** 本班级前N名数量 */ + class_top_n_count?: number; + /** 比较班级前N名数量 */ + compare_top_n_count?: number; + /** 考试日期 */ + exam_date?: string; }; export type CodeLoginRequest = { @@ -322,6 +540,21 @@ export type dictionaryTypesIdUsingPutParams = { id: number; }; +export type DifficultyAnalysis = { + /** 满分 */ + full_score?: number; + /** 难度等级 */ + level?: string; + /** 失分比重 */ + miss_percent?: number; + /** 题目ID列表 */ + question_ids?: number[]; + /** 题号列表 */ + question_numbers?: string[]; + /** 得分 */ + score?: number; +}; + export enum Emphasis_typeEnum { 'up' = 'up', 'down' = 'down', @@ -331,6 +564,21 @@ export enum Emphasis_typeEnum { export type IEmphasis_typeEnum = keyof typeof Emphasis_typeEnum; +export type ExamComparisonItem = { + /** 平均分排名 */ + average_rank?: number; + /** 班级平均分 */ + class_average?: number; + /** 班级标准分 */ + class_standard?: number; + /** 考试ID */ + exam_id?: number; + /** 考试名称 */ + exam_name?: string; + /** 年级前50名人数 */ + grade_top50_count?: number; +}; + export type ExamMarkingTaskListResponse = { /** 考试列表 */ list?: ExamMarkingTaskResponse[]; @@ -355,6 +603,67 @@ export type ExamMarkingTaskResponse = { subjects?: SubjectInfo[]; }; +export type examStatisticsStatisConfigUsingGetParams = { + /** 考试ID */ + exam_id: number; + /** 配置类型 */ + config_type: string; + /** 科目ID(可选,不传则返回所有科目配置) */ + subject_id?: number; +}; + +export type ExamSummary = { + /** 总分 */ + all_score?: number; + /** 班级平均分 */ + class_average_score?: number; + /** 班级最高分 */ + class_max_score?: number; + /** 班级成员数量 */ + class_member_count?: number; + /** 班级排名 */ + class_rank?: number; + /** 满分 */ + full_score?: number; + /** 年级平均分 */ + grade_average_score?: number; + /** 年级最高分 */ + grade_max_score?: number; + /** 年级成员数量 */ + grade_member_count?: number; + /** 年级排名 */ + grade_rank?: number; +}; + +export type ExcelExportRequest = { + /** 筛选条件(根据query_mode选择使用) */ + class_ids?: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + /** 学科选择: */ + include_total_score?: boolean; + /** 指标选择 */ + indicators: string[]; + /** 分页参数 */ + page?: number; + /** 每页数量,默认50 */ + page_size?: number; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 搜索参数 */ + search_keyword?: string; + /** 考试科目ID列表,多选 */ + subject_ids?: number[]; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + export type ExportScoreSheetRequest = { /** 查询班级 */ class_key: number; @@ -366,6 +675,24 @@ export type ExportScoreSheetRequest = { subject_id?: number; }; +export type ExportStudentListRequest = { + /** 班级ID */ + class_id: number; + /** 考试科目ID */ + exam_subject_id: number; + /** 年级ID */ + grade_id: number; + /** 关键词 */ + keyword?: string; +}; + +export type ExportStudentListResponse = { + /** 文件名 */ + file_name?: string; + /** 文件下载链接 */ + file_url?: string; +}; + export type FileDownloadSession = { /** 切片大小 */ chunk_size?: number; @@ -584,6 +911,33 @@ export type FileUploadSession = { uploader_id?: number; }; +export type GetAnswerSheetResponse = { + /** 总分 */ + all_score?: number; + /** 答题卡图片路径 */ + answer_sheet_images?: string; + /** 附加题得分 */ + bonus_score?: number; + /** 班级 */ + class?: string; + /** 班级排名 */ + class_rank?: number; + /** 年级排名 */ + grade_rank?: number; + /** 客观题答案列表 */ + objective_answer?: ObjectiveAnswer[]; + /** 客观题得分 */ + objective_score?: number; + /** 学生考号 */ + student_exam_number?: string; + /** 学生姓名 */ + student_name?: string; + /** 主观题答案列表 */ + subjective_answer?: SubjectiveAnswer[]; + /** 主观题得分 */ + subjective_score?: number; +}; + export type GetClassStudentScoreListRequest = { /** 查询班级 */ class_key: number; @@ -597,6 +951,8 @@ export type GetClassStudentScoreListRequest = { page_size: number; /** 考试科目ID */ subject_id?: number; + /** 取前N名:正数表示进步最大的前N名,负数表示退步最大的前N名,0或不传表示获取全班所有学生 */ + top_n?: number; }; export type GetClassStudentScoreListResponse = { @@ -651,16 +1007,51 @@ export type GetKeyStudentResponse = { total?: number; }; +export type GetMyProfileResponse = { + /** 创建时间 */ + created_time?: string; + /** 邮箱 */ + email?: string; + /** 是否管理员 */ + is_admin?: boolean; + /** 是否启用 */ + is_enable?: number; + /** 昵称 */ + nickname?: string; + /** 手机号 */ + phone?: string; + /** 用户ID */ + user_id?: string; + /** 用户名 */ + username?: string; +}; + export type GetPersonalReportRequest = { - /** 学生学号 */ + /** 班级KEY */ + class_key: number; + /** 考试ID */ + exam_id: number; + /** 年级KEY */ + grade_key: number; + /** 学号 */ student_number: string; - /** 考试科目ID */ + /** 科目ID */ subject_id?: number; }; export type GetPersonalReportResponse = { - /** 个人报告 */ - report?: PersonalReportInfo; + /** 优劣势分析 */ + advantage_analysis?: AdvantageAnalysis; + /** 均分对比分析 */ + average_comparison_analysis?: AverageComparisonAnalysis; + /** 难度分析 */ + difficulty_analysis?: DifficultyAnalysis[]; + /** 考试总结 */ + exam_summary?: ExamSummary; + /** 学习情况分析 */ + learning_situation_analysis?: LearningSituationAnalysis; + /** 成绩趋势 */ + score_trend?: ScoreTrendItem[]; }; export type GetQuestionMarkingQualityResponse = { @@ -668,6 +1059,10 @@ export type GetQuestionMarkingQualityResponse = { average_score?: number; /** 评价方法 */ evaluate_method?: string; + /** 终评老师列表 */ + final_teachers?: QuestionMarkingQualityTeacher[]; + /** 初评老师列表 */ + initial_teachers?: QuestionMarkingQualityTeacher[]; /** 最高分 */ max_score?: number; /** 最低分 */ @@ -678,8 +1073,6 @@ export type GetQuestionMarkingQualityResponse = { question_major?: string; /** 小题号 */ question_minor?: string; - /** 按学校分组的阅卷质量数据 */ - school_groups?: QuestionMarkingQualitySchool[]; /** 所有学校下所有老师的总分数 */ total_score?: number; }; @@ -720,6 +1113,8 @@ export type GetRecentExamStatsResponse = { excellent_class_scoring_rate?: number; /** 年级优秀率 */ excellent_grade_scoring_rate?: number; + /** 总分 */ + full_score?: number; /** 班级良好率 */ good_class_scoring_rate?: number; /** 年级良好率 */ @@ -817,27 +1212,21 @@ export type GetStudentExamHistoryResponse = { }; export type GetStudentListRequest = { - /** 查询班级 */ - class_key: number; - /** 查询年级 */ - grade_key: number; + /** 班级ID */ + class_id: number; + /** 考试科目ID */ + exam_subject_id: number; + /** 年级ID */ + grade_id: number; /** 关键词 */ keyword?: string; - /** 页码 */ - page: number; - /** 每页大小 */ - page_size: number; }; export type GetStudentListResponse = { - /** 学生列表 */ - list?: StudentListInfo[]; - /** 页码 */ - page?: number; - /** 每页大小 */ - page_size?: number; - /** 总记录数 */ - total?: number; + /** 已关注的学生列表 */ + attentioned_students?: StudentInfo[]; + /** 其他学生列表 */ + other_students?: StudentInfo[]; }; export type GetStudentMarkingQualityResponse = { @@ -865,6 +1254,57 @@ export type GetTrendResponse = { trend_list?: TrendInfo[]; }; +export type GradeAnalysis = { + /** 科目分析列表 */ + subjects?: SubjectAnalysisItem[]; +}; + +export type GroupAnalysisResult = { + /** 平均分(可选指标) */ + average?: number; + /** 难度和区分度相关指标待后续实现 */ + difficulty?: number; + /** 难度描述(可选指标) */ + difficulty_desc?: string; + /** 区分度(可选指标) */ + discrimination?: number; + /** 区分度描述(可选指标) */ + discrimination_desc?: string; + /** 分组标识(班级名/学校名) */ + group_key?: string; + /** 分组显示名称 */ + group_name?: string; + /** 标准差(可选指标) */ + std_dev?: number; + /** 学生数量 */ + student_count?: number; +}; + +export type GroupQuestionResult = { + /** 平均分(可选指标) */ + average?: number; + /** 难度(可选指标) */ + difficulty?: number; + /** 难度描述(可选指标) */ + difficulty_desc?: string; + /** 区分度(可选指标) */ + discrimination?: number; + /** 区分度描述(可选指标) */ + discrimination_desc?: string; + /** 满分人数(可选指标) */ + full_score_count?: number; + /** 满分人数占比(可选指标) */ + full_score_rate?: number; + /** 分组标识 */ + group_key?: string; + /** 标准差(可选指标) */ + std_dev?: number; + /** 零分人数(可选指标) */ + zero_score_count?: number; + /** 零分人数占比(可选指标) */ + zero_score_rate?: number; +}; + export type KeyStudentInfo = { /** 总得分 */ all_score?: number; @@ -890,6 +1330,30 @@ export type KeyStudentInfo = { student_number?: string; }; +export type LearningSituationAnalysis = { + /** 总分 */ + all_score?: number; + /** 班级总人数 */ + class_member_count?: number; + /** 班级排名 */ + class_rank?: number; + /** 分数段数据 */ + data?: ScoreScopeData[]; + /** 年级总人数 */ + grade_member_count?: number; + /** 年级排名 */ + grade_rank?: number; +}; + +export type LevelStat = { + /** 人数 */ + count?: number; + /** 排名 */ + rank?: number; + /** 比例 */ + rate?: number; +}; + export type LoginRequest = { /** 密码 */ password: string; @@ -997,7 +1461,7 @@ export type markingQualityExportTeacherDetailUsingGetParams = { order_by?: 'time_asc' | 'time_desc' | 'score_asc' | 'score_desc'; }; -export type markingQualityQuestionQualityUsingGetParams = { +export type markingQualityQuestionUsingGetParams = { /** 题目ID */ question_id: number; }; @@ -1069,6 +1533,8 @@ export type markingQualityUsingGetParams = { }; export type MarkingTaskByQuestionItem = { + /** 评价方法 */ + evaluate_method?: string; /** 已阅卷数量 */ marked_quantity?: number; /** 未阅卷数量 */ @@ -1253,6 +1719,31 @@ export type markingTasksUsingGetParams = { academic_year?: string; }; +export type MyChangePasswordRequest = { + /** 确认新密码 */ + confirm_password: string; + /** 新密码 */ + new_password: string; + /** 原密码 */ + old_password: string; +}; + +export type MyChangePasswordResponse = { + /** 响应消息 */ + message?: string; + /** 是否成功 */ + success?: boolean; +}; + +export type ObjectiveAnswer = { + /** 最终得分 */ + final_score?: number; + /** 满分 */ + full_score?: number; + /** 题目ID */ + question_id?: number; +}; + export type ObjectiveQualityItem = { /** 平均分 */ average_score?: number; @@ -1292,31 +1783,6 @@ export type ObjectiveTypeQualityItem = { total_score?: number; }; -export type PersonalReportInfo = { - /** 平均分 */ - average_score?: number; - /** 最好排名 */ - best_rank?: number; - /** 最高分 */ - best_score?: number; - /** 进步趋势 */ - improvement_trend?: string; - /** 建议 */ - recommendation?: string; - /** 学生姓名 */ - student_name?: string; - /** 学生学号 */ - student_number?: string; - /** 科目名称 */ - subject_name?: string; - /** 总考试次数 */ - total_exams?: number; - /** 最差排名 */ - worst_rank?: number; - /** 最低分 */ - worst_score?: number; -}; - export type ProgressDetail = { /** 已阅卷数量 */ marked_quantity?: number; @@ -1324,6 +1790,155 @@ export type ProgressDetail = { unmerged_quantity?: number; }; +export enum Query_modeEnum { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum = keyof typeof Query_modeEnum; + +export enum Query_modeEnum2 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum2 = keyof typeof Query_modeEnum2; + +export enum Query_modeEnum3 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum3 = keyof typeof Query_modeEnum3; + +export enum Query_modeEnum4 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum4 = keyof typeof Query_modeEnum4; + +export enum Query_modeEnum5 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum5 = keyof typeof Query_modeEnum5; + +export enum Query_modeEnum6 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum6 = keyof typeof Query_modeEnum6; + +export enum Query_modeEnum7 { + 'class' = 'class', + 'school' = 'school', +} + +export type IQuery_modeEnum7 = keyof typeof Query_modeEnum7; + +export type QuestionAnalysisExcelExportRequest = { + /** 分析类型 */ + analysis_type: 'question' | 'major_question' | 'objective_subjective'; + /** 班级字典key列表,当query_mode=class时必填 */ + class_ids?: string[]; + /** 是否启用对比功能,true时返回各分组的对比数据 */ + enable_comparison?: boolean; + /** 考试ID,必填 */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + /** 指标列表 */ + indicators: string[]; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 题目关键词筛选(可选) */ + question_keyword?: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 学科ID,必填,只接受单科 */ + subject_id: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type QuestionAnalysisRequest = { + /** 分析类型 */ + analysis_type: 'question' | 'major_question' | 'objective_subjective'; + /** 班级字典key列表,当query_mode=class时必填 */ + class_ids?: string[]; + /** 是否启用对比功能,true时返回各分组的对比数据 */ + enable_comparison?: boolean; + /** 考试ID,必填 */ + exam_id: number; + /** 指标列表 */ + indicators: string[]; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 题目关键词筛选(可选) */ + question_keyword?: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 学科ID,必填,只接受单科 */ + subject_id: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type QuestionAnalysisResponse = { + /** 分析类型 */ + analysis_type?: string; + /** 是否启用对比 */ + enable_comparison?: boolean; + /** 各组分析结果(仅当enable_comparison=true时返回) */ + groups?: GroupAnalysisResult[]; + /** 题目分析结果 */ + questions?: QuestionAnalysisResult[]; + /** 参与统计的学生总数 */ + student_count?: number; +}; + +export type QuestionAnalysisResult = { + /** 整体统计(所有筛选范围内的学生的统计) */ + average?: number; + /** 正确答案(可选指标) */ + correct_answer?: string; + /** 难度(可选指标) */ + difficulty?: number; + /** 难度描述(可选指标) */ + difficulty_desc?: string; + /** 区分度(可选指标) */ + discrimination?: number; + /** 区分度描述(可选指标) */ + discrimination_desc?: string; + /** 满分人数(可选指标) */ + full_score_count?: number; + /** 满分人数占比(可选指标) */ + full_score_rate?: number; + /** 分组对比数据(仅当enable_comparison=true时返回) */ + group_results?: GroupQuestionResult[]; + /** 满分 */ + max_score?: number; + /** 题目标识 */ + question_key?: string; + /** 题目名称 */ + question_name?: string; + /** 题目类型:客观题/主观题 */ + question_type?: string; + /** 标准差(可选指标) */ + std_dev?: number; + /** 零分人数(可选指标) */ + zero_score_count?: number; + /** 零分人数占比(可选指标) */ + zero_score_rate?: number; +}; + export type QuestionAverageScoreComparisonResponse = { /** 所有老师平均分 */ all_teachers_score?: QuestionAverageScoreResponse; @@ -1352,6 +1967,54 @@ export type QuestionAverageScoreResponse = { total_count?: number; }; +export type QuestionDetail = { + /** 作答显示格式:作答/答案 */ + answer_display?: string; + /** 正确答案 */ + correct_answer?: string; + /** 满分 */ + max_score?: number; + /** 题目ID */ + question_id?: number; + /** 题目名称,如:客|一.1, 主|2.2 */ + question_name?: string; + /** 题目顺序 */ + question_order?: number; + /** 题目类型:objective(客观题), subjective(主观题) */ + question_type?: string; + /** 得分 */ + score?: number; + /** 得分显示格式:得分/满分 */ + score_display?: string; + /** 学生作答 */ + student_answer?: string; +}; + +export type QuestionExcelExportRequest = { + /** 班级字典key列表,当query_mode=class时必填 */ + class_ids?: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 指标列表 */ + indicators: string[]; + /** 页码,默认1 */ + page?: number; + /** 每页数量,默认50 */ + page_size?: number; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 搜索关键词(支持学生姓名、学号、考号、系统号搜索) */ + search_keyword?: string; + /** 学科ID,必填 */ + subject_id: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + export type QuestionMarkingProgressResponse = { /** 分配方式 */ allocation_method?: string; @@ -1367,15 +2030,6 @@ export type QuestionMarkingProgressResponse = { total_quantity?: number; }; -export type QuestionMarkingQualitySchool = { - /** 学校ID */ - school_id?: number; - /** 学校名称 */ - school_name?: string; - /** 老师列表 */ - teachers?: QuestionMarkingQualityTeacher[]; -}; - export type QuestionMarkingQualityTeacher = { /** 平均分 */ average_score?: number; @@ -1418,6 +2072,82 @@ export type QuestionProgressDetail = { task_total_num?: number; }; +export type QuestionRankingRequest = { + /** 班级字典key列表,当query_mode=class时必填 */ + class_ids?: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 指标列表 */ + indicators: string[]; + /** 页码,默认1 */ + page?: number; + /** 每页数量,默认50 */ + page_size?: number; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 搜索关键词(支持学生姓名、学号、考号、系统号搜索) */ + search_keyword?: string; + /** 学科ID,必填 */ + subject_id: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type QuestionRankingResponse = { + /** 学生成绩列表 */ + list?: StudentQuestionScoreInfo[]; + /** 当前页码 */ + page?: number; + /** 每页数量 */ + page_size?: number; + /** 总学生数 */ + total?: number; +}; + +export type RankStatDetail = { + /** 该名次段的学生数 */ + count?: number; + /** 结束名次 */ + end?: number; + /** 名次段名称 */ + name?: string; + /** 占比(该名次段学生数/总学生数) */ + rate?: number; + /** 起始名次 */ + start?: number; +}; + +export type RankStatisticsItem = { + /** 学校ID或班级ID */ + id?: number; + /** 学校名或班级名 */ + name?: string; + /** 各名次段统计 */ + rank_stats?: RankStatDetail[]; + /** 总学生人数 */ + student_count?: number; +}; + +export type RankStatisticsRequest = { + /** 班级字典key列表(class模式时必填) */ + class_id?: number; + /** 考试ID */ + exam_id: number; + /** 科目ID,0表示总分 */ + subject_id?: number; +}; + +export type RankStatisticsResponse = { + data?: RankStatisticsItem[]; + exam_id?: number; + query_mode?: string; + subject_id?: number; +}; + export type RefreshTokenRequest = { refresh_token: string; }; @@ -1480,7 +2210,7 @@ export type School = { /** 创建时间 */ created_time?: string; /** 学校ID */ - id?: string; + id?: number; /** 是否删除 */ is_deleted?: number; /** 是否启用 */ @@ -1495,6 +2225,19 @@ export type School = { updated_time?: string; }; +export type SchoolExportRequest = { + /** 考试ID,必填 */ + exam_id: number; + /** 文件名前缀,可选 */ + file_name?: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,必填 */ + school_ids: number[]; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + export type SchoolProgressDetail = { /** 阅卷列表 */ marking_list?: TeacherMarkingDetail[]; @@ -1504,6 +2247,156 @@ export type SchoolProgressDetail = { school_name?: string; }; +export type ScoreAnalysisExcelExportRequest = { + /** 班级字典key列表(class模式时必填) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + filters?: { + /** 是否排除缺考X门科目的学生(仅总分时有效) */ + exclude_missing_subjects?: boolean; + /** 是否包含0分学生 */ + include_zero_score?: boolean; + /** 缺考门数限制,默认1门 */ + missing_subject_limit?: number; + }; + /** 需要的指标列表 */ + indicators: string[]; + /** 查询模式:school/class */ + query_mode: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表(school模式时必填) */ + school_ids?: number[]; + /** 科目ID,0表示总分 */ + subject_id?: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type ScoreAnalysisItem = { + /** 超均率 */ + above_avg_rate?: number; + /** 基础统计指标 */ + average?: number; + /** 比率指标 */ + average_score_rate?: number; + /** 综合率 */ + comprehensive?: number; + /** 离均率 */ + deviation_rate?: number; + /** 报考人数 */ + exam_count?: number; + /** 优秀 */ + excellent?: LevelStat; + /** 良好 */ + good?: LevelStat; + /** 等级统计 */ + high_score?: LevelStat; + /** 低分 */ + low_score?: LevelStat; + /** 最高分 */ + max_score?: number; + /** 中位数 */ + median?: number; + /** 最低分 */ + min_score?: number; + /** 众数 */ + mode?: number; + /** 学校名或班级名 */ + name?: string; + /** 及格率 */ + pass_rate?: number; + /** 及格 */ + qualified?: LevelStat; + /** 排名 */ + rank?: number; + /** 标准分 */ + standard_score?: number; + /** 标准差 */ + std_dev?: number; + /** 学生人数 */ + student_count?: number; + /** 教学相关(仅班级维度) */ + teacher?: string; + /** 比均率 */ + vs_avg_rate?: number; +}; + +export type ScoreAnalysisRequest = { + /** 班级字典key列表(class模式时必填) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + filters?: { + /** 是否排除缺考X门科目的学生(仅总分时有效) */ + exclude_missing_subjects?: boolean; + /** 是否包含0分学生 */ + include_zero_score?: boolean; + /** 缺考门数限制,默认1门 */ + missing_subject_limit?: number; + }; + /** 需要的指标列表 */ + indicators: string[]; + /** 查询模式:school/class */ + query_mode: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表(school模式时必填) */ + school_ids?: number[]; + /** 科目ID,0表示总分 */ + subject_id?: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type ScoreAnalysisRequest2 = { + /** 班级字典key列表(class模式时必填) */ + class_key?: string; + /** 考试ID */ + exam_id: number; + /** 科目ID,0表示总分 */ + subject_id?: number; +}; + +export type ScoreAnalysisResponse = { + data?: ScoreAnalysisItem[]; + exam_id?: number; + query_mode?: string; + subject_id?: number; +}; + +export type ScoreDetail = { + /** 赋分(可选指标) */ + assigned_score?: number; + /** 班级排名(可选指标) */ + class_rank?: number; + /** 选科组合联考排名(可选指标) */ + combo_joint_exam_rank?: number; + /** 选科组合排名指标 */ + combo_school_rank?: number; + /** 选考方向班级排名(可选指标) */ + direction_class_rank?: number; + /** 选考方向排名指标 */ + direction_grade_rank?: number; + /** 选考方向联考排名(可选指标) */ + direction_joint_exam_rank?: number; + /** 排名指标 */ + grade_rank?: number; + /** 联考排名(可选指标) */ + joint_exam_rank?: number; + /** 等级(可选指标) */ + level?: string; + /** 基础指标(属于学科的指标) */ + score?: number; + /** 科目ID(总分时为0) */ + subject_id?: number; + /** 科目名称(总分时为"总分") */ + subject_name?: string; +}; + export type ScoreDistributionItem = { /** 该分数的数量 */ count?: number; @@ -1511,6 +2404,60 @@ export type ScoreDistributionItem = { score?: number; }; +export type ScoreRangeAnalysis = { + /** 分数段结束值 */ + score_range_end?: number; + /** 分数段起始值 */ + score_range_start?: number; + /** 科目分析列表 */ + subjects?: SubjectAnalysisItem[]; +}; + +export type ScoreRankingRequest = { + /** 筛选条件(根据query_mode选择使用) */ + class_ids?: string[]; + /** 考试ID,必填 */ + exam_id: number; + /** 学科选择: */ + include_total_score?: boolean; + /** 指标选择 */ + indicators: string[]; + /** 分页参数 */ + page?: number; + /** 每页数量,默认50 */ + page_size?: number; + /** 查询模式:class(按班级), school(按学校,用于联考) */ + query_mode: 'class' | 'school'; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表,当query_mode=school时必填 */ + school_ids?: number[]; + /** 搜索参数 */ + search_keyword?: string; + /** 考试科目ID列表,多选 */ + subject_ids?: number[]; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type ScoreRankingResponse = { + /** 学生成绩列表 */ + list?: StudentScoreInfo[]; + /** 当前页码 */ + page?: number; + /** 每页数量 */ + page_size?: number; + /** 总学生数 */ + total?: number; +}; + +export type ScoreScopeData = { + /** 分数段 */ + score_scope?: string; + /** 学生数量 */ + student_num?: number; +}; + export type ScoreSheetInfo = { /** 总得分 */ all_score?: number; @@ -1530,6 +2477,33 @@ export type ScoreSheetInfo = { student_number?: string; }; +export type ScoreTrendItem = { + /** 考试日期 */ + exam_date?: string; + /** 考试名称 */ + exam_name?: string; + /** 单科总分数 */ + total_score?: number; +}; + +export type SetLevelConfigRequest = { + config_data: UnifiedConfigData; + config_type: string; + exam_id: number; + /** 要设置的科目ID列表 */ + subject_ids: number[]; +}; + +export type SetLevelConfigResponse = { + data?: { + config_type?: string; + exam_id?: number; + subject_ids?: number[]; + }; + message?: string; + success?: boolean; +}; + export type SetProblemRecordRequest = { /** 问题描述 */ description?: string; @@ -1546,6 +2520,86 @@ export type SetProblemRecordResponse = { record_id?: number; }; +export type StatisticsAnalysisExcelExportRequest = { + /** 分析类型:rank/score/percentile */ + analysis_type: string; + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + /** 查询模式:school/class */ + query_mode: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; + /** 科目ID,0表示总分 */ + subject_id?: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type StatisticsAnalysisItem = { + /** 学校ID或班级ID */ + id?: number; + /** 学校名或班级名 */ + name?: string; + /** 统计详情 */ + statistics?: StatisticsDetailItem[]; + /** 总学生人数 */ + student_count?: number; +}; + +export type StatisticsAnalysisRequest = { + /** 分析类型:rank/score/percentile */ + analysis_type: string; + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 查询模式:school/class */ + query_mode: string; + /** 角色标识,用于权限过滤 */ + role_key?: number; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; + /** 科目ID,0表示总分 */ + subject_id?: number; + /** 教师权限参数(可选) */ + teacher_id?: number; +}; + +export type StatisticsAnalysisResponse = { + analysis_type?: string; + data?: StatisticsAnalysisItem[]; + exam_id?: number; + query_mode?: string; + subject_id?: number; +}; + +export type StatisticsDetailItem = { + /** 学生人数 */ + count?: number; + /** 结束百分比 */ + end_percent?: number; + /** 结束名次 */ + end_rank?: number; + /** 统计项名称(如"前10名"/"≥500分"/"前0%-10%") */ + name?: string; + /** 占比 */ + rate?: number; + /** 分数区间(如"116-129") */ + score_range?: string; + /** 比例段统计专用 */ + start_percent?: number; + /** 名次统计专用 */ + start_rank?: number; + /** 分数段统计专用 */ + threshold?: number; +}; + export type StudentAnswerSheetItem = { /** 切图路径 */ away_view_url?: string; @@ -1590,11 +2644,15 @@ export type StudentExamHistoryInfo = { subject_name?: string; }; -export type StudentListInfo = { - /** 是否关注 */ - is_attention?: boolean; - /** 备注 */ - remark?: string; +export type StudentInfo = { + /** 班级排名变化 */ + class_diff_rank?: number; + /** 班级排名 */ + class_rank?: number; + /** 总分 */ + full_score?: number; + /** 答题卡信息ID */ + info_id?: number; /** 学生姓名 */ student_name?: string; /** 学生学号 */ @@ -1695,6 +2753,169 @@ export type StudentMarkingQuestionsResponse = { task_id?: number; }; +export type StudentQuestionScoreInfo = { + /** 班级名称 */ + class_name?: string; + /** 班级排名 */ + class_rank?: number; + /** 考号(可选指标) */ + exam_number?: string; + /** 排名(可选指标) */ + grade_rank?: number; + /** 联考排名 */ + joint_exam_rank?: number; + /** 客观题总分 */ + objective_score?: number; + /** 题目详情 map[questionKey]*QuestionDetail */ + question_scores?: Record; + /** 学校名称 */ + school_name?: string; + /** 学生ID */ + student_id?: number; + /** 学生姓名 */ + student_name?: string; + /** 学号(可选指标) */ + student_number?: string; + /** 主观题总分 */ + subjective_score?: number; + /** 系统号(可选指标) */ + system_number?: string; + /** 总分统计(可选指标) */ + total_score?: number; +}; + +export type StudentScoreInfo = { + /** 语数外史/物总分相关(当需要语数外史/物排名时返回) */ + chinese_mat_eng_direction_score?: ScoreDetail; + /** 语数外总分相关(当需要语数外排名时返回) */ + chinese_mat_eng_score?: ScoreDetail; + /** 班级名称 */ + class_name?: string; + /** 选考方向(可选指标) */ + elective_direction?: string; + /** 考号(可选指标) */ + exam_number?: string; + /** 等级统计(可选指标) */ + level_stats?: string; + /** 学校名称 */ + school_name?: string; + /** 学生姓名 */ + student_name?: string; + /** 学号(可选指标) */ + student_number?: string; + /** 选考组合(可选指标) */ + subject_combo?: string; + /** 各科目成绩(根据选择的subject_ids返回) */ + subject_scores?: Record; + /** 系统号(可选指标) */ + system_number?: string; + /** 标签(可选指标) */ + tags?: string; + /** 总分相关(当include_total_score为true时返回) */ + total_score?: ScoreDetail; +}; + +export type SubjectAnalysisDetail = { + /** 学科满分 */ + full_score?: number; + /** 该档次该学科分数线 */ + score_line?: number; + /** 学科ID */ + subject_id?: string; + /** 学科名称 */ + subject_name?: string; + /** 该学科总贡献率 */ + total_contribution_rate?: number; + /** 该学科总双上线人数 */ + total_double_online_count?: number; + /** 该学科总命中率 */ + total_hit_rate?: number; + /** 该学科总上线人数 */ + total_online_count?: number; +}; + +export type SubjectAnalysisItem = { + /** 平均分 */ + average_score?: number; + /** 我的成绩 */ + my_score?: number; + /** 科目ID */ + subject_id?: number; + /** 科目名称 */ + subject_name?: string; +}; + +export type SubjectClassAnalysisExcelExportRequest = { + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 文件名,可选 */ + file_name?: string; + /** 档次级别(如"一档"、"二档"、"三档") */ + level: string; + /** 查询模式:school/class */ + query_mode: string; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; +}; + +export type SubjectClassAnalysisGroup = { + /** 学校ID或班级字典key */ + group_key?: string; + /** 学校名或班级名 */ + group_name?: string; + /** 该组学生总数 */ + student_count?: number; + /** 各学科统计 */ + subjects?: SubjectGroupAnalysisItem[]; +}; + +export type SubjectClassAnalysisRequest = { + /** 班级字典key列表(class模式时使用) */ + class_ids?: string[]; + /** 考试ID */ + exam_id: number; + /** 档次级别(如"一档"、"二档"、"三档") */ + level: string; + /** 查询模式:school/class */ + query_mode: string; + /** 学校ID列表(school模式时使用) */ + school_ids?: number[]; +}; + +export type SubjectClassAnalysisResponse = { + /** 考试ID */ + exam_id?: number; + /** 考试名称 */ + exam_name?: string; + /** 各组学科分档统计 */ + groups?: SubjectClassAnalysisGroup[]; + /** 当前查询的档次 */ + level?: string; + /** 各学科汇总统计 */ + subjects?: SubjectAnalysisDetail[]; + /** 总分档次信息 */ + total_score_info?: TotalScoreInfo; + /** 总学生数 */ + total_students?: number; +}; + +export type SubjectGroupAnalysisItem = { + /** 命中率 */ + contrib_rate?: number; + /** 双上线 */ + double_online?: number; + /** 贡献率 */ + pass_rate?: number; + /** 单科上线 */ + single_online?: number; + /** 上线人数 */ + student_count?: number; + /** 科目名称 */ + subject_name?: string; +}; + export type SubjectInfo = { /** 创建时间 */ created_time?: string; @@ -1712,8 +2933,31 @@ export type SubjectInfo = { subject_id?: number; /** 科目名称 */ subject_name?: string; - /** 教师类型:1-阅卷老师, 2-仲裁老师, 3-组长 */ - teacher_type?: number; + /** 教师类型:normal-阅卷老师, arbitration-仲裁老师, leader-组长 */ + teacher_type?: string; +}; + +export type SubjectiveAnswer = { + /** 最终得分 */ + final_score?: number; + /** 满分 */ + full_score?: number; + /** 是否标记为优秀 (1:是, 0:否, null:未设置) */ + is_excellent?: number; + /** 是否标记为典型 (1:是, 0:否, null:未设置) */ + is_model?: number; + /** 是否标记为问题卷 (1:是, 0:否, null:未设置) */ + is_problem?: number; + /** 问题卷附属说明 */ + problem_addition?: string; + /** 问题卷状态 */ + problem_status?: string; + /** 问题卷类型 */ + problem_type?: string; + /** 题目ID */ + question_id?: number; + /** 备注 */ + remark?: string; }; export type SubjectiveQualityItem = { @@ -1728,6 +2972,8 @@ export type SubjectiveQualityItem = { export type SubjectiveQuestionItem = { /** 平均分 */ average_score?: number; + /** 评选方式 */ + evaluate_method?: string; /** 题目ID */ question_id?: number; /** 大题号 */ @@ -1932,6 +3178,11 @@ export type TeacherAnalysisExamInfo = { subject_name?: string; }; +export type teacherAnalysisInfoIdUsingGetParams = { + /** 答题卡ID */ + info_id: number; +}; + export type TeacherAnalysisResponse = { /** 班级列表 */ class_list?: TeacherAnalysisClassInfo[]; @@ -1941,6 +3192,13 @@ export type TeacherAnalysisResponse = { subject_list?: TeacherAnalysisSubjectInfo[]; }; +export type teacherAnalysisStudentAnswerImageUsingGetParams = { + /** 题目ID */ + question_id: number; + /** 学号 */ + student_number: string; +}; + export type TeacherAnalysisSubjectInfo = { /** 科目ID */ subject_id?: number; @@ -1987,6 +3245,15 @@ export type TeacherQuestionAverageScoreResponse = { total_count?: number; }; +export type TotalScoreInfo = { + /** 总分满分 */ + full_score?: number; + /** 该档次总分上线人数 */ + online_count?: number; + /** 该档次总分分数线 */ + score_line?: number; +}; + export type TrendInfo = { /** 班级平均分 */ class_avg_score?: number; @@ -2000,6 +3267,32 @@ export type TrendInfo = { grade_avg_score?: number; }; +export type UnifiedConfigData = { + /** 额外配置(用于特殊配置类型) */ + extra_config?: Record; + /** 等级数量 */ + level_count?: number; + /** 等级配置列表 */ + levels?: UnifiedLevelItem[]; + /** 规则类型 */ + rule_type?: string; +}; + +export type UnifiedLevelItem = { + /** 描述 */ + description?: string; + /** 等级名称 A/B/C/D/E 或 优秀/良好等 */ + level?: string; + /** 排序 */ + order?: number; + /** 范围最大值 */ + range_max?: number; + /** 范围最小值 */ + range_min?: number; + /** 单一值(百分比/分数等) */ + value?: number; +}; + export type UpdateDictionaryItemRequest = { /** 字典项key */ key: string; diff --git a/src/service/wode.ts b/src/service/wode.ts new file mode 100644 index 0000000..e64266e --- /dev/null +++ b/src/service/wode.ts @@ -0,0 +1,44 @@ +/* eslint-disable */ +// @ts-ignore +import request from '@/http/vue-query'; +import { CustomRequestOptions } from '@/http/types'; + +import * as API from './types'; + +/** 修改密码 修改当前用户的密码 POST /my/change-password */ +export async function myChangePasswordUsingPost({ + body, + options, +}: { + body: API.MyChangePasswordRequest; + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.MyChangePasswordResponse; + } + >('/my/change-password', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** 获取我的信息 获取当前用户的个人信息 GET /my/profile */ +export async function myProfileUsingGet({ + options, +}: { + options?: CustomRequestOptions; +}) { + return request< + API.Response & { + data?: API.GetMyProfileResponse; + } + >('/my/profile', { + method: 'GET', + ...(options || {}), + }); +} diff --git a/src/store/home.ts b/src/store/home.ts new file mode 100644 index 0000000..0a56561 --- /dev/null +++ b/src/store/home.ts @@ -0,0 +1,207 @@ +import { defineStore } from 'pinia' +import { computed, ref } from 'vue' +import { teacherAnalysisDataUsingGet } from '@/service/laoshichengjifenxi' + +export interface SelectOption { + label: string + value: number +} + +// 考试科目组合数据类型 +export interface ExamSubjectItem { + examId: number + examName: string + examSubjectId: number + subjectName: string +} + +// 班级信息类型 +export interface ClassItem { + label: string + value: number + gradeKey: number +} + +/** + * 首页状态管理 + */ +export const useHomeStore = defineStore( + 'homeStore', + () => { + // 数据存储 + const loading = ref(false) + const examSubjectList = ref([]) + const classList = ref([]) + const classGradeMap = ref>(new Map()) + + // 已选择的数据 + const selectedClassId = ref(null) + const selectedExamId = ref(null) + const selectedSubjectId = ref(null) + const selectedGradeKey = ref(null) + + // 计算属性:唯一的考试列表 + const examOptions = computed((): SelectOption[] => { + console.log('examOptions计算属性被调用,examSubjectList长度:', examSubjectList.value.length) + const examMap = new Map() + examSubjectList.value.forEach((item) => { + if (!examMap.has(item.examId)) { + examMap.set(item.examId, item.examName) + } + }) + const result = Array.from(examMap.entries()).map(([id, name]) => ({ + label: name, + value: id, + })) + console.log('examOptions计算结果:', result) + return result + }) + + // 计算属性:班级列表 + const classOptions = computed((): SelectOption[] => { + console.log('classOptions计算属性被调用,classList长度:', classList.value.length) + const result = classList.value.map(item => ({ + label: item.label, + value: item.value, + })) + console.log('classOptions计算结果:', result) + return result + }) + + // 计算属性:根据选中考试过滤的科目列表 + const subjectOptions = computed((): SelectOption[] => { + if (!selectedExamId.value) { + return [] + } + return examSubjectList.value + .filter(item => item.examId === selectedExamId.value) + .map(item => ({ + label: item.subjectName, + value: item.examSubjectId, + })) + }) + + /** + * 获取选项数据 + */ + const fetchOptions = async () => { + try { + loading.value = true + const response = await teacherAnalysisDataUsingGet({}) + + if (response) { + // 处理班级数据并建立班级到年级的映射 + classList.value = (response.class_list || []).map((item: any) => { + const classKey = item.class_key || 0 + const gradeKey = item.grade_key || 0 + + // 建立班级到年级的映射 + classGradeMap.value.set(classKey, gradeKey) + + return { + label: `${item.grade || ''} ${item.class || ''}`.trim(), + value: classKey, + gradeKey, + } + }) + + // 存储考试科目组合数据 + examSubjectList.value = (response.exam_list || []).map((item: any) => ({ + examId: item.exam_id || 0, + examName: item.exam_name || '', + examSubjectId: item.exam_subject_id || 0, + subjectName: item.subject_name || '', + })) + + console.log('数据获取完成:') + console.log('classList数量:', classList.value.length) + console.log('examSubjectList数量:', examSubjectList.value.length) + } + } + catch (error) { + console.error('获取选项数据失败:', error) + throw error + } + finally { + loading.value = false + } + } + + /** + * 当班级选择改变时,自动设置对应的年级 + */ + const onClassChange = (classId: number | null) => { + selectedClassId.value = classId + if (classId) { + selectedGradeKey.value = classGradeMap.value.get(classId) || null + } + else { + selectedGradeKey.value = null + } + } + + /** + * 当考试选择改变时,清空科目选择 + */ + const onExamChange = (examId: number | null) => { + selectedExamId.value = examId + selectedSubjectId.value = null + } + + /** + * 设置选项数据(兼容旧接口) + */ + const setOptions = (exams: SelectOption[], classes: SelectOption[], subjects: SelectOption[]) => { + // 这个方法保留是为了兼容性,但推荐使用fetchOptions + console.warn('setOptions is deprecated, use fetchOptions instead') + } + + /** + * 清空所有选择 + */ + const clearSelections = () => { + selectedClassId.value = null + selectedExamId.value = null + selectedSubjectId.value = null + selectedGradeKey.value = null + } + + /** + * 重置store状态 + */ + const reset = () => { + classList.value = [] + examSubjectList.value = [] + classGradeMap.value.clear() + loading.value = false + clearSelections() + } + + return { + // 数据状态 + loading, + + // 选项数据(计算属性) + examOptions, + classOptions, + subjectOptions, + + // 已选择的数据 + selectedClassId, + selectedExamId, + selectedSubjectId, + selectedGradeKey, + + // 方法 + fetchOptions, + onClassChange, + onExamChange, + setOptions, + clearSelections, + reset, + } + }, + { + persist: true, + }, +) diff --git a/src/store/index.ts b/src/store/index.ts index 74b1b2f..2b3a98e 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -14,4 +14,5 @@ store.use( export default store // 模块统一导出 +export * from './home' export * from './user'