diff --git a/common/src/main/java/ink/wgink/common/controller/api/env/EnvController.java b/common/src/main/java/ink/wgink/common/controller/api/env/EnvController.java new file mode 100644 index 00000000..d47f53cd --- /dev/null +++ b/common/src/main/java/ink/wgink/common/controller/api/env/EnvController.java @@ -0,0 +1,51 @@ +package ink.wgink.common.controller.api.env; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.common.pojo.dtos.env.EnvDTO; +import ink.wgink.common.pojo.vos.env.EnvListVO; +import ink.wgink.common.service.env.IEnvService; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @ClassName: EnvController + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:50 + * @Version: 1.0 + */ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "环境变量") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/env") +public class EnvController extends DefaultBaseController { + + @Autowired + private IEnvService envService; + + @ApiOperation(value = "更新", notes = "更新") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update") + @CheckRequestBodyAnnotation + public SuccessResult update(@RequestBody EnvListVO envListVO) { + envService.update(envListVO); + return new SuccessResult(); + } + + @ApiOperation(value = "获取配置", notes = "获取配置接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list() { + return envService.list(); + } + +} diff --git a/common/src/main/java/ink/wgink/common/controller/route/env/EnvRouteController.java b/common/src/main/java/ink/wgink/common/controller/route/env/EnvRouteController.java new file mode 100644 index 00000000..aba0741d --- /dev/null +++ b/common/src/main/java/ink/wgink/common/controller/route/env/EnvRouteController.java @@ -0,0 +1,29 @@ +package ink.wgink.common.controller.route.env; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: EnvController + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:50 + * @Version: 1.0 + */ +@Api(tags = ISystemConstant.ROUTE_TAGS_PREFIX + "环境变量") +@RestController +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/env") +public class EnvRouteController extends DefaultBaseController { + + @GetMapping("update") + public ModelAndView update() { + ModelAndView modelAndView = new ModelAndView("env/update"); + return modelAndView; + } + +} diff --git a/common/src/main/java/ink/wgink/common/dao/env/IEnvDao.java b/common/src/main/java/ink/wgink/common/dao/env/IEnvDao.java new file mode 100644 index 00000000..74e041e4 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/dao/env/IEnvDao.java @@ -0,0 +1,64 @@ +package ink.wgink.common.dao.env; + +import ink.wgink.common.pojo.dtos.env.EnvDTO; +import ink.wgink.exceptions.RemoveException; +import ink.wgink.exceptions.SaveException; +import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.UpdateException; +import ink.wgink.interfaces.init.IInitBaseTable; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: IEnvDao + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:24 + * @Version: 1.0 + */ +@Repository +public interface IEnvDao extends IInitBaseTable { + + /** + * 新增 + * + * @param params + * @throws SaveException + */ + void save(Map params) throws SaveException; + + /** + * 修改 + * + * @param params + * @throws UpdateException + */ + void update(Map params) throws UpdateException; + + /** + * 删除 + * + * @throws RemoveException + */ + void delete() throws RemoveException; + + /** + * 列表 + * + * @return + * @throws SearchException + */ + List list() throws SearchException; + + /** + * 详情 + * + * @param envKey + * @return + * @throws SearchException + */ + EnvDTO get(String envKey) throws SearchException; + +} diff --git a/common/src/main/java/ink/wgink/common/manager/env/EnvManager.java b/common/src/main/java/ink/wgink/common/manager/env/EnvManager.java new file mode 100644 index 00000000..d50a6735 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/manager/env/EnvManager.java @@ -0,0 +1,81 @@ +package ink.wgink.common.manager.env; + +import ink.wgink.common.dao.env.IEnvDao; +import ink.wgink.common.pojo.Env; +import ink.wgink.common.pojo.dtos.env.EnvDTO; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @ClassName: EnvManager + * @Description: 环境变量管理 + * @Author: wanggeng + * @Date: 2022/5/16 10:47 + * @Version: 1.0 + */ +public class EnvManager { + + private static final Logger LOG = LoggerFactory.getLogger(EnvManager.class); + private static EnvManager envManager = EnvManagerBuilder.envManager; + private static Pattern ENV_VARIABLE = Pattern.compile("%[a-zA-Z\\d\\_\\-]+%"); + private IEnvDao envDao; + private Env env = new Env(); + + public static EnvManager getInstance() { + return envManager; + } + + /** + * 刷新环境变量 + */ + public void refreshEnv() { + env.clear(); + List envDTOS = envDao.list(); + envDTOS.forEach(envDTO -> { + env.put(envDTO.getEnvKey(), envDTO.getEnvValue()); + }); + } + + /** + * 获得环境变量 + * + * @return + */ + public Env getEnv() { + return env; + } + + public boolean isKeyExist(String key) { + return env.containsKey(key); + } + + public String getValue(String key) { + String value = env.get(key); + value = value == null ? "" : value; + // 替换变量 + Matcher matcher = ENV_VARIABLE.matcher(value); + while (matcher.find()) { + String variable = matcher.group(); + String variableValue = env.get(variable.substring(1, variable.length() - 1)); + if (StringUtils.isBlank(variableValue)) { + continue; + } + value = value.replaceFirst(variable, variableValue); + } + return value; + } + + public void setEnvDao(IEnvDao envDao) { + this.envDao = envDao; + } + + private static class EnvManagerBuilder { + public static final EnvManager envManager = new EnvManager(); + } + +} diff --git a/common/src/main/java/ink/wgink/common/pojo/Env.java b/common/src/main/java/ink/wgink/common/pojo/Env.java new file mode 100644 index 00000000..901eb5ee --- /dev/null +++ b/common/src/main/java/ink/wgink/common/pojo/Env.java @@ -0,0 +1,83 @@ +package ink.wgink.common.pojo; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @ClassName: Env + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 14:46 + * @Version: 1.0 + */ +public class Env implements Map { + + Map envMap = new ConcurrentHashMap<>(); + + @Override + public int size() { + return envMap.size(); + } + + @Override + public boolean isEmpty() { + return envMap.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return envMap.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return envMap.containsValue(value); + } + + @Override + public String get(Object key) { + return envMap.get(key); + } + + @Override + public String put(String key, String value) { + return envMap.put(key, value); + } + + @Override + public String remove(Object key) { + return envMap.remove(key); + } + + @Override + public void putAll(Map m) { + envMap.putAll(m); + } + + @Override + public void clear() { + envMap.clear(); + } + + @Override + public Set keySet() { + return envMap.keySet(); + } + + @Override + public Collection values() { + return envMap.values(); + } + + @Override + public Set> entrySet() { + return envMap.entrySet(); + } + + @Override + public String toString() { + return envMap.toString(); + } +} diff --git a/common/src/main/java/ink/wgink/common/pojo/dtos/env/EnvDTO.java b/common/src/main/java/ink/wgink/common/pojo/dtos/env/EnvDTO.java new file mode 100644 index 00000000..20c6fda8 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/pojo/dtos/env/EnvDTO.java @@ -0,0 +1,46 @@ +package ink.wgink.common.pojo.dtos.env; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + * @ClassName: EnvDTO + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:36 + * @Version: 1.0 + */ +public class EnvDTO implements Serializable { + + @ApiModelProperty(name = "envKey", value = "环境变量") + private String envKey; + @ApiModelProperty(name = "envExplain", value = "环境变量说明") + private String envExplain; + @ApiModelProperty(name = "envValue", value = "环境变量值") + private String envValue; + + public String getEnvKey() { + return envKey == null ? "" : envKey.trim(); + } + + public void setEnvKey(String envKey) { + this.envKey = envKey; + } + + public String getEnvExplain() { + return envExplain == null ? "" : envExplain.trim(); + } + + public void setEnvExplain(String envExplain) { + this.envExplain = envExplain; + } + + public String getEnvValue() { + return envValue == null ? "" : envValue.trim(); + } + + public void setEnvValue(String envValue) { + this.envValue = envValue; + } +} diff --git a/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvListVO.java b/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvListVO.java new file mode 100644 index 00000000..e8a2c541 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvListVO.java @@ -0,0 +1,40 @@ +package ink.wgink.common.pojo.vos.env; + +import ink.wgink.annotation.CheckListBeanAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName: EnvPO + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:36 + * @Version: 1.0 + */ +@ApiModel +public class EnvListVO { + + @ApiModelProperty(name = "envs", value = "环境变量列表") + @CheckListBeanAnnotation + private List envs; + + public List getEnvs() { + return envs == null ? new ArrayList() : envs; + } + + public void setEnvs(List envs) { + this.envs = envs; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"envs\":") + .append(envs); + sb.append('}'); + return sb.toString(); + } +} diff --git a/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvVO.java b/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvVO.java new file mode 100644 index 00000000..5ee59d82 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/pojo/vos/env/EnvVO.java @@ -0,0 +1,59 @@ +package ink.wgink.common.pojo.vos.env; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: EnvPO + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:36 + * @Version: 1.0 + */ +@ApiModel +public class EnvVO { + + @ApiModelProperty(name = "envKey", value = "环境变量") + private String envKey; + @ApiModelProperty(name = "envExplain", value = "环境变量说明") + private String envExplain; + @ApiModelProperty(name = "envValue", value = "环境变量值") + private String envValue; + + public String getEnvKey() { + return envKey == null ? "" : envKey.trim(); + } + + public void setEnvKey(String envKey) { + this.envKey = envKey; + } + + public String getEnvExplain() { + return envExplain == null ? "" : envExplain.trim(); + } + + public void setEnvExplain(String envExplain) { + this.envExplain = envExplain; + } + + public String getEnvValue() { + return envValue == null ? "" : envValue.trim(); + } + + public void setEnvValue(String envValue) { + this.envValue = envValue; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"envKey\":\"") + .append(envKey).append('\"'); + sb.append(",\"envExplain\":\"") + .append(envExplain).append('\"'); + sb.append(",\"envValue\":\"") + .append(envValue).append('\"'); + sb.append('}'); + return sb.toString(); + } +} diff --git a/common/src/main/java/ink/wgink/common/service/env/IEnvService.java b/common/src/main/java/ink/wgink/common/service/env/IEnvService.java new file mode 100644 index 00000000..5c0b2537 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/service/env/IEnvService.java @@ -0,0 +1,31 @@ +package ink.wgink.common.service.env; + +import ink.wgink.common.pojo.dtos.env.EnvDTO; +import ink.wgink.common.pojo.vos.env.EnvListVO; + +import java.util.List; + +/** + * @ClassName: IEnvService + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:48 + * @Version: 1.0 + */ +public interface IEnvService { + + /** + * 更新 + * + * @param envMap + */ + void update(EnvListVO envListVO); + + /** + * 详情 + * + * @return + */ + List list(); + +} diff --git a/common/src/main/java/ink/wgink/common/service/env/impl/EnvServiceImpl.java b/common/src/main/java/ink/wgink/common/service/env/impl/EnvServiceImpl.java new file mode 100644 index 00000000..775ad8c3 --- /dev/null +++ b/common/src/main/java/ink/wgink/common/service/env/impl/EnvServiceImpl.java @@ -0,0 +1,52 @@ +package ink.wgink.common.service.env.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.common.dao.env.IEnvDao; +import ink.wgink.common.manager.env.EnvManager; +import ink.wgink.common.pojo.Env; +import ink.wgink.common.pojo.dtos.env.EnvDTO; +import ink.wgink.common.pojo.vos.env.EnvListVO; +import ink.wgink.common.pojo.vos.env.EnvVO; +import ink.wgink.common.service.env.IEnvService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: EnvServiceImpl + * @Description: 环境变量 + * @Author: wanggeng + * @Date: 2022/5/16 10:48 + * @Version: 1.0 + */ +@Service +public class EnvServiceImpl extends DefaultBaseService implements IEnvService { + + @Autowired + private IEnvDao envDao; + + @Override + public void update(EnvListVO envListVO) { + // 清空 + envDao.delete(); + // 新增 + Map params = getHashMap(5); + for (EnvVO envVO : envListVO.getEnvs()) { + params.put("envKey", envVO.getEnvKey()); + params.put("envExplain", envVO.getEnvExplain()); + params.put("envValue", envVO.getEnvValue()); + envDao.save(params); + } + // 刷新缓存 + EnvManager.getInstance().refreshEnv(); + } + + @Override + public List list() { + Env env = EnvManager.getInstance().getEnv(); + System.out.println(env.toString()); + return envDao.list(); + } +} diff --git a/common/src/main/java/ink/wgink/common/startup/CommonStartup.java b/common/src/main/java/ink/wgink/common/startup/CommonStartup.java index 417e1f25..3882d73a 100644 --- a/common/src/main/java/ink/wgink/common/startup/CommonStartup.java +++ b/common/src/main/java/ink/wgink/common/startup/CommonStartup.java @@ -1,5 +1,7 @@ package ink.wgink.common.startup; +import ink.wgink.common.dao.env.IEnvDao; +import ink.wgink.common.manager.env.EnvManager; import ink.wgink.interfaces.init.IInitBaseMenu; import ink.wgink.interfaces.init.IInitBaseTable; import ink.wgink.interfaces.init.IInitBaseUser; @@ -29,9 +31,11 @@ public class CommonStartup implements ApplicationRunner { private IInitBaseMenu initBaseMenu; @Autowired(required = false) private IInitBaseUser initBaseUser; + private IEnvDao envDao; - public CommonStartup(ApplicationContext applicationContext) { + public CommonStartup(ApplicationContext applicationContext, IEnvDao envDao) { this.applicationContext = applicationContext; + this.envDao = envDao; } @Override @@ -49,5 +53,10 @@ public class CommonStartup implements ApplicationRunner { if (initBaseUser != null) { initBaseUser.init(); } + + // 初始化环境变量 + EnvManager envManager = EnvManager.getInstance(); + envManager.setEnvDao(envDao); + envManager.refreshEnv(); } } diff --git a/common/src/main/resources/mybatis/mapper/env-mapper.xml b/common/src/main/resources/mybatis/mapper/env-mapper.xml new file mode 100644 index 00000000..10989e73 --- /dev/null +++ b/common/src/main/resources/mybatis/mapper/env-mapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + CREATE TABLE IF NOT EXISTS `sys_env` ( + `env_key` varchar(255) NOT NULL COMMENT '环境变量Key', + `env_explain` varchar(255) DEFAULT NULL COMMENT '环境变量说明', + `env_value` longtext COMMENT '环境变量值', + PRIMARY KEY (`env_key`), + UNIQUE KEY `env_key` (`env_key`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统环境变量'; + + + + + INSERT INTO sys_env( + env_key, + env_explain, + env_value + ) VALUES( + #{envKey}, + #{envExplain}, + #{envValue} + ) + + + + + DELETE FROM sys_env + + + + + UPDATE + sys_env + SET + env_value = #{envValue}, + env_explain = #{envExplain} + WHERE + env_key = #{envKey} + + + + + + + + \ No newline at end of file diff --git a/common/src/main/resources/templates/env/update.html b/common/src/main/resources/templates/env/update.html new file mode 100644 index 00000000..d649fb6c --- /dev/null +++ b/common/src/main/resources/templates/env/update.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file