基于JSP和MYSQL实现的博客管理系统

基于JSP和MYSQL实现的博客管理系统 一,概述 1,1 开发背景 随着一个个开源社区的不断成长,越来越多的技术人员在各种论坛发表自己的技术博客(blog)

本文包含相关资料包-----> 点击直达获取<-------

基于JSP和MYSQL实现的博客管理系统

一、概述

1.1 开发背景

随着一个个开源社区的不断成长,越来越多的技术人员在各种论坛发表自己的技术博客(blog),本系统希望实现一个团队博客管理的目的,即将一个团队成员的所有博客进行统一管理,有利于团队内部人员的技术交流和共同成长。

1.2 开发目标

通过本系统,使用者可以看到团队中所有的成员,管理员登录后可以对团队的人员进行编辑和管理。同时,管理员可以对系统成员的博客进行查看和管理。

1.3 参考资料

  • springmvc官方文档:http://projects.spring.io/spring-framework/

  • springmvc主要框架介绍:http://spring.io/projects

  • 一位大牛的教程:https://my.oschina.net/gaussik/blog

二、需求分析

2.1 需求陈述

  • 管理员的注册以及登录

  • 用户的管理

  • 博客的管理

2.2 操作用例

2.2.1 管理员注册与登录

用户进入该模块之后只需输入nickname和密码然后点击登录即可进行登录,若需要注册只需点击对应的注册button进入注册页面,注册页面与登录页面想死,主要区别是后端的处理。

2.2.2 用户信息管理

这个模块首先使用表格的形式展示出当前系统所的用户信息,其次,对每一个用户都应该有详情、修改、删除三个按钮以管理用户。另外,在本页面还需有一个增加用户的button用于管理员增加用户。

2.2.3 博客信息管理

本页面以表格的形式列出当前系统的所有博客,博客信息包括博客的标题、作者、发布日期,对于每一篇博客应该留有详情、修改、删除三大按钮,另外在本页面还需设置一个添加博客的按钮以添加新博客。

2.3 功能分析划分

划分为登录注册、用户管理、博客管理三大功能模块

2.3.1 系统登录注册

实现管理员登录和注册,注册并登录成功后默认进入用户管理模块,可以看到当前系统的所有用户信息并对其进行管理。

2.3.2 用户管理

实现用户信息的显示、添加、删除、修改功能。

2.3.3 博客管理

实现博客的显示、添加、删除、修改功能。

2.4 运行环境

Ubuntu16.04+Intellij IDEA+tomcat8.5+MySQL

三、总体设计

3.1 UML类图

3.2 界面设计

3.2.1 登录界面设计

3.2.2 注册界面设计

3.2.3 用户管理界面设计

3.2.4 博客管理界面设计

3.3 数据库结构设计

3.3.1 user(用户)

Column Type Nullable Auto_increment
id int(11) NO YES
nickname varchar(45) NO NO
password varchar(45) NO NO
first_name varchar(45) YES NO
last_name varchar(45) YES NO

3.3.2 blog(博客)

Column Type Nullable Auto_increment
id int(11) NO YES
title varchar(100) NO NO
content varchar(255) YES NO
user_id int(11) NO NO
pub_date date NO NO

3.3.3 manager(管理员)

Column Type Nullable Auto_increment
id int(11) NO YES
nickname varchar(45) NO NO
password varchar(45) NO NO

3.3.4 数据库E-R图

四、详细设计

4.1 程序流程图

4.2 实现

4.2.1 controller

BlogController

