Merge branch 'master' into production
# Conflicts: # blog4j-gateway/src/main/resources/application-prod.yml # blog4j-server/src/main/resources/application-prod.yml
This commit is contained in:
commit
4106d2a7ee
|
@ -1,6 +1,7 @@
|
||||||
package com.blog4j.api.client;
|
package com.blog4j.api.client;
|
||||||
|
|
||||||
import com.blog4j.api.vo.NoticeEmailVo;
|
import com.blog4j.api.vo.NoticeEmailVo;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
@ -67,4 +68,12 @@ public interface FeignServer {
|
||||||
@PostMapping("/sendEmailToUserForApproveOrganization")
|
@PostMapping("/sendEmailToUserForApproveOrganization")
|
||||||
void sendEmailToUserForApproveOrganization(@RequestParam("toEmail") String toEmail,
|
void sendEmailToUserForApproveOrganization(@RequestParam("toEmail") String toEmail,
|
||||||
@RequestParam("organizationName") String organizationName);
|
@RequestParam("organizationName") String organizationName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加日志
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
@PostMapping("/addLog")
|
||||||
|
void addLog(@RequestBody LogVo logVo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,10 @@
|
||||||
<artifactId>blog4j-api</artifactId>
|
<artifactId>blog4j-api</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.blog4j.article.aop;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.blog4j.api.client.FeignUser;
|
||||||
|
import com.blog4j.api.vo.UserInfoVo;
|
||||||
|
import com.blog4j.article.component.AsyncService;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.LogResultEnum;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.exception.Blog4jException;
|
||||||
|
import com.blog4j.common.exception.InvalidRequestException;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
|
import com.blog4j.common.utils.OperationLogHolder;
|
||||||
|
import com.blog4j.common.utils.RealIpUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:30
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
public class LogAspect {
|
||||||
|
private final FeignUser feignUser;
|
||||||
|
private final AsyncService asyncService;
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.blog4j.common.annotation.OperationLog)")
|
||||||
|
public void log() {}
|
||||||
|
|
||||||
|
@AfterThrowing(pointcut = "log()", throwing = "e")
|
||||||
|
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
||||||
|
String errMsg = e.getMessage();
|
||||||
|
if (e instanceof Blog4jException) {
|
||||||
|
Blog4jException blog4jException = (Blog4jException) e;
|
||||||
|
errMsg = blog4jException.getErrMsg();
|
||||||
|
} else if (e instanceof InvalidRequestException) {
|
||||||
|
InvalidRequestException invalidRequestException = (InvalidRequestException) e;
|
||||||
|
errMsg = invalidRequestException.getErrMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.error("接口异常: [{}]", errMsg);
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
logVo.setResult(LogResultEnum.FAIL.getResult()).setErrMsg(errMsg);
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("log()")
|
||||||
|
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
LogVo logVo = getAnnotationInfo(method);
|
||||||
|
logVo.setParam(JSONUtil.toJsonStr(joinPoint.getArgs()))
|
||||||
|
.setResult(LogResultEnum.SUCCESS.getResult());
|
||||||
|
// 方法名
|
||||||
|
String methodName = joinPoint.getSignature().getName();
|
||||||
|
logVo.setMethodName(methodName);
|
||||||
|
|
||||||
|
// 得到request
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes)
|
||||||
|
Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||||
|
logVo.setIpAddress(RealIpUtil.getRealIp(request)).setUrl(request.getRequestURL().toString());
|
||||||
|
UserInfoVo userInfo = getUserInfo();
|
||||||
|
if (Objects.nonNull(userInfo)) {
|
||||||
|
logVo.setUserId(userInfo.getUserId()).setUserName(userInfo.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
String className = joinPoint.getTarget().getClass().getName();
|
||||||
|
logVo.setClassName(className)
|
||||||
|
.setTime(System.currentTimeMillis() - startTime)
|
||||||
|
.setCreateTime(CommonUtil.getCurrentDateTime());
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
return joinPoint.proceed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter(JoinPoint joinPoint) {
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
OperationLogHolder.removeLogVo();
|
||||||
|
asyncService.addLog(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogVo getAnnotationInfo(Method method ) {
|
||||||
|
LogVo log = new LogVo();
|
||||||
|
OperationLog annotation = method.getAnnotation(OperationLog.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
OperationTypeEnum operationTypeEnum = annotation.operationType();
|
||||||
|
ModuleTypeEnum module = annotation.module();
|
||||||
|
String description = annotation.description();
|
||||||
|
log.setModuleType(module.getType())
|
||||||
|
.setOperationType(operationTypeEnum.getType())
|
||||||
|
.setDescription(description);
|
||||||
|
}
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserInfoVo getUserInfo() {
|
||||||
|
String userId = "";
|
||||||
|
try {
|
||||||
|
userId = StpUtil.getLoginIdAsString();
|
||||||
|
return feignUser.getUserInfoByUserId(userId);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.warn("user not login");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,31 +0,0 @@
|
||||||
package com.blog4j.article.api;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
|
||||||
import cn.dev33.satoken.annotation.SaMode;
|
|
||||||
import com.blog4j.article.entity.ApplyArticleEntity;
|
|
||||||
import com.blog4j.article.service.ApplyArticleService;
|
|
||||||
import com.blog4j.article.vo.req.ApplyArticleListReqVo;
|
|
||||||
import com.blog4j.common.model.Result;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import javax.validation.Valid;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 98k灬
|
|
||||||
* @version v1.0.0
|
|
||||||
* @Description : 功能描述
|
|
||||||
* @Create on : 2024/7/24 12:15
|
|
||||||
**/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/api/apply-article")
|
|
||||||
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
|
||||||
public class ApiApplyArticleController {
|
|
||||||
private final ApplyArticleService articleService;
|
|
||||||
}
|
|
|
@ -11,6 +11,8 @@ import com.blog4j.article.vo.req.UserArticleReqVo;
|
||||||
import com.blog4j.article.vo.resp.ArticleCategoryNumsRespVo;
|
import com.blog4j.article.vo.resp.ArticleCategoryNumsRespVo;
|
||||||
import com.blog4j.article.vo.resp.ArticleDetailRespVo;
|
import com.blog4j.article.vo.resp.ArticleDetailRespVo;
|
||||||
import com.blog4j.article.vo.resp.ArticleRespVo;
|
import com.blog4j.article.vo.resp.ArticleRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -45,6 +47,7 @@ public class ApiArticleController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 文章列表
|
* @return 文章列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取文章列表(门户端)")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/portalArticleList")
|
@PostMapping("/portalArticleList")
|
||||||
public Result portalArticleList(@RequestBody PortalArticleListReqVo reqVo) {
|
public Result portalArticleList(@RequestBody PortalArticleListReqVo reqVo) {
|
||||||
|
@ -58,6 +61,7 @@ public class ApiArticleController {
|
||||||
* @param articleId 文章ID
|
* @param articleId 文章ID
|
||||||
* @return 文章信息
|
* @return 文章信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "根据文章ID获取文章信息")
|
||||||
@GetMapping("/info/{articleId}")
|
@GetMapping("/info/{articleId}")
|
||||||
public Result info(@PathVariable("articleId") String articleId) {
|
public Result info(@PathVariable("articleId") String articleId) {
|
||||||
ArticleDetailRespVo respVo = articleService.articleInfo(articleId);
|
ArticleDetailRespVo respVo = articleService.articleInfo(articleId);
|
||||||
|
@ -69,6 +73,7 @@ public class ApiArticleController {
|
||||||
*
|
*
|
||||||
* @return 文章列表
|
* @return 文章列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取排行榜的文章")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/getViewsArticle")
|
@GetMapping("/getViewsArticle")
|
||||||
public Result getWeekViewsArticle() {
|
public Result getWeekViewsArticle() {
|
||||||
|
@ -82,6 +87,7 @@ public class ApiArticleController {
|
||||||
* @param articleId 文章ID
|
* @param articleId 文章ID
|
||||||
* @return 成功
|
* @return 成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取文章浏览量")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/article_views/{articleId}")
|
@GetMapping("/article_views/{articleId}")
|
||||||
public Result articleViews(@PathVariable("articleId") String articleId) {
|
public Result articleViews(@PathVariable("articleId") String articleId) {
|
||||||
|
@ -95,6 +101,7 @@ public class ApiArticleController {
|
||||||
* @param articleId 文章ID
|
* @param articleId 文章ID
|
||||||
* @return 文章信息
|
* @return 文章信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取当前文章的上一篇和下一篇")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/getNextAndPreviousArticle/{articleId}")
|
@GetMapping("/getNextAndPreviousArticle/{articleId}")
|
||||||
public Result getNextAndPreviousArticle(@PathVariable("articleId") String articleId) {
|
public Result getNextAndPreviousArticle(@PathVariable("articleId") String articleId) {
|
||||||
|
@ -108,6 +115,7 @@ public class ApiArticleController {
|
||||||
* @param articleId 文章ID
|
* @param articleId 文章ID
|
||||||
* @return 推荐文章列表
|
* @return 推荐文章列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取推荐文章列表")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/getRecommendArticle/{articleId}")
|
@GetMapping("/getRecommendArticle/{articleId}")
|
||||||
public Result getRecommendArticle(@PathVariable("articleId") String articleId) {
|
public Result getRecommendArticle(@PathVariable("articleId") String articleId) {
|
||||||
|
@ -120,6 +128,7 @@ public class ApiArticleController {
|
||||||
*
|
*
|
||||||
* @return 最新文章列表
|
* @return 最新文章列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取最新文章列表")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/getNewArticleList")
|
@GetMapping("/getNewArticleList")
|
||||||
public Result getNewArticleList() {
|
public Result getNewArticleList() {
|
||||||
|
@ -133,6 +142,7 @@ public class ApiArticleController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 文章信息
|
* @return 文章信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "根据分类ID获取文章信息")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/getByCategoryId")
|
@PostMapping("/getByCategoryId")
|
||||||
public Result getByCategoryId(@RequestBody @Valid ArticleByCategoryIdReqVo reqVo) {
|
public Result getByCategoryId(@RequestBody @Valid ArticleByCategoryIdReqVo reqVo) {
|
||||||
|
@ -146,6 +156,7 @@ public class ApiArticleController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 组织信息
|
* @return 组织信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "根据组织ID获取组织文章列表")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/organizationArticleList")
|
@PostMapping("/organizationArticleList")
|
||||||
public Result organizationArticleList(@RequestBody @Valid OrganizationArticleListReqVo reqVo) {
|
public Result organizationArticleList(@RequestBody @Valid OrganizationArticleListReqVo reqVo) {
|
||||||
|
@ -159,6 +170,7 @@ public class ApiArticleController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 用户文章
|
* @return 用户文章
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取用户的文章")
|
||||||
@PostMapping("/getUserArticle")
|
@PostMapping("/getUserArticle")
|
||||||
public Result getUserArticle(@RequestBody @Valid UserArticleReqVo reqVo) {
|
public Result getUserArticle(@RequestBody @Valid UserArticleReqVo reqVo) {
|
||||||
PageInfo<ArticleRespVo> pageInfo = articleService.getUserArticle(reqVo);
|
PageInfo<ArticleRespVo> pageInfo = articleService.getUserArticle(reqVo);
|
||||||
|
@ -170,6 +182,7 @@ public class ApiArticleController {
|
||||||
*
|
*
|
||||||
* @return 用户的文章数、分类数
|
* @return 用户的文章数、分类数
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取用户的文章数、分类数")
|
||||||
@GetMapping("/getArticleCategoryNums")
|
@GetMapping("/getArticleCategoryNums")
|
||||||
public Result getArticleCategoryNums(@RequestParam(value = "userId") String userId) {
|
public Result getArticleCategoryNums(@RequestParam(value = "userId") String userId) {
|
||||||
ArticleCategoryNumsRespVo respVo = articleService.getArticleCategoryNums(userId);
|
ArticleCategoryNumsRespVo respVo = articleService.getArticleCategoryNums(userId);
|
||||||
|
@ -182,6 +195,7 @@ public class ApiArticleController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 收藏文章
|
* @return 收藏文章
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取用户的收藏文章")
|
||||||
@PostMapping("/getFavoriteArticleByUserId")
|
@PostMapping("/getFavoriteArticleByUserId")
|
||||||
public Result getFavoriteArticleByUserId(@RequestBody @Valid FavoriteArticleByUserIdReqVo reqVo) {
|
public Result getFavoriteArticleByUserId(@RequestBody @Valid FavoriteArticleByUserIdReqVo reqVo) {
|
||||||
PageInfo<ArticleRespVo> pageInfo = articleService.getFavoriteArticleByUserId(reqVo);
|
PageInfo<ArticleRespVo> pageInfo = articleService.getFavoriteArticleByUserId(reqVo);
|
||||||
|
|
|
@ -7,6 +7,9 @@ import com.blog4j.article.service.CategoryService;
|
||||||
import com.blog4j.article.vo.req.CategoryByUserIdReqVo;
|
import com.blog4j.article.vo.req.CategoryByUserIdReqVo;
|
||||||
import com.blog4j.article.vo.req.CategoryListReqVo;
|
import com.blog4j.article.vo.req.CategoryListReqVo;
|
||||||
import com.blog4j.article.vo.resp.CategoryRespVo;
|
import com.blog4j.article.vo.resp.CategoryRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import javafx.print.Collation;
|
import javafx.print.Collation;
|
||||||
|
@ -40,6 +43,9 @@ public class ApiCategoryController {
|
||||||
* @param categoryId 分类ID
|
* @param categoryId 分类ID
|
||||||
* @return 分类信息
|
* @return 分类信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据分类ID查询分类信息")
|
||||||
@GetMapping("/info/{categoryId}")
|
@GetMapping("/info/{categoryId}")
|
||||||
public Result info(@PathVariable("categoryId") String categoryId) {
|
public Result info(@PathVariable("categoryId") String categoryId) {
|
||||||
CategoryEntity category = categoryService.getById(categoryId);
|
CategoryEntity category = categoryService.getById(categoryId);
|
||||||
|
@ -52,6 +58,9 @@ public class ApiCategoryController {
|
||||||
* @param userId 创建者ID
|
* @param userId 创建者ID
|
||||||
* @return 分类列表
|
* @return 分类列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据创建者ID查询分类列表")
|
||||||
@GetMapping("/getInfoByCreaterId/{userId}")
|
@GetMapping("/getInfoByCreaterId/{userId}")
|
||||||
public Result getInfoByCreaterId(@PathVariable("userId") String userId) {
|
public Result getInfoByCreaterId(@PathVariable("userId") String userId) {
|
||||||
List<CategoryEntity> category = categoryService.getInfoByCreaterId(userId);
|
List<CategoryEntity> category = categoryService.getInfoByCreaterId(userId);
|
||||||
|
@ -64,6 +73,9 @@ public class ApiCategoryController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 分类列表
|
* @return 分类列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "门户端查询分类列表")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/category_list")
|
@PostMapping("/category_list")
|
||||||
public Result categoryList(@RequestBody @Valid CategoryListReqVo reqVo) {
|
public Result categoryList(@RequestBody @Valid CategoryListReqVo reqVo) {
|
||||||
|
@ -77,6 +89,9 @@ public class ApiCategoryController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 分类信息列表
|
* @return 分类信息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据用户ID获取分类信息列表")
|
||||||
@PostMapping("/getCategoryByUserId")
|
@PostMapping("/getCategoryByUserId")
|
||||||
public Result getCategoryByUserId(@RequestBody @Valid CategoryByUserIdReqVo reqVo) {
|
public Result getCategoryByUserId(@RequestBody @Valid CategoryByUserIdReqVo reqVo) {
|
||||||
PageInfo<CategoryRespVo> pageInfo = categoryService.getCategoryByUserId(reqVo);
|
PageInfo<CategoryRespVo> pageInfo = categoryService.getCategoryByUserId(reqVo);
|
||||||
|
|
|
@ -5,6 +5,9 @@ import com.blog4j.article.entity.CommentEntity;
|
||||||
import com.blog4j.article.model.Comment;
|
import com.blog4j.article.model.Comment;
|
||||||
import com.blog4j.article.service.CommentService;
|
import com.blog4j.article.service.CommentService;
|
||||||
import com.blog4j.article.vo.req.CommentReqVo;
|
import com.blog4j.article.vo.req.CommentReqVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -34,6 +37,7 @@ public class ApiCommentController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 评论列表
|
* @return 评论列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取文章评论列表")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/commentList")
|
@PostMapping("/commentList")
|
||||||
public Result commentList(@RequestBody @Valid CommentReqVo reqVo) {
|
public Result commentList(@RequestBody @Valid CommentReqVo reqVo) {
|
||||||
|
|
|
@ -3,6 +3,9 @@ package com.blog4j.article.api;
|
||||||
import com.blog4j.article.entity.LabelEntity;
|
import com.blog4j.article.entity.LabelEntity;
|
||||||
import com.blog4j.article.service.LabelService;
|
import com.blog4j.article.service.LabelService;
|
||||||
import com.blog4j.article.vo.req.LabelListReqVo;
|
import com.blog4j.article.vo.req.LabelListReqVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -35,6 +38,9 @@ public class ApiLabelController {
|
||||||
* @param categoryId 分类ID
|
* @param categoryId 分类ID
|
||||||
* @return 标签信息列表
|
* @return 标签信息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据分类ID查询标签信息列表")
|
||||||
@GetMapping("/getByCategoryId/{categoryId}")
|
@GetMapping("/getByCategoryId/{categoryId}")
|
||||||
public Result getByCategoryId(@PathVariable("categoryId") String categoryId) {
|
public Result getByCategoryId(@PathVariable("categoryId") String categoryId) {
|
||||||
List<LabelEntity> list = labelService.getByCategoryId(categoryId);
|
List<LabelEntity> list = labelService.getByCategoryId(categoryId);
|
||||||
|
@ -46,6 +52,9 @@ public class ApiLabelController {
|
||||||
*
|
*
|
||||||
* @return 标签列表
|
* @return 标签列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据创建者ID获取标签列表")
|
||||||
@GetMapping("/getListByCreaterId")
|
@GetMapping("/getListByCreaterId")
|
||||||
public Result getListByCreaterId() {
|
public Result getListByCreaterId() {
|
||||||
List<LabelEntity> list = labelService.getListByCreaterId();
|
List<LabelEntity> list = labelService.getListByCreaterId();
|
||||||
|
@ -58,6 +67,9 @@ public class ApiLabelController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 标签列表
|
* @return 标签列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "标签列表查询")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody @Valid LabelListReqVo reqVo) {
|
public Result list(@RequestBody @Valid LabelListReqVo reqVo) {
|
||||||
List<LabelEntity> list = labelService.getLabelList(reqVo);
|
List<LabelEntity> list = labelService.getLabelList(reqVo);
|
||||||
|
@ -70,6 +82,9 @@ public class ApiLabelController {
|
||||||
* @param labelId 标签ID
|
* @param labelId 标签ID
|
||||||
* @return 详情信息
|
* @return 详情信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "根据标签ID查询详情信息")
|
||||||
@GetMapping("/info/{labelId}")
|
@GetMapping("/info/{labelId}")
|
||||||
public Result info(@PathVariable("labelId") String labelId) {
|
public Result info(@PathVariable("labelId") String labelId) {
|
||||||
LabelEntity label = labelService.getById(labelId);
|
LabelEntity label = labelService.getById(labelId);
|
||||||
|
|
|
@ -8,6 +8,7 @@ import com.blog4j.api.vo.NoticeEmailVo;
|
||||||
import com.blog4j.article.entity.ArticleEntity;
|
import com.blog4j.article.entity.ArticleEntity;
|
||||||
import com.blog4j.article.mapper.ArticleMapper;
|
import com.blog4j.article.mapper.ArticleMapper;
|
||||||
import com.blog4j.article.service.impl.ArticleServiceImpl;
|
import com.blog4j.article.service.impl.ArticleServiceImpl;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
@ -107,4 +108,9 @@ public class AsyncService {
|
||||||
feignServer.sendSystemEmailToArticleCreater(email, articleTitle);
|
feignServer.sendSystemEmailToArticleCreater(email, articleTitle);
|
||||||
log.info("====================文章审批后,给创建者发送邮件通知成功====================");
|
log.info("====================文章审批后,给创建者发送邮件通知成功====================");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Async
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
feignServer.addLog(logVo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,9 @@ import com.blog4j.article.service.ApplyArticleService;
|
||||||
import com.blog4j.article.vo.req.ApplyArticleListReqVo;
|
import com.blog4j.article.vo.req.ApplyArticleListReqVo;
|
||||||
import com.blog4j.article.vo.req.ApproveArticleReqVo;
|
import com.blog4j.article.vo.req.ApproveArticleReqVo;
|
||||||
import com.blog4j.article.vo.resp.ApplyArticleRespVo;
|
import com.blog4j.article.vo.resp.ApplyArticleRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -31,11 +34,14 @@ public class ApplyArticleController {
|
||||||
private final ApplyArticleService applyArticleService;
|
private final ApplyArticleService applyArticleService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页加条件查询申请文章信息列表
|
* 分页查询申请文章信息列表
|
||||||
*
|
*
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 文章信息列表
|
* @return 文章信息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "分页查询申请文章信息列表")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody @Valid ApplyArticleListReqVo reqVo) {
|
public Result list(@RequestBody @Valid ApplyArticleListReqVo reqVo) {
|
||||||
|
@ -49,6 +55,9 @@ public class ApplyArticleController {
|
||||||
* @param reqVo 审批信息
|
* @param reqVo 审批信息
|
||||||
* @return 审批成功
|
* @return 审批成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "审批文章")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/approve")
|
@PostMapping("/approve")
|
||||||
public Result approve(@RequestBody @Valid ApproveArticleReqVo reqVo) {
|
public Result approve(@RequestBody @Valid ApproveArticleReqVo reqVo) {
|
||||||
|
|
|
@ -16,6 +16,8 @@ import com.blog4j.article.vo.req.FavoriteReqVo;
|
||||||
import com.blog4j.article.vo.req.LikeArticleReqVo;
|
import com.blog4j.article.vo.req.LikeArticleReqVo;
|
||||||
import com.blog4j.article.vo.resp.ArticleDetailRespVo;
|
import com.blog4j.article.vo.resp.ArticleDetailRespVo;
|
||||||
import com.blog4j.article.vo.resp.ArticleStatusRespVo;
|
import com.blog4j.article.vo.resp.ArticleStatusRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -52,6 +54,7 @@ public class ArticleController {
|
||||||
* @param articleListReqVo 查询条件
|
* @param articleListReqVo 查询条件
|
||||||
* @return 文章列表
|
* @return 文章列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取文章列表(后台管理端)")
|
||||||
@SaCheckPermission(value = "ARTICLE:LIST")
|
@SaCheckPermission(value = "ARTICLE:LIST")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody ArticleListReqVo articleListReqVo) {
|
public Result list(@RequestBody ArticleListReqVo articleListReqVo) {
|
||||||
|
|
|
@ -11,6 +11,9 @@ import com.blog4j.article.vo.req.CreateCategoryReqVo;
|
||||||
import com.blog4j.article.vo.req.DeleteCategoryReqVo;
|
import com.blog4j.article.vo.req.DeleteCategoryReqVo;
|
||||||
import com.blog4j.article.vo.req.SaveCategoryLabelReqVo;
|
import com.blog4j.article.vo.req.SaveCategoryLabelReqVo;
|
||||||
import com.blog4j.article.vo.resp.CategoryRespVo;
|
import com.blog4j.article.vo.resp.CategoryRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -42,6 +45,9 @@ public class CategoryController {
|
||||||
* @param reqVo 待删除的分类ID列表
|
* @param reqVo 待删除的分类ID列表
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "删除分类信息")
|
||||||
@SaCheckPermission(value = "CATEGORY:DELETE")
|
@SaCheckPermission(value = "CATEGORY:DELETE")
|
||||||
@PostMapping ("/delete")
|
@PostMapping ("/delete")
|
||||||
public Result delete(@RequestBody @Valid DeleteCategoryReqVo reqVo) {
|
public Result delete(@RequestBody @Valid DeleteCategoryReqVo reqVo) {
|
||||||
|
@ -55,6 +61,9 @@ public class CategoryController {
|
||||||
* @param reqVo 分类信息
|
* @param reqVo 分类信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "创建分类信息")
|
||||||
@SaCheckPermission(value = "CATEGORY:ADD")
|
@SaCheckPermission(value = "CATEGORY:ADD")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public Result create(@RequestBody @Valid CreateCategoryReqVo reqVo) {
|
public Result create(@RequestBody @Valid CreateCategoryReqVo reqVo) {
|
||||||
|
@ -68,6 +77,9 @@ public class CategoryController {
|
||||||
* @param reqVo 分类信息
|
* @param reqVo 分类信息
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "编辑分类信息")
|
||||||
@PostMapping("/edit")
|
@PostMapping("/edit")
|
||||||
public Result edit(@RequestBody @Valid CategoryEditReqVo reqVo) {
|
public Result edit(@RequestBody @Valid CategoryEditReqVo reqVo) {
|
||||||
categoryService.edit(reqVo);
|
categoryService.edit(reqVo);
|
||||||
|
@ -80,6 +92,9 @@ public class CategoryController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "保存分类下的标签信息")
|
||||||
@PostMapping("/saveCategoryLabel")
|
@PostMapping("/saveCategoryLabel")
|
||||||
public Result saveCategoryLabel(@RequestBody @Valid SaveCategoryLabelReqVo reqVo) {
|
public Result saveCategoryLabel(@RequestBody @Valid SaveCategoryLabelReqVo reqVo) {
|
||||||
categoryService.saveCategoryLabel(reqVo);
|
categoryService.saveCategoryLabel(reqVo);
|
||||||
|
@ -92,6 +107,7 @@ public class CategoryController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 文章分类信息
|
* @return 文章分类信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.ARTICLE, description = "获取文章分类信息列表")
|
||||||
@SaCheckPermission("CATEGORY:LIST")
|
@SaCheckPermission("CATEGORY:LIST")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody @Valid CategoryListReqVo reqVo) {
|
public Result list(@RequestBody @Valid CategoryListReqVo reqVo) {
|
||||||
|
|
|
@ -3,6 +3,9 @@ package com.blog4j.article.controller;
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import com.blog4j.article.service.CommentService;
|
import com.blog4j.article.service.CommentService;
|
||||||
import com.blog4j.article.vo.req.SendCommentReqVo;
|
import com.blog4j.article.vo.req.SendCommentReqVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
@ -26,11 +29,14 @@ public class CommentController {
|
||||||
private final CommentService commentService;
|
private final CommentService commentService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 给文章评论
|
* 新增文章评论
|
||||||
*
|
*
|
||||||
* @param reqVo 评论信息
|
* @param reqVo 评论信息
|
||||||
* @return 评论成功
|
* @return 评论成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "新增文章评论")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/sendComment")
|
@PostMapping("/sendComment")
|
||||||
public Result sendComment(@RequestBody @Valid SendCommentReqVo reqVo) {
|
public Result sendComment(@RequestBody @Valid SendCommentReqVo reqVo) {
|
||||||
|
|
|
@ -5,6 +5,9 @@ import com.blog4j.article.service.LabelService;
|
||||||
import com.blog4j.article.vo.req.CreateLabelReqVo;
|
import com.blog4j.article.vo.req.CreateLabelReqVo;
|
||||||
import com.blog4j.article.vo.req.DeleteLabelReqVo;
|
import com.blog4j.article.vo.req.DeleteLabelReqVo;
|
||||||
import com.blog4j.article.vo.req.EditLabelReqVo;
|
import com.blog4j.article.vo.req.EditLabelReqVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
@ -33,6 +36,9 @@ public class LabelController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "编辑标签信息")
|
||||||
@SaCheckPermission("LABEL:EDIT")
|
@SaCheckPermission("LABEL:EDIT")
|
||||||
@PostMapping("/edit")
|
@PostMapping("/edit")
|
||||||
public Result edit(@RequestBody @Valid EditLabelReqVo reqVo) {
|
public Result edit(@RequestBody @Valid EditLabelReqVo reqVo) {
|
||||||
|
@ -46,6 +52,9 @@ public class LabelController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "创建标签信息")
|
||||||
@SaCheckPermission("LABEL:ADD")
|
@SaCheckPermission("LABEL:ADD")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public Result create(@RequestBody @Valid CreateLabelReqVo reqVo) {
|
public Result create(@RequestBody @Valid CreateLabelReqVo reqVo) {
|
||||||
|
@ -59,6 +68,9 @@ public class LabelController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.ARTICLE,
|
||||||
|
description = "删除标签信息")
|
||||||
@SaCheckPermission("LABEL:DELETE")
|
@SaCheckPermission("LABEL:DELETE")
|
||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
public Result delete(@RequestBody @Valid DeleteLabelReqVo reqVo) {
|
public Result delete(@RequestBody @Valid DeleteLabelReqVo reqVo) {
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
spring:
|
spring:
|
||||||
|
liquibase:
|
||||||
|
change-log: classpath:/liquibase/master.xml
|
||||||
datasource:
|
datasource:
|
||||||
# driver-class-name: com.mysql.cj.jdbc.Driver
|
# driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
|
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
|
||||||
# url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
# url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
url: jdbc:p6spy:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
url: jdbc:p6spy:mysql://localhost:3306/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
username: blog4j_article_dev
|
username: root
|
||||||
password: 4897458Hk!@
|
password: 4897458hk
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
spring:
|
spring:
|
||||||
|
# liquibase:
|
||||||
|
# change-log: classpath:/liquibase/master.xml
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
url: jdbc:mysql://sh-cdb-m53tmbii.sql.tencentcdb.com:20855/blog4j-article?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
username: blog4j_article_dev
|
username: root
|
||||||
password: 4897458Hk!@
|
password: 4897458Hk!@
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
|
|
|
@ -16,4 +16,10 @@ sa-token:
|
||||||
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
||||||
token-name: Authentication
|
token-name: Authentication
|
||||||
timeout: 86400
|
timeout: 86400
|
||||||
is-concurrent: false
|
is-concurrent: false
|
||||||
|
|
||||||
|
jasypt:
|
||||||
|
encryptor:
|
||||||
|
password: blog4j_test
|
||||||
|
algorithm: PBEWithMD5AndDES
|
||||||
|
iv-generator-classname: org.jasypt.iv.NoIvGenerator
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<!--用于参考 id:当前时间戳 author:sql文件提交人 runOnChange:文件内容更改sql会重新执行-->
|
||||||
|
<changeSet id="t_article_init_ddl_20240823123545" author="98k" runOnChange="false">
|
||||||
|
<sqlFile path="liquibase/upgrade/20240823/t_article_init_ddl_20240823123545.sql"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<include file="liquibase/changelog/database_change.xml" relativeToChangelogFile="false"/>
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
Navicat MySQL Data Transfer
|
||||||
|
|
||||||
|
Source Server : blog4j-user-dev
|
||||||
|
Source Server Type : MySQL
|
||||||
|
Source Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
Source Host : sh-cdb-b593hl8o.sql.tencentcdb.com:63556
|
||||||
|
Source Schema : blog4j-article
|
||||||
|
|
||||||
|
Target Server Type : MySQL
|
||||||
|
Target Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 23/08/2024 12:36:59
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_apply_article
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_apply_article`;
|
||||||
|
CREATE TABLE `t_apply_article` (
|
||||||
|
`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
|
||||||
|
`article_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章ID',
|
||||||
|
`article_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章标题',
|
||||||
|
`apply_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人ID',
|
||||||
|
`apply_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人名称',
|
||||||
|
`apply_user_role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人的角色ID',
|
||||||
|
`apply_user_role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人的角色名称',
|
||||||
|
`organization_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织ID',
|
||||||
|
`organization_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织名称',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_article_id`(`article_id`) USING BTREE COMMENT '文章ID唯一索引'
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章审批信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_article
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_article`;
|
||||||
|
CREATE TABLE `t_article` (
|
||||||
|
`article_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章ID',
|
||||||
|
`category_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类ID',
|
||||||
|
`category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
|
||||||
|
`label_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签ID',
|
||||||
|
`label_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
|
||||||
|
`cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章封面',
|
||||||
|
`title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章标题',
|
||||||
|
`md_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章内容',
|
||||||
|
`html_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章html内容',
|
||||||
|
`author_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章的作者ID',
|
||||||
|
`author_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章的作者名称',
|
||||||
|
`status` int(11) NOT NULL COMMENT '文章状态(1:草稿 2:待发布 3:已发布)',
|
||||||
|
`approve_status` int(11) NOT NULL COMMENT '审批状态(1:待审批 2:审批通过 3:审批拒绝)',
|
||||||
|
`approve_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '审批人用户ID',
|
||||||
|
`approve_user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '审批人用户名称',
|
||||||
|
`approve_time` datetime NULL DEFAULT NULL COMMENT '审批时间',
|
||||||
|
`approve_message` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '审批留言',
|
||||||
|
`article_type` int(11) NOT NULL COMMENT '文章类型(1:原创 2:转载)',
|
||||||
|
`curation_link` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '转载的链接',
|
||||||
|
`summary` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '摘要',
|
||||||
|
`public_type` int(11) NOT NULL COMMENT '文章公开类型(1:仅对自己公开 2:仅对组织内成员公开 3:所有人公开)',
|
||||||
|
`cron_release_time` datetime NULL DEFAULT NULL COMMENT '定时发布的时间',
|
||||||
|
`timed_release` int(11) NOT NULL COMMENT '是否定时发布',
|
||||||
|
`publish_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发布人用户ID',
|
||||||
|
`stick` int(11) NOT NULL DEFAULT 0 COMMENT '是否置顶(1:是 0:否)',
|
||||||
|
`allow_comment` int(11) NOT NULL COMMENT '是否允许评论',
|
||||||
|
`allow_download` int(11) NOT NULL COMMENT '是否允许下载',
|
||||||
|
`views` int(11) NOT NULL COMMENT '浏览数',
|
||||||
|
`likes` int(11) NOT NULL COMMENT '点赞数',
|
||||||
|
`auto_publish` int(11) NOT NULL DEFAULT 0 COMMENT '是否自动发布(1:是 0:否)',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`article_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_category
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_category`;
|
||||||
|
CREATE TABLE `t_category` (
|
||||||
|
`category_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类ID',
|
||||||
|
`category_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类代码',
|
||||||
|
`category_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
|
||||||
|
`cover` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '背景图片',
|
||||||
|
`status` int(11) NOT NULL COMMENT '状态',
|
||||||
|
`creater` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者ID',
|
||||||
|
`creater_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者名称',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`category_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_name_userid`(`category_name`, `creater`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_code_userid`(`category_code`, `creater`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章分类信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_category_label_rel
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_category_label_rel`;
|
||||||
|
CREATE TABLE `t_category_label_rel` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`category_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类ID',
|
||||||
|
`label_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签ID',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_categoryId_lableId`(`category_id`, `label_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分类标签关系表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_comment
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_comment`;
|
||||||
|
CREATE TABLE `t_comment` (
|
||||||
|
`comment_id` int(20) NOT NULL AUTO_INCREMENT COMMENT '评论ID',
|
||||||
|
`parent_id` int(20) NOT NULL COMMENT '评论父ID',
|
||||||
|
`article_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章ID',
|
||||||
|
`content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '评论内容',
|
||||||
|
`comment_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '评论的作者ID',
|
||||||
|
`target_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '被评论者的ID',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`comment_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章评论信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_favorite
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_favorite`;
|
||||||
|
CREATE TABLE `t_favorite` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`article_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文章ID',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_userid_articleid`(`user_id`, `article_id`) USING BTREE COMMENT '用户ID和文章ID唯一索引',
|
||||||
|
INDEX `idx_nor_article_id`(`article_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_user_id`(`user_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户收藏的文章信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_label
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_label`;
|
||||||
|
CREATE TABLE `t_label` (
|
||||||
|
`label_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
|
||||||
|
`label_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签代码',
|
||||||
|
`label_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
|
||||||
|
`status` int(11) NOT NULL COMMENT '标签状态',
|
||||||
|
`creater` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者用户ID',
|
||||||
|
`creater_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者用户名称',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`label_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_name_userid`(`label_name`, `creater`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_code_userid`(`label_code`, `creater`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '标签信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 98k灬
|
* @author 98k灬
|
||||||
|
@ -14,6 +15,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@EnableDiscoveryClient
|
@EnableDiscoveryClient
|
||||||
@EnableFeignClients(basePackages = "com.blog4j")
|
@EnableFeignClients(basePackages = "com.blog4j")
|
||||||
|
@EnableAsync
|
||||||
public class AuthApplication {
|
public class AuthApplication {
|
||||||
/**
|
/**
|
||||||
* 启动
|
* 启动
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.blog4j.auth.aop;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.blog4j.api.client.FeignUser;
|
||||||
|
import com.blog4j.api.vo.UserInfoVo;
|
||||||
|
import com.blog4j.auth.component.AsyncService;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.LogResultEnum;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.exception.Blog4jException;
|
||||||
|
import com.blog4j.common.exception.InvalidRequestException;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
|
import com.blog4j.common.utils.OperationLogHolder;
|
||||||
|
import com.blog4j.common.utils.RealIpUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:30
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
public class LogAspect {
|
||||||
|
private final FeignUser feignUser;
|
||||||
|
private final AsyncService asyncService;
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.blog4j.common.annotation.OperationLog)")
|
||||||
|
public void log() {}
|
||||||
|
|
||||||
|
@AfterThrowing(pointcut = "log()", throwing = "e")
|
||||||
|
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
||||||
|
String errMsg = e.getMessage();
|
||||||
|
if (e instanceof Blog4jException) {
|
||||||
|
Blog4jException blog4jException = (Blog4jException) e;
|
||||||
|
errMsg = blog4jException.getErrMsg();
|
||||||
|
} else if (e instanceof InvalidRequestException) {
|
||||||
|
InvalidRequestException invalidRequestException = (InvalidRequestException) e;
|
||||||
|
errMsg = invalidRequestException.getErrMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.error("接口异常: [{}]", errMsg);
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
logVo.setResult(LogResultEnum.FAIL.getResult()).setErrMsg(errMsg);
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("log()")
|
||||||
|
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
LogVo logVo = getAnnotationInfo(method);
|
||||||
|
logVo.setParam(JSONUtil.toJsonStr(joinPoint.getArgs()))
|
||||||
|
.setResult(LogResultEnum.SUCCESS.getResult());
|
||||||
|
// 方法名
|
||||||
|
String methodName = joinPoint.getSignature().getName();
|
||||||
|
logVo.setMethodName(methodName);
|
||||||
|
|
||||||
|
// 得到request
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes)
|
||||||
|
Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||||
|
logVo.setIpAddress(RealIpUtil.getRealIp(request)).setUrl(request.getRequestURL().toString());
|
||||||
|
UserInfoVo userInfo = getUserInfo();
|
||||||
|
if (Objects.nonNull(userInfo)) {
|
||||||
|
logVo.setUserId(userInfo.getUserId()).setUserName(userInfo.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
String className = joinPoint.getTarget().getClass().getName();
|
||||||
|
logVo.setClassName(className)
|
||||||
|
.setTime(System.currentTimeMillis() - startTime)
|
||||||
|
.setCreateTime(CommonUtil.getCurrentDateTime());
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
return joinPoint.proceed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter(JoinPoint joinPoint) {
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
OperationLogHolder.removeLogVo();
|
||||||
|
asyncService.addLog(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogVo getAnnotationInfo(Method method ) {
|
||||||
|
LogVo log = new LogVo();
|
||||||
|
OperationLog annotation = method.getAnnotation(OperationLog.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
OperationTypeEnum operationTypeEnum = annotation.operationType();
|
||||||
|
ModuleTypeEnum module = annotation.module();
|
||||||
|
String description = annotation.description();
|
||||||
|
log.setModuleType(module.getType())
|
||||||
|
.setOperationType(operationTypeEnum.getType())
|
||||||
|
.setDescription(description);
|
||||||
|
}
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserInfoVo getUserInfo() {
|
||||||
|
String userId = "";
|
||||||
|
try {
|
||||||
|
userId = StpUtil.getLoginIdAsString();
|
||||||
|
return feignUser.getUserInfoByUserId(userId);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.warn("user not login");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,9 @@ import com.blog4j.auth.vo.req.LoginReqVo;
|
||||||
import com.blog4j.auth.vo.req.PhoneLoginReqVo;
|
import com.blog4j.auth.vo.req.PhoneLoginReqVo;
|
||||||
import com.blog4j.auth.vo.req.WebLoginReqVo;
|
import com.blog4j.auth.vo.req.WebLoginReqVo;
|
||||||
import com.blog4j.auth.vo.resp.AesKeyAndIvRespVo;
|
import com.blog4j.auth.vo.resp.AesKeyAndIvRespVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
@ -43,6 +46,9 @@ public class ApiAuthController {
|
||||||
private final AuthService authService;
|
private final AuthService authService;
|
||||||
private final CaptchaService captchaService;
|
private final CaptchaService captchaService;
|
||||||
|
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.LOGIN,
|
||||||
|
module= ModuleTypeEnum.AUTH,
|
||||||
|
description = "登录")
|
||||||
@SaIgnore()
|
@SaIgnore()
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
public Result login(@RequestBody @Valid LoginReqVo loginReqVo) {
|
public Result login(@RequestBody @Valid LoginReqVo loginReqVo) {
|
||||||
|
@ -52,6 +58,9 @@ public class ApiAuthController {
|
||||||
return Result.ok(loginContext.getSaTokenInfo());
|
return Result.ok(loginContext.getSaTokenInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.AUTH,
|
||||||
|
description = "获取图形验证码")
|
||||||
@SaIgnore()
|
@SaIgnore()
|
||||||
@GetMapping("/captcha.jpg")
|
@GetMapping("/captcha.jpg")
|
||||||
public void captcha(HttpServletResponse response, @RequestParam String uuid) throws IOException {
|
public void captcha(HttpServletResponse response, @RequestParam String uuid) throws IOException {
|
||||||
|
@ -66,6 +75,7 @@ public class ApiAuthController {
|
||||||
IOUtils.closeQuietly(out);
|
IOUtils.closeQuietly(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperationLog(module= ModuleTypeEnum.AUTH, description = "退出", operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/logout/{userId}")
|
@GetMapping("/logout/{userId}")
|
||||||
public Result logout(@PathVariable("userId") String userId) {
|
public Result logout(@PathVariable("userId") String userId) {
|
||||||
|
@ -80,6 +90,9 @@ public class ApiAuthController {
|
||||||
return Result.ok(respVo);
|
return Result.ok(respVo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.LOGIN,
|
||||||
|
module= ModuleTypeEnum.AUTH,
|
||||||
|
description = "手机号码登录")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/phone_login")
|
@PostMapping("/phone_login")
|
||||||
public Result phoneLogin(@RequestBody @Valid PhoneLoginReqVo reqVo) {
|
public Result phoneLogin(@RequestBody @Valid PhoneLoginReqVo reqVo) {
|
||||||
|
@ -87,6 +100,9 @@ public class ApiAuthController {
|
||||||
return Result.ok(tokenInfo);
|
return Result.ok(tokenInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.LOGIN,
|
||||||
|
module= ModuleTypeEnum.AUTH,
|
||||||
|
description = "门户端登录")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/web_login")
|
@PostMapping("/web_login")
|
||||||
public Result webLogin(@RequestBody @Valid WebLoginReqVo reqVo) {
|
public Result webLogin(@RequestBody @Valid WebLoginReqVo reqVo) {
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.blog4j.auth.component;
|
||||||
|
|
||||||
|
import com.blog4j.api.client.FeignServer;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/20 19:58
|
||||||
|
**/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
public class AsyncService {
|
||||||
|
private final FeignServer feignServer;
|
||||||
|
|
||||||
|
@Async
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
feignServer.addLog(logVo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -74,6 +74,11 @@
|
||||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ulisesbocchio</groupId>
|
||||||
|
<artifactId>jasypt-spring-boot-starter</artifactId>
|
||||||
|
<version>3.0.3</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.blog4j.common.annotation;
|
||||||
|
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 统一日志注解
|
||||||
|
* @Create on : 2024/8/18 13:04
|
||||||
|
**/
|
||||||
|
@Target({ ElementType.METHOD })
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface OperationLog {
|
||||||
|
/**
|
||||||
|
* 日志类型
|
||||||
|
*
|
||||||
|
* @return 日志类型
|
||||||
|
*/
|
||||||
|
OperationTypeEnum operationType() default OperationTypeEnum.QUERY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块
|
||||||
|
*
|
||||||
|
* @return 模块
|
||||||
|
*/
|
||||||
|
ModuleTypeEnum module();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*
|
||||||
|
* @return 描述
|
||||||
|
*/
|
||||||
|
String description() default "";
|
||||||
|
}
|
|
@ -82,6 +82,11 @@ public class CommonConstant {
|
||||||
*/
|
*/
|
||||||
public static final int MAX_PAGE_SIZE = 100;
|
public static final int MAX_PAGE_SIZE = 100;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未知异常
|
||||||
|
*/
|
||||||
|
public static final String UNKNOWN_ERROR = "未知异常";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册成功默认给用户发送的消息
|
* 注册成功默认给用户发送的消息
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.blog4j.common.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:38
|
||||||
|
**/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum LogResultEnum {
|
||||||
|
/**
|
||||||
|
* 成功
|
||||||
|
*/
|
||||||
|
SUCCESS("success"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败
|
||||||
|
*/
|
||||||
|
FAIL("fail"),
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String result;
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.blog4j.common.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 13:09
|
||||||
|
**/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum ModuleTypeEnum {
|
||||||
|
/**
|
||||||
|
* 文章模块
|
||||||
|
*/
|
||||||
|
ARTICLE("article"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户认证模块
|
||||||
|
*/
|
||||||
|
AUTH("auth"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阿里云OSS模块
|
||||||
|
*/
|
||||||
|
OSS("oss"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮件模块
|
||||||
|
*/
|
||||||
|
EMAIL("email"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信模块
|
||||||
|
*/
|
||||||
|
SMS("sms"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统模块
|
||||||
|
*/
|
||||||
|
SYSTEM("system"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户模块
|
||||||
|
*/
|
||||||
|
USER("user"),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String type;
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package com.blog4j.common.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 13:06
|
||||||
|
**/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum OperationTypeEnum {
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
QUERY("query"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
INSERT("insert"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
EDIT("edit"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*/
|
||||||
|
DELETE("delete"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传
|
||||||
|
*/
|
||||||
|
UPLOAD("upload"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载
|
||||||
|
*/
|
||||||
|
DOWNLOAD("download"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录
|
||||||
|
*/
|
||||||
|
LOGIN("login"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册
|
||||||
|
*/
|
||||||
|
REGISTER("register"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出
|
||||||
|
*/
|
||||||
|
EXPORT("export"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入
|
||||||
|
*/
|
||||||
|
IMPORT("import"),
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String type;
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
package com.blog4j.common.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 20:31
|
||||||
|
**/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@Builder
|
||||||
|
public class LogVo implements Serializable {
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID
|
||||||
|
*/
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名称
|
||||||
|
*/
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求URI
|
||||||
|
*/
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 耗时
|
||||||
|
*/
|
||||||
|
private long time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求参数
|
||||||
|
*/
|
||||||
|
private String param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录IP
|
||||||
|
*/
|
||||||
|
private String ipAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求结果
|
||||||
|
*/
|
||||||
|
private String result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
private String errMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求类型
|
||||||
|
*/
|
||||||
|
private String operationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块类型
|
||||||
|
*/
|
||||||
|
private String moduleType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private String createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 方法名
|
||||||
|
*/
|
||||||
|
private String methodName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类名
|
||||||
|
*/
|
||||||
|
private String className;
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.blog4j.common.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/19 12:44
|
||||||
|
**/
|
||||||
|
public class OperationLogHolder {
|
||||||
|
private static final ThreadLocal<LogVo> logVoHolder = new ThreadLocal<>();
|
||||||
|
|
||||||
|
public static void setLogVo(LogVo logVo) {
|
||||||
|
logVoHolder.set(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static LogVo getLogVo() {
|
||||||
|
return logVoHolder.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void removeLogVo() {
|
||||||
|
logVoHolder.remove();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.blog4j.common.utils;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 17:21
|
||||||
|
**/
|
||||||
|
public class RealIpUtil {
|
||||||
|
public static String getRealIp(HttpServletRequest request) {
|
||||||
|
String ip = request.getHeader("x-forwarded-for");
|
||||||
|
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
|
||||||
|
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
|
||||||
|
if (ip.contains(",")) {
|
||||||
|
ip = ip.split(",")[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ****以下写法都会判断ip为空才会执行,即执行到ip不为空,后续会跳过,这样写是为了避免超大圈复杂度
|
||||||
|
ip = proxyClientIp(request, ip);
|
||||||
|
ip = wlProxyClientIp(request, ip);
|
||||||
|
ip = httpClientIp(request, ip);
|
||||||
|
ip = httpXForwardedForIp(request, ip);
|
||||||
|
ip = xRealIp(request,ip);
|
||||||
|
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getRemoteAddr();
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String proxyClientIp(HttpServletRequest request, String ip) {
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String wlProxyClientIp(HttpServletRequest request, String ip) {
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("WL-Proxy-Client-IP");
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String httpClientIp(HttpServletRequest request, String ip) {
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("HTTP_CLIENT_IP");
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String httpXForwardedForIp(HttpServletRequest request, String ip) {
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String xRealIp(HttpServletRequest request, String ip) {
|
||||||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
||||||
|
ip = request.getHeader("X-Real-IP");
|
||||||
|
}
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,11 +41,18 @@
|
||||||
<artifactId>aliyun-sdk-oss</artifactId>
|
<artifactId>aliyun-sdk-oss</artifactId>
|
||||||
<version>3.10.2</version>
|
<version>3.10.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--添加邮件依赖-->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-mail</artifactId>
|
<artifactId>spring-boot-starter-mail</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.pagehelper</groupId>
|
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.blog4j.server.common.aop;
|
||||||
|
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.server.modules.log.service.LogService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/20 19:58
|
||||||
|
**/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
public class AsyncService {
|
||||||
|
private final LogService logService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步添加日志信息
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
logService.addLog(logVo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,130 @@
|
||||||
|
package com.blog4j.server.common.aop;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.blog4j.api.client.FeignUser;
|
||||||
|
import com.blog4j.api.vo.UserInfoVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.LogResultEnum;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.exception.Blog4jException;
|
||||||
|
import com.blog4j.common.exception.InvalidRequestException;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
|
import com.blog4j.common.utils.OperationLogHolder;
|
||||||
|
import com.blog4j.common.utils.RealIpUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:30
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
public class LogAspect {
|
||||||
|
private final FeignUser feignUser;
|
||||||
|
private final AsyncService asyncService;
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.blog4j.common.annotation.OperationLog)")
|
||||||
|
public void log() {}
|
||||||
|
|
||||||
|
@AfterThrowing(pointcut = "log()", throwing = "e")
|
||||||
|
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
||||||
|
String errMsg = e.getMessage();
|
||||||
|
if (e instanceof Blog4jException) {
|
||||||
|
Blog4jException blog4jException = (Blog4jException) e;
|
||||||
|
errMsg = blog4jException.getErrMsg();
|
||||||
|
} else if (e instanceof InvalidRequestException) {
|
||||||
|
InvalidRequestException invalidRequestException = (InvalidRequestException) e;
|
||||||
|
errMsg = invalidRequestException.getErrMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.error("接口异常: [{}]", errMsg);
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
logVo.setResult(LogResultEnum.FAIL.getResult()).setErrMsg(errMsg);
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("log()")
|
||||||
|
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
LogVo logVo = getAnnotationInfo(method);
|
||||||
|
logVo.setParam(JSONUtil.toJsonStr(joinPoint.getArgs()))
|
||||||
|
.setResult(LogResultEnum.SUCCESS.getResult());
|
||||||
|
// 方法名
|
||||||
|
String methodName = joinPoint.getSignature().getName();
|
||||||
|
logVo.setMethodName(methodName);
|
||||||
|
|
||||||
|
// 得到request
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes)
|
||||||
|
Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||||
|
logVo.setIpAddress(RealIpUtil.getRealIp(request)).setUrl(request.getRequestURL().toString());
|
||||||
|
UserInfoVo userInfo = getUserInfo();
|
||||||
|
if (Objects.nonNull(userInfo)) {
|
||||||
|
logVo.setUserId(userInfo.getUserId()).setUserName(userInfo.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
String className = joinPoint.getTarget().getClass().getName();
|
||||||
|
logVo.setClassName(className)
|
||||||
|
.setTime(System.currentTimeMillis() - startTime)
|
||||||
|
.setCreateTime(CommonUtil.getCurrentDateTime());
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
return joinPoint.proceed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter(JoinPoint joinPoint) {
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
OperationLogHolder.removeLogVo();
|
||||||
|
asyncService.addLog(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogVo getAnnotationInfo(Method method ) {
|
||||||
|
LogVo log = new LogVo();
|
||||||
|
OperationLog annotation = method.getAnnotation(OperationLog.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
OperationTypeEnum operationTypeEnum = annotation.operationType();
|
||||||
|
ModuleTypeEnum module = annotation.module();
|
||||||
|
String description = annotation.description();
|
||||||
|
log.setModuleType(module.getType())
|
||||||
|
.setOperationType(operationTypeEnum.getType())
|
||||||
|
.setDescription(description);
|
||||||
|
}
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserInfoVo getUserInfo() {
|
||||||
|
String userId = "";
|
||||||
|
try {
|
||||||
|
userId = StpUtil.getLoginIdAsString();
|
||||||
|
return feignUser.getUserInfoByUserId(userId);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.warn("user not login");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.server.modules.email.controller;
|
package com.blog4j.server.modules.email.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.server.modules.email.service.EmailService;
|
import com.blog4j.server.modules.email.service.EmailService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -28,6 +31,9 @@ public class EmailController {
|
||||||
* @param email 邮件
|
* @param email 邮件
|
||||||
* @return 发送成功
|
* @return 发送成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.EMAIL,
|
||||||
|
description = "发送邮件验证码")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/sendEmail")
|
@GetMapping("/sendEmail")
|
||||||
public Result sendEmail(@RequestParam("email") String email) {
|
public Result sendEmail(@RequestParam("email") String email) {
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
package com.blog4j.server.modules.email.controller.inner;
|
package com.blog4j.server.modules.inner;
|
||||||
|
|
||||||
import com.blog4j.api.client.FeignServer;
|
import com.blog4j.api.client.FeignServer;
|
||||||
import com.blog4j.api.vo.NoticeEmailVo;
|
import com.blog4j.api.vo.NoticeEmailVo;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.LogVo;
|
||||||
import com.blog4j.server.modules.email.service.EmailService;
|
import com.blog4j.server.modules.email.service.EmailService;
|
||||||
|
import com.blog4j.server.modules.log.service.LogService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
@ -16,13 +15,14 @@ import org.springframework.web.bind.annotation.RestController;
|
||||||
* @author 98k灬
|
* @author 98k灬
|
||||||
* @version v1.0.0
|
* @version v1.0.0
|
||||||
* @Description : 功能描述
|
* @Description : 功能描述
|
||||||
* @Create on : 2024/8/14 13:19
|
* @Create on : 2024/8/19 19:52
|
||||||
**/
|
**/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/feign")
|
@RequestMapping("/feign")
|
||||||
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
public class EmailFeignController implements FeignServer {
|
public class ServerFeignController implements FeignServer {
|
||||||
private final EmailService emailService;
|
private final EmailService emailService;
|
||||||
|
private final LogService logService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送邮件给文章审批人
|
* 发送邮件给文章审批人
|
||||||
|
@ -87,4 +87,14 @@ public class EmailFeignController implements FeignServer {
|
||||||
public void sendEmailToUserForApproveOrganization(String toEmail, String organizationName) {
|
public void sendEmailToUserForApproveOrganization(String toEmail, String organizationName) {
|
||||||
emailService.sendEmailToUserForApproveOrganization(toEmail, organizationName);
|
emailService.sendEmailToUserForApproveOrganization(toEmail, organizationName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加日志
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
logService.addLog(logVo);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.blog4j.server.modules.log.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.blog4j.common.model.Result;
|
||||||
|
import com.blog4j.server.modules.log.service.LogService;
|
||||||
|
import com.blog4j.server.modules.log.vo.req.LogListReqVo;
|
||||||
|
import com.blog4j.server.modules.log.vo.resp.LogRespVo;
|
||||||
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/20 12:12
|
||||||
|
**/
|
||||||
|
@RequestMapping("/log")
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
public class LogController {
|
||||||
|
private final LogService logService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志信息分页查询
|
||||||
|
*
|
||||||
|
* @param reqVo 请求
|
||||||
|
* @return 日志信息
|
||||||
|
*/
|
||||||
|
@SaCheckLogin
|
||||||
|
@PostMapping("/logList")
|
||||||
|
public Result logList(@RequestBody @Valid LogListReqVo reqVo) {
|
||||||
|
PageInfo<LogRespVo> pageInfo = logService.logList(reqVo);
|
||||||
|
return Result.ok(pageInfo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
package com.blog4j.server.modules.log.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/7/29 21:44
|
||||||
|
**/
|
||||||
|
@Data
|
||||||
|
@TableName("t_log")
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class LogEntity {
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.ID_WORKER)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID
|
||||||
|
*/
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名称
|
||||||
|
*/
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求URI
|
||||||
|
*/
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 耗时
|
||||||
|
*/
|
||||||
|
private long time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求参数
|
||||||
|
*/
|
||||||
|
private String param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录IP
|
||||||
|
*/
|
||||||
|
private String ipAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求结果
|
||||||
|
*/
|
||||||
|
private String result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
private String errMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求类型
|
||||||
|
*/
|
||||||
|
private String operationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块类型
|
||||||
|
*/
|
||||||
|
private String moduleType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private String createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 方法名
|
||||||
|
*/
|
||||||
|
private String methodName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类名
|
||||||
|
*/
|
||||||
|
private String className;
|
||||||
|
}
|
|
@ -1,52 +0,0 @@
|
||||||
package com.blog4j.server.modules.log.entity;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 98k灬
|
|
||||||
* @version v1.0.0
|
|
||||||
* @Description : 功能描述
|
|
||||||
* @Create on : 2024/7/29 21:44
|
|
||||||
**/
|
|
||||||
@Data
|
|
||||||
@TableName("t_login_log")
|
|
||||||
public class LoginLogEntity {
|
|
||||||
/**
|
|
||||||
* 主键
|
|
||||||
*/
|
|
||||||
@TableId(value = "id", type = IdType.AUTO)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户ID
|
|
||||||
*/
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录时间
|
|
||||||
*/
|
|
||||||
private String loginTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求参数
|
|
||||||
*/
|
|
||||||
private String param;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录IP
|
|
||||||
*/
|
|
||||||
private String ipAddress;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录结果
|
|
||||||
*/
|
|
||||||
private Integer result;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录类型
|
|
||||||
*/
|
|
||||||
private Integer loginType;
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
package com.blog4j.server.modules.log.mapper;
|
package com.blog4j.server.modules.log.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.blog4j.server.modules.log.entity.LoginLogEntity;
|
import com.blog4j.server.modules.log.entity.LogEntity;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,5 +11,5 @@ import org.apache.ibatis.annotations.Mapper;
|
||||||
* @Create on : 2024/7/29 21:47
|
* @Create on : 2024/7/29 21:47
|
||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface LoginLogMapper extends BaseMapper<LoginLogEntity> {
|
public interface LogMapper extends BaseMapper<LogEntity> {
|
||||||
}
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.blog4j.server.modules.log.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.server.modules.log.entity.LogEntity;
|
||||||
|
import com.blog4j.server.modules.log.vo.req.LogListReqVo;
|
||||||
|
import com.blog4j.server.modules.log.vo.resp.LogRespVo;
|
||||||
|
import com.github.pagehelper.PageInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/19 19:54
|
||||||
|
**/
|
||||||
|
public interface LogService extends IService<LogEntity> {
|
||||||
|
/**
|
||||||
|
* 添加日志
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
void addLog(LogVo logVo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志信息分页查询
|
||||||
|
*
|
||||||
|
* @param reqVo 请求
|
||||||
|
* @return 日志信息
|
||||||
|
*/
|
||||||
|
PageInfo<LogRespVo> logList(LogListReqVo reqVo);
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
package com.blog4j.server.modules.log.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.blog4j.common.constants.CommonConstant;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.server.modules.log.entity.LogEntity;
|
||||||
|
import com.blog4j.server.modules.log.mapper.LogMapper;
|
||||||
|
import com.blog4j.server.modules.log.service.LogService;
|
||||||
|
import com.blog4j.server.modules.log.vo.req.LogListReqVo;
|
||||||
|
import com.blog4j.server.modules.log.vo.resp.LogRespVo;
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/19 19:54
|
||||||
|
**/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
public class LogServiceImpl extends ServiceImpl<LogMapper, LogEntity>
|
||||||
|
implements LogService {
|
||||||
|
@Value("${custom.logEnabled}")
|
||||||
|
private boolean logEnabled;
|
||||||
|
|
||||||
|
@Value("${custom.queryLogEnabled}")
|
||||||
|
private boolean queryLogEnabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加日志
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
if (!logEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.equals(logVo.getOperationType(), OperationTypeEnum.QUERY.getType())
|
||||||
|
&& !queryLogEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LogEntity logEntity = new LogEntity();
|
||||||
|
logEntity.setId(null);
|
||||||
|
BeanUtils.copyProperties(logVo, logEntity);
|
||||||
|
this.baseMapper.insert(logEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志信息分页查询
|
||||||
|
*
|
||||||
|
* @param reqVo 请求
|
||||||
|
* @return 日志信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PageInfo<LogRespVo> logList(LogListReqVo reqVo) {
|
||||||
|
Integer pageNo = reqVo.getPageNo();
|
||||||
|
Integer pageSize = reqVo.getPageSize();
|
||||||
|
if (pageSize > CommonConstant.MAX_PAGE_SIZE) {
|
||||||
|
pageSize = CommonConstant.MAX_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
String operationType = reqVo.getOperationType();
|
||||||
|
String module = reqVo.getModule();
|
||||||
|
String result = reqVo.getResult();
|
||||||
|
|
||||||
|
LambdaQueryWrapper<LogEntity> wrapper = new LambdaQueryWrapper<LogEntity>()
|
||||||
|
.orderByDesc(LogEntity::getCreateTime);
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(operationType)) {
|
||||||
|
wrapper.eq(LogEntity::getOperationType, operationType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(module)) {
|
||||||
|
wrapper.eq(LogEntity::getModuleType, module);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(result)) {
|
||||||
|
wrapper.eq(LogEntity::getResult, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
Page<Object> page = PageHelper.startPage(pageNo, pageSize);
|
||||||
|
List<LogEntity> list = this.baseMapper.selectList(wrapper);
|
||||||
|
if (CollectionUtils.isEmpty(list)) {
|
||||||
|
return new PageInfo<>(new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LogRespVo> collect = list.stream().map(item -> {
|
||||||
|
LogRespVo respVo = new LogRespVo();
|
||||||
|
BeanUtils.copyProperties(item, respVo);
|
||||||
|
return respVo;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
for (LogRespVo respVo : collect) {
|
||||||
|
respVo.setOperationType(handleOperationType(respVo.getOperationType()));
|
||||||
|
respVo.setModuleType(handleModuleType(respVo.getModuleType()));
|
||||||
|
}
|
||||||
|
|
||||||
|
PageInfo<LogRespVo> pageInfo = new PageInfo<>(collect);
|
||||||
|
pageInfo.setTotal(page.getTotal());
|
||||||
|
return pageInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String handleModuleType(String moduleType) {
|
||||||
|
String res ;
|
||||||
|
switch (moduleType) {
|
||||||
|
case "article":
|
||||||
|
res = "文章";
|
||||||
|
break;
|
||||||
|
case "auth":
|
||||||
|
res = "用户认证";
|
||||||
|
break;
|
||||||
|
case "oss":
|
||||||
|
res = "阿里云OSS";
|
||||||
|
break;
|
||||||
|
case "email":
|
||||||
|
res = "邮件";
|
||||||
|
break;
|
||||||
|
case "sms":
|
||||||
|
res = "短信";
|
||||||
|
break;
|
||||||
|
case "system":
|
||||||
|
res = "系统";
|
||||||
|
break;
|
||||||
|
case "user":
|
||||||
|
res = "用户";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
res = "";
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String handleOperationType(String operationType) {
|
||||||
|
String res;
|
||||||
|
switch (operationType) {
|
||||||
|
case "query":
|
||||||
|
res = "查询";
|
||||||
|
break;
|
||||||
|
case "insert":
|
||||||
|
res = "新增";
|
||||||
|
break;
|
||||||
|
case "edit":
|
||||||
|
res = "编辑";
|
||||||
|
break;
|
||||||
|
case "delete":
|
||||||
|
res = "删除";
|
||||||
|
break;
|
||||||
|
case "upload":
|
||||||
|
res = "上传";
|
||||||
|
break;
|
||||||
|
case "download":
|
||||||
|
res = "下载";
|
||||||
|
break;
|
||||||
|
case "login":
|
||||||
|
res = "登录";
|
||||||
|
break;
|
||||||
|
case "register":
|
||||||
|
res = "注册";
|
||||||
|
break;
|
||||||
|
case "export":
|
||||||
|
res = "导出";
|
||||||
|
break;
|
||||||
|
case "import":
|
||||||
|
res = "导入";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
res = "";
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.blog4j.server.modules.log.vo.req;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/20 12:14
|
||||||
|
**/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class LogListReqVo {
|
||||||
|
/**
|
||||||
|
* 当前页
|
||||||
|
*/
|
||||||
|
@NotNull(message = "当前页不能为空")
|
||||||
|
private Integer pageNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每页大小
|
||||||
|
*/
|
||||||
|
@NotNull(message = "每页大小不能为空")
|
||||||
|
private Integer pageSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作类型
|
||||||
|
*/
|
||||||
|
private String operationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模块
|
||||||
|
*/
|
||||||
|
private String module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 响应结果
|
||||||
|
*/
|
||||||
|
private String result;
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package com.blog4j.server.modules.log.vo.resp;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/19 21:16
|
||||||
|
**/
|
||||||
|
@Data
|
||||||
|
public class LogRespVo {
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID
|
||||||
|
*/
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名称
|
||||||
|
*/
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求URI
|
||||||
|
*/
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 耗时(毫秒)
|
||||||
|
*/
|
||||||
|
private long time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求参数
|
||||||
|
*/
|
||||||
|
private String param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录IP
|
||||||
|
*/
|
||||||
|
private String ipAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求结果
|
||||||
|
*/
|
||||||
|
private String result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
private String errMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求类型
|
||||||
|
*/
|
||||||
|
private String operationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块类型
|
||||||
|
*/
|
||||||
|
private String moduleType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private String createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 方法名
|
||||||
|
*/
|
||||||
|
private String methodName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类名
|
||||||
|
*/
|
||||||
|
private String className;
|
||||||
|
}
|
|
@ -3,6 +3,9 @@ package com.blog4j.server.modules.oss.controller;
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
import cn.dev33.satoken.annotation.SaCheckRole;
|
||||||
import cn.dev33.satoken.annotation.SaMode;
|
import cn.dev33.satoken.annotation.SaMode;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.server.modules.oss.service.OssService;
|
import com.blog4j.server.modules.oss.service.OssService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -33,6 +36,9 @@ public class OssController {
|
||||||
* @param type 类型
|
* @param type 类型
|
||||||
* @return 上传后的访问路径
|
* @return 上传后的访问路径
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.UPLOAD,
|
||||||
|
module= ModuleTypeEnum.OSS,
|
||||||
|
description = "上传")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN", "ORDINARY"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN", "ORDINARY"}, mode = SaMode.OR)
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
public Result upload(MultipartFile file, String type) {
|
public Result upload(MultipartFile file, String type) {
|
||||||
|
@ -46,6 +52,9 @@ public class OssController {
|
||||||
* @param filePath 文件路径
|
* @param filePath 文件路径
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.OSS,
|
||||||
|
description = "删除文件")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN", "COMPOSER"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN", "COMPOSER"}, mode = SaMode.OR)
|
||||||
@GetMapping("/delete")
|
@GetMapping("/delete")
|
||||||
public Result delete(@RequestParam String filePath) {
|
public Result delete(@RequestParam String filePath) {
|
||||||
|
@ -58,6 +67,9 @@ public class OssController {
|
||||||
*
|
*
|
||||||
* @return 文件存储路径
|
* @return 文件存储路径
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DOWNLOAD,
|
||||||
|
module= ModuleTypeEnum.OSS,
|
||||||
|
description = "下载用户导入模板文件")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/downloadUserImportTemplate")
|
@GetMapping("/downloadUserImportTemplate")
|
||||||
public Result downloadUserImportTemplate() {
|
public Result downloadUserImportTemplate() {
|
||||||
|
@ -70,6 +82,9 @@ public class OssController {
|
||||||
*
|
*
|
||||||
* @return 文件存储路径
|
* @return 文件存储路径
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DOWNLOAD,
|
||||||
|
module= ModuleTypeEnum.OSS,
|
||||||
|
description = "下载组织导入模板文件")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/downloadOrganizationImportTemplate")
|
@GetMapping("/downloadOrganizationImportTemplate")
|
||||||
public Result downloadOrganizationImportTemplate() {
|
public Result downloadOrganizationImportTemplate() {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.server.modules.sms.controller;
|
package com.blog4j.server.modules.sms.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.server.modules.sms.service.SmsService;
|
import com.blog4j.server.modules.sms.service.SmsService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -28,6 +31,9 @@ public class ApiSmsController {
|
||||||
* @param phone 手机号码
|
* @param phone 手机号码
|
||||||
* @return 短信验证码
|
* @return 短信验证码
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.OSS,
|
||||||
|
description = "获取短信验证码")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/getPhoneCode/{type}/{phone}")
|
@GetMapping("/getPhoneCode/{type}/{phone}")
|
||||||
public Result getPhoneCode(@PathVariable("phone") String phone, @PathVariable("type") String type) {
|
public Result getPhoneCode(@PathVariable("phone") String phone, @PathVariable("type") String type) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
spring:
|
spring:
|
||||||
|
liquibase:
|
||||||
|
change-log: classpath:/liquibase/master.xml
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-server?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
url: jdbc:mysql://localhost:3306/blog4j-server?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
username: root
|
username: root
|
||||||
password: 4897458Hk!@
|
password: 4897458hk
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
|
@ -27,4 +29,8 @@ spring:
|
||||||
# 连接池中的最大空闲连接
|
# 连接池中的最大空闲连接
|
||||||
max-idle: 10
|
max-idle: 10
|
||||||
# 连接池中的最小空闲连接
|
# 连接池中的最小空闲连接
|
||||||
min-idle: 0
|
min-idle: 0
|
||||||
|
|
||||||
|
custom:
|
||||||
|
logEnabled: true # 是否开启日志记录功能
|
||||||
|
queryLogEnabled: true # 是否开启查询日志记录功能
|
|
@ -2,6 +2,8 @@ server:
|
||||||
port: 9500
|
port: 9500
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
|
main:
|
||||||
|
allow-circular-references: true
|
||||||
servlet:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
max-file-size: 10MB
|
max-file-size: 10MB
|
||||||
|
@ -30,4 +32,10 @@ sa-token:
|
||||||
|
|
||||||
email:
|
email:
|
||||||
from: 2915524550@qq.com
|
from: 2915524550@qq.com
|
||||||
subject: 西瓜博客
|
subject: 西瓜博客
|
||||||
|
|
||||||
|
jasypt:
|
||||||
|
encryptor:
|
||||||
|
password: blog4j_test
|
||||||
|
algorithm: PBEWithMD5AndDES
|
||||||
|
iv-generator-classname: org.jasypt.iv.NoIvGenerator
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<!--用于参考 id:当前时间戳 author:sql文件提交人 runOnChange:文件内容更改sql会重新执行-->
|
||||||
|
<changeSet id="t_server_init_ddl_20240823124256" author="98k" runOnChange="false">
|
||||||
|
<sqlFile path="/liquibase/upgrade/20240823/t_user_init_ddl_20240823125256.sql"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<include file="liquibase/changelog/database_change.xml" relativeToChangelogFile="false"/>
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
Navicat MySQL Data Transfer
|
||||||
|
|
||||||
|
Source Server : blog4j-user-dev
|
||||||
|
Source Server Type : MySQL
|
||||||
|
Source Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
Source Host : sh-cdb-b593hl8o.sql.tencentcdb.com:63556
|
||||||
|
Source Schema : blog4j-server
|
||||||
|
|
||||||
|
Target Server Type : MySQL
|
||||||
|
Target Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 23/08/2024 12:43:44
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_log
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_log`;
|
||||||
|
CREATE TABLE `t_log` (
|
||||||
|
`id` bigint(20) NOT NULL COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户ID',
|
||||||
|
`user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称',
|
||||||
|
`url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求URI',
|
||||||
|
`time` bigint(20) NOT NULL COMMENT '耗时',
|
||||||
|
`param` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数',
|
||||||
|
`method_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '方法名称',
|
||||||
|
`class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类名',
|
||||||
|
`ip_address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
|
||||||
|
`result` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '结果',
|
||||||
|
`err_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息',
|
||||||
|
`operation_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作类型',
|
||||||
|
`module_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模块类型',
|
||||||
|
`description` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
|
||||||
|
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日志信息表' ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_record
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_record`;
|
||||||
|
CREATE TABLE `t_record` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`type` int(11) NOT NULL COMMENT '类型(1:下载 2:上传)',
|
||||||
|
`times` int(11) NOT NULL COMMENT '次数',
|
||||||
|
`date` date NOT NULL COMMENT '日期',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_userid_type_date`(`user_id`, `type`, `date`) USING BTREE,
|
||||||
|
INDEX `idx_nor_userId`(`user_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_type`(`type`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户上传下载次数记录' ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<mapper namespace="com.blog4j.server.modules.log.mapper.LogMapper">
|
||||||
|
<resultMap type="com.blog4j.server.modules.log.entity.LogEntity" id="BaseResultMap">
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
|
||||||
|
</mapper>
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
|
|
||||||
<mapper namespace="com.blog4j.server.modules.log.mapper.LoginLogMapper">
|
|
||||||
<resultMap type="com.blog4j.server.modules.log.entity.LoginLogEntity" id="BaseResultMap">
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
|
|
@ -41,6 +41,10 @@
|
||||||
<groupId>com.github.pagehelper</groupId>
|
<groupId>com.github.pagehelper</groupId>
|
||||||
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.cache.annotation.EnableCaching;
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 98k灬
|
* @author 98k灬
|
||||||
|
@ -16,6 +17,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||||
@EnableDiscoveryClient
|
@EnableDiscoveryClient
|
||||||
@EnableFeignClients(basePackages = "com.blog4j")
|
@EnableFeignClients(basePackages = "com.blog4j")
|
||||||
@EnableCaching
|
@EnableCaching
|
||||||
|
@EnableAsync
|
||||||
public class SystemApplication {
|
public class SystemApplication {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(SystemApplication.class, args);
|
SpringApplication.run(SystemApplication.class, args);
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.blog4j.system.aop;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.blog4j.api.client.FeignUser;
|
||||||
|
import com.blog4j.api.vo.UserInfoVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.LogResultEnum;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.exception.Blog4jException;
|
||||||
|
import com.blog4j.common.exception.InvalidRequestException;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
|
import com.blog4j.common.utils.OperationLogHolder;
|
||||||
|
import com.blog4j.common.utils.RealIpUtil;
|
||||||
|
import com.blog4j.system.component.AsyncService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:30
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
public class LogAspect {
|
||||||
|
private final FeignUser feignUser;
|
||||||
|
private final AsyncService asyncService;
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.blog4j.common.annotation.OperationLog)")
|
||||||
|
public void log() {}
|
||||||
|
|
||||||
|
@AfterThrowing(pointcut = "log()", throwing = "e")
|
||||||
|
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
||||||
|
String errMsg = e.getMessage();
|
||||||
|
if (e instanceof Blog4jException) {
|
||||||
|
Blog4jException blog4jException = (Blog4jException) e;
|
||||||
|
errMsg = blog4jException.getErrMsg();
|
||||||
|
} else if (e instanceof InvalidRequestException) {
|
||||||
|
InvalidRequestException invalidRequestException = (InvalidRequestException) e;
|
||||||
|
errMsg = invalidRequestException.getErrMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.error("接口异常: [{}]", errMsg);
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
logVo.setResult(LogResultEnum.FAIL.getResult()).setErrMsg(errMsg);
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("log()")
|
||||||
|
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
LogVo logVo = getAnnotationInfo(method);
|
||||||
|
logVo.setParam(JSONUtil.toJsonStr(joinPoint.getArgs()))
|
||||||
|
.setResult(LogResultEnum.SUCCESS.getResult());
|
||||||
|
// 方法名
|
||||||
|
String methodName = joinPoint.getSignature().getName();
|
||||||
|
logVo.setMethodName(methodName);
|
||||||
|
|
||||||
|
// 得到request
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes)
|
||||||
|
Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||||
|
logVo.setIpAddress(RealIpUtil.getRealIp(request)).setUrl(request.getRequestURL().toString());
|
||||||
|
UserInfoVo userInfo = getUserInfo();
|
||||||
|
if (Objects.nonNull(userInfo)) {
|
||||||
|
logVo.setUserId(userInfo.getUserId()).setUserName(userInfo.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
String className = joinPoint.getTarget().getClass().getName();
|
||||||
|
logVo.setClassName(className)
|
||||||
|
.setTime(System.currentTimeMillis() - startTime)
|
||||||
|
.setCreateTime(CommonUtil.getCurrentDateTime());
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
return joinPoint.proceed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter(JoinPoint joinPoint) {
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
OperationLogHolder.removeLogVo();
|
||||||
|
asyncService.addLog(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogVo getAnnotationInfo(Method method ) {
|
||||||
|
LogVo log = new LogVo();
|
||||||
|
OperationLog annotation = method.getAnnotation(OperationLog.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
OperationTypeEnum operationTypeEnum = annotation.operationType();
|
||||||
|
ModuleTypeEnum module = annotation.module();
|
||||||
|
String description = annotation.description();
|
||||||
|
log.setModuleType(module.getType())
|
||||||
|
.setOperationType(operationTypeEnum.getType())
|
||||||
|
.setDescription(description);
|
||||||
|
}
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserInfoVo getUserInfo() {
|
||||||
|
String userId = "";
|
||||||
|
try {
|
||||||
|
userId = StpUtil.getLoginIdAsString();
|
||||||
|
return feignUser.getUserInfoByUserId(userId);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.warn("user not login");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,8 @@
|
||||||
package com.blog4j.system.api;
|
package com.blog4j.system.api;
|
||||||
|
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.system.entity.BarrageEntity;
|
import com.blog4j.system.entity.BarrageEntity;
|
||||||
import com.blog4j.system.service.BarrageService;
|
import com.blog4j.system.service.BarrageService;
|
||||||
|
@ -28,6 +31,9 @@ public class ApiBarrageController {
|
||||||
*
|
*
|
||||||
* @return 网站弹幕留言列表
|
* @return 网站弹幕留言列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取网站弹幕留言列表")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public Result list() {
|
public Result list() {
|
||||||
return Result.ok(barrageService.list());
|
return Result.ok(barrageService.list());
|
||||||
|
@ -39,6 +45,9 @@ public class ApiBarrageController {
|
||||||
* @param barrage 留言信息
|
* @param barrage 留言信息
|
||||||
* @return 成功
|
* @return 成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "弹幕留言")
|
||||||
@PostMapping("/addBarrage")
|
@PostMapping("/addBarrage")
|
||||||
public Result addBarrage(@RequestBody BarrageEntity barrage) {
|
public Result addBarrage(@RequestBody BarrageEntity barrage) {
|
||||||
BarrageEntity barrage1 = barrageService.addBarrage(barrage);
|
BarrageEntity barrage1 = barrageService.addBarrage(barrage);
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.system.api;
|
package com.blog4j.system.api;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.system.service.ChartService;
|
import com.blog4j.system.service.ChartService;
|
||||||
import com.blog4j.system.vo.resp.ChartInfoRespVo;
|
import com.blog4j.system.vo.resp.ChartInfoRespVo;
|
||||||
|
@ -28,6 +31,9 @@ public class ApiChartController {
|
||||||
*
|
*
|
||||||
* @return 首页大屏的信息
|
* @return 首页大屏的信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "统计首页大屏的信息")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/chartInfo")
|
@GetMapping("/chartInfo")
|
||||||
public Result chartInfo() {
|
public Result chartInfo() {
|
||||||
|
@ -40,6 +46,9 @@ public class ApiChartController {
|
||||||
*
|
*
|
||||||
* @return 一年内文章贡献度
|
* @return 一年内文章贡献度
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取一年内文章贡献度")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/getContributeData")
|
@GetMapping("/getContributeData")
|
||||||
public Result getContributeData() {
|
public Result getContributeData() {
|
||||||
|
|
|
@ -3,7 +3,10 @@ package com.blog4j.system.api;
|
||||||
import com.blog4j.api.vo.OssBaseConfigVo;
|
import com.blog4j.api.vo.OssBaseConfigVo;
|
||||||
import com.blog4j.api.vo.WebInfoVo;
|
import com.blog4j.api.vo.WebInfoVo;
|
||||||
import com.blog4j.api.vo.SystemBaseConfigVo;
|
import com.blog4j.api.vo.SystemBaseConfigVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
import com.blog4j.common.enums.NoticeTypeEnum;
|
import com.blog4j.common.enums.NoticeTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.system.entity.OssExtendConfigEntity;
|
import com.blog4j.system.entity.OssExtendConfigEntity;
|
||||||
import com.blog4j.system.entity.WebInfoEntity;
|
import com.blog4j.system.entity.WebInfoEntity;
|
||||||
|
@ -46,6 +49,9 @@ public class ApiSystemController {
|
||||||
*
|
*
|
||||||
* @return 系统基础配置信息
|
* @return 系统基础配置信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取系统基础配置信息")
|
||||||
@GetMapping("/getBaseSystemConfig")
|
@GetMapping("/getBaseSystemConfig")
|
||||||
public Result getBaseSystemConfig() {
|
public Result getBaseSystemConfig() {
|
||||||
SystemBaseConfigVo configVo = systemService.getBaseSystemConfig();
|
SystemBaseConfigVo configVo = systemService.getBaseSystemConfig();
|
||||||
|
@ -57,6 +63,9 @@ public class ApiSystemController {
|
||||||
*
|
*
|
||||||
* @return 网站配置信息
|
* @return 网站配置信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取网站配置信息")
|
||||||
@GetMapping("/getWebInfo")
|
@GetMapping("/getWebInfo")
|
||||||
public Result getWebInfo() {
|
public Result getWebInfo() {
|
||||||
WebInfoEntity webInfo = webInfoService.getOne(null);
|
WebInfoEntity webInfo = webInfoService.getOne(null);
|
||||||
|
@ -70,6 +79,9 @@ public class ApiSystemController {
|
||||||
*
|
*
|
||||||
* @return OSS基础配置信息
|
* @return OSS基础配置信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取OSS基础配置信息")
|
||||||
@GetMapping("/getOssBaseConfig")
|
@GetMapping("/getOssBaseConfig")
|
||||||
public Result getOssBaseConfig() {
|
public Result getOssBaseConfig() {
|
||||||
OssBaseConfigVo ossBaseConfigVo = ossBaseConfigService.getOssBaseConfig();
|
OssBaseConfigVo ossBaseConfigVo = ossBaseConfigService.getOssBaseConfig();
|
||||||
|
@ -81,6 +93,9 @@ public class ApiSystemController {
|
||||||
*
|
*
|
||||||
* @return OSS基础配置信息
|
* @return OSS基础配置信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取OSS扩展配置信息")
|
||||||
@GetMapping("/getOssExtendConfig")
|
@GetMapping("/getOssExtendConfig")
|
||||||
public Result getOssExtendConfig() {
|
public Result getOssExtendConfig() {
|
||||||
OssExtendConfigEntity ossBaseConfigVo = ossBaseConfigService.getOssExtendConfig();
|
OssExtendConfigEntity ossBaseConfigVo = ossBaseConfigService.getOssExtendConfig();
|
||||||
|
@ -92,6 +107,9 @@ public class ApiSystemController {
|
||||||
*
|
*
|
||||||
* @return 公告信息
|
* @return 公告信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取系统公告信息")
|
||||||
@GetMapping("/systemNotice")
|
@GetMapping("/systemNotice")
|
||||||
public Result systemNotice() {
|
public Result systemNotice() {
|
||||||
NoticeRespVo respVo = noticeService.systemNotice(NoticeTypeEnum.SYSTEM_NOTICE.getCode());
|
NoticeRespVo respVo = noticeService.systemNotice(NoticeTypeEnum.SYSTEM_NOTICE.getCode());
|
||||||
|
@ -104,6 +122,9 @@ public class ApiSystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 全部公告信息
|
* @return 全部公告信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取全部公告信息")
|
||||||
@PostMapping("/allNotice")
|
@PostMapping("/allNotice")
|
||||||
public Result allNotice(@RequestBody @Valid NoticeListReqVo reqVo) {
|
public Result allNotice(@RequestBody @Valid NoticeListReqVo reqVo) {
|
||||||
PageInfo<NoticeRespVo> pageInfo = noticeService.allNotice(reqVo);
|
PageInfo<NoticeRespVo> pageInfo = noticeService.allNotice(reqVo);
|
||||||
|
@ -116,6 +137,9 @@ public class ApiSystemController {
|
||||||
* @param id 公共ID
|
* @param id 公共ID
|
||||||
* @return 告详情
|
* @return 告详情
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "获取公告详情")
|
||||||
@GetMapping("/noticeDetail/{id}")
|
@GetMapping("/noticeDetail/{id}")
|
||||||
public Result noticeDetail(@PathVariable("id") Integer id) {
|
public Result noticeDetail(@PathVariable("id") Integer id) {
|
||||||
NoticeRespVo respVo = noticeService.noticeDetail(id);
|
NoticeRespVo respVo = noticeService.noticeDetail(id);
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.blog4j.system.component;
|
||||||
|
|
||||||
|
import com.blog4j.api.client.FeignServer;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/20 19:58
|
||||||
|
**/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
public class AsyncService {
|
||||||
|
private final FeignServer feignServer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步添加日志信息
|
||||||
|
*
|
||||||
|
* @param logVo 日志信息
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
feignServer.addLog(logVo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,9 @@ package com.blog4j.system.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
import cn.dev33.satoken.annotation.SaCheckRole;
|
||||||
import cn.dev33.satoken.annotation.SaMode;
|
import cn.dev33.satoken.annotation.SaMode;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.common.utils.CommonUtil;
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
import com.blog4j.system.entity.WebInfoEntity;
|
import com.blog4j.system.entity.WebInfoEntity;
|
||||||
|
@ -48,6 +51,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "保存系统配置信息")
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/saveBaseSystemConfig")
|
@PostMapping("/saveBaseSystemConfig")
|
||||||
public Result saveBaseSystemConfig(@RequestBody @Valid SaveSystemReqVo reqVo) {
|
public Result saveBaseSystemConfig(@RequestBody @Valid SaveSystemReqVo reqVo) {
|
||||||
|
@ -61,6 +67,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "保存网站配置信息")
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/saveWebInfo")
|
@PostMapping("/saveWebInfo")
|
||||||
public Result saveWebInfo(@RequestBody @Valid SaveWebInfoReqVo reqVo) {
|
public Result saveWebInfo(@RequestBody @Valid SaveWebInfoReqVo reqVo) {
|
||||||
|
@ -77,6 +86,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "编辑公告")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/editNotice")
|
@PostMapping("/editNotice")
|
||||||
public Result editNotice(@RequestBody @Valid EditNoticeReqVo reqVo) {
|
public Result editNotice(@RequestBody @Valid EditNoticeReqVo reqVo) {
|
||||||
|
@ -90,6 +102,9 @@ public class SystemController {
|
||||||
* @param id 公告ID
|
* @param id 公告ID
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "删除公告")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@GetMapping("/delNotice/{id}")
|
@GetMapping("/delNotice/{id}")
|
||||||
public Result delNotice(@PathVariable("id") Integer id) {
|
public Result delNotice(@PathVariable("id") Integer id) {
|
||||||
|
@ -103,6 +118,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "创建公告")
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/createNotice")
|
@PostMapping("/createNotice")
|
||||||
public Result createNotice(@RequestBody @Valid CreateNoticeReqVo reqVo) {
|
public Result createNotice(@RequestBody @Valid CreateNoticeReqVo reqVo) {
|
||||||
|
@ -116,6 +134,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "保存OSS基础配置信息")
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/saveOssConfig")
|
@PostMapping("/saveOssConfig")
|
||||||
public Result saveOssConfig(@RequestBody @Valid SaveOssBaseConfigReqVo reqVo) {
|
public Result saveOssConfig(@RequestBody @Valid SaveOssBaseConfigReqVo reqVo) {
|
||||||
|
@ -129,6 +150,9 @@ public class SystemController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.INSERT,
|
||||||
|
module= ModuleTypeEnum.SYSTEM,
|
||||||
|
description = "保存OSS扩展配置信息")
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/saveOssExtendConfig")
|
@PostMapping("/saveOssExtendConfig")
|
||||||
public Result saveOssExtendConfig(@RequestBody @Valid SaveOssExtendConfigReqVo reqVo) {
|
public Result saveOssExtendConfig(@RequestBody @Valid SaveOssExtendConfigReqVo reqVo) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
spring:
|
spring:
|
||||||
|
liquibase:
|
||||||
|
change-log: classpath:/liquibase/master.xml
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-system?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
url: jdbc:mysql://localhost:3306/blog4j-system?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
username: root
|
username: root
|
||||||
password: 4897458Hk!@
|
password: 4897458hk
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
|
|
|
@ -20,4 +20,9 @@ sa-token:
|
||||||
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
||||||
token-name: Authentication
|
token-name: Authentication
|
||||||
timeout: 86400
|
timeout: 86400
|
||||||
is-concurrent: false
|
is-concurrent: false
|
||||||
|
jasypt:
|
||||||
|
encryptor:
|
||||||
|
password: blog4j_test
|
||||||
|
algorithm: PBEWithMD5AndDES
|
||||||
|
iv-generator-classname: org.jasypt.iv.NoIvGenerator
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<!--用于参考 id:当前时间戳 author:sql文件提交人 runOnChange:文件内容更改sql会重新执行-->
|
||||||
|
<changeSet id="t_system_init_ddl_20240823124956" author="98k" runOnChange="false">
|
||||||
|
<sqlFile path="liquibase/upgrade/20240823/t_system_init_ddl_20240823124956.sql"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<include file="liquibase/changelog/database_change.xml" relativeToChangelogFile="false"/>
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,196 @@
|
||||||
|
/*
|
||||||
|
Navicat MySQL Data Transfer
|
||||||
|
|
||||||
|
Source Server : blog4j-user-dev
|
||||||
|
Source Server Type : MySQL
|
||||||
|
Source Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
Source Host : sh-cdb-b593hl8o.sql.tencentcdb.com:63556
|
||||||
|
Source Schema : blog4j-system
|
||||||
|
|
||||||
|
Target Server Type : MySQL
|
||||||
|
Target Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 23/08/2024 12:49:53
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_barrage
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_barrage`;
|
||||||
|
CREATE TABLE `t_barrage` (
|
||||||
|
`id` bigint(20) NOT NULL COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户ID',
|
||||||
|
`message_content` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '留言内容',
|
||||||
|
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||||
|
`user_avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户头像'
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网站弹幕留言表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_img_valid_rules
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_img_valid_rules`;
|
||||||
|
CREATE TABLE `t_img_valid_rules` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`img_rule_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '图片审核规则代码',
|
||||||
|
`enabled` int(11) NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||||||
|
`img_rule_desc` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '规则描述',
|
||||||
|
`img_rule_confidence` int(11) NOT NULL COMMENT '信任分',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_enabled`(`enabled`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '图片审核规则' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_notice
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_notice`;
|
||||||
|
CREATE TABLE `t_notice` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`notice_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '公告标题',
|
||||||
|
`notice_version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '公告版本',
|
||||||
|
`notice_content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '公告内容',
|
||||||
|
`creater` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '公告创建人',
|
||||||
|
`notice_type` int(11) NOT NULL COMMENT '公告类型(1:系统公告 2:组织公告)',
|
||||||
|
`organization_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '组织ID(公告类型是组织公告时必填)',
|
||||||
|
`notice_status` int(11) NOT NULL COMMENT '公告状态(1:待发布 2:已发布 )',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_version`(`notice_version`, `notice_type`, `deleted`) USING BTREE,
|
||||||
|
INDEX `idx_nor_type_delete`(`notice_type`, `deleted`) USING BTREE,
|
||||||
|
INDEX `idx_nor_ststus_delete`(`notice_status`, `deleted`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 26 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '公告信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_oss_base_config
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_oss_base_config`;
|
||||||
|
CREATE TABLE `t_oss_base_config` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`end_point` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '终端',
|
||||||
|
`bucket_domain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '域',
|
||||||
|
`bucket_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '桶å',
|
||||||
|
`access_key_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'accessKeyId',
|
||||||
|
`access_key_secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'accessKeySecret',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_bucket_name`(`bucket_name`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'OSS基本配置信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_oss_extend_config
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_oss_extend_config`;
|
||||||
|
CREATE TABLE `t_oss_extend_config` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`article_img_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文章中图片存储目录',
|
||||||
|
`file_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件存储目录',
|
||||||
|
`user_avatar_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像存储目录',
|
||||||
|
`organization_avatar_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '组织头像存储目录',
|
||||||
|
`user_homepage_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户主页背景图存储目录',
|
||||||
|
`category_cover_storage_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类背景图存储目录',
|
||||||
|
`website_cover_directory` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '网站背景图存储目录',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '阿里云OSS扩展信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_system
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_system`;
|
||||||
|
CREATE TABLE `t_system` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`open_sms` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启短信功能(0:不开启 1:开启)',
|
||||||
|
`open_msm` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启邮件功能(0:不开启 1:开启)',
|
||||||
|
`open_upload` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启上传文件功能(0:不开启 1:开启)',
|
||||||
|
`open_download` int(11) NOT NULL COMMENT '是否开启下载文件功能',
|
||||||
|
`upload_day_times` int(11) NOT NULL COMMENT '单个用户每天上传文件的次数',
|
||||||
|
`download_day_times` int(11) NOT NULL COMMENT '单个用户每天下载文件的次数',
|
||||||
|
`user_month_update_pwd_times` int(11) NOT NULL DEFAULT 3 COMMENT '用户每个月允许修改密码的次数',
|
||||||
|
`user_import_template_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '导入用户信息模板存储路径',
|
||||||
|
`organization_import_template_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '导入组织信息模板存储路径',
|
||||||
|
`user_default_avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户默认头像',
|
||||||
|
`user_default_homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户默认背景图',
|
||||||
|
`open_text_valid` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启文本审核功能(0:不开启 1:开启)',
|
||||||
|
`open_img_valid` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启图片审核功能(0:不开启 1:开启)',
|
||||||
|
`init_password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户初始密码',
|
||||||
|
`aes_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'AES前后端加解密的KEY',
|
||||||
|
`aes_iv` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'AES前后端加解密的IV',
|
||||||
|
`organization_max_capacity` int(11) NOT NULL COMMENT '单个组织最大容纳人数',
|
||||||
|
`user_join_organization_max_num` int(11) NOT NULL COMMENT '单个用户允许加入的组织数',
|
||||||
|
`article_approve_require` int(11) NOT NULL COMMENT '发布文章是否需要审批',
|
||||||
|
`approve_article_open_email_notify` int(11) NOT NULL COMMENT '文章审批后是否需要邮件通知',
|
||||||
|
`approve_organization_open_email_notify` int(11) NOT NULL COMMENT '组织审批后是否需要邮件通知',
|
||||||
|
`approve_role_open_email_notify` int(11) NOT NULL COMMENT '角色审批后是否需要邮件通知',
|
||||||
|
`approve_user_open_email_notify` int(11) NOT NULL COMMENT '用户审批后是否需要邮件通知',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统配置' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_text_valid_rules
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_text_valid_rules`;
|
||||||
|
CREATE TABLE `t_text_valid_rules` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`text_rule_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文本审核规则代码',
|
||||||
|
`enabled` int(11) NULL DEFAULT 1 COMMENT '是否启用',
|
||||||
|
`text_rule_desc` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '规则描述',
|
||||||
|
`text_rule_confidence` int(11) NOT NULL COMMENT '规则信任分',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_enabled`(`enabled`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文本审核的规则' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_visit
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_visit`;
|
||||||
|
CREATE TABLE `t_visit` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`date` date NOT NULL COMMENT '日期',
|
||||||
|
`count` int(11) NOT NULL DEFAULT 0 COMMENT '访问量',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_date`(`date`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网站访问量' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_webinfo
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_webinfo`;
|
||||||
|
CREATE TABLE `t_webinfo` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`web_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网站名称',
|
||||||
|
`web_title` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网站标题',
|
||||||
|
`background_image` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网站背景图片',
|
||||||
|
`time_scope` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '时间范围',
|
||||||
|
`beian_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '备案号',
|
||||||
|
`beian_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '备案人',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网站信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_work_order
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_work_order`;
|
||||||
|
CREATE TABLE `t_work_order` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`creater_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人ID',
|
||||||
|
`word_order_type` int(11) NOT NULL COMMENT '工单类型(1:需求 2:问题 3:求助)',
|
||||||
|
`title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '工单标题',
|
||||||
|
`description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简要描述',
|
||||||
|
`email_notify` int(11) NOT NULL COMMENT '是否邮件通知处理结果',
|
||||||
|
`handle_status` int(11) NOT NULL COMMENT '状态(1:待处理 3:处理中 3:已处理)',
|
||||||
|
`hndle_result` int(11) NULL DEFAULT NULL COMMENT '处理结果(1:同意 2:驳回)',
|
||||||
|
`handle_message` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '处理结果留言(处理结果为驳回时必填)',
|
||||||
|
`handle_time` datetime NULL DEFAULT NULL COMMENT '处理时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '工单发起时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_creater_user_id`(`creater_user_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_type`(`word_order_type`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '工单信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
|
@ -40,48 +40,10 @@
|
||||||
<artifactId>blog4j-api</artifactId>
|
<artifactId>blog4j-api</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
<!-- 打包跳过单元测试 -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<skipTests>true</skipTests>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>com.spotify</groupId>
|
|
||||||
<artifactId>docker-maven-plugin</artifactId>
|
|
||||||
<version>1.2.0</version>
|
|
||||||
<configuration>
|
|
||||||
<!-- Docker宿主机地址 -->
|
|
||||||
<dockerHost>http://120.46.46.173:2375</dockerHost>
|
|
||||||
<!-- 镜像名字:版本号 -->
|
|
||||||
<imageName>${project.artifactId}:${project.version}</imageName>
|
|
||||||
<!-- true 会覆盖构建相同标签的镜像 -->
|
|
||||||
<forceTags>true</forceTags>
|
|
||||||
<!--指定 Dockerfile 位置-->
|
|
||||||
<dockerDirectory>src/main/docker</dockerDirectory>
|
|
||||||
<!-- 将jar文件从target目录复制到镜像的根目录 -->
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<targetPath>/</targetPath>
|
|
||||||
<!--指定需要复制的根目录,下面表示target目录-->
|
|
||||||
<directory>${project.build.directory}</directory>
|
|
||||||
<!--指定需要复制的文件,下面指的是打包后的jar包文件-->
|
|
||||||
<include>${project.build.finalName}.jar</include>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.blog4j.user.aop;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
|
import com.blog4j.common.enums.LogResultEnum;
|
||||||
|
import com.blog4j.common.exception.Blog4jException;
|
||||||
|
import com.blog4j.common.exception.InvalidRequestException;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
|
import com.blog4j.common.utils.OperationLogHolder;
|
||||||
|
import com.blog4j.common.utils.RealIpUtil;
|
||||||
|
import com.blog4j.user.component.AsyncService;
|
||||||
|
import com.blog4j.user.entity.UserEntity;
|
||||||
|
import com.blog4j.user.mapper.UserMapper;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 98k灬
|
||||||
|
* @version v1.0.0
|
||||||
|
* @Description : 功能描述
|
||||||
|
* @Create on : 2024/8/18 14:30
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
public class LogAspect {
|
||||||
|
private final UserMapper userMapper;
|
||||||
|
private final AsyncService asyncService;
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.blog4j.common.annotation.OperationLog)")
|
||||||
|
public void log() {}
|
||||||
|
|
||||||
|
@AfterThrowing(pointcut = "log()", throwing = "e")
|
||||||
|
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
||||||
|
String errMsg = e.getMessage();
|
||||||
|
if (e instanceof Blog4jException) {
|
||||||
|
Blog4jException blog4jException = (Blog4jException) e;
|
||||||
|
errMsg = blog4jException.getErrMsg();
|
||||||
|
} else if (e instanceof InvalidRequestException) {
|
||||||
|
InvalidRequestException invalidRequestException = (InvalidRequestException) e;
|
||||||
|
errMsg = invalidRequestException.getErrMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.error("接口异常: [{}]", errMsg);
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
logVo.setResult(LogResultEnum.FAIL.getResult()).setErrMsg(errMsg);
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("log()")
|
||||||
|
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
LogVo logVo = getAnnotationInfo(method);
|
||||||
|
logVo.setParam(JSONUtil.toJsonStr(joinPoint.getArgs()))
|
||||||
|
.setResult(LogResultEnum.SUCCESS.getResult());
|
||||||
|
// 方法名
|
||||||
|
String methodName = joinPoint.getSignature().getName();
|
||||||
|
logVo.setMethodName(methodName);
|
||||||
|
|
||||||
|
// 得到request
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes)
|
||||||
|
Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||||
|
logVo.setIpAddress(RealIpUtil.getRealIp(request)).setUrl(request.getRequestURL().toString());
|
||||||
|
UserEntity userInfo = getUserInfo();
|
||||||
|
if (Objects.nonNull(userInfo)) {
|
||||||
|
logVo.setUserId(userInfo.getUserId()).setUserName(userInfo.getUserName());
|
||||||
|
}
|
||||||
|
|
||||||
|
String className = joinPoint.getTarget().getClass().getName();
|
||||||
|
logVo.setClassName(className)
|
||||||
|
.setTime(System.currentTimeMillis() - startTime)
|
||||||
|
.setCreateTime(CommonUtil.getCurrentDateTime());
|
||||||
|
OperationLogHolder.setLogVo(logVo);
|
||||||
|
return joinPoint.proceed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter(JoinPoint joinPoint) {
|
||||||
|
LogVo logVo = OperationLogHolder.getLogVo();
|
||||||
|
OperationLogHolder.removeLogVo();
|
||||||
|
asyncService.addLog(logVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogVo getAnnotationInfo(Method method ) {
|
||||||
|
LogVo log = new LogVo();
|
||||||
|
OperationLog annotation = method.getAnnotation(OperationLog.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
OperationTypeEnum operationTypeEnum = annotation.operationType();
|
||||||
|
ModuleTypeEnum module = annotation.module();
|
||||||
|
String description = annotation.description();
|
||||||
|
log.setModuleType(module.getType())
|
||||||
|
.setOperationType(operationTypeEnum.getType())
|
||||||
|
.setDescription(description);
|
||||||
|
}
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserEntity getUserInfo() {
|
||||||
|
String userId = "";
|
||||||
|
try {
|
||||||
|
userId = StpUtil.getLoginIdAsString();
|
||||||
|
return userMapper.selectById(userId);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.warn("user not login");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.user.api;
|
package com.blog4j.user.api;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.service.OrganizationService;
|
import com.blog4j.user.service.OrganizationService;
|
||||||
import com.blog4j.user.vo.resp.OrganizationInfoRespVo;
|
import com.blog4j.user.vo.resp.OrganizationInfoRespVo;
|
||||||
|
@ -31,6 +34,9 @@ public class ApiOrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 组织信息
|
* @return 组织信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "根据组织ID获取组织信息")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/organizationInfo")
|
@GetMapping("/organizationInfo")
|
||||||
public Result organizationInfo(@RequestParam("organizationId") String organizationId) {
|
public Result organizationInfo(@RequestParam("organizationId") String organizationId) {
|
||||||
|
@ -44,6 +50,9 @@ public class ApiOrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 组织成员数
|
* @return 组织成员数
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "根据组织ID获取组织成员数")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@GetMapping("/organizationMembers")
|
@GetMapping("/organizationMembers")
|
||||||
public Result organizationMembers(@RequestParam("organizationId") String organizationId) {
|
public Result organizationMembers(@RequestParam("organizationId") String organizationId) {
|
||||||
|
@ -57,6 +66,9 @@ public class ApiOrganizationController {
|
||||||
* @param keyword 关键字
|
* @param keyword 关键字
|
||||||
* @return 组织列表
|
* @return 组织列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "获取组织列表")
|
||||||
@GetMapping("/organizationList")
|
@GetMapping("/organizationList")
|
||||||
public Result organizationList(@RequestParam(value = "keyword", required = false) String keyword) {
|
public Result organizationList(@RequestParam(value = "keyword", required = false) String keyword) {
|
||||||
List<OrganizationInfoRespVo> list = organizationService.organizationListByKeyword(keyword);
|
List<OrganizationInfoRespVo> list = organizationService.organizationListByKeyword(keyword);
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.user.api;
|
package com.blog4j.user.api;
|
||||||
|
|
||||||
import com.blog4j.api.vo.RoleInfoVo;
|
import com.blog4j.api.vo.RoleInfoVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.service.RoleService;
|
import com.blog4j.user.service.RoleService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -28,6 +31,9 @@ public class ApiRoleController {
|
||||||
* @param userId 用户ID
|
* @param userId 用户ID
|
||||||
* @return 角色信息
|
* @return 角色信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "根据用户ID获取角色信息")
|
||||||
@GetMapping("/getRoleInfoByUserId/{userId}")
|
@GetMapping("/getRoleInfoByUserId/{userId}")
|
||||||
public Result getRoleInfoByUserId(@PathVariable("userId") String userId) {
|
public Result getRoleInfoByUserId(@PathVariable("userId") String userId) {
|
||||||
RoleInfoVo info = roleService.getRoleInfoByUserId(userId);
|
RoleInfoVo info = roleService.getRoleInfoByUserId(userId);
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package com.blog4j.user.api;
|
package com.blog4j.user.api;
|
||||||
|
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.service.UserService;
|
import com.blog4j.user.service.UserService;
|
||||||
import com.blog4j.user.vo.req.RegisterReqVo;
|
import com.blog4j.user.vo.req.RegisterReqVo;
|
||||||
|
@ -33,6 +36,9 @@ public class ApiUserController {
|
||||||
* @param userId 用户ID
|
* @param userId 用户ID
|
||||||
* @return 用户信息
|
* @return 用户信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.QUERY,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "根据用户ID获取用户信息")
|
||||||
@GetMapping("/info")
|
@GetMapping("/info")
|
||||||
public Result info(@RequestParam("userId") String userId) {
|
public Result info(@RequestParam("userId") String userId) {
|
||||||
UserInfoRespVo respVo = userService.userInfo(userId);
|
UserInfoRespVo respVo = userService.userInfo(userId);
|
||||||
|
@ -45,6 +51,9 @@ public class ApiUserController {
|
||||||
* @param reqVo 注册信息
|
* @param reqVo 注册信息
|
||||||
* @return 注册成功
|
* @return 注册成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.REGISTER,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "用户注册")
|
||||||
@PostMapping("/register")
|
@PostMapping("/register")
|
||||||
public Result register(@RequestBody @Valid RegisterReqVo reqVo) {
|
public Result register(@RequestBody @Valid RegisterReqVo reqVo) {
|
||||||
userService.register(reqVo);
|
userService.register(reqVo);
|
||||||
|
|
|
@ -3,13 +3,12 @@ package com.blog4j.user.component;
|
||||||
import com.blog4j.api.client.FeignServer;
|
import com.blog4j.api.client.FeignServer;
|
||||||
import com.blog4j.api.vo.MessageVo;
|
import com.blog4j.api.vo.MessageVo;
|
||||||
import com.blog4j.api.vo.NoticeEmailVo;
|
import com.blog4j.api.vo.NoticeEmailVo;
|
||||||
import com.blog4j.common.constants.CommonConstant;
|
|
||||||
import com.blog4j.common.enums.MessageStatusEnum;
|
import com.blog4j.common.enums.MessageStatusEnum;
|
||||||
import com.blog4j.common.enums.YesOrNoEnum;
|
import com.blog4j.common.enums.YesOrNoEnum;
|
||||||
|
import com.blog4j.common.model.LogVo;
|
||||||
import com.blog4j.common.utils.CommonUtil;
|
import com.blog4j.common.utils.CommonUtil;
|
||||||
import com.blog4j.user.entity.MessageEntity;
|
import com.blog4j.user.entity.MessageEntity;
|
||||||
import com.blog4j.user.mapper.MessageMapper;
|
import com.blog4j.user.mapper.MessageMapper;
|
||||||
import com.blog4j.user.utils.UserUtil;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
@ -115,4 +114,9 @@ public class AsyncService {
|
||||||
.build();
|
.build();
|
||||||
messageMapper.insert(message);
|
messageMapper.insert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Async
|
||||||
|
public void addLog(LogVo logVo) {
|
||||||
|
feignServer.addLog(logVo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.user.controller;
|
package com.blog4j.user.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.service.FansService;
|
import com.blog4j.user.service.FansService;
|
||||||
import com.blog4j.user.vo.req.FansListReqVo;
|
import com.blog4j.user.vo.req.FansListReqVo;
|
||||||
|
@ -36,6 +39,7 @@ public class FansController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 用户的粉丝信息列表
|
* @return 用户的粉丝信息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据用户ID获取用户的粉丝信息列表")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody @Valid FansListReqVo reqVo) {
|
public Result list(@RequestBody @Valid FansListReqVo reqVo) {
|
||||||
PageInfo<FansRespVo> pageInfo = fansService.pageList(reqVo);
|
PageInfo<FansRespVo> pageInfo = fansService.pageList(reqVo);
|
||||||
|
@ -49,6 +53,7 @@ public class FansController {
|
||||||
* @param userId2 用户2
|
* @param userId2 用户2
|
||||||
* @return 是否
|
* @return 是否
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "检查userid2是否是userid1的粉丝")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/checkIsFans")
|
@GetMapping("/checkIsFans")
|
||||||
public Result checkIsFans(@RequestParam("userId1") String userId1, @RequestParam("userId2") String userId2) {
|
public Result checkIsFans(@RequestParam("userId1") String userId1, @RequestParam("userId2") String userId2) {
|
||||||
|
@ -62,6 +67,9 @@ public class FansController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "用户关注或取消关注")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/follow")
|
@PostMapping("/follow")
|
||||||
public Result follow(@RequestBody @Valid FollowReqVo reqVo) {
|
public Result follow(@RequestBody @Valid FollowReqVo reqVo) {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.user.controller;
|
package com.blog4j.user.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.entity.MessageEntity;
|
import com.blog4j.user.entity.MessageEntity;
|
||||||
import com.blog4j.user.service.MessageService;
|
import com.blog4j.user.service.MessageService;
|
||||||
|
@ -37,6 +40,7 @@ public class MessageController {
|
||||||
* @param userId 用户ID
|
* @param userId 用户ID
|
||||||
* @return 是否有新消息
|
* @return 是否有新消息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "检查用户是否有新消息")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/userHasNewMessage")
|
@GetMapping("/userHasNewMessage")
|
||||||
public Result userHasNewMessage(@RequestParam("userId") String userId) {
|
public Result userHasNewMessage(@RequestParam("userId") String userId) {
|
||||||
|
@ -50,6 +54,7 @@ public class MessageController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 消息列表
|
* @return 消息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "获取消息列表")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/messageList")
|
@PostMapping("/messageList")
|
||||||
public Result messageList(@RequestBody @Valid MessageListReqVo reqVo) {
|
public Result messageList(@RequestBody @Valid MessageListReqVo reqVo) {
|
||||||
|
@ -63,6 +68,9 @@ public class MessageController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除消息")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/deleteMessage")
|
@PostMapping("/deleteMessage")
|
||||||
public Result deleteMessage(@RequestBody @Valid DelMessageReqVo reqVo) {
|
public Result deleteMessage(@RequestBody @Valid DelMessageReqVo reqVo) {
|
||||||
|
@ -71,10 +79,13 @@ public class MessageController {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全部已读消息
|
* 设置全部消息已读
|
||||||
*
|
*
|
||||||
* @return 成功
|
* @return 成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.EDIT,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "设置全部消息已读")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/allReadMessage")
|
@GetMapping("/allReadMessage")
|
||||||
public Result allReadMessage() {
|
public Result allReadMessage() {
|
||||||
|
@ -87,6 +98,9 @@ public class MessageController {
|
||||||
*
|
*
|
||||||
* @return 成功
|
* @return 成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(operationType= OperationTypeEnum.DELETE,
|
||||||
|
module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除全部消息")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/deleteAllMessage")
|
@GetMapping("/deleteAllMessage")
|
||||||
public Result deleteAllMessage() {
|
public Result deleteAllMessage() {
|
||||||
|
|
|
@ -4,6 +4,9 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
import cn.dev33.satoken.annotation.SaCheckRole;
|
||||||
import cn.dev33.satoken.annotation.SaMode;
|
import cn.dev33.satoken.annotation.SaMode;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.model.ImportOrganizationExcel;
|
import com.blog4j.user.model.ImportOrganizationExcel;
|
||||||
import com.blog4j.user.service.ApplyOrganizationService;
|
import com.blog4j.user.service.ApplyOrganizationService;
|
||||||
|
@ -63,6 +66,7 @@ public class OrganizationController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 组织列表
|
* @return 组织列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "组织列表查询")
|
||||||
@SaCheckPermission(value = "ORGANIZATION:LIST")
|
@SaCheckPermission(value = "ORGANIZATION:LIST")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody OrganizationListReqVo reqVo) {
|
public Result list(@RequestBody OrganizationListReqVo reqVo) {
|
||||||
|
@ -76,6 +80,7 @@ public class OrganizationController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 用户列表
|
* @return 用户列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "查询组织用户列表")
|
||||||
@SaCheckPermission(value = "ORGANIZATION:USER:LIST")
|
@SaCheckPermission(value = "ORGANIZATION:USER:LIST")
|
||||||
@PostMapping("/organizationUserList")
|
@PostMapping("/organizationUserList")
|
||||||
public Result organizationUserList(@RequestBody @Valid UserListReqVo reqVo) {
|
public Result organizationUserList(@RequestBody @Valid UserListReqVo reqVo) {
|
||||||
|
@ -89,6 +94,7 @@ public class OrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 组织信息
|
* @return 组织信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据组织ID查询组织信息")
|
||||||
@GetMapping("/info/{organizationId}")
|
@GetMapping("/info/{organizationId}")
|
||||||
public Result info(@PathVariable("organizationId") String organizationId) {
|
public Result info(@PathVariable("organizationId") String organizationId) {
|
||||||
OrganizationInfoRespVo respVo = organizationService.info(organizationId);
|
OrganizationInfoRespVo respVo = organizationService.info(organizationId);
|
||||||
|
@ -102,6 +108,9 @@ public class OrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 更新成功
|
* @return 更新成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "更新组织的状态",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@GetMapping("/updateOrganizationStatus/{status}/{organizationId}")
|
@GetMapping("/updateOrganizationStatus/{status}/{organizationId}")
|
||||||
public Result updateOrganizationStatus(@PathVariable("status") Integer status,
|
public Result updateOrganizationStatus(@PathVariable("status") Integer status,
|
||||||
|
@ -116,6 +125,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 待删除的组织ID集合
|
* @param reqVo 待删除的组织ID集合
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除组织信息",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:DELETE")
|
@SaCheckPermission(value = "ORGANIZATION:DELETE")
|
||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
public Result delete(@RequestBody @Valid DeleteOrganizationReqVo reqVo) {
|
public Result delete(@RequestBody @Valid DeleteOrganizationReqVo reqVo) {
|
||||||
|
@ -129,6 +141,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 移除成功
|
* @return 移除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "移除组织的用户",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:USER:DELETE")
|
@SaCheckPermission(value = "ORGANIZATION:USER:DELETE")
|
||||||
@PostMapping("/removeOrganizationUser")
|
@PostMapping("/removeOrganizationUser")
|
||||||
public Result removeOrganizationUser(@RequestBody @Valid RemoveOrganizationUserReqVo reqVo) {
|
public Result removeOrganizationUser(@RequestBody @Valid RemoveOrganizationUserReqVo reqVo) {
|
||||||
|
@ -142,6 +157,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 组织信息
|
* @param reqVo 组织信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "创建组织信息",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:ADD")
|
@SaCheckPermission(value = "ORGANIZATION:ADD")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public Result create(@RequestBody @Valid CreateOrganizationReqVo reqVo) {
|
public Result create(@RequestBody @Valid CreateOrganizationReqVo reqVo) {
|
||||||
|
@ -155,6 +173,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 审批信息
|
* @param reqVo 审批信息
|
||||||
* @return 审批成功
|
* @return 审批成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "审批组织",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/approveOrganization")
|
@PostMapping("/approveOrganization")
|
||||||
public Result approveOrganization(@RequestBody @Valid ApproveOrganizationReqVo reqVo) {
|
public Result approveOrganization(@RequestBody @Valid ApproveOrganizationReqVo reqVo) {
|
||||||
|
@ -168,6 +189,9 @@ public class OrganizationController {
|
||||||
* @param exportOrganizationReqVo 组织ID
|
* @param exportOrganizationReqVo 组织ID
|
||||||
* @param response 响应
|
* @param response 响应
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "组织导出",
|
||||||
|
operationType = OperationTypeEnum.EXPORT)
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/exportOrganization")
|
@PostMapping("/exportOrganization")
|
||||||
public void exportOrganization(@RequestBody @Valid ExportOrganizationReqVo exportOrganizationReqVo,
|
public void exportOrganization(@RequestBody @Valid ExportOrganizationReqVo exportOrganizationReqVo,
|
||||||
|
@ -181,6 +205,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "编辑组织信息",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:EDIT")
|
@SaCheckPermission(value = "ORGANIZATION:EDIT")
|
||||||
@PostMapping("/edit")
|
@PostMapping("/edit")
|
||||||
public Result edit(@RequestBody @Valid EditOrganizationReqVo reqVo) {
|
public Result edit(@RequestBody @Valid EditOrganizationReqVo reqVo) {
|
||||||
|
@ -194,6 +221,9 @@ public class OrganizationController {
|
||||||
* @param file 文件
|
* @param file 文件
|
||||||
* @return 导入成功
|
* @return 导入成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "组织批量导入",
|
||||||
|
operationType = OperationTypeEnum.IMPORT)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:IMPORT")
|
@SaCheckPermission(value = "ORGANIZATION:IMPORT")
|
||||||
@PostMapping("/importOrganization")
|
@PostMapping("/importOrganization")
|
||||||
public Result importOrganization(@RequestParam("file") MultipartFile file) {
|
public Result importOrganization(@RequestParam("file") MultipartFile file) {
|
||||||
|
@ -207,6 +237,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 组织信息
|
* @param reqVo 组织信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "批量创建组织信息",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@SaCheckPermission(value = "ORGANIZATION:ADD")
|
@SaCheckPermission(value = "ORGANIZATION:ADD")
|
||||||
@PostMapping("/batchCreate")
|
@PostMapping("/batchCreate")
|
||||||
public Result batchCreate(@RequestBody @Valid BatchCreateOrganizationReqVo reqVo) {
|
public Result batchCreate(@RequestBody @Valid BatchCreateOrganizationReqVo reqVo) {
|
||||||
|
@ -220,6 +253,9 @@ public class OrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 申请成功
|
* @return 申请成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "申请加入组织",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/applyJoinOrganization")
|
@GetMapping("/applyJoinOrganization")
|
||||||
public Result applyJoin(@RequestParam("organizationId") String organizationId) {
|
public Result applyJoin(@RequestParam("organizationId") String organizationId) {
|
||||||
|
@ -233,6 +269,9 @@ public class OrganizationController {
|
||||||
* @param organizationId 组织ID
|
* @param organizationId 组织ID
|
||||||
* @return 退出成功
|
* @return 退出成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "退出组织",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/exitOrganization")
|
@GetMapping("/exitOrganization")
|
||||||
public Result exitOrganization(@RequestParam("organizationId") String organizationId) {
|
public Result exitOrganization(@RequestParam("organizationId") String organizationId) {
|
||||||
|
@ -246,6 +285,7 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 组织的列表
|
* @return 组织的列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "获取用户申请加入组织的列表")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/applyJoinOrganizationList")
|
@PostMapping("/applyJoinOrganizationList")
|
||||||
public Result applyJoinOrganizationList(@RequestBody @Valid ApplyJoinOrganizationListReqVo reqVo) {
|
public Result applyJoinOrganizationList(@RequestBody @Valid ApplyJoinOrganizationListReqVo reqVo) {
|
||||||
|
@ -259,6 +299,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 审批成功
|
* @return 审批成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "审批用户申请加入组织",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/approveUserJoinOrganization")
|
@PostMapping("/approveUserJoinOrganization")
|
||||||
public Result approveUserJoinOrganization(@RequestBody @Valid ApproveUserJoinOrganizationReqVo reqVo) {
|
public Result approveUserJoinOrganization(@RequestBody @Valid ApproveUserJoinOrganizationReqVo reqVo) {
|
||||||
|
@ -272,6 +315,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除用户申请加入组织记录",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/deleteApplyJoinOrganization")
|
@PostMapping("/deleteApplyJoinOrganization")
|
||||||
public Result deleteApplyJoinOrganization(@RequestBody @Valid DeleteApplyJoinOrganizationReqVo reqVo) {
|
public Result deleteApplyJoinOrganization(@RequestBody @Valid DeleteApplyJoinOrganizationReqVo reqVo) {
|
||||||
|
@ -285,6 +331,7 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 申请创建组织信息的列表
|
* @return 申请创建组织信息的列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "获取申请创建组织信息的列表")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/getApplyOrganizationList")
|
@PostMapping("/getApplyOrganizationList")
|
||||||
public Result getApplyOrganizationList(@RequestBody @Valid ApplyOrganizationListReqVo reqVo) {
|
public Result getApplyOrganizationList(@RequestBody @Valid ApplyOrganizationListReqVo reqVo) {
|
||||||
|
@ -298,6 +345,9 @@ public class OrganizationController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除用户申请创建组织记录",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/deleteApplyCreateOrganization")
|
@PostMapping("/deleteApplyCreateOrganization")
|
||||||
public Result deleteApplyCreateOrganization(@RequestBody @Valid DeleteApplyCreateOrganizationReqVo reqVo) {
|
public Result deleteApplyCreateOrganization(@RequestBody @Valid DeleteApplyCreateOrganizationReqVo reqVo) {
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package com.blog4j.user.controller;
|
package com.blog4j.user.controller;
|
||||||
|
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.entity.PermissionEntity;
|
import com.blog4j.user.entity.PermissionEntity;
|
||||||
import com.blog4j.user.service.PermissionService;
|
import com.blog4j.user.service.PermissionService;
|
||||||
|
@ -37,6 +40,7 @@ public class PermissionController {
|
||||||
*
|
*
|
||||||
* @return 权限列表
|
* @return 权限列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "获取树形结构的权限列表")
|
||||||
@GetMapping("/getTreePermissions")
|
@GetMapping("/getTreePermissions")
|
||||||
public Result getTreePermissions() {
|
public Result getTreePermissions() {
|
||||||
List<PermissionEntity> list = permissionService.getTreePermissions();
|
List<PermissionEntity> list = permissionService.getTreePermissions();
|
||||||
|
@ -49,6 +53,7 @@ public class PermissionController {
|
||||||
* @param roleId 角色ID
|
* @param roleId 角色ID
|
||||||
* @return 权限信息列表
|
* @return 权限信息列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据角色ID查询权限信息列表")
|
||||||
@GetMapping("/getPermissionByRoleId/{roleId}")
|
@GetMapping("/getPermissionByRoleId/{roleId}")
|
||||||
public Result getPermissionByRoleId(@PathVariable("roleId") String roleId) {
|
public Result getPermissionByRoleId(@PathVariable("roleId") String roleId) {
|
||||||
List<Integer> list = permissionService.getPermissionByRoleId(roleId);
|
List<Integer> list = permissionService.getPermissionByRoleId(roleId);
|
||||||
|
@ -61,6 +66,9 @@ public class PermissionController {
|
||||||
* @param reqVo 信息
|
* @param reqVo 信息
|
||||||
* @return 保存成功
|
* @return 保存成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "保存角色与权限的关系",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@PostMapping("/saveRolePermissionRel")
|
@PostMapping("/saveRolePermissionRel")
|
||||||
public Result saveRolePermissionRel(@RequestBody @Valid SaveRolePermissionRelReqVo reqVo) {
|
public Result saveRolePermissionRel(@RequestBody @Valid SaveRolePermissionRelReqVo reqVo) {
|
||||||
permissionService.saveRolePermissionRel(reqVo);
|
permissionService.saveRolePermissionRel(reqVo);
|
||||||
|
@ -73,6 +81,9 @@ public class PermissionController {
|
||||||
* @param reqVo 信息
|
* @param reqVo 信息
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除节点",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@PostMapping("/deletePermissionNode")
|
@PostMapping("/deletePermissionNode")
|
||||||
public Result deletePermissionNode(@RequestBody @Valid DeletePermissionNodeReqVo reqVo) {
|
public Result deletePermissionNode(@RequestBody @Valid DeletePermissionNodeReqVo reqVo) {
|
||||||
permissionService.deletePermissionNode(reqVo);
|
permissionService.deletePermissionNode(reqVo);
|
||||||
|
@ -85,6 +96,9 @@ public class PermissionController {
|
||||||
* @param reqVo 信息
|
* @param reqVo 信息
|
||||||
* @return 新增成功
|
* @return 新增成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "新增权限",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@PostMapping("/createNode")
|
@PostMapping("/createNode")
|
||||||
public Result createNode(@RequestBody @Valid CreateNodeReqVo reqVo) {
|
public Result createNode(@RequestBody @Valid CreateNodeReqVo reqVo) {
|
||||||
permissionService.createNode(reqVo);
|
permissionService.createNode(reqVo);
|
||||||
|
@ -97,6 +111,9 @@ public class PermissionController {
|
||||||
* @param reqVo 信息
|
* @param reqVo 信息
|
||||||
* @return 新增成功
|
* @return 新增成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "编辑权限",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@PostMapping("/editNode")
|
@PostMapping("/editNode")
|
||||||
public Result editNode(@RequestBody @Valid EditNodeReqVo reqVo) {
|
public Result editNode(@RequestBody @Valid EditNodeReqVo reqVo) {
|
||||||
permissionService.editNode(reqVo);
|
permissionService.editNode(reqVo);
|
||||||
|
@ -109,6 +126,7 @@ public class PermissionController {
|
||||||
* @param permissionId 权限ID
|
* @param permissionId 权限ID
|
||||||
* @return 权限信息
|
* @return 权限信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据权限ID获取权限信息")
|
||||||
@GetMapping("/getPermissionById/{permissionId}")
|
@GetMapping("/getPermissionById/{permissionId}")
|
||||||
public Result getPermissionById(@PathVariable("permissionId") Integer permissionId) {
|
public Result getPermissionById(@PathVariable("permissionId") Integer permissionId) {
|
||||||
PermissionEntity permission = permissionService.getById(permissionId);
|
PermissionEntity permission = permissionService.getById(permissionId);
|
||||||
|
@ -121,6 +139,9 @@ public class PermissionController {
|
||||||
* @param reqVo 信息
|
* @param reqVo 信息
|
||||||
* @return 添加成功
|
* @return 添加成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "添加父节点",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@PostMapping("/createParentNode")
|
@PostMapping("/createParentNode")
|
||||||
public Result createParentNode(@RequestBody @Valid CreateParentNodeReqVo reqVo) {
|
public Result createParentNode(@RequestBody @Valid CreateParentNodeReqVo reqVo) {
|
||||||
permissionService.createParentNode(reqVo);
|
permissionService.createParentNode(reqVo);
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.blog4j.user.controller;
|
package com.blog4j.user.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.entity.RoleEntity;
|
import com.blog4j.user.entity.RoleEntity;
|
||||||
import com.blog4j.user.service.RoleService;
|
import com.blog4j.user.service.RoleService;
|
||||||
|
@ -37,7 +40,7 @@ public class RoleController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 角色信息
|
* @return 角色信息
|
||||||
*/
|
*/
|
||||||
//@SaCheckPermission(value = "ROLE:LIST")
|
@OperationLog(module= ModuleTypeEnum.USER, description = "获取所有的角色信息")
|
||||||
@PostMapping("/roleList")
|
@PostMapping("/roleList")
|
||||||
public Result roleList(@RequestBody RoleListReqVo reqVo) {
|
public Result roleList(@RequestBody RoleListReqVo reqVo) {
|
||||||
List<RoleEntity> list = roleService.roleList(reqVo);
|
List<RoleEntity> list = roleService.roleList(reqVo);
|
||||||
|
@ -50,6 +53,7 @@ public class RoleController {
|
||||||
* @param roleId 角色ID
|
* @param roleId 角色ID
|
||||||
* @return 角色信息
|
* @return 角色信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据角色ID获取角色信息")
|
||||||
@GetMapping("/getRoleById/{roleId}")
|
@GetMapping("/getRoleById/{roleId}")
|
||||||
public Result getRoleById(@PathVariable("roleId") String roleId) {
|
public Result getRoleById(@PathVariable("roleId") String roleId) {
|
||||||
RoleEntity role = roleService.getById(roleId);
|
RoleEntity role = roleService.getById(roleId);
|
||||||
|
@ -62,6 +66,9 @@ public class RoleController {
|
||||||
* @param reqVo 角色信息
|
* @param reqVo 角色信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "创建角色信息",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@SaCheckPermission(value = "ROLE:ADD")
|
@SaCheckPermission(value = "ROLE:ADD")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public Result create(@RequestBody CreateRoleReqVo reqVo) {
|
public Result create(@RequestBody CreateRoleReqVo reqVo) {
|
||||||
|
@ -75,6 +82,9 @@ public class RoleController {
|
||||||
* @param reqVo 角色信息
|
* @param reqVo 角色信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "编辑角色信息",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckPermission(value = "ROLE:EDIT")
|
@SaCheckPermission(value = "ROLE:EDIT")
|
||||||
@PostMapping("/edit")
|
@PostMapping("/edit")
|
||||||
public Result edit(@RequestBody EditRoleReqVo reqVo) {
|
public Result edit(@RequestBody EditRoleReqVo reqVo) {
|
||||||
|
@ -83,11 +93,14 @@ public class RoleController {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除角色
|
* 删除角色信息
|
||||||
*
|
*
|
||||||
* @param reqVo 角色信息
|
* @param reqVo 角色信息
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除角色信息",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckPermission(value = "ROLE:DELETE")
|
@SaCheckPermission(value = "ROLE:DELETE")
|
||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
public Result delete(@RequestBody DeleteRoleReqVo reqVo) {
|
public Result delete(@RequestBody DeleteRoleReqVo reqVo) {
|
||||||
|
|
|
@ -5,6 +5,9 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
import cn.dev33.satoken.annotation.SaCheckRole;
|
||||||
import cn.dev33.satoken.annotation.SaMode;
|
import cn.dev33.satoken.annotation.SaMode;
|
||||||
import com.blog4j.api.vo.UserInfoVo;
|
import com.blog4j.api.vo.UserInfoVo;
|
||||||
|
import com.blog4j.common.annotation.OperationLog;
|
||||||
|
import com.blog4j.common.enums.ModuleTypeEnum;
|
||||||
|
import com.blog4j.common.enums.OperationTypeEnum;
|
||||||
import com.blog4j.common.model.Result;
|
import com.blog4j.common.model.Result;
|
||||||
import com.blog4j.user.model.UserExcel;
|
import com.blog4j.user.model.UserExcel;
|
||||||
import com.blog4j.user.service.UserService;
|
import com.blog4j.user.service.UserService;
|
||||||
|
@ -53,6 +56,7 @@ public class UserController {
|
||||||
* @param userId 用户ID
|
* @param userId 用户ID
|
||||||
* @return 用户信息
|
* @return 用户信息
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "根据用户ID获取用户信息")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@GetMapping("/info/{userId}")
|
@GetMapping("/info/{userId}")
|
||||||
public Result info(@PathVariable("userId") String userId) {
|
public Result info(@PathVariable("userId") String userId) {
|
||||||
|
@ -66,6 +70,7 @@ public class UserController {
|
||||||
* @param reqVo 查询条件
|
* @param reqVo 查询条件
|
||||||
* @return 用户列表
|
* @return 用户列表
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "查询用户列表")
|
||||||
@SaCheckPermission(value = "USER:LIST")
|
@SaCheckPermission(value = "USER:LIST")
|
||||||
@PostMapping("/list")
|
@PostMapping("/list")
|
||||||
public Result list(@RequestBody @Valid UserListReqVo reqVo) {
|
public Result list(@RequestBody @Valid UserListReqVo reqVo) {
|
||||||
|
@ -79,6 +84,9 @@ public class UserController {
|
||||||
* @param reqVo 用户信息
|
* @param reqVo 用户信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "创建用户信息",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@SaCheckPermission(value = "USER:ADD")
|
@SaCheckPermission(value = "USER:ADD")
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public Result create(@RequestBody @Valid CreateUserReqVo reqVo) {
|
public Result create(@RequestBody @Valid CreateUserReqVo reqVo) {
|
||||||
|
@ -92,6 +100,9 @@ public class UserController {
|
||||||
* @param reqVo 用户信息
|
* @param reqVo 用户信息
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "编辑用户信息",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckPermission(value = "USER:EDIT")
|
@SaCheckPermission(value = "USER:EDIT")
|
||||||
@PostMapping("/update")
|
@PostMapping("/update")
|
||||||
public Result update(@RequestBody EditUserReqVo reqVo) {
|
public Result update(@RequestBody EditUserReqVo reqVo) {
|
||||||
|
@ -105,6 +116,9 @@ public class UserController {
|
||||||
* @param reqVo 用户信息
|
* @param reqVo 用户信息
|
||||||
* @return 删除成功
|
* @return 删除成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "删除用户信息",
|
||||||
|
operationType = OperationTypeEnum.DELETE)
|
||||||
@SaCheckRole(value = "SUPER_ADMIN")
|
@SaCheckRole(value = "SUPER_ADMIN")
|
||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
public Result delete(@RequestBody DeleteUserReqVo reqVo) {
|
public Result delete(@RequestBody DeleteUserReqVo reqVo) {
|
||||||
|
@ -118,6 +132,9 @@ public class UserController {
|
||||||
* @param file 文件
|
* @param file 文件
|
||||||
* @return 导入成功
|
* @return 导入成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "用户批量导入",
|
||||||
|
operationType = OperationTypeEnum.IMPORT)
|
||||||
@SaCheckPermission(value = "USER:IMPORT")
|
@SaCheckPermission(value = "USER:IMPORT")
|
||||||
@PostMapping("/importUser")
|
@PostMapping("/importUser")
|
||||||
public Result importUser(@RequestParam("file") MultipartFile file) {
|
public Result importUser(@RequestParam("file") MultipartFile file) {
|
||||||
|
@ -131,6 +148,9 @@ public class UserController {
|
||||||
* @param reqVo 用户信息
|
* @param reqVo 用户信息
|
||||||
* @return 创建成功
|
* @return 创建成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "批量创建用户信息",
|
||||||
|
operationType = OperationTypeEnum.INSERT)
|
||||||
@SaCheckPermission(value = "USER:ADD")
|
@SaCheckPermission(value = "USER:ADD")
|
||||||
@PostMapping("/batchCreate")
|
@PostMapping("/batchCreate")
|
||||||
public Result batchCreate(@RequestBody @Valid BatchCreateUserReqVo reqVo) {
|
public Result batchCreate(@RequestBody @Valid BatchCreateUserReqVo reqVo) {
|
||||||
|
@ -143,6 +163,9 @@ public class UserController {
|
||||||
*
|
*
|
||||||
* @param exportUserReqVo 用户ID
|
* @param exportUserReqVo 用户ID
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "用户批量导出",
|
||||||
|
operationType = OperationTypeEnum.EXPORT)
|
||||||
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
@SaCheckRole(value = {"SUPER_ADMIN", "ORGANIZATION_ADMIN"}, mode = SaMode.OR)
|
||||||
@PostMapping("/exportUser")
|
@PostMapping("/exportUser")
|
||||||
public void exportUser(@RequestBody @Valid ExportUserReqVo exportUserReqVo,
|
public void exportUser(@RequestBody @Valid ExportUserReqVo exportUserReqVo,
|
||||||
|
@ -156,6 +179,9 @@ public class UserController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 编辑成功
|
* @return 编辑成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "编辑用户基本信息",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckPermission(value = "USER:EDIT")
|
@SaCheckPermission(value = "USER:EDIT")
|
||||||
@PostMapping("/editUserBaseInfo")
|
@PostMapping("/editUserBaseInfo")
|
||||||
public Result editUserBaseInfo(@RequestBody @Valid EditUserBaseInfoReqVo reqVo) {
|
public Result editUserBaseInfo(@RequestBody @Valid EditUserBaseInfoReqVo reqVo) {
|
||||||
|
@ -169,6 +195,7 @@ public class UserController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 验证结果
|
* @return 验证结果
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "手机号码验证")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/validPhone")
|
@PostMapping("/validPhone")
|
||||||
public Result validPhone(@RequestBody @Valid ValidPhoneReqVo reqVo) {
|
public Result validPhone(@RequestBody @Valid ValidPhoneReqVo reqVo) {
|
||||||
|
@ -182,6 +209,7 @@ public class UserController {
|
||||||
* @param reqVo 请求
|
* @param reqVo 请求
|
||||||
* @return 验证结果
|
* @return 验证结果
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER, description = "邮箱验证")
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/validEmail")
|
@PostMapping("/validEmail")
|
||||||
public Result validEmail(@RequestBody @Valid ValidEmailReqVo reqVo) {
|
public Result validEmail(@RequestBody @Valid ValidEmailReqVo reqVo) {
|
||||||
|
@ -195,6 +223,9 @@ public class UserController {
|
||||||
* @param reqVo 请求信息
|
* @param reqVo 请求信息
|
||||||
* @return 更新成功
|
* @return 更新成功
|
||||||
*/
|
*/
|
||||||
|
@OperationLog(module= ModuleTypeEnum.USER,
|
||||||
|
description = "更新用户密码",
|
||||||
|
operationType = OperationTypeEnum.EDIT)
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@PostMapping("/updateUserPwd")
|
@PostMapping("/updateUserPwd")
|
||||||
public Result updateUserPwd(@RequestBody @Valid UpdateUserPwdReqVo reqVo) {
|
public Result updateUserPwd(@RequestBody @Valid UpdateUserPwdReqVo reqVo) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
spring:
|
spring:
|
||||||
|
liquibase:
|
||||||
|
change-log: classpath:/liquibase/master.xml
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://sh-cdb-b593hl8o.sql.tencentcdb.com:63556/blog4j-user?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
url: jdbc:mysql://localhost:3306/blog4j-user?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
|
||||||
username: blog4j_user_dev
|
username: root
|
||||||
password: 4897458Hk!@
|
password: 4897458hk
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
|
|
|
@ -16,4 +16,9 @@ sa-token:
|
||||||
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
|
||||||
token-name: Authentication
|
token-name: Authentication
|
||||||
timeout: 86400
|
timeout: 86400
|
||||||
is-concurrent: false
|
is-concurrent: false
|
||||||
|
jasypt:
|
||||||
|
encryptor:
|
||||||
|
password: blog4j_test
|
||||||
|
algorithm: PBEWithMD5AndDES
|
||||||
|
iv-generator-classname: org.jasypt.iv.NoIvGenerator
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<!--用于参考 id:当前时间戳 author:sql文件提交人 runOnChange:文件内容更改sql会重新执行-->
|
||||||
|
<changeSet id="t_user_init_ddl_20240823125256" author="98k" runOnChange="false">
|
||||||
|
<sqlFile path="liquibase/upgrade/20240823/t_user_init_ddl_20240823125256.sql"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
|
||||||
|
|
||||||
|
<include file="liquibase/changelog/database_change.xml" relativeToChangelogFile="false"/>
|
||||||
|
</databaseChangeLog>
|
|
@ -0,0 +1,231 @@
|
||||||
|
/*
|
||||||
|
Navicat MySQL Data Transfer
|
||||||
|
|
||||||
|
Source Server : blog4j-user-dev
|
||||||
|
Source Server Type : MySQL
|
||||||
|
Source Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
Source Host : sh-cdb-b593hl8o.sql.tencentcdb.com:63556
|
||||||
|
Source Schema : blog4j-user
|
||||||
|
|
||||||
|
Target Server Type : MySQL
|
||||||
|
Target Server Version : 50736 (5.7.36-txsql-log)
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 23/08/2024 12:52:54
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_apply_organization
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_apply_organization`;
|
||||||
|
CREATE TABLE `t_apply_organization` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`organization_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织ID',
|
||||||
|
`apply_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人',
|
||||||
|
`apply_role` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人角色',
|
||||||
|
`approve_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批人',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户创建组织申请' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_fans
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_fans`;
|
||||||
|
CREATE TABLE `t_fans` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`fans_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '粉丝ID',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_userid_fansid`(`user_id`, `fans_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_userid`(`user_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '粉丝信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_message
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_message`;
|
||||||
|
CREATE TABLE `t_message` (
|
||||||
|
`id` bigint(20) NOT NULL COMMENT '主键ID',
|
||||||
|
`from_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '发送方用户ID',
|
||||||
|
`to_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '接收方用户ID',
|
||||||
|
`message_type` int(11) NULL DEFAULT NULL COMMENT '消息类型(1:系统消息 2:提醒审批通知 3::审批完成通知)',
|
||||||
|
`message_status` int(11) NOT NULL COMMENT '消息状态(1:已读 2:未读)',
|
||||||
|
`message_title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '消息标题',
|
||||||
|
`message_content` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '消息内容',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_from_userid`(`from_user_id`, `deleted`) USING BTREE,
|
||||||
|
INDEX `idx_nor_to_userid`(`to_user_id`, `deleted`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_organization
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_organization`;
|
||||||
|
CREATE TABLE `t_organization` (
|
||||||
|
`organization_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织ID',
|
||||||
|
`organization_name` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织名称',
|
||||||
|
`organization_avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织封面、背景图',
|
||||||
|
`organization_creater` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织创建者ID',
|
||||||
|
`organization_creater_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织创建者的名称',
|
||||||
|
`organization_creater_avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织创建者头像',
|
||||||
|
`organization_admin` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织管理员ID',
|
||||||
|
`organization_admin_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织管理员名称',
|
||||||
|
`slogan` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织口号',
|
||||||
|
`capacity` int(11) NOT NULL COMMENT '组织最大容纳人数',
|
||||||
|
`status` int(11) NOT NULL COMMENT '组织状态',
|
||||||
|
`approve_status` int(11) NOT NULL COMMENT '组织审批状态',
|
||||||
|
`approve_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批留言',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`approve_time` datetime NULL DEFAULT NULL COMMENT '审批时间',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`organization_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_name`(`organization_name`, `deleted`) USING BTREE COMMENT '组织名称唯一索引'
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组织信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_organization_user_rel
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_organization_user_rel`;
|
||||||
|
CREATE TABLE `t_organization_user_rel` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`organization_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织ID',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_userId_organizationId`(`user_id`, `organization_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_userId`(`user_id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_organizationId`(`organization_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组织和用户的关系信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_permission
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_permission`;
|
||||||
|
CREATE TABLE `t_permission` (
|
||||||
|
`permission_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
|
||||||
|
`parent_id` int(11) NOT NULL COMMENT '父ID',
|
||||||
|
`permission_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名',
|
||||||
|
`permission_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色代码描述',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`permission_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_name`(`permission_name`) USING BTREE COMMENT '用户权限名唯一索引',
|
||||||
|
UNIQUE INDEX `idx_uni_code`(`permission_code`) USING BTREE COMMENT '用户权限代码描述唯一索引'
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 48 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户权限信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_role
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_role`;
|
||||||
|
CREATE TABLE `t_role` (
|
||||||
|
`role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色ID',
|
||||||
|
`role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名',
|
||||||
|
`role_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色代码描述',
|
||||||
|
`role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色中文描述',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`role_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_name`(`role_name`) USING BTREE COMMENT '角色名唯一索引',
|
||||||
|
UNIQUE INDEX `idx_uni_code`(`role_code`) USING BTREE COMMENT '角色代码描述唯一索引'
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户角色信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_role_permission_rel
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_role_permission_rel`;
|
||||||
|
CREATE TABLE `t_role_permission_rel` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色id',
|
||||||
|
`permission_id` int(11) NOT NULL COMMENT '权限id',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_roleId_permissionId`(`role_id`, `permission_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 640 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色权限关系表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_user
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_user`;
|
||||||
|
CREATE TABLE `t_user` (
|
||||||
|
`user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户角色ID',
|
||||||
|
`user_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
|
||||||
|
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户密码',
|
||||||
|
`homepage_cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个人主页背景图',
|
||||||
|
`sign` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '签名',
|
||||||
|
`sex` int(4) NULL DEFAULT NULL COMMENT '性别(1:男 2:女 3:未知)',
|
||||||
|
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户手机号码',
|
||||||
|
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户邮箱地址',
|
||||||
|
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户地址',
|
||||||
|
`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '用户头像',
|
||||||
|
`speak_status` int(11) NOT NULL DEFAULT 1 COMMENT '是否可以发言',
|
||||||
|
`status` int(11) NOT NULL COMMENT '用户状态(1:正常 2:锁定)',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除(1:已删除 0:未删除)',
|
||||||
|
`show_fans_list` int(11) NOT NULL DEFAULT 1 COMMENT '是否展示粉丝列表',
|
||||||
|
`show_favorite_list` int(11) NOT NULL DEFAULT 1 COMMENT '是否展示收藏列表',
|
||||||
|
`show_category_list` int(11) NOT NULL DEFAULT 1 COMMENT '是否展示分类列表',
|
||||||
|
`id` int(11) NULL DEFAULT NULL COMMENT '映射ID',
|
||||||
|
`last_login_time` datetime NULL DEFAULT NULL COMMENT '最近一次登录时间',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`user_id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_username`(`user_name`, `deleted`) USING BTREE COMMENT '未删除的用户的用户名唯一索引',
|
||||||
|
UNIQUE INDEX `idx_uni_id`(`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_user_apply_organization
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_user_apply_organization`;
|
||||||
|
CREATE TABLE `t_user_apply_organization` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
|
||||||
|
`organization_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织ID',
|
||||||
|
`approve_user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批人',
|
||||||
|
`approve_user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批人名称',
|
||||||
|
`approve_time` datetime NULL DEFAULT NULL COMMENT '审批时间',
|
||||||
|
`approve_message` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批留言',
|
||||||
|
`approve_status` int(11) NULL DEFAULT NULL COMMENT '审批状态',
|
||||||
|
`deleted` int(11) NOT NULL COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `idx_uni_userid_organizationid`(`user_id`, `organization_id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户加入组织申请信息表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_user_sensitive
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_user_sensitive`;
|
||||||
|
CREATE TABLE `t_user_sensitive` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户ID',
|
||||||
|
`role_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '角色ID',
|
||||||
|
`speech_content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '发言内容',
|
||||||
|
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否已被删除',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `idx_nor_userid`(`user_id`, `deleted`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户敏感发言记录表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for t_user_updatepwd_times
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `t_user_updatepwd_times`;
|
||||||
|
CREATE TABLE `t_user_updatepwd_times` (
|
||||||
|
`id` bigint(20) NOT NULL COMMENT '主键',
|
||||||
|
`user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户ID',
|
||||||
|
`times` int(11) NOT NULL COMMENT '次数',
|
||||||
|
`date` date NOT NULL COMMENT '日期',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户当月修改密ç 次数' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
1
pom.xml
1
pom.xml
|
@ -180,7 +180,6 @@
|
||||||
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
<version>${pagehelper-version}</version>
|
<version>${pagehelper-version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue