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

52 lines
18 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 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 默认 falsedev 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 20011 路由全注册调度器无 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再改 **97**95=新房预售(挂90)96=安全日志(挂5)97=招聘中心三模块错开本地按 014015003 重放routes 接口 22 节点验证全部正确e18b25f 生产库需按 014015003 顺序重放修复当前生产 95=招聘中心新房预售菜单丢失
2026-08-27 | CHG | 服务器安全日志模块015 SQL server_security_log + 菜单(96安全日志/960查询/961统计)api/serversecurity/v1 三接口全 POSTopen 上报 /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_TOKENinternalTokenopen 组绑 NewReportprotected 组绑 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+80301证书 /data/nginx/ssl/service.xpcool.com/反代 10100DB service 库补种 003004004b007权限映射对齐 /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/adminuser/api/service/useropen/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/helloapi/opencommon/tools controller/hellocontroller/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 中央索引