From 1e2058bdfbbb0cce1a85f46b9c2b4a5238de04fb Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: 星期六, 30 五月 2020 14:29:19 +0800
Subject: [PATCH] 字典管理添加缓存读取

---
 ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java                          |    5 
 ruoyi-ui/src/api/system/dict/data.js                                                  |    2 
 ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java         |   22 ++-
 ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java |   46 +++----
 ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java    |    8 +
 ruoyi/src/main/java/com/ruoyi/common/utils/DictUtils.java                             |   64 ++++++++++
 ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java |   90 ++++++++++++--
 ruoyi-ui/src/views/system/config/index.vue                                            |    1 
 ruoyi-ui/src/views/system/dict/index.vue                                              |   21 +++
 ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java    |   12 ++
 ruoyi-ui/src/api/system/dict/type.js                                                  |    8 +
 ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java                           |    6 +
 ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java         |   16 --
 13 files changed, 230 insertions(+), 71 deletions(-)

diff --git a/ruoyi-ui/src/api/system/dict/data.js b/ruoyi-ui/src/api/system/dict/data.js
index 6a3f418..d3f8c2f 100644
--- a/ruoyi-ui/src/api/system/dict/data.js
+++ b/ruoyi-ui/src/api/system/dict/data.js
@@ -20,7 +20,7 @@
 // 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
 export function getDicts(dictType) {
   return request({
-    url: '/system/dict/data/dictType/' + dictType,
+    url: '/system/dict/data/type/' + dictType,
     method: 'get'
   })
 }
diff --git a/ruoyi-ui/src/api/system/dict/type.js b/ruoyi-ui/src/api/system/dict/type.js
index 4b45a35..d392f50 100644
--- a/ruoyi-ui/src/api/system/dict/type.js
+++ b/ruoyi-ui/src/api/system/dict/type.js
@@ -43,6 +43,14 @@
   })
 }
 
+// 娓呯悊鍙傛暟缂撳瓨
+export function clearCache() {
+  return request({
+    url: '/system/dict/type/clearCache',
+    method: 'delete'
+  })
+}
+
 // 瀵煎嚭瀛楀吀绫诲瀷
 export function exportType(query) {
   return request({
diff --git a/ruoyi-ui/src/views/system/config/index.vue b/ruoyi-ui/src/views/system/config/index.vue
index e32d2ee..6f87aea 100644
--- a/ruoyi-ui/src/views/system/config/index.vue
+++ b/ruoyi-ui/src/views/system/config/index.vue
@@ -352,7 +352,6 @@
     },
     /** 娓呯悊缂撳瓨鎸夐挳鎿嶄綔 */
     handleClearCache() {
-      const queryParams = this.queryParams;
       clearCache().then(response => {
         if (response.code === 200) {
           this.msgSuccess("娓呯悊鎴愬姛");
diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/ruoyi-ui/src/views/system/dict/index.vue
index 9c3f647..2954008 100644
--- a/ruoyi-ui/src/views/system/dict/index.vue
+++ b/ruoyi-ui/src/views/system/dict/index.vue
@@ -94,6 +94,15 @@
           v-hasPermi="['system:dict:export']"
         >瀵煎嚭</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-refresh"
+          size="mini"
+          @click="handleClearCache"
+          v-hasPermi="['system:dict:remove']"
+        >娓呯悊缂撳瓨</el-button>
+      </el-col>
     </el-row>
 
     <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
@@ -173,7 +182,7 @@
 </template>
 
 <script>
-import { listType, getType, delType, addType, updateType, exportType } from "@/api/system/dict/type";
+import { listType, getType, delType, addType, updateType, exportType, clearCache } from "@/api/system/dict/type";
 
 export default {
   name: "Dict",
@@ -344,6 +353,16 @@
         }).then(response => {
           this.download(response.msg);
         }).catch(function() {});
+    },
+    /** 娓呯悊缂撳瓨鎸夐挳鎿嶄綔 */
+    handleClearCache() {
+      clearCache().then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("娓呯悊鎴愬姛");
+        } else {
+          this.msgError(response.msg);
+        }
+      });
     }
   }
 };
