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>
相关推荐
weixin_704266058 小时前
SpringBoot全注解开发指南
java·spring boot·mybatis
想打游戏的程序猿9 小时前
核心概念层——深入理解 Agent 是什么
后端·ai编程
woniu_maggie10 小时前
SAP Web Service日志监控:如何用SRT_UTIL快速定位接口问题
后端
一线大码10 小时前
Java 使用国密算法实现数据加密传输
java·spring boot·后端
Rust语言中文社区10 小时前
【Rust日报】用 Rust 重写的 Turso 是一个更好的 SQLite 吗?
开发语言·数据库·后端·rust·sqlite
bug攻城狮11 小时前
四大MyBatis增强框架深度对比与选型指南
架构·mybatis·数据库架构
在屏幕前出油11 小时前
06. FastAPI——中间件
后端·python·中间件·pycharm·fastapi
wuqingshun31415912 小时前
说一下spring的bean的作用域
java·后端·spring
钟智强13 小时前
从2.7GB到481MB:我的Docker Compose优化实战,以及为什么不能全信AI
后端·docker
华科易迅13 小时前
Spring JDBC
java·后端·spring