diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java index 85481dc0..e581fcbe 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java @@ -8,23 +8,64 @@ import com.qqchen.deploy.backend.deploy.service.IApplicationService; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; @Tag(name = "应用管理", description = "应用管理相关接口") @RestController @RequestMapping("/api/v1/applications") -@PermissionPrefix("deploy:application") public class ApplicationApiController extends BaseController { @Resource private IApplicationService applicationService; + + @Override + public Response create(ApplicationDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, ApplicationDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(ApplicationQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(ApplicationQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出逻辑 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java index a6d9b39e..36a80dea 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java @@ -3,15 +3,17 @@ package com.qqchen.deploy.backend.deploy.api; import com.qqchen.deploy.backend.deploy.dto.ApplicationCategoryDTO; import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; import com.qqchen.deploy.backend.deploy.query.ApplicationCategoryQuery; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 应用分类API控制器 @@ -19,10 +21,55 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/application-category") -@PermissionPrefix("deploy:application-category") @Tag(name = "应用分类管理", description = "应用分类的增删改查接口") public class ApplicationCategoryApiController extends BaseController { - + + + @Override + public Response create(ApplicationCategoryDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, ApplicationCategoryDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(ApplicationCategoryQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(ApplicationCategoryQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + + @Override + public void export(HttpServletResponse response, ApplicationCategoryQuery query) { + super.export(response, query); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java index 0a51338b..c3153e93 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java @@ -3,14 +3,16 @@ package com.qqchen.deploy.backend.deploy.api; import com.qqchen.deploy.backend.deploy.dto.EnvironmentDTO; import com.qqchen.deploy.backend.deploy.entity.Environment; import com.qqchen.deploy.backend.deploy.query.EnvironmentQuery; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 环境管理API控制器 @@ -18,9 +20,49 @@ import java.util.List; @Tag(name = "环境管理", description = "环境管理相关接口") @RestController @RequestMapping("/api/v1/environments") -@PermissionPrefix("deploy:environment") public class EnvironmentApiController extends BaseController { + + @Override + public Response create(EnvironmentDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, EnvironmentDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(EnvironmentQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(EnvironmentQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出逻辑 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ExternalSystemApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ExternalSystemApiController.java index 88cc937a..97e46949 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ExternalSystemApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ExternalSystemApiController.java @@ -9,13 +9,14 @@ import com.qqchen.deploy.backend.deploy.service.IExternalSystemService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 外部系统管理API控制器 @@ -31,13 +32,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/external-system") -@PermissionPrefix("resource:external") @Tag(name = "第三方系统管理API", description = "对外提供的第三方系统管理接口") public class ExternalSystemApiController extends BaseController { @Resource private IExternalSystemService externalSystemService; + @Override + public Response create(ExternalSystemDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, ExternalSystemDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(ExternalSystemQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(ExternalSystemQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "测试连接") @GetMapping("/{id}/test-connection") public Response testConnection( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsBuildApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsBuildApiController.java index d49ba091..f6df72b3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsBuildApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsBuildApiController.java @@ -7,16 +7,16 @@ import com.qqchen.deploy.backend.deploy.dto.JenkinsBuildDTO; import com.qqchen.deploy.backend.deploy.query.JenkinsBuildQuery; import com.qqchen.deploy.backend.deploy.service.IJenkinsBuildService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; + import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Jenkins构建信息 Controller @@ -24,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/jenkins-build") -@PermissionPrefix("resource:jenkins-build") @Tag(name = "Jenkins构建信息管理", description = "Jenkins构建信息管理相关接口") public class JenkinsBuildApiController extends BaseController { - + @Resource private IJenkinsBuildService jenkinsBuildService; + @Override + public Response create(JenkinsBuildDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, JenkinsBuildDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(JenkinsBuildQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(JenkinsBuildQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Jenkins构建", description = "异步同步,支持三种模式:1)只传externalSystemId-全量同步 2)传externalSystemId+viewId-同步视图 3)传externalSystemId+viewId+jobId-同步单个任务") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsJobApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsJobApiController.java index 9f0f1716..441247d1 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsJobApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsJobApiController.java @@ -7,16 +7,16 @@ import com.qqchen.deploy.backend.deploy.dto.JenkinsJobDTO; import com.qqchen.deploy.backend.deploy.query.JenkinsJobQuery; import com.qqchen.deploy.backend.deploy.service.IJenkinsJobService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; + import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Jenkins工作 Controller @@ -24,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/jenkins-job") -@PermissionPrefix("resource:jenkins-job") @Tag(name = "Jenkins工作管理", description = "Jenkins工作管理相关接口") public class JenkinsJobApiController extends BaseController { - + @Resource private IJenkinsJobService jenkinsJobService; + @Override + public Response create(JenkinsJobDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, JenkinsJobDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(JenkinsJobQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(JenkinsJobQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Jenkins任务", description = "异步同步,支持两种模式:1)只传externalSystemId-全量同步 2)传externalSystemId+viewId-同步指定视图") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java index 62d87cec..712aa362 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java @@ -1,16 +1,19 @@ package com.qqchen.deploy.backend.deploy.api; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.deploy.entity.JenkinsSyncHistory; import com.qqchen.deploy.backend.deploy.dto.JenkinsSyncHistoryDTO; import com.qqchen.deploy.backend.deploy.query.JenkinsSyncHistoryQuery; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletResponse; + import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Jenkin同步日志 Controller @@ -18,10 +21,50 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/jenkins-sync-history") -@PermissionPrefix("resource:jenkins-sync") @Tag(name = "Jenkin同步日志管理", description = "Jenkin同步日志管理相关接口") public class JenkinsSyncHistoryApiController extends BaseController { - + + + @Override + public Response create(JenkinsSyncHistoryDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, JenkinsSyncHistoryDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(JenkinsSyncHistoryQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(JenkinsSyncHistoryQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出逻辑 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsViewApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsViewApiController.java index d1d926ad..1008d8c3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsViewApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsViewApiController.java @@ -7,16 +7,16 @@ import com.qqchen.deploy.backend.deploy.dto.JenkinsViewDTO; import com.qqchen.deploy.backend.deploy.query.JenkinsViewQuery; import com.qqchen.deploy.backend.deploy.service.IJenkinsViewService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; + import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Jenkins视图 Controller @@ -24,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/jenkins-view") -@PermissionPrefix("resource:jenkins-view") @Tag(name = "Jenkins视图管理", description = "Jenkins视图管理相关接口") public class JenkinsViewApiController extends BaseController { - + @Resource private IJenkinsViewService jenkinsViewService; + @Override + public Response create(JenkinsViewDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, JenkinsViewDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(JenkinsViewQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(JenkinsViewQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Jenkins视图", description = "异步同步指定外部系统的所有Jenkins视图,立即返回") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryBranchApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryBranchApiController.java index 81d2d572..ef7b917c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryBranchApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryBranchApiController.java @@ -7,17 +7,16 @@ import com.qqchen.deploy.backend.deploy.service.IRepositoryBranchService; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Git仓库分支管理接口 @@ -25,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/repository-branch") -@PermissionPrefix("resource:repository-branch") @Tag(name = "Git仓库分支管理", description = "Git仓库分支管理相关接口") public class RepositoryBranchApiController extends BaseController { @Resource private IRepositoryBranchService repositoryBranchService; + @Override + public Response create(RepositoryBranchDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, RepositoryBranchDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(RepositoryBranchQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(RepositoryBranchQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Git分支", description = "异步同步,支持三种模式:1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步仓库组 3)传externalSystemId+repoGroupId+repoProjectId-同步单个项目") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java index 950ee164..77781ebc 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java @@ -7,17 +7,16 @@ import com.qqchen.deploy.backend.deploy.service.IRepositoryGroupService; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Git仓库组Controller @@ -25,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/repository-group") -@PermissionPrefix("resource:repository-group") @Tag(name = "Git仓库组管理", description = "Git仓库组管理相关接口") public class RepositoryGroupApiController extends BaseController { @Resource private IRepositoryGroupService repositoryGroupService; + @Override + public Response create(RepositoryGroupDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, RepositoryGroupDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(RepositoryGroupQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(RepositoryGroupQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Git仓库组", description = "异步同步指定外部系统的所有仓库组,立即返回") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryProjectApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryProjectApiController.java index c46ad7de..a2afa9fb 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryProjectApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryProjectApiController.java @@ -7,17 +7,16 @@ import com.qqchen.deploy.backend.deploy.service.IRepositoryProjectService; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * Git仓库项目管理接口 @@ -25,13 +24,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/repository-project") -@PermissionPrefix("resource:repository-project") @Tag(name = "Git仓库项目管理", description = "Git仓库项目管理相关接口") public class RepositoryProjectApiController extends BaseController { @Resource private IRepositoryProjectService repositoryProjectService; + @Override + public Response create(RepositoryProjectDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, RepositoryProjectDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(RepositoryProjectQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(RepositoryProjectQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "同步Git项目", description = "异步同步,支持两种模式:1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步单个仓库组") @PostMapping("/sync") public Response sync( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerApiController.java index 31692431..3f748949 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerApiController.java @@ -10,14 +10,15 @@ import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 服务器管理 Controller @@ -25,14 +26,53 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/server") -@PermissionPrefix("deploy:server") @Tag(name = "服务器管理", description = "服务器管理相关接口") -public class ServerApiController +public class ServerApiController extends BaseController { @Resource private IServerService serverService; + @Override + public Response create(ServerDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, ServerDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(ServerQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(ServerQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "初始化服务器硬件信息", description = "前端SSH采集服务器硬件信息后回调此接口") @PostMapping("/{id}/initialize") public Response initializeServerInfo( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerCategoryApiController.java index d7c7e6d4..9752c6e0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerCategoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ServerCategoryApiController.java @@ -4,16 +4,18 @@ import com.qqchen.deploy.backend.deploy.dto.ServerCategoryDTO; import com.qqchen.deploy.backend.deploy.entity.ServerCategory; import com.qqchen.deploy.backend.deploy.query.ServerCategoryQuery; import com.qqchen.deploy.backend.deploy.service.IServerCategoryService; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 服务器分类 Controller @@ -21,14 +23,53 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/server-category") -@PermissionPrefix("deploy:server-category") @Tag(name = "服务器分类管理", description = "服务器分类管理相关接口") -public class ServerCategoryApiController +public class ServerCategoryApiController extends BaseController { @Resource private IServerCategoryService serverCategoryService; + @Override + public Response create(ServerCategoryDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, ServerCategoryDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(ServerCategoryQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(ServerCategoryQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { log.info("导出服务器分类数据,数据量:{}", data.size()); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApiController.java index 91f1d367..33031956 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApiController.java @@ -4,16 +4,18 @@ import com.qqchen.deploy.backend.deploy.dto.TeamDTO; import com.qqchen.deploy.backend.deploy.entity.Team; import com.qqchen.deploy.backend.deploy.query.TeamQuery; 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.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 团队API控制器 @@ -27,13 +29,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/teams") -@PermissionPrefix("deploy:team") @Tag(name = "团队管理", description = "团队的增删改查接口") public class TeamApiController extends BaseController { @Resource private ITeamService teamService; + @Override + public Response create(TeamDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, TeamDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(TeamQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(TeamQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApplicationApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApplicationApiController.java index 516ebb2a..3e2762cd 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApplicationApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamApplicationApiController.java @@ -4,16 +4,18 @@ import com.qqchen.deploy.backend.deploy.dto.TeamApplicationDTO; import com.qqchen.deploy.backend.deploy.entity.TeamApplication; import com.qqchen.deploy.backend.deploy.query.TeamApplicationQuery; import com.qqchen.deploy.backend.deploy.service.ITeamApplicationService; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 团队应用关联API控制器 @@ -21,13 +23,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/team-applications") -@PermissionPrefix("deploy:team-application") @Tag(name = "团队应用关联管理", description = "团队应用关联的增删改查接口") public class TeamApplicationApiController extends BaseController { @Resource private ITeamApplicationService teamApplicationService; + @Override + public Response create(TeamApplicationDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, TeamApplicationDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(TeamApplicationQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(TeamApplicationQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamConfigApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamConfigApiController.java index 5ca9bba6..c27366ce 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamConfigApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamConfigApiController.java @@ -7,20 +7,19 @@ import com.qqchen.deploy.backend.deploy.service.ITeamConfigService; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 团队配置API控制器 @@ -31,17 +30,56 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/team-configs") -@PermissionPrefix("deploy:team-config") @Tag(name = "团队配置管理", description = "团队配置的增删改查接口") public class TeamConfigApiController extends BaseController { @Resource private ITeamConfigService teamConfigService; + @Override + public Response create(TeamConfigDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, TeamConfigDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(TeamConfigQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(TeamConfigQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "根据团队ID获取配置", description = "获取指定团队的配置信息") @GetMapping("/team/{teamId}") public Response getByTeamId( - @Parameter(description = "团队ID", required = true) @PathVariable Long teamId + @Parameter(description = "团队ID", required = true) @PathVariable Long teamId ) { return Response.success(teamConfigService.getByTeamId(teamId)); } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamMemberApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamMemberApiController.java index 2750d4cc..c36fd0e9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamMemberApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/TeamMemberApiController.java @@ -4,16 +4,18 @@ import com.qqchen.deploy.backend.deploy.dto.TeamMemberDTO; import com.qqchen.deploy.backend.deploy.entity.TeamMember; import com.qqchen.deploy.backend.deploy.query.TeamMemberQuery; import com.qqchen.deploy.backend.deploy.service.ITeamMemberService; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 团队成员API控制器 @@ -21,13 +23,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/team-members") -@PermissionPrefix("deploy:team-member") @Tag(name = "团队成员管理", description = "团队成员的增删改查接口") public class TeamMemberApiController extends BaseController { @Resource private ITeamMemberService teamMemberService; + @Override + public Response create(TeamMemberDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, TeamMemberDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(TeamMemberQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(TeamMemberQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java index 31976432..17a73476 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/controller/BaseController.java @@ -4,8 +4,8 @@ import com.qqchen.deploy.backend.framework.domain.Entity; import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.framework.query.BaseQuery; 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 jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import org.springframework.data.domain.Page; import org.springframework.validation.annotation.Validated; @@ -17,8 +17,8 @@ import java.util.concurrent.CompletableFuture; /** * 通用REST控制器 - * 所有继承此类的Controller自动具有基础CRUD权限控制 - * 需要在子类上添加 @PermissionPrefix 注解指定权限前缀 + * 提供基础CRUD方法的默认实现 + * 子类需要重写方法并添加 @PreAuthorize 注解进行权限控制 */ @Validated public abstract class BaseController, D extends BaseDTO, ID extends Serializable, Q extends BaseQuery> { @@ -26,50 +26,42 @@ public abstract class BaseController, D extends BaseDTO, ID protected IBaseService service; @PostMapping - @CheckPermission("create") public Response create(@Validated @RequestBody D dto) { return Response.success(service.create(dto)); } @PutMapping("/{id}") - @CheckPermission("update") public Response update(@PathVariable ID id, @Validated @RequestBody D dto) { return Response.success(service.update(id, dto)); } @DeleteMapping("/{id}") - @CheckPermission("delete") public Response delete(@PathVariable ID id) { service.delete(id); return Response.success(); } @GetMapping("/{id}") - @CheckPermission("view") public Response findById(@PathVariable ID id) { return Response.success(service.findById(id)); } @GetMapping - @CheckPermission("list") public Response> findAll() { return Response.success(service.findAll()); } @GetMapping("/page") - @CheckPermission("list") public Response> page(Q query) { return Response.success(service.page(query)); } @GetMapping("/list") - @CheckPermission("list") public Response> findAll(Q query) { return Response.success(service.findAll(query)); } @PostMapping("/batch") - @CheckPermission("create") public CompletableFuture> batchProcess(@RequestBody List dtos) { return CompletableFuture.runAsync(() -> { service.batchProcess(dtos); @@ -77,7 +69,6 @@ public abstract class BaseController, D extends BaseDTO, ID } @GetMapping("/export") - @CheckPermission("list") public void export(HttpServletResponse response, Q query) { List data = service.findAll(query); exportData(response, data); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/enums/ResponseCode.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/enums/ResponseCode.java index 7d77e285..bb6cddce 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/enums/ResponseCode.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/enums/ResponseCode.java @@ -66,6 +66,7 @@ public enum ResponseCode { PERMISSION_NAME_EXISTS(2402, "permission.name.exists"), PERMISSION_ALREADY_ASSIGNED(2403, "permission.already.assigned"), PERMISSION_ASSIGN_FAILED(2404, "permission.assign.failed"), + PERMISSION_DENIED(2405, "permission.denied"), // 第三方系统相关错误码 (2500-2599) EXTERNAL_SYSTEM_NOT_FOUND(2505, "external.system.not.found"), diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/handler/GlobalExceptionHandler.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/handler/GlobalExceptionHandler.java index eed07760..6e92f6a7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/handler/GlobalExceptionHandler.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/handler/GlobalExceptionHandler.java @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -51,6 +52,12 @@ public class GlobalExceptionHandler { return Response.error(ResponseCode.LOGIN_ERROR); } + @ExceptionHandler(AccessDeniedException.class) + public Response handleAccessDeniedException(AccessDeniedException e) { + log.warn("Access denied: {}", e.getMessage()); + return Response.error(ResponseCode.PERMISSION_DENIED); + } + @ExceptionHandler(ExpiredJwtException.class) public Response handleExpiredJwtException(ExpiredJwtException e) { log.warn("JWT token expired", e); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/CheckPermission.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/CheckPermission.java deleted file mode 100644 index 6929abc8..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/CheckPermission.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.qqchen.deploy.backend.framework.security.annotation; - -import java.lang.annotation.*; - -/** - * 权限检查注解 - * 用于Controller方法级别,定义该方法需要的操作权限 - * - * 使用示例: - *
- * @RestController
- * @PermissionPrefix("deploy:team")
- * public class TeamApiController {
- *     // 需要 "deploy:team:create" 权限
- *     @CheckPermission("create")
- *     public Response create(@RequestBody TeamDTO dto) {
- *         ...
- *     }
- *     
- *     // 需要 "deploy:team:update" 权限
- *     @CheckPermission("update")
- *     public Response update(@PathVariable Long id, @RequestBody TeamDTO dto) {
- *         ...
- *     }
- * }
- * 
- * - * @author qqchen - * @date 2025-10-31 - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface CheckPermission { - /** - * 操作名称,如 "create"、"update"、"delete"、"list"、"view" - * 将与类级别的 @PermissionPrefix 拼接成完整权限点 - */ - String value(); -} - diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/PermissionPrefix.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/PermissionPrefix.java deleted file mode 100644 index 6cc9075e..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/annotation/PermissionPrefix.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.qqchen.deploy.backend.framework.security.annotation; - -import java.lang.annotation.*; - -/** - * 权限前缀注解 - * 用于Controller类级别,定义该Controller所有权限的前缀 - * - * 使用示例: - *
- * @RestController
- * @PermissionPrefix("deploy:team")
- * public class TeamApiController {
- *     // 方法需要 "deploy:team:create" 权限
- *     @CheckPermission("create")
- *     public Response create(@RequestBody TeamDTO dto) {
- *         ...
- *     }
- * }
- * 
- * - * @author qqchen - * @date 2025-10-31 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface PermissionPrefix { - /** - * 权限前缀,如 "deploy:team"、"system:user" - */ - String value(); -} - diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/aspect/PermissionCheckAspect.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/security/aspect/PermissionCheckAspect.java deleted file mode 100644 index 83547554..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/aspect/PermissionCheckAspect.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.qqchen.deploy.backend.framework.security.aspect; - -import com.qqchen.deploy.backend.framework.exception.BusinessException; -import com.qqchen.deploy.backend.framework.enums.ResponseCode; -import com.qqchen.deploy.backend.framework.security.annotation.CheckPermission; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.annotation.Order; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -import java.lang.reflect.Method; -import java.util.Collection; - -/** - * 权限检查切面 - * 基于 Spring Security,结合自定义注解实现细粒度权限控制 - * - * 工作原理: - * 1. 拦截所有带有 @CheckPermission 注解的方法 - * 2. 从类级别获取 @PermissionPrefix 注解,得到权限前缀 - * 3. 拼接权限前缀和操作名称,得到完整权限点 - * 4. 从 SecurityContextHolder 获取当前用户的权限列表 - * 5. 判断用户是否拥有该权限,如果没有则抛出异常 - * - * @author qqchen - * @date 2025-10-31 - */ -@Aspect -@Component -@Order(1) -@Slf4j -public class PermissionCheckAspect { - - @Around("@annotation(com.qqchen.deploy.backend.framework.security.annotation.CheckPermission)") - public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable { - - // 1. 获取方法注解信息 - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - Method method = signature.getMethod(); - CheckPermission annotation = method.getAnnotation(CheckPermission.class); - String operation = annotation.value(); - - // 2. 获取类级别的权限前缀 - Class controllerClass = joinPoint.getTarget().getClass(); - PermissionPrefix prefixAnnotation = findPermissionPrefix(controllerClass); - - if (prefixAnnotation == null) { - log.warn("Controller {} 未添加 @PermissionPrefix 注解,跳过权限检查", - controllerClass.getSimpleName()); - return joinPoint.proceed(); - } - - String prefix = prefixAnnotation.value(); - String requiredPermission = prefix + ":" + operation; - - // 3. 从 SecurityContext 获取当前用户权限 - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication == null || !authentication.isAuthenticated()) { - log.warn("用户未认证,权限检查失败: {}", requiredPermission); - throw new BusinessException(ResponseCode.UNAUTHORIZED); - } - - Collection authorities = authentication.getAuthorities(); - - log.debug("权限检查: user={}, required={}, userPermissions={}", - authentication.getName(), requiredPermission, authorities.size()); - - // 4. 判断是否拥有权限 - boolean hasPermission = authorities.stream() - .anyMatch(auth -> auth.getAuthority().equals(requiredPermission)); - - if (!hasPermission) { - log.warn("权限检查失败: user={}, required={}", - authentication.getName(), requiredPermission); - throw new BusinessException(ResponseCode.FORBIDDEN); - } - - log.debug("权限检查通过: {}", requiredPermission); - - return joinPoint.proceed(); - } - - /** - * 查找类或父类上的 @PermissionPrefix 注解 - * 处理 CGLIB 代理类的情况 - */ - private PermissionPrefix findPermissionPrefix(Class clazz) { - PermissionPrefix annotation = clazz.getAnnotation(PermissionPrefix.class); - if (annotation != null) { - return annotation; - } - - // 检查父类(处理 CGLIB 代理) - Class superclass = clazz.getSuperclass(); - while (superclass != null && superclass != Object.class) { - annotation = superclass.getAnnotation(PermissionPrefix.class); - if (annotation != null) { - return annotation; - } - superclass = superclass.getSuperclass(); - } - - return null; - } -} - diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/config/SecurityConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/security/config/SecurityConfig.java index 52fa7d9b..24fe6da3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/security/config/SecurityConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/security/config/SecurityConfig.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; @@ -19,6 +20,7 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic @Configuration @EnableWebSecurity +@EnableMethodSecurity(prePostEnabled = true) @RequiredArgsConstructor public class SecurityConfig { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java index 07160592..8cccb90a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java @@ -8,20 +8,19 @@ import com.qqchen.deploy.backend.notification.entity.NotificationChannel; import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; import com.qqchen.deploy.backend.notification.service.INotificationChannelService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** @@ -33,14 +32,53 @@ import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/api/v1/notification-channel") -@PermissionPrefix("notification:channel") @Tag(name = "通知渠道管理", description = "通知渠道管理相关接口") -public class NotificationChannelApiController +public class NotificationChannelApiController extends BaseController { - + @Resource private INotificationChannelService notificationChannelService; - + + @Override + public Response create(NotificationChannelDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, NotificationChannelDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(NotificationChannelQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(NotificationChannelQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "获取所有渠道类型") @GetMapping("/types") public Response>> getChannelTypes() { @@ -53,10 +91,10 @@ public class NotificationChannelApiController return map; }) .collect(Collectors.toList()); - + return Response.success(types); } - + @Operation(summary = "测试通知渠道连接") @PostMapping("/{id}/test") public Response testConnection( @@ -65,7 +103,7 @@ public class NotificationChannelApiController boolean result = notificationChannelService.testConnection(id); return Response.success(result); } - + @Operation(summary = "启用通知渠道") @PostMapping("/{id}/enable") public Response enable( @@ -74,7 +112,7 @@ public class NotificationChannelApiController notificationChannelService.enable(id); return Response.success(); } - + @Operation(summary = "禁用通知渠道") @PostMapping("/{id}/disable") public Response disable( @@ -83,7 +121,7 @@ public class NotificationChannelApiController notificationChannelService.disable(id); return Response.success(); } - + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java index b0af42bb..a8c3da24 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java @@ -10,7 +10,6 @@ import com.qqchen.deploy.backend.schedule.service.IScheduleJobService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -26,7 +25,6 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/schedule/jobs") -@PermissionPrefix("deploy:schedule-job") @Tag(name = "定时任务管理", description = "定时任务的增删改查及任务控制接口") public class ScheduleJobApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobCategoryApiController.java index e552a2c4..273fdfcc 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobCategoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobCategoryApiController.java @@ -5,8 +5,6 @@ import com.qqchen.deploy.backend.schedule.dto.ScheduleJobCategoryDTO; import com.qqchen.deploy.backend.schedule.entity.ScheduleJobCategory; import com.qqchen.deploy.backend.schedule.query.ScheduleJobCategoryQuery; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,7 +20,6 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/schedule/job-categories") -@PermissionPrefix("deploy:schedule-job-category") @Tag(name = "定时任务分类管理", description = "定时任务分类的增删改查接口") public class ScheduleJobCategoryApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobLogApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobLogApiController.java index 731b093e..00192eff 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobLogApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobLogApiController.java @@ -5,8 +5,6 @@ import com.qqchen.deploy.backend.schedule.dto.ScheduleJobLogDTO; import com.qqchen.deploy.backend.schedule.entity.ScheduleJobLog; import com.qqchen.deploy.backend.schedule.query.ScheduleJobLogQuery; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -19,7 +17,6 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/api/v1/schedule/job-logs") -@PermissionPrefix("deploy:schedule-job-log") @Tag(name = "定时任务执行日志", description = "查询任务执行历史日志") public class ScheduleJobLogApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/DepartmentApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/DepartmentApiController.java index f1969afb..9096541f 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/DepartmentApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/DepartmentApiController.java @@ -3,7 +3,6 @@ package com.qqchen.deploy.backend.system.api; import com.qqchen.deploy.backend.system.entity.Department; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import com.qqchen.deploy.backend.system.model.DepartmentDTO; import com.qqchen.deploy.backend.system.model.query.DepartmentQuery; import com.qqchen.deploy.backend.system.model.response.DepartmentResponse; @@ -12,20 +11,59 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; @Tag(name = "部门管理") @RestController @RequestMapping("/api/v1/department") -@PermissionPrefix("system:department") public class DepartmentApiController extends BaseController { - @Resource - private IDepartmentService departmentService; + + @Override + public Response create(DepartmentDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, DepartmentDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(DepartmentQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(DepartmentQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } @Operation(summary = "获取部门树") @GetMapping("/tree") diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java index 13e64702..9f94f762 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java @@ -3,7 +3,6 @@ package com.qqchen.deploy.backend.system.api; import com.qqchen.deploy.backend.system.entity.Menu; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import com.qqchen.deploy.backend.system.model.MenuDTO; import com.qqchen.deploy.backend.system.model.query.MenuQuery; import com.qqchen.deploy.backend.system.model.response.MenuResponse; @@ -23,7 +22,6 @@ import java.util.List; @RestController @RequestMapping("/api/v1/menu") @Tag(name = "菜单管理API", description = "对外提供的菜单管理接口") -@PermissionPrefix("system:menu") public class MenuApiController extends BaseController { @Resource diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/PermissionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/PermissionApiController.java index 2c0f8947..ec730260 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/PermissionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/PermissionApiController.java @@ -1,25 +1,75 @@ package com.qqchen.deploy.backend.system.api; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.system.entity.Permission; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.query.PermissionQuery; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.data.domain.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import java.util.List; @Tag(name = "权限管理") @RestController @RequestMapping("/api/v1/permission") -@PermissionPrefix("system:permission") public class PermissionApiController extends BaseController { + @Override + @PostMapping + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:create')") + public Response create(@Validated @RequestBody PermissionDTO dto) { + return super.create(dto); + } + + @Override + @PutMapping("/{id}") + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:update')") + public Response update(@PathVariable Long id, @Validated @RequestBody PermissionDTO dto) { + return super.update(id, dto); + } + + @Override + @DeleteMapping("/{id}") + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:delete')") + public Response delete(@PathVariable Long id) { + return super.delete(id); + } + + @Override + @GetMapping("/{id}") + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:view') or hasAuthority('system:role:create') or hasAuthority('system:role:update')") + public Response findById(@PathVariable Long id) { + return super.findById(id); + } + + @Override + @GetMapping + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:list') or hasAuthority('system:role:create') or hasAuthority('system:role:update')") + public Response> findAll() { + return super.findAll(); + } + + @Override + @GetMapping("/page") + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:list') or hasAuthority('system:role:create') or hasAuthority('system:role:update')") + public Response> page(PermissionQuery query) { + return super.page(query); + } + + @Override + @GetMapping("/list") + @PreAuthorize("hasRole('ADMIN') or hasAuthority('system:permission:list') or hasAuthority('system:role:create') or hasAuthority('system:role:update')") + public Response> findAll(PermissionQuery query) { + return super.findAll(query); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现导出功能 } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java index af1119f4..69f52898 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java @@ -3,7 +3,6 @@ package com.qqchen.deploy.backend.system.api; import com.qqchen.deploy.backend.system.entity.Role; import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.query.RoleQuery; @@ -14,14 +13,15 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; @Tag(name = "角色管理") @RestController @RequestMapping("/api/v1/role") -@PermissionPrefix("system:role") public class RoleApiController extends BaseController { @Resource @@ -30,6 +30,46 @@ public class RoleApiController extends BaseController create(RoleDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, RoleDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(RoleQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(RoleQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "获取菜单权限树") @GetMapping("/permission-tree") public Response> getPermissionTree() { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleTagApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleTagApiController.java index 5aa71432..96d738fa 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleTagApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleTagApiController.java @@ -1,27 +1,69 @@ package com.qqchen.deploy.backend.system.api; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.system.entity.RoleTag; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.system.model.RoleTagDTO; import com.qqchen.deploy.backend.system.model.query.RoleTagQuery; import com.qqchen.deploy.backend.system.service.IRoleTagService; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + import java.util.List; +import java.util.concurrent.CompletableFuture; @Tag(name = "角色标签管理") @RestController @RequestMapping("/api/v1/role-tag") -@PermissionPrefix("system:role-tag") public class RoleTagApiController extends BaseController { @Resource private IRoleTagService roleTagService; + @Override + public Response create(RoleTagDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, RoleTagDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(RoleTagQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(RoleTagQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/TenantApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/TenantApiController.java index 92b81a05..4b0ed1ce 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/TenantApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/TenantApiController.java @@ -7,17 +7,16 @@ import com.qqchen.deploy.backend.system.model.TenantDTO; import com.qqchen.deploy.backend.system.model.query.TenantQuery; import com.qqchen.deploy.backend.system.service.ITenantService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 租户管理API控制器 @@ -31,13 +30,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/tenant") -@PermissionPrefix("system:tenant") @Tag(name = "租户管理API", description = "对外提供的租户管理接口") public class TenantApiController extends BaseController { @Resource private ITenantService tenantService; + @Override + public Response create(TenantDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, TenantDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(TenantQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(TenantQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "获取状态") @GetMapping("/{id}/enabled") public Response getStatus( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java index d25661e9..2d7d3f11 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java @@ -4,7 +4,6 @@ import com.qqchen.deploy.backend.system.model.query.UserQuery; import com.qqchen.deploy.backend.system.model.request.DepartmentAssignRequest; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.framework.api.Response; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import com.qqchen.deploy.backend.system.entity.User; import com.qqchen.deploy.backend.system.model.UserDTO; import com.qqchen.deploy.backend.system.model.request.LoginRequest; @@ -13,21 +12,61 @@ import com.qqchen.deploy.backend.system.service.IUserService; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.domain.Page; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.io.OutputStream; import java.util.List; +import java.util.concurrent.CompletableFuture; @RestController @RequestMapping("/api/v1/user") -@PermissionPrefix("system:user") public class UserApiController extends BaseController { @Resource private IUserService userService; + @Override + public Response create(UserDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, UserDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(UserQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(UserQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } @Operation(summary = "用户登录") @PostMapping("/login") diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Permission.java b/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Permission.java index 1ca0d231..5a5ad09a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Permission.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Permission.java @@ -34,6 +34,4 @@ public class Permission extends Entity { @Column(length = 200) private String description; - // 不使用 JPA 关系映射,改用原生 SQL 查询 - // 通过 PermissionService 中的原生SQL查询 sys_role_permission 表获取关联的角色列表 } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Role.java b/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Role.java index 9ab236e9..67504392 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Role.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/entity/Role.java @@ -32,6 +32,9 @@ public class Role extends Entity { @Column(nullable = false) private Integer sort; + @Column(nullable = false, columnDefinition = "BIT DEFAULT 0") + private Boolean isAdmin = false; + @ManyToMany @JoinTable( name = "sys_role_menu", diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/model/RoleDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/system/model/RoleDTO.java index 67c5ec25..0cd2ac7c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/model/RoleDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/model/RoleDTO.java @@ -17,6 +17,8 @@ public class RoleDTO extends BaseDTO { private Integer sort; + private Boolean isAdmin; + private Set tags; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/model/query/PermissionQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/system/model/query/PermissionQuery.java index 32784352..f91cdcb3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/model/query/PermissionQuery.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/model/query/PermissionQuery.java @@ -1,5 +1,7 @@ package com.qqchen.deploy.backend.system.model.query; +import com.qqchen.deploy.backend.framework.annotation.QueryField; +import com.qqchen.deploy.backend.framework.enums.QueryType; import com.qqchen.deploy.backend.framework.query.BaseQuery; import lombok.Data; import lombok.EqualsAndHashCode; @@ -8,13 +10,18 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class PermissionQuery extends BaseQuery { + @QueryField(type = QueryType.LIKE) private String code; + @QueryField(type = QueryType.LIKE) private String name; + @QueryField(type = QueryType.EQUAL) private String type; + @QueryField(type = QueryType.EQUAL) private Boolean enabled; + @QueryField(type = QueryType.EQUAL) private Long menuId; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java index 54b2dafc..3ad1d771 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java @@ -70,6 +70,21 @@ public class RoleServiceImpl extends BaseServiceImpl new BusinessException(ResponseCode.ROLE_NOT_FOUND)); + + if (Boolean.TRUE.equals(role.getIsAdmin())) { + throw new BusinessException(ResponseCode.ROLE_ADMIN_CANNOT_DELETE); + } + + // 调用父类的删除方法 + super.delete(id); + } + @Override public void validateCode(String code) { if (roleRepository.existsByCodeAndDeletedFalse(code)) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserDetailsServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserDetailsServiceImpl.java index b41ff244..8d66600b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserDetailsServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserDetailsServiceImpl.java @@ -45,18 +45,34 @@ public class UserDetailsServiceImpl implements UserDetailsService { // ✅ 批量加载用户权限(避免N+1查询) Hibernate.initialize(user.getRoles()); // 加载角色 + // 检查用户是否是超级管理员(拥有 is_admin=true 的角色) + boolean isAdmin = user.getRoles().stream() + .anyMatch(role -> Boolean.TRUE.equals(role.getIsAdmin())); + + List authorities = new java.util.ArrayList<>(); + + // 1. 加载角色本身(用于hasRole判断) + user.getRoles().stream() + .map(role -> new SimpleGrantedAuthority(role.getCode())) + .forEach(authorities::add); + + // 2. 加载权限点(用于hasAuthority判断) List roleIds = user.getRoles().stream() .map(role -> role.getId()) .collect(Collectors.toList()); - // 使用原生SQL批量查询所有权限(1次查询,避免N+1问题) - List authorities = permissionRepository.findByRoleIds(roleIds).stream() - .map(permission -> new SimpleGrantedAuthority(permission.getCode())) - .distinct() - .collect(Collectors.toList()); + if (!roleIds.isEmpty()) { + permissionRepository.findByRoleIds(roleIds).stream() + .map(permission -> new SimpleGrantedAuthority(permission.getCode())) + .distinct() + .forEach(authorities::add); + } - log.debug("加载用户 {} 的权限: {} 个角色, {} 个权限", - username, roleIds.size(), authorities.size()); + log.debug("加载用户 {} 的权限: {} 个角色{}, {} 个权限点", + username, + user.getRoles().size(), + isAdmin ? "(超级管理员)" : "", + authorities.size() - user.getRoles().size()); // 返回自定义 UserDetails,包含用户ID等扩展信息 return new CustomUserDetails( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/ApprovalTaskApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/ApprovalTaskApiController.java index 8e220275..2dd5373d 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/ApprovalTaskApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/ApprovalTaskApiController.java @@ -5,12 +5,8 @@ import com.qqchen.deploy.backend.workflow.dto.request.ApprovalTaskRequest; import com.qqchen.deploy.backend.workflow.dto.response.ApprovalTaskDTO; import com.qqchen.deploy.backend.workflow.service.IApprovalTaskService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; @@ -27,17 +23,17 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/approval-tasks") -@PermissionPrefix("workflow:approval") @Tag(name = "审批任务管理", description = "审批任务相关接口") public class ApprovalTaskApiController { @Resource private IApprovalTaskService approvalTaskService; + @Operation(summary = "查询我的待办审批任务") @GetMapping("/my-tasks") public Response> getMyTasks( - @Parameter(description = "用户名", required = true) @RequestParam String username + @Parameter(description = "用户名", required = true) @RequestParam String username ) { List tasks = approvalTaskService.getMyTasks(username); return Response.success(tasks); @@ -46,8 +42,8 @@ public class ApprovalTaskApiController { @Operation(summary = "查询流程实例的审批任务") @GetMapping("/process/{processInstanceId}") public Response> getTasksByProcessInstance( - @Parameter(description = "流程实例ID", required = true) - @PathVariable String processInstanceId + @Parameter(description = "流程实例ID", required = true) + @PathVariable String processInstanceId ) { List tasks = approvalTaskService.getTasksByProcessInstance(processInstanceId); return Response.success(tasks); @@ -56,8 +52,8 @@ public class ApprovalTaskApiController { @Operation(summary = "查询审批任务详情") @GetMapping("/{taskId}") public Response getTaskById( - @Parameter(description = "任务ID", required = true) - @PathVariable String taskId + @Parameter(description = "任务ID", required = true) + @PathVariable String taskId ) { ApprovalTaskDTO task = approvalTaskService.getTaskById(taskId); return Response.success(task); @@ -66,7 +62,7 @@ public class ApprovalTaskApiController { @Operation(summary = "完成审批任务(通过/拒绝)") @PostMapping("/complete") public Response completeTask( - @Valid @RequestBody ApprovalTaskRequest request + @Valid @RequestBody ApprovalTaskRequest request ) { approvalTaskService.completeTask(request); return Response.success(); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormCategoryApiController.java index e469e6fb..25714896 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormCategoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormCategoryApiController.java @@ -7,15 +7,14 @@ import com.qqchen.deploy.backend.workflow.dto.query.FormCategoryQuery; import com.qqchen.deploy.backend.workflow.entity.FormCategory; import com.qqchen.deploy.backend.workflow.service.IFormCategoryService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 表单分类API控制器 @@ -26,13 +25,52 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/forms/categories") -@PermissionPrefix("workflow:form-category") @Tag(name = "表单分类管理", description = "表单分类管理相关接口") public class FormCategoryApiController extends BaseController { @Resource private IFormCategoryService formCategoryService; + @Override + public Response create(FormCategoryDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, FormCategoryDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(FormCategoryQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(FormCategoryQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "查询所有启用的分类") @GetMapping("/enabled") public Response> findAllEnabled() { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java index 590748f5..619a004b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java @@ -7,16 +7,16 @@ import com.qqchen.deploy.backend.workflow.dto.query.FormDataQuery; import com.qqchen.deploy.backend.workflow.entity.FormData; import com.qqchen.deploy.backend.workflow.service.IFormDataService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.concurrent.CompletableFuture; + /** * 表单数据API控制器 * @@ -26,13 +26,52 @@ import org.springframework.web.bind.annotation.*; @Slf4j @RestController @RequestMapping("/api/v1/forms/data") -@PermissionPrefix("workflow:form-data") @Tag(name = "表单数据管理", description = "表单数据管理相关接口") public class FormDataApiController extends BaseController { @Resource private IFormDataService formDataService; + @Override + public Response create(FormDataDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, FormDataDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(FormDataQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(FormDataQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "提交表单数据") @PostMapping("/submit") public Response submit(@RequestBody FormDataDTO dto) { @@ -43,7 +82,7 @@ public class FormDataApiController extends BaseController getByBusinessKey( - @Parameter(description = "业务标识", required = true) @PathVariable String businessKey + @Parameter(description = "业务标识", required = true) @PathVariable String businessKey ) { FormDataDTO result = formDataService.getByBusinessKey(businessKey); return Response.success(result); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDefinitionApiController.java index 459325a7..3eb605c3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDefinitionApiController.java @@ -9,11 +9,14 @@ import com.qqchen.deploy.backend.workflow.service.IFormDefinitionService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.concurrent.CompletableFuture; + /** * 表单定义API控制器 * @@ -23,17 +26,56 @@ import org.springframework.web.bind.annotation.*; @Slf4j @RestController @RequestMapping("/api/v1/forms/definitions") -@PermissionPrefix("workflow:form") @Tag(name = "表单定义管理", description = "表单定义管理相关接口") public class FormDefinitionApiController extends BaseController { @Resource private IFormDefinitionService formDefinitionService; + @Override + public Response create(FormDefinitionDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, FormDefinitionDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(FormDefinitionQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(FormDefinitionQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Operation(summary = "发布表单") @PostMapping("/{id}/publish") public Response publish( - @Parameter(description = "表单定义ID", required = true) @PathVariable Long id + @Parameter(description = "表单定义ID", required = true) @PathVariable Long id ) { FormDefinitionDTO result = formDefinitionService.publish(id); return Response.success(result); @@ -42,7 +84,7 @@ public class FormDefinitionApiController extends BaseController getLatestByKey( - @Parameter(description = "表单标识", required = true) @PathVariable String key + @Parameter(description = "表单标识", required = true) @PathVariable String key ) { FormDefinitionDTO result = formDefinitionService.getLatestByKey(key); return Response.success(result); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowCategoryApiController.java index 24bb2aec..64bf07fe 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowCategoryApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowCategoryApiController.java @@ -1,18 +1,19 @@ package com.qqchen.deploy.backend.workflow.api; +import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.workflow.dto.WorkflowCategoryDTO; import com.qqchen.deploy.backend.workflow.dto.query.WorkflowCategoryQuery; import com.qqchen.deploy.backend.workflow.entity.WorkflowCategory; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 工作流分类API Controller @@ -23,10 +24,50 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/workflow/categories") -@PermissionPrefix("workflow:category") @Tag(name = "工作流分类管理", description = "工作流分类相关接口") public class WorkflowCategoryApiController extends BaseController { + + @Override + public Response create(WorkflowCategoryDTO dto) { + return super.create(dto); + } + + @Override + public Response update(Long aLong, WorkflowCategoryDTO dto) { + return super.update(aLong, dto); + } + + @Override + public Response delete(Long aLong) { + return super.delete(aLong); + } + + @Override + public Response findById(Long aLong) { + return super.findById(aLong); + } + + @Override + public Response> findAll() { + return super.findAll(); + } + + @Override + public Response> page(WorkflowCategoryQuery query) { + return super.page(query); + } + + @Override + public Response> findAll(WorkflowCategoryQuery query) { + return super.findAll(query); + } + + @Override + public CompletableFuture> batchProcess(List dtos) { + return super.batchProcess(dtos); + } + @Override protected void exportData(HttpServletResponse response, List data) { // TODO: 实现工作流分类数据导出逻辑 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java index 56784fbd..af2838d6 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java @@ -13,7 +13,6 @@ import com.qqchen.deploy.backend.workflow.service.IWorkflowDefinitionService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -35,7 +34,6 @@ import java.util.Map; @Slf4j @RestController @RequestMapping("/api/v1/workflow/definition") -@PermissionPrefix("workflow:definition") @Tag(name = "工作流定义管理", description = "工作流定义管理相关接口") public class WorkflowDefinitionApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java index 95e4b248..ffe0808b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java @@ -13,7 +13,6 @@ import com.qqchen.deploy.backend.workflow.dto.query.WorkflowInstanceQuery; import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -32,7 +31,6 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/workflow/instance") -@PermissionPrefix("workflow:instance") @Tag(name = "工作流实例管理", description = "工作流定义实例相关接口") public class WorkflowInstanceApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeDefinitionApiController.java index ede3084c..bedd58e4 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeDefinitionApiController.java @@ -9,12 +9,8 @@ import com.qqchen.deploy.backend.workflow.enums.NodeCategoryEnums; import com.qqchen.deploy.backend.workflow.dto.query.WorkflowNodeDefinitionQuery; import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeDefinitionService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -28,7 +24,6 @@ import java.util.List; @Slf4j @RestController @RequestMapping("/api/v1/workflow/node-definition") -@PermissionPrefix("workflow:node-definition") @Tag(name = "工作流节点定义管理", description = "工作流节点定义管理相关接口") public class WorkflowNodeDefinitionApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeInstanceApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeInstanceApiController.java index f48e6f31..c6675f7c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeInstanceApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowNodeInstanceApiController.java @@ -8,12 +8,8 @@ import com.qqchen.deploy.backend.workflow.dto.event.ShellLogEvent; import com.qqchen.deploy.backend.workflow.dto.query.WorkflowNodeInstanceQuery; import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeInstanceService; import io.swagger.v3.oas.annotations.Operation; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.Parameter; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import io.swagger.v3.oas.annotations.tags.Tag; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; -import com.qqchen.deploy.backend.framework.security.annotation.PermissionPrefix; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -32,7 +28,6 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j @RestController @RequestMapping("/api/v1/workflow/node") -@PermissionPrefix("workflow:node-instance") @Tag(name = "工作流节点实例管理", description = "工作流节点实例管理相关接口") @CrossOrigin(origins = "*", allowedHeaders = "*") public class WorkflowNodeInstanceApiController extends BaseController { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/FormDefinition.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/FormDefinition.java index d47b67e4..f70b1a3e 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/FormDefinition.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/FormDefinition.java @@ -79,7 +79,7 @@ public class FormDefinition extends Entity { /** * 是否为模板 */ - @Column(name = "is_template", nullable = false) + @Column(name = "is_template") private Boolean isTemplate; } diff --git a/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql b/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql index caa2de95..0fa63722 100644 --- a/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql +++ b/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql @@ -96,18 +96,20 @@ VALUES -- 菜单管理 (4, '菜单管理', '/system/menus', 'System/Menu/List', 'MenuOutlined', 'system:menu', 2, 1, 30, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), -- 部门管理 -(5, '部门管理', '/system/departments', 'System/Department/List', 'ApartmentOutlined', 'system:department', 2, 1, 40, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE); +(5, '部门管理', '/system/departments', 'System/Department/List', 'ApartmentOutlined', 'system:department', 2, 1, 40, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 权限管理(隐藏菜单) +(6, '权限管理', '/system/permissions', 'System/Permission/List', 'SafetyOutlined', 'system:permission', 2, 1, 50, TRUE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE); -- ==================== 初始化角色数据 ==================== DELETE FROM sys_role WHERE id < 100; -INSERT INTO sys_role (id, create_time, code, name, type, description, sort) +INSERT INTO sys_role (id, create_time, code, name, type, description, sort, is_admin) VALUES -(1, NOW(), 'ROLE_ADMIN', '管理员', 1, '系统管理员,拥有所有权限', 1), -(2, NOW(), 'ROLE_OPS', '运维', 2, '运维人员,负责服务器、部署等运维工作', 2), -(3, NOW(), 'ROLE_DEV', '开发', 2, '开发人员,负责应用开发和部署', 3), -(4, NOW(), 'ROLE_HR', 'HR', 2, '人力资源,负责人员管理', 4), -(5, NOW(), 'ROLE_BA', 'BA/产品', 2, '业务分析/产品经理,负责需求和产品管理', 5); +(1, NOW(), 'ROLE_ADMIN', '管理员', 1, '系统管理员,拥有所有权限', 1, 1), +(2, NOW(), 'ROLE_OPS', '运维', 2, '运维人员,负责服务器、部署等运维工作', 2, 0), +(3, NOW(), 'ROLE_DEV', '开发', 2, '开发人员,负责应用开发和部署', 3, 0), +(4, NOW(), 'ROLE_HR', 'HR', 2, '人力资源,负责人员管理', 4, 0), +(5, NOW(), 'ROLE_BA', 'BA/产品', 2, '业务分析/产品经理,负责需求和产品管理', 5, 0); -- 初始化角色标签 INSERT INTO sys_role_tag (id, create_time, name, color) @@ -145,268 +147,275 @@ VALUES DELETE FROM sys_permission WHERE id < 10000; -- 系统管理权限 -INSERT INTO sys_permission (id, create_time, menu_id, code, name, type, sort) VALUES --- 用户管理 (menu_id=2) -(1, NOW(), 2, 'system:user:list', '用户查询', 'FUNCTION', 1), -(2, NOW(), 2, 'system:user:view', '用户详情', 'FUNCTION', 2), -(3, NOW(), 2, 'system:user:create', '用户创建', 'FUNCTION', 3), -(4, NOW(), 2, 'system:user:update', '用户修改', 'FUNCTION', 4), -(5, NOW(), 2, 'system:user:delete', '用户删除', 'FUNCTION', 5), - --- 角色管理 (menu_id=3) -(11, NOW(), 3, 'system:role:list', '角色查询', 'FUNCTION', 1), -(12, NOW(), 3, 'system:role:view', '角色详情', 'FUNCTION', 2), -(13, NOW(), 3, 'system:role:create', '角色创建', 'FUNCTION', 3), -(14, NOW(), 3, 'system:role:update', '角色修改', 'FUNCTION', 4), -(15, NOW(), 3, 'system:role:delete', '角色删除', 'FUNCTION', 5), -(16, NOW(), 3, 'system:role:permission-tree', '获取权限树', 'FUNCTION', 6), -(17, NOW(), 3, 'system:role:assign-tags', '分配标签', 'FUNCTION', 7), -(18, NOW(), 3, 'system:role:assign-roles', '分配角色', 'FUNCTION', 8), -(19, NOW(), 3, 'system:role:get-permissions', '获取角色权限', 'FUNCTION', 9), -(20, NOW(), 3, 'system:role:assign-permissions', '分配权限', 'FUNCTION', 10), - --- 菜单管理 (menu_id=4) -(21, NOW(), 4, 'system:menu:list', '菜单查询', 'FUNCTION', 1), -(22, NOW(), 4, 'system:menu:view', '菜单详情', 'FUNCTION', 2), -(23, NOW(), 4, 'system:menu:create', '菜单创建', 'FUNCTION', 3), -(24, NOW(), 4, 'system:menu:update', '菜单修改', 'FUNCTION', 4), -(25, NOW(), 4, 'system:menu:delete', '菜单删除', 'FUNCTION', 5), - --- 部门管理 (menu_id=5) -(31, NOW(), 5, 'system:department:list', '部门查询', 'FUNCTION', 1), -(32, NOW(), 5, 'system:department:view', '部门详情', 'FUNCTION', 2), -(33, NOW(), 5, 'system:department:create', '部门创建', 'FUNCTION', 3), -(34, NOW(), 5, 'system:department:update', '部门修改', 'FUNCTION', 4), -(35, NOW(), 5, 'system:department:delete', '部门删除', 'FUNCTION', 5), - --- 运维管理权限 --- 团队管理 (menu_id=201) -(101, NOW(), 201, 'deploy:team:list', '团队查询', 'FUNCTION', 1), -(102, NOW(), 201, 'deploy:team:view', '团队详情', 'FUNCTION', 2), -(103, NOW(), 201, 'deploy:team:create', '团队创建', 'FUNCTION', 3), -(104, NOW(), 201, 'deploy:team:update', '团队修改', 'FUNCTION', 4), -(105, NOW(), 201, 'deploy:team:delete', '团队删除', 'FUNCTION', 5), - --- 应用管理 (menu_id=202) -(111, NOW(), 202, 'deploy:application:list', '应用查询', 'FUNCTION', 1), -(112, NOW(), 202, 'deploy:application:view', '应用详情', 'FUNCTION', 2), -(113, NOW(), 202, 'deploy:application:create', '应用创建', 'FUNCTION', 3), -(114, NOW(), 202, 'deploy:application:update', '应用修改', 'FUNCTION', 4), -(115, NOW(), 202, 'deploy:application:delete', '应用删除', 'FUNCTION', 5), - --- 定时任务管理 (menu_id=203) -(121, NOW(), 203, 'deploy:schedule-job:list', '任务查询', 'FUNCTION', 1), -(122, NOW(), 203, 'deploy:schedule-job:view', '任务详情', 'FUNCTION', 2), -(123, NOW(), 203, 'deploy:schedule-job:create', '任务创建', 'FUNCTION', 3), -(124, NOW(), 203, 'deploy:schedule-job:update', '任务修改', 'FUNCTION', 4), -(125, NOW(), 203, 'deploy:schedule-job:delete', '任务删除', 'FUNCTION', 5), -(126, NOW(), 203, 'deploy:schedule-job:pause', '暂停任务', 'FUNCTION', 6), -(127, NOW(), 203, 'deploy:schedule-job:resume', '恢复任务', 'FUNCTION', 7), -(128, NOW(), 203, 'deploy:schedule-job:disable', '禁用任务', 'FUNCTION', 8), -(129, NOW(), 203, 'deploy:schedule-job:enable', '启用任务', 'FUNCTION', 9), -(130, NOW(), 203, 'deploy:schedule-job:trigger', '手动触发', 'FUNCTION', 10), - --- 环境管理 (menu_id=204) -(141, NOW(), 204, 'deploy:environment:list', '环境查询', 'FUNCTION', 1), -(142, NOW(), 204, 'deploy:environment:view', '环境详情', 'FUNCTION', 2), -(143, NOW(), 204, 'deploy:environment:create', '环境创建', 'FUNCTION', 3), -(144, NOW(), 204, 'deploy:environment:update', '环境修改', 'FUNCTION', 4), -(145, NOW(), 204, 'deploy:environment:delete', '环境删除', 'FUNCTION', 5), - --- 团队配置管理 (关联到团队管理菜单 menu_id=201) -(151, NOW(), 201, 'deploy:team-config:list', '团队配置查询', 'FUNCTION', 11), -(152, NOW(), 201, 'deploy:team-config:view', '团队配置详情', 'FUNCTION', 12), -(153, NOW(), 201, 'deploy:team-config:update', '团队配置修改', 'FUNCTION', 13), - --- 团队成员管理 (关联到团队管理菜单 menu_id=201) -(161, NOW(), 201, 'deploy:team-member:list', '团队成员查询', 'FUNCTION', 21), -(162, NOW(), 201, 'deploy:team-member:view', '团队成员详情', 'FUNCTION', 22), -(163, NOW(), 201, 'deploy:team-member:create', '团队成员创建', 'FUNCTION', 23), -(164, NOW(), 201, 'deploy:team-member:update', '团队成员修改', 'FUNCTION', 24), -(165, NOW(), 201, 'deploy:team-member:delete', '团队成员删除', 'FUNCTION', 25), - --- 团队应用管理 (关联到团队管理菜单 menu_id=201) -(171, NOW(), 201, 'deploy:team-application:list', '团队应用查询', 'FUNCTION', 31), -(172, NOW(), 201, 'deploy:team-application:view', '团队应用详情', 'FUNCTION', 32), -(173, NOW(), 201, 'deploy:team-application:create', '团队应用创建', 'FUNCTION', 33), -(174, NOW(), 201, 'deploy:team-application:update', '团队应用修改', 'FUNCTION', 34), -(175, NOW(), 201, 'deploy:team-application:delete', '团队应用删除', 'FUNCTION', 35), - --- 应用分类管理 (关联到应用管理菜单 menu_id=202) -(181, NOW(), 202, 'deploy:application-category:list', '应用分类查询', 'FUNCTION', 11), -(182, NOW(), 202, 'deploy:application-category:view', '应用分类详情', 'FUNCTION', 12), -(183, NOW(), 202, 'deploy:application-category:create', '应用分类创建', 'FUNCTION', 13), -(184, NOW(), 202, 'deploy:application-category:update', '应用分类修改', 'FUNCTION', 14), -(185, NOW(), 202, 'deploy:application-category:delete', '应用分类删除', 'FUNCTION', 15), - --- 服务器分类管理 (关联到服务器管理菜单 menu_id=301) -(191, NOW(), 301, 'deploy:server-category:list', '服务器分类查询', 'FUNCTION', 11), -(192, NOW(), 301, 'deploy:server-category:view', '服务器分类详情', 'FUNCTION', 12), -(193, NOW(), 301, 'deploy:server-category:create', '服务器分类创建', 'FUNCTION', 13), -(194, NOW(), 301, 'deploy:server-category:update', '服务器分类修改', 'FUNCTION', 14), -(195, NOW(), 301, 'deploy:server-category:delete', '服务器分类删除', 'FUNCTION', 15), - --- 定时任务日志 (关联到定时任务管理菜单 menu_id=203) -(201, NOW(), 203, 'deploy:schedule-job-log:list', '任务日志查询', 'FUNCTION', 21), -(202, NOW(), 203, 'deploy:schedule-job-log:view', '任务日志详情', 'FUNCTION', 22), -(203, NOW(), 203, 'deploy:schedule-job-log:delete', '任务日志删除', 'FUNCTION', 23), - --- 定时任务分类 (关联到定时任务管理菜单 menu_id=203) -(211, NOW(), 203, 'deploy:schedule-job-category:list', '任务分类查询', 'FUNCTION', 31), -(212, NOW(), 203, 'deploy:schedule-job-category:view', '任务分类详情', 'FUNCTION', 32), -(213, NOW(), 203, 'deploy:schedule-job-category:create', '任务分类创建', 'FUNCTION', 33), -(214, NOW(), 203, 'deploy:schedule-job-category:update', '任务分类修改', 'FUNCTION', 34), -(215, NOW(), 203, 'deploy:schedule-job-category:delete', '任务分类删除', 'FUNCTION', 35), - --- 资源管理权限(继续补充) --- 服务器管理 (menu_id=301) -(221, NOW(), 301, 'resource:server:list', '服务器查询', 'FUNCTION', 1), -(222, NOW(), 301, 'resource:server:view', '服务器详情', 'FUNCTION', 2), -(223, NOW(), 301, 'resource:server:create', '服务器创建', 'FUNCTION', 3), -(224, NOW(), 301, 'resource:server:update', '服务器修改', 'FUNCTION', 4), -(225, NOW(), 301, 'resource:server:delete', '服务器删除', 'FUNCTION', 5), - --- Jenkins管理 (menu_id=302) -(231, NOW(), 302, 'resource:jenkins:list', 'Jenkins查询', 'FUNCTION', 1), -(232, NOW(), 302, 'resource:jenkins:view', 'Jenkins详情', 'FUNCTION', 2), -(233, NOW(), 302, 'resource:jenkins:create', 'Jenkins创建', 'FUNCTION', 3), -(234, NOW(), 302, 'resource:jenkins:update', 'Jenkins修改', 'FUNCTION', 4), -(235, NOW(), 302, 'resource:jenkins:delete', 'Jenkins删除', 'FUNCTION', 5), - --- Jenkins Job管理 (关联到Jenkins管理菜单 menu_id=302) -(241, NOW(), 302, 'resource:jenkins-job:list', 'Jenkins任务查询', 'FUNCTION', 11), -(242, NOW(), 302, 'resource:jenkins-job:view', 'Jenkins任务详情', 'FUNCTION', 12), -(243, NOW(), 302, 'resource:jenkins-job:create', 'Jenkins任务创建', 'FUNCTION', 13), -(244, NOW(), 302, 'resource:jenkins-job:update', 'Jenkins任务修改', 'FUNCTION', 14), -(245, NOW(), 302, 'resource:jenkins-job:delete', 'Jenkins任务删除', 'FUNCTION', 15), -(246, NOW(), 302, 'resource:jenkins-job:sync', '同步Jenkins任务', 'FUNCTION', 16), - --- Jenkins View管理 (关联到Jenkins管理菜单 menu_id=302) -(251, NOW(), 302, 'resource:jenkins-view:list', 'Jenkins视图查询', 'FUNCTION', 21), -(252, NOW(), 302, 'resource:jenkins-view:view', 'Jenkins视图详情', 'FUNCTION', 22), -(253, NOW(), 302, 'resource:jenkins-view:sync', '同步Jenkins视图', 'FUNCTION', 23), - --- Jenkins Build管理 (关联到Jenkins管理菜单 menu_id=302) -(261, NOW(), 302, 'resource:jenkins-build:list', '构建记录查询', 'FUNCTION', 31), -(262, NOW(), 302, 'resource:jenkins-build:view', '构建记录详情', 'FUNCTION', 32), -(263, NOW(), 302, 'resource:jenkins-build:sync', '同步构建记录', 'FUNCTION', 33), - --- Jenkins Sync History (关联到Jenkins管理菜单 menu_id=302) -(271, NOW(), 302, 'resource:jenkins-sync:list', '同步历史查询', 'FUNCTION', 41), -(272, NOW(), 302, 'resource:jenkins-sync:view', '同步历史详情', 'FUNCTION', 42), - --- Git管理 (menu_id=303) -(281, NOW(), 303, 'resource:git:list', 'Git查询', 'FUNCTION', 1), -(282, NOW(), 303, 'resource:git:view', 'Git详情', 'FUNCTION', 2), -(283, NOW(), 303, 'resource:git:create', 'Git创建', 'FUNCTION', 3), -(284, NOW(), 303, 'resource:git:update', 'Git修改', 'FUNCTION', 4), -(285, NOW(), 303, 'resource:git:delete', 'Git删除', 'FUNCTION', 5), - --- 仓库组管理 (关联到Git管理菜单 menu_id=303) -(291, NOW(), 303, 'resource:repository-group:list', '仓库组查询', 'FUNCTION', 11), -(292, NOW(), 303, 'resource:repository-group:view', '仓库组详情', 'FUNCTION', 12), -(293, NOW(), 303, 'resource:repository-group:create', '仓库组创建', 'FUNCTION', 13), -(294, NOW(), 303, 'resource:repository-group:update', '仓库组修改', 'FUNCTION', 14), -(295, NOW(), 303, 'resource:repository-group:delete', '仓库组删除', 'FUNCTION', 15), - --- 仓库项目管理 (关联到Git管理菜单 menu_id=303) -(301, NOW(), 303, 'resource:repository-project:list', '仓库项目查询', 'FUNCTION', 21), -(302, NOW(), 303, 'resource:repository-project:view', '仓库项目详情', 'FUNCTION', 22), -(303, NOW(), 303, 'resource:repository-project:create', '仓库项目创建', 'FUNCTION', 23), -(304, NOW(), 303, 'resource:repository-project:update', '仓库项目修改', 'FUNCTION', 24), -(305, NOW(), 303, 'resource:repository-project:delete', '仓库项目删除', 'FUNCTION', 25), -(306, NOW(), 303, 'resource:repository-project:sync', '同步仓库项目', 'FUNCTION', 26), - --- 仓库分支管理 (关联到Git管理菜单 menu_id=303) -(311, NOW(), 303, 'resource:repository-branch:list', '仓库分支查询', 'FUNCTION', 31), -(312, NOW(), 303, 'resource:repository-branch:view', '仓库分支详情', 'FUNCTION', 32), -(313, NOW(), 303, 'resource:repository-branch:sync', '同步仓库分支', 'FUNCTION', 33), - --- 三方系统管理 (menu_id=304) -(321, NOW(), 304, 'resource:external:list', '三方系统查询', 'FUNCTION', 1), -(322, NOW(), 304, 'resource:external:view', '三方系统详情', 'FUNCTION', 2), -(323, NOW(), 304, 'resource:external:create', '三方系统创建', 'FUNCTION', 3), -(324, NOW(), 304, 'resource:external:update', '三方系统修改', 'FUNCTION', 4), -(325, NOW(), 304, 'resource:external:delete', '三方系统删除', 'FUNCTION', 5), - --- 工作流管理权限(继续补充) --- 工作流设计 (menu_id=101) -(331, NOW(), 101, 'workflow:definition:list', '工作流查询', 'FUNCTION', 1), -(332, NOW(), 101, 'workflow:definition:view', '工作流详情', 'FUNCTION', 2), -(333, NOW(), 101, 'workflow:definition:create', '工作流创建', 'FUNCTION', 3), -(334, NOW(), 101, 'workflow:definition:update', '工作流修改', 'FUNCTION', 4), -(335, NOW(), 101, 'workflow:definition:delete', '工作流删除', 'FUNCTION', 5), - --- 工作流实例 (menu_id=102) -(341, NOW(), 102, 'workflow:instance:list', '实例查询', 'FUNCTION', 1), -(342, NOW(), 102, 'workflow:instance:view', '实例详情', 'FUNCTION', 2), -(343, NOW(), 102, 'workflow:instance:create', '实例创建', 'FUNCTION', 3), -(344, NOW(), 102, 'workflow:instance:update', '实例修改', 'FUNCTION', 4), -(345, NOW(), 102, 'workflow:instance:delete', '实例删除', 'FUNCTION', 5), - --- 节点定义管理 (关联到工作流设计菜单 menu_id=101) -(351, NOW(), 101, 'workflow:node-definition:list', '节点定义查询', 'FUNCTION', 11), -(352, NOW(), 101, 'workflow:node-definition:view', '节点定义详情', 'FUNCTION', 12), -(353, NOW(), 101, 'workflow:node-definition:create', '节点定义创建', 'FUNCTION', 13), -(354, NOW(), 101, 'workflow:node-definition:update', '节点定义修改', 'FUNCTION', 14), -(355, NOW(), 101, 'workflow:node-definition:delete', '节点定义删除', 'FUNCTION', 15), - --- 节点实例管理 (关联到工作流实例菜单 menu_id=102) -(361, NOW(), 102, 'workflow:node-instance:list', '节点实例查询', 'FUNCTION', 11), -(362, NOW(), 102, 'workflow:node-instance:view', '节点实例详情', 'FUNCTION', 12), -(363, NOW(), 102, 'workflow:node-instance:update', '节点实例修改', 'FUNCTION', 13), -(364, NOW(), 102, 'workflow:node-instance:delete', '节点实例删除', 'FUNCTION', 15), - --- 工作流分类 (关联到工作流设计菜单 menu_id=101) -(371, NOW(), 101, 'workflow:category:list', '工作流分类查询', 'FUNCTION', 21), -(372, NOW(), 101, 'workflow:category:view', '工作流分类详情', 'FUNCTION', 22), -(373, NOW(), 101, 'workflow:category:create', '工作流分类创建', 'FUNCTION', 23), -(374, NOW(), 101, 'workflow:category:update', '工作流分类修改', 'FUNCTION', 24), -(375, NOW(), 101, 'workflow:category:delete', '工作流分类删除', 'FUNCTION', 25), - --- 表单管理 (menu_id=104) -(381, NOW(), 104, 'workflow:form:list', '表单查询', 'FUNCTION', 1), -(382, NOW(), 104, 'workflow:form:view', '表单详情', 'FUNCTION', 2), -(383, NOW(), 104, 'workflow:form:create', '表单创建', 'FUNCTION', 3), -(384, NOW(), 104, 'workflow:form:update', '表单修改', 'FUNCTION', 4), -(385, NOW(), 104, 'workflow:form:delete', '表单删除', 'FUNCTION', 5), - --- 表单数据管理 (关联到表单管理菜单 menu_id=104) -(391, NOW(), 104, 'workflow:form-data:list', '表单数据查询', 'FUNCTION', 11), -(392, NOW(), 104, 'workflow:form-data:view', '表单数据详情', 'FUNCTION', 12), -(393, NOW(), 104, 'workflow:form-data:create', '表单数据创建', 'FUNCTION', 13), -(394, NOW(), 104, 'workflow:form-data:update', '表单数据修改', 'FUNCTION', 14), -(395, NOW(), 104, 'workflow:form-data:delete', '表单数据删除', 'FUNCTION', 15), - --- 表单分类管理 (关联到表单管理菜单 menu_id=104) -(401, NOW(), 104, 'workflow:form-category:list', '表单分类查询', 'FUNCTION', 21), -(402, NOW(), 104, 'workflow:form-category:view', '表单分类详情', 'FUNCTION', 22), -(403, NOW(), 104, 'workflow:form-category:create', '表单分类创建', 'FUNCTION', 23), -(404, NOW(), 104, 'workflow:form-category:update', '表单分类修改', 'FUNCTION', 24), -(405, NOW(), 104, 'workflow:form-category:delete', '表单分类删除', 'FUNCTION', 25), - --- 审批任务管理 (关联到工作流实例菜单 menu_id=102) -(411, NOW(), 102, 'workflow:approval:list', '审批任务查询', 'FUNCTION', 21), -(412, NOW(), 102, 'workflow:approval:view', '审批任务详情', 'FUNCTION', 22), -(413, NOW(), 102, 'workflow:approval:approve', '审批任务通过', 'FUNCTION', 23), -(414, NOW(), 102, 'workflow:approval:reject', '审批任务驳回', 'FUNCTION', 24), -(415, NOW(), 102, 'workflow:approval:transfer', '审批任务转交', 'FUNCTION', 25), - --- 系统管理权限(继续补充) --- 角色标签管理 (关联到角色管理菜单 menu_id=3) -(421, NOW(), 3, 'system:role-tag:list', '角色标签查询', 'FUNCTION', 11), -(422, NOW(), 3, 'system:role-tag:view', '角色标签详情', 'FUNCTION', 12), -(423, NOW(), 3, 'system:role-tag:create', '角色标签创建', 'FUNCTION', 13), -(424, NOW(), 3, 'system:role-tag:update', '角色标签修改', 'FUNCTION', 14), -(425, NOW(), 3, 'system:role-tag:delete', '角色标签删除', 'FUNCTION', 15), - --- 通知管理权限 --- 通知渠道管理 (关联到系统管理菜单 menu_id=1,因为通知渠道属于系统配置) -(431, NOW(), 1, 'notification:channel:list', '通知渠道查询', 'FUNCTION', 11), -(432, NOW(), 1, 'notification:channel:view', '通知渠道详情', 'FUNCTION', 12), -(433, NOW(), 1, 'notification:channel:create', '通知渠道创建', 'FUNCTION', 13), -(434, NOW(), 1, 'notification:channel:update', '通知渠道修改', 'FUNCTION', 14), -(435, NOW(), 1, 'notification:channel:delete', '通知渠道删除', 'FUNCTION', 15); +-- INSERT INTO sys_permission (id, create_time, menu_id, code, name, type, sort) VALUES +-- -- 用户管理 (menu_id=2) +-- (1, NOW(), 2, 'system:user:list', '用户查询', 'FUNCTION', 1), +-- (2, NOW(), 2, 'system:user:view', '用户详情', 'FUNCTION', 2), +-- (3, NOW(), 2, 'system:user:create', '用户创建', 'FUNCTION', 3), +-- (4, NOW(), 2, 'system:user:update', '用户修改', 'FUNCTION', 4), +-- (5, NOW(), 2, 'system:user:delete', '用户删除', 'FUNCTION', 5), +-- +-- -- 角色管理 (menu_id=3) +-- (11, NOW(), 3, 'system:role:list', '角色查询', 'FUNCTION', 1), +-- (12, NOW(), 3, 'system:role:view', '角色详情', 'FUNCTION', 2), +-- (13, NOW(), 3, 'system:role:create', '角色创建', 'FUNCTION', 3), +-- (14, NOW(), 3, 'system:role:update', '角色修改', 'FUNCTION', 4), +-- (15, NOW(), 3, 'system:role:delete', '角色删除', 'FUNCTION', 5), +-- (16, NOW(), 3, 'system:role:permission-tree', '获取权限树', 'FUNCTION', 6), +-- (17, NOW(), 3, 'system:role:assign-tags', '分配标签', 'FUNCTION', 7), +-- (18, NOW(), 3, 'system:role:assign-roles', '分配角色', 'FUNCTION', 8), +-- (19, NOW(), 3, 'system:role:get-permissions', '获取角色权限', 'FUNCTION', 9), +-- (20, NOW(), 3, 'system:role:assign-permissions', '分配权限', 'FUNCTION', 10), +-- +-- -- 菜单管理 (menu_id=4) +-- (21, NOW(), 4, 'system:menu:list', '菜单查询', 'FUNCTION', 1), +-- (22, NOW(), 4, 'system:menu:view', '菜单详情', 'FUNCTION', 2), +-- (23, NOW(), 4, 'system:menu:create', '菜单创建', 'FUNCTION', 3), +-- (24, NOW(), 4, 'system:menu:update', '菜单修改', 'FUNCTION', 4), +-- (25, NOW(), 4, 'system:menu:delete', '菜单删除', 'FUNCTION', 5), +-- +-- -- 权限管理 (menu_id=6) +-- (26, NOW(), 6, 'system:permission:list', '权限查询', 'FUNCTION', 1), +-- (27, NOW(), 6, 'system:permission:view', '权限详情', 'FUNCTION', 2), +-- (28, NOW(), 6, 'system:permission:create', '权限创建', 'FUNCTION', 3), +-- (29, NOW(), 6, 'system:permission:update', '权限修改', 'FUNCTION', 4), +-- (30, NOW(), 6, 'system:permission:delete', '权限删除', 'FUNCTION', 5), +-- +-- -- 部门管理 (menu_id=5) +-- (31, NOW(), 5, 'system:department:list', '部门查询', 'FUNCTION', 1), +-- (32, NOW(), 5, 'system:department:view', '部门详情', 'FUNCTION', 2), +-- (33, NOW(), 5, 'system:department:create', '部门创建', 'FUNCTION', 3), +-- (34, NOW(), 5, 'system:department:update', '部门修改', 'FUNCTION', 4), +-- (35, NOW(), 5, 'system:department:delete', '部门删除', 'FUNCTION', 5), +-- +-- -- 运维管理权限 +-- -- 团队管理 (menu_id=201) +-- (101, NOW(), 201, 'deploy:team:list', '团队查询', 'FUNCTION', 1), +-- (102, NOW(), 201, 'deploy:team:view', '团队详情', 'FUNCTION', 2), +-- (103, NOW(), 201, 'deploy:team:create', '团队创建', 'FUNCTION', 3), +-- (104, NOW(), 201, 'deploy:team:update', '团队修改', 'FUNCTION', 4), +-- (105, NOW(), 201, 'deploy:team:delete', '团队删除', 'FUNCTION', 5), +-- +-- -- 应用管理 (menu_id=202) +-- (111, NOW(), 202, 'deploy:application:list', '应用查询', 'FUNCTION', 1), +-- (112, NOW(), 202, 'deploy:application:view', '应用详情', 'FUNCTION', 2), +-- (113, NOW(), 202, 'deploy:application:create', '应用创建', 'FUNCTION', 3), +-- (114, NOW(), 202, 'deploy:application:update', '应用修改', 'FUNCTION', 4), +-- (115, NOW(), 202, 'deploy:application:delete', '应用删除', 'FUNCTION', 5), +-- +-- -- 定时任务管理 (menu_id=203) +-- (121, NOW(), 203, 'deploy:schedule-job:list', '任务查询', 'FUNCTION', 1), +-- (122, NOW(), 203, 'deploy:schedule-job:view', '任务详情', 'FUNCTION', 2), +-- (123, NOW(), 203, 'deploy:schedule-job:create', '任务创建', 'FUNCTION', 3), +-- (124, NOW(), 203, 'deploy:schedule-job:update', '任务修改', 'FUNCTION', 4), +-- (125, NOW(), 203, 'deploy:schedule-job:delete', '任务删除', 'FUNCTION', 5), +-- (126, NOW(), 203, 'deploy:schedule-job:pause', '暂停任务', 'FUNCTION', 6), +-- (127, NOW(), 203, 'deploy:schedule-job:resume', '恢复任务', 'FUNCTION', 7), +-- (128, NOW(), 203, 'deploy:schedule-job:disable', '禁用任务', 'FUNCTION', 8), +-- (129, NOW(), 203, 'deploy:schedule-job:enable', '启用任务', 'FUNCTION', 9), +-- (130, NOW(), 203, 'deploy:schedule-job:trigger', '手动触发', 'FUNCTION', 10), +-- +-- -- 环境管理 (menu_id=204) +-- (141, NOW(), 204, 'deploy:environment:list', '环境查询', 'FUNCTION', 1), +-- (142, NOW(), 204, 'deploy:environment:view', '环境详情', 'FUNCTION', 2), +-- (143, NOW(), 204, 'deploy:environment:create', '环境创建', 'FUNCTION', 3), +-- (144, NOW(), 204, 'deploy:environment:update', '环境修改', 'FUNCTION', 4), +-- (145, NOW(), 204, 'deploy:environment:delete', '环境删除', 'FUNCTION', 5), +-- +-- -- 团队配置管理 (无对应菜单,menu_id=NULL) +-- (151, NOW(), NULL, 'deploy:team-config:list', '团队配置查询', 'FUNCTION', 11), +-- (152, NOW(), NULL, 'deploy:team-config:view', '团队配置详情', 'FUNCTION', 12), +-- (153, NOW(), NULL, 'deploy:team-config:update', '团队配置修改', 'FUNCTION', 13), +-- +-- -- 团队成员管理 (无对应菜单,menu_id=NULL) +-- (161, NOW(), NULL, 'deploy:team-member:list', '团队成员查询', 'FUNCTION', 21), +-- (162, NOW(), NULL, 'deploy:team-member:view', '团队成员详情', 'FUNCTION', 22), +-- (163, NOW(), NULL, 'deploy:team-member:create', '团队成员创建', 'FUNCTION', 23), +-- (164, NOW(), NULL, 'deploy:team-member:update', '团队成员修改', 'FUNCTION', 24), +-- (165, NOW(), NULL, 'deploy:team-member:delete', '团队成员删除', 'FUNCTION', 25), +-- +-- -- 团队应用管理 (无对应菜单,menu_id=NULL) +-- (171, NOW(), NULL, 'deploy:team-application:list', '团队应用查询', 'FUNCTION', 31), +-- (172, NOW(), NULL, 'deploy:team-application:view', '团队应用详情', 'FUNCTION', 32), +-- (173, NOW(), NULL, 'deploy:team-application:create', '团队应用创建', 'FUNCTION', 33), +-- (174, NOW(), NULL, 'deploy:team-application:update', '团队应用修改', 'FUNCTION', 34), +-- (175, NOW(), NULL, 'deploy:team-application:delete', '团队应用删除', 'FUNCTION', 35), +-- +-- -- 应用分类管理 (无对应菜单,menu_id=NULL) +-- (181, NOW(), NULL, 'deploy:application-category:list', '应用分类查询', 'FUNCTION', 11), +-- (182, NOW(), NULL, 'deploy:application-category:view', '应用分类详情', 'FUNCTION', 12), +-- (183, NOW(), NULL, 'deploy:application-category:create', '应用分类创建', 'FUNCTION', 13), +-- (184, NOW(), NULL, 'deploy:application-category:update', '应用分类修改', 'FUNCTION', 14), +-- (185, NOW(), NULL, 'deploy:application-category:delete', '应用分类删除', 'FUNCTION', 15), +-- +-- -- 服务器分类管理 (无对应菜单,menu_id=NULL) +-- (191, NOW(), NULL, 'deploy:server-category:list', '服务器分类查询', 'FUNCTION', 11), +-- (192, NOW(), NULL, 'deploy:server-category:view', '服务器分类详情', 'FUNCTION', 12), +-- (193, NOW(), NULL, 'deploy:server-category:create', '服务器分类创建', 'FUNCTION', 13), +-- (194, NOW(), NULL, 'deploy:server-category:update', '服务器分类修改', 'FUNCTION', 14), +-- (195, NOW(), NULL, 'deploy:server-category:delete', '服务器分类删除', 'FUNCTION', 15), +-- +-- -- 定时任务日志 (无对应菜单,menu_id=NULL) +-- (201, NOW(), NULL, 'deploy:schedule-job-log:list', '任务日志查询', 'FUNCTION', 21), +-- (202, NOW(), NULL, 'deploy:schedule-job-log:view', '任务日志详情', 'FUNCTION', 22), +-- (203, NOW(), NULL, 'deploy:schedule-job-log:delete', '任务日志删除', 'FUNCTION', 23), +-- +-- -- 定时任务分类 (无对应菜单,menu_id=NULL) +-- (211, NOW(), NULL, 'deploy:schedule-job-category:list', '任务分类查询', 'FUNCTION', 31), +-- (212, NOW(), NULL, 'deploy:schedule-job-category:view', '任务分类详情', 'FUNCTION', 32), +-- (213, NOW(), NULL, 'deploy:schedule-job-category:create', '任务分类创建', 'FUNCTION', 33), +-- (214, NOW(), NULL, 'deploy:schedule-job-category:update', '任务分类修改', 'FUNCTION', 34), +-- (215, NOW(), NULL, 'deploy:schedule-job-category:delete', '任务分类删除', 'FUNCTION', 35), +-- +-- -- 资源管理权限(继续补充) +-- -- 服务器管理 (menu_id=301) +-- (221, NOW(), 301, 'resource:server:list', '服务器查询', 'FUNCTION', 1), +-- (222, NOW(), 301, 'resource:server:view', '服务器详情', 'FUNCTION', 2), +-- (223, NOW(), 301, 'resource:server:create', '服务器创建', 'FUNCTION', 3), +-- (224, NOW(), 301, 'resource:server:update', '服务器修改', 'FUNCTION', 4), +-- (225, NOW(), 301, 'resource:server:delete', '服务器删除', 'FUNCTION', 5), +-- +-- -- Jenkins管理 (menu_id=302) +-- (231, NOW(), 302, 'resource:jenkins:list', 'Jenkins查询', 'FUNCTION', 1), +-- (232, NOW(), 302, 'resource:jenkins:view', 'Jenkins详情', 'FUNCTION', 2), +-- (233, NOW(), 302, 'resource:jenkins:create', 'Jenkins创建', 'FUNCTION', 3), +-- (234, NOW(), 302, 'resource:jenkins:update', 'Jenkins修改', 'FUNCTION', 4), +-- (235, NOW(), 302, 'resource:jenkins:delete', 'Jenkins删除', 'FUNCTION', 5), +-- +-- -- Jenkins Job管理 (无对应菜单,menu_id=NULL) +-- (241, NOW(), NULL, 'resource:jenkins-job:list', 'Jenkins任务查询', 'FUNCTION', 11), +-- (242, NOW(), NULL, 'resource:jenkins-job:view', 'Jenkins任务详情', 'FUNCTION', 12), +-- (243, NOW(), NULL, 'resource:jenkins-job:create', 'Jenkins任务创建', 'FUNCTION', 13), +-- (244, NOW(), NULL, 'resource:jenkins-job:update', 'Jenkins任务修改', 'FUNCTION', 14), +-- (245, NOW(), NULL, 'resource:jenkins-job:delete', 'Jenkins任务删除', 'FUNCTION', 15), +-- (246, NOW(), NULL, 'resource:jenkins-job:sync', '同步Jenkins任务', 'FUNCTION', 16), +-- +-- -- Jenkins View管理 (无对应菜单,menu_id=NULL) +-- (251, NOW(), NULL, 'resource:jenkins-view:list', 'Jenkins视图查询', 'FUNCTION', 21), +-- (252, NOW(), NULL, 'resource:jenkins-view:view', 'Jenkins视图详情', 'FUNCTION', 22), +-- (253, NOW(), NULL, 'resource:jenkins-view:sync', '同步Jenkins视图', 'FUNCTION', 23), +-- +-- -- Jenkins Build管理 (无对应菜单,menu_id=NULL) +-- (261, NOW(), NULL, 'resource:jenkins-build:list', '构建记录查询', 'FUNCTION', 31), +-- (262, NOW(), NULL, 'resource:jenkins-build:view', '构建记录详情', 'FUNCTION', 32), +-- (263, NOW(), NULL, 'resource:jenkins-build:sync', '同步构建记录', 'FUNCTION', 33), +-- +-- -- Jenkins Sync History (无对应菜单,menu_id=NULL) +-- (271, NOW(), NULL, 'resource:jenkins-sync:list', '同步历史查询', 'FUNCTION', 41), +-- (272, NOW(), NULL, 'resource:jenkins-sync:view', '同步历史详情', 'FUNCTION', 42), +-- +-- -- Git管理 (menu_id=303) +-- (281, NOW(), 303, 'resource:git:list', 'Git查询', 'FUNCTION', 1), +-- (282, NOW(), 303, 'resource:git:view', 'Git详情', 'FUNCTION', 2), +-- (283, NOW(), 303, 'resource:git:create', 'Git创建', 'FUNCTION', 3), +-- (284, NOW(), 303, 'resource:git:update', 'Git修改', 'FUNCTION', 4), +-- (285, NOW(), 303, 'resource:git:delete', 'Git删除', 'FUNCTION', 5), +-- +-- -- 仓库组管理 (无对应菜单,menu_id=NULL) +-- (291, NOW(), NULL, 'resource:repository-group:list', '仓库组查询', 'FUNCTION', 11), +-- (292, NOW(), NULL, 'resource:repository-group:view', '仓库组详情', 'FUNCTION', 12), +-- (293, NOW(), NULL, 'resource:repository-group:create', '仓库组创建', 'FUNCTION', 13), +-- (294, NOW(), NULL, 'resource:repository-group:update', '仓库组修改', 'FUNCTION', 14), +-- (295, NOW(), NULL, 'resource:repository-group:delete', '仓库组删除', 'FUNCTION', 15), +-- +-- -- 仓库项目管理 (无对应菜单,menu_id=NULL) +-- (301, NOW(), NULL, 'resource:repository-project:list', '仓库项目查询', 'FUNCTION', 21), +-- (302, NOW(), NULL, 'resource:repository-project:view', '仓库项目详情', 'FUNCTION', 22), +-- (303, NOW(), NULL, 'resource:repository-project:create', '仓库项目创建', 'FUNCTION', 23), +-- (304, NOW(), NULL, 'resource:repository-project:update', '仓库项目修改', 'FUNCTION', 24), +-- (305, NOW(), NULL, 'resource:repository-project:delete', '仓库项目删除', 'FUNCTION', 25), +-- (306, NOW(), NULL, 'resource:repository-project:sync', '同步仓库项目', 'FUNCTION', 26), +-- +-- -- 仓库分支管理 (无对应菜单,menu_id=NULL) +-- (311, NOW(), NULL, 'resource:repository-branch:list', '仓库分支查询', 'FUNCTION', 31), +-- (312, NOW(), NULL, 'resource:repository-branch:view', '仓库分支详情', 'FUNCTION', 32), +-- (313, NOW(), NULL, 'resource:repository-branch:sync', '同步仓库分支', 'FUNCTION', 33), +-- +-- -- 三方系统管理 (menu_id=304) +-- (321, NOW(), 304, 'resource:external:list', '三方系统查询', 'FUNCTION', 1), +-- (322, NOW(), 304, 'resource:external:view', '三方系统详情', 'FUNCTION', 2), +-- (323, NOW(), 304, 'resource:external:create', '三方系统创建', 'FUNCTION', 3), +-- (324, NOW(), 304, 'resource:external:update', '三方系统修改', 'FUNCTION', 4), +-- (325, NOW(), 304, 'resource:external:delete', '三方系统删除', 'FUNCTION', 5), +-- +-- -- 工作流管理权限(继续补充) +-- -- 工作流设计 (menu_id=101) +-- (331, NOW(), 101, 'workflow:definition:list', '工作流查询', 'FUNCTION', 1), +-- (332, NOW(), 101, 'workflow:definition:view', '工作流详情', 'FUNCTION', 2), +-- (333, NOW(), 101, 'workflow:definition:create', '工作流创建', 'FUNCTION', 3), +-- (334, NOW(), 101, 'workflow:definition:update', '工作流修改', 'FUNCTION', 4), +-- (335, NOW(), 101, 'workflow:definition:delete', '工作流删除', 'FUNCTION', 5), +-- +-- -- 工作流实例 (menu_id=102) +-- (341, NOW(), 102, 'workflow:instance:list', '实例查询', 'FUNCTION', 1), +-- (342, NOW(), 102, 'workflow:instance:view', '实例详情', 'FUNCTION', 2), +-- (343, NOW(), 102, 'workflow:instance:create', '实例创建', 'FUNCTION', 3), +-- (344, NOW(), 102, 'workflow:instance:update', '实例修改', 'FUNCTION', 4), +-- (345, NOW(), 102, 'workflow:instance:delete', '实例删除', 'FUNCTION', 5), +-- +-- -- 节点定义管理 (无对应菜单,menu_id=NULL) +-- (351, NOW(), NULL, 'workflow:node-definition:list', '节点定义查询', 'FUNCTION', 11), +-- (352, NOW(), NULL, 'workflow:node-definition:view', '节点定义详情', 'FUNCTION', 12), +-- (353, NOW(), NULL, 'workflow:node-definition:create', '节点定义创建', 'FUNCTION', 13), +-- (354, NOW(), NULL, 'workflow:node-definition:update', '节点定义修改', 'FUNCTION', 14), +-- (355, NOW(), NULL, 'workflow:node-definition:delete', '节点定义删除', 'FUNCTION', 15), +-- +-- -- 节点实例管理 (无对应菜单,menu_id=NULL) +-- (361, NOW(), NULL, 'workflow:node-instance:list', '节点实例查询', 'FUNCTION', 11), +-- (362, NOW(), NULL, 'workflow:node-instance:view', '节点实例详情', 'FUNCTION', 12), +-- (363, NOW(), NULL, 'workflow:node-instance:update', '节点实例修改', 'FUNCTION', 13), +-- (364, NOW(), NULL, 'workflow:node-instance:delete', '节点实例删除', 'FUNCTION', 15), +-- +-- -- 工作流分类 (无对应菜单,menu_id=NULL) +-- (371, NOW(), NULL, 'workflow:category:list', '工作流分类查询', 'FUNCTION', 21), +-- (372, NOW(), NULL, 'workflow:category:view', '工作流分类详情', 'FUNCTION', 22), +-- (373, NOW(), NULL, 'workflow:category:create', '工作流分类创建', 'FUNCTION', 23), +-- (374, NOW(), NULL, 'workflow:category:update', '工作流分类修改', 'FUNCTION', 24), +-- (375, NOW(), NULL, 'workflow:category:delete', '工作流分类删除', 'FUNCTION', 25), +-- +-- -- 表单管理 (menu_id=104) +-- (381, NOW(), 104, 'workflow:form:list', '表单查询', 'FUNCTION', 1), +-- (382, NOW(), 104, 'workflow:form:view', '表单详情', 'FUNCTION', 2), +-- (383, NOW(), 104, 'workflow:form:create', '表单创建', 'FUNCTION', 3), +-- (384, NOW(), 104, 'workflow:form:update', '表单修改', 'FUNCTION', 4), +-- (385, NOW(), 104, 'workflow:form:delete', '表单删除', 'FUNCTION', 5), +-- +-- -- 表单数据管理 (无对应菜单,menu_id=NULL) +-- (391, NOW(), NULL, 'workflow:form-data:list', '表单数据查询', 'FUNCTION', 11), +-- (392, NOW(), NULL, 'workflow:form-data:view', '表单数据详情', 'FUNCTION', 12), +-- (393, NOW(), NULL, 'workflow:form-data:create', '表单数据创建', 'FUNCTION', 13), +-- (394, NOW(), NULL, 'workflow:form-data:update', '表单数据修改', 'FUNCTION', 14), +-- (395, NOW(), NULL, 'workflow:form-data:delete', '表单数据删除', 'FUNCTION', 15), +-- +-- -- 表单分类管理 (无对应菜单,menu_id=NULL) +-- (401, NOW(), NULL, 'workflow:form-category:list', '表单分类查询', 'FUNCTION', 21), +-- (402, NOW(), NULL, 'workflow:form-category:view', '表单分类详情', 'FUNCTION', 22), +-- (403, NOW(), NULL, 'workflow:form-category:create', '表单分类创建', 'FUNCTION', 23), +-- (404, NOW(), NULL, 'workflow:form-category:update', '表单分类修改', 'FUNCTION', 24), +-- (405, NOW(), NULL, 'workflow:form-category:delete', '表单分类删除', 'FUNCTION', 25), +-- +-- -- 审批任务管理 (无对应菜单,menu_id=NULL) +-- (411, NOW(), NULL, 'workflow:approval:list', '审批任务查询', 'FUNCTION', 21), +-- (412, NOW(), NULL, 'workflow:approval:view', '审批任务详情', 'FUNCTION', 22), +-- (413, NOW(), NULL, 'workflow:approval:approve', '审批任务通过', 'FUNCTION', 23), +-- (414, NOW(), NULL, 'workflow:approval:reject', '审批任务驳回', 'FUNCTION', 24), +-- (415, NOW(), NULL, 'workflow:approval:transfer', '审批任务转交', 'FUNCTION', 25), +-- +-- -- 系统管理权限(继续补充) +-- -- 角色标签管理 (无对应菜单,menu_id=NULL) +-- (421, NOW(), NULL, 'system:role-tag:list', '角色标签查询', 'FUNCTION', 11), +-- (422, NOW(), NULL, 'system:role-tag:view', '角色标签详情', 'FUNCTION', 12), +-- (423, NOW(), NULL, 'system:role-tag:create', '角色标签创建', 'FUNCTION', 13), +-- (424, NOW(), NULL, 'system:role-tag:update', '角色标签修改', 'FUNCTION', 14), +-- (425, NOW(), NULL, 'system:role-tag:delete', '角色标签删除', 'FUNCTION', 15), +-- +-- -- 通知管理权限 +-- -- 通知渠道管理 (无对应菜单,menu_id=NULL) +-- (431, NOW(), NULL, 'notification:channel:list', '通知渠道查询', 'FUNCTION', 11), +-- (432, NOW(), NULL, 'notification:channel:view', '通知渠道详情', 'FUNCTION', 12), +-- (433, NOW(), NULL, 'notification:channel:create', '通知渠道创建', 'FUNCTION', 13), +-- (434, NOW(), NULL, 'notification:channel:update', '通知渠道修改', 'FUNCTION', 14), +-- (435, NOW(), NULL, 'notification:channel:delete', '通知渠道删除', 'FUNCTION', 15); -- ==================== 分配权限给角色 ==================== DELETE FROM sys_role_permission; diff --git a/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql index 1f3bf2c5..161c7242 100644 --- a/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql +++ b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql @@ -3,24 +3,25 @@ -- -------------------------------------------------------------------------------------- -- 租户表 -CREATE TABLE sys_tenant ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', +CREATE TABLE sys_tenant +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - code VARCHAR(50) NOT NULL COMMENT '租户编码', - name VARCHAR(100) NOT NULL COMMENT '租户名称', - address VARCHAR(255) NULL COMMENT '租户地址', - contact_name VARCHAR(50) NULL COMMENT '联系人姓名', - contact_phone VARCHAR(20) NULL COMMENT '联系人电话', - email VARCHAR(100) NULL COMMENT '联系人邮箱', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + code VARCHAR(50) NOT NULL COMMENT '租户编码', + name VARCHAR(100) NOT NULL COMMENT '租户名称', + address VARCHAR(255) NULL COMMENT '租户地址', + contact_name VARCHAR(50) NULL COMMENT '联系人姓名', + contact_phone VARCHAR(20) NULL COMMENT '联系人电话', + email VARCHAR(100) NULL COMMENT '联系人邮箱', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - CONSTRAINT UK_tenant_code UNIQUE (code) + CONSTRAINT UK_tenant_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表'; @@ -48,25 +49,26 @@ CREATE TABLE sys_department ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; -- 用户表 -CREATE TABLE sys_user ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', +CREATE TABLE sys_user +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - username VARCHAR(50) NOT NULL COMMENT '用户名', - password VARCHAR(255) NOT NULL COMMENT '密码', - nickname VARCHAR(50) NULL COMMENT '昵称', - email VARCHAR(100) NULL COMMENT '邮箱', - phone VARCHAR(20) NULL COMMENT '手机号', - department_id BIGINT NULL COMMENT '所属部门ID', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + username VARCHAR(50) NOT NULL COMMENT '用户名', + password VARCHAR(255) NOT NULL COMMENT '密码', + nickname VARCHAR(50) NULL COMMENT '昵称', + email VARCHAR(100) NULL COMMENT '邮箱', + phone VARCHAR(20) NULL COMMENT '手机号', + department_id BIGINT NULL COMMENT '所属部门ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - CONSTRAINT UK_user_username UNIQUE (username), - CONSTRAINT FK_user_department FOREIGN KEY (department_id) REFERENCES sys_department(id) + CONSTRAINT UK_user_username UNIQUE (username), + CONSTRAINT FK_user_department FOREIGN KEY (department_id) REFERENCES sys_department (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; -- 系统参数表 @@ -135,6 +137,7 @@ CREATE TABLE sys_role type TINYINT NOT NULL DEFAULT 2 COMMENT '角色类型(1:系统角色,2:自定义角色)', description VARCHAR(255) NULL COMMENT '角色描述', sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + is_admin BIT NOT NULL DEFAULT 0 COMMENT '是否超级管理员(0:否,1:是,超级管理员拥有所有权限且不可删除)', CONSTRAINT UK_role_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表'; @@ -246,7 +249,7 @@ CREATE TABLE sys_role_permission ( role_id BIGINT NOT NULL COMMENT '角色ID', permission_id BIGINT NOT NULL COMMENT '权限ID', - + PRIMARY KEY (role_id, permission_id), CONSTRAINT FK_role_permission_role FOREIGN KEY (role_id) REFERENCES sys_role (id), CONSTRAINT FK_role_permission_permission FOREIGN KEY (permission_id) REFERENCES sys_permission (id) @@ -304,7 +307,7 @@ CREATE TABLE deploy_repo_group web_url VARCHAR(255) NULL COMMENT '网页URL', visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', sort INT DEFAULT 0 COMMENT '排序号', - repo_group_id BIGINT NOT NULL COMMENT 'Git系统中的组ID', + repo_group_id BIGINT NOT NULL COMMENT 'Git系统中的组ID', create_by VARCHAR(100) NULL COMMENT '创建人', create_time DATETIME(6) NULL COMMENT '创建时间', @@ -333,9 +336,9 @@ CREATE TABLE deploy_repo_project path_with_namespace VARCHAR(500) NULL COMMENT '带命名空间的路径', created_at DATETIME(6) NULL COMMENT '创建时间', - external_system_id BIGINT NOT NULL COMMENT '外部系统ID', - repo_group_id BIGINT NOT NULL COMMENT '项目ID', - repo_project_id BIGINT NOT NULL COMMENT '项目ID', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + repo_group_id BIGINT NOT NULL COMMENT '项目ID', + repo_project_id BIGINT NOT NULL COMMENT '项目ID', create_by VARCHAR(255) NULL COMMENT '创建人', create_time DATETIME(6) NULL COMMENT '创建时间', @@ -358,20 +361,20 @@ CREATE TABLE deploy_repo_branch can_push BIT DEFAULT 1 COMMENT '是否可推送:0-否,1-是', developers_can_push BIT DEFAULT 1 COMMENT '开发者是否可推送:0-否,1-是', developers_can_merge BIT DEFAULT 1 COMMENT '开发者是否可合并:0-否,1-是', - last_commit_id VARCHAR(64) NULL COMMENT '最新提交ID', - commit_message TEXT NULL COMMENT '最新提交信息', + last_commit_id VARCHAR(64) NULL COMMENT '最新提交ID', + commit_message TEXT NULL COMMENT '最新提交信息', commit_author VARCHAR(100) NULL COMMENT '最新提交作者', - commit_date DATETIME(6) NULL COMMENT '最新提交时间(authored_date)', - last_update_time DATETIME(6) NULL COMMENT '分支最后更新时间(committed_date)', + commit_date DATETIME(6) NULL COMMENT '最新提交时间(authored_date)', + last_update_time DATETIME(6) NULL COMMENT '分支最后更新时间(committed_date)', web_url VARCHAR(1000) NULL COMMENT '网页URL', project_id BIGINT NOT NULL COMMENT '所属项目ID', external_system_id BIGINT NOT NULL COMMENT '外部系统ID', repo_project_id BIGINT NOT NULL COMMENT 'GitLab的真实project_id', create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', + create_time DATETIME(6) NULL COMMENT '创建时间', update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', + update_time DATETIME(6) NULL COMMENT '更新时间', version INT NOT NULL DEFAULT 1 COMMENT '版本号', deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除' @@ -384,107 +387,107 @@ CREATE TABLE deploy_repo_branch -- 工作流分类表 CREATE TABLE workflow_category ( - -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - -- 基础信息 - name VARCHAR(100) NOT NULL COMMENT '分类名称', - code VARCHAR(50) NOT NULL COMMENT '分类编码(唯一,如SCRIPT_EXECUTION)', - description VARCHAR(500) NULL COMMENT '分类描述', - icon VARCHAR(50) NULL COMMENT '图标', - sort INT NOT NULL DEFAULT 0 COMMENT '排序', - - -- 支持的触发方式(JSON数组,如["MANUAL","SCHEDULED"]) - supported_triggers JSON NULL COMMENT '支持的触发方式列表', - - -- 状态 - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', + -- 基础信息 + name VARCHAR(100) NOT NULL COMMENT '分类名称', + code VARCHAR(50) NOT NULL COMMENT '分类编码(唯一,如SCRIPT_EXECUTION)', + description VARCHAR(500) NULL COMMENT '分类描述', + icon VARCHAR(50) NULL COMMENT '图标', + sort INT NOT NULL DEFAULT 0 COMMENT '排序', - -- 审计字段 - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + -- 支持的触发方式(JSON数组,如["MANUAL","SCHEDULED"]) + supported_triggers JSON NULL COMMENT '支持的触发方式列表', - -- 约束和索引 - UNIQUE KEY uk_code (code), - INDEX idx_enabled (enabled), - INDEX idx_deleted (deleted), - INDEX idx_sort (sort) + -- 状态 + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', + + -- 审计字段 + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + -- 约束和索引 + UNIQUE KEY uk_code (code), + INDEX idx_enabled (enabled), + INDEX idx_deleted (deleted), + INDEX idx_sort (sort) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '工作流分类表'; CREATE TABLE form_category ( - -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - -- 基础信息 - name VARCHAR(100) NOT NULL COMMENT '分类名称', - code VARCHAR(50) NOT NULL COMMENT '分类编码(唯一)', - description VARCHAR(500) NULL COMMENT '分类描述', - icon VARCHAR(50) NULL COMMENT '图标', - sort INT NOT NULL DEFAULT 0 COMMENT '排序', - - -- 状态 - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', + -- 基础信息 + name VARCHAR(100) NOT NULL COMMENT '分类名称', + code VARCHAR(50) NOT NULL COMMENT '分类编码(唯一)', + description VARCHAR(500) NULL COMMENT '分类描述', + icon VARCHAR(50) NULL COMMENT '图标', + sort INT NOT NULL DEFAULT 0 COMMENT '排序', - -- 审计字段 - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + -- 状态 + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', - -- 约束和索引 - UNIQUE KEY uk_code (code), - INDEX idx_enabled (enabled), - INDEX idx_deleted (deleted), - INDEX idx_sort (sort) + -- 审计字段 + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + -- 约束和索引 + UNIQUE KEY uk_code (code), + INDEX idx_enabled (enabled), + INDEX idx_deleted (deleted), + INDEX idx_sort (sort) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '表单分类表'; -- 表单定义表 CREATE TABLE form_definition ( - -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - -- 基础信息 - name VARCHAR(255) NOT NULL COMMENT '表单名称', - `key` VARCHAR(255) NOT NULL COMMENT '表单标识(业务唯一)', - form_version INT NOT NULL DEFAULT 1 COMMENT '表单版本号', - category_id BIGINT NULL COMMENT '表单分类ID(外键关联form_category)', - description TEXT NULL COMMENT '表单描述', + -- 基础信息 + name VARCHAR(255) NOT NULL COMMENT '表单名称', + `key` VARCHAR(255) NOT NULL COMMENT '表单标识(业务唯一)', + form_version INT NOT NULL DEFAULT 1 COMMENT '表单版本号', + category_id BIGINT NULL COMMENT '表单分类ID(外键关联form_category)', + description TEXT NULL COMMENT '表单描述', - -- 表单配置 - `schema` JSON NOT NULL COMMENT '表单Schema(前端设计器导出的JSON结构)', - tags JSON NULL COMMENT '标签(用于分类和搜索)', + -- 表单配置 + `schema` JSON NOT NULL COMMENT '表单Schema(前端设计器导出的JSON结构)', + tags JSON NULL COMMENT '标签(用于分类和搜索)', - -- 表单属性 - status VARCHAR(50) NOT NULL DEFAULT 'DRAFT' COMMENT '状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', - is_template BIT NOT NULL DEFAULT 0 COMMENT '是否为模板', + -- 表单属性 + status VARCHAR(50) NOT NULL DEFAULT 'DRAFT' COMMENT '状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', + is_template BIT NULL DEFAULT 0 COMMENT '是否为模板', - -- 审计字段 - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + -- 审计字段 + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - -- 约束和索引 - UNIQUE KEY uk_key_version (`key`, form_version), - INDEX idx_category_id (category_id), - INDEX idx_status (status), - INDEX idx_is_template (is_template), - INDEX idx_deleted (deleted), - - -- 外键约束 - CONSTRAINT fk_form_definition_category FOREIGN KEY (category_id) REFERENCES form_category(id) + -- 约束和索引 + UNIQUE KEY uk_key_version (`key`, form_version), + INDEX idx_category_id (category_id), + INDEX idx_status (status), + INDEX idx_is_template (is_template), + INDEX idx_deleted (deleted), + + -- 外键约束 + CONSTRAINT fk_form_definition_category FOREIGN KEY (category_id) REFERENCES form_category (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '表单定义表'; @@ -492,40 +495,40 @@ CREATE TABLE form_definition CREATE TABLE workflow_definition ( -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', -- 基础信息 - name VARCHAR(255) NOT NULL COMMENT '流程名称', - `key` VARCHAR(255) NOT NULL COMMENT '流程标识', - category_id BIGINT NULL COMMENT '流程分类ID(外键关联workflow_category)', - form_definition_id BIGINT NULL COMMENT '启动表单ID(外键关联form_definition)', - process_definition_id VARCHAR(100) NULL COMMENT '工作流定义ID', - flow_version INT NOT NULL COMMENT '流程版本', - description TEXT COMMENT '流程描述', + name VARCHAR(255) NOT NULL COMMENT '流程名称', + `key` VARCHAR(255) NOT NULL COMMENT '流程标识', + category_id BIGINT NULL COMMENT '流程分类ID(外键关联workflow_category)', + form_definition_id BIGINT NULL COMMENT '启动表单ID(外键关联form_definition)', + process_definition_id VARCHAR(100) NULL COMMENT '工作流定义ID', + flow_version INT NOT NULL COMMENT '流程版本', + description TEXT COMMENT '流程描述', -- 流程配置 - bpmn_xml TEXT COMMENT 'BPMN XML内容', - graph JSON COMMENT '流程图数据,包含节点和连线的位置、样式等信息', + bpmn_xml TEXT COMMENT 'BPMN XML内容', + graph JSON COMMENT '流程图数据,包含节点和连线的位置、样式等信息', -- 流程属性 - status VARCHAR(50) NOT NULL COMMENT '流程状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', + status VARCHAR(50) NOT NULL COMMENT '流程状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', -- 审计字段 - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', -- 约束和索引 UNIQUE KEY uk_key_version (`key`, flow_version), - INDEX idx_category_id (category_id), - INDEX idx_form_definition_id (form_definition_id), - INDEX idx_status (status), - INDEX idx_deleted (deleted), - CONSTRAINT fk_workflow_definition_category FOREIGN KEY (category_id) REFERENCES workflow_category(id), - CONSTRAINT fk_workflow_definition_form FOREIGN KEY (form_definition_id) REFERENCES form_definition(id) + INDEX idx_category_id (category_id), + INDEX idx_form_definition_id (form_definition_id), + INDEX idx_status (status), + INDEX idx_deleted (deleted), + CONSTRAINT fk_workflow_definition_category FOREIGN KEY (category_id) REFERENCES workflow_category (id), + CONSTRAINT fk_workflow_definition_form FOREIGN KEY (form_definition_id) REFERENCES form_definition (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='工作流定义表'; @@ -538,7 +541,7 @@ CREATE TABLE workflow_node_definition node_code VARCHAR(50) NOT NULL COMMENT '节点编码', node_name VARCHAR(100) NOT NULL COMMENT '节点名称', description VARCHAR(500) COMMENT '节点描述', - category VARCHAR(50) COMMENT '节点分类', + category VARCHAR(50) COMMENT '节点分类', ui_variables JSON NOT NULL COMMENT '节点UI', panel_variables_schema JSON NOT NULL COMMENT '节点属性', local_variables_schema JSON NOT NULL COMMENT '节点环境变量', @@ -560,48 +563,48 @@ CREATE TABLE workflow_node_definition -- 表单数据表 CREATE TABLE form_data ( - -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - -- 关联表单定义 - form_definition_id BIGINT NOT NULL COMMENT '表单定义ID', - form_key VARCHAR(255) NOT NULL COMMENT '表单标识(冗余存储,避免JOIN)', - form_version INT NOT NULL COMMENT '表单版本(冗余存储,用于历史追溯)', - category_id BIGINT NULL COMMENT '表单分类ID(冗余存储,便于统计和查询)', + -- 关联表单定义 + form_definition_id BIGINT NOT NULL COMMENT '表单定义ID', + form_key VARCHAR(255) NOT NULL COMMENT '表单标识(冗余存储,避免JOIN)', + form_version INT NOT NULL COMMENT '表单版本(冗余存储,用于历史追溯)', + category_id BIGINT NULL COMMENT '表单分类ID(冗余存储,便于统计和查询)', - -- 业务关联(松耦合) - business_key VARCHAR(255) NULL COMMENT '业务标识(如工作流实例ID、订单号等)', - business_type VARCHAR(50) NULL COMMENT '业务类型(WORKFLOW-工作流、ORDER-订单、STANDALONE-独立表单)', + -- 业务关联(松耦合) + business_key VARCHAR(255) NULL COMMENT '业务标识(如工作流实例ID、订单号等)', + business_type VARCHAR(50) NULL COMMENT '业务类型(WORKFLOW-工作流、ORDER-订单、STANDALONE-独立表单)', - -- 表单数据 - data JSON NOT NULL COMMENT '表单填写数据(用户提交的实际数据)', - schema_snapshot JSON NOT NULL COMMENT '表单Schema快照(用于历史追溯,确保数据可还原)', + -- 表单数据 + data JSON NOT NULL COMMENT '表单填写数据(用户提交的实际数据)', + schema_snapshot JSON NOT NULL COMMENT '表单Schema快照(用于历史追溯,确保数据可还原)', - -- 提交信息 - submitter VARCHAR(255) NULL COMMENT '提交人', - submit_time DATETIME(6) NULL COMMENT '提交时间', + -- 提交信息 + submitter VARCHAR(255) NULL COMMENT '提交人', + submit_time DATETIME(6) NULL COMMENT '提交时间', - -- 状态 - status VARCHAR(50) NOT NULL DEFAULT 'SUBMITTED' COMMENT '状态(DRAFT-草稿、SUBMITTED-已提交、COMPLETED-已完成、REJECTED-已拒绝)', + -- 状态 + status VARCHAR(50) NOT NULL DEFAULT 'SUBMITTED' COMMENT '状态(DRAFT-草稿、SUBMITTED-已提交、COMPLETED-已完成、REJECTED-已拒绝)', - -- 审计字段 - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + -- 审计字段 + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - -- 索引 - INDEX idx_form_definition_id (form_definition_id), - INDEX idx_form_key (form_key), - INDEX idx_category_id (category_id), - INDEX idx_business_key (business_key), - INDEX idx_business_type (business_type), - INDEX idx_submitter (submitter), - INDEX idx_status (status), - INDEX idx_submit_time (submit_time), - INDEX idx_deleted (deleted) + -- 索引 + INDEX idx_form_definition_id (form_definition_id), + INDEX idx_form_key (form_key), + INDEX idx_category_id (category_id), + INDEX idx_business_key (business_key), + INDEX idx_business_type (business_type), + INDEX idx_submitter (submitter), + INDEX idx_status (status), + INDEX idx_submit_time (submit_time), + INDEX idx_deleted (deleted) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '表单数据表'; @@ -620,16 +623,16 @@ CREATE TABLE workflow_instance process_definition_id VARCHAR(64) NOT NULL COMMENT '流程定义ID', workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID', business_key VARCHAR(64) NULL COMMENT '业务标识', - form_data_id BIGINT NULL COMMENT '启动表单数据ID(外键关联form_data)', + form_data_id BIGINT NULL COMMENT '启动表单数据ID(外键关联form_data)', status ENUM('NOT_STARTED','CREATED','RUNNING','SUSPENDED','COMPLETED','COMPLETED_WITH_ERRORS','TERMINATED','FAILED') NOT NULL COMMENT '实例状态', variables TEXT NULL COMMENT '流程变量(JSON)', form_data JSON NULL COMMENT '表单数据(JSON)', graph_snapshot JSON NULL COMMENT '流程图数据快照(启动时保存,用于画布还原)', start_time DATETIME(6) NULL COMMENT '开始时间', end_time DATETIME(6) NULL COMMENT '结束时间', - - INDEX idx_form_data_id (form_data_id), - CONSTRAINT fk_workflow_instance_form_data FOREIGN KEY (form_data_id) REFERENCES form_data(id) + + INDEX idx_form_data_id (form_data_id), + CONSTRAINT fk_workflow_instance_form_data FOREIGN KEY (form_data_id) REFERENCES form_data (id) -- CONSTRAINT FK_workflow_instance_definition FOREIGN KEY (process_definition_id) REFERENCES workflow_definition(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流实例表'; @@ -692,9 +695,9 @@ CREATE TABLE deploy_application_category -- 基础字段 id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', + create_time DATETIME(6) NULL COMMENT '创建时间', update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', + update_time DATETIME(6) NULL COMMENT '更新时间', version INT NOT NULL DEFAULT 1 COMMENT '版本号', deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', @@ -702,10 +705,10 @@ CREATE TABLE deploy_application_category code VARCHAR(50) NOT NULL COMMENT '分类编码', name VARCHAR(100) NOT NULL COMMENT '分类名称', description VARCHAR(500) NULL COMMENT '分类描述', - icon VARCHAR(50) NULL COMMENT '图标', + icon VARCHAR(50) NULL COMMENT '图标', enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', sort INT NOT NULL DEFAULT 0 COMMENT '排序号', - + UNIQUE INDEX uk_code (code) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 @@ -719,21 +722,21 @@ CREATE TABLE deploy_application app_code VARCHAR(50) NOT NULL COMMENT '应用编码', app_name VARCHAR(100) NOT NULL COMMENT '应用名称', app_desc VARCHAR(255) NULL COMMENT '应用描述', - language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS', - repo_project_id BIGINT NULL COMMENT '代码仓库项目ID', - application_category_id BIGINT NULL COMMENT '所属应用分类ID', + language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS', + repo_project_id BIGINT NULL COMMENT '代码仓库项目ID', + application_category_id BIGINT NULL COMMENT '所属应用分类ID', enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', sort INT NOT NULL DEFAULT 0 COMMENT '排序号', -- 基础字段 create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', + create_time DATETIME(6) NULL COMMENT '创建时间', update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', + update_time DATETIME(6) NULL COMMENT '更新时间', version INT NOT NULL DEFAULT 1 COMMENT '版本号', deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', -- 索引 - INDEX idx_application_category_id (application_category_id) COMMENT '应用分类ID索引', + INDEX idx_application_category_id (application_category_id) COMMENT '应用分类ID索引', UNIQUE INDEX uk_app_code (application_category_id, app_code) COMMENT '分类下应用编码唯一', -- 外键约束 @@ -746,120 +749,120 @@ CREATE TABLE deploy_application CREATE TABLE deploy_environment ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - -- 业务字段 - tenant_code VARCHAR(50) DEFAULT NULL COMMENT '租户编码', - env_code VARCHAR(50) NOT NULL COMMENT '环境编码', - env_name VARCHAR(100) NOT NULL COMMENT '环境名称', - env_desc VARCHAR(255) NULL COMMENT '环境描述', + -- 业务字段 + tenant_code VARCHAR(50) DEFAULT NULL COMMENT '租户编码', + env_code VARCHAR(50) NOT NULL COMMENT '环境编码', + env_name VARCHAR(100) NOT NULL COMMENT '环境名称', + env_desc VARCHAR(255) NULL COMMENT '环境描述', enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', - -- 基础字段 - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + -- 基础字段 + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - -- 索引 - UNIQUE INDEX uk_env_code (env_code) COMMENT '环境编码唯一' + -- 索引 + UNIQUE INDEX uk_env_code (env_code) COMMENT '环境编码唯一' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='环境表'; -- 团队表 CREATE TABLE deploy_team ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - team_code VARCHAR(50) NOT NULL COMMENT '团队编码', - team_name VARCHAR(100) NOT NULL COMMENT '团队名称', - description VARCHAR(500) NULL COMMENT '团队描述', - owner_id BIGINT NULL COMMENT '团队负责人用户ID', - owner_name VARCHAR(50) NULL COMMENT '团队负责人姓名(冗余)', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', - sort INT NOT NULL DEFAULT 0 COMMENT '排序号', - - UNIQUE INDEX uk_team_code (team_code), - INDEX idx_owner (owner_id), - CONSTRAINT fk_team_owner FOREIGN KEY (owner_id) REFERENCES sys_user(id) + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + team_code VARCHAR(50) NOT NULL COMMENT '团队编码', + team_name VARCHAR(100) NOT NULL COMMENT '团队名称', + description VARCHAR(500) NULL COMMENT '团队描述', + owner_id BIGINT NULL COMMENT '团队负责人用户ID', + owner_name VARCHAR(50) NULL COMMENT '团队负责人姓名(冗余)', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + + UNIQUE INDEX uk_team_code (team_code), + INDEX idx_owner (owner_id), + CONSTRAINT fk_team_owner FOREIGN KEY (owner_id) REFERENCES sys_user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队表'; -- 团队成员表 CREATE TABLE deploy_team_member ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - team_id BIGINT NOT NULL COMMENT '团队ID', - user_id BIGINT NOT NULL COMMENT '用户ID', - user_name VARCHAR(50) NULL COMMENT '用户名(冗余)', - role_in_team VARCHAR(50) NULL COMMENT '团队角色(如:开发、测试、运维、负责人)', - join_time DATETIME(6) NULL COMMENT '加入时间', - - UNIQUE INDEX uk_team_user (team_id, user_id), - INDEX idx_user (user_id), - CONSTRAINT fk_team_member_team FOREIGN KEY (team_id) REFERENCES deploy_team(id), - CONSTRAINT fk_team_member_user FOREIGN KEY (user_id) REFERENCES sys_user(id) + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + team_id BIGINT NOT NULL COMMENT '团队ID', + user_id BIGINT NOT NULL COMMENT '用户ID', + user_name VARCHAR(50) NULL COMMENT '用户名(冗余)', + role_in_team VARCHAR(50) NULL COMMENT '团队角色(如:开发、测试、运维、负责人)', + join_time DATETIME(6) NULL COMMENT '加入时间', + + UNIQUE INDEX uk_team_user (team_id, user_id), + INDEX idx_user (user_id), + CONSTRAINT fk_team_member_team FOREIGN KEY (team_id) REFERENCES deploy_team (id), + CONSTRAINT fk_team_member_user FOREIGN KEY (user_id) REFERENCES sys_user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队成员表'; -- 团队应用关联表 CREATE TABLE deploy_team_application ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - team_id BIGINT NOT NULL COMMENT '团队ID', - application_id BIGINT NOT NULL COMMENT '应用ID', - environment_id BIGINT NOT NULL COMMENT '环境ID', - branch VARCHAR(100) NULL COMMENT '分支名称', - - UNIQUE INDEX uk_team_app_env (team_id, application_id, environment_id), - INDEX idx_team (team_id), - INDEX idx_application (application_id), - INDEX idx_environment (environment_id), - CONSTRAINT fk_team_app_team FOREIGN KEY (team_id) REFERENCES deploy_team(id), - CONSTRAINT fk_team_app_application FOREIGN KEY (application_id) REFERENCES deploy_application(id) + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + team_id BIGINT NOT NULL COMMENT '团队ID', + application_id BIGINT NOT NULL COMMENT '应用ID', + environment_id BIGINT NOT NULL COMMENT '环境ID', + branch VARCHAR(100) NULL COMMENT '分支名称', + + UNIQUE INDEX uk_team_app_env (team_id, application_id, environment_id), + INDEX idx_team (team_id), + INDEX idx_application (application_id), + INDEX idx_environment (environment_id), + CONSTRAINT fk_team_app_team FOREIGN KEY (team_id) REFERENCES deploy_team (id), + CONSTRAINT fk_team_app_application FOREIGN KEY (application_id) REFERENCES deploy_application (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队应用关联表'; -- 团队配置表 CREATE TABLE deploy_team_config ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - team_id BIGINT NOT NULL COMMENT '团队ID', - - -- 环境权限配置 - allowed_environment_ids JSON NULL COMMENT '团队可访问的环境ID列表,如:[1, 2, 3]', - - -- 审批配置(与allowed_environment_ids位置对应) - environment_approval_required JSON NULL COMMENT '各环境是否需要审批(boolean数组),如:[false, false, true]', - approver_user_ids JSON NULL COMMENT '各环境的审批人列表(数组,无审批人用null),如:[null, null, [1, 4]]', - - UNIQUE INDEX uk_team (team_id), - INDEX idx_deleted (deleted), - CONSTRAINT fk_team_config_team FOREIGN KEY (team_id) REFERENCES deploy_team(id) + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + team_id BIGINT NOT NULL COMMENT '团队ID', + + -- 环境权限配置 + allowed_environment_ids JSON NULL COMMENT '团队可访问的环境ID列表,如:[1, 2, 3]', + + -- 审批配置(与allowed_environment_ids位置对应) + environment_approval_required JSON NULL COMMENT '各环境是否需要审批(boolean数组),如:[false, false, true]', + approver_user_ids JSON NULL COMMENT '各环境的审批人列表(数组,无审批人用null),如:[null, null, [1, 4]]', + + UNIQUE INDEX uk_team (team_id), + INDEX idx_deleted (deleted), + CONSTRAINT fk_team_config_team FOREIGN KEY (team_id) REFERENCES deploy_team (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队配置表'; -- -------------------------------------------------------------------------------------- @@ -867,24 +870,25 @@ CREATE TABLE deploy_team_config -- -------------------------------------------------------------------------------------- -- 通知渠道配置表 -CREATE TABLE sys_notification_channel ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - name VARCHAR(100) NOT NULL COMMENT '渠道名称(如:研发部企业微信群)', - channel_type VARCHAR(50) NOT NULL COMMENT '渠道类型(WEWORK, FEISHU, DINGTALK, SMS, EMAIL, SLACK)', - config JSON NOT NULL COMMENT '渠道配置(JSON格式,不同渠道存储不同字段)', - status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态(ENABLED-启用, DISABLED-禁用)', - description VARCHAR(500) NULL COMMENT '描述说明', - - INDEX idx_channel_type (channel_type), - INDEX idx_status (status), - INDEX idx_deleted (deleted) +CREATE TABLE sys_notification_channel +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '渠道名称(如:研发部企业微信群)', + channel_type VARCHAR(50) NOT NULL COMMENT '渠道类型(WEWORK, FEISHU, DINGTALK, SMS, EMAIL, SLACK)', + config JSON NOT NULL COMMENT '渠道配置(JSON格式,不同渠道存储不同字段)', + status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态(ENABLED-启用, DISABLED-禁用)', + description VARCHAR(500) NULL COMMENT '描述说明', + + INDEX idx_channel_type (channel_type), + INDEX idx_status (status), + INDEX idx_deleted (deleted) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知渠道配置表'; -- -------------------------------------------------------------------------------------- @@ -892,108 +896,111 @@ CREATE TABLE sys_notification_channel ( -- -------------------------------------------------------------------------------------- -- 定时任务分类表 -CREATE TABLE schedule_job_category ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - code VARCHAR(50) NOT NULL COMMENT '分类编码', - name VARCHAR(100) NOT NULL COMMENT '分类名称', - description VARCHAR(500) NULL COMMENT '描述', - icon VARCHAR(50) NULL COMMENT '图标', - color VARCHAR(20) NULL COMMENT '颜色', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', - sort INT NOT NULL DEFAULT 0 COMMENT '排序号', - - UNIQUE INDEX uk_code (code, deleted), - INDEX idx_enabled (enabled) +CREATE TABLE schedule_job_category +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + code VARCHAR(50) NOT NULL COMMENT '分类编码', + name VARCHAR(100) NOT NULL COMMENT '分类名称', + description VARCHAR(500) NULL COMMENT '描述', + icon VARCHAR(50) NULL COMMENT '图标', + color VARCHAR(20) NULL COMMENT '颜色', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + + UNIQUE INDEX uk_code (code, deleted), + INDEX idx_enabled (enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='定时任务分类表'; -- 定时任务表 -CREATE TABLE schedule_job ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - job_name VARCHAR(100) NOT NULL COMMENT '任务名称', - job_description VARCHAR(500) NULL COMMENT '任务描述', - category_id BIGINT NOT NULL COMMENT '任务分类ID', - - -- 执行配置 - bean_name VARCHAR(100) NOT NULL COMMENT 'Spring Bean名称', - method_name VARCHAR(100) NOT NULL COMMENT '方法名称', - form_definition_id BIGINT NULL COMMENT '参数表单ID', - method_params TEXT NULL COMMENT '方法参数JSON', - - -- 调度配置 - cron_expression VARCHAR(100) NOT NULL COMMENT 'Cron表达式', - status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '任务状态:ENABLED-启用、DISABLED-禁用、PAUSED-暂停', - concurrent BIT NOT NULL DEFAULT 0 COMMENT '是否允许并发执行', - - -- 统计信息 - last_execute_time DATETIME(6) NULL COMMENT '上次执行时间', - next_execute_time DATETIME(6) NULL COMMENT '下次执行时间', - execute_count INT NOT NULL DEFAULT 0 COMMENT '执行次数', - success_count INT NOT NULL DEFAULT 0 COMMENT '成功次数', - fail_count INT NOT NULL DEFAULT 0 COMMENT '失败次数', - - -- 高级配置 - timeout_seconds INT NULL COMMENT '超时时间(秒)', - retry_count INT NOT NULL DEFAULT 0 COMMENT '失败重试次数', - alert_email VARCHAR(500) NULL COMMENT '告警邮箱(多个用逗号分隔)', - - UNIQUE INDEX uk_job_name (job_name, deleted), - INDEX idx_category (category_id), - INDEX idx_status (status), - INDEX idx_next_execute_time (next_execute_time), - CONSTRAINT fk_job_category FOREIGN KEY (category_id) REFERENCES schedule_job_category(id), - CONSTRAINT fk_job_form FOREIGN KEY (form_definition_id) REFERENCES form_definition(id) +CREATE TABLE schedule_job +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + job_name VARCHAR(100) NOT NULL COMMENT '任务名称', + job_description VARCHAR(500) NULL COMMENT '任务描述', + category_id BIGINT NOT NULL COMMENT '任务分类ID', + + -- 执行配置 + bean_name VARCHAR(100) NOT NULL COMMENT 'Spring Bean名称', + method_name VARCHAR(100) NOT NULL COMMENT '方法名称', + form_definition_id BIGINT NULL COMMENT '参数表单ID', + method_params TEXT NULL COMMENT '方法参数JSON', + + -- 调度配置 + cron_expression VARCHAR(100) NOT NULL COMMENT 'Cron表达式', + status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '任务状态:ENABLED-启用、DISABLED-禁用、PAUSED-暂停', + concurrent BIT NOT NULL DEFAULT 0 COMMENT '是否允许并发执行', + + -- 统计信息 + last_execute_time DATETIME(6) NULL COMMENT '上次执行时间', + next_execute_time DATETIME(6) NULL COMMENT '下次执行时间', + execute_count INT NOT NULL DEFAULT 0 COMMENT '执行次数', + success_count INT NOT NULL DEFAULT 0 COMMENT '成功次数', + fail_count INT NOT NULL DEFAULT 0 COMMENT '失败次数', + + -- 高级配置 + timeout_seconds INT NULL COMMENT '超时时间(秒)', + retry_count INT NOT NULL DEFAULT 0 COMMENT '失败重试次数', + alert_email VARCHAR(500) NULL COMMENT '告警邮箱(多个用逗号分隔)', + + UNIQUE INDEX uk_job_name (job_name, deleted), + INDEX idx_category (category_id), + INDEX idx_status (status), + INDEX idx_next_execute_time (next_execute_time), + CONSTRAINT fk_job_category FOREIGN KEY (category_id) REFERENCES schedule_job_category (id), + CONSTRAINT fk_job_form FOREIGN KEY (form_definition_id) REFERENCES form_definition (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='定时任务表'; -- 定时任务执行日志表 -CREATE TABLE schedule_job_log ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - job_id BIGINT NOT NULL COMMENT '任务ID', - job_name VARCHAR(100) NOT NULL COMMENT '任务名称', - - -- 执行信息 - bean_name VARCHAR(100) NOT NULL COMMENT '执行器Bean名称', - method_name VARCHAR(100) NOT NULL COMMENT '执行方法名称', - method_params TEXT NULL COMMENT '方法参数', - - -- 时间统计 - execute_time DATETIME(6) NOT NULL COMMENT '开始执行时间', - finish_time DATETIME(6) NULL COMMENT '完成时间', - duration BIGINT NULL COMMENT '执行耗时(毫秒)', - - -- 状态信息 - status VARCHAR(20) NOT NULL COMMENT '执行状态:SUCCESS-成功、FAIL-失败、TIMEOUT-超时', - result_message TEXT NULL COMMENT '执行结果消息', - exception_info TEXT NULL COMMENT '异常堆栈信息', - - -- 服务器信息 - server_ip VARCHAR(50) NULL COMMENT '执行服务器IP', - server_host VARCHAR(100) NULL COMMENT '执行服务器主机名', - - INDEX idx_job_id (job_id), - INDEX idx_execute_time (execute_time), - INDEX idx_status (status), - CONSTRAINT fk_log_job FOREIGN KEY (job_id) REFERENCES schedule_job(id) +CREATE TABLE schedule_job_log +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', + + job_id BIGINT NOT NULL COMMENT '任务ID', + job_name VARCHAR(100) NOT NULL COMMENT '任务名称', + + -- 执行信息 + bean_name VARCHAR(100) NOT NULL COMMENT '执行器Bean名称', + method_name VARCHAR(100) NOT NULL COMMENT '执行方法名称', + method_params TEXT NULL COMMENT '方法参数', + + -- 时间统计 + execute_time DATETIME(6) NOT NULL COMMENT '开始执行时间', + finish_time DATETIME(6) NULL COMMENT '完成时间', + duration BIGINT NULL COMMENT '执行耗时(毫秒)', + + -- 状态信息 + status VARCHAR(20) NOT NULL COMMENT '执行状态:SUCCESS-成功、FAIL-失败、TIMEOUT-超时', + result_message TEXT NULL COMMENT '执行结果消息', + exception_info TEXT NULL COMMENT '异常堆栈信息', + + -- 服务器信息 + server_ip VARCHAR(50) NULL COMMENT '执行服务器IP', + server_host VARCHAR(100) NULL COMMENT '执行服务器主机名', + + INDEX idx_job_id (job_id), + INDEX idx_execute_time (execute_time), + INDEX idx_status (status), + CONSTRAINT fk_log_job FOREIGN KEY (job_id) REFERENCES schedule_job (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='定时任务执行日志表'; -- ===================================================== @@ -1001,61 +1008,63 @@ CREATE TABLE schedule_job_log ( -- ===================================================== -- 服务器分类表 -CREATE TABLE deploy_server_category ( - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - name VARCHAR(50) NOT NULL UNIQUE COMMENT '分类名称', - code VARCHAR(50) NOT NULL UNIQUE COMMENT '分类编码', - icon VARCHAR(50) NULL COMMENT '图标', - description VARCHAR(500) NULL COMMENT '分类描述', - sort INT DEFAULT 0 COMMENT '排序', - enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用', - - -- 审计字段 - create_by VARCHAR(50) NULL COMMENT '创建人', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_by VARCHAR(50) NULL COMMENT '更新人', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - version INT DEFAULT 1 COMMENT '版本号', - deleted BOOLEAN DEFAULT FALSE COMMENT '是否删除', - - INDEX idx_code (code), - INDEX idx_enabled (enabled) +CREATE TABLE deploy_server_category +( + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + name VARCHAR(50) NOT NULL UNIQUE COMMENT '分类名称', + code VARCHAR(50) NOT NULL UNIQUE COMMENT '分类编码', + icon VARCHAR(50) NULL COMMENT '图标', + description VARCHAR(500) NULL COMMENT '分类描述', + sort INT DEFAULT 0 COMMENT '排序', + enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用', + + -- 审计字段 + create_by VARCHAR(50) NULL COMMENT '创建人', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by VARCHAR(50) NULL COMMENT '更新人', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + version INT DEFAULT 1 COMMENT '版本号', + deleted BOOLEAN DEFAULT FALSE COMMENT '是否删除', + + INDEX idx_code (code), + INDEX idx_enabled (enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服务器分类表'; -- 服务器表 -CREATE TABLE deploy_server ( - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - server_name VARCHAR(100) NOT NULL COMMENT '服务器名称', - host_ip VARCHAR(50) NOT NULL UNIQUE COMMENT 'IP地址', - ssh_port INT DEFAULT 22 COMMENT 'SSH端口', - ssh_user VARCHAR(50) NULL COMMENT 'SSH用户名', - auth_type VARCHAR(20) DEFAULT 'PASSWORD' COMMENT '认证方式:PASSWORD/KEY', - ssh_password VARCHAR(500) NULL COMMENT 'SSH密码(加密存储)', - ssh_private_key TEXT NULL COMMENT 'SSH私钥(加密存储)', - ssh_passphrase VARCHAR(500) NULL COMMENT '私钥密码(加密存储)', - category_id BIGINT NULL COMMENT '服务器分类ID', - os_type VARCHAR(20) NULL COMMENT '操作系统类型:LINUX/WINDOWS/MACOS/UNIX/OTHER', - os_version VARCHAR(100) NULL COMMENT '操作系统版本:CentOS 7.9', - hostname VARCHAR(100) NULL COMMENT '主机名', - status VARCHAR(20) DEFAULT 'OFFLINE' COMMENT '连接状态:ONLINE/OFFLINE', - description VARCHAR(500) NULL COMMENT '服务器描述', - cpu_cores INT NULL COMMENT 'CPU核心数', - memory_size INT NULL COMMENT '内存大小(GB)', - disk_size INT NULL COMMENT '磁盘大小(GB)', - tags JSON NULL COMMENT '标签(JSON格式)', - last_connect_time DATETIME NULL COMMENT '最后连接时间', - - -- 审计字段 - create_by VARCHAR(50) NULL COMMENT '创建人', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_by VARCHAR(50) NULL COMMENT '更新人', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - version INT DEFAULT 1 COMMENT '版本号', - deleted BOOLEAN DEFAULT FALSE COMMENT '是否删除', - - INDEX idx_host_ip (host_ip), - INDEX idx_category_id (category_id), - INDEX idx_status (status), - CONSTRAINT fk_server_category FOREIGN KEY (category_id) REFERENCES deploy_server_category(id) +CREATE TABLE deploy_server +( + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + server_name VARCHAR(100) NOT NULL COMMENT '服务器名称', + host_ip VARCHAR(50) NOT NULL UNIQUE COMMENT 'IP地址', + ssh_port INT DEFAULT 22 COMMENT 'SSH端口', + ssh_user VARCHAR(50) NULL COMMENT 'SSH用户名', + auth_type VARCHAR(20) DEFAULT 'PASSWORD' COMMENT '认证方式:PASSWORD/KEY', + ssh_password VARCHAR(500) NULL COMMENT 'SSH密码(加密存储)', + ssh_private_key TEXT NULL COMMENT 'SSH私钥(加密存储)', + ssh_passphrase VARCHAR(500) NULL COMMENT '私钥密码(加密存储)', + category_id BIGINT NULL COMMENT '服务器分类ID', + os_type VARCHAR(20) NULL COMMENT '操作系统类型:LINUX/WINDOWS/MACOS/UNIX/OTHER', + os_version VARCHAR(100) NULL COMMENT '操作系统版本:CentOS 7.9', + hostname VARCHAR(100) NULL COMMENT '主机名', + status VARCHAR(20) DEFAULT 'OFFLINE' COMMENT '连接状态:ONLINE/OFFLINE', + description VARCHAR(500) NULL COMMENT '服务器描述', + cpu_cores INT NULL COMMENT 'CPU核心数', + memory_size INT NULL COMMENT '内存大小(GB)', + disk_size INT NULL COMMENT '磁盘大小(GB)', + tags JSON NULL COMMENT '标签(JSON格式)', + last_connect_time DATETIME NULL COMMENT '最后连接时间', + + -- 审计字段 + create_by VARCHAR(50) NULL COMMENT '创建人', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by VARCHAR(50) NULL COMMENT '更新人', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + version INT DEFAULT 1 COMMENT '版本号', + deleted BOOLEAN DEFAULT FALSE COMMENT '是否删除', + + INDEX idx_host_ip (host_ip), + INDEX idx_category_id (category_id), + INDEX idx_status (status), + CONSTRAINT fk_server_category FOREIGN KEY (category_id) REFERENCES deploy_server_category (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服务器管理表'; diff --git a/backend/src/main/resources/messages.properties b/backend/src/main/resources/messages.properties index 5c5d82bb..0b0c0eb1 100644 --- a/backend/src/main/resources/messages.properties +++ b/backend/src/main/resources/messages.properties @@ -79,6 +79,7 @@ permission.code.exists=权限编码{0}已存在 permission.name.exists=权限名称{0}已存在 permission.already.assigned=该权限已分配给角色 permission.assign.failed=权限分配失败 +permission.denied=权限不足,无法访问该资源 # 第三方系统相关 (2500-2599) external.system.name.exists=系统名称{0}已存在