service.xpcool.com/.workbuddy/memory/CHANGELOG.md
夏犀麟 06484774ad feat(auth): 登录密码 RSA+AES 混合加密传输与加密字段支持
- 新增 internal/library/crypto:RSA-OAEP(SHA-256)+AES-256-GCM 混合解密,
  私钥按 配置PEM > data/crypto/rsa_private.pem > 自动生成 三级来源,公钥 SPKI 输出
- 公开接口 POST /system/auth/public-key;LoginReq 支持 encryptedKey/encryptedData
- AdminCreate/AdminResetPwd 密码字段支持加密传输(allowPlain 仅开发联调)
- 配置 encrypt.privateKey/allowPlain;data/ 加入 gitignore 防止私钥入库
2026-08-27 23:43:41 +08:00

18 KiB
Raw Blame History

service.xpcool.com 变更记录

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

2026-08-27 | FEAT | 登录密码「RSA + AES-GCM」混合加密传输对称+非对称结合)+ 创建/重置密码加密字段:①新建 internal/library/crypto——密钥优先级 配置 encrypt.privateKey(PEM) > data/crypto/rsa_private.pem > 自动生成落盘data/ 已 gitignore公钥输出 SPKIx509.MarshalPKIXPublicKey前端 WebCrypto importKey('spki')⚠️PKCS#1 会 ASN.1 wrong tagDecryptLogin 解密 {username,password,ts}ts 5 分钟窗口防重放、DecryptField 解密 {value,ts}(创建/重置密码复用);进程级 SetDefault/Get 单例。②公开接口 POST /system/auth/public-key 返回 publicKeyLoginReq 改 encryptedKey+encryptedData明文字段仅 encrypt.allowPlain=true 时可用config.yaml/prod 默认 false、dev truecontroller.ResolveLogin 统一解析凭据。③AdminCreate/AdminResetPwd 同样支持加密 passwordresolvePassword 复用 DecryptField。④密文结构encryptedData=base64(nonce(12B)||ciphertext||tag)、encryptedKey=base64(RSA-OAEP(SHA-256) 加密 AES-256 密钥)。端到端 Node 模拟 WebCrypto 15 项全过(公钥/加密登录/错密码30002/篡改密文/过期载荷/受保护接口/加密创建/加密重置/旧密码失效/登出撤销/登出后刷新拒绝)。注:数据库密码本就是 bcrypt 哈希保存bcrypt.GenerateFromPassword存储安全已达标

