// Package repositories/pms_repository.go package repositories import ( "Quincy_admin/schemas" "database/sql" "errors" "fmt" "strings" "github.com/jmoiron/sqlx" ) type PermissionRepository struct { db *sqlx.DB } func NewPermissionRepository(db *sqlx.DB) *PermissionRepository { return &PermissionRepository{db: db} } // GetRoleIDByCode 根据scode获取权限角色 ID func (r *PermissionRepository) GetRoleIDByCode(scode string) (int, error) { query := ` SELECT COALESCE(tb2.role_id, 0) AS rolecode FROM admin_user tb1 LEFT JOIN admin_user_role tb2 ON tb1.id = tb2.user_id WHERE tb1.STATUS != 0 AND tb1.sessioncode = ? ORDER BY id LIMIT 1 ` var rolecode int err := r.db.QueryRow(query, scode).Scan(&rolecode) if err != nil { if errors.Is(err, sql.ErrNoRows) { return 0, nil } return 0, err } return rolecode, nil } // GetRoutesByID 获取侧边栏菜单权限 func (r *PermissionRepository) GetRoutesByID(roleID int) ([]*schemas.MenuItems, error) { query := ` SELECT m.id, m.parent_id, m.title, m.path, m.component, m.icon, m.sort, m.visible, m.status FROM admin_menu m INNER JOIN admin_role_menu arm ON m.id = arm.menu_id WHERE arm.role_id = ? AND m.status = 1 AND m.visible = 1 ORDER BY m.parent_id, m.sort ` var menuItems []*schemas.MenuItems err := r.db.Select(&menuItems, query, roleID) if err != nil { return nil, err } return menuItems, nil } // GetRoutes 获取路由权限 func (r *PermissionRepository) GetRoutes() ([]*schemas.MenuItems, error) { query := ` SELECT m.id, m.parent_id, m.title, m.path, m.component, m.icon, m.sort, m.visible, m.status FROM admin_menu m WHERE m.status = 1 AND m.visible = 1 ORDER BY m.parent_id, m.sort ` var menuItems []*schemas.MenuItems err := r.db.Select(&menuItems, query) if err != nil { return nil, err } return menuItems, nil } // GetMenuList 获取菜单列表 func (r *PermissionRepository) GetMenuList(page, pageSize int) ([]*schemas.MenuItems, int64, error) { offset := (page - 1) * pageSize // 查询总数 countQuery := `SELECT COUNT(*) FROM admin_menu` var total int64 err := r.db.QueryRow(countQuery).Scan(&total) if err != nil { return nil, 0, err } query := ` SELECT m.id, m.parent_id, m.title, m.path, m.component, m.icon, m.sort, m.visible, m.status, m.create_time FROM admin_menu m ORDER BY m.parent_id, m.sort LIMIT ? OFFSET ? ` var menuItems []*schemas.MenuItems err = r.db.Select(&menuItems, query, pageSize, offset) if err != nil { return nil, 0, err } return menuItems, total, nil } // UpdateMenuStatus 启用/停用菜单 func (r *PermissionRepository) UpdateMenuStatus(id int, status int) error { query := ` UPDATE admin_menu SET status = ? WHERE id = ? ` result, err := r.db.Exec(query, status, id) if err != nil { return err } // 检查是否有行被影响,如果没有说明数据不存在 rowsAffected, err := result.RowsAffected() if err != nil { return err } if rowsAffected == 0 { return fmt.Errorf("数据不存在") } return nil } // GetPermission 获取权限信息 func (r *PermissionRepository) GetPermission(roleID int, typeStr string) (*[]string, error) { query := ` SELECT tb2.name FROM admin_role_permission tb1 JOIN admin_permission tb2 ON tb1.permission_id = tb2.id WHERE tb1.role_id = ? AND (? = 'all' OR tb2.type = ?) AND tb2.status != 0 ` var permissionNames []string err := r.db.Select(&permissionNames, query, roleID, typeStr, typeStr) if err != nil { return nil, err } return &permissionNames, nil } func (r *PermissionRepository) GetRolePermission(roleID int, typeStr string) (*[]int, error) { query := ` SELECT tb2.id FROM admin_role_permission tb1 JOIN admin_permission tb2 ON tb1.permission_id = tb2.id WHERE tb1.role_id = ? AND (? = 'all' OR tb2.type = ?) AND tb2.status != 0 ` var permissionID []int err := r.db.Select(&permissionID, query, roleID, typeStr, typeStr) if err != nil { return nil, err } return &permissionID, nil } // GetAllPermission 获取全部权限信息 func (r *PermissionRepository) GetAllPermission(typeStr string) (*[]string, error) { query := ` SELECT tb1.name FROM admin_permission tb1 WHERE (? = 'all' OR tb1.type = ?) AND tb1.status != 0 ` var permissionNames []string err := r.db.Select(&permissionNames, query, typeStr, typeStr) if err != nil { return nil, err } return &permissionNames, nil } // GetAllNewPermission 获取全部权限信息 func (r *PermissionRepository) GetAllNewPermission() ([]*schemas.PermissionItems, error) { query := ` SELECT id, name, title, path, type, module, action, parent_id, sort, status FROM admin_permission WHERE status = 1 ORDER BY parent_id, sort ` var PermissionItems []*schemas.PermissionItems err := r.db.Select(&PermissionItems, query) if err != nil { return nil, err } return PermissionItems, nil } // GetRolePermissionIDs 获取角色已有的权限ID列表 func (r *PermissionRepository) GetRolePermissionIDs(roleID int) ([]int, error) { query := ` SELECT permission_id FROM admin_role_permission WHERE role_id = ? ` var permissionIDs []int err := r.db.Select(&permissionIDs, query, roleID) return permissionIDs, err } // InsertRolePermissions 批量插入角色权限关联 func (r *PermissionRepository) InsertRolePermissions(roleID int, permissionIDs []int) error { if len(permissionIDs) == 0 { return nil } // 构造批量插入SQL query := ` INSERT INTO admin_role_permission (role_id, permission_id) VALUES (?, ?) ` // 批量插入 for _, permID := range permissionIDs { _, err := r.db.Exec(query, roleID, permID) if err != nil { return err } } return nil } // DeleteRolePermissions 批量删除角色权限关联 func (r *PermissionRepository) DeleteRolePermissions(roleID int, permissionIDs []int) error { if len(permissionIDs) == 0 { return nil } // 构造IN查询的占位符 placeholders := make([]string, len(permissionIDs)) args := make([]interface{}, 0, len(permissionIDs)+1) args = append(args, roleID) // role_id for i, permID := range permissionIDs { placeholders[i] = "?" args = append(args, permID) } query := "DELETE FROM admin_role_permission WHERE role_id = ? AND permission_id IN (" + strings.Join(placeholders, ",") + ")" _, err := r.db.Exec(query, args...) return err }