Files
quark-go/pkg/app/handler/admin/resources/role.go
tangtanglove 5244508c40 first commit
2023-01-18 13:40:07 +08:00

223 lines
5.0 KiB
Go

package resources
import (
"encoding/json"
"errors"
"time"
"github.com/quarkcms/quark-go/pkg/app/handler/admin/actions"
"github.com/quarkcms/quark-go/pkg/app/handler/admin/searches"
models "github.com/quarkcms/quark-go/pkg/app/model"
"github.com/quarkcms/quark-go/pkg/builder"
"github.com/quarkcms/quark-go/pkg/builder/template/adminresource"
"github.com/quarkcms/quark-go/pkg/dal/db"
"gorm.io/gorm"
)
type Role struct {
adminresource.Template
}
// 初始化
func (p *Role) Init() interface{} {
// 初始化模板
p.TemplateInit()
// 标题
p.Title = "角色"
// 模型
p.Model = &models.Role{}
// 分页
p.PerPage = 10
return p
}
// 字段
func (p *Role) Fields(request *builder.Request) []interface{} {
field := &builder.AdminField{}
treeData, _ := (&models.Menu{}).Tree()
return []interface{}{
field.ID("id", "ID"),
field.Text("name", "名称").
SetRules(
[]string{
"required",
},
map[string]string{
"required": "名称必须填写",
},
),
field.Text("guard_name", "GuardName").SetDefault("admin"),
field.Tree("menu_ids", "权限").SetData(treeData).OnlyOnForms(),
field.Datetime("created_at", "创建时间", func() interface{} {
if p.Field["created_at"] == nil {
return p.Field["created_at"]
}
return p.Field["created_at"].(time.Time).Format("2006-01-02 15:04:05")
}).OnlyOnIndex(),
field.Datetime("updated_at", "更新时间", func() interface{} {
if p.Field["updated_at"] == nil {
return p.Field["updated_at"]
}
return p.Field["updated_at"].(time.Time).Format("2006-01-02 15:04:05")
}).OnlyOnIndex(),
}
}
// 搜索
func (p *Role) Searches(request *builder.Request) []interface{} {
return []interface{}{
(&searches.Input{}).Init("name", "名称"),
}
}
// 行为
func (p *Role) Actions(request *builder.Request) []interface{} {
return []interface{}{
(&actions.CreateLink{}).Init(p.Title),
(&actions.Delete{}).Init("批量删除"),
(&actions.EditLink{}).Init("编辑"),
(&actions.Delete{}).Init("删除"),
(&actions.FormSubmit{}).Init(),
(&actions.FormReset{}).Init(),
(&actions.FormBack{}).Init(),
(&actions.FormExtraBack{}).Init(),
}
}
// 编辑页面显示前回调
func (p *Role) BeforeEditing(request *builder.Request, data map[string]interface{}) map[string]interface{} {
id := request.Query("id", "")
menus := []map[string]interface{}{}
db.Client.Model(&models.Menu{}).Find(&menus)
checkedMenus := []int{}
for _, v := range menus {
var permissionIds []int
db.Client.
Model(&models.Permission{}).
Where("menu_id", v["id"]).
Pluck("id", &permissionIds)
if len(permissionIds) > 0 {
roleHasPermission := map[string]interface{}{}
db.Client.
Model(&models.RoleHasPermission{}).
Where("permission_id IN ?", permissionIds).
Where("role_id", id).
First(&roleHasPermission)
if len(roleHasPermission) > 0 {
checkedMenus = append(checkedMenus, v["id"].(int))
}
}
}
data["menu_ids"] = checkedMenus
return data
}
// 保存数据前回调
func (p *Role) BeforeSaving(request *builder.Request, submitData map[string]interface{}) interface{} {
// 根据菜单id获取所有权限
var permissionIds []int
db.Client.
Model(&models.Permission{}).
Where("menu_id IN ?", submitData["menu_ids"]).
Pluck("id", &permissionIds)
if len(permissionIds) == 0 {
return errors.New("获取的权限为空,请在菜单管理中绑定权限")
}
delete(submitData, "menu_ids")
return submitData
}
// 保存后回调
func (p *Role) AfterSaved(request *builder.Request, model *gorm.DB) interface{} {
data := map[string]interface{}{}
json.Unmarshal(request.Body(), &data)
// 根据菜单id获取所有权限
var permissionIds []int
db.Client.
Model(&models.Permission{}).
Where("menu_id IN ?", data["menu_ids"]).
Pluck("id", &permissionIds)
if len(permissionIds) == 0 {
return errors.New("获取的权限为空,请先在菜单管理中绑定权限")
}
var result interface{}
if request.IsCreating() {
lastRole := map[string]interface{}{}
model.Order("id desc").First(&lastRole) // hack
// 同步权限
result = p.syncPermissions(lastRole["id"].(int), permissionIds)
} else {
// 同步权限
id := data["id"].(float64)
result = p.syncPermissions(int(id), permissionIds)
}
return result
}
// 保存后回调
func (p *Role) syncPermissions(roleId int, permissionIds []int) *gorm.DB {
permissionIds = p.arrayFilter(permissionIds)
// 先清空此角色的权限
db.Client.Model(&models.RoleHasPermission{}).Where("role_id", roleId).Delete("")
data := []map[string]interface{}{}
for _, v := range permissionIds {
permission := map[string]interface{}{
"role_id": roleId,
"permission_id": v,
}
data = append(data, permission)
}
return db.Client.Model(&models.RoleHasPermission{}).Create(data)
}
// 数组去重
func (p *Role) arrayFilter(list []int) []int {
var x []int = []int{}
for _, i := range list {
if len(x) == 0 {
x = append(x, i)
} else {
for k, v := range x {
if i == v {
break
}
if k == len(x)-1 {
x = append(x, i)
}
}
}
}
return x
}