Blog
受众:开发者 摘要:spring-open-module-blog 博客:文章 / 草稿 / 分类 / 标签 / 评论 / 点赞 / 收藏 / 阅读量。
Blog 模块用于承载用户文章、作者主页和内容阅读入口。当前已经提供文章浏览、作者聚合、用户发文、草稿编辑、分类 / 标签管理、评论、评论后台处理、文章状态处理、推荐、点赞、收藏和阅读量能力,满足 PC / App 移动端真实接口联调。
模块可选依赖,应用不需要 Blog 时可以移除 spring-open-module-blog 引用,不影响 CMS、Forum、Mall 或其他模块。
配置
spring:
open:
blog:
enabled: truespring.open.blog.enabled=false 时,Blog Controller、Service 和 Mapper 扫描都会关闭。
该开关已通过模块 ServiceProvider 声明为配置中心元数据。启用配置中心后,后台可以发现并维护 Blog 模块启停配置;未通过配置中心覆盖时继续使用 application.yml / 环境变量中的默认装配值。
扩展点
文章创建和更新会经过 blog.article.save Hook 扩展点。Hook 上下文包含操作类型、文章 ID、作者 ID 和本次 SaveBlogArticleCommand,适合站点二开策略、租户限制、发布窗口检查、审计和指标埋点;字段规范化、内容安全、状态处理、文章落库和互动计数仍由 Blog Service 主流程控制。
该扩展点是方法外层同步扩展,before 阶段可用明确业务异常阻断保存;不建议把正文处理、内容安全内部步骤、异步通知或长耗时任务放入 Hook。需要拆内部有序步骤时,应评估 Pipeline;需要事务后广播时,应优先使用 Event / Outbox。
数据模型
核心表:
| 表 | 说明 |
|---|---|
blog_article | 文章、草稿、作者快照、分类 / 标签快照、SEO 和互动计数 |
blog_category | 后台维护的文章分类选项 |
blog_tag | 后台维护的文章标签选项 |
blog_comment | 文章评论,支持一级父级关联 |
blog_article_like | 文章点赞记录 |
blog_article_favorite | 文章收藏记录 |
blog_article_purchase_order | 单篇付费文章购买订单,记录支付渠道、支付状态和解锁时间 |
文章仍保留分类和标签快照字段:
| 字段 | 说明 |
|---|---|
slug | 面向 URL 的文章唯一标识 |
title / summary / content | 标题、摘要和正文 |
cover_url | 封面图 |
category_code / category_name | 分类编码和名称 |
tag_codes / tag_names | 英文逗号分隔的标签编码和名称 |
author_id / author_name | 作者 ID 和展示名快照 |
status | 0 草稿、1 已发布、2 已下线 |
featured / featured_at | 是否推荐及推荐时间 |
published_at | 发布时间,未来时间不会出现在公开接口 |
view_count / like_count / favorite_count / comment_count | 阅读、点赞、收藏和评论计数 |
access_type | 阅读权限:free 免费、member 会员权益、vip VIP 解锁、paid 单篇付费 |
unlock_price / unlock_currency | 单篇付费价格和币种,仅 paid 使用 |
vip_item_code | 会员 / VIP 权益项编码,member / vip 使用 |
paid_preview | 会员 / VIP / 付费文章锁定时公开展示的预览正文 |
extra_json | 文章扩展元数据;当前用于保存付费文章的 memberDiscountItemCode 和 memberDiscountRate 等会员价提示字段 |
review_assignee_id / review_assigned_by / review_assigned_at / review_assignment_note | 后台审核分派快照,记录待审责任人、分派人、分派时间和备注 |
这样可以先把创作和互动链路打通,不急着过早拆分类、标签和作者扩展表。后续文章运营复杂度上来后,再按实际需要扩展。
分类和标签管理表先用于后台维护可选项,文章保存时仍写入分类 / 标签快照。公开分类和标签接口继续按已发布文章聚合读取,方便前端直接拿到文章数量;如果后续需要更复杂的多标签关系、标签合并或历史重算,再扩展文章与标签关系表。
分类和标签接口会同时返回原始文案和展示文案:
| 字段 | 说明 |
|---|---|
name / description | 后台维护的原始文案,文章保存时可作为快照来源 |
displayName / displayDescription | 后端按当前语言解析后的展示文案,前端展示优先使用 |
多语言 key 约定:
messages.blog.category.<code>.name=分类名称
messages.blog.category.<code>.description=分类说明
messages.blog.tag.<code>.name=标签名称
messages.blog.tag.<code>.description=标签说明未配置翻译时会回退到原始文案。Admin / App / PC 不需要为 Blog 分类和标签维护独立硬编码翻译表。
内置演示数据
新环境会随 Blog 模块插入少量演示数据,包含 2 个分类、2 个标签和 2 篇已发布文章。它们用于让博客首页、分类、标签和文章详情在安装后立即有内容可看,数量刻意保持很少,方便管理员清理和替换。
这些数据使用稳定分类 / 标签编码和文章 slug。后台统一演示数据清理入口会把 Blog 注册为一个清理模块:清理前可预览目标分类、标签和文章,执行时必须提交模块编码、数据类型和确认短语;如果这些文章已经产生评论、点赞、收藏、单篇购买订单或内容处理记录,清理会被阻塞,避免误删真实互动数据。
公共只读接口
所有接口的 JSON 响应体使用 Result<T>。
GET /api/v1/blog/home
GET /api/v1/blog/articles
GET /api/v1/blog/articles/popular
GET /api/v1/blog/articles/{id}
GET /api/v1/blog/articles/{id}/related
GET /api/v1/blog/articles/path?path=/blog/articles/{slugOrId}
GET /api/v1/blog/articles/slug/{slug}
GET /api/v1/blog/sitemap
GET /api/v1/blog/sitemap.xml
GET /api/v1/blog/search/summary
GET /api/v1/blog/categories
GET /api/v1/blog/categories/{code}
GET /api/v1/blog/categories/{code}/articles
GET /api/v1/blog/tags
GET /api/v1/blog/tags/{code}
GET /api/v1/blog/tags/{code}/articles
GET /api/v1/blog/authors/{id}
GET /api/v1/blog/authors/{id}/articles
GET /api/v1/blog/articles/{id}/commentsGET /api/v1/blog/home 是 App / PC 首页聚合入口,一次返回精选文章、最新文章、分类和标签:
GET /api/v1/blog/home?featuredSize=5&latestSize=10返回字段:
| 字段 | 说明 |
|---|---|
featuredArticles | 推荐文章列表,只返回 featured=true 且已发布的文章 |
latestArticles | 最新已发布文章列表 |
categories | 已发布文章聚合出的分类,包含 displayName |
tags | 已发布文章聚合出的标签,包含 displayName |
分类页和标签页可以先查询元信息,再查询文章列表:
GET /api/v1/blog/categories/framework
GET /api/v1/blog/categories/framework/articles?page=1&size=10
GET /api/v1/blog/tags/java
GET /api/v1/blog/tags/java/articles?page=1&size=10分类 / 标签详情只返回已发布文章聚合出的可见项,字段包含 code、name、displayName 和 articleCount。
文章列表支持:
page=1
size=10
keyword=spring
categoryCode=framework
tagCode=java
authorId=100公共接口只返回已发布、未删除且发布时间不晚于当前时间的文章。
文章详情接口会记录一次阅读量;列表、分类、标签和作者聚合接口不会增加阅读量。
GET /api/v1/blog/articles/path 用于站点层直接按 sitemap 返回的 path 查询文章详情,例如 path=/blog/articles/hello-world。服务端会先按 slug 查询,未命中且路径末段是数字时再按文章 ID 兜底;该接口同样只返回已发布文章,并记录一次阅读量。
GET /api/v1/blog/sitemap 返回 JSON 站点地图条目,适合 App / PC / SSR 站点层组合导航;GET /api/v1/blog/sitemap.xml 返回 sitemap.org URL Set XML,支持传 baseUrl=https://example.com 生成绝对 URL,不传时沿用相对 path,便于前端或网关按部署域名拼接。
文章 VO 会返回 liked 和 favorited。未登录时两者均为 false;已登录时,公开列表、首页聚合、搜索摘要、热门 / 相关推荐、文章详情、我的文章和我的收藏都会按当前用户解析点赞 / 收藏状态,前端可以直接用于按钮高亮。
GET /api/v1/blog/me/articles 支持 status 筛选当前用户自己的文章。PC 账号内容页和 App 我的内容页都按后端真实状态筛选草稿、已发布和已下线文章,便于作者回看待维护内容,不在前端伪造不存在的审核状态。
文章 VO 同时返回 accessType、unlockPrice、unlockCurrency、vipItemCode、paidPreview、unlockRequired、contentLocked、contentReadable、memberDiscountItemCode、memberDiscountRate、memberDiscountEligible 和 memberDiscountPackageCode。free 文章直接返回全文;member / vip / paid 文章在未解锁时会把 content 裁剪为 paidPreview,并由 PC / App 阅读页展示会员权益、VIP 或单篇付费提示,列表卡片也会展示付费价格、会员 / VIP 权益码或需解锁标识。标准应用装配已通过 Entitlement ContentAccessPolicyService 查询 active 内容解锁凭证,并用 vipItemCode 匹配权益套餐项 code(兼容 packageCode)解锁会员 / VIP 文章;单篇付费文章可通过购买订单解锁,订单支付成功结果或收银台回调都会把购买单标记为 paid。作者发布或编辑 paid 文章时可额外配置 memberDiscountItemCode 和 memberDiscountRate,读侧会在文章仍需购买且当前用户命中对应折扣权益时返回 memberDiscountEligible=true,PC / App 详情页展示可享会员价提示;最终购买金额、折扣计算、订单状态和退款仍由 Blog 单篇购买 / Cashier 链路确认,Entitlement 只提供折扣资格决策,不直接写订单。App / PC 详情页已提供真实单篇购买和订阅购买 / 续费入口,创建订单后会展示订单号、应付金额、支付状态、支付截止时间和收银台 payload 可用提示;Admin 文章页可配置付费字段、查看单篇购买订单、订阅订单和收益摘要。退款回调或后台登记退款失效会把订单标记为 refunded,读侧只认 paid 单篇购买订单和 active 中性权益,因此退款后会撤销正文解锁。
单篇付费购买接口需要登录:
POST /api/v1/blog/articles/{id}/purchases请求体可传支付渠道和 H5 / App 支付场景:
{
"paymentProvider": "mock",
"paymentScene": "page",
"clientIp": "127.0.0.1",
"notifyUrl": "https://example.com/pay/notify",
"returnUrl": "https://example.com/blog/articles/9",
"remark": "购买付费文章"
}接口会创建 blog_article_purchase_order,同步在收银台登记 scene=blog-article 的支付订单,并调用 Payment Provider 发起支付。返回的购买订单包含 orderNo、status、paymentProvider、paymentStatus、paymentPayload、paidAt 和 payDeadlineAt;只有 status=paid 的购买单会让文章详情返回全文。Provider 直接返回 success 时会立即解锁;异步支付以收银台支付成功回调为权威来源,回调会通过 blog-article 场景 handler 标记购买单已支付。收银台退款回调会通过同一场景把购买单标记为 refunded,后台也可以手动登记退款失效。
Blog 订阅套餐计划接口不要求登录,可在 VIP 锁定态按文章 vipItemCode 或套餐编码读取展示价格和周期:
GET /api/v1/blog/subscriptions/plan?packageCode=blog.vip.read返回示例:
{
"packageId": 3,
"packageCode": "blog.vip.pro",
"packageName": "Blog Pro",
"description": "Blog VIP package",
"durationDays": 30,
"payableAmount": 29.9,
"currency": "CNY"
}packageCode 可直接传 Entitlement 套餐编码,也可传文章 vipItemCode 指向的套餐项编码。服务端优先读取 Entitlement 套餐 remark 中的 JSON 快照字段:durationDays、payableAmount(兼容 amount / price)和 currency;未配置时使用默认 30 天、CNY 29.90。App / PC 详情页会先读取该计划,再按计划金额和周期创建订阅订单,避免前端写死套餐价格。
Blog 订阅购买 / 续费接口需要登录:
POST /api/v1/blog/subscriptions/orders请求体传入中性 Entitlement 套餐或套餐项编码,以及本次购买快照:
{
"packageCode": "blog.vip.pro",
"durationDays": 30,
"payableAmount": 29.9,
"currency": "CNY",
"renew": true,
"paymentProvider": "mock",
"paymentScene": "page",
"returnUrl": "https://example.com/blog/articles/9",
"remark": "订阅 Blog VIP"
}packageId 与 packageCode 二选一;packageCode 可直接传 Entitlement 套餐编码,也可传文章 vipItemCode 指向的套餐项编码,服务端会反查包含该套餐项的启用套餐。durationDays、payableAmount 和 currency 是下单快照,调用方可显式传入,也可省略让服务端按订阅套餐计划补齐。接口会创建 blog_subscription_order,同步登记 scene=blog-subscription 的收银台订单并发起支付。支付成功会按 renew 自动购买或续费 consumer=blog 的中性权益套餐,订单返回 orderNo、orderType、entitlementId、status、paymentPayload、paidAt 和权益有效期;App / PC 详情页会在 VIP 锁定态调用该接口,支付成功后刷新文章详情。
搜索聚合接口用于搜索页和内容发现侧栏:
GET /api/v1/blog/search/summary?keyword=spring&articleSize=5&facetSize=10返回字段:
| 字段 | 说明 |
|---|---|
keyword | 规范化后的搜索词,未传时为 null |
total | 匹配的已发布文章总数 |
articles | 推荐展示的匹配文章,按搜索相关度和互动热度排序 |
categories | 匹配结果中的分类分面,包含 displayName 和文章数 |
tags | 匹配结果中的标签分面,包含 displayName 和文章数 |
authors | 匹配结果中的作者分面和文章数 |
keyword 会匹配标题、slug、摘要、正文、分类、标签和作者快照;未传关键字时聚合全部已发布文章。articleSize 范围为 1 到 20,默认 5;facetSize 范围为 1 到 50,默认 10。该接口是 Blog 模块自己的轻量聚合 contract,不替代全站搜索模块。
热门和相关文章用于首页侧栏、详情页推荐和移动端推荐卡片:
GET /api/v1/blog/articles/popular?size=10
GET /api/v1/blog/articles/{id}/related?size=6popular 按阅读、点赞、收藏和评论计数综合排序;related 优先按同分类、共享标签和同作者计算相似度,不足时用热门文章补齐。size 范围为 1 到 50,默认 10。两个接口都只返回公开已发布文章,不增加阅读量。
站点地图条目用于前端 SSR、站点层 sitemap.xml 或 SEO 采集任务:
GET /api/v1/blog/sitemap?size=200返回已发布文章的 path、slug、标题、SEO 标题 / 描述、发布时间和更新时间。path 默认使用 /blog/articles/{slug},没有 slug 时回退到文章 ID。size 范围为 1 到 1000,默认 200。该接口只返回条目数据,不绑定具体域名;最终绝对 URL 由前端或站点层按当前部署域名拼接。
用户创作与互动接口
以下接口需要登录:
GET /api/v1/blog/me/articles
GET /api/v1/blog/me/articles/{id}
GET /api/v1/blog/me/articles/{id}/moderation-records
POST /api/v1/blog/articles
PUT /api/v1/blog/articles/{id}
DELETE /api/v1/blog/articles/{id}
POST /api/v1/blog/articles/{id}/comments
POST /api/v1/blog/articles/{id}/purchases
PUT /api/v1/blog/comments/{id}
DELETE /api/v1/blog/comments/{id}
GET /api/v1/blog/me/comments
GET /api/v1/blog/me/comments/{id}
GET /api/v1/blog/me/comments/{id}/moderation-records
POST /api/v1/blog/articles/{id}/likes
DELETE /api/v1/blog/articles/{id}/likes
POST /api/v1/blog/articles/{id}/favorites
DELETE /api/v1/blog/articles/{id}/favorites
GET /api/v1/blog/me/likes
GET /api/v1/blog/me/favorites发文和编辑复用文章保存 DTO。服务端会强制使用当前登录用户作为作者,前端传入的 authorId 不会决定文章归属。
文章保存 DTO 支持 accessType、unlockPrice、unlockCurrency、vipItemCode 和 paidPreview。accessType 为空时按 free 处理;paid 文章必须提供非负 unlockPrice,币种为空时默认 CNY;vipItemCode 仅在 vip 场景保留。
GET /api/v1/blog/me/articles/{id} 可以读取当前用户自己的文章、草稿或被下线内容,用于跨设备继续编辑。文章 VO 会返回 createdAt 和 updatedAt;其中 updatedAt 是当前第一阶段的冲突判断依据:前端保存草稿前应对比本地编辑开始时的 updatedAt 和最新详情中的 updatedAt;如果不一致,应提示用户合并或覆盖。后续如果编辑协作复杂度上来,再引入显式乐观锁字段或草稿版本表。
GET /api/v1/blog/me/articles/{id}/moderation-records 只允许读取当前用户自己文章的处理记录,可用于展示审核原因、下线原因和状态流转说明。
GET /api/v1/blog/me/comments/{id} 只允许读取当前用户自己的评论,可用于回看隐藏、待处理或历史评论内容;公开文章评论列表仍只返回可见评论。
PUT /api/v1/blog/comments/{id} 只允许更新当前用户自己的评论内容。更新后会重新走内容安全检测:通过后保持公开,需要复核则转为隐藏,被拒绝则阻断保存;文章评论数会按公开 / 隐藏状态变化自动修正。
GET /api/v1/blog/me/comments/{id}/moderation-records 只允许读取当前用户自己评论的处理记录,可用于展示评论被隐藏、恢复或删除等后台处理原因。
评论创建服务内部可接入 blog.comment.save Pipeline 做短同步前置检查,包括命令规范化、已发布文章校验、父评论归属校验和内容安全检测结果传递;最终事务、评论落库和公开评论计数仍由 Blog Service 控制。未启用 Pipeline starter 或对应流程关闭时,评论创建会保持原有直接校验路径。
文章状态:
| 值 | 说明 |
|---|---|
0 | 草稿 |
1 | 已发布 |
2 | 已下线 |
点赞和收藏接口保持幂等:重复点赞 / 收藏不会重复增加计数,重复取消不会报错。
GET /api/v1/blog/me/likes 和 GET /api/v1/blog/me/favorites 分别返回当前用户点赞和收藏过的已发布文章,文章 VO 同样包含 liked / favorited,方便用户中心或个人互动页直接渲染状态。
互动通知
评论、点赞和收藏会在事务提交后发布领域事件,并经通知规则链路通知文章作者:
| 规则编码 | 触发 | 默认收件人 |
|---|---|---|
blog.comment.created | 文章收到新评论 | 文章作者(评论者本人除外) |
blog.article.liked | 文章收到点赞 | 文章作者(点赞者本人除外) |
blog.article.favorited | 文章收到收藏 | 文章作者(收藏者本人除外) |
互动类通知与运营向通知不同:默认渠道为站内信(database),文章作者零配置即可收到;后台通知规则配置的收件人在作者基础上叠加(用于内容运营关注互动),规则禁用后整体静默。blog.article.published 仍为运营向规则,默认无收件人。
后台管理接口
文章管理:
GET /api/v1/admin/blog/articles
GET /api/v1/admin/blog/articles/export
GET /api/v1/admin/blog/articles/review-queue-summary
GET /api/v1/admin/blog/articles/{id}
POST /api/v1/admin/blog/articles
PUT /api/v1/admin/blog/articles/{id}
PUT /api/v1/admin/blog/articles/{id}/review-assignment
PUT /api/v1/admin/blog/articles/{id}/status
PUT /api/v1/admin/blog/articles/{id}/featured
DELETE /api/v1/admin/blog/articles/{id}
DELETE /api/v1/admin/blog/articles文章分页支持 keyword、categoryCode、tagCode、authorId、status、featured、reviewAssigneeId 过滤。文章导出接口复用同一组后台列表筛选条件,返回 text/csv;charset=UTF-8 附件,字段包含文章 ID、slug、标题、摘要、阅读权限、分类、标签、作者、状态、推荐、发布时间、互动计数、SEO 和创建 / 更新时间;导出不包含正文内容,避免绕过付费 / 会员 / VIP 阅读权限。待审摘要接口统计草稿和内容安全降级草稿,Admin 文章页可一键切到草稿队列处理;审核分派接口只维护文章上的审核责任快照,并同步写入 review_assign 内容处理记录,便于后续按责任人追踪处理链路;状态接口可用于审核通过、草稿回退和下线;推荐接口只维护推荐开关,不改变文章发布状态。
单篇付费订单运营:
GET /api/v1/admin/blog/article-purchases
GET /api/v1/admin/blog/article-purchases/revenue-summary
POST /api/v1/admin/blog/article-purchases/{orderNo}/refund-invalidate订单列表支持按 articleId、userId、status、paymentStatus、paymentProvider、startedAt 和 endedAt 筛选;收益摘要返回净收入、已支付订单数、退款失效订单数、付费用户数和付费文章数。refund-invalidate 会把已支付订单置为 refunded 并同步支付状态,适合支付渠道退款后由运营补登记;读侧只认 paid 订单,登记后文章会重新变为锁定状态。
订阅订单运营:
GET /api/v1/admin/blog/subscriptions/orders
GET /api/v1/admin/blog/subscriptions/orders/revenue-summary
POST /api/v1/admin/blog/subscriptions/orders/{orderNo}/refund-invalidate
POST /api/v1/admin/blog/subscriptions/orders/{orderNo}/expire?remark=manual订阅订单列表支持按 orderNo、userId、packageId、packageCode、entitlementId、orderType 和 status 筛选;packageCode 过滤兼容文章 vipItemCode 指向的套餐项编码,会同时命中对应 Entitlement 套餐编码下的订阅订单。收益摘要返回订阅毛收入、退款金额、净收入、已支付订单数、退款失效订单数、到期订单数、订阅用户数和权益数。refund-invalidate 会把订阅订单置为 refunded 并取消对应中性权益;expire 会把订阅订单置为 expired 并同步到期对应权益,用于运维侧处理到期补偿或异常状态修正。
状态处理请求可以附带处理原因:
{
"status": 2,
"publishedAt": null,
"reason": "content_policy",
"content": "内容不符合发布规范"
}状态处理会写入内容处理记录,便于后台回溯谁在什么时候处理了哪篇文章或哪条评论。
评论管理:
GET /api/v1/admin/blog/comments
GET /api/v1/admin/blog/comments/{id}
PUT /api/v1/admin/blog/comments/{id}
DELETE /api/v1/admin/blog/comments/{id}
DELETE /api/v1/admin/blog/comments评论分页支持 articleId、userId、status 过滤。评论状态:
| 值 | 说明 |
|---|---|
1 | 已发布 |
2 | 已隐藏 |
隐藏已发布评论会扣减文章公开评论计数;重新发布会恢复计数。删除隐藏评论不会重复扣减。
评论处理请求同样可以附带 reason、content 和 extraJson,后端会记录到内容处理记录。
分类管理:
GET /api/v1/admin/blog/categories
GET /api/v1/admin/blog/categories/{id}
POST /api/v1/admin/blog/categories
PUT /api/v1/admin/blog/categories/{id}
DELETE /api/v1/admin/blog/categories/{id}
DELETE /api/v1/admin/blog/categories分类分页支持 keyword、status 过滤。分类编码 code 全局唯一,前端保存文章时可以写入 categoryCode 和 categoryName 快照。
标签管理:
GET /api/v1/admin/blog/tags
GET /api/v1/admin/blog/tags/{id}
POST /api/v1/admin/blog/tags
PUT /api/v1/admin/blog/tags/{id}
POST /api/v1/admin/blog/tags/{id}/merge
DELETE /api/v1/admin/blog/tags/{id}
DELETE /api/v1/admin/blog/tags标签分页支持 keyword、status 过滤。标签编码 code 全局唯一,文章可保存多个标签编码和名称快照。合并接口使用已有 blog:tag:update 权限,将源标签合并到目标标签:历史文章的 tag_codes / tag_names 会精确重算并去重,源标签随后删除;若 Blog 已接入 Knowledge 来源刷新,合并会发布来源级更新信号,便于后续索引刷新。
内容处理记录:
GET /api/v1/admin/blog/moderation-records
GET /api/v1/admin/blog/moderation-records/export
GET /api/v1/admin/blog/moderation-records/{id}
DELETE /api/v1/admin/blog/moderation-records/{id}
DELETE /api/v1/admin/blog/moderation-records处理记录分页支持:
| 参数 | 说明 |
|---|---|
targetType | article 或 comment |
targetId | 文章 ID 或评论 ID |
operatorId | 后台处理人用户 ID |
assigneeId | 审核分派责任人用户 ID |
operationDomain | 操作域,Blog 模块写入 blog |
action | status_update 或 review_assign |
statusBefore | 处理前状态,文章为 0 草稿、1 已发布、2 已下线;评论为 1 已发布、2 已隐藏 |
statusAfter | 处理后状态,便于筛选下线、隐藏、审核通过等处理结果 |
处理记录只负责留痕,不直接决定文章或评论是否公开;文章和评论是否公开仍由各自状态字段决定。 处理记录导出接口复用同一组筛选条件,返回 text/csv;charset=UTF-8 附件,字段包含记录 ID、目标类型、目标 ID、处理人、审核责任人、分派人、分派时间、操作域、动作、处理前后状态、原因和创建 / 更新时间;导出不包含处理正文 content 或扩展 JSON,避免把内部处理材料混入运营清单。
权限标识:
blog:article:view
blog:article:create
blog:article:update
blog:article:delete
blog:category:view
blog:category:create
blog:category:update
blog:category:delete
blog:tag:view
blog:tag:create
blog:tag:update
blog:tag:delete
blog:moderation:view
blog:moderation:delete
blog:comment:view
blog:comment:update
blog:comment:delete与前端视图联动
PC / App 视图可以接入:
GET /api/v1/blog/articles
GET /api/v1/blog/articles/{id}
GET /api/v1/blog/categories
GET /api/v1/blog/tags
GET /api/v1/blog/authors/{id}
GET /api/v1/blog/me/articles
GET /api/v1/blog/me/favorites
POST /api/v1/blog/articles/{id}/comments
POST /api/v1/blog/articles/{id}/likes
POST /api/v1/blog/articles/{id}/favorites首页文章流、文章详情页、作者主页、分类 / 标签筛选、发文页、我的文章、我的收藏和文章详情互动都可以直接使用这些接口。
后续方向
- 更细违规处理策略和跨模块统一内容运营工作台。
- 作者主页扩展和创作统计。