基于SpringBoot开发的知识库管理系统的设计与实现
Posted 编程指南针
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SpringBoot开发的知识库管理系统的设计与实现相关的知识,希望对你有一定的参考价值。
作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
收藏点赞不迷路 关注作者有好处
文末获取源码
项目编号:
一,项目简介
随着科学技术的迅速发展。软件开发领域诞生的新技术层出不穷。随着这些技术充满着各类软件,漏洞,如何使用,成为了需要解决的必须问题。所以,技术资源共享论坛旨在帮助人们解决各种各样的技术难题,学习层出不穷的科学技术,或者记录下自己学习新鲜技术的过程中所遇到的一些问题,以及是如何解决这些问题的。
在知识一些整理中,遇到了一些很多问题。我们可以以手抄报的形式来记录也可以发表到网络中,来分享自己的所学到的内容,可以上产各种类型的文件,获取悬赏分。悬赏分可以用来下载别人的资源,实现资源的交换。我们还可以发布自己的问题,付出自己的悬赏币,得到别人的指导,当然,回答别人的各个问题,也是一种获取悬赏币的手段。我们可以编辑我们所上传的所有资源,同时可以在全站搜索,检索出所有你想要的文件或者博客。分类和标签,将帮助你跟容易找到你所感兴趣的领域,并能够帮助你找到你所想了解的问题的答案。
每个用户在这个资源库平台当中,都可以找到自己的想要的一些答案和软件。如果你是一个程序员,你可以当博主,同时当你遇到编程上的一些问题的时候,也可以使用网站来寻找你想要获得的答案。作为一个学生,可以通过网站搜索,搜索你想要得到的问题的答案,或者是从资源中心下载你所中意的资源。
二,环境介绍
语言环境:Java: jdk1.8
数据库:mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
开发技术:springBoot+mybatis+bootstrap+jquery
三,系统展示
用户首页
留言板
后台管理员登录
后台首页
发布文章
文章列表
分类管理
标签管理
网站基础信息管理
评论管理
权限管理
四,核心代码展示
package com.puboot.module.admin.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.puboot.common.util.CoreConst;
import com.puboot.common.util.Pagination;
import com.puboot.common.util.PushArticleUtil;
import com.puboot.common.util.ResultUtil;
import com.puboot.enums.SysConfigKey;
import com.puboot.module.admin.model.BizArticle;
import com.puboot.module.admin.model.BizCategory;
import com.puboot.module.admin.model.BizTags;
import com.puboot.module.admin.model.User;
import com.puboot.module.admin.service.*;
import com.puboot.module.admin.vo.ArticleConditionVo;
import com.puboot.module.admin.vo.BaiduPushResVo;
import com.puboot.module.admin.vo.base.PageResultVo;
import com.puboot.module.admin.vo.base.ResponseVo;
import lombok.AllArgsConstructor;
import org.apache.shiro.SecurityUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Controller
@RequestMapping("article")
@AllArgsConstructor
public class ArticleController
private final BizArticleService articleService;
private final BizArticleTagsService articleTagsService;
private final BizCategoryService categoryService;
private final BizTagsService tagsService;
private final SysConfigService configService;
@PostMapping("list")
@ResponseBody
public PageResultVo loadArticle(ArticleConditionVo articleConditionVo, Integer pageNumber, Integer pageSize)
articleConditionVo.setSliderFlag(true);
IPage<BizArticle> page = new Pagination<>(pageNumber, pageSize);
List<BizArticle> articleList = articleService.findByCondition(page, articleConditionVo);
return ResultUtil.table(articleList, page.getTotal());
/*文章*/
@GetMapping("/add")
public String addArticle(Model model)
BizCategory bizCategory = new BizCategory();
bizCategory.setStatus(CoreConst.STATUS_VALID);
List<BizCategory> bizCategories = categoryService.selectCategories(bizCategory);
List<BizTags> tags = tagsService.list();
model.addAttribute("categories", bizCategories);
model.addAttribute("tags", tags);
BizArticle bizArticle = new BizArticle().setTags(new ArrayList<>()).setOriginal(1).setSlider(0).setTop(0).setRecommended(0).setComment(1);
model.addAttribute("article", bizArticle);
return CoreConst.ADMIN_PREFIX + "article/publish";
@PostMapping("/add")
@ResponseBody
@Transactional
@CacheEvict(value = "article", allEntries = true)
public ResponseVo add(BizArticle bizArticle, Integer[] tag)
try
User user = (User) SecurityUtils.getSubject().getPrincipal();
bizArticle.setUserId(user.getUserId());
bizArticle.setAuthor(user.getNickname());
BizArticle article = articleService.insertArticle(bizArticle);
articleTagsService.insertList(tag, article.getId());
return ResultUtil.success("保存文章成功");
catch (Exception e)
return ResultUtil.error("保存文章失败");
@GetMapping("/edit")
public String edit(Model model, Integer id)
BizArticle bizArticle = articleService.selectById(id);
model.addAttribute("article", bizArticle);
BizCategory bizCategory = new BizCategory();
bizCategory.setStatus(CoreConst.STATUS_VALID);
List<BizCategory> bizCategories = categoryService.selectCategories(bizCategory);
model.addAttribute("categories", bizCategories);
List<BizTags> sysTags = tagsService.list();
/*方便前端处理回显*/
List<BizTags> aTags = new ArrayList<>();
List<BizTags> sTags = new ArrayList<>();
boolean flag;
for (BizTags sysTag : sysTags)
flag = false;
for (BizTags articleTag : bizArticle.getTags())
if (articleTag.getId().equals(sysTag.getId()))
BizTags tempTags = new BizTags();
tempTags.setId(sysTag.getId());
tempTags.setName(sysTag.getName());
aTags.add(tempTags);
sTags.add(tempTags);
flag = true;
break;
if (!flag)
sTags.add(sysTag);
bizArticle.setTags(aTags);
model.addAttribute("tags", sTags);
return CoreConst.ADMIN_PREFIX + "article/publish";
@PostMapping("/edit")
@ResponseBody
@CacheEvict(value = "article", allEntries = true)
public ResponseVo edit(BizArticle article, Integer[] tag)
articleService.updateById(article);
articleTagsService.removeByArticleId(article.getId());
articleTagsService.insertList(tag, article.getId());
return ResultUtil.success("编辑文章成功");
@PostMapping("/delete")
@ResponseBody
public ResponseVo delete(Integer id)
return deleteBatch(new Integer[]id);
@PostMapping("/batch/delete")
@ResponseBody
public ResponseVo deleteBatch(@RequestParam("ids[]") Integer[] ids)
int i = articleService.deleteBatch(ids);
if (i > 0)
return ResultUtil.success("删除文章成功");
else
return ResultUtil.error("删除文章失败");
@PostMapping("/batch/push")
@ResponseBody
public ResponseVo pushBatch(@RequestParam("urls[]") String[] urls)
try
String url = configService.selectAll().get(SysConfigKey.BAIDU_PUSH_URL.getValue());
BaiduPushResVo baiduPushResVo = JSON.parseObject(PushArticleUtil.postBaidu(url, urls), BaiduPushResVo.class);
if (baiduPushResVo.getNotSameSite() == null && baiduPushResVo.getNotValid() == null)
return ResultUtil.success("推送文章成功");
else
return ResultUtil.error("推送文章失败", baiduPushResVo);
catch (Exception e)
return ResultUtil.error("推送文章失败,请检查百度推送接口!");
package com.puboot.module.admin.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.puboot.common.util.CoreConst;
import com.puboot.common.util.Pagination;
import com.puboot.module.admin.mapper.BizArticleMapper;
import com.puboot.module.admin.model.BizArticle;
import com.puboot.module.admin.service.BizArticleService;
import com.puboot.module.admin.vo.ArticleConditionVo;
import lombok.AllArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
@AllArgsConstructor
public class BizArticleServiceImpl extends ServiceImpl<BizArticleMapper, BizArticle> implements BizArticleService
private final BizArticleMapper bizArticleMapper;
@Override
public List<BizArticle> findByCondition(IPage<BizArticle> page, ArticleConditionVo vo)
List<BizArticle> list = bizArticleMapper.findByCondition(page, vo);
if (CollUtil.isNotEmpty(list))
List<Integer> ids = new ArrayList<>();
for (BizArticle bizArticle : list)
ids.add(bizArticle.getId());
List<BizArticle> listTag = bizArticleMapper.listTagsByArticleId(ids);
// listTag, 重新组装数据为id: Article
Map<Integer, BizArticle> tagMap = new LinkedHashMap<>(listTag.size());
for (BizArticle bizArticle : listTag)
tagMap.put(bizArticle.getId(), bizArticle);
for (BizArticle bizArticle : list)
BizArticle tagArticle = tagMap.get(bizArticle.getId());
if (Objects.nonNull(tagArticle))
bizArticle.setTags(tagArticle.getTags());
return list;
@Override
@Cacheable(value = "article", key = "'slider'")
public List<BizArticle> sliderList()
ArticleConditionVo vo = new ArticleConditionVo();
vo.setSlider(true);
vo.setStatus(CoreConst.STATUS_VALID);
return this.findByCondition(null, vo);
@Override
@Cacheable(value = "article", key = "'recommended'")
public List<BizArticle> recommendedList(int pageSize)
ArticleConditionVo vo = new ArticleConditionVo();
vo.setRecommended(true);
vo.setStatus(CoreConst.STATUS_VALID);
vo.setPageSize(pageSize);
IPage<BizArticle> page = new Pagination<>(vo.getPageNumber(), vo.getPageSize());
return this.findByCondition(page, vo);
@Override
@Cacheable(value = "article", key = "'recent'")
public List<BizArticle> recentList(int pageSize)
ArticleConditionVo vo = new ArticleConditionVo();
vo.setPageSize(pageSize);
vo.setStatus(CoreConst.STATUS_VALID);
vo.setRecentFlag(true);
IPage<BizArticle> page = new Pagination<>(vo.getPageNumber(), vo.getPageSize());
return this.findByCondition(page, vo);
@Override
@Cacheable(value = "article", key = "'random'")
public List<BizArticle> randomList(int pageSize)
ArticleConditionVo vo = new ArticleConditionVo();
vo.setRandom(true);
vo.setStatus(CoreConst.STATUS_VALID);
vo.setPageSize(pageSize);
IPage<BizArticle> page = new Pagination<>(vo.getPageNumber(), vo.getPageSize());
return this.findByCondition(page, vo);
@Override
@Cacheable(value = "article", key = "'hot'")
public List<BizArticle> hotList(int pageSize)
IPage<BizArticle> page = new Pagination<>(1, pageSize);
return bizArticleMapper.hotList(page);
@Override
@Cacheable(value = "article", key = "#id")
public BizArticle selectById(Integer id)
return bizArticleMapper.getById(id);
@Override
@CacheEvict(value = "article", allEntries = true)
public BizArticle insertArticle(BizArticle bizArticle)
Date date = new Date();
bizArticle.setCreateTime(date);
bizArticle.setUpdateTime(date);
bizArticleMapper.insert(bizArticle);
return bizArticle;
@Override
@CacheEvict(value = "article", allEntries = true)
public int deleteBatch(Integer[] ids)
return bizArticleMapper.deleteBatch(ids);
@Override
public List<BizArticle> selectByCategoryId(Integer categoryId)
return bizArticleMapper.selectList(Wrappers.<BizArticle>lambdaQuery().eq(BizArticle::getCategoryId, categoryId));
五,项目总结
本项目是面对所有毕设需要的同学,网站的兼容性高,稳定性好,在各类电脑上都能够稳定运行,也适应多数主流浏览器
以上是关于基于SpringBoot开发的知识库管理系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章
高校课程知识库系统|基于Springboot+vue实现高校课程知识库在线学校平台
高校课程知识库系统|基于Springboot+vue实现高校课程知识库在线学校平台
基于Springboot+SSM框架旅游系统项目开发与设计(附源码资料)-毕业设计