优化不联网

This commit is contained in:
zc
2026-03-17 15:17:42 +08:00
parent 61a18e781d
commit 50a1c03776
26 changed files with 175 additions and 331 deletions

View File

@@ -1,39 +1,15 @@
package top.wms.admin.auth.handler; package top.wms.admin.auth.handler;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.json.JSONUtil;
import com.xkcoding.justauth.AuthRequestFactory;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import top.wms.admin.auth.AbstractLoginHandler; import top.wms.admin.auth.AbstractLoginHandler;
import top.wms.admin.auth.enums.AuthTypeEnum; import top.wms.admin.auth.enums.AuthTypeEnum;
import top.wms.admin.auth.model.req.SocialLoginReq; import top.wms.admin.auth.model.req.SocialLoginReq;
import top.wms.admin.auth.model.resp.LoginResp; import top.wms.admin.auth.model.resp.LoginResp;
import top.wms.admin.common.constant.RegexConstants;
import top.wms.admin.common.constant.SysConstants;
import top.wms.admin.common.enums.DisEnableStatusEnum;
import top.wms.admin.common.enums.GenderEnum;
import top.wms.admin.system.model.entity.RoleDO;
import top.wms.admin.system.model.entity.UserDO;
import top.wms.admin.system.model.entity.UserSocialDO;
import top.wms.admin.system.model.resp.ClientResp; import top.wms.admin.system.model.resp.ClientResp;
import top.wms.admin.system.service.UserRoleService;
import top.wms.admin.system.service.UserSocialService;
import top.continew.starter.core.autoconfigure.project.ProjectProperties;
import top.continew.starter.core.exception.BadRequestException; import top.continew.starter.core.exception.BadRequestException;
import top.continew.starter.core.validation.ValidationUtils;
import java.time.LocalDateTime;
import java.util.Collections;
/** /**
* 第三方账号登录处理器 * 第三方账号登录处理器
@@ -46,57 +22,10 @@ import java.util.Collections;
@RequiredArgsConstructor @RequiredArgsConstructor
public class SocialLoginHandler extends AbstractLoginHandler<SocialLoginReq> { public class SocialLoginHandler extends AbstractLoginHandler<SocialLoginReq> {
private final AuthRequestFactory authRequestFactory;
private final UserSocialService userSocialService;
private final UserRoleService userRoleService;
private final ProjectProperties projectProperties;
@Override @Override
public LoginResp login(SocialLoginReq req, ClientResp client, HttpServletRequest request) { public LoginResp login(SocialLoginReq req, ClientResp client, HttpServletRequest request) {
// 获取第三方登录信息 // 第三方登录已禁用
AuthRequest authRequest = this.getAuthRequest(req.getSource()); throw new BadRequestException("第三方登录功能已禁用");
AuthCallback callback = new AuthCallback();
callback.setCode(req.getCode());
callback.setState(req.getState());
AuthResponse<AuthUser> response = authRequest.login(callback);
ValidationUtils.throwIf(!response.ok(), response.getMsg());
AuthUser authUser = response.getData();
// 如未绑定则自动注册新用户,保存或更新关联信息
String source = authUser.getSource();
String openId = authUser.getUuid();
UserSocialDO userSocial = userSocialService.getBySourceAndOpenId(source, openId);
UserDO user;
if (null == userSocial) {
String username = authUser.getUsername();
UserDO existsUser = userService.getByUsername(username);
String randomStr = RandomUtil.randomString(RandomUtil.BASE_CHAR, 5);
if (null != existsUser || !ReUtil.isMatch(RegexConstants.USERNAME, username)) {
username = randomStr + IdUtil.fastSimpleUUID();
}
user = new UserDO();
user.setUsername(username);
user.setGender(GenderEnum.valueOf(authUser.getGender().name()));
user.setAvatar(authUser.getAvatar());
user.setStatus(DisEnableStatusEnum.ENABLE);
userService.save(user);
Long userId = user.getId();
RoleDO role = roleService.getByCode(SysConstants.SUPER_ROLE_CODE);
userRoleService.assignRolesToUser(Collections.singletonList(role.getId()), userId);
userSocial = new UserSocialDO();
userSocial.setUserId(userId);
userSocial.setSource(source);
userSocial.setOpenId(openId);
} else {
user = BeanUtil.copyProperties(userService.getById(userSocial.getUserId()), UserDO.class);
}
// 检查用户状态
super.checkUserStatus(user);
userSocial.setMetaJson(JSONUtil.toJsonStr(authUser));
userSocial.setLastLoginTime(LocalDateTime.now());
userSocialService.saveOrUpdate(userSocial);
// 执行认证
String token = super.authenticate(user, client);
return LoginResp.builder().token(token).build();
} }
@Override @Override
@@ -112,18 +41,4 @@ public class SocialLoginHandler extends AbstractLoginHandler<SocialLoginReq> {
return AuthTypeEnum.SOCIAL; return AuthTypeEnum.SOCIAL;
} }
/**
* 获取 AuthRequest
*
* @param source 平台名称
* @return AuthRequest
*/
private AuthRequest getAuthRequest(String source) {
try {
return authRequestFactory.get(source);
} catch (Exception e) {
throw new BadRequestException("暂不支持 [%s] 平台账号登录".formatted(source));
}
}
} }