2026-08-27 | FEAT | 认证链路联调(登录/登出/超时3d24dbd①未授权响应 HTTP 200+code10002 改 401 语义化response.JSONWithStatus三处中间件切换——vben authenticateResponseInterceptor 只认 HTTP 401此前 token 过期永不触发静默刷新②LogoutReq 支持 refreshToken登出撤销刷新会话IAdminAuth.Revoke 幂等Refresh 顺带清理过期会话行③injectEnv 开发兜底:${DB_DSN}/${RECRUITMENT_DB_DSN}/${JWT_SECRET} 占位符未注入 env 时回填本地默认 DSN任何启动方式零配置可跑当日两起登录 500 均为启动漏 envprod 不兜底。端到端 8 项 curl 全过:错密码 30002/登录/伪造 token HTTP401/轮换/旧令牌重放拒绝/登出撤销/登出后拒绝/有效访问 200。注并行 notice/job 会话提交的 admin_user entity 为 bool/string 映射(公司 gen 模板),已按旧风格手工恢复 int/gtime 并补两列 2026-08-27 | CHG | 通知模块+自动任务+用户渠道字段016 SQLadmin_user 加 bark_device_id/pushplus_token建 notice_channel/rule/log + auto_job/auto_job_log 5 表;菜单 98 通知中心(980规则/981渠道/982日志)/99 自动任务(990任务/991日志) + type=2 权限;渠道/规则/任务种子人员管理菜单改名用户管理api/notice + api/job11 接口全 POST 无 URL 参数service/noticeSend 统一发送Bark 路径式 POST /{key} + pushplus 官方接口;渠道/规则/日志/测试service/jobDB 驱动 gcronList/Save/Trigger/LogList + Register 业务函数注册 + 完成/失败自动通知 job_done/job_failrecruitment scheduler 改 RegisterTasks 纳管(原 StartScheduler 废弃);用户 admin 接口支持渠道字段;已部署:容器重建 api.json 200、11 路由全注册、调度器无 handler 缺失告警、种子数据验证 OK。 2026-08-27 | FIX | 菜单种子主键冲突修复743683erecruitment/003_menu.sql 招聘中心一级菜单 id=95 与 014_house_presale_menu.sql 新房预售 id=95挂看房中心 90ON DUPLICATE 互相覆盖、后导者赢,本地实际发生(新房预售菜单被顶掉致 /house/presale 404、生产库同样风险改为 id=96 后发现 015_server_security.sql并行会话生产已部署也用 96=安全日志挂系统监控5再改 9795=新房预售(挂90)、96=安全日志(挂5)、97=招聘中心,三模块错开;本地按 014→015→003 重放routes 接口 22 节点验证全部正确e18b25f⚠️ 生产库需按 014→015→003 顺序重放修复(当前生产 95=招聘中心、新房预售菜单丢失)

2026-08-27 | CHG | 服务器安全日志模块015 SQL 建 server_security_log 表 + 菜单(96安全日志/960查询/961统计)api/serversecurity/v1 三接口全 POST——open 上报 /api/service/open/security/log/reportbody token+list校验 internalToken=INTERNAL_TOKEN env+ admin 查询 /server-security/log/list、统计 /server-security/log/stats时间/IP/类型/端口筛选+TOP攻击源entity/do/dao(主库)/dto/service/controllerReportController+ManageController 双控制器cmd.go 注入 INTERNAL_TOKEN→internalToken、open 组绑 NewReport、protected 组绑 NewManagego build 通过,交叉编译上传 + 服务器 docker build + 容器重建(复用 env 追加 INTERNAL_TOKEN路由/上报验证 OK错误 token 返回 10002 2026-08-27 | FIX | 本地登录 500 修复:根因=config.dev.yaml 的 ${RECRUITMENT_DB_DSN} 占位符在本地无对应 envinjectEnv 只回填已有变量gdb 配置解析失败致 g.DB() 全局报 invalid link configuration本地补建 recruitment 库(导入 001_init+002_seed_sources6 表 5 源)+.env.dev 与 .run/service-dev.run.xml 补 RECRUITMENT_DB_DSN两文件 gitignore 不入库);附带修复 gcron 5 段式表达式注册失败invalid pattern "0 3 * * *")——改 6 段式 '0 0 3 * * *'/'0 0 8 * * *',此前线上每日抓取/推送 cron 实际从未执行f81ce64验证重启后登录返回业务码 30002非500、无 cron 报错 2026-08-27 | CHG | 看房新增新房预售证模块api/house/presale + controller/servicePOST /api/service/admin/house/presale/list筛选 region/purpose/keywordid 倒序dto 加 HousePresaleVOhouse_presale 加 publish_date 字段013 SQL 同步 + hack/config.yaml tables 补 house_presale + gen dao 更新);权限种子 014菜单 95 新房预售 + 950 查询权限go build 通过、接口返回 487 条干净数据presaleNo/publishDate 正确)

