工作台赛道筛选白名单:三榜只保留所需赛道(含「全部」)
- dsh-data.js 新增 RANK_KEEP 白名单(生活记录/生活vlog/小剧场/亲子/美食/旅行,覆盖账号榜与作品榜两套赛道枚举) - collectCategories:赛道下拉=白名单∩实际出现,按白名单顺序(当期 0 条赛道不显示) - getRanking:hot/likes 条目无条件白名单过滤(选「全部」也只保留白名单条目),再按请求赛道过滤;week 不变 - 验证:week 250/5 赛道不变;hot 下拉 4 赛道全 29 条;likes 下拉 4 赛道全 28 条;服务 5500 运行
This commit is contained in:
1 parent
250d51c8c2
commit
d22310ffb3
2 files changed
+26
-6
No files matched your search
@@ -155,3 +155,9 @@
|
||||
- **新落盘契约**:`抖音榜单/` 三子目录 `账号周榜/`(抖音周榜_{赛道}_{周一}×多期,douyin-top-account 落盘)、`视频热榜/`(抖音周榜_视频热榜_{周一}.json 全品类单文件/期)、`点赞榜/`(抖音周榜_点赞榜_{周一}.json);旧 28 赛道 56 文件归档 `_archive_旧28赛道结构_20260903/`;顶层 category="全部",赛道在 list[].category
|
||||
- **后端改造**:dsh-data.js RANK_SUB 子目录映射 + rankFilePath(dir,name) + parseRankFileIn/listRankFiles(子目录优先+根目录旧平铺回退)/collectCategories(week=文件名赛道;hot/likes=条目 category 并集)/getRanking 赛道过滤(week 文件名级、hot/likes 条目级);工作台实际读取桌面目录(源技能 __dirname 无 .dsh → 桌面 71→15+2 文件;D:/dshworkspace/抖音榜单 为空是 dsh 部署形态)
|
||||
- **验证**:node --check ✓;node 直调 week 250/3期/5赛道 + hot 50/12赛道 + likes 50/14赛道;筛亲子 hot=2/likes=3;服务重启(29172→3912)curl 三榜 API 全通;前端赛道下拉动态(meta.categories)无需改动
|
||||
|
||||
## 工作台赛道白名单过滤(09-03 15:05,用户要求「只留所需赛道」)
|
||||
- **需求**:热点数据页赛道筛选下拉与列表(含「全部」)只保留所需赛道数据
|
||||
- **口径**:与账号周榜 douyin-top-account 保留 5 赛道一致;**账号榜 type=生活vlog / 作品榜条目 category=生活记录**(两套枚举),白名单取并集 RANK_KEEP=['生活记录','生活vlog','小剧场','亲子','美食','旅行'](dsh-data.js)
|
||||
- **实现**:collectCategories 白名单∩实际出现(按 RANK_KEEP 顺序);getRanking hot/likes 条目无条件白名单过滤(「全部」也只留白名单)+ 请求赛道过滤;week 不受影响
|
||||
- **验证**(服务 5500):week 下拉 5 赛道/250 条不变;hot 下拉[生活记录,小剧场,亲子,美食]全部 29 条;likes 下拉[生活记录,小剧场,亲子,旅行]全部 28 条;当期 0 条赛道(hot 旅行/likes 美食)不进下拉
|
||||
@@ -343,6 +343,12 @@ const RANK_FILE_RE = {
|
||||
likes: /^抖音周榜_点赞榜_(\d{4}-\d{2}-\d{2})\.json$/,
|
||||
};
|
||||
|
||||
// 工作台所需赛道白名单(09-03 定:与账号周榜 douyin-top-account 保留 5 赛道同口径)
|
||||
// 口径差异:账号榜 type=「生活vlog」;作品榜条目 category=「生活记录」——并集同时放行。
|
||||
// 生效范围:hot/likes(全品类文件)赛道下拉与列表(含「全部」)只保留白名单条目;week 文件名赛道天然在白名单内。
|
||||
const RANK_KEEP = ['生活记录', '生活vlog', '小剧场', '亲子', '美食', '旅行'];
|
||||
const RANK_KEEP_SET = new Set(RANK_KEEP);
|
||||
|
||||
function rankFilePath(dir, name) {
|
||||
return dir ? path.join(RANKING_DIR, dir, name) : path.join(RANKING_DIR, name);
|
||||
}
|
||||
@@ -373,17 +379,21 @@ function listRankFiles(board) {
|
||||
return out.sort((a, b) => b.date.localeCompare(a.date));
|
||||
}
|
||||
|
||||
// week:文件名赛道;hot/likes:条目 category 并集(「全部」文件读 list 去重)
|
||||
// 赛道下拉:白名单内且当期数据实际出现者,按 RANK_KEEP 顺序输出
|
||||
// week:文件名赛道;hot/likes:条目 category 并集
|
||||
function collectCategories(board, files) {
|
||||
if (board === 'week') return [...new Set(files.map((f) => f.category))];
|
||||
const set = new Set();
|
||||
const found = new Set();
|
||||
if (board === 'week') {
|
||||
for (const f of files) found.add(f.category);
|
||||
} else {
|
||||
for (const pf of files) {
|
||||
try {
|
||||
const d = JSON.parse(fs.readFileSync(rankFilePath(pf.dir, pf.name), 'utf8'));
|
||||
for (const it of (d.list || [])) { const c = String(it.category || '').trim(); if (c) set.add(c); }
|
||||
for (const it of (d.list || [])) { const c = String(it.category || '').trim(); if (c) found.add(c); }
|
||||
} catch (e) {}
|
||||
}
|
||||
return [...set].sort();
|
||||
}
|
||||
return RANK_KEEP.filter((c) => found.has(c));
|
||||
}
|
||||
|
||||
function rankingMeta(board = 'week') {
|
||||
@@ -416,9 +426,13 @@ function getRanking({ board = 'week', date = '', category = '', sortBy = '', ord
|
||||
for (const pf of selFiles) {
|
||||
try { items = items.concat(JSON.parse(fs.readFileSync(rankFilePath(pf.dir, pf.name), 'utf8')).list || []); } catch (e) {}
|
||||
}
|
||||
if (board !== 'week' && category && category !== '全部') {
|
||||
// 全品类单文件(hot/likes):①白名单过滤(含「全部」也只保留所需赛道条目)②按请求赛道条目过滤
|
||||
if (board !== 'week') {
|
||||
items = items.filter((it) => RANK_KEEP_SET.has(String(it.category || '').trim()));
|
||||
if (category && category !== '全部') {
|
||||
items = items.filter((it) => String(it.category || '').trim() === category);
|
||||
}
|
||||
}
|
||||
// 默认排序键随榜:week=综合得分 / hot=点赞 / likes=新增点赞(同分按排名升序)
|
||||
const DEF_KEY = board === 'week' ? 'comprehensiveScore' : board === 'hot' ? 'likeCount' : 'add_digg_count';
|
||||
if (!order && (!sortBy || sortBy === DEF_KEY)) {
|
||||
|
||||
Reference in new issue
Block a user