基于 SpringBoot + MyBatis 的博客系统

打印 上一主题 下一主题

主题 526|帖子 526|积分 1578

文章目录



1. 项目设计

前端使用 HTML+CSS+JavaScript+JQuery
后端使用 Spring MVC+Spring Boot+MyBatis

2. 效果展示





3. 创建项目并配置文件

1.1 创建 Spring 项目





1.2 配置文件

application.properties 配置内容
  1. spring.profiles.active=dev
复制代码
application-dev.properties 配置内容
  1. spring.datasource.url=jdbc:mysql://localhost:3306/MyBlogSystem?characterEncoding=utf8&useSSL=true
  2. spring.datasource.username=root
  3. spring.datasource.password=0000
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. mybatis.mapper-locations=classpath:mapper/**Mapper.xml
复制代码
4. 数据库实现用户和博客管理

4.1 设计数据库

这里博客系统, 是一个用户表和博客表,
   用户一般分为:
  

  • 用户Id (每个人一个且互不相同)
  • 用户名 (每个人的用户名不相同)
  • 密码
  • 用户头像(暂不实现)
  • 用户马云地址(暂不实现)
    博客一般分为:
  

  • 博客Id (每篇博客一个且互不相同)
  • 标题
  • 正文
  • 创建时间
  • 修改时间 (这里没用到, 自己想加也可以)
  • 用户Id (可以设置一个外键,这里没设置)
  1. create database if not exists MyBlogSystem;
  2. use MyBlogSystem;
  3. drop table if exists blog;
  4. -- 创建一个博客表
  5. create table blog (
  6.     blogId int primary key auto_increment,
  7.     title varchar(1024),
  8.     content mediumtext,
  9.     postTime datetime,
  10.     userId int
  11. );
  12. drop table if exists user;
  13. -- 创建一个用户信息表
  14. create table user (
  15.     userId int primary key auto_increment,
  16.     username varchar(128) unique,
  17.     password varchar(128)
  18. );
复制代码
4.2 使用 MyBatis 操作数据库

   在 resources 下创建一个 mapper 包. 包下创建 UserMapper.xml 和
BlogMapper.xml
  

  • BlogMapper.xml 里是对博客表的数据库操作
  • UserMapper.xml 里是对用户表的数据库操作
  UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.example.demo.mapper.UserMapper">
  5.    
  6.     <insert id="addUser" keyProperty="userId" keyColumn="userId">
  7.         insert into user(username password) values (#{username}, #{password})
  8.     </insert>
  9.    
  10.     <select id="selectByName" resultType="com.example.demo.model.User">
  11.         select * from user where username = #{username}
  12.     </select>
  13.    
  14.     <select id="selectById" resultType="com.example.demo.model.User">
  15.         select * from user where userId = #{userId}
  16.     </select>
  17. </mapper>
复制代码
BlogMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.example.demo.mapper.BlogMapper">
  5.    
  6.     <select id="getAllBlog" resultType="com.example.demo.model.Blog">
  7.         select * from blog
  8.     </select>
  9.    
  10.     <select id="getBlogByBid" resultType="com.example.demo.model.Blog">
  11.         select * from blog where blogId = #{blogId}
  12.     </select>
  13.    
  14.     <insert id="postBlog" keyColumn="userId" keyProperty="userId">
  15.         insert into blog(title,content,postTime,userId) values(#{title},#{content},#{postTime},#{userId})
  16.     </insert>
  17.    
  18.     <delete id="deleteBlog">
  19.         delete from blog where blogId = #{blogId}
  20.     </delete>
  21.    
  22.     <update id="updateBlog">
  23.         update blog set content = #{content},title = #{title} where blogId = #{blogId}
  24.     </update>
  25.    
  26.     <select id="getAllBlogById" resultType="com.example.demo.model.Blog">
  27.         select * from blog where userId = #{userId}
  28.     </select>
  29. </mapper>
复制代码
User 实体类 和 Blog 实体类

在 model 包下 创建 User 类 和 Blog 类
User 类
  1. @Data
  2. public class User {
  3.     public int userId;
  4.     public String username;
  5.     public String password;
  6. }
复制代码
Blog 类
  1. @Data
  2. public class Blog {
  3.     public int blogId;
  4.     public String title;
  5.     public String content;
  6.     public Timestamp postTime;
  7.     public int userId;
  8. }
复制代码
UserMapper 接口 和 BlogMapper 接口

在 mapper 包下创建 UserMapper 和 BlogMapper 接口
UserMapper
  1. @Mapper
  2. public interface UserMapper {
  3.     void addUser(User user);
  4.     User selectByName(String username);
  5.     User selectById(Integer userId);
  6. }
复制代码
BlogMapper
  1. @Mapper
  2. public interface BlogMapper {
  3.     List<Blog> getAllBlog();
  4.    
  5.     Blog getBlogByBid(Integer blogId);
  6.    
  7.     void postBlog(Blog blog);
  8.    
  9.     void deleteBlog(Integer blogId);
  10.    
  11.     void updateBlog(Blog blog);
  12.    
  13.     List<Blog> getAllBlogById();
  14. }
复制代码
UserService 类 和 BlogService 类

service 包下创建 UserService类BlogService类
UserService
  1. @Service
  2. public class UserService {
  3.     @Resource
  4.     private UserMapper userMapper;
  5.     public void addUser(User user){
  6.         userMapper.addUser(user);
  7.     }
  8.     public User selectByName(String username){
  9.         return userMapper.selectByName(username);
  10.     }
  11.     public User selectById(Integer userId){
  12.         return userMapper.selectById(userId);
  13.     }
  14. }
复制代码
BlogService
  1. @Service
  2. public class BlogService {
  3.     @Resource
  4.     private BlogMapper blogMapper;
  5.     public List<Blog> getAllBlog(){
  6.         return blogMapper.getAllBlog();
  7.     }
  8.     public Blog getBlogByBid(Integer blogId){
  9.         return blogMapper.getBlogByBid(blogId);
  10.     }
  11.     public void postBlog(Blog blog) {
  12.         blogMapper.postBlog(blog);
  13.     }
  14.     public void deleteBlog(Integer blogId){
  15.         blogMapper.deleteBlog(blogId);
  16.     }
  17.     public void updateBlog(Blog blog){
  18.         blogMapper.updateBlog(blog);
  19.     }
  20.     public List<Blog> getAllBlogById(){
  21.         return blogMapper.getAllBlogById();
  22.     }
  23. }
复制代码
5. 前后端交互接口设计


交互1

交互2

交互3

交互4

交互5

交互6

交互7

交互8

交互9

交互10

交互11

6. 导入前端代码

导入前端代码到 resources 的 static下

具体代码查看 文章 博客系统前端界面
https://wangzhi430.blog.csdn.net/article/details/124649884
7. 实现博客主页

这里的交互接口是 交互6
7.1 实现后端代码

  1. @RestController
  2. public class IndexController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/index")
  6.     public List<Blog> getAllBlog() {
  7.         return blogService.getAllBlog();
  8.     }
  9. }
复制代码
7.2 实现前端代码

  1. $.ajax({
  2.             url: "index",
  3.             method: "GET",
  4.             success: function(data,status) {
  5.                 buildBlogs(data);
  6.             }
  7.         })
  8.         
  9.         function buildBlogs(blogs){
  10.             let rightDiv = document.querySelector('.right');
  11.             for(let blog of blogs){
  12.                 let blogDiv = document.createElement('div');
  13.                 blogDiv.className = 'article';
  14.                 // 创建 title
  15.                 let h2 = document.createElement('h2');
  16.                 h2.className = 'title';
  17.                 h2.innerHTML = blog.title;
  18.                 blogDiv.appendChild(h2);
  19.                 // 创建 postTime
  20.                 let postTime = document.createElement('span');
  21.                 postTime.className = 'date';
  22.                 postTime.innerHTML = DateFormat(blog.postTime);
  23.                 blogDiv.appendChild(postTime);
  24.                 // 创建 content
  25.                 let content = document.createElement('div');
  26.                 content.className = 'desc';
  27.                 content.innerHTML = blog.content;
  28.                 blogDiv.appendChild(content);
  29.                 // 创建 详情页的超链接
  30.                 let detailA = document.createElement('a');
  31.                 detailA.className = 'more';
  32.                 detailA.href = 'art.html?blogId=' + blog.blogId;
  33.                 detailA.innerHTML = '查看全文>>';
  34.                 blogDiv.appendChild(detailA);
  35.                 // 加入到 right 中
  36.                 rightDiv.appendChild(blogDiv);
  37.             }
  38.         }
  39.         // 把毫秒级时间戳转化成格式化日期
  40.         function DateFormat(timeStampMS) {
  41.             var date = new Date(timeStampMS);
  42.             var year = date.getFullYear(),
  43.                 month = date.getMonth()+1,//月份是从0开始的
  44.                 day = date.getDate(),
  45.                 hour = date.getHours(),
  46.                 min = date.getMinutes(),
  47.                 sec = date.getSeconds();
  48.             var newTime = year + '-' +
  49.                         (month < 10? '0' + month : month) + '-' +
  50.                         (day < 10? '0' + day : day) + ' ' +
  51.                         (hour < 10? '0' + hour : hour) + ':' +
  52.                         (min < 10? '0' + min : min) + ':' +
  53.                         (sec < 10? '0' + sec : sec);
  54.         
  55.             return newTime;
  56.         }
复制代码
7.3 测试代码


7.4 解决页面内容太多超出当前浏览器



7.5 解决页面顺序不是按最新时间排序


在BlogMapper.xml中修改当前sql语句.

7.6 解决内容太多, 导致显示的时候占位太多.



7.7 再次测试代码


8. 实现博客详情页

这里的交互是 交互5
8.1 实现后端代码

根据当前blogId来获取文章, 要判断blogId是否合法, 是否存在当前blogId的文章
这里使用, message来判断, 返回的message不为空就表示异常.
  1. @RestController
  2. public class DetailsController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/details")
  6.     public Object ShowBlog(Integer blogId) {
  7.         HashMap<String,Object> map = new HashMap<>();
  8.         if (blogId == null || blogId < 1) {
  9.             map.put("message","blogId异常!");
  10.             return map;
  11.         }
  12.         Blog blog = blogService.getBlogByBid(blogId);
  13.         if (blog == null) {
  14.             map.put("message","不存在当前blogId的文章");
  15.             return map;
  16.         }
  17.         return blog;
  18.     }
  19. }
复制代码
8.2 实现前端代码

  1.         $.ajax({
  2.             url: "details"+location.search,
  3.             method: "GET",
  4.             success: function(data,status) {
  5.                 if(data.message == null) {
  6.                     buildBlog(data);
  7.                 } else {
  8.                     alert(data.message);
  9.                     location.assign("home.html");
  10.                 }
  11.             }
  12.         })
  13.         function buildBlog(blog){
  14.             // 1. 更新 title
  15.             let titleDiv = document.querySelector('.title');
  16.             titleDiv.innerHTML = blog.title;
  17.             // 2. 更新 postTime
  18.             let postTime = document.querySelector('.date');
  19.             postTime.innerHTML = DateFormat(blog.postTime);
  20.             editormd.markdownToHTML('content', {markdown: blog.content});
  21.             }
  22.             // 把毫秒级时间戳转化成格式化日期
  23.             function DateFormat(timeStampMS) {
  24.             var date = new Date(timeStampMS);
  25.             var year = date.getFullYear(),
  26.                 month = date.getMonth()+1,//月份是从0开始的
  27.                 day = date.getDate(),
  28.                 hour = date.getHours(),
  29.                 min = date.getMinutes(),
  30.                 sec = date.getSeconds();
  31.             var newTime = year + '-' +
  32.                         (month < 10? '0' + month : month) + '-' +
  33.                         (day < 10? '0' + day : day) + ' ' +
  34.                         (hour < 10? '0' + hour : hour) + ':' +
  35.                         (min < 10? '0' + min : min) + ':' +
  36.                         (sec < 10? '0' + sec : sec);
  37.             return newTime;
  38.             }
复制代码
8.3 测试代码


8.4 这里展示为markdown语法的正文

展示为 markdown 语法的正文.
注意这里的几段代码


这里还需要导入依赖包

9. 实现博客登录界面

这里的交互是 交互8
9.1 实现后端代码

这里要根据前端穿过来的 json 格式数据进行判断
判断当前是否存在用户, 以及当前用户密码是否正确
登录成功之后, 要创建一个session
  1. @RestController
  2. public class LoginController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @RequestMapping("/login")
  6.     public Object userLogin(@RequestBody User user, HttpServletRequest request) {
  7.         HashMap<String,Object> map = new HashMap<>();
  8.         if (user == null) {
  9.             map.put("message","当前还没有输入用户名和密码,登录失败!");
  10.             return map;
  11.         }
  12.         User user1 = userService.selectByName(user.getUsername());
  13.         if (user1 == null) {
  14.             map.put("message","当前用户名不存在!");
  15.             return map;
  16.         }
  17.         if (!user.getPassword().equals(user1.getPassword())) {
  18.             map.put("message","当前用户名密码错误!");
  19.             return map;
  20.         }
  21.         user.setUserId(user1.getUserId());
  22.         HttpSession session = request.getSession(true);
  23.         if (session != null) {
  24.             session.setAttribute("user",user);
  25.         }
  26.         return map;
  27.     }
  28. }
复制代码
9.2 实现前端代码

这里前端去除了前后空格,以及为空的情况
  1.         let submit = document.querySelector('.button');
  2.         submit.onclick = function() {
  3.             let username = document.querySelector('.user');
  4.             let password = document.querySelector('.password');
  5.             
  6.             if (username.value.trim() == ""){
  7.                 alert('请先输入用户名!');
  8.                 username.focus();
  9.                 return;
  10.             }
  11.             if (password.value.trim() == ""){
  12.                 alert('请先输入密码!');
  13.                 password.focus();
  14.                 return;
  15.             }
  16.             $.ajax({
  17.                 url: "login",
  18.                 method: "POST",
  19.                 data: JSON.stringify({username: username.value.trim(), password: password.value.trim()}),
  20.                 contentType: "application/json;charset=utf-8",
  21.                 success: function(data, status) {
  22.                     if(data.message == null) {
  23.                         location.assign("home.html");
  24.                     }else{
  25.                         alert(data.message);
  26.                         username.value="";
  27.                         password.value="";
  28.                         username.focus();
  29.                     }
  30.                 }
  31.             })
  32.         }
复制代码
10. 实现登录判断 — 拦截器

10.1 实现自定义拦截器

  1. public class LoginInterceptor implements HandlerInterceptor {
  2.     @Override
  3.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  4.         HttpSession session = request.getSession(false);
  5.         if (session != null && session.getAttribute("user") != null) {
  6.             return true;
  7.         }
  8.         response.setStatus(401);
  9.         response.sendRedirect("/login.html");
  10.         return false;
  11.     }
  12. }
复制代码
10.2 将自定义拦截器加入到系统配置

  1. @Configuration
  2. public class AppConfig implements WebMvcConfigurer {
  3.     @Override
  4.     public void addInterceptors(InterceptorRegistry registry) {
  5.         registry.addInterceptor(new LoginInterceptor())
  6.                 .addPathPatterns("/**")
  7.                 .excludePathPatterns("/**/*.js")
  8.                 .excludePathPatterns("/**/*.jpg")
  9.                 .excludePathPatterns("/**/*.css")
  10.                 .excludePathPatterns("/**/*.png")
  11.                 .excludePathPatterns("/**/login.html")
  12.                 .excludePathPatterns("/**/register.html")
  13.                 .excludePathPatterns("/**/login")
  14.                 .excludePathPatterns("/**/register");
  15.     }
  16. }
