这两批改动此前一直压在工作区未提交,本次一并归档。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,
生产库需手动导入。
107 lines
3.2 KiB
Go
107 lines
3.2 KiB
Go
// Package do 定义招聘考试聚合模块的数据对象(手写,未跑 gf gen)。
|
||
// 字段类型统一用 any,与 gf gen 产物保持一致,便于 .Data()/.Where() 使用。
|
||
package do
|
||
|
||
import (
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
)
|
||
|
||
// RecruitmentInfo 公告主表 DO。
|
||
type RecruitmentInfo struct {
|
||
g.Meta `orm:"table:recruitment_info, do:true"`
|
||
Id any //
|
||
Title any // 公告标题
|
||
SourceId any // 数据源ID
|
||
OrgId any // 发布主体ID
|
||
OrgName any // 发布主体名称
|
||
Category any // 考试分类
|
||
Region any // 地区
|
||
PublishDate any // 发布日期
|
||
Deadline any // 报名/截止日期
|
||
ExamDate any // 笔试日期
|
||
Url any // 原文链接
|
||
Content any // 正文/摘要
|
||
Attachments any // 附件(JSON)
|
||
Status any // 0有效 1已更正 2已失效 3已删除
|
||
Fingerprint any // 去重指纹
|
||
GroupKey any // 跨源同公告聚合键
|
||
CreatedAt any //
|
||
UpdatedAt any //
|
||
}
|
||
|
||
// Organization 发布主体 DO。
|
||
type Organization struct {
|
||
g.Meta `orm:"table:organization, do:true"`
|
||
Id any //
|
||
Name any // 主体名称
|
||
Type any // 主体类型
|
||
OfficialSite any // 官网
|
||
Region any // 地区
|
||
CreatedAt any //
|
||
UpdatedAt any //
|
||
}
|
||
|
||
// CrawlSource 数据源 DO。
|
||
type CrawlSource struct {
|
||
g.Meta `orm:"table:crawl_source, do:true"`
|
||
Id any //
|
||
Name any // 数据源名称
|
||
BaseUrl any // 站点基础URL
|
||
SourceType any // 1静态 2SPA 3需登录 4附件
|
||
Category any // 默认分类
|
||
Region any // 默认地区
|
||
ListPath any // 列表路径/接口
|
||
Config any // 扩展配置(JSON)
|
||
Enabled any // 是否启用
|
||
CronExpr any // 调度表达式
|
||
LastSuccessAt any // 最近成功抓取时间
|
||
FailCount any // 连续失败次数
|
||
LastLogAt any // 最近一次抓取时间(冗余)
|
||
LastLogFetched any // 最近一次抓取条数(冗余)
|
||
LastLogNew any // 最近一次新增条数(冗余)
|
||
LastLogError any // 最近一次错误信息(冗余)
|
||
CreatedAt any //
|
||
UpdatedAt any //
|
||
}
|
||
|
||
// CrawlLog 抓取日志 DO。
|
||
type CrawlLog struct {
|
||
g.Meta `orm:"table:crawl_log, do:true"`
|
||
Id any //
|
||
SourceId any // 数据源ID
|
||
RunAt any // 运行时间
|
||
Fetched any // 抓取条数
|
||
NewCount any // 新增条数
|
||
UpdatedCount any // 更新条数
|
||
Error any // 错误信息
|
||
CreatedAt any //
|
||
}
|
||
|
||
// PushSubscription 推送订阅 DO。
|
||
type PushSubscription struct {
|
||
g.Meta `orm:"table:push_subscription, do:true"`
|
||
Id any //
|
||
Name any // 订阅名称
|
||
DeviceKey any // Bark 设备密钥
|
||
Regions any // 订阅地区(JSON)
|
||
Categories any // 订阅分类(JSON)
|
||
OnlyNew any // 仅推送新公告
|
||
PushTime any // 推送时间
|
||
Enabled any // 是否启用
|
||
CreatedAt any //
|
||
UpdatedAt any //
|
||
}
|
||
|
||
// PushLog 推送记录 DO。
|
||
type PushLog struct {
|
||
g.Meta `orm:"table:push_log, do:true"`
|
||
Id any //
|
||
SubscriptionId any // 订阅ID
|
||
PushAt any // 推送时间
|
||
Title any // 推送标题
|
||
Body any // 推送内容
|
||
Result any // 1成功 0失败
|
||
Error any // 错误信息
|
||
CreatedAt any //
|
||
}
|