完成缓存管理

lihaobo
luoyijiucheng 6 years ago
parent 917fb69bc9
commit be0bce1f09

@ -22,6 +22,7 @@
<log4j.version>1.2.17</log4j.version>
<hutool.version>4.6.8</hutool.version>
<pinyin4j.version>2.5.1</pinyin4j.version>
<fastjson.version>1.2.62</fastjson.version>
</properties>
<dependencies>
@ -152,6 +153,12 @@
<artifactId>pinyin4j</artifactId>
<version>${pinyin4j.version}</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>

@ -2,6 +2,7 @@ package com.yeqifu.bus.cache;
import com.yeqifu.bus.entity.Customer;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.sys.cache.CachePool;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
@ -13,7 +14,6 @@ import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
@ -32,7 +32,7 @@ public class BusinessCacheAspect {
/**
*
*/
private Map<String,Object> CACHE_CONTAINER = new HashMap<>();
private Map<String,Object> CACHE_CONTAINER = CachePool.CACHE_CONTAINER;
/**

@ -1,13 +1,15 @@
package com.yeqifu.bus.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* InnoDB free: 9216 kB
@ -20,6 +22,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_customer")
@ToString
public class Customer implements Serializable {
private static final long serialVersionUID=1L;

@ -1,14 +1,16 @@
package com.yeqifu.bus.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
@ -21,6 +23,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_goods")
@ToString
public class Goods implements Serializable {
private static final long serialVersionUID=1L;

@ -1,13 +1,15 @@
package com.yeqifu.bus.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* InnoDB free: 9216 kB
@ -20,6 +22,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_provider")
@ToString
public class Provider implements Serializable {
private static final long serialVersionUID=1L;

@ -2,8 +2,6 @@ package com.yeqifu.sys.cache;
import com.yeqifu.sys.entity.Dept;
import com.yeqifu.sys.entity.User;
import com.yeqifu.sys.vo.DeptVo;
import com.yeqifu.sys.vo.UserVo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
@ -13,7 +11,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
@ -33,7 +30,7 @@ public class CacheAspect {
/**
*
*/
private Map<String,Object> CACHE_CONTAINER = new HashMap<>();
private Map<String,Object> CACHE_CONTAINER = CachePool.CACHE_CONTAINER;
/**

@ -0,0 +1,89 @@
package com.yeqifu.sys.cache;
import com.yeqifu.bus.entity.Customer;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Provider;
import com.yeqifu.bus.mapper.CustomerMapper;
import com.yeqifu.bus.mapper.GoodsMapper;
import com.yeqifu.bus.mapper.ProviderMapper;
import com.yeqifu.sys.common.SpringUtil;
import com.yeqifu.sys.entity.Dept;
import com.yeqifu.sys.entity.User;
import com.yeqifu.sys.mapper.DeptMapper;
import com.yeqifu.sys.mapper.UserMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: -
* @Date: 2019/12/20 18:05
*/
public class CachePool {
/**
* CACHE_CONTAINERredis
*/
public static volatile Map<String,Object> CACHE_CONTAINER = new HashMap<>();
/**
* KEY
* @param key
*/
public static void removeCacheByKey(String key){
if (CACHE_CONTAINER.containsKey(key)){
CACHE_CONTAINER.remove(key);
}
}
/**
*
*/
public static void removeAll(){
CACHE_CONTAINER.clear();
}
/**
*
*/
public static void syncData(){
//同步部门数据
DeptMapper deptMapper = SpringUtil.getBean(DeptMapper.class);
List<Dept> deptList = deptMapper.selectList(null);
for (Dept dept : deptList) {
CACHE_CONTAINER.put("dept:"+dept.getId(),dept);
}
//同步用户数据
UserMapper userMapper = SpringUtil.getBean(UserMapper.class);
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
CACHE_CONTAINER.put("user:"+user.getId(),user);
}
//同步客户数据
CustomerMapper customerMapper = SpringUtil.getBean(CustomerMapper.class);
List<Customer> customerList = customerMapper.selectList(null);
for (Customer customer : customerList) {
CACHE_CONTAINER.put("customer:"+customer.getId(),customer);
}
//同步供应商数据
ProviderMapper providerMapper = SpringUtil.getBean(ProviderMapper.class);
List<Provider> providerList = providerMapper.selectList(null);
for (Provider provider : providerList) {
CACHE_CONTAINER.put("provider:"+provider.getId(),provider);
}
//同步商品数据
GoodsMapper goodsMapper = SpringUtil.getBean(GoodsMapper.class);
List<Goods> goodsList = goodsMapper.selectList(null);
for (Goods goods : goodsList) {
CACHE_CONTAINER.put("goods:"+goods.getId(),goods);
}
}
}

@ -0,0 +1,38 @@
package com.yeqifu.sys.common;
import com.alibaba.fastjson.JSON;
/**
* @Author: -
* @Date: 2019/12/20 18:40
*/
public class CacheBean {
private String key;
private Object value;
public CacheBean() {
}
public CacheBean(String key, Object value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return JSON.toJSON(value).toString();
}
public void setValue(Object value) {
this.value = value;
}
}

@ -34,6 +34,7 @@ public class ResultObj {
public static final ResultObj BACKINPORT_SUCCESS = new ResultObj(Constast.OK,"退货成功");
public static final ResultObj BACKINPORT_ERROR = new ResultObj(Constast.ERROR,"退货失败");
public static final ResultObj SYNCCACHE_SUCCESS = new ResultObj(Constast.OK,"同步缓存成功");
private Integer code;
private String msg;

@ -0,0 +1,29 @@
package com.yeqifu.sys.common;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @Author: -
* @Date: 2019/12/20 18:23
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext act) throws BeansException {
applicationContext = act;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
public static <T> T getBean(Class<T> cls){
return applicationContext.getBean(cls);
}
}

