SpringBoot整合Freemaker结合Vue实现页面填写一键自动生成Redis的配置文件

news2024/12/23 2:34:15

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:SpringBoot实战


系列文章目录

标题
一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)
一张思维导图带你学会Springboot创建全局异常、自定义异常
一张思维导图带你打通SpringBoot自定义拦截器的思路
28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
一张流程图带你学会SpringBoot结合JWT实现登录功能
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存
一张思维导图带你学会SpringBoot使用AOP实现日志管理功能
一张图带你学会入门级别的SpringBoot实现文件上传、下载功能
一张思维导图带你学会SpringBoot自定义Filter
一张思维导图带你学会SpringBoot整合Redis

在这里插入图片描述


文章目录

  • 系列文章目录
  • 🌟前言
  • 🌟SpringBoot整合Freemaker
    • pom依赖引入
    • 修改配置文件
    • 配置参数实体类
    • Controller类
    • 自动生成文件工具类
    • Redis配置模板文件
  • 🌟Vue代码
    • 页面效果图
  • 🌟效果测试
  • 🌟写在最后

🌟前言

在一次搭建Redis哨兵模式时,在最后验证是否搭建成功时节点信息是错误的,经过排查,最后因为是配置文件出错导致的。

于是,我就想有没有一种办法可以通过可视化的方式去配置Redis配置文件,这样可以避免直接修改配置文件时,因视觉问题而造成配置文件出错,也可能是我视力差。

最后,我想到了使用SpringBoot整合Freemaker并结合Vue实现自动生成配置文件来减少错误率的发生。


🌟SpringBoot整合Freemaker

pom依赖引入

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

修改配置文件

server.port=8081
#整合freeemaker
#模板所在路径
spring.freemarker.template-loader-path= classpath:/templates
#模板后缀名
spring.freemarker.suffix= .ftl
spring.freemarker.settings.classic_compatible=true

配置参数实体类

创建配置参数实体类,这里省略了getter、setter方法。

/**
 * 配置参数实体类
 */
public class ConfigParams {
    /**
     * 指定服务器监听的ip地址
     */
    private String bind;
    /**
     * 端口号
     */
    private String port;
    /**
     * 是否开启守护进程
     */
    private boolean isDamonize;
    /**
     * 访问redis密码
     */
    private String requirepass;
    /**
     * 日志文件的路径
     */
    private String logPath;
    /**
     * 持久化文件名称
     */
    private String dbFileName;
    /**
     * 持久化文件存储路径
     */
    private String dirPath;
    /**
     * rdb持久化策略配置
     */
    private String rdbPolicy;
    /**
     * 是否开启aof
     */
    private boolean isAof;
    /**
     * 主节点访问密码
     */
    private String masterauth;
    /**
     * 指定从哪个主节点复制
     */
    private String replicaof;

Controller类

@RestController
@RequestMapping("/api/v1/redis")
public class RedisConfigController {
    @PostMapping("generate")
    public JsonData generateConfig(@RequestBody ConfigParams configParams) throws IOException, TemplateException {
      //自动生成配置文件的工具类
      GenetateConfigUtil.generateConfigFile(configParams,"E:\\IdeaWorkspace\\config-tools\\redis.conf");
        return JsonData.buildSuccess();
    }
}

自动生成文件工具类

通过整合Freemaker配置,自动生成Redis配置文件。
逻辑流程

  1. 创建Freemaker配置。
  2. 从路径中读取Redis模板文件。
  3. 加载模板文件。
  4. 构造模板数据,将前端传入的数据存放到模板中。
  5. 生成最终的配置文件内容。
public class GenetateConfigUtil {
    public static void generateConfigFile(ConfigParams configParams,String generateFilePath) throws IOException, TemplateException {
        //创建freemarker配置
        Configuration configuration=new Configuration(Configuration.VERSION_2_3_31);
        configuration.setDirectoryForTemplateLoading(new File("E:\\IdeaWorkspace\\config-tools\\src\\main\\" +
                "resources\\templates\\"));
        // 加载模板文件
        Template template = configuration.getTemplate("redis-config-template.ftl");
        boolean daemonizeFlag=false;
        if (configParams.isDamonize()==true){
            daemonizeFlag=true;
        }
        // 构造模板数据
        Map<String, Object> data = new HashMap<>();
        data.put("bindIp", configParams.getBind());
        data.put("port", configParams.getPort());
        data.put("daemonize",daemonizeFlag);
        data.put("requirepass",configParams.getRequirepass());
        data.put("logfilepath",configParams.getLogPath());
        data.put("dbfilename",configParams.getDbFileName());
        data.put("rdbpolicy",configParams.getRdbPolicy());
        data.put("dirPath",configParams.getDirPath());
        data.put("masterauth",configParams.getMasterauth());
        data.put("replicaof",configParams.getReplicaof());
        // 生成最终的配置文件内容
        FileWriter writer = new FileWriter(generateFilePath);
        template.process(data, writer);
        writer.flush();
        writer.close();
    }
}

Redis配置模板文件

在templates下创建模板文件redis-config-template.ftl。
在这里插入图片描述
模板代码

#任何IP都可以访问
<#if bindIp?has_content>
bind ${bindIp}
</#if>
#端口号
<#if port?has_content>
port ${port}
</#if>
#守护进程
<#if daemonize?has_content>
daemonize ${daemonize?string('yes','no')}
</#if>
#密码
<#if requirepass?has_content>
requirepass "${requirepass}"
</#if>
#日志文件
<#if logfilepath?has_content>
logfile "${logfilepath}"
</#if>
# 持久化文件名称
<#if dbfilename?has_content>
dbfilename "${dbfilename}"
</#if>
#持久化文件存储路径
<#if dirPath?has_content>
dir "${dirPath}"
</#if>
#持久化策略
<#if rdbpolicy?has_content>
save ${rdbpolicy}
</#if>
#访问主节点的密码
<#if masterauth?has_content>
masterauth "${masterauth}"
</#if>
#指定从哪个节点复制
<#if replicaof?has_content>
replicaof "${replicaof}"
</#if>

🌟Vue代码

关于创建步骤就不具体介绍了,下边直接给出页面代码。

<template>
  <div class="redisConfig">
    <h2 align="center">Redis配置文件生成</h2>
    <div class="redisForm">
    <el-row :gutter="15">
      <el-form ref="elForm" :model="formData" :rules="rules" size="mini" label-width="105px" 
        label-position="right">
        <el-col :span="24">
          <el-form-item label="服务器监听IP" prop="bind">
            <el-input v-model="formData.bind" placeholder="请输入服务器监听IP" clearable :style="{width: '100%'}">
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="端口号" prop="port">
            <el-input v-model="formData.port" placeholder="请输入端口号" clearable :style="{width: '100%'}">
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="1">
          <el-form-item label="是否开启守护进程" prop="isDamonize">
            <el-switch v-model="formData.isDamonize"></el-switch>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="Redis密码" prop="requirepass">
            <el-input v-model="formData.requirepass" placeholder="请输入Redis密码" clearable show-password
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="日志文件路径" prop="logPath">
            <el-input v-model="formData.logPath" placeholder="/path/xxx.log" clearable
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="持久化文件名" prop="dbFileName">
            <el-input v-model="formData.dbFileName" placeholder="请输入持久化文件名" clearable
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="持久化文件路径" prop="dirPath">
            <el-input v-model="formData.dirPath" placeholder="/path/data" clearable :style="{width: '100%'}">
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="RDB持久化策略配置" prop="rdbPolicy">
            <el-input v-model="formData.rdbPolicy" placeholder="save <minute> <changes>" clearable
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="1">
          <el-form-item label="是否开启AOF持久化" prop="isAof">
            <el-switch v-model="formData.isAof"></el-switch>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="主节点访问密码" prop="masterauth">
            <el-input v-model="formData.masterauth" placeholder="请输入主节点访问密码" clearable show-password
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="指定复制主节点" prop="replicaof">
            <el-input v-model="formData.replicaof" placeholder="请输入指定复制主节点IP" clearable
              :style="{width: '100%'}"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item size="large">
            <el-button type="primary" @click="submitForm">提交</el-button>
            <el-button @click="resetForm">重置</el-button>
          </el-form-item>
        </el-col>
      </el-form>
    </el-row>
    </div>
  </div>
</template>
<script>
export default {
  components: {},
  props: [],
  data() {
    return {
      formData: {
        bind: "",
        port: undefined,
        isDamonize: false,
        requirepass: undefined,
        logPath: undefined,
        dbFileName: undefined,
        dirPath: "",
        rdbPolicy: undefined,
        isAof: undefined,
        masterauth: undefined,
        replicaof: undefined,
      },
      rules: {
        bind: [{
          required: true,
          message: '请输入服务器监听IP',
          trigger: 'blur'
        }],
        port: [{
          required: true,
          message: '请输入端口号',
          trigger: 'blur'
        }],
        requirepass: [],
        logPath: [],
        dbFileName: [],
        dirPath: [],
        rdbPolicy: [],
        masterauth: [],
        replicaofIp: [],
        replicaofPort: [],
      },
    }
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    submitForm() {
      this.$refs['elForm'].validate(valid => {
        if (valid) {
            this.request.post("/api/v1/redis/generate", this.formData).then(res => {
            if(res.code === '0') {
              this.$message.success("生成成功")
            } else {
              this.$message.error(res.msg)
            }
          })
        }
      })
    },
    resetForm() {
      this.$refs['elForm'].resetFields()
    },
  }
}

</script>
<style>
.redisConfig {
  position: fixed;
  width: 100%;
  height: 100vh; /* 可以根据需要设置高度 */
}

.redisForm {
  position: absolute;
  top: 45%;
  left: 50%;
  transform: translate(-50%, -50%); /* 平移至中心位置 */
  /* 根据需要设置内容样式 */
}

</style>

页面效果图

在这里插入图片描述

🌟效果测试

在页面填写完相关信息提交后,将会在指定路径下生成配置文件。
在这里插入图片描述

🌟写在最后

有关于SpringBoot整合Freemaker结合Vue实现页面填写一键自动生成Redis的配置文件到此就结束了。

感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

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

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

相关文章

DCMM数据能力成熟度评估模型--学习笔记

DCMM数据能力成熟度评估模型--学习笔记 1、DCMM简介、结构组成和成熟度评估等级划分1.1 DCMM简介1.2 DCMM结构组成1.3 DCMM关键过程域1.3.1、数据战略&#xff08;指导方针&#xff09;1.3.2、数据治理 &#xff08;机制保障&#xff09;1.3.3、数据架构 (施工图纸)1.3.4、数据…

WebRTC-Streamer交叉编译

WebRTC-Streamer交叉编译 flyfish 文章目录 WebRTC-Streamer交叉编译零、前言一、提前准备工作1 安装需要的工具2 可选的交叉编译工具3 默认执行python是python34 获取源码5 使用其他版本的方法 二、非交叉编译编译1 在 src目录执行 安装所需的依赖2 执行命令 三、 交叉编译1 …

【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)

