试用前走查的修改:报错看得见、学生找得到作业、运行区和设计器的若干体验问题
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s

- 运行区:编译错误、运行异常、控制台输出和保存的图片移到窗体下面,不再被实训台挤成 0 高;缩放和放大按钮移到桌面上方,不压窗体的关闭按钮;放大后也能停止程序;点停止后清掉窗体
- 运行异常:常见 .NET 异常配中文说明,显示出错的文件、行号和方法,点击跳到代码
- 运行中的下拉列表挂到页面最外层,能伸出窗体和分组框(小窗体也能选到 COM4、COM5)
- 学生登录后进"我的作业";任务面板从工具栏下面开始,不挡导航;记住上次做的实验,从数据库页面返回、恢复数据时默认用它
- 代码页和设计页左栏都占 3/5,文件标签放不下时换行;实验选择框加宽;关闭粘性滚动
- 设计器:双击生成的事件方法带缩进;双击工具箱放进选中控件所在的容器并错开位置;新控件比容器宽时按比例缩小;无边框窗体不画标题栏
- 中文界面:代码编辑器(查找替换等)、属性窗口的颜色选项
- SQL:DATEADD、DATEDIFF、DATEPART 的日期单位(day、hour)解析成 IdentifierLiteral 时报"不支持",补上
- 项目 8 的预置环境数据改成建库那天之前的 7 天;p6-t3 评分项改为"按日期查询环境数据"
- 没有 AI 建议时不显示"全部采纳 AI 建议"和相关说明;导出 CSV 只给纯数字的文字加制表符

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-27 08:49:42 +08:00
1 parent da623fa648
commit f6024dc113
30 files changed
+537 -255

No files matched your search

+13 -11
View File
@@ -30,7 +30,7 @@ import { createRunSession } from '../run/session'
import GradeResultView from '../grading/GradeResultView.vue'
import TaskPanel from '../grading/TaskPanel.vue'
import { captureForms } from '../grading/screenshots'
import { renderSampleTag, sampleOptions } from '../samples'
import { lastSample, rememberSample, renderSampleTag, sampleOptions } from '../samples'
const props = defineProps<{ assignmentId?: string; submissionId?: string }>()
@@ -128,8 +128,8 @@ onMounted(async () => {
}
const list = await api<{ id: string; title: string }[]>('GET', '/api/samples')
samples.value = sampleOptions(list)
// 网址里带 ?sample=示例编号 时直接打开该示例(便于老师把链接发给学生)
const initial = list.find((s) => s.id === route.query.sample) ?? list[0]
// 网址里带 ?sample=示例编号 时直接打开该示例(便于老师把链接发给学生),否则打开上次做的实验
const initial = list.find((s) => s.id === route.query.sample) ?? list.find((s) => s.id === lastSample()) ?? list[0]
if (initial) await loadSample(initial.id)
})
@@ -150,6 +150,7 @@ async function openProject(key: string, original: () => Promise<SourceFile[]>, d
async function loadSample(id: string, discardWork = false) {
sampleId.value = id
void router.replace({ query: { sample: id } })
rememberSample(id)
sampleChecks.value = []
sampleTask.value = null
void api<string[]>('GET', `/api/samples/${encodeURIComponent(id)}/checks`)
@@ -596,7 +597,7 @@ function run() {
:before-start="flushSave"
/>
<main class="workspace" :class="{ designing: activeForm, 'run-collapsed': runCollapsed }">
<main class="workspace" :class="{ 'run-collapsed': runCollapsed }">
<section class="editor">
<div class="tab-row">
<NTabs v-model:value="activeTab" type="card" size="small" class="file-tabs">
@@ -698,7 +699,7 @@ function run() {
}
.sample-select {
width: 240px;
width: 300px;
}
.metrics {
@@ -758,16 +759,12 @@ function run() {
white-space: nowrap;
}
/* 设计页要放工具箱、窗体和属性窗口,代码页要放得下长代码行,左栏都放宽;切换标签页时布局不跳 */
.workspace {
flex: 1;
display: grid;
grid-template-columns: minmax(360px, 2fr) 14px 3fr;
min-height: 0;
}
/* 设计器需要工具箱、窗体和属性窗口,左栏放宽 */
.workspace.designing {
grid-template-columns: minmax(0, 3fr) 14px minmax(360px, 2fr);
min-height: 0;
}
.workspace.run-collapsed {
@@ -815,6 +812,11 @@ function run() {
min-width: 0;
}
/* 文件多时(项目 8 有十来个)标签换行显示,不藏在看不到滚动条的横向滚动里 */
.file-tabs :deep(.n-tabs-wrapper) {
flex-wrap: wrap;
}
.new-form {
display: flex;
flex-direction: column;