# 变更日志 ## 2026-05-18 - [新增] 用户详情页 — 点击用户名查看完整信息,支持编辑和键盘导航 - [优化] 用户管理 UI 统一:Modal 支持键盘导航(ESC/←→/Enter)、TopBar/Button 样式与 issue-ai 对齐 - [调整] 用户列表页去创建时间列,编辑功能移到详情页,仅保留删除按钮 - [新增] LDAP 邮箱自动同步:密码登录/SSO 路径均从 LLDAP 同步 `mail` 到本地 `users.email`,增加 `/api/users/sync-emails` 批量同步接口 - [新增] 编辑用户弹窗增加启用/禁用状态切换、新密码二次确认 - [优化] 角色权限页面 UI 统一:删除改用 Modal 确认、按钮样式对齐 - [优化] API Key 页面 UI 统一:增加副标题、状态可点击切换、创建弹窗增加错误提示和默认权限说明、成功提示颜色对齐 - [优化] 全站字体大小和颜色统一:列表页/详情页 `text-sm` 一致、dark mode 颜色补全 - [修复] 用户管理"最后登录"时间不动态更新:SSO 免登录、本地 JWT 会话验证路径现在也会更新 `last_login_at` ## 2026-05-15 - [修复] docker-compose.yml 缺少 `ALLOWED_API_KEYS` 环境变量传入,导致 P2 部署后中间件返回 401,issue-ai 调用 assets API 再次失效 - [修复] middleware 移除 `better-sqlite3` 依赖,修复 Edge Runtime 不支持 Node.js 原生模块的编译报错(`The edge runtime does not support Node.js 'fs' module`) - [新增] deploy-ai.sh 部署后自动验证 assets→issue API 连通性,带重试机制(3次/10s间隔),与 issue→assets 方向对称 ## 2026-05-14 - [新增] 权限细粒度拆分:`assets:write` → `assets:create`(新增设备)、`assets:import`(导入设备)、`assets:update`(编辑设备),支持独立授权 - [新增] API 模板下载路由增加 `assets:import` 权限检查(原仅校验登录态) - [优化] 角色权限选择列表同步新增三个权限选项(新增资产/导入资产/编辑资产) - [修复] 资产列表页、详情页按钮无权限控制:导入、模板、新增设备、编辑、删除、批量编辑按钮现在由用户权限驱动显隐 - [修复] 新增/导入/编辑资产页面无权限守卫:无权限用户直接访问会被重定向到资产列表 - [修复] 资产列表页模板按钮链接指向 404(`/assets/template` → `/api/assets/template`) - [调整] editor/viewer 角色权限允许自定义编辑(`db-schema.ts` 仅强制同步 admin),三个内置角色均不可删除 - [修复] issue-ai 调用 assets API 返回 401:云端 `api_keys` 表中注册了 issue-ai 使用的 API Key(统一 Key,此前只存在 issue-ai 的 ALLOWED_API_KEYS 环境变量中,assets-ai 的 api_keys 表缺失该记录) - [优化] 中间件 API Key 验证统一为 ALLOWED_API_KEYS(快速路径)→ api_keys 数据库表(回退)两级验证;无效 key 不再被放行,中间件层直接返回 401(安全加固,与 issue-ai 行为一致) ## 2026-05-12 - [部署] 云端 JWT 密钥统一为 oa-shared-jwt-secret-tlyq-2026,三站点密钥一致 - [部署] docker-compose 移除 AUTHELIA_URL,添加 LDAP/COOKIE/INTERNAL_API_KEY 环境变量 - [部署] LLDAP admin 密码更新为 3Vm!Y!@RCiPs - [部署] nginx 移除 auth_request,恢复纯反向代理;改为运行时 DNS 解析 - [新增] `src/lib/db-schema.ts`:users 表新增 last_login_at / last_active_at 列 - [新增] `src/lib/auth.ts`:getSession() 更新 last_active_at - [新增] `src/app/api/auth/login/route.ts`:登录时更新 last_login_at 和 last_active_at ## 2026-05-11 - [新增] `src/lib/ldap.ts`:`ldapUserExists()` 函数,检查 LLDAP 中用户是否存在(admin bind 搜索,不可达时容错放行) - [新增] `src/lib/jwt.ts`:共享 JWT 签发/验证(`tlyq_session` cookie,HS256,与 OA/issue 共用密钥) - [调整] `src/lib/auth.ts`:`getSession()` 优先 `tlyq_session`,加入 LLDAP 存在性检查,用户被删除后自动清除 cookie 踢出 - [调整] `src/app/api/auth/login/route.ts`:LDAP 优先认证 + 本地密码缓存回退 + localadmin 应急用户直连 - [调整] `src/app/api/auth/logout/route.ts`:同时清除 `session_assets` 和 `tlyq_session` - [调整] `src/app/api/auth/me/route.ts`:移除 SSO header 路径,改用 `getSession()` 统一获取 - [调整] `src/middleware.ts`:优先 `tlyq_session` → 回退 `session_assets`,移除 SSO 代理路径,放行 `/api/internal/` - [调整] `src/app/(app)/layout.tsx`:移除 SSO header 路径,统一从 `session` cookie 读取用户 - [新增] `src/app/api/internal/roles/route.ts`:内部 API,返回站点可用角色列表(INTERNAL_API_KEY 鉴权) - [新增] `src/app/api/users/[id]/route.ts`:admin/localadmin 用户禁止删除和修改角色 - [调整] `src/app/(app)/settings/users/page.tsx`:admin/localadmin 用户隐藏删除按钮,编辑时角色字段显示为只读 - [新增] `src/lib/db-schema.ts`:预置 localadmin 应急用户(admin 角色,纯本地 BCrypt 认证) ## 2026-05-07 - [新增] 导出功能区分"导出选中"和"导出全部"两种模式,有选中时工具栏显示两个按钮独立操作 - [新增] 角色权限系统完整改造,支持新建角色、编辑角色权限(10 个细粒度权限复选框) - [新增] 用户管理页角色下拉从 API 动态获取,不再硬编码 - [优化] 设备详情页空字段区块自动隐藏(如无数据盘 2 则不显示该卡片) - [优化] 导出权限拆分为 `assets:export:selected`(导出选中)和 `assets:export:all`(导出全部),按钮显隐由权限驱动 - [优化] 内置角色权限自动同步到最新默认值,自定义角色旧权限自动迁移 - [修复] 资产列表 API 和导出 API 的 filter 参数增加字段白名单校验 - [修复] 导出文件名日期改用本地时间,避免 UTC+8 时区偏移 ## 2026-04-30 - [新增] 创建 README 文档 ## 2026-04-29 - [新增] 设备管理列表支持鼠标拖拽自定义列宽(首次拖拽自动快照列宽,最小 60px,支持自动换行) - [优化] 设备状态下拉框改为「腾讯使用/图灵使用/闲置」默认选项,支持自定义新增状态 - [优化] 数据库 106 台设备状态从「在用」迁移为「腾讯使用」 - [修复] 设备详情页/列表页「腾讯使用」状态徽章颜色显示为灰色的问题 - [优化] 列头居中显示,排序/筛选模式切换按钮与排序图标左右对称布局 - [修复] 表头 `overflow-hidden` 导致筛选下拉框被裁切的问题 - [优化] 筛选弹框宽度改为自适应(`w-fit min-w-48 max-w-80`) - [优化] 排序/筛选图标改为可点击,直接点击图标即可触发排序或筛选 - [修复] 列头排序图标使用 `