文章管理需求文档
-
仪表盘文章
- 仪表盘显示发表的文章总数
- 列表显示最新文章和文章标题
- 内容条件限制
- 按照时间先后顺序进行排序
- 仪表盘只显示15篇最新文章
- 点击列表内容功能描述
-
文章发布
- 发布文章界面有文章标题框、文章标签框、文章编辑栏、文章预览区域、返回列表按钮、保存文章按钮
- 文章内容限制不能添加表情
- 文章标题不能超过25个字
- 点击保存文章按钮,文章发布成功提示语:操作成功 文章保存成功,随后跳转至文章管理列表页面
- 添加文章,redis有对应缓存
-
文章编辑
-
文章管理页面有 文章标题、发布时间、浏览量、所属分类、操作
-
按照文章发布时间先后顺序排序
-
每页限制查看、管理10篇已发布文章
-
显示总页数,点击 下一页 按钮可跳转至下一页
-
点击 编辑 按钮,可跳转至文章发布页面,可进行内容的修改和保存
-
删除
-
点击 删除 按钮,可对已发布文章进行删除,同时删除redis缓存
-
点击 删除 按钮,弹出提示语:确定删除该文章吗?
-
点击 确定 按钮,提示语:文章删除成功
B站教程视频!
上传代码不完全 其余代码自行添加
AdminController代码
@Controller
@RequestMapping("/admin")
public class AdminController {
private static final Logger logger = LoggerFactory.getLogger(AdminController.class);
@Autowired
private ISiteService siteServiceImpl;
@Autowired
private IArticleService articleServiceImpl;
@Autowired
private ICommentService commentServiceImpl;
//管理中心起始页
@GetMapping(value = {"", "/index"})
public String index(HttpServletRequest request) {
//获取最新的5篇博客、评论以及统计数据
List<Article> articles = siteServiceImpl.recentArticles(15);
List<Comment> comments = siteServiceImpl.recentComments(15);
StaticticsBo staticticsBo = siteServiceImpl.getStatistics();
//向request域中储存数据
request.setAttribute("comments", comments);
request.setAttribute("articles", articles);
request.setAttribute("statistics", staticticsBo);
return "back/index";
}
// 向文章发表页面跳转
@GetMapping(value = "/article/toEditPage")
public String newArticle() {
return "back/article_edit";
}
// 发表文章
@PostMapping(value = "/article/publish")
@ResponseBody
public ArticleResponseData publishArticle(Article article) {
if (StringUtils.isBlank(article.getCategories())) {
article.setCategories("默认分类");
}
try {
articleServiceImpl.publish(article);
logger.info("文章发布成功");
return ArticleResponseData.ok();
} catch (Exception e) {
logger.error("文章发布失败,错误信息: " + e.getMessage());
return ArticleResponseData.fail();
}
}
// 跳转到后台文章列表页面
@GetMapping(value = "/article")
public String index(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "count", defaultValue = "10") int count,
HttpServletRequest request) {
PageInfo<Article> pageInfo =
articleServiceImpl.selectArticleWithPage(page, count);
request.setAttribute("articles", pageInfo);
return "back/article_list";
}
// 向文章修改页面跳转
@GetMapping(value = "/article/{id}")
public String editArticle(@PathVariable("id") String id, HttpServletRequest request) {
Article article = articleServiceImpl.selectArticleWithId(Integer.parseInt(id));
request.setAttribute("contents", article);
request.setAttribute("categories", article.getCategories());
return "back/article_edit";
}
// 文章修改处理
@PostMapping(value = "/article/modify")
@ResponseBody
public ArticleResponseData modifyArticle(Article article) {
try {
articleServiceImpl.updateArticleWithId(article);
logger.info("文章更新成功");
return ArticleResponseData.ok();
} catch (Exception e) {
logger.error("文章更新失败,错误信息: " + e.getMessage());
return ArticleResponseData.fail();
}
}
// 文章删除
@PostMapping(value = "/article/delete")
@ResponseBody
public ArticleResponseData delete(@RequestParam int id) {
try {
articleServiceImpl.deleteArticleWithId(id);
logger.info("文章删除成功");
return ArticleResponseData.ok();
} catch (Exception e) {
logger.error("文章删除失败,错误信息: " + e.getMessage());
return ArticleResponseData.fail();
}
}
ArticleServiceImpl代码
@Service
@Transactional
public class ArticleServiceImpl implements IArticleService {
@Autowired
private ArticleMapper articleMapper;
@Autowired
private StatisticMapper statisticMapper;
//业务处理层实现
//文章详情查询的业务实现中嵌入redis缓存管理
@Autowired
private RedisTemplate redisTemplate;
//删除文章
@Autowired
private CommentMapper commentMapper;
// 分页查询文章列表
@Override
public PageInfo<Article> selectArticleWithPage(Integer page, Integer count) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.selectArticleWithPage();
// 封装文章统计数据
for (int i = 0; i < articleList.size(); i++) {
Article article = articleList.get(i);
Statistic statistic = statisticMapper.selectStatisticWithArticleId(article.getId());
article.setHits(statistic.getHits());
article.setCommentsNum(statistic.getCommentsNum());
}
PageInfo<Article> pageInfo = new PageInfo<>(articleList);
return pageInfo;
}
// 统计前10的热度文章信息
@Override
public List<Article> getHeatArticles() {
List<Statistic> list = statisticMapper.getStatistic();
List<Article> articlelist = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Article article = articleMapper.selectArticleWithId(list.get(i).getArticleId());
article.setHits(list.get(i).getHits());
article.setCommentsNum(list.get(i).getCommentsNum());
articlelist.add(article);
if (i >= 14) {
break;
}
}
return articlelist;
}
//根据id查询单个文章详情,并使用redis缓存管理
public Article selectArticleWithId(Integer id) {
Article article = null;
Object o = redisTemplate.opsForValue().get("article_" + id);
if (o != null) {
article = (Article) o;
} else {
article = articleMapper.selectArticleWithId(id);
if (article != null) {
redisTemplate.opsForValue().set("article_" + id, article);
}
}
return article;
}
//发布文章
@Override
public void publish(Article article) {
//去除表情
article.setContent(EmojiParser.parseToAliases(article.getContent()));
article.setCreated(new Date());
article.setHits(0);
article.setCommentsNum(0);
//插入文章,同时插入文章统计数据
articleMapper.publishArticle(article);
statisticMapper.addStatistic(article);
}
//更新文章
@Override
public void updateArticleWithId(Article article) {
article.setModified(new Date());
articleMapper.updateArticleWithId(article);
redisTemplate.delete("article_" + article.getId());
}
//删除文章的同时,删除对应的缓存
@Override
public void deleteArticleWithId(int id) {
articleMapper.deleteArticleWithId(id);
redisTemplate.delete("article_" + id);
//同时删除对应文章的统计数据
statisticMapper.deleteStatisticWithId(id);
//同时删除对应文章的评论数据
commentMapper.deleteCommentWithId(id);
}
}
SiteServiceImpl代码
@Service
@Transactional
public class SiteServiceImpl implements ISiteService {
@Autowired
private CommentMapper commentMapper;
@Autowired
private ArticleMapper articleMapper;
@Autowired
private StatisticMapper statisticMapper;
@Override
public void updateStatistics(Article article) {
Statistic statistic =
statisticMapper.selectStatisticWithArticleId(article.getId());
statistic.setHits(statistic.getHits() + 1);
statisticMapper.updateArticleCommentsWithId(statistic);
}
@Override
public List<Comment> recentComments(int limit) {
PageHelper.startPage(1, limit > 15 || limit < 1 ? 15 : limit);
List<Comment> byPage = commentMapper.selectNewComment();
return byPage;
}
@Override
public List<Article> recentArticles(int limit) {
PageHelper.startPage(1, limit > 15 || limit < 1 ? 15 : limit);
List<Article> list = articleMapper.selectArticleWithPage();
// 封装文章统计数据
for (int i = 0; i < list.size(); i++) {
Article article = list.get(i);
Statistic statistic =
statisticMapper.selectStatisticWithArticleId(article.getId());
article.setHits(statistic.getHits());
article.setCommentsNum(statistic.getCommentsNum());
}
return list;
}
@Override
public StaticticsBo getStatistics() {
StaticticsBo staticticsBo = new StaticticsBo();
Integer articles = articleMapper.countArticle();
Integer comments = commentMapper.countComment();
staticticsBo.setArticles(articles);
staticticsBo.setComments(comments);
return staticticsBo;
}
}
IArticleService代码
public interface IArticleService {
// 分页查询文章列表
public PageInfo<Article> selectArticleWithPage(Integer page, Integer count);
// 统计前10的热度文章信息
public List<Article> getHeatArticles();
//业务处理层实现
//根据id查询单个文章详情
public Article selectArticleWithId(Integer id);
//发布文章
public void publish(Article article);
//根据主键更新文章
public void updateArticleWithId(Article article);
//根据主键删除文章
public void deleteArticleWithId(int id);
}
ISiteService代码
public interface ISiteService {
// 最新收到的评论
public List<Comment> recentComments(int count);
// 最新发表的文章
public List<Article> recentArticles(int count);
// 获取后台统计数据
public StaticticsBo getStatistics();
// 更新某个文章的统计数据
public void updateStatistics(Article article);
}
跳转链接下载 有bug 酌情下载!!
blog_system: 个人博客https://gitee.com/qin-zhaobo/blog_system.git