1. 优化 config 模板

This commit is contained in:
YunaiV 2021-03-10 01:23:34 +08:00
parent 00d22bf6d7
commit 0e28ab169c
6 changed files with 150 additions and 176 deletions

View File

@ -2,24 +2,12 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="参数名称" prop="name"> <el-form-item label="参数名称" prop="name">
<el-input <el-input v-model="queryParams.name" placeholder="请输入参数名称" clearable size="small" style="width: 240px"
v-model="queryParams.name" @keyup.enter.native="handleQuery"/>
placeholder="请输入参数名称"
clearable
size="small"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item label="参数键名" prop="key"> <el-form-item label="参数键名" prop="key">
<el-input <el-input v-model="queryParams.key" placeholder="请输入参数键名" clearable size="small" style="width: 240px"
v-model="queryParams.key" @keyup.enter.native="handleQuery"/>
placeholder="请输入参数键名"
clearable
size="small"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item label="系统内置" prop="type"> <el-form-item label="系统内置" prop="type">
<el-select v-model="queryParams.type" placeholder="系统内置" clearable size="small"> <el-select v-model="queryParams.type" placeholder="系统内置" clearable size="small">
@ -56,7 +44,7 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['infra:config:add']" v-hasPermi="['infra:config:create']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -95,31 +83,15 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
size="mini" v-hasPermi="['infra:config:update']">修改</el-button>
type="text" <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
icon="el-icon-edit" v-hasPermi="['infra:config:delete']">删除</el-button>
@click="handleUpdate(scope.row)"
v-hasPermi="['infra:config:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['infra:config:remove']"
>删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList"/>
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>

View File

