304 lines
6.4 KiB
Go
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
|
|
}
|