​​基于Springboot的个人博客系统的设计与实现

news2024/12/22 17:00:23

目录

1. 基于Springboot的个人博客系统的设计与实现

1.1. 第6章  系统详细设计与实现

6.3.4  评论管理

6.3.5  分类/标签管理

6.3.6  文件管理

6.3.7  友链管理

6.3.8  系统设置

  1. 基于Springboot的个人博客系统的设计与实现
    1. 6章  系统详细设计与实现

6.3.4  评论管理

点击左侧功能菜单可以进入到评论管理界面,管理员可以查看所有评论列表,并可以根据评论内容等信息进行评论审核及删除评论,如图6.8所示。

图6.8 评论管理效果图

该功能主要代码实现如下:

//评论管理列表

@GetMapping(value = "")
public String index(@RequestParam(value = "page", defaultValue = "1") int page,
  @RequestParam(value = "limit", defaultValue = "15") int limit, HttpServletRequest request) {
    UserVo users = this.user(request);
    CommentVoExample commentVoExample = new CommentVoExample();
    commentVoExample.setOrderByClause("coid desc");
  commentVoExample.createCriteria().andAuthorIdNotEqualTo(users.getUid());
    PageInfo<CommentVo> commentsPaginator = commentsService.getCommentsWithPage(commentVoExample,page, limit);
    request.setAttribute("comments", commentsPaginator);
    return "admin/comment_list";
}

6.3.5  分类/标签管理

点击左侧功能菜单可以进入到分类/标签管理界面,管理员查看所有标签和分类信息,可以添加分类或者标签,点击某个分类/标签还可以进行修改和删除操作,如图6.9所示。

图6.9 分类/标签管理效果图

该功能主要代码实现如下:

//分类/标签管理列表

@GetMapping(value = "")
public String index(HttpServletRequest request) {
    List<MetaDto>categories= metasService.getMetaList(Types.CATEGORY.getType(),null);
    List<MetaDto> tags = metasService.getMetaList(Types.TAG.getType(),  null, WebConst.MAX_POSTS);
    request.setAttribute("categories", categories);
    request.setAttribute("tags", tags);
    return "admin/category";
}
//保存分类/标签
@PostMapping(value = "save")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo saveCategory(@RequestParam String cname, @RequestParam Integer mid) {
    try {
        metasService.saveMeta(Types.CATEGORY.getType(),cname,mid);
    } catch (Exception e) {
        String msg = "分类保存失败";
        if (e instanceof TipException) {
            msg = e.getMessage();
        } else {
            LOGGER.error(msg, e);
        }
        return RestResponseBo.fail(msg);
    }
    return RestResponseBo.ok();
}

6.3.6  文件管理

点击左侧功能菜单可以进入到文件管理界面,在文件管理中可以上传编辑文章或者页面所需要的文件,支持多种文件类型,只需要将需要上传的文件拖拽到上传区域即可,如图6.10所示。

图6.10 文件管理效果图

该功能主要代码实现如下:

//上传文件

