0 项目说明
基于Spring MVC的博客系统设计与实现
提示:适合用于课程设计或毕业设计,工作量达标,源码开放
1 关于项目
- 该博客是基于SSM实现的个人博客系统,适合初学SSM和个人博客制作的同学学习。
- 最新版本支持用户注册,包含用户和管理员两个角色 。
- 主要涉及技术包括的包括 Maven、Spring、SpringMVC、MyBatis、JSP、MySQL等。
2 效果预览
因博主服务器数量有限,目前该SSM博客已下线,不提供实时预览,大家可以本地部署。
2.1 前台效果图
2.2 后台效果图
后台地址:/admin 或者 /login
3 使用注意
1.开发工具的选择
请使用 IntelliJ IDEA, 尽量不要用 Eclipse/MyEclipse,使用前者项目起不来我可以帮忙解决,后者直接忽视(理论上可以起)
2.确保你安装了 Maven
从官网下载 Maven,并配置阿里云镜像,IDEA 或 Eclipse 里需要设置 Maven 的 settings.xml 。
3.请安装 Lombok 插件
代码中多次使用 @Data
注解,请确保你的 IDE 安装了 Lombok
插件,否则找不到 getter/setter 方法。如果你的 lombok 无效,可能是 pom.xml 里的 lombok 版本和你安装的lombok 版本相差较大。
无论是 Eclipse 还是 IDEA 都需要安装 lombok。
4.项目首页没有文件夹名称
确保 tomcat 配置中 application context
是 /,而不是 /ForestBlog。这是导致你们首页css样式全无的原因,因为引用css路径都是 /xxx/xxx.css
4 使用步骤
1、克隆项目
克隆或者下载项目到本地,解压,主要分为三个部分:ForestBlog、uploads 和 forest_blog.sql
ForestBlog: 完整项目源码, 可以使用 IDEA 导入或者打开,记得要导入里面那个 ForestBlog项目,即 pom.xml所在的父目录。
uploads: 上传图片的目录,与源码分离开来,可以放到物理磁盘某一目录,如D盘某目录,后面会讲
forest_blog.sql: 数据库文件,请先创建数据库,然后以运行sql文件方式导入
2.使用 IDEA 导入Maven项目
确保你安装了 Maven,导入项目时,选择已存在的项目,类型是 Maven 项目。
等待Maven下载完依赖,或者手动点击刷新,如果无法下载请检查 Maven 配置和切换网络,多次尝试。
导入完成后,如果出现Java类里红色报错,多半是 Lombok 插件没有安装。
3、 导入数据库
新建数据库 forest_blog
,导入数据库(即forest_blog.sql)。注意,数据库的编码和排序规则是utf-8和utf-8_general_ci
4、修改项目中的数据库连接信息
修改db.properties
文件,该文件很容易找到,在 src/main/resources 中
里面有 MySQL, 请确保已安装和启动 MySQL
注意修改数据库地址、表名、用户名和密码。
否则项目无法启动
5、配置 tomcat 和 uploads 目录
该项目是 SSM 项目,没有启动类,需要通过 tomcat 来运行。无论是 Eclipse 还是 IDEA 都很容易。
这里主要说一下上传目录映射问题:
该项目中,文件上传是传到本地,且和项目文件夹不在一起,就是说是源码和上传目录是分离的。
比如我们把 uploads 目录放到 E盘根目录(建议直接把我的那个uploads文件夹拷贝到D盘根目录),比如有一张图片路径是 D:/uploads/2017/10/avatar.jpg
, 我们想在项目中以 http://loclahost:8080/uploads/2017/10/avatar.jpg
方式访问,需要以下两步:
1、 修改 UploadFileController.java 中上传路径,需要修改 rootPath 为你指定的 uploads 目录,如 String rootPath ="D:/uploads/";
如果不修改,会出现无法上传失败;
2、为 tomcat 设置 uploads 映射。
- IDEA 操作如下:
在 tomcat 配置中 Deployment 里面添加,如图
- Eclispe 操作如下:
在 Server/server.xml 的 前面添加
<Context path="/" docBase="项目路径,不需要改" debug="0" reloadable="true" />
<Context path="/uploads" docBase="D:/uploads/" debug="0" reloadable="true" />
- Linux 服务器环境部署
在 tomcat/conf/server.xml 的 Host 标签内添加如下代码
<Context path="/" docBase="项目路径如 /www/server/tomcat/webapps/ForestBlog" debug="0" reloadable="true" />
<Context path="/uploads" docBase="/www/uploads" debug="0" reloadable="true" />
如果不修改,会出现uploads的图片无法加载,无法显示上传目录的图片
5 项目源码
package com.liuyanzhao.ssm.blog.controller.admin;
import com.liuyanzhao.ssm.blog.dto.JsonResult;
import com.liuyanzhao.ssm.blog.entity.Article;
import com.liuyanzhao.ssm.blog.entity.Comment;
import com.liuyanzhao.ssm.blog.entity.User;
import com.liuyanzhao.ssm.blog.enums.UserRole;
import com.liuyanzhao.ssm.blog.service.ArticleService;
import com.liuyanzhao.ssm.blog.service.CommentService;
import com.liuyanzhao.ssm.blog.service.UserService;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.liuyanzhao.ssm.blog.util.MyUtils.getIpAddr;
/**
* @author liuyanzhao
*/
@Controller
public class AdminController {
@Autowired
private UserService userService;
@Autowired
private ArticleService articleService;
@Autowired
private CommentService commentService;
/**
* 后台首页
*
* @return
*/
@RequestMapping("/admin")
public String index(Model model, HttpSession session) {
User user = (User) session.getAttribute("user");
Integer userId = null;
if (!UserRole.ADMIN.getValue().equals(user.getUserRole())) {
// 用户查询自己的文章, 管理员查询所有的
userId = user.getUserId();
}
//文章列表
List<Article> articleList = articleService.listRecentArticle(userId, 5);
model.addAttribute("articleList", articleList);
//评论列表
List<Comment> commentList = commentService.listRecentComment(userId, 5);
model.addAttribute("commentList", commentList);
return "Admin/index";
}
/**
* 登录页面显示
*
* @return
*/
@RequestMapping("/login")
public String
loginPage() {
return "Admin/login";
}
/**
* 登录页面显示
*
* @return
*/
@RequestMapping("/register")
public String registerPage() {
return "Admin/register";
}
/**
* 登录验证
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/loginVerify", method = RequestMethod.POST, produces = {"text/plain;charset=UTF-8"})
@ResponseBody
public String loginVerify(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> map = new HashMap<String, Object>();
String username = request.getParameter("username");
String password = request.getParameter("password");
String rememberme = request.getParameter("rememberme");
User user = userService.getUserByNameOrEmail(username);
if (user == null) {
map.put("code", 0);
map.put("msg", "用户名无效!");
} else if (!user.getUserPass().equals(password)) {
map.put("code", 0);
map.put("msg", "密码错误!");
} else if (user.getUserStatus() == 0) {
map.put("code", 0);
map.put("msg", "账号已禁用!");
} else {
//登录成功
map.put("code", 1);
map.put("msg", "");
//添加session
request.getSession().setAttribute("user", user);
//添加cookie
if (rememberme != null) {
//创建两个Cookie对象
Cookie nameCookie = new Cookie("username", username);
//设置Cookie的有效期为3天
nameCookie.setMaxAge(60 * 60 * 24 * 3);
Cookie pwdCookie = new Cookie("password", password);
pwdCookie.setMaxAge(60 * 60 * 24 * 3);
response.addCookie(nameCookie);
response.addCookie(pwdCookie);
}
user.setUserLastLoginTime(new Date());
user.setUserLastLoginIp(getIpAddr(request));
userService.updateUser(user);
}
String result = new JSONObject(map).toString();
return result;
}
/**
* 登录验证
*
* @param request
* @return
*/
@RequestMapping(value = "/registerSubmit", method = RequestMethod.POST)
@ResponseBody
public JsonResult registerSubmit(HttpServletRequest request) {
String username = request.getParameter("username");
String nickname = request.getParameter("nickname");
String email = request.getParameter("email");
String password = request.getParameter("password");
User checkUserName = userService.getUserByName(username);
if (checkUserName != null) {
return new JsonResult().fail("用户名已存在");
}
User checkEmail = userService.getUserByEmail(username);
if (checkEmail != null) {
return new JsonResult().fail("电子邮箱已存在");
}
// 添加用户
User user = new User();
user.setUserAvatar("/img/avatar/avatar.png");
user.setUserName(username);
user.setUserNickname(nickname);
user.setUserPass(password);
user.setUserEmail(email);
user.setUserStatus(1);
user.setArticleCount(0);
user.setUserRole(UserRole.USER.getValue());
try {
userService.insertUser(user);
} catch (Exception e) {
e.printStackTrace();
return new JsonResult().fail("系统异常");
}
return new JsonResult().ok("注册成功");
}
/**
* 退出登录
*
* @param session
* @return
*/
@RequestMapping(value = "/admin/logout")
public String logout(HttpSession session) {
session.removeAttribute("user");
session.invalidate();
return "redirect:/login";
}
/**
* 基本信息页面显示
*
* @return
*/
@RequestMapping(value = "/admin/profile")
public ModelAndView userProfileView(HttpSession session) {
ModelAndView modelAndView = new ModelAndView();
User sessionUser = (User) session.getAttribute("user");
User user = userService.getUserById(sessionUser.getUserId());
modelAndView.addObject("user", user);
modelAndView.setViewName("Admin/User/profile");
return modelAndView;
}
/**
* 编辑个人信息页面显示
*
* @param session
* @return
*/
@RequestMapping(value = "/admin/profile/edit")
public ModelAndView editUserView(HttpSession session) {
ModelAndView modelAndView = new ModelAndView();
User loginUser = (User) session.getAttribute("user");
User user = userService.getUserById(loginUser.getUserId());
modelAndView.addObject("user", user);
modelAndView.setViewName("Admin/User/editProfile");
return modelAndView;
}
/**
* 编辑用户提交
*
* @param user
* @return
*/
@RequestMapping(value = "/admin/profile/save", method = RequestMethod.POST)
public String saveProfile(User user, HttpSession session) {
User dbUser = (User) session.getAttribute("user");
user.setUserId(dbUser.getUserId());
userService.updateUser(user);
return "redirect:/admin/profile";
}
}
6 最后
**项目分享: ** https://gitee.com/asoonis/htw
**项目分享: ** https://gitee.com/asoonis/htw