diff --git a/ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java
index a2a32b4..fe8afc0 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/ruoyi/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -115,6 +115,11 @@
     public static final String SYS_CONFIG_KEY = "sys_config:";
 
     /**
+     * 瀛楀吀绠$悊 cache key
+     */
+    public static final String SYS_DICT_KEY = "sys_dict:";
+
+    /**
      * 璧勬簮鏄犲皠璺緞 鍓嶇紑
      */
     public static final String RESOURCE_PREFIX = "/profile";
diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/DictUtils.java
new file mode 100644
index 0000000..0c1ee5d
--- /dev/null
+++ b/ruoyi/src/main/java/com/ruoyi/common/utils/DictUtils.java
@@ -0,0 +1,64 @@
+package com.ruoyi.common.utils;
+
+import java.util.Collection;
+import java.util.List;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import com.ruoyi.framework.redis.RedisCache;
+import com.ruoyi.project.system.domain.SysDictData;
+
+/**
+ * 瀛楀吀宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class DictUtils
+{
+    /**
+     * 璁剧疆瀛楀吀缂撳瓨
+     * 
+     * @param key 鍙傛暟閿�
+     * @param dictDatas 瀛楀吀鏁版嵁鍒楄〃
+     */
+    public static void setDictCache(String key, List<SysDictData> dictDatas)
+    {
+        SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas);
+    }
+
+    /**
+     * 鑾峰彇瀛楀吀缂撳瓨
+     * 
+     * @param key 鍙傛暟閿�
+     * @return dictDatas 瀛楀吀鏁版嵁鍒楄〃
+     */
+    public static List<SysDictData> getDictCache(String key)
+    {
+        Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
+        if (StringUtils.isNotNull(cacheObj))
+        {
+            List<SysDictData> DictDatas = StringUtils.cast(cacheObj);
+            return DictDatas;
+        }
+        return null;
+    }
+
+    /**
+     * 娓呯┖瀛楀吀缂撳瓨
+     */
+    public static void clearDictCache()
+    {
+        Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*");
+        SpringUtils.getBean(RedisCache.class).deleteObject(keys);
+    }
+
+    /**
+     * 璁剧疆cache key
+     * 
+     * @param configKey 鍙傛暟閿�
+     * @return 缂撳瓨閿甼ey
+     */
+    public static String getCacheKey(String configKey)
+    {
+        return Constants.SYS_DICT_KEY + configKey;
+    }
+}
diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java
index a865c35..36b3e09 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java
+++ b/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java
@@ -450,4 +450,10 @@
         }
         return sb.toString();
     }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
 }
\ No newline at end of file
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
index 60becb1..8b3b394 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
@@ -21,6 +21,7 @@
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.project.system.domain.SysDictData;
 import com.ruoyi.project.system.service.ISysDictDataService;
+import com.ruoyi.project.system.service.ISysDictTypeService;
 
 /**
  * 鏁版嵁瀛楀吀淇℃伅
@@ -33,6 +34,9 @@
 {
     @Autowired
     private ISysDictDataService dictDataService;
+
+    @Autowired
+    private ISysDictTypeService dictTypeService;
 
     @PreAuthorize("@ss.hasPermi('system:dict:list')")
     @GetMapping("/list")
@@ -66,10 +70,10 @@
     /**
      * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
      */
