作为实习生的我现在开始跟进新项目啦,当然分到的部分难度不会太大。很激动很新奇也很忐忑,但是幸好运气不错,大家都在帮助我的成长,但是在进行中遇到了不少的麻烦,在此记录,算是记录自己程序猿的成长之路。
我负责的模块是新闻通知模块,主要接口分为三块:新闻列表,新闻详情和上一条下一条。在编写接口文档的时候,列表和详情的实现难度不大但是在上一条和下一条的实现中,我遇到了问题。如下
在我的认知里这几个内容应该抽象在一个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>
以上就是我的所有问题和思路了,也许在大家看来会很简单,毕竟是个才华有限青年。但是身为实习生的我们的确有在很努力地成长,也许很缓慢,但是我们都在向上啊。