```java package com.dmrf.controller;

import com.dmrf.model.BlogEntity; import com.dmrf.model.UserEntity; import com.dmrf.repository.BlogRepository; import com.dmrf.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/* * Created by dmrf on 2018/5/10. / @Controller public class BlogController {

@Autowired
BlogRepository blogRepository;

@Autowired
UserRepository userRepository;

// 查看所有博文
@RequestMapping(value = "/admin/blogs", method = RequestMethod.GET)
public String showBlogs(ModelMap modelMap) {
    List<BlogEntity> blogList = blogRepository.findAll();
    modelMap.addAttribute("blogList", blogList);
    return "admin/blogs";
}

// 添加博文
@RequestMapping(value = "/admin/blogs/add", method = RequestMethod.GET)
public String addBlog(ModelMap modelMap) {
    List<UserEntity> userList = userRepository.findAll();
    // 向jsp注入用户列表
    modelMap.addAttribute("userList", userList);
    return "admin/addBlog";
}

// 添加博文,POST请求,重定向为查看博客页面
@RequestMapping(value = "/admin/blogs/addP", method = RequestMethod.POST)
public String addBlogPost(@ModelAttribute("blog") BlogEntity blogEntity) {
    // 打印博客标题
    System.out.println(blogEntity.getTitle());
    // 打印博客作者
    System.out.println(blogEntity.getUserByUserId().getNickname());
    // 存库
    blogRepository.saveAndFlush(blogEntity);
    // 重定向地址
    return "redirect:/admin/blogs";
}

// 查看博文详情,默认使用GET方法时,method可以缺省
@RequestMapping("/admin/blogs/show/{id}")
public String showBlog(@PathVariable("id") int id, ModelMap modelMap) {
    BlogEntity blog = blogRepository.findOne(id);
    modelMap.addAttribute("blog", blog);
    return "admin/blogDetail";
}

// 修改博文内容,页面
@RequestMapping("/admin/blogs/update/{id}")
public String updateBlog(@PathVariable("id") int id, ModelMap modelMap) {
    // 是不是和上面那个方法很像
    BlogEntity blog = blogRepository.findOne(id);
    List<UserEntity> userList = userRepository.findAll();
    modelMap.addAttribute("blog", blog);
    modelMap.addAttribute("userList", userList);
    return "admin/updateBlog";
}

// 修改博客内容,POST请求
@RequestMapping(value = "/admin/blogs/updateP", method = RequestMethod.POST)
public String updateBlogP(@ModelAttribute("blogP") BlogEntity blogEntity) {
    // 更新博客信息
    System.out.println(blogEntity.getTitle());
    blogRepository.updateBlog(blogEntity.getTitle(), blogEntity.getUserByUserId().getId(),
            blogEntity.getContent(), blogEntity.getPubDate(), blogEntity.getId());
    blogRepository.flush();
    return "redirect:/admin/blogs";
}

// 删除博客文章
@RequestMapping("/admin/blogs/delete/{id}")
public String deleteBlog(@PathVariable("id") int id) {
    blogRepository.delete(id);
    blogRepository.flush();
    return "redirect:/admin/blogs";
}

} ```

UserController