复制代码
11. 实现注册功能

这里的交互是 交互9
11.1 实现后端代码

实现一个 类 Register 来接收前端返回来的数据
  1. class Register {
  2.     public String username;
  3.     public String password1;
  4.     public String password2;
  5. }
复制代码
这里后端需要判断当前用户名是否已经被使用.
  1. @RestController
  2. public class RegisterController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @RequestMapping("/register")
  6.     public Object userRegister(@RequestBody Register register) {
  7.         HashMap<String,Object> map = new HashMap<>();
  8.         User user = userService.selectByName(register.username);
  9.         if (user != null) {
  10.             map.put("message","当前用户名已经存在了, 请更换!");
  11.             return map;
  12.         }
  13.         User user1 = new User();
  14.         user1.setUsername(register.username);
  15.         user1.setPassword(register.password1);
  16.         userService.addUser(user1);
  17.         return map;
  18.     }
  19. }
复制代码
11.2 实现前端代码

要对输入内容去除前后空格,并且判空
  1.         let submit = document.querySelector('.button');
  2.         submit.onclick = function() {
  3.             let username = document.querySelector('.user');
  4.             let password1 = document.querySelector('.password1');
  5.             let password2 = document.querySelector('.password2');
  6.             if(username.value.trim() == ""){
  7.                 alert("请先输入用户名!");
  8.                 username.focus();
  9.                 return;
  10.             }
  11.             if(password1.value.trim() == ""){
  12.                 alert('请先输入密码!');
  13.                 password1.focus();
  14.                 return;
  15.             }
  16.             if(password2.value.trim() == ""){
  17.                 alert('请再次输入密码!');
  18.                 password2.focus();
  19.                 return;
  20.             }
  21.             if(password1.value.trim() != password2.value.trim()) {
  22.                 alert('两次输入的密码不同!');
  23.                 passwrod1.value="";
  24.                 password2.value="";
  25.                 return;
  26.             }
  27.             $.ajax({
  28.                 url: "register",
  29.                 method: "POST",
  30.                 data: JSON.stringify({username: username.value.trim(), password1: password1.value.trim(),password2: password2.value.trim()}),
  31.                 contentType: "application/json;charset=utf-8",
  32.                 success: function(data,status){
  33.                     if(data.message != null){
  34.                         alert(data.message);
  35.                         username.value="";
  36.                         password1.value="";
  37.                         password2.value="";
  38.                         username.focus();
  39.                     }else{
  40.                         location.assign('login.html');
  41.                     }
  42.                 }
  43.             })
  44.         }