一、SH for Glossy transport 1.Diffuse PRT回顾 上篇我们介绍了PRT&#xff0c;并以Diffuse的BRDF作为例子分析了预计算的部分&#xff0c;包括Lighting和Light transport&#xff0c;如上图所示。 包括我们还提到了SH&#xff0c;可以用SH的有限阶近似拟合球面函数&#xff…

【进阶篇】MySQL的SQL解析原理详解

文章目录 0. 前言1. SQL解析过程1. 词法分析2. 语法分析4. 语法分析树5. MySQL语法分析树生成过程6. 核心数据结构及其关系7. SQL解析的应用 2. 参考文档 0. 前言 你是否已经深入了解了MySQL中 SQL解析过程&#xff0c;以及解析过程中每个环节扮演的具体角色&#xff1f;你是否…

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法&#xff1a; 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改&#xff0c;若为: : :3306&#xff0c;则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

软件测试之黑盒测试、白盒测试分别是什么?有什么区别?

软件开发过程中&#xff0c;为了保证软件质量和稳定性&#xff0c;必须进行全面而细致的测试工作&#xff0c;而黑盒测试和白盒测试正是两种常用的测试方法。 一、黑盒测试 黑盒测试是一种基于软件外部功能的测试方法。测试人员对待测试的软件系统&#xff0c;就像一个黑匣子…

uniapp-秋云图表 ucharts echarts 对比与关系

