This commit is contained in:
parent
379bae20ae
commit
6f4f2e2049
36
pom.xml
36
pom.xml
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* 强退用户
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue