docs: 记录壁纸模块上线(12 接口/平台聚合/图库,含加密豁免与 .gitignore 修复、部署要点)
Some checks failed
Build and Deploy (service.xpcool.com) / build-and-deploy (push) Failing after 53s
Some checks failed
Build and Deploy (service.xpcool.com) / build-and-deploy (push) Failing after 53s
This commit is contained in:
parent
9010592c9e
commit
863b16b118
@ -1,6 +1,20 @@
|
|||||||
# service.xpcool.com 变更记录
|
# service.xpcool.com 变更记录
|
||||||
> 倒序:最新在上。格式:YYYY-MM-DD | 类型 | 摘要
|
> 倒序:最新在上。格式:YYYY-MM-DD | 类型 | 摘要
|
||||||
|
|
||||||
|
2026-09-14 | CHG | **壁纸模块后端上线(12 接口 + 开源平台聚合 + 自建图库)**。为 xpcool.com 提供「开源壁纸平台 + 后台自建图库」双来源,**保留**原有浏览器实时生成能力。设计核心是**带宽经济学**(本机出口仅 5M≈625KB/s 且多站共用):① 开源平台(Bing 每日一图 / Picsum / Unsplash / Pexels / Wallhaven)图片**不经过服务器**,后端只代理元数据并返回官方 CDN 直链,`sources`/`list`/`random`/`download-track` 挂 `open` 分组,平台响应内存缓存(Bing 1h、其余 10min);② 自建图库分三档落盘(480px 缩略图 / 长边 1920 预览 / 原图),**由 nginx 直出 `/wallpaper/`**,后端只管元数据与上传。接口遵守本仓库强制规范:**全 POST、URL 不带参、入参走 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 + RBAC(POST+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 / 以 `/` 结尾 -5」后,16 个真实锚点用例分类全对。② **图片型锚点会以文件名污染标题**——`<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-9825、14 条历史 status 正确回填为 2);经前端 Vite 代理(20100→10100)跑通 登录→选项→列表→详情,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-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/auth、tools/md5、tools/random、menu_manage、admin)、service 层 gerror.Wrap/response.Error 全部中文(admin/admin、admin/login、system/{role,menu,menu_manage,login_log}、user/auth、house/{community,listing,dashboard,transaction,presale}、notice、job、serversecurity、recruitment/{recruitment,crawler})、jwt.go、controller/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
|
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/auth、tools/md5、tools/random、menu_manage、admin)、service 层 gerror.Wrap/response.Error 全部中文(admin/admin、admin/login、system/{role,menu,menu_manage,login_log}、user/auth、house/{community,listing,dashboard,transaction,presale}、notice、job、serversecurity、recruitment/{recruitment,crawler})、jwt.go、controller/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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user