2026-08-27 | CHG | 看房数据扩充013_house_presale.sql 建预售证表presale_no 唯一house_community 加 avg_price 字段010 SQL 同步 + gen dao 更新 entity/do 加 AvgPricego build 通过 2026-08-27 | CHG | 服务器日志(操作审计 admin_operation_log全面增强为综合分页列表① 新增字段 admin_username(冗余账号)、ip_location(IP归属地)、error_message(失败原因)、user_agent② 自建纯 Go 的 xdb v4 离线解析器 internal/library/iplocgo:embed 嵌入 ip2region.xdb无外部依赖单次内存二分审计写入时解析账号+归属地、记录 UA 与错误摘要;③ 查询筛选覆盖时间范围/账号/IP/归属地/HTTP方法/结果(成功2xx·失败非2xx)/关键字(权限码·路径·IP)/耗时上下限/排序(时间·耗时);④ 接口 POST /api/service/admin/system/logbody 入参,遵守全 POST 无参约定dto.LogQuery/LogItem 同步;⑤ SQL001_core.sql 建表补列 + 新增 010_server_log_enhance.sql 增量迁移须手动导库DB 结构变更不自动 DDLgo build 通过、iploc 单元冒烟通过 2026-08-27 | FIX | 看房中心接口异常修复:根因=后端进程是旧代码recruitment 模块中途编译错误致项目编译不过、后端停在旧进程未加载 house 路由),重启后端加载新代码;附带修复 house listing/transaction 的 List 方法 Fields 在 Count 前设置导致 COUNT(t.*,c.name) SQL 语法错误Fields 移到 Scan 前7 个看房接口全部 code 0 验证通过 2026-08-27 | CFG | 新增 013_workbench_menu.sql工作台顶层菜单id=9, parent_id=0, path=/workbench, component=dashboard/workbench/index, permission=workbench, sort=0 置顶)+ 超管 role_id=1 绑定;前端工作台页面复用既有列表接口聚合,无新增 Go 接口 2026-08-27 | CHG | 看房成交模块api/house/transaction + service/house/transaction + controller/house/transaction 实现成交记录 list 接口(/api/service/admin/house/transaction/list全 POST 分页关联小区名按成交日期倒序dto 加 HouseTransactionVOcmd.go 注册012_house_transaction_menu.sql 权限种子house:data:transaction id=941 挂数据明细 94go build 通过 2026-08-26 | CFG | 新增 Gitea act_runner 自动部署:.gitea/workflows/deploy.ymlpush main/dev → 下载 Go1.23 工具链 npmmirror + GOPROXY goproxy.cn → CGO=0 linux/amd64 交叉编译 → 组装 main+manifest/config(config.yaml+config.prod.yaml)+resource+deploy/Dockerfile → docker build 重建容器 127.0.0.1:10100xpcool-netGF_GCFG_ENV=prodDB_DSN/JWT_SECRET 走 Gitea Actions secrets→ curl /api.json 冒烟deploy/Dockerfile 仓库内维护DB 结构变更不自动 DDL需手动导 manifest/sql 2026-08-26 | FIX | 本地登录 no rows 修复:根因=本地库 service_xpcool_com 的 admin_user 空表(本地/服务器库两套,此前仅改服务器);补 super_admin 角色 + 导入 009_admin_account_v2.sql须 --default-character-set=utf8mb4 否则中文 Data too long→ 本地 xxcool/xxCool@2026 登录成功subject=3同时服务器废弃 webhook 方案已删除deploy-webhook.service/webhook.py/secrets.env/deploy.sh自动部署改走 Gitea act_runner + .gitea/workflows仓库内尚未配置待补 2026-08-26 | CHG | 看房 house 模块后端落地010_house_tables.sql 建 9 表community/building/listing/price_snapshot/transaction/facility/community_facility/school_district/preference+ 011_house_menu.sql 菜单/权限种子(超管 role_id=1 绑定gf gen dao 生成 dao/entity/do实现 api/house/{community,listing,dashboard} + controller/house + service/house管理 CRUD + 看板聚合,全 POST 动作式,前缀 /api/service/admin/house含多平台软关联 match_group_id、笋盘/低可信标记cmd.go 注册 housectl + 3 个 RegisterServicego build 通过。坑①gf CLI 为 com.lib.gf.v2 分支gen dao 产物 import 需 sed 回 github.com/gogf/gf/v218 文件②mysql 客户端须 --default-character-set=utf8mb4 否则中文 COMMENT/INSERT 乱码③TINYINT 字段 comment 含 0/1 被 gf 映射 boolstatus 三值改 INThack/config.yaml 的 link+tables 已指向本地库 2026-08-26 | CHG | 生产超级管理员账号替换:删除 admin/admin123用户/绑定/refresh 会话全清),新增 xxcool/xxCool@2026bcrypt $2b$10$,绑定 super_admin脚本 manifest/sql/009_admin_account_v2.sql008 编号已被 008_menu_rbac_v4.sql 占用004_seed.sql 种子账号同步改 xxcool登录验证xxcool 成功、admin 报 no rows预期⚠️ 线上前端仍是旧版(默认 admin/admin123需部署新版 dist 后 xxcool 才可正常登录 2026-08-26 | CHG | RBAC 菜单调整移除管理员管理id=2 及按钮 21-25 软删+解绑新增日志管理菜单id=7, system:log, component=system/log/index原按钮 63system:log:list挂到 id=7 下;超管绑定新菜单;幂等脚本 manifest/sql/008_menu_rbac_v4.sql 2026-08-26 | FIX | RBAC 安全漏洞修复禁用角色status=0绑定的权限仍生效。根因为 Codes/HasPermission/Routes 三处联表查询未过滤 admin_role 启用状态,仅 roleCodes 过滤。修复:三处统一 LeftJoin admin_role 并加 r.status=1opuser 联调验证 codes 空/routes 空/接口 403admin 全链路回归通过

2026-08-26 | REQ | 看房方案补充「后台管理 + 可视化看板」两层:数据管理用 vben 标准列表 CRUD查询表单 + vxe-table + 分页 + 批量,页面含小区/房源/快照/成交/配套学区/采集任务),可视化看板用全局筛选器驱动图表联动(筛选器→图表、图表交叉过滤、列表↔地图双向,状态放 PiniaGo 接口分管理 CRUD 与看板聚合两类,统一 FilterDto 入参供管理与看板共用echarts/vxe-table/RBAC 均复用现有依赖 2026-08-26 | REQ | 看房方案迭代:推送改 Bark苹果自建 Server 到腾讯云/或官方免费版,用 level/group/url/badge 参数);可视化加贵阳区域地图(底图腾讯地图 GL JS区县边界 DataV 审图号 GeoJSON叠加地铁线/学区划片/楼栋点/价格热力楼栋坐标三级落地小区中心自动→楼栋图解析→重点盘人工校准多平台同房源「不去重、软关联对比」推翻去重source+source_house_id 同平台唯一match_group_id 跨平台软关联);补充:笋盘识别/挂牌天数+调价历史/租金回报率/可负担性硬过滤/面积建面套内标准化/贵阳区域画像(观山湖新中心、地铁1/2/3号线、山地通勤)/快照长期保留1-2年 2026-08-26 | REQ | 规划「看房」功能模块(贵阳购房决策辅助,仅规划设计未开发):架构定为 service 新增 house 业务模块(复用 gf gen dao + MySQL数据模型 9 张表 community/listing/price_snapshot/transaction/facility/community_facility/school_district/preference/scoreadmin 新增看房页面echarts@6 已内置),另立独立 Python 采集分析服务(采集/清洗/去重/打分,只写库不对外 API决策目标城市贵阳、新房+二手房都做、先本地后上云;核心风险为贵阳网签/成交数据公开程度不如一线 2026-08-26 | DEP | 生产部署上线193.112.118.168):交叉编译 linux/amd64重建容器 service.xpcool.com:new127.0.0.1:10100GF_GCFG_ENV=prodDB_DSN 补 mysql: 前缀,沿用 JWT_SECRETnginx 改 HTTPS443+80→301证书 /data/nginx/ssl/service.xpcool.com/)反代 10100DB service 库补种 003→004→004b→007权限映射对齐 /api/service 路由admin/admin123 登录验证通过 2026-08-26 | CFG | 新增 manifest/sql/007_menu_permissions_v3.sqltype=2 权限路径映射最新 /api/service 全 POST 路由,含 system:log:list id=63与 004b_fill_seed.sql004 中断后的幂等补齐脚本);部署要点:容器内需 config.yaml基础配置否则 GoFrame 启动报找不到 config