-    @GetMapping(value = "/dictType/{dictType}")
+    @GetMapping(value = "/type/{dictType}")
     public AjaxResult dictType(@PathVariable String dictType)
     {
-        return AjaxResult.success(dictDataService.selectDictDataByType(dictType));
+        return AjaxResult.success(dictTypeService.selectDictDataByType(dictType));
     }
 
     /**
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
index 4236206..816d543 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
@@ -108,6 +108,18 @@
     }
 
     /**
+     * 娓呯┖缂撳瓨
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clearCache")
+    public AjaxResult clearCache()
+    {
+        dictTypeService.clearCache();
+        return AjaxResult.success();
+    }
+
+    /**
      * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
      */
     @GetMapping("/optionselect")
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java
index 870f357..65693d1 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java
@@ -19,14 +19,6 @@
     public List<SysDictData> selectDictDataList(SysDictData dictData);
 
     /**
-     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
-     * 
-     * @param dictType 瀛楀吀绫诲瀷
-     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
-     */
-    public List<SysDictData> selectDictDataByType(String dictType);
-
-    /**
      * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭�
      * 
      * @param dictType 瀛楀吀绫诲瀷
@@ -42,14 +34,6 @@
      * @return 瀛楀吀鏁版嵁
      */
     public SysDictData selectDictDataById(Long dictCode);
