This commit is contained in:
Quieter 2020-09-14 21:41:39 +08:00
parent 379bae20ae
commit 6f4f2e2049
8 changed files with 131 additions and 174 deletions

36
pom.xml
View File

@ -18,7 +18,6 @@
<java.version>1.8</java.version> <java.version>1.8</java.version>
<shiro.version>1.6.0</shiro.version> <shiro.version>1.6.0</shiro.version>
<thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version> <thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version>
<mybatis.boot.version>1.3.2</mybatis.boot.version>
<druid.version>1.1.22</druid.version> <druid.version>1.1.22</druid.version>
<bitwalker.version>1.19</bitwalker.version> <bitwalker.version>1.19</bitwalker.version>
<kaptcha.version>2.3.2</kaptcha.version> <kaptcha.version>2.3.2</kaptcha.version>
@ -30,6 +29,7 @@
<commons.fileupload.version>1.3.3</commons.fileupload.version> <commons.fileupload.version>1.3.3</commons.fileupload.version>
<poi.version>3.17</poi.version> <poi.version>3.17</poi.version>
<velocity.version>1.7</velocity.version> <velocity.version>1.7</velocity.version>
<querydsl.version>4.2.1</querydsl.version>
</properties> </properties>
<!-- 依赖声明 --> <!-- 依赖声明 -->
@ -202,6 +202,12 @@
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
@ -215,13 +221,31 @@
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>
<dependencies>
</dependencies>
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>

View File

@ -79,6 +79,17 @@
<artifactId>ruoyi-generator</artifactId> <artifactId>ruoyi-generator</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-hibernate5 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -49,11 +49,8 @@ public class SysUserOnlineController extends BaseController
@RequiresPermissions("monitor:online:list") @RequiresPermissions("monitor:online:list")
@PostMapping("/list") @PostMapping("/list")
@ResponseBody @ResponseBody
public TableDataInfo list(SysUserOnline userOnline) public TableDataInfo list(SysUserOnline userOnline) {
{ return getDataTable(userOnlineService.selectUserOnlineList(userOnline, getPageRequest()));
startPage();
List<SysUserOnline> list = userOnlineService.selectUserOnlineList(userOnline);
return getDataTable(list);
} }
@RequiresPermissions(value = { "monitor:online:batchForceLogout", "monitor:online:forceLogout" }, logical = Logical.OR) @RequiresPermissions(value = { "monitor:online:batchForceLogout", "monitor:online:forceLogout" }, logical = Logical.OR)

View File

@ -101,6 +101,23 @@
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
</dependency> </dependency>
<!-- spring.data.jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -46,34 +46,6 @@ public class BaseController {
}); });
} }
/**
* 设置请求分页数据
*/
protected void startPage()
{
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
{
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.startPage(pageNum, pageSize, orderBy);
}
}
/**
* 设置请求排序数据
*/
protected void startOrderBy()
{
PageDomain pageDomain = TableSupport.buildPageRequest();
if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
{
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.orderBy(orderBy);
}
}
/** /**
* 获取request * 获取request
*/ */

View File

