nidapeng
2024-04-26 48467740fa3144b073f9b679c3a9764f75e206b1
最新版本
已添加6个文件
已修改16个文件
378 ■■■■ 文件已修改
server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/admin_start.sh 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
@@ -46,7 +47,7 @@
 */
@Api(tags = "会议室预定信息表")
@RestController
@RequestMapping("/cloud/bookings")
@RequestMapping("/cloudService/bookings")
public class CloudBookingsController extends BaseController {
    @Autowired
@@ -57,6 +58,13 @@
    public ApiResponse test() {
        return ApiResponse.success("会议室测试成功");
    }
    @LoginNoRequired
    @ApiOperation("测试网管")
    @GetMapping("/testNoLogin")
    public ApiResponse testNoLogin() {
        return ApiResponse.success("会议室管理测试无需登录成功");
    }
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -8,7 +8,6 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.method.HandlerMethod;
@@ -18,9 +17,8 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
@Configuration
//@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
@@ -11,11 +10,9 @@
import com.doumee.dao.business.model.Bookings;
import com.doumee.dao.web.request.BookingsRequest;
import com.doumee.dao.web.request.MeetingPageRequest;
import com.doumee.dao.web.request.UserPageRequest;
import com.doumee.dao.web.response.MeetingDetailResponse;
import com.doumee.dao.web.response.MeetingListResponse;
import com.doumee.dao.web.response.MonthDataResponse;
import com.doumee.dao.web.response.UserResponse;
import com.doumee.service.business.BookingsService;
import com.doumee.service.system.SystemUserService;
import io.swagger.annotations.Api;
@@ -52,7 +49,6 @@
    private SystemUserService systemUserService;
    @LoginRequired
    @ApiOperation(value = "当月会议表", notes = "当月会议表")
    @GetMapping("/monthMeeting")
    @ApiImplicitParams({
@@ -73,7 +69,6 @@
        return  ApiResponse.success("查询成功",monthDataResponseList);
    }
    @LoginRequired
    @ApiOperation("我的会议列表")
    @PostMapping("/myMeetingPage")
    @ApiImplicitParams({
@@ -97,7 +92,6 @@
    }
    @LoginRequired
    @ApiOperation("获取会议开门二维码")
    @GetMapping("/getQrCode")
    @ApiImplicitParams({
@@ -137,7 +131,6 @@
*/
    @LoginRequired
    @ApiOperation("会议预约")
    @PostMapping("/reservationMeeting")
    @ApiImplicitParams({
@@ -149,7 +142,6 @@
        return ApiResponse.success("操作成功",bookingsService.reservationMeeting(bookingsRequest));
    }
    @LoginRequired
    @ApiOperation("取消会议预约")
    @GetMapping("/reservationCancel")
    @ApiImplicitParams({
server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java
@@ -1,6 +1,5 @@
package com.doumee.api.web;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
@@ -16,7 +15,6 @@
@Api(tags = "消息通知信业务")
@Trace(exclude = true)
@LoginRequired
@RestController
@RequestMapping("/web/notice")
@Slf4j
@@ -31,7 +29,6 @@
     * @param pageWrap
     * @return
     */
    @LoginRequired
    @ApiOperation(value = "查询用户通知", notes = "小程序端")
    @PostMapping("/findNoticePage")
    public ApiResponse<PageData<Notices>> findNoticePage(@RequestBody PageWrap<Notices> pageWrap){
@@ -57,7 +54,6 @@
    }
    @LoginRequired
    @ApiOperation(value = "查询通知详情", notes = "小程序端")
    @GetMapping("/getNoticeDetail")
    public ApiResponse<Notices> getNoticeDetail(@RequestParam Integer id){
server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java
@@ -2,42 +2,26 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.config.Jwt.WebMvcConfig;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.QrCodeUtils;
import com.doumee.dao.business.model.Bookings;
import com.doumee.dao.business.model.RoomTime;
import com.doumee.dao.web.request.MeetingPageRequest;
import com.doumee.dao.web.request.RoomTimeRequest;
import com.doumee.dao.web.request.RoomsRequest;
import com.doumee.dao.web.request.UserPageRequest;
import com.doumee.dao.web.response.*;
import com.doumee.service.business.BookingsService;
import com.doumee.service.business.RoomTimeService;
import com.doumee.service.business.RoomsService;
import com.doumee.service.system.SystemUserService;
import io.jsonwebtoken.JwtException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Created by IntelliJ IDEA.
@@ -59,7 +43,6 @@
    @Autowired
    private RoomTimeService roomTimeService;
    @LoginRequired
    @ApiOperation("获取会议室开门二维码")
    @GetMapping("/getQrCode")
    @ApiImplicitParams({
@@ -85,7 +68,6 @@
    }
    @LoginRequired
    @ApiOperation("会议室列表")
    @GetMapping("/roomsList")
    @ApiImplicitParams({
@@ -96,7 +78,6 @@
    }
    @LoginRequired
    @ApiOperation("会议室时间开放列表")
    @PostMapping("/getRoomUseTime")
    @ApiImplicitParams({
@@ -106,7 +87,6 @@
        return ApiResponse.success("查询成功",roomTimeService.getRoomUseTime(roomTimeRequest));
    }
    @LoginRequired
    @ApiOperation("我的会议室列表")
    @PostMapping("/myRoomsPage")
    @ApiImplicitParams({
@@ -119,7 +99,6 @@
    }
    @LoginRequired
    @ApiOperation("会议室详情")
    @GetMapping("/getRoomDetail")
    @ApiImplicitParams({
server/startsh/admin_start.sh
@@ -6,4 +6,4 @@
log_file_path="/usr/local/jars/log/admin/info.log"
log_file_error_path="/usr/local/jars/log/admin/error.log"
nohup java -Xms512m -Xmx512m -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=10031 -jar /usr/local/jars/admin_interface.jar >"${log_file_path}" 2>"${log_file_error_path}" &
nohup java -Xms2048m -Xmx2048m -Xmn2048m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=10031 -jar /usr/local/jars/admin_interface.jar >"${log_file_path}" 2>"${log_file_error_path}" &
server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
@@ -1,5 +1,6 @@
package com.doumee.api;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.config.jwt.JwtProperties;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.core.annotation.pr.PreventRepeat;
@@ -7,10 +8,12 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.service.system.SystemLoginService;
import com.doumee.service.system.SystemUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -24,7 +27,7 @@
 * JWT获取令牌和刷新令牌接口
 */
@RestController
@Api("鉴权登录接口")
@Api(tags ="鉴权登录接口")
public class JwtAuthController {
    @Resource
@@ -40,6 +43,7 @@
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("登录")
    @PostMapping("/login")
    @LoginNoRequired
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
@@ -78,7 +82,7 @@
     */
    @GetMapping("/getUserInfo")
    @ApiOperation("获取当前登陆用户")
    public ApiResponse<LoginUserInfo> getUserInfo(@RequestHeader("userToken") String token){
    public ApiResponse<LoginUserInfo> getUserInfo(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        try {
            LoginUserInfo user =jwtTokenUtil.getUserInfoByToken(token);
           if(user !=null){
server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
@@ -1,6 +1,7 @@
package com.doumee.api.meeting;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -11,7 +12,7 @@
 */
@RestController
@RequestMapping("/gateway")
@Api("测试接口")
@Api(tags ="测试接口")
public class CloudBookingsController  {
    @GetMapping("/test")
server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.doumee.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.LinkedHashSet;
@Data
@Component
@ConfigurationProperties("gateway")
public class GatewayFilterProperties {
    private LinkedHashSet<String> skipLoginFilterUrls;
}
server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
@@ -20,6 +20,7 @@
        return chain.filter(exchange).onErrorResume(throwable -> {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
            String errorMessage = "{\"message\": \"" + throwable.getMessage() + "\"}";
server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.doumee.config;
import com.doumee.core.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
@Order(1)
@Configuration
public class GlobalFilterConfig implements GlobalFilter {
    @Autowired
    private RedisTemplate<String,Object> stringRedisTemplate;
    @Resource
    private GatewayFilterProperties notAuthUrlProperties;
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
           /* log.info("=================================================");
            log.info("访问接口主机: {}", exchange.getRequest().getURI().getHost());
            log.info("访问接口端口: {}", exchange.getRequest().getURI().getPort());
            log.info("访问接口URL: {}", exchange.getRequest().getURI().getPath());
            log.info("访问接口参数: {}", exchange.getRequest().getURI().getRawQuery());*/
        String  url =exchange.getRequest().getURI().getPath();
        if(!shouldSkip(url)){
            String token = exchange.getRequest().getHeaders().getFirst(Constants.HEADER_USER_TOKEN);
            if (token == null || token.isEmpty()) {
                return unAuthorize(exchange);
            }
            String userInfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
            if (StringUtils.isBlank(userInfo)) {
                return unAuthorize(exchange);
            }
            //把新的 exchange放回到过滤链
            ServerHttpRequest request = exchange.getRequest().mutate().header(Constants.HEADER_USER_TOKEN, token).build();
            ServerWebExchange newExchange = exchange.mutate().request(request).build();
            return chain.filter(newExchange);
        }
        return chain.filter(exchange);
    }
    /**
     * æ–¹æ³•实现说明:不需要过滤的路径
     * <p>
     * //     * @param currentUrl å½“前请求路径
     */
    private boolean shouldSkip(String currentUrl) {
        if(notAuthUrlProperties.getSkipLoginFilterUrls() == null || notAuthUrlProperties.getSkipLoginFilterUrls().size() ==0){
            return  false;
        }
        PathMatcher pathMatcher = new AntPathMatcher();
        for (String skipPath : notAuthUrlProperties.getSkipLoginFilterUrls()) {
            if (pathMatcher.match(skipPath, currentUrl)) {
                return true;
            }
        }
        return false;
    }
    // è¿”回未登录的自定义错误
    private Mono<Void> unAuthorize(ServerWebExchange exchange) {
        // è®¾ç½®é”™è¯¯çŠ¶æ€ç ä¸º401
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // è®¾ç½®è¿”回的信息为JSON类型
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        // è‡ªå®šä¹‰é”™è¯¯ä¿¡æ¯
        String errorMsg = "{\"error\": \"" + "用户未登录或登录超时,请重新登录" + "\"}";
        // å°†è‡ªå®šä¹‰é”™è¯¯å“åº”写入响应体
        return exchange.getResponse()
                .writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(errorMsg.getBytes())));
    }
}
server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
@@ -96,7 +97,7 @@
            claims.setLoginDate(new Date());
            refreshedToken = generateTokenDo(claims);
            if(refreshedToken!=null){
                redisTemplate.delete(token);//删除老的token
                redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//删除老的token
            }
        } catch (Exception e) {
            refreshedToken = null;
@@ -131,7 +132,7 @@
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
                .compact();
        redisTemplate.opsForValue().set(token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
        return token;
    }
@@ -144,7 +145,7 @@
    private LoginUserInfo getClaimsFromToken(String token) {
        LoginUserInfo claims;
        try {
            String userInfo = (String) redisTemplate.opsForValue().get(token);
            String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),LoginUserInfo.class);
        } catch (Exception e) {
            claims = null;
server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.doumee.config.swagger;
import com.doumee.config.GatewayFilterProperties;
import com.doumee.core.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
@Configuration
public class CustomWebFilterConfig {
    @Autowired
    private RedisTemplate<String,Object> stringRedisTemplate;
    @Resource
    private GatewayFilterProperties notAuthUrlProperties;
    @Bean
    public WebFilter webFilter() {
        return (exchange, chain) -> {
            String  url =exchange.getRequest().getURI().getPath();
            if(!shouldSkip(url)){
                String token = exchange.getRequest().getHeaders().getFirst(Constants.HEADER_USER_TOKEN);
                if (token == null || token.isEmpty()) {
                    return unAuthorize(exchange);
                }
                String userInfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
                if (StringUtils.isBlank(userInfo)) {
                    return unAuthorize(exchange);
                }
                //把新的 exchange放回到过滤链
                ServerHttpRequest request = exchange.getRequest().mutate().header(Constants.HEADER_USER_TOKEN, token).build();
                ServerWebExchange newExchange = exchange.mutate().request(request).build();
                return chain.filter(newExchange);
            }
            return chain.filter(exchange);
        };
    }
    /**
     * æ–¹æ³•实现说明:不需要过滤的路径
     * <p>
     * //     * @param currentUrl å½“前请求路径
     */
    private boolean shouldSkip(String currentUrl) {
        if(notAuthUrlProperties.getSkipLoginFilterUrls() == null || notAuthUrlProperties.getSkipLoginFilterUrls().size() ==0){
            return  false;
        }
        PathMatcher pathMatcher = new AntPathMatcher();
        for (String skipPath : notAuthUrlProperties.getSkipLoginFilterUrls()) {
            if (pathMatcher.match(skipPath, currentUrl)) {
                return true;
            }
        }
        return false;
    }
    // è¿”回未登录的自定义错误
    private Mono<Void> unAuthorize(ServerWebExchange exchange) {
        // è®¾ç½®é”™è¯¯çŠ¶æ€ç ä¸º401
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // è®¾ç½®è¿”回的信息为JSON类型
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        // è‡ªå®šä¹‰é”™è¯¯ä¿¡æ¯
        String errorMsg = "{\"error\": \"" + "用户未登录或登录超时,请重新登录" + "\"}";
        // å°†è‡ªå®šä¹‰é”™è¯¯å“åº”写入响应体
        return exchange.getResponse()
                .writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(errorMsg.getBytes())));
    }
}
server/system_gateway/src/main/resources/application.yml
@@ -90,3 +90,10 @@
      timeout: PT3H  #表示12小时
gateway:
  skipLoginFilterUrls:
    - /meetingAdmin/**
    - /visitsAdmin/**
    - /login
    - /doc.html
    - /v2/api-docs/**
server/system_gateway/src/main/resources/bootstrap.yml
@@ -52,6 +52,7 @@
      exposure:
        include: "*"
knife4j:
  # èšåˆswagger文档
  gateway:
server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.doumee.config.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginNoRequired {}
server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.doumee.config.cloudfilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CloudWebConfig implements WebMvcConfigurer {
    @Autowired
    private RedisTemplate<String,Object> stringRedisTemplate;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor(stringRedisTemplate))
                .addPathPatterns("/cloudService/**");
    }
}
server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.doumee.config.cloudfilter;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
    private RedisTemplate<String,Object> stringRedisTemplate;
    // ç”±äºŽè¯¥ç±»æœªäº¤ç»™spring管理,因此不能使用自动装配的方式获取RedisTemplate对象
    public LoginHandlerInterceptor(RedisTemplate<String,Object> stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Class<?> beanType = handlerMethod.getBeanType();
        if (!beanType.isAnnotationPresent(LoginNoRequired.class) || !handlerMethod.hasMethodAnnotation(LoginNoRequired.class)) {
            //获取token
            String token = request.getHeader(Constants.HEADER_USER_TOKEN);  // ä»Ž http è¯·æ±‚头中取出 token
            if (StringUtils.isNotBlank(token)) {
                checkLogin(request,response);
            } else {
                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
            }
        }
        return true;
    }
    private void checkLogin(HttpServletRequest request, HttpServletResponse response) {
        String token = request.getHeader(Constants.HEADER_USER_TOKEN);
        if (token == null || token.isEmpty()) {
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
        String userinfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
        if (StringUtils.isBlank(userinfo)) {
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
        LoginUserInfo user = JSONObject.toJavaObject(JSONObject.parseObject(userinfo),LoginUserInfo.class );
        if(user ==null ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户登陆已失效,请重新登陆!");
        }
    }
    //    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        UserContext.removeUser();
    }
}
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -18,7 +18,8 @@
import java.util.regex.Pattern;
public class Constants {
    public static final String HEADER_USER_TOKEN = "dm_user_token";
    public static final String REDIS_TOKEN_KEY = "token_";
    public static final String[]  ALL_SPELL_LIST_FIRST = new String[]{"A", "B", "C", "D", "E", "F", "G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    public static final int ZERO = 0 ;
    public static final int ONE = 1 ;
server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java
@@ -1,6 +1,7 @@
package com.doumee.api.cloud;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
@@ -25,18 +26,24 @@
 */
@Api(tags = "车辆接口")
@RestController
@RequestMapping("/cloud/cars")
@RequestMapping("/cloudService/cars")
public class CloudCarsController extends BaseController {
    @Autowired
    private CarsService carsService;
    @Autowired
    private HkSyncVehicleFromHKServiceImpl hkSyncVehicleFromHKService;
    @PreventRepeat
    @ApiOperation("测试网管")
    @GetMapping("/test")
    public ApiResponse test() {
        return ApiResponse.success("访客管理测试成功");
        return ApiResponse.success("访客管理测试授权成功");
    }
    @LoginNoRequired
    @ApiOperation("测试网管")
    @GetMapping("/testNoLogin")
    public ApiResponse testNoLogin() {
        return ApiResponse.success("访客管理测试无需登录成功");
    }
    @PreventRepeat
server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java
@@ -1,7 +1,5 @@
package com.doumee.api.web;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
@@ -20,12 +18,8 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
@@ -57,7 +51,6 @@
        return ApiResponse.success("登录成功",wxAuthorizeVO);
    }
    @LoginRequired
    @ApiOperation(value = "内部人员首页", notes = "H5")
    @GetMapping("/internalHome")
    @ApiImplicitParams({
@@ -68,7 +61,6 @@
    }
    @LoginRequired
    @ApiOperation("任务中心")
    @PostMapping("/taskCenter")
    @ApiImplicitParams({
@@ -79,7 +71,6 @@
        return ApiResponse.success(visitsService.taskCenter(pageWrap));
    }
    @LoginRequired
    @ApiOperation("访客记录详情")
    @GetMapping("/visitDetail")
    @ApiImplicitParams({
@@ -91,7 +82,6 @@
    }
    @LoginRequired
    @ApiOperation(value = "人员分页",notes = "可拜访内部人员")
    @PostMapping("/memberList")
    @ApiImplicitParams({
@@ -101,7 +91,6 @@
        return ApiResponse.success(memberService.getVisitedMemberList(pageWrap));
    }
    @LoginRequired
    @ApiOperation(value = "访客记录提交", notes = "内部人员提交")
    @PostMapping("/createVisit")
    @ApiImplicitParams({
@@ -112,7 +101,6 @@
        return ApiResponse.success("查询成功", visitsService.createFk(visits,false));
    }
    @LoginRequired
    @ApiOperation(value = "审批流记录审批", notes = "内部人员")
    @PostMapping("/auditApprove")
    @ApiImplicitParams({
server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
@@ -1,6 +1,5 @@
package com.doumee.api.web;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;