Commit d2fa839d3cd9a9b492f757d947f6e5b758471315

Authored by YunaiV
1 parent 35a01cbf

完成参数配置

Showing 23 changed files with 701 additions and 601 deletions
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java renamed to ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ISysUserOnlineService.java
1   -package com.ruoyi.system.service;
2   -
3   -import com.ruoyi.common.core.domain.model.LoginUser;
4   -import com.ruoyi.system.domain.SysUserOnline;
5   -
6   -/**
7   - * 在线用户 服务层
8   - *
9   - * @author ruoyi
10   - */
11   -public interface ISysUserOnlineService
12   -{
13   - /**
14   - * 通过登录地址查询信息
15   - *
16   - * @param ipaddr 登录地址
17   - * @param user 用户信息
18   - * @return 在线用户信息
19   - */
20   - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user);
21   -
22   - /**
23   - * 通过用户名称查询信息
24   - *
25   - * @param userName 用户名称
26   - * @param user 用户信息
27   - * @return 在线用户信息
28   - */
29   - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user);
30   -
31   - /**
32   - * 通过登录地址/用户名称查询信息
33   - *
34   - * @param ipaddr 登录地址
35   - * @param userName 用户名称
36   - * @param user 用户信息
37   - * @return 在线用户信息
38   - */
39   - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user);
40   -
41   - /**
42   - * 设置在线用户信息
43   - *
44   - * @param user 用户信息
45   - * @return 在线用户
46   - */
47   - public SysUserOnline loginUserToUserOnline(LoginUser user);
48   -}
  1 +package com.ruoyi.system.service;
  2 +
  3 +import com.ruoyi.common.core.domain.model.LoginUser;
  4 +import com.ruoyi.system.domain.SysUserOnline;
  5 +
  6 +/**
  7 + * 在线用户 服务层
  8 + *
  9 + * @author ruoyi
  10 + */
  11 +public interface ISysUserOnlineService
  12 +{
  13 + /**
  14 + * 通过登录地址查询信息
  15 + *
  16 + * @param ipaddr 登录地址
  17 + * @param user 用户信息
  18 + * @return 在线用户信息
  19 + */
  20 + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user);
  21 +
  22 + /**
  23 + * 通过用户名称查询信息
  24 + *
  25 + * @param userName 用户名称
  26 + * @param user 用户信息
  27 + * @return 在线用户信息
  28 + */
  29 + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user);
  30 +
  31 + /**
  32 + * 通过登录地址/用户名称查询信息
  33 + *
  34 + * @param ipaddr 登录地址
  35 + * @param userName 用户名称
  36 + * @param user 用户信息
  37 + * @return 在线用户信息
  38 + */
  39 + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user);
  40 +
  41 + /**
  42 + * 设置在线用户信息
  43 + *
  44 + * @param user 用户信息
  45 + * @return 在线用户
  46 + */
  47 + public SysUserOnline loginUserToUserOnline(LoginUser user);
  48 +}
... ...
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java renamed to ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnline.java
1   -package com.ruoyi.system.domain;
2   -
3   -/**
4   - * 当前在线会话
5   - *
6   - * @author ruoyi
7   - */
8   -public class SysUserOnline
9   -{
10   - /** 会话编号 */
11   - private String tokenId;
12   -
13   - /** 部门名称 */
14   - private String deptName;
15   -
16   - /** 用户名称 */
17   - private String userName;
18   -
19   - /** 登录IP地址 */
20   - private String ipaddr;
21   -
22   - /** 登录地址 */
23   - private String loginLocation;
24   -
25   - /** 浏览器类型 */
26   - private String browser;
27   -
28   - /** 操作系统 */
29   - private String os;
30   -
31   - /** 登录时间 */
32   - private Long loginTime;
33   -
34   -
35   -}
  1 +package com.ruoyi.system.domain;
  2 +
  3 +/**
  4 + * 当前在线会话
  5 + *
  6 + * @author ruoyi
  7 + */
  8 +public class SysUserOnline
  9 +{
  10 + /** 会话编号 */
  11 + private String tokenId;
  12 +
  13 + /** 部门名称 */
  14 + private String deptName;
  15 +
  16 + /** 用户名称 */
  17 + private String userName;
  18 +
  19 + /** 登录IP地址 */
  20 + private String ipaddr;
  21 +
  22 + /** 登录地址 */
  23 + private String loginLocation;
  24 +
  25 + /** 浏览器类型 */
  26 + private String browser;
  27 +
  28 + /** 操作系统 */
  29 + private String os;
  30 +
  31 + /** 登录时间 */
  32 + private Long loginTime;
  33 +
  34 +
  35 +}
