Files
Quincy_admin/repositories/pms_repository.go
2026-03-26 22:13:03 +08:00

304 lines
6.4 KiB
Go

// 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
}