2026-08-26 | FIX | RBAC 安全漏洞修复禁用角色status=0绑定的权限仍生效。根因为 Codes/HasPermission/Routes 三处联表查询未过滤 admin_role 启用状态,仅 roleCodes 过滤。修复:三处统一 LeftJoin admin_role 并加 r.status=1opuser 联调验证 codes 空/routes 空/接口 403admin 全链路回归通过

2026-08-26 | CFG | 修复 GoLand 直接 Run 报「找不到 config.yaml」新增项目级运行配置 .run/service-dev.run.xml内置 GF_GCFG_FILE=config.dev.yaml + DB_DSN + JWT_SECRET 三环境变量);.run/ 加入 .gitignore含口令README 补「Local startup」小节终端 .env.dev / GoLand 运行配置两种方式)

2026-08-26 | FIX | 前端登录 502 联调根因为服务未启动10100 无监听);按 .env.dev 启动后 login/info/codes/menu-routes 全链路 curl 200dev server20100/20101/20102/20103代理全部恢复 2026-08-26 | CFG | CHANGELOG 纳入 git 管理(.gitignore 放行 .workbuddy/memory/CHANGELOG.md中央工作空间迁移至 ../workbuddy.xpcool.com相对路径索引

2026-08-26 | CHG | 统一 API 前缀 /api/service/admin→/api/service/admin、user→/api/service/user、open→/api/service/open服务端口统一 10100dev/prod/testDB admin_menu 权限映射前缀同步;前端 vite 代理与 api 文件同步适配(全 POST + 动作式路径),路由回归 29 条一致 2026-08-26 | CHG | 遗留 /v1 全移除URL 前缀 /admin/v1→/admin、/api/v1→/api、/api/open/v1→/api/open全部接口改 POST5 组 CRUD 冲突路径改动作式 /list /create /update/{id} 等DB admin_menu 权限映射 path 同步;全项目英文注释转中文(含 dao/entity/do/table 生成模板),路由回归 29 条全 POST 一致 2026-08-26 | FIX | 修复审计落库失败admin_operation_log.request_param 为 JSON 列,仅合法 JSON 入库、其余存 NULL此前一直失败被「尽力而为」吞掉系统日志查不到数据 2026-08-26 | CHG | 区分系统日志与服务器日志:审计服务由 admin/system/audit 归位为 admin/system/logpackage admin_system_log含 Record+List新增 GET /admin/v1/system/log 分页查询 + system:log:list 权限映射(菜单 id=63服务器日志保持 admin/base/log 2026-08-26 | CHG | login 资源迁移至 admin/admin/loginapi+service全 api/service 包名统一为「路径下划线拼接」package admin_admin_login / admin_system_menu / user_auth 式);恢复 api/open 并规范化(去 v1包名 open_tools_ip 式controller/cmd 引用同步,路由回归 28 条一致 2026-08-26 | REQ | 后台登录接口联调通过login/info/codes/menu-routes/RBAC/refresh(单次)/logout 全链路 curl 验证 OK库 service_xpcool_com 2026-08-26 | FIX | 联调发现并修复 admin refresh 单次使用漏洞Refresh 撤销旧会话后补 RowsAffected 校验,重复使用旧 refreshToken 返回 code 10002 2026-08-26 | CFG | 新建 .env.dev 本地配置DB_DSN=mysql:root:root123@tcp(127.0.0.1:3306)/service_xpcool_com?loc=Local + JWT_SECRET.gitignore 追加 .env* 防口令入库 2026-08-26 | CHG | 清理模板:删除 api/hello、api/open、common/tools 及 controller/hello、controller/openAPI 目录去掉 v1 层api/admin/system/auth/auth.go 式service 层完全镜像URL 前缀保持 /admin/v1 兼容前端 2026-08-26 | CHG | 目录重构API 层资源目录化api/admin/v1/system/auth/auth.go 式service 层严格镜像 API 多级结构internal/service/admin/system/auth/auth.go 式接口随实现归位、admin_rbac 拆为 admin/role/menu_manage 三包controller/cmd 引用同步,路由回归 29 条一致 2026-08-26 | CHG | 补全管理端登录接口:新增 Refresh/Logout 端点(/admin/v1/system/auth/refresh|logout登录改走 issue 把刷新令牌 JTI 落库,与 user 端刷新撤旧机制一致 2026-08-26 | CHG | 同步三铁律(中文注释/做记录/中文优先)至 AGENTS.md「统一工作约定」小节 2026-08-26 | CFG | 建立统一变更记录机制CHANGELOG接入 xpcool.com 中央索引