【第11章】SpringBoot实战篇之文章(下)含条件分页

news2025/1/21 22:08:10

文章目录

  • 前言
  • 一、文章列表查询
    • 1. ArticleController
    • 2. ArticleService
  • 二 、文章查询
    • 1. ArticleController
    • 2. ArticleService
  • 三、文章更新
    • 1. ArticleController
    • 2. ArticleService
  • 四、文章删除
    • 1. ArticleController
    • 2. ArticleService
  • 五、文章列表查询(条件分页)
    • 1.ArticleController
    • 2.ArticleService
    • 3. Article
    • 4. MybatisPlusConfig
    • 5. sql
    • 6. 结果
  • 总结


前言

本章内容继续介绍文章,下面介绍

  • 文章列表查询
  • 文章查询
  • 文章更新
  • 文章删除
  • 文章列表查询(条件分页)

一、文章列表查询

1. ArticleController

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;
    @PostMapping
    /**
     * 文章列表查询
     * @return Result<List<Article>>
     */
    @GetMapping
    public Result<List<Article>> queryList(){
        List<Article> categories = articleService.selectList();
        return Result.success(categories);
    }
}

2. ArticleService

public interface ArticleService {
    public List<Article> selectList();
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    @Override
    public List<Article> selectList() {
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("userId");
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("create_user",userId);
        return articleMapper.selectList(queryWrapper);
    }
}

二 、文章查询

1. ArticleController

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;
    /**
     * 文章查询
     * @param id 编号
     * @return Article
     */
    @GetMapping("detail")
    public Result<Article> detail(Integer id){
        Article categories = articleService.selectOne(id);
        return Result.success(categories);
    }
}

2. ArticleService

public interface ArticleService {
    public Article selectOne(Integer id);
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    @Override
    public Article selectOne(Integer id) {
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("userId");
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",id);
        queryWrapper.eq("create_user",userId);
        return articleMapper.selectOne(queryWrapper);
    }
}

三、文章更新

1. ArticleController

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;
    /**
     * 文章更新
     * @param article 文章
     * @return Result
     */
    @PutMapping
    public Result update(@RequestBody @Validated(ValidatedGroups.Update.class) Article article){
        int i = articleService.update(article);
        if(i!=1){
            return Result.error("更新文章失败");
        }
        return Result.success("更新文章成功");
    }
}

2. ArticleService

public interface ArticleService {
    public int update(Article article);
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    @Override
    public int update(Article article) {
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("userId");
        UpdateWrapper<Article> wrapper = new UpdateWrapper<>();
        wrapper.set("update_time",LocalDateTime.now());
        wrapper.eq("id",article.getId());
        wrapper.eq("create_user",userId);
        return articleMapper.update(article,wrapper);
    }
}

四、文章删除

1. ArticleController

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;
    /**
     * 文章删除
     * @param id 编号
     * @return Result
     */
    @DeleteMapping
    public Result delete(Integer id){
        int i = articleService.delete(id);
        if(i!=1){
            return Result.error("删除文章失败");
        }
        return Result.success("删除文章成功");
    }
}

2. ArticleService

public interface ArticleService {
    public int delete(Integer id);
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    @Override
    public int delete(Integer id) {
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("userId");
        UpdateWrapper<Article> wrapper = new UpdateWrapper<>();
        wrapper.eq("id",id);
        wrapper.eq("create_user",userId);
        return articleMapper.delete(wrapper);
    }
}

五、文章列表查询(条件分页)

这里有点技术含量,稍微介绍下,我们使用Mybatis-Plus提供的分页插件,参考这里

1.ArticleController

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;
    /**
     * 文章列表查询(条件分页)
     * @param pageNum 当前页
     * @param pageSize 页数
     * @param categoryId 分类id
     * @param state 发布状态
     * @return Result<ObjectMapper>
     */
    @GetMapping("/page")
    public Result<Map<String,Object>> selectPage(Integer pageNum, Integer pageSize, @RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state) throws JsonProcessingException {
        Page<Article> articlePage = articleService.selectPage(pageNum, pageSize, categoryId, state);
        Map<String,Object> map=new HashMap<>();
        map.put("total",articlePage.getTotal());
        map.put("items",articlePage.getRecords());
        return Result.success(map);
    }
}

2.ArticleService

