提交 b2dcaebe authored 作者: 吕本才's avatar 吕本才

接口和配置文件更新

上级 16c6d568
target/**
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.mvn
logs
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
mvnw
mvnw.cmd
package com.link.hub.config.advice;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sfa.common.core.domain.R;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* @author : liqiulin
* @date : 2024-10-28 17
* @describe :自动封装
*/
@RestControllerAdvice
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{
/**
* response是R类型或者注释了NotControllerResponseAdvice都不进行包装
*/
@Override
public boolean supports(MethodParameter methodParameter, Class converterType) {
// if (methodParameter.getParameterType().isAssignableFrom(AjaxResult.class)) {
// return false;
// }
return !methodParameter.getParameterType().isAssignableFrom(R.class);
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
// String类型不能直接包装
if (methodParameter.getGenericParameterType().equals(String.class)) {
ObjectMapper objectMapper = new ObjectMapper();
try {
// 将数据包装在ResultVo里后转换为json串进行返回
return objectMapper.writeValueAsString(R.ok(body));
} catch (JsonProcessingException e) {
throw new RuntimeException();
}
}
// 包装成R返回
return R.ok(body);
}
}
...@@ -22,9 +22,18 @@ public class WechatMiniProgramController { ...@@ -22,9 +22,18 @@ public class WechatMiniProgramController {
private WechatMiniProgramService wechatMiniProgramService; private WechatMiniProgramService wechatMiniProgramService;
@GetMapping("/getUserInfo") @GetMapping("/getUserInfo")
public R getUserInfo(String code) { public MiniProgramOpenIdVO getUserInfo(String code) {
MiniProgramOpenIdVO userInfo = wechatMiniProgramService.getUserInfo(code); MiniProgramOpenIdVO userInfo = wechatMiniProgramService.getUserInfo(code);
return R.ok(userInfo); return userInfo;
}
/**
* 是否关注公众号
* @param openid
*/
@GetMapping("/isSubscribe")
public R isSubscribe(String openid) {
return R.ok(wechatMiniProgramService.isSubscribe(openid));
} }
......
package com.link.hub.domain.weChatMiniProgram.dao; package com.link.hub.domain.weChatMiniProgram.dao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
public interface WechatMiniProgramUserDao { public interface WechatMiniProgramUserDao {
WechatMiniProgramUser queryMiniProgramUserWq(WechatMiniProgramUserWq wechatMiniProgramUserWq);
void insert(WechatMiniProgramUser wechatMiniProgramUser);
} }
package com.link.hub.domain.weChatMiniProgram.dao.impl; package com.link.hub.domain.weChatMiniProgram.dao.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.hub.domain.weChatMiniProgram.dao.WechatMiniProgramUserDao; import com.link.hub.domain.weChatMiniProgram.dao.WechatMiniProgramUserDao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.mapper.WechatMiniProgramUserMapper; import com.link.hub.domain.weChatMiniProgram.mapper.WechatMiniProgramUserMapper;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -16,4 +20,17 @@ public class WechatMiniProgramUserDaoImpl implements WechatMiniProgramUserDao { ...@@ -16,4 +20,17 @@ public class WechatMiniProgramUserDaoImpl implements WechatMiniProgramUserDao {
WechatMiniProgramUserMapper wechatMiniProgramUserMapper; WechatMiniProgramUserMapper wechatMiniProgramUserMapper;
@Override
public WechatMiniProgramUser queryMiniProgramUserWq(WechatMiniProgramUserWq wechatMiniProgramUserWq) {
LambdaQueryWrapper<WechatMiniProgramUser> queryWrapper = new LambdaQueryWrapper<WechatMiniProgramUser>();
queryWrapper.eq(ObjectUtil.isNotEmpty(wechatMiniProgramUserWq.getOpenid()),WechatMiniProgramUser::getOpenid, wechatMiniProgramUserWq.getOpenid());
WechatMiniProgramUser wechatMiniProgramUser = wechatMiniProgramUserMapper.selectOne(queryWrapper);
return wechatMiniProgramUser;
}
@Override
public void insert(WechatMiniProgramUser wechatMiniProgramUser) {
wechatMiniProgramUserMapper.insert(wechatMiniProgramUser);
}
} }
package com.link.hub.domain.weChatMiniProgram.mapper; package com.link.hub.domain.weChatMiniProgram.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface WechatMiniProgramUserMapper { public interface WechatMiniProgramUserMapper extends BaseMapper<WechatMiniProgramUser> {
} }
package com.link.hub.domain.weChatMiniProgram.wq;
import lombok.Data;
@Data
public class WechatMiniProgramUserWq {
private String openid;
}
package com.link.hub.pojo.weChatMiniProgram.dto;
import lombok.Data;
@Data
public class MiniProgramOpenIdDTO {
private String openid;
private String unionid;
}
...@@ -2,18 +2,14 @@ package com.link.hub.pojo.weChatMiniProgram.vo; ...@@ -2,18 +2,14 @@ package com.link.hub.pojo.weChatMiniProgram.vo;
import lombok.Data; import lombok.Data;
import java.util.Date;
@Data @Data
public class MiniProgramOpenIdVO { public class MiniProgramOpenIdVO {
private String openid; private String openid;
private String session_key; private String session_key;
private String unionid;
private String unionid; private String token;
private Date subscribeTime; private Long userId;
private String token; //private Boolean subscribeFlag =false;
// private Boolean subscribeFlag =false; //private Date subscribeTime;
} }
...@@ -4,4 +4,6 @@ import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO; ...@@ -4,4 +4,6 @@ import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO;
public interface WechatMiniProgramService { public interface WechatMiniProgramService {
MiniProgramOpenIdVO getUserInfo(String code); MiniProgramOpenIdVO getUserInfo(String code);
Object isSubscribe(String openid);
} }
package com.link.hub.service.weChatMiniProgram; package com.link.hub.service.weChatMiniProgram;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
public interface WechatMiniProgramUserService { public interface WechatMiniProgramUserService {
WechatMiniProgramUser queryMiniProgramUserByOpenId(String openid);
Long saveMiniProgramUser(MiniProgramOpenIdDTO miniProgramOpenIdDTO);
} }
package com.link.hub.service.weChatMiniProgram.impl; package com.link.hub.service.weChatMiniProgram.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.link.hub.config.WeChatMiniProgramConfig; import com.link.hub.config.WeChatMiniProgramConfig;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO; import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramService; import com.link.hub.service.weChatMiniProgram.WechatMiniProgramService;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService; import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService;
import com.sfa.common.core.constant.SecurityConstants; import com.sfa.common.core.constant.SecurityConstants;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.JwtUtils; import com.sfa.common.core.utils.JwtUtils;
import com.sfa.common.core.utils.ip.IpUtils; import com.sfa.common.core.utils.ip.IpUtils;
import com.sfa.common.core.utils.uuid.IdUtils; import com.sfa.common.core.utils.uuid.IdUtils;
import com.sfa.common.core.utils.wechat.TencentUtils; import com.sfa.common.core.utils.wechat.WeChatPlatFormUtils;
import com.sfa.common.security.service.TokenService; import com.sfa.common.security.service.TokenService;
import com.sfa.system.api.model.LoginUser; import com.sfa.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -37,41 +40,77 @@ public class WechatMiniProgramServiceServiceImpl implements WechatMiniProgramSer ...@@ -37,41 +40,77 @@ public class WechatMiniProgramServiceServiceImpl implements WechatMiniProgramSer
@Override @Override
public MiniProgramOpenIdVO getUserInfo(String code) { public MiniProgramOpenIdVO getUserInfo(String code) {
JSONObject jsonObject = TencentUtils.getOpenid(code, weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret()); JSONObject jsonObject = WeChatPlatFormUtils.getOpenid(code, weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret());
// 从jsonObject中获取openid // 从jsonObject中获取openid
String openid = jsonObject.getString("openid"); String openid = jsonObject.getString("openid");
String unionid = jsonObject.getString("unionid"); String unionid = jsonObject.getString("unionid");
// 返回结果 if (ObjectUtil.isEmpty(openid)) {
MiniProgramOpenIdVO miniProgramOpenIdVO = new MiniProgramOpenIdVO(); throw new ServiceException("获取openid失败");
miniProgramOpenIdVO.setOpenid(openid); }
miniProgramOpenIdVO.setUnionid(unionid); WechatMiniProgramUser wechatMiniProgramUser = miniProgramUserService.queryMiniProgramUserByOpenId(openid);
// 查询是否关注了微信公众号 Long userId = null;
// miniProgramOpenIdVO.setSubscribeFlag(true);
miniProgramOpenIdVO.setSubscribeTime(DateUtil.date()); if (ObjectUtil.isNotEmpty(wechatMiniProgramUser)) {
// 保存小程序用户信息 // 查询到数据不再新增
// String userId = miniProgramUserService.saveMiniProgramUser(openid); userId = wechatMiniProgramUser.getId();
} else {
// 保存小程序用户信息 新增小程序用户信息
MiniProgramOpenIdDTO miniProgramOpenIdDTO = new MiniProgramOpenIdDTO();
miniProgramOpenIdDTO.setOpenid(openid);
miniProgramOpenIdDTO.setUnionid(unionid);
userId = miniProgramUserService.saveMiniProgramUser(miniProgramOpenIdDTO);
}
LoginUser loginUser = new LoginUser(); LoginUser loginUser = new LoginUser();
String token = IdUtils.fastUUID(); String token = IdUtils.fastUUID();
Long userId = 1L;
String userName = "openid"; String userName = "openid";
loginUser.setToken(token); loginUser.setToken(token);
loginUser.setUserid(userId); loginUser.setUserid(userId);
loginUser.setUsername(userName); loginUser.setUsername(userName);
loginUser.setIpaddr(IpUtils.getIpAddr()); loginUser.setIpaddr(IpUtils.getIpAddr());
tokenService.saveToken(loginUser, expireTime); tokenService.saveMiniProgramToken(loginUser, expireTime);
// 返回token // 返回token
Map<String, Object> claimsMap = new HashMap<String, Object>(); Map<String, Object> claimsMap = new HashMap<String, Object>();
claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.USER_KEY, token);
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
// 接口返回信息 String jwtToken = JwtUtils.createToken(claimsMap);
Map<String, Object> rspMap = new HashMap<String, Object>();
rspMap.put("access_token", JwtUtils.createToken(claimsMap)); // 返回结果
rspMap.put("expires_in", expireTime); MiniProgramOpenIdVO miniProgramOpenIdVO = new MiniProgramOpenIdVO();
loginUser.setLoginTime(System.currentTimeMillis()); miniProgramOpenIdVO.setOpenid(openid);
miniProgramOpenIdVO.setToken(JwtUtils.createToken(claimsMap)); miniProgramOpenIdVO.setUnionid(unionid);
// 查询是否关注了微信公众号
// miniProgramOpenIdVO.setSubscribeFlag(true);
// miniProgramOpenIdVO.setSubscribeTime(DateUtil.date());
miniProgramOpenIdVO.setToken(jwtToken);
miniProgramOpenIdVO.setUserId(userId);
return miniProgramOpenIdVO; return miniProgramOpenIdVO;
} }
@Override
public Object isSubscribe(String openid) {
/**
* 通过发送模板消息判断用户是否关注公众号
* @param openId
* @param templateId
* @param accessToken
* @return true表示已关注,false表示未关注
*/
// 用户的OpenID
String openId = "用户OpenID";
// 一个不存在的模板ID
String templateId = "一个不存在的模板ID";
// 公众号的access_token
JSONObject bodyJson = WeChatPlatFormUtils.getMiniappToken(weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret());
String accessToken = bodyJson.getString("access_token");
return WeChatPlatFormUtils.isSubscribe(openId, templateId, accessToken);
}
} }
package com.link.hub.service.weChatMiniProgram.impl; package com.link.hub.service.weChatMiniProgram.impl;
import cn.hutool.core.date.DateUtil;
import com.link.hub.domain.weChatMiniProgram.dao.WechatMiniProgramUserDao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService; import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/** /**
* 小程序用户服务实现 * 小程序用户服务实现
...@@ -10,4 +17,25 @@ import org.springframework.stereotype.Service; ...@@ -10,4 +17,25 @@ import org.springframework.stereotype.Service;
@Service @Service
public class WechatMiniProgramUserServiceServiceImpl implements WechatMiniProgramUserService { public class WechatMiniProgramUserServiceServiceImpl implements WechatMiniProgramUserService {
@Resource
private WechatMiniProgramUserDao wechatMiniProgramUserDao;
@Override
public WechatMiniProgramUser queryMiniProgramUserByOpenId(String openid) {
WechatMiniProgramUserWq wechatMiniProgramUserWq = new WechatMiniProgramUserWq();
wechatMiniProgramUserWq.setOpenid(openid);
WechatMiniProgramUser wechatMiniProgramUser = wechatMiniProgramUserDao.queryMiniProgramUserWq(wechatMiniProgramUserWq);
return wechatMiniProgramUser;
}
@Override
public Long saveMiniProgramUser(MiniProgramOpenIdDTO miniProgramOpenIdDTO) {
WechatMiniProgramUser wechatMiniProgramUser = new WechatMiniProgramUser();
wechatMiniProgramUser.setOpenid(miniProgramOpenIdDTO.getOpenid());
wechatMiniProgramUser.setCreateTime(DateUtil.date());
wechatMiniProgramUser.setUpdateTime(DateUtil.date());
wechatMiniProgramUserDao.insert(wechatMiniProgramUser);
return wechatMiniProgramUser.getId();
}
} }
...@@ -10,3 +10,4 @@ spring: ...@@ -10,3 +10,4 @@ spring:
file-extension: yaml file-extension: yaml
group: sfa group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265 namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
...@@ -2,4 +2,4 @@ spring: ...@@ -2,4 +2,4 @@ spring:
profiles: profiles:
active: dev active: dev
application: application:
name: wangxiaolu-link-module-fortune-hub name: wangxiaolu-link-fortune-hub
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
group: sfa
namespace: 9fb64726-e415-43e4-9e79-9be8d2666671
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: sfa
namespace: 9fb64726-e415-43e4-9e79-9be8d2666671
spring:
cloud:
nacos:
discovery:
server-addr: 10.0.0.170:8848
group: sfa
namespace: e2996044-6ddc-4988-8810-602e05d01ccf
config:
server-addr: 10.0.0.170:8848
file-extension: yaml
group: sfa
namespace: e2996044-6ddc-4988-8810-602e05d01ccf
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.100.38:8848
group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
config:
server-addr: 192.168.100.38:8848
file-extension: yaml
group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
spring:
profiles:
active: dev
application:
name: wangxiaolu-link-module-fortune-hub
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="wangxiaolu-link-module-fortune-hub"/>
<property name="MODEL_NAME" value="fortune-hub"/>
<contextName>${APP_NAME}</contextName>
<!-- 日志存放路径 对应yml文件中spring.profiles.active配置-->
<springProfile name="dev">
<property name="LOG_PATH" value="./logs/${APP_NAME}" />
</springProfile>
<springProfile name="qa,live,master">
<property name="LOG_PATH" value="/var/logs/sfa/${APP_NAME}" />
</springProfile>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${MODEL_NAME}-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>false</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${MODEL_NAME}-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>200MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>0</totalSizeCap>
</rollingPolicy>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="errorFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${MODEL_NAME}-error-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>false</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${MODEL_NAME}-error-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>200MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>0</totalSizeCap>
</rollingPolicy>
<!--
此日志文件只记录debug级别的
onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 控制台-->
<root level="INFO">
<appender-ref ref="console" />
</root>
<!-- 文件日志-->
<root level="INFO">
<appender-ref ref="rollingFile" />
<appender-ref ref="errorFile" />
</root>
</configuration>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论