SSM - Springboot - MyBatis-Plus 全栈体系(三十五)

第八章 项目实战

四、后台功能开发

2. 首页模块开发

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

  • 请求方式:get

  • 请求参数:无

  • 响应数据:

    • 成功
    java 复制代码
    {
       "code":"200",
       "message":"OK"
       "data":{
                [
                    {
                        "tid":"1",
                        "tname":"新闻"
                    },
                    {
                        "tid":"2",
                        "tname":"体育"
                    },
                    {
                        "tid":"3",
                        "tname":"娱乐"
                    },
                    {
                        "tid":"4",
                        "tname":"科技"
                    },
                    {
                        "tid":"5",
                        "tname":"其他"
                    }
                ]
        }
    }
2.1.3 代码实现
  • controller
java 复制代码
@RestController
@RequestMapping("portal")
@CrossOrigin
public class PortalController {

    @Autowired
    private 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
  • 请求参数:
xml 复制代码
{
    "keyWords":"马斯克", // 搜索标题关键字
    "type":0,           // 新闻类型
    "pageNum":1,        // 页码数
    "pageSize":10     // 页大小
}
  • 响应数据:

    • 成功
    java 复制代码
    {
       "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 准备条件实体类
java 复制代码
@Data
public class PortalVo {

    private String keyWords;
    private Integer type;
    private Integer pageNum = 1;
    private Integer pageSize = 10;
}
2.2.3.2 controller
java 复制代码
/**
 * 首页分页查询
 * @return
 */
@PostMapping("findNewPage")
public Result findNewPage(@RequestBody PortalVo portalVo){
    Result result = headlineService.findNewPage(portalVo);
    return result;
}
2.2.3.3 service
java 复制代码
@Service
public class HeadlineServiceImpl extends ServiceImpl<HeadlineMapper, Headline>
    implements HeadlineService{

    @Autowired
    private HeadlineMapper headlineMapper;

    /**
     * 首页数据查询
     * @param portalVo
     * @return
     */
    @Override
    public 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);
        // 响应JSON
        return Result.ok(pageInfoMap);
    }
}
2.2.3.4 mapper
  • 接口
java 复制代码
public interface HeadlineMapper extends BaseMapper<Headline> {

    //自定义分页查询方法
    IPage<Map> selectPageMap(IPage<Headline> page,
                @Param("portalVo") PortalVo portalVo);
}
  • mapperxml:
xml 复制代码
<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
  • 请求参数:
json 复制代码
hid=1 param形成参数
  • 响应数据:

    • 成功
    java 复制代码
    {
        "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
java 复制代码
 /**
 * 首页详情接口
 * @param hid
 * @return
 */
@PostMapping("showHeadlineDetail")
public Result showHeadlineDetail(Integer hid){
    Result result = headlineService.showHeadlineDetail(hid);
    return result;
}
2.3.3.2 service
java 复制代码
/**
 * 详情数据查询
 * "headline":{
 * "hid":"1",                     // 新闻id
 * "title":"马斯克宣布 ... ...",   // 新闻标题
 * "article":"... ..."            // 新闻正文
 * "type":"1",                    // 新闻所属类别编号
 * "typeName":"科技",             // 新闻所属类别
 * "pageViews":"40",              // 新闻浏览量
 * "pastHours":"3" ,              // 发布时间已过小时数
 * "publisher":"1" ,              // 发布用户ID
 * "author":"张三"                 // 新闻作者
 * }
 * 注意: 是多表查询 , 需要更新浏览量+1
 *
 * @param hid
 * @return
 */
@Override
public 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); //阅读量+1
    headline.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
  • 接口:
java 复制代码
/**
 * 分页查询头条详情
 * @param hid
 * @return
 */
Map selectDetailMap(Integer hid);
  • mapperxml:
xml 复制代码
<!--    Map selectDetailMap(Integer hid);-->
<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 h
                        left join news_type t on h.type = t.tid
                                left join news_user u  on h.publisher = u.uid
                                            where hid = #{hid}
</select>
相关推荐
uzong14 分钟前
后端系统设计文档模板
后端
幽络源小助理18 分钟前
SpringBoot+Vue车票管理系统源码下载 – 幽络源免费项目实战代码
vue.js·spring boot·后端
猫吻鱼19 分钟前
【系列文章合集】【全部系列文章合集】
spring boot·dubbo·netty·langchain4j
uzong1 小时前
软件架构指南 Software Architecture Guide
后端
又是忙碌的一天1 小时前
SpringBoot 创建及登录、拦截器
java·spring boot·后端
勇哥java实战分享2 小时前
短信平台 Pro 版本 ,比开源版本更强大
后端
学历真的很重要2 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪2 小时前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端
韩师傅3 小时前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端