public interface ArticleService {
    public Page<Article> selectPage(Integer current, Integer size, Integer categoryId, String state);
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    public Page<Article> selectPage(Integer current,Integer size,Integer categoryId,String state) {
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("userId");
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("create_user",userId);
        if(categoryId!=null){
            queryWrapper.eq("category_id",categoryId);
        }
        if(StringUtils.hasLength(state)){
            queryWrapper.eq("state",state);
        }
        Page<Article> articlePage = new Page<>(current,size);
        return articleMapper.selectPage(articlePage,queryWrapper);
    }
}

3. Article

@Getter
@Setter
@ToString
public class Article {
    @NotNull(message = "id不能为空",groups = {ValidatedGroups.Update.class})
    @TableId(type = IdType.AUTO)
    private Integer id;//主键ID
    @Pattern(regexp = "^\\S{1,10}$",message = "文章标题为1-10个字符")
    @NotEmpty(message = "文章标题不能为空")
    private String title;//文章标题
    @NotEmpty(message = "文章内容不能为空")
    private String content;//文章内容
    @Pattern(regexp = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$",message = "封面图像格式应为http链接")
    private String coverImg;//封面图像
    @ArticleState
    private String state;//发布状态 已发布|草稿
    private Integer categoryId;//文章分类id
    private Integer createUser;//创建人ID
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//更新时间
}

4. MybatisPlusConfig

package org.example.springboot3.mybatisplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Create by zjg on 2024/5/29
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }
}

5. sql

