From c0ebf88138117471d2d9d99b70e66dc20fa264ce Mon Sep 17 00:00:00 2001 From: LoveChengke Date: Sat, 17 Oct 2026 03:06:46 +0800 Subject: [PATCH] =?UTF-8?q?chore(release):=201.3.3=20=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E5=B9=B6=E9=80=80=E5=BD=B9=E6=97=A7=E8=81=94=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 323 +++--- README.md | 128 ++- deploy/docker-compose.sqlite.yml | 2 +- deploy/docker-compose.yml | 2 +- deploy/package.runtime.json | 2 +- docs/app/calls.md | 5 +- docs/app/index.md | 2 +- docs/app/notifications.md | 31 +- docs/app/schedules.md | 22 +- docs/dev/api.md | 209 ++-- docs/dev/architecture.md | 31 +- docs/dev/classisland-plugin.md | 149 --- docs/dev/data-model.md | 70 +- docs/dev/index.md | 15 +- docs/dev/permissions.md | 115 ++- docs/dev/realtime.md | 4 +- docs/dev/release.md | 36 +- docs/dev/review-2026-10-17.md | 50 + docs/dev/testing.md | 96 +- docs/dev/toc.yml | 4 +- docs/faq.md | 4 +- docs/get-started/classisland.md | 120 --- docs/get-started/client.md | 10 +- docs/get-started/first-content.md | 22 +- docs/get-started/index.md | 18 +- docs/get-started/requirements.md | 3 +- docs/get-started/setup-class.md | 2 +- docs/get-started/toc.yml | 2 - docs/get-started/web-admin.md | 26 +- docs/images/web-integrations.jpg | Bin 65965 -> 0 bytes docs/index.md | 12 +- docs/management/upgrade.md | 9 +- docs/reference.md | 822 ++++++--------- package.json | 15 +- packages/classisland-plugin/.gitignore | 4 - .../ClassHelper.ClassIslandPlugin.csproj | 45 - .../Properties/launchSettings.json | 10 - packages/classisland-plugin/README.md | 163 --- packages/classisland-plugin/icon.png | Bin 85233 -> 0 bytes packages/classisland-plugin/manifest.yml | 19 - packages/classisland-plugin/scripts/build.mjs | 168 --- .../classisland-plugin/scripts/verify.mjs | 405 -------- .../src/Interop/ClassHelperClient.cs | 485 --------- .../src/Models/PluginSettings.cs | 159 --- packages/classisland-plugin/src/Plugin.cs | 171 ---- .../src/Services/BridgeService.cs | 647 ------------ .../ClassHelperNotificationProvider.cs | 260 ----- .../src/Services/ClassPlanWriter.cs | 299 ------ .../src/Services/ScheduleMapper.cs | 272 ----- .../src/Views/BridgeSettingsPage.axaml | 150 --- .../src/Views/BridgeSettingsPage.axaml.cs | 198 ---- packages/desktop-client/package.json | 2 +- packages/desktop-client/scripts/smoke.mjs | 165 +-- .../desktop-client/src/island/IslandApp.vue | 62 +- .../desktop-client/src/main/auto-update.ts | 124 ++- .../desktop-client/src/main/client-agent.ts | 116 ++- packages/desktop-client/src/main/config.ts | 22 +- .../desktop-client/src/main/crash-guard.ts | 17 +- packages/desktop-client/src/main/index.ts | 179 ++-- packages/desktop-client/src/main/ipc.ts | 6 +- packages/desktop-client/src/main/island.ts | 56 +- .../desktop-client/src/main/smoke-quick.ts | 106 ++ packages/desktop-client/src/main/smoke.ts | 87 +- packages/desktop-client/src/preload/index.ts | 3 + packages/desktop-client/src/renderer/App.vue | 8 - .../desktop-client/src/renderer/api/index.ts | 35 +- .../desktop-client/src/renderer/cache/db.ts | 67 +- .../src/renderer/cache/index.ts | 11 +- .../src/renderer/cache/scope.ts | 22 + .../src/renderer/cache/self-test.ts | 37 +- .../renderer/components/OnboardingWelcome.vue | 8 +- .../src/renderer/composables/confirm.ts | 12 + .../src/renderer/island/bridge.ts | 27 +- .../src/renderer/layouts/ClientLayout.vue | 29 +- .../desktop-client/src/renderer/stores/app.ts | 91 +- .../src/renderer/stores/auth.ts | 21 +- .../src/renderer/stores/notifications.ts | 45 +- .../src/renderer/stores/realtime.ts | 53 +- .../src/renderer/views/GradeView.vue | 2 +- .../src/renderer/views/LoginView.vue | 2 - .../src/renderer/views/ScheduleView.vue | 13 +- .../views/settings/AccountSettingsView.vue | 5 +- .../views/settings/DeveloperSettingsView.vue | 12 +- .../views/settings/GeneralSettingsView.vue | 16 +- .../views/settings/IslandSettingsView.vue | 5 +- .../views/settings/ReminderSettingsView.vue | 116 +-- .../desktop-client/src/types/desktop.d.ts | 17 +- packages/server/package.json | 7 +- .../migration.sql | 13 + .../migration.sql | 6 + packages/server/prisma/schema.prisma | 130 +-- .../scripts/apply-column-migrations.cjs | 11 +- packages/server/scripts/build.mjs | 20 + .../server/scripts/verify-classisland.mjs | 679 ------------- packages/server/scripts/verify-e2e.mjs | 143 ++- packages/server/src/index.ts | 3 + .../src/lib/backfill-notification-dates.ts | 24 + packages/server/src/lib/db-bootstrap.ts | 17 + packages/server/src/lib/http.ts | 10 +- packages/server/src/lib/mappers.ts | 9 - packages/server/src/lib/permissions.ts | 59 +- packages/server/src/lib/schemas.ts | 2 +- packages/server/src/lib/snapshot.ts | 15 +- packages/server/src/middleware/auth.ts | 13 +- packages/server/src/modules/ai/ai.service.ts | 61 +- .../server/src/modules/auth/auth.module.ts | 4 +- .../server/src/modules/calls/calls.service.ts | 24 +- .../src/modules/classes/classes.module.ts | 76 +- .../src/modules/classes/classes.schemas.ts | 19 +- .../src/modules/classes/classes.service.ts | 124 +-- .../src/modules/clients/clients.module.ts | 22 +- .../src/modules/clients/clients.schemas.ts | 7 + .../src/modules/clients/clients.service.ts | 104 +- .../src/modules/dashboard/dashboard.module.ts | 12 +- .../src/modules/grades/grades.module.ts | 63 +- .../src/modules/grades/grades.service.ts | 19 +- .../src/modules/imports/class-plan.service.ts | 9 +- .../src/modules/imports/imports.module.ts | 62 +- .../modules/imports/table-import.service.ts | 45 +- .../src/modules/integrations/device-auth.ts | 104 -- .../integrations/integrations.module.ts | 255 ----- .../integrations/integrations.schemas.ts | 133 --- .../integrations/integrations.service.ts | 957 ------------------ .../integrations/write-back.service.ts | 271 ----- .../notifications/notifications.schemas.ts | 12 +- .../notifications/notifications.service.ts | 58 +- .../modules/permissions/permissions.module.ts | 2 +- .../permissions/permissions.service.ts | 92 +- packages/server/src/modules/registry.ts | 2 - .../modules/schedules/schedules.schemas.ts | 2 +- .../modules/schedules/schedules.service.ts | 8 +- .../src/modules/students/students.module.ts | 6 +- .../src/modules/students/students.service.ts | 36 +- .../src/modules/teachers/teachers.module.ts | 4 +- .../server/src/modules/term/term.service.ts | 26 +- .../src/modules/update/update.module.ts | 24 +- packages/server/src/realtime/socket.ts | 6 +- packages/server/src/types/express.d.ts | 10 - packages/shared/package.json | 2 +- packages/shared/src/constants.ts | 57 +- packages/shared/src/permissions.ts | 48 +- packages/shared/src/types.ts | 386 +------ packages/shared/src/utils.ts | 2 +- packages/web-admin/package.json | 2 +- packages/web-admin/src/api/index.ts | 85 +- .../src/components/TableImportDialog.vue | 15 +- .../web-admin/src/layouts/AdminLayout.vue | 47 +- packages/web-admin/src/router/index.ts | 28 +- packages/web-admin/src/stores/auth.ts | 10 +- packages/web-admin/src/stores/realtime.ts | 39 +- packages/web-admin/src/styles/index.css | 3 +- .../web-admin/src/views/AiSettingsView.vue | 36 +- packages/web-admin/src/views/ArchivesView.vue | 34 +- .../web-admin/src/views/AssistantView.vue | 27 +- packages/web-admin/src/views/ClassesView.vue | 119 ++- .../web-admin/src/views/ClientHubView.vue | 762 -------------- packages/web-admin/src/views/ClientsView.vue | 135 ++- packages/web-admin/src/views/GradesView.vue | 217 ++-- .../web-admin/src/views/HomeworksView.vue | 203 ++-- .../web-admin/src/views/IntegrationsView.vue | 816 --------------- .../web-admin/src/views/NotificationsView.vue | 159 +-- .../web-admin/src/views/PermissionsView.vue | 23 +- .../web-admin/src/views/SchedulesView.vue | 69 +- packages/web-admin/src/views/StudentsView.vue | 34 +- .../web-admin/src/views/TermWeeksView.vue | 55 +- scripts/icons/render.cjs | 7 +- scripts/lib/smoke-class.mjs | 110 +- scripts/ui-smoke/live-probe.mjs | 13 +- scripts/ui-smoke/main.cjs | 283 ++---- scripts/ui-smoke/run.mjs | 25 +- scripts/verify-client-agent.mjs | 254 +++++ scripts/verify-client-migrations.mjs | 96 ++ scripts/verify-clients-api.mjs | 233 +++++ scripts/verify-packaged.mjs | 60 +- scripts/verify-review-api.mjs | 358 +++++++ scripts/verify-review-client.mjs | 309 ++++++ scripts/version.mjs | 42 +- website/assets/download.js | 25 +- website/assets/main.js | 14 +- website/assets/shots/web-integrations.jpg | Bin 65965 -> 0 bytes website/download.html | 14 +- website/index.html | 56 +- website/tools/capture-shots.mjs | 1 - 代码审查报告-2026-10-17.md | 607 +++++++++++ 184 files changed, 5450 insertions(+), 11705 deletions(-) delete mode 100644 docs/dev/classisland-plugin.md create mode 100644 docs/dev/review-2026-10-17.md delete mode 100644 docs/get-started/classisland.md delete mode 100644 docs/images/web-integrations.jpg delete mode 100644 packages/classisland-plugin/.gitignore delete mode 100644 packages/classisland-plugin/ClassHelper.ClassIslandPlugin.csproj delete mode 100644 packages/classisland-plugin/Properties/launchSettings.json delete mode 100644 packages/classisland-plugin/README.md delete mode 100644 packages/classisland-plugin/icon.png delete mode 100644 packages/classisland-plugin/manifest.yml delete mode 100644 packages/classisland-plugin/scripts/build.mjs delete mode 100644 packages/classisland-plugin/scripts/verify.mjs delete mode 100644 packages/classisland-plugin/src/Interop/ClassHelperClient.cs delete mode 100644 packages/classisland-plugin/src/Models/PluginSettings.cs delete mode 100644 packages/classisland-plugin/src/Plugin.cs delete mode 100644 packages/classisland-plugin/src/Services/BridgeService.cs delete mode 100644 packages/classisland-plugin/src/Services/ClassHelperNotificationProvider.cs delete mode 100644 packages/classisland-plugin/src/Services/ClassPlanWriter.cs delete mode 100644 packages/classisland-plugin/src/Services/ScheduleMapper.cs delete mode 100644 packages/classisland-plugin/src/Views/BridgeSettingsPage.axaml delete mode 100644 packages/classisland-plugin/src/Views/BridgeSettingsPage.axaml.cs create mode 100644 packages/desktop-client/src/main/smoke-quick.ts create mode 100644 packages/desktop-client/src/renderer/cache/scope.ts create mode 100644 packages/desktop-client/src/renderer/composables/confirm.ts create mode 100644 packages/server/prisma/migrations/20261016090000_retire_integration_and_schedule_updates/migration.sql create mode 100644 packages/server/prisma/migrations/20261017090000_permission_read_keys/migration.sql create mode 100644 packages/server/scripts/build.mjs delete mode 100644 packages/server/scripts/verify-classisland.mjs create mode 100644 packages/server/src/lib/backfill-notification-dates.ts delete mode 100644 packages/server/src/modules/integrations/device-auth.ts delete mode 100644 packages/server/src/modules/integrations/integrations.module.ts delete mode 100644 packages/server/src/modules/integrations/integrations.schemas.ts delete mode 100644 packages/server/src/modules/integrations/integrations.service.ts delete mode 100644 packages/server/src/modules/integrations/write-back.service.ts delete mode 100644 packages/web-admin/src/views/ClientHubView.vue delete mode 100644 packages/web-admin/src/views/IntegrationsView.vue create mode 100644 scripts/verify-client-agent.mjs create mode 100644 scripts/verify-client-migrations.mjs create mode 100644 scripts/verify-clients-api.mjs create mode 100644 scripts/verify-review-api.mjs create mode 100644 scripts/verify-review-client.mjs delete mode 100644 website/assets/shots/web-integrations.jpg create mode 100644 代码审查报告-2026-10-17.md diff --git a/AGENTS.md b/AGENTS.md index 84acba1..bad8ea8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,24 @@ # AGENTS.md — ClassHelper(Class Helper) 本文件写给在本仓库里干活的 AI 编码代理。先读这里,再动代码。 + +**2026-10-16 更新**:当前仓库位于 `F:\ClassHelper`,F 盘可用。ClassIsland 联动插件、设备令牌、提醒通道与镜像接口已退役;离线课表 JSON 导入和界面设计参考保留。下文历史联动部署记录不再适用。 +客户端维护只走 `/api/clients/*`,页面为 `ClientsView.vue`;默认权限按数据库中对应角色的默认组生效。 +**2026-10-17 更新**:日常 `verify:desktop` / `verify:packaged` 默认是后台快速检查,不创建可见灵动岛或托盘; +完整桌面动画、透明度与截图验收必须显式加 `--visual`(`pnpm verify:desktop:visual`)。 +下文关于置顶验证窗口、鼠标穿透与截图时序的历史约定仅适用于视觉模式。不要为了日常修改反复占用用户桌面。 +联网冒烟显式启用,使用临时教师和班级;禁止回退到真实班级、重置其密码或向其发送测试通知。 + +本次 PowerShell 会话的 PATH 不含 pnpm:需要先把 `C:\Users\hck16\AppData\Local\deepseek-harness\bin` +加到 PATH 前面,再按下文设置 `DSH_NODE` 和 `DSH_PNPM_BIN`。Git Bash 外层找不到 pnpm 时可执行: + +```bash +export DSH_NODE='D:\Node.js\node.exe' +export DSH_PNPM_BIN='C:\Users\hck16\AppData\Local\node\corepack\v1\pnpm\11.8.0\bin\pnpm.cjs' +node "C:/Users/hck16/AppData/Local/node/corepack/v1/pnpm/11.8.0/bin/pnpm.cjs" typecheck +``` + +外层直接调用用于解决找不到命令;环境变量让内部嵌套的 pnpm 仍使用真实运行时。 文中「本机环境」「已知坑」两节按**实测**写成;若与本机现状不符,以本机实测为准并顺手改掉这里。 --- @@ -9,13 +27,12 @@ 班级信息管理系统,**pnpm monorepo**,一份代码产出多个交付物: -| 交付物 | 位置 | 形态 | -| -------------------- | ----------------------------- | ------------------------------------------------------------------------------ | -| 后端服务 | `packages/server` | Express 5 + Prisma 7 + Socket.IO,`/api` 前缀 | -| Web 管理端 | `packages/web-admin` | Vue 3 + Vite + Element Plus(教师/管理员用,PWA 可安装) | -| 桌面客户端 | `packages/desktop-client` | Electron + Vue 3(学生用,含「灵动岛」浮窗) | -| 共享契约 | `packages/shared` | 三端共用的类型 / 常量 / 权限 / 工具函数 | -| ClassIsland 联动插件 | `packages/classisland-plugin` | .NET 8 / C#(装在教室的 ClassIsland 上:上报课表与上课状态、弹出老师发的提醒) | +| 交付物 | 位置 | 形态 | +| ---------- | ------------------------- | -------------------------------------------------------- | +| 后端服务 | `packages/server` | Express 5 + Prisma 7 + Socket.IO,`/api` 前缀 | +| Web 管理端 | `packages/web-admin` | Vue 3 + Vite + Element Plus(教师/管理员用,PWA 可安装) | +| 桌面客户端 | `packages/desktop-client` | Electron + Vue 3(学生用,含「灵动岛」浮窗) | +| 共享契约 | `packages/shared` | 三端共用的类型 / 常量 / 权限 / 工具函数 | 核心链路: @@ -28,9 +45,6 @@ ▼ Socket.IO ──► class:{classId} 房间 ──► 学生桌面客户端实时更新 UI -ClassIsland(教室机器)──► ClassHelper 联动插件 ──► /api/integrations/classisland/*(设备令牌鉴权) - ▲ │ - └──── 老师下发的提醒(上报返回值里顺带带回)◄┘ ``` - 远端:`LoveChengke/ClassHelper`(仓库名大小写不敏感,本地 remote 存的是小写 `classhelper.git`) @@ -137,7 +151,7 @@ packages/server/ password schemas session term version(读 package.json) web-static src/middleware/ auth validate error security src/realtime/ socket.ts(房间)+ bus.ts(事件总线) - src/modules/ 21 个功能模块 + registry.ts + module.types.ts + src/modules/ 20 个功能模块 + registry.ts + module.types.ts (含 archives 毕业归档、term 学期周次、permissions 权限组、 clients 客户端心跳与远控、system 开发者模式/开机自启、ai 大模型助手) packages/web-admin/src/ api stores router layouts views(18) components(5) composables styles config.ts @@ -150,37 +164,27 @@ packages/desktop-client/ src/renderer/ ClassHelper 班级端渲染进程:api / cache(IndexedDB) / stores / views / island / router src/types/desktop.d.ts 主进程 ↔ 渲染进程契约 scripts/ build-main / dev / smoke / dist-win -packages/classisland-plugin/ .NET 8 插件(独立于 pnpm workspace,不参与 pnpm install) - manifest.yml 清单:id=classhelper.classisland.bridge / apiVersion=2.0.0.0 / version=1.2.0.0 - ClassHelper.ClassIslandPlugin.csproj(TargetFramework=net8.0) - src/Plugin.cs 入口:读配置 → 注册提醒提供方 / 设置页 / BridgeService - src/Models/PluginSettings.cs - src/Services/ BridgeService(上报·接收·镜像)/ ScheduleMapper / ClassPlanWriter - ClassHelperNotificationProvider(把提醒显示到 ClassIsland 上) - src/Views/BridgeSettingsPage.axaml(.cs):Avalonia 设置页 - src/Interop/ClassHelperClient.cs:HTTP 客户端 + 与服务端逐个字段对齐的 DTO - scripts/ build.mjs(编译 / 打包 .cipx)/ verify.mjs(静态契约校验,实测 74 项) ``` --- ## 3. 本机环境(2026-09-30 实测) -| 项 | 状态 | -| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Node | **v22.15.0**(`D:\Node.js\node.exe`;根 `engines` 要求 ≥ 20.19,Prisma 7 的 engine 约束是 `^20.19 \|\| ^22.12 \|\| >=24.0`,v22.15 都满足) | +| 项 | 状态 | +| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Node | **v22.15.0**(`D:\Node.js\node.exe`;根 `engines` 要求 ≥ 20.19,Prisma 7 的 engine 约束是 `^20.19 \|\| ^22.12 \|\| >=24.0`,v22.15 都满足) | | pnpm | 11.8.0(`packageManager` 锁定 11.8.0)。本机可用的本体在 `C:\Users\hck16\AppData\Local\node\corepack\v1\pnpm\11.8.0\bin\pnpm.cjs`;PATH 里那个 `pnpm.ps1` 是 DSH 桌面端的转发壳,**别绕它**(见下) | -| npm registry | `https://registry.npmjs.org/`(仓库内无 `.npmrc`,取全局配置) | -| 依赖 | 已装(707 包,`pnpm install` 实测 2m45s) | -| 后端 `.env` | 已由 `.env.example` 生成(**gitignored**),`JWT_SECRET` 为本机随机值,`TERM_START_DATE=2026-09-07` | -| Prisma Client | 已生成到 `packages/server/src/generated/prisma`(gitignored) | -| 数据库 | SQLite `packages/server/prisma/dev.db`:10 个迁移已应用、种子已写入(用户 18 / 班级 3 / 课程 54 / 课表 93 / 作业 15 / 通知 12 / 成绩 90) | -| `shared/dist` | 已构建(`pnpm build:shared`)—— **它是三端与 seed 的前置产物,缺了会 `ERR_MODULE_NOT_FOUND`** | -| Electron 二进制 | 已手动装好(`node_modules/.pnpm/electron@44.3.0/node_modules/electron/dist/electron.exe`,246 MB) | -| .NET SDK | ✅ **8.0.425**(`C:\Program Files\dotnet\sdk`,`dotnet --list-sdks` 有输出)⇒ 插件可编译/打包;**别再照旧文档说"没装"**(`dotnet` 在 PATH 里,`--list-sdks` 才是权威判据) | -| ClassIsland | **2.1.0.1,装在 `D:\Classisland`**(启动器 `D:\Classisland\ClassIsland.exe`,实际进程 `D:\Classisland\app-2.1.0.1-0\ClassIsland.Desktop.exe`) | -| ClassIsland 数据 | 数据根 **`D:\Classisland\data`**:`Config/`、`Profiles/`、`Plugins/`(当前为空,尚未装本插件)、`Logs/`、`Cache/`、`Settings.json` | -| 桌面会话 | 有(`ClassIsland.Desktop.exe` 跑在 session 1);**Electron GUI 在 AI 会话里也能跑**(需先修完整性标签,见 §7 第 7 条) | +| npm registry | `https://registry.npmjs.org/`(仓库内无 `.npmrc`,取全局配置) | +| 依赖 | 已装(707 包,`pnpm install` 实测 2m45s) | +| 后端 `.env` | 已由 `.env.example` 生成(**gitignored**),`JWT_SECRET` 为本机随机值,`TERM_START_DATE=2026-09-07` | +| Prisma Client | 已生成到 `packages/server/src/generated/prisma`(gitignored) | +| 数据库 | SQLite `packages/server/prisma/dev.db`:10 个迁移已应用、种子已写入(用户 18 / 班级 3 / 课程 54 / 课表 93 / 作业 15 / 通知 12 / 成绩 90) | +| `shared/dist` | 已构建(`pnpm build:shared`)—— **它是三端与 seed 的前置产物,缺了会 `ERR_MODULE_NOT_FOUND`** | +| Electron 二进制 | 已手动装好(`node_modules/.pnpm/electron@44.3.0/node_modules/electron/dist/electron.exe`,246 MB) | +| .NET SDK | ✅ **8.0.425**(`C:\Program Files\dotnet\sdk`,`dotnet --list-sdks` 有输出)⇒ 插件可编译/打包;**别再照旧文档说"没装"**(`dotnet` 在 PATH 里,`--list-sdks` 才是权威判据) | +| ClassIsland | **2.1.0.1,装在 `D:\Classisland`**(启动器 `D:\Classisland\ClassIsland.exe`,实际进程 `D:\Classisland\app-2.1.0.1-0\ClassIsland.Desktop.exe`) | +| ClassIsland 数据 | 数据根 **`D:\Classisland\data`**:`Config/`、`Profiles/`、`Plugins/`(当前为空,尚未装本插件)、`Logs/`、`Cache/`、`Settings.json` | +| 桌面会话 | 有(`ClassIsland.Desktop.exe` 跑在 session 1);**Electron GUI 在 AI 会话里也能跑**(需先修完整性标签,见 §7 第 7 条) | > **旧文档里的 `F:\classisland` / `F:\data` 已失效**:本机只有 `C:` 与 `D:`,`F:` 盘不存在。 > 另有一份旧副本在 `C:\Users\胡\Desktop\classisland`(数据在它自己的 `data/` 下,2026-09-18 用过),当前以 `D:\Classisland` 为准。 @@ -218,10 +222,10 @@ packages/classisland-plugin/ .NET 8 插件(独立于 pnpm workspace,不参 `typecheck` 报出 `[pnpm] pnpm not found`。要么别设,要么先 `Remove-Item Env:DSH_PNPM`。 - 也不要用 `node - @@ -564,7 +597,7 @@ onUnmounted(() => { diff --git a/packages/web-admin/src/views/PermissionsView.vue b/packages/web-admin/src/views/PermissionsView.vue index 42fd4de..30b8983 100644 --- a/packages/web-admin/src/views/PermissionsView.vue +++ b/packages/web-admin/src/views/PermissionsView.vue @@ -254,7 +254,7 @@ const assignDialog = reactive({ }); function openAssign(member: PermissionMemberDto): void { - if (member.fixed) return; // 管理员固定拥有全部权限(服务端同样 400) + if (member.fixed) return; assignDialog.member = member; assignDialog.groupIds = [...member.groupIds]; assignDialog.visible = true; @@ -301,12 +301,10 @@ async function submitAssign(): Promise { (服务端 lib/permissions.ts 的 loadEffectivePermissions)。 --> - + @@ -324,7 +322,9 @@ async function submitAssign(): Promise {
新建权限组 - 内置权限组由系统预置,可以改名与调整权限,但不能删除。 + + 默认权限组可改名与调整权限,修改后对未分组账号立即生效;内置组不能删除。 +
@@ -345,7 +345,9 @@ async function submitAssign(): Promise { @@ -370,7 +372,7 @@ async function submitAssign(): Promise {
- 只列出管理员与教师账号;管理员固定拥有全部权限,不能被分配权限组。 + 只列出管理员与教师账号;管理员始终保留权限与系统管理入口,可调整默认组或分配其他权限组。
@@ -402,7 +404,7 @@ async function submitAssign(): Promise {