复制代码
12. 实现注销功能

这里的交互是 交互10
12.1 实现后端代码

因为 注销功能是点击注销的时候, 触发一个logout的url, 然后发送一个请求.
这里只需要实现后端代码既可
  1. @Controller
  2. public class LogoutController {
  3.     @RequestMapping("/logout")
  4.     public void userLogout(HttpServletRequest request, HttpServletResponse response) throws IOException {
  5.         HttpSession session = request.getSession(false);
  6.         // 拦截器的拦截, 所以不可能出现session为空的情况
  7.         session.removeAttribute("user");
  8.         response.sendRedirect("login.html");
  9.     }
  10. }
复制代码
13. 实现博客编辑页

这里的交互是 交互1
13.1 实现后端代码

  1. @RestController
  2. public class EditController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/edit")
  6.     public void postBlog(@RequestBody Blog blog, @SessionAttribute(value = "user",required = false)User user){
  7.         blog.setPostTime(new Timestamp(System.currentTimeMillis()));
  8.         blog.setUserId(user.getUserId());
  9.         blogService.postBlog(blog);
  10.     }
  11. }
复制代码
13.2 实现前端代码

  1.         let submit = document.querySelector('.publish');
  2.         submit.onclick = function() {
  3.             let title = document.querySelector('.title');
  4.             let content = document.querySelector('.content');
  5.             if(title.value.trim() == ""){
  6.                 alert('当前文章标题为空,请输入!');
  7.                 title.focus();
  8.                 return;
  9.             }
  10.             if(content.value.trim() == ""){
  11.                 alert('当前文章内容为空,请输入!');
  12.                 content.focus();
  13.                 return;
  14.             }
  15.             $.ajax({
  16.                 url: "edit",
  17.                 method: "POST",
  18.                 data: JSON.stringify({title: title.value.trim(), content: content.value.trim()}),
  19.                 contentType: "application/json;charset=utf-8",
  20.                 success: function(data,status) {
  21.                     location.assign('home.html');
  22.                 }
  23.             })
  24.         }
