新闻模块CRUD

一、教学目标
实现新闻的发布、分页列表、详情、修改、删除接口。
使用UserContext.getCurrentUserId()进行权限控制(只能修改/删除自己的新闻)。
二、核心知识点(简要)
RESTful API:使用HTTP方法对应操作(POST添加,GET查询,PUT修改,DELETE删除)。
权限控制:通过UserContext获取当前用户ID,与资源所有者比较。
三、操作步骤

  1. 创建DTO
    右键dto文件夹,新建java类:NewsAddDTO
    NewsAddDTO中的代码如下所示:
package com.weitoutiao.dto;

import lombok.Data;

@Data
public class NewsAddDTO {
    private String title;
    private String content;
}

右键dto文件夹,新建java类:NewsUpdateDTO
NewsUpdateDTO中的代码如下:

package com.weitoutiao.dto;

import lombok.Data;

@Data
public class NewsUpdateDTO {
    private String title;
    private String content;
}
  1. 创建NewsController
    右键controller文件夹,新建java类:NewsController
    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("删除成功");
    }
}
  1. Postman测试新闻的CRUD
    新建一个请求,起名叫AddNews
    点击Save之后,点开AddNews,选POST,地址填: http://localhost:8080/news/add ,再选Body,选raw,选JSON,填上以下面内容:
{
  "title": "新闻添加测试",
  "content": "新闻内容123123"
}

先启动后端主程序,再用之前的login请求,登录用户testuser
登录成功如下显示,复制message中的token。
再打开AddNews, 选中Headers,添加一个key和value,key就是Authorization,value就是刚才复制的token,要注意在token前需要加一个字段Bearer,Bearer后有个空格。
如下所示:
设置好后,点发送,成功如下所示:
查看数据库就会多一条刚才发送的新闻数据

posted on 2026-06-24 10:50  爱我的果果吖  阅读(12)  评论(0)    收藏  举报