<2021SC@SDUSC>博客(12)山东大学软件工程应用与实践JPress代码分析(十一)

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 部分。

image.png

api

api 部分一共有 3 个类,分别是 ArticleApiControllerArticleCategoryApiControllerArticleCommentApiController,三个类都是对外开放的对文章进行处理的接口,以查询为主。

我们首先来看 ArticleApiController

ArticleApiController

基本结构
@RequestMapping("/api/article")
@Api("文章相关API文档")
public class ArticleApiController extends ApiControllerBase {}

该类是与文章相关的接口,继承自 ApiControllerBase,与前文的相同,而注解 @Api 用于帮助开发者自动生成 API 文档。

方法结构

通过观察可以得知,该 Controller 包括后续要分析的 ArticleCategoryApiControllerArticleCommentApiController 的代码大多数都是调用底层框架的方法,没有多少原创代码,所以这里我挑选了一个比较具有代表性的方法进行分析。

//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 adminapi,因为代码大部分都一致,所以代码分析不多。下面的文章将对 frontucenter 进行分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值