@ -1,69 +0,0 @@
package com.ruoyi.framework.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* Mybatis支持*匹配扫描包
*
* @author ruoyi
*/
@Configuration
public class MyBatisConfig {
@Autowired
private Environment env;
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
public static String setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
List<String> allResult = new ArrayList<String>();
try {
for (String aliasesPackage : typeAliasesPackage.split(",")) {
List<String> result = new ArrayList<String>();
aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
Resource[] resources = resolver.getResources(aliasesPackage);
if (resources != null && resources.length > 0) {
MetadataReader metadataReader = null;
for (Resource resource : resources) {
if (resource.isReadable()) {
metadataReader = metadataReaderFactory.getMetadataReader(resource);
try {
result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
if (result.size() > 0) {
HashSet<String> hashResult = new HashSet<String>(result);
allResult.addAll(hashResult);
}
}
if (allResult.size() > 0) {
typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
} else {
throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
}
} catch (IOException e) {
e.printStackTrace();
}
return typeAliasesPackage;
}
}

View File

@ -3,6 +3,8 @@ package com.ruoyi.system.service;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/** /**
* 在线用户 服务层 * 在线用户 服务层
@ -40,7 +42,7 @@ public interface ISysUserOnlineService
* *
* @param online 会话信息 * @param online 会话信息
*/ */
public void saveOnline(SysUserOnline online); public SysUserOnline saveOnline(SysUserOnline online);
/** /**
* 查询会话集合 * 查询会话集合
@ -48,7 +50,7 @@ public interface ISysUserOnlineService
* @param userOnline 分页参数 * @param userOnline 分页参数
* @return 会话集合 * @return 会话集合
*/ */
public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline); public Page<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline, Pageable pageable);
/** /**
* 强退用户 * 强退用户

View File

@ -1,123 +1,128 @@
package com.ruoyi.system.service.impl; package com.ruoyi.system.service.impl;
import com.ruoyi.common.base.BaseService;
import java.io.Serializable; import com.ruoyi.common.constant.ShiroConstants;
import java.util.Date; import com.ruoyi.common.utils.StringUtils;
import java.util.Deque; import com.ruoyi.system.domain.SysUserOnline;
import java.util.List; import com.ruoyi.system.repository.SysUserOnlineRepository;
import com.ruoyi.system.service.ISysUserOnlineService;
import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.ehcache.EhCacheManager; import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.ShiroConstants; import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils; import javax.persistence.criteria.CriteriaBuilder;
import com.ruoyi.system.domain.SysUserOnline; import javax.persistence.criteria.CriteriaQuery;
import com.ruoyi.system.mapper.SysUserOnlineMapper; import javax.persistence.criteria.Predicate;
import com.ruoyi.system.service.ISysUserOnlineService; import javax.persistence.criteria.Root;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Deque;
import java.util.List;
/** /**
* 在线用户 服务层处理 * 在线用户 服务层处理
* *
* @author ruoyi * @author ruoyi
*/ */
@Service @Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService public class SysUserOnlineServiceImpl extends BaseService implements ISysUserOnlineService {
{
@Autowired @Autowired
private SysUserOnlineMapper userOnlineDao; private SysUserOnlineRepository sysUserOnlineRepository;
@Autowired @Autowired
private EhCacheManager ehCacheManager; private EhCacheManager ehCacheManager;
/** /**
* 通过会话序号查询信息 * 通过会话序号查询信息
* *
* @param sessionId 会话ID * @param sessionId 会话ID
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Override @Override
public SysUserOnline selectOnlineById(String sessionId) public SysUserOnline selectOnlineById(String sessionId) {
{ return sysUserOnlineRepository.findById(sessionId).orElse(null);
return userOnlineDao.selectOnlineById(sessionId);
} }
/** /**
* 通过会话序号删除信息 * 通过会话序号删除信息
* *
* @param sessionId 会话ID * @param sessionId 会话ID
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Transactional
@Override @Override
public void deleteOnlineById(String sessionId) public void deleteOnlineById(String sessionId) {
{ sysUserOnlineRepository.deleteById(sessionId);
SysUserOnline userOnline = selectOnlineById(sessionId);
if (StringUtils.isNotNull(userOnline))
{
userOnlineDao.deleteOnlineById(sessionId);
}
} }
/** /**
* 通过会话序号删除信息 * 通过会话序号删除信息
* *
* @param sessions 会话ID集合 * @param sessions 会话ID集合
* @return 在线用户信息 * @return 在线用户信息
*/ */
@Transactional
@Override @Override
public void batchDeleteOnline(List<String> sessions) public void batchDeleteOnline(List<String> sessions) {
{ for (String sessionId : sessions) {
for (String sessionId : sessions) deleteOnlineById(sessionId);
{
SysUserOnline userOnline = selectOnlineById(sessionId);
if (StringUtils.isNotNull(userOnline))
{
userOnlineDao.deleteOnlineById(sessionId);
}
} }
} }
/** /**
* 保存会话信息 * 保存会话信息
* *
* @param online 会话信息 * @param online 会话信息
*/ */
@Override @Override
public void saveOnline(SysUserOnline online) public SysUserOnline saveOnline(SysUserOnline online) {
{ return sysUserOnlineRepository.save(online);
userOnlineDao.saveOnline(online);
} }
/** /**
* 查询会话集合 * 查询会话集合
* *
* @param userOnline 在线用户 * @param userOnline 在线用户
*/ */
@Override @Override
public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline) public Page<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline, Pageable pageable) {
{ return sysUserOnlineRepository.findAll(getSpecification(userOnline), pageable);
return userOnlineDao.selectUserOnlineList(userOnline); }
private Specification<SysUserOnline> getSpecification(SysUserOnline userOnline){
return new Specification<SysUserOnline>() {
@Override
public Predicate toPredicate(Root<SysUserOnline> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if(StringUtils.isNotEmpty(userOnline.getIpaddr())){
predicates.add(criteriaBuilder.like(root.get("ipaddr").as(String.class), "%" + userOnline.getIpaddr() + "%"));
}
if(StringUtils.isNotEmpty(userOnline.getLoginName())){
predicates.add(criteriaBuilder.like(root.get("loginName").as(String.class), "%" + userOnline.getLoginName() + "%"));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
} }
/** /**
* 强退用户 * 强退用户
* *
* @param sessionId 会话ID * @param sessionId 会话ID
*/ */
@Transactional
@Override @Override
public void forceLogout(String sessionId) public void forceLogout(String sessionId) {
{ deleteOnlineById(sessionId);
userOnlineDao.deleteOnlineById(sessionId);
} }
/**
* 清理用户缓存
*
* @param loginName 登录名称
* @param sessionId 会话ID
*/
@Override @Override
public void removeUserCache(String loginName, String sessionId) public void removeUserCache(String loginName, String sessionId) {
{
Cache<String, Deque<Serializable>> cache = ehCacheManager.getCache(ShiroConstants.SYS_USERCACHE); Cache<String, Deque<Serializable>> cache = ehCacheManager.getCache(ShiroConstants.SYS_USERCACHE);
Deque<Serializable> deque = cache.get(loginName); Deque<Serializable> deque = cache.get(loginName);
if (StringUtils.isEmpty(deque) || deque.size() == 0) if (StringUtils.isEmpty(deque) || deque.size() == 0)
@ -129,13 +134,11 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
/** /**
* 查询会话集合 * 查询会话集合
* *
* @param expiredDate 失效日期 * @param expiredDate 失效日期
*/ */
@Override @Override
public List<SysUserOnline> selectOnlineByExpired(Date expiredDate) public List<SysUserOnline> selectOnlineByExpired(Date expiredDate) {
{ return sysUserOnlineRepository.findByLastAccessTimeLessThanEqual(expiredDate);
String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate);
return userOnlineDao.selectOnlineByExpired(lastAccessTime);
} }
} }