diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl index d038c49..a8450b6 100644 --- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl +++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl @@ -6,7 +6,7 @@ var dc = toDashCase(lcc); var pageVueName = ucc + ".vue"; var formVueName = ucc + "Form.vue"; -var pageTsName = dc + ".ts"; +var pageTsName = "page.ts"; var apiTsName = dc + "-api.ts"; var dTsName = dc + ".d.ts"; %> diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl index 5548772..a593cd0 100644 --- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl +++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl @@ -6,7 +6,7 @@ var dc = toDashCase(lcc); var pageVueName = ucc + ".vue"; var formVueName = ucc + "Form.vue"; -var pageTsName = dc + ".ts"; +var pageTsName = "page.ts"; var apiTsName = dc + "-api.ts"; var dTsName = dc + ".d.ts"; %> diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl index 6d9ab11..59a5594 100644 --- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl +++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl @@ -6,7 +6,7 @@ var dc = toDashCase(lcc); var pageVueName = ucc + ".vue"; var formVueName = ucc + "Form.vue"; -var pageTsName = dc + ".ts"; +var pageTsName = "page.ts"; var apiTsName = dc + "-api.ts"; var dTsName = dc + ".d.ts"; %> diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl index a00a8d1..a331378 100644 --- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl +++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl @@ -6,7 +6,7 @@ var dc = toDashCase(lcc); var pageVueName = ucc + ".vue"; var formVueName = ucc + "Form.vue"; -var pageTsName = dc + ".ts"; +var pageTsName = "page.ts"; var apiTsName = dc + "-api.ts"; var dTsName = dc + ".d.ts"; %> diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl index fe75122..98e867e 100644 --- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl +++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl @@ -6,7 +6,7 @@ var dc = toDashCase(lcc); var pageVueName = ucc + ".vue"; var formVueName = ucc + "Form.vue"; -var pageTsName = dc + ".ts"; +var pageTsName = "page.ts"; var apiTsName = dc + "-api.ts"; var dTsName = dc + ".d.ts"; %> diff --git a/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java b/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java index 1574587..ff411b7 100644 --- a/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java +++ b/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java @@ -1,5 +1,7 @@ package com.njzscloud.common.mvc.validator; public interface Constrained { - ValidRule[] rules(); + default ValidRule[] rules() { + return new ValidRule[0]; + } } diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java index 6f12a7f..f7f2be9 100644 --- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java +++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java @@ -3,6 +3,7 @@ package com.njzscloud.common.security.config; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import com.njzscloud.common.security.controller.PermissionController; +import com.njzscloud.common.security.controller.VerificationCodeController; import com.njzscloud.common.security.handler.AccessDeniedExceptionHandler; import com.njzscloud.common.security.handler.AuthExceptionHandler; import com.njzscloud.common.security.handler.LogoutPostHandler; @@ -16,7 +17,6 @@ import com.njzscloud.common.security.permission.DefaultPermissionLoader; import com.njzscloud.common.security.permission.PermissionLoader; import com.njzscloud.common.security.permission.PermissionManager; import com.njzscloud.common.security.support.*; -import com.njzscloud.common.security.support.controller.VerificationCodeController; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java similarity index 93% rename from njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java rename to njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java index 1f0314a..27f5ccb 100644 --- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java +++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java @@ -1,4 +1,4 @@ -package com.njzscloud.common.security.support.controller; +package com.njzscloud.common.security.controller; import com.njzscloud.common.core.utils.R; import com.njzscloud.common.security.support.VerificationCodeService; diff --git a/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java b/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java index b5083ea..7556e68 100644 --- a/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java +++ b/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java @@ -18,6 +18,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.aop.support.AopUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -26,12 +27,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; +import javax.sql.DataSource; import java.lang.reflect.Method; import java.util.HashSet; import java.util.concurrent.ThreadPoolExecutor; @Slf4j @Configuration +@ConditionalOnBean(DataSource.class) @MapperScan("com.njzscloud.common.sichen.mapper") @ConditionalOnBooleanProperty(prefix = "sichen.task", name = "enable") @EnableConfigurationProperties(TaskProperties.class) diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java index f0e3271..ad5b118 100644 --- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java +++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java @@ -28,10 +28,9 @@ public class WechatUtil { public synchronized static void auth() { if (tokenExpTime <= new Date().getTime() / 1000 + 60) { GetAccessTokenResult getAccessTokenResult = API.getAccessToken(new GetAccessTokenParam()); + Assert.isTrue(getAccessTokenResult.isSucc(), () -> Exceptions.error("微信登录失败")); accessToken = getAccessTokenResult.getAccess_token(); Integer expiresIn = getAccessTokenResult.getExpires_in(); - Assert.notBlank(accessToken, () -> Exceptions.error("微信登录失败")); - Assert.notNull(expiresIn, () -> Exceptions.error("微信登录失败")); tokenExpTime = new Date().getTime() / 1000 + expiresIn; } } diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java index cb2940a..df11491 100644 --- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java +++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java @@ -1,5 +1,6 @@ package com.njzscloud.common.wechat.result; +import cn.hutool.core.util.StrUtil; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -17,6 +18,6 @@ public class Code2SessionResult { private Integer errcode; public boolean isSucc() { - return errcode != null && errcode == 0; + return (errcode != null && errcode == 0) || StrUtil.isNotBlank(openid); } } diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java index 0836c36..91a62a0 100644 --- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java +++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java @@ -1,5 +1,6 @@ package com.njzscloud.common.wechat.result; +import cn.hutool.core.util.StrUtil; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -12,4 +13,8 @@ import lombok.experimental.Accessors; public class GetAccessTokenResult { private String access_token; private Integer expires_in; + + public boolean isSucc() { + return StrUtil.isNotBlank(access_token) && (expires_in != null && expires_in > 0); + } } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/controller/EndpointController.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/controller/EndpointController.java index cde1e60..86ecbb1 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/controller/EndpointController.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/controller/EndpointController.java @@ -1,20 +1,18 @@ package com.njzscloud.dispose.sys.endpoint.controller; import com.njzscloud.common.core.utils.R; -import com.njzscloud.dispose.sys.endpoint.pojo.entity.EndpointEntity; +import com.njzscloud.common.mp.support.PageParam; +import com.njzscloud.common.mp.support.PageResult; +import com.njzscloud.dispose.sys.endpoint.pojo.param.AddEndpointParam; import com.njzscloud.dispose.sys.endpoint.pojo.param.EndpointSearchParam; +import com.njzscloud.dispose.sys.endpoint.pojo.param.ModifyEndpointParam; import com.njzscloud.dispose.sys.endpoint.pojo.result.EndpointDetailResult; import com.njzscloud.dispose.sys.endpoint.service.EndpointService; -import com.njzscloud.dispose.sys.resource.pojo.result.ControllerMappingResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import java.util.*; +import java.util.List; /** * 端点信息表 @@ -26,71 +24,13 @@ import java.util.*; public class EndpointController { private final EndpointService endpointService; - private final RequestMappingHandlerMapping requestMappingHandlerMapping; - - public List scanAllControllerMappings() { - List result = new ArrayList<>(); - - // 1. 获取所有RequestMappingInfo(包含映射规则)和对应的HandlerMethod - Map handlerMethods = requestMappingHandlerMapping.getHandlerMethods(); - - // 2. 遍历解析每个映射规则 - for (Map.Entry entry : handlerMethods.entrySet()) { - RequestMappingInfo requestMappingInfo = entry.getKey(); - HandlerMethod handlerMethod = entry.getValue(); - - // 封装DTO - ControllerMappingResult dto = new ControllerMappingResult(); - - // === 解析控制器类信息 === - Class controllerClass = handlerMethod.getBeanType(); - dto.setControllerClassName(controllerClass.getCanonicalName()); - - // === 解析类级@RequestMapping路径 === - RequestMapping classRequestMapping = controllerClass.getAnnotation(RequestMapping.class); - String classPath = ""; - if (classRequestMapping != null && classRequestMapping.value().length > 0) { - classPath = classRequestMapping.value()[0]; // 取第一个路径(支持数组,通常只用一个) - // 处理路径格式:确保以/开头,避免拼接错误(如类路径是endpoint → 补为/endpoint) - if (!classPath.startsWith("/")) { - classPath = "/" + classPath; - } - } - - // === 解析方法级路径 === - Set methodPatterns = requestMappingInfo.getPatternValues(); - - // 方法路径通常只有一个,取第一个即可 - String methodPath = methodPatterns.iterator().next(); - - // === 拼接完整URL === - String fullUrl = classPath + methodPath; - // 处理重复的/(如类路径/endpoint + 方法路径/add → /endpoint/add;类路径/endpoint/ + 方法路径/add → /endpoint/add) - fullUrl = fullUrl.replaceAll("//+", "/"); - dto.setFullUrl(fullUrl); - - // === 解析请求方法(GET/POST等) === - RequestMethodsRequestCondition methodsCondition = requestMappingInfo.getMethodsCondition(); - Set methods = methodsCondition.getMethods(); - Optional first = methods.stream().findFirst(); - Optional s = first.map(Enum::name); - dto.setHttpMethods(s.orElse("")); - - // === 解析方法名 === - dto.setMethodName(handlerMethod.getMethod().getName()); - - result.add(dto); - } - - return result; - } /** * 新增 */ @PostMapping("/add") - public R add(@RequestBody EndpointEntity endpointEntity) { - endpointService.add(endpointEntity); + public R add(@RequestBody AddEndpointParam addEndpointParam) { + endpointService.add(addEndpointParam); return R.success(); } @@ -98,8 +38,8 @@ public class EndpointController { * 修改 */ @PostMapping("/modify") - public R modify(@RequestBody EndpointEntity endpointEntity) { - endpointService.modify(endpointEntity); + public R modify(@RequestBody ModifyEndpointParam modifyEndpointParam) { + endpointService.modify(modifyEndpointParam); return R.success(); } @@ -116,7 +56,7 @@ public class EndpointController { * 详情 */ @GetMapping("/detail") - public R detail(@RequestParam Long id) { + public R detail(@RequestParam("id") Long id) { return R.success(endpointService.detail(id)); } @@ -128,12 +68,19 @@ public class EndpointController { return R.success(endpointService.listAll(endpointSearchParam)); } + /** + * 分页查询 + */ + @GetMapping("/paging") + public R> paging(PageParam pageParam, EndpointSearchParam endpointSearchParam) { + return R.success(endpointService.paging(pageParam, endpointSearchParam)); + } /** * 重新加载资源 */ @GetMapping("/reload") public R reload() { - endpointService.saveAll(scanAllControllerMappings()); + endpointService.saveAll(); return R.success(); } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/AddEndpointParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/AddEndpointParam.java new file mode 100644 index 0000000..b96bd39 --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/AddEndpointParam.java @@ -0,0 +1,49 @@ +package com.njzscloud.dispose.sys.endpoint.pojo.param; + +import com.njzscloud.common.security.contant.EndpointAccessModel; +import com.njzscloud.dispose.sys.endpoint.contant.RequestMethod; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * 端点信息表 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class AddEndpointParam { + + /** + * 请求方式; 字典代码:request_method + */ + @NotNull(message = "请求方式不能为空") + private RequestMethod requestMethod; + + /** + * 路由前缀; 以 / 开头 或 为空 + */ + private String routingPath; + + /** + * 端点地址; 以 / 开头, Ant 匹配模式 + */ + @NotBlank(message = "端点地址不能为空") + private String endpointPath; + + /** + * 接口访问模式; 字典代码:endpoint_access_model + */ + @NotNull(message = "访问模式不能为空") + private EndpointAccessModel accessModel; + + /** + * 备注 + */ + private String memo; + +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/ModifyEndpointParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/ModifyEndpointParam.java new file mode 100644 index 0000000..ad33ec2 --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/pojo/param/ModifyEndpointParam.java @@ -0,0 +1,55 @@ +package com.njzscloud.dispose.sys.endpoint.pojo.param; + +import com.njzscloud.common.security.contant.EndpointAccessModel; +import com.njzscloud.dispose.sys.endpoint.contant.RequestMethod; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * 端点信息表 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class ModifyEndpointParam { + + /** + * Id + */ + @NotNull + private Long id; + + /** + * 请求方式; 字典代码:request_method + */ + @NotNull(message = "请求方式不能为空") + private RequestMethod requestMethod; + + /** + * 路由前缀; 以 / 开头 或 为空 + */ + private String routingPath; + + /** + * 端点地址; 以 / 开头, Ant 匹配模式 + */ + @NotBlank(message = "端点地址不能为空") + private String endpointPath; + + /** + * 接口访问模式; 字典代码:endpoint_access_model + */ + @NotNull(message = "访问模式不能为空") + private EndpointAccessModel accessModel; + + /** + * 备注 + */ + private String memo; + +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/service/EndpointService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/service/EndpointService.java index ff2c2d2..186c8cd 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/service/EndpointService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/endpoint/service/EndpointService.java @@ -1,25 +1,37 @@ package com.njzscloud.dispose.sys.endpoint.service; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njzscloud.common.core.ex.Exceptions; import com.njzscloud.common.core.utils.GroupUtil; +import com.njzscloud.common.mp.support.PageParam; +import com.njzscloud.common.mp.support.PageResult; import com.njzscloud.common.security.contant.EndpointAccessModel; import com.njzscloud.dispose.sys.endpoint.contant.RequestMethod; import com.njzscloud.dispose.sys.endpoint.mapper.EndpointMapper; import com.njzscloud.dispose.sys.endpoint.pojo.entity.EndpointEntity; +import com.njzscloud.dispose.sys.endpoint.pojo.param.AddEndpointParam; import com.njzscloud.dispose.sys.endpoint.pojo.param.EndpointSearchParam; +import com.njzscloud.dispose.sys.endpoint.pojo.param.ModifyEndpointParam; import com.njzscloud.dispose.sys.endpoint.pojo.result.EndpointDetailResult; +import com.njzscloud.dispose.sys.resource.contant.ResourceOrigin; +import com.njzscloud.dispose.sys.resource.pojo.entity.ResourceEntity; import com.njzscloud.dispose.sys.resource.pojo.result.ControllerMappingResult; +import com.njzscloud.dispose.sys.resource.service.ResourceService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -27,20 +39,65 @@ import java.util.stream.Collectors; */ @Slf4j @Service +@RequiredArgsConstructor public class EndpointService extends ServiceImpl implements IService { + private final ResourceService resourceService; + private final RequestMappingHandlerMapping requestMappingHandlerMapping; /** * 新增 */ - public void add(EndpointEntity endpointEntity) { + @Transactional(rollbackFor = Exception.class) + public void add(AddEndpointParam addEndpointParam) { + EndpointEntity endpointEntity = BeanUtil.copyProperties(addEndpointParam, EndpointEntity.class); + RequestMethod requestMethod = addEndpointParam.getRequestMethod(); + String endpointPath = addEndpointParam.getEndpointPath(); + boolean exists = this.exists(Wrappers.lambdaQuery() + .eq(EndpointEntity::getRequestMethod, requestMethod) + .eq(EndpointEntity::getEndpointPath, endpointPath) + ); + Assert.isFalse(exists, () -> Exceptions.exception("端点重复")); + this.save(endpointEntity); + String sn = requestMethod + endpointPath; + + resourceService.save(new ResourceEntity() + .setSn(sn) + .setDataId(endpointEntity.getId()) + .setTableName(ResourceOrigin.Endpoint.getVal()) + .setMemo("端点资源-" + requestMethod + " " + endpointPath)); } /** * 修改 */ - public void modify(EndpointEntity endpointEntity) { + @Transactional(rollbackFor = Exception.class) + public void modify(ModifyEndpointParam modifyEndpointParam) { + Long id = modifyEndpointParam.getId(); + EndpointEntity oldData = this.getById(id); + Assert.notNull(oldData, () -> Exceptions.exception("要修改的数据不存在")); + + RequestMethod requestMethod = modifyEndpointParam.getRequestMethod(); + String endpointPath = modifyEndpointParam.getEndpointPath(); + + boolean exists = this.exists(Wrappers.lambdaQuery() + .eq(EndpointEntity::getRequestMethod, requestMethod) + .eq(EndpointEntity::getEndpointPath, endpointPath) + .ne(EndpointEntity::getId, id) + ); + Assert.isFalse(exists, () -> Exceptions.exception("端点重复")); + + EndpointEntity endpointEntity = BeanUtil.copyProperties(modifyEndpointParam, EndpointEntity.class); this.updateById(endpointEntity); + + String sn = requestMethod + endpointPath; + + resourceService.update(Wrappers.lambdaUpdate() + .eq(ResourceEntity::getTableName, ResourceOrigin.Endpoint.getVal()) + .eq(ResourceEntity::getDataId, id) + .set(ResourceEntity::getMemo, "端点资源-" + requestMethod + " " + endpointPath) + .set(ResourceEntity::getSn, sn) + ); } /** @@ -48,22 +105,39 @@ public class EndpointService extends ServiceImpl */ @Transactional(rollbackFor = Exception.class) public void del(List ids) { + boolean occupied = resourceService.occupied(ids, ResourceOrigin.Endpoint); + Assert.isFalse(occupied, () -> Exceptions.exception("端点已被分配,不能删除")); + this.removeBatchByIds(ids); + resourceService.delRes(ids, ResourceOrigin.Endpoint); } /** * 详情 */ - public EndpointEntity detail(Long id) { - return this.getById(id); + public EndpointDetailResult detail(Long id) { + EndpointEntity endpointEntity = this.getById(id); + return BeanUtil.copyProperties(endpointEntity, EndpointDetailResult.class); + } + + /** + * 分页查询 + */ + public PageResult paging(PageParam pageParam, EndpointSearchParam endpointSearchParam) { + String endpointPath = endpointSearchParam.getEndpointPath(); + return PageResult.of(this.page(pageParam.toPage(), Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(endpointPath), EndpointEntity::getEndpointPath, endpointPath) + .orderByAsc(EndpointEntity::getRequestMethod, EndpointEntity::getRoutingPath, EndpointEntity::getEndpointPath) + ).convert(it -> BeanUtil.copyProperties(it, EndpointDetailResult.class))); } /** * 查询所有 */ public List listAll(EndpointSearchParam endpointSearchParam) { + String endpointPath = endpointSearchParam.getEndpointPath(); return this.list(Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(endpointSearchParam.getEndpointPath()), EndpointEntity::getEndpointPath, endpointSearchParam.getEndpointPath()) + .like(StrUtil.isNotBlank(endpointPath), EndpointEntity::getEndpointPath, endpointPath) .orderByAsc(EndpointEntity::getRequestMethod, EndpointEntity::getRoutingPath, EndpointEntity::getEndpointPath) ) .stream() @@ -72,7 +146,8 @@ public class EndpointService extends ServiceImpl } @Transactional(rollbackFor = Exception.class) - public void saveAll(List controllerMappingResults) { + public void saveAll() { + List controllerMappingResults = scanAllControllerMappings(); List oldEndpoints = this.list(); Map map = GroupUtil.k_o(oldEndpoints, it -> it.getRequestMethod() + it.getEndpointPath()); Set endpointPaths = map.keySet(); @@ -89,5 +164,62 @@ public class EndpointService extends ServiceImpl .toList(); this.saveBatch(list); + List resourceEntities = list.stream().map(it -> { + RequestMethod requestMethod = it.getRequestMethod(); + String endpointPath = it.getEndpointPath(); + return new ResourceEntity() + .setSn(requestMethod + endpointPath) + .setDataId(it.getId()) + .setTableName(ResourceOrigin.Endpoint.getVal()) + .setMemo("接口资源-" + requestMethod + " " + endpointPath) + ; + }).toList(); + + resourceService.saveBatch(resourceEntities); + } + + public List scanAllControllerMappings() { + List result = new ArrayList<>(); + + // 1. 获取所有RequestMappingInfo(包含映射规则)和对应的HandlerMethod + Map handlerMethods = requestMappingHandlerMapping.getHandlerMethods(); + + // 2. 遍历解析每个映射规则 + for (Map.Entry entry : handlerMethods.entrySet()) { + RequestMappingInfo requestMappingInfo = entry.getKey(); + HandlerMethod handlerMethod = entry.getValue(); + + // 封装DTO + ControllerMappingResult dto = new ControllerMappingResult(); + + // === 解析控制器类信息 === + Class controllerClass = handlerMethod.getBeanType(); + dto.setControllerClassName(controllerClass.getCanonicalName()); + + // === 解析方法级路径 === + Set methodPatterns = requestMappingInfo.getPatternValues(); + + // 方法路径通常只有一个,取第一个即可 + + // === 拼接完整URL === + String fullUrl = methodPatterns.iterator().next(); + // 处理重复的/(如类路径/endpoint + 方法路径/add → /endpoint/add;类路径/endpoint/ + 方法路径/add → /endpoint/add) + fullUrl = fullUrl.replaceAll("//+", "/"); + dto.setFullUrl(fullUrl); + + // === 解析请求方法(GET/POST等) === + RequestMethodsRequestCondition methodsCondition = requestMappingInfo.getMethodsCondition(); + Set methods = methodsCondition.getMethods(); + Optional first = methods.stream().findFirst(); + Optional s = first.map(Enum::name); + dto.setHttpMethods(s.orElse("")); + + // === 解析方法名 === + dto.setMethodName(handlerMethod.getMethod().getName()); + + result.add(dto); + } + + return result; } } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/menu/service/MenuService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/menu/service/MenuService.java index 750198e..5c67a5f 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/menu/service/MenuService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/menu/service/MenuService.java @@ -21,8 +21,8 @@ import com.njzscloud.dispose.sys.menu.pojo.result.MenuDetailResult; import com.njzscloud.dispose.sys.resource.contant.ResourceOrigin; import com.njzscloud.dispose.sys.resource.pojo.entity.ResourceEntity; import com.njzscloud.dispose.sys.resource.service.ResourceService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,10 +35,10 @@ import java.util.stream.Collectors; */ @Slf4j @Service +@RequiredArgsConstructor public class MenuService extends ServiceImpl implements IService { - @Autowired - private ResourceService resourceService; + private final ResourceService resourceService; /** * 新增 diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/contant/ResourceOrigin.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/contant/ResourceOrigin.java index bc2524a..1a11c96 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/contant/ResourceOrigin.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/contant/ResourceOrigin.java @@ -11,7 +11,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum ResourceOrigin implements DictStr { Menu("sys_menu", "菜单"), - Endpoint("sys_endpoint", "接口"), + Endpoint("sys_endpoint", "端点"), ; private final String val; diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/cotroller/ResourceController.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/cotroller/ResourceController.java index 4dd786b..d0ceecd 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/cotroller/ResourceController.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/cotroller/ResourceController.java @@ -37,8 +37,11 @@ public class ResourceController { } @GetMapping("/list_role_res") - public R> listRoleRes(@RequestParam(value = "roleId") String roleId) { - return R.success(resourceService.listRoleRes(roleId)); + public R> listRoleRes( + @RequestParam(value = "roleId") String roleId, + @RequestParam(value = "tableName", required = false) String tableName + ) { + return R.success(resourceService.listRoleRes(roleId, tableName)); } } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/mapper/ResourceMapper.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/mapper/ResourceMapper.java index c2cf1bd..178dac2 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/mapper/ResourceMapper.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/mapper/ResourceMapper.java @@ -17,7 +17,7 @@ import java.util.List; public interface ResourceMapper extends BaseMapper { List occupied(@Param(Constants.WRAPPER) QueryWrapper ew); - List listRoleRes(@Param("roleId") String roleId); + List listRoleRes(@Param("ew") QueryWrapper ew); List loadPermission(); diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/service/ResourceService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/service/ResourceService.java index 4569631..3e2a4c2 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/service/ResourceService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/resource/service/ResourceService.java @@ -1,5 +1,6 @@ package com.njzscloud.dispose.sys.resource.service; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -43,8 +44,10 @@ public class ResourceService extends ServiceImpl return !roles.isEmpty(); } - public List listRoleRes(String roleId) { - return baseMapper.listRoleRes(roleId); + public List listRoleRes(String roleId, String tableName) { + return baseMapper.listRoleRes(Wrappers.query() + .eq("b.role_id", roleId) + .eq(StrUtil.isNotBlank(tableName), "a.table_name", tableName)); } @Override diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/user/pojo/param/UserRegisterParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/user/pojo/param/UserRegisterParam.java index 029958b..830ca45 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/user/pojo/param/UserRegisterParam.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/user/pojo/param/UserRegisterParam.java @@ -25,10 +25,12 @@ import java.util.List; @ToString @Accessors(chain = true) public class UserRegisterParam implements Constrained { + @NotNull(message = "鉴权方式不能为空") private AuthWay authWay; /** * 昵称 */ + @NotBlank(message = "姓名不能为空") private String nickname; /** * 邮箱 @@ -37,6 +39,7 @@ public class UserRegisterParam implements Constrained { /** * 手机号 */ + @NotBlank(message = "手机号不能为空") private String phone; /** * 头像 @@ -56,12 +59,14 @@ public class UserRegisterParam implements Constrained { /** * 客户信息 */ + @Valid @NotNull(message = "客户信息不能为空") private Customer customer; /** * 组织信息 */ + @Valid private Org org; /** @@ -72,7 +77,6 @@ public class UserRegisterParam implements Constrained { @Override public ValidRule[] rules() { return new ValidRule[]{ - ValidRule.of(() -> StrUtil.isNotBlank(nickname), "用户昵称不能为空"), ValidRule.of(() -> account != null, "账号信息不能为空"), ValidRule.of(() -> !customer.getManager() || org != null, "组织信息不能为空"), }; @@ -90,6 +94,7 @@ public class UserRegisterParam implements Constrained { /** * 用户名 */ + @NotBlank(message = "账号不能为空") private String username; /** * 手机号 @@ -98,6 +103,7 @@ public class UserRegisterParam implements Constrained { /** * 密码 */ + @NotBlank(message = "密码不能为空") private String secret; /** * 微信 openid @@ -124,7 +130,7 @@ public class UserRegisterParam implements Constrained { @Setter @Constraint @Accessors(chain = true) - public static class Customer { + public static class Customer implements Constrained { private Long userId; /** @@ -161,7 +167,7 @@ public class UserRegisterParam implements Constrained { @Setter @Constraint @Accessors(chain = true) - public static class Org { + public static class Org implements Constrained { /** * 组织 Id,加入企业时必填 diff --git a/njzscloud-svr/src/main/resources/application-dev.yml b/njzscloud-svr/src/main/resources/application-dev.yml index 41aa0e4..6f36984 100644 --- a/njzscloud-svr/src/main/resources/application-dev.yml +++ b/njzscloud-svr/src/main/resources/application-dev.yml @@ -7,6 +7,7 @@ spring: auth-allows: - /oss/** - /endpoint/reload + - /permission/refresh_cache oss: type: ali diff --git a/njzscloud-svr/src/main/resources/mapper/sys/resource/ResourceMapper.xml b/njzscloud-svr/src/main/resources/mapper/sys/resource/ResourceMapper.xml index fcf90ab..09808b6 100644 --- a/njzscloud-svr/src/main/resources/mapper/sys/resource/ResourceMapper.xml +++ b/njzscloud-svr/src/main/resources/mapper/sys/resource/ResourceMapper.xml @@ -19,7 +19,9 @@ a.memo FROM sys_resource a INNER JOIN sys_role_resource b ON b.res_id = a.id - WHERE b.role_id = ${roleId} + + ${ew.customSqlSegment} +