今天由于我们后台管理里面没有数据字典管理,于是就被要求开发一个出来,研究了一下数据字典是怎么使用的。项目用的是ssm+vue
配置redis
首先由于要读redis,所以配置文件要先配置redis,以下是application.yml文件
spring:
profiles:
active: dev
cache:
redis:
use-key-prefix: true
key-prefix: "ipas:"
这里active意为使用后缀为dev的配置文件(实际上就是开发环境配置,还有测试环境和生产环境)
然后就是cache引入redis缓存,设定他的前缀
我们再看到被引入的后缀为dev的配置文件。里面配置了redis的地址
spring:
redis:
host: 存放的是地址
port: 6379
database: 15
password: 密码
timeout: 10000
然后我们可以在用redis客户端工具连接下redis看看对应的redis库,第15个库(database:15)
这里主要讲的是redis,数据库的配置以及其他配置就不贴了
数据库表结构
然后我们看数据库的表结构
首先是字典目录表
值得注意的是DICT_TYPE_CODE这个字段,他表示的是字典目录的编码,比如名称为年级的,DICT_TYPE_CODE叫做GRADE
然后我们还需要字典的值,这个值放在另一个表里面,有一个DICT_VALUE字段存字典值,
还有一个DICT_TYPE_CODE字段和字典目录的DICT_TYPE_CODE进行关联
接口设计
明白了基本表结构之后就轮到接口的设计,此处写的是查询的接口
此处使用Cacheable注解,可以让有缓存的时候走redis缓存
@Service("dictEntryService")
public class DictEntryServiceImpl extends BaseServiceImpl<DictEntryMapper,DictEntry> implements DictEntryService {
@Autowired
private DictEntryMapper dictEntryMapper;
@Override
@Cacheable(value = "dict", key = "#dictTypeCode")
public List<DictEntry> listDictEntry(String dictTypeCode){
Map<String, Object> map = MapUtil.newHashMap();
map.put("dictTypeCode", dictTypeCode);
Page page = new Page<>();
page.setSize(Integer.MAX_VALUE);
List<OrderItem> orderItems = CollectionUtil.newArrayList();
OrderItem orderItem = new OrderItem();
orderItem.setColumn("SORT_NO");
orderItem.setAsc(true);
orderItems.add(orderItem);
page.setOrders(orderItems);
IPage<DictEntry> entries = super.pageByMap(page, map);
return entries.getRecords();
}
}
和redis里的字典存放位置是一样的,注意空文件夹也是一个冒号
查询接口就设计完毕了
但是在模块里修改数据字典的时候,还需要删除redis缓存,所以这边要写一个刷redis缓存的接口
比如下图是字段目录里的数据,此处编辑了字典目录里的DICT_TYPE_CODE值,或者是直接删除掉该字典目录,要重新刷redis
还有下图,增删改字典选项的值,都要重新刷redis
此处直接贴代码,env和redisKeyPrefix都可以在配置文件里看到
/**
* @Description: 用于刷字典缓存
* @Author:
* @Date: 2022-7-21
*/
@Component
public class DictCacheUtil {
@Value("${spring.profiles.active}")
private String env;
@Value("${spring.cache.redis.key-prefix}")
private String redisKeyPrefix;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private DictTypeService dictTypeService;
@Autowired
private DictEntryService dictEntryService;
@Autowired
private static DictEntryService dictEntryService2;
/**
* @Description: 刷单个redis的dict
* @Param: 子字典的id(不是父字典)
* @return:
* @Author:
* @Date: 2022-7-21
*/
public void refreshCacheByEntryId(@NotNull String entryId){
boolean b = false;
// if( this.env.equals("dev") ){
// 这边统统刷redis
DictEntry entry = dictEntryService.getByEntityId(entryId);
if(entry != null && entry.getDictTypeCode() != null && !"".equals(entry.getDictTypeCode())){
this.refreshCacheByDictTypeCode(entry.getDictTypeCode());
}
// }
// 远程环境刷缓存map
// 开发和测试环境用同一个库,所以改了开发环境的测试环境也要刷map
// DictUtils.initMap();
}
/**
* @Description: 根据dictTypeCode刷redis的dict
* @Param: 字典的dictTypeCode
* @return:
* @Author:
* @Date: 2022-8-16
*/
public void refreshCacheByDictTypeCode(@NotNull String dictTypeCode){
boolean b = false;
// if( this.env.equals("dev") ){
// 这边统统刷redis
if(dictTypeCode != null && !"".equals(dictTypeCode)){
StringBuilder builder = new StringBuilder();
// 开发环境删redis
String key = builder.append(this.redisKeyPrefix).append("dict::").append(dictTypeCode).toString();
b = redisTemplate.delete( key);
}
// }
// 远程环境刷缓存map
// 开发和测试环境用同一个库,所以改了开发环境的测试环境也要刷map
// DictUtils.initMap();
}
}