Merge pull request #13 from linhaojun857/dev

merge dev
master
花未眠 3 years ago committed by GitHub
commit 5960841215
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -28,27 +28,27 @@ springboot + springsecurity + mysql + redis + mybatisplus + quartz + rabbitmq +
## 前台截图
![前台1](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/7232dc518bfed9755c6266fdf5243e0d.png)
![前台1](https://static.linhaojun.top/photos/7232dc518bfed9755c6266fdf5243e0d.png)
![前台2](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/4d5d41fe49c2a42d6d756bde6a09d86c.png)
![前台2](https://static.linhaojun.top/photos/4d5d41fe49c2a42d6d756bde6a09d86c.png)
![前台3](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/5e50616e20e1c9a9ea24bcb9cd25f428.png)
![前台3](https://static.linhaojun.top/photos/5e50616e20e1c9a9ea24bcb9cd25f428.png)
![前台4](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/368d2b5787db9151286e079126e9f0bb.png)
![前台4](https://static.linhaojun.top/photos/368d2b5787db9151286e079126e9f0bb.png)
![前台5](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/a9db098405ead1bef9536a49187eef73.png)
![前台5](https://static.linhaojun.top/photos/a9db098405ead1bef9536a49187eef73.png)
## 后台截图
![后台1](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/613edc1e2be6d21594add5a7549e1b16.png)
![后台1](https://static.linhaojun.top/photos/613edc1e2be6d21594add5a7549e1b16.png)
![后台2](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/4b81eb41719d80c755e3ba39681aeff6.png)
![后台2](https://static.linhaojun.top/photos/4b81eb41719d80c755e3ba39681aeff6.png)
![后台3](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/d927b064ef199cabc9deb66b912d6e8d.png)
![后台3](https://static.linhaojun.top/photos/d927b064ef199cabc9deb66b912d6e8d.png)
![后台4](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/ea9a83ef3c79ca77587752205af0283a.png)
![后台4](https://static.linhaojun.top/photos/ea9a83ef3c79ca77587752205af0283a.png)
![后台5](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/photos/13ad9fc5299c095841101c9f24a06b9b.png)
![后台5](https://static.linhaojun.top/photos/13ad9fc5299c095841101c9f24a06b9b.png)
## 将来的更新计划
@ -59,11 +59,11 @@ springboot + springsecurity + mysql + redis + mybatisplus + quartz + rabbitmq +
| Wechat 微信支付 | Alipay 支付宝支付 |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img src="https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/articles/ed47edae605f74306f751c6fba9f14bd.png" alt="Buy Me A Coffee" width="150"> | <img src="https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/articles/da4c6d8c13f66a8dd6716ddb48d73299.jpg" alt="Buy Me A Coffee" width="150"> |
| <img src="https://static.linhaojun.top/photos/ed47edae605f74306f751c6fba9f14bd.png" alt="Buy Me A Coffee" width="150"> | <img src="https://static.linhaojun.top/photos/da4c6d8c13f66a8dd6716ddb48d73299.jpg" alt="Buy Me A Coffee" width="150"> |
## 交流群
| ![image-20220822102226311](https://linhaojunblog-resource.oss-cn-hangzhou.aliyuncs.com/img/image-20220822102226311.png) |
| ![image-20220822102226311](https://static.linhaojun.top/photos/6c149c9bd586ee0cb9d3d41df605e40f.png) |
| ------------------------------------------------------------ |

@ -84,9 +84,9 @@ public class OperationLogAspect {
// 返回结果
operationLog.setResponseData(JSON.toJSONString(keys));
// 请求用户ID
operationLog.setUserId(UserUtils.getLoginUser().getId());
operationLog.setUserId(UserUtils.getUserDetailsDTO().getId());
// 请求用户
operationLog.setNickname(UserUtils.getLoginUser().getNickname());
operationLog.setNickname(UserUtils.getUserDetailsDTO().getNickname());
// 请求IP
String ipAddress = IpUtils.getIpAddress(request);
operationLog.setIpAddress(ipAddress);

@ -1,9 +1,9 @@
package com.aurora.config;
import com.aurora.handler.PageableHandlerInterceptor;
import com.aurora.handler.WebSecurityHandler;
import org.springframework.context.annotation.Bean;
import com.aurora.interceptor.PaginationInterceptor;
import com.aurora.interceptor.AccessLimitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@ -16,10 +16,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public WebSecurityHandler getWebSecurityHandler() {
return new WebSecurityHandler();
}
@Autowired
private PaginationInterceptor paginationInterceptor;
@Autowired
private AccessLimitInterceptor accessLimitInterceptor;
@Override
public void addCorsMappings(CorsRegistry registry) {
@ -32,8 +33,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new PageableHandlerInterceptor());
registry.addInterceptor(getWebSecurityHandler());
registry.addInterceptor(paginationInterceptor);
registry.addInterceptor(accessLimitInterceptor);
}
}

@ -1,4 +1,4 @@
package com.aurora.config;
package com.aurora.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ -8,9 +8,24 @@ import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "upload.minio")
public class MinioProperties {
/**
* minio
*/
private String url;
/**
*
*/
private String endpoint;
/**
* accessKey
*/
private String accessKey;
/**
* secretKey
*/
private String secretKey;
/**
*
*/
private String bucketName;
private String url;
}

@ -1,4 +1,4 @@
package com.aurora.config;
package com.aurora.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ -1,4 +1,4 @@
package com.aurora.config;
package com.aurora.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ -104,4 +104,9 @@ public class CommonConst {
*/
public static final Integer DEFAULT_ABOUT_ID = 1;
/**
* 20
*/
public final static Integer TWENTY_MINUTES = 20;
}

@ -26,36 +26,6 @@ public class RedisPrefixConst {
*/
public static final String ARTICLE_VIEWS_COUNT = "article_views_count";
/**
*
*/
public static final String ARTICLE_LIKE_COUNT = "article_like_count";
/**
*
*/
public static final String ARTICLE_USER_LIKE = "article_user_like:";
/**
*
*/
public static final String TALK_LIKE_COUNT = "talk_like_count";
/**
*
*/
public static final String TALK_USER_LIKE = "talk_user_like:";
/**
*
*/
public static final String COMMENT_LIKE_COUNT = "comment_like_count";
/**
*
*/
public static final String COMMENT_USER_LIKE = "comment_user_like:";
/**
*
*/
@ -71,11 +41,6 @@ public class RedisPrefixConst {
*/
public static final String VISITOR_AREA = "visitor_area";
/**
*
*/
public static final String PAGE_COVER = "page_cover";
/**
*
*/
@ -88,8 +53,12 @@ public class RedisPrefixConst {
/**
* token
*
*/
public static String TOKEN_BLACKLIST = "token_blacklist";
public static final String LOGIN_USER = "login_user";
/**
* 访
*/
public static final String USER_ARTICLE_ACCESS = "article_access";
}

@ -1,7 +1,7 @@
package com.aurora.consumer;
import com.alibaba.fastjson.JSON;
import com.aurora.dto.EmailDTO;
import com.aurora.model.dto.EmailDTO;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,12 +1,11 @@
package com.aurora.consumer;
import com.alibaba.fastjson.JSON;
import com.aurora.dto.ArticleSearchDTO;
import com.aurora.dto.MaxwellDataDTO;
import com.aurora.model.dto.ArticleSearchDTO;
import com.aurora.model.dto.MaxwellDataDTO;
import com.aurora.entity.Article;
import com.aurora.mapper.ElasticsearchMapper;
import com.aurora.utils.BeanCopyUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;

@ -2,7 +2,6 @@ package com.aurora.consumer;
import com.alibaba.fastjson.JSON;
import com.aurora.dto.EmailDTO;
import com.aurora.entity.Article;
import com.aurora.entity.UserInfo;
import com.aurora.service.ArticleService;
@ -18,7 +17,6 @@ import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.aurora.constant.CommonConst.TRUE;
import static com.aurora.constant.MQPrefixConst.SUBSCRIBE_QUEUE;

@ -1,12 +1,12 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.*;
import com.aurora.model.dto.*;
import com.aurora.enums.FilePathEnum;
import com.aurora.service.ArticleService;
import com.aurora.strategy.context.ArticleImportStrategyContext;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@ -57,6 +57,13 @@ public class ArticleController {
return Result.ok(articleService.getArticleById(articleId));
}
@ApiOperation("校验文章访问密码")
@PostMapping("/articles/access")
public Result<?> accessArticle(@Valid @RequestBody ArticlePasswordVO articlePasswordVO) {
articleService.accessArticle(articlePasswordVO);
return Result.ok();
}
@ApiOperation("根据标签id获取文章")
@GetMapping("/articles/tagId")
public Result<PageResult<ArticleCardDTO>> listArticlesByTagId(@RequestParam Integer tagId) {
@ -139,5 +146,5 @@ public class ArticleController {
public Result<List<ArticleSearchDTO>> listArticlesBySearch(ConditionVO condition) {
return Result.ok(articleService.listArticlesBySearch(condition));
}
}

@ -1,16 +1,16 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.AboutDTO;
import com.aurora.dto.AuroraAdminInfoDTO;
import com.aurora.dto.AuroraHomeInfoDTO;
import com.aurora.dto.WebsiteConfigDTO;
import com.aurora.model.dto.AboutDTO;
import com.aurora.model.dto.AuroraAdminInfoDTO;
import com.aurora.model.dto.AuroraHomeInfoDTO;
import com.aurora.model.dto.WebsiteConfigDTO;
import com.aurora.enums.FilePathEnum;
import com.aurora.service.AuroraInfoService;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.vo.AboutVO;
import com.aurora.vo.Result;
import com.aurora.vo.WebsiteConfigVO;
import com.aurora.model.vo.AboutVO;
import com.aurora.model.vo.Result;
import com.aurora.model.vo.WebsiteConfigVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

@ -1,14 +1,14 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.CategoryAdminDTO;
import com.aurora.dto.CategoryDTO;
import com.aurora.dto.CategoryOptionDTO;
import com.aurora.model.dto.CategoryAdminDTO;
import com.aurora.model.dto.CategoryDTO;
import com.aurora.model.dto.CategoryOptionDTO;
import com.aurora.service.CategoryService;
import com.aurora.vo.CategoryVO;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.model.vo.CategoryVO;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -2,11 +2,11 @@ package com.aurora.controller;
import com.aurora.annotation.AccessLimit;
import com.aurora.annotation.OptLog;
import com.aurora.dto.CommentAdminDTO;
import com.aurora.dto.CommentDTO;
import com.aurora.dto.ReplyDTO;
import com.aurora.model.dto.CommentAdminDTO;
import com.aurora.model.dto.CommentDTO;
import com.aurora.model.dto.ReplyDTO;
import com.aurora.service.CommentService;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,10 +1,10 @@
package com.aurora.controller;
import com.aurora.dto.ExceptionLogDTO;
import com.aurora.model.dto.ExceptionLogDTO;
import com.aurora.service.ExceptionLogService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,13 +1,13 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.FriendLinkAdminDTO;
import com.aurora.dto.FriendLinkDTO;
import com.aurora.model.dto.FriendLinkAdminDTO;
import com.aurora.model.dto.FriendLinkDTO;
import com.aurora.service.FriendLinkService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.FriendLinkVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.FriendLinkVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,9 +1,9 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.JobDTO;
import com.aurora.model.dto.JobDTO;
import com.aurora.service.JobService;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,11 +1,11 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.JobLogDTO;
import com.aurora.model.dto.JobLogDTO;
import com.aurora.service.JobLogService;
import com.aurora.vo.JobLogSearchVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.model.vo.JobLogSearchVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,14 +1,14 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.LabelOptionDTO;
import com.aurora.dto.MenuDTO;
import com.aurora.dto.UserMenuDTO;
import com.aurora.model.dto.LabelOptionDTO;
import com.aurora.model.dto.MenuDTO;
import com.aurora.model.dto.UserMenuDTO;
import com.aurora.service.MenuService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.IsHiddenVO;
import com.aurora.vo.MenuVO;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.IsHiddenVO;
import com.aurora.model.vo.MenuVO;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,10 +1,10 @@
package com.aurora.controller;
import com.aurora.dto.OperationLogDTO;
import com.aurora.model.dto.OperationLogDTO;
import com.aurora.service.OperationLogService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,15 +1,15 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.PhotoAlbumAdminDTO;
import com.aurora.dto.PhotoAlbumDTO;
import com.aurora.model.dto.PhotoAlbumAdminDTO;
import com.aurora.model.dto.PhotoAlbumDTO;
import com.aurora.enums.FilePathEnum;
import com.aurora.service.PhotoAlbumService;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.PhotoAlbumVO;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.PhotoAlbumVO;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

@ -1,10 +1,10 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.PhotoAdminDTO;
import com.aurora.dto.PhotoDTO;
import com.aurora.model.dto.PhotoAdminDTO;
import com.aurora.model.dto.PhotoDTO;
import com.aurora.service.PhotoService;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,12 +1,12 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.LabelOptionDTO;
import com.aurora.dto.ResourceDTO;
import com.aurora.model.dto.LabelOptionDTO;
import com.aurora.model.dto.ResourceDTO;
import com.aurora.service.ResourceService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.ResourceVO;
import com.aurora.vo.Result;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.ResourceVO;
import com.aurora.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,13 +1,13 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.RoleDTO;
import com.aurora.dto.UserRoleDTO;
import com.aurora.model.dto.RoleDTO;
import com.aurora.model.dto.UserRoleDTO;
import com.aurora.service.RoleService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.vo.RoleVO;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import com.aurora.model.vo.RoleVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -2,13 +2,13 @@ package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.TagAdminDTO;
import com.aurora.dto.TagDTO;
import com.aurora.model.dto.TagAdminDTO;
import com.aurora.model.dto.TagDTO;
import com.aurora.service.TagService;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.vo.TagVO;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import com.aurora.model.vo.TagVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,14 +1,14 @@
package com.aurora.controller;
import com.aurora.dto.TalkAdminDTO;
import com.aurora.dto.TalkDTO;
import com.aurora.model.dto.TalkAdminDTO;
import com.aurora.model.dto.TalkDTO;
import com.aurora.enums.FilePathEnum;
import com.aurora.service.TalkService;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.vo.ConditionVO;
import com.aurora.vo.PageResult;
import com.aurora.vo.Result;
import com.aurora.vo.TalkVO;
import com.aurora.model.vo.ConditionVO;
import com.aurora.model.vo.PageResult;
import com.aurora.model.vo.Result;
import com.aurora.model.vo.TalkVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

@ -2,12 +2,12 @@ package com.aurora.controller;
import com.aurora.annotation.AccessLimit;
import com.aurora.dto.UserAdminDTO;
import com.aurora.dto.UserAreaDTO;
import com.aurora.dto.UserInfoDTO;
import com.aurora.dto.UserLogoutStatusDTO;
import com.aurora.model.dto.UserAdminDTO;
import com.aurora.model.dto.UserAreaDTO;
import com.aurora.model.dto.UserInfoDTO;
import com.aurora.model.dto.UserLogoutStatusDTO;
import com.aurora.service.UserAuthService;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

@ -1,10 +1,10 @@
package com.aurora.controller;
import com.aurora.annotation.OptLog;
import com.aurora.dto.UserInfoDTO;
import com.aurora.dto.UserOnlineDTO;
import com.aurora.model.dto.UserInfoDTO;
import com.aurora.model.dto.UserOnlineDTO;
import com.aurora.service.UserInfoService;
import com.aurora.vo.*;
import com.aurora.model.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

@ -30,6 +30,7 @@ public class Article {
private Integer isDelete;
private Integer status;
private Integer type;
private String password;
private String originalUrl;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@ -15,9 +15,9 @@ public enum ArticleStatusEnum {
*/
PUBLIC(1, "公开"),
/**
*
*
*/
SECRET(2, "密"),
SECRET(2, ""),
/**
* 稿
*/

@ -43,13 +43,13 @@ public enum StatusCodeEnum {
*/
USERNAME_NOT_EXIST(52002, "用户名不存在"),
/**
* qq
*
*/
QQ_LOGIN_ERROR(53001, "qq登录错误"),
ARTICLE_ACCESS_FAIL(52003, "文章密码认证未通过"),
/**
*
* qq
*/
WEIBO_LOGIN_ERROR(53002, "微博登录错误");
QQ_LOGIN_ERROR(53001, "qq登录错误");
/**
*

@ -1,18 +1,15 @@
package com.aurora.filter;
import com.aurora.dto.UserDetailDTO;
import com.aurora.exception.BizException;
import com.aurora.service.RedisService;
import com.aurora.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import com.aurora.model.dto.UserDetailsDTO;
import com.aurora.service.TokenService;
import com.aurora.utils.UserUtils;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
@ -20,52 +17,24 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
import static com.aurora.constant.RedisPrefixConst.TOKEN_BLACKLIST;
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
public RedisService redisService;
public TokenService tokenService;
@Autowired
public AuthenticationEntryPoint authenticationEntryPoint;
@SneakyThrows
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
String token = request.getHeader("token");
if (StringUtils.isEmpty(token) || token.equals("null")) {
filterChain.doFilter(request, response);
return;
}
String userId;
try {
Claims claims = JwtUtils.parseJWT(token);
userId = claims.getSubject();
} catch (Exception e) {
throwBizException(request, response, "token非法或者超时!");
return;
}
Boolean isMember = redisService.sIsMember(TOKEN_BLACKLIST, token);
if (isMember.equals(true)) {
throwBizException(request, response, "用户未登录!");
return;
UserDetailsDTO userDetailsDTO = tokenService.getUserDetailDTO(request);
if (Objects.nonNull(userDetailsDTO) && Objects.isNull(UserUtils.getAuthentication())) {
tokenService.renewToken(userDetailsDTO);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetailsDTO, null, userDetailsDTO.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
UserDetailDTO user = (UserDetailDTO) redisService.hGet("login_user", userId);
if (Objects.isNull(user)) {
throwBizException(request, response, "用户未登录!");
return;
}
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request, response);
}
@SneakyThrows
public void throwBizException(HttpServletRequest request, HttpServletResponse response, String message) {
request.setAttribute("bizException", new BizException(message));
request.getRequestDispatcher("/bizException").forward(request, response);
}
}

@ -7,6 +7,7 @@ import org.springframework.security.authentication.InsufficientAuthenticationExc
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
@ -29,7 +30,7 @@ public class AccessDecisionManagerImpl implements AccessDecisionManager {
return;
}
}
throw new AccessDeniedException("没有操作权限");
throw new AccessDeniedException("权限不足");
}
@Override

@ -2,7 +2,7 @@ package com.aurora.handler;
import com.alibaba.fastjson.JSON;
import com.aurora.constant.CommonConst;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

@ -2,7 +2,7 @@ package com.aurora.handler;
import com.alibaba.fastjson.JSON;
import com.aurora.constant.CommonConst;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

@ -1,7 +1,7 @@
package com.aurora.handler;
import com.alibaba.fastjson.JSON;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;

@ -2,15 +2,14 @@ package com.aurora.handler;
import com.alibaba.fastjson.JSON;
import com.aurora.constant.CommonConst;
import com.aurora.dto.UserDetailDTO;
import com.aurora.dto.UserInfoDTO;
import com.aurora.model.dto.UserDetailsDTO;
import com.aurora.model.dto.UserInfoDTO;
import com.aurora.entity.UserAuth;
import com.aurora.mapper.UserAuthMapper;
import com.aurora.service.RedisService;
import com.aurora.service.TokenService;
import com.aurora.utils.BeanCopyUtils;
import com.aurora.utils.JwtUtils;
import com.aurora.utils.UserUtils;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.security.core.Authentication;
@ -31,17 +30,15 @@ public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHa
private UserAuthMapper userAuthMapper;
@Autowired
private RedisService redisService;
private TokenService tokenService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
UserInfoDTO userLoginDTO = BeanCopyUtils.copyObject(UserUtils.getLoginUser(), UserInfoDTO.class);
UserInfoDTO userLoginDTO = BeanCopyUtils.copyObject(UserUtils.getUserDetailsDTO(), UserInfoDTO.class);
if (Objects.nonNull(authentication)) {
UserDetailDTO user = (UserDetailDTO) authentication.getPrincipal();
String id = user.getId().toString();
String jwt = JwtUtils.createJWT(id);
redisService.hSet("login_user", id, user);
userLoginDTO.setToken(jwt);
UserDetailsDTO userDetailsDTO = (UserDetailsDTO) authentication.getPrincipal();
String token = tokenService.createToken(userDetailsDTO);
userLoginDTO.setToken(token);
}
response.setContentType(CommonConst.APPLICATION_JSON);
response.getWriter().write(JSON.toJSONString(Result.ok(userLoginDTO)));
@ -51,10 +48,10 @@ public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHa
@Async
public void updateUserInfo() {
UserAuth userAuth = UserAuth.builder()
.id(UserUtils.getLoginUser().getId())
.ipAddress(UserUtils.getLoginUser().getIpAddress())
.ipSource(UserUtils.getLoginUser().getIpSource())
.lastLoginTime(UserUtils.getLoginUser().getLastLoginTime())
.id(UserUtils.getUserDetailsDTO().getId())
.ipAddress(UserUtils.getUserDetailsDTO().getIpAddress())
.ipSource(UserUtils.getUserDetailsDTO().getIpSource())
.lastLoginTime(UserUtils.getUserDetailsDTO().getLastLoginTime())
.build();
userAuthMapper.updateById(userAuth);
}

@ -1,6 +1,6 @@
package com.aurora.handler;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import com.aurora.enums.StatusCodeEnum;
import com.aurora.exception.BizException;
import lombok.extern.log4j.Log4j2;

@ -1,6 +1,6 @@
package com.aurora.handler;
import com.aurora.dto.ResourceRoleDTO;
import com.aurora.model.dto.ResourceRoleDTO;
import com.aurora.mapper.RoleMapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;

@ -1,14 +1,15 @@
package com.aurora.handler;
package com.aurora.interceptor;
import com.alibaba.fastjson.JSON;
import com.aurora.annotation.AccessLimit;
import com.aurora.service.RedisService;
import com.aurora.utils.IpUtils;
import com.aurora.vo.Result;
import com.aurora.model.vo.Result;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
@ -25,7 +26,8 @@ import static com.aurora.constant.CommonConst.APPLICATION_JSON;
*
*/
@Log4j2
public class WebSecurityHandler implements HandlerInterceptor {
@Component
public class AccessLimitInterceptor implements HandlerInterceptor {
@Autowired
private RedisService redisService;
@ -47,7 +49,7 @@ public class WebSecurityHandler implements HandlerInterceptor {
// 此操作代表获取该key对应的值自增1后的结果
long q = redisService.incrExpire(key, seconds);
if (q > maxCount) {
render(httpServletResponse, Result.fail("请求过于频繁,"+seconds+"秒后再试"));
render(httpServletResponse, Result.fail("请求过于频繁," + seconds + "秒后再试"));
log.warn(key + "请求次数超过每" + seconds + "秒" + maxCount + "次");
return false;
}

@ -1,7 +1,8 @@
package com.aurora.handler;
package com.aurora.interceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.aurora.utils.PageUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
@ -16,7 +17,8 @@ import static com.aurora.constant.CommonConst.*;
* @author
*
**/
public class PageableHandlerInterceptor implements HandlerInterceptor {
@Component
public class PaginationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

@ -1,11 +1,11 @@
package com.aurora.mapper;
import com.aurora.dto.ArticleAdminDTO;
import com.aurora.dto.ArticleCardDTO;
import com.aurora.dto.ArticleDTO;
import com.aurora.dto.ArticleStatisticsDTO;
import com.aurora.model.dto.ArticleAdminDTO;
import com.aurora.model.dto.ArticleCardDTO;
import com.aurora.model.dto.ArticleDTO;
import com.aurora.model.dto.ArticleStatisticsDTO;
import com.aurora.entity.Article;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,9 +1,9 @@
package com.aurora.mapper;
import com.aurora.dto.CategoryAdminDTO;
import com.aurora.dto.CategoryDTO;
import com.aurora.model.dto.CategoryAdminDTO;
import com.aurora.model.dto.CategoryDTO;
import com.aurora.entity.Category;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,12 +1,12 @@
package com.aurora.mapper;
import com.aurora.dto.CommentAdminDTO;
import com.aurora.dto.CommentCountDTO;
import com.aurora.dto.CommentDTO;
import com.aurora.dto.ReplyDTO;
import com.aurora.model.dto.CommentAdminDTO;
import com.aurora.model.dto.CommentCountDTO;
import com.aurora.model.dto.CommentDTO;
import com.aurora.model.dto.ReplyDTO;
import com.aurora.entity.Comment;
import com.aurora.vo.CommentVO;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.CommentVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,6 +1,6 @@
package com.aurora.mapper;
import com.aurora.dto.ArticleSearchDTO;
import com.aurora.model.dto.ArticleSearchDTO;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@ -1,8 +1,8 @@
package com.aurora.mapper;
import com.aurora.dto.JobDTO;
import com.aurora.model.dto.JobDTO;
import com.aurora.entity.Job;
import com.aurora.vo.JobSearchVO;
import com.aurora.model.vo.JobSearchVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,8 +1,8 @@
package com.aurora.mapper;
import com.aurora.dto.PhotoAlbumAdminDTO;
import com.aurora.model.dto.PhotoAlbumAdminDTO;
import com.aurora.entity.PhotoAlbum;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,9 +1,9 @@
package com.aurora.mapper;
import com.aurora.dto.ResourceRoleDTO;
import com.aurora.dto.RoleDTO;
import com.aurora.model.dto.ResourceRoleDTO;
import com.aurora.model.dto.RoleDTO;
import com.aurora.entity.Role;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,9 +1,9 @@
package com.aurora.mapper;
import com.aurora.dto.TagAdminDTO;
import com.aurora.dto.TagDTO;
import com.aurora.model.dto.TagAdminDTO;
import com.aurora.model.dto.TagDTO;
import com.aurora.entity.Tag;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,9 +1,9 @@
package com.aurora.mapper;
import com.aurora.dto.TalkAdminDTO;
import com.aurora.dto.TalkDTO;
import com.aurora.model.dto.TalkAdminDTO;
import com.aurora.model.dto.TalkDTO;
import com.aurora.entity.Talk;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,6 +1,6 @@
package com.aurora.mapper;
import com.aurora.dto.UniqueViewDTO;
import com.aurora.model.dto.UniqueViewDTO;
import com.aurora.entity.UniqueView;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

@ -1,8 +1,8 @@
package com.aurora.mapper;
import com.aurora.dto.UserAdminDTO;
import com.aurora.model.dto.UserAdminDTO;
import com.aurora.entity.UserAuth;
import com.aurora.vo.ConditionVO;
import com.aurora.model.vo.ConditionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import io.swagger.annotations.ApiModel;
@ -28,4 +28,5 @@ public class ArticleAdminViewDTO {
private Integer status;
private Integer type;
private String originalUrl;
private String password;
}

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import com.aurora.entity.Tag;
import com.aurora.entity.UserInfo;
@ -24,6 +24,7 @@ public class ArticleCardDTO {
private UserInfo author;
private String categoryName;
private List<Tag> tags;
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import com.aurora.entity.Tag;
import com.aurora.entity.UserInfo;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.Builder;
import lombok.Data;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,10 +1,5 @@
package com.aurora.dto;
package com.aurora.model.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,6 +1,5 @@
package com.aurora.dto;
package com.aurora.model.dto;
import com.aurora.entity.Article;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

@ -1,4 +1,4 @@
package com.aurora.dto;
package com.aurora.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save