From 536379036a7f8972fe90668ac41fc54a60fd8c20 Mon Sep 17 00:00:00 2001 From: LoveChengke Date: Sat, 17 Oct 2026 21:21:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E8=A1=A5=E9=BD=90=E8=AF=BE?= =?UTF-8?q?=E7=A8=8B=E6=8F=90=E9=86=92=E8=BF=9B=E5=BA=A6=E5=B9=B6=E5=86=85?= =?UTF-8?q?=E5=B5=8C=E7=BC=96=E8=BE=91=E5=99=A8=E4=B8=8E=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=AF=BC=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev/20261017-implementation.md | 25 +- docs/reference.md | 6 + .../src/island/ComponentInspector.vue | 6 + .../src/island/ComponentNode.vue | 94 +++- .../src/island/CustomIsland.vue | 28 +- .../src/island/CustomIslandRuntime.vue | 12 +- .../desktop-client/src/island/IslandApp.vue | 1 + .../src/island/LayoutIslandApp.vue | 41 +- .../src/island/LessonReminderContent.vue | 53 ++- .../src/island/classic-island.css | 4 + .../src/island/custom-runtime.css | 3 + packages/desktop-client/src/main/index.ts | 7 + packages/desktop-client/src/main/island.ts | 76 ++-- .../src/main/lesson-reminder.ts | 50 ++- .../desktop-client/src/main/smoke-layout.ts | 70 ++- .../desktop-client/src/main/smoke-resident.ts | 158 +++++-- packages/desktop-client/src/main/smoke.ts | 37 +- packages/desktop-client/src/preload/index.ts | 5 + .../src/renderer/cache/self-test.ts | 39 ++ .../src/renderer/layouts/ClientLayout.vue | 4 + .../src/renderer/router/index.ts | 6 + .../views/settings/IslandEditorView.vue | 127 ++++++ .../views/settings/IslandSettingsView.vue | 8 +- .../views/settings/ReminderSettingsView.vue | 76 +++- .../desktop-client/src/types/desktop.d.ts | 2 + packages/shared/src/island-layout.ts | 39 +- packages/shared/src/types.ts | 3 +- .../src/components/ManagementMenu.vue | 111 +++++ packages/web-admin/src/config/navigation.ts | 34 ++ .../web-admin/src/layouts/AdminLayout.vue | 419 ++++++------------ .../web-admin/src/styles/management-shell.css | 276 ++++++++++++ .../web-admin/src/views/DashboardView.vue | 153 +++++++ .../web-admin/src/views/HomeworksView.vue | 2 +- scripts/ui-smoke/main.cjs | 39 ++ 34 files changed, 1559 insertions(+), 455 deletions(-) create mode 100644 packages/desktop-client/src/renderer/views/settings/IslandEditorView.vue create mode 100644 packages/web-admin/src/components/ManagementMenu.vue create mode 100644 packages/web-admin/src/config/navigation.ts create mode 100644 packages/web-admin/src/styles/management-shell.css diff --git a/docs/dev/20261017-implementation.md b/docs/dev/20261017-implementation.md index 6ca6beb..9c37fe0 100644 --- a/docs/dev/20261017-implementation.md +++ b/docs/dev/20261017-implementation.md @@ -182,6 +182,29 @@ LessonReminderTracker 只读取服务端已解析的当天 ScheduleDto 投影, 课前 60 秒开始:3 秒强调遮罩后显示实时秒数和课程时间,持续到上课;上课遮罩 5 秒后退出。 下课先提示 2 秒,再预告下节课程 10 秒;当天最后一课下课只提示 5 秒。不补弹已经过去的上下课事件。 刷新同一课表不会重置遮罩,临时换课立即更新名称,移除课程或退出账号会取消提醒。 -提醒是独立本机状态,不写入教师通知、未读计数或通知队列;已经打开的通知详情和紧急提示优先展示。 +提醒是独立本机状态,不写入教师通知、未读计数或通知队列;用户主动打开的通知详情和紧急提示优先展示,自动补弹的普通通知不再挡住上下课提醒。 经典与自定义两种布局使用同一个 LessonReminderContent;原生窗口仍为固定画布,自定义岛用自然尺寸缩放适配。 本次只移植课表可见提醒和动画,不自动启用语音与音效。 + +## 课程进度、即将下课与主窗口编辑(本批补齐) + +- 对照上游 `LessonControlExpanded.axaml` 的 `LeftSeconds` 和 `ProgressPercent`,课程组件增加持续的本节进度条与距下课时间,课间自动显示下一课;起止时间保持在课程名右侧,按秒更新。 +- 倒计时组件支持自动上下课、本节下课、下一节课、放学四种目标,按当天课表排序,排除其它日期。已有配置缺少新字段时自动补齐。 +- 默认最后 60 秒显示即将下课倒数;经典岛在上课遮罩后持续显示本节课程、剩余时间与进度,自定义岛平时由组件显示进度,时间点提醒接管同一个岛体。 +- 设置→提醒提供课前、上课、即将下课、下课独立开关,以及经典岛课中进度开关;课前提前 5–1800 秒,下课倒数提前 5–600 秒,保存后即刻生效。 +- 自定义编辑器移到主窗口 `/settings/island/editor`;设置和兼容 IPC 入口都导航到主窗口,浮岛不再被扩大成全屏编辑窗口。主窗口保留侧栏,画布按内容与可用空间自动缩放,支持触摸跨行拖动、容器和独立常态/展开内容。 +- 编辑使用独立预览,不上报桌面岛尺寸;配置保存按顺序执行。关闭编辑返回灵动岛设置。 + +## 管理后台界面与二级菜单 + +按用户确认,本批“重写后端”指 Web 管理后台界面与导航。参考 art-design-pro 的 sidebar-menu、breadcrumb、header-bar,重写工作区框架,服务端接口、鉴权和既有业务页面保留。 + +- 工作台、教学事务、班级与人员、设备运维、系统管理五个一级分组;原有全部业务入口位于二级菜单。 +- 菜单直接读取路由的标题、图标、角色与生效权限;空分组隐藏,搜索结果和页签也按相同权限过滤,深链继续经过路由守卫。 +- 增加面包屑、最多 20 个可关闭页签、关闭其它页签、Ctrl+K 功能搜索;页签保留该页面的完整查询参数。 +- 统一浅/深主题下的侧栏、顶栏、卡片、表格和页面留白;仪表盘增加真实账号欢迎区与按权限显示的快捷入口。手机端使用同一棵二级菜单的抽屉。 +- 回归使用独立临时 SQLite、临时教师和班级;不读取或改写真实班级业务数据。 + +### 老师消息阅读背景 + +通知、作业、叫人内容展示时,两种布局统一使用 `#202020` 不透明背景,原生窗口透明度临时为 1,玻璃风格和用户设置的透明度不会降低消息可读性。常驻组件、空闲展开和课程提醒仍按原有透明度显示,收起消息后恢复本机透明度偏好。 diff --git a/docs/reference.md b/docs/reference.md index 6ddc738..dfa0772 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -1604,3 +1604,9 @@ makensis 临时目录、ClassIsland 路径与日志编码等)。这里只列 迁移选择同一时段 ID 最小的行,全部原行仍保留;旧数据未记录的群组、临时层和时间点名称无法恢复。 实施选择、问题根因与实测结果见 [实施记录](dev/20261017-implementation.md)。 + +## 2026-10-17 课程状态与管理后台导航 + +课程右侧信息与本节进度参考 [LessonControlExpanded](https://github.com/ClassIsland/ClassIsland/blob/master/ClassIsland.Core/Controls/LessonsControls/LessonControlExpanded.axaml)。新增课中距下课、末段秒数倒数及独立提醒设置;主窗口中的自定义编辑页保留组件拖动与方案管理。 + +管理后台结构参考 [art-design-pro](https://github.com/Daymychen/art-design-pro) 的 `art-sidebar-menu`、`SidebarSubmenu`、`art-breadcrumb` 与 `art-header-bar`;采用 Vue 3 / Element Plus 原有技术栈,重新实现分组菜单、面包屑、页签和搜索,业务接口和权限校验保持原有入口。 diff --git a/packages/desktop-client/src/island/ComponentInspector.vue b/packages/desktop-client/src/island/ComponentInspector.vue index 94049d3..2ef5928 100644 --- a/packages/desktop-client/src/island/ComponentInspector.vue +++ b/packages/desktop-client/src/island/ComponentInspector.vue @@ -63,7 +63,9 @@ const fonts = { @@ -95,6 +97,10 @@ const fonts = { 显示课程时间 + diff --git a/packages/web-admin/src/config/navigation.ts b/packages/web-admin/src/config/navigation.ts new file mode 100644 index 0000000..3b3151f --- /dev/null +++ b/packages/web-admin/src/config/navigation.ts @@ -0,0 +1,34 @@ +/** 只定义分组;子页标题、图标和权限直接读取路由,避免菜单与路由各维护一套权限。 */ +export const MANAGEMENT_GROUPS = [ + { id: 'workspace', title: '工作台', icon: 'Odometer', paths: ['/dashboard', '/assistant'] }, + { + id: 'teaching', + title: '教学事务', + icon: 'Notebook', + paths: ['/schedules', '/plan-editor', '/homeworks', '/notifications', '/grades'], + }, + { + id: 'school', + title: '班级与人员', + icon: 'School', + paths: ['/classes', '/students', '/teachers', '/roster', '/term-weeks', '/archives'], + }, + { id: 'devices', title: '设备运维', icon: 'Monitor', paths: ['/clients'] }, + { + id: 'system', + title: '系统管理', + icon: 'Setting', + paths: ['/permissions', '/system-settings', '/ai-settings', '/database'], + }, +] as const; +export interface ManagementMenuItem { + path: string; + title: string; + icon: string; +} +export interface ManagementMenuGroup { + id: string; + title: string; + icon: string; + items: ManagementMenuItem[]; +} diff --git a/packages/web-admin/src/layouts/AdminLayout.vue b/packages/web-admin/src/layouts/AdminLayout.vue index f5db869..44af606 100644 --- a/packages/web-admin/src/layouts/AdminLayout.vue +++ b/packages/web-admin/src/layouts/AdminLayout.vue @@ -1,9 +1,11 @@