... ...
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java renamed to ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineServiceImpl.java
1   -package com.ruoyi.system.service.impl;
2   -
3   -import org.springframework.stereotype.Service;
4   -import com.ruoyi.common.core.domain.model.LoginUser;
5   -import com.ruoyi.common.utils.StringUtils;
6   -import com.ruoyi.system.domain.SysUserOnline;
7   -import com.ruoyi.system.service.ISysUserOnlineService;
8   -
9   -/**
10   - * 在线用户 服务层处理
11   - *
12   - * @author ruoyi
13   - */
14   -@Service
15   -public class SysUserOnlineServiceImpl implements ISysUserOnlineService {
16   - /**
17   - * 通过登录地址查询信息
18   - *
19   - * @param ipaddr 登录地址
20   - * @param user 用户信息
21   - * @return 在线用户信息
22   - */
23   - @Override
24   - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) {
25   - if (StringUtils.equals(ipaddr, user.getIpaddr())) {
26   - return loginUserToUserOnline(user);
27   - }
28   - return null;
29   - }
30   -
31   - /**
32   - * 通过用户名称查询信息
33   - *
34   - * @param userName 用户名称
35   - * @param user 用户信息
36   - * @return 在线用户信息
37   - */
38   - @Override
39   - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) {
40   - if (StringUtils.equals(userName, user.getUsername())) {
41   - return loginUserToUserOnline(user);
42   - }
43   - return null;
44   - }
45   -
46   - /**
47   - * 通过登录地址/用户名称查询信息
48   - *
49   - * @param ipaddr 登录地址
50   - * @param userName 用户名称
51   - * @param user 用户信息
52   - * @return 在线用户信息
53   - */
54   - @Override
55   - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) {
56   - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
57   - return loginUserToUserOnline(user);
58   - }
59   - return null;
60   - }
61   -
62   - /**
63   - * 设置在线用户信息
64   - *
65   - * @param user 用户信息
66   - * @return 在线用户
67   - */
68   - @Override
69   - public SysUserOnline loginUserToUserOnline(LoginUser user) {
70   - if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) {
71   - return null;
72   - }
73   - SysUserOnline sysUserOnline = new SysUserOnline();
74   - sysUserOnline.setTokenId(user.getToken());
75   - sysUserOnline.setUserName(user.getUsername());
76   - sysUserOnline.setIpaddr(user.getIpaddr());
77   - sysUserOnline.setLoginLocation(user.getLoginLocation());
78   - sysUserOnline.setBrowser(user.getBrowser());
79   - sysUserOnline.setOs(user.getOs());
80   - sysUserOnline.setLoginTime(user.getLoginTime());
81   - if (StringUtils.isNotNull(user.getUser().getDept())) {
82   - sysUserOnline.setDeptName(user.getUser().getDept().getDeptName());
83   - }
84   - return sysUserOnline;
85   - }
86   -}
  1 +package com.ruoyi.system.service.impl;
  2 +
  3 +import org.springframework.stereotype.Service;
  4 +import com.ruoyi.common.core.domain.model.LoginUser;
  5 +import com.ruoyi.common.utils.StringUtils;
  6 +import com.ruoyi.system.domain.SysUserOnline;
  7 +import com.ruoyi.system.service.ISysUserOnlineService;
  8 +
  9 +/**
  10 + * 在线用户 服务层处理
  11 + *
  12 + * @author ruoyi
  13 + */
  14 +@Service
  15 +public class SysUserOnlineServiceImpl implements ISysUserOnlineService {
  16 + /**
  17 + * 通过登录地址查询信息
  18 + *
  19 + * @param ipaddr 登录地址
  20 + * @param user 用户信息
  21 + * @return 在线用户信息
  22 + */
  23 + @Override
  24 + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) {
  25 + if (StringUtils.equals(ipaddr, user.getIpaddr())) {
  26 + return loginUserToUserOnline(user);
  27 + }
  28 + return null;
  29 + }
  30 +
  31 + /**
  32 + * 通过用户名称查询信息
  33 + *
  34 + * @param userName 用户名称
  35 + * @param user 用户信息
  36 + * @return 在线用户信息
  37 + */
  38 + @Override
  39 + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) {
  40 + if (StringUtils.equals(userName, user.getUsername())) {
  41 + return loginUserToUserOnline(user);
  42 + }
  43 + return null;
  44 + }
  45 +
  46 + /**
  47 + * 通过登录地址/用户名称查询信息
  48 + *
  49 + * @param ipaddr 登录地址
  50 + * @param userName 用户名称
  51 + * @param user 用户信息
  52 + * @return 在线用户信息
  53 + */
  54 + @Override
  55 + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) {
  56 + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
  57 + return loginUserToUserOnline(user);
  58 + }
  59 + return null;
  60 + }
  61 +
  62 + /**
  63 + * 设置在线用户信息
  64 + *
  65 + * @param user 用户信息
  66 + * @return 在线用户
  67 + */
  68 + @Override
  69 + public SysUserOnline loginUserToUserOnline(LoginUser user) {
  70 + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) {
  71 + return null;
  72 + }
  73 + SysUserOnline sysUserOnline = new SysUserOnline();
  74 + sysUserOnline.setTokenId(user.getToken());
  75 + sysUserOnline.setUserName(user.getUsername());
  76 + sysUserOnline.setIpaddr(user.getIpaddr());
  77 + sysUserOnline.setLoginLocation(user.getLoginLocation());
  78 + sysUserOnline.setBrowser(user.getBrowser());
  79 + sysUserOnline.setOs(user.getOs());
  80 + sysUserOnline.setLoginTime(user.getLoginTime());
  81 + if (StringUtils.isNotNull(user.getUser().getDept())) {
  82 + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName());
  83 + }
  84 + return sysUserOnline;
  85 + }
  86 +}
