8.2 资讯 · 浏览与发布操作说明
资讯操作及逻辑流程说明
适用项目:baoan/ba
最后更新:2026-06-23
背景:早期商家资讯写入by_shop_news,后统一迁移至by_article;部分模块仍读写旧表,已在本轮修复中收敛。
1. 数据表与模型
| 模型 | 物理表 | 主键 | 说明 |
|---|---|---|---|
ArticleModel | by_article | article_id | 统一资讯主表(系统资讯 + 商家资讯) |
ShopnewsModel | by_shop_news | news_id | 旧商家资讯表(历史数据,逐步废弃写入) |
ArticlecateModel | by_article_cate | cate_id | 资讯分类(与 Shopcate 公司分类无关) |
ArticlecommentModel | by_article_comment | comment_id | 评论 |
ArticlephotoModel | by_article_photos | — | 附图 |
1.1 by_article 关键字段
| 字段 | 含义 |
|---|---|
article_id | 主键,前台链接统一使用 |
shop_id | 0 = 系统/平台资讯;>0 = 某商家资讯 |
user_id | 发布者(会员/员工路径会写入) |
cate_id | 资讯分类 ID(by_article_cate) |
city_id / area_id | 城市/区域 |
audit | 0 待审核,1 已审核 |
closed | 0 正常,1 软删除 |
news_id | 迁移桥接:旧 by_shop_news.news_id;新数据一般为 NULL |
title / profiles / details / photo | 标题、简介、正文、缩略图 |
2. 资讯类型划分
┌─────────────────────────────────────────────────────────┐
│ by_article(统一表) │
├────────────────────────┬────────────────────────────────┤
│ shop_id = 0 │ shop_id > 0 │
│ 系统/平台资讯 │ 商家资讯 │
│ 总后台 Article 发布 │ 商家/员工/会员/分销 发布 │
│ 全站资讯频道展示 │ 商家主页资讯 Tab 展示 │
└────────────────────────┴────────────────────────────────┘
3. 发布入口与写入逻辑
3.1 商家后台(主路径,已迁移)
文件: Banyan/Lib/Action/Merchant/NewsAction.class.php
| 操作 | 写入表 | 初始状态 |
|---|---|---|
| 新增 | by_article | audit=0,需总后台审核 |
| 编辑 | by_article | 保持原审核状态 |
| 删除 | — | 软删 closed=1(如有) |
- 自动填充:
shop_id、city_id、area_id、source=公司名称 - 分类使用 资讯分类
Articlecate,不是公司分类Shopcate - 推送(短信/微信/站内信/邮件)使用
article_id,source=article
3.2 总后台
| 模块 | 文件 | 说明 |
|---|---|---|
| 系统资讯 | Backstage/ArticleAction | shop_id 可为 0 |
| 公司资讯 | Backstage/ShopnewsAction | 实际读写 by_article,UI 名称仍为 shopnews |
| 审核 | article/audit、shopnews/audit | 设置 audit=1 |
3.3 员工 / 分销后台(已修复)
文件: Worker/NewsAction、Distributors/NewsAction
- 修复前: 双写
Article+Shopnews,成功条件绑定旧表 → 常报「操作失败」 - 修复后: 仅写
by_article;Shopfavorites.last_news_id存article_id
| 模块 | 新增默认 audit |
|---|---|
| Worker | 1(员工直接通过) |
| Distributors | 0(待审核) |
3.4 会员中心
文件: Members/NewsAction.class.php
- 写入
by_article,audit=0 - 推送已改为
source=article
3.5 仍使用旧表的路径(待后续迁移)
| 模块 | 文件 | 状态 |
|---|---|---|
| 分站/Being 公司资讯 | Substation/ShopnewsAction、Being/ShopnewsAction | 仍写 by_shop_news |
| PC Seller 频道 | Home/SellerAction | 仍读 by_shop_news |
4. 审核与可见性规则
4.1 前台列表(公开)
统一条件:
closed = 0 AND audit = 1
可选附加:city_id、cate_id、shop_id
4.2 详情页(已加固)
方法: ArticleModel::canView($detail, $uid)
| 条件 | 是否可见 |
|---|---|
closed != 0 | 否 |
audit = 1 | 是(公开) |
audit = 0 且当前用户是作者 | 是(预览) |
audit = 0 且当前用户是该公司管理员 | 是(预览) |
| 其他 | 否 |
应用位置:
- WAP:
Wap/NewsAction::detail、Wap/ShopAction::news_detail - PC:
Home/NewsAction::detail
4.3 商家后台列表
仅按 shop_id 过滤,包含未审核文章,便于商家自查。
5. 前端展示路径
5.1 全站资讯
| 端 | 列表 | 详情 |
|---|---|---|
| WAP | /wap/news/index → news/load | /wap/news/detail/article_id/{id} |
| PC | /home/news/index | /home/news/detail/article_id/{id} |
5.2 商家资讯
| 端 | 列表 | 详情 |
|---|---|---|
| WAP | /wap/shop/news/shop_id/{id} → newsload | /wap/shop/news_detail/article_id/{id} |
| PC | /home/shop/news/shop_id/{id} | 跳转全站 news/detail 或商家页内链 |
商家详情页首页块也会拉取该 shop_id 下最新资讯(audit=1, closed=0)。
5.3 首页资讯块
| 端 | 数据源 | 条件 |
|---|---|---|
| WAP 首页 | Wap/IndexAction | closed=0, audit=1 |
| PC 首页 | Home/index/index.html calldata | closed=0 AND audit=1(已修复) |
6. 推送逻辑
服务: Banyan/Lib/Service/PushService.class.php
商家/会员点击推送
→ pushArticle(article_id, channels, { source: 'article' })
→ loadArticleRecord 读 by_article
→ buildArticleUrl 生成链接:
shop_id > 0 → /wap/shop/news_detail/article_id/{id}
shop_id = 0 → /wap/news/detail/article_id/{id}
修复前问题: source=shopnews 时先用 article_id 查旧表,链接也用 news_id 格式,导致推送打不开。
7. 关注商家与未读资讯
表: by_shop_favorites
| 字段 | 含义 |
|---|---|
last_news_id | 该公司最新资讯 ID(新数据存 article_id) |
read_id | 用户已读到的资讯 ID |
文件: Wap/FavoritesAction.class.php
- 列表加载:优先
Article::itemsByIds,找不到再降级Shopnews(兼容旧数据) - 读文章:先查
Article,再查Shopnews - 修复了
read()中$new_id未定义 bug
8. 完整流程图
┌──────────────┐
│ 发布入口 │
└──────┬───────┘
┌───────────────┼───────────────┐
▼ ▼ ▼
Merchant/News Backstage/Article Worker/News
Members/News Backstage/Shopnews Distributors/News
│ │ │
└───────────────┼───────────────┘
▼
┌─────────────────┐
│ by_article │
│ audit=0/1 │
│ shop_id 0或>0 │
└────────┬────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
总后台审核 前台列表/详情 推送/关注
audit→1 audit=1 公开 PushService
9. 历史迁移说明
9.1 为什么要统一
- 原
by_shop_news仅服务商家,系统资讯在by_article,两套表导致:
- 首页/全站频道无法统一排序
- 推送、收藏、SEO 链接分裂
- 后台「公司资讯」与「系统资讯」维护成本高
9.2 迁移策略
- 新数据: 全部写
by_article,不再写by_shop_news - 旧数据:
by_article.news_id保留对旧表引用;读取侧兼容降级 - 字段
last_news_id: 语义改为存article_id(字段名暂保留,避免改表)
9.3 建议的数据库迁移 SQL(可选,运维执行)
-- 将尚未迁入 article 的 shop_news 补录(示例,执行前请备份)
INSERT INTO by_article (
news_id, shop_id, cate_id, city_id, area_id, source, title, keywords,
profiles, photo, details, audit, closed, create_time, create_ip, views
)
SELECT
n.news_id, n.shop_id, n.cate_id, n.city_id, n.area_id, n.source, n.title, n.keywords,
n.intro, n.photo, n.detail, n.audit, n.closed, n.create_time, n.create_ip, n.views
FROM by_shop_news n
LEFT JOIN by_article a ON a.news_id = n.news_id
WHERE a.article_id IS NULL;
10. 本轮已修复 Bug 清单
| # | 问题 | 修复 |
|---|---|---|
| 1 | Worker/分销发布报失败但 Article 已插入 | 去掉 Shopnews 双写 |
| 2 | Worker/分销编辑报「更新公司文章失败」 | 去掉 update_shop_news |
| 3 | 推送链接打不开 | source=article;商家链走 shop/news_detail |
| 4 | 关注商家看不到新资讯 | Favorites 改读 Article,兼容旧表 |
| 5 | 创建时 city 被写成 cate_id | Merchant/Members 删除错误字段 |
| 6 | PC 首页显示未审核资讯 | calldata 加 audit=1 |
| 7 | 未审核资讯可通过 URL 访问 | ArticleModel::canView |
| 8 | WAP/PC 商家资讯列表缺 closed | 加 closed=0 |
| 9 | 随机推荐取未审核稿 | ArticleModel::rands audit 改为 1 |
| 10 | 商家编辑无 shop 归属校验 | Merchant edit 加 shop_id 检查 |
11. 运维与测试清单
发布测试
- 商家后台新增资讯 → 后台列表可见,
audit=0 - 总后台审核通过 → 前台商家资讯 Tab、全站频道可见
- 员工后台新增 → 直接
audit=1可见(Worker 权限开启时)
推送测试
- 商家后台点「微信推送」→ 链接为
/wap/shop/news_detail/article_id/xxx - 微信内打开链接正常显示
关注测试
- 用户关注商家 → 发布新资讯 → 关注列表显示最新标题
- 点击阅读 →
read_id更新,未读标记消失
回归注意
- 旧
by_shop_news纯数据仍可通过 Favorites 降级读到 - 分站/Being/Seller 频道如需完全统一,需单独排期改读
Article
12. 相关文件索引
| 类型 | 路径 |
|---|---|
| 模型 | Banyan/Lib/Model/ArticleModel.class.php |
| 商家发布 | Banyan/Lib/Action/Merchant/NewsAction.class.php |
| 员工发布 | Banyan/Lib/Action/Worker/NewsAction.class.php |
| 推送 | Banyan/Lib/Service/PushService.class.php |
| WAP 全站 | Banyan/Lib/Action/Wap/NewsAction.class.php |
| WAP 商家 | Banyan/Lib/Action/Wap/ShopAction.class.php |
| PC 全站 | Banyan/Lib/Action/Home/NewsAction.class.php |
| 关注未读 | Banyan/Lib/Action/Wap/FavoritesAction.class.php |
| WAP 模板 | themes/default/Wap/Shop/news.html、newsload.html |
| PC 首页 | themes/default/Home/index/index.html |
