第八章 项目实战

四、后台功能开发

2. 首页模块开发

2.1 查询首页分类
2.1.1 需求描述

  • 进入新闻首页,查询所有分类并动态展示新闻类别栏位
2.1.2 接口描述
  • url 地址:portal/findAllTypes

  • 请求方式:get

  • 请求参数:无

  • 响应数据:

    • 成功
    { "code":"200", "message":"OK" "data":{[{"tid":"1","tname":"新闻"},{"tid":"2","tname":"体育"},{"tid":"3","tname":"娱乐"},{"tid":"4","tname":"科技"},{"tid":"5","tname":"其他"}]}}
2.1.3 代码实现
  • controller
@RestController@RequestMapping("portal")@CrossOriginpublic class PortalController {@Autowiredprivate TypeService typeService;/** * 查询全部类别信息 * @return */@GetMapping("findAllTypes")public Result findAllTypes(){//直接调用业务层,查询全部数据List<Type> list = typeService.list();return Result.ok(list);}}
2.2 分类查询首页头条信息
2.2.1 需求描述

  • 客户端向服务端发送查询关键字,新闻类别,页码数,页大小
  • 服务端根据条件搜索分页信息,返回含页码数,页大小,总页数,总记录数,当前页数据等信息,并根据时间降序,浏览量降序排序
2.2.2 接口描述
  • url 地址:portal/findNewsPage
  • 请求方式:post
  • 请求参数:
{"keyWords":"马斯克", // 搜索标题关键字"type":0, // 新闻类型"pageNum":1,// 页码数"pageSize":10 // 页大小}
  • 响应数据:

    • 成功
    { "code":"200", "message":"success" "data":{"pageInfo":{"pageData":[{"hid":"1", // 新闻id"title":"小帽课堂宣布 ... ...", // 新闻标题"type":"1",// 新闻所属类别编号"pageViews":"40",// 新闻浏览量"pastHours":"3" ,// 发布时间已过小时数"publisher":"1"// 发布用户ID},{"hid":"1", // 新闻id"title":"小帽课堂宣布 ... ...", // 新闻标题"type":"1",// 新闻所属类别编号"pageViews":"40",// 新闻浏览量"pastHours":"3",// 发布时间已过小时数"publisher":"1"// 发布用户ID},{"hid":"1", // 新闻id"title":"小帽课堂宣布 ... ...", // 新闻标题"type":"1",// 新闻所属类别编号"pageViews":"40",// 新闻浏览量"pastHours":"3", // 发布时间已过小时数"publisher":"1"// 发布用户ID}],"pageNum":1,//页码数"pageSize":10,// 页大小"totalPage":20, // 总页数"totalSize":200 // 总记录数}}}
2.2.3 代码实现
2.2.3.1 准备条件实体类
@Datapublic class PortalVo {private String keyWords;private Integer type;private Integer pageNum = 1;private Integer pageSize = 10;}
2.2.3.2 controller
/** * 首页分页查询 * @return */@PostMapping("findNewPage")public Result findNewPage(@RequestBody PortalVo portalVo){Result result = headlineService.findNewPage(portalVo);return result;}
2.2.3.3 service
@Servicepublic class HeadlineServiceImpl extends ServiceImpl<HeadlineMapper, Headline>implements HeadlineService{@Autowiredprivate HeadlineMapper headlineMapper;/** * 首页数据查询 * @param portalVo * @return */@Overridepublic Result findNewPage(PortalVo portalVo) {//1.条件拼接 需要非空判断LambdaQueryWrapper<Headline> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(!StringUtils.isEmpty(portalVo.getKeyWords()),Headline::getTitle,portalVo.getKeyWords()).eq(portalVo.getType()!= null,Headline::getType,portalVo.getType());//2.分页参数IPage<Headline> page = new Page<>(portalVo.getPageNum(),portalVo.getPageSize());//3.分页查询//查询的结果 "pastHours":"3" // 发布时间已过小时数 我们查询返回一个map//自定义方法headlineMapper.selectPageMap(page, portalVo);//4.结果封装//分页数据封装Map<String,Object> pageInfo =new HashMap<>();pageInfo.put("pageData",page.getRecords());pageInfo.put("pageNum",page.getCurrent());pageInfo.put("pageSize",page.getSize());pageInfo.put("totalPage",page.getPages());pageInfo.put("totalSize",page.getTotal());Map<String,Object> pageInfoMap=new HashMap<>();pageInfoMap.put("pageInfo",pageInfo);// 响应JSONreturn Result.ok(pageInfoMap);}}
2.2.3.4 mapper
  • 接口
public interface HeadlineMapper extends BaseMapper<Headline> {//自定义分页查询方法IPage<Map> selectPageMap(IPage<Headline> page,@Param("portalVo") PortalVo portalVo);}
  • mapperxml:
<select id="selectPageMap" resultType="map">select hid,title,type,page_views pageViews,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,publisher from news_headline where is_deleted=0<if test="portalVo.keyWords !=null and portalVo.keyWords.length()>0 ">and title like concat('%',#{portalVo.keyWords},'%')</if><if test="portalVo.type != null and portalVo.type != 0">and type = #{portalVo.type}</if></select>
2.3 查询头条详情
2.3.1 需求描述

  • 用户点击”查看全文”时,向服务端发送新闻 id
  • 后端根据新闻 id 查询完整新闻文章信息并返回
  • 后端要同时让新闻的浏览量+1
2.3.2 接口描述
  • url 地址:portal/showHeadlineDetail
  • 请求方式:post
  • 请求参数:
hid=1 param形成参数
  • 响应数据:

    • 成功
    {"code":"200","message":"success","data":{"headline":{"hid":"1", // 新闻id"title":"马斯克宣布 ... ...", // 新闻标题"article":"... ..."// 新闻正文"type":"1",// 新闻所属类别编号"typeName":"科技", // 新闻所属类别"pageViews":"40",// 新闻浏览量"pastHours":"3" ,// 发布时间已过小时数"publisher":"1" ,// 发布用户ID"author":"张三" // 新闻作者}}}
2.3.3 代码实现
2.3.3.1 controller
 /** * 首页详情接口 * @param hid * @return */@PostMapping("showHeadlineDetail")public Result showHeadlineDetail(Integer hid){Result result = headlineService.showHeadlineDetail(hid);return result;}
2.3.3.2 service
/** * 详情数据查询 * "headline":{ * "hid":"1", // 新闻id * "title":"马斯克宣布 ... ...", // 新闻标题 * "article":"... ..."// 新闻正文 * "type":"1",// 新闻所属类别编号 * "typeName":"科技", // 新闻所属类别 * "pageViews":"40",// 新闻浏览量 * "pastHours":"3" ,// 发布时间已过小时数 * "publisher":"1" ,// 发布用户ID * "author":"张三" // 新闻作者 * } * 注意: 是多表查询 , 需要更新浏览量+1 * * @param hid * @return */@Overridepublic Result showHeadlineDetail(Integer hid) {//1.实现根据id的查询(多表)Map headLineDetail = headlineMapper.selectDetailMap(hid);//2.拼接头条对象(阅读量和version)进行数据更新Headline headline = new Headline();headline.setHid(hid);headline.setPageViews((Integer) headLineDetail.get("pageViews")+1); //阅读量+1headline.setVersion((Integer) headLineDetail.get("version")); //设置版本headlineMapper.updateById(headline);Map<String,Object> pageInfoMap=new HashMap<>();pageInfoMap.put("headline",headLineDetail);return Result.ok(pageInfoMap);}
2.3.3.3 mapper
  • 接口:
/** * 分页查询头条详情 * @param hid * @return */Map selectDetailMap(Integer hid);
  • mapperxml:
<select id="selectDetailMap" resultType="map">select hid,title,article,type, h.version ,tname typeName ,page_views pageViews,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,publisher,nick_name author from news_headline hleft join news_type t on h.type = t.tidleft join news_user uon h.publisher = u.uidwhere hid = #{hid}</select>