1.增加缓存
This commit is contained in:
parent
ec38f76403
commit
4571408590
25
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheKey.java
vendored
Normal file
25
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheKey.java
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package com.ruoyi.cache.annotation;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* 缓存的关键字ID
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD})
|
||||
@Documented
|
||||
public @interface OrgCacheKey {
|
||||
String id() default "user";
|
||||
/**
|
||||
* 缓存的类型:目前可以是CacheStaffInfo,CacheDeptInfo,CacheCompanyInfo
|
||||
* @return
|
||||
*/
|
||||
OrgCacheTypeNum type() default OrgCacheTypeNum.CacheUserInfo;
|
||||
|
||||
}
|
||||
11
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheTypeNum.java
vendored
Normal file
11
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheTypeNum.java
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package com.ruoyi.cache.annotation;
|
||||
/**
|
||||
* 缓存的类型
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
public enum OrgCacheTypeNum {
|
||||
CacheUserInfo, //员工的cache
|
||||
CacheDeptInfo,//部门的cache
|
||||
|
||||
}
|
||||
25
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheValue.java
vendored
Normal file
25
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/annotation/OrgCacheValue.java
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package com.ruoyi.cache.annotation;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* 获取组织架构的缓存,声明一个pojo的属性映射值
|
||||
* @author Condy
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD})
|
||||
@Documented
|
||||
public @interface OrgCacheValue {
|
||||
//CacheValueNum value() default CacheStaffInfoNum.staffId;
|
||||
String value() default "";
|
||||
String id() default "user";
|
||||
|
||||
}
|
||||
34
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/BaseCache.java
vendored
Normal file
34
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/BaseCache.java
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package com.ruoyi.cache.domain;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.nutz.dao.entity.annotation.Column;
|
||||
import org.nutz.lang.Mirror;
|
||||
|
||||
public class BaseCache {
|
||||
|
||||
/**
|
||||
* POJO转换成Map
|
||||
* @return
|
||||
*/
|
||||
public Map<String,String> toMap(){
|
||||
Mirror<?> mirror = Mirror.me(getClass());
|
||||
Field[] flds = mirror.getFields();
|
||||
Map<String,String> pojoMap=new HashMap<String,String>();
|
||||
for (Field fld : flds) {
|
||||
Object v = mirror.getValue(this, fld);
|
||||
if (null == v) {//等与null就不生成map
|
||||
continue;
|
||||
} else if(fld.isAnnotationPresent(Column.class)){
|
||||
String cv = fld.getAnnotation(Column.class).value();
|
||||
pojoMap.put(cv, v.toString());
|
||||
} else{
|
||||
pojoMap.put(fld.getName(), v.toString());
|
||||
}
|
||||
}
|
||||
return pojoMap;
|
||||
}
|
||||
|
||||
}
|
||||
70
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/CacheSysDept.java
vendored
Normal file
70
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/CacheSysDept.java
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
package com.ruoyi.cache.domain;
|
||||
|
||||
import com.ruoyi.system.api.domain.SysDept;
|
||||
|
||||
public class CacheSysDept extends BaseCache{
|
||||
/**
|
||||
* @OrgCacheValue的 value类型
|
||||
*/
|
||||
public final static String ANNOTAION_DEPT_ID="deptId";
|
||||
public final static String ANNOTAION_PARENT_ID="parentId";
|
||||
public final static String ANNOTAION_DEPT_NAME="deptName";
|
||||
public final static String ANNOTAION_PARENT_NAME="parentName";
|
||||
|
||||
/** 部门ID */
|
||||
private Long deptId;
|
||||
|
||||
/** 父部门ID */
|
||||
private Long parentId;
|
||||
|
||||
/** 部门名称 */
|
||||
private String deptName;
|
||||
|
||||
/** 父部门名称 */
|
||||
private String parentName;
|
||||
|
||||
public CacheSysDept(SysDept dept) {
|
||||
this.deptId=dept.getDeptId();
|
||||
this.parentId=dept.getParentId();
|
||||
this.deptName=dept.getDeptName();
|
||||
this.parentName=dept.getParentName();
|
||||
}
|
||||
|
||||
public CacheSysDept() {
|
||||
|
||||
}
|
||||
|
||||
public Long getDeptId() {
|
||||
return deptId;
|
||||
}
|
||||
|
||||
public void setDeptId(Long deptId) {
|
||||
this.deptId = deptId;
|
||||
}
|
||||
|
||||
public Long getParentId() {
|
||||
return parentId;
|
||||
}
|
||||
|
||||
public void setParentId(Long parentId) {
|
||||
this.parentId = parentId;
|
||||
}
|
||||
|
||||
public String getDeptName() {
|
||||
return deptName;
|
||||
}
|
||||
|
||||
public void setDeptName(String deptName) {
|
||||
this.deptName = deptName;
|
||||
}
|
||||
|
||||
public String getParentName() {
|
||||
return parentName;
|
||||
}
|
||||
|
||||
public void setParentName(String parentName) {
|
||||
this.parentName = parentName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
77
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/CacheSysUser.java
vendored
Normal file
77
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/domain/CacheSysUser.java
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
package com.ruoyi.cache.domain;
|
||||
|
||||
import com.ruoyi.system.api.domain.SysUser;
|
||||
/**
|
||||
* 存储在redis上的用户缓存
|
||||
* @author condy
|
||||
*
|
||||
*/
|
||||
public class CacheSysUser extends BaseCache {
|
||||
/**
|
||||
* @OrgCacheValue的 value类型
|
||||
*/
|
||||
public final static String ANNOTAION_USER_ID="userId";
|
||||
public final static String ANNOTAION_USER_NAME="userName";
|
||||
public final static String ANNOTAION_DEPT_ID="deptId";
|
||||
public final static String ANNOTAION_EMAIL="email";
|
||||
public final static String ANNOTAION_PHONENUMBER="phonenumber";
|
||||
|
||||
|
||||
|
||||
private Long userId;
|
||||
private String userName;
|
||||
private Long deptId;
|
||||
private String nickName;
|
||||
private String email;
|
||||
private String phonenumber;
|
||||
|
||||
public CacheSysUser(SysUser user) {
|
||||
this.userId=user.getUserId();
|
||||
this.userName=user.getUserName();
|
||||
this.deptId=user.getDeptId();
|
||||
this.nickName=user.getNickName();
|
||||
this.email=user.getEmail();
|
||||
this.phonenumber=user.getEmail();
|
||||
}
|
||||
public CacheSysUser()
|
||||
{
|
||||
|
||||
}
|
||||
public Long getUserId() {
|
||||
return userId;
|
||||
}
|
||||
public void setUserId(Long userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
public Long getDeptId() {
|
||||
return deptId;
|
||||
}
|
||||
public void setDeptId(Long deptId) {
|
||||
this.deptId = deptId;
|
||||
}
|
||||
public String getNickName() {
|
||||
return nickName;
|
||||
}
|
||||
public void setNickName(String nickName) {
|
||||
this.nickName = nickName;
|
||||
}
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
public String getPhonenumber() {
|
||||
return phonenumber;
|
||||
}
|
||||
public void setPhonenumber(String phonenumber) {
|
||||
this.phonenumber = phonenumber;
|
||||
}
|
||||
|
||||
}
|
||||
179
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/service/CacheCallBack.java
vendored
Normal file
179
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/service/CacheCallBack.java
vendored
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
package com.ruoyi.cache.service;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.nutz.lang.ContinueLoop;
|
||||
import org.nutz.lang.Each;
|
||||
import org.nutz.lang.ExitLoop;
|
||||
import org.nutz.lang.LoopException;
|
||||
import org.nutz.lang.Mirror;
|
||||
import org.nutz.log.Log;
|
||||
import org.nutz.log.Logs;
|
||||
|
||||
import com.ruoyi.cache.annotation.OrgCacheKey;
|
||||
import com.ruoyi.cache.annotation.OrgCacheTypeNum;
|
||||
import com.ruoyi.cache.annotation.OrgCacheValue;
|
||||
import com.ruoyi.cache.domain.BaseCache;
|
||||
import com.ruoyi.cache.domain.CacheSysDept;
|
||||
import com.ruoyi.cache.domain.CacheSysUser;
|
||||
import com.ruoyi.common.core.utils.SpringUtils;
|
||||
|
||||
/**
|
||||
* @OrgCacheKey
|
||||
* @OrgCacheValue的注解的处理类
|
||||
* @author
|
||||
*
|
||||
* @param <T>
|
||||
*/
|
||||
public class CacheCallBack<T> implements Each<T> {
|
||||
private Log log=Logs.get();
|
||||
private class InnerCacheCallBack {
|
||||
//@OrgCacheKey的注解的属性
|
||||
private Field orgCacheKeyField;
|
||||
private OrgCacheKey orgCacheKey;// @OrgCacheKey对象
|
||||
//与OrgCacheKey的key相关的OrgCacheValue注解对象及对象的Field
|
||||
private Map<OrgCacheValue,Field> orgCacheValueFieldMap=new HashMap<OrgCacheValue,Field>();
|
||||
//CacheStaffInfo,CacheDeptInfo,CacheCopanyInfo的放射封装类
|
||||
private Mirror<?> cacheBaseMirror;
|
||||
public Field getOrgCacheKeyField() {
|
||||
return orgCacheKeyField;
|
||||
}
|
||||
public void setOrgCacheKeyField(Field orgCacheKeyField) {
|
||||
this.orgCacheKeyField = orgCacheKeyField;
|
||||
}
|
||||
|
||||
public Mirror<?> getCacheBaseMirror() {
|
||||
return cacheBaseMirror;
|
||||
}
|
||||
public void setCacheBaseMirror(Mirror<?> cacheBaseMirror) {
|
||||
this.cacheBaseMirror = cacheBaseMirror;
|
||||
}
|
||||
public OrgCacheKey getOrgCacheKey() {
|
||||
return orgCacheKey;
|
||||
}
|
||||
public void setOrgCacheKey(OrgCacheKey orgCacheKey) {
|
||||
this.orgCacheKey = orgCacheKey;
|
||||
}
|
||||
|
||||
public void addOrgCacheValueField(OrgCacheValue orgCacheValue,Field orgCacheValueField){
|
||||
orgCacheValueFieldMap.put(orgCacheValue,orgCacheValueField);
|
||||
}
|
||||
public Map<OrgCacheValue, Field> getOrgCacheValueFieldMap() {
|
||||
return orgCacheValueFieldMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 采用默认的orgCacheService类
|
||||
*/
|
||||
public CacheCallBack(){
|
||||
this.orgCacheService=SpringUtils.getBean(IOrgCacheService.class);
|
||||
}
|
||||
/**
|
||||
* 通过传递参数的方式.
|
||||
* @param orgCacheService
|
||||
*/
|
||||
public CacheCallBack(IOrgCacheService orgCacheService){
|
||||
this.orgCacheService=orgCacheService;
|
||||
}
|
||||
private IOrgCacheService orgCacheService;
|
||||
private Mirror<?> elemirror=null;
|
||||
private Map<String,InnerCacheCallBack> innerCacheCallBackMap=new HashMap<String,InnerCacheCallBack>();
|
||||
|
||||
/**
|
||||
* 初始化循环映射的参数.
|
||||
* @param ele
|
||||
*/
|
||||
private void init(T ele){
|
||||
elemirror = Mirror.me(ele.getClass());//获取ele对象的反射类
|
||||
//获取含有:OrgCacheKey的属性对象,初始化InnerCacheCallBack对象.
|
||||
Field[] orgCacheKeyField=elemirror.getFields(OrgCacheKey.class);
|
||||
for (int i = 0; i < orgCacheKeyField.length; i++) {
|
||||
InnerCacheCallBack innerCacheCallBack=new InnerCacheCallBack();
|
||||
innerCacheCallBack.setOrgCacheKeyField(orgCacheKeyField[i]);
|
||||
innerCacheCallBack.setOrgCacheKey(orgCacheKeyField[i].getAnnotation(OrgCacheKey.class));
|
||||
innerCacheCallBackMap.put(innerCacheCallBack.getOrgCacheKey().id(), innerCacheCallBack);
|
||||
OrgCacheTypeNum typeNum=innerCacheCallBack.getOrgCacheKey().type();
|
||||
switch(typeNum){
|
||||
case CacheUserInfo:
|
||||
innerCacheCallBack.setCacheBaseMirror( Mirror.me(CacheSysUser.class));
|
||||
break;
|
||||
case CacheDeptInfo:
|
||||
innerCacheCallBack.setCacheBaseMirror( Mirror.me(CacheSysDept.class));
|
||||
break;
|
||||
default:
|
||||
log.warnf("无法识别的枚举类型:%s",typeNum.toString());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
Field[] aOrgCacheValueField=elemirror.getFields(OrgCacheValue.class);
|
||||
for (int i = 0; i < aOrgCacheValueField.length; i++) {
|
||||
OrgCacheValue orgCacheValue=aOrgCacheValueField[i].getAnnotation(OrgCacheValue.class);
|
||||
if(innerCacheCallBackMap.containsKey(orgCacheValue.id())){
|
||||
innerCacheCallBackMap.get(orgCacheValue.id()).addOrgCacheValueField(orgCacheValue,aOrgCacheValueField[i]);
|
||||
} else{
|
||||
log.warnf("找不到id:%s对应的Cache对象.请检查的@OrgCacheValue注解 id值,类:%s,属性:%s注解",
|
||||
orgCacheValue.id(),ele.getClass(),aOrgCacheValueField[i].getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void invoke(int index, T ele, int length) throws ExitLoop, ContinueLoop, LoopException {
|
||||
if(elemirror==null){
|
||||
init(ele);
|
||||
}
|
||||
for (Iterator<Map.Entry<String, InnerCacheCallBack>> iterator = innerCacheCallBackMap.entrySet().iterator(); iterator.hasNext();) {
|
||||
/**
|
||||
* 获取BaseCache对象.
|
||||
*/
|
||||
Map.Entry<String, InnerCacheCallBack> type = iterator.next();
|
||||
InnerCacheCallBack innerCacheCallBack=type.getValue();
|
||||
Mirror<?> cacheBaseMirror=innerCacheCallBack.getCacheBaseMirror();
|
||||
Object orgCacheKeyFieldValue=cacheBaseMirror.getValue(ele, innerCacheCallBack.getOrgCacheKeyField());
|
||||
if(orgCacheKeyFieldValue==null)//获取的orgCacheKeyFieldValue 对应的值为null 就不需要在进入后续的循环了.
|
||||
continue;
|
||||
OrgCacheTypeNum typeNum=innerCacheCallBack.getOrgCacheKey().type();
|
||||
BaseCache baseCache=null;
|
||||
switch(typeNum){
|
||||
case CacheUserInfo:
|
||||
baseCache=orgCacheService.getSysUser((Long)orgCacheKeyFieldValue).orElse(null);
|
||||
if(baseCache==null){
|
||||
log.warnf("userId:%s获取到CacheStaffInfo的缓存数据是空。请检查Redis服务器.",orgCacheKeyFieldValue);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case CacheDeptInfo:
|
||||
baseCache=orgCacheService.getDeptInfo((Long)orgCacheKeyFieldValue).orElse(null);
|
||||
if(baseCache==null){
|
||||
log.warnf("deptId:%s获取到CacheDeptInfo的缓存数据是空。请检查Redis服务器.",orgCacheKeyFieldValue);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
log.warnf("无法识别的枚举类型:%s",typeNum.toString());
|
||||
continue;
|
||||
|
||||
}
|
||||
/**
|
||||
* 将BaseCache对象的值设置到ele对象里面.
|
||||
*/
|
||||
for (Iterator<Map.Entry<OrgCacheValue,Field>> iterator2 = innerCacheCallBack.getOrgCacheValueFieldMap().entrySet().iterator(); iterator2.hasNext();) {
|
||||
Map.Entry<OrgCacheValue,Field> type2 = iterator2.next();
|
||||
OrgCacheValue orgCacheValue=type2.getKey();
|
||||
Field orgCacheValueField=type2.getValue();
|
||||
Object orgCacheValueFieldValue=cacheBaseMirror.getValue(baseCache, orgCacheValue.value());
|
||||
elemirror.setValue(ele, orgCacheValueField, orgCacheValueFieldValue);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
58
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/service/IOrgCacheService.java
vendored
Normal file
58
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/cache/service/IOrgCacheService.java
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package com.ruoyi.cache.service;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import com.ruoyi.cache.domain.CacheSysDept;
|
||||
import com.ruoyi.cache.domain.CacheSysUser;
|
||||
|
||||
/**
|
||||
* 组织架构的缓存类
|
||||
* 一级缓存,本地ecache缓存. 二级缓存:redis缓存.
|
||||
* @author Condy
|
||||
*
|
||||
*/
|
||||
public interface IOrgCacheService {
|
||||
|
||||
/**
|
||||
* 把员工信息存储到redis服务器上.
|
||||
* @param staffInfo
|
||||
* @return
|
||||
*/
|
||||
public CacheSysUser saveSysUser(CacheSysUser cacheSysUser);
|
||||
|
||||
/**
|
||||
* 删除员工
|
||||
* @param userId
|
||||
*/
|
||||
public void deleteSysUser(Long userId);
|
||||
|
||||
/**
|
||||
* 从redis上获取员工信息,先读取ecache缓存,没有的话到redis服务器读取.
|
||||
* @param staffId
|
||||
* @return CacheStaffInfo 取不到staffId对应的信息时会返回null
|
||||
*/
|
||||
public Optional<CacheSysUser> getSysUser(long userId);
|
||||
|
||||
/**
|
||||
* 从redis服务器中获取部门信息.
|
||||
* @param deptId
|
||||
* @return 如果取不到部门信息会返回null
|
||||
*/
|
||||
public Optional<CacheSysDept> getDeptInfo(long deptId);
|
||||
|
||||
/**
|
||||
* 将部门数据存储到redis缓存中
|
||||
* @param cacheDeptInfo
|
||||
* @return
|
||||
*/
|
||||
public CacheSysDept saveDeptInfo(CacheSysDept cacheDeptInfo);
|
||||
/**
|
||||
* 删除部分
|
||||
* @param deptId
|
||||
*/
|
||||
public void deleteDeptInfo(Long deptId);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package com.ruoyi.system;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.ruoyi.common.redis.service.RedisService;
|
||||
import com.ruoyi.util.RedisNotifyService;
|
||||
import com.ruoyi.util.SpringLoadComplete;
|
||||
|
||||
@Configuration
|
||||
@EnableCaching
|
||||
@Component
|
||||
public class CacheConfigurer {
|
||||
@Autowired
|
||||
private RedisService redisService;
|
||||
@Bean
|
||||
public SpringLoadComplete getSpringLoadComplete() {
|
||||
return new SpringLoadComplete();
|
||||
}
|
||||
@Bean
|
||||
public RedisNotifyService getRedisNotifyService() {
|
||||
RedisNotifyService notifyService= new RedisNotifyService(redisService);
|
||||
return notifyService;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
package com.ruoyi.system.service.impl;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.nutz.lang.util.NutMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.CachePut;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.ruoyi.cache.domain.CacheSysDept;
|
||||
import com.ruoyi.cache.domain.CacheSysUser;
|
||||
import com.ruoyi.cache.service.IOrgCacheService;
|
||||
import com.ruoyi.common.redis.service.RedisService;
|
||||
import com.ruoyi.system.api.domain.SysDept;
|
||||
import com.ruoyi.system.api.domain.SysUser;
|
||||
import com.ruoyi.system.mapper.SysDeptMapper;
|
||||
import com.ruoyi.system.mapper.SysUserMapper;
|
||||
import com.ruoyi.util.IDUtil;
|
||||
import com.ruoyi.util.IRedisNotifyHandle;
|
||||
import com.ruoyi.util.RedisNotifyService;
|
||||
@Component
|
||||
/**
|
||||
* 处理组织架构的缓存
|
||||
* @author condy
|
||||
*
|
||||
*/
|
||||
public class OrgCacheServiceImpl implements IOrgCacheService,IRedisNotifyHandle {
|
||||
|
||||
@Autowired
|
||||
private RedisService redisService;
|
||||
@Autowired
|
||||
private RedisNotifyService redisNotifyService;
|
||||
@Autowired
|
||||
private CacheManager cacheManager;
|
||||
@Autowired
|
||||
private SysDeptMapper sysDeptMapper;
|
||||
@Autowired
|
||||
private SysUserMapper sysUserMapper;
|
||||
|
||||
private final String USER_PRE="RUOYI_USER:";
|
||||
private final String DEPT_PRE="RUOYI_DEPT:";
|
||||
|
||||
private long selfId=IDUtil.getId();
|
||||
private Logger log=LoggerFactory.getLogger(getClass());
|
||||
public OrgCacheServiceImpl() {
|
||||
RedisNotifyService.register(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CachePut(value="org",key="'RUOYI_USER:'+#cacheSysUser.getUserId()")
|
||||
public CacheSysUser saveSysUser(CacheSysUser cacheSysUser) {
|
||||
if(cacheSysUser==null || cacheSysUser.getUserId()==null) {
|
||||
log.warn("保存员工到缓存错误, 员工ID是空的");
|
||||
return null;
|
||||
}
|
||||
redisService.setCacheObject(USER_PRE+cacheSysUser.getUserId(), cacheSysUser);
|
||||
NutMap params=NutMap.NEW().addv("type", "RUOYI_USER").addv("userId", cacheSysUser.getUserId());
|
||||
params.addv("selfId", selfId);
|
||||
redisNotifyService.publish(getRegisterId(), params);
|
||||
return cacheSysUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value="org",key="'RUOYI_USER:'+#userId")
|
||||
public Optional<CacheSysUser> getSysUser(long userId) {
|
||||
CacheSysUser cacheSysUser=redisService.getCacheObject(USER_PRE+userId);
|
||||
if(cacheSysUser==null) {
|
||||
SysUser sysUser=sysUserMapper.selectUserById(userId);
|
||||
if(sysUser!=null) {
|
||||
cacheSysUser=new CacheSysUser(sysUser);
|
||||
saveSysUser(cacheSysUser);
|
||||
}
|
||||
}
|
||||
return Optional.ofNullable(cacheSysUser);
|
||||
}
|
||||
|
||||
//除非,#result是空,就不缓存
|
||||
@Override
|
||||
@Cacheable(value="org",key="'RUOYI_DEPT:'+#deptId")
|
||||
public Optional<CacheSysDept> getDeptInfo(long deptId) {
|
||||
CacheSysDept cacheSysDept=redisService.getCacheObject(DEPT_PRE+deptId);
|
||||
if(cacheSysDept==null) {
|
||||
SysDept sysDept=sysDeptMapper.selectDeptById(deptId);
|
||||
if(sysDept!=null) {
|
||||
cacheSysDept=new CacheSysDept(sysDept);
|
||||
saveDeptInfo(cacheSysDept);
|
||||
}
|
||||
}
|
||||
return Optional.ofNullable(cacheSysDept);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CachePut(value="org",key="'RUOYI_DEPT:'+#cacheDeptInfo.getDeptId()")
|
||||
public CacheSysDept saveDeptInfo(CacheSysDept cacheDeptInfo) {
|
||||
if(cacheDeptInfo==null || cacheDeptInfo.getDeptId()==null) {
|
||||
log.warn("保存部门到缓存错误, 部门ID是空的");
|
||||
return null;
|
||||
}
|
||||
redisService.setCacheObject(DEPT_PRE+cacheDeptInfo.getDeptId(), cacheDeptInfo);
|
||||
NutMap params=NutMap.NEW().addv("type", "RUOYI_DEPT").addv("deptId", cacheDeptInfo.getDeptId());
|
||||
params.addv("selfId", selfId);
|
||||
redisNotifyService.publish(getRegisterId(), params);
|
||||
return cacheDeptInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(String methodName,NutMap params) {
|
||||
String type=params.getString("type");
|
||||
long notifySelfId=params.getLong("selfId");
|
||||
if(notifySelfId==selfId) {
|
||||
log.info("selfId:{} 是自己发出的,不做任何处理");
|
||||
return ;
|
||||
}
|
||||
if(USER_PRE.substring(0, USER_PRE.length()-1).equals(type)) {
|
||||
log.info("把组织架构的staffId:{}的缓存作废",params.getLong("userId"));
|
||||
cacheManager.getCache("org").evict(USER_PRE+params.getLong("userId"));
|
||||
} else if (DEPT_PRE.substring(0, DEPT_PRE.length()-1).equals(type)) {
|
||||
//把某个部门缓存作废.
|
||||
log.info("把组织架构的deptId:{}的缓存作废",params.getLong("deptId"));
|
||||
cacheManager.getCache("org").evict(DEPT_PRE+params.getLong("deptId"));
|
||||
} else {
|
||||
log.warn("无法识别的type:{}", type);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRegisterId() {
|
||||
return "OrgCacheService";
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(value="org",key="'RUOYI_USER:'+#userId")
|
||||
public void deleteSysUser(Long userId) {
|
||||
if(userId==null) {
|
||||
return ;
|
||||
}
|
||||
redisService.deleteObject(USER_PRE+userId);
|
||||
NutMap params=NutMap.NEW().addv("type", "RUOYI_USER").addv("userId", userId);
|
||||
params.addv("selfId", selfId);
|
||||
redisNotifyService.publish(getRegisterId(), params);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(value="org",key="'RUOYI_DEPT:'+#deptId")
|
||||
public void deleteDeptInfo(Long deptId) {
|
||||
if(deptId==null) {
|
||||
return ;
|
||||
}
|
||||
redisService.deleteObject(DEPT_PRE+deptId);
|
||||
NutMap params=NutMap.NEW().addv("type", "RUOYI_DEPT").addv("deptId", deptId);
|
||||
params.addv("selfId", selfId);
|
||||
redisNotifyService.publish(getRegisterId(), params);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package com.ruoyi.util;
|
||||
|
||||
import org.nutz.lang.util.NutMap;
|
||||
|
||||
/**
|
||||
* 接收到HttpServerRedis消息的处理类
|
||||
* @author 林桦
|
||||
*
|
||||
*/
|
||||
public interface IRedisNotifyHandle {
|
||||
/**
|
||||
* 处理json格式的消息
|
||||
* @param jsonMessage
|
||||
*/
|
||||
public void handle(String method,NutMap params);
|
||||
/**
|
||||
* 获取注册的ID,不同的ID之间不能重复.
|
||||
* @return
|
||||
*/
|
||||
public String getRegisterId();
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.ruoyi.util;
|
||||
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
public interface ISpringLoadComplete {
|
||||
/**
|
||||
* 回调实现类
|
||||
* @param applicationContext
|
||||
*/
|
||||
void callback(ApplicationContext applicationContext);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
package com.ruoyi.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.nutz.json.Json;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.data.redis.connection.Message;
|
||||
import org.springframework.data.redis.connection.MessageListener;
|
||||
import org.springframework.data.redis.listener.PatternTopic;
|
||||
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.ruoyi.common.redis.service.RedisService;
|
||||
|
||||
|
||||
/**
|
||||
* 应用服务器监听从redis上发过来的消息,例如:重读服务的参数,以及一些命令.
|
||||
* @author 林桦
|
||||
*
|
||||
*/
|
||||
@Component
|
||||
public class RedisNotifyService implements MessageListener,ISpringLoadComplete {
|
||||
private static Map<String,IRedisNotifyHandle> registerMap=new HashMap<String,IRedisNotifyHandle>();
|
||||
private static Logger LOGGER=LoggerFactory.getLogger(RedisNotifyService.class);
|
||||
public static final String CHANNEL="ruoyiMessageNotify";
|
||||
|
||||
private RedisService redisService;
|
||||
public RedisNotifyService(RedisService redisService) {
|
||||
this.redisService=redisService;
|
||||
SpringLoadComplete.addCallBack(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册具体方法
|
||||
* @param redisHandle
|
||||
* @return
|
||||
*/
|
||||
public static boolean register(IRedisNotifyHandle redisHandle){
|
||||
if(registerMap.containsKey(redisHandle.getRegisterId())){
|
||||
LOGGER.info("已经存在:"+redisHandle.getRegisterId()+",无法注册成功!");
|
||||
return false;
|
||||
}else{
|
||||
LOGGER.info("注册ID:"+redisHandle.getRegisterId()+",注册成功,处理类:"+redisHandle.getClass());
|
||||
registerMap.put(redisHandle.getRegisterId(), redisHandle);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* 取消注册.
|
||||
* @param redisHandle
|
||||
* @return
|
||||
*/
|
||||
public static boolean unRegister(IRedisNotifyHandle redisHandle){
|
||||
return unRegister(redisHandle.getRegisterId());
|
||||
}
|
||||
/**
|
||||
* 取消注册
|
||||
* @param registerId
|
||||
* @return
|
||||
*/
|
||||
public static boolean unRegister(String registerId){
|
||||
if(registerId==null)
|
||||
return false;
|
||||
if(registerMap.containsKey(registerId)){
|
||||
LOGGER.info("注册ID:"+registerId+",取消注册成功!");
|
||||
registerMap.remove(registerId);
|
||||
return true;
|
||||
} else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 判断是否有注册
|
||||
* @param registerId
|
||||
* @return
|
||||
*/
|
||||
public static boolean containRedisHandle(String registerId){
|
||||
if(registerId==null)
|
||||
return false;
|
||||
return registerMap.containsKey(registerId);
|
||||
}
|
||||
/**
|
||||
* 判断是否有注册.
|
||||
* @param redisHandle
|
||||
* @return
|
||||
*/
|
||||
public static boolean containRedisHandle(IRedisNotifyHandle redisHandle){
|
||||
return containRedisHandle(redisHandle.getRegisterId());
|
||||
}
|
||||
/**
|
||||
* 发送JsonRpc
|
||||
* @param method 方法名
|
||||
* @param params params的参数
|
||||
*/
|
||||
public void publish(String method,NutMap params) {
|
||||
NutMap jsonRpc=NutMap.NEW().addv("method", method).addv("params", params);
|
||||
redisService.redisTemplate.convertAndSend(CHANNEL,Json.toJson(jsonRpc) );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onMessage(Message message, byte[] pattern) {
|
||||
/**
|
||||
* Message的消息类型:{ "method": "sayHello", "params": ["Hello JSON-RPC"], "id": 1}
|
||||
*/
|
||||
try {
|
||||
NutMap jsonMessage=Json.fromJson(NutMap.class,new String(message.getBody(),"UTF-8"));
|
||||
String registerId=jsonMessage.getString("method",null);
|
||||
if(containRedisHandle(registerId)){
|
||||
IRedisNotifyHandle redisHandle=registerMap.get(registerId);
|
||||
if("casLogout".equals(registerId)) //签出的消息比多,更改为debug级别.
|
||||
LOGGER.debug("recive httpServerRedis message:"+message+",submit to handle class:"+redisHandle.getClass());
|
||||
else
|
||||
LOGGER.info("recive httpServerRedis message:"+message+",submit to handle class:"+redisHandle.getClass());
|
||||
NutMap params=Json.fromJson(NutMap.class,jsonMessage.getString("params","{}"));
|
||||
redisHandle.handle(registerId,params);
|
||||
} else{
|
||||
if("casLogout".equals(registerId))
|
||||
LOGGER.debug("recive httpServerRedis message:"+message+",but not find any handle class");
|
||||
else
|
||||
LOGGER.info("recive httpServerRedis message:"+message+",but not find any handle class");
|
||||
}
|
||||
} catch(Exception e) {
|
||||
LOGGER.error("recive httpServerRedis handle error:"+message,e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callback(ApplicationContext applicationContext) {
|
||||
RedisMessageListenerContainer redisMessageListenerContainer=applicationContext.getBean(RedisMessageListenerContainer.class);
|
||||
redisMessageListenerContainer.addMessageListener(this, new PatternTopic(CHANNEL));
|
||||
LOGGER.info("启动监听redis,channel:"+CHANNEL);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
package com.ruoyi.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
/**
|
||||
* spring启动完成,调用回调类
|
||||
* @author condy
|
||||
*
|
||||
*/
|
||||
public class SpringLoadComplete implements ApplicationListener<ContextRefreshedEvent>{
|
||||
|
||||
private static List<ISpringLoadComplete> callbackList=new ArrayList<>();
|
||||
private Logger log=LoggerFactory.getLogger(SpringLoadComplete.class);
|
||||
/**
|
||||
* 将回调方法加入到回调队列
|
||||
* @param callback
|
||||
*/
|
||||
public static void addCallBack(ISpringLoadComplete callback) {
|
||||
if(!callbackList.contains(callback))
|
||||
callbackList.add(callback);
|
||||
}
|
||||
@Override
|
||||
public void onApplicationEvent(ContextRefreshedEvent event) {
|
||||
if(event.getApplicationContext().getParent() == null){
|
||||
try {
|
||||
for (ISpringLoadComplete callback : callbackList) {
|
||||
log.info("Spring启动完成,调用回调处理类:{}",callback);
|
||||
callback.callback(event.getApplicationContext());
|
||||
}
|
||||
} catch(Exception e) {
|
||||
log.error("初始化回调方法错误",e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
|
||||
|
||||
<!-- 磁盘缓存位置 -->
|
||||
<diskStore path="java.io.tmpdir/ehcache"/>
|
||||
|
||||
<!-- 默认缓存 -->
|
||||
<defaultCache
|
||||
maxEntriesLocalHeap="10000"
|
||||
eternal="false"
|
||||
timeToIdleSeconds="120"
|
||||
timeToLiveSeconds="120"
|
||||
maxEntriesLocalDisk="10000000"
|
||||
diskExpiryThreadIntervalSeconds="120"
|
||||
memoryStoreEvictionPolicy="LRU"/>
|
||||
|
||||
<!-- 组织架构的缓存,缓存员工,部门等信息,保留1个小时有效时长 -->
|
||||
<cache name="org"
|
||||
maxEntriesLocalHeap="3000"
|
||||
eternal="false"
|
||||
timeToIdleSeconds="3600"
|
||||
timeToLiveSeconds="3600"
|
||||
maxEntriesLocalDisk="10000000"
|
||||
diskExpiryThreadIntervalSeconds="3600"
|
||||
memoryStoreEvictionPolicy="LRU"/>
|
||||
</ehcache>
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
package com.ruoyi.system.service;
|
||||
|
||||
import com.ruoyi.cache.annotation.OrgCacheKey;
|
||||
import com.ruoyi.cache.annotation.OrgCacheTypeNum;
|
||||
import com.ruoyi.cache.annotation.OrgCacheValue;
|
||||
import com.ruoyi.cache.domain.CacheSysUser;
|
||||
|
||||
public class CacheCallBackPojo {
|
||||
@OrgCacheKey
|
||||
private Long userId;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_DEPT_ID)
|
||||
private Long deptId;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_USER_NAME)
|
||||
private String userName;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_PHONENUMBER)
|
||||
private String phoneNumber;
|
||||
private String detpName;
|
||||
public Long getUserId() {
|
||||
return userId;
|
||||
}
|
||||
public void setUserId(Long userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
public Long getDeptId() {
|
||||
return deptId;
|
||||
}
|
||||
public void setDeptId(Long deptId) {
|
||||
this.deptId = deptId;
|
||||
}
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
public String getDetpName() {
|
||||
return detpName;
|
||||
}
|
||||
public void setDetpName(String detpName) {
|
||||
this.detpName = detpName;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CacheCallBackPojo [userId=" + userId + ", deptId=" + deptId + ", userName=" + userName
|
||||
+ ", phoneNumber=" + phoneNumber + ", detpName=" + detpName + "]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
package com.ruoyi.system.service;
|
||||
|
||||
import com.ruoyi.cache.annotation.OrgCacheKey;
|
||||
import com.ruoyi.cache.annotation.OrgCacheTypeNum;
|
||||
import com.ruoyi.cache.annotation.OrgCacheValue;
|
||||
import com.ruoyi.cache.domain.CacheSysDept;
|
||||
import com.ruoyi.cache.domain.CacheSysUser;
|
||||
|
||||
public class CacheCallBackPojo2 {
|
||||
@OrgCacheKey(id = "user",type = OrgCacheTypeNum.CacheUserInfo)
|
||||
private Long userId;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_DEPT_ID)
|
||||
@OrgCacheKey(id = "dept",type = OrgCacheTypeNum.CacheDeptInfo)
|
||||
private Long deptId;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_USER_NAME)
|
||||
private String userName;
|
||||
@OrgCacheValue(value = CacheSysUser.ANNOTAION_PHONENUMBER)
|
||||
private String phoneNumber;
|
||||
@OrgCacheValue(id="dept",value = CacheSysDept.ANNOTAION_DEPT_NAME)
|
||||
private String detpName;
|
||||
public Long getUserId() {
|
||||
return userId;
|
||||
}
|
||||
public void setUserId(Long userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
public Long getDeptId() {
|
||||
return deptId;
|
||||
}
|
||||
public void setDeptId(Long deptId) {
|
||||
this.deptId = deptId;
|
||||
}
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
public String getDetpName() {
|
||||
return detpName;
|
||||
}
|
||||
public void setDetpName(String detpName) {
|
||||
this.detpName = detpName;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CacheCallBackPojo [userId=" + userId + ", deptId=" + deptId + ", userName=" + userName
|
||||
+ ", phoneNumber=" + phoneNumber + ", detpName=" + detpName + "]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package com.ruoyi.system.service;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.nutz.lang.Lang;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import com.ruoyi.cache.service.CacheCallBack;
|
||||
import com.ruoyi.cache.service.IOrgCacheService;
|
||||
@SpringBootTest
|
||||
class CacheCallBackTest {
|
||||
|
||||
@Autowired
|
||||
private IOrgCacheService orgCacheService;
|
||||
@Test
|
||||
void testInvoke() {
|
||||
CacheCallBackPojo pojo=new CacheCallBackPojo();
|
||||
pojo.setUserId(1L);
|
||||
Lang.each(Lang.list(pojo), new CacheCallBack<>());
|
||||
assertNotNull(pojo.getUserName());
|
||||
System.out.println(pojo.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInvoke2() {
|
||||
CacheCallBackPojo2 pojo=new CacheCallBackPojo2();
|
||||
pojo.setUserId(1L);
|
||||
pojo.setDeptId(103L);
|
||||
Lang.each(Lang.list(pojo), new CacheCallBack<>());
|
||||
assertNotNull(pojo.getUserName());
|
||||
System.out.println(pojo.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package com.ruoyi.system.service.impl;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import com.ruoyi.common.core.constant.SecurityConstants;
|
||||
import com.ruoyi.common.core.context.SecurityContextHolder;
|
||||
import com.ruoyi.system.domain.BulletinInfo;
|
||||
import com.ruoyi.system.service.IBulletinInfoService;
|
||||
@SpringBootTest
|
||||
class BulletinInfoServiceImplTest {
|
||||
|
||||
@Autowired
|
||||
private IBulletinInfoService bulletinInfoService;
|
||||
@BeforeEach
|
||||
void setUser() {
|
||||
SecurityContextHolder.set(SecurityConstants.DETAILS_USER_ID, 1);
|
||||
|
||||
}
|
||||
@Test
|
||||
void testSelectBulletinInfoList() {
|
||||
BulletinInfo bulletinInfo=new BulletinInfo();
|
||||
bulletinInfo.setSts("C");
|
||||
List<BulletinInfo> list=bulletinInfoService.selectBulletinInfoList(bulletinInfo);
|
||||
assertTrue(list.size()>0);
|
||||
System.out.println("aaaaaaaaaaaaaaaa:"+list.get(0).getCreateUserId()+"="+list.get(0).getCreateBy());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# Tomcat
|
||||
server:
|
||||
port: 9201
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
application:
|
||||
# 应用名称
|
||||
name: ruoyi-system
|
||||
profiles:
|
||||
# 环境配置
|
||||
active: dev
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
# 服务注册地址
|
||||
server-addr: 192.168.0.17:8848
|
||||
config:
|
||||
# 配置中心地址
|
||||
server-addr: 192.168.0.17:8848
|
||||
# 配置文件格式
|
||||
file-extension: yml
|
||||
# 共享配置
|
||||
shared-configs:
|
||||
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
Loading…
Reference in New Issue