```java package com.dmrf.controller;

import com.dmrf.model.UserEntity; import com.dmrf.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/* * Created by dmrf on 2018/5/10. / @Controller public class UserController {

// 自动装配数据库接口,不需要再写原始的Connection来操作数据库
@Autowired
UserRepository userRepository;
@RequestMapping(value = "/admin/users", method = {RequestMethod.GET,RequestMethod.POST})
public String getUsers(ModelMap modelMap) {
    // 查询user表中所有记录
    List<UserEntity> userList = userRepository.findAll();

    // 将所有记录传递给要返回的jsp页面,放在userList当中
    modelMap.addAttribute("userList", userList);

    // 返回pages目录下的admin/users.jsp页面
    return "admin/users";
}

// get请求,访问添加用户 页面
@RequestMapping(value = "/admin/users/add", method = RequestMethod.GET)
public String addUser() {
    // 返回 admin/addUser.jsp页面
    return "admin/addUser";
}
// post请求,处理添加用户请求,并重定向到用户管理页面
@RequestMapping(value = "/admin/users/addP", method = RequestMethod.POST)
public String addUserPost(@ModelAttribute("user") UserEntity userEntity) {
    // 注意此处,post请求传递过来的是一个UserEntity对象,里面包含了该用户的信息
    // 通过@ModelAttribute()注解可以获取传递过来的'user',并创建这个对象

    // 数据库中添加一个用户,该步暂时不会刷新缓存
    //userRepository.save(userEntity);
    System.out.println(userEntity.getFirstName());
    System.out.println(userEntity.getLastName());

    // 数据库中添加一个用户,并立即刷新缓存
    userRepository.saveAndFlush(userEntity);

    // 重定向到用户管理页面,方法为 redirect:url
    return "redirect:/admin/users";
}

// 查看用户详情
// @PathVariable可以收集url中的变量,需匹配的变量用{}括起来
// 例如:访问 localhost:8080/admin/users/show/1 ,将匹配 id = 1
@RequestMapping(value = "/admin/users/show/{id}", method = RequestMethod.GET)
public String showUser(@PathVariable("id") Integer userId, ModelMap modelMap) {

    // 找到userId所表示的用户
    UserEntity userEntity = userRepository.findOne(userId);

    // 传递给请求页面
    modelMap.addAttribute("user", userEntity);
    return "admin/userDetail";
}

// 更新用户信息 页面
@RequestMapping(value = "/admin/users/update/{id}", method = RequestMethod.GET)
public String updateUser(@PathVariable("id") Integer userId, ModelMap modelMap) {

    // 找到userId所表示的用户
    UserEntity userEntity = userRepository.findOne(userId);

    // 传递给请求页面
    modelMap.addAttribute("user", userEntity);
    return "admin/updateUser";
}

// 更新用户信息 操作
@RequestMapping(value = "/admin/users/updateP", method = RequestMethod.POST)
public String updateUserPost(@ModelAttribute("userP") UserEntity user) {

    // 更新用户信息
    userRepository.updateUser(user.getNickname(), user.getFirstName(),
            user.getLastName(), user.getPassword(), user.getId());
    userRepository.flush(); // 刷新缓冲区
    return "redirect:/admin/users";
}

// 删除用户
@RequestMapping(value = "/admin/users/delete/{id}", method = RequestMethod.GET)
public String deleteUser(@PathVariable("id") Integer userId) {

    // 删除id为userId的用户
    userRepository.delete(userId);
    // 立即刷新
    userRepository.flush();
    return "redirect:/admin/users";
}

} ```

MainController

```java package com.dmrf.controller;

import com.dmrf.model.ManagerEntity; import com.dmrf.repository.ManagerRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

@Controller public class MainController { // 自动装配数据库接口,不需要再写原始的Connection来操作数据库 @Autowired ManagerRepository managerRepository;

@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
    return "admin/login";
}

@RequestMapping(value = "/admin/manager/signupP", method = RequestMethod.POST)
public String addManagerPost(@ModelAttribute("manager") ManagerEntity managerEntity) {
    // 注意此处,post请求传递过来的是一个ManagerEntity对象,里面包含了该用户的信息
    // 通过@ModelAttribute()注解可以获取传递过来的'manager',并创建这个对象

    // 数据库中添加一个用户,该步暂时不会刷新缓存

// userRepository.save(userEntity); System.out.println(managerEntity.getNickname()); System.out.println(managerEntity.getPassword()); // 存库 managerRepository.saveAndFlush(managerEntity);

    // 重定向到首页
    return "admin/blogs";
}

@RequestMapping(value = "/admin/signupP", method = RequestMethod.GET)
public String SignUp() {
    System.out.println("signup");
    return "admin/signup";
}

@RequestMapping(value = "/admin/loginP", method = RequestMethod.POST)
public String Login(@ModelAttribute("manager") ManagerEntity managerEntity) {
    System.out.println(managerEntity.getNickname());
    System.out.println(managerEntity.getPassword());

    // 找到userId所表示的用户
    ManagerEntity managerEntity1 = managerRepository.queryManager(managerEntity.getNickname(), managerEntity.getPassword());

    if(managerEntity1 == null) {return "error";}
    return "admin/blogs";
}
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(){
    return "hello";
}

} ```

4.2.2 model

BlogEntity

