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>
<shiro.version>1.6.0</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>
<bitwalker.version>1.19</bitwalker.version>
<kaptcha.version>2.3.2</kaptcha.version>
@ -30,6 +29,7 @@
<commons.fileupload.version>1.3.3</commons.fileupload.version>
<poi.version>3.17</poi.version>
<velocity.version>1.7</velocity.version>
<querydsl.version>4.2.1</querydsl.version>
</properties>
<!-- 依赖声明 -->
@ -202,6 +202,12 @@
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -215,13 +221,31 @@
</modules>
<packaging>pom</packaging>
<dependencies>
</dependencies>
<build>
<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>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>

View File

@ -79,6 +79,17 @@
<artifactId>ruoyi-generator</artifactId>
</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>
<build>

View File

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

View File

@ -101,6 +101,23 @@
<artifactId>javax.servlet-api</artifactId>
</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>
</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
*/

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.List;
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 会话信息
*/
public void saveOnline(SysUserOnline online);
public SysUserOnline saveOnline(SysUserOnline online);
/**
* 查询会话集合
@ -48,7 +50,7 @@ public interface ISysUserOnlineService
* @param userOnline 分页参数
* @return 会话集合
*/
public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline);
public Page<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline, Pageable pageable);
/**
* 强退用户

View File

@ -1,19 +1,28 @@
package com.ruoyi.system.service.impl;
import java.io.Serializable;
import java.util.Date;
import java.util.Deque;
import java.util.List;
import com.ruoyi.common.base.BaseService;
import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.repository.SysUserOnlineRepository;
import com.ruoyi.system.service.ISysUserOnlineService;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.ehcache.EhCacheManager;
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 com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.mapper.SysUserOnlineMapper;
import com.ruoyi.system.service.ISysUserOnlineService;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
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;
/**
* 在线用户 服务层处理
@ -21,11 +30,10 @@ import com.ruoyi.system.service.ISysUserOnlineService;
* @author ruoyi
*/
@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService
{
@Autowired
private SysUserOnlineMapper userOnlineDao;
public class SysUserOnlineServiceImpl extends BaseService implements ISysUserOnlineService {
@Autowired
private SysUserOnlineRepository sysUserOnlineRepository;
@Autowired
private EhCacheManager ehCacheManager;
@ -36,9 +44,8 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @return 在线用户信息
*/
@Override
public SysUserOnline selectOnlineById(String sessionId)
{
return userOnlineDao.selectOnlineById(sessionId);
public SysUserOnline selectOnlineById(String sessionId) {
return sysUserOnlineRepository.findById(sessionId).orElse(null);
}
/**
@ -47,14 +54,10 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @param sessionId 会话ID
* @return 在线用户信息
*/
@Transactional
@Override
public void deleteOnlineById(String sessionId)
{
SysUserOnline userOnline = selectOnlineById(sessionId);
if (StringUtils.isNotNull(userOnline))
{
userOnlineDao.deleteOnlineById(sessionId);
}
public void deleteOnlineById(String sessionId) {
sysUserOnlineRepository.deleteById(sessionId);
}
/**
@ -63,16 +66,11 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @param sessions 会话ID集合
* @return 在线用户信息
*/
@Transactional
@Override
public void batchDeleteOnline(List<String> sessions)
{
for (String sessionId : sessions)
{
SysUserOnline userOnline = selectOnlineById(sessionId);
if (StringUtils.isNotNull(userOnline))
{
userOnlineDao.deleteOnlineById(sessionId);
}
public void batchDeleteOnline(List<String> sessions) {
for (String sessionId : sessions) {
deleteOnlineById(sessionId);
}
}
@ -82,9 +80,8 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @param online 会话信息
*/
@Override
public void saveOnline(SysUserOnline online)
{
userOnlineDao.saveOnline(online);
public SysUserOnline saveOnline(SysUserOnline online) {
return sysUserOnlineRepository.save(online);
}
/**
@ -93,9 +90,24 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @param userOnline 在线用户
*/
@Override
public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline)
{
return userOnlineDao.selectUserOnlineList(userOnline);
public Page<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline, Pageable pageable) {
return sysUserOnlineRepository.findAll(getSpecification(userOnline), pageable);
}
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()]));
}
};
}
/**
@ -103,21 +115,14 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
*
* @param sessionId 会话ID
*/
@Transactional
@Override
public void forceLogout(String sessionId)
{
userOnlineDao.deleteOnlineById(sessionId);
public void forceLogout(String sessionId) {
deleteOnlineById(sessionId);
}
/**
* 清理用户缓存
*
* @param loginName 登录名称
* @param sessionId 会话ID
*/
@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);
Deque<Serializable> deque = cache.get(loginName);
if (StringUtils.isEmpty(deque) || deque.size() == 0)
@ -133,9 +138,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
* @param expiredDate 失效日期
*/
@Override
public List<SysUserOnline> selectOnlineByExpired(Date expiredDate)
{
String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate);
return userOnlineDao.selectOnlineByExpired(lastAccessTime);
public List<SysUserOnline> selectOnlineByExpired(Date expiredDate) {
return sysUserOnlineRepository.findByLastAccessTimeLessThanEqual(expiredDate);
}
}