Java项目:SSM个人博客管理系统

作者主页:夜未央5788

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

项目介绍

管理员角色包含以下功能:
发博客,审核评论,博客增删改查,博客类别增删改查,修改导航,评论增删改查,个人信息修改,登陆页面等功能。

游客角色包含以下功能:
博客首页,查看博客详情,按照日志类别查找,发表评论等功能。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 

5.数据库:MySql 5.7版本;

技术栈

1. 后端:Spring+SpringMVC+Mybatis

2. 前端:HTML+CSS+JavaScript+jsp

使用说明

1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;
2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;
3. 将项目中application.yml配置文件中的数据库配置改为自己的配置;

4. 运行项目,输入localhost:8080/ 登录

运行截图

 

 

 

 

 

 

 

相关代码

博客Controller

package com.june.web.controller.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.june.lucene.BlogIndex;
import com.june.model.Blog;
import com.june.model.BlogType;
import com.june.model.PageBean;
import com.june.service.BlogService;
import com.june.service.BlogTypeService;
import com.june.service.CommentService;
import com.june.util.Constants;
import com.june.util.DateUtils;
import com.june.util.PageUtils;
import com.june.util.StringUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 博客Controller
 */
@Controller
@RequestMapping("/blog")
public @Slf4j class BlogAdminController {

	@Resource
	private BlogService blogService;

	@Resource
	private BlogTypeService blogTypeService;

	@Resource
	private CommentService commentService;
	
	@Resource
	private BlogIndex blogIndex;
	
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer page, 
			@RequestParam(defaultValue = Constants.DEFAULT_PAGE_SIZE - 1 + "") Integer pageSize,
			String firstDate, String secondDate, Integer typeId, String title, Model model,
			HttpServletRequest request) {

		Map<String, Object> map = new HashMap<>(6);
		map.put("typeId", typeId);
		map.put("title", title);
		map.put("firstDate", firstDate);
		map.put("secondDate", secondDate);
		int totalCount = blogService.getCount(map);
		PageBean pageBean = new PageBean(totalCount, page, pageSize);
		map.put("start", pageBean.getStart());
		map.put("size", pageSize);
		model.addAttribute("pagination", pageBean);
		
		List<BlogType> blogTypeList = blogTypeService.getTypeList();
		model.addAttribute("blogTypeList",blogTypeList);

		StringBuilder param = new StringBuilder(); // 分页查询参数
		param.append(StringUtils.isEmpty(title) ? "" : "title=" + title);
		param.append(StringUtils.isEmpty(firstDate) ? "" : "&firstDate=" + firstDate);
		param.append(StringUtils.isEmpty(secondDate) ? "" : "&secondDate=" + secondDate);
		param.append(typeId == null ? "" : "&typeId=" + typeId);

		String pageCode = PageUtils.genPagination(request.getContextPath() + "/blog/list.do",
				pageBean, param.toString());
		model.addAttribute("pageCode", pageCode);
		model.addAttribute("entry", map);
		model.addAttribute("blogList", blogService.getBlogList(map));
		return "blog/list";
	}

	@RequestMapping("/toAdd")
	public String toAdd(Model model) {
		model.addAttribute("blogTypeList", blogTypeService.getTypeList());
		return "blog/add";
	}

	@RequestMapping("/toUpdate")
	public String toUpdate(Integer id, Model model) {
		model.addAttribute("blogTypeList", blogTypeService.getTypeList());
		Blog blog = blogService.findById(id);
		model.addAttribute("blog", blog);
		BlogType blogType = blog.getBlogType();
		if(blogType != null){
			model.addAttribute("typeId", blogType.getTypeId());
		}
		return "blog/update";
	}

	@RequestMapping("/add")
	public void add(Blog blog, @RequestParam(value = "img") MultipartFile file,
			Model model) throws Exception {

		// 获取原始文件名
		String fileName = file.getOriginalFilename();
		int index = fileName.indexOf(".");
		String imageUrl = null;
		String imagePath = DateUtils.getTimeStrForImage();
		if (index != -1) {
			//生成新文件名
			imageUrl = imagePath + fileName.substring(index);
			log.info("add {}", imagePath);
			handleFileUpload(file, imageUrl);
			blog.setImage(imageUrl);
		}
		// 添加博客及索引
		int result = blogService.add(blog);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/update")
	public void update(Blog blog, @RequestParam(value = "img", required=false) MultipartFile file,
			Model model) throws Exception {

		if (file != null) {	 //上传图片
			// 获取原始文件名
			String fileName = file.getOriginalFilename();
			int index = fileName.indexOf(".");
			String imageUrl = null;
			String imagePath = DateUtils.getTimeStrForImage();
			if(index != -1){
				//生成新文件名
				imageUrl = imagePath + fileName.substring(index);
				log.info("update {}", imagePath);
				handleFileUpload(file,imageUrl);
				blog.setImage(imageUrl);
			}
		}
		//更新博客及索引
		int result = blogService.update(blog);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/delete")
	public String delete(Integer id) throws IOException {
		// 删除博客、索引及评论
		blogService.delete(id);
		return "redirect:/blog/list.do";
	}

	@RequestMapping("/deletes")
	public String deletes(String ids) throws IOException {
		String[] idArr = org.springframework.util.StringUtils.commaDelimitedListToStringArray(ids);
		int len = idArr.length;
		Integer[] blogIds = new Integer[len];
		for (int i = 0; i < len; i++) {
			blogIds[i] = Integer.parseInt(idArr[i]);
		}
		blogService.batchDelete(blogIds);
		return "redirect:/blog/list.do";
	}
	
	private void handleFileUpload(MultipartFile file, String imageUrl) {
		try (InputStream is = file.getInputStream()) {
			// 获取输入流
			String filePath = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(0,Thread.currentThread().getContextClassLoader().getResource("").getPath().length()-16)+Constants.COVER_DIR + imageUrl;
			File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
			//判断上传目录是否存在
			if (!dir.exists()) {
				dir.mkdirs();
			}
			try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
				byte[] buffer = new byte[1024];
				int len = 0;
				// 读取输入流中的内容
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
				}
			}
		} catch (Exception e) {
			log.error("图片上传失败", e);
		}
	}
}