复制代码
14. 实现博客个人主页

这里的交互是 交互7
这里的前端页面主要就是主页页面的改进
14.1 实现后端代码

  1. @RestController
  2. public class PersonController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/person")
  6.     public List<Blog> getMyBlog(@SessionAttribute(value = "user",required = false)User user) {
  7.         List<Blog> blogs = blogService.getAllBlogById(user.getUserId());
  8.         for (Blog blog : blogs) {
  9.             if (blog.getContent().length() > 80) {
  10.                 blog.setContent(blog.getContent().substring(0,80) + " ...");
  11.             }
  12.         }
  13.         return blogs;
  14.     }
  15. }
复制代码
14.2 实现前端代码

  1.         $.ajax({
  2.             url: "person",
  3.             method: "GET",
  4.             success: function(data,status) {
  5.                 buildBlogs(data);
  6.             }
  7.         })
  8.         function buildBlogs(blogs){
  9.             let rightDiv = document.querySelector('.right');
  10.             for(let blog of blogs){
  11.                 let blogDiv = document.createElement('div');
  12.                 blogDiv.className = 'article';
  13.                 // 创建 title
  14.                 let h2 = document.createElement('h2');
  15.                 h2.className = 'title';
  16.                 h2.innerHTML = blog.title;
  17.                 blogDiv.appendChild(h2);
  18.                 // 创建 postTime
  19.                 let postTime = document.createElement('span');
  20.                 postTime.className = 'date';
  21.                 postTime.innerHTML = DateFormat(blog.postTime);
  22.                 blogDiv.appendChild(postTime);
  23.                 // 创建 content
  24.                 let content = document.createElement('div');
  25.                 content.className = 'desc';
  26.                 content.innerHTML = blog.content;
  27.                 blogDiv.appendChild(content);
  28.                 // 创建 详情页的超链接
  29.                 let detailA = document.createElement('a');
  30.                 detailA.className = 'more';
  31.                 detailA.href = 'art.html?blogId=' + blog.blogId;
  32.                 detailA.innerHTML = '查看全文>>';
  33.                 blogDiv.appendChild(detailA);
  34.                 // 加入到 right 中
  35.                 rightDiv.appendChild(blogDiv);
  36.             }
  37.         }
  38.         // 把毫秒级时间戳转化成格式化日期
  39.         function DateFormat(timeStampMS) {
  40.             var date = new Date(timeStampMS);
  41.             var year = date.getFullYear(),
  42.                 month = date.getMonth()+1,//月份是从0开始的
  43.                 day = date.getDate(),
  44.                 hour = date.getHours(),
  45.                 min = date.getMinutes(),
  46.                 sec = date.getSeconds();
  47.             var newTime = year + '-' +
  48.                         (month < 10? '0' + month : month) + '-' +
  49.                         (day < 10? '0' + day : day) + ' ' +
  50.                         (hour < 10? '0' + hour : hour) + ':' +
  51.                         (min < 10? '0' + min : min) + ':' +
  52.                         (sec < 10? '0' + sec : sec);
  53.         
  54.             return newTime;
  55.         }
