/*
*
* Saturn Framework Co.Limt
* Copyright (c) 2012-2019 tanks, Inc. All rights reserved.
*/
package com.saturn.config.server.service.impl;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.saturn.config.server.base.dto.ConfigInfo;
import com.saturn.config.server.base.entity.AppConfig;
import com.saturn.config.server.base.entity.AppInfo;
import com.saturn.config.server.base.entity.ConfigLog;
import com.saturn.config.server.base.entity.SysUser;
import com.saturn.config.server.base.mapper.AppConfigMapper;
import com.saturn.config.server.base.mapper.AppInfoMapper;
import com.saturn.config.server.base.mapper.ConfigLogMapper;
import com.saturn.config.server.service.AppConfigService;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
/**
* <dl>
* <dt><b>Title:</b></dt>
* <dd>
* none
* </dd>
* <dt><b>Description:</b></dt>
* <dd>
* <p>应用配置项
* </dd>
*
* @author tanks
* @date 2019-07-08 15:58:43
*/
@Slf4j
@Service
public class AppConfigServiceImpl extends ServiceImpl<AppConfigMapper, AppConfig> implements AppConfigService {
@Autowired
private ConfigLogMapper configLogMapper;
@Autowired
private AppInfoMapper appInfoMapper;
@Autowired
private StringEncryptor stringEncryptor;
public IPage<ConfigInfo> queryPage(IPage<ConfigInfo> page, Map<String,Object> params){
return this.baseMapper.queryPage(page, params);
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public boolean saveAdd(AppConfig appConfig) {
AppInfo appInfo = appInfoMapper.selectById(appConfig.getAppId());
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.eq("app_id", appConfig.getAppId());
queryWrapper.eq("config_key", appConfig.getConfigKey());
queryWrapper.eq("version", appInfo.getCurrentVersion());
int count = count(queryWrapper);
if( count>0 ) {
log.info("应用中已经存在此配置项,无法覆盖,保存失败!");
return false;
}
//检查是否需要加密
if( StringUtils.isBlank(appConfig.getIsEncrypt()) ) {
appConfig.setIsEncrypt("0");
}
if( "true".equals(appConfig.getIsEncrypt()) || "on".equals(appConfig.getIsEncrypt()) ) {
appConfig.setIsEncrypt("1");
}
if("1".equals(appConfig.getIsEncrypt()) ) {
appConfig.setConfigValue(stringEncryptor.encrypt(appConfig.getConfigValue()));
}
appConfig.setVersion(appInfo.getCurrentVersion());
boolean success = save(appConfig);
//保存日志
ConfigLog configLog = new ConfigLog();
configLog.setAppId(appConfig.getAppId());
configLog.setConfigId(appConfig.getConfigId());
configLog.setCreateTime(LocalDateTime.now());
configLog.setIsCast("0");
configLog.setIsPublic("0");
configLog.setNewJson(JSONUtil.toJsonStr(appConfig));
configLog.setOperateType("0");
configLogMapper.insert(configLog);
return success;
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public int deleteRecords(String[] configIds) {
//批量删除数据
List<String> idList = new ArrayList<String>();
for(String id:configIds){
idList.add(id);
}
List<AppConfig> appConfigs = this.getBaseMapper().selectBatchIds(idList);
int count = this.getBaseMapper().deleteBatchIds(idList);
log.info("共删除配置项记录总数:" + count);
//批量删除新增、修改的未广播记录
count = configLogMapper.deleteBatchByConfigIds(idList, "0");
log.info("共删除新增未广播总数:" + count);
//插入新增删除的广播记录
for(AppConfig appConfig:appConfigs) {
//保存日志
ConfigLog configLog = new ConfigLog();
configLog.setAppId(appConfig.getAppId());
configLog.setConfigId(appConfig.getConfigId());
configLog.setCreateTime(LocalDateTime.now());
configLog.setIsCast("0");
configLog.setIsPublic("0");
configLog.setNewJson(JSONUtil.toJsonStr(appConfig));
configLog.setOperateType("2");
configLogMapper.insert(configLog);
}
log.info("共新增广播删除配置项记录总数:" + appConfigs.size());
count = appConfigs.size();
return count;
}
/**
* 批量保存数据
* @param appConfigs
* @return
* @throws Exception
*/
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public int batchSaveConfigRecord(List<AppConfig> appConfigs) throws Exception {
if( appConfigs==null || appConfigs.size()==0 ) return 0;
int updateCount = 0;
for(AppConfig appConfig:appConfigs ){
appConfig.setUpdateTime(LocalDateTime.now());
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.eq("app_id", appConfig.getAppId());
queryWrapper.eq("config_key", appConfig.getConfigKey());
queryWrapper.eq("version", appConfig.getVersion());
AppConfig entity = this.baseMapper.selectOne(queryWrapper);
if( entity!=null && entity.getConfigId().longValue()!=appConfig.getConfigId().longValue()) {
log.info("AppId:" + appConfig.getAppId() + ",ConfigKey:" + appConfig.getConfigKey() + ",变更数据与原有数据重复,无法修改");
throw new Exception("变更数据与原有数据重复,无法修改");
}
entity = this.baseMapper.selectById(appConfig.getConfigId());
if( "1".equals(appConfig.getIsEncrypt()) && "0".equals(entity.getIsEncrypt())) {
//加密
appConfig.setConfigValue("{cipher}" + stringEncryptor.encrypt(appConfig.getConfigValue()));
}else if( "0".equals(appConfig.getIsEncrypt()) && "1".equals(appConfig.getIsEncrypt())) {
//解密
if( appConfig.getConfigValue().equals(entity.getConfigValue()) ) {
appConfig.setConfigValue(stringEncryptor.decrypt(appConfig.getConfigValue().replace("{cipher}", StrUtil.EMPTY)));
}
}else if( "1".equals(appConfig.getIsEncrypt()) && "1".equals(entity.getIsEncrypt())) {
//都加密的情况,看内容是否变化
if( !appConfig.getConfigValue().equals(entity.getConfigValue()) ) {
appConfig.setConfigValue("{cipher}" + stringEncryptor.encrypt(appConfig.getConfigValue()));
}
}
int count = this.baseMapper.updateById(appConfig);
queryWrapper = Wrappers.query();
queryWrapper.eq("app_id", appConfig.getAppId());
queryWrapper.eq("config_id",appConfig.getConfigId());
queryWrapper.in("operate_type", new String[]{"0","1"});
queryWrapper.eq("is_cast", "0");
ConfigLog configLog = configLogMapper.selectOne(queryWrapper);
if( configLog!=null ) {
configLog.setUpdateTime(LocalDateTime.now());
//变成修改状态
configLog.setOriginJson(JSONUtil.toJsonStr(entity));
configLog.setNewJson(JSONUtil.toJsonStr(appConfig));
configLogMapper.updateById(configLog);
}else {
configLog = new ConfigLog();
configLog.setAppId(appConfig.getAppId());
configLog.setConfigId(appConfig.getConfigId());
configLog.setCreateTime(LocalDateTime.now());
configLog.setIsCast("0");
configLog.setIsPublic("0");
configLog.setOriginJson(JSONUtil.toJsonStr(entity));
configLog.setNewJson(JSONUtil.toJsonStr(appConfig));
configLog.setOperateType("1");
configLogMapper.insert(configLog);
}
updateCount += count;
}
return updateCount;
}
/**
* 上传配置
*/
@Override
@Transactional(readOnly = false, propagation = Propagation.RE
没有合适的资源?快使用搜索试试~ 我知道了~
基于JDBC存储方式的扩展,提供WebUI管理界面,便于统一管理、快速变更,为开发、部署提供便捷的服务
共339个文件
gif:186个
java:64个
png:24个
需积分: 5 0 下载量 155 浏览量
2024-03-01
09:56:57
上传
评论
收藏 837KB ZIP 举报
温馨提示
JDBC方式实现Spring Cloud Config Server存储,提供丰富的界面操作功能,批量添加properties或yaml文件,操作修改记录、版本升级、配置文件导出properties或yaml,动态推送变更内容。SpringCloud配置中心支持的svn、git、jdbc方式来存储配置项,使用管理过程中不是很方面,所以本组件是基于JDBC存储方式的扩展,提供WebUI管理界面,便于统一管理、快速变更,为开发、部署提供便捷的服务;本项目基于Spring Cloud Greenwich本来构建基础配置服务中心,
资源推荐
资源详情
资源评论
收起资源包目录
基于JDBC存储方式的扩展,提供WebUI管理界面,便于统一管理、快速变更,为开发、部署提供便捷的服务 (339个子文件)
bootstrap.css 170KB
bootstrap.min.css 118KB
ext-all.css 94KB
font-awesome.css 37KB
date-picker.css 6KB
ext.css 5KB
icons.css 2KB
login.css 807B
Dockerfile 223B
spring.factories 338B
index.ftl 2KB
app_config_manage.ftl 2KB
config_logs_manage.ftl 1KB
app_version_manage.ftl 1KB
app_info_manage.ftl 1KB
sys_user_manage.ftl 1KB
tip-sprite.gif 4KB
error-tip-corners.gif 4KB
tool-sprites.gif 4KB
blue-loading.gif 3KB
large-loading.gif 3KB
tools-sprites-trans.gif 3KB
search-trigger.gif 2KB
tabs-sprite.gif 2KB
loading-balls.gif 2KB
tb-sprite.gif 2KB
checkbox.gif 2KB
clear-trigger.gif 2KB
trigger.gif 2KB
radio.gif 2KB
icon-error.gif 2KB
icon-question.gif 2KB
date-trigger.gif 2KB
icon-info.gif 2KB
e-handle.gif 2KB
trigger-tpl.gif 1KB
icon-warning.gif 1KB
gradient-bg.gif 1KB
gradient-bg.gif 1KB
corners-sprite.gif 1KB
tab-btm-right-bg.gif 1KB
tab-btm-inactive-right-bg.gif 1KB
white-corners-sprite.gif 1KB
btn-sprite.gif 1KB
s-handle.gif 1KB
scroll-right.gif 1KB
scroll-left.gif 1KB
grid3-hd-btn.gif 1KB
tb-btn-sprite.gif 1KB
wait.gif 1KB
scroller-bg.gif 1KB
hd-sprite.gif 1KB
bg.gif 1KB
row-check-sprite.gif 1KB
e-handle-dark.gif 1KB
s-handle-dark.gif 1KB
pick-button.gif 1KB
arrows.gif 1024B
drop-yes.gif 1016B
drop-yes.gif 1016B
corners-blue.gif 1010B
corners.gif 1005B
drop-add.gif 1001B
drop-add.gif 1001B
exclamation.gif 996B
calendar.gif 979B
refresh.gif 977B
close.gif 972B
tool-sprite-tpl.gif 971B
hmenu-unlock.gif 971B
columns.gif 962B
warning.gif 960B
checked.gif 959B
folder-open.gif 956B
row-expand-sprite.gif 955B
hmenu-lock.gif 955B
group-expand-sprite.gif 955B
folder.gif 952B
drop-no.gif 949B
drop-no.gif 949B
drop-no.gif 947B
leaf.gif 945B
unchecked.gif 941B
hmenu-asc.gif 931B
hmenu-desc.gif 930B
page-first-disabled.gif 925B
page-first.gif 925B
page-last-disabled.gif 923B
page-last.gif 923B
btn-arrow.gif 919B
group-by.gif 917B
btn-arrow-light.gif 916B
drop-under.gif 911B
drop-over.gif 911B
elbow-plus.gif 910B
elbow-minus.gif 908B
drop-between.gif 907B
elbow-end-plus.gif 907B
elbow-end-minus.gif 905B
bg.gif 904B
共 339 条
- 1
- 2
- 3
- 4
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6732
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功