service.xpcool.com/internal/model/do/recruitment.go
夏犀麟 ad4567fc01 feat: 招聘爬虫健壮性 + 通知记录增强(归档工作区留存改动)
这两批改动此前一直压在工作区未提交,本次一并归档。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,
生产库需手动导入。
2026-09-14 01:22:39 +08:00

107 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

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.

// 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 //
}