复制代码
15. 实现展示用户信息的功能

这里的交互是 交互11
这里需要分情况考虑, 展示个人信息主要是 主页页面, 详情页面, 个人主页页面.
以带不带blogId来区分
15.1 实现后端代码

这里判断了 blogId丢失的情况以及,文章作者丢失情况(数据库表数据被删除的时候会出现这种错误)
  1. @RestController
  2. public class UserController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @Autowired
  6.     private BlogService blogService;
  7.     @RequestMapping("/user")
  8.     public Object getUser(Integer blogId, @SessionAttribute(value = "user",required = false)User user){
  9.         if(blogId == null) {
  10.             return user;
  11.         }else {
  12.             HashMap<String,Object> map = new HashMap<>();
  13.             Blog blog = blogService.getBlogByBid(blogId);
  14.             if(blog == null) {
  15.                 map.put("message","不存在当前blogId的文章");
  16.                 return map;
  17.             }
  18.             User author = userService.selectById(blog.getUserId());
  19.             if(author == null){
  20.                 map.put("message","当前文章作者出错");
  21.                 return map;
  22.             }
  23.             return author;
  24.         }
  25.     }
  26. }
复制代码
15.2 实现前端代码

详情页的情况:
  1.         $.ajax({
  2.             url: "user"+location.search,
  3.             method: "GET",
  4.             success: function(data,status) {
  5.                 if(data.message == null){
  6.                     let username = document.querySelector('.name');
  7.                     username.innerHTML = data.username;
  8.                 }else{
  9.                     alert(data.message);
  10.                     location.assign('home.html');
  11.                 }
  12.             }
  13.         })
