< 返回新闻公共列表
基于vue+spring的博客系统
发布时间:2023-06-27 13:00:16
系统展示
主页
登录页面
登录成功之后
发布博客
发布成功
点击编辑还可以对自己的文章进行编辑
前端核心代码
主页
1.
2. 3.
4. 5.
6.
7. 8. 9. 10. 11. 12. { {blog.title}} 13. 14.
15. { {blog.description}}
16. 17. 18. 19. 20. 21.
28. 29. 30.
31. 32.
33. 34. 35. 67. 68.
博客编辑页
1.
2. 3.
4. 5.
6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 立即创建 22. 重置 23. 24. 25. 26.
27. 28. 29. 30.
31. 32. 33. 108. 109.
登录页面
1.
2. 3. 4.
5. 6.
7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 登录 20. 重置 21. 主页 22. 23. 24. 25. 26. 27. 28. 29.
30. 31. 32. 85. 86.
博客详情页
1.
2. 3.
4. 5.
6.
{ { blog.title }}
7.
8. 9. 编辑 10. 11. 12.
13.
14. 15.
16. 17.
18. 19. 20. 57. 58.
后端代码
博客接口
1. @RestController 2. public class BlogController { 3. 4. @Autowired 5. BlogService blogService; 6. 7. // 列表 8. @GetMapping("/blogs") 9. public Result list(@RequestParam(defaultValue = "1") Integer currentPage) { 10. 11. Page page = new Page(currentPage, 5); 12. IPage pageData = blogService.page(page, new QueryWrapper
().orderByDesc("created")); 13. 14. return Result.succ(pageData); 15. } 16. 17. 18. 19. // 详情 20. @GetMapping("/blog/{id}") 21. public Result detail(@PathVariable(name = "id") Long id) { 22. Blog blog = blogService.getById(id); 23. Assert.notNull(blog, "该博客已被删除"); 24. 25. return Result.succ(blog); 26. } 27. 28. // 编辑 29. @RequiresAuthentication 30. @PostMapping("/blog/edit") 31. public Result edit(@Validated @RequestBody Blog blog) { 32. 33. // Assert.isTrue(false, "公开版不能任意编辑!"); 34. 35. Blog temp = null; 36. if(blog.getId() != null) { 37. temp = blogService.getById(blog.getId()); 38. // 只能编辑自己的文章 39. System.out.println(ShiroUtil.getProfile().getId()); 40. Assert.isTrue(temp.getUserId().longValue() == ShiroUtil.getProfile().getId().longValue(), "没有权限编辑"); 41. 42. } else { 43. 44. temp = new Blog(); 45. temp.setUserId(ShiroUtil.getProfile().getId()); 46. temp.setCreated(LocalDateTime.now()); 47. temp.setStatus(0); 48. } 49. 50. BeanUtil.copyProperties(blog, temp, "id", "userId", "created", "status"); 51. blogService.saveOrUpdate(temp); 52. 53. return Result.succ(null); 54. } 55. 56. }
用户校验接口
1. @RestController 2. public class AccountController { 3. 4. @Autowired 5. UserService userService; 6. 7. @Autowired 8. JwtUtils jwtUtils; 9. 10. @PostMapping("/login") 11. public Result login(@Validated @RequestBody LoginDto loginDto, HttpServletResponse response) { 12. 13. System.out.println(loginDto.getUsername()); 14. User user = userService.getOne(new QueryWrapper().eq("username", loginDto.getUsername())); 15. 16. System.out.println(2222); 17. Assert.notNull(user, "用户不存在"); 18. 19. if(!user.getPassword().equals(SecureUtil.md5(loginDto.getPassword()))){ 20. return Result.fail("密码不正确"); 21. } 22. String jwt = jwtUtils.generateToken(user.getId()); 23. 24. response.setHeader("Authorization", jwt); 25. response.setHeader("Access-control-Expose-Headers", "Authorization"); 26. 27. return Result.succ(MapUtil.builder() 28. .put("id", user.getId()) 29. .put("username", user.getUsername()) 30. .put("avatar", user.getAvatar()) 31. .put("email", user.getEmail()) 32. .map() 33. ); 34. } 35. 36. @RequiresAuthentication 37. @GetMapping("/logout") 38. public Result logout() { 39. SecurityUtils.getSubject().logout(); 40. return Result.succ(null); 41. } 42. 43. }
spring整合shiro
1. @Component 2. public class JwtFilter extends AuthenticatingFilter { 3. @Autowired 4. JwtUtils jwtUtils; 5. 6. @Override 7. protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { 8. HttpServletRequest request = (HttpServletRequest) servletRequest; 9. String jwt = request.getHeader("Authorization"); 10. if(StringUtils.isEmpty(jwt)) { 11. return null; 12. } 13. 14. return new JwtToken(jwt); 15. } 16. 17. @Override 18. protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { 19. HttpServletRequest request = (HttpServletRequest) servletRequest; 20. String jwt = request.getHeader("Authorization"); 21. if(StringUtils.isEmpty(jwt)) { 22. return true; 23. } else { 24. // 校验jwt 25. Claims claim = jwtUtils.getClaimByToken(jwt); 26. if(claim == null || jwtUtils.isTokenExpired(claim.getExpiration())) { 27. throw new ExpiredCredentialsException("token已失效,请重新登录"); 28. } 29. 30. // 执行登录 31. return executeLogin(servletRequest, servletResponse); 32. } 33. } 34. 35. @Override 36. protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { 37. 38. HttpServletResponse httpServletResponse = (HttpServletResponse) response; 39. 40. Throwable throwable = e.getCause() == null ? e : e.getCause(); 41. Result result = Result.fail(throwable.getMessage()); 42. String json = JSONUtil.toJsonStr(result); 43. 44. try { 45. httpServletResponse.getWriter().print(json); 46. } catch (IOException ioException) { 47. 48. } 49. return false; 50. } 51. 52. @Override 53. protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { 54. 55. HttpServletRequest httpServletRequest = WebUtils.toHttp(request); 56. HttpServletResponse httpServletResponse = WebUtils.toHttp(response); 57. httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); 58. httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); 59. httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); 60. // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态 61. if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { 62. httpServletResponse.setStatus(org.springframework.http.HttpStatus.OK.value()); 63. return false; 64. } 65. 66. return super.preHandle(request, response); 67. } 68. 69. }
1. @Configuration 2. public class ShiroConfig { 3. 4. @Autowired 5. JwtFilter jwtFilter; 6. 7. @Bean 8. public SessionManager sessionManager(RedisSessionDAO redisSessionDAO) { 9. DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); 10. 11. // inject redisSessionDAO 12. sessionManager.setSessionDAO(redisSessionDAO); 13. return sessionManager; 14. } 15. 16. @Bean 17. public DefaultWebSecurityManager securityManager(AccountRealm accountRealm, 18. SessionManager sessionManager, 19. RedisCacheManager redisCacheManager) { 20. 21. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(accountRealm); 22. 23. //inject sessionManager 24. securityManager.setSessionManager(sessionManager); 25. 26. // inject redisCacheManager 27. securityManager.setCacheManager(redisCacheManager); 28. return securityManager; 29. } 30. 31. @Bean 32. public ShiroFilterChainDefinition shiroFilterChainDefinition() { 33. DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); 34. 35. Map filterMap = new LinkedHashMap<>(); 36. 37. 38. filterMap.put("/**", "jwt"); 39. chainDefinition.addPathDefinitions(filterMap); 40. return chainDefinition; 41. } 42. 43. @Bean("shiroFilterFactoryBean") 44. public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, 45. ShiroFilterChainDefinition shiroFilterChainDefinition) { 46. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); 47. shiroFilter.setSecurityManager(securityManager); 48. 49. Map filters = new HashMap<>(); 50. filters.put("jwt", jwtFilter); 51. 52. 53. shiroFilter.setFilters(filters); 54. 55. Map filterMap = shiroFilterChainDefinition.getFilterChainMap(); 56. 57. shiroFilter.setFilterChainDefinitionMap(filterMap); 58. return shiroFilter; 59. } 60. 61. 62. }
数据库设计
1. SET NAMES utf8mb4; 2. SET FOREIGN_KEY_CHECKS = 0; 3. 4. -- ---------------------------- 5. -- Table structure for m_blog 6. -- ---------------------------- 7. DROP TABLE IF EXISTS `m_blog`; 8. CREATE TABLE `m_blog` ( 9. `id` bigint(20) NOT NULL AUTO_INCREMENT, 10. `user_id` bigint(20) NOT NULL, 11. `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 12. `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 13. `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL, 14. `created` datetime NOT NULL, 15. `status` tinyint(4) NULL DEFAULT NULL, 16. PRIMARY KEY (`id`) USING BTREE 17. ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact; 18. 19. -- ---------------------------- 20. -- Records of m_blog 21. -- ---------------------------- 22. INSERT INTO `m_blog` VALUES (6, 2, '123', '321', '123213', '2022-12-20 12:14:56', 0); 23. INSERT INTO `m_blog` VALUES (7, 1, 'syy', '23', '12321321321', '2022-12-20 12:52:00', 0); 24. INSERT INTO `m_blog` VALUES (8, 1, '123213', '123213', 'ceshi', '2022-12-21 07:46:34', 0); 25. INSERT INTO `m_blog` VALUES (9, 1, '测试1', '测试二', '测试', '2022-12-29 04:20:06', 0); 26. 27. -- ---------------------------- 28. -- Table structure for m_discussion 29. -- ---------------------------- 30. DROP TABLE IF EXISTS `m_discussion`; 31. CREATE TABLE `m_discussion` ( 32. `id` bigint(20) NOT NULL AUTO_INCREMENT, 33. `user_id` bigint(20) NOT NULL, 34. `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 35. `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 36. `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL, 37. `created` datetime NOT NULL, 38. `status` tinyint(4) NULL DEFAULT NULL, 39. PRIMARY KEY (`id`) USING BTREE 40. ) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact; 41. 42. -- ---------------------------- 43. -- Records of m_discussion 44. -- ---------------------------- 45. INSERT INTO `m_discussion` VALUES (1, 1, '小明', '五行学习法很不错', '五行学习法很好', '2020-10-13 21:05:31', 0); 46. INSERT INTO `m_discussion` VALUES (6, 1, '小李', 'nice', '内容', '2022-11-21 15:25:15', 0); 47. INSERT INTO `m_discussion` VALUES (7, 1, '小张', '不错', '', '2022-11-21 16:15:57', 0); 48. INSERT INTO `m_discussion` VALUES (8, 1, '小伤', '挺好的', '', '2022-11-21 16:25:36', 0); 49. INSERT INTO `m_discussion` VALUES (9, 1, 'shangyi', '挺不错的', '', '2022-11-21 16:27:00', 0); 50. INSERT INTO `m_discussion` VALUES (10, 1, '小商', '很好', '', '2022-11-21 16:31:49', 0); 51. INSERT INTO `m_discussion` VALUES (11, 1, '小诗', '挺好的', '', '2022-11-21 16:34:11', 0); 52. INSERT INTO `m_discussion` VALUES (12, 1, '尚艺', '很好', '', '2022-11-25 16:55:35', 0); 53. INSERT INTO `m_discussion` VALUES (13, 1, '11', '11', '', '2022-12-09 14:19:00', 0); 54. INSERT INTO `m_discussion` VALUES (14, 1, '111', '111112', '', '2022-12-09 15:31:43', 0); 55. INSERT INTO `m_discussion` VALUES (15, 1, '小诺', '12三大', '', '2022-12-09 15:33:04', 0); 56. INSERT INTO `m_discussion` VALUES (16, 1, '12', '123', '', '2022-12-09 15:34:20', 0); 57. INSERT INTO `m_discussion` VALUES (17, 1, '111', '111', '', '2022-12-09 16:25:59', 0); 58. INSERT INTO `m_discussion` VALUES (18, 1, 'xiao', '123', '', '2022-12-09 16:59:00', 0); 59. 60. -- ---------------------------- 61. -- Table structure for m_user 62. -- ---------------------------- 63. DROP TABLE IF EXISTS `m_user`; 64. CREATE TABLE `m_user` ( 65. `id` bigint(20) NOT NULL AUTO_INCREMENT, 66. `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 67. `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 68. `email` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 69. `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 70. `status` int(5) NOT NULL, 71. `created` datetime NULL DEFAULT NULL, 72. `last_login` datetime NULL DEFAULT NULL, 73. `like` int(23) NULL DEFAULT NULL, 74. `collection` int(11) NULL DEFAULT NULL, 75. `visit` int(11) NULL DEFAULT NULL, 76. PRIMARY KEY (`id`) USING BTREE, 77. INDEX `UK_USERNAME`(`username`) USING BTREE 78. ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; 79. 80. -- ---------------------------- 81. -- Records of m_user 82. -- ---------------------------- 83. INSERT INTO `m_user` VALUES (1, 'sy', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', NULL, '96e79218965eb72c92a549dd5a330112', 0, '2020-04-20 10:44:01', NULL, NULL, NULL, NULL); 84. INSERT INTO `m_user` VALUES (2, 'xia', NULL, NULL, '96e79218965eb72c92a549dd5a330112', 0, NULL, NULL, NULL, NULL, NULL); 85. 86. SET FOREIGN_KEY_CHECKS = 1;
代码地址
博客系统: 博客系统初态,可以发表文章,浏览文章