完成参数配置

This commit is contained in:
YunaiV 2021-01-19 23:18:15 +08:00
parent 35a01cbf29
commit d2fa839d3c
23 changed files with 701 additions and 601 deletions

View File

@ -1,48 +1,48 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
/** /**
* 在线用户 服务层 * 在线用户 服务层
* *
* @author ruoyi * @author ruoyi
*/ */
public interface ISysUserOnlineService public interface ISysUserOnlineService
{ {
/** /**
* 通过登录地址查询信息 * 通过登录地址查询信息
* *
* @param ipaddr 登录地址 * @param ipaddr 登录地址
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user);
/** /**
* 通过用户名称查询信息 * 通过用户名称查询信息
* *
* @param userName 用户名称 * @param userName 用户名称
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); public SysUserOnline selectOnlineByUserName(String userName, LoginUser user);
/** /**
* 通过登录地址/用户名称查询信息 * 通过登录地址/用户名称查询信息
* *
* @param ipaddr 登录地址 * @param ipaddr 登录地址
* @param userName 用户名称 * @param userName 用户名称
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user);
/** /**
* 设置在线用户信息 * 设置在线用户信息
* *
* @param user 用户信息 * @param user 用户信息
* @return 在线用户 * @return 在线用户
*/ */
public SysUserOnline loginUserToUserOnline(LoginUser user); public SysUserOnline loginUserToUserOnline(LoginUser user);
} }

View File

@ -1,35 +1,35 @@
package com.ruoyi.system.domain; package com.ruoyi.system.domain;
/** /**
* 当前在线会话 * 当前在线会话
* *
* @author ruoyi * @author ruoyi
*/ */
public class SysUserOnline public class SysUserOnline
{ {
/** 会话编号 */ /** 会话编号 */
private String tokenId; private String tokenId;
/** 部门名称 */ /** 部门名称 */
private String deptName; private String deptName;
/** 用户名称 */ /** 用户名称 */
private String userName; private String userName;
/** 登录IP地址 */ /** 登录IP地址 */
private String ipaddr; private String ipaddr;
/** 登录地址 */ /** 登录地址 */
private String loginLocation; private String loginLocation;
/** 浏览器类型 */ /** 浏览器类型 */
private String browser; private String browser;
/** 操作系统 */ /** 操作系统 */
private String os; private String os;
/** 登录时间 */ /** 登录时间 */
private Long loginTime; private Long loginTime;
} }

View File

@ -1,86 +1,86 @@
package com.ruoyi.system.service.impl; package com.ruoyi.system.service.impl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService; import com.ruoyi.system.service.ISysUserOnlineService;
/** /**
* 在线用户 服务层处理 * 在线用户 服务层处理
* *
* @author ruoyi * @author ruoyi
*/ */
@Service @Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService { public class SysUserOnlineServiceImpl implements ISysUserOnlineService {
/** /**
* 通过登录地址查询信息 * 通过登录地址查询信息
* *
* @param ipaddr 登录地址 * @param ipaddr 登录地址
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Override @Override
public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) {
if (StringUtils.equals(ipaddr, user.getIpaddr())) { if (StringUtils.equals(ipaddr, user.getIpaddr())) {
return loginUserToUserOnline(user); return loginUserToUserOnline(user);
} }
return null; return null;
} }
/** /**
* 通过用户名称查询信息 * 通过用户名称查询信息
* *
* @param userName 用户名称 * @param userName 用户名称
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Override @Override
public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) {
if (StringUtils.equals(userName, user.getUsername())) { if (StringUtils.equals(userName, user.getUsername())) {
return loginUserToUserOnline(user); return loginUserToUserOnline(user);
} }
return null; return null;
} }
/** /**
* 通过登录地址/用户名称查询信息 * 通过登录地址/用户名称查询信息
* *
* @param ipaddr 登录地址 * @param ipaddr 登录地址
* @param userName 用户名称 * @param userName 用户名称
* @param user 用户信息 * @param user 用户信息
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Override @Override
public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) {
if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
return loginUserToUserOnline(user); return loginUserToUserOnline(user);
} }
return null; return null;
} }
/** /**
* 设置在线用户信息 * 设置在线用户信息
* *
* @param user 用户信息 * @param user 用户信息
* @return 在线用户 * @return 在线用户
*/ */
@Override @Override
public SysUserOnline loginUserToUserOnline(LoginUser user) { public SysUserOnline loginUserToUserOnline(LoginUser user) {
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) { if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) {
return null; return null;
} }
SysUserOnline sysUserOnline = new SysUserOnline(); SysUserOnline sysUserOnline = new SysUserOnline();
sysUserOnline.setTokenId(user.getToken()); sysUserOnline.setTokenId(user.getToken());
sysUserOnline.setUserName(user.getUsername()); sysUserOnline.setUserName(user.getUsername());
sysUserOnline.setIpaddr(user.getIpaddr()); sysUserOnline.setIpaddr(user.getIpaddr());
sysUserOnline.setLoginLocation(user.getLoginLocation()); sysUserOnline.setLoginLocation(user.getLoginLocation());
sysUserOnline.setBrowser(user.getBrowser()); sysUserOnline.setBrowser(user.getBrowser());
sysUserOnline.setOs(user.getOs()); sysUserOnline.setOs(user.getOs());
sysUserOnline.setLoginTime(user.getLoginTime()); sysUserOnline.setLoginTime(user.getLoginTime());
if (StringUtils.isNotNull(user.getUser().getDept())) { if (StringUtils.isNotNull(user.getUser().getDept())) {
sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); sysUserOnline.setDeptName(user.getUser().getDept().getDeptName());
} }
return sysUserOnline; return sysUserOnline;
} }
} }

