108 lines
8.0 KiB
Markdown
108 lines
8.0 KiB
Markdown
# 变更日志
|
||
|
||
## 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),三个内置角色均不可删除
|
||
|
||
## 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`)
|
||
- [优化] 排序/筛选图标改为可点击,直接点击图标即可触发排序或筛选
|
||
- [修复] 列头排序图标使用 `<button>` 嵌套在列名 `<button>` 内导致 HTML 非法嵌套错误,改为 `<span>`
|
||
|
||
## 2026-04-28
|
||
|
||
- [部署] 生产环境 txjp 服务器更新 `break-all` 序列号换行修复,验证通过
|
||
- [修复] 资产详情页序列号等长字符串不会自动换行,给 Field 组件值列添加 `break-all` 样式
|
||
- [调整] 工单接口 `Ticket` 类型移除 `ticket_no` 字段,同步 issue-ai 工单号改造
|
||
- [修复] 生产环境设备详情页「故障历史」中工单链接和"查看全部工单记录"按钮错误使用 localhost:5176
|
||
- [修复] `AssetTicketHistory.tsx` 中 `ISSUE_URL` fallback 值从 `localhost:5176/tickets` 改为 `https://issue.tlyq.ai/tickets`
|
||
- [修复] 未登录时从 issue-ai 工单详情点击业务 IP → assets-ai 登录后错误跳转仪表盘。根因:跨端口 cookie 泄露(同 localhost 的不同端口共享 session cookie),issue-ai JWT payload 用 `id` 字段而 assets-ai 用 `userId`,middleware 放行后 layout.tsx 的 `redirect('/login')` 丢失了 redirect 参数
|
||
- `middleware.ts`:增加 JWT payload `userId` 检查,无效 cookie 清除后重定向(携带 redirect 参数)
|
||
- `layout.tsx`:从 `x-original-pathname` header 读取原路径,`redirect('/login')` 时携带 redirect 参数
|
||
- [修复] 资产详情页「故障历史」显示"会话已过期"。根因:`issue-client.ts` 缺少 API Key 只能转发 cookie,issue-ai 侧 JWT 格式不兼容
|
||
- 配置本地测试环境 API Key 双向认证(`ISSUE_API_KEY` + `ALLOWED_API_KEYS`)
|
||
- `issue-client.ts`:fallback 默认值从 `127.0.0.1` 改为 `localhost`
|
||
- [文档] 更新 `CLAUDE.md`:补充 API Key 双向认证说明和本地 `.env.local` 配置示例
|
||
- [修复] 同一浏览器同时登录两个系统,任一退出后另一个也被退出。根因:两个系统共用 `session` cookie 名且同 `localhost` 域
|
||
- cookie 名改为 `session_assets`(assets-ai)和 `session_issue`(issue-ai),互不干扰
|
||
- 云端部署无需额外操作(域名不同天然隔离,但改名保持一致),用户重新登录即可
|
||
|
||
## 2026-04-27
|
||
|
||
- [新增] 资产核心 API(CRUD + 分页 + 搜索 + 高级筛选)
|
||
- [新增] 资产列表页面(`/assets`),支持多选、筛选、排序
|
||
- [新增] 设备详情页面(`/assets/[id]`),全硬件配置分区卡片展示
|
||
- [新增] 新增/编辑设备页面
|
||
- [新增] 批量编辑页面(`/assets/batch-edit`),安全限制仅允许部分字段
|
||
- [新增] Excel 模板导入(`/assets/import`),按 SN 匹配新增/更新
|
||
- [新增] 设备导入脚本(`import-servers.ts`)
|
||
- [新增] 仪表盘统计数据(`/api/stats`):总数/状态/类型/厂商/机房/保修预警
|
||
- [新增] 调用 issue.tlyq.ai API 获取设备历史工单,资产详情页展示历史工单卡片
|
||
|
||
## 2026-04-25
|
||
|
||
- [新增] 仪表盘页面(`/dashboard`),资产概览图表
|
||
|
||
## 2026-04-24
|
||
|
||
- [新增] 项目初始化,基于 Next.js 15.1 + SQLite(standalone 输出模式)
|
||
- [新增] 认证系统(JWT 自实现 + API Key 双模式)
|
||
- [新增] 用户管理(`/settings/users`)和角色权限系统(admin/editor/viewer)
|
||
- [新增] API Key 管理页面(`/settings/api-keys`),支持创建/删除 Key(SHA-256 存储)
|
||
- [新增] 数据库初始化脚本(init-db.ts),预置角色和默认管理员账号
|
||
- [新增] Excel 导入模板(`服务器信息-issue.xlsx`)
|
||
- [新增] Docker 部署配置(两阶段 alpine 构建)
|