这两批改动此前一直压在工作区未提交,本次一并归档。go build ./... 通过。
一、招聘爬虫健壮性
- 新增 internal/service/recruitment/source_config.go:
crawl_source.config(VARCHAR(1000) JSON)的源级抓取参数解析 —— 增量窗口天数、
单次详情页上限、最大翻页数、详情间隔限速、自定义标准词/排除词。
全部字段可选,JSON 解析失败即回退默认值,保证历史数据零迁移可用,
且一个源的脏配置不会拖垮整个调度。
- 新增 internal/service/recruitment/keywords.go(含 keywords_test.go 与 testdata/):
链接筛选由「URL 形态命中 AND 文本语义命中」改为评分制 —— URL 形态加分、
标准词加分、排除词大幅减分,达阈值即入选。原与逻辑会系统性漏抓
「补充工作人员的通知」「公开选调公务员简章」等标题变体,且静默无报错。
- 新增 manifest/sql/recruitment/004_crawl_source_status.sql:
crawl_source 增加「最近一次运行状态」冗余列,抓取结束时写入,
使 Sources() 查询零 JOIN 零扫描 —— 规避原实现全表扫描只增不减的 crawl_log、
随运行时间线性劣化的问题。幂等,可重复执行。
- internal/service/recruitment/crawler.go:在既有「静态两级 / SPA / curl 回退」
流程上做锚点抽取与过滤、编码回退的健壮性增强。
- internal/service/recruitment/bark.go、recruitment.go:配合上述调整。
二、通知记录增强
- api/notice、internal/controller/notice、internal/service/notice、
internal/model/{dto,entity,do}/notice.go:通知日志查询与操作扩展 ——
批次号、状态、重试次数、来源、耗时、详情、删除、清空。
- 新增 internal/model/dto/notice_meta.go(字典选项元数据,供前端筛选器取选项)。
- 新增 manifest/sql/017_notice_log_enhance.sql:notice_log 扩展列 +
删除/清空/详情/字典选项接口权限,幂等(ALTER 走 information_schema 判断,
菜单 ON DUPLICATE KEY UPDATE,角色绑定 INSERT IGNORE)。
三、仓库卫生
- .gitignore 补 rc_*.log 与 rc_verify*,挡掉本地离线验证产物
(含 30MB 的 rc_verify.exe),避免误入库。
设计依据见 docs/recruitment-crawler-design.md。
注:017 与 recruitment/004 两个 SQL 为增量迁移,DB 结构变更不自动 DDL,
生产库需手动导入。
|
||
|---|---|---|
| .gitea/workflows | ||
| .workbuddy/memory | ||
| api | ||
| common | ||
| deploy | ||
| docs | ||
| hack | ||
| internal | ||
| manifest | ||
| resource | ||
| utility | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| Makefile | ||
| PROJECT_STRUCTURE.md | ||
| README.MD | ||
service.xpcool.com — 个人多客户端后端服务
GoFrame v2 单体应用,为 mini / h5 / app 多端提供后端服务,并附带完整的后台管理体系。
核心业务:用户认证(JWT)、看房数据(小区/房源/成交/预售证)、招聘考试聚合、 站内通知、服务器安全日志;后台管理(RBAC 菜单权限 + 操作审计)。
面向 AI 助手的项目上下文见
AGENTS.md;每次变更的结构化记录见docs/change-log/;目录树见PROJECT_STRUCTURE.md。
分层约定
调用链强制为 api → internal/controller → internal/service → internal/dao → internal/model(entity/do)。
controller只做 API 到 service 的适配,不碰 dao;- 跨层出入参走
internal/model/dto与internal/model/vo,API 类型与 entity 不得越界; - 数据库操作必须用 DO 对象(
internal/model/do),禁止g.Map; - 错误一律用
gerror(保留堆栈),响应统一走internal/library/response。
路由分组
三组路由在 internal/cmd/cmd.go 中注册:
| 前缀 | 用途 | 鉴权 |
|---|---|---|
/api/service/open |
开放接口(前端直接调用) | 公开,无鉴权 |
/api/service/user |
用户端接口 | 登录公开,其余走 UserAuth |
/api/service/admin |
管理端接口 | AdminAuth + 按「方法+路径」自动匹配权限码 |
管理端权限由后端从 admin_menu(type=2 行,path 存 "METHOD /路径")反查,
前端无需传 X-Permission;未配置映射的接口一律拒绝。
数据库模型生成
先在 MySQL 上执行 manifest/sql/ 下的迁移脚本,再设置 DB_DSN,然后运行:
gf gen dao -p internal -g default -gt -c
该命令是 internal/dao、internal/model/do、internal/model/entity 的唯一来源,生成物禁止手改。
注意:部分模块(招聘、通知、自动任务、服务器安全日志)的表结构为手写 entity/do/dao,
未走 gf gen,改动时请勿用生成命令覆盖。
本地启动
环境变量按 GF_GCFG_FILE 切换配置文件(config.dev.yaml / config.test.yaml / config.prod.yaml)。
- 终端:
source .env.dev && go run main.go(.env.dev不入库,保存本地 DSN 与密钥)。 - GoLand:运行配置
.run/service-dev.run.xml(项目级,重载项目后自动识别) 已注入GF_GCFG_FILE/DB_DSN/JWT_SECRET,在运行下拉框中选择即可。 该文件含数据库口令,已加入.gitignore。
开发环境下,若 ${DB_DSN} / ${RECRUITMENT_DB_DSN} / ${JWT_SECRET} 占位符未被环境变量注入,
injectEnv 会回填本地默认值,保证「零配置可启动」;生产(GF_GCFG_ENV=prod)不兜底,配置缺失显性报错。
构建与测试
go build ./...
go test ./...