新闻模块CRUD

新闻模块CRUD

一、学习目标

  • 实现新闻的发布、分页列表、详情、修改、删除接口。
  • 使用UserContext.getCurrentUserId()进行权限控制(只能修改/删除自己的新闻)。

二、核心知识点

  • RESTful API:使用HTTP方法对应操作(POST添加,GET查询,PUT修改,DELETE删除)。
  • 权限控制:通过UserContext获取当前用户ID,与资源所有者比较。

三、操作步骤

1. 创建DTO

  • 右键dto文件夹,新建java类:NewsAddDTO

301

  • NewsAddDTO中的代码如下所示:

    package com.weitoutiao.dto;
    
    import lombok.Data;
    
    @Data
    public class NewsAddDTO {
        private String title;
        private String content;
    }
    
  • 右键dto文件夹,新建java类:NewsUpdateDTO

302

  • NewsUpdateDTO中的代码如下:

    package com.weitoutiao.dto;
    
    import lombok.Data;
    
    @Data
    public class NewsUpdateDTO {
        private String title;
        private String content;
    }
    

2. 创建NewsController

  • 右键controller文件夹,新建java类:NewsController

303

  • NewsController中的代码如下:

    package com.weitoutiao.controller;
    
    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.weitoutiao.common.Result;
    import com.weitoutiao.dto.NewsAddDTO;
    import com.weitoutiao.dto.NewsUpdateDTO;
    import com.weitoutiao.entity.News;
    import com.weitoutiao.service.NewsService;
    import com.weitoutiao.util.UserContext;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/news")
    public class NewsController {
        @Autowired
        private NewsService newsService;
    
        // 发布新闻
        @PostMapping("/add")
        public Result<?> addNews(@RequestBody NewsAddDTO dto) {
            Integer userId = UserContext.getCurrentUserId();
            if (userId == null) return Result.error("请先登录");
            News news = new News();
            news.setUserId(userId);
            news.setTitle(dto.getTitle());
            news.setContent(dto.getContent());
            news.setViewCount(0);
            return newsService.save(news) ? Result.success("发布成功") : Result.error("发布失败");
        }
    
        // 分页查询新闻列表
        @GetMapping("/page")
        public Result<Page<News>> listNews(@RequestParam(defaultValue = "1") Integer page,
                                           @RequestParam(defaultValue = "10") Integer size) {
            Page<News> pageObj = new Page<>(page, size);
            LambdaQueryWrapper<News> wrapper = new LambdaQueryWrapper<>();
            wrapper.orderByDesc(News::getPublishTime);
            return Result.success(newsService.page(pageObj, wrapper));
        }
    
        // 新闻详情
        @GetMapping("/{id}")
        public Result<News> getNewsDetail(@PathVariable Integer id) {
            News news = newsService.getById(id);
            if (news == null) return Result.error("新闻不存在");
            // 增加浏览量
            news.setViewCount(news.getViewCount() + 1);
            newsService.updateById(news);
            return Result.success(news);
        }
    
        // 修改新闻(只能修改自己的)
        @PutMapping("/{id}")
        public Result<?> updateNews(@PathVariable Integer id, @RequestBody NewsUpdateDTO dto) {
            Integer userId = UserContext.getCurrentUserId();
            News news = newsService.getById(id);
            if (news == null) return Result.error("新闻不存在");
            if (!news.getUserId().equals(userId)) return Result.error("只能修改自己的新闻");
            news.setTitle(dto.getTitle());
            news.setContent(dto.getContent());
            newsService.updateById(news);
            return Result.success("修改成功");
        }
    
        // 删除新闻(逻辑删除)
        @DeleteMapping("/{id}")
        public Result<?> deleteNews(@PathVariable Integer id) {
            Integer userId = UserContext.getCurrentUserId();
            News news = newsService.getById(id);
            if (news == null) return Result.error("新闻不存在");
            if (!news.getUserId().equals(userId)) return Result.error("只能删除自己的新闻");
            newsService.removeById(id);
            return Result.success("删除成功");
        }
    }
    

3.工程目录结构如下所示:

img

4. Postman测试新闻的CRUD

  • 新建一个请求,起名叫AddNews

img img

  • 点击Save之后,点开AddNews,选POST,地址填:http://localhost:8080/news/add,再选Body,选raw,选JSON,填上以下面内容:

    {
      "title": "新闻添加测试",
      "content": "新闻内容123123"
    }
    

    如图所示:
    304

  • 先启动后端主程序,再用之前的login请求,登录用户testuser

305

登录成功如下显示,复制message中的token。

306

  • 再打开AddNews, 选中Headers,添加一个keyvalue,key就是Authorizationvalue就是刚才复制的token,要注意在token前需要加一个字段BearerBearer后有个空格。

    如下所示:

307

  • 设置好后,点发送,成功如下所示:

308

  • 查看数据库就会多一条刚才发送的新闻数据

309

posted @ 2026-06-25 13:19  睡醒再说  阅读(0)  评论(0)    收藏  举报