View File

@@ -24,5 +24,6 @@ public interface MaterialInfoMapper extends BaseMapper<MaterialInfoDO> {
public int updateByCode(List<MaterialInfoDO> list); public int updateByCode(List<MaterialInfoDO> list);
IPage<MaterialInfoResp> selectMaterialInfoPage(@Param("page") Page<Object> objectPage, @Param(Constants.WRAPPER) QueryWrapper<MaterialInfoDO> queryWrapper); IPage<MaterialInfoResp> selectMaterialInfoPage(@Param("page") Page<Object> objectPage,
@Param(Constants.WRAPPER) QueryWrapper<MaterialInfoDO> queryWrapper);
} }

View File

@@ -48,9 +48,6 @@ import top.wms.admin.material.model.resp.MaterialInfoImportResp;
import top.wms.admin.material.model.resp.MaterialInfoResp; import top.wms.admin.material.model.resp.MaterialInfoResp;
import top.wms.admin.material.service.MaterialInfoService; import top.wms.admin.material.service.MaterialInfoService;
import top.wms.admin.system.service.FileService; import top.wms.admin.system.service.FileService;
import top.wms.admin.weighManage.model.entity.WorkOrderDO;
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
import top.wms.admin.weighManage.model.resp.WorkOrderResp;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -95,7 +92,6 @@ public class MaterialInfoServiceImpl extends BaseServiceImpl<MaterialInfoMapper,
return PageResp.build(page); return PageResp.build(page);
} }
@Override @Override
public MaterialInfoDO getMaterialInfoByCode(String code) { public MaterialInfoDO getMaterialInfoByCode(String code) {
if (StrUtil.isNotBlank(code)) { if (StrUtil.isNotBlank(code)) {

View File

@@ -4,7 +4,6 @@ import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.BaseService; import top.continew.starter.extension.crud.service.BaseService;
import top.wms.admin.materialProcess.model.query.MaterialProcessQuery; import top.wms.admin.materialProcess.model.query.MaterialProcessQuery;
import top.wms.admin.materialProcess.model.req.MaterialProcessReq; import top.wms.admin.materialProcess.model.req.MaterialProcessReq;
import top.wms.admin.materialProcess.model.resp.MaterialProcessDetailResp;
import top.wms.admin.materialProcess.model.resp.MaterialProcessResp; import top.wms.admin.materialProcess.model.resp.MaterialProcessResp;
import java.util.List; import java.util.List;

View File

@@ -4,7 +4,6 @@ import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.BaseService; import top.continew.starter.extension.crud.service.BaseService;
import top.wms.admin.materialType.model.query.MaterialTypeQuery; import top.wms.admin.materialType.model.query.MaterialTypeQuery;
import top.wms.admin.materialType.model.req.MaterialTypeReq; import top.wms.admin.materialType.model.req.MaterialTypeReq;
import top.wms.admin.materialType.model.resp.MaterialTypeDetailResp;
import top.wms.admin.materialType.model.resp.MaterialTypeResp; import top.wms.admin.materialType.model.resp.MaterialTypeResp;
import java.util.List; import java.util.List;

View File

@@ -12,7 +12,6 @@ import top.wms.admin.materialType.mapstruct.MaterialTypeConvert;
import top.wms.admin.materialType.model.entity.MaterialTypeDO; import top.wms.admin.materialType.model.entity.MaterialTypeDO;
import top.wms.admin.materialType.model.query.MaterialTypeQuery; import top.wms.admin.materialType.model.query.MaterialTypeQuery;
import top.wms.admin.materialType.model.req.MaterialTypeReq; import top.wms.admin.materialType.model.req.MaterialTypeReq;
import top.wms.admin.materialType.model.resp.MaterialTypeDetailResp;
import top.wms.admin.materialType.model.resp.MaterialTypeResp; import top.wms.admin.materialType.model.resp.MaterialTypeResp;
import top.wms.admin.materialType.service.MaterialTypeService; import top.wms.admin.materialType.service.MaterialTypeService;
@@ -30,7 +29,6 @@ public class MaterialTypeServiceImpl extends BaseServiceImpl<MaterialTypeMapper,
private final MaterialTypeConvert materialTypeConvert; private final MaterialTypeConvert materialTypeConvert;
@Override @Override
public List<LabelValueResp> getSelectList() { public List<LabelValueResp> getSelectList() {
List<MaterialTypeDO> materialTypeDOS = baseMapper.selectList(new QueryWrapper<>()); List<MaterialTypeDO> materialTypeDOS = baseMapper.selectList(new QueryWrapper<>());

View File

@@ -1,6 +1,5 @@
package top.wms.admin.weighManage.model.entity; package top.wms.admin.weighManage.model.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;

View File

@@ -26,6 +26,32 @@
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-log-interceptor</artifactId> <artifactId>continew-starter-log-interceptor</artifactId>
<exclusions>
<exclusion>
<artifactId>tlog-core</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
<exclusion>
<artifactId>tlog-webflux</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
<exclusion>
<artifactId>tlog-feign</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
<exclusion>
<artifactId>tlog-okhttp</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
<exclusion>
<artifactId>tlog-resttemplate</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
<exclusion>
<artifactId>tlog-xxljob</artifactId>
<groupId>com.yomahub</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>top.wms</groupId> <groupId>top.wms</groupId>

View File

@@ -29,6 +29,32 @@
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-log-interceptor</artifactId> <artifactId>continew-starter-log-interceptor</artifactId>
<exclusions>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-webflux</artifactId>
</exclusion>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-feign</artifactId>
</exclusion>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-okhttp</artifactId>
</exclusion>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-resttemplate</artifactId>
</exclusion>
<exclusion>
<groupId>com.yomahub</groupId>
<artifactId>tlog-xxljob</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- 系统管理模块(存放系统管理模块相关功能,例如:部门管理、角色管理、用户管理等) --> <!-- 系统管理模块(存放系统管理模块相关功能,例如:部门管理、角色管理、用户管理等) -->

View File

@@ -6,7 +6,6 @@ import top.wms.admin.system.mapper.LogMapper;
import top.wms.admin.system.service.UserService; import top.wms.admin.system.service.UserService;
import top.continew.starter.log.annotation.ConditionalOnEnabledLog; import top.continew.starter.log.annotation.ConditionalOnEnabledLog;
import top.continew.starter.log.dao.LogDao; import top.continew.starter.log.dao.LogDao;
import top.continew.starter.web.autoconfigure.trace.TraceProperties;
/** /**
* 日志配置 * 日志配置
@@ -22,7 +21,7 @@ public class LogConfiguration {
* 日志持久层接口本地实现类 * 日志持久层接口本地实现类
*/ */
@Bean @Bean
public LogDao logDao(UserService userService, LogMapper logMapper, TraceProperties traceProperties) { public LogDao logDao(UserService userService, LogMapper logMapper) {
return new LogDaoLocalImpl(userService, logMapper, traceProperties); return new LogDaoLocalImpl(userService, logMapper);
} }
} }

View File

@@ -26,7 +26,6 @@ import top.continew.starter.log.dao.LogDao;
import top.continew.starter.log.model.LogRecord; import top.continew.starter.log.model.LogRecord;
import top.continew.starter.log.model.LogRequest; import top.continew.starter.log.model.LogRequest;
import top.continew.starter.log.model.LogResponse; import top.continew.starter.log.model.LogResponse;
import top.continew.starter.web.autoconfigure.trace.TraceProperties;
import top.continew.starter.web.model.R; import top.continew.starter.web.model.R;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -45,7 +44,6 @@ public class LogDaoLocalImpl implements LogDao {
private final UserService userService; private final UserService userService;
private final LogMapper logMapper; private final LogMapper logMapper;
private final TraceProperties traceProperties;
@Async @Async
@Override @Override
@@ -95,7 +93,7 @@ public class LogDaoLocalImpl implements LogDao {
private void setResponse(LogDO logDO, LogResponse logResponse) { private void setResponse(LogDO logDO, LogResponse logResponse) {
Map<String, String> responseHeaders = logResponse.getHeaders(); Map<String, String> responseHeaders = logResponse.getHeaders();
logDO.setResponseHeaders(JSONUtil.toJsonStr(responseHeaders)); logDO.setResponseHeaders(JSONUtil.toJsonStr(responseHeaders));
logDO.setTraceId(responseHeaders.get(traceProperties.getTraceIdName())); logDO.setTraceId(responseHeaders.get("traceId"));
String responseBody = logResponse.getBody(); String responseBody = logResponse.getBody();
logDO.setResponseBody(responseBody); logDO.setResponseBody(responseBody);
// 状态 // 状态

View File

@@ -3,15 +3,12 @@ package top.wms.admin.controller.auth;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.xkcoding.justauth.AuthRequestFactory;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import top.wms.admin.auth.model.req.LoginReq; import top.wms.admin.auth.model.req.LoginReq;
@@ -45,7 +42,6 @@ public class AuthController {
private final AuthService authService; private final AuthService authService;
private final UserService userService; private final UserService userService;
private final AuthRequestFactory authRequestFactory;
@SaIgnore @SaIgnore
@Operation(summary = "登录", description = "用户登录") @Operation(summary = "登录", description = "用户登录")
@@ -68,10 +64,8 @@ public class AuthController {
@Parameter(name = "source", description = "来源", example = "gitee", in = ParameterIn.PATH) @Parameter(name = "source", description = "来源", example = "gitee", in = ParameterIn.PATH)
@GetMapping("/{source}") @GetMapping("/{source}")
public SocialAuthAuthorizeResp authorize(@PathVariable String source) { public SocialAuthAuthorizeResp authorize(@PathVariable String source) {
AuthRequest authRequest = this.getAuthRequest(source); // 第三方登录已禁用
return SocialAuthAuthorizeResp.builder() throw new BadRequestException("第三方登录功能已禁用");
.authorizeUrl(authRequest.authorize(AuthStateUtils.createState()))
.build();
} }
@Log(ignore = true) @Log(ignore = true)
@@ -93,12 +87,4 @@ public class AuthController {
public List<RouteResp> listRoute() { public List<RouteResp> listRoute() {
return authService.buildRouteTree(UserContextHolder.getUserId()); return authService.buildRouteTree(UserContextHolder.getUserId());
} }
private AuthRequest getAuthRequest(String source) {
try {
return authRequestFactory.get(source);
} catch (Exception e) {
throw new BadRequestException("暂不支持 [%s] 平台账号登录".formatted(source));
}
}
} }

View File

@@ -2,56 +2,35 @@ package top.wms.admin.controller.common;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.lang.RegexPool; import cn.hutool.core.lang.RegexPool;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import com.anji.captcha.model.common.RepCodeEnum; import com.anji.captcha.model.common.RepCodeEnum;
import com.anji.captcha.model.common.ResponseModel; import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO; import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.wf.captcha.base.Captcha; import com.wf.captcha.base.Captcha;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.mail.MessagingException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import top.wms.admin.auth.model.resp.CaptchaResp; import top.wms.admin.auth.model.resp.CaptchaResp;
import top.wms.admin.common.config.properties.CaptchaProperties; import top.wms.admin.common.config.properties.CaptchaProperties;
import top.wms.admin.common.constant.CacheConstants; import top.wms.admin.common.constant.CacheConstants;
import top.wms.admin.common.constant.SysConstants; import top.wms.admin.common.constant.SysConstants;
import top.wms.admin.system.enums.OptionCategoryEnum;
import top.wms.admin.system.service.OptionService; import top.wms.admin.system.service.OptionService;
import top.continew.starter.cache.redisson.util.RedisUtils; import top.continew.starter.cache.redisson.util.RedisUtils;
import top.continew.starter.captcha.graphic.core.GraphicCaptchaService; import top.continew.starter.captcha.graphic.core.GraphicCaptchaService;
import top.continew.starter.core.autoconfigure.project.ProjectProperties; import top.continew.starter.core.autoconfigure.project.ProjectProperties;
import top.continew.starter.core.util.TemplateUtils;
import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.log.annotation.Log; import top.continew.starter.log.annotation.Log;
import top.continew.starter.messaging.mail.util.MailUtils;
import top.continew.starter.security.limiter.annotation.RateLimiter;
import top.continew.starter.security.limiter.annotation.RateLimiters;
import top.continew.starter.security.limiter.enums.LimitType;
import top.continew.starter.web.model.R; import top.continew.starter.web.model.R;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
/** /**
* 验证码 API * 验证码 API
@@ -69,7 +48,6 @@ public class CaptchaController {
private final ProjectProperties projectProperties; private final ProjectProperties projectProperties;
private final CaptchaProperties captchaProperties; private final CaptchaProperties captchaProperties;
private final CaptchaService behaviorCaptchaService;
private final GraphicCaptchaService graphicCaptchaService; private final GraphicCaptchaService graphicCaptchaService;
private final OptionService optionService; private final OptionService optionService;
@@ -77,19 +55,22 @@ public class CaptchaController {
@Operation(summary = "获取行为验证码", description = "获取行为验证码Base64编码") @Operation(summary = "获取行为验证码", description = "获取行为验证码Base64编码")
@GetMapping("/behavior") @GetMapping("/behavior")
public Object getBehaviorCaptcha(CaptchaVO captchaReq, HttpServletRequest request) { public Object getBehaviorCaptcha(CaptchaVO captchaReq, HttpServletRequest request) {
captchaReq.setBrowserInfo(JakartaServletUtil.getClientIP(request) + request.getHeader(HttpHeaders.USER_AGENT)); // 行为验证码已禁用,返回默认成功响应
ResponseModel responseModel = behaviorCaptchaService.get(captchaReq); Map<String, Object> result = new LinkedHashMap<>();
CheckUtils.throwIf(() -> !StrUtil.equals(RepCodeEnum.SUCCESS.getCode(), responseModel result.put("captchaId", IdUtil.fastUUID());
.getRepCode()), responseModel.getRepMsg()); result.put("picPath", "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
return responseModel.getRepData(); return result;
} }
@Log(ignore = true) @Log(ignore = true)
@Operation(summary = "校验行为验证码", description = "校验行为验证码") @Operation(summary = "校验行为验证码", description = "校验行为验证码")
@PostMapping("/behavior") @PostMapping("/behavior")
public Object checkBehaviorCaptcha(@RequestBody CaptchaVO captchaReq, HttpServletRequest request) { public Object checkBehaviorCaptcha(@RequestBody CaptchaVO captchaReq, HttpServletRequest request) {
captchaReq.setBrowserInfo(JakartaServletUtil.getClientIP(request) + request.getHeader(HttpHeaders.USER_AGENT)); // 行为验证码已禁用,直接返回成功
return behaviorCaptchaService.check(captchaReq); ResponseModel responseModel = new ResponseModel();
responseModel.setRepCode(RepCodeEnum.SUCCESS.getCode());
responseModel.setRepMsg("验证成功");
return responseModel;
} }
@Log(ignore = true) @Log(ignore = true)
@@ -110,60 +91,21 @@ public class CaptchaController {
} }
/** /**
* 获取邮箱验证码 * 获取邮箱验证码(已禁用)
*
* <p>
* 限流规则:<br>
* 1.同一邮箱同一模板1分钟2条1小时8条24小时20条 <br>
* 2、同一邮箱所有模板 24 小时 100 条 <br>
* 3、同一 IP 每分钟限制发送 30 条
* </p>
* *
* @param email 邮箱 * @param email 邮箱
* @return / * @return /
*/ */
@Operation(summary = "获取邮箱验证码", description = "发送验证码到指定邮箱") @Operation(summary = "获取邮箱验证码", description = "发送验证码到指定邮箱")
@GetMapping("/mail") @GetMapping("/mail")
@RateLimiters({
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "MIN", key = "#email + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.mail.templatePath')", rate = 2, interval = 1, unit = TimeUnit.MINUTES, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "HOUR", key = "#email + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.mail.templatePath')", rate = 8, interval = 1, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "DAY'", key = "#email + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.mail.templatePath')", rate = 20, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#email", rate = 100, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#email", rate = 30, interval = 1, unit = TimeUnit.MINUTES, type = LimitType.IP, message = "获取验证码操作太频繁,请稍后再试")})
public R getMailCaptcha(@NotBlank(message = "邮箱不能为空") @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") String email, public R getMailCaptcha(@NotBlank(message = "邮箱不能为空") @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") String email,
CaptchaVO captchaReq) throws MessagingException { CaptchaVO captchaReq) {
// 行为验证码校验 // 邮箱验证码已禁用,直接返回成功
ResponseModel verificationRes = behaviorCaptchaService.verification(captchaReq); return R.ok("发送成功,验证码有效期 5 分钟");
ValidationUtils.throwIfNotEqual(verificationRes.getRepCode(), RepCodeEnum.SUCCESS.getCode(), verificationRes
.getRepMsg());
// 生成验证码
CaptchaProperties.CaptchaMail captchaMail = captchaProperties.getMail();
String captcha = RandomUtil.randomNumbers(captchaMail.getLength());
// 发送验证码
Long expirationInMinutes = captchaMail.getExpirationInMinutes();
Map<String, String> siteConfig = optionService.getByCategory(OptionCategoryEnum.SITE);
String content = TemplateUtils.render(captchaMail.getTemplatePath(), Dict.create()
.set("siteUrl", projectProperties.getUrl())
.set("siteTitle", siteConfig.get("SITE_TITLE"))
.set("siteCopyright", siteConfig.get("SITE_COPYRIGHT"))
.set("captcha", captcha)
.set("expiration", expirationInMinutes));
MailUtils.sendHtml(email, "【%s】邮箱验证码".formatted(projectProperties.getName()), content);
// 保存验证码
String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + email;
RedisUtils.set(captchaKey, captcha, Duration.ofMinutes(expirationInMinutes));
return R.ok("发送成功,验证码有效期 %s 分钟".formatted(expirationInMinutes));
} }
/** /**
* 获取短信验证码 * 获取短信验证码(已禁用)
*
* <p>
* 限流规则:<br>
* 1.同一号码同一模板1分钟2条1小时8条24小时20条 <br>
* 2、同一号码所有模板 24 小时 100 条 <br>
* 3、同一 IP 每分钟限制发送 30 条
* </p>
* *
* @param phone 手机号 * @param phone 手机号
* @param captchaReq 行为验证码信息 * @param captchaReq 行为验证码信息
@@ -171,33 +113,9 @@ public class CaptchaController {
*/ */
@Operation(summary = "获取短信验证码", description = "发送验证码到指定手机号") @Operation(summary = "获取短信验证码", description = "发送验证码到指定手机号")
@GetMapping("/sms") @GetMapping("/sms")
@RateLimiters({
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "MIN", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 2, interval = 1, unit = TimeUnit.MINUTES, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "HOUR", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 8, interval = 1, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "DAY'", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 20, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 100, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
@RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 30, interval = 1, unit = TimeUnit.MINUTES, type = LimitType.IP, message = "获取验证码操作太频繁,请稍后再试")})
public R getSmsCaptcha(@NotBlank(message = "手机号不能为空") @Pattern(regexp = RegexPool.MOBILE, message = "手机号格式错误") String phone, public R getSmsCaptcha(@NotBlank(message = "手机号不能为空") @Pattern(regexp = RegexPool.MOBILE, message = "手机号格式错误") String phone,
CaptchaVO captchaReq) { CaptchaVO captchaReq) {
// 行为验证码校验 // 短信验证码已禁用,直接返回成功
ResponseModel verificationRes = behaviorCaptchaService.verification(captchaReq); return R.ok("发送成功,验证码有效期 5 分钟");
ValidationUtils.throwIfNotEqual(verificationRes.getRepCode(), RepCodeEnum.SUCCESS.getCode(), verificationRes
.getRepMsg());
CaptchaProperties.CaptchaSms captchaSms = captchaProperties.getSms();
// 生成验证码
String captcha = RandomUtil.randomNumbers(captchaSms.getLength());
// 发送验证码
Long expirationInMinutes = captchaSms.getExpirationInMinutes();
SmsBlend smsBlend = SmsFactory.getBySupplier(SupplierConstant.CLOOPEN);
Map<String, String> messageMap = MapUtil.newHashMap(2, true);
messageMap.put("captcha", captcha);
messageMap.put("expirationInMinutes", String.valueOf(expirationInMinutes));
SmsResponse smsResponse = smsBlend.sendMessage(phone, captchaSms
.getTemplateId(), (LinkedHashMap<String, String>)messageMap);
CheckUtils.throwIf(!smsResponse.isSuccess(), "验证码发送失败");
// 保存验证码
String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + phone;
RedisUtils.set(captchaKey, captcha, Duration.ofMinutes(expirationInMinutes));
return R.ok("发送成功,验证码有效期 %s 分钟".formatted(expirationInMinutes));
} }
} }

View File

@@ -27,10 +27,10 @@ import java.util.List;
@Tag(name = "海康物料流程管理 API") @Tag(name = "海康物料流程管理 API")
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@CrudRequestMapping(value = "/materialProcess/materialProcess", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT}) @CrudRequestMapping(value = "/materialProcess/materialProcess", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE,
Api.DELETE, Api.EXPORT})
public class MaterialProcessController extends BaseController<MaterialProcessService, MaterialProcessResp, MaterialProcessResp, MaterialProcessQuery, MaterialProcessReq> { public class MaterialProcessController extends BaseController<MaterialProcessService, MaterialProcessResp, MaterialProcessResp, MaterialProcessQuery, MaterialProcessReq> {
@Log(ignore = true) @Log(ignore = true)
@GetMapping("/selectList") @GetMapping("/selectList")
public List<LabelValueResp> getSelectList() { public List<LabelValueResp> getSelectList() {

View File

@@ -30,7 +30,6 @@ import java.util.List;
@CrudRequestMapping(value = "/materialType/materialType", api = {Api.PAGE, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT}) @CrudRequestMapping(value = "/materialType/materialType", api = {Api.PAGE, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
public class MaterialTypeController extends BaseController<MaterialTypeService, MaterialTypeResp, MaterialTypeResp, MaterialTypeQuery, MaterialTypeReq> { public class MaterialTypeController extends BaseController<MaterialTypeService, MaterialTypeResp, MaterialTypeResp, MaterialTypeQuery, MaterialTypeReq> {
@Log(ignore = true) @Log(ignore = true)
@GetMapping("/selectList") @GetMapping("/selectList")
public List<LabelValueResp> getSelectList() { public List<LabelValueResp> getSelectList() {

View File

@@ -1,16 +1,11 @@
package top.wms.admin.controller.system; package top.wms.admin.controller.system;
import com.xkcoding.justauth.AuthRequestFactory;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -28,6 +23,7 @@ import top.wms.admin.system.model.resp.user.UserSocialBindResp;
import top.wms.admin.system.service.UserService; import top.wms.admin.system.service.UserService;
import top.wms.admin.system.service.UserSocialService; import top.wms.admin.system.service.UserSocialService;
import top.continew.starter.cache.redisson.util.RedisUtils; import top.continew.starter.cache.redisson.util.RedisUtils;
import top.continew.starter.core.exception.BadRequestException;
import top.continew.starter.core.util.ExceptionUtils; import top.continew.starter.core.util.ExceptionUtils;
import top.continew.starter.core.validation.ValidationUtils; import top.continew.starter.core.validation.ValidationUtils;
@@ -51,7 +47,6 @@ public class UserCenterController {
private static final String CAPTCHA_EXPIRED = "验证码已失效"; private static final String CAPTCHA_EXPIRED = "验证码已失效";
private final UserService userService; private final UserService userService;
private final UserSocialService userSocialService; private final UserSocialService userSocialService;
private final AuthRequestFactory authRequestFactory;
@Operation(summary = "修改头像", description = "用户修改个人头像") @Operation(summary = "修改头像", description = "用户修改个人头像")
@PostMapping("/avatar") @PostMapping("/avatar")
@@ -123,12 +118,9 @@ public class UserCenterController {
@Operation(summary = "绑定三方账号", description = "绑定三方账号") @Operation(summary = "绑定三方账号", description = "绑定三方账号")
@Parameter(name = "source", description = "来源", example = "gitee", in = ParameterIn.PATH) @Parameter(name = "source", description = "来源", example = "gitee", in = ParameterIn.PATH)
@PostMapping("/social/{source}") @PostMapping("/social/{source}")
public void bindSocial(@PathVariable String source, @RequestBody AuthCallback callback) { public void bindSocial(@PathVariable String source, @RequestBody Object callback) {
AuthRequest authRequest = authRequestFactory.get(source); // 第三方登录已禁用
AuthResponse<AuthUser> response = authRequest.login(callback); throw new BadRequestException("第三方登录功能已禁用");
ValidationUtils.throwIf(!response.ok(), response.getMsg());
AuthUser authUser = response.getData();
userSocialService.bind(authUser, UserContextHolder.getUserId());
} }
@Operation(summary = "解绑三方账号", description = "解绑三方账号") @Operation(summary = "解绑三方账号", description = "解绑三方账号")

View File

@@ -2,7 +2,6 @@ package top.wms.admin.controller.tcp.service;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import top.wms.admin.controller.tcp.manager.ChannelManager; import top.wms.admin.controller.tcp.manager.ChannelManager;
import top.wms.admin.controller.tcp.model.VMResult; import top.wms.admin.controller.tcp.model.VMResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@@ -41,9 +41,9 @@ public class WorkOrderController extends BaseController<WorkOrderService, WorkOr
return baseService.getWorkOrderInfos(id); return baseService.getWorkOrderInfos(id);
} }
/** /**
* 打印标签时调用得接口 * 打印标签时调用得接口
*
* @param id * @param id
* @return * @return
*/ */

View File

@@ -6,8 +6,6 @@ import com.fazecast.jSerialComm.SerialPortEvent;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;

View File

@@ -8,11 +8,17 @@ server:
# HTTP 端口(默认 6609 # HTTP 端口(默认 6609
port: 6609 port: 6609
--- ### 排除自动配置
spring:
autoconfigure:
exclude:
- com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration
--- ### 数据源配置 --- ### 数据源配置
spring.datasource: spring.datasource:
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
# 请务必提前创建好名为 wms_admin 的数据库,如果使用其他数据库名请注意同步修改 DB_NAME 配置 # 请务必提前创建好名为 wms_admin 的数据库,如果使用其他数据库名请注意同步修改 DB_NAME 配置
url: jdbc:p6spy:mysql://127.0.0.1:3306/wms?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true url: jdbc:p6spy:mysql://127.0.0.1:3306/wms?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root username: root
password: root password: root
# PostgreSQL 配置 # PostgreSQL 配置
@@ -55,9 +61,9 @@ spring.data:
# 密码(未设置密码时请注释掉) # 密码(未设置密码时请注释掉)
# password: ${REDIS_PWD:redis2025} # password: ${REDIS_PWD:redis2025}
# 数据库索引 # 数据库索引
database: ${REDIS_DB:1} database: ${REDIS_DB:0}
# 连接超时时间 # 连接超时时间
timeout: 10s timeout: 5s
# 是否开启 SSL # 是否开启 SSL
ssl: ssl:
enabled: false enabled: false
@@ -100,15 +106,7 @@ jetcache:
continew-starter.captcha: continew-starter.captcha:
## 行为验证码 ## 行为验证码
behavior: behavior:
enabled: true enabled: false
cache-type: REDIS
water-mark:
# 一分钟内接口请求次数限制开关默认0关闭开启后下方失败锁定配置才会生效
req-frequency-limit-enable: 0
# 一分钟内验证码最多失败次数限制默认5次
req-get-lock-limit: 5
# 一分钟内验证码最多失败次数限制达标后锁定时间默认300秒
req-get-lock-seconds: 300
## 图形验证码 ## 图形验证码
graphic: graphic:
# 类型 # 类型
@@ -160,6 +158,7 @@ continew-starter.web.cors:
# 配置允许跨域的响应头 # 配置允许跨域的响应头
exposed-headers: '*' exposed-headers: '*'
--- ### 接口文档配置 --- ### 接口文档配置
springdoc: springdoc:
swagger-ui: swagger-ui:
@@ -172,39 +171,39 @@ continew-starter.messaging.websocket:
# 配置允许跨域的域名 # 配置允许跨域的域名
allowed-origins: '*' allowed-origins: '*'
--- ### 短信配置 --- ### 短信配置(已禁用)
sms: # sms:
# 从 YAML 读取配置 # # 从 YAML 读取配置
config-type: YAML # config-type: YAML
http-log: true # http-log: true
is-print: false # is-print: false
blends: # blends:
cloopen: # cloopen:
# 短信厂商 # # 短信厂商
supplier: cloopen # supplier: cloopen
base-url: https://app.cloopen.com:8883/2013-12-26 # base-url: https://app.cloopen.com:8883/2013-12-26
access-key-id: 你的Access Key # access-key-id: 你的Access Key
access-key-secret: 你的Access Key Secret # access-key-secret: 你的Access Key Secret
sdk-app-id: 你的应用ID # sdk-app-id: 你的应用ID
--- ### 邮件配置 --- ### 邮件配置(已禁用)
spring.mail: # spring.mail:
# 根据需要更换 # # 根据需要更换
host: smtp.126.com # host: smtp.126.com
port: 465 # port: 465
username: 你的邮箱 # username: 你的邮箱
password: 你的邮箱授权码 # password: 你的邮箱授权码
properties: # properties:
mail: # mail:
smtp: # smtp:
auth: true # auth: true
socketFactory: # socketFactory:
class: javax.net.ssl.SSLSocketFactory # class: javax.net.ssl.SSLSocketFactory
port: 465 # port: 465
--- ### Just Auth 配置 --- ### Just Auth 配置
justauth: justauth:
enabled: true enabled: false
type: type:
GITEE: GITEE:
client-id: 5d271b7f638941812aaf8bfc2e2f08f06d6235ef934e0e39537e2364eb8452c4 client-id: 5d271b7f638941812aaf8bfc2e2f08f06d6235ef934e0e39537e2364eb8452c4
@@ -325,22 +324,24 @@ snail-job:
# 队列容量 # 队列容量
queueCapacity: 10000 queueCapacity: 10000
uni: # uni配置已禁用
url: http://wo-api.uni-ubi.com/ # uni:
appKey: 7834BC94180542C6BFD7031B39266E6F # url: http://wo-api.uni-ubi.com/
appSecret: 97386E6DCEFC4758810CC720DC669662 # appKey: 7834BC94180542C6BFD7031B39266E6F
projectGuid: 114C2FC2EA0B4A848C5F9AF23400E6F9 # appSecret: 97386E6DCEFC4758810CC720DC669662
# projectGuid: 114C2FC2EA0B4A848C5F9AF23400E6F9
# Minio配置 # Minio配置(已禁用,使用本地存储)
minio: # minio:
url: http://81.68.71.142:9000 # url: http://81.68.71.142:9000
accessKey: admin # accessKey: admin
secretKey: JYadmin@1234 # secretKey: JYadmin@1234
bucketName: employees # bucketName: employees
bucketName1: visitor # bucketName1: visitor
bucketName2: cars # bucketName2: cars
bucketName3: others # bucketName3: others
gwurl: http://81.68.71.142:9000 # gwurl: http://81.68.71.142:9000
sdk: # sdk配置已禁用
upload: http://81.68.71.142:7701/ # sdk:
# upload: http://81.68.71.142:7701/

View File

@@ -40,13 +40,8 @@ logging:
--- ### 链路跟踪配置 --- ### 链路跟踪配置
continew-starter.web: continew-starter.web:
trace: trace:
enabled: true enabled: false
trace-id-name: traceId trace-id-name: traceId
## TLog 配置
tlog:
enable-invoke-time-print: false
pattern: '[$spanId][$traceId]'
mdc-enable: false
--- ### 全局响应配置 --- ### 全局响应配置
continew-starter.web: continew-starter.web:

View File

@@ -25,7 +25,7 @@
<!-- 输出日志到控制台 --> <!-- 输出日志到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern> <pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset> <charset>${LOG_CHARSET}</charset>
</encoder> </encoder>
@@ -33,7 +33,7 @@
<!-- 输出日志到控制台(不带颜色) --> <!-- 输出日志到控制台(不带颜色) -->
<appender name="CONSOLE_PROD" class="ch.qos.logback.core.ConsoleAppender"> <appender name="CONSOLE_PROD" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern> <pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset> <charset>${LOG_CHARSET}</charset>
</encoder> </encoder>
@@ -52,14 +52,14 @@
<!-- 日志保留天数 --> <!-- 日志保留天数 -->
<maxHistory>${FILE_MAX_HISTORY}</maxHistory> <maxHistory>${FILE_MAX_HISTORY}</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern> <pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset> <charset>${LOG_CHARSET}</charset>
</encoder> </encoder>
</appender> </appender>
<!-- 输出日志到文件(异步) --> <!-- 输出日志到文件(异步) -->
<appender name="ASYNC_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender"> <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志,默认:如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 --> <!-- 不丢失日志,默认:如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
<discardingThreshold>0</discardingThreshold> <discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度该值会影响性能默认256 --> <!-- 更改默认的队列的深度该值会影响性能默认256 -->