BloggerAdminController

package com.june.web.controller.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.june.model.Blogger;
import com.june.service.BloggerService;
import com.june.service.CommentService;
import com.june.util.Constants;
import com.june.util.DateUtils;
import com.june.util.ResponseUtils;
import com.june.util.ShiroUtils;

import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/blogger")
public @Slf4j class BloggerAdminController {

	@Resource
	private CommentService commentService;

	@Resource
	private BloggerService bloggerService;

	@RequestMapping("/toModifyInfo")
	public String toModifyInfo(Model model) {
		model.addAttribute("blogger", bloggerService.find());
		return "blogger/modifyInfo";
	}

	@RequestMapping("/toModifyPassword")
	public String toModifyPassword() {
		return "blogger/modifyPassword";
	}

	@RequestMapping("/modifyInfo")
	public void modifyInfo(Blogger blogger,
			@RequestParam(value = "img", required = false) MultipartFile file,
			Model model) throws Exception {
		
		if (file != null) {	 //上传图片
			// 获取原始文件名
			String fileName = file.getOriginalFilename();
			int index = fileName.indexOf(".");
			String imageUrl = null;
			if (index != -1) {
				// 生成新文件名
				imageUrl = DateUtils.getTimeStrForImage() + fileName.substring(index);
				handleFileUpload(file, imageUrl);
				blogger.setImageUrl(imageUrl);
			}
		}
		int result = bloggerService.update(blogger);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/modifyPassword")
	public void modifyPassword(String newpwd, String oldpwd, String repwd, HttpServletResponse response,
			HttpServletRequest request) {

		Blogger blogger = bloggerService.find();
		if (!blogger.getPassword().equals(ShiroUtils.encryptPassword(oldpwd))) {
			ResponseUtils.writeText(response, "原密码输入不正确");
			return;
		}
		if (!newpwd.equals(repwd)) {
			ResponseUtils.writeText(response, "两次密码输入不一致");
			return;
		}
		blogger.setPassword(ShiroUtils.encryptPassword(newpwd));
		bloggerService.update(blogger);
		ResponseUtils.writeText(response, "修改成功");
	}

	private void handleFileUpload(MultipartFile file,String imageUrl) {
		try (InputStream is = file.getInputStream()) {
			// 获取输入流
			String filePath = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(0,Thread.currentThread().getContextClassLoader().getResource("").getPath().length()-16)+Constants.AVATAR_DIR + imageUrl;
			File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
			//判断上传目录是否存在
			if (!dir.exists()) {
				dir.mkdirs();
			}
			try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
				byte[] buffer = new byte[1024];
				int len = 0;
				// 读取输入流中的内容
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
				}
			}
		} catch (Exception e) {
			log.error("图片上传失败", e);
		}
	}
}

