成绩分布(已批改提交)
-
+
{{ d.label }}
@@ -61,12 +69,14 @@ const HW_STATUS_TEXT: Record
= { draft: "草稿", collecting: "
{{ d.count }}
+
暂无可统计的批阅分数(后端未返回成绩分布口径)
我布置的作业 · 提交与批改
+
暂无需要收集提交记录的作业(后端未返回按作业进度口径)
@@ -124,6 +135,11 @@ const HW_STATUS_TEXT: Record
= { draft: "草稿", collecting: "
margin-bottom: 12px;
}
}
+.block-empty {
+ color: #a6aab0;
+ font-size: 13px;
+ padding: 12px 0;
+}
.dist {
.dist-row {
display: flex;
diff --git a/src/views/homework/NewHomework.vue b/src/views/homework/NewHomework.vue
index b4005fd..8f63f9c 100644
--- a/src/views/homework/NewHomework.vue
+++ b/src/views/homework/NewHomework.vue
@@ -72,7 +72,7 @@ async function loadClasses() {
function toggleAll(v: boolean) {
if (v) selClasses.value = [...allClassIds.value];
}
-onMounted(loadClasses);
+/* 班级树由下方统一初始化入口按序加载(fillFromV2 依赖 allClassIds 判定「全部班级」) */
const ruleValidate = {
title: [
@@ -147,6 +147,9 @@ function fillFromV2(d: HomeworkV2Vo) {
}
onMounted(async () => {
+ // 先加载班级树再回显:fillFromV2 用 allClassIds 判定「全部班级」,
+ // 若并行执行则 allClassIds 仍为空,勾选态会被误判为「未全选」
+ await loadClasses();
if (!(isEdit.value || fid.value > 0)) return;
try {
if (isEdit.value) {
diff --git a/src/views/homework/StudentHomeworks.vue b/src/views/homework/StudentHomeworks.vue
index 49dd584..3dfe80a 100644
--- a/src/views/homework/StudentHomeworks.vue
+++ b/src/views/homework/StudentHomeworks.vue
@@ -272,8 +272,8 @@ function zoom(url: string) {
-
-
+
+
diff --git a/src/views/homework/TeacherHomeworks.vue b/src/views/homework/TeacherHomeworks.vue
index 9b294a0..95bbb45 100644
--- a/src/views/homework/TeacherHomeworks.vue
+++ b/src/views/homework/TeacherHomeworks.vue
@@ -252,11 +252,6 @@ function del(row: HomeworkV2Vo) {
});
}
-/* 文本按钮 */
-function btn(text: string, onClick: () => void) {
- return h("Button", { type: "text", size: "small", onClick }, () => text);
-}
-
/* ============ 已发布列表列 ============ */
const pubColumns = computed(() => [
{ title: "序号", type: "index", width: 60, align: "center" },
@@ -335,44 +330,21 @@ const pubColumns = computed(() => [
},
{
title: "操作",
- width: 250,
+ slot: "action",
+ width: 230,
align: "center",
fixed: "right",
- render: (h: any, p: any) => {
- const row = p.row as HomeworkV2Vo;
- const nodes: any[] = [];
- nodes.push(btn("提交情况", () => viewSubmissions(row)));
- if ((row.progress?.pendingGrade ?? 0) > 0) nodes.push(btn("批阅", () => toGrade(row)));
- const more: any[] = [];
- if (row.hwStatus === "PUBLISHED") {
- if ((row.progress?.unread ?? 0) > 0) more.push(mItem("提醒未读", () => remind(row, "NOT_READ")));
- if ((row.progress?.unsubmitted ?? 0) > 0) more.push(mItem("催交", () => remind(row, "NOT_SUBMITTED")));
- more.push(mItem("延长截止", () => openExtend(row)));
- }
- more.push(mItem("复制", () => copyRow(row)));
- if (row.hwStatus === "PUBLISHED" || row.hwStatus === "CLOSED") more.push(mItem("归档", () => archive(row)));
- more.push(mItem("导出报表", () => doExport(row)));
- nodes.push(
- h("Dropdown", { transfer: true, onOnClick: (name: string) => onMore(name) }, () => [
- h("Button", { type: "text", size: "small" }, () => "更多∨"),
- h("DropdownMenu", { slot: "list" }, () => more),
- ])
- );
- return h("div", {}, nodes);
- },
},
]);
-/* 更多菜单回调(闭包 name→action) */
-const moreActions = new Map void>();
-let moreSeq = 0;
-function mItem(text: string, action: () => void) {
- const key = `m${++moreSeq}`;
- moreActions.set(key, action);
- return h("DropdownItem", { name: key }, () => text);
-}
-function onMore(name: string) {
- moreActions.get(name)?.();
+/* 更多菜单分发 */
+function onPubMore(name: string, row: HomeworkV2Vo) {
+ if (name === "notRead") remind(row, "NOT_READ");
+ else if (name === "notSubmitted") remind(row, "NOT_SUBMITTED");
+ else if (name === "extend") openExtend(row);
+ else if (name === "copy") copyRow(row);
+ else if (name === "archive") archive(row);
+ else if (name === "export") doExport(row);
}
/* ============ 草稿箱列 ============ */
@@ -401,18 +373,10 @@ const draftColumns = computed(() => [
},
{
title: "操作",
+ slot: "draftAction",
width: 250,
align: "center",
fixed: "right",
- render: (h: any, p: any) => {
- const row = p.row as HomeworkV2Vo;
- const nodes: any[] = [];
- nodes.push(btn("编辑", () => edit(row)));
- nodes.push(btn("发布", () => publishDraft(row)));
- if (row.hwStatus === "DRAFT_SCHEDULED") nodes.push(btn("取消定时", () => cancelSchedule(row)));
- nodes.push(btn("删除", () => del(row)));
- return nodes;
- },
},
]);
@@ -462,7 +426,33 @@ const tableHeight = computed(() => Utils.useTableHeight({ isSearch: true, isOper
:height="tableHeight"
:loading="loading"
no-data-text="暂无数据"
- >
+ >
+
+
+
+
+ onPubMore(name, row)">
+
+
+
+ 提醒未读
+ 催交
+ 延长截止
+ 复制
+ 归档
+ 导出报表
+
+
+
+
+
+
+
+
+
+
+
+
{
port: 8077,
proxy: {
// dev 正式模式:serviceHost 为空(同源相对路径 /api/...),经此代理转发到本地后端
- // (后端 CAS 过滤器对 /api/* 不回 CORS 头,浏览器直连 8070 会被拦,必须同源代理)
+ // (后端 CAS 过滤器对 /api/* 不回 CORS 头,浏览器直连会被拦,必须同源代理)
"/api": {
- // target: "http://localhost:8101",
- target:"http://base.yunhaixingtong.com/homework/",
+ // M5 联调:本地 ClassHomeWork 后端(application.yml server.port=8102,
+ // 名册种子见后端 resources/sql/v3_seed.sql)
+ target: "http://localhost:8102",
+ // 远程测试环境(本地后端未启动时临时切回):
+ // target: "http://base.yunhaixingtong.com/homework/",
changeOrigin: true,
},
},