docs: 记录壁纸模块上线(12 接口/平台聚合/图库,含加密豁免与 .gitignore 修复、部署要点)
Some checks failed
Build and Deploy (service.xpcool.com) / build-and-deploy (push) Failing after 53s

This commit is contained in:
夏犀麟 2026-09-14 03:25:34 +08:00
parent 9010592c9e
commit 863b16b118

View File

@ -1,6 +1,20 @@
# service.xpcool.com 变更记录
> 倒序最新在上格式YYYY-MM-DD | 类型 | 摘要
2026-09-14 | CHG | **壁纸模块后端上线12 接口 + 开源平台聚合 + 自建图库** xpcool.com 提供开源壁纸平台 + 后台自建图库双来源**保留**原有浏览器实时生成能力设计核心是**带宽经济学**本机出口仅 5M625KB/s 且多站共用 开源平台Bing 每日一图 / Picsum / Unsplash / Pexels / Wallhaven图片**不经过服务器**后端只代理元数据并返回官方 CDN 直链`sources`/`list`/`random`/`download-track` `open` 分组平台响应内存缓存Bing 1h其余 10min 自建图库分三档落盘480px 缩略图 / 长边 1920 预览 / 原图** nginx 直出 `/wallpaper/`**后端只管元数据与上传接口遵守本仓库强制规范** POSTURL 不带参入参走 body**`manifest/sql/018_wallpaper.sql` 为幂等种子菜单 + 5 平台`ON DUPLICATE KEY UPDATE` 只更新 name/sort/remark
2026-09-14 | FIX | **全量加密fullBody multipart 上传必被拒**生产才暴露dev 永不复现`encrypt.fullBody=true` 时中间件对所有非豁免请求一律 `json.Unmarshal` body multipart 是二进制流必然失败 上传被判定为未加密请求拒绝前端对 `FormData` 本就跳过加密**两端语义不一致**修法`internal/middleware/encrypt.go` 新增 `isMultipartRequest` 豁免与前端 `request.ts` `config.data instanceof FormData` 分支对齐**不影响安全** 上传接口同样挂在 `/api/service/admin` 分组下仍受 JWT + RBACPOST+path 精确匹配双重保护
2026-09-14 | FIX | **`.gitignore` `log/` 规则误伤源码包导致干净检出无法编译**`log/` 未锚定根目录匹配任意层级 `api/admin/{base,system}/log``internal/service/admin/{base,system}/log` 四个**源码包**静默忽略 `internal/controller/admin/log.go` 已在库 干净 clone `go build .` 直接失败`no required module provides package service.xpcool.com/api/admin/base/log`修法改为 `/log/` 并补交这 4 个包此后干净 HEAD 交叉编译通过31,075,947 字节
2026-09-14 | DEP | **壁纸模块部署上线 + 端到端验证**`GOOS=linux GOARCH=amd64 CGO_ENABLED=0` 交叉编译 替换 `/data/deploy/projects/service.xpcool.com/main`旧版备份 `main.bak.20260914b` 配置换为仓库版 `docker build` 重建容器**两个必守点** 容器必须显式传 `GF_GCFG_FILE=config.prod.yaml`gf v2.10.2 起不再自动替换 `${ENV}` 占位符且新 `main.go` 只认 `GF_GCFG_FILE`/`GF_GCFG_PATH`**不认 `GF_GCFG_ENV`**漏传即崩溃循环 `specified config file "config.dev.yaml" not found` 双挂载 `/data/www/wallpaper` + `/data/service-crypto`**防容器重建后 RSA 私钥漂移否则前端解密全挂****验证全绿**5 平台 sources朝向过滤来源限定 random停用来源返回明确中文错误CORS 正确回显密文登录解密成功响应体 `{"encryptedData":…}`明文业务请求被拒 `encrypted request required`
2026-09-14 | DOC | 壁纸模块上线中修复的**生产数据问题中文双编码 mojibake**`admin_menu`/`wallpaper_source` 中文呈 `Bing æ¯æ—¥ä¸€å›¾`判据 `HEX(name)` `C3A7C2B3…` `LENGTH/CHAR_LENGTH = 25/12`正确应为 9根因是**导入 SQL 时未指定 `--default-character-set`**MySQL 客户端按 latin1 解码 UTF-8 字节再按 utf8mb4 重编码 `--default-character-set=utf8mb4` 重放 `018_wallpaper.sql` 后壁纸相关中文恢复**注意 `admin_menu` 全表历史乱码id 1~96本次有意未动**待用户决定是否批量修复
2026-09-14 | FIX | **招聘抓取模块健壮性实施与真实站点校准阶段一完成**基于贵阳市人社局真实列表页做离线+在线校准修正两处**方案级错误** **评分判定必须按URL 结尾形态而非路径关键词**栏目页 `/zfxxgk/.../rszk/` `/` 结尾与正文页 `/zfxxgk/.../rszk/202609/t20260908_xxx.html` `.html` 结尾**共享同一段栏目路径**按路径段减分会把真实公告一并误杀首版实测 19 条真实公告全被过滤只剩 1 改为`.html` 等后缀 +3 / `/` 结尾 -516 个真实锚点用例分类全对 **图片型锚点会以文件名污染标题**`<a href=".../ysqgk/index.html"><img src="ysqgk3.png" title="ysqgk3.png"></a>` stripTags 后为空`title` 属性回退取到图片名 `ysqgk3.png`**绕过全部中文排除词**且叠加 `.html` +3 分通过筛选故新增 `isImageFileName`图片锚点优先取 alt取不到整体丢弃+ 排除域名硬拦友链gyrc.cn 贵阳人才网cx.guiyang.gov.cn 信用中国另完成发布日期**分段抽取**meta PubDate/og:published_time 语义容器 class=time/date 发布时间前缀 40 字内 自定义正则 **置空**替代原取整页首个日期把页头"今天是…"误当发布日失败**自动禁用**连续 5 次禁用+告警3 次预警成功归零用坏源 http://127.0.0.1:1 实测第 5 次 `enabled` 1→0、`Sources()` 改读 `last_log_*` 冗余列消除 `crawl_log` 全表扫描、`resolveCfgValue` 把未解析 `${...}` 占位符视为空避免「invalid character { in host name」误导、`cleanText` 清洗 `\n\t\t\t` 标题污染、`bark.go` 4 处英文日志中文化。**实测对比源1**:增量 8 条含 6 噪声 → 2 条全真实force 全量 8 条 → **21 条真实公告**;日期识别率 → **100%**0 条空)。单测 `go test ./internal/service/recruitment/` 全绿。详见 `docs/recruitment-crawler-design.md` 第七节
2026-09-14 | FEAT | **通知历史记录表格界面后端能力补齐 + 前端页面 + 联调跨两个仓库** **后端**`api/notice/notice.go` 日志契约由 11 字段扩到 27 字段新增 batchId/ruleName/eventName/noticeType/typeName/group/groupName/channelName/userName/status/statusName/retryCount/durationMs/source/remark新增 `keyword/noticeType/group/userId/batchId/status/orderBy/orderDir` 筛选与 `stats` 统计概览新增 4 个端点 `log/detail``log/delete``log/clear``log/options``dto/notice_meta.go`新增收口渠道/事件/类型/分组四级字典与中文名映射**类型与分组由 event_type 派生不落库**避免双写不一致`entity/do` NoticeLog 6 service `LogList` 重写为多维筛选 + 列表/统计**共用同一 logQuery 保证口径一致** + 批量补齐规则名与接收人避免 N+1新增 LogDetail/LogDelete/LogClear`Send` 引入 batchId`deliver` 记录耗时/来源/状态写库由 `map[string]interface{}` **改回 do 对象**符合 AGENTS.md 硬规范controller 新增 4 方法 + toLogItem/toMetaItems 转换 **SQL**`manifest/sql/017_notice_log_enhance.sql`notice_log 6 + 3 索引 + result 回填 status + 菜单 982 通知历史+ 5 type=2 权限 + 超管绑定全幂等**关键坑**`ADD COLUMN status ... DEFAULT 1` 会把**全部历史行** 1含失败记录 显示"历史失败记录成功"故默认取 0 再按 result 回填 **前端**`E:\Project\admin.xpcool.com``api/notice.ts` 扩类型与 4 个新方法`views/system/notice/log/index.vue` 重写4 张统计卡 + 9 项筛选 + 多选表格 + 详情抽屉 + 批量删除 + 保留 N 天清空 + 权限码控显 **联调**迁移已执行notice_log 17 菜单 982/9821-982514 条历史 status 正确回填为 2经前端 Vite 代理2010010100跑通 登录选项列表详情5 接口全部通过 RBAC 返回 code=0真实投递一条测试通知验证 batchId/durationMs/source/userName/target/remark 落库回显vue-tsc/oxfmt/oxlint 0 错误 **联调中修复缺陷**LogDetail 对不存在 ID 会把 `sql.ErrNoRows` 包装上抛 gf 归为 code=50 **回显 SQL 细节**改为忽略 Scan 错误 + `Id==0` 判定现返回 code=10001通知记录不存在详见 docs/change-log/2026-09-14.md
2026-09-14 | CHG | **归档提交 09-13~09-14 压在工作区的两批改动招聘爬虫健壮性 + 通知记录增强**11 9 **招聘爬虫**新增 `source_config.go``crawl_source.config` 这个 VARCHAR(1000) JSON 的源级抓取参数解析增量窗口/单次上限/分页/限速/自定义标准词**全字段可选解析失败即回退默认**保证历史数据零迁移可用一个脏配置不会拖垮整个调度`keywords.go`链接筛选改评分制URL 形态加分 + 标准词加分 + 排除词大幅减分达阈值入选取代原先URL 形态与文本语义必须同时命中的与逻辑该逻辑会系统性漏抓补充工作人员的通知公开选调公务员简章等标题变体且静默无报错 `keywords_test.go` 单测与 `testdata/``manifest/sql/recruitment/004_crawl_source_status.sql``crawl_source` 最近一次运行状态冗余列规避 `Sources()` 全表扫只增不减的 `crawl_log`随运行时间线性劣化`crawler.go` 在既有两级抓取流程上做锚点抽取/过滤与编码回退的健壮性增强`bark.go` 推送配合调整 **通知模块**`notice.go`/controller/api/dto 扩展通知日志的查询与操作批次号状态重试次数来源耗时详情删除清空`dto/notice_meta.go`312 字典选项元数据`manifest/sql/017_notice_log_enhance.sql`notice_log 扩列 + 新增接口权限幂等可重放 `.gitignore` `rc_*` 挡掉本地验证产物 30MB `rc_verify.exe`设计依据见 `docs/recruitment-crawler-design.md`
2026-09-13 | DOC | 项目整理与全局中文化重写 README.MD原英文且路由陈旧 /api/v1 实际三分组 /api/service/{open,user,admin}补分层约定/RBAC 权限映射/gen dao 流程/本地启动重写 PROJECT_STRUCTURE.md原英文目录树缺 house/recruitment/notice/job/serversecurity标注手写 entity/do/dao 风险hack/hack.mk + hack-cli.mk 注释中文化common/doc.go + common/tools/doc.go 工具清单中文化ip/main.go/cmd.go 英文注释中文化**校验提示与服务层错误信息中文化**19 文件逾 90 api v:"#提示" 中文user/authtools/md5tools/randommenu_manageadminservice gerror.Wrap/response.Error 全部中文admin/adminadmin/loginsystem/{role,menu,menu_manage,login_log}user/authhouse/{community,listing,dashboard,transaction,presale}noticejobserversecurityrecruitment/{recruitment,crawler}jwt.gocontroller/admin/admin.go service panic("xxx implementation not registered")"xxx 实现未注册"api/user/login/login.go 补中文包文档生成代码entity/do/dao英文注释按约定保持原样DO NOT EDIT重生成会覆盖仅注释/文档/字符串改动无业务逻辑变更read_lints 全绿go build proxy.golang.org 网络超时未跑通详见 docs/change-log/2026-09-13.md