@ -3,7 +3,6 @@ package cn.iocoder.dashboard.modules.infra.controller.config;
import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
import cn.iocoder.dashboard.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
import cn.iocoder.dashboard.modules.infra.controller.config.vo.*; import cn.iocoder.dashboard.modules.infra.controller.config.vo.*;
import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert; import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert;
@ -19,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -44,18 +42,17 @@ public class InfConfigController {
return success(configService.createConfig(reqVO)); return success(configService.createConfig(reqVO));
} }
@ApiOperation("修改参数配置")
@PutMapping("/update") @PutMapping("/update")
@ApiOperation("修改参数配置")
@PreAuthorize("@ss.hasPermission('infra:config:update')") @PreAuthorize("@ss.hasPermission('infra:config:update')")
@Idempotent(timeout = 60)
public CommonResult<Boolean> updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) { public CommonResult<Boolean> updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) {
configService.updateConfig(reqVO); configService.updateConfig(reqVO);
return success(true); return success(true);
} }
@DeleteMapping("/delete")
@ApiOperation("删除参数配置") @ApiOperation("删除参数配置")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@DeleteMapping("/delete")
@PreAuthorize("@ss.hasPermission('infra:config:delete')") @PreAuthorize("@ss.hasPermission('infra:config:delete')")
public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
configService.deleteConfig(id); configService.deleteConfig(id);
@ -70,9 +67,9 @@ public class InfConfigController {
return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id)));
} }
@GetMapping(value = "/get-value-by-key")
@ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端") @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端")
@ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class)
@GetMapping(value = "/get-value-by-key")
public CommonResult<String> getConfigKey(@RequestParam("key") String key) { public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
InfConfigDO config = configService.getConfigByKey(key); InfConfigDO config = configService.getConfigByKey(key);
if (config == null) { if (config == null) {

View File

@ -14,20 +14,21 @@ import java.util.List;
@Mapper @Mapper
public interface InfConfigMapper extends BaseMapperX<InfConfigDO> { public interface InfConfigMapper extends BaseMapperX<InfConfigDO> {
default PageResult<InfConfigDO> selectPage(InfConfigPageReqVO reqVO) {
return selectPage(reqVO,
new QueryWrapperX<InfConfigDO>().likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
default InfConfigDO selectByKey(String key) { default InfConfigDO selectByKey(String key) {
return selectOne(new QueryWrapper<InfConfigDO>().eq("`key`", key)); return selectOne(new QueryWrapper<InfConfigDO>().eq("`key`", key));
} }
default PageResult<InfConfigDO> selectPage(InfConfigPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfConfigDO>()
.likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
default List<InfConfigDO> selectList(InfConfigExportReqVO reqVO) { default List<InfConfigDO> selectList(InfConfigExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfConfigDO>().likeIfPresent("name", reqVO.getName()) return selectList(new QueryWrapperX<InfConfigDO>()
.likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey()) .likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType()) .eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));

View File

@ -7,6 +7,7 @@ import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqV
import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO;
import javax.validation.Valid;
import java.util.List; import java.util.List;
/** /**
@ -17,20 +18,26 @@ import java.util.List;
public interface InfConfigService { public interface InfConfigService {
/** /**
* 获得参数配置分页列表 * 创建参数配置
* *
* @param reqVO 分页条件 * @param reqVO 创建信息
* @return 分页列表 * @return 配置编号
*/ */
PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO); Long createConfig(@Valid InfConfigCreateReqVO reqVO);
/** /**
* 获得参数配置列表 * 更新参数配置
* *
* @param reqVO 列表 * @param reqVO 更新信息
* @return 列表
*/ */
List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO); void updateConfig(@Valid InfConfigUpdateReqVO reqVO);
/**
* 删除参数配置
*
* @param id 配置编号
*/
void deleteConfig(Long id);
/** /**
* 获得参数配置 * 获得参数配置
@ -49,25 +56,20 @@ public interface InfConfigService {
InfConfigDO getConfigByKey(String key); InfConfigDO getConfigByKey(String key);
/** /**
* 创建参数配置 * 获得参数配置分页列表
* *
* @param reqVO 创建信息 * @param reqVO 分页条件
* @return 配置编号 * @return 分页列表
*/ */
Long createConfig(InfConfigCreateReqVO reqVO); PageResult<InfConfigDO> getConfigPage(@Valid InfConfigPageReqVO reqVO);
/** /**
* 更新参数配置 * 获得参数配置列表
* *
* @param reqVO 更新信息 * @param reqVO 列表
* @return 列表
*/ */
void updateConfig(InfConfigUpdateReqVO reqVO); List<InfConfigDO> getConfigList(@Valid InfConfigExportReqVO reqVO);
/**
* 删除参数配置
*
* @param id 配置编号
*/
void deleteConfig(Long id);
} }

View File

@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -27,6 +28,7 @@ import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*;
*/ */
@Service @Service
@Slf4j @Slf4j
@Validated
public class InfConfigServiceImpl implements InfConfigService { public class InfConfigServiceImpl implements InfConfigService {
@Resource @Resource
@ -35,26 +37,6 @@ public class InfConfigServiceImpl implements InfConfigService {
@Resource @Resource
private InfConfigProducer configProducer; private InfConfigProducer configProducer;
@Override
public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
return configMapper.selectPage(reqVO);
}
@Override
public List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO) {
return configMapper.selectList(reqVO);
}
@Override
public InfConfigDO getConfig(Long id) {
return configMapper.selectById(id);
}
@Override
public InfConfigDO getConfigByKey(String key) {
return configMapper.selectByKey(key);
}
@Override @Override
public Long createConfig(InfConfigCreateReqVO reqVO) { public Long createConfig(InfConfigCreateReqVO reqVO) {
// 校验正确性 // 校验正确性
@ -93,6 +75,26 @@ public class InfConfigServiceImpl implements InfConfigService {
configProducer.sendConfigRefreshMessage(); configProducer.sendConfigRefreshMessage();
} }
@Override
public InfConfigDO getConfig(Long id) {
return configMapper.selectById(id);
}
@Override
public InfConfigDO getConfigByKey(String key) {
return configMapper.selectByKey(key);
}
@Override
public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
return configMapper.selectPage(reqVO);
}
@Override
public List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO) {
return configMapper.selectList(reqVO);
}
private void checkCreateOrUpdate(Long id, String key) { private void checkCreateOrUpdate(Long id, String key) {
// 校验自己存在 // 校验自己存在
checkConfigExists(id); checkConfigExists(id);

View File

@ -47,88 +47,6 @@ public class InfConfigServiceTest extends BaseDbUnitTest {
@MockBean @MockBean
private InfConfigProducer configProducer; private InfConfigProducer configProducer;
@Test
public void testGetConfigPage() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
o.setName("芋艿");
o.setKey("yunai");
o.setType(InfConfigTypeEnum.SYSTEM.getType());
o.setCreateTime(buildTime(2021, 2, 1));
});
configMapper.insert(dbConfig);
// 测试 name 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
// 测试 key 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
// 测试 type 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
// 测试 createTime 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
// 准备参数
InfConfigPageReqVO reqVO = new InfConfigPageReqVO();
reqVO.setName("");
reqVO.setKey("nai");
reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
reqVO.setBeginTime(buildTime(2021, 1, 15));
reqVO.setEndTime(buildTime(2021, 2, 15));
// 调用
PageResult<InfConfigDO> pageResult = configService.getConfigPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbConfig, pageResult.getList().get(0));
}
@Test
public void testGetConfigList() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
o.setName("芋艿");
o.setKey("yunai");
o.setType(InfConfigTypeEnum.SYSTEM.getType());
o.setCreateTime(buildTime(2021, 2, 1));
});
configMapper.insert(dbConfig);
// 测试 name 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
// 测试 key 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
// 测试 type 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
// 测试 createTime 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
// 准备参数
InfConfigExportReqVO reqVO = new InfConfigExportReqVO();
reqVO.setName("");
reqVO.setKey("nai");
reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
reqVO.setBeginTime(buildTime(2021, 1, 15));
reqVO.setEndTime(buildTime(2021, 2, 15));
// 调用
List<InfConfigDO> list = configService.getConfigList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbConfig, list.get(0));
}
@Test
public void testGetConfigByKey() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO();
configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据
// 准备参数
String key = dbConfig.getKey();
// 调用
InfConfigDO config = configService.getConfigByKey(key);
// 断言
assertNotNull(config);
assertPojoEquals(dbConfig, config);
}
@Test @Test
public void testCreateConfig_success() { public void testCreateConfig_success() {
// 准备参数 // 准备参数
@ -243,6 +161,88 @@ public class InfConfigServiceTest extends BaseDbUnitTest {
CONFIG_KEY_DUPLICATE); CONFIG_KEY_DUPLICATE);
} }
@Test
public void testGetConfigPage() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
o.setName("芋艿");
o.setKey("yunai");
o.setType(InfConfigTypeEnum.SYSTEM.getType());
o.setCreateTime(buildTime(2021, 2, 1));
});
configMapper.insert(dbConfig);
// 测试 name 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
// 测试 key 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
// 测试 type 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
// 测试 createTime 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
// 准备参数
InfConfigPageReqVO reqVO = new InfConfigPageReqVO();
reqVO.setName("");
reqVO.setKey("nai");
reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
reqVO.setBeginTime(buildTime(2021, 1, 15));
reqVO.setEndTime(buildTime(2021, 2, 15));
// 调用
PageResult<InfConfigDO> pageResult = configService.getConfigPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbConfig, pageResult.getList().get(0));
}
@Test
public void testGetConfigList() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
o.setName("芋艿");
o.setKey("yunai");
o.setType(InfConfigTypeEnum.SYSTEM.getType());
o.setCreateTime(buildTime(2021, 2, 1));
});
configMapper.insert(dbConfig);
// 测试 name 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
// 测试 key 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
// 测试 type 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
// 测试 createTime 不匹配
configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
// 准备参数
InfConfigExportReqVO reqVO = new InfConfigExportReqVO();
reqVO.setName("");
reqVO.setKey("nai");
reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
reqVO.setBeginTime(buildTime(2021, 1, 15));
reqVO.setEndTime(buildTime(2021, 2, 15));
// 调用
List<InfConfigDO> list = configService.getConfigList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbConfig, list.get(0));
}
@Test
public void testGetConfigByKey() {
// mock 数据
InfConfigDO dbConfig = randomInfConfigDO();
configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据
// 准备参数
String key = dbConfig.getKey();
// 调用
InfConfigDO config = configService.getConfigByKey(key);
// 断言
assertNotNull(config);
assertPojoEquals(dbConfig, config);
}
// ========== 随机对象 ========== // ========== 随机对象 ==========
@SafeVarargs @SafeVarargs