@ -0,0 +1,72 @@
package com.yeqifu.sys.controller;
import com.yeqifu.sys.cache.CachePool;
import com.yeqifu.sys.common.CacheBean;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
* @Author: -
* @Date: 2019/12/20 18:36
*/
@RestController
@RequestMapping("cache")
public class CacheController {
private static volatile Map<String,Object> CACHE_CONTAINER= CachePool.CACHE_CONTAINER;
/**
*
* @return
*/
@RequestMapping("loadAllCache")
public DataGridView loadAllCache(){
List<CacheBean> list = new ArrayList<>();
Set<Map.Entry<String, Object>> entrySet = CACHE_CONTAINER.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
list.add(new CacheBean(entry.getKey(),entry.getValue()));
}
return new DataGridView(list);
}
/**
*
* @param key
* @return
*/
@RequestMapping("deleteCache")
public ResultObj deleteCache(String key){
CachePool.removeCacheByKey(key);
return ResultObj.DELETE_SUCCESS;
}
/**
*
* @return
*/
@RequestMapping("removeAllCache")
public ResultObj removeAllCache(){
CachePool.removeAll();
return ResultObj.DELETE_SUCCESS;
}
/**
*
* @return
*/
@RequestMapping("syncCache")
public ResultObj syncCache(){
CachePool.syncData();
return ResultObj.SYNCCACHE_SUCCESS;
}
}

@ -155,5 +155,14 @@ public class SystemController {
public String toUserManager(){
return "system/user/userManager";
}
/**
*
* @return
*/
@RequestMapping("toCacheManager")
public String toCacheManager(){
return "system/cache/cacheManager";
}
}

@ -1,15 +1,16 @@
package com.yeqifu.sys.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* InnoDB free: 9216 kB
@ -22,6 +23,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_dept")
@ToString
public class Dept implements Serializable {
private static final long serialVersionUID=1L;

@ -1,18 +1,18 @@
package com.yeqifu.sys.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* InnoDB free: 9216 kB; (`deptid`) REFER `warehouse/sys_dept`(`id`) ON UPDATE CASC
@ -25,6 +25,7 @@ import org.springframework.format.annotation.DateTimeFormat;
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user")
@ToString
public class User implements Serializable {
private static final long serialVersionUID=1L;

@ -0,0 +1,135 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="icon" href="/resources/favicon.ico">
<link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}"
media="all"/>
<link rel="stylesheet" href="resources/css/public.css" th:href="@{/resources/css/public.css}" media="all"/>
</head>
<body class="childrenBody">
<!---->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;">
<legend></legend>
</fieldset>
<!---->
<div>
<table class="layui-hide" id="cacheTable" lay-filter="cacheTable"></table>
<div id="cacheToolBar" style="display: none">
<button type="button" lay-event="syncCache" shiro:hasPermission="cache:syncCache" class="layui-btn layui-btn-sm layui-btn-normal layui-btn-radius">
<i class="layui-icon layui-icon-add-1"></i>
</button>
<button type="button" lay-event="removeAllCache" shiro:hasPermission="cache:removeAllCache" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius">
<i class="layui-icon layui-icon-delete"></i>
</button>
</div>
<div id="cacheRowBar" style="display: none;">
<button type="button" lay-event="delete" shiro:hasPermission="cache:delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i
class="layui-icon layui-icon-delete"></i>
</button>
</div>
</div>
<script type="text/javascript" src="/resources/layui/layui.js"></script>
<script type="text/javascript">
layui.use(['jquery', 'form', 'layer', 'table'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
var table = layui.table;
//初始化表格 加载数据
var tableIns = table.render({
elem: "#cacheTable",
title: "缓存数据表格",
url: "/cache/loadAllCache",
toolbar: "#cacheToolBar",
page: true,
cols: [ [
{field: 'key', title: '键', align: 'center',width:'100'},
{field: 'value', title: '值', align: 'center',width:'1100'},
{fixed: 'right', title: '', toolbar: '#cacheRowBar', align: 'center',width:'100'}
] ]
});
//监控工具条事件
table.on("toolbar(cacheTable)", function (obj) {
switch (obj.event) {
case 'removeAllCache':
removeAllCache();
break;
case 'syncCache':
syncCache();
break;
};
});
//监控行工具条事件
table.on("tool(cacheTable)",function (obj) {
//获取当前行数据
var data = obj.data;
switch (obj.event){
case 'delete':
deleteCache(data);
break;
};
});
//清除所有缓存
function removeAllCache() {
layer.confirm('',{icon: 3,title:''},function (index) {
$.post("/cache/removeAllCache",function (res) {
if (res.code==200){
tableIns.reload();
}
layer.msg(res.msg);
});
});
}
//同步缓存
function syncCache() {
layer.confirm('',{icon: 3,title:''},function (index) {
$.post("/cache/syncCache",function (res) {
if (res.code==200){
tableIns.reload();
}
layer.msg(res.msg);
});
});
}
//删除
function deleteCache(data) {
layer.confirm(''+data.key+'',{icon: 3,title:''},function (index) {
$.post("/cache/deleteCache",{key:data.key},function (res) {
if (res.code==200){
tableIns.reload();
}
layer.msg(res.msg);
});
layer.close(index);
});
}
});
</script>
</body>
</html>
Loading…
Cancel
Save