Commit 0e28ab169c31cc79572832d6366cb5ea414e9197

Authored by YunaiV
1 parent 00d22bf6

1. 优化 config 模板

ruoyi-ui/src/views/infra/config/index.vue
... ... @@ -2,24 +2,12 @@
2 2 <div class="app-container">
3 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 4 <el-form-item label="参数名称" prop="name">
5   - <el-input
6   - v-model="queryParams.name"
7   - placeholder="请输入参数名称"
8   - clearable
9   - size="small"
10   - style="width: 240px"
11   - @keyup.enter.native="handleQuery"
12   - />
  5 + <el-input v-model="queryParams.name" placeholder="请输入参数名称" clearable size="small" style="width: 240px"
  6 + @keyup.enter.native="handleQuery"/>
13 7 </el-form-item>
14 8 <el-form-item label="参数键名" prop="key">
15   - <el-input
16   - v-model="queryParams.key"
17   - placeholder="请输入参数键名"
18   - clearable
19   - size="small"
20   - style="width: 240px"
21   - @keyup.enter.native="handleQuery"
22   - />
  9 + <el-input v-model="queryParams.key" placeholder="请输入参数键名" clearable size="small" style="width: 240px"
  10 + @keyup.enter.native="handleQuery"/>
23 11 </el-form-item>
24 12 <el-form-item label="系统内置" prop="type">
25 13 <el-select v-model="queryParams.type" placeholder="系统内置" clearable size="small">
... ... @@ -56,7 +44,7 @@
56 44 icon="el-icon-plus"
57 45 size="mini"
58 46 @click="handleAdd"
59   - v-hasPermi="['infra:config:add']"
  47 + v-hasPermi="['infra:config:create']"
60 48 >新增</el-button>
61 49 </el-col>
62 50 <el-col :span="1.5">
... ... @@ -95,31 +83,15 @@
95 83 </el-table-column>
96 84 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
97 85 <template slot-scope="scope">
98   - <el-button
99   - size="mini"
100   - type="text"
101   - icon="el-icon-edit"
102   - @click="handleUpdate(scope.row)"
103   - v-hasPermi="['infra:config:edit']"
104   - >修改</el-button>
105   - <el-button
106   - size="mini"
107   - type="text"
108   - icon="el-icon-delete"
109   - @click="handleDelete(scope.row)"
110   - v-hasPermi="['infra:config:remove']"
111   - >删除</el-button>
  86 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  87 + v-hasPermi="['infra:config:update']">修改</el-button>
  88 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  89 + v-hasPermi="['infra:config:delete']">删除</el-button>
112 90 </template>
113 91 </el-table-column>
114 92 </el-table>
115 93  
116   - <pagination
117   - v-show="total>0"
118   - :total="total"
119   - :page.sync="queryParams.pageNo"
120   - :limit.sync="queryParams.pageSize"
121   - @pagination="getList"
122   - />
  94 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList"/>
123 95  
124 96 <!-- 添加或修改参数配置对话框 -->
125 97 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
... ...
src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.dashboard.modules.infra.controller.config;
3 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
6   -import cn.iocoder.dashboard.framework.idempotent.core.annotation.Idempotent;
7 6 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
8 7 import cn.iocoder.dashboard.modules.infra.controller.config.vo.*;
9 8 import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert;
... ... @@ -19,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
19 18 import javax.annotation.Resource;
20 19 import javax.servlet.http.HttpServletResponse;
21 20 import javax.validation.Valid;
22   -
23 21 import java.io.IOException;
24 22 import java.util.List;
25 23  
... ... @@ -44,18 +42,17 @@ public class InfConfigController {
44 42 return success(configService.createConfig(reqVO));
45 43 }
46 44  
47   - @ApiOperation("修改参数配置")
48 45 @PutMapping("/update")
  46 + @ApiOperation("修改参数配置")
49 47 @PreAuthorize("@ss.hasPermission('infra:config:update')")
50   - @Idempotent(timeout = 60)
51 48 public CommonResult<Boolean> updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) {
52 49 configService.updateConfig(reqVO);
53 50 return success(true);
54 51 }
55 52  
  53 + @DeleteMapping("/delete")
56 54 @ApiOperation("删除参数配置")
57 55 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
58   - @DeleteMapping("/delete")
59 56 @PreAuthorize("@ss.hasPermission('infra:config:delete')")
60 57 public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
61 58 configService.deleteConfig(id);
... ... @@ -70,9 +67,9 @@ public class InfConfigController {
70 67 return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id)));
71 68 }
72 69  
  70 + @GetMapping(value = "/get-value-by-key")
