小程序修正
This commit is contained in:
@@ -83,3 +83,10 @@ dubbo:
|
|||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
mapper-locations: classpath:mapper/**/*.xml
|
mapper-locations: classpath:mapper/**/*.xml
|
||||||
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
||||||
|
logging:
|
||||||
|
config: classpath:log4j2.xml
|
||||||
|
charset:
|
||||||
|
console: UTF-8
|
||||||
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
@@ -90,3 +90,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.agent" level="debug" additivity="false">
|
<Logger name="org.xyzh.agent" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import org.xyzh.common.core.domain.LoginDomain;
|
|||||||
import org.xyzh.common.core.domain.LoginParam;
|
import org.xyzh.common.core.domain.LoginParam;
|
||||||
import org.xyzh.common.core.domain.ResultDomain;
|
import org.xyzh.common.core.domain.ResultDomain;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 认证服务接口
|
* @description 认证服务接口
|
||||||
* @filename AuthService.java
|
* @filename AuthService.java
|
||||||
@@ -16,32 +14,32 @@ import jakarta.servlet.http.HttpServletRequest;
|
|||||||
public interface AuthService {
|
public interface AuthService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 登录
|
* @description 登录(用于Dubbo远程调用,clientIp需提前设置到loginParam中)
|
||||||
* @param LoginParam loginParam 登录参数
|
* @param LoginParam loginParam 登录参数(包含clientIp)
|
||||||
* @param HttpServletRequest request 请求
|
|
||||||
* @return ResultDomain<LoginDomain> 登录结果
|
* @return ResultDomain<LoginDomain> 登录结果
|
||||||
* @author yslg
|
* @author yslg
|
||||||
* @since 2025-11-03
|
* @since 2025-11-03
|
||||||
*/
|
*/
|
||||||
ResultDomain<LoginDomain> login(LoginParam loginParam, HttpServletRequest request);
|
ResultDomain<LoginDomain> login(LoginParam loginParam);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 刷新token
|
* @description 刷新token
|
||||||
* @param HttpServletRequest request 请求
|
* @param token 当前token
|
||||||
|
* @param clientIp 客户端IP
|
||||||
* @return ResultDomain<LoginDomain> 刷新token结果
|
* @return ResultDomain<LoginDomain> 刷新token结果
|
||||||
* @author yslg
|
* @author yslg
|
||||||
* @since 2025-11-03
|
* @since 2025-11-03
|
||||||
*/
|
*/
|
||||||
ResultDomain<LoginDomain> refreshToken(HttpServletRequest request);
|
ResultDomain<LoginDomain> refreshToken(String token, String clientIp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 登出
|
* @description 登出
|
||||||
* @param HttpServletRequest request 请求
|
* @param token 当前token
|
||||||
* @return ResultDomain<LoginDomain> 登出结果
|
* @return ResultDomain<LoginDomain> 登出结果
|
||||||
* @author yslg
|
* @author yslg
|
||||||
* @since 2025-11-03
|
* @since 2025-11-03
|
||||||
*/
|
*/
|
||||||
ResultDomain<LoginDomain> logout(HttpServletRequest request);
|
ResultDomain<LoginDomain> logout(String token);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 根据验证码类型获取验证码
|
* @description 根据验证码类型获取验证码
|
||||||
|
|||||||
@@ -52,7 +52,9 @@ public class AuthController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
public ResultDomain<LoginDomain> login(@RequestBody LoginParam loginParam, HttpServletRequest request) {
|
public ResultDomain<LoginDomain> login(@RequestBody LoginParam loginParam, HttpServletRequest request) {
|
||||||
return authService.login(loginParam, request);
|
// 从 request 中提取客户端 IP 并设置到 loginParam
|
||||||
|
loginParam.setClientIp(getClientIP(request));
|
||||||
|
return authService.login(loginParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +66,8 @@ public class AuthController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/logout")
|
@PostMapping("/logout")
|
||||||
public ResultDomain<LoginDomain> logout(HttpServletRequest request) {
|
public ResultDomain<LoginDomain> logout(HttpServletRequest request) {
|
||||||
return authService.logout(request);
|
String token = extractTokenFromRequest(request);
|
||||||
|
return authService.logout(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -88,7 +91,9 @@ public class AuthController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/refresh")
|
@PostMapping("/refresh")
|
||||||
public ResultDomain<LoginDomain> refreshToken(HttpServletRequest request) {
|
public ResultDomain<LoginDomain> refreshToken(HttpServletRequest request) {
|
||||||
return authService.refreshToken(request);
|
String token = extractTokenFromRequest(request);
|
||||||
|
String clientIp = getClientIP(request);
|
||||||
|
return authService.refreshToken(token, clientIp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -321,7 +326,8 @@ public class AuthController {
|
|||||||
loginParam.setEmail(email);
|
loginParam.setEmail(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultDomain<LoginDomain> loginResult = authService.login(loginParam, request);
|
loginParam.setClientIp(getClientIP(request));
|
||||||
|
ResultDomain<LoginDomain> loginResult = authService.login(loginParam);
|
||||||
|
|
||||||
if (loginResult.getSuccess()) {
|
if (loginResult.getSuccess()) {
|
||||||
return ResultDomain.success("注册成功", loginResult.getData());
|
return ResultDomain.success("注册成功", loginResult.getData());
|
||||||
@@ -335,4 +341,35 @@ public class AuthController {
|
|||||||
return ResultDomain.failure("注册失败: " + e.getMessage());
|
return ResultDomain.failure("注册失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从请求中提取Token
|
||||||
|
*/
|
||||||
|
private String extractTokenFromRequest(HttpServletRequest request) {
|
||||||
|
String authHeader = request.getHeader("Authorization");
|
||||||
|
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
||||||
|
return authHeader.substring(7);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取客户端IP地址
|
||||||
|
*/
|
||||||
|
private String getClientIP(HttpServletRequest request) {
|
||||||
|
String ip = request.getHeader("X-Forwarded-For");
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("WL-Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getRemoteAddr();
|
||||||
|
}
|
||||||
|
if (ip != null && ip.contains(",")) {
|
||||||
|
ip = ip.split(",")[0].trim();
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ import org.xyzh.api.system.service.ModulePermissionService;
|
|||||||
import org.xyzh.api.system.vo.SysUserVO;
|
import org.xyzh.api.system.vo.SysUserVO;
|
||||||
import org.xyzh.api.system.vo.PermissionVO;
|
import org.xyzh.api.system.vo.PermissionVO;
|
||||||
import org.xyzh.api.system.vo.UserDeptRoleVO;
|
import org.xyzh.api.system.vo.UserDeptRoleVO;
|
||||||
|
import org.xyzh.auth.enums.UserStatus;
|
||||||
import org.xyzh.auth.strategy.LoginStrategyFactory;
|
import org.xyzh.auth.strategy.LoginStrategyFactory;
|
||||||
import org.xyzh.auth.strategy.LoginStrategy;
|
import org.xyzh.auth.strategy.LoginStrategy;
|
||||||
import org.xyzh.auth.enums.UserStatus;
|
|
||||||
import org.xyzh.auth.utils.CapcatUtils;
|
import org.xyzh.auth.utils.CapcatUtils;
|
||||||
import org.xyzh.common.auth.utils.JwtTokenUtil;
|
import org.xyzh.common.auth.utils.JwtTokenUtil;
|
||||||
import org.xyzh.common.core.domain.LoginDomain;
|
import org.xyzh.common.core.domain.LoginDomain;
|
||||||
@@ -30,7 +30,6 @@ import org.apache.dubbo.config.annotation.DubboService;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -208,7 +207,7 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultDomain<LoginDomain> login(LoginParam loginParam, HttpServletRequest request) {
|
public ResultDomain<LoginDomain> login(LoginParam loginParam) {
|
||||||
String loginType = loginParam.getLoginType();
|
String loginType = loginParam.getLoginType();
|
||||||
String loginAttempt = IdUtil.generateID(); // 生成登录尝试ID
|
String loginAttempt = IdUtil.generateID(); // 生成登录尝试ID
|
||||||
|
|
||||||
@@ -262,7 +261,7 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
SysUserVO userInfo = userInfoResult.getData();
|
SysUserVO userInfo = userInfoResult.getData();
|
||||||
|
|
||||||
// 7. 构建完整的登录域对象
|
// 7. 构建完整的登录域对象
|
||||||
LoginDomain loginDomain = buildLoginDomain(userInfo, loginType, request);
|
LoginDomain loginDomain = buildLoginDomain(userInfo, loginType, loginParam.getClientIp());
|
||||||
if (loginDomain == null) {
|
if (loginDomain == null) {
|
||||||
logLoginAttempt(loginParam, user, false, loginAttempt, "构建登录信息失败");
|
logLoginAttempt(loginParam, user, false, loginAttempt, "构建登录信息失败");
|
||||||
return ResultDomain.failure("构建登录信息失败");
|
return ResultDomain.failure("构建登录信息失败");
|
||||||
@@ -297,10 +296,10 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
* 构建完整的LoginDomain对象
|
* 构建完整的LoginDomain对象
|
||||||
* @param userInfo 用户信息
|
* @param userInfo 用户信息
|
||||||
* @param loginType 登录类型
|
* @param loginType 登录类型
|
||||||
* @param request HTTP请求
|
* @param clientIp 客户端IP地址
|
||||||
* @return LoginDomain 登录域对象
|
* @return LoginDomain 登录域对象
|
||||||
*/
|
*/
|
||||||
public LoginDomain buildLoginDomain(SysUserVO userInfo, String loginType, HttpServletRequest request) {
|
public LoginDomain buildLoginDomain(SysUserVO userInfo, String loginType, String clientIp) {
|
||||||
try {
|
try {
|
||||||
// 1. 转换为 DTO 对象
|
// 1. 转换为 DTO 对象
|
||||||
TbSysUserDTO userDTO = SysUserVO.toDTO(userInfo);
|
TbSysUserDTO userDTO = SysUserVO.toDTO(userInfo);
|
||||||
@@ -369,7 +368,7 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
loginDomain.setUserPermissions(userPermissions);
|
loginDomain.setUserPermissions(userPermissions);
|
||||||
loginDomain.setUserViews(userViews);
|
loginDomain.setUserViews(userViews);
|
||||||
loginDomain.setLoginType(loginType);
|
loginDomain.setLoginType(loginType);
|
||||||
loginDomain.setIpAddress(getClientIP(request));
|
loginDomain.setIpAddress(clientIp);
|
||||||
|
|
||||||
return loginDomain;
|
return loginDomain;
|
||||||
|
|
||||||
@@ -408,10 +407,9 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultDomain<LoginDomain> refreshToken(HttpServletRequest request) {
|
public ResultDomain<LoginDomain> refreshToken(String token, String clientIp) {
|
||||||
try {
|
try {
|
||||||
String token = extractTokenFromRequest(request);
|
if (token == null || token.trim().isEmpty()) {
|
||||||
if (token == null) {
|
|
||||||
return ResultDomain.failure("Token不能为空");
|
return ResultDomain.failure("Token不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +436,7 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
SysUserVO userInfo = userInfoResult.getData();
|
SysUserVO userInfo = userInfoResult.getData();
|
||||||
|
|
||||||
// 4. 重新构建LoginDomain
|
// 4. 重新构建LoginDomain
|
||||||
LoginDomain newLoginDomain = buildLoginDomain(userInfo, oldLoginDomain.getLoginType(), request);
|
LoginDomain newLoginDomain = buildLoginDomain(userInfo, oldLoginDomain.getLoginType(), clientIp);
|
||||||
if (newLoginDomain == null) {
|
if (newLoginDomain == null) {
|
||||||
return ResultDomain.failure("构建登录信息失败");
|
return ResultDomain.failure("构建登录信息失败");
|
||||||
}
|
}
|
||||||
@@ -472,10 +470,9 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultDomain<LoginDomain> logout(HttpServletRequest request) {
|
public ResultDomain<LoginDomain> logout(String token) {
|
||||||
try {
|
try {
|
||||||
String token = extractTokenFromRequest(request);
|
if (token == null || token.trim().isEmpty()) {
|
||||||
if (token == null) {
|
|
||||||
return ResultDomain.failure("Token不能为空");
|
return ResultDomain.failure("Token不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,36 +506,4 @@ public class AuthServiceImpl implements AuthService{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 从请求中提取Token
|
|
||||||
*/
|
|
||||||
private String extractTokenFromRequest(HttpServletRequest request) {
|
|
||||||
String authHeader = request.getHeader("Authorization");
|
|
||||||
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
|
||||||
return authHeader.substring(7);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取客户端IP地址
|
|
||||||
*/
|
|
||||||
private String getClientIP(HttpServletRequest request) {
|
|
||||||
String ip = request.getHeader("X-Forwarded-For");
|
|
||||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
|
||||||
ip = request.getHeader("Proxy-Client-IP");
|
|
||||||
}
|
|
||||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
|
||||||
ip = request.getHeader("WL-Proxy-Client-IP");
|
|
||||||
}
|
|
||||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
|
||||||
ip = request.getRemoteAddr();
|
|
||||||
}
|
|
||||||
// 如果是多个IP,取第一个
|
|
||||||
if (ip != null && ip.contains(",")) {
|
|
||||||
ip = ip.split(",")[0].trim();
|
|
||||||
}
|
|
||||||
return ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,4 +93,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -9,40 +9,14 @@
|
|||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<appenders>
|
<appenders>
|
||||||
<!-- 控制台输出 -->
|
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<!-- INFO级别日志 -->
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<!-- WARN级别日志 -->
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<!-- ERROR级别日志 -->
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -53,42 +27,39 @@
|
|||||||
</appenders>
|
</appenders>
|
||||||
|
|
||||||
<loggers>
|
<loggers>
|
||||||
<!-- Nacos 日志 -->
|
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<!-- MyBatis 日志 -->
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<!-- Spring 日志 -->
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<!-- Auth 模块日志 -->
|
|
||||||
<Logger name="org.xyzh.auth" level="debug" additivity="false">
|
<Logger name="org.xyzh.auth" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<!-- 项目通用模块日志 -->
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.bidding" level="debug" additivity="false">
|
<Logger name="org.xyzh.bidding" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -80,5 +80,18 @@ public class LoginParam implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Boolean rememberMe;
|
private Boolean rememberMe;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端IP地址(用于Dubbo远程调用时传递,避免传递HttpServletRequest)
|
||||||
|
* @author yslg
|
||||||
|
* @since 2025-12-23
|
||||||
|
*/
|
||||||
|
private String clientIp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前Token(用于Dubbo远程调用刷新/登出时传递)
|
||||||
|
* @author yslg
|
||||||
|
* @since 2025-12-23
|
||||||
|
*/
|
||||||
|
private String token;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.crontab" level="debug" additivity="false">
|
<Logger name="org.xyzh.crontab" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -97,3 +97,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.file" level="debug" additivity="false">
|
<Logger name="org.xyzh.file" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -4,8 +4,9 @@
|
|||||||
|
|
||||||
# 开发环境日志
|
# 开发环境日志
|
||||||
logging:
|
logging:
|
||||||
|
config: classpath:log4j2.xml
|
||||||
|
charset:
|
||||||
|
console: UTF-8
|
||||||
|
file: UTF-8
|
||||||
level:
|
level:
|
||||||
org.springframework.cloud.gateway: DEBUG
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
org.springframework.web.reactive: DEBUG
|
|
||||||
reactor.netty: DEBUG
|
|
||||||
org.xyzh: DEBUG
|
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ auth:
|
|||||||
- /urban-lifeline/file/download/**
|
- /urban-lifeline/file/download/**
|
||||||
# ai 服务白名单
|
# ai 服务白名单
|
||||||
- /urban-lifeline/ai/chat/**
|
- /urban-lifeline/ai/chat/**
|
||||||
|
- /urban-lifeline/system/guest/identify
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= # Base64 编码,32字节(256位)
|
secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= # Base64 编码,32字节(256位)
|
||||||
@@ -206,3 +207,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
@@ -1,33 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Configuration status="WARN" monitorInterval="30">
|
<Configuration status="WARN" monitorInterval="30">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</Property>
|
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Property>
|
||||||
<Property name="LOG_PATH">logs</Property>
|
<Property name="LOG_PATH">logs</Property>
|
||||||
<Property name="APP_NAME">gateway</Property>
|
<Property name="APP_NAME">gateway</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<Appenders>
|
<Appenders>
|
||||||
<!-- 控制台输出 -->
|
|
||||||
<Console name="Console" target="SYSTEM_OUT">
|
<Console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</Console>
|
</Console>
|
||||||
|
|
||||||
<!-- 所有日志文件 -->
|
|
||||||
<RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log"
|
<RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log"
|
||||||
filePattern="${LOG_PATH}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
|
filePattern="${LOG_PATH}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<Policies>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<!-- 错误日志文件 -->
|
|
||||||
<RollingFile name="ErrorFile" fileName="${LOG_PATH}/${APP_NAME}-error.log"
|
|
||||||
filePattern="${LOG_PATH}/${APP_NAME}-error-%d{yyyy-MM-dd}-%i.log.gz">
|
|
||||||
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
<SizeBasedTriggeringPolicy size="100MB"/>
|
||||||
@@ -37,30 +25,24 @@
|
|||||||
</Appenders>
|
</Appenders>
|
||||||
|
|
||||||
<Loggers>
|
<Loggers>
|
||||||
<!-- Nacos 日志配置 -->
|
|
||||||
<Logger name="com.alibaba.nacos" level="INFO" additivity="false">
|
<Logger name="com.alibaba.nacos" level="INFO" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFile"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<!-- Spring Cloud Gateway 日志 -->
|
|
||||||
<Logger name="org.springframework.cloud.gateway" level="DEBUG" additivity="false">
|
<Logger name="org.springframework.cloud.gateway" level="DEBUG" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFile"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<!-- 项目日志 -->
|
|
||||||
<Logger name="org.xyzh" level="DEBUG" additivity="false">
|
<Logger name="org.xyzh" level="DEBUG" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFile"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="ErrorFile"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<!-- Root Logger -->
|
|
||||||
<Root level="INFO">
|
<Root level="INFO">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFile"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="ErrorFile"/>
|
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
|||||||
@@ -5,18 +5,19 @@ server:
|
|||||||
# context-path: /urban-lifeline/log # 微服务架构下,context-path由Gateway管理
|
# context-path: /urban-lifeline/log # 微服务架构下,context-path由Gateway管理
|
||||||
|
|
||||||
# ================== Auth ====================
|
# ================== Auth ====================
|
||||||
urban-lifeline:
|
|
||||||
auth:
|
auth:
|
||||||
enabled: true
|
enabled: true
|
||||||
whitelist:
|
gateway-mode: true
|
||||||
- /swagger-ui/**
|
whitelist:
|
||||||
- /swagger-ui.html
|
- /swagger-ui/**
|
||||||
- /v3/api-docs/**
|
- /swagger-ui.html
|
||||||
- /webjars/**
|
- /v3/api-docs/**
|
||||||
- /favicon.ico
|
- /webjars/**
|
||||||
- /error
|
- /favicon.ico
|
||||||
- /actuator/health
|
- /error
|
||||||
- /actuator/info
|
- /actuator/health
|
||||||
|
- /actuator/info
|
||||||
|
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
@@ -94,4 +95,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.log" level="debug" additivity="false">
|
<Logger name="org.xyzh.log" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -5,18 +5,19 @@ server:
|
|||||||
# context-path: /urban-lifeline/message # 微服务架构下,context-path由Gateway管理
|
# context-path: /urban-lifeline/message # 微服务架构下,context-path由Gateway管理
|
||||||
|
|
||||||
# ================== Auth ====================
|
# ================== Auth ====================
|
||||||
urban-lifeline:
|
|
||||||
auth:
|
auth:
|
||||||
enabled: true
|
enabled: true
|
||||||
whitelist:
|
gateway-mode: true
|
||||||
- /swagger-ui/**
|
whitelist:
|
||||||
- /swagger-ui.html
|
- /swagger-ui/**
|
||||||
- /v3/api-docs/**
|
- /swagger-ui.html
|
||||||
- /webjars/**
|
- /v3/api-docs/**
|
||||||
- /favicon.ico
|
- /webjars/**
|
||||||
- /error
|
- /favicon.ico
|
||||||
- /actuator/health
|
- /error
|
||||||
- /actuator/info
|
- /actuator/health
|
||||||
|
- /actuator/info
|
||||||
|
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
@@ -86,3 +87,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.message" level="debug" additivity="false">
|
<Logger name="org.xyzh.message" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -5,18 +5,19 @@ server:
|
|||||||
# context-path: /urban-lifeline/platform # 微服务架构下,context-path由Gateway管理
|
# context-path: /urban-lifeline/platform # 微服务架构下,context-path由Gateway管理
|
||||||
|
|
||||||
# ================== Auth ====================
|
# ================== Auth ====================
|
||||||
urban-lifeline:
|
|
||||||
auth:
|
auth:
|
||||||
enabled: true
|
enabled: true
|
||||||
whitelist:
|
gateway-mode: true
|
||||||
- /swagger-ui/**
|
whitelist:
|
||||||
- /swagger-ui.html
|
- /swagger-ui/**
|
||||||
- /v3/api-docs/**
|
- /swagger-ui.html
|
||||||
- /webjars/**
|
- /v3/api-docs/**
|
||||||
- /favicon.ico
|
- /webjars/**
|
||||||
- /error
|
- /favicon.ico
|
||||||
- /actuator/health
|
- /error
|
||||||
- /actuator/info
|
- /actuator/health
|
||||||
|
- /actuator/info
|
||||||
|
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
@@ -87,3 +88,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.platform" level="debug" additivity="false">
|
<Logger name="org.xyzh.platform" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class GuestController {
|
|||||||
@DubboReference(version = "1.0.0", group = "auth", timeout = 5000, check = false, retries = 0)
|
@DubboReference(version = "1.0.0", group = "auth", timeout = 5000, check = false, retries = 0)
|
||||||
private AuthService authService;
|
private AuthService authService;
|
||||||
|
|
||||||
@DubboReference(version = "1.0.0", group = "system", timeout = 5000, check = false, retries = 0)
|
@Autowired
|
||||||
private ModulePermissionService modulePermissionService;
|
private ModulePermissionService modulePermissionService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -129,8 +129,11 @@ public class GuestController {
|
|||||||
// 设置登录类型为微信小程序
|
// 设置登录类型为微信小程序
|
||||||
loginParam.setLoginType("wechat_miniprogram");
|
loginParam.setLoginType("wechat_miniprogram");
|
||||||
|
|
||||||
|
// 从 request 中提取客户端 IP 并设置到 loginParam
|
||||||
|
loginParam.setClientIp(getClientIP(request));
|
||||||
|
|
||||||
// 1. 尝试通过AuthService登录(员工)
|
// 1. 尝试通过AuthService登录(员工)
|
||||||
ResultDomain<LoginDomain> loginResult = authService.login(loginParam, request);
|
ResultDomain<LoginDomain> loginResult = authService.login(loginParam);
|
||||||
if (loginResult.getSuccess() && loginResult.getData() != null) {
|
if (loginResult.getSuccess() && loginResult.getData() != null) {
|
||||||
// 登录成功,是系统员工
|
// 登录成功,是系统员工
|
||||||
return loginResult;
|
return loginResult;
|
||||||
@@ -261,4 +264,24 @@ public class GuestController {
|
|||||||
|
|
||||||
return loginDomain;
|
return loginDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取客户端IP地址
|
||||||
|
*/
|
||||||
|
private String getClientIP(HttpServletRequest request) {
|
||||||
|
String ip = request.getHeader("X-Forwarded-For");
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("WL-Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getRemoteAddr();
|
||||||
|
}
|
||||||
|
if (ip != null && ip.contains(",")) {
|
||||||
|
ip = ip.split(",")[0].trim();
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
# ================== Server ==================
|
# ================== Server ==================
|
||||||
server:
|
server:
|
||||||
port: 8082
|
port: 8182
|
||||||
servlet:
|
# servlet:
|
||||||
context-path: /urban-lifeline/system
|
# context-path: /urban-lifeline/system # 微服务架构下,context-path由Gateway管理
|
||||||
# ================== Auth ====================
|
# ================== Auth ====================
|
||||||
|
|
||||||
auth:
|
auth:
|
||||||
enabled: true
|
enabled: true
|
||||||
gateway-mode: true
|
gateway-mode: true
|
||||||
@@ -28,13 +29,11 @@ auth:
|
|||||||
# 健康检查
|
# 健康检查
|
||||||
- /actuator/health
|
- /actuator/health
|
||||||
- /actuator/info
|
- /actuator/info
|
||||||
|
- /system/guest/identify
|
||||||
# 其他需要放行的路径
|
# 其他需要放行的路径
|
||||||
# - /public/**
|
# - /public/**
|
||||||
# - /api/public/**
|
# - /api/public/**
|
||||||
|
|
||||||
|
|
||||||
# ================== Security ==================
|
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
# AES-256 密钥(Base64编码)
|
# AES-256 密钥(Base64编码)
|
||||||
@@ -43,6 +42,17 @@ security:
|
|||||||
|
|
||||||
# ================== Spring ==================
|
# ================== Spring ==================
|
||||||
spring:
|
spring:
|
||||||
|
application:
|
||||||
|
name: system-service
|
||||||
|
|
||||||
|
# ================== Spring Cloud Nacos ==================
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
discovery:
|
||||||
|
server-addr: 127.0.0.1:8848
|
||||||
|
namespace: dev
|
||||||
|
group: DEFAULT_GROUP
|
||||||
|
|
||||||
# ================== DataSource ==================
|
# ================== DataSource ==================
|
||||||
datasource:
|
datasource:
|
||||||
# 按你的实际库名改一下,比如 urban-lifeline_system
|
# 按你的实际库名改一下,比如 urban-lifeline_system
|
||||||
@@ -57,7 +67,7 @@ spring:
|
|||||||
host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改
|
host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改
|
||||||
port: 6379
|
port: 6379
|
||||||
database: 0
|
database: 0
|
||||||
# password: "" # 如果有密码就填上,没密码可以去掉这一行
|
password: 123456 # 如果有密码就填上,没密码可以去掉这一行
|
||||||
# ================== SpringDoc ==================
|
# ================== SpringDoc ==================
|
||||||
springdoc:
|
springdoc:
|
||||||
api-docs:
|
api-docs:
|
||||||
@@ -103,3 +113,12 @@ dubbo:
|
|||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
mapper-locations: classpath:mapper/**/*.xml
|
mapper-locations: classpath:mapper/**/*.xml
|
||||||
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
||||||
|
|
||||||
|
# ================== Logging ==================
|
||||||
|
logging:
|
||||||
|
config: classpath:log4j2.xml
|
||||||
|
charset:
|
||||||
|
console: UTF-8
|
||||||
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -29,15 +29,14 @@ auth:
|
|||||||
# 健康检查
|
# 健康检查
|
||||||
- /actuator/health
|
- /actuator/health
|
||||||
- /actuator/info
|
- /actuator/info
|
||||||
|
- /system/guest/identify
|
||||||
# 其他需要放行的路径
|
# 其他需要放行的路径
|
||||||
# - /public/**
|
# - /public/**
|
||||||
# - /api/public/**
|
# - /api/public/**
|
||||||
|
|
||||||
security:
|
security:
|
||||||
aes:
|
aes:
|
||||||
secret-key: 1234567890qwer
|
secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=
|
||||||
|
|
||||||
|
|
||||||
# ================== Spring ==================
|
# ================== Spring ==================
|
||||||
spring:
|
spring:
|
||||||
@@ -119,3 +118,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.system" level="debug" additivity="false">
|
<Logger name="org.xyzh.system" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -86,3 +86,10 @@ dubbo:
|
|||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
mapper-locations: classpath:mapper/**/*.xml
|
mapper-locations: classpath:mapper/**/*.xml
|
||||||
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
type-aliases-package: org.xyzh.common.dto, org.xyzh.api
|
||||||
|
logging:
|
||||||
|
config: classpath:log4j2.xml
|
||||||
|
charset:
|
||||||
|
console: UTF-8
|
||||||
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
@@ -93,3 +93,5 @@ logging:
|
|||||||
charset:
|
charset:
|
||||||
console: UTF-8
|
console: UTF-8
|
||||||
file: UTF-8
|
file: UTF-8
|
||||||
|
level:
|
||||||
|
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
|
||||||
|
|||||||
@@ -11,34 +11,12 @@
|
|||||||
<appenders>
|
<appenders>
|
||||||
<console name="Console" target="SYSTEM_OUT">
|
<console name="Console" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</console>
|
</console>
|
||||||
|
|
||||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
|
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
|
||||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
|
||||||
<Policies>
|
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
|
||||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
|
||||||
</Policies>
|
|
||||||
<DefaultRolloverStrategy max="30"/>
|
|
||||||
</RollingFile>
|
|
||||||
|
|
||||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
|
|
||||||
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
|
||||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
|
||||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||||
<Policies>
|
<Policies>
|
||||||
<TimeBasedTriggeringPolicy interval="1"/>
|
<TimeBasedTriggeringPolicy interval="1"/>
|
||||||
@@ -51,35 +29,37 @@
|
|||||||
<loggers>
|
<loggers>
|
||||||
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
<logger name="com.alibaba.nacos" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="org.mybatis" level="debug" additivity="false">
|
<logger name="org.mybatis" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<Logger name="org.springframework" level="info" additivity="false">
|
<Logger name="org.springframework" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="Console"/>
|
||||||
|
<AppenderRef ref="RollingFile"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.workcase" level="debug" additivity="false">
|
<Logger name="org.xyzh.workcase" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||||
<AppenderRef ref="Console"/>
|
<AppenderRef ref="Console"/>
|
||||||
<AppenderRef ref="RollingFileInfo"/>
|
<AppenderRef ref="RollingFile"/>
|
||||||
<AppenderRef ref="RollingFileWarn"/>
|
|
||||||
<AppenderRef ref="RollingFileError"/>
|
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
<root level="info">
|
<root level="info">
|
||||||
<appender-ref ref="Console"/>
|
<appender-ref ref="Console"/>
|
||||||
<appender-ref ref="RollingFileInfo"/>
|
<appender-ref ref="RollingFile"/>
|
||||||
<appender-ref ref="RollingFileWarn"/>
|
|
||||||
<appender-ref ref="RollingFileError"/>
|
|
||||||
</root>
|
</root>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -84,6 +84,12 @@
|
|||||||
|
|
||||||
<style>
|
<style>
|
||||||
/*每个页面公共css */
|
/*每个页面公共css */
|
||||||
|
view {
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
.uni-row {
|
.uni-row {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,35 +9,34 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// 聊天室列表
|
|
||||||
"path": "pages/chatRoom/chatRoomList/chatRoomList",
|
"path": "pages/chatRoom/chatRoomList/chatRoomList",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": ""
|
"navigationStyle": "custom",
|
||||||
|
"navigationBarTitleText": "我的聊天室"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// 聊天室
|
|
||||||
"path": "pages/chatRoom/chatRoom/chatRoom",
|
"path": "pages/chatRoom/chatRoom/chatRoom",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": ""
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/workcase/workcaseList/workcaseList",
|
"path": "pages/workcase/workcaseList/workcaseList",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": ""
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/workcase/workcaseDetail/workcaseDetail",
|
"path": "pages/workcase/workcaseDetail/workcaseDetail",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": ""
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/meeting/Meeting/Meeting",
|
"path": "pages/meeting/Meeting/Meeting",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": ""
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -10,30 +10,30 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 176rpx;
|
|
||||||
padding-top: 88rpx;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: row;
|
||||||
|
align-items: flex-end;
|
||||||
padding-left: 24rpx;
|
padding-left: 24rpx;
|
||||||
padding-right: 24rpx;
|
padding-right: 24rpx;
|
||||||
|
padding-bottom: 16rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-back {
|
.nav-back {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
height: 60rpx;
|
height: 64rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.back-arrow {
|
.nav-back-icon {
|
||||||
width: 20rpx;
|
width: 20rpx;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
border-left: 4rpx solid #222;
|
border-left: 4rpx solid #333;
|
||||||
border-bottom: 4rpx solid #222;
|
border-bottom: 4rpx solid #333;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #222;
|
color: #222;
|
||||||
margin-left: 16rpx;
|
margin-left: 16rpx;
|
||||||
|
line-height: 64rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!-- 自定义导航栏 -->
|
<!-- 自定义导航栏 -->
|
||||||
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
||||||
<view class="nav-back" @tap="goBack">
|
<view class="nav-back" @tap="goBack">
|
||||||
<text class="nav-back-icon">←</text>
|
<view class="nav-back-icon"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="nav-title">{{ roomName }}</text>
|
<text class="nav-title">{{ roomName }}</text>
|
||||||
<view class="nav-actions">
|
<view class="nav-actions">
|
||||||
|
|||||||
@@ -8,57 +8,55 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 176rpx;
|
|
||||||
padding-top: 88rpx;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
align-items: flex-end;
|
||||||
padding-left: 24rpx;
|
padding-left: 24rpx;
|
||||||
padding-right: 24rpx;
|
padding-right: 24rpx;
|
||||||
|
padding-bottom: 16rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-back {
|
.nav-back {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
height: 60rpx;
|
height: 64rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.back-arrow {
|
.nav-back-icon {
|
||||||
width: 20rpx;
|
width: 20rpx;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
border-left: 4rpx solid #222;
|
border-left: 4rpx solid #333;
|
||||||
border-bottom: 4rpx solid #222;
|
border-bottom: 4rpx solid #333;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-title {
|
.nav-title {
|
||||||
font-size: 34rpx;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #222;
|
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
font-size: 34rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #333;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding-right: 174rpx;
|
line-height: 64rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-capsule {
|
.nav-capsule {
|
||||||
width: 174rpx;
|
width: 174rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
border-radius: 32rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.list {
|
.list {
|
||||||
margin-top: 176rpx;
|
|
||||||
padding: 20rpx 24rpx;
|
padding: 20rpx 24rpx;
|
||||||
padding-bottom: 60rpx;
|
padding-bottom: 60rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.room-card {
|
.room-card {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 24rpx;
|
padding: 24rpx;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
@@ -85,12 +83,14 @@
|
|||||||
|
|
||||||
.room-info {
|
.room-info {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
flex-direction: column;
|
||||||
margin-left: 20rpx;
|
margin-left: 20rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.room-header {
|
.room-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: 12rpx;
|
||||||
@@ -115,6 +115,7 @@
|
|||||||
|
|
||||||
.room-footer {
|
.room-footer {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,16 +4,16 @@
|
|||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
<view class="page">
|
<view class="page">
|
||||||
<!-- 自定义导航栏 -->
|
<!-- 自定义导航栏 -->
|
||||||
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
<view class="nav" :style="{ paddingTop: navPaddingTop + 'px', height: navHeight + 'px' }">
|
||||||
<view class="nav-back" @tap="goBack">
|
<view class="nav-back" @tap="goBack">
|
||||||
<text class="nav-back-icon">←</text>
|
<view class="nav-back-icon"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="nav-title">我的聊天室</text>
|
<text class="nav-title">我的聊天室</text>
|
||||||
<view class="nav-capsule"></view>
|
<view class="nav-capsule"></view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 聊天室列表 -->
|
<!-- 聊天室列表 -->
|
||||||
<scroll-view class="list" scroll-y="true" :style="{ marginTop: headerTotalHeight + 'px' }">
|
<scroll-view class="list" scroll-y="true" :style="{ marginTop: navHeight + 'px' }">
|
||||||
<view class="room-card" v-for="(room, index) in chatRooms" :key="index" @tap="enterRoom(room)">
|
<view class="room-card" v-for="(room, index) in chatRooms" :key="index" @tap="enterRoom(room)">
|
||||||
<view class="room-avatar">
|
<view class="room-avatar">
|
||||||
<text class="avatar-text">{{ room.guestName?.charAt(0) || '客' }}</text>
|
<text class="avatar-text">{{ room.guestName?.charAt(0) || '客' }}</text>
|
||||||
@@ -53,9 +53,10 @@
|
|||||||
import { ref, onMounted } from 'vue'
|
import { ref, onMounted } from 'vue'
|
||||||
import type { ChatRoomVO } from '@/types/workcase'
|
import type { ChatRoomVO } from '@/types/workcase'
|
||||||
|
|
||||||
// 响应式数据
|
// 导航栏
|
||||||
const headerPaddingTop = ref<number>(44)
|
const navPaddingTop = ref<number>(0)
|
||||||
const headerTotalHeight = ref<number>(88)
|
const navHeight = ref<number>(44)
|
||||||
|
const capsuleHeight = ref<number>(32)
|
||||||
|
|
||||||
// 聊天室列表
|
// 聊天室列表
|
||||||
const chatRooms = ref<ChatRoomVO[]>([
|
const chatRooms = ref<ChatRoomVO[]>([
|
||||||
@@ -94,24 +95,23 @@ const chatRooms = ref<ChatRoomVO[]>([
|
|||||||
|
|
||||||
// 生命周期
|
// 生命周期
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
uni.getSystemInfo({
|
// #ifdef MP-WEIXIN
|
||||||
success: (res) => {
|
try {
|
||||||
// #ifdef MP-WEIXIN
|
const menuButton = uni.getMenuButtonBoundingClientRect()
|
||||||
try {
|
navPaddingTop.value = menuButton.top
|
||||||
const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
|
capsuleHeight.value = menuButton.height
|
||||||
headerPaddingTop.value = menuButtonInfo.top
|
navHeight.value = menuButton.bottom + 8
|
||||||
headerTotalHeight.value = menuButtonInfo.bottom + 8
|
} catch (e) {
|
||||||
} catch (e) {
|
const sysInfo = uni.getSystemInfoSync()
|
||||||
headerPaddingTop.value = res.statusBarHeight || 44
|
navPaddingTop.value = sysInfo.statusBarHeight || 20
|
||||||
headerTotalHeight.value = (res.statusBarHeight || 44) + 44
|
navHeight.value = navPaddingTop.value + 44
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
// #ifndef MP-WEIXIN
|
// #ifndef MP-WEIXIN
|
||||||
headerPaddingTop.value = res.statusBarHeight || 44
|
const sysInfo = uni.getSystemInfoSync()
|
||||||
headerTotalHeight.value = (res.statusBarHeight || 44) + 44
|
navPaddingTop.value = sysInfo.statusBarHeight || 20
|
||||||
// #endif
|
navHeight.value = navPaddingTop.value + 44
|
||||||
}
|
// #endif
|
||||||
})
|
|
||||||
|
|
||||||
loadChatRooms()
|
loadChatRooms()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -94,6 +94,8 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
background: none !important;
|
||||||
|
border: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ring {
|
.ring {
|
||||||
@@ -102,17 +104,29 @@
|
|||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: 1px solid rgba(100, 180, 255, 0.15);
|
background: none !important;
|
||||||
|
border: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.r1 { width: 260px; height: 260px; }
|
.r1 { width: 260px; height: 260px; }
|
||||||
.r2 { width: 200px; height: 200px; border-color: rgba(100, 180, 255, 0.2); }
|
.r2 { width: 200px; height: 200px; }
|
||||||
.r3 { width: 150px; height: 150px; border-color: rgba(100, 180, 255, 0.25); }
|
.r3 { width: 150px; height: 150px; }
|
||||||
.r4 { width: 110px; height: 110px; border-color: rgba(100, 180, 255, 0.35); }
|
.r4 { width: 110px; height: 110px; }
|
||||||
|
|
||||||
.robot {
|
.robot {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
width: 140px;
|
||||||
|
height: 140px;
|
||||||
|
/* 父容器加一层径向渐变背景,模拟外层模糊光晕 */
|
||||||
|
background: radial-gradient(circle at center,
|
||||||
|
rgba(180, 220, 255, 0.5) 0%,
|
||||||
|
rgba(180, 220, 255, 0.25) 50%,
|
||||||
|
transparent 75%);
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.robot-face {
|
.robot-face {
|
||||||
@@ -125,7 +139,10 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
box-shadow: 0 10px 40px rgba(180, 220, 255, 0.5), inset 0 0 20px rgba(255, 255, 255, 0.8);
|
/* 只保留内阴影,外模糊交给父容器的径向渐变 */
|
||||||
|
box-shadow: inset 0 0 20px rgba(255, 255, 255, 0.8);
|
||||||
|
/* 取消overflow:hidden,避免裁切父容器的渐变光晕 */
|
||||||
|
overflow: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.eye {
|
.eye {
|
||||||
@@ -138,9 +155,9 @@
|
|||||||
.float-tag {
|
.float-tag {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
background: rgba(255, 255, 255, 0.8);
|
background: transparent; /* 去掉背景色,和左侧一致 */
|
||||||
border: 1px solid rgba(200, 220, 255, 0.5);
|
border: none; /* 去掉边框 */
|
||||||
border-radius: 16px;
|
border-radius: 0; /* 保持直角(如果需要圆角也可以改回16px) */
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
@@ -192,7 +209,7 @@
|
|||||||
padding-bottom: 120px;
|
padding-bottom: 120px;
|
||||||
position: relative;
|
position: relative;
|
||||||
// 为固定定位的header留出空间
|
// 为固定定位的header留出空间
|
||||||
margin-top: 76px; // 默认header高度
|
margin-top: 50px; // 默认header高度
|
||||||
}
|
}
|
||||||
|
|
||||||
// 欢迎界面
|
// 欢迎界面
|
||||||
|
|||||||
@@ -112,26 +112,19 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, nextTick, onMounted } from 'vue'
|
import { ref, nextTick, onMounted } from 'vue'
|
||||||
import WorkcaseCreator from '@/components/WorkcaseCreator/WorkcaseCreator.uvue'
|
import WorkcaseCreator from '@/components/WorkcaseCreator/WorkcaseCreator.uvue'
|
||||||
|
import { guestAPI, workcaseChatAPI } from '@/api'
|
||||||
|
import type { TbWorkcaseDTO } from '@/types'
|
||||||
|
|
||||||
// 接口定义
|
// 前端消息展示类型
|
||||||
interface Message {
|
interface ChatMessageItem {
|
||||||
type : 'user' | 'bot'
|
type: 'user' | 'bot'
|
||||||
content : string
|
content: string
|
||||||
time : string
|
time: string
|
||||||
actions ?: string[] | null
|
actions?: string[] | null
|
||||||
}
|
|
||||||
|
|
||||||
interface WorkcaseData {
|
|
||||||
title : string
|
|
||||||
category : string
|
|
||||||
priority : string
|
|
||||||
description : string
|
|
||||||
contact : string
|
|
||||||
images : string[]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 响应式数据
|
// 响应式数据
|
||||||
const messages = ref<Message[]>([])
|
const messages = ref<ChatMessageItem[]>([])
|
||||||
const inputText = ref<string>('')
|
const inputText = ref<string>('')
|
||||||
const isTyping = ref<boolean>(false)
|
const isTyping = ref<boolean>(false)
|
||||||
const scrollTop = ref<number>(0)
|
const scrollTop = ref<number>(0)
|
||||||
@@ -144,12 +137,17 @@
|
|||||||
const userInfo = ref({
|
const userInfo = ref({
|
||||||
wechatId: '',
|
wechatId: '',
|
||||||
username: '',
|
username: '',
|
||||||
phone: ''
|
phone: '',
|
||||||
|
userId: ''
|
||||||
})
|
})
|
||||||
const isMockMode = ref(true) // 开发环境mock模式
|
const isMockMode = ref(true) // 开发环境mock模式
|
||||||
|
|
||||||
|
// AI 对话相关
|
||||||
|
const chatId = ref<string>('') // 当前会话ID
|
||||||
|
const currentTaskId = ref<string>('') // 当前任务ID(用于停止)
|
||||||
|
|
||||||
// 初始化用户信息
|
// 初始化用户信息
|
||||||
function initUserInfo() {
|
async function initUserInfo() {
|
||||||
// #ifdef MP-WEIXIN
|
// #ifdef MP-WEIXIN
|
||||||
// 正式环境:从微信获取用户信息
|
// 正式环境:从微信获取用户信息
|
||||||
// wx.login({
|
// wx.login({
|
||||||
@@ -165,9 +163,10 @@
|
|||||||
userInfo.value = {
|
userInfo.value = {
|
||||||
wechatId: '17857100375',
|
wechatId: '17857100375',
|
||||||
username: '测试用户',
|
username: '测试用户',
|
||||||
phone: '17857100375'
|
phone: '17857100375',
|
||||||
|
userId: ''
|
||||||
}
|
}
|
||||||
doIdentify()
|
await doIdentify()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,9 +176,9 @@
|
|||||||
itemList: ['员工 (17857100375)', '访客 (17857100376)'],
|
itemList: ['员工 (17857100375)', '访客 (17857100376)'],
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
if (res.tapIndex === 0) {
|
if (res.tapIndex === 0) {
|
||||||
userInfo.value = { wechatId: '17857100375', username: '员工用户', phone: '17857100375' }
|
userInfo.value = { wechatId: '17857100375', username: '员工用户', phone: '17857100375', userId: '' }
|
||||||
} else {
|
} else {
|
||||||
userInfo.value = { wechatId: '17857100376', username: '访客用户', phone: '17857100376' }
|
userInfo.value = { wechatId: '17857100376', username: '访客用户', phone: '17857100376', userId: '' }
|
||||||
}
|
}
|
||||||
doIdentify()
|
doIdentify()
|
||||||
}
|
}
|
||||||
@@ -187,31 +186,29 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 调用identify接口
|
// 调用identify接口
|
||||||
function doIdentify() {
|
async function doIdentify() {
|
||||||
uni.showLoading({ title: '登录中...' })
|
uni.showLoading({ title: '登录中...' })
|
||||||
uni.request({
|
try {
|
||||||
url: 'http://localhost:8180/urban-lifeline/system/guest/identify',
|
const res = await guestAPI.identify({
|
||||||
method: 'POST',
|
wechatId: userInfo.value.wechatId,
|
||||||
header: { 'Content-Type': 'application/json' },
|
phone: userInfo.value.phone
|
||||||
data: { wechatId: userInfo.value.wechatId, phone: userInfo.value.phone },
|
})
|
||||||
success: (res : any) => {
|
uni.hideLoading()
|
||||||
uni.hideLoading()
|
if (res.success && res.data) {
|
||||||
if (res.statusCode === 200 && res.data?.success) {
|
const loginDomain = res.data
|
||||||
const loginDomain = res.data.data
|
uni.setStorageSync('token', loginDomain.token || '')
|
||||||
uni.setStorageSync('token', loginDomain.token || '')
|
uni.setStorageSync('userInfo', JSON.stringify(loginDomain.user))
|
||||||
uni.setStorageSync('userInfo', JSON.stringify(loginDomain.user))
|
uni.setStorageSync('wechatId', userInfo.value.wechatId)
|
||||||
uni.setStorageSync('wechatId', userInfo.value.wechatId)
|
userInfo.value.userId = loginDomain.user?.userId || ''
|
||||||
console.log('identify成功:', loginDomain)
|
console.log('identify成功:', loginDomain)
|
||||||
uni.showToast({ title: '登录成功', icon: 'success' })
|
uni.showToast({ title: '登录成功', icon: 'success' })
|
||||||
} else {
|
} else {
|
||||||
console.error('identify失败:', res.data?.message)
|
console.error('identify失败:', res.message)
|
||||||
}
|
|
||||||
},
|
|
||||||
fail: (err) => {
|
|
||||||
uni.hideLoading()
|
|
||||||
console.error('identify请求失败:', err)
|
|
||||||
}
|
}
|
||||||
})
|
} catch (err) {
|
||||||
|
uni.hideLoading()
|
||||||
|
console.error('identify请求失败:', err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生命周期
|
// 生命周期
|
||||||
@@ -259,7 +256,7 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
function sendMessage() {
|
async function sendMessage() {
|
||||||
const text = inputText.value.trim()
|
const text = inputText.value.trim()
|
||||||
if (!text || isTyping.value) return
|
if (!text || isTyping.value) return
|
||||||
|
|
||||||
@@ -267,8 +264,115 @@
|
|||||||
addMessage('user', text)
|
addMessage('user', text)
|
||||||
inputText.value = ''
|
inputText.value = ''
|
||||||
|
|
||||||
// 模拟AI回复
|
// 调用AI聊天接口
|
||||||
simulateAIResponse(text)
|
await callAIChat(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用AI聊天接口
|
||||||
|
async function callAIChat(query : string) {
|
||||||
|
isTyping.value = true
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 如果没有会话ID,先创建会话
|
||||||
|
if (!chatId.value) {
|
||||||
|
const createRes = await workcaseChatAPI.createChat({
|
||||||
|
title: '智能助手对话',
|
||||||
|
userId: userInfo.value.userId || userInfo.value.wechatId
|
||||||
|
})
|
||||||
|
if (createRes.success && createRes.data) {
|
||||||
|
chatId.value = createRes.data.chatId || ''
|
||||||
|
console.log('创建会话成功:', chatId.value)
|
||||||
|
} else {
|
||||||
|
throw new Error(createRes.message || '创建会话失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 准备流式对话
|
||||||
|
const prepareRes = await workcaseChatAPI.prepareChatMessageSession({
|
||||||
|
chatId: chatId.value,
|
||||||
|
message: query
|
||||||
|
})
|
||||||
|
if (!prepareRes.success || !prepareRes.data) {
|
||||||
|
throw new Error(prepareRes.message || '准备对话失败')
|
||||||
|
}
|
||||||
|
const sessionId = prepareRes.data
|
||||||
|
console.log('准备流式对话成功:', sessionId)
|
||||||
|
|
||||||
|
// 添加空的AI消息占位
|
||||||
|
const messageIndex = messages.value.length
|
||||||
|
addMessage('bot', '')
|
||||||
|
|
||||||
|
// 建立SSE连接
|
||||||
|
streamChat(sessionId, messageIndex)
|
||||||
|
} catch (error : any) {
|
||||||
|
console.error('AI聊天失败:', error)
|
||||||
|
isTyping.value = false
|
||||||
|
addMessage('bot', '抱歉,AI服务暂时不可用,请稍后重试。')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SSE 流式对话
|
||||||
|
function streamChat(sessionId : string, messageIndex : number) {
|
||||||
|
const url = `http://localhost:8180${workcaseChatAPI.getStreamUrl(sessionId)}`
|
||||||
|
console.log('建立SSE连接:', url)
|
||||||
|
|
||||||
|
const requestTask = uni.request({
|
||||||
|
url: url,
|
||||||
|
method: 'GET',
|
||||||
|
header: { 'Accept': 'text/event-stream' },
|
||||||
|
enableChunked: true,
|
||||||
|
success: (res : any) => {
|
||||||
|
console.log('SSE请求完成:', res)
|
||||||
|
isTyping.value = false
|
||||||
|
},
|
||||||
|
fail: (err) => {
|
||||||
|
console.error('SSE请求失败:', err)
|
||||||
|
isTyping.value = false
|
||||||
|
messages.value[messageIndex].content = '抱歉,网络连接失败,请稍后重试。'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 监听分块数据
|
||||||
|
requestTask.onChunkReceived((res : any) => {
|
||||||
|
try {
|
||||||
|
const decoder = new TextDecoder('utf-8')
|
||||||
|
const text = decoder.decode(new Uint8Array(res.data))
|
||||||
|
console.log('收到分块数据:', text)
|
||||||
|
|
||||||
|
const lines = text.split('\n')
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.startsWith('data:')) {
|
||||||
|
const dataStr = line.substring(5).trim()
|
||||||
|
if (dataStr && dataStr !== '[DONE]') {
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(dataStr)
|
||||||
|
const event = data.event
|
||||||
|
|
||||||
|
if (event === 'message' || event === 'agent_message') {
|
||||||
|
if (data.answer) {
|
||||||
|
messages.value[messageIndex].content += data.answer
|
||||||
|
}
|
||||||
|
} else if (event === 'message_end') {
|
||||||
|
isTyping.value = false
|
||||||
|
if (data.task_id) {
|
||||||
|
currentTaskId.value = data.task_id
|
||||||
|
}
|
||||||
|
} else if (event === 'error') {
|
||||||
|
console.error('SSE错误:', data.message)
|
||||||
|
isTyping.value = false
|
||||||
|
messages.value[messageIndex].content = data.message || '抱歉,发生错误,请稍后重试。'
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log('解析SSE数据失败:', dataStr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('处理分块数据失败:', e)
|
||||||
|
}
|
||||||
|
nextTick(() => scrollToBottom())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加消息
|
// 添加消息
|
||||||
@@ -359,7 +463,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 工单创建成功
|
// 工单创建成功
|
||||||
function onWorkcaseCreated(workcaseData : WorkcaseData) {
|
function onWorkcaseCreated(workcaseData : TbWorkcaseDTO) {
|
||||||
hideCreator()
|
hideCreator()
|
||||||
|
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
@@ -368,7 +472,7 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 添加成功消息
|
// 添加成功消息
|
||||||
addMessage('bot', `工单创建成功!\n标题:${workcaseData.title}\n分类:${workcaseData.category}\n我们会尽快处理您的问题。`, ['查看工单', '创建新工单'])
|
addMessage('bot', `工单创建成功!\n类型:${workcaseData.type || ''}\n设备:${workcaseData.device || ''}\n我们会尽快处理您的问题。`, ['查看工单', '创建新工单'])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 跳转到工单列表
|
// 跳转到工单列表
|
||||||
@@ -408,9 +512,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理快速问题
|
// 处理快速问题
|
||||||
function handleQuickQuestion(question : string) {
|
async function handleQuickQuestion(question : string) {
|
||||||
addMessage('user', question)
|
addMessage('user', question)
|
||||||
simulateAIResponse(question)
|
await callAIChat(question)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 显示上传选项
|
// 显示上传选项
|
||||||
|
|||||||
@@ -8,44 +8,45 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 176rpx;
|
|
||||||
padding-top: 88rpx;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
align-items: flex-end;
|
||||||
padding-left: 24rpx;
|
padding-left: 24rpx;
|
||||||
padding-right: 24rpx;
|
padding-right: 24rpx;
|
||||||
|
padding-bottom: 16rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-back {
|
.nav-back {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
height: 60rpx;
|
height: 64rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.back-arrow {
|
.nav-back-icon {
|
||||||
width: 20rpx;
|
width: 20rpx;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
border-left: 4rpx solid #222;
|
border-left: 4rpx solid #333;
|
||||||
border-bottom: 4rpx solid #222;
|
border-bottom: 4rpx solid #333;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-title {
|
.nav-title {
|
||||||
|
flex: 1;
|
||||||
font-size: 34rpx;
|
font-size: 34rpx;
|
||||||
font-weight: 600;
|
font-weight: 500;
|
||||||
color: #222;
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 64rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-capsule {
|
.nav-capsule {
|
||||||
width: 174rpx;
|
width: 174rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
border-radius: 32rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-container {
|
.meeting-container {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!-- 自定义导航栏 -->
|
<!-- 自定义导航栏 -->
|
||||||
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
||||||
<view class="nav-back" @tap="goBack">
|
<view class="nav-back" @tap="goBack">
|
||||||
<text class="nav-back-icon">←</text>
|
<view class="nav-back-icon"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="nav-title">视频会议</text>
|
<text class="nav-title">视频会议</text>
|
||||||
<view class="nav-capsule"></view>
|
<view class="nav-capsule"></view>
|
||||||
|
|||||||
@@ -8,45 +8,45 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 176rpx;
|
|
||||||
padding-top: 88rpx;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
align-items: flex-end;
|
||||||
padding-left: 24rpx;
|
padding-left: 24rpx;
|
||||||
padding-right: 24rpx;
|
padding-right: 24rpx;
|
||||||
|
padding-bottom: 16rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-back {
|
.nav-back {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
height: 60rpx;
|
height: 64rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.back-arrow {
|
.nav-back-icon {
|
||||||
width: 20rpx;
|
width: 20rpx;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
border-left: 4rpx solid #222;
|
border-left: 4rpx solid #333;
|
||||||
border-bottom: 4rpx solid #222;
|
border-bottom: 4rpx solid #333;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-title {
|
.nav-title {
|
||||||
|
flex: 1;
|
||||||
font-size: 34rpx;
|
font-size: 34rpx;
|
||||||
font-weight: 600;
|
font-weight: 500;
|
||||||
color: #222;
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 64rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-capsule {
|
.nav-capsule {
|
||||||
width: 174rpx;
|
width: 174rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
background: #f5f5f5;
|
|
||||||
border-radius: 32rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
@@ -66,6 +66,7 @@
|
|||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -94,6 +95,7 @@
|
|||||||
|
|
||||||
.info-item {
|
.info-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 16rpx 0;
|
padding: 16rpx 0;
|
||||||
}
|
}
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
|
|
||||||
.timeline-item {
|
.timeline-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-bottom: 32rpx;
|
padding-bottom: 32rpx;
|
||||||
}
|
}
|
||||||
@@ -248,10 +251,12 @@
|
|||||||
|
|
||||||
.timeline-content {
|
.timeline-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeline-header {
|
.timeline-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 8rpx;
|
margin-bottom: 8rpx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!-- 自定义导航栏 -->
|
<!-- 自定义导航栏 -->
|
||||||
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
||||||
<view class="nav-back" @tap="goBack">
|
<view class="nav-back" @tap="goBack">
|
||||||
<text class="nav-back-icon">←</text>
|
<view class="nav-back-icon"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="nav-title">工单详情</text>
|
<text class="nav-title">工单详情</text>
|
||||||
<view class="nav-capsule"></view>
|
<view class="nav-capsule"></view>
|
||||||
|
|||||||
@@ -8,49 +8,45 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 176rpx;
|
|
||||||
padding-top: 88rpx;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
align-items: flex-end;
|
||||||
padding-left: 24rpx;
|
padding-left: 24rpx;
|
||||||
padding-right: 24rpx;
|
padding-right: 24rpx;
|
||||||
|
padding-bottom: 16rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-back {
|
.nav-back {
|
||||||
width: 60rpx;
|
width: 60rpx;
|
||||||
height: 60rpx;
|
height: 64rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.back-arrow {
|
.nav-back-icon {
|
||||||
width: 20rpx;
|
width: 20rpx;
|
||||||
height: 20rpx;
|
height: 20rpx;
|
||||||
border-left: 4rpx solid #222;
|
border-left: 4rpx solid #333;
|
||||||
border-bottom: 4rpx solid #222;
|
border-bottom: 4rpx solid #333;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-title {
|
.nav-title {
|
||||||
font-size: 34rpx;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #222;
|
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
font-size: 34rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #333;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding-right: 174rpx;
|
line-height: 64rpx;
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-capsule {
|
.nav-capsule {
|
||||||
width: 174rpx;
|
width: 174rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
border-radius: 32rpx;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs {
|
.tabs {
|
||||||
@@ -61,6 +57,7 @@
|
|||||||
height: 100rpx;
|
height: 100rpx;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
@@ -115,6 +112,7 @@
|
|||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 24rpx;
|
padding: 24rpx;
|
||||||
@@ -123,6 +121,7 @@
|
|||||||
|
|
||||||
.card-title {
|
.card-title {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -184,10 +183,13 @@
|
|||||||
|
|
||||||
.card-body {
|
.card-body {
|
||||||
padding: 24rpx;
|
padding: 24rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fault-row {
|
.fault-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 20rpx;
|
||||||
@@ -231,6 +233,7 @@
|
|||||||
|
|
||||||
.info-row {
|
.info-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 16rpx;
|
||||||
}
|
}
|
||||||
@@ -249,6 +252,7 @@
|
|||||||
|
|
||||||
.card-footer {
|
.card-footer {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 20rpx 24rpx;
|
padding: 20rpx 24rpx;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!-- 自定义导航栏 -->
|
<!-- 自定义导航栏 -->
|
||||||
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
<view class="nav" :style="{ paddingTop: headerPaddingTop + 'px', height: headerTotalHeight + 'px' }">
|
||||||
<view class="nav-back" @tap="goBack">
|
<view class="nav-back" @tap="goBack">
|
||||||
<text class="nav-back-icon">←</text>
|
<view class="nav-back-icon"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="nav-title">我的工单</text>
|
<text class="nav-title">我的工单</text>
|
||||||
<view class="nav-capsule"></view>
|
<view class="nav-capsule"></view>
|
||||||
|
|||||||
110
urbanLifelineWeb/packages/workcase_wechat/types/ai/aiChat.ts
Normal file
110
urbanLifelineWeb/packages/workcase_wechat/types/ai/aiChat.ts
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import { BaseDTO } from "../base"
|
||||||
|
/**
|
||||||
|
* Dify文件信息(用于对话文件上传和请求)
|
||||||
|
*/
|
||||||
|
export interface DifyFileInfo {
|
||||||
|
/** 文件ID(Dify返回) */
|
||||||
|
id?: string
|
||||||
|
/** 文件名 */
|
||||||
|
name?: string
|
||||||
|
/** 文件大小(字节) */
|
||||||
|
size?: number
|
||||||
|
/** 文件扩展名 */
|
||||||
|
extension?: string
|
||||||
|
/** 文件MIME类型 */
|
||||||
|
mimeType?: string
|
||||||
|
/** 上传人ID */
|
||||||
|
createdBy?: string
|
||||||
|
/** 上传时间(时间戳) */
|
||||||
|
createdAt?: number
|
||||||
|
/** 预览URL */
|
||||||
|
previewUrl?: string
|
||||||
|
/** 源文件URL */
|
||||||
|
sourceUrl?: string
|
||||||
|
/** 文件类型:image、document、audio、video、file */
|
||||||
|
type?: string
|
||||||
|
/** 传输方式:remote_url、local_file */
|
||||||
|
transferMethod?: string
|
||||||
|
/** 文件URL或ID */
|
||||||
|
url?: string
|
||||||
|
/** 本地文件上传ID */
|
||||||
|
uploadFileId?: string
|
||||||
|
/** 系统文件ID */
|
||||||
|
sysFileId?: string
|
||||||
|
/** 文件路径(从系统文件表获取) */
|
||||||
|
filePath?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI智能体对话
|
||||||
|
*/
|
||||||
|
export interface TbChat extends BaseDTO {
|
||||||
|
/** 对话ID */
|
||||||
|
chatId?: string
|
||||||
|
/** 智能体ID */
|
||||||
|
agentId?: string
|
||||||
|
/** 用户ID */
|
||||||
|
userId?: string
|
||||||
|
/** 用户类型 true-系统内部人员 false-系统外部人员 */
|
||||||
|
userType?: boolean
|
||||||
|
/** 对话标题 */
|
||||||
|
title?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI智能体对话消息
|
||||||
|
*/
|
||||||
|
export interface TbChatMessage extends BaseDTO {
|
||||||
|
/** 消息ID */
|
||||||
|
messageId?: string
|
||||||
|
/** Dify消息ID */
|
||||||
|
difyMessageId?: string
|
||||||
|
/** 对话ID */
|
||||||
|
chatId?: string
|
||||||
|
/** 角色 */
|
||||||
|
role?: string
|
||||||
|
/** 内容 */
|
||||||
|
content?: string
|
||||||
|
/** 文件ID数组 */
|
||||||
|
files?: string[]
|
||||||
|
/** 评价 */
|
||||||
|
comment?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对话消息数据预处理对象
|
||||||
|
*/
|
||||||
|
export interface ChatPrepareData {
|
||||||
|
/** 智能体Id */
|
||||||
|
agentId?: string
|
||||||
|
/** 对话Id */
|
||||||
|
chatId?: string
|
||||||
|
/** 用户问题 */
|
||||||
|
query?: string
|
||||||
|
/** 本次对话携带的dify文件对象 */
|
||||||
|
files?: DifyFileInfo[]
|
||||||
|
/** 用户ID(来客传wechatId,员工传userId) */
|
||||||
|
userId?: string
|
||||||
|
/** 用户类型(false=来客,true=员工) */
|
||||||
|
userType?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止对话参数
|
||||||
|
*/
|
||||||
|
export interface StopChatParams {
|
||||||
|
taskId: string
|
||||||
|
agentId: string
|
||||||
|
userId: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 评价消息参数
|
||||||
|
*/
|
||||||
|
export interface CommentMessageParams {
|
||||||
|
agentId: string
|
||||||
|
chatId: string
|
||||||
|
messageId: string
|
||||||
|
comment: string
|
||||||
|
userId: string
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from "./aiChat"
|
||||||
@@ -4,3 +4,4 @@ export * from "./workcase"
|
|||||||
export * from "./auth"
|
export * from "./auth"
|
||||||
export * from "./response"
|
export * from "./response"
|
||||||
export * from "./page"
|
export * from "./page"
|
||||||
|
export * from "./ai"
|
||||||
@@ -333,19 +333,3 @@ export interface CustomerServiceVO extends BaseVO {
|
|||||||
lastOnlineTime?: string
|
lastOnlineTime?: string
|
||||||
isAvailable?: boolean
|
isAvailable?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================== 词云相关 ====================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 词云DTO
|
|
||||||
*/
|
|
||||||
export interface TbWordCloudDTO extends BaseDTO {
|
|
||||||
wordCloudId?: string
|
|
||||||
word?: string
|
|
||||||
category?: string
|
|
||||||
weight?: number
|
|
||||||
frequency?: number
|
|
||||||
sentiment?: string
|
|
||||||
source?: string
|
|
||||||
relatedWords?: string[]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,70 +1,5 @@
|
|||||||
import { BaseDTO, BaseVO } from '../base'
|
import { BaseDTO, BaseVO } from '../base'
|
||||||
|
|
||||||
// ==================== DTO ====================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 客服人员配置表数据对象DTO
|
|
||||||
*/
|
|
||||||
export interface TbCustomerServiceDTO extends BaseDTO {
|
|
||||||
/** 员工ID(关联sys用户ID) */
|
|
||||||
userId?: string
|
|
||||||
/** 员工姓名 */
|
|
||||||
username?: string
|
|
||||||
/** 员工工号 */
|
|
||||||
userCode?: string
|
|
||||||
/** 状态:online-在线 busy-忙碌 offline-离线 */
|
|
||||||
status?: string
|
|
||||||
/** 技能标签 */
|
|
||||||
skillTags?: string[]
|
|
||||||
/** 最大并发接待数 */
|
|
||||||
maxConcurrent?: number
|
|
||||||
/** 当前工作量 */
|
|
||||||
currentWorkload?: number
|
|
||||||
/** 累计服务次数 */
|
|
||||||
totalServed?: number
|
|
||||||
/** 平均响应时间(秒) */
|
|
||||||
avgResponseTime?: number
|
|
||||||
/** 满意度评分(0-5) */
|
|
||||||
satisfactionScore?: number
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================== VO ====================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 客服人员配置VO
|
|
||||||
* 用于前端展示客服人员信息
|
|
||||||
*/
|
|
||||||
export interface CustomerServiceVO extends BaseVO {
|
|
||||||
/** 员工ID(关联sys用户ID) */
|
|
||||||
userId?: string
|
|
||||||
/** 员工姓名 */
|
|
||||||
username?: string
|
|
||||||
/** 员工工号 */
|
|
||||||
userCode?: string
|
|
||||||
/** 员工头像 */
|
|
||||||
avatar?: string
|
|
||||||
/** 状态:online-在线 busy-忙碌 offline-离线 */
|
|
||||||
status?: string
|
|
||||||
/** 状态名称 */
|
|
||||||
statusName?: string
|
|
||||||
/** 技能标签 */
|
|
||||||
skillTags?: string[]
|
|
||||||
/** 最大并发接待数 */
|
|
||||||
maxConcurrent?: number
|
|
||||||
/** 当前工作量 */
|
|
||||||
currentWorkload?: number
|
|
||||||
/** 累计服务次数 */
|
|
||||||
totalServed?: number
|
|
||||||
/** 平均响应时间(秒) */
|
|
||||||
avgResponseTime?: number
|
|
||||||
/** 平均响应时间(格式化) */
|
|
||||||
avgResponseTimeFormatted?: string
|
|
||||||
/** 满意度评分(0-5) */
|
|
||||||
satisfactionScore?: number
|
|
||||||
/** 是否可接待(工作量未满) */
|
|
||||||
isAvailable?: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客户信息VO
|
* 客户信息VO
|
||||||
* 用于前端展示客户信息
|
* 用于前端展示客户信息
|
||||||
|
|||||||
Reference in New Issue
Block a user