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

2021SC@SDUSC

上篇文章分析了代码模块module-page的架构以及它的第一个子模块module-page-model,本篇文章将分析:

  • 子模块module-page-service、model-page-service-provider的概述。
  • 接口类SinglePageService,实现类SinglePageServiceProvider。
  • 因篇幅原因,下篇文章将对两个子模块中未分析的类进行代码分析。

目录

1. module-page-service、model-page-service-provider概述

2. 所需依赖

2.1 module-page-service

2.2 model-page-service-provider

3.接口类SinglePageService.java

4.实现类SinglePageServiceProvider.java

5.补充:SEO

6.总结


1. module-page-service、model-page-service-provider概述

  • module-page-service是一个写接口的包,包含SinglePageService与SinglePageCommentService,是对单个页面、单条评论提供对应操作数据库的函数定义,如根据页面主键删除Model、新增或者更新 Model 数据等。
  • model-page-service-provider实现以上接口,给出接口内方法的具体实现。
  • model-page-service-provider除实现接口外,还在PageViewsCountUpdateTask类中,通过继承Runnable接口,计算每篇文章页面访问的数量。

2. 所需依赖

2.1 module-page-service

<dependencies>
        <dependency>
            <groupId>io.jboot</groupId>
            <artifactId>jboot</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-model</artifactId>
            <version>4.0</version>
        </dependency>
</dependencies>

module-page-service底层依赖jboot,而jboot是基于jfinal框架实现的。在下文中会具体提到使用这两个框架的相关函数。并且本模块需要用到上一篇文章中分析的module-page-model包,即实体类模块。

2.2 model-page-service-provider

<dependencies>

        <dependency>
            <groupId>io.jboot</groupId>
            <artifactId>jboot</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>jpress-core</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-model</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-service</artifactId>
            <version>4.0</version>
        </dependency>

    </dependencies>

因为model-page-service-provider为实现类,所以需要接口包module-page-service,还有核心操作代码jpress-core。

3.接口类SinglePageService.java

  • 该类继承自JbootServiceJoiner。
  • JbootServiceJoiner中最重要、使用得最频繁的是JbootModel。
  • JbootModel底层依赖JFinal的ActiveRecord,是JFinal最核心的组成成分,提供了除之前家烧的Model类外更为丰富的数据库操作功能。
import com.jfinal.plugin.activerecord.Page; //对页面操作
import com.jfinal.plugin.activerecord.Table; //对表操作
import com.jfinal.plugin.activerecord.Db; //对数据库操作
import com.jfinal.plugin.activerecord.Model;
  • 因此,JbootServiceJoiner可提供做种数据库表的单表、多表连接函数,例子如下。
public interface JbootServiceJoiner {
	<M extends JbootModel> Page<M> join(Page<M> page, String columnName);
	<M extends JbootModel> List<M> joinMany(List<M> models, String targetColumnName, String joinName, String[] attrs);
}
  • SinglePageService 通过使用JbootServiceJoiner的服务,定义对数据库增删改查的函数,例子如下。
/**
     * 根据 主键 查找 Model
     *
     * @param id
     * @return
     */
    SinglePage findById(Object id);
/**
     * 新增或者更新 Model 数据(主键值为 null 就新增,不为 null 则更新)
     *
     * @param model
     * @return 新增或更新成功后,返回该 Model 的主键值
     */
    Object saveOrUpdate(SinglePage model);
//页面状态管理
Page<SinglePage> _paginateByStatus(int page, int pagesize, String title, String status);

4.实现类SinglePageServiceProvider.java

  • SinglePageServiceProvider继承JbootServiceBase,使用其中的函数实现SinglePageService。
  • SinglePageServiceProvider实现SinglePageService,实现其中的具体函数。
  • JbootServiceBase中有DAO属性,为JbootModel类型,我们通过他来使用具体函数。
  • 以下介绍每个函数的用途,重要函数会贴详细代码展示。

通过文章id清除缓存。

public void deleteCacheById(Object id)

使用Db类的函数,通过id删除文章。buildInSqlPara可以构建sql的参数,并链接如前面的语句当中。不用我们固定传几个参数。

 @Override
    public boolean deleteByIds(Object... ids) {
        return Db.update("delete from single_page where id in  " + SqlUtils.buildInSqlPara(ids)) > 0;
    }

根据状态(草稿、发布、垃圾箱)标注页数。

    @Override
    public Page<SinglePage> _paginateByStatus(int page, int pagesize, String title, String status) {
				//创建一列,为文章的状态位
        Columns columns = Columns.create("status", status);
//如果状态位不为空,那就是已经在草稿、发布或者垃圾箱里
        if (StrUtil.isNotBlank(title)) {
//链接模糊查询
            columns.like("title", "%" + title + "%");
        }
//标识页数
        return DAO.paginateByColumns(page,
                pagesize,
                columns,
                "id desc");
    }

与上个函数相同作用,给出了在垃圾箱的页面编号。

  @Override
    public Page<SinglePage> _paginateWithoutTrash(int page, int pagesize, String title)

更改页面状态位。

    @Override
    public boolean doChangeStatus(long id, String status)

更改页面状态位的实现,Seomanager为对其核心关键词的优化。

    @Override
    public boolean update(SinglePage model) {
        boolean isSuccess = super.update(model);
        if (isSuccess && model.isNormal()) {
            SeoManager.me().ping(model.toPingData());
            SeoManager.me().baiduUpdate(model.getUrl());
        }
        return isSuccess;
    }

保存页面,用于对页面的修改,同时优化核心关键词。

    @Override
    public Object save(SinglePage model) {
        Object ret = super.save(model);
        if (ret != null && model.isNormal()) {
            SeoManager.me().ping(model.toPingData());
            SeoManager.me().baiduPush(model.getUrl());
        }
        return ret;
    }

文章为某一个状态位的计数,便于在页面显示。

    @Override
    public int findCountByStatus(String status) 

通过slug对文章进行查找,得到第一篇文章。

    @Override
    public SinglePage findFirstBySlug(String slug) {
        return DAO.findFirstByColumn(Column.create("slug", slug));
    }

通过flag对文章进行查找,得到文章列表。

    @Override
    public List<SinglePage> findListByFlag(String flag) 

 

计算每个页面的访客数量。通过调用PageViewsCountUpdateTask类中的recordCount方法来实现。

    @Override
    public void doIncViewCount(long id) {
        PageViewsCountUpdateTask.recordCount(id);
    }

5.补充:SEO

SEO的标准定义:Search Engine Optimization,汉译为搜索引擎优化。是指遵循搜索引擎的规则对网站内容进行优化,提升网站在搜索引擎内关键词搜索结果的自然排名,将自己品牌和产品的排名前移。

JPress发布时,在文章之中设置seo:

 

6.总结

本篇博客通过分析页面处理的接口类和实现类,了解到JPress如何运用JBoot、JFinal,通过Model类、Db+Record类等,进行多样、简洁的数据库操作方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值