diff --git a/app/controller/admin/auth.go b/app/controller/admin/auth.go index 327f0e5..ff8c436 100644 --- a/app/controller/admin/auth.go +++ b/app/controller/admin/auth.go @@ -4,8 +4,10 @@ import ( "fmt" "gfast/app/model/auth_rule" "gfast/app/model/role" + "gfast/app/model/user" "gfast/app/service/auth_service" "gfast/app/service/casbin_adapter_service" + "gfast/boot" "gfast/library/response" "gfast/library/utils" "github.com/gogf/gf/frame/g" @@ -94,7 +96,7 @@ func (c *Auth) DeleteMenu(r *ghttp.Request) { ids := r.GetRequestArray("ids") idsInterface := make(g.Slice, len(ids)) for k, v := range ids { - idsInterface[k] = gconv.Int(v) + idsInterface[k] = gconv.Int64(v) } _, err := auth_rule.Model.Where("id in(?)", idsInterface).Delete() if err != nil { @@ -107,7 +109,15 @@ func (c *Auth) DeleteMenu(r *ghttp.Request) { //角色列表 func (c *Auth) RoleList(r *ghttp.Request) { //获取角色列表 - + err, list := auth_service.GetRoleList("") + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "获取数据失败") + } + list = utils.ParentSonSort(list, 0, 0, "parent_id", "id", "flg", "name") + response.SusJson(true, r, "成功", g.Map{ + "list": list, + }) } //添加角色 @@ -233,3 +243,107 @@ func (c *Auth) EditRole(r *ghttp.Request) { } response.SusJson(true, r, "成功", res) } + +//删除角色 +func (c *Auth) DeleteRole(r *ghttp.Request) { + ids := r.GetRequestArray("ids") + idsInterface := make(g.Slice, len(ids)) + for k, v := range ids { + idsInterface[k] = gconv.Int64(v) + } + tx, err := g.DB("default").Begin() //开启事务 + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "事务处理失败") + } + _, err = tx.Table(role.Table).Where("id in(?)", idsInterface).Delete() + if err != nil { + g.Log().Error(err) + tx.Rollback() + response.FailJson(true, r, "删除失败") + } + //删除角色的权限 + for _, v := range idsInterface { + err = auth_service.DeleteRoleRule(gconv.Int64(v)) + if err != nil { + g.Log().Error(err) + tx.Rollback() + response.FailJson(true, r, "删除失败") + } + } + tx.Commit() + response.SusJson(true, r, "删除成功") +} + +//添加管理员 +func (c *Auth) AddUser(r *ghttp.Request) { + if r.Method == "POST" { + requestData := r.GetFormMap() + InsertId, err := auth_service.AddUser(requestData) + if err != nil { + response.FailJson(true, r, err.Error()) + } + //设置用户所属角色信息 + err = auth_service.AddUserRole(requestData["role_id"], InsertId) + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "设置用户权限失败") + } + response.SusJson(true, r, "添加管理员成功") + } + //获取角色信息 + err, roleList := auth_service.GetRoleList("") + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "获取角色数据失败") + } + roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name") + res := g.Map{ + "roleList": roleList, + } + response.SusJson(true, r, "成功", res) +} + +//修改管理员 +func (c *Auth) EditUser(r *ghttp.Request) { + id := r.GetRequestInt64("id") + if r.Method == "POST" { + requestData := r.GetFormMap() + err := auth_service.EditUser(requestData) + if err != nil { + response.FailJson(true, r, err.Error()) + } + //设置用户所属角色信息 + err = auth_service.EditUserRole(requestData["role_id"], id) + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "设置用户权限失败") + } + response.SusJson(true, r, "修改管理员成功") + } + //用户用户信息 + userEntity, err := user.Model.Where("id=?", id).One() + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "获取用户数据失败") + } + //获取角色信息 + err, roleList := auth_service.GetRoleList("") + if err != nil { + g.Log().Error(err) + response.FailJson(true, r, "获取角色数据失败") + } + roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name") + res := g.Map{ + "roleList": roleList, + "userInfo": userEntity, + } + response.SusJson(true, r, "成功", res) +} + +//用户列表 +func (c *Auth) UserList(r *ghttp.Request) { + resp := boot.AdminGfToken.GetTokenData(r) + g.Log().Debug(r.Router.Uri) + r.Response.Write("hello Index-", gconv.Map(resp.Get("data"))["user_nickname"]) +} diff --git a/app/service/auth_service/auth_rule.go b/app/service/auth_service/auth_rule.go index 7aabb90..7f16efc 100644 --- a/app/service/auth_service/auth_rule.go +++ b/app/service/auth_service/auth_rule.go @@ -6,7 +6,9 @@ import ( "fmt" "gfast/app/model/auth_rule" "gfast/app/model/role" + "gfast/app/model/user" "gfast/app/service/casbin_adapter_service" + "gfast/library/utils" "github.com/gogf/gf/database/gdb" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" @@ -190,6 +192,26 @@ func EditRoleRule(iRule interface{}, roleId int64) (err error) { return } +//删除角色权限操作 +func DeleteRoleRule(roleId int64) (err error) { + enforcer, e := casbin_adapter_service.GetEnforcer() + if e != nil { + err = e + return + } + //查询当前权限 + gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId)) + //删除旧权限 + for _, v := range gp { + _, e = enforcer.RemovePolicy(v) + if e != nil { + err = e + return + } + } + return +} + func checkRoleData(params map[string]interface{}) error { rules := []string{ "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间", @@ -202,3 +224,114 @@ func checkRoleData(params map[string]interface{}) error { } return nil } + +//添加管理员操作 +func AddUser(data map[string]interface{}) (InsertId int64, err error) { + e := checkUserData(data, "add") + if e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + if i, _ := user.Model.Where("user_name=?", data["user_name"]).Count(); i != 0 { + err = gerror.New("用户名已经存在") + return + } + if i, _ := user.Model.Where("mobile=?", data["mobile"]).Count(); i != 0 { + err = gerror.New("手机号已经存在") + return + } + //保存管理员信息 + data["create_time"] = gtime.Timestamp() + //密码加密 + data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey) + res, err := user.Model.Filter().Data(data).Save() + if err != nil { + return + } + InsertId, _ = res.LastInsertId() + return +} + +//修改用户信息 +func EditUser(data map[string]interface{}) (err error) { + e := checkUserData(data, "add") + if e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + if i, _ := user.Model.Where("id!=? and user_name=?", data["id"], data["user_name"]).Count(); i != 0 { + err = gerror.New("用户名已经存在") + return + } + if i, _ := user.Model.Where("id!=? and mobile=?", data["mobile"]).Count(); i != 0 { + err = gerror.New("手机号已经存在") + return + } + //保存管理员信息 + //提交了密码?密码加密 + if _, ok := data["user_password"]; ok { + data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey) + } + _, err = user.Model.Filter().Data(data).Save() + if err != nil { + return + } + return +} + +//添加用户角色信息 +func AddUserRole(roleIds interface{}, userId int64) (err error) { + enforcer, e := casbin_adapter_service.GetEnforcer() + if e != nil { + err = e + return + } + rule := roleIds.([]interface{}) + for _, v := range rule { + _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%s", v)) + if err != nil { + return + } + } + return +} + +//修改用户角色信息 +func EditUserRole(roleIds interface{}, userId int64) (err error) { + enforcer, e := casbin_adapter_service.GetEnforcer() + if e != nil { + err = e + return + } + rule := roleIds.([]interface{}) + //删除用户旧角色信息 + enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId)) + for _, v := range rule { + _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%s", v)) + if err != nil { + return + } + } + return +} + +//验证用户表单数据 +func checkUserData(params map[string]interface{}, t string) error { + rules := []string{ + "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0", + "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间", + "mobile@telephone#手机号码格式不正确", + "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间", + "user_email@email#邮箱格式错误", + } + if t == "add" { + rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间") + } else { + rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间") + } + e := gvalid.CheckMap(params, rules) + if e != nil { + return e + } + return nil +}