73 71 @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端")
74 72 @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class)
75   - @GetMapping(value = "/get-value-by-key")
76 73 public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
77 74 InfConfigDO config = configService.getConfigByKey(key);
78 75 if (config == null) {
... ...
src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java
... ... @@ -14,20 +14,21 @@ import java.util.List;
14 14 @Mapper
15 15 public interface InfConfigMapper extends BaseMapperX<InfConfigDO> {
16 16  
17   - default PageResult<InfConfigDO> selectPage(InfConfigPageReqVO reqVO) {
18   - return selectPage(reqVO,
19   - new QueryWrapperX<InfConfigDO>().likeIfPresent("name", reqVO.getName())
20   - .likeIfPresent("`key`", reqVO.getKey())
21   - .eqIfPresent("`type`", reqVO.getType())
22   - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
23   - }
24   -
25 17 default InfConfigDO selectByKey(String key) {
26 18 return selectOne(new QueryWrapper<InfConfigDO>().eq("`key`", key));
27 19 }
28 20  
  21 + default PageResult<InfConfigDO> selectPage(InfConfigPageReqVO reqVO) {
  22 + return selectPage(reqVO, new QueryWrapperX<InfConfigDO>()
  23 + .likeIfPresent("name", reqVO.getName())
  24 + .likeIfPresent("`key`", reqVO.getKey())
  25 + .eqIfPresent("`type`", reqVO.getType())
  26 + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
  27 + }
  28 +
29 29 default List<InfConfigDO> selectList(InfConfigExportReqVO reqVO) {
30   - return selectList(new QueryWrapperX<InfConfigDO>().likeIfPresent("name", reqVO.getName())
  30 + return selectList(new QueryWrapperX<InfConfigDO>()
  31 + .likeIfPresent("name", reqVO.getName())
31 32 .likeIfPresent("`key`", reqVO.getKey())
32 33 .eqIfPresent("`type`", reqVO.getType())
33 34 .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
... ...
src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqV
7 7 import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
8 8 import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO;
9 9  
  10 +import javax.validation.Valid;
10 11 import java.util.List;
11 12  
12 13 /**
... ... @@ -17,20 +18,26 @@ import java.util.List;
17 18 public interface InfConfigService {
18 19  
19 20 /**
20   - * 获得参数配置分页列表
  21 + * 创建参数配置
21 22 *
22   - * @param reqVO 分页条件
23   - * @return 分页列表
  23 + * @param reqVO 创建信息
  24 + * @return 配置编号
24 25 */
25   - PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO);
  26 + Long createConfig(@Valid InfConfigCreateReqVO reqVO);
26 27  
27 28 /**
28   - * 获得参数配置列表
  29 + * 更新参数配置
29 30 *
30   - * @param reqVO 列表
31   - * @return 列表
  31 + * @param reqVO 更新信息
32 32 */
33   - List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO);
  33 + void updateConfig(@Valid InfConfigUpdateReqVO reqVO);
  34 +
  35 + /**
  36 + * 删除参数配置
  37 + *
  38 + * @param id 配置编号
  39 + */
  40 + void deleteConfig(Long id);
34 41  
35 42 /**
36 43 * 获得参数配置
... ... @@ -49,25 +56,20 @@ public interface InfConfigService {
49 56 InfConfigDO getConfigByKey(String key);
50 57  
51 58 /**
52   - * 创建参数配置
  59 + * 获得参数配置分页列表
53 60 *
54   - * @param reqVO 创建信息
55   - * @return 配置编号
  61 + * @param reqVO 分页条件
  62 + * @return 分页列表
56 63 */
57   - Long createConfig(InfConfigCreateReqVO reqVO);
  64 + PageResult<InfConfigDO> getConfigPage(@Valid InfConfigPageReqVO reqVO);
58 65  
59 66 /**
60   - * 更新参数配置
  67 + * 获得参数配置列表
61 68 *
62   - * @param reqVO 更新信息
  69 + * @param reqVO 列表
  70 + * @return 列表
63 71 */
64   - void updateConfig(InfConfigUpdateReqVO reqVO);
  72 + List<InfConfigDO> getConfigList(@Valid InfConfigExportReqVO reqVO);
65 73  
66   - /**
67   - * 删除参数配置
68   - *
69   - * @param id 配置编号
70   - */
71   - void deleteConfig(Long id);
72 74  
73 75 }
... ...
src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java
... ... @@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService;
15 15 import com.google.common.annotations.VisibleForTesting;
16 16 import lombok.extern.slf4j.Slf4j;
17 17 import org.springframework.stereotype.Service;
  18 +import org.springframework.validation.annotation.Validated;
18 19  
19 20 import javax.annotation.Resource;
20 21  
... ... @@ -27,6 +28,7 @@ import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*;
27 28 */
28 29 @Service
29 30 @Slf4j
  31 +@Validated
30 32 public class InfConfigServiceImpl implements InfConfigService {
31 33  
32 34 @Resource
... ... @@ -36,26 +38,6 @@ public class InfConfigServiceImpl implements InfConfigService {
36 38 private InfConfigProducer configProducer;
37 39  
38 40 @Override
39   - public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
40   - return configMapper.selectPage(reqVO);
41   - }
42   -
43   - @Override
44   - public List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO) {
45   - return configMapper.selectList(reqVO);
46   - }
47   -
48   - @Override
49   - public InfConfigDO getConfig(Long id) {
50   - return configMapper.selectById(id);
51   - }
52   -
53   - @Override
54   - public InfConfigDO getConfigByKey(String key) {
55   - return configMapper.selectByKey(key);
56   - }
57   -
58   - @Override
59 41 public Long createConfig(InfConfigCreateReqVO reqVO) {
60 42 // 校验正确性
61 43 checkCreateOrUpdate(null, reqVO.getKey());
... ... @@ -93,6 +75,26 @@ public class InfConfigServiceImpl implements InfConfigService {
93 75 configProducer.sendConfigRefreshMessage();
94 76 }
95 77  
  78 + @Override
  79 + public InfConfigDO getConfig(Long id) {
  80 + return configMapper.selectById(id);
  81 + }
  82 +
  83 + @Override
  84 + public InfConfigDO getConfigByKey(String key) {
  85 + return configMapper.selectByKey(key);
  86 + }
  87 +
  88 + @Override
  89 + public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
  90 + return configMapper.selectPage(reqVO);
  91 + }
  92 +
  93 + @Override
  94 + public List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO) {
  95 + return configMapper.selectList(reqVO);
  96 + }
  97 +
96 98 private void checkCreateOrUpdate(Long id, String key) {
97 99 // 校验自己存在
98 100 checkConfigExists(id);
... ...
src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java
... ... @@ -48,88 +48,6 @@ public class InfConfigServiceTest extends BaseDbUnitTest {
48 48 private InfConfigProducer configProducer;
49 49  
50 50 @Test
51   - public void testGetConfigPage() {
52   - // mock 数据
53   - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
54   - o.setName("芋艿");
55   - o.setKey("yunai");
56   - o.setType(InfConfigTypeEnum.SYSTEM.getType());
57   - o.setCreateTime(buildTime(2021, 2, 1));
58   - });
59   - configMapper.insert(dbConfig);
60   - // 测试 name 不匹配
61   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
62   - // 测试 key 不匹配
63   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
64   - // 测试 type 不匹配
65   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
66   - // 测试 createTime 不匹配
67   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
68   - // 准备参数
69   - InfConfigPageReqVO reqVO = new InfConfigPageReqVO();
70   - reqVO.setName("艿");
71   - reqVO.setKey("nai");
72   - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
73   - reqVO.setBeginTime(buildTime(2021, 1, 15));
74   - reqVO.setEndTime(buildTime(2021, 2, 15));
75   -
76   - // 调用
77   - PageResult<InfConfigDO> pageResult = configService.getConfigPage(reqVO);
78   - // 断言
79   - assertEquals(1, pageResult.getTotal());
80   - assertEquals(1, pageResult.getList().size());
81   - assertPojoEquals(dbConfig, pageResult.getList().get(0));
82   - }
83   -
84   - @Test
85   - public void testGetConfigList() {
86   - // mock 数据
87   - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
88   - o.setName("芋艿");
89   - o.setKey("yunai");
90   - o.setType(InfConfigTypeEnum.SYSTEM.getType());
91   - o.setCreateTime(buildTime(2021, 2, 1));
92   - });
93   - configMapper.insert(dbConfig);
94   - // 测试 name 不匹配
95   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
96   - // 测试 key 不匹配
97   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
98   - // 测试 type 不匹配
99   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
100   - // 测试 createTime 不匹配
101   - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
102   - // 准备参数
103   - InfConfigExportReqVO reqVO = new InfConfigExportReqVO();
104   - reqVO.setName("艿");
105   - reqVO.setKey("nai");
106   - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
107   - reqVO.setBeginTime(buildTime(2021, 1, 15));
108   - reqVO.setEndTime(buildTime(2021, 2, 15));
109   -
110   - // 调用
111   - List<InfConfigDO> list = configService.getConfigList(reqVO);
112   - // 断言
113   - assertEquals(1, list.size());
114   - assertPojoEquals(dbConfig, list.get(0));
115   - }
116   -
117   - @Test
118   - public void testGetConfigByKey() {
119   - // mock 数据
120   - InfConfigDO dbConfig = randomInfConfigDO();
121   - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据
122   - // 准备参数
123   - String key = dbConfig.getKey();
124   -
125   - // 调用
126   - InfConfigDO config = configService.getConfigByKey(key);
127   - // 断言
128   - assertNotNull(config);
129   - assertPojoEquals(dbConfig, config);
130   - }
131   -
132   - @Test
133 51 public void testCreateConfig_success() {
134 52 // 准备参数
135 53 InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class);
... ... @@ -243,6 +161,88 @@ public class InfConfigServiceTest extends BaseDbUnitTest {
243 161 CONFIG_KEY_DUPLICATE);
244 162 }
245 163  
  164 + @Test
  165 + public void testGetConfigPage() {
  166 + // mock 数据
  167 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
  168 + o.setName("芋艿");
  169 + o.setKey("yunai");
  170 + o.setType(InfConfigTypeEnum.SYSTEM.getType());
  171 + o.setCreateTime(buildTime(2021, 2, 1));
  172 + });
  173 + configMapper.insert(dbConfig);
  174 + // 测试 name 不匹配
  175 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
  176 + // 测试 key 不匹配
  177 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
  178 + // 测试 type 不匹配
  179 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
  180 + // 测试 createTime 不匹配
  181 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
  182 + // 准备参数
  183 + InfConfigPageReqVO reqVO = new InfConfigPageReqVO();
  184 + reqVO.setName("艿");
  185 + reqVO.setKey("nai");
  186 + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
  187 + reqVO.setBeginTime(buildTime(2021, 1, 15));
  188 + reqVO.setEndTime(buildTime(2021, 2, 15));
  189 +
  190 + // 调用
  191 + PageResult<InfConfigDO> pageResult = configService.getConfigPage(reqVO);
  192 + // 断言
  193 + assertEquals(1, pageResult.getTotal());
  194 + assertEquals(1, pageResult.getList().size());
  195 + assertPojoEquals(dbConfig, pageResult.getList().get(0));
  196 + }
  197 +
  198 + @Test
  199 + public void testGetConfigList() {
  200 + // mock 数据
  201 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到
  202 + o.setName("芋艿");
  203 + o.setKey("yunai");
  204 + o.setType(InfConfigTypeEnum.SYSTEM.getType());
  205 + o.setCreateTime(buildTime(2021, 2, 1));
  206 + });
  207 + configMapper.insert(dbConfig);
  208 + // 测试 name 不匹配
  209 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆")));
  210 + // 测试 key 不匹配
  211 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou")));
  212 + // 测试 type 不匹配
  213 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType())));
  214 + // 测试 createTime 不匹配
  215 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1))));
  216 + // 准备参数
  217 + InfConfigExportReqVO reqVO = new InfConfigExportReqVO();
  218 + reqVO.setName("艿");
  219 + reqVO.setKey("nai");
  220 + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType());
  221 + reqVO.setBeginTime(buildTime(2021, 1, 15));
  222 + reqVO.setEndTime(buildTime(2021, 2, 15));
  223 +
  224 + // 调用
  225 + List<InfConfigDO> list = configService.getConfigList(reqVO);
  226 + // 断言
  227 + assertEquals(1, list.size());
  228 + assertPojoEquals(dbConfig, list.get(0));
  229 + }
  230 +
  231 + @Test
  232 + public void testGetConfigByKey() {
  233 + // mock 数据
  234 + InfConfigDO dbConfig = randomInfConfigDO();
  235 + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据
  236 + // 准备参数
  237 + String key = dbConfig.getKey();
  238 +
  239 + // 调用
  240 + InfConfigDO config = configService.getConfigByKey(key);
  241 + // 断言
  242 + assertNotNull(config);
  243 + assertPojoEquals(dbConfig, config);
  244 + }
  245 +
246 246 // ========== 随机对象 ==========
247 247  
248 248 @SafeVarargs
... ...