code refactor

This commit is contained in:
laker
2024-03-29 15:07:41 +08:00
parent 2086a2d3be
commit aaa0ec649d
20 changed files with 118 additions and 120 deletions

View File

@@ -1,6 +1,6 @@
package com.laker.admin.config;
import com.laker.admin.framework.ext.transaction.LakerDataSourceTransactionManager;
import com.laker.admin.framework.ext.transaction.EasyDataSourceTransactionManager;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
@@ -18,7 +18,7 @@ public class EasyTransactionManagerConfig {
@Bean
DataSourceTransactionManager transactionManager(DataSource dataSource,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
DataSourceTransactionManager transactionManager = new LakerDataSourceTransactionManager(dataSource, 500);
DataSourceTransactionManager transactionManager = new EasyDataSourceTransactionManager(dataSource, 500);
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));
return transactionManager;
}

View File

@@ -1,7 +1,7 @@
package com.laker.admin.config.websocket;
import com.laker.admin.framework.ext.websocket.LakerChatHandler;
import com.laker.admin.framework.ext.websocket.LakerSessionHandshakeInterceptor;
import com.laker.admin.framework.ext.websocket.EasyChatHandler;
import com.laker.admin.framework.ext.websocket.EasySessionHandshakeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -18,13 +18,13 @@ import org.springframework.web.socket.server.standard.ServletServerContainerFact
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
LakerChatHandler webSocketHandler;
EasyChatHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/websocket/**")
// 添加拦截器可以获取连接的param和 header 用作认证鉴权
.addInterceptors(new LakerSessionHandshakeInterceptor())
.addInterceptors(new EasySessionHandshakeInterceptor())
// 设置运行跨域
.setAllowedOrigins("*");
}

View File

@@ -13,7 +13,7 @@ import javax.servlet.http.HttpServletResponse;
@RestController
@Slf4j
public class DefaultUncaughtErrorControllor implements ErrorController {
public class EasyDefaultUncaughtErrorControllor implements ErrorController {
@RequestMapping("/error")
public Response<String> error(HttpServletRequest request, HttpServletResponse response) {

View File

@@ -1,4 +1,4 @@
package com.laker.admin.framework.ext.step;
package com.laker.admin.framework.ext.actuator.step;
import io.micrometer.core.instrument.util.NamedThreadFactory;
import io.micrometer.core.instrument.util.TimeUtils;
@@ -10,33 +10,34 @@ import java.util.concurrent.*;
/**
* 按步长 定期存储到任意位置例如db
*
* @author laker
*/
@Slf4j
public class LakerMeterRegistry {
public class EasyMeterRegistry {
private final Object meterMapLock = new Object();
private Duration step;
private final Duration step;
private ScheduledExecutorService scheduledExecutorService;
private final ConcurrentMap<String, StepCounterTuple> meterMap = new ConcurrentHashMap<>();
public LakerMeterRegistry() {
public EasyMeterRegistry() {
this(Duration.ofMillis(1));
}
public LakerMeterRegistry(Duration step) {
public EasyMeterRegistry(Duration step) {
this(step, new NamedThreadFactory("laker-metrics-publisher"));
}
private LakerMeterRegistry(Duration step, ThreadFactory threadFactory) {
private EasyMeterRegistry(Duration step, ThreadFactory threadFactory) {
this.step = step;
start(threadFactory);
}
public StepCounterTuple counter(String videoId) {
String id = "laker:" + videoId;
String id = "easy:" + videoId;
StepCounterTuple multiStepCounter = meterMap.get(id);
if (multiStepCounter == null) {
synchronized (meterMapLock) {
@@ -57,7 +58,7 @@ public class LakerMeterRegistry {
protected void publish() {
Collection<StepCounterTuple> values = meterMap.values();
log.info("---- start 当前map 容量" + values.size());
values.stream().forEach(multiStepCounter -> {
values.forEach(multiStepCounter -> {
long count1 = multiStepCounter.count1();
long count2 = multiStepCounter.count2();
// if 存在无效的数据则删除掉 防止占内存或者 这个另起一个定时任务去删除 定时时长 更久些
@@ -82,7 +83,6 @@ public class LakerMeterRegistry {
log.info("---- end 结束后 map 容量 " + values.size());
}
@@ -94,7 +94,6 @@ public class LakerMeterRegistry {
}
}
public void start(ThreadFactory threadFactory) {
if (scheduledExecutorService != null) {
stop();

View File

@@ -1,4 +1,4 @@
package com.laker.admin.framework.ext.step;
package com.laker.admin.framework.ext.actuator.step;
import java.util.Objects;
import java.util.concurrent.atomic.LongAdder;
@@ -14,7 +14,7 @@ import java.util.concurrent.atomic.LongAdder;
* @author laker
*/
public class StepCounterTuple {
private String id;
private final String id;
private final LongAdder count1 = new LongAdder();
/**
* 可以 自己扩展 count n double n

View File

@@ -7,9 +7,9 @@ import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.useragent.UserAgent;
import com.laker.admin.module.sys.service.ISysUserService;
import com.laker.admin.framework.utils.IP2CityUtil;
import com.laker.admin.framework.utils.EasyHttpRequestUtil;
import com.laker.admin.framework.utils.IP2CityUtil;
import com.laker.admin.module.sys.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -18,13 +18,14 @@ import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
/**
* 自定义侦听器的实现
*/
@Component
@Slf4j
public class MySaTokenListener implements SaTokenListener {
public class EasySaTokenListener implements SaTokenListener {
public static final List<OnlineUser> ONLINE_USERS = new CopyOnWriteArrayList<>();
@Autowired
@@ -158,7 +159,7 @@ public class MySaTokenListener implements SaTokenListener {
try {
try {
// 如果已经被标记为结束
if (refreshFlag == false) {
if (!refreshFlag) {
return;
}
long start = System.currentTimeMillis();
@@ -180,9 +181,9 @@ public class MySaTokenListener implements SaTokenListener {
dataRefreshPeriod = 1;
}
dataRefreshPeriod = dataRefreshPeriod + 5;
Thread.sleep(dataRefreshPeriod * 1000);
TimeUnit.SECONDS.sleep(dataRefreshPeriod);
} catch (Exception e) {
e.printStackTrace();
log.error("定时清理过期会话异常", e);
}
}
});

View File

@@ -0,0 +1,37 @@
package com.laker.admin.framework.ext.satoken;
import cn.dev33.satoken.stp.StpInterface;
import com.laker.admin.module.sys.mapper.SysRoleMapper;
import com.laker.admin.module.sys.mapper.SysRolePowerMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class EasyStpInterfaceImpl implements StpInterface {
@Autowired
SysRolePowerMapper sysRolePowerMapper;
@Autowired
SysRoleMapper sysRoleMapper;
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginKey) {
// 一个优化点事这里可以放进缓存,在用户登出时清除缓存
return sysRolePowerMapper.getPowerCodesByUserIdAndPowerType(Long.valueOf((String) loginId), 2);
}
/**
* 返回一个账号所拥有的角色标识集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginKey) {
// 一个优化点事这里可以放进缓存,在用户登出时清除缓存
return sysRoleMapper.getRoleCodesByUserIdAndRoleType(Long.valueOf((String) loginId), null);
}
}

View File

@@ -1,60 +0,0 @@
package com.laker.admin.framework.ext.satoken;
import cn.dev33.satoken.stp.StpInterface;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.entity.SysRole;
import com.laker.admin.module.sys.entity.SysRolePower;
import com.laker.admin.module.sys.entity.SysUserRole;
import com.laker.admin.module.sys.service.ISysMenuService;
import com.laker.admin.module.sys.service.ISysRolePowerService;
import com.laker.admin.module.sys.service.ISysRoleService;
import com.laker.admin.module.sys.service.ISysUserRoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class StpInterfaceImpl implements StpInterface {
@Autowired
ISysUserRoleService sysUserRoleService;
@Autowired
ISysRolePowerService sysRolePowerService;
@Autowired
ISysMenuService menuService;
@Autowired
ISysRoleService roleService;
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginKey) {
List<SysUserRole> userRoles = sysUserRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, loginId));
List<Long> roleIds = userRoles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList());
List<SysRolePower> rolePowerLists = sysRolePowerService.list(Wrappers.<SysRolePower>lambdaQuery().in(SysRolePower::getRoleId, roleIds));
List<Long> powerIds = rolePowerLists.stream().map(SysRolePower::getPowerId).collect(Collectors.toList());
// 2是按钮
List<SysPower> sysPowers = menuService.list(Wrappers.<SysPower>lambdaQuery().in(SysPower::getMenuId, powerIds).eq(SysPower::getType, 2));
List<String> strings = sysPowers.stream().map(SysPower::getPowerCode).collect(Collectors.toList());
return strings;
}
/**
* 返回一个账号所拥有的角色标识集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginKey) {
List<SysUserRole> userRoles = sysUserRoleService.list(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, loginId));
List<String> roleIds = userRoles.stream().map(sysUserRole -> sysUserRole.getRoleId() + "")
.collect(Collectors.toList());
List<SysRole> sysRoles = roleService.list(Wrappers.<SysRole>lambdaQuery().in(SysRole::getRoleId, roleIds));
return sysRoles.stream().map(role -> role.getRoleCode()).collect(Collectors.toList());
}
}

View File

@@ -11,18 +11,15 @@ import org.springframework.stereotype.Component;
*/
@Component
@Slf4j
public class GeneralCompletion implements Completion {
public class EasyGeneralCompletion implements Completion {
@Override
public void complete(HistoryTask task) {
log.info("The task[{}] has been user[{}] has completed", task, task.getOperator());
}
@Override
public void complete(HistoryOrder order) {
log.info("The order[{}] has completed", order);
}
}

View File

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
*/
@Slf4j
@Component
public class WebSocketEventListener {
public class EasyWebSocketEventListener {
@Autowired
StompMessageService stompMessageService;

View File

@@ -18,13 +18,13 @@ import java.util.List;
* @date: 2022/10/17
**/
@Slf4j
public class LakerDataSourceTransactionManager extends DataSourceTransactionManager {
public class EasyDataSourceTransactionManager extends DataSourceTransactionManager {
transient ThreadLocal<LinkedList<Transaction>> dateThreadLocal = new ThreadLocal<>();
private transient long costTime;
private final transient long costTime;
public LakerDataSourceTransactionManager(DataSource dataSource, long costTime) {
public EasyDataSourceTransactionManager(DataSource dataSource, long costTime) {
super(dataSource);
this.costTime = costTime;
}
@@ -62,7 +62,7 @@ public class LakerDataSourceTransactionManager extends DataSourceTransactionMana
TraceContext.stopSpan(costTime);
}
class Transaction {
static class Transaction {
long begin;
String name;

View File

@@ -15,11 +15,11 @@ import java.util.concurrent.ConcurrentHashMap;
*/
@Service
@Slf4j
public class LakerChatHandler extends AbstractWebSocketHandler {
public class EasyChatHandler extends AbstractWebSocketHandler {
private final Map<String, WebSocketSession> webSocketSessionMap = new ConcurrentHashMap<>();
WebsocketMetrics websocketMetrics;
public LakerChatHandler(WebsocketMetrics websocketMetrics) {
public EasyChatHandler(WebsocketMetrics websocketMetrics) {
this.websocketMetrics = websocketMetrics;
websocketMetrics.websocketGauge(webSocketSessionMap);
}

View File

@@ -12,7 +12,7 @@ import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.Map;
public class LakerSessionHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
public class EasySessionHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
// 拦截器返回false则不会进行websocket协议的转换
// 可以获取请求参数做认证鉴权
@Override

View File

@@ -9,7 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
@ApiModel
public class PageResponse<T> extends Response<T> {
@ApiModelProperty(notes = "数量")
@ApiModelProperty(notes = "总记录数量")
private Long count;
public PageResponse(String code, String msg, T data, Long count) {

View File

@@ -15,7 +15,7 @@ import com.laker.admin.framework.aop.metrics.Metrics;
import com.laker.admin.framework.cache.IEasyCache;
import com.laker.admin.framework.ext.mybatis.UserDataPower;
import com.laker.admin.framework.ext.mybatis.UserInfoAndPowers;
import com.laker.admin.framework.ext.satoken.MySaTokenListener;
import com.laker.admin.framework.ext.satoken.EasySaTokenListener;
import com.laker.admin.framework.ext.satoken.OnlineUser;
import com.laker.admin.framework.model.PageResponse;
import com.laker.admin.framework.model.Response;
@@ -113,8 +113,8 @@ public class LoginController {
@ApiOperation(value = "获取在线用户信息")
public PageResponse onlineUsers(@RequestParam(required = false, defaultValue = "1") int page,
@RequestParam(required = false, defaultValue = "10") int limit) {
MySaTokenListener.ONLINE_USERS.sort((o1, o2) -> DateUtil.compare(o2.getLoginTime(), o1.getLoginTime()));
PageDtoUtil pageDto = PageDtoUtil.getPageDto(MySaTokenListener.ONLINE_USERS, page, limit);
EasySaTokenListener.ONLINE_USERS.sort((o1, o2) -> DateUtil.compare(o2.getLoginTime(), o1.getLoginTime()));
PageDtoUtil pageDto = PageDtoUtil.getPageDto(EasySaTokenListener.ONLINE_USERS, page, limit);
List<OnlineUser> pageList = (List<OnlineUser>) pageDto.getPageList();
pageList.forEach(onlineUser -> {
String keyLastActivityTime = StpUtil.getStpLogic().splicingKeyLastActiveTime(onlineUser.getTokenValue());

View File

@@ -1,16 +1,18 @@
package com.laker.admin.module.sys.mapper;
import com.laker.admin.module.sys.entity.SysRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.laker.admin.module.sys.entity.SysRole;
import java.util.List;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author laker
* @since 2021-08-11
*/
public interface SysRoleMapper extends BaseMapper<SysRole> {
List<String> getRoleCodesByUserIdAndRoleType(Long userId, Integer roleType);
}

View File

@@ -1,16 +1,18 @@
package com.laker.admin.module.sys.mapper;
import com.laker.admin.module.sys.entity.SysRolePower;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.laker.admin.module.sys.entity.SysRolePower;
import java.util.List;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author laker
* @since 2021-08-11
*/
public interface SysRolePowerMapper extends BaseMapper<SysRolePower> {
List<String> getPowerCodesByUserIdAndPowerType(Long userId, Integer type);
}

View File

@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.laker.admin.module.sys.mapper.SysRoleMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.laker.admin.module.sys.entity.SysRole">
<id column="role_id" property="roleId" />
<result column="role_name" property="roleName" />
<result column="role_code" property="roleCode" />
<result column="details" property="details" />
<result column="enable" property="enable" />
<result column="create_time" property="createTime" />
<id column="role_id" property="roleId"/>
<result column="role_name" property="roleName"/>
<result column="role_code" property="roleCode"/>
<result column="details" property="details"/>
<result column="enable" property="enable"/>
<result column="create_time" property="createTime"/>
</resultMap>
<!-- 通用查询结果列 -->
@@ -17,4 +16,13 @@
role_id, role_name, role_code, details, enable, create_time
</sql>
<select id="getRoleCodesByUserIdAndRoleType" resultType="java.lang.String">
select role_code
from sys_role r
inner join sys_user_role ur on ur.role_id = r.role_id
where ur.user_id = #{userId}
<if test="roleType != null">
and r.role_type = #{roleType}
</if>
</select>
</mapper>

View File

@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.laker.admin.module.sys.mapper.SysRolePowerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.laker.admin.module.sys.entity.SysRolePower">
<id column="id" property="id" />
<result column="role_id" property="roleId" />
<result column="power_id" property="powerId" />
<id column="id" property="id"/>
<result column="role_id" property="roleId"/>
<result column="power_id" property="powerId"/>
</resultMap>
<!-- 通用查询结果列 -->
@@ -14,4 +13,15 @@
id, role_id, power_id
</sql>
<select id="getPowerCodesByUserIdAndPowerType" resultType="java.lang.String">
select p.power_code
from sys_role_power rp
inner join sys_power p on rp.power_id = p.menu_id
inner join sys_role r on rp.role_id = r.role_id
where p.type = #{type}
and rp.role_id in
(select ur.role_id
from sys_user_role ur
where ur.user_id = #{userId})
</select>
</mapper>

View File

@@ -2,6 +2,8 @@ package com.laker.admin.framework.ext.step;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import com.laker.admin.framework.ext.actuator.step.EasyMeterRegistry;
import com.laker.admin.framework.ext.actuator.step.StepCounterTuple;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@@ -18,12 +20,12 @@ public class StepCounterTest {
@SneakyThrows
@Test
public void test() {
LakerMeterRegistry lakerMeterRegistry = new LakerMeterRegistry(Duration.ofSeconds(10));
EasyMeterRegistry easyMeterRegistry = new EasyMeterRegistry(Duration.ofSeconds(10));
for (int i = 0; i < 30; i++) {
ThreadUtil.execute(() -> {
StepCounterTuple counter = lakerMeterRegistry.counter(RandomUtil.randomString("qwertyuiopasdfghjklzxcvbnm", 1));
StepCounterTuple counter = easyMeterRegistry.counter(RandomUtil.randomString("qwertyuiopasdfghjklzxcvbnm", 1));
counter.increment1(1);
counter.increment2(2);
});