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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: SpringBoot整合Freemaker结合Vue实现页面填写一键自动生成Redis的配置文件

🌟前言


在一次搭建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。

4ce262d6a49705fca7767b45a5af5cf0_58a8cb5dfcf740e5a0d92f972988ddef.png

模板代码


#任何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>


页面效果图


74b79397bc8d4d6e0185c611e0245af9_2addf8c6a5e246a284356bd526ff2125.png


🌟效果测试


在页面填写完相关信息提交后,将会在指定路径下生成配置文件。

6fa57ddfb16055a464029061cb211caa_aa73221ed74d413c91ec20d317cacb92.png


🌟写在最后


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


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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
39 13
|
12天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
32 4
|
1月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
48 2
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
71 2
|
26天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
35 0
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
42 0
|
JavaScript 算法 Java
springboot vue二手交易市场毕设源码(毕设)
springboot vue二手交易市场毕设源码
369 0
springboot vue二手交易市场毕设源码(毕设)
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
173 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
111 62