From da364bc97d637ad665badd2e78ea715fe678bec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=A2=A6?= Date: Mon, 9 Feb 2026 18:07:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=80=81=E5=B8=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- src/api/teacher.ts | 80 ++ src/components/Select/index.vue | 44 +- src/pages.json | 13 + src/pages/doWork/components/Question.vue | 7 + src/pages/doWork/index.vue | 2 + src/pages/teacher/homework/filter.vue | 475 ++++++++ src/pages/teacher/homework/index.vue | 1320 ++++++++++++++++------ src/pages/teacher/index/index.vue | 2 +- src/utils/index.ts | 1 + src/utils/subject.ts | 36 + 11 files changed, 1618 insertions(+), 366 deletions(-) create mode 100644 src/pages/teacher/homework/filter.vue create mode 100644 src/utils/subject.ts diff --git a/.env b/.env index 5910943..faf5ccf 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ #VITE_HOST = http://192.168.0.114:9053 -#VITE_HOST = http://43.136.52.196:9053 -VITE_HOST= https://ai.xuexiaole.com +VITE_HOST = http://43.136.52.196:9053 +#VITE_HOST= https://ai.xuexiaole.com VITE_OSS_HOST = https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com VITE_WS_URL = wss://test.qiaoying.vip/wss/websocket \ No newline at end of file diff --git a/src/api/teacher.ts b/src/api/teacher.ts index 0d9db9d..8c87e98 100644 --- a/src/api/teacher.ts +++ b/src/api/teacher.ts @@ -55,6 +55,8 @@ export const getPaperReleaseRecordList = (params: { schoolId: string; current: number; size: number; + classId?: string; + subjectId?: string; }) => { return request({ url: '/school/paperReleaseRecord/list', @@ -62,3 +64,81 @@ export const getPaperReleaseRecordList = (params: { params, }); }; + +// 班级列表(按教师)- 接口 org/class/listByTeacher,可选年级筛选 +export const getClassListByTeacher = (params?: { gradeId?: string; gradeName?: string }) => { + return request({ + url: '/org/class/listByTeacher', + method: 'GET', + params: params || {}, + }); +}; + +// 根据班级ID获取学科列表 +export const getSubjectListByClassId = (classId: string) => { + return request({ + url: '/org/class/listSubjectInfoByClassId', + method: 'GET', + params: { classId }, + }); +}; + +// ---------- 班级作业完成情况报表 school/report/classHomework/list ---------- +export interface ClassHomeworkSubjectStat { + subjectId: number; + subjectName: string; + homeworkCount: number; + completedCount: number; + uncompletedCount: number; +} + +export interface ClassHomeworkStudentItem { + userId: number; + userName: string; + totalCount: number; + completedCount: number; + uncompletedCount: number; + subjectStats: ClassHomeworkSubjectStat[]; +} + +export interface ClassHomeworkReportData { + classId: number; + className: string; + subjects: { subjectId: number; subjectName: string }[]; + studentList: ClassHomeworkStudentItem[]; +} + +/** 班级作业报表:GET 请求,参数以 form 表单风格放在 query(subjectIds 为多个同名参数) */ +export const getClassHomeworkReport = (params: { + classId: string | number; + /** 学科ID列表,可多选,不传或空则查全部学科 */ + subjectIds?: number[]; + startTime?: string; + endTime?: string; +}) => { + // form 表单编码:空格用 +,特殊字符用 encodeURIComponent 后把 %20 替换为 + + const formEncode = (v: string) => encodeURIComponent(v).replace(/%20/g, '+'); + + const query: string[] = []; + query.push('classId=' + formEncode(String(params.classId))); + if (params.subjectIds && params.subjectIds.length > 0) { + params.subjectIds.forEach((id) => { + query.push('subjectIds=' + formEncode(String(id))); + }); + } + if (params.startTime != null && params.startTime !== '' && String(params.startTime).trim() !== '') { + // 后端 Date 类型需要带时分秒,picker 只返回 yyyy-MM-dd,补 00:00:00 + const st = String(params.startTime).trim(); + query.push('startTime=' + formEncode(st.includes(' ') ? st : st + ' 00:00:00')); + } + if (params.endTime != null && params.endTime !== '' && String(params.endTime).trim() !== '') { + // 结束时间补 23:59:59,保证包含当天 + const et = String(params.endTime).trim(); + query.push('endTime=' + formEncode(et.includes(' ') ? et : et + ' 23:59:59')); + } + const queryString = query.join('&'); + return request({ + url: '/school/report/classHomework/list?' + queryString, + method: 'GET', + }); +}; diff --git a/src/components/Select/index.vue b/src/components/Select/index.vue index d51012b..e0d6b44 100644 --- a/src/components/Select/index.vue +++ b/src/components/Select/index.vue @@ -1,12 +1,15 @@ + + diff --git a/src/pages/teacher/homework/index.vue b/src/pages/teacher/homework/index.vue index 787a0e7..0180aeb 100644 --- a/src/pages/teacher/homework/index.vue +++ b/src/pages/teacher/homework/index.vue @@ -1,211 +1,604 @@ diff --git a/src/pages/teacher/index/index.vue b/src/pages/teacher/index/index.vue index eb6431c..5212a7c 100644 --- a/src/pages/teacher/index/index.vue +++ b/src/pages/teacher/index/index.vue @@ -38,7 +38,7 @@ - + diff --git a/src/utils/index.ts b/src/utils/index.ts index 9de0047..6cd3ea1 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,3 +1,4 @@ export * from './tool'; export * from './map'; export * from './getStatic'; +export * from './subject'; \ No newline at end of file diff --git a/src/utils/subject.ts b/src/utils/subject.ts new file mode 100644 index 0000000..a9684f7 --- /dev/null +++ b/src/utils/subject.ts @@ -0,0 +1,36 @@ +/** + * 学科选项:与 admin playground store/basic-data/subject 保持一致(教材选择弹框学科数据来源) + */ +export interface SubjectOption { + value: number; + label: string; +} + +const subjects: SubjectOption[] = [ + { value: 2, label: '语文' }, + { value: 3, label: '数学' }, + { value: 4, label: '英语' }, + { value: 5, label: '科学' }, + { value: 6, label: '物理' }, + { value: 7, label: '化学' }, + { value: 8, label: '历史' }, + { value: 9, label: '道德与法治' }, + { value: 10, label: '地理' }, + { value: 11, label: '生物' }, + { value: 12, label: '政治' }, + { value: 13, label: '信息' }, + { value: 14, label: '通用' }, + { value: 15, label: '日语' }, +]; + +/** 学科下拉选项(用于筛选等),与 admin 教材选择弹框学科数据一致 */ +export function getSubjectOptions(): SubjectOption[] { + return subjects; +} + +/** 学科 value 转 label */ +export function getSubjectLabel(value: number | string): string { + const v = Number(value); + const item = subjects.find((s) => s.value === v); + return item?.label ?? ''; +}