Browse Source

权限数据同步搞定

master
hejl 14 hours ago
parent
commit
964c508f4c
  1. 2
      gofaster/app/src/renderer/modules/route-sync/direct-route-mappings.js
  2. 51
      gofaster/backend/internal/auth/controller/resource_controller.go
  3. 3
      gofaster/backend/internal/auth/model/frontend_backend_route.go
  4. 1
      gofaster/backend/internal/auth/model/frontend_route.go
  5. 32
      gofaster/backend/internal/auth/repository/frontend_backend_route_repo.go
  6. 38
      gofaster/backend/internal/auth/repository/route_mapping_repo.go
  7. 6
      gofaster/backend/internal/auth/routes/resource_routes.go
  8. 14
      gofaster/backend/internal/auth/service/frontend_route_service.go

2
gofaster/app/src/renderer/modules/route-sync/direct-route-mappings.js

@ -252,7 +252,7 @@ export default { @@ -252,7 +252,7 @@ export default {
"id": 15,
"component": "PasswordChangeModal",
"module": "user-management",
"triggerName": "passwordchangemodal-input-l447v0",
"triggerName": "passwordchangemodal-input-zhkdt8",
"triggerType": "input"
}
]

51
gofaster/backend/internal/auth/controller/resource_controller.go

@ -270,54 +270,3 @@ func (c *ResourceController) ListResourcesByType(ctx *gin.Context) { @@ -270,54 +270,3 @@ func (c *ResourceController) ListResourcesByType(ctx *gin.Context) {
response.Success(ctx, "获取类型资源成功", resources)
}
// GetAuthGroupStats 获取权限分组统计
// @Summary 获取权限分组统计
// @Description 获取路由映射的权限分组统计信息
// @Tags 资源管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=map[string]int}
// @Failure 400 {object} response.Response
// @Router /api/resources/auth-group-stats [get]
func (c *ResourceController) GetAuthGroupStats(ctx *gin.Context) {
stats, err := c.routeMappingRepo.GetAuthGroupStats()
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取权限分组统计失败", err.Error())
return
}
response.Success(ctx, "获取权限分组统计成功", stats)
}
// ListRoutesByAuthGroup 根据权限分组获取路由列表
// @Summary 根据权限分组获取路由列表
// @Description 根据权限分组获取路由映射列表
// @Tags 资源管理
// @Accept json
// @Produce json
// @Param authGroup path string true "权限分组" Enums(Read, Edit)
// @Success 200 {object} response.Response{data=[]model.RouteMapping}
// @Failure 400 {object} response.Response
// @Router /api/resources/auth-group/{authGroup}/routes [get]
func (c *ResourceController) ListRoutesByAuthGroup(ctx *gin.Context) {
authGroup := ctx.Param("authGroup")
if authGroup == "" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "权限分组不能为空")
return
}
// 验证权限分组值
if authGroup != "Read" && authGroup != "Edit" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "权限分组只能是Read或Edit")
return
}
routes, err := c.routeMappingRepo.FindByAuthGroup(authGroup)
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取权限分组路由失败", err.Error())
return
}
response.Success(ctx, "获取权限分组路由成功", routes)
}

3
gofaster/backend/internal/auth/model/frontend_backend_route.go

