Version: Next

全局参数配置

对于项目中使用到的一些全局配置的值,可以用数据库进行存储,方便修改维护

数据库

全局配置参数表
CREATE TABLE `sys_config` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`param_name` varchar(32) NOT NULL COMMENT '参数名称(中文)',
`param_key` varchar(64) NOT NULL COMMENT '参数唯一标识(英文)',
`param_value` varchar(64) NOT NULL COMMENT '参数值',
`param_desc` varchar(64) DEFAULT NULL COMMENT '参数描述备注',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 例如设置系统给新用户设置的默认密码
id参数类型参数值参数描述创建时间
1user.init.password12345678系统用户初始密码2020-09-27 09:46:05

SpringBoot

注意

先使用BetterMybatisGenerator,为刚才的配置表,生成相应的Mapper类和实体类,以及mybatis的xml文件

DbLoadSysConfig

  • DbLoadSysConfig 实现了CommandLineRunner接口,该接口只有一个方法run,该方法会在系统启动的时候执行。所以特别适合去做系统数据初始化工作。
  • 提供getSysConfigList获取所有的全局配置参数列表
  • 提供refresh函数刷新内存中的全局配置参数列表,与数据库同步
  • 提供getConfigItem方法,根据paramKeyParamValue
DbLoadConfig.java
@Component
public class DbLoadSysConfig implements CommandLineRunner {
@Resource
private SysConfigMapper sysConfigMapper;
//全局参数配置列表
private List<SysConfig> sysConfigList;
//根据参数key,获取参数值
public String getConfigItem(String paramKey) {
//使用java8的stream及lambda表达式根据paramKey找ParamValue
Optional<SysConfig> temp = sysConfigList.stream()
.filter(str -> str.getParamKey().equals(paramKey))
.findFirst();
return temp.get().getParamValue();
}
//应用启动加载参数配置
@Override
public void run(String... args) throws Exception {
sysConfigList = sysConfigMapper.selectByExample(null);
}
//获取所有参数配置项
public List<SysConfig> getSysConfigList() {
return sysConfigList;
}
//刷新参数配置项
public void refresh() {
sysConfigList = sysConfigMapper.selectByExample(null);
}
}

读取参数配置

dbLoadSysConfig.getConfigItem("user.init.password")

向前端提供查询全局配置参数的接口

SysConfigController.java
/**
* 用于前端查询 后端数据库中 存储的 全局配置参数
*/
@RestController
@RequestMapping("/sysconfig")
public class SysConfigController {
@Resource
private DbLoadSysConfig dbLoadSysConfig;
/**
* 查询所有的 全局配置参数 项目
*/
@PostMapping("/all")
public List<SysConfig> all() {
return dbLoadSysConfig.getSysConfigList();
}
/**
* 把数据库中存储的配置参数值,刷新到项目的内存数据中
* 即,让项目内存中实际的参数值,立刻更新为数据库中存储的值
*/
@PostMapping("/refresh")
public List<SysConfig> refresh() {
dbLoadSysConfig.refresh();
return dbLoadSysConfig.getSysConfigList();
}
}

前端Vue

API定义

定义API函数

//全局配置参数管理
export const getAllSysConfig = () => {
return jwtServerInstance.request({
url:'/sysconfig/all',
method:'post'
})
}

使用Vuex存储全局配置参数

store/modules/system.js
import {getAllSysConfig} from '@/api/system'
// 使用vuex存储从后端获取的全局配置参数,包括用户默认密码
const state = {
sysconfig: [] //全局参数配置对象
}
const actions = {
loadSysConfig({state}) { //加载全局配置参数(异步操作,在action里面定义)
//返回一个promise,方便调用该方法之后的下一步操作(参看下文调用时机选择)
return new Promise((resolve, reject) => {
//没加载过才加载,已经加载过就不加载了
//也就说只有登录,或者浏览器页面刷新时才重新加载全局配置
if (state.sysconfig.length <= 0) {
getAllSysConfig().then(res => {
state.sysconfig = res.data
})
}
resolve(); //表示回调promis的then方法。
})
}
}
const mutations = {}
const getters = {
//根据paramKey获取paramValue,工具方法
getSysConfigItem: (state) => (paramKey) => {
return state.sysconfig
.find(item => item.paramKey === paramKey)
.paramValue
}
}
export default {
state, actions, mutations, getters
}

加载时机

在路由守卫中,beforeEach中进行加载

  • 使用store.dispatch(actions方法名).then( _ => {})进行调用
router/index.js
router.beforeEach((to, from, next) => {
if (to.name !== 'login') {
Nprogress.start()
refreshToken().then(res => {
//没有获得新的token==null,
// 表示旧的token已经失效,需要重新登录
if (res.data == null) {
next({name: 'login'}) //去登录界面
setJwtToken('') //清空token
} else {//否则去你想去的界面,并把新的token保存起来
//把全局配置加载完成再去你想去的页面
store.dispatch('loadSysConfig').then(_ => {
next()
})
setJwtToken(res.data)
}
})
} else {//每次去到登录页面都刷新一下,清除vuex状态
next()
setJwtToken('') //清空token
}
})

使用Vuex中存储的全局配置参数

使用this.$store.getters.getSysConfigItem("user.init.password")来获取vuex中存储的全局参数配置

  • user.init.password是具体的全局参数配置值名称