文章与内容
文章(Article)是 CmsKit 的核心长内容形态:Markdown 正文、分类(Classify)、频道(Channel)、草稿(Draft)、定时发布、置顶、AI 提取 SEO,并自动同步到 MeiliSearch 供检索。
文章(ArticleController,/api/cms/articles)
核心服务
IArticleService:文章的 CRUD 与查询。CreateAsync/UpdateAsync/DeleteAsync/GetAsync、GetQueryArticleListAsync(支持缓存的列表查询)、GetHotRankArticleListAsync(日/周/月/总榜)、GetMyArticleListAsync、GetSubscribeArticleAsync(我关注的人发布的)、UpdateCommentableAsync、UpdateClassify、UpdateArticleClassifySortAsync、SetStickieAsync、ExtractSeoAsync。IArticleManager:领域层文章管理(审核状态流转等)。IArticleMeiliSearchService:对 MeiliSearch 文章索引的检索(GetQueryArticleListAsync、SearchArticlesAsync)。
HTTP API
| 方法 | 路由 | 说明 |
|---|---|---|
| GET | /query(AllowAnonymous) | 已审核文章分页列表(带缓存) |
| GET | /hot-rank-article-list(AllowAnonymous) | 热门排行榜(日/周/月/总) |
| GET | /{id}(AllowAnonymous) | 文章详情 |
| POST | / | 发布文章(CreateUpdateArticleReq) |
| PUT | /{id} | 更新文章 |
| DELETE | /{id} | 删除文章 |
| GET | /my | 我的文章 |
| GET | /subscribe | 我关注的人的文章 |
| PUT | /{id}/comment-able/{commentable} | 开关是否允许评论 |
| PUT | /update-classify/{id} | 更新文章所属分类 |
| PUT | /update-article-classify-sort | 批量更新某分类下文章排序 |
| PUT | /set-stickie | 置顶/取消置顶(SetStickieReq) |
| GET | /query-by-meili(AllowAnonymous) | 走 MeiliSearch 检索文章 |
| GET | /search-articles(AllowAnonymous) | 关键词检索文章(keyword/page/pageSize/category) |
| POST | /{id}/extract-seo | AI 提取 SEO(关键词/摘要/标签,需作者或 CmsKit.Articles.ExtractSeo) |
开发示例
// 发布文章
var article = await _articleService.CreateAsync(new CreateUpdateArticleReq
{
Title = "Hello CmsKit",
Content = "# Markdown...",
ClassifyId = classifyId,
Commentable = true
});
// 用 MeiliSearch 检索
var docs = await _articleEsService.SearchArticlesAsync("cmskit", page: 1, pageSize: 20);
// 置顶
await _articleService.SetStickieAsync(new SetStickieReq { Id = article.Id, Stickie = true });
# 关键词检索
curl "https://localhost:5000/kit_api/api/cms/articles/search-articles?keyword=cmskit&page=1&pageSize=20"
文章草稿(ArticleDraftController,/api/cms/articles/draft)
草稿与正式文章分离(IArticleDraftService),用于编辑器自动保存,不影响线上。
| 方法 | 路由 | 说明 |
|---|---|---|
| GET | / | 草稿分页列表 |
| GET | /{id} | 草稿详情 |
| GET | /last | 最近一次草稿 |
| POST | / | 新建/保存草稿(返回草稿 Id) |
| PUT | /{id} | 覆盖更新草稿 |
| DELETE | /{id} | 删除草稿 |
| POST | /format-md-picture | 处理 Markdown 中的图片(如转存/格式化) |
定时发布(ArticleScheduledController,/api/cms/article)
通过领域事件在到点后自动发布(IArticleManager / 仓储直接驱动)。
| 方法 | 路由 | 说明 |
|---|---|---|
| POST | /{articleId}/schedule | 设定定时发布时间(DateTime body) |
| POST | /{articleId}/cancel-schedule | 取消定时发布 |
| GET | /scheduled/list | 待发布列表 |
频道(ChannelController)
频道用于内容导航分组。用户端只读,管理端可维护。
用户端 /api/cms/channels
| 方法 | 路由 | 说明 |
|---|---|---|
| GET | /nav | 导航用频道列表 |
| GET | /detail | 频道详情 |
| GET | /{id} | 频道详情(按 Id) |
管理端 /api/cms/admin/channels(需 CmsKit.Channels.*)
| 方法 | 路由 | 说明 |
|---|---|---|
| GET | / | 列表 |
| POST | / | 新建 |
| PUT | /{id} | 更新 |
| DELETE | /{id} | 删除 |
分类(ClassifyController)
分类挂在文章上。用户端可查,管理端可维护。
用户端 /api/cms/classifies
| 方法 | 路由 | 说明 |
|---|---|---|
| GET | / | 分类列表 |
| GET | /{id} | 分类详情 |
管理端 /api/cms/admin/classifies(需 CmsKit.Classifies.*)
| 方法 | 路由 | 说明 |
|---|---|---|
| POST | / | 新建 |
| PUT | /{id} | 更新 |
| DELETE | /{id} | 删除 |
HTML → Markdown(Html2MdController,/api/cms/html2md)
把外部网页/富文本转为 Markdown,便于导入文章(Html2MdService)。
| 方法 | 路由 | 说明 |
|---|---|---|
| POST | /(AllowAnonymous) | 按 URL 抓取并转 Markdown(Html2Request) |
| POST | /getMdFile(AllowAnonymous) | 直接传入 HTML 文本返回 Markdown(GetMdFileRequest) |
curl -X POST https://localhost:5000/kit_api/api/cms/html2md/getMdFile \
-H "Content-Type: application/json" \
-d '{"html":"<h1>标题</h1><p>正文</p>"}'