admin.xpcool.com/.workbuddy/memory/CHANGELOG.md
夏犀麟 f70f5dcff8
Some checks failed
Build and Deploy (admin.xpcool.com) / build-and-deploy (push) Failing after 1h0m22s
chore(other): 登录仅加密密码字段(豁免整体加密)
- loginApi 恒走密码字段混合加密,提交 {username, encryptedKey, encryptedData}
- 请求拦截器豁免 /auth/login 整体加密
2026-08-28 00:29:00 +08:00

12 KiB
Raw Permalink Blame History

admin.xpcool.com 变更记录

倒序最新在上。格式YYYY-MM-DD | 类型 | 摘要

2026-08-27 | CHG | 登录接口豁免全量加密永远只加密密码字段loginApi 始终走 hybridEncryptLogin提交 {username 明文, encryptedKey, encryptedData}request.ts PLAIN_ROUTE_FRAGMENTS 增 /auth/login请求拦截器不再整体加密登录 body。全量模式 5 项 + dev 15 项 E2E 验证通过

2026-08-27 | CHG | 全量请求/响应加密(生产 VITE_GLOB_API_ENCRYPT=true①crypto.ts 增 encryptPayload整体加密任意对象返回 aesKeyB64 会话密钥)+ decryptPayloadAES-GCM 解密后端响应,密文=nonce||ciphertext||tag②request.ts 增 installCryptoInterceptors——请求拦截器将整个 JSON body 混合加密public-key 豁免、FormData/无 body 跳过、响应解密拦截器最先注册axios 响应拦截器按注册顺序执行)还原 {code,message,data}requestClient 与 baseRequestClient 均安装apiFullBodyEncrypt/fetchPublicKeyForCrypto 导出③auth.ts loginApi、system.ts createAdmin/resetAdminPassword 全量模式下直接传明文密码由拦截器整体加密(开发模式仍走密码字段混合加密);④.env.production VITE_GLOB_API_ENCRYPT=true / .env.development=false。⚠️TS 坑Uint8Array.subarray 返回 ArrayBufferLike 泛型不满足 BufferSource需 new Uint8Array() 拷贝axios 类型从 @vben/request re-export 导入web-tdesign 未声明 axios 依赖。typecheck+oxlint 全绿,全量/仅密码两种模式 E2E 均通过

2026-08-27 | CHG | 登录/创建/重置密码全链路加密传输RSA+AES 混合加密,与后端配套):①新增 src/utils/crypto.ts——Web Crypto API 零依赖importKey('spki') 导入后端公钥、随机 AES-256-GCM 加密载荷nonce 12B 前置、GCM tag 随密文、RSA-OAEP(SHA-256) 加密 AES 密钥,输出 {encryptedKey, encryptedData};公钥 5 分钟内存缓存。②api/core/auth.tsgetPublicKeyApi并发去重+ loginApi 先拉公钥再加密 username/password 提交网络传输无明文密码。③api/system.tscreateAdmin/resetAdminPassword 的 password 走 hybridEncryptField 加密encryptField 复用公钥缓存。④注意Web Crypto 仅安全上下文可用https/localhost/127.0.0.1http://IP 访问会明确报错。typecheck + oxlint 全绿

