Merge pull request 'build : dubbo版本改为3.2.1' (#29) from master into gateway

Reviewed-on: http://git.feashow.cn/clay/fateverse/pulls/29
This commit is contained in:
clay
2024-03-25 10:09:15 +00:00
25 changed files with 198 additions and 84 deletions

View File

@@ -96,10 +96,7 @@ trigger:
- code-gen
- custom-query
- sentinel-dashboard
- sentinel-dashboard-pro
- code-gen-test-mysql
- workflow
- flowable
event:
- push

View File

@@ -70,8 +70,9 @@ public class MenuController {
return Result.ok(optionMenuVo);
}
@ApiOperation("获取树形接口的option")
@ApiOperation("菜单详情")
@GetMapping("/info/{menuId}")
@PreAuthorize("@ss.hasPermission('admin:menu:info')")
public Result<MenuVo> info(@PathVariable Long menuId) {
ObjectUtils.checkPk(menuId);
MenuVo menu = menuService.searchByMenuId(menuId);

View File

@@ -76,7 +76,7 @@ public class UserController {
return Result.ok(userChooseList);
}
@ApiOperation("获取用户列表")
@ApiOperation("获取用户详情")
@GetMapping("/info/{userId}")
@PreAuthorize("@ss.hasPermission('admin:user:info')")
public Result<UserDetailVo> info(@PathVariable Long userId) {
@@ -200,7 +200,7 @@ public class UserController {
}
@ApiOperation("建立角色用户绑定关系")
@ApiOperation("建立岗位用户绑定关系")
@PutMapping("/bind/post")
@PreAuthorize("@ss.hasPermission('admin:user:bindPost')")
@Log(title = "建立角色用户绑定关系", businessType = BusinessType.UPDATE)

View File

@@ -0,0 +1,38 @@
package cn.fateverse.admin.entity;
import cn.fateverse.admin.vo.IpBackVo;
import cn.fateverse.common.core.annotaion.EnableAutoField;
import cn.fateverse.common.core.entity.BaseEntity;
import lombok.Data;
/**
* @author Clay
* @date 2023-10-22
*/
@Data
@EnableAutoField
public class IpBack extends BaseEntity {
/**
* 主键id
*/
private Long id;
/**
* ip地址
*/
private String ipAddr;
/**
* ip类型 ipv4 ipv6
*/
private String type;
public IpBackVo toIPBackVo(){
return IpBackVo.builder()
.id(id)
.ipAddr(ipAddr)
.type(type)
.createTime(getCreateTime())
.remark(getRemark())
.build();
}
}

View File

@@ -87,19 +87,23 @@ public class MappingSwitchVo {
private String operName;
public static MappingSwitchVo toMappingSwitchVo(MappingSwitchInfo mappingSwitchInfo) {
return MappingSwitchVo.builder()
MappingSwitchVo mappingSwitchVo = MappingSwitchVo.builder()
.key(mappingSwitchInfo.getKey())
.applicationName(mappingSwitchInfo.getApplicationName())
.className(mappingSwitchInfo.getClassName())
.description(mappingSwitchInfo.getDescription())
.methodName(mappingSwitchInfo.getMethodName())
.uris(mappingSwitchInfo.getUris())
.type(mappingSwitchInfo.getType().toString())
.httpMethods(mappingSwitchInfo.getHttpMethods())
.state(mappingSwitchInfo.getState())
.operName(mappingSwitchInfo.getOperName())
.operTime(mappingSwitchInfo.getOperTime())
.build();
MappingSwitchInfo.MappingSwitchType switchType = mappingSwitchInfo.getType();
if (switchType != null) {
mappingSwitchVo.setType(switchType.name());
}
return mappingSwitchVo;
}

View File

@@ -1,5 +1,6 @@
package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.entity.Dept;
import cn.fateverse.common.core.entity.PageInfo;
import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.TableSupport;
@@ -35,7 +36,7 @@ public class OnlineUserServiceImpl implements OnlineUserService {
* todo 现阶段一次性将所有用户全部返回,后期想办法进行分页操作
*
* @param place
* @param username
* @param username 用户名
* @return
*/
@Override
@@ -72,19 +73,25 @@ public class OnlineUserServiceImpl implements OnlineUserService {
@Override
public void force(String tokenId) {
redisTemplate.delete(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
redisTemplate.delete(CacheConstants.ROUTE_CACHE_KEY + tokenId);
}
private OnlineUser toOnlineUser(LoginUser user) {
return OnlineUser.builder()
OnlineUser onlineUser = OnlineUser.builder()
.tokenId(user.getUuid())
.username(user.getUsername())
.deptName(user.getUser().getDept().getDeptName())
.ipAddr(user.getIpddr())
.loginLocation(user.getLoginLocation())
.browser(user.getBrowser())
.os(user.getOs())
.loginTime(new Date(user.getLoginTime()))
.build();
Dept dept = user.getUser().getDept();
if (dept != null) {
onlineUser.setDeptName(dept.getDeptName());
}
return onlineUser;
}

View File

@@ -61,13 +61,38 @@
</select>
<select id="selectListByUserId" resultType="cn.fateverse.admin.entity.Menu">
<include refid="selectMenuVo"/>
select distinct m.menu_id,
m.menu_name,
m.parent_id,
m.order_num,
m.path,
m.path_params,
m.component,
m.no_redirect,
m.breadcrumb,
m.is_frame,
m.is_cache,
m.menu_type,
m.visible,
m.state,
m.order_num,
ifnull(m.perms, '') as perms,
m.icon,
m.create_by,
m.create_time,
m.update_by,
m.update_time,
m.remark
from sys_menu m
left join sys_role_menu rm on rm.menu_id = m.menu_id
left join sys_role r on r.role_id = rm.role_id
left join sys_user_role ur on ur.role_id = r.role_id
<where>
<if test="userId != null">and user_id = #{userId}</if>
<if test="menuName != null and menuName != ''">and menu_name like concat('%',#{menuName},'%')</if>
<if test="state != null and state != ''">and state = #{state}</if>
<if test="excludeId != null ">and menu_id != #{excludeId} and parent_id != #{excludeId}</if>
<if test="button">and menu_type in ('D', 'M')</if>
<if test="userId != null">and ur.user_id = #{userId}</if>
<if test="menuName != null and menuName != ''">and m.menu_name like concat('%',#{menuName},'%')</if>
<if test="state != null and state != ''">and m.state = #{state}</if>
<if test="excludeId != null ">and m.menu_id != #{excludeId} and parent_id != #{excludeId}</if>
<if test="button">and m.menu_type in ('D', 'M')</if>
</where>
</select>

View File

@@ -31,6 +31,7 @@ import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
@@ -156,11 +157,15 @@ public class LoginServiceImpl implements LoginService {
@Override
public List<RouterVo> getMenuRouterByUserId() {
List<RouterVo> result = (List<RouterVo>) redisTemplate.opsForValue().get(CacheConstants.ROUTE_CACHE_KEY + SecurityUtils.getUserId());
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtils.isEmpty(loginUser)){
throw new CustomException("获取用户信息失败!");
}
List<RouterVo> result = (List<RouterVo>) redisTemplate.opsForValue().get(CacheConstants.ROUTE_CACHE_KEY + loginUser.getUuid());
if (result == null || result.isEmpty()) {
RLock lock = redissonClient.getLock(CacheConstants.ROUTE_CACHE_KEY + "lock:" + SecurityUtils.getUserId());
RLock lock = redissonClient.getLock(CacheConstants.ROUTE_CACHE_KEY + "lock:" + loginUser.getUuid());
try {
result = (List<RouterVo>) redisTemplate.opsForValue().get(CacheConstants.ROUTE_CACHE_KEY + SecurityUtils.getUserId());
result = (List<RouterVo>) redisTemplate.opsForValue().get(CacheConstants.ROUTE_CACHE_KEY + loginUser.getUuid());
if (result == null || result.isEmpty()) {
result = menuService.selectMenuRouterByUserId(SecurityUtils.getUserId());
if (result == null || result.isEmpty()) {
@@ -168,7 +173,7 @@ public class LoginServiceImpl implements LoginService {
// throw new CustomException("获取路由异常!");
return new ArrayList<>();
}
redisTemplate.opsForValue().set(CacheConstants.ROUTE_CACHE_KEY + SecurityUtils.getUserId(),result,30, TimeUnit.MINUTES);
redisTemplate.opsForValue().set(CacheConstants.ROUTE_CACHE_KEY + loginUser.getUuid(), result, 30, TimeUnit.MINUTES);
}
} finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {

View File

@@ -14,7 +14,7 @@ public class CacheConstants {
/**
* 路由缓存地址
*/
public static final String ROUTE_CACHE_KEY = "router_key:";
public static final String ROUTE_CACHE_KEY = "router:key:";
/**
* 登录用户 redis key
*/

View File

@@ -12,11 +12,15 @@
<artifactId>common-dubbo</artifactId>
<properties>
<dubbo.version>3.0.3</dubbo.version>
<dubbo.version>3.2.1</dubbo.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Dubbo Nacos registry dependency -->
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>common-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
@@ -45,6 +49,12 @@
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo sentinel 适配器-->
<!-- <dependency>-->

View File

@@ -6,6 +6,7 @@ import cn.fateverse.common.log.service.OperationService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
/**
@@ -17,13 +18,13 @@ import org.springframework.context.annotation.Bean;
public class LogAutoConfiguration {
@Bean
public LogAspect logAspect(){
public LogAspect logAspect() {
return new LogAspect();
}
@Bean
public OperationService operationService(OperationProperties properties) {
return new OperationService(properties);
public OperationService operationService(OperationProperties properties, Environment environment) {
return new OperationService(properties, environment);
}
}

View File

@@ -47,7 +47,7 @@ public class LogAspect {
@Around("@within(log) || @annotation(log)")
public Object before(ProceedingJoinPoint point, Log log) throws Throwable {
public Object around(ProceedingJoinPoint point, Log log) throws Throwable {
long startTime = System.currentTimeMillis();
try {
Object proceed = point.proceed(point.getArgs());

View File

@@ -11,10 +11,12 @@ import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Async;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -35,14 +37,23 @@ public class OperationService {
@DubboReference
private DubboLogService logService;
private final String applicationName;
private final OperationProperties properties;
private final List<OperationLog> operationLogListCache;
public OperationService(OperationProperties properties) {
public OperationService(OperationProperties properties, Environment environment) {
this.properties = properties;
this.operationLogListCache = new ArrayList<>(properties.getCacheSize());
String applicationName = environment.getProperty("spring.application.name");
if (ObjectUtils.isEmpty(applicationName)) {
log.error("applicationName can not be null");
throw new RuntimeException("applicationName can not be null");
}
this.applicationName = applicationName;
}
@@ -62,6 +73,7 @@ public class OperationService {
@Async
public void asyncExecute(OperationLog operationLog, Object jsonResult, Throwable e, Long time) {
operationLog.setState(BusinessState.SUCCESS.ordinal());
operationLog.setApplicationName(applicationName);
// 返回参数
if (jsonResult instanceof Result) {
Result<Object> result = (Result<Object>) jsonResult;

View File

@@ -23,6 +23,12 @@
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>

View File

@@ -27,6 +27,12 @@
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--Token生成与解析-->
<dependency>

View File

@@ -118,6 +118,7 @@ public class TokenService {
if (!StrUtil.isEmpty(token)) {
String userKey = getTokenKey(token);
redisTemplate.delete(userKey);
redisTemplate.delete(CacheConstants.ROUTE_CACHE_KEY + token);
}
}

View File

@@ -27,6 +27,12 @@
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>

View File

@@ -27,6 +27,11 @@ public class OperationLog implements Serializable {
*/
private Long userId;
/**
* 应用名称
*/
private String applicationName;
/**
* 操作模块
*/

View File

@@ -1,7 +1,6 @@
package cn.fateverse.log.query;
import cn.fateverse.common.core.entity.QueryTime;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -12,7 +11,6 @@ import lombok.Data;
* @Version: V2.0
*/
@Data
@ApiModel("日志查询实体")
public class OperationLogQuery extends QueryTime {
/**
@@ -20,6 +18,8 @@ public class OperationLogQuery extends QueryTime {
*/
private String title;
private String applicationName;
/**
* 操作人员
*/

View File

@@ -32,6 +32,8 @@ public class OperationLogVo implements Serializable {
*/
private String title;
private String applicationName;
/**
* 业务类型0其它 1新增 2修改 3删除
*/
@@ -111,6 +113,7 @@ public class OperationLogVo implements Serializable {
public static OperationLogVo toOperationLogVo(OperationLog operationLog) {
return OperationLogVo.builder()
.operId(operationLog.getOperId())
.applicationName(operationLog.getApplicationName())
.title(operationLog.getTitle())
.businessType(operationLog.getBusinessType())
.method(operationLog.getMethod())

View File

@@ -2,12 +2,9 @@ package cn.fateverse.log.controller;
import cn.fateverse.common.core.result.Result;
import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.security.annotation.Anonymity;
import cn.fateverse.log.query.OperationLogQuery;
import cn.fateverse.log.service.OperationService;
import cn.fateverse.log.vo.OperationLogVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -19,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
* @author Clay
* @date 2022/11/1
*/
@Api(tags = "操作日志管理")
@Slf4j
@RestController
@RequestMapping("/log")
@@ -31,13 +27,7 @@ public class OperationLogController {
this.operationService = operationService;
}
/**
* @param operationLogQuery
* @return
*/
@GetMapping("/list")
@Anonymity
@ApiOperation("查询日志信息")
@PreAuthorize("@ss.hasPermission('admin:log:list')")
public Result<TableDataInfo<OperationLogVo>> SearchLog(OperationLogQuery operationLogQuery) {
TableDataInfo<OperationLogVo> dataTable = operationService.search(operationLogQuery);
@@ -45,7 +35,6 @@ public class OperationLogController {
}
@GetMapping("/{operId}")
@ApiOperation("查询日志信息")
@PreAuthorize("@ss.hasPermission('admin:log:list')")
public Result<OperationLogVo> SearchLog(@PathVariable Long operId) {
OperationLogVo operationLogVo = operationService.select(operId);
@@ -53,7 +42,6 @@ public class OperationLogController {
}
@DeleteMapping("/{operIds}")
@ApiOperation("操作日志删除")
@PreAuthorize("@ss.hasPermission('admin:log:del')")
public Result<Integer> OperationInfoRemove(@PathVariable Long[] operIds) {
if (operIds.length == 0) {

View File

@@ -7,6 +7,7 @@
<resultMap type="cn.fateverse.log.entity.OperationLog" id="OperationLogResult">
<id property="operId" column="oper_id"/>
<result property="title" column="title"/>
<result property="applicationName" column="application_name"/>
<result property="businessType" column="business_type"/>
<result property="method" column="method"/>
<result property="requestMethod" column="request_method"/>
@@ -24,15 +25,35 @@
<result property="consumeTime" column="consume_time"/>
</resultMap>
<sql id="selectSql">
select oper_id,
title,
application_name,
business_type,
method,
request_method,
operator_type,
oper_name,
dept_name,
oper_url,
oper_ip,
oper_location,
state,
oper_time,
consume_time
from sys_operation_log
</sql>
<insert id="batchSave">
insert into sys_operation_log
(oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip,
(oper_id, title, application_name, business_type, method, request_method, operator_type, oper_name, dept_name,
oper_url, oper_ip,
oper_location, oper_param, json_result, state, error_msg, error_stack_trace, oper_time, consume_time)
values
<foreach collection="list" item="log" separator=",">
(#{log.operId}, #{log.title}, #{log.businessType}, #{log.method}, #{log.requestMethod}, #{log.operatorType},
#{log.operName},
(#{log.operId}, #{log.title}, #{log.applicationName}, #{log.businessType}, #{log.method},
#{log.requestMethod}, #{log.operatorType},#{log.operName},
#{log.deptName}, #{log.operUrl}, #{log.operIp}, #{log.operLocation}, #{log.operParam}, #{log.jsonResult},
#{log.state}, #{log.errorMsg},
#{log.errorStackTrace}, #{log.operTime}, #{log.consumeTime})
@@ -41,15 +62,16 @@
<select id="searchSubQuery" resultMap="OperationLogResult"
parameterType="cn.fateverse.log.query.OperationLogQuery">
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url,
oper_ip, oper_location, state, oper_time, consume_time
from sys_operation_log
<include refid="selectSql"/>
<where>
oper_id >= (select oper_id from sys_operation_log
<where>
<if test="operation.title !=null and operation.title !=''">
and title like concat('%',#{operation.title},'%')
</if>
<if test="operation.applicationName !=null and operation.applicationName !=''">
and application_name like concat('%',#{operation.applicationName},'%')
</if>
<if test="operation.operName !=null and operation.operName !=''">
and oper_name like concat('%',#{operation.operName},'%')
</if>
@@ -71,6 +93,9 @@
<if test="operation.title !=null and operation.title !=''">
and title like concat('%',#{operation.title},'%')
</if>
<if test="operation.applicationName !=null and operation.applicationName !=''">
and application_name like concat('%',#{operation.applicationName},'%')
</if>
<if test="operation.operName !=null and operation.operName !=''">
and oper_name like concat('%',#{operation.operName},'%')
</if>
@@ -93,13 +118,14 @@
<select id="search" resultMap="OperationLogResult"
parameterType="cn.fateverse.log.query.OperationLogQuery">
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url,
oper_ip, oper_location, state, oper_time, consume_time
from sys_operation_log
<include refid="selectSql"/>
<where>
<if test="operation.title !=null and operation.title !=''">
and title like concat('%',#{operation.title},'%')
</if>
<if test="operation.applicationName !=null and operation.applicationName !=''">
and application_name like concat('%',#{operation.applicationName},'%')
</if>
<if test="operation.operName !=null and operation.operName !=''">
and oper_name like concat('%',#{operation.operName},'%')
</if>
@@ -125,6 +151,9 @@
<if test="operation.title !=null and operation.title !=''">
and title like concat('%',#{operation.title},'%')
</if>
<if test="operation.applicationName !=null and operation.applicationName !=''">
and application_name like concat('%',#{operation.applicationName},'%')
</if>
<if test="operation.operName !=null and operation.operName !=''">
and oper_name like concat('%',#{operation.operName},'%')
</if>
@@ -153,6 +182,7 @@
<select id="selectById" resultMap="OperationLogResult">
select oper_id,
title,
application_name,
business_type,
method,
request_method,

View File

@@ -1,31 +0,0 @@
package cn.fateverse.notice.config;
import cn.fateverse.notice.entity.UserInfo;
import org.redisson.spring.data.connection.RedissonConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author Clay
* @date 2023-10-15
*/
//@Configuration
public class RedisTemplateConfig {
@Bean("noticeRedisTemplate")
public RedisTemplate<String, UserInfo> noticeRedisTemplate(RedissonConnectionFactory redissonConnectionFactory) {
RedisTemplate<String, UserInfo> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redissonConnectionFactory);
//设置key序列化方式string
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

View File

@@ -1,7 +1,7 @@
package cn.fateverse.workflow.entity.dto;
import cn.fateverse.workflow.entity.ProcessListener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSON;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;

View File

@@ -41,7 +41,7 @@
</select>
<select id="selectProcessInstanceListByUserIdAndState"
resultType="cn.fateverse.workflow.entity.UserInstance">
select process_instance_id,
select distinct process_instance_id,
user_id,
deployment_name,
submit_time,