@ -11,10 +11,9 @@ type FrontendBackendRoute struct { @@ -11,10 +11,9 @@ type FrontendBackendRoute struct {
FrontendRouteID uint `gorm:"uniqueIndex:idx_frontend_backend_routes_unique" json:"frontend_route_id"` // 前台路由ID
BackendRoute string `gorm:"uniqueIndex:idx_frontend_backend_routes_unique" json:"backend_route"` // 后台API路径
HTTPMethod string `json:"http_method"` // HTTP方法
AuthGroup string `json:"auth_group"` // 权限分组:Read-读取权限,Edit-编辑权限
Component string `json:"component"` // 前端组件名称
Module string `json:"module"` // 所属模块
Description string `json:"description"` // 描述
IsDefault bool `gorm:"default:false" json:"is_default"` // 是否为默认关联
Sort int `gorm:"default:0" json:"sort"` // 排序
Status int `gorm:"default:1" json:"status"` // 状态:1-启用,0-禁用
}

1
gofaster/backend/internal/auth/model/frontend_route.go

@ -7,7 +7,6 @@ import ( @@ -7,7 +7,6 @@ import (
// FrontendRoute 前台路由模型
type FrontendRoute struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Path string `json:"path"` // 前台路由路径
Name string `json:"name"` // 路由名称

32
gofaster/backend/internal/auth/repository/frontend_backend_route_repo.go

@ -52,10 +52,10 @@ func (r *FrontendBackendRouteRepository) FindByModule(module string) ([]*model.F @@ -52,10 +52,10 @@ func (r *FrontendBackendRouteRepository) FindByModule(module string) ([]*model.F
return relations, err
}
// FindByAuthGroup 根据权限分组查找关系
func (r *FrontendBackendRouteRepository) FindByAuthGroup(authGroup string) ([]*model.FrontendBackendRoute, error) {
// FindByComponent 根据组件名称查找关系
func (r *FrontendBackendRouteRepository) FindByComponent(component string) ([]*model.FrontendBackendRoute, error) {
var relations []*model.FrontendBackendRoute
err := r.db.Where("auth_group = ?", authGroup).Order("sort ASC").Find(&relations).Error
err := r.db.Where("component = ?", component).Order("sort ASC").Find(&relations).Error
return relations, err
}
@ -86,15 +86,14 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR @@ -86,15 +86,14 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR
// 使用 PostgreSQL 的 ON CONFLICT 语法处理唯一索引冲突
sql := `
INSERT INTO frontend_backend_routes
(frontend_route_id, backend_route, http_method, auth_group, module, description, is_default, sort, status, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
(frontend_route_id, backend_route, http_method, component, module, description, sort, status, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())
ON CONFLICT (frontend_route_id, backend_route)
DO UPDATE SET
http_method = EXCLUDED.http_method,
auth_group = EXCLUDED.auth_group,
component = EXCLUDED.component,
module = EXCLUDED.module,
description = EXCLUDED.description,
is_default = EXCLUDED.is_default,
sort = EXCLUDED.sort,
status = EXCLUDED.status,
updated_at = NOW()
@ -106,10 +105,9 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR @@ -106,10 +105,9 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR
relation.FrontendRouteID,
relation.BackendRoute,
relation.HTTPMethod,
relation.AuthGroup,
relation.Component,
relation.Module,
relation.Description,
relation.IsDefault,
relation.Sort,
relation.Status,
).Scan(&id).Error
@ -126,8 +124,8 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR @@ -126,8 +124,8 @@ func (r *FrontendBackendRouteRepository) Upsert(relation *model.FrontendBackendR
// GetStats 获取前后台路由关系统计信息
func (r *FrontendBackendRouteRepository) GetStats() (map[string]interface{}, error) {
var total int64
var authGroupStats []struct {
AuthGroup string `json:"auth_group"`
var componentStats []struct {
Component string `json:"component"`
Count int64 `json:"count"`
}
var moduleStats []struct {
@ -140,9 +138,9 @@ func (r *FrontendBackendRouteRepository) GetStats() (map[string]interface{}, err @@ -140,9 +138,9 @@ func (r *FrontendBackendRouteRepository) GetStats() (map[string]interface{}, err
}
if err := r.db.Model(&model.FrontendBackendRoute{}).
Select("auth_group, count(*) as count").
Group("auth_group").
Scan(&authGroupStats).Error; err != nil {
Select("component, count(*) as count").
Group("component").
Scan(&componentStats).Error; err != nil {
return nil, err
}
@ -154,9 +152,9 @@ func (r *FrontendBackendRouteRepository) GetStats() (map[string]interface{}, err @@ -154,9 +152,9 @@ func (r *FrontendBackendRouteRepository) GetStats() (map[string]interface{}, err
}
return map[string]interface{}{
"total": total,
"auth_group_stats": authGroupStats,
"module_stats": moduleStats,
"total": total,
"component_stats": componentStats,
"module_stats": moduleStats,
}, nil
}

38
gofaster/backend/internal/auth/repository/route_mapping_repo.go

@ -106,41 +106,3 @@ func (r *RouteMappingRepository) CreateOrUpdate(mapping *model.RouteMapping) err @@ -106,41 +106,3 @@ func (r *RouteMappingRepository) CreateOrUpdate(mapping *model.RouteMapping) err
mapping.ID = existing.ID
return r.Update(mapping)
}
// FindByAuthGroup 根据权限分组查找路由映射
func (r *RouteMappingRepository) FindByAuthGroup(authGroup string) ([]model.RouteMapping, error) {
var mappings []model.RouteMapping
err := r.DB().Where("auth_group = ?", authGroup).Order("id ASC").Find(&mappings).Error
return mappings, err
}
// FindByModuleAndAuthGroup 根据模块和权限分组查找路由映射
func (r *RouteMappingRepository) FindByModuleAndAuthGroup(module, authGroup string) ([]model.RouteMapping, error) {
var mappings []model.RouteMapping
err := r.DB().Where("module = ? AND auth_group = ?", module, authGroup).Order("id ASC").Find(&mappings).Error
return mappings, err
}
// GetAuthGroupStats 获取权限分组统计
func (r *RouteMappingRepository) GetAuthGroupStats() (map[string]int, error) {
var stats []struct {
AuthGroup string `json:"auth_group"`
Count int `json:"count"`
}
err := r.DB().Model(&model.RouteMapping{}).
Select("auth_group, COUNT(*) as count").
Group("auth_group").
Find(&stats).Error
if err != nil {
return nil, err
}
result := make(map[string]int)
for _, stat := range stats {
result[stat.AuthGroup] = stat.Count
}
return result, nil
}

6
gofaster/backend/internal/auth/routes/resource_routes.go

@ -35,10 +35,8 @@ func RegisterResourceRoutes(router *gin.RouterGroup, db *gorm.DB, jwtSecret stri @@ -35,10 +35,8 @@ func RegisterResourceRoutes(router *gin.RouterGroup, db *gorm.DB, jwtSecret stri
resourceGroup.POST("/sync", resourceController.SyncResources) // 同步资源
// 按模块和类型查询
resourceGroup.GET("/module/:module", resourceController.ListResourcesByModule) // 按模块获取资源
resourceGroup.GET("/type/:type", resourceController.ListResourcesByType) // 按类型获取资源
resourceGroup.GET("/auth-group-stats", resourceController.GetAuthGroupStats) // 获取权限分组统计
resourceGroup.GET("/auth-group/:authGroup/routes", resourceController.ListRoutesByAuthGroup) // 按权限分组获取路由
resourceGroup.GET("/module/:module", resourceController.ListResourcesByModule) // 按模块获取资源
resourceGroup.GET("/type/:type", resourceController.ListResourcesByType) // 按类型获取资源
}
}
}

14
gofaster/backend/internal/auth/service/frontend_route_service.go

@ -70,10 +70,9 @@ func (s *FrontendRouteService) SyncFrontendRoute(routeData map[string]interface{ @@ -70,10 +70,9 @@ func (s *FrontendRouteService) SyncFrontendRoute(routeData map[string]interface{
FrontendRouteID: existingRoute.ID,
BackendRoute: backendRoute["backend_route"].(string),
HTTPMethod: backendRoute["http_method"].(string),
AuthGroup: s.getAuthGroupByMethod(backendRoute["http_method"].(string)),
Component: routeData["component"].(string), // 使用前台路由的组件名称
Module: backendRoute["module"].(string),
Description: backendRoute["description"].(string),
IsDefault: i == 0, // 第一个为默认关联
Sort: i,
Status: 1,
}
@ -154,14 +153,3 @@ func (s *FrontendRouteService) GetStats() (map[string]interface{}, error) { @@ -154,14 +153,3 @@ func (s *FrontendRouteService) GetStats() (map[string]interface{}, error) {
"route_relations": relationStats,
}, nil
}
// getAuthGroupByMethod 根据HTTP方法获取权限分组
func (s *FrontendRouteService) getAuthGroupByMethod(method string) string {
editMethods := []string{"POST", "PUT", "PATCH", "DELETE"}
for _, editMethod := range editMethods {
if method == editMethod {
return "Edit"
}
}
return "Read"
}

Loading…
Cancel
Save