[2024-05-29 22:43:45.345][http-nio-8080-exec-5][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==>  Preparing: SELECT id,title,content,cover_img,state,category_id,create_user,create_time,update_time FROM article WHERE (create_user = ? AND category_id = ? AND state = ?) LIMIT ?
[2024-05-29 22:43:45.345][http-nio-8080-exec-5][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==> Parameters: 1(Integer), 2(Integer), 草稿(String), 3(Long)
[2024-05-29 22:43:45.348][http-nio-8080-exec-5][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - <==      Total: 3

6. 结果

在这里插入图片描述


总结

回到顶部

最初的梦想,就像好好睡了一觉,直到天亮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1801278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vite打包优化常用的技巧及思路

面试题&#xff1a;vitevue项目如何进行优化&#xff1f; 什么情况下会去做打包优化&#xff1f;一种是在搭建项目的时候就根据自己的经验把vite相关配置给处理好&#xff0c;另外一种是开发的过程中发现打包出来的静态资源越来越大&#xff0c;导致用户访问的时候资源加载慢&a…

【ROS使用记录】—— ros使用过程中的rosbag录制播放和ros话题信息相关的指令与操作记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、rosbag的介绍二、rosbag的在线和离线录制三、rosbag的播放相关的指令四、其他rosbag和ros话题相关的指令总结 前言 rosbag是ROS&#xff08;机器人操作系统…

计算机网络之crc循环冗余校验、子网划分、rip协议路由转发表、时延计算、香浓定理 奈氏准则、TCP超时重传 RTO

crc循环冗余校验 异或运算 : 相同得0,相异得1 从多项式获取除数 在原数据的末端补0 , 0的个数等于最高次项的阶数 如果最后结果的有效位数较少时&#xff0c;前面应该补0&#xff0c;补到个数与阶位相同 子网划分 子网掩码&#xff1a;用于识别IP地址中的网络号和主机号的…

hutool工具实践-验证码

简介 验证码功能位于cn.hutool.captcha包中&#xff0c;核心接口为ICaptcha&#xff0c;此接口定义了以下方法&#xff1a; createCode 创建验证码&#xff0c;实现类需同时生成随机验证码字符串和验证码图片getCode 获取验证码的文字内容verify 验证验证码是否正确&#x…

【Python报错】已解决ModuleNotFoundError: No module named ‘xxx‘ in Jupyter Notebook

解决Python报错&#xff1a;ModuleNotFoundError: No module named ‘xxx’ in Jupyter Notebook 在使用Jupyter Notebook进行数据分析或科学计算时&#xff0c;我们经常需要导入各种Python模块。如果你遇到了ModuleNotFoundError: No module named xxx的错误&#xff0c;这通常…

校园外卖系统的技术架构与实现方案

随着校园生活的日益现代化&#xff0c;外卖需求在高校学生群体中迅速增长。为了满足这一需求&#xff0c;校园外卖系统应运而生。本文将详细探讨校园外卖系统的技术架构及其实现方案&#xff0c;帮助读者了解这一系统的核心技术与实现路径。 一、系统概述 校园外卖系统主要包…

一文读懂 Compose 支持 Accessibility 无障碍的原理

前言 众所周知&#xff0c;Compose 作为一种 UI 工具包&#xff0c;向开发者提供了实现 UI 的基本功能。但其实它还默默提供了很多其他能力&#xff0c;其中之一便是今天需要讨论的&#xff1a;Android 特色的 Accessibility 功能。 采用 Compose 搭建的界面&#xff0c;完美…

二分+模拟,CF1461D - Divide and Summarize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1461D - Codeforces 二、解题报告 1、思路分析 我们发现每次分裂操作结果都是固定的 我们从初始序列分裂出两个确定的子序列&#xff0c;两个确定的子序列又分裂出4个确定的子序列 那么也就是说…

【Python】解决Python报错:ZeroDivisionError: division by zero

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 直接除零2.2 变量导致的间接除零 3. 解决方案3.1 检查除数3.2 使用异常处理 4. 预防措施4.1 数据验证4.2 编写防御性代码 结语 引言 在Python中&#xff0c;尝试将一个数字除以零时&#xff0c;会抛出ZeroDivisionErr…

【Rust】——面向对象设计模式的实现

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

C++第二十五弹---从零开始模拟STL中的list(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、函数补充 2、迭代器完善 3、const迭代器 总结 1、函数补充 拷贝构造 思路&#xff1a; 先构造一个头结点&#xff0c;然后将 lt 类中的元…

使用亮数据代理IP爬取PubMed文章链接和邮箱地址

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

2024上海初中生古诗文大会倒计时4个多月:单选题真题和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

Html/HTML5常用标签的学习

课程目标 项目实战&#xff0c;肯定就需要静态网页。朝着做项目方式去学习静态网页。 01、编写第一个html工程结构化 cssjsimages/imgindex.html 归档存储和结构清晰就可以。 02、HTML标签分类 认知&#xff1a;标签为什么要分类&#xff0c;原因因为&#xff1a;分门别类…

【经验】Ubuntu上离线安装VsCode插件浏览Linux kernel源码

1、下载VsCode离线安装包 1.1 下载 下载地址:https://marketplace.visualstudio.com/vscode 本人安装的插件: C/C++ checkpatch Chinese clangd kconfig Makefile Tools Perl Perl Toolbox注意:C/C++插件要安装Linux 64版本 1.2 安装 将离线安装包拷贝到Ubuntu中,执…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

【CS.CN】优化HTTP传输:揭示Transfer-Encoding: chunked的奥秘与应用

文章目录 0 序言0.1 由来0.2 使用场景 1 Transfer-Encoding: chunked的机制2 语法 && 通过设置Transfer-Encoding: chunked优化性能3 总结References 0 序言 0.1 由来 Transfer-Encoding头部字段在HTTP/1.1中被引入&#xff0c;用于指示数据传输过程中使用的编码方式…

赚钱而已,你又不是宠物,干嘛让所有人都喜欢你?

* 大家好&#xff0c;我是前端队长。前端程序员&#xff0c;2023年开始玩副业。做过AI绘画&#xff0c;公众号 AI 爆文&#xff0c;AI代写项目&#xff0c;累计变现五位数。 — 今天看到一句话说的真好&#xff1a; 太多人总想让别人喜欢自己了。有什么用&#xff0c;你又不是宠…

C++的线性回归模型

线性回归模型是数理统计中的一种回归分析方法&#xff0c;其核心思想是通过建立一个线性方程来描述因变量与自变量之间的关系。这种关系可以表示为y wx e&#xff0c;其中y是因变量&#xff0c;x是自变量&#xff0c;w是回归系数向量&#xff0c;e是误差项&#xff0c;服从均…

【TB作品】MSP430F5529 单片机,简单电子琴

使用MSP430制作一个简单电子琴 作品功能 这个项目基于MSP430单片机&#xff0c;实现了一个简单的电子琴。通过按键输入&#xff0c;电子琴可以发出对应的音符声音。具体功能包括&#xff1a; 按下按键时发出对应音符的声音。松开按键时停止发声。支持C调低音、中音和高音。 …