```java package com.dmrf.model;

import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*; import java.util.Date;

/* * Created by dmrf on 2018/5/10. / @Entity @Table(name = "blog", schema = "springdemo", catalog = "") public class BlogEntity { private int id; private String title; private String content; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date pubDate; private UserEntity userByUserId;

@Id
@Column(name = "id", nullable = false)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Basic
@Column(name = "title", nullable = false, length = 100)
public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

@Basic
@Column(name = "content", nullable = true, length = 255)
public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

@Basic
@Column(name = "pub_date", nullable = false)
public Date getPubDate() {
    return pubDate;
}

public void setPubDate(Date pubDate) {
    this.pubDate = pubDate;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    BlogEntity that = (BlogEntity) o;

    if (id != that.id) return false;
    if (title != null ? !title.equals(that.title) : that.title != null) return false;
    if (content != null ? !content.equals(that.content) : that.content != null) return false;
    if (pubDate != null ? !pubDate.equals(that.pubDate) : that.pubDate != null) return false;

    return true;
}

@Override
public int hashCode() {
    int result = id;
    result = 31 * result + (title != null ? title.hashCode() : 0);
    result = 31 * result + (content != null ? content.hashCode() : 0);
    result = 31 * result + (pubDate != null ? pubDate.hashCode() : 0);
    return result;
}

@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
public UserEntity getUserByUserId() {
    return userByUserId;
}

public void setUserByUserId(UserEntity userByUserId) {
    this.userByUserId = userByUserId;
}

} ```

ManagerEntity

```java package com.dmrf.model;

import javax.persistence.*; import java.util.Objects;

//@NamedQuery(name = "ManagerEntity.queryManager", query = "SELECT mg FROM ManagerEntity mg WHERE mg.nickname AND mg.password") @Entity @Table(name = "manager", schema = "springdemo", catalog = "") public class ManagerEntity { private int id; private String nickname; private String password;

@Id
@Column(name = "id", nullable = false)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Basic
@Column(name = "nickname", nullable = false, length = 45)
public String getNickname() {
    return nickname;
}

public void setNickname(String nickname) {
    this.nickname = nickname;
}

@Basic
@Column(name = "password", nullable = false, length = 45)
public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    ManagerEntity that = (ManagerEntity) o;
    return id == that.id &&
            Objects.equals(nickname, that.nickname) &&
            Objects.equals(password, that.password);
}

@Override
public int hashCode() {

    return Objects.hash(id, nickname, password);
}

} ```

UserEntity

```java package com.dmrf.model;

import javax.persistence.*; import java.util.Collection;

/* * Created by dmrf on 2018/5/10. / @Entity @Table(name = "user", schema = "springdemo", catalog = "") public class UserEntity { private int id; private String nickname; private String password; private String firstName; private String lastName; private Collection blogsById;

@Id
@Column(name = "id", nullable = false)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Basic
@Column(name = "nickname", nullable = false, length = 45)
public String getNickname() {
    return nickname;
}

public void setNickname(String nickname) {
    this.nickname = nickname;
}

@Basic
@Column(name = "password", nullable = false, length = 45)
public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Basic
@Column(name = "first_name", nullable = true, length = 45)
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@Basic
@Column(name = "last_name", nullable = true, length = 45)
public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    UserEntity that = (UserEntity) o;

    if (id != that.id) return false;
    if (nickname != null ? !nickname.equals(that.nickname) : that.nickname != null) return false;
    if (password != null ? !password.equals(that.password) : that.password != null) return false;
    if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) return false;
    if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != null) return false;

    return true;
}

@Override
public int hashCode() {
    int result = id;
    result = 31 * result + (nickname != null ? nickname.hashCode() : 0);
    result = 31 * result + (password != null ? password.hashCode() : 0);
    result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
    result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
    return result;
}

@OneToMany(mappedBy = "userByUserId")
public Collection<BlogEntity> getBlogsById() {
    return blogsById;
}

public void setBlogsById(Collection<BlogEntity> blogsById) {
    this.blogsById = blogsById;
}

} ```

4.2.3 repository

BlogRepository

