2021SC@SDUSC
前言
在前文中我谈到了 module-article
模块下的 Controller 模块,并就其中的 _ArticleController
做了详细分析,本文将继续对与 _ArticleController
同级的 Controller 进行分析。
上文说到,_ArticleController
位于 io.jpress.module.article.controller.admin
包下,与其同级的还有 _ArticleCommentController
、_MarkdownImport
、_WechatArticleImport
、_WordpressImport
,其中后三个 Controller 主要是调用外部应用的 API,因此重点在于前文的 _ArticleController
和本文即将分析的 _ArticleCommentController
。
_ArticleCommentController
基本结构
该类是管理员对全局评论进行操控的类,与 _ArticleController
类似,顺着该类的继承链,我们最终可以得知其来自于 JFinal 框架下的核心类 Controller
。
@RequestMapping(value = "/admin/article/comment", viewPath = JPressConsts.DEFAULT_ADMIN_VIEW)
public class _ArticleCommentController extends AdminControllerBase {}
静态常量与成员变量
@Inject
private ArticleCommentService commentService;
ArticleCommentService
类已经在前文介绍过,是与文件评论相关的 Service 模块。
评论查询
//io.jpress.module.article.controller.admin._ArticleCommentController.list()
@AdminMenu(text = "评论", groupId = "article", order = 5)
public void list() {
String status = getPara("status");
Columns columns = Columns.create()
.eq("article_id", getParaToLong("articleId"))
.eq("user_id", getParaToLong("userId"))
.likeAppendPercent("content", getPara("keyword"));
Page<ArticleComment> page =
StrUtil.isBlank(status)
? commentService._paginateWithoutTrash(getPagePara(), getPageSizePara(), columns)
: commentService._paginateByStatus(getPagePara(), getPageSizePara(), columns, status);
setAttr("page", page);
long unauditedCount = commentService.findCountByStatus(ArticleComment.STATUS_UNAUDITED);
long trashCount = commentService.findCountByStatus(ArticleComment.STATUS_TRASH);
long normalCount = commentService.findCountByStatus(ArticleComment.STATUS_NORMAL);
setAttr("unauditedCount", unauditedCount);
setAttr("trashCount", trashCount);
setAttr("normalCount", normalCount);
setAttr("totalCount", unauditedCount + trashCount + normalCount);
render("article/comment_list.html");
}
注解 @AdminMenu
用于给 Controller 的方法进行标注,申明此方法为一个后台菜单方法。
而 list()
方法中的写法来自 JFinal 框架的 Action,并使用了 get
/ getPara
系列方法,获取或设置了大量与文章相关的参数,最后返回 article/comment_list.html
。 整体样式与 _ArticleController
中的 list()
方法相差无几。
删除评论
public void doDel() {
Long id = getParaToLong("id");
commentService.deleteById(id);
renderOkJson();
}
@EmptyValidate(@Form(name = "ids"))
public void doDelByIds() {
Set<String> idsSet = getParaSet("ids");
render(commentService.deleteByIds(idsSet.toArray()) ? OK : FAIL);
}
该 Controller 共提供了两种删除评论的方法,doDel()
是删除单个评论的方法,而 doDelByIds()
是批量删除评论的方法。
doDel()
方法是直接获取了请求中的 id
参数,接着调用了 commentService
类中通过 id 删除评论的方法,最后返回一个成功删除的 Json;而 doDelByIds()
则是通过一个取集合的方式读出所有 id,并通过调用与 doDel()
相同的方法通过 id 逐个删除,最后生成一个 Array 并返回。
注解 @EmptyValidate
定义在 io.jboot.web.validate
包下,是 JBoot 框架用于在 Controller 的方法没有参数时添加并可进行验证的方式。
Controller
上文说到,module-article
模块的 Controller 共有四个部分,现在已经介绍完了 admin
部分,接下来我们介绍 api
部分。
api
api
部分一共有 3 个类,分别是 ArticleApiController
、ArticleCategoryApiController
、ArticleCommentApiController
,三个类都是对外开放的对文章进行处理的接口,以查询为主。
我们首先来看 ArticleApiController
。
ArticleApiController
基本结构
@RequestMapping("/api/article")
@Api("文章相关API文档")
public class ArticleApiController extends ApiControllerBase {}
该类是与文章相关的接口,继承自 ApiControllerBase
,与前文的相同,而注解 @Api
用于帮助开发者自动生成 API 文档。
方法结构
通过观察可以得知,该 Controller 包括后续要分析的 ArticleCategoryApiController
和 ArticleCommentApiController
的代码大多数都是调用底层框架的方法,没有多少原创代码,所以这里我挑选了一个比较具有代表性的方法进行分析。
//io.jpress.module.article.controller.api.ArticleApiController.listByFlag()
@ApiOper("根据文章的 flag 查找文章列表")
@ApiResp(field = "list", notes = "文章列表", dataType = List.class, genericTypes = Article.class)
public Ret listByFlag(@ApiPara("文章标识") @NotEmpty String flag
, @ApiPara(value = "是否必须要图片", notes = "true 必须有图片,false 必须无图片") Boolean hasThumbnail
, @ApiPara("排序方式") String orderBy
, @ApiPara("查询数量") @DefaultValue("10") int count) {
Columns columns = Columns.create("flag", flag);
if (hasThumbnail != null) {
if (hasThumbnail) {
columns.isNotNull("thumbnail");
} else {
columns.isNull("thumbnail");
}
}
List<Article> articles = articleService.findListByColumns(columns, orderBy, count);
return Ret.ok().set("list", articles);
}
注解 @ApiOper
目的是给 Controller 的方法进行配置,注解 @ApiResp
是给 Controller 的 Render 内容进行配置,注解 @ApiPara
是给 Controller 的参数进行配置,其目的都是为了生成 API 文档。
解析后首先调用配置文件中的内容进行一轮判断,最后通过 Service 调用方法获取数据库中的内容并返回。
结语
本文分析了 module-article
模块中的 Controller admin
和 api
,因为代码大部分都一致,所以代码分析不多。下面的文章将对 front
和 ucenter
进行分析。