2016-12-28-日总结

增加角色页面

  • 本页面主要用于添加角色信息,包括添加角色名,角色描述和备注,以及昨天晚上提及的角色所对应的权限选择。
  • 在这其中主要工作在权限选择上,采用checkbox方法实现多对多的实现,前端页面代码
<label >权限选择:</label>
 {{range .OperateTo}}
 <div>
   <label><input name="Permission" type="checkbox" value="{{.Id}}" />{{.PermissionName}}&nbsp;&nbsp;&nbsp;&nbsp;{{.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存储着权限的Id
    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)
    }

    // beego.Debug(rolename, script, remark)
    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存储着权限的Id
    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此角色之前的与权限的关联关系,修改之后重新关联。
  • 权限修改的过程和上述相差不多,但其只与角色相关联,因此不需要修改那么多信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值