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 @@
-
+
{{ currentLabel }}
-
+
-
+
+
+
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 @@
-
+
-
+
+
+
+ {{ filterSummary }}
+ 修改筛选
+
+
+
+ 分享
+
+
+
+
+
+
+
+
+
+
+ 保存到相册
+
+
+ 分享给好友
+
+
+
+ 关闭
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
- {{ item.subjectName }}
-
-
- {{ item.name }}
-
-
- {{ item.paperName }}
-
-
-
- 发布数量: {{ item.number }}
- 完成数量: {{ item.completeNumber }}
-
-
-
-
-
- {{ getStatusText(item.status) }}
-
+
+
+
+ ⏳
+ 加载中...
+
+
+
+ ⚠️
+ {{ error }}
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+ {{ stu.userName.slice(0, 1) }}
+
+
+ {{ stu.userName }}
+
+
+
+
+ {{ stu.totalCount ? Math.round(stu.completedCount / stu.totalCount * 100) : 0 }}%
+
+
+
+
+
+
+ {{ stu.totalCount }}
+ 总数
+
+
+
+ {{ stu.completedCount }}
+ 完成
+
+
+
+ {{ stu.uncompletedCount }}
+ 未完成
+
+
+
+
+
+
+
+ {{ stat.subjectName }}
+ {{ stat.completedCount }}/{{ stat.homeworkCount }}
+
+
+
+
+
+ 📭
+ 暂无学生数据
+
+
+
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 ?? '';
+}