基于javaweb+mysql的springboot简单博客管理系统(java+springboot+html+maven+mysql)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SpringBoot简单博客管理系统(java+springboot+html+maven+mysql)
项目介绍
本项目为前后台管理系统,包括博主与游客两种角色; 博主角色包含以下功能: 博主登录,发博客,博主可以删除博客等功能。 游客角色包含以下功能: 首页,查看博客,添加评论,搜索-标签筛选等功能。
环境需要
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版本;
技术栈
-
后端:SpringBoot
-
前端:HTML+CSS+JavaScript+jsp
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.yml配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入localhost:8080/ 登录
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
@Table(name = "message")
public class Message {
private Long id;
private Long blogId;
private Boolean deleteFlag;
private String content;
private String nickName;
private Date createTime;
private Date updateTime;
public Message() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Boolean getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Boolean deleteFlag) {
return "刚刚";
}
if(now.getTime() < thM){
return "半小时前";
}
if(now.getTime() < oneH){
return "一小时前";
}
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
}
public interface MessageDao extends BaseDao<Message> {
}
public interface BlogDao extends BaseDao<Blog> {
}
public interface UserDao extends BaseDao<User> {
}
<%
layout("/common/layout.html",{title:"首页"}){
%>
beetlGroupUtilConfiguration.init();
//如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoader
beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);
return beetlGroupUtilConfiguration;
}
@Bean(name = "beetlViewResolver")
public BeetlSpringViewResolver getBeetlSpringViewResolver(BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
beetlSpringViewResolver.setOrder(0);
beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration);
return beetlSpringViewResolver;
}
}
@Table(name = "blog")
public class Blog {
private Long id;
private String content;
private Boolean deleteFlag;
private String img;
private String category;
private String title;
private Date createTime;
private Date updateTime;
public Blog() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
@Configuration
public class DBConfig {
@Bean(name = "datasource")
public DataSource datasource(Environment env) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
return ds;
}
}
public class PrintTimeUtil {
public static String printTime(Date date,String format){
Date now = new Date();
Long fiveM = date.getTime() + (5*60*1000);
Long thM = date.getTime() + (30*60*1000);
Long oneH = date.getTime() + (60*60*1000);
if(now.getTime() < fiveM){
return "刚刚";
}
if(now.getTime() < thM){
return "半小时前";
}
@Table(name = "user")
public class User {
private Long id;
private Integer deleteFlag;
private String password;
private String userName;
private Date createTime;
private Date updateTime;
public User() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
Date now = new Date();
message.setCreateTime(now);
message.setUpdateTime(now);
message.setDeleteFlag(false);
messageDao.createLambdaQuery().insert(message);
}
@Override
public void saveBlog(Blog blog) {
Date now = new Date();
blog.setCreateTime(now);
blog.setUpdateTime(now);
blog.setDeleteFlag(false);
blogDao.createLambdaQuery().insertSelective(blog);
}
@Override
public List<String> listCategory() {
List<Blog> blogList = blogDao.createLambdaQuery().groupBy("category").select();
return blogList.stream().map(Blog::getCategory).filter(o -> o != null).collect(Collectors.toList());
}
@Override
public User login(String userName, String password) {
return userDao.createLambdaQuery()
.andEq(User::getUserName, userName)
.andEq(User::getPassword, password)
.andEq(User::getDeleteFlag, false)
.single();
}
@Override
public void deleteBlog(long id) {
blogDao.deleteById(id);
}
}
public void setImg(String img) {
this.img = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
@Table(name = "message")
public class Message {
private Long id;
private Long blogId;
private Boolean deleteFlag;
private String content;
public class Message {
private Long id;
private Long blogId;
private Boolean deleteFlag;
private String content;
private String nickName;
private Date createTime;
private Date updateTime;
public Message() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Boolean getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Boolean deleteFlag) {
this.deleteFlag = deleteFlag;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public Date getCreateTime() {
return createTime;
}
@Table(name = "message")
public class Message {
private Long id;
private Long blogId;
private Boolean deleteFlag;
private String content;
private String nickName;
private Date createTime;
private Date updateTime;
public Message() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Boolean getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Boolean deleteFlag) {
this.deleteFlag = deleteFlag;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getNickName() {
return nickName;
}
@Override
public User login(String userName, String password) {
return userDao.createLambdaQuery()
.andEq(User::getUserName, userName)
.andEq(User::getPassword, password)
.andEq(User::getDeleteFlag, false)
.single();
}
@Override
public void deleteBlog(long id) {
blogDao.deleteById(id);
}
}
@Configuration
public class BeetlConfig {
//模板根目录 ,比如 "templates"
@Value("${beetl.templatesPath}") String templatesPath;
@Value("${blog.title}") String title;
@Bean
public GroupTemplate getGroupTemplate(BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
GroupTemplate gt = beetlGroupUtilConfiguration.getGroupTemplate();
Map<String,Object> shared = new HashMap<>();
shared.put("blogSiteTitle", title);
if (!StringUtils.isEmpty(keyword)) {
query.andLike(Blog::getTitle, "%" + keyword.trim() + "%");
}
if (!StringUtils.isEmpty(category)) {
query.andEq(Blog::getCategory, category);
}
if (pageNumber > 0 && pageSize > 0) {
return query.desc(Blog::getCreateTime).page(pageNumber, pageSize);
}
return null;
}
@Override
public PageQuery<Message> pageMsg(Long blogId, long pageNumber, long pageSize) {
if (pageNumber < 1 || pageSize < 1 || blogId == null) {
return null;
}
return messageDao.createLambdaQuery()
.andEq(Message::getBlogId, blogId)
.andEq(Message::getDeleteFlag, false)
.desc(Message::getCreateTime)
.page(pageNumber, pageSize);
}
@Override
public Blog getBlogById(Long blogId) {
return blogDao.createLambdaQuery().andEq(Blog::getId, blogId).single();
}
@Override
public void saveMessage(Message message) {
Date now = new Date();
message.setCreateTime(now);
message.setUpdateTime(now);
message.setDeleteFlag(false);
messageDao.createLambdaQuery().insert(message);
}
@Override
public void saveBlog(Blog blog) {
Date now = new Date();
blog.setCreateTime(now);
blog.setUpdateTime(now);
blog.setDeleteFlag(false);
blogDao.createLambdaQuery().insertSelective(blog);
}
public interface BlogDao extends BaseDao<Blog> {
}
public interface UserDao extends BaseDao<User> {
}
<%
layout("/common/layout.html",{title:"首页"}){
%>
<% for(var i = 0;i< page.list.~size;i=i+2){%>
<div class="row">
<div class="col-md-6 col-sm-6">
<article class=" blog-teaser">
<header>
<img src="${page.list[i].img}" alt="">
<h3><a href="${ctxPath}/detail?id=${page.list[i].id!}">
<%
var title = page.list[i].title;
if(isNotEmpty(title)&&strutil.length(title)>11){%>
${strutil.subStringTo(title,0,11)}...
<%}else{%>
${title!"无标题"}
<%}%>
</a></h3>
<span class="meta">${@com.ibeetl.blog.function.PrintTimeUtil.printTime(page.list[i].createTime,"yyyy-MM-dd HH:mm:ss")}</span>
<hr>
</header>
</article>
</div>
<%if((i+1) < page.list.~size){%>
public interface MessageDao extends BaseDao<Message> {
}
public interface BlogDao extends BaseDao<Blog> {
}
public interface UserDao extends BaseDao<User> {
}
<%
layout("/common/layout.html",{title:"首页"}){
%>
<% for(var i = 0;i< page.list.~size;i=i+2){%>
<div class="row">
<div class="col-md-6 col-sm-6">
<article class=" blog-teaser">
<header>
<img src="${page.list[i].img}" alt="">
<h3><a href="${ctxPath}/detail?id=${page.list[i].id!}">
<%
var title = page.list[i].title;
if(isNotEmpty(title)&&strutil.length(title)>11){%>
${strutil.subStringTo(title,0,11)}...
<%}else{%>
${title!"无标题"}
<%}%>
</a></h3>
<span class="meta">${@com.ibeetl.blog.function.PrintTimeUtil.printTime(page.list[i].createTime,"yyyy-MM-dd HH:mm:ss")}</span>
<hr>
</header>
</article>
</div>
<%if((i+1) < page.list.~size){%>
<div class="col-md-6 col-sm-6">
<article class=" blog-teaser">
<header>
}
//进行登录业务
//根据用户名密码查询用户
User user = blogService.login(userName, password);
if (user == null) {
return "login.html";
}
//用户信息放入session
request.getSession().setAttribute("user", user);
//跳转到首页
return "redirect:/";
}
@GetMapping("/test")
public String test(HttpServletRequest request) {
return "test.html";
}
}
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private BlogDao blogDao;
@Autowired
private MessageDao messageDao;
@Autowired
private UserDao userDao;
}
@Configuration
public class BeetlConfig {
//模板根目录 ,比如 "templates"
@Value("${beetl.templatesPath}") String templatesPath;
@Value("${blog.title}") String title;
@Bean
public GroupTemplate getGroupTemplate(BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
GroupTemplate gt = beetlGroupUtilConfiguration.getGroupTemplate();
Map<String,Object> shared = new HashMap<>();
shared.put("blogSiteTitle", title);
shared.put("blogCreateUser", "Gavin");
gt.setSharedVars(shared);
return gt;
}
@Bean
public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {
BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
//获取Spring Boot 的ClassLoader
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if(loader==null){
loader = BeetlConfig.class.getClassLoader();
}
ClasspathResourceLoader cploder = new ClasspathResourceLoader(loader,
templatesPath);
beetlGroupUtilConfiguration.setResourceLoader(cploder);
beetlGroupUtilConfiguration.init();
//如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoader
beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);
return beetlGroupUtilConfiguration;
return null;
}
@Override
public PageQuery<Message> pageMsg(Long blogId, long pageNumber, long pageSize) {
if (pageNumber < 1 || pageSize < 1 || blogId == null) {
return null;
}
return messageDao.createLambdaQuery()
.andEq(Message::getBlogId, blogId)
.andEq(Message::getDeleteFlag, false)
.desc(Message::getCreateTime)
.page(pageNumber, pageSize);
}
@Override
public Blog getBlogById(Long blogId) {
return blogDao.createLambdaQuery().andEq(Blog::getId, blogId).single();
}
@Override
public void saveMessage(Message message) {
Date now = new Date();
message.setCreateTime(now);
message.setUpdateTime(now);
message.setDeleteFlag(false);
messageDao.createLambdaQuery().insert(message);
}
@Override
public void saveBlog(Blog blog) {
Date now = new Date();
blog.setCreateTime(now);
blog.setUpdateTime(now);
blog.setDeleteFlag(false);
blogDao.createLambdaQuery().insertSelective(blog);
}
@Override
public List<String> listCategory() {
List<Blog> blogList = blogDao.createLambdaQuery().groupBy("category").select();
return blogList.stream().map(Blog::getCategory).filter(o -> o != null).collect(Collectors.toList());
}
@Override
public User login(String userName, String password) {
return userDao.createLambdaQuery()
.andEq(User::getUserName, userName)
.andEq(User::getPassword, password)
.andEq(User::getDeleteFlag, false)
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
}
public interface MessageDao extends BaseDao<Message> {
}
public interface BlogDao extends BaseDao<Blog> {
}
public interface UserDao extends BaseDao<User> {
}
<%
layout("/common/layout.html",{title:"首页"}){
%>
<% for(var i = 0;i< page.list.~size;i=i+2){%>
<div class="row">
<div class="col-md-6 col-sm-6">
<article class=" blog-teaser">
<header>
<img src="${page.list[i].img}" alt="">
<h3><a href="${ctxPath}/detail?id=${page.list[i].id!}">
<%
var title = page.list[i].title;
if(isNotEmpty(title)&&strutil.length(title)>11){%>
LambdaQuery<Blog> query = blogDao.createLambdaQuery()
.andEq(Blog::getDeleteFlag, false);
if (!StringUtils.isEmpty(keyword)) {
query.andLike(Blog::getTitle, "%" + keyword.trim() + "%");
}
if (!StringUtils.isEmpty(category)) {
query.andEq(Blog::getCategory, category);
}
if (pageNumber > 0 && pageSize > 0) {
return query.desc(Blog::getCreateTime).page(pageNumber, pageSize);
}
return null;
}
@Override
public PageQuery<Message> pageMsg(Long blogId, long pageNumber, long pageSize) {
if (pageNumber < 1 || pageSize < 1 || blogId == null) {
return null;
}
return messageDao.createLambdaQuery()
.andEq(Message::getBlogId, blogId)
.andEq(Message::getDeleteFlag, false)
.desc(Message::getCreateTime)
.page(pageNumber, pageSize);
}
@Override
public Blog getBlogById(Long blogId) {
return blogDao.createLambdaQuery().andEq(Blog::getId, blogId).single();
}
@Override
public void saveMessage(Message message) {
Date now = new Date();
message.setCreateTime(now);
message.setUpdateTime(now);
message.setDeleteFlag(false);
messageDao.createLambdaQuery().insert(message);
}
@Override
public void saveBlog(Blog blog) {
Date now = new Date();
blog.setCreateTime(now);
blog.setUpdateTime(now);
blog.setDeleteFlag(false);
blogDao.createLambdaQuery().insertSelective(blog);
}
@Override