@PostMapping(value = "upload")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo upload(HttpServletRequest request, @RequestParam("file") MultipartFile[] multipartFiles) throws IOException {
    UserVo users = this.user(request);
    Integer uid = users.getUid();
    List<String> errorFiles = new ArrayList<>();
    try {
        for (MultipartFile multipartFile : multipartFiles) {
            String fname = multipartFile.getOriginalFilename();
            if (multipartFile.getSize() <= WebConst.MAX_FILE_SIZE) {
                String fkey = TaleUtils.getFileKey(fname);
                String ftype = TaleUtils.isImage(multipartFile.getInputStream()) ? Types.IMAGE.getType() : Types.FILE.getType();
                File file = new File(CLASSPATH+fkey);
                try {
                    FileCopyUtils.copy(multipartFile.getInputStream(),new FileOutputStream(file));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                attachService.save(fname, fkey, ftype, uid);
            } else {
                errorFiles.add(fname);
            }
        }
    } catch (Exception e) {
        return RestResponseBo.fail();
    }
    return RestResponseBo.ok(errorFiles);
}

//删除文件

@RequestMapping(value = "delete")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo delete(@RequestParam Integer id, HttpServletRequest request) {
    try {
        AttachVo attach = attachService.selectById(id);
        if (null == attach) return RestResponseBo.fail("不存在该附件");
        attachService.deleteById(id);
        new File(CLASSPATH+attach.getFkey()).delete();
        logService.insertLog(LogActions.DEL_ARTICLE.getAction(), attach.getFkey(), request.getRemoteAddr(), this.getUid(request));
    } catch (Exception e) {
        String msg = "附件删除失败";
        if (e instanceof TipException) msg = e.getMessage();
        else LOGGER.error(msg, e);
        return RestResponseBo.fail(msg);
    }
    return RestResponseBo.ok();
}

6.3.7  友链管理

点击左侧功能菜单可以进入到友链管理界面,在管理管理中可以添加友情链接,包括链接名称、链接地址、链接logo、排序等,并可以编辑或删除等操作如图6.11所示。

图6.11 友链管理效果图

该功能主要代码实现如下:

//友链管理列表

@GetMapping(value = "")
public String index(HttpServletRequest request) {
    List<MetaVo> metas = metasService.getMetas(Types.LINK.getType());
    request.setAttribute("links", metas);
    return "admin/links";
}

//保存友链

@PostMapping(value = "save")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo saveLink(@RequestParam String title, @RequestParam String url,  @RequestParam String logo, @RequestParam Integer mid,
@RequestParam(value = "sort", defaultValue = "0") int sort) {
    try {
        MetaVo metas = new MetaVo();
        metas.setName(title);
        metas.setSlug(url);
        metas.setDescription(logo);
        metas.setSort(sort);
        metas.setType(Types.LINK.getType());
        if (null != mid) {
            metas.setMid(mid);
            metasService.update(metas);
        } else {
            metasService.saveMeta(metas);
        }
    } catch (Exception e) {
    return RestResponseBo.ok();
}

6.3.8  系统设置

点击左侧功能菜单可以进入到系统设置界面,在系统设置站点的名称、明书、关键词、主题等,同时也可以系统备份,包括备份文件和导出数据库sql,如图6.12所示。

图6.12 系统设置效果图

该功能主要代码实现如下:

//全局设置

@GetMapping(value = "")
public String setting(HttpServletRequest request) {
    List<OptionVo> voList = optionService.getOptions();
    Map<String, String> options = new HashMap<>();
    voList.forEach((option) -> {
        options.put(option.getName(), option.getValue());
    });
    request.setAttribute("options", options);
    return "admin/setting";
}

//保存设置

@PostMapping(value = "")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo saveSetting(@RequestParam(required = false) String site_theme, HttpServletRequest request) {
    try {
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, String> querys = new HashMap<>();
        parameterMap.forEach((key, value) -> {
            querys.put(key, join(value));
        });
        optionService.saveOptions(querys);
        WebConst.initConfig = querys;
        if (StringUtils.isNotBlank(site_theme)) {
            BaseController.THEME = "themes/" + site_theme;
        }
        logService.insertLog(LogActions.SYS_SETTING.getAction(), GsonUtils.toJsonString(querys), request.getRemoteAddr(), this.getUid(request));
        return RestResponseBo.ok();
    } catch (Exception e) {
        String msg = "保存设置失败";
        if (e instanceof TipException) {
            msg = e.getMessage();
        } else {
            LOGGER.error(msg, e);
        }
        return RestResponseBo.fail(msg);
    }
}

//系统备份

@PostMapping(value = "backup")
@ResponseBody
@Transactional(rollbackFor = TipException.class)
public RestResponseBo backup(@RequestParam String bk_type, @RequestParam String bk_path,
                             HttpServletRequest request) {
    if (StringUtils.isBlank(bk_type)) {
        return RestResponseBo.fail("请确认信息输入完整");
    }
    try {
        BackResponseBo backResponse = siteService.backup(bk_type, bk_path, "yyyyMMddHHmm");
        logService.insertLog(LogActions.SYS_BACKUP.getAction(), null, request.getRemoteAddr(), this.getUid(request));
        return RestResponseBo.ok(backResponse);
    } catch (Exception e) {
        String msg = "备份失败";
        if (e instanceof TipException) {
            msg = e.getMessage();
        } else {
            LOGGER.error(msg, e);
        }
        return RestResponseBo.fail(msg);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1538320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InnoDB 缓存

本文主要聊InnoDB内存结构, 先来看下官网Mysql 8.0 InnoDB架构图 MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 如上图所示,InnoDB内存主要包含Buffer Pool, Change Buffer, Log Buffer, Adaptive Hash Index Buffer Pool 其实 buffer pool 就是内存中的…

从0到1实现RPC | 03 重载方法和参数类型转换

一、存在的问题 1.重载方法在当前的实现中还不支持&#xff0c;调用了会报错。 2.类型转换也还存在问题。 假设定义的接口如下&#xff0c;参数是float类型。 在Provider端接受到的是一个Double类型&#xff0c;这是因为web应用接收的请求后处理的类型。 在反射调用的时候就会…

如何用java使用es

添加依赖 如何连接es客户端 RestHighLevelClient 代表是高级客户端 其中hostname&#xff1a;es的服务器地址&#xff0c;prot端口号 &#xff0c;scheme&#xff1a;http还是https 如果不在使用es可以进行关闭&#xff0c;可以防止浪费一些资源 java如何创建索引&#xff1…

银河麒麟系统V10上安装TTS语音模块,并使用C#调用进行语音播报

银河麒麟系统V10上安装TTS语音模块,并使用C#调用进行语音播报 系统版本什么是TTS需求背景环境部署更新系统安装版本包安装完成执行命令测试C# 环境下调用语音播报系统版本 什么是TTS 从文本到语音 TTS是“Text To Speech”的缩写,即“从文本到语音”,是人机对话的一部分,让…

【源头活水】顶刊解读!IEEE T-PAMI (CCF-A,IF 23.6)2024年46卷第一期 [1]

“问渠那得清如许&#xff0c;为有源头活水来”&#xff0c;通过前沿领域知识的学习&#xff0c;从其他研究领域得到启发&#xff0c;对研究问题的本质有更清晰的认识和理解&#xff0c;是自我提高的不竭源泉。为此&#xff0c;我们特别精选论文阅读笔记&#xff0c;开辟“源头…

二十一 超级数据查看器 讲解稿 设置启动密码

二十一 超级数据查看器 讲解稿 设置启动密码 ​​​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;这节课我们讲解超级数据查看器高级功能&#xff0c;讲解设置启动密码&#xff0c;这是高级功能第一集。 设…

集简云新增“文本语音转换”功能,实现智能语音交互

为丰富人工智能领域的应用集成&#xff0c;为用户提供更便捷和智能化的信息获取和视觉创作方式&#xff0c;本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型&#xff0c;实现文本语音高效智能转换&#xff0c;也可根据你的产品或品牌创建独特的神经网…

ChatGPT无法登录,提示我们检测到可疑的登录行为?如何解决?

OnlyFans 订阅教程移步&#xff1a;【保姆级】2024年最新Onlyfans订阅教程 Midjourney 订阅教程移步&#xff1a; 【一看就会】五分钟完成MidJourney订阅 GPT-4.0 升级教程移步&#xff1a;五分钟开通GPT4.0 如果你需要使用Wildcard开通GPT4、Midjourney或是Onlyfans的话&am…

在服务器上训练faster-rcnn模型(pycharm和Termius)

本文主要介绍使用服务器训练模型的两种方式&#xff1a;pycharm&#xff08;可视化界面友好&#xff09;and终端&#xff0c;本人用的是macos系统&#xff0c;可能pycharm某些入口的位置不一样&#xff0c;本教程代码以faster-rcnn为例 准备工作&#xff1a; 1.知道自己所用服…

数字乡村引领新风尚:科技赋能农村实现全面进步

随着信息技术的迅猛发展&#xff0c;数字乡村正成为引领农村全面进步的新风尚。科技作为推动农村发展的强大引擎&#xff0c;正在深刻改变着传统农业的生产方式、农村的社会结构以及农民的生活方式&#xff0c;为农村经济社会的全面进步注入了新的活力和动力。本文将从数字乡村…

OpenI启智平台创建天数智芯训练任务(以AlexNet为例)

天数智芯DeepSpark代码仓地址&#xff1a; iluvatar/DeepSpark - DeepSpark - OpenI - 启智AI开源社区提供普惠算力&#xff01; (pcl.ac.cn) 首先我们进到天数智芯DeepSpark代码仓&#xff0c;点击【派生】将代码仓Fork到我们自己的目录下 Fork好代码仓后我们到我们Fork后的代…

6、kubenetes 卷

1、什么是卷 在某些场景下&#xff0c;我们可能希望新的容器可以在之前容器结束的位 置继续运⾏&#xff0c;⽐如在物理机上重启进程。可能不需要&#xff08;或者不想要&#xff09; 整个⽂件系统被持久化&#xff0c;但又希望能保存实际数据的⽬录。 Kubernetes通过定义存储…

ARM-Linux 开发板下安装编译 OpenCV 和 Dlib

安装 OpenCV 和 Dlib 不像在 x86 平台下那样简单&#xff0c;用一句命令就可以自动安装完。而在 ARM 平台中许多软件都需要自行下载编译&#xff0c;且还有许多问题&#xff0c;本篇文章就是记录在 ARM 平台下载 OpenCV 踩过的坑。 硬件环境&#xff1a; RK3568 Ubuntu20.04…

ConFEDE: Contrastive Feature Decomposition for Multimodal Sentiment Analysis

文章目录 ConFEDE&#xff1a;用于多模态情感分析的对比特征分解文章信息研究目的研究内容研究方法1.总体结构2.损失函数3.Data Sampler4.数据采样算法5.Contrastive Feature Decomposition&#xff08;重点&#xff09; 结果与讨论代码和数据集附录 ConFEDE&#xff1a;用于多…

两台电脑简单的通信过程详解(经过两个路由器,不同网段)

一、eNSP拓扑图 二、配置4台电脑的IP地址、子网掩码、网关地址。 三、配置路由器 1.AR1-接口对应IP <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入0/0/0接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.1 24 #配置ip和掩码 [Huawei-GigabitEthernet0…

NacosException: http error, code=403、NacosimeException——报错解决方法【Nacos2.x】

1、NacosException报错内容为&#xff1a; NacosException: http error, code403,msguser not found!,dataIdapplication-dev.yml,groupDEFAULT_GROUP,tenant连不上是因为成功开启鉴权后&#xff0c;所使用的Spring Cloud服务被拦截&#xff0c;需要在配置中添加Nacos用户名和…

【Canvas与艺术】绘制暗绿色汽车速度仪表盘

【原型】 【成果】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>暗绿色汽车速度仪表盘</title><style type"t…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块&#xff1a;即管理员模块和学生、教师模块&#xff0c;主要功能包括&#xff1a;学生、教师、作业信息、学习模块、教学评价、学习情况等&#xff1b; 关键词&#xff1a;学生作业管理系统&#xff1b;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

liunx CentOS7 搭建lnmp环境 php nginx mysql

安装一些刚需软件&#xff1a;不懂请自行查询 安装一些需要的软件命令 yum install wget vim net-tools bash* lrzsz tree nmapnc lsof telnet -y 刷新命令 source /usr/share/bash-completion/bash_completion echo source /usr/share/bash-completion/bash_completion &…

键盘记录程序、间谍软件和窃取程序在 SMB 恶意软件检测中占主导地位

据 Sophos 称&#xff0c;到 2023 年&#xff0c;中小企业检测到的恶意软件中有 50% 是键盘记录程序、间谍软件和窃取程序&#xff0c;攻击者利用这些恶意软件窃取数据和凭证。 攻击者随后利用这些窃取的信息来获得未经授权的远程访问、勒索受害者、部署勒索软件等。 勒索软件…