assets-ai/CHANGELOG.md

108 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 变更日志
## 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` cookieHS256与 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 cookieissue-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 只能转发 cookieissue-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
- [新增] 资产核心 APICRUD + 分页 + 搜索 + 高级筛选)
- [新增] 资产列表页面(`/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 + SQLitestandalone 输出模式)
- [新增] 认证系统JWT 自实现 + API Key 双模式)
- [新增] 用户管理(`/settings/users`和角色权限系统admin/editor/viewer
- [新增] API Key 管理页面(`/settings/api-keys`),支持创建/删除 KeySHA-256 存储)
- [新增] 数据库初始化脚本init-db.ts预置角色和默认管理员账号
- [新增] Excel 导入模板(`服务器信息-issue.xlsx`
- [新增] Docker 部署配置(两阶段 alpine 构建)