这两批改动此前一直压在工作区未提交,本次一并归档。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,
生产库需手动导入。
71 lines
3.0 KiB
Go
71 lines
3.0 KiB
Go
-- ============================================================
|
||
-- 004_crawl_source_status.sql
|
||
-- 目的:为 crawl_source 增加「最近一次运行状态」冗余列。
|
||
--
|
||
-- 背景:原 Sources() 查询需全表扫描 crawl_log(只增不减的表)以取每源最近一条,
|
||
-- 随运行时间线性劣化。改为在抓取结束时把最近结果写入 crawl_source 冗余列,
|
||
-- 查询时零 JOIN、零扫描。
|
||
--
|
||
-- 幂等设计:可重复执行,已存在的列会被跳过。
|
||
-- ============================================================
|
||
|
||
USE `recruitment`;
|
||
|
||
-- MySQL 8.0 不支持 ADD COLUMN IF NOT EXISTS,故用存储过程判断后再执行。
|
||
DROP PROCEDURE IF EXISTS `add_crawl_source_status_cols`;
|
||
|
||
DELIMITER $$
|
||
CREATE PROCEDURE `add_crawl_source_status_cols`()
|
||
BEGIN
|
||
-- 最近一次抓取时间
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'recruitment' AND TABLE_NAME = 'crawl_source' AND COLUMN_NAME = 'last_log_at'
|
||
) THEN
|
||
ALTER TABLE `crawl_source`
|
||
ADD COLUMN `last_log_at` DATETIME NULL DEFAULT NULL COMMENT '最近一次抓取时间(冗余,避免全表扫描 crawl_log)';
|
||
END IF;
|
||
|
||
-- 最近一次抓取条数
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'recruitment' AND TABLE_NAME = 'crawl_source' AND COLUMN_NAME = 'last_log_fetched'
|
||
) THEN
|
||
ALTER TABLE `crawl_source`
|
||
ADD COLUMN `last_log_fetched` INT NOT NULL DEFAULT 0 COMMENT '最近一次抓取条数(冗余)';
|
||
END IF;
|
||
|
||
-- 最近一次新增条数
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'recruitment' AND TABLE_NAME = 'crawl_source' AND COLUMN_NAME = 'last_log_new'
|
||
) THEN
|
||
ALTER TABLE `crawl_source`
|
||
ADD COLUMN `last_log_new` INT NOT NULL DEFAULT 0 COMMENT '最近一次新增条数(冗余)';
|
||
END IF;
|
||
|
||
-- 最近一次错误信息
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'recruitment' AND TABLE_NAME = 'crawl_source' AND COLUMN_NAME = 'last_log_error'
|
||
) THEN
|
||
ALTER TABLE `crawl_source`
|
||
ADD COLUMN `last_log_error` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '最近一次错误信息(冗余)';
|
||
END IF;
|
||
END$$
|
||
DELIMITER ;
|
||
|
||
CALL `add_crawl_source_status_cols`();
|
||
DROP PROCEDURE IF EXISTS `add_crawl_source_status_cols`;
|
||
|
||
-- ------------------------------------------------------------
|
||
-- 数据源适配配置初始化:
|
||
-- 为两个已启用的静态源补一份 config,启用增量窗口与限速(后续可按需调整)。
|
||
-- 注意:仅当 config 为空时才写入,避免覆盖已有配置。
|
||
-- ------------------------------------------------------------
|
||
UPDATE `crawl_source`
|
||
SET `config` = JSON_OBJECT('incrDays', 30, 'maxItems', 60, 'delayMs', 500, 'minScore', 2)
|
||
WHERE (`config` IS NULL OR `config` = '' OR `config` = '{}')
|
||
AND `source_type` = 1
|
||
AND `enabled` = 1;
|