动态路由

This commit is contained in:
dengqichen 2025-10-31 22:42:39 +08:00
parent 563c189d8d
commit f8e520e2fc
3 changed files with 22 additions and 28 deletions

View File

@ -4,53 +4,36 @@ import com.qqchen.deploy.backend.deploy.dto.TeamDTO;
import com.qqchen.deploy.backend.deploy.entity.Team; import com.qqchen.deploy.backend.deploy.entity.Team;
import com.qqchen.deploy.backend.deploy.query.TeamQuery; import com.qqchen.deploy.backend.deploy.query.TeamQuery;
import com.qqchen.deploy.backend.deploy.service.ITeamService; import com.qqchen.deploy.backend.deploy.service.ITeamService;
import com.qqchen.deploy.backend.framework.api.Response;
import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.framework.controller.BaseController;
import com.qqchen.deploy.backend.framework.security.annotation.CheckPermission;
import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
/** /**
* 团队API控制器 * 团队API控制器
* 继承 BaseController 自动具有基础CRUD权限
* - deploy:team:create (创建)
* - deploy:team:update (修改)
* - deploy:team:delete (删除)
* - deploy:team:view (详情)
* - deploy:team:list (列表/分页/导出)
*/ */
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/api/v1/teams") @RequestMapping("/api/v1/teams")
@PermissionPrefix("deploy:team") // 定义权限前缀 @PermissionPrefix("deploy:team")
@Tag(name = "团队管理", description = "团队的增删改查接口") @Tag(name = "团队管理", description = "团队的增删改查接口")
public class TeamApiController extends BaseController<Team, TeamDTO, Long, TeamQuery> { public class TeamApiController extends BaseController<Team, TeamDTO, Long, TeamQuery> {
@Resource @Resource
private ITeamService teamService; private ITeamService teamService;
// 需要 "deploy:team:create" 权限
@Override
@CheckPermission("create")
public Response<TeamDTO> create(@RequestBody @Valid TeamDTO dto) {
return super.create(dto);
}
// 需要 "deploy:team:update" 权限
@Override
@CheckPermission("update")
public Response<TeamDTO> update(@PathVariable Long id, @RequestBody @Valid TeamDTO dto) {
return super.update(id, dto);
}
// 需要 "deploy:team:delete" 权限
@Override
@CheckPermission("delete")
public Response<Void> delete(@PathVariable Long id) {
return super.delete(id);
}
@Override @Override
protected void exportData(HttpServletResponse response, List<TeamDTO> data) { protected void exportData(HttpServletResponse response, List<TeamDTO> data) {
// TODO: 实现导出功能 // TODO: 实现导出功能

View File

@ -4,6 +4,7 @@ import com.qqchen.deploy.backend.framework.domain.Entity;
import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.framework.dto.BaseDTO;
import com.qqchen.deploy.backend.framework.query.BaseQuery; import com.qqchen.deploy.backend.framework.query.BaseQuery;
import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.api.Response;
import com.qqchen.deploy.backend.framework.security.annotation.CheckPermission;
import com.qqchen.deploy.backend.framework.service.IBaseService; import com.qqchen.deploy.backend.framework.service.IBaseService;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -16,6 +17,8 @@ import java.util.concurrent.CompletableFuture;
/** /**
* 通用REST控制器 * 通用REST控制器
* 所有继承此类的Controller自动具有基础CRUD权限控制
* 需要在子类上添加 @PermissionPrefix 注解指定权限前缀
*/ */
@Validated @Validated
public abstract class BaseController<T extends Entity<ID>, D extends BaseDTO, ID extends Serializable, Q extends BaseQuery> { public abstract class BaseController<T extends Entity<ID>, D extends BaseDTO, ID extends Serializable, Q extends BaseQuery> {
@ -23,42 +26,50 @@ public abstract class BaseController<T extends Entity<ID>, D extends BaseDTO, ID
protected IBaseService<T, D, Q, ID> service; protected IBaseService<T, D, Q, ID> service;
@PostMapping @PostMapping
@CheckPermission("create")
public Response<D> create(@Validated @RequestBody D dto) { public Response<D> create(@Validated @RequestBody D dto) {
return Response.success(service.create(dto)); return Response.success(service.create(dto));
} }
@PutMapping("/{id}") @PutMapping("/{id}")
@CheckPermission("update")
public Response<D> update(@PathVariable ID id, @Validated @RequestBody D dto) { public Response<D> update(@PathVariable ID id, @Validated @RequestBody D dto) {
return Response.success(service.update(id, dto)); return Response.success(service.update(id, dto));
} }
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@CheckPermission("delete")
public Response<Void> delete(@PathVariable ID id) { public Response<Void> delete(@PathVariable ID id) {
service.delete(id); service.delete(id);
return Response.success(); return Response.success();
} }
@GetMapping("/{id}") @GetMapping("/{id}")
@CheckPermission("view")
public Response<D> findById(@PathVariable ID id) { public Response<D> findById(@PathVariable ID id) {
return Response.success(service.findById(id)); return Response.success(service.findById(id));
} }
@GetMapping @GetMapping
@CheckPermission("list")
public Response<List<D>> findAll() { public Response<List<D>> findAll() {
return Response.success(service.findAll()); return Response.success(service.findAll());
} }
@GetMapping("/page") @GetMapping("/page")
@CheckPermission("list")
public Response<Page<D>> page(Q query) { public Response<Page<D>> page(Q query) {
return Response.success(service.page(query)); return Response.success(service.page(query));
} }
@GetMapping("/list") @GetMapping("/list")
@CheckPermission("list")
public Response<List<D>> findAll(Q query) { public Response<List<D>> findAll(Q query) {
return Response.success(service.findAll(query)); return Response.success(service.findAll(query));
} }
@PostMapping("/batch") @PostMapping("/batch")
@CheckPermission("create")
public CompletableFuture<Response<Void>> batchProcess(@RequestBody List<D> dtos) { public CompletableFuture<Response<Void>> batchProcess(@RequestBody List<D> dtos) {
return CompletableFuture.runAsync(() -> { return CompletableFuture.runAsync(() -> {
service.batchProcess(dtos); service.batchProcess(dtos);
@ -66,6 +77,7 @@ public abstract class BaseController<T extends Entity<ID>, D extends BaseDTO, ID
} }
@GetMapping("/export") @GetMapping("/export")
@CheckPermission("list")
public void export(HttpServletResponse response, Q query) { public void export(HttpServletResponse response, Q query) {
List<D> data = service.findAll(query); List<D> data = service.findAll(query);
exportData(response, data); exportData(response, data);

View File

@ -79,8 +79,7 @@ public class PermissionCheckAspect {
if (!hasPermission) { if (!hasPermission) {
log.warn("权限检查失败: user={}, required={}", log.warn("权限检查失败: user={}, required={}",
authentication.getName(), requiredPermission); authentication.getName(), requiredPermission);
throw new BusinessException(ResponseCode.FORBIDDEN, throw new BusinessException(ResponseCode.FORBIDDEN);
new Object[]{"缺少权限: " + requiredPermission});
} }
log.debug("权限检查通过: {}", requiredPermission); log.debug("权限检查通过: {}", requiredPermission);