增加角色页面
- 本页面主要用于添加角色信息,包括添加角色名,角色描述和备注,以及昨天晚上提及的角色所对应的权限选择。
- 在这其中主要工作在权限选择上,采用
checkbox
方法实现多对多的实现,前端页面代码
<label >权限选择:</label>
{{range .OperateTo}}
<div>
<label><input name="Permission" type="checkbox" value="{{.Id}}" />{{.PermissionName}} {{.Remark}}</label>
</div>
{{end}}
- 后台利用以下代码给前端提供模板,模板内容即为数据库中所有的权限的列表,由管理员来勾选选择创建的角色对应的权限是哪种或哪几种
perm, _ := new(models.Permission).GetList()
this.Data["OperateTo"] = perm
- 前端用户创建角色时,会勾选一定的权限,此时该如何得知用户勾选了哪几个权限呢?答案是在用户提交了创建请求后,由于其From表单的
method="post"
,因此跳转到UserController.go
文件的func (this *UserController) PostSelect()
函数里(这一部分的设置是在router.go
中设置,实质上是把Post
函数另外起一个更贴切的名字),在此函数里继续跳转,此时由于op=roleadd
,因此跳转到RoleAdd()
函数中。
func (this *UserController) PostSelect() {
op := this.GetString("op")
switch op {
case "delete":
this.Delete()
case "deleterole":
this.DeleteRole()
case "deleteperm":
this.DeletePerm()
case "update":
this.Update()
case "modifyrole":
this.ModifyRole()
case "modifypermission":
this.ModifyPerm()
case "add":
this.Add()
case "roleadd":
this.RoleAdd()
case "permadd":
this.PermAdd()
}
}
- 在
func (this *UserController) RoleAdd()
函数中真正实现角色信息的添加,添加的信息包括用户输入的角色名,角色描述,备注和勾选的权限信息,这些信息统一被此函数存入数据库,具代码如下:
func (this *UserController) RoleAdd() {
rolename := this.GetString("RoleName")
script := this.GetString("Script")
remark := this.GetString("Remark")
role := &models.Role{RoleName: rolename, RoleScript: script, Remark: remark}
_, err := role.Add(role)
perm_temp_string_array := this.GetStrings("Permission")
perm_temp_int_array := make([]int64, len(perm_temp_string_array))
for i, perm_temp_string := range perm_temp_string_array {
perm_temp_int_array[i], _ = strconv.ParseInt(perm_temp_string, 10, 64)
}
for _, perm_temp_int := range perm_temp_int_array {
perm, _ := new(models.Permission).GetPermissionById(perm_temp_int)
role.UpdateRolePermission(role.Id, *perm)
}
if err != nil {
beego.Debug(err)
}
this.Redirect("/admin/user/list", 302)
}
- 在后台利用
this.GetStrings()
函数得到的用户勾选的选型,得到这些被勾选选项的Id
,得到的是一个string
数组,为什么不直接获取整形数组呢?由于beego
模板的获取参数函数获取数组的函数只有GetStrings()
一个函数。beego获取参数 - 由于以上原因,需要把获取的字符串数组转化为整形数组,再把整形数组分开为一个个的单独整数
int64
类型,获取的权限的Id
值用来找到对应的权限中的数据,再把这些权限关联到角色对应的一系列权限中去,这是多对多的表格的精髓。
增加权限页面
- 添加权限的页面包括添加权限名,添加操作对象,备注和操作,操作对象一般包括楼栋、房间、团队和POI等,操作包括增加、删除、修改和查询四种,其中操作部分和上面角色增加一样,也是由用户打钩选中,可以选中一个或者多个操作。
- 添加完上述的信息之后,点击提交之后,依然通过
Post
方法到this.GetStrings()
函数分发函数,分发到func (this *UserController) PermAdd()
函数
func (this *UserController) PermAdd() {
var add bool = false
var delete bool = false
var modify bool = false
var search bool = false
name := this.GetString("PermName")
remark := this.GetString("Remark")
operateto := this.GetString("OpeName")
operate := this.GetStrings("Operate")
for i := 0; i < len(operate); i++ {
if operate[i] == "add" {
add = true
} else if operate[i] == "delete" {
delete = true
} else if operate[i] == "modify" {
modify = true
} else if operate[i] == "search" {
search = true
}
}
permission := &models.Permission{PermissionName: name, OperateTo: operateto, Remark: remark, AddFunction: add, DeleteFunction: delete, UpdateFunction: modify, SearchFunction: search}
_, err := permission.Add(permission)
if err != nil {
beego.Debug(err)
}
this.Redirect("/admin/user/list", 302)
}
- 首先默认增删改查(
add delete modify search
)四个字段为false
,表明如果用户没有勾选操作选项时此权限就没有增删改查四个功能。其次是权限名、操作对象和备注几种信息。最后在前端由用户勾选操作,把这些信息存入数据库,添加成功。
角色的删除
- 在列表页面有三张表格,分别为管理员信息列表,角色列表和权限列表,每条信息都有两个按钮,删除和修改,点击删除则实现本条信息的删除。
func (this *UserController) DeleteRole() {
flash := beego.NewFlash()
id, _ := this.GetInt64("id")
err := new(models.Role).DeleteById(id)
if err != nil {
beego.Debug(err)
flash.Error(err.Error())
flash.Store(&this.Controller)
} else {
beego.Debug("delete successful")
flash.Success("delete successful")
flash.Store(&this.Controller)
this.LogAdd("删除", "角色", id)
}
this.Redirect("/admin/user/list", 302)
}
- 首先得到要删除的角色的
Id
,通过Id
找到对应的角色信息,然后删除对应的角色信息。注意:在删除角色的过程中,要注意角色和用户、权限的关系,例如Id=4
的角色已经绑定到用户A上之后,同时其绑定了权限楼栋删
时,要删除这个角色,要同时删除用户A绑定的角色和此角色绑定的权限楼栋删
。通过以下函数实现beego中的多对多关系操作
func (this *Role) ClearRelated(id int64) {
o := orm.NewOrm()
role := Role{Id: id}
m2m := o.QueryM2M(&role, "Permissions")
m2m.Clear()
m2m = o.QueryM2M(&role, "Users")
m2m.Clear()
}
角色的修改
- 最麻烦的功能,第一,点击修改时,首先要把此角色的原有信息显示给用户,通过
func (this *UserController) ModifyRoleIndex()
函数实现。第二,用户在看见原有信息的同时,通过在页面上输入和勾选,改变角色的具体信息,点击提交,通过func (this *UserController) ModifyRole()
函数实现具体的改变信息
func (this *UserController) ModifyRoleIndex() {
flash := beego.NewFlash()
id, _ := this.GetInt64("id")
role, err := new(models.Role).GetRoleById(id)
if err != nil || id <= 0 {
flash.Error(err.Error())
flash.Store(&this.Controller)
this.Redirect("/admin/user/list", 302)
return
}
permselected, permunselected, _ := role.GetReletedPermission(role.Id)
this.Data["PermSelected"] = permselected
this.Data["PermUnSelected"] = permunselected
this.Data["RoleName"] = role.RoleName
this.Data["RoleScript"] = role.RoleScript
this.Data["Remark"] = role.Remark
this.Data["Id"] = role.Id
this.TplName = "role_permission/role_update.html"
}
func (this *UserController) ModifyRole() {
flash := beego.NewFlash()
id, _ := this.GetInt64("id")
role, err := new(models.Role).GetRoleById(id)
if err != nil || id <= 0 {
beego.Debug(err)
flash.Error(err.Error())
flash.Store(&this.Controller)
this.Redirect("/admin/user/manage?op=update", 302)
return
}
role.ClearRelated(role.Id)
role.RoleName = this.GetString("RoleName")
role.RoleScript = this.GetString("Script")
role.Remark = this.GetString("Remark")
role.Update(role)
perm_temp_string_array := this.GetStrings("Permission")
perm_temp_int_array := make([]int64, len(perm_temp_string_array))
for i, perm_temp_string := range perm_temp_string_array {
perm_temp_int_array[i], _ = strconv.ParseInt(perm_temp_string, 10, 64)
}
for _, perm_temp_int := range perm_temp_int_array {
perm, _ := new(models.Permission).GetPermissionById(perm_temp_int)
role.UpdateRolePermission(role.Id, *perm)
}
this.Redirect("/admin/user/list", 302)
}
- 其中在点击修改之后,由于要显示给用户此角色原有的信息,因此把权限分为两类,一类是此角色已经拥有的权限,另一类是权限列表中剩余的所有权限。第一类权限显示在前,并且已经被选中,第二类权限在后,没有被选中。之后的过程在前面已经说过,不再赘述。
- 当然,修改角色的时候,角色-权限的相关表也需要更新,办法是先
clear
此角色之前的与权限的关联关系,修改之后重新关联。 - 权限修改的过程和上述相差不多,但其只与角色相关联,因此不需要修改那么多信息。