复制代码
个人主页和主页的情况
  1.         $.ajax({
  2.             url: "user",
  3.             method: "GET",
  4.             success: function(data,status){
  5.                 let username = document.querySelector('.name');
  6.                 username.innerHTML = data.username;
  7.             }
  8.         })
复制代码
16. 实现博客的删除功能

这里需要用到 交互2
这里在详情页的时候进行构建, 在Blog实体类中加一项 isAuthor, 为1的时候就是当前文章就是作者.
前端接收到这个的时候, 进行判断, 如果为1就显示删除的按钮.
16.1 改进代码





16.2 实现后端代码

  1. @Controller
  2. public class DeleteController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/delete")
  6.     public Object deleteBlog(Integer blogId) {
  7.         blogService.deleteBlog(blogId);
  8.         return "/home.html";
  9.     }
  10. }
复制代码
17. 实现博客的修改功能

这里的交互是 交互3 和 交互4
交互3是在新的页面进行加载
17.1 实现后端代码

  1. @RestController
  2. public class UpdateController {
  3.     @Autowired
  4.     private BlogService blogService;
  5.     @RequestMapping("/updateLoad")
  6.     public Object updateLoad(Integer blogId){
  7.         HashMap<String, Object> map = new HashMap<>();
  8.         if(blogId == null) {
  9.             map.put("message","blogId丢失!");
  10.             return map;
  11.         }
  12.         Blog blog = blogService.getBlogByBid(blogId);
  13.         if(blog == null) {
  14.             map.put("blog","不存在当前blog的文章!");
  15.             return map;
  16.         }
  17.         return blog;
  18.     }
  19.     @RequestMapping("/update")
  20.     public Object Update(Integer blogId, @RequestBody Blog blog, @SessionAttribute(value = "user",required = false)User user) {
  21.         HashMap<String, Object> map = new HashMap<>();
  22.         if(blogId == null) {
  23.             map.put("message","blogId丢失!");
  24.             return map;
  25.         }
  26.         blog.setBlogId(blogId);
  27.         blog.setUserId(user.getUserId());
  28.         blogService.updateBlog(blog);
  29.         return map;
  30.     }
  31. }
复制代码
17.2 实现前端代码

  1.         $.ajax({
  2.             url: "updateLoad"+location.search,
  3.             method: "GET",
  4.             success: function(data,status) {
  5.                 if(data.message == null) {
  6.                     let title = document.querySelector('.title');
  7.                     title.value=data.title;
  8.                     let content = document.querySelector('.content');
  9.                     content.value=data.content;
  10.                 }else{
  11.                     alert(data.message);
  12.                     location.assign('home.html');
  13.                 }
  14.             }
  15.         })
  16.         // 初始化编辑器
  17.         var editor = editormd("editor", {
  18.             // 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
  19.             width: "100%",
  20.             // 高度 100% 意思是和父元素一样高. 要在父元素的基础上去掉标题编辑区的高度
  21.             height: "calc(100% - 60px)",
  22.             // 指定 editor.md 依赖的插件路径
  23.             path: "editor.md/lib/",
  24.             // 放到 textarea中
  25.             saveHTMLToTextArea: true
  26.         });
  27.         let submit = document.querySelector('.publish');
  28.         submit.onclick = function() {
  29.             let title = document.querySelector('.title');
  30.             let content = document.querySelector('.content');
  31.             if(title.value.trim() == ""){
  32.                 alert('当前文章标题为空,请输入!');
  33.                 title.focus();
  34.                 return;
  35.             }
  36.             if(content.value.trim() == ""){
  37.                 alert('当前文章内容为空,请输入!');
  38.                 content.focus();
  39.                 return;
  40.             }
  41.             $.ajax({
  42.                 url: "update"+location.search,
  43.                 method: "POST",
  44.                 data: JSON.stringify({title: title.value.trim(), content: content.value.trim()}),
  45.                 contentType: "application/json;charset=utf-8",
  46.                 success: function(data,status) {
  47.                     if(data.message == null){
  48.                         location.assign('home.html');
  49.                     }else{
  50.                         alert(data.message);
  51.                         location.assign('home.html');
  52.                     }
  53.                 }
  54.             })
  55.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表