View File

@ -1,116 +0,0 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
/**
* 参数配置 信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/config")
public class SysConfigController extends BaseController {
@Autowired
private ISysConfigService configService;
/**
* 获取参数配置列表
*/
@PreAuthorize("@ss.hasPermi('system:config:list')")
@GetMapping("/list")
public TableDataInfo list(SysConfig config) {
startPage();
List<SysConfig> list = configService.selectConfigList(config);
return getDataTable(list);
}
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:config:export')")
@GetMapping("/export")
public AjaxResult export(SysConfig config) {
List<SysConfig> list = configService.selectConfigList(config);
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
return util.exportExcel(list, "参数数据");
}
/**
* 根据参数编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:config:query')")
@GetMapping(value = "/{configId}")
public AjaxResult getInfo(@PathVariable Long configId) {
return AjaxResult.success(configService.selectConfigById(configId));
}
/**
* 根据参数键名查询参数值
*/
@GetMapping(value = "/configKey/{configKey}")
public AjaxResult getConfigKey(@PathVariable String configKey) {
return AjaxResult.success(configService.selectConfigByKey(configKey));
}
/**
* 新增参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:add')")
@Log(title = "参数管理", businessType = BusinessType.INSERT)
@PostMapping
@RepeatSubmit
public AjaxResult add(@Validated @RequestBody SysConfig config) {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setCreateBy(SecurityUtils.getUsername());
return toAjax(configService.insertConfig(config));
}
/**
* 修改参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:edit')")
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysConfig config) {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setUpdateBy(SecurityUtils.getUsername());
return toAjax(configService.updateConfig(config));
}
/**
* 删除参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:remove')")
@Log(title = "参数管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{configIds}")
public AjaxResult remove(@PathVariable Long[] configIds) {
return toAjax(configService.deleteConfigByIds(configIds));
}
}

View File

@ -1,178 +0,0 @@
package com.ruoyi.system.service.impl;
import java.util.Collection;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
/**
* 参数配置 服务层实现
*
* @author ruoyi
*/
@Service
public class SysConfigServiceImpl implements ISysConfigService {
@Autowired
private SysConfigMapper configMapper;
@Autowired
private RedisCache redisCache;
/**
* 项目启动时初始化参数到缓存
*/
@PostConstruct
public void init() {
List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
for (SysConfig config : configsList) {
redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
}
}
/**
* 查询参数配置信息
*
* @param configId 参数配置ID
* @return 参数配置信息
*/
@Override
@DataSource(DataSourceType.MASTER)
public SysConfig selectConfigById(Long configId) {
SysConfig config = new SysConfig();
config.setConfigId(configId);
return configMapper.selectConfig(config);
}
/**
* 根据键名查询参数配置信息
*
* @param configKey 参数key
* @return 参数键值
*/
@Override
public String selectConfigByKey(String configKey) {
String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
if (StringUtils.isNotEmpty(configValue)) {
return configValue;
}
SysConfig config = new SysConfig();
config.setConfigKey(configKey);
SysConfig retConfig = configMapper.selectConfig(config);
if (StringUtils.isNotNull(retConfig)) {
redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
return retConfig.getConfigValue();
}
return StringUtils.EMPTY;
}
/**
* 查询参数配置列表
*
* @param config 参数配置信息
* @return 参数配置集合
*/
@Override
public List<SysConfig> selectConfigList(SysConfig config) {
return configMapper.selectConfigList(config);
}
/**
* 新增参数配置
*
* @param config 参数配置信息
* @return 结果
*/
@Override
public int insertConfig(SysConfig config) {
int row = configMapper.insertConfig(config);
if (row > 0) {
redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
}
return row;
}
/**
* 修改参数配置
*
* @param config 参数配置信息
* @return 结果
*/
@Override
public int updateConfig(SysConfig config) {
int row = configMapper.updateConfig(config);
if (row > 0) {
redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
}
return row;
}
/**
* 批量删除参数信息
*
* @param configIds 需要删除的参数ID
* @return 结果
*/
@Override
public int deleteConfigByIds(Long[] configIds) {
for (Long configId : configIds) {
SysConfig config = selectConfigById(configId);
if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
}
}
int count = configMapper.deleteConfigByIds(configIds);
if (count > 0) {
Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
redisCache.deleteObject(keys);
}
return count;
}
/**
* 清空缓存数据
*/
@Override
public void clearCache() {
Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
redisCache.deleteObject(keys);
}
/**
* 校验参数键名是否唯一
*
* @param config 参数配置信息
* @return 结果
*/
@Override
public String checkConfigKeyUnique(SysConfig config) {
Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 设置cache key
*
* @param configKey 参数键
* @return 缓存键key
*/
private String getCacheKey(String configKey) {
return Constants.SYS_CONFIG_KEY + configKey;
}
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询参数列表 // 查询参数列表
export function listConfig(query) { export function listConfig(query) {
return request({ return request({
url: '/system/config/list', url: '/system/config/page',
method: 'get', method: 'get',
params: query params: query
}) })
@ -12,7 +12,7 @@ export function listConfig(query) {
// 查询参数详细 // 查询参数详细
export function getConfig(configId) { export function getConfig(configId) {
return request({ return request({
url: '/system/config/' + configId, url: '/system/config/get?id=' + configId,
method: 'get' method: 'get'
}) })
} }
@ -20,7 +20,7 @@ export function getConfig(configId) {
// 根据参数键名查询参数值 // 根据参数键名查询参数值
export function getConfigKey(configKey) { export function getConfigKey(configKey) {
return request({ return request({
url: '/system/config/configKey/' + configKey, url: '/system/config/get-value-by-key?key=' + configKey,
method: 'get' method: 'get'
}) })
} }
@ -28,7 +28,7 @@ export function getConfigKey(configKey) {
// 新增参数配置 // 新增参数配置
export function addConfig(data) { export function addConfig(data) {
return request({ return request({
url: '/system/config', url: '/system/config/create',
method: 'post', method: 'post',
data: data data: data
}) })
@ -37,7 +37,7 @@ export function addConfig(data) {
// 修改参数配置 // 修改参数配置
export function updateConfig(data) { export function updateConfig(data) {
return request({ return request({
url: '/system/config', url: '/system/config/update',
method: 'put', method: 'put',
data: data data: data
}) })
@ -46,15 +46,7 @@ export function updateConfig(data) {
// 删除参数配置 // 删除参数配置
export function delConfig(configId) { export function delConfig(configId) {
return request({ return request({
url: '/system/config/' + configId, url: '/system/config/delete?id=' + configId,
method: 'delete'
})
}
// 清理参数缓存
export function clearCache() {
return request({
url: '/system/config/clearCache',
method: 'delete' method: 'delete'
}) })
} }
@ -64,6 +56,7 @@ export function exportConfig(query) {
return request({ return request({
url: '/system/config/export', url: '/system/config/export',
method: 'get', method: 'get',
params: query params: query,
responseType: 'blob'
}) })
} }

View File

@ -13,7 +13,8 @@ export const DICT_TYPE = {
SYS_USER_SEX: 'sys_user_sex', SYS_USER_SEX: 'sys_user_sex',
SYS_NOTICE_TYPE: 'sys_notice_type', SYS_NOTICE_TYPE: 'sys_notice_type',
SYS_OPERATE_TYPE: 'sys_operate_type', SYS_OPERATE_TYPE: 'sys_operate_type',
SYS_LOGIN_RESULT: 'sys_login_result' SYS_LOGIN_RESULT: 'sys_login_result',
SYS_CONFIG_TYPE: 'sys_config_type',
} }
/** /**

View File

@ -1,9 +1,9 @@
<template> <template>
<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="configName"> <el-form-item label="参数名称" prop="name">
<el-input <el-input
v-model="queryParams.configName" v-model="queryParams.name"
placeholder="请输入参数名称" placeholder="请输入参数名称"
clearable clearable
size="small" size="small"
@ -11,9 +11,9 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="参数键名" prop="configKey"> <el-form-item label="参数键名" prop="key">
<el-input <el-input
v-model="queryParams.configKey" v-model="queryParams.key"
placeholder="请输入参数键名" placeholder="请输入参数键名"
clearable clearable
size="small" size="small"
@ -21,13 +21,13 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="系统内置" prop="configType"> <el-form-item label="系统内置" prop="type">
<el-select v-model="queryParams.configType" placeholder="系统内置" clearable size="small"> <el-select v-model="queryParams.type" placeholder="系统内置" clearable size="small">
<el-option <el-option
v-for="dict in typeOptions" v-for="dict in this.getDictDatas(DICT_TYPE.SYS_CONFIG_TYPE)"
:key="dict.dictValue" :key="parseInt(dict.value)"
:label="dict.dictLabel" :label="dict.label"
:value="dict.dictValue" :value="parseInt(dict.value)"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -59,26 +59,6 @@
v-hasPermi="['system:config:add']" v-hasPermi="['system:config:add']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:config:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:config:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="warning" type="warning"
@ -88,25 +68,25 @@
v-hasPermi="['system:config:export']" v-hasPermi="['system:config:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-refresh"
size="mini"
@click="handleClearCache"
v-hasPermi="['system:config:remove']"
>清理缓存</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="configList">
<el-table-column type="selection" width="55" align="center" /> <el-table-column label="参数主键" align="center" prop="id" />
<el-table-column label="参数主键" align="center" prop="configId" /> <el-table-column label="参数分组" align="center" prop="group" />
<el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" /> <el-table-column label="参数名称" align="center" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" /> <el-table-column label="参数键名" align="center" prop="key" :show-overflow-tooltip="true" />
<el-table-column label="参数键值" align="center" prop="configValue" /> <el-table-column label="参数键值" align="center" prop="value" />
<el-table-column label="系统内置" align="center" prop="configType" :formatter="typeFormat" /> <el-table-column label="系统内置" align="center" prop="type">
<template slot-scope="scope">
<span>{{ getDictDataLabel(DICT_TYPE.SYS_CONFIG_TYPE, scope.row.type) }}</span>
</template>
</el-table-column>
<el-table-column label="是否敏感" align="center" prop="sensitive">
<template slot-scope="scope">
<span>{{ scope.row.sensitive ? '是' : '否' }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
@ -136,7 +116,7 @@
<pagination <pagination
v-show="total>0" v-show="total>0"
:total="total" :total="total"
:page.sync="queryParams.pageNum" :page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize" :limit.sync="queryParams.pageSize"
@pagination="getList" @pagination="getList"
/> />
@ -144,22 +124,22 @@
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="参数名称" prop="configName"> <el-form-item label="参数分组" prop="group">
<el-input v-model="form.configName" placeholder="请输入参数名称" /> <el-input v-model="form.group" placeholder="请输入参数分组" />
</el-form-item> </el-form-item>
<el-form-item label="参数键名" prop="configKey"> <el-form-item label="参数名称" prop="name">
<el-input v-model="form.configKey" placeholder="请输入参数名" /> <el-input v-model="form.name" placeholder="请输入参数" />
</el-form-item> </el-form-item>
<el-form-item label="参数键值" prop="configValue"> <el-form-item label="参数键名" prop="key">
<el-input v-model="form.configValue" placeholder="请输入参数键值" /> <el-input v-model="form.key" placeholder="请输入参数键名" />
</el-form-item> </el-form-item>
<el-form-item label="系统内置" prop="configType"> <el-form-item label="参数键值" prop="value">
<el-radio-group v-model="form.configType"> <el-input v-model="form.value" placeholder="请输入参数键值" />
<el-radio </el-form-item>
v-for="dict in typeOptions" <el-form-item label="是否敏感" prop="type">
:key="dict.dictValue" <el-radio-group v-model="form.sensitive">
:label="dict.dictValue" <el-radio :key="true" :label="true"></el-radio>
>{{dict.dictLabel}}</el-radio> <el-radio :key="false" :label="false"></el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -175,7 +155,7 @@
</template> </template>
<script> <script>
import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig, clearCache } from "@/api/system/config"; import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig } from "@/api/system/config";
export default { export default {
name: "Config", name: "Config",
@ -183,12 +163,6 @@ export default {
return { return {
// //
loading: true, loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
// //
showSearch: true, showSearch: true,
// //
@ -205,23 +179,26 @@ export default {
dateRange: [], dateRange: [],
// //
queryParams: { queryParams: {
pageNum: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
configName: undefined, name: undefined,
configKey: undefined, key: undefined,
configType: undefined type: undefined
}, },
// //
form: {}, form: {},
// //
rules: { rules: {
configName: [ group: [
{ required: true, message: "参数分组不能为空", trigger: "blur" }
],
name: [
{ required: true, message: "参数名称不能为空", trigger: "blur" } { required: true, message: "参数名称不能为空", trigger: "blur" }
], ],
configKey: [ key: [
{ required: true, message: "参数键名不能为空", trigger: "blur" } { required: true, message: "参数键名不能为空", trigger: "blur" }
], ],
configValue: [ value: [
{ required: true, message: "参数键值不能为空", trigger: "blur" } { required: true, message: "参数键值不能为空", trigger: "blur" }
] ]
} }
@ -229,24 +206,24 @@ export default {
}, },
created() { created() {
this.getList(); this.getList();
this.getDicts("sys_yes_no").then(response => {
this.typeOptions = response.data;
});
}, },
methods: { methods: {
/** 查询参数列表 */ /** 查询参数列表 */
getList() { getList() {
this.loading = true; this.loading = true;
listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => { listConfig(this.addDateRange(this.queryParams, [
this.configList = response.rows; this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined,
this.total = response.total; this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined,
])).then(response => {
this.configList = response.data.list;
this.total = response.data.total;
this.loading = false; this.loading = false;
} }
); );
}, },
// //
typeFormat(row, column) { typeFormat(row, column) {
return this.selectDictLabel(this.typeOptions, row.configType); return this.selectDictLabel(this.typeOptions, row.type);
}, },
// //
cancel() { cancel() {
@ -256,18 +233,17 @@ export default {
// //
reset() { reset() {
this.form = { this.form = {
configId: undefined, id: undefined,
configName: undefined, name: undefined,
configKey: undefined, key: undefined,
configValue: undefined, value: undefined,
configType: "Y",
remark: undefined remark: undefined
}; };
this.resetForm("form"); this.resetForm("form");
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.pageNo = 1;
this.getList(); this.getList();
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
@ -282,17 +258,11 @@ export default {
this.open = true; this.open = true;
this.title = "添加参数"; this.title = "添加参数";
}, },
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.configId)
this.single = selection.length!=1
this.multiple = !selection.length
},
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset(); this.reset();
const configId = row.configId || this.ids const id = row.id || this.ids
getConfig(configId).then(response => { getConfig(id).then(response => {
this.form = response.data; this.form = response.data;
this.open = true; this.open = true;
this.title = "修改参数"; this.title = "修改参数";
@ -302,7 +272,7 @@ export default {
submitForm: function() { submitForm: function() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
if (this.form.configId != undefined) { if (this.form.id !== undefined) {
updateConfig(this.form).then(response => { updateConfig(this.form).then(response => {
this.msgSuccess("修改成功"); this.msgSuccess("修改成功");
this.open = false; this.open = false;
@ -320,13 +290,13 @@ export default {
}, },
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const configIds = row.configId || this.ids; const ids = row.id || this.ids;
this.$confirm('是否确认删除参数编号为"' + configIds + '"的数据项?', "警告", { this.$confirm('是否确认删除参数编号为"' + ids + '"的数据项?', "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(function() { }).then(function() {
return delConfig(configIds); return delConfig(ids);
}).then(() => { }).then(() => {
this.getList(); this.getList();
this.msgSuccess("删除成功"); this.msgSuccess("删除成功");
@ -342,15 +312,9 @@ export default {
}).then(function() { }).then(function() {
return exportConfig(queryParams); return exportConfig(queryParams);
}).then(response => { }).then(response => {
this.download(response.msg); this.downloadExcel(response, '参数配置.xls');
}) })
}, },
/** 清理缓存按钮操作 */
handleClearCache() {
clearCache().then(response => {
this.msgSuccess("清理成功");
});
}
} }
}; };
</script> </script>

View File

@ -1,8 +1,26 @@
package cn.iocoder.dashboard.modules.system.controller.config; package cn.iocoder.dashboard.modules.system.controller.config;
import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
import cn.iocoder.dashboard.modules.system.controller.config.vo.*;
import cn.iocoder.dashboard.modules.system.convert.config.SysConfigConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
import cn.iocoder.dashboard.modules.system.service.config.SysConfigService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping; import io.swagger.annotations.ApiImplicitParam;
import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE;
@Api(tags = "参数配置") @Api(tags = "参数配置")
@RestController @RestController
@ -24,4 +42,78 @@ public class SysConfigController {
// //
// } // }
@Resource
private SysConfigService configService;
@ApiOperation("获取参数配置分页")
@GetMapping("/page")
// @PreAuthorize("@ss.hasPermi('system:config:list')")
public CommonResult<PageResult<SysConfigRespVO>> getConfigPage(@Validated SysConfigPageReqVO reqVO) {
PageResult<SysConfigDO> page = configService.getConfigPage(reqVO);
return success(SysConfigConvert.INSTANCE.convertPage(page));
}
@ApiOperation("导出参数配置")
@GetMapping("/export")
// @Log(title = "参数管理", businessType = BusinessType.EXPORT)
// @PreAuthorize("@ss.hasPermi('system:config:export')")
public void exportSysConfig(HttpServletResponse response, @Validated SysConfigExportReqVO reqVO) throws IOException {
List<SysConfigDO> list = configService.getConfigList(reqVO);
// 拼接数据
List<SysConfigExcelVO> excelDataList = SysConfigConvert.INSTANCE.convertList(list);
// 输出
ExcelUtils.write(response, "参数配置.xls", "配置列表",
SysConfigExcelVO.class, excelDataList);
}
@ApiOperation("获得参数配置")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@GetMapping(value = "/get")
// @PreAuthorize("@ss.hasPermi('system:config:query')")
public CommonResult<SysConfigRespVO> getConfig(@RequestParam("id") Long id) {
return success(SysConfigConvert.INSTANCE.convert(configService.getConfig(id)));
}
@ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端")
@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) {
SysConfigDO config = configService.getConfigByKey(key);
if (config == null) {
return null;
}
if (config.getSensitive()) {
throw ServiceExceptionUtil.exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE);
}
return success(config.getValue());
}
@ApiOperation("新增参数配置")
@PostMapping("/create")
// @PreAuthorize("@ss.hasPermi('system:config:add')")
// @Log(title = "参数管理", businessType = BusinessType.INSERT)
// @RepeatSubmit
public CommonResult<Long> createConfig(@Validated @RequestBody SysConfigCreateReqVO reqVO) {
return success(configService.createConfig(reqVO));
}
@ApiOperation("修改参数配置")
@PutMapping("/update")
// @PreAuthorize("@ss.hasPermi('system:config:edit')")
// @Log(title = "参数管理", businessType = BusinessType.UPDATE)
public CommonResult<Boolean> edit(@Validated @RequestBody SysConfigUpdateReqVO reqVO) {
configService.updateConfig(reqVO);
return success(true);
}
@ApiOperation("删除参数配置")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@DeleteMapping("/delete")
// @PreAuthorize("@ss.hasPermi('system:config:remove')")
// @Log(title = "参数管理", businessType = BusinessType.DELETE)
public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
configService.deleteConfig(id);
return success(true);
}
} }

View File

@ -5,6 +5,7 @@ import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
/** /**
@ -29,11 +30,8 @@ public class SysConfigBaseVO {
@Size(max = 500, message = "参数键值长度不能超过500个字符") @Size(max = 500, message = "参数键值长度不能超过500个字符")
private String value; private String value;
@ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private String type;
@ApiModelProperty(value = "是否敏感", required = true, example = "true") @ApiModelProperty(value = "是否敏感", required = true, example = "true")
@NotBlank(message = "是否敏感不能为空") @NotNull(message = "是否敏感不能为空")
private Boolean sensitive; private Boolean sensitive;
@ApiModelProperty(value = "备注", example = "备注一下很帅气!") @ApiModelProperty(value = "备注", example = "备注一下很帅气!")

View File

@ -1,6 +1,5 @@
package cn.iocoder.dashboard.modules.system.controller.config.vo; package cn.iocoder.dashboard.modules.system.controller.config.vo;
import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptBaseVO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -12,7 +11,7 @@ import javax.validation.constraints.Size;
@ApiModel("参数配置创建 Request VO") @ApiModel("参数配置创建 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class SysConfigCreateReqVO extends SysDeptBaseVO { public class SysConfigCreateReqVO extends SysConfigBaseVO {
@ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username")
@NotBlank(message = "参数键名长度不能为空") @NotBlank(message = "参数键名长度不能为空")

View File

@ -1,5 +1,8 @@
package cn.iocoder.dashboard.modules.system.controller.config.vo; package cn.iocoder.dashboard.modules.system.controller.config.vo;
import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
import cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data; import lombok.Data;
@ -26,10 +29,12 @@ public class SysConfigExcelVO {
@ExcelProperty("参数键值") @ExcelProperty("参数键值")
private String value; private String value;
@ExcelProperty("参数类型") @ExcelProperty(value = "参数类型", converter = DictConvert.class)
private String type; @DictFormat(SysDictTypeEnum.SYS_CONFIG_TYPE)
private Integer type;
@ExcelProperty("是否敏感") @ExcelProperty(value = "是否敏感", converter = DictConvert.class)
@DictFormat(SysDictTypeEnum.SYS_BOOLEAN_STRING)
private Boolean sensitive; private Boolean sensitive;
@ExcelProperty("备注") @ExcelProperty("备注")

View File

@ -0,0 +1,33 @@
package cn.iocoder.dashboard.modules.system.controller.config.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("参数配置导出 Request VO")
@Data
public class SysConfigExportReqVO {
@ApiModelProperty(value = "参数名称", example = "模糊匹配")
private String name;
@ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
private String key;
@ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "开始时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.dashboard.modules.system.controller.config.vo;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("参数配置分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class SysConfigPageReqVO extends PageParam {
@ApiModelProperty(value = "参数名称", example = "模糊匹配")
private String name;
@ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
private String key;
@ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "开始时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
}

View File

@ -22,6 +22,9 @@ public class SysConfigRespVO extends SysConfigBaseVO {
@Size(max = 100, message = "参数键名长度不能超过100个字符") @Size(max = 100, message = "参数键名长度不能超过100个字符")
private String key; private String key;
@ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime; private Date createTime;

View File

@ -1,6 +1,5 @@
package cn.iocoder.dashboard.modules.system.controller.config.vo; package cn.iocoder.dashboard.modules.system.controller.config.vo;
import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptBaseVO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -11,7 +10,7 @@ import javax.validation.constraints.NotNull;
@ApiModel("参数配置创建 Request VO") @ApiModel("参数配置创建 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class SysConfigUpdateReqVO extends SysDeptBaseVO { public class SysConfigUpdateReqVO extends SysConfigBaseVO {
@ApiModelProperty(value = "参数配置序号", required = true, example = "1024") @ApiModelProperty(value = "参数配置序号", required = true, example = "1024")
@NotNull(message = "参数配置编号不能为空") @NotNull(message = "参数配置编号不能为空")

View File

@ -0,0 +1,29 @@
package cn.iocoder.dashboard.modules.system.convert.config;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExcelVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigRespVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface SysConfigConvert {
SysConfigConvert INSTANCE = Mappers.getMapper(SysConfigConvert.class);
PageResult<SysConfigRespVO> convertPage(PageResult<SysConfigDO> page);
SysConfigRespVO convert(SysConfigDO bean);
SysConfigDO convert(SysConfigCreateReqVO bean);
SysConfigDO convert(SysConfigUpdateReqVO bean);
List<SysConfigExcelVO> convertList(List<SysConfigDO> list);
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.config;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SysConfigMapper extends BaseMapperX<SysConfigDO> {
default PageResult<SysConfigDO> selectPage(SysConfigPageReqVO reqVO) {
return selectPage(reqVO,
new QueryWrapperX<SysConfigDO>().likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
default SysConfigDO selectByKey(String key) {
return selectOne(new QueryWrapper<SysConfigDO>().eq("`key`", key));
}
default List<SysConfigDO> selectList(SysConfigExportReqVO reqVO) {
return selectList(new QueryWrapperX<SysConfigDO>().likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
}

View File

@ -2,7 +2,11 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config;
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.dashboard.modules.system.enums.config.SysConfigTypeEnum; import cn.iocoder.dashboard.modules.system.enums.config.SysConfigTypeEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/** /**
* 参数配置表 * 参数配置表
@ -10,6 +14,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
* @author ruoyi * @author ruoyi
*/ */
@TableName("sys_config") @TableName("sys_config")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SysConfigDO extends BaseDO { public class SysConfigDO extends BaseDO {
/** /**
@ -19,6 +26,7 @@ public class SysConfigDO extends BaseDO {
/** /**
* 参数分组 * 参数分组
*/ */
@TableField("`group`")
private String group; private String group;
/** /**
* 参数名称 * 参数名称
@ -27,6 +35,7 @@ public class SysConfigDO extends BaseDO {
/** /**
* 参数键名 * 参数键名
*/ */
@TableField("`key`")
private String key; private String key;
/** /**
* 参数键值 * 参数键值
@ -37,12 +46,14 @@ public class SysConfigDO extends BaseDO {
* *
* 枚举 {@link SysConfigTypeEnum} * 枚举 {@link SysConfigTypeEnum}
*/ */
private String type; @TableField("`type`")
private Integer type;
/** /**
* 是否敏感 * 是否敏感
* *
* 对于敏感配置需要管理权限才能查看 * 对于敏感配置需要管理权限才能查看
*/ */
@TableField("`sensitive`")
private Boolean sensitive; private Boolean sensitive;
/** /**
* 备注 * 备注

View File

@ -74,4 +74,10 @@ public interface SysErrorCodeConstants {
// ========== 文件 1002009000 ========== // ========== 文件 1002009000 ==========
ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在");
// ========== 参数配置 1002010000 ==========
ErrorCode CONFIG_NOT_FOUND = new ErrorCode(1002010001, "参数配置不存在");
ErrorCode CONFIG_NAME_DUPLICATE = new ErrorCode(1002010002, "参数配置 key 重复");
ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1002010003, "不能删除类型为系统内置的参数配置");
ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1002010004, "不允许获取敏感配置到前端");
} }

View File

@ -14,6 +14,8 @@ public enum SysDictTypeEnum {
SYS_COMMON_STATUS("sys_common_status"), // 系统状态 SYS_COMMON_STATUS("sys_common_status"), // 系统状态
SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型 SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型
SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果 SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果
SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型
SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
; ;

View File

@ -0,0 +1,71 @@
package cn.iocoder.dashboard.modules.system.service.config;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
import java.util.List;
/**
* 参数配置 Service 接口
*/
public interface SysConfigService {
/**
* 获得参数配置分页列表
*
* @param reqVO 分页条件
* @return 分页列表
*/
PageResult<SysConfigDO> getConfigPage(SysConfigPageReqVO reqVO);
/**
* 获得参数配置列表
*
* @param reqVO 列表
* @return 列表
*/
List<SysConfigDO> getConfigList(SysConfigExportReqVO reqVO);
/**
* 获得参数配置
*
* @param id 配置编号
* @return 参数配置
*/
SysConfigDO getConfig(Long id);
/**
* 根据参数键获得参数配置
*
* @param key 配置键
* @return 参数配置
*/
SysConfigDO getConfigByKey(String key);
/**
* 创建参数配置
*
* @param reqVO 创建信息
* @return 配置编号
*/
Long createConfig(SysConfigCreateReqVO reqVO);
/**
* 更新参数配置
*
* @param reqVO 更新信息
*/
void updateConfig(SysConfigUpdateReqVO reqVO);
/**
* 删除参数配置
*
* @param id 配置编号
*/
void deleteConfig(Long id);
}

View File

@ -0,0 +1,116 @@
package cn.iocoder.dashboard.modules.system.service.config.impl;
import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigPageReqVO;
import cn.iocoder.dashboard.modules.system.controller.config.vo.SysConfigUpdateReqVO;
import cn.iocoder.dashboard.modules.system.convert.config.SysConfigConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.config.SysConfigMapper;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.config.SysConfigDO;
import cn.iocoder.dashboard.modules.system.enums.config.SysConfigTypeEnum;
import cn.iocoder.dashboard.modules.system.service.config.SysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
/**
* 参数配置 Service 实现类
*/
@Service
@Slf4j
public class SysConfigServiceImpl implements SysConfigService {
@Resource
private SysConfigMapper configMapper;
@Override
public PageResult<SysConfigDO> getConfigPage(SysConfigPageReqVO reqVO) {
return configMapper.selectPage(reqVO);
}
@Override
public List<SysConfigDO> getConfigList(SysConfigExportReqVO reqVO) {
return configMapper.selectList(reqVO);
}
@Override
public SysConfigDO getConfig(Long id) {
return configMapper.selectById(id);
}
@Override
public SysConfigDO getConfigByKey(String key) {
return configMapper.selectByKey(key);
}
@Override
public Long createConfig(SysConfigCreateReqVO reqVO) {
// 校验正确性
checkCreateOrUpdate(null, reqVO.getKey());
// 插入参数配置
SysConfigDO config = SysConfigConvert.INSTANCE.convert(reqVO);
config.setType(SysConfigTypeEnum.CUSTOM.getType());
configMapper.insert(config);
return config.getId();
}
@Override
public void updateConfig(SysConfigUpdateReqVO reqVO) {
// 校验正确性
checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key
// 更新参数配置
SysConfigDO updateObj = SysConfigConvert.INSTANCE.convert(reqVO);
configMapper.updateById(updateObj);
}
@Override
public void deleteConfig(Long id) {
// 校验配置存在
SysConfigDO config = checkConfigExists(id);
// 内置配置不允许删除
if (SysConfigTypeEnum.SYSTEM.getType().equals(config.getType())) {
throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE);
}
// 删除
configMapper.deleteById(id);
}
private void checkCreateOrUpdate(Long id, String key) {
// 校验自己存在
checkConfigExists(id);
// 校验参数配置 key 的唯一性
checkConfigKeyUnique(id, key);
}
private SysConfigDO checkConfigExists(Long id) {
if (id == null) {
return null;
}
SysConfigDO config = configMapper.selectById(id);
if (config == null) {
throw ServiceExceptionUtil.exception(CONFIG_NOT_FOUND);
}
return config;
}
private void checkConfigKeyUnique(Long id, String key) {
SysConfigDO config = configMapper.selectByKey(key);
if (config == null) {
return;
}
// 如果 id 为空说明不用比较是否为相同 id 的参数配置
if (id == null) {
throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
}
if (!config.getId().equals(id)) {
throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
}
}
}