新闻通知接口(数据库,DTO,列表,详情和上一条下一条)

作为实习生的我现在开始跟进新项目啦,当然分到的部分难度不会太大。很激动很新奇也很忐忑,但是幸好运气不错,大家都在帮助我的成长,但是在进行中遇到了不少的麻烦,在此记录,算是记录自己程序猿的成长之路。
我负责的模块是新闻通知模块,主要接口分为三块:新闻列表,新闻详情和上一条下一条。在编写接口文档的时候,列表和详情的实现难度不大但是在上一条和下一条的实现中,我遇到了问题。如下
这里写图片描述
在我的认知里这几个内容应该抽象在一个model里,但是在导师他们的眼里这是几个不同的model,所以啊我就百思不得其解,怎么也想不通,最后我还是按着自己的想法走,毕竟每个人的思路都不同嘛,只要能满足需求就成。
贴一下数据库设计,一张表的事儿:

CREATE TABLE `s_affiches` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `institution_id` int(11) DEFAULT NULL COMMENT '机构id',
  `affiche_type` int(11) DEFAULT NULL COMMENT '公告类别,1新闻资讯,2通知公告',
  `affiche_title` varchar(128) DEFAULT NULL COMMENT '标题',
  `affiche_source` varchar(128) DEFAULT NULL COMMENT '来源',
  `affiche_author` varchar(128) DEFAULT NULL COMMENT '作者',
  `cover_id` int(11) DEFAULT NULL COMMENT '封面id,关联课程封面表',
  `cover_url` varchar(512) DEFAULT NULL COMMENT '封面地址,冗余',
  `show_time` datetime DEFAULT NULL COMMENT '发布时间',
  `affiche_summary` varchar(512) DEFAULT NULL COMMENT '简介',
  `affiche_content` varchar(3096) DEFAULT NULL COMMENT '内容',
  `creator_id` int(11) DEFAULT NULL COMMENT '创建者id',
  `creator_name` varchar(64) DEFAULT NULL COMMENT '创建者名称,冗余',
  `view_count` int(11) NOT NULL DEFAULT '0' COMMENT '浏览次数',
  `if_display` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否显示,1显示,0不显示',
  `show_status` int(11) NOT NULL DEFAULT '1' COMMENT '发布状态,1草稿,3已发布,',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `delete_time` varchar(32) NOT NULL DEFAULT '' COMMENT '删除时间',
  PRIMARY KEY (`id`),
  KEY `institution_id` (`institution_id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='新闻公告表:包括新闻和公告信息';

需求是这样的:
上一条和下一条跟详情是处于同一页面,并且包含标题信息,如果没有上一条和下一条的时候要有标记。新闻的顺序按show_time发布时间倒序排序(这里不考虑置顶的新闻),然后同一时间发布的按照id倒序排序(id越大说明创建越迟新闻越新嘛)。(好像很简单的样子。。。)
那么接口的入参是什么呢,既然要上一条和下一条要有相应的title和id放进DTO里,在此我有两个想法:
1.在猜想里,所有的详情都是在从一个列表(不管是首页列表,分页列表还是搜索列表)里面点进入的,既然为了把本条上下条绑在一起,为什么不直接把整个列表作为参数放进去,然后超出列表范围的时候,再通过页码pageNum和页大小pageSize去更换列表,从而去到相邻的上一条下一条的信息。这里的重点在于要让前端把这个列表存下来,对实习生的我来说,好像难以实现,所以放弃。
2.入参就是afficheId,然后这些条件放在sql里面处理,本条的一个sql(简单),上一条的一个sql,下一条的一个sql,然后三个结果集放进一个DTO里面。那么重点来了sql怎么写呢!我真的折腾了很久(sql比较菜),然后折腾出来了,但是很开心啊!
贴一下我的 DTO:

/**
 * 新闻公告模型
 */
public class AfficheInfoModel implements Serializable {

    //序列化
    private static final long serialVersionUID = -7570448621521713652L;

    private Integer id;
    //上一条ID
    private Integer preAfficheId;
    //下一条ID
    private Integer nextAfficheId;
    //上一条标题
    private String preAfficheTitle;
    //下一条标题
    private String nextAfficheTitle;
    //当前公告实体类
    private AfficheModel afficheModel;
    //是否有上一条,默认有
    private Boolean havePreAffiche = true;
    //是否有下一条,默认有
    private Boolean havaNextAffiche = true;
    //删除时间
    private String deleteTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeleteTime() {
        return deleteTime;
    }

    public void setDeleteTime(String deleteTime) {
        this.deleteTime = deleteTime;
    }

    public Integer getPreAfficheId() {
        return preAfficheId;
    }

    public void setPreAfficheId(Integer preAfficheId) {
        this.preAfficheId = preAfficheId;
    }

    public Integer getNextAfficheId() {
        return nextAfficheId;
    }

    public void setNextAfficheId(Integer nextAfficheId) {
        this.nextAfficheId = nextAfficheId;
    }

    public String getPreAfficheTitle() {
        return preAfficheTitle;
    }

    public void setPreAfficheTitle(String preAfficheTitle) {
        this.preAfficheTitle = preAfficheTitle;
    }

    public String getNextAfficheTitle() {
        return nextAfficheTitle;
    }

    public void setNextAfficheTitle(String nextAfficheTitle) {
        this.nextAfficheTitle = nextAfficheTitle;
    }

    public AfficheModel getAfficheModel() {
        return afficheModel;
    }

    public void setAfficheModel(AfficheModel afficheModel) {
        this.afficheModel = afficheModel;
    }

    public Boolean getHavePreAffiche() {
        return havePreAffiche;
    }

    public void setHavePreAffiche(Boolean havePreAffiche) {
        this.havePreAffiche = havePreAffiche;
    }

    public Boolean getHavaNextAffiche() {
        return havaNextAffiche;
    }

    public void setHavaNextAffiche(Boolean havaNextAffiche) {
        this.havaNextAffiche = havaNextAffiche;
    }
}

再贴一下我的dao层方法,这里有用到通用Mapper,毕竟单表嘛,但是我后面的sql用到了子查询,所以就很麻烦啊,就不用通用Mapper:

@Override
public AfficheInfoModel getAfficheByAfficheId(Integer afficheId) {

    afficheMapper.updateViewCount(afficheId);

    //通用Mapper查询符合本条信息的列表
    Example example = new Example(Affiche.class);
    Example.Criteria criteria = example.createCriteria();
    criteria.andEqualTo(DataConstants.ID,afficheId).andEqualTo(DataConstants.DELETE_TIME,DbConstants.NO_DEL_VAL);
    List<Affiche> list = afficheMapper.selectByExample(example);
    if (CollectionUtils.isEmpty(list)){
        return null;
    }
    //获得本条新闻通知对象
    AfficheModel afficheModel = ModelDataObjectUtil.do2model(list.get(0),AfficheModel.class);
    AfficheModel preAfficheModel = ModelDataObjectUtil.do2model(
            afficheMapper.selectPreAffiche(afficheModel),AfficheModel.class);
    AfficheModel nextAfficheModel = ModelDataObjectUtil.do2model(
            afficheMapper.selectNextAffiche(afficheModel),AfficheModel.class);

    //封装本条信息和上下条新闻通知信息
    AfficheInfoModel afficheInfoModel = new AfficheInfoModel();
    afficheInfoModel.setAfficheModel(afficheModel);

    if(preAfficheModel==null){
        afficheInfoModel.setHavePreAffiche(false);
    }else{
        afficheInfoModel.setPreAfficheId(preAfficheModel.getId());
        afficheInfoModel.setPreAfficheTitle(preAfficheModel.getAfficheTitle());
    }

    if(nextAfficheModel==null){
        afficheInfoModel.setHavaNextAffiche(false);
    }else{
        afficheInfoModel.setNextAfficheId(nextAfficheModel.getId());
        afficheInfoModel.setNextAfficheTitle(nextAfficheModel.getAfficheTitle());
    }
    return afficheInfoModel;
}

然后就到了我认为最难的sql部分

上一条sql:
<select id="selectPreAffiche" resultMap="BaseResultMap" parameterType="com.example.demo.affiche.facade.model.AfficheModel">
  SELECT id,affiche_title FROM s_affiches
  where(show_time = #{showTime} AND id > #{id} OR show_time > #{showTime})
  and  institution_id = #{institutionId}
  and affiche_type = #{afficheType}
  and if_display = 1
  and show_time <= NOW()
  and show_status = 3
  ORDER BY show_time asc, id asc
  LIMIT 1
</select>

下一条sql:
<select id="selectNextAffiche" resultMap="BaseResultMap" parameterType="com.example.demo.affiche.facade.model.AfficheModel">
  SELECT id,affiche_title FROM s_affiches
  where(show_time = #{showTime} AND id < #{id} OR show_time < #{showTime})
  and  institution_id = #{institutionId}
  and affiche_type = #{afficheType}
  and if_display = 1
  and show_time <= NOW()
  and show_status = 3
  ORDER BY show_time desc, id desc
  LIMIT 1
</select>

以上就是我的所有问题和思路了,也许在大家看来会很简单,毕竟是个才华有限青年。但是身为实习生的我们的确有在很努力地成长,也许很缓慢,但是我们都在向上啊。

猜你喜欢

转载自blog.csdn.net/qq_35174296/article/details/81355724