科普&#xff1a; 秋云图表库&#xff0c;包含二种配置属性对应二种js配置文件。 一种是 &#xff1a;echarts.js,一种是 &#xff1a; ucharts。 二者的配置属性不一样&#xff01; ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库&#xff0c;它…

【高危】Apache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

zhi.oscs1024.com​​​​​ 漏洞类型反序列化发现时间2023-08-29漏洞等级高危MPS编号MPS-qkdx-17bcCVE编号CVE-2023-40195漏洞影响广度广 漏洞危害 OSCS 描述Apache Airflow Spark Provider是Apache Airflow项目的一个插件&#xff0c;用于在Airflow中管理和调度Apache Spar…

自动化机器学习Auto-Sklearn安装和使用教程

安装和使用 Auto-Sklearn Auto-sklearn 提供了开箱即用的监督型自动机器学习。从名字可以看出,auto-sklearn 是基于机器学习库 scikit-learn 构建的,可为新的数据集自动搜索学习算法,并优化其超参数。因此,它将机器学习使用者从繁琐的任务中解放出来,使其有更多时间专注于…

django/CVE-2017-12794XSS漏洞复现

docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞&#xff08;CVE-2017-12794&#xff09;分析Django发布了新版本1.11.5&#xff0c;修复了500页面中可能存在的一个XSS漏洞&#xff0c;这篇文章说明一下该漏洞的原理和复现&#xff0c;和我的一点点评…

一种借助MYSQL递归CTE生成所有组合情况的实现方法

需求说明 有如下表和数据&#xff1a; Nname1户口2查询机构数过多3危险驾驶4多头用信 需要输出name里的所有组合情况&#xff0c;即单个值&#xff0c;两两组合&#xff0c;三个组合、四个组合。结果为2的n次方-1中情况&#xff0c;这里是15。 预期结果为&#xff1a; Com…

【OpenCV入门】第四部分——阈值

文章结构 阈值概述阈值处理函数二值化阈值处理二值化阈值处理反二值化处理 零处理低于阈值零处理超出阈值零处理 截断处理自适应处理Otsu方法 阈值概述 在PhotoShop里头&#xff0c;有一个工具可以快速抠出一幅图像中的轮廓&#xff0c;这个工具就是阈值。OpenCV也提供了阈值&…

springboot实战(二)之将项目上传至远程仓库

目录 环境&#xff1a; 背景&#xff1a; 操作&#xff1a; 1.注册码云账号 2.创建仓库 步骤&#xff1a; 1.注册完码云账号后&#xff0c;点击加号&#xff0c;新建仓库 2.输入项目名称和介绍&#xff0c;点击创建 3.复制仓库地址&#xff0c;你可以选择https协议或者…

ClickHouse进阶(五):副本与分片-2-Distributed引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

ssm+vue宠物领养系统源码和论文

ssmvue宠物领养系统源码和论文103 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 本课题是根据用户的需要以及网络的优势建立的一个宠物领养系统&#xff0c;来满足用宠物领养的需求。 本宠物领养系统…

抖音短视频账号矩阵seo分发系统--开发源代

1.抖音矩阵号/抖音短视频SEO矩阵系统开发及开发者思路分享: 短视频获客系统开发原型支持短视频智能批量剪辑、短视频多账号管理定时发布&#xff0c;短视频排名查询及优化&#xff0c;智能客服私信回复等&#xff0c;那么短视频seo系统开发时需要开发哪些功能呢&#xff1f;今天…

全能图片转文字:多功能图片转换工具

全能图片转文字是一款功能丰富的图片转文字软件&#xff0c;通过OCR文字识别技术能够轻松识别图片中的文字信息&#xff0c;并快速提取转换成文本格式。除了支持图片转文字&#xff0c;全能图片转文字还可以完成音频转文字、视频转文字、截图转文字等操作&#xff0c;轻松满足日…

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测&#xff1b; 2.单变量时间序列数…

春秋云镜 CVE-2018-20604

春秋云镜 CVE-2018-20604 lfdycms任意文件读取 靶标介绍 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发&#xff0c;适合各类视频、影视网站的影视内容管理程序&#xff0c;该CMS存在缺陷&#xff0c;可以通过 admin.php?s/Template/edit/path/web………*…*1.txt 的方…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌握如何构建复…