博客类型

package com.june.web.controller.admin;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.june.model.BlogType;
import com.june.model.PageBean;
import com.june.service.BlogService;
import com.june.service.BlogTypeService;
import com.june.util.Constants;
import com.june.util.PageUtils;
import com.june.util.ResponseUtils;

/**
 * 博客类别Controller
 */
@Controller
@RequestMapping("/blogType")
public class BlogTypeAdminController {

	@Resource
	private BlogTypeService blogTypeService;
	
	@Resource
	private BlogService blogService;

	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = Constants.BACK_PAGE_SIZE + 3 + "") Integer pageSize,
			Model model, HttpServletRequest request) {
		int totalCount = blogTypeService.getCount();
		PageBean pageBean = new PageBean(totalCount, page, pageSize);
		Map<String, Object> params = new HashMap<>(2);
		params.put("start", pageBean.getStart());
		params.put("size", pageSize);
		List<BlogType> blogTypeList = blogTypeService.getTypeList(params);
		blogTypeList.forEach(blogType -> {
			Map<String, Object> types = new HashMap<>(1);
			types.put("typeId", blogType.getTypeId());
			Integer blogCount = blogService.getCount(types);
			blogType.setBlogCount(blogCount);
		});
		model.addAttribute("pagination", pageBean);

		String targetUrl = request.getContextPath() + "/blogType/list.do";
		String pageCode = PageUtils.genPagination(targetUrl, pageBean, "");
		model.addAttribute("pageCode", pageCode);
		model.addAttribute("entry", params);
		model.addAttribute("blogTypeList", blogTypeList);
		return "blogType/list";
	}

	@RequestMapping("/toAdd")
	public String toAdd() {
		return "blogType/add";
	}

	@RequestMapping("/toUpdate")
	public String toUpdate(Integer id,Model model) {
		model.addAttribute("blogType", blogTypeService.findById(id));
		return "blogType/update";
	}

	@RequestMapping("/add")
	public void add(BlogType blogType,Model model) {
		int result = blogTypeService.add(blogType);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}
	
	@RequestMapping("/update")
	public void update(BlogType blogType,Model model) {
		int result = blogTypeService.update(blogType);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}
	
	@RequestMapping("/search")
	public void search(Integer id,HttpServletResponse response){
		JSONObject jsonObj = new JSONObject();
		Map<String, Object> map = new HashMap<>(1);
		map.put("typeId", id);
		jsonObj.put("count", blogService.getCount(map));
		ResponseUtils.writeJson(response, jsonObj.toString());
	}

	//只删除类别
	@RequestMapping("/delete")
	public String delete(Integer id) {
		blogTypeService.delete(id);
		return "redirect:/blogType/list.do";
	}

	//删除的同时将相关博客的类别置为默认分类
	@RequestMapping("/batch_delete")
	public String batchDelete(Integer id) throws IOException {
		blogTypeService.batchDelete(id);
		return "redirect:/blogType/list.do";
	}
}

如果也想学习本系统,下面领取。关注并回复:128ssm 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜未央5788

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值