... ...
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java deleted
1   -package com.ruoyi.web.controller.system;
2   -
3   -import java.util.List;
4   -
5   -import org.springframework.beans.factory.annotation.Autowired;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import org.springframework.validation.annotation.Validated;
8   -import org.springframework.web.bind.annotation.DeleteMapping;
9   -import org.springframework.web.bind.annotation.GetMapping;
10   -import org.springframework.web.bind.annotation.PathVariable;
11   -import org.springframework.web.bind.annotation.PostMapping;
12   -import org.springframework.web.bind.annotation.PutMapping;
13   -import org.springframework.web.bind.annotation.RequestBody;
14   -import org.springframework.web.bind.annotation.RequestMapping;
15   -import org.springframework.web.bind.annotation.RestController;
16   -import com.ruoyi.common.annotation.Log;
17   -import com.ruoyi.common.annotation.RepeatSubmit;
18   -import com.ruoyi.common.constant.UserConstants;
19   -import com.ruoyi.common.core.controller.BaseController;
20   -import com.ruoyi.common.core.domain.AjaxResult;
21   -import com.ruoyi.common.core.page.TableDataInfo;
22   -import com.ruoyi.common.enums.BusinessType;
23   -import com.ruoyi.common.utils.SecurityUtils;
24   -import com.ruoyi.common.utils.poi.ExcelUtil;
25   -import com.ruoyi.system.domain.SysConfig;
26   -import com.ruoyi.system.service.ISysConfigService;
27   -
28   -/**
29   - * 参数配置 信息操作处理
30   - *
31   - * @author ruoyi
32   - */
33   -@RestController
34   -@RequestMapping("/system/config")
35   -public class SysConfigController extends BaseController {
36   -
37   - @Autowired
38   - private ISysConfigService configService;
39   -
40   - /**
41   - * 获取参数配置列表
42   - */
43   - @PreAuthorize("@ss.hasPermi('system:config:list')")
44   - @GetMapping("/list")
45   - public TableDataInfo list(SysConfig config) {
46   - startPage();
47   - List<SysConfig> list = configService.selectConfigList(config);
48   - return getDataTable(list);
49   - }
50   -
51   - @Log(title = "参数管理", businessType = BusinessType.EXPORT)
52   - @PreAuthorize("@ss.hasPermi('system:config:export')")
53   - @GetMapping("/export")
54   - public AjaxResult export(SysConfig config) {
55   - List<SysConfig> list = configService.selectConfigList(config);
56   - ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
57   - return util.exportExcel(list, "参数数据");
58   - }
59   -
60   - /**
61   - * 根据参数编号获取详细信息
62   - */
63   - @PreAuthorize("@ss.hasPermi('system:config:query')")
64   - @GetMapping(value = "/{configId}")
65   - public AjaxResult getInfo(@PathVariable Long configId) {
66   - return AjaxResult.success(configService.selectConfigById(configId));
67   - }
68   -
69   - /**
70   - * 根据参数键名查询参数值
71   - */
72   - @GetMapping(value = "/configKey/{configKey}")
73   - public AjaxResult getConfigKey(@PathVariable String configKey) {
74   - return AjaxResult.success(configService.selectConfigByKey(configKey));
75   - }
76   -
77   - /**
78   - * 新增参数配置
79   - */
80   - @PreAuthorize("@ss.hasPermi('system:config:add')")
81   - @Log(title = "参数管理", businessType = BusinessType.INSERT)
82   - @PostMapping
83   - @RepeatSubmit
84   - public AjaxResult add(@Validated @RequestBody SysConfig config) {
85   - if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
86   - return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
87   - }
88   - config.setCreateBy(SecurityUtils.getUsername());
89   - return toAjax(configService.insertConfig(config));
90   - }
91   -
92   - /**
93   - * 修改参数配置
94   - */
95   - @PreAuthorize("@ss.hasPermi('system:config:edit')")
96   - @Log(title = "参数管理", businessType = BusinessType.UPDATE)
97   - @PutMapping
98   - public AjaxResult edit(@Validated @RequestBody SysConfig config) {
99   - if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
100   - return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
101   - }
102   - config.setUpdateBy(SecurityUtils.getUsername());
103   - return toAjax(configService.updateConfig(config));
104   - }
105   -
106   - /**
107   - * 删除参数配置
108   - */
109   - @PreAuthorize("@ss.hasPermi('system:config:remove')")
110   - @Log(title = "参数管理", businessType = BusinessType.DELETE)
111   - @DeleteMapping("/{configIds}")
112   - public AjaxResult remove(@PathVariable Long[] configIds) {
113   - return toAjax(configService.deleteConfigByIds(configIds));
114   - }
115   -
116   -}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java deleted
1   -package com.ruoyi.system.service.impl;
2   -
3   -import java.util.Collection;
4   -import java.util.List;
5   -import javax.annotation.PostConstruct;
6   -
7   -import org.springframework.beans.factory.annotation.Autowired;
8   -import org.springframework.stereotype.Service;
9   -import com.ruoyi.common.annotation.DataSource;
10   -import com.ruoyi.common.constant.Constants;
11   -import com.ruoyi.common.constant.UserConstants;
12   -import com.ruoyi.common.core.redis.RedisCache;
13   -import com.ruoyi.common.core.text.Convert;
14   -import com.ruoyi.common.enums.DataSourceType;
15   -import com.ruoyi.common.exception.CustomException;
16   -import com.ruoyi.common.utils.StringUtils;
17   -import com.ruoyi.system.domain.SysConfig;
18   -import com.ruoyi.system.mapper.SysConfigMapper;
19   -import com.ruoyi.system.service.ISysConfigService;
20   -
21   -/**
22   - * 参数配置 服务层实现
23   - *
24   - * @author ruoyi
25   - */
26   -@Service
27   -public class SysConfigServiceImpl implements ISysConfigService {
28   - @Autowired
29   - private SysConfigMapper configMapper;
30   -
31   - @Autowired
32   - private RedisCache redisCache;
33   -
34   - /**
35   - * 项目启动时,初始化参数到缓存
36   - */
37   - @PostConstruct
38   - public void init() {
39   - List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
40   - for (SysConfig config : configsList) {
41   - redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
42   - }
43   - }
44   -
45   - /**
46   - * 查询参数配置信息
47   - *
48   - * @param configId 参数配置ID
49   - * @return 参数配置信息
50   - */
51   - @Override
52   - @DataSource(DataSourceType.MASTER)
53   - public SysConfig selectConfigById(Long configId) {
54   - SysConfig config = new SysConfig();
55   - config.setConfigId(configId);
56   - return configMapper.selectConfig(config);
57   - }
58   -
59   - /**
60   - * 根据键名查询参数配置信息
61   - *
62   - * @param configKey 参数key
63   - * @return 参数键值
64   - */
65   - @Override
66   - public String selectConfigByKey(String configKey) {
67   - String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
68   - if (StringUtils.isNotEmpty(configValue)) {
69   - return configValue;
70   - }
71   - SysConfig config = new SysConfig();
72   - config.setConfigKey(configKey);
73   - SysConfig retConfig = configMapper.selectConfig(config);
74   - if (StringUtils.isNotNull(retConfig)) {
75   - redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
76   - return retConfig.getConfigValue();
77   - }
78   - return StringUtils.EMPTY;
79   - }
80   -
81   - /**
82   - * 查询参数配置列表
83   - *
84   - * @param config 参数配置信息
85   - * @return 参数配置集合
86   - */
87   - @Override
88   - public List<SysConfig> selectConfigList(SysConfig config) {
89   - return configMapper.selectConfigList(config);
90   - }
91   -
92   - /**
93   - * 新增参数配置
94   - *
95   - * @param config 参数配置信息
96   - * @return 结果
97   - */
98   - @Override
99   - public int insertConfig(SysConfig config) {
100   - int row = configMapper.insertConfig(config);
101   - if (row > 0) {
102   - redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
103   - }
104   - return row;
105   - }
106   -
107   - /**
108   - * 修改参数配置
109   - *
110   - * @param config 参数配置信息
111   - * @return 结果
112   - */
113   - @Override
114   - public int updateConfig(SysConfig config) {
115   - int row = configMapper.updateConfig(config);
116   - if (row > 0) {
117   - redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
118   - }
119   - return row;
120   - }
121   -
122   - /**
123   - * 批量删除参数信息
124   - *
125   - * @param configIds 需要删除的参数ID
126   - * @return 结果
127   - */
128   - @Override
129   - public int deleteConfigByIds(Long[] configIds) {
130   - for (Long configId : configIds) {
131   - SysConfig config = selectConfigById(configId);
132   - if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
133   - throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
134   - }
135   - }
136   - int count = configMapper.deleteConfigByIds(configIds);
137   - if (count > 0) {
138   - Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
139   - redisCache.deleteObject(keys);
140   - }
141   - return count;
142   - }
143   -
144   - /**
145   - * 清空缓存数据
146   - */
147   - @Override
148   - public void clearCache() {
149   - Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
150   - redisCache.deleteObject(keys);
151   - }
152   -
153   - /**
154   - * 校验参数键名是否唯一
155   - *
156   - * @param config 参数配置信息
157   - * @return 结果
158   - */
159   - @Override
160   - public String checkConfigKeyUnique(SysConfig config) {
161   - Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
162   - SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
163   - if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
164   - return UserConstants.NOT_UNIQUE;
165   - }
166   - return UserConstants.UNIQUE;
167   - }
168   -
169   - /**
170   - * 设置cache key
171   - *
172   - * @param configKey 参数键
173   - * @return 缓存键key
174   - */
175   - private String getCacheKey(String configKey) {
176   - return Constants.SYS_CONFIG_KEY + configKey;
177   - }
178   -}
ruoyi-ui/src/api/system/config.js
... ... @@ -3,7 +3,7 @@ import request from &#39;@/utils/request&#39;
3 3 // 查询参数列表
4 4 export function listConfig(query) {
5 5 return request({
6   - url: '/system/config/list',
  6 + url: '/system/config/page',
7 7 method: 'get',
8 8 params: query
9 9 })
... ... @@ -12,7 +12,7 @@ export function listConfig(query) {
12 12 // 查询参数详细
13 13 export function getConfig(configId) {
14 14 return request({
15   - url: '/system/config/' + configId,
  15 + url: '/system/config/get?id=' + configId,
16 16 method: 'get'
17 17 })
18 18 }
... ... @@ -20,7 +20,7 @@ export function getConfig(configId) {
20 20 // 根据参数键名查询参数值
21 21 export function getConfigKey(configKey) {
22 22 return request({
23   - url: '/system/config/configKey/' + configKey,
  23 + url: '/system/config/get-value-by-key?key=' + configKey,
24 24 method: 'get'
25 25 })
26 26 }
... ... @@ -28,7 +28,7 @@ export function getConfigKey(configKey) {
28 28 // 新增参数配置
29 29 export function addConfig(data) {
30 30 return request({
31   - url: '/system/config',
  31 + url: '/system/config/create',
32 32 method: 'post',
33 33 data: data
34 34 })
... ... @@ -37,7 +37,7 @@ export function addConfig(data) {
37 37 // 修改参数配置
38 38 export function updateConfig(data) {
39 39 return request({
40   - url: '/system/config',
  40 + url: '/system/config/update',
41 41 method: 'put',
42 42 data: data
43 43 })
... ... @@ -46,15 +46,7 @@ export function updateConfig(data) {
46 46 // 删除参数配置
47 47 export function delConfig(configId) {
48 48 return request({
49   - url: '/system/config/' + configId,
50   - method: 'delete'
51   - })
52   -}
53   -
54   -// 清理参数缓存
55   -export function clearCache() {
56   - return request({
57   - url: '/system/config/clearCache',
  49 + url: '/system/config/delete?id=' + configId,
58 50 method: 'delete'
59 51 })
60 52 }
... ... @@ -64,6 +56,7 @@ export function exportConfig(query) {
64 56 return request({
65 57 url: '/system/config/export',
66 58 method: 'get',
67   - params: query
  59 + params: query,
  60 + responseType: 'blob'
68 61 })
69   -}
70 62 \ No newline at end of file
  63 +}
... ...
ruoyi-ui/src/utils/dict.js
... ... @@ -13,7 +13,8 @@ export const DICT_TYPE = {
13 13 SYS_USER_SEX: 'sys_user_sex',
14 14 SYS_NOTICE_TYPE: 'sys_notice_type',
15 15 SYS_OPERATE_TYPE: 'sys_operate_type',
16   - SYS_LOGIN_RESULT: 'sys_login_result'
  16 + SYS_LOGIN_RESULT: 'sys_login_result',
  17 + SYS_CONFIG_TYPE: 'sys_config_type',
17 18 }
18 19  
19 20 /**
... ...
ruoyi-ui/src/views/system/config/index.vue
1 1 <template>
2 2 <div class="app-container">
3 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4   - <el-form-item label="参数名称" prop="configName">
  4 + <el-form-item label="参数名称" prop="name">
5 5 <el-input
6   - v-model="queryParams.configName"
  6 + v-model="queryParams.name"
7 7 placeholder="请输入参数名称"
8 8 clearable
9 9 size="small"
... ... @@ -11,9 +11,9 @@
11 11 @keyup.enter.native="handleQuery"
12 12 />
13 13 </el-form-item>
14   - <el-form-item label="参数键名" prop="configKey">
  14 + <el-form-item label="参数键名" prop="key">
15 15 <el-input
16   - v-model="queryParams.configKey"
  16 + v-model="queryParams.key"
17 17 placeholder="请输入参数键名"
18 18 clearable
19 19 size="small"
... ... @@ -21,13 +21,13 @@
21 21 @keyup.enter.native="handleQuery"
22 22 />
23 23 </el-form-item>
24   - <el-form-item label="系统内置" prop="configType">
25   - <el-select v-model="queryParams.configType" placeholder="系统内置" clearable size="small">
  24 + <el-form-item label="系统内置" prop="type">
  25 + <el-select v-model="queryParams.type" placeholder="系统内置" clearable size="small">
26 26 <el-option
27   - v-for="dict in typeOptions"
28   - :key="dict.dictValue"
29   - :label="dict.dictLabel"
30   - :value="dict.dictValue"
  27 + v-for="dict in this.getDictDatas(DICT_TYPE.SYS_CONFIG_TYPE)"
  28 + :key="parseInt(dict.value)"
  29 + :label="dict.label"
  30 + :value="parseInt(dict.value)"
31 31 />
32 32 </el-select>
33 33 </el-form-item>
... ... @@ -61,26 +61,6 @@
61 61 </el-col>
62 62 <el-col :span="1.5">
63 63 <el-button
64   - type="success"
65   - icon="el-icon-edit"
66   - size="mini"
67   - :disabled="single"
68   - @click="handleUpdate"
69   - v-hasPermi="['system:config:edit']"
70   - >修改</el-button>
71   - </el-col>
72   - <el-col :span="1.5">
73   - <el-button
74   - type="danger"
75   - icon="el-icon-delete"
76   - size="mini"
77   - :disabled="multiple"
78   - @click="handleDelete"
79   - v-hasPermi="['system:config:remove']"
80   - >删除</el-button>
81   - </el-col>
82   - <el-col :span="1.5">
83   - <el-button
84 64 type="warning"
85 65 icon="el-icon-download"
86 66 size="mini"
... ... @@ -88,25 +68,25 @@
88 68 v-hasPermi="['system:config:export']"
89 69 >导出</el-button>
90 70 </el-col>
91   - <el-col :span="1.5">
92   - <el-button
93   - type="danger"
94   - icon="el-icon-refresh"
95   - size="mini"
96   - @click="handleClearCache"
97   - v-hasPermi="['system:config:remove']"
98   - >清理缓存</el-button>
99   - </el-col>
100 71 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
101 72 </el-row>
102 73  
103   - <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
104   - <el-table-column type="selection" width="55" align="center" />
105   - <el-table-column label="参数主键" align="center" prop="configId" />
106   - <el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" />
107   - <el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" />
108   - <el-table-column label="参数键值" align="center" prop="configValue" />
109   - <el-table-column label="系统内置" align="center" prop="configType" :formatter="typeFormat" />
  74 + <el-table v-loading="loading" :data="configList">
  75 + <el-table-column label="参数主键" align="center" prop="id" />
  76 + <el-table-column label="参数分组" align="center" prop="group" />
  77 + <el-table-column label="参数名称" align="center" prop="name" :show-overflow-tooltip="true" />
  78 + <el-table-column label="参数键名" align="center" prop="key" :show-overflow-tooltip="true" />
  79 + <el-table-column label="参数键值" align="center" prop="value" />
  80 + <el-table-column label="系统内置" align="center" prop="type">
  81 + <template slot-scope="scope">
  82 + <span>{{ getDictDataLabel(DICT_TYPE.SYS_CONFIG_TYPE, scope.row.type) }}</span>
  83 + </template>
  84 + </el-table-column>
  85 + <el-table-column label="是否敏感" align="center" prop="sensitive">
  86 + <template slot-scope="scope">
  87 + <span>{{ scope.row.sensitive ? '是' : '否' }}</span>
  88 + </template>
  89 + </el-table-column>
110 90 <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
111 91 <el-table-column label="创建时间" align="center" prop="createTime" width="180">
112 92 <template slot-scope="scope">
... ... @@ -136,7 +116,7 @@
136 116 <pagination
137 117 v-show="total>0"
138 118 :total="total"
139   - :page.sync="queryParams.pageNum"
  119 + :page.sync="queryParams.pageNo"
140 120 :limit.sync="queryParams.pageSize"
141 121 @pagination="getList"
142 122 />
... ... @@ -144,22 +124,22 @@
144 124 <!-- 添加或修改参数配置对话框 -->
145 125 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
146 126 <el-form ref="form" :model="form" :rules="rules" label-width="80px">
147   - <el-form-item label="参数名称" prop="configName">
148   - <el-input v-model="form.configName" placeholder="请输入参数名称" />
  127 + <el-form-item label="参数分组" prop="group">
  128 + <el-input v-model="form.group" placeholder="请输入参数分组" />
  129 + </el-form-item>
  130 + <el-form-item label="参数名称" prop="name">
  131 + <el-input v-model="form.name" placeholder="请输入参数名称" />
149 132 </el-form-item>
150   - <el-form-item label="参数键名" prop="configKey">
151   - <el-input v-model="form.configKey" placeholder="请输入参数键名" />
  133 + <el-form-item label="参数键名" prop="key">
  134 + <el-input v-model="form.key" placeholder="请输入参数键名" />
152 135 </el-form-item>
153   - <el-form-item label="参数键值" prop="configValue">
154   - <el-input v-model="form.configValue" placeholder="请输入参数键值" />
  136 + <el-form-item label="参数键值" prop="value">
  137 + <el-input v-model="form.value" placeholder="请输入参数键值" />
155 138 </el-form-item>
156   - <el-form-item label="系统内置" prop="configType">
157   - <el-radio-group v-model="form.configType">
158   - <el-radio
159   - v-for="dict in typeOptions"
160   - :key="dict.dictValue"
161   - :label="dict.dictValue"
162   - >{{dict.dictLabel}}</el-radio>
  139 + <el-form-item label="是否敏感" prop="type">
  140 + <el-radio-group v-model="form.sensitive">
  141 + <el-radio :key="true" :label="true">是</el-radio>
  142 + <el-radio :key="false" :label="false">否</el-radio>
163 143 </el-radio-group>
164 144 </el-form-item>
165 145 <el-form-item label="备注" prop="remark">
... ... @@ -175,7 +155,7 @@
175 155 </template>
176 156  
177 157 <script>
178   -import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig, clearCache } from "@/api/system/config";
  158 +import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig } from "@/api/system/config";
179 159  
180 160 export default {
181 161 name: "Config",
... ... @@ -183,12 +163,6 @@ export default {
183 163 return {
184 164 // 遮罩层
185 165 loading: true,
186   - // 选中数组
187   - ids: [],
188   - // 非单个禁用
189   - single: true,
190   - // 非多个禁用
191   - multiple: true,
192 166 // 显示搜索条件
193 167 showSearch: true,
194 168 // 总条数
... ... @@ -205,23 +179,26 @@ export default {
205 179 dateRange: [],
206 180 // 查询参数
207 181 queryParams: {
208   - pageNum: 1,
  182 + pageNo: 1,
209 183 pageSize: 10,
210   - configName: undefined,
211   - configKey: undefined,
212   - configType: undefined
  184 + name: undefined,
  185 + key: undefined,
  186 + type: undefined
213 187 },
214 188 // 表单参数
215 189 form: {},
216 190 // 表单校验
217 191 rules: {
218   - configName: [
  192 + group: [
  193 + { required: true, message: "参数分组不能为空", trigger: "blur" }
  194 + ],
  195 + name: [
219 196 { required: true, message: "参数名称不能为空", trigger: "blur" }
220 197 ],
221   - configKey: [
  198 + key: [
222 199 { required: true, message: "参数键名不能为空", trigger: "blur" }
223 200 ],
224   - configValue: [
  201 + value: [
225 202 { required: true, message: "参数键值不能为空", trigger: "blur" }
226 203 ]
227 204 }
... ... @@ -229,24 +206,24 @@ export default {
229 206 },
230 207 created() {
231 208 this.getList();
232   - this.getDicts("sys_yes_no").then(response => {
233   - this.typeOptions = response.data;
234   - });
235 209 },
236 210 methods: {
237 211 /** 查询参数列表 */
238 212 getList() {
239 213 this.loading = true;
240   - listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
241   - this.configList = response.rows;
242   - this.total = response.total;
  214 + listConfig(this.addDateRange(this.queryParams, [
  215 + this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined,
  216 + this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined,
  217 + ])).then(response => {
  218 + this.configList = response.data.list;
  219 + this.total = response.data.total;
243 220 this.loading = false;
244 221 }
245 222 );
246 223 },
247 224 // 参数系统内置字典翻译
248 225 typeFormat(row, column) {
249   - return this.selectDictLabel(this.typeOptions, row.configType);
  226 + return this.selectDictLabel(this.typeOptions, row.type);
250 227 },
251 228 // 取消按钮
252 229 cancel() {
... ... @@ -256,18 +233,17 @@ export default {
256 233 // 表单重置
257 234 reset() {
258 235 this.form = {
259   - configId: undefined,
260   - configName: undefined,
261   - configKey: undefined,
262   - configValue: undefined,
263   - configType: "Y",
  236 + id: undefined,
  237 + name: undefined,
  238 + key: undefined,
  239 + value: undefined,
264 240 remark: undefined
265 241 };
266 242 this.resetForm("form");
267 243 },
268 244 /** 搜索按钮操作 */
269 245 handleQuery() {
270   - this.queryParams.pageNum = 1;
  246 + this.queryParams.pageNo = 1;
271 247 this.getList();
272 248 },
273 249 /** 重置按钮操作 */
... ... @@ -282,17 +258,11 @@ export default {
282 258 this.open = true;
283 259 this.title = "添加参数";
284 260 },
285   - // 多选框选中数据
286   - handleSelectionChange(selection) {
287   - this.ids = selection.map(item => item.configId)
288   - this.single = selection.length!=1
289   - this.multiple = !selection.length
290   - },
291 261 /** 修改按钮操作 */
292 262 handleUpdate(row) {
293 263 this.reset();
294   - const configId = row.configId || this.ids
295   - getConfig(configId).then(response => {
  264 + const id = row.id || this.ids
  265 + getConfig(id).then(response => {
296 266 this.form = response.data;
297 267 this.open = true;
298 268 this.title = "修改参数";
... ... @@ -302,7 +272,7 @@ export default {
302 272 submitForm: function() {
303 273 this.$refs["form"].validate(valid => {
304 274 if (valid) {
305   - if (this.form.configId != undefined) {
  275 + if (this.form.id !== undefined) {
306 276 updateConfig(this.form).then(response => {
307 277 this.msgSuccess("修改成功");
308 278 this.open = false;
... ... @@ -320,13 +290,13 @@ export default {
320 290 },
321 291 /** 删除按钮操作 */
322 292 handleDelete(row) {
323   - const configIds = row.configId || this.ids;
324   - this.$confirm('是否确认删除参数编号为"' + configIds + '"的数据项?', "警告", {
  293 + const ids = row.id || this.ids;
  294 + this.$confirm('是否确认删除参数编号为"' + ids + '"的数据项?', "警告", {
325 295 confirmButtonText: "确定",
326 296 cancelButtonText: "取消",
327 297 type: "warning"
328 298 }).then(function() {
329   - return delConfig(configIds);
  299 + return delConfig(ids);
330 300 }).then(() => {
331 301 this.getList();
332 302 this.msgSuccess("删除成功");
... ... @@ -342,15 +312,9 @@ export default {
342 312 }).then(function() {
343 313 return exportConfig(queryParams);
344 314 }).then(response => {
345   - this.download(response.msg);
  315 + this.downloadExcel(response, '参数配置.xls');
346 316 })
347 317 },
348   - /** 清理缓存按钮操作 */
349   - handleClearCache() {
350   - clearCache().then(response => {
351   - this.msgSuccess("清理成功");
352   - });
353   - }
354 318 }
355 319 };
356   -</script>
357 320 \ No newline at end of file
  321 +</script>
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/SysConfigController.java
1 1 package cn.iocoder.dashboard.modules.system.controller.config;
2 2  
  3 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
  4 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  5 +import cn.iocoder.dashboard.common.pojo.PageResult;
  6 +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  7 +import cn.iocoder.dashboard.modules.system.controller.config.vo.*;
  8 +import cn.iocoder.dashboard.modules.system.convert.config.SysConfigConvert;
  9 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
  10 +import cn.iocoder.dashboard.modules.system.service.config.SysConfigService;
3 11 import io.swagger.annotations.Api;
4   -import org.springframework.web.bind.annotation.RequestMapping;
5   -import org.springframework.web.bind.annotation.RestController;
  12 +import io.swagger.annotations.ApiImplicitParam;
  13 +import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.validation.annotation.Validated;
  15 +import org.springframework.web.bind.annotation.*;
  16 +
  17 +import javax.annotation.Resource;
  18 +import javax.servlet.http.HttpServletResponse;
  19 +import java.io.IOException;
  20 +import java.util.List;
  21 +
  22 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  23 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE;
6 24  
7 25 @Api(tags = "参数配置")
8 26 @RestController
... ... @@ -24,4 +42,78 @@ public class SysConfigController {
24 42 //
25 43 // }
26 44  
  45 + @Resource
  46 + private SysConfigService configService;
  47 +
  48 + @ApiOperation("获取参数配置分页")
  49 + @GetMapping("/page")
  50 +// @PreAuthorize("@ss.hasPermi('system:config:list')")
  51 + public CommonResult<PageResult<SysConfigRespVO>> getConfigPage(@Validated SysConfigPageReqVO reqVO) {
  52 + PageResult<SysConfigDO> page = configService.getConfigPage(reqVO);
  53 + return success(SysConfigConvert.INSTANCE.convertPage(page));
  54 + }
  55 +
  56 + @ApiOperation("导出参数配置")
  57 + @GetMapping("/export")
  58 +// @Log(title = "参数管理", businessType = BusinessType.EXPORT)
  59 +// @PreAuthorize("@ss.hasPermi('system:config:export')")
  60 + public void exportSysConfig(HttpServletResponse response, @Validated SysConfigExportReqVO reqVO) throws IOException {
  61 + List<SysConfigDO> list = configService.getConfigList(reqVO);
  62 + // 拼接数据
  63 + List<SysConfigExcelVO> excelDataList = SysConfigConvert.INSTANCE.convertList(list);
  64 + // 输出
  65 + ExcelUtils.write(response, "参数配置.xls", "配置列表",
  66 + SysConfigExcelVO.class, excelDataList);
  67 + }
  68 +
  69 + @ApiOperation("获得参数配置")
  70 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  71 + @GetMapping(value = "/get")
  72 +// @PreAuthorize("@ss.hasPermi('system:config:query')")
  73 + public CommonResult<SysConfigRespVO> getConfig(@RequestParam("id") Long id) {
  74 + return success(SysConfigConvert.INSTANCE.convert(configService.getConfig(id)));
  75 + }
  76 +
  77 + @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端")
  78 + @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class)
  79 + @GetMapping(value = "/get-value-by-key")
  80 + public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
  81 + SysConfigDO config = configService.getConfigByKey(key);
  82 + if (config == null) {
  83 + return null;
  84 + }
  85 + if (config.getSensitive()) {
  86 + throw ServiceExceptionUtil.exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE);
  87 + }
  88 + return success(config.getValue());
  89 + }
  90 +
  91 + @ApiOperation("新增参数配置")
  92 + @PostMapping("/create")
  93 +// @PreAuthorize("@ss.hasPermi('system:config:add')")
  94 +// @Log(title = "参数管理", businessType = BusinessType.INSERT)
  95 +// @RepeatSubmit
  96 + public CommonResult<Long> createConfig(@Validated @RequestBody SysConfigCreateReqVO reqVO) {
  97 + return success(configService.createConfig(reqVO));
  98 + }
  99 +
  100 + @ApiOperation("修改参数配置")
  101 + @PutMapping("/update")
  102 +// @PreAuthorize("@ss.hasPermi('system:config:edit')")
  103 +// @Log(title = "参数管理", businessType = BusinessType.UPDATE)
  104 + public CommonResult<Boolean> edit(@Validated @RequestBody SysConfigUpdateReqVO reqVO) {
  105 + configService.updateConfig(reqVO);
  106 + return success(true);
  107 + }
  108 +
  109 + @ApiOperation("删除参数配置")
  110 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  111 + @DeleteMapping("/delete")
  112 +// @PreAuthorize("@ss.hasPermi('system:config:remove')")
  113 +// @Log(title = "参数管理", businessType = BusinessType.DELETE)
  114 + public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
  115 + configService.deleteConfig(id);
  116 + return success(true);
  117 + }
  118 +
27 119 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigBaseVO.java
... ... @@ -5,6 +5,7 @@ import lombok.Data;
5 5  
6 6 import javax.validation.constraints.NotBlank;
7 7 import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
8 9 import javax.validation.constraints.Size;
9 10  
10 11 /**
... ... @@ -29,11 +30,8 @@ public class SysConfigBaseVO {
29 30 @Size(max = 500, message = "参数键值长度不能超过500个字符")
30 31 private String value;
31 32  
32   - @ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举")
33   - private String type;
34   -
35 33 @ApiModelProperty(value = "是否敏感", required = true, example = "true")
36   - @NotBlank(message = "是否敏感不能为空")
  34 + @NotNull(message = "是否敏感不能为空")
37 35 private Boolean sensitive;
38 36  
39 37 @ApiModelProperty(value = "备注", example = "备注一下很帅气!")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigCreateReqVO.java
1 1 package cn.iocoder.dashboard.modules.system.controller.config.vo;
2 2  
3   -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptBaseVO;
4 3 import io.swagger.annotations.ApiModel;
5 4 import io.swagger.annotations.ApiModelProperty;
6 5 import lombok.Data;
... ... @@ -12,7 +11,7 @@ import javax.validation.constraints.Size;
12 11 @ApiModel("参数配置创建 Request VO")
13 12 @Data
14 13 @EqualsAndHashCode(callSuper = true)
15   -public class SysConfigCreateReqVO extends SysDeptBaseVO {
  14 +public class SysConfigCreateReqVO extends SysConfigBaseVO {
16 15  
17 16 @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username")
18 17 @NotBlank(message = "参数键名长度不能为空")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigExcelVO.java
1 1 package cn.iocoder.dashboard.modules.system.controller.config.vo;
2 2  
  3 +import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
  5 +import cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum;
3 6 import com.alibaba.excel.annotation.ExcelProperty;
4 7 import lombok.Data;
5 8  
... ... @@ -26,10 +29,12 @@ public class SysConfigExcelVO {
26 29 @ExcelProperty("参数键值")
27 30 private String value;
28 31  
29   - @ExcelProperty("参数类型")
30   - private String type;
  32 + @ExcelProperty(value = "参数类型", converter = DictConvert.class)
  33 + @DictFormat(SysDictTypeEnum.SYS_CONFIG_TYPE)
  34 + private Integer type;
31 35  
32   - @ExcelProperty("是否敏感")
  36 + @ExcelProperty(value = "是否敏感", converter = DictConvert.class)
  37 + @DictFormat(SysDictTypeEnum.SYS_BOOLEAN_STRING)
33 38 private Boolean sensitive;
34 39  
35 40 @ExcelProperty("备注")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigExportReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.config.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import org.springframework.format.annotation.DateTimeFormat;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +@ApiModel("参数配置导出 Request VO")
  13 +@Data
  14 +public class SysConfigExportReqVO {
  15 +
  16 + @ApiModelProperty(value = "参数名称", example = "模糊匹配")
  17 + private String name;
  18 +
  19 + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
  20 + private String key;
  21 +
  22 + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
  23 + private Integer type;
  24 +
  25 + @ApiModelProperty(value = "开始时间", example = "2020-10-24")
  26 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  27 + private Date beginTime;
  28 +
  29 + @ApiModelProperty(value = "结束时间", example = "2020-10-24")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private Date endTime;
  32 +
  33 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigPageReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.config.vo;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.util.Date;
  11 +
  12 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@ApiModel("参数配置分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +public class SysConfigPageReqVO extends PageParam {
  18 +
  19 + @ApiModelProperty(value = "参数名称", example = "模糊匹配")
  20 + private String name;
  21 +
  22 + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
  23 + private String key;
  24 +
  25 + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
  26 + private Integer type;
  27 +
  28 + @ApiModelProperty(value = "开始时间", example = "2020-10-24")
  29 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  30 + private Date beginTime;
  31 +
  32 + @ApiModelProperty(value = "结束时间", example = "2020-10-24")
  33 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  34 + private Date endTime;
  35 +
  36 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigRespVO.java
... ... @@ -22,6 +22,9 @@ public class SysConfigRespVO extends SysConfigBaseVO {
22 22 @Size(max = 100, message = "参数键名长度不能超过100个字符")
23 23 private String key;
24 24  
  25 + @ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举")
  26 + private Integer type;
  27 +
25 28 @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
26 29 private Date createTime;
27 30  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/config/vo/SysConfigUpdateReqVO.java
1 1 package cn.iocoder.dashboard.modules.system.controller.config.vo;
2 2  
3   -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptBaseVO;
4 3 import io.swagger.annotations.ApiModel;
5 4 import io.swagger.annotations.ApiModelProperty;
6 5 import lombok.Data;
... ... @@ -11,7 +10,7 @@ import javax.validation.constraints.NotNull;
11 10 @ApiModel("参数配置创建 Request VO")
12 11 @Data
13 12 @EqualsAndHashCode(callSuper = true)
14   -public class SysConfigUpdateReqVO extends SysDeptBaseVO {
  13 +public class SysConfigUpdateReqVO extends SysConfigBaseVO {
15 14  
16 15 @ApiModelProperty(value = "参数配置序号", required = true, example = "1024")
17 16 @NotNull(message = "参数配置编号不能为空")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/config/SysConfigConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.config;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExcelVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +@Mapper
  15 +public interface SysConfigConvert {
  16 +
  17 + SysConfigConvert INSTANCE = Mappers.getMapper(SysConfigConvert.class);
  18 +
  19 + PageResult<SysConfigRespVO> convertPage(PageResult<SysConfigDO> page);
  20 +
  21 + SysConfigRespVO convert(SysConfigDO bean);
  22 +
  23 + SysConfigDO convert(SysConfigCreateReqVO bean);
  24 +
  25 + SysConfigDO convert(SysConfigUpdateReqVO bean);
  26 +
  27 + List<SysConfigExcelVO> convertList(List<SysConfigDO> list);
  28 +
  29 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/config/SysConfigMapper.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.config;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  6 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10 +import org.apache.ibatis.annotations.Mapper;
  11 +
  12 +import java.util.List;
  13 +
  14 +@Mapper
  15 +public interface SysConfigMapper extends BaseMapperX<SysConfigDO> {
  16 +
  17 + default PageResult<SysConfigDO> selectPage(SysConfigPageReqVO reqVO) {
  18 + return selectPage(reqVO,
  19 + new QueryWrapperX<SysConfigDO>().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 + default SysConfigDO selectByKey(String key) {
  26 + return selectOne(new QueryWrapper<SysConfigDO>().eq("`key`", key));
  27 + }
  28 +
  29 + default List<SysConfigDO> selectList(SysConfigExportReqVO reqVO) {
  30 + return selectList(new QueryWrapperX<SysConfigDO>().likeIfPresent("name", reqVO.getName())
  31 + .likeIfPresent("`key`", reqVO.getKey())
  32 + .eqIfPresent("`type`", reqVO.getType())
  33 + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
  34 + }
  35 +
  36 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/config/SysConfigDO.java
... ... @@ -2,7 +2,11 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config;
2 2  
3 3 import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4 4 import cn.iocoder.dashboard.modules.system.enums.config.SysConfigTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.TableField;
5 6 import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
6 10  
7 11 /**
8 12 * 参数配置表
... ... @@ -10,6 +14,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
10 14 * @author ruoyi
11 15 */
12 16 @TableName("sys_config")
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
13 20 public class SysConfigDO extends BaseDO {
14 21  
15 22 /**
... ... @@ -19,6 +26,7 @@ public class SysConfigDO extends BaseDO {
19 26 /**
20 27 * 参数分组
21 28 */
  29 + @TableField("`group`")
22 30 private String group;
23 31 /**
24 32 * 参数名称
... ... @@ -27,6 +35,7 @@ public class SysConfigDO extends BaseDO {
27 35 /**
28 36 * 参数键名
29 37 */
  38 + @TableField("`key`")
30 39 private String key;
31 40 /**
32 41 * 参数键值
... ... @@ -37,12 +46,14 @@ public class SysConfigDO extends BaseDO {
37 46 *
38 47 * 枚举 {@link SysConfigTypeEnum}
39 48 */
40   - private String type;
  49 + @TableField("`type`")
  50 + private Integer type;
41 51 /**
42 52 * 是否敏感
43 53 *
44 54 * 对于敏感配置,需要管理权限才能查看
45 55 */
  56 + @TableField("`sensitive`")
46 57 private Boolean sensitive;
47 58 /**
48 59 * 备注
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -74,4 +74,10 @@ public interface SysErrorCodeConstants {
74 74  
75 75 // ========== 文件 1002009000 ==========
76 76 ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在");
  77 +
  78 + // ========== 参数配置 1002010000 ==========
  79 + ErrorCode CONFIG_NOT_FOUND = new ErrorCode(1002010001, "参数配置不存在");
  80 + ErrorCode CONFIG_NAME_DUPLICATE = new ErrorCode(1002010002, "参数配置 key 重复");
  81 + ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1002010003, "不能删除类型为系统内置的参数配置");
  82 + ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1002010004, "不允许获取敏感配置到前端");
77 83 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
... ... @@ -14,6 +14,8 @@ public enum SysDictTypeEnum {
14 14 SYS_COMMON_STATUS("sys_common_status"), // 系统状态
15 15 SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型
16 16 SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果
  17 + SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型
  18 + SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
17 19 ;
18 20  
19 21  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/config/SysConfigService.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.config;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 参数配置 Service 接口
  14 + */
  15 +public interface SysConfigService {
  16 +
  17 + /**
  18 + * 获得参数配置分页列表
  19 + *
  20 + * @param reqVO 分页条件
  21 + * @return 分页列表
  22 + */
  23 + PageResult<SysConfigDO> getConfigPage(SysConfigPageReqVO reqVO);
  24 +
  25 + /**
  26 + * 获得参数配置列表
  27 + *
  28 + * @param reqVO 列表
  29 + * @return 列表
  30 + */
  31 + List<SysConfigDO> getConfigList(SysConfigExportReqVO reqVO);
  32 +
  33 + /**
  34 + * 获得参数配置
  35 + *
  36 + * @param id 配置编号
  37 + * @return 参数配置
  38 + */
  39 + SysConfigDO getConfig(Long id);
  40 +
  41 + /**
  42 + * 根据参数键,获得参数配置
  43 + *
  44 + * @param key 配置键
  45 + * @return 参数配置
  46 + */
  47 + SysConfigDO getConfigByKey(String key);
  48 +
  49 + /**
  50 + * 创建参数配置
  51 + *
  52 + * @param reqVO 创建信息
  53 + * @return 配置编号
  54 + */
  55 + Long createConfig(SysConfigCreateReqVO reqVO);
  56 +
  57 + /**
  58 + * 更新参数配置
  59 + *
  60 + * @param reqVO 更新信息
  61 + */
  62 + void updateConfig(SysConfigUpdateReqVO reqVO);
  63 +
  64 + /**
  65 + * 删除参数配置
  66 + *
  67 + * @param id 配置编号
  68 + */
  69 + void deleteConfig(Long id);
  70 +
  71 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/config/impl/SysConfigServiceImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.config.impl;
  2 +
  3 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.convert.config.SysConfigConvert;
  10 +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.config.SysConfigMapper;
  11 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
  12 +import cn.iocoder.dashboard.modules.system.enums.config.SysConfigTypeEnum;
  13 +import cn.iocoder.dashboard.modules.system.service.config.SysConfigService;
  14 +import lombok.extern.slf4j.Slf4j;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +import javax.annotation.Resource;
  18 +
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
  22 +
  23 +/**
  24 + * 参数配置 Service 实现类
  25 + */
  26 +@Service
  27 +@Slf4j
  28 +public class SysConfigServiceImpl implements SysConfigService {
  29 +
  30 + @Resource
  31 + private SysConfigMapper configMapper;
  32 +
  33 + @Override
  34 + public PageResult<SysConfigDO> getConfigPage(SysConfigPageReqVO reqVO) {
  35 + return configMapper.selectPage(reqVO);
  36 + }
  37 +
  38 + @Override
  39 + public List<SysConfigDO> getConfigList(SysConfigExportReqVO reqVO) {
  40 + return configMapper.selectList(reqVO);
  41 + }
  42 +
  43 + @Override
  44 + public SysConfigDO getConfig(Long id) {
  45 + return configMapper.selectById(id);
  46 + }
  47 +
  48 + @Override
  49 + public SysConfigDO getConfigByKey(String key) {
  50 + return configMapper.selectByKey(key);
  51 + }
  52 +
  53 + @Override
  54 + public Long createConfig(SysConfigCreateReqVO reqVO) {
  55 + // 校验正确性
  56 + checkCreateOrUpdate(null, reqVO.getKey());
  57 + // 插入参数配置
  58 + SysConfigDO config = SysConfigConvert.INSTANCE.convert(reqVO);
  59 + config.setType(SysConfigTypeEnum.CUSTOM.getType());
  60 + configMapper.insert(config);
  61 + return config.getId();
  62 + }
  63 +
  64 + @Override
  65 + public void updateConfig(SysConfigUpdateReqVO reqVO) {
  66 + // 校验正确性
  67 + checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key
  68 + // 更新参数配置
  69 + SysConfigDO updateObj = SysConfigConvert.INSTANCE.convert(reqVO);
  70 + configMapper.updateById(updateObj);
  71 + }
  72 +
  73 + @Override
  74 + public void deleteConfig(Long id) {
  75 + // 校验配置存在
  76 + SysConfigDO config = checkConfigExists(id);
  77 + // 内置配置,不允许删除
  78 + if (SysConfigTypeEnum.SYSTEM.getType().equals(config.getType())) {
  79 + throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE);
  80 + }
  81 + // 删除
  82 + configMapper.deleteById(id);
  83 + }
  84 +
  85 + private void checkCreateOrUpdate(Long id, String key) {
  86 + // 校验自己存在
  87 + checkConfigExists(id);
  88 + // 校验参数配置 key 的唯一性
  89 + checkConfigKeyUnique(id, key);
  90 + }
  91 +
  92 + private SysConfigDO checkConfigExists(Long id) {
  93 + if (id == null) {
  94 + return null;
  95 + }
  96 + SysConfigDO config = configMapper.selectById(id);
  97 + if (config == null) {
  98 + throw ServiceExceptionUtil.exception(CONFIG_NOT_FOUND);
  99 + }
  100 + return config;
  101 + }
  102 +
  103 + private void checkConfigKeyUnique(Long id, String key) {
  104 + SysConfigDO config = configMapper.selectByKey(key);
  105 + if (config == null) {
  106 + return;
  107 + }
  108 + // 如果 id 为空,说明不用比较是否为相同 id 的参数配置
  109 + if (id == null) {
  110 + throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
  111 + }
  112 + if (!config.getId().equals(id)) {
  113 + throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
  114 + }
  115 + }
  116 +}
... ...