============= 后端_博客业务 ============= 1 添加Shiro工具类 /src/main/java/com/weihome/barblog/shiro/ShiroUtil.java: /** * Shiro工具类 */ public class ShiroUtil { /** * 获取账户概要 */ public static AccountProfile getAccountProfile() { return (AccountProfile) SecurityUtils .getSubject().getPrincipal(); } } 2 修改控制器框架 /src/main/java/com/weihome/barblog/controller/BlogController.java: @RestController public class BlogController { @Autowired BlogService blogService; } 3 文章列表 /src/main/java/com/weihome/barblog/controller/BlogController.java: ... public class BlogController { ... /** * 文章列表 */ @GetMapping("/blogs") public Result list( @RequestParam(defaultValue = "1") Integer currentPage) { Page page = new Page(currentPage, 5); IPage blogs = blogService.page( page, new QueryWrapper().orderByDesc("created")); return Result.ok(blogs); } ... } http://localhost:8081/blogs?currentPage=1 { "code": 200, "message": "操作成功", "data": { "records": [ { "id": 2, "userId": 2, "title": "小兔", "description": "小兔的自我介绍", "content": "我是小兔。", "created": "2022-03-22T14:00:00", "status": 0 }, { "id": 1, "userId": 1, "title": "小熊", "description": "小熊的自我介绍", "content": "我是小熊。", "created": "2022-03-22T13:00:00", "status": 0 } ], "total": 2, "size": 5, "current": 1, "orders": [ ], "searchCount": true, "pages": 1 } } 4 文章详情 /src/main/java/com/weihome/barblog/controller/BlogController.java: ... public class BlogController { ... /** * 文章详情 */ @GetMapping("/blog/{id}") public Result detail(@PathVariable(name = "id") Long id) { Blog blog = blogService.getById(id); Assert.notNull(blog, "该博客已被删除"); return Result.ok(blog); } ... } http://localhost:8081/blog/1 { "code": 200, "message": "操作成功", "data": { "id": 1, "userId": 1, "title": "小熊", "description": "小熊的自我介绍", "content": "我是小熊。", "created": "2022-03-22T13:00:00", "status": 0 } } 5 保存文章 /src/main/java/com/weihome/barblog/controller/BlogController.java: ... public class BlogController { ... /** * 保存文章 */ @RequiresAuthentication @PostMapping("/blog/save") public Result save(@Validated @RequestBody Blog blog) { // 待保存对象 Blog save = null; // 当前用户的用户ID long userId = ShiroUtil.getAccountProfile().getId(); // 更新旧文章 if(blog.getId() != null) { save = blogService.getById(blog.getId()); // 文章作者的用户ID必须与当前用户的 // 用户ID一致,即只能更新自己的文章 Assert.isTrue( save.getUserId().longValue() == userId, "无权更新"); } // 添加新文章 else { save = new Blog(); save.setUserId(userId); // 当前用户即作者 save.setCreated(LocalDateTime.now()); save.setStatus(0); } BeanUtil.copyProperties(blog, save, "id", "userId", "created", "status"); // 复制内容 blogService.saveOrUpdate(save); // 保存对象 return Result.ok(null); } ... } Postman: POST localhost:8081/login Body raw/JSON { "username": "bear", "password": "111111" } ---------------------------- { "code": 200, "message": "操作成功", "data": { "id": 1, "avatar": "bear.png", "email": "johnmin74@hotmail.com", "username": "bear" } } Headers ... Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjQ4MDk4NTE5LCJleHAiOjE2NDg3MDMzMTl9.4Tmct-ITOtelHizNFNmWJVcqlctGp3bs3b7HFgSPtHBrkRGd-3K60pXkC1q7-o4m6angX_jn4jlhbn7t7U2v4w ... Postman: POST localhost:8081/blog/save Headers Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjQ4MDk4NTE5LCJleHAiOjE2NDg3MDMzMTl9.4Tmct-ITOtelHizNFNmWJVcqlctGp3bs3b7HFgSPtHBrkRGd-3K60pXkC1q7-o4m6angX_jn4jlhbn7t7U2v4w Body raw/JSON { "title": "保存文章", "description": "博客业务测试", "content": "鸿蒙初辟本无性" } ------------------------------------------------- { "code": 200, "message": "操作成功", "data": null } 检查数据库:id=3 Postman: POST localhost:8081/blog/save Headers Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjQ4MDk4NTE5LCJleHAiOjE2NDg3MDMzMTl9.4Tmct-ITOtelHizNFNmWJVcqlctGp3bs3b7HFgSPtHBrkRGd-3K60pXkC1q7-o4m6angX_jn4jlhbn7t7U2v4w Body raw/JSON { "id": "3", "title": "保存文章", "description": "博客业务测试", "content": "鸿蒙初辟本无性,打破顽冥须悟空。" } ------------------------------------------------- { "code": 200, "message": "操作成功", "data": null } 检查数据库。