2026-08-27 | CHG | 用户管理改造(页面标题改"用户管理",表单/列表加 Bark设备ID、pushplus token+ 通知模块 3 页(规则:渠道多选+用户多选+标题/内容模板+测试按钮;渠道:启用+JSON 配置;日志:事件/渠道/结果/时间筛选)+ 自动任务 2 页任务列表cron 编辑/启停/手动执行;运行日志:按任务筛选+耗时/摘要/错误api/notice.ts + autoJob.ts + system.ts 扩展AdminItem 加渠道字段typecheck 通过 2026-08-27 | FIX | 前后端联查修复「界面/菜单/工作台异常」:①本地库缺 010_server_log_enhance 增量列admin_operation_log 无 ip_location/admin_username 等)致操作日志接口 500已导②本地缺工作台/招聘菜单+admin_role_menu 关联,已导 013_workbench_menu+recruitment/003_menu③工作台快捷入口 /system/log/* 是死链(真实路由 /log/*)已改;④打通 Drawer 重构遗留编译错6 页 @vben-core/popup-ui 误引改 @vben/common-ui、preferences 补 languageToggleButtonPosition、清未用变量、menu/log 页 lint 债7dc9bc6钩子全绿⑤发现审计 admin_username/user_agent 长期为空=线上跑旧二进制,新构建验证 248 号记录字段完整,历史空账号已按 user_id 回填121 条);⑥本地 xxcool/opuser 密码已重置为 opuser123 便于联调

2026-08-27 | CHG | 三大改造①移除国际化多语言仅留中文——preferences.ts 固定 locale=zh-CN删除 header/toolbar/user-dropdown 三处语言切换入口、偏好面板语言选择项(general.vue/appLocale/widget.vue languageToggle 位置配置)config.ts 禁 languageToggle 且 order 移除;删除主应用与 packages/locales 的 en-US 语言包locales/index.ts loadDayjsLocale 仅留 zh-CN。②新增主题色管理——theme.css 品牌色改为引用 --primary 变量(不再写死 #4f5bff背景/主按钮渐变用 color-mix 跟随主题色,配合 useTDesignDesignTokens 使偏好面板 BuiltinTheme 切换主题色真正生效constants.ts default 主题色与 config.ts colorPrimary 统一为靛蓝 hsl(235 100% 65%)。③业务弹窗统一为 vben 抽屉——6 页(system/{role,menu,admin}、recruitment/push、house/{listing,community})的 t-dialog 全部替换为 useVbenDrawer()drawerApi.open/close/setState(标题)/lock(提交中)community/listing 抽屉加宽(class w-160/w-150) 2026-08-27 | CHG | 服务器安全日志页挂在系统监控菜单下id=96views/monitor/security/index.vue——顶部 4 统计卡片SSH爆破/fail2ban封禁/成功登录/总数)+ TOP 攻击源标签区 + 筛选来源IP/事件类型/时间范围 t-date-range-picker+ Vben VxeTable 列表(时间/来源IP/来源端口/目标端口/事件类型标签/详情 tooltip事件标签按类型配色api/serverSecurity.tslist/stats 全 POST无 URL 参数typecheck 通过 2026-08-27 | CHG | 全量表格重构views 下全部 11 个 t-table 页面统一改为 Vben Vxe TableuseVbenVxeGrid#/adapter/vxe-table+ Vben TableAction 行操作——system/{log(范式),login-log,admin,role}、recruitment/{info,crawler,push}、house/{data,listing,community,presale}、dashboard/workbench两处本地小表 proxyConfig.enabled=false + gridApi.setGridOptions 写数据。要点gridOptions 需注解 VxeTableGridOptions否则 type:'seq' 推断 string 报错);单元格自定义用 columns[].slots.default + h(TDesign组件);远程分页走 proxyConfig.ajax.query 返回 {items,total};筛选区保留手写 TDesign 组件不动admin/role/listing/community 行操作 ActionItem 带 auth 权限码、删除 danger 标红listing 多选批量标记改 vxe checkboxConfig + gridApi.grid.getCheckboxRecords()confirm 弹窗交互(删除/重置密码)保留 DialogPlugin 不变typecheck 通过

2026-08-27 | FIX | 恢复丢失的前端代码recovery 分支经 rebase/改名(dev↔main)折腾后工作树回退,未提交改动全丢;从悬空提交 f02a514recovery 工作树快照,含 HEAD 缺失的全部文件)整体恢复 apps/web-tdesign/src——含 styles/theme.css 全局主题、dashboard/workbench 工作台页、system 五页卡片化美化、操作日志增强版(VxeTable)、house 预售/楼盘地图、recruitment 页面;另补 log 页卡片美化(wb-page-head+t-card)。已提交保护 2026-08-26 | CFG | 安装 TDesign MCP~/.workbuddy/mcp.json 新增 tdesign-mcp-server: npx -y tdesign-mcp-server@latestv0.2.4 启动验证通过);约定:后续后台界面开发优先用 TDesign MCP 查官方文档get-component-docs 等) 2026-08-26 | FIX+CHG | 修复前端编译错误access.ts layoutMap 重复声明致 vite Transform PARSE_ERROR菜单管理树形改用 tdesign 官方方案:t-enhanced-tablet-table 不支持 tree+ tree{childrenKey/treeNodeColumnIndex/defaultExpandAll/indent} + 异步数据后 ref.expandAll()defaultExpandAll 仅首次渲染生效)——替代先前扁平化+缩进的自造方案 2026-08-27 | CHG | 看房新增新房预售页views/house/presale/index.vue预售证列表证号/楼盘/开发商/区县/位置/楼栋/套数/面积/用途/发证/公示日期,筛选 region/purpose/keywordapi/house.ts 加 PresaleItem/getPresaleList菜单 95 新房预售014 种子component=house/presale/indextypecheck 通过

2026-08-26 | CFG | 新增 .gitea/workflows/deploy.ymlGitea act_runner 自动部署push main/dev → 下载 node22 二进制npmmirror覆盖镜像 node20pnpm11 需 node:sqlite→ corepack pnpm@11.16.0 → pnpm install → 直接 vite build避开 turbo 卡死)→ cp dist 到 /data/www/admin.xpcool.com/YAML 已校验 2026-08-26 | CHG | 看房 house 模块前端落地api/house.ts + views/house/{community,listing,dashboard,data}/index.vue小区 CRUD、房源多维筛选+多选批量标记笋盘/低可信、看板 echarts 概览卡片/区域均价柱状/挂牌vs成交趋势菜单走后端动态路由011 种子 component=house/xxx/index图表复用 @vben/plugins/echarts 的 EchartsUI/useEcharts 2026-08-26 | DEP | 线上 dist 更新为「无下拉版」vite build 产物index-index-B-XlZ2uN.js并部署 /data/www/admin.xpcool.com/,修复登录 no rows根因=线上仍是 19:32 旧版(默认 admin/admin123admin 已删故报错;验证:线上 index 新版 + xxcool 登录成功 + js 无 admin123⚠️ webhook 自动部署未生效deploy-webhook.service disabled/inactive8/22 11:52 停止9000 未监听),提交代码不会自动部署,需 sudo systemctl enable --now deploy-webhook + Gitea 仓库 webhook 配置 2026-08-26 | CHG | 登录页移除账号下拉与代码内置账号密码:删除 selectAccount 字段、MOCK_USER_OPTIONS 及自动填充逻辑BasicOption import 一并清理),前端不再存任何账号密码,改为手输 + 勾选「记住账号」AuthenticationLogin 内置 rememberMelocalStorage 仅记用户名不存密码);本地 dev(5173) 浏览器验证:无下拉、仅用户名/密码/滑块 + 记住账号复选框 2026-08-26 | CHG | 登录页默认账号替换为 xxcool/xxCool@2026MOCK_USER_OPTIONS 仅留 Super(xxcool)selectAccount 默认值、密码自动填充同步;本地 dev(5173) 验证登录页下拉正常combobox Super、账号密码自动填充、展开有 Super 选项),无 admin123 残留;⚠️ 构建注意pnpm/turbo build 会卡死(两次 15min+ 无产出),需直接 ./node_modules/.bin/vite build --mode production(约 20s完成线上 dist 仍为旧版,待部署 2026-08-26 | DEP | 生产部署上线193.112.118.168pnpm build:tdesign 构建 web-tdesign 上传 /data/www/admin.xpcool.com/nginx HTTPS 站点(证书 /data/nginx/ssl/admin.xpcool.com/80→301静态托管 + /api/service 反代 127.0.0.1:10100https://admin.xpcool.com 首页 200、同源 API 登录通过 2026-08-26 | CHG | .env.production 的 VITE_GLOB_API_URL 由 https://mock-napi.vben.pro/api 改为 /api/service同源相对路径由 nginx 反代到后端 10100

2026-08-26 | REQ | RBAC 至按钮级细粒度全链路核查通过backend 动态路由menu/routes+ 23 权限码下发auth/codes+ 三个管理页admin/role/menu按钮级 hasAccessByCodes 与后端 seed 权限码逐一匹配dev server20104经 vite 代理→10100 登录/取码 200后端配套修复禁用角色权限隔离漏洞见 service CHANGELOG

2026-08-26 | FIX | 登录接口 502 联调修复:根因为后端 10100 未启动vite 代理连接拒绝→502启动后端后 login/info/codes/menu-routes 全链路 200。另记本机 corepack/pnpm shim 路径转换损坏,需用 npm exec --package=pnpm@11.16.0 代替 pnpm 命令 2026-08-26 | CFG | CHANGELOG 纳入 git 管理(.gitignore 放行 .workbuddy/memory/CHANGELOG.md中央工作空间迁移至 ../workbuddy.xpcool.com相对路径索引

2026-08-26 | CHG | 后端 API 统一前缀 /api/service/ + 端口 10100vite 代理改为 '/api/service'→:10100合并原 /admin、/api 两条api 文件全部适配auth/menu/user/system/log去 v1、前缀 /api/service、全 POST、CRUD 改动作式路径) 2026-08-26 | FIX | 修复依赖装不上pnpm 11.16.0 强依赖 node:sqliteNODE_OPTIONS=--experimental-sqlite 后 install 成功;同步更正 agents.md 主应用为 web-tdesigndev:tdesign5999/6000 端口) 2026-08-26 | CHG | 修正登录页默认账号selectAccount 默认 admin密码映射改为种子账号 admin/admin123便于联调 2026-08-26 | CHG | 同步三铁律(中文注释/做记录/中文优先)至 AGENTS.md「统一工作约定」小节 2026-08-26 | CFG | 建立统一变更记录机制CHANGELOG接入 xpcool.com 中央索引