stefanfeng
|
79d57da769
|
fix: 今日文章不足时混入历史文章,避免所有用户扎堆同一篇
问题:今日只有1篇文章时,所有虚拟用户都只互动这同一篇
原因:Phase 1 找到今日文章后直接返回,不管数量多少
修复逻辑:
- 今日有效文章 → 每用户最多取 1 篇(count//3,最少1篇)
- 剩余名额(count - today_quota)从历史文章补充
- 历史文章:按当前小时对应页拉取(与Phase 2相同),随机打散
- 历史文章排除今日文章ID和当天发布的文章,保证内容不重复
- 最终返回:今日N篇 + 历史M篇,总量接近 count
效果:今日1篇文章时 → 用户取1篇今日 + 4篇历史,互动多样性恢复
|
2026-04-08 11:49:57 +08:00 |
|
stefanfeng
|
c944fbb0ea
|
fix: 今日文章配额控制,避免全部虚拟用户集中互动同一篇
问题:今日只有1篇文章时,所有虚拟用户全部互动该文章,历史文章无人问津
修复方案(配额制):
- 新增 count_today_articles():轻量统计今日广场文章数
- 配额规则:每篇今日文章最多吸引3个虚拟用户(可调)
- 今日1篇 → 最多3人互动今日,其余全走历史
- 今日5篇 → 最多15人互动今日,其余走历史
- 今日10篇以上 → 批次内所有人均可互动今日文章
- get_news_list() 新增 force_history 参数,强制走 Phase 2
- 调度器在分发任务前计算配额,超出配额的用户透传 force_history=True
效果:新文章获得合理曝光,历史文章持续被互动,分布更自然
|
2026-04-08 11:47:36 +08:00 |
|
stefanfeng
|
b43ee777fc
|
feat: 互动记录/数据看板自动刷新 + 日志时间格式修复
1. Interactions.vue: 每30秒自动刷新互动记录列表
2. Dashboard.vue: 每30秒自动刷新数据看板
3. Logs.vue: 时间格式修复(T→空格,去掉时区标识)
4. logs.py: created_at 改用 strftime 输出 +08:00 格式(而非 isoformat 的 +00:00)
页面保持浏览时自动获取最新数据,离开页面时自动清除定时器
|
2026-04-07 14:51:59 +08:00 |
|
stefanfeng
|
7d9f5a358b
|
fix: 使用正确的广场接口 /business/square/list
问题根因:
- 一直用 /business/member/square/list(成员广场接口)
- 该接口加了 isPlatformShow=true 和 isAdmin=false 过滤
- 导致大量文章(包括今日最新文章)被过滤掉,只剩124篇
- 正确接口 /business/square/list?type=1 有2504篇文章,今日文章可见
修改内容:
1. 接口地址改为 /business/square/list(4处)
2. 去掉 isPlatformShow 和 isAdmin 参数,只保留 type=1
3. _is_today 时间字段优先用 publishTime(新接口主要返回此字段)
4. 排序和热度权重计算也统一用 publishTime 优先
|
2026-04-07 14:32:35 +08:00 |
|
stefanfeng
|
b6e094c9c0
|
fix: 过滤 recordId/title 为 null 的异常广场条目(type!=1)
|
2026-04-07 14:14:57 +08:00 |
|
stefanfeng
|
d6ad1db535
|
fix: Phase2始终从第1页(最新)开始,按小时递进页码
问题:
- 原实现用 hour % total_pages 决定起始页
- 13点时 13%3=1,start_page=2,直接跳过第1页(最新文章)
- 导致虚拟用户永远不互动最新发布的文章
修复:
- 第1页(最新文章)始终在获取总页数时一并拉取,零额外开销
- hour_page = (hour % max_pages) + 1,每小时推进一页(1→2→3...循环)
- 0点=第1页最新,1点=第2页,依此类推,形成完整的新→旧覆盖
- 若当前时段页为空则顺序回退,最终兜底第1页
Phase 1(今日新文章)逻辑不变
|
2026-04-07 13:52:59 +08:00 |
|
stefanfeng
|
169e798718
|
fix: 历史文章改为从新到旧顺序翻页,而非随机
修复原因:
- 需求要求从最新文章开始往旧的方向依次互动
- 原实现随机选页,导致每次跳到不同页,无法体现「从新到旧」
- 列表API返回的文章已按 createTime 降序排列(第1页最新)
新Phase 2逻辑:
- 计算总页数(最多10页)
- 用当前小时 % 总页数 决定起始页(同小时内分散到不同页)
- 若起始页为空,顺序往后再折回,直到找到有文章的页
- 在同一页内随机打散,保证同一时段不同用户不总是抢相同文章
- validate_article 校验,不够则从剩余补充
Phase 1(今日新文章)逻辑不变:
- 仍从第1页抓取当天文章,按 createTime 降序(新→旧)排列后校验返回
|
2026-04-07 13:24:42 +08:00 |
|
stefanfeng
|
053d22965c
|
feat: 调度优先今日新文章,无新文章时随机历史翻页
新调度规则:
Phase 1 — 今日新文章优先(从新到旧轮询):
- 从第1页开始拉取(接口返回最新优先)
- 只保留今日发布的文章,按 createTime 降序排列(新→旧)
- 最多扫描3页,发现非今日文章立即停止
- 对今日文章逐篇 validate_article 校验后返回
Phase 2 — 历史兜底(仅今日无新文章时触发):
- 随机翻 1~10 页历史
- 热度+新鲜度加权采样(commentNum×3 + praiseNum×2 + readNum)
- validate_article 校验后返回
两阶段均包含:
- 本人发布文章过滤
- 静态+运行时无效ID过滤
- 文章有效性校验(不可开/正文<100字自动加入缓存黑名单)
|
2026-04-03 11:33:31 +08:00 |
|
stefanfeng
|
e18c241bf0
|
feat: 文章有效性校验,过滤不可开/字数<100的文章
新增 validate_article() 方法:
- 调用 GET /news/{id} 接口验证文章是否存在(code≠0 则无效)
- 去除 HTML 标签后统计正文字数,< 100 字则过滤
- 运行时缓存 _invalid_ids_cache:校验失败的 ID 进程内永久跳过,避免重复 API 调用
静态黑名单更新:
- 新增 1952296583257133058(测试发现的无效文章)
- 静态黑名单与运行时缓存合并使用
get_news_list 流程:
1. 静态黑名单过滤(无 API 开销)
2. 热度+新鲜度加权采样
3. validate_article 逐篇校验
4. 若候选不足,从剩余池补充直到达到 count
|
2026-04-03 11:18:22 +08:00 |
|
stefanfeng
|
f52bc7d147
|
fix: 点赞/收藏/转发同一篇文章每日只触发一次
问题:同一用户对同一篇文章重复点赞、收藏、转发
原因:去重逻辑只针对评论,未覆盖其他互动类型
修复:
- 查询今日所有互动类型的已完成记录(不只是评论)
- 点赞/收藏/转发执行前检查 today_done,已做过则跳过
- 概率控制依然有效(未做过的文章才进入随机概率判断)
- 评论去重逻辑保持不变
|
2026-04-03 10:47:34 +08:00 |
|
stefanfeng
|
4ab8f94663
|
fix: 修复调度器只选前5个用户的bug,改为全量轮转
问题根因:
1. SQL查询加了 .limit(max_concurrent),导致只有数据库前5条用户参与互动
2. 额外的 random.random() < 0.6 过滤进一步减少了执行用户数
修复方案:
- 查询所有已登录用户(去掉 SQL LIMIT)
- 按最后互动时间升序排序,最久未互动的用户优先
- 前1/3名额给最久未互动用户(优先权),其余随机补充
- 每轮最多执行 max_concurrent 个用户,保证公平轮转
|
2026-04-03 10:28:49 +08:00 |
|
stefanfeng
|
7203f04be6
|
feat: 评论去重 + 热度/新鲜度加权选文
评论去重逻辑:
- 查询今日已评论的文章ID,选文时已评论的文章权重降为10%
- 若选中已评论文章:改为回复其他用户的评论(虚拟用户互动链)
- 若选中未评论文章:正常发新评论,评论成功后随机回复他人评论
热度+新鲜度加权选文规则:
- 热度分 = commentNum×3 + praiseNum×2 + readNum×1
- 新鲜度 = 72小时内的新文章获得最高3倍加成,随时间线性衰减
- 综合权重 = (热度分+1) × 新鲜度,确保真实用户互动多的新文章优先被虚拟用户关注
|
2026-04-02 17:33:07 +08:00 |
|
stefanfeng
|
958eaeda8a
|
fix: 多项修复
- main.py: 加 _CNJSONResponse 修复 datetime 序列化时区(+00:00→+08:00)
- schemas/__init__.py: 加 _fmt_dt 函数和 sync_to_platform 字段
- ai_service.py: 评论 max_tokens 从 300 提升到 500 避免截断
- scheduler.py: datetime.utcnow() 全部改为 datetime.now()(北京时间)
- docker-compose.yml: MySQL 容器加 TZ=Asia/Shanghai
- Interactions.vue: 文章标题链接从系统配置读取域名,格式为 {域名}/huihui-h5/#/news/share?id={id}&login=no
|
2026-04-01 18:07:42 +08:00 |
|
stefanfeng
|
fe9110ca3c
|
fix: 修复文章链接域名读取(data是dict格式,用data['key'].value获取)
|
2026-04-01 18:03:31 +08:00 |
|
stefanfeng
|
da4744f333
|
feat: 文章标题链接使用正确H5 URL格式,域名从系统配置动态读取
|
2026-04-01 16:58:51 +08:00 |
|
stefanfeng
|
7448fdcba1
|
feat: 互动记录文章标题支持点击跳转详情页(el-link)
|
2026-04-01 16:12:22 +08:00 |
|
stefanfeng
|
b27bc216e3
|
fix: 修复时间显示+文章标题可点击
- axios 拦截器把 +00:00 转 +08:00
- MySQL/后端容器加 TZ=Asia/Shanghai
- scheduler.py 全部改用 datetime.now()
- main.py 加 _CNJSONResponse 修复序列化时区
- 互动记录文章标题支持点击跳转详情页
- 执行时间直接显示字符串无需二次转换
|
2026-04-01 15:12:12 +08:00 |
|
stefanfeng
|
9b87eeb84b
|
fix: 修复前端时间显示错误(+00:00转+08:00)
|
2026-03-31 13:38:21 +08:00 |
|
stefanfeng
|
3a06224f5d
|
feat: 添加一键登出全部按钮
|
2026-03-31 13:02:49 +08:00 |
|
stefanfeng
|
cd07776914
|
feat: 多项功能更新
- 日志时间改为北京时间(TZ=Asia/Shanghai)
- 评论达上限后继续执行点赞/收藏/转发
- 用户信息同步改用 PATCH /v2/users/current
- 一键登出全部功能
- 一键登出全部前端按钮
- update.sh 一键更新脚本
|
2026-03-31 10:29:26 +08:00 |
|
stefanfeng
|
3fbccbc2b1
|
chore: 清理多余文件
|
2026-03-31 10:25:00 +08:00 |
|
stefanfeng
|
0cfc9bf9c8
|
feat: AI虚拟用户新闻互动系统 v1.3.0 初始提交
- 虚拟用户管理(昵称/头像/性别/简介/邮箱同步到目标平台)
- AI互动调度(点赞/收藏/评论/转发)
- 日志时间改为北京时间
- 评论达上限后继续执行点赞收藏转发
- 一键登出全部功能
- 浅色主题UI
|
2026-03-31 10:20:57 +08:00 |
|