-
-    /**
-     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅
-     * 
-     * @param dictCode 瀛楀吀鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteDictDataById(Long dictCode);
 
     /**
      * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java
index 326beb7..c6708d3 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.project.system.service;
 
 import java.util.List;
+import com.ruoyi.project.system.domain.SysDictData;
 import com.ruoyi.project.system.domain.SysDictType;
 
 /**
@@ -26,6 +27,14 @@
     public List<SysDictType> selectDictTypeAll();
 
     /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    public List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
      * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅
      * 
      * @param dictId 瀛楀吀绫诲瀷ID
@@ -42,14 +51,6 @@
     public SysDictType selectDictTypeByType(String dictType);
 
     /**
-     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅
-     * 
-     * @param dictId 瀛楀吀ID
-     * @return 缁撴灉
-     */
-    public int deleteDictTypeById(Long dictId);
-
-    /**
      * 鎵归噺鍒犻櫎瀛楀吀淇℃伅
      * 
      * @param dictIds 闇�瑕佸垹闄ょ殑瀛楀吀ID
@@ -58,6 +59,11 @@
     public int deleteDictTypeByIds(Long[] dictIds);
 
     /**
+     * 娓呯┖缂撳瓨鏁版嵁
+     */
+    public void clearCache();
+
+    /**
      * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅
      * 
      * @param dictType 瀛楀吀绫诲瀷淇℃伅
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java
index e8475dc..05c2a8d 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java
@@ -3,6 +3,7 @@
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.project.system.domain.SysDictData;
 import com.ruoyi.project.system.mapper.SysDictDataMapper;
 import com.ruoyi.project.system.service.ISysDictDataService;
@@ -31,18 +32,6 @@
     }
 
     /**
-     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
-     * 
-     * @param dictType 瀛楀吀绫诲瀷
-     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
-     */
-    @Override
-    public List<SysDictData> selectDictDataByType(String dictType)
-    {
-        return dictDataMapper.selectDictDataByType(dictType);
-    }
-
-    /**
      * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭�
      * 
      * @param dictType 瀛楀吀绫诲瀷
@@ -68,18 +57,6 @@
     }
 
     /**
-     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅
-     * 
-     * @param dictCode 瀛楀吀鏁版嵁ID
-     * @return 缁撴灉
-     */
-    @Override
-    public int deleteDictDataById(Long dictCode)
-    {
-        return dictDataMapper.deleteDictDataById(dictCode);
-    }
-
-    /**
      * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅
      * 
      * @param dictCodes 闇�瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID
@@ -87,7 +64,12 @@
      */
     public int deleteDictDataByIds(Long[] dictCodes)
     {
-        return dictDataMapper.deleteDictDataByIds(dictCodes);
+        int row = dictDataMapper.deleteDictDataByIds(dictCodes);
+        if (row > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return row;
     }
 
     /**
@@ -99,7 +81,12 @@
     @Override
     public int insertDictData(SysDictData dictData)
     {
-        return dictDataMapper.insertDictData(dictData);
+        int row = dictDataMapper.insertDictData(dictData);
+        if (row > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return row;
     }
 
     /**
@@ -111,6 +98,11 @@
     @Override
     public int updateDictData(SysDictData dictData)
     {
-        return dictDataMapper.updateDictData(dictData);
+        int row = dictDataMapper.updateDictData(dictData);
+        if (row > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return row;
     }
 }
diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java
index 2cf5f19..4f6f4c5 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,11 +1,15 @@
 package com.ruoyi.project.system.service.impl;
 
 import java.util.List;
+import javax.annotation.PostConstruct;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.exception.CustomException;
+import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.project.system.domain.SysDictData;
 import com.ruoyi.project.system.domain.SysDictType;
 import com.ruoyi.project.system.mapper.SysDictDataMapper;
 import com.ruoyi.project.system.mapper.SysDictTypeMapper;
@@ -24,6 +28,20 @@
 
     @Autowired
     private SysDictDataMapper dictDataMapper;
+
+    /**
+     * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧瓧鍏稿埌缂撳瓨
+     */
+    @PostConstruct
+    public void init()
+    {
+        List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
+        for (SysDictType dictType : dictTypeList)
+        {
+            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
+            DictUtils.setDictCache(dictType.getDictType(), dictDatas);
+        }
+    }
 
     /**
      * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷
@@ -46,6 +64,29 @@
     public List<SysDictType> selectDictTypeAll()
     {
         return dictTypeMapper.selectDictTypeAll();
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    @Override
+    public List<SysDictData> selectDictDataByType(String dictType)
+    {
+        List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
+        if (StringUtils.isNotNull(dictDatas))
+        {
+            return dictDatas;
+        }
+        dictDatas = dictDataMapper.selectDictDataByType(dictType);
+        if (StringUtils.isNotNull(dictDatas))
+        {
+            DictUtils.setDictCache(dictType, dictDatas);
+            return dictDatas;
+        }
+        return null;
     }
 
     /**
@@ -72,18 +113,6 @@
     }
 
     /**
-     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅
-     * 
-     * @param dictId 瀛楀吀ID
-     * @return 缁撴灉
-     */
-    @Override
-    public int deleteDictTypeById(Long dictId)
-    {
-        return dictTypeMapper.deleteDictTypeById(dictId);
-    }
-
-    /**
      * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅
      * 
      * @param dictIds 闇�瑕佸垹闄ょ殑瀛楀吀ID
@@ -91,7 +120,28 @@
      */
     public int deleteDictTypeByIds(Long[] dictIds)
     {
-        return dictTypeMapper.deleteDictTypeByIds(dictIds);
+        for (Long dictId : dictIds)
+        {
+            SysDictType dictType = selectDictTypeById(dictId);
+            if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
+            {
+                throw new CustomException(String.format("%1$s宸插垎閰�,涓嶈兘鍒犻櫎", dictType.getDictName()));
+            }
+        }
+        int count = dictTypeMapper.deleteDictTypeByIds(dictIds);
+        if (count > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return count;
+    }
+
+    /**
+     * 娓呯┖缂撳瓨鏁版嵁
+     */
+    public void clearCache()
+    {
+        DictUtils.clearDictCache();
     }
 
     /**
@@ -103,7 +153,12 @@
     @Override
     public int insertDictType(SysDictType dictType)
     {
-        return dictTypeMapper.insertDictType(dictType);
+        int row = dictTypeMapper.insertDictType(dictType);
+        if (row > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return row;
     }
 
     /**
@@ -118,7 +173,12 @@
     {
         SysDictType oldDict = dictTypeMapper.selectDictTypeById(dictType.getDictId());
         dictDataMapper.updateDictDataType(oldDict.getDictType(), dictType.getDictType());
-        return dictTypeMapper.updateDictType(dictType);
+        int row = dictTypeMapper.updateDictType(dictType);
+        if (row > 0)
+        {
+            DictUtils.clearDictCache();
+        }
+        return row;
     }
 
     /**

--
Gitblit v1.9.3