```java package com.dmrf.repository;

import com.dmrf.model.BlogEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/* * Created by dmrf on 2018/5/10. / @Repository public interface BlogRepository extends JpaRepository {

// 修改博文操作
@Modifying
@Transactional
@Query("update BlogEntity blog set blog.title=:qTitle, blog.userByUserId.id=:qUserId," +
        " blog.content=:qContent, blog.pubDate=:qPubDate where blog.id=:qId")
void updateBlog(@Param("qTitle") String title, @Param("qUserId") int userId, @Param("qContent") String content,
                @Param("qPubDate") Date pubDate, @Param("qId") int id);

} ```

ManagerRepository

```java package com.dmrf.repository;

import com.dmrf.model.ManagerEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;

/* * Created by dmrf on 2018/5/10. / @Repository public interface ManagerRepository extends JpaRepository {

@Modifying      // 说明该方法是修改操作
@Transactional  // 说明该方法是事务性操作
// 定义查询
// @Param注解用于提取参数
@Query("update ManagerEntity  us set us.nickname=:qNickname,  us.password=:qPassword where us.id=:qId")
public void updateManager(@Param("qNickname") String nickname, @Param("qPassword") String password, @Param("qId") Integer id);
@Query("SELECT mg FROM ManagerEntity mg WHERE mg.nickname=:qNickname AND mg.password=:qPassword")
public ManagerEntity queryManager(@Param("qNickname") String nickname, @Param("qPassword") String password);

} ```

UserRepository

```java package com.dmrf.repository;

import com.dmrf.model.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;

/* * Created by dmrf on 2018/5/10. / @Repository public interface UserRepository extends JpaRepository {

@Modifying      // 说明该方法是修改操作
@Transactional  // 说明该方法是事务性操作
// 定义查询
// @Param注解用于提取参数
@Query("update UserEntity us set us.nickname=:qNickname, us.firstName=:qFirstName, us.lastName=:qLastName, us.password=:qPassword where us.id=:qId")
public void updateUser(@Param("qNickname") String nickname, @Param("qFirstName") String firstName,
                       @Param("qLastName") String qLastName, @Param("qPassword") String password, @Param("qId") Integer id);

} ```

五、测试

5.1 注册测试

5.2 登录测试

5.3 添加用户测试

5.4 删除用户测试

5.5 查看用户详情测试

5.6 添加博客测试

5.7 删除博客测试

5.8 查看博客详情测试

六、总结

6.1 对mvc模式的理解和感悟

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) :模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器

  • View(视图) :视图代表模型包含的数据的可视化

  • Controller(控制器) :控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开

在本项目中使用mvc模式,具体的model为三个Entity,controller为三个controller,view则是不同的jsp页面。具体机制是Event(事件)导致Controller改变Model或View,或者同时改变两者。只要 Controller改变了Model的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。通过这种模式,我们可以将系统的不同模块分离开来,对每一个功能模块分别进行开发和修改,各个模块之间层次分明,利于维护和团队交接开发。

参考文献

  • 基于JSP的实验室项目管理系统的设计与实现(武汉理工大学·吕勇)
  • 基于B/S结构的新闻发布系统(吉林大学·郭蕊)
  • 基于Java EE的个人博客管理系统的设计和实现(内蒙古大学·闫伟光)
  • 基于MD5改进算法的安全教师博客系统设计及开发(湖南大学·刘曼春)
  • 基于SSH2的轻博客系统的研究与实现(吉林大学·杨雪梅)
  • 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊)
  • 基于JSP平台的信息发布系统的设计与实现(北京工业大学·徐慧君)
  • 网络流量统计分析系统(吉林大学·石景龙)
  • 基于JSP的网上书店系统的设计与实现(吉林大学·马新)
  • 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊)
  • 基于EPP的域名管理系统(山东大学·孟庆领)
  • 用JSP技术开发基于WEB的房地产网络管理信息系统(大连理工大学·齐鲲鹏)
  • 基于Java EE的个人博客管理系统的设计和实现(内蒙古大学·闫伟光)
  • 基于SSH框架的企业内博客系统的设计与实现(山东大学·柳青)
  • 基于MD5改进算法的安全教师博客系统设计及开发(湖南大学·刘曼春)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码货栈 ,原文地址:https://m.bishedaima.com/yuanma/35455.html

相关推荐

发表回复

登录后才能评论