博客目录
- springboot+mybatis实现的个人博客管理系统
- 实现功能截图
- 系统功能
- 使用技术
- 代码
- 完整源码
springboot+mybatis实现的个人博客管理系统
本系统是一个个人博客管理系统,比较新的框架springboot+mybatis实现,分为普通用户和管理员,普通用户可以发布博客、发表评论、查看博客,管理员可以对栏目、文章、评论、用户等进行管理。
(文末查看完整源码)
实现功能截图
前台首页
博客详情’
留言
栏目管理
博客文章管理
博客评论管理
系统设置
用户管理
系统功能
本系统实现了以下功能:
1、登录
2、文章管理、新增文章
3、栏目管理
4、评论管理
5、系统设置
6、用户管理
7、留言管理
8、博客详情
9、博客评论
等
使用技术
数据库:mysql
开发工具:Idea(Myeclispe、Eclipse也可以)
知识点:springboot+mybatis
项目结构
代码
java端
实体类
Admin.java
package com.lee.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author lee
* @since 2020-02-19
*/
public class Admin extends Model<Admin> {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 管理员账户
*/
@NotEmpty(message = "用户名不能为空!")
private String username;
/**
* 密码
*/
@NotEmpty(message = "密码不能为空!")
private String password;
/**
* 昵称
*/
@NotEmpty(message = "昵称不能为空!")
private String nickname;
/**
* 邮箱
*/
@NotEmpty(message = "邮箱不能为空!")
@Email(message = "邮箱格式不正确")
private String email;
/**
* 状态
*/
private Integer status;
/**
* 是否超级管理员
*/
private Integer isSupper;
/**
* 创建时间
*/
private String createTime;
/**
* 更新时间
*/
private String updateTime;
/**
* 软删除时间
*/
private String deleteTime;
@TableLogic
private Integer isdel;//逻辑删除字段 0 未删除 1已删除
public Integer getIsdel() {
return isdel;
}
public void setIsdel(Integer isdel) {
this.isdel = isdel;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getIsSupper() {
return isSupper;
}
public void setIsSupper(Integer isSupper) {
this.isSupper = isSupper;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(String deleteTime) {
this.deleteTime = deleteTime;
}
@Override
protected Serializable pkVal() {
return this.id;
}
@Override
public String toString() {
return "SbAdmin{" +
"id=" + id +
", username=" + username +
", password=" + password +
", nickname=" + nickname +
", email=" + email +
", status=" + status +
", isSupper=" + isSupper +
", createTime=" + createTime +
", updateTime=" + updateTime +
", deleteTime=" + deleteTime +
"}";
}
}
Article.java
package com.lee.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author lee
* @since 2020-02-22
*/
public class Article extends Model<Article> {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 标题
*/
@NotEmpty(message = "文章标题不能为空")
private String title;
/**
* 概要
*/
private String artdesc;
/**
* 标签
*/
@NotEmpty(message = "文章标签不能为空")
private String tags;
/**
* 内容
*/
private String content;
/**
* 是否推荐
*/
private Integer isTop;
/**
* 所属导航id
*/
private Integer cateId;
/**
* 创建时间
*/
private String createTime;
/**
* 更新时间
*/
private String updateTime;
/**
* 软删除
*/
private String deleteTime;
/**
* 软删除标记位
*/
@TableLogic
private Integer isdel;
/**
* 添加用户id
*/
private Integer memberId;
/**
* 作者
*/
@NotEmpty(message = "文章作者不能为空")
private String authorname;
/**
* 浏览次数
*/
private Integer viewnum;
/**
* 评论次数
*/
private Integer commentnum;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public String getArtdesc() {
return artdesc;
}
public void setArtdesc(String artdesc) {
this.artdesc = artdesc;
}
public void setTitle(String title) {
this.title = title;
}
public String getTags() {
return tags;
}
public void setTags(String tags) {
this.tags = tags;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getIsTop() {
return isTop;
}
public void setIsTop(Integer isTop) {
this.isTop = isTop;
}
public Integer getCateId() {
return cateId;
}
public void setCateId(Integer cateId) {
this.cateId = cateId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(String deleteTime) {
this.deleteTime = deleteTime;
}
public Integer getIsdel() {
return isdel;
}
public void setIsdel(Integer isdel) {
this.isdel = isdel;
}
public Integer getMemberId() {
return memberId;
}
public void setMemberId(Integer memberId) {
this.memberId = memberId;
}
public Integer getViewnum() {
return viewnum;
}
public void setViewnum(Integer viewnum) {
this.viewnum = viewnum;
}
public Integer getCommentnum() {
return commentnum;
}
public void setCommentnum(Integer commentnum) {
this.commentnum = commentnum;
}
public String getAuthorname() {
return authorname;
}
public void setAuthorname(String authorname) {
this.authorname = authorname;
}
@Override
protected Serializable pkVal() {
return this.id;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title=" + title +
", desc=" + artdesc +
", tags=" + tags +
", authorname" + authorname +
", content=" + content +
", isTop=" + isTop +
", cateId=" + cateId +
", createTime=" + createTime +
", updateTime=" + updateTime +
", deleteTime=" + deleteTime +
", isdel=" + isdel +
", memberId=" + memberId +
", viewnum=" + viewnum +
", commentnum=" + commentnum +
"}";
}
}
service层
AdminServiceImpl.java
package com.lee.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lee.entity.Admin;
import com.lee.mapper.AdminMapper;
import com.lee.service.AdminService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* <p>
* 服务实现类
* </p>
*
* @author lee
* @since 2020-02-19
*/
@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService {
@Autowired
private AdminMapper adminMapper;
/**
* 根据用户名和密码获取管理员信息
* @param username
* @param password
* @return
*/
public Admin getInfoByUsernameAndPassword(String username, String password){
Admin admin = adminMapper.selectOne(new QueryWrapper<Admin>().eq("username",username).eq("password",password));
return admin;
}
/**
* 根据查询条件获取管理员列表信息
* @param queryParam
* @param offset
* @param size
* @return
*/
public IPage<Map<String, Object>> getPageInfo(Map<String, Object> queryParam,int offset,int size){
QueryWrapper<Admin> queryWrapper = new QueryWrapper();
if(queryParam.get("username") != null) {
queryWrapper.like("username",queryParam.get("username"));
}
if(queryParam.get("nickname") != null) {
queryWrapper.like("nickname",queryParam.get("nickname"));
}
if(queryParam.get("email") != null) {
queryWrapper.like("email",queryParam.get("email"));
}
queryWrapper.orderByDesc("create_time");
Page<Admin> page = new Page<Admin>(offset/size +1,size);
IPage<Map<String, Object>> mapIPage = adminMapper.selectMapsPage(page, queryWrapper);
return mapIPage;
}
/**
* 根据用户名查询信息,只取一条
* @param username
* @return
*/
public Admin getByUsername(String username){
return adminMapper.selectOne(new QueryWrapper<Admin>().eq("username",username));
}
/**
* 验证用户名规则
* @param username
* @return
*/
}
ArticleServiceImpl.java
package com.lee.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.lee.entity.Article;
import com.lee.entity.Comment;
import com.lee.mapper.ArticleMapper;
import com.lee.mapper.CommentMapper;
import com.lee.service.ArticleService;
import com.lee.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* <p>
* 服务实现类
* </p>
*
* @author lee
* @since 2020-02-22
*/
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {
@Autowired
ArticleMapper articleMapper;
@Autowired
CommentMapper commentMapper;
public IPage<Map<String,Object>> getPageInfo(Map<String,Object> queryParam,int offset,int size){
QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
if(queryParam.get("title") != null) {
queryWrapper.like("title",queryParam.get("title"));
}
queryWrapper.orderByDesc("create_time");
Page<Article> page = new Page<Article>(offset/size+1,size);
IPage<Map<String,Object>> mapIPage = articleMapper.selectMapsPage(page,queryWrapper);
return mapIPage;
}
public IPage<Map<String,Object>> getPageInfoByPageNum(Map<String,Object> queryParam,int pagenum,int size){
QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
if(queryParam.get("title") != null) {
queryWrapper.like("title",queryParam.get("title"));
}
if(queryParam.get("cateid") != null) {
queryWrapper.eq("cate_id",queryParam.get("cateid"));
}
queryWrapper.orderByDesc("create_time");
Page<Article> page = new Page<Article>(pagenum,size);
IPage<Map<String,Object>> mapIPage = articleMapper.selectMapsPage(page,queryWrapper);
return mapIPage;
}
public boolean deleteArticleAndCommentById(Integer id){
commentMapper.deleteByArticleId(id);
return SqlHelper.delBool(articleMapper.deleteById(id));
}
public Article getNextInfo(Map<String,Object> searchParam){
return this.articleMapper.getNextInfo(searchParam);
}
public Article getPreInfo(Map<String,Object> searchParam){
return this.articleMapper.getPreInfo(searchParam);
}
}
controller层
ArticleController.java
package com.lee.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lee.common.DataGrid;
import com.lee.common.DateTimeUtil;
import com.lee.common.Message;
import com.lee.entity.Admin;
import com.lee.entity.Article;
import com.lee.service.ArticleService;
import com.lee.service.CateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 前端控制器
* </p>
*
* @author lee
* @since 2020-02-22
*/
@Controller
@RequestMapping("/admin/article")
public class ArticleController extends BasicController {
@Autowired
ArticleService articleService;
@Autowired
CateService cateService;
@GetMapping("list")
public String list(){
return "admin/article/list";
}
@PostMapping("findList")
@ResponseBody
public DataGrid findList(@RequestBody JSONObject jsonObject){
Map<String, Object> searchParams = (HashMap<String, Object>) jsonObject.get("search");
int offset = "".equals(jsonObject.getString("offset")) ? 0 : jsonObject.getIntValue("offset");
int size = "".equals(jsonObject.getString("limit")) ? 10 : jsonObject.getIntValue("limit");
IPage<Map<String, Object>> page = articleService.getPageInfo(searchParams, offset, size);
DataGrid result = new DataGrid();
result.setTotal(page.getTotal());
result.setRows(page.getRecords());
return result;
}
@GetMapping("add")
public String add(Model model) {
model.addAttribute("cateInfos",cateService.getList());
return "admin/article/add";
}
@PostMapping("add")
@ResponseBody
public Message doAdd(@Validated Article article, HttpServletRequest request){
try {
Admin admin = getCurrentUser(request);
if(admin != null) {
if(article.getIsTop() == null) {
article.setIsTop(0);
}
article.setCreateTime(DateTimeUtil.nowTimeStr());
article.setMemberId(admin.getId());
articleService.save(article);
return Message.success("文章添加成功!");
} else {
return Message.fail("登录超时,请重新登录!",null,"/admin/login");
}
} catch (Exception e) {
return Message.fail("文章数据保存异常,保存失败!");
}
}
@PostMapping("top")
@ResponseBody
public Message top(@RequestParam(value = "id")Integer id,@RequestParam(value = "istop")Integer istop){
try{
Article article = articleService.getById(id);
if(article != null) {
if(istop == 1) {
article.setIsTop(0);
} else if(istop == 0) {
article.setIsTop(1);
}
articleService.updateById(article);
return Message.success("操作成功!");
} else {
return Message.fail("文章不存在或已被删除,操作失败!");
}
} catch (Exception e) {
return Message.fail("文章推荐操作处理异常!");
}
}
@GetMapping("/update/{id}")
public String update(@PathVariable Integer id,Model model){
Article article = articleService.getById(id);
model.addAttribute("cateInfos",cateService.getList());
model.addAttribute("articleInfo",article);
return "admin/article/update";
}
@PostMapping("/update")
@ResponseBody
public Message doUpdate(@Validated Article article){
try{
Article articleInfo = articleService.getById(article.getId());
if(articleInfo != null) {
if(article.getIsTop() == null) {
articleInfo.setIsTop(0);
} else {
articleInfo.setIsTop(article.getIsTop());
}
articleInfo.setTitle(article.getTitle());
articleInfo.setAuthorname(article.getAuthorname());
articleInfo.setTags(article.getTags());
articleInfo.setArtdesc(article.getArtdesc());
articleInfo.setContent(article.getContent());
articleInfo.setCateId(article.getCateId());
articleInfo.setUpdateTime(DateTimeUtil.nowTimeStr());
articleService.updateById(articleInfo);
return Message.success("文章修改成功!");
} else {
return Message.fail("文章不存在或已被删除!");
}
} catch (Exception e) {
return Message.fail("文章修改保存异常,操作失败!");
}
}
@PostMapping("delete")
@ResponseBody
public Message delete(@RequestParam(value = "ids") List<Integer> ids) {
try {
for (int id : ids) {
articleService.deleteArticleAndCommentById(id);
}
return Message.success("文章删除成功");
} catch (Exception e) {
return Message.fail("文章删除异常!");
}
}
}
UserController.java
package com.lee.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lee.common.DataGrid;
import com.lee.common.DateTimeUtil;
import com.lee.common.Message;
import com.lee.entity.Admin;
import com.lee.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/admin/user")
public class UserController extends BasicController {
@Autowired
AdminService adminService;
/**
* 管理员管理列表页面跳转
* @return
*/
@RequestMapping("list")
public String list(HttpServletRequest request){
//TODO 超级管理员权限控制
if(getCurrentUser(request).getIsSupper() == 1) {
return "admin/user/list";
} else {
return "admin/home";
}
}
/**
* 加载列表数据
* @param jsonObject
* @return
*/
@RequestMapping("findList")
@ResponseBody
public DataGrid findList(@RequestBody JSONObject jsonObject){
//获取查询参数
Map<String, Object> searchParams = (HashMap<String, Object>)jsonObject.get("search");
int offset = "".equals(jsonObject.getString("offset"))?0:jsonObject.getIntValue("offset");
int size = "".equals(jsonObject.getString("limit"))?10:jsonObject.getIntValue("limit");
IPage<Map<String, Object>> page = adminService.getPageInfo(searchParams,offset,size);
DataGrid result = new DataGrid();
result.setRows(page.getRecords());
result.setTotal(page.getTotal());
return result;
}
/**
* 管理员添加页面跳转
* @return
*/
@GetMapping("add")
public String add(){
return "admin/user/add";
}
@PostMapping("add")
@ResponseBody
public Message doAdd(@Validated Admin admin,@RequestParam(value = "confirmpassword") String confirmpassword){
try{
//TOTO 可以在service里添加条件验证规则
if(adminService.getByUsername(admin.getUsername()) != null) {
return Message.fail("该用户已存在!");
}
if(!confirmpassword.equals(admin.getPassword())) {
return Message.fail("密码和确认密码不一致!");
}
admin.setCreateTime(DateTimeUtil.nowTimeStr());
adminService.save(admin);
return Message.success("管理员创建成功!");
} catch (Exception e) {
return Message.fail("创建保存异常!");
}
}
/**
* 用户名重复验证
* @param username
* @return
*/
@PostMapping("check")
@ResponseBody
public boolean check(@RequestParam String username){
if(StringUtils.isEmpty(username)){
return false;
}
Admin admin = adminService.getByUsername(username);
if(admin != null) {
return false;
}
return true;
}
@PostMapping("status")
@ResponseBody
public Message status(@RequestParam Integer id){
try {
Admin admin = adminService.getById(id);
if (admin != null) {
String message = admin.getStatus() == 0 ? "管理员禁用成功!" : "管理员启用成功!";
admin.setStatus(admin.getStatus() == 0 ? 1 : 0);
adminService.updateById(admin);
return Message.success(message);
} else {
return Message.fail("管理员信息不存在或已被删除!");
}
}catch ( Exception e) {
return Message.fail("数据操作异常");
}
}
/**
* 修改页面跳转
*/
@GetMapping("update/{id}")
public String update(@PathVariable Integer id, Model model){
Admin admin = adminService.getById(id);
if(admin != null) {
model.addAttribute("adminInfo",admin);
} else {
//TODO 对象已删除,跳转到错误页面
}
return "admin/user/update";
}
/**
* 管理员修改数据提交
* @param admin
* @return
*/
@PostMapping("update")
@ResponseBody
public Message doUpdate(@Validated Admin admin, HttpServletRequest request){
try {
String oldpassword = request.getParameter("oldpassword");
String newpassword = request.getParameter("newpassword");
Admin adminInfo = adminService.getById(admin.getId());
if(StringUtils.isEmpty(newpassword)) {//TODO 增加密码规则验证
return Message.fail("新密码不能为空");
}
if(adminInfo != null) {
if(oldpassword.equals(adminInfo.getPassword())) {
adminInfo.setPassword(newpassword);
adminInfo.setNickname(admin.getNickname());
adminInfo.setEmail(admin.getEmail());
adminInfo.setIsSupper(admin.getIsSupper());
adminInfo.setUpdateTime(DateTimeUtil.nowTimeStr());
adminService.updateById(adminInfo);
return Message.success("管理员信息修改成功");
} else {
return Message.fail("原密码输入错误");
}
} else {
return Message.fail("管理员不存在或已被删除");
}
} catch (Exception e) {
return Message.fail("修改失败");
}
}
@GetMapping("view/{id}")
public String view(@PathVariable Integer id,Model model){
Admin adminInfo = adminService.getById(id);
if(adminInfo != null) {
model.addAttribute("adminInfo",adminInfo);
} else{
//TODO 跳转错误页面
}
return "admin/user/view";
}
@PostMapping("delete")
@ResponseBody
public Message delete(@RequestParam(value = "ids") List<Integer> ids){
try {
for (int id :ids) {
adminService.removeById(id);
}
return Message.success("删除成功");
} catch (Exception e){
return Message.fail("删除异常!");
}
}
}
完整源码
觉得有用,记得一键三连哦!