mirror of
https://github.com/tiger1103/gfast.git
synced 2026-09-21 18:20:47 +00:00
316 lines
8.1 KiB
Go
316 lines
8.1 KiB
Go
package user_service
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
"gfast/app/model/admin/auth_rule"
|
|
"gfast/app/model/admin/role"
|
|
"gfast/app/model/admin/sys_dept"
|
|
"gfast/app/model/admin/sys_post"
|
|
"gfast/app/model/admin/user"
|
|
"gfast/app/model/admin/user_post"
|
|
"gfast/app/service/admin/auth_service"
|
|
"gfast/app/service/casbin_adapter_service"
|
|
"gfast/boot"
|
|
"gfast/library/service"
|
|
"gfast/library/utils"
|
|
"github.com/gogf/gf/errors/gerror"
|
|
"github.com/gogf/gf/frame/g"
|
|
"github.com/gogf/gf/net/ghttp"
|
|
"github.com/gogf/gf/text/gstr"
|
|
"github.com/gogf/gf/util/gconv"
|
|
)
|
|
|
|
type EditParams struct {
|
|
Id int `p:"id" v:"required#用户id不能为空"`
|
|
UserNickname string `p:"user_nickname" v:"required#用户昵称不能为空" orm:"user_nickname"` // 用户昵称
|
|
Mobile string `p:"mobile" v:"required|phone#手机号不能为空|手机号格式错误" orm:"mobile,unique"`
|
|
UserEmail string `p:"user_email" v:"email#邮箱格式错误" orm:"user_email"`
|
|
Sex int `p:"sex" orm:"sex"`
|
|
}
|
|
|
|
type UpdatePwdReq struct {
|
|
OldPassword string `p:"oldPassword" v:"required#旧密码不能为空"`
|
|
NewPassword string `p:"newPassword" v:"required#新密码不能为空"`
|
|
}
|
|
|
|
/**
|
|
修改密码
|
|
*/
|
|
func UpdatePwd(r *ghttp.Request, data *UpdatePwdReq) error {
|
|
|
|
currentUser, err := GetCurrentUserInfo(r)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
OldPassword := utils.EncryptCBC(gconv.String(data.OldPassword), utils.AdminCbcPublicKey)
|
|
|
|
if OldPassword != currentUser["user_password"].(string) {
|
|
return errors.New("原始密码错误!")
|
|
}
|
|
|
|
return ResetUserPwd(&user.ResetPwdReq{
|
|
Id: gconv.Uint64(currentUser["id"]),
|
|
Password: data.NewPassword,
|
|
})
|
|
}
|
|
|
|
/**
|
|
用户中心修改用户信息
|
|
*/
|
|
func Edit(info *EditParams) (sql.Result, error) {
|
|
return user.Model.Where("id", info.Id).Data(info).Update()
|
|
}
|
|
|
|
// 获取单前登录用户的信息
|
|
func GetCurrentUserInfo(r *ghttp.Request) (map[string]interface{}, error) {
|
|
id := GetLoginID(r)
|
|
userEntity, err := user.GetUserById(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
userInfo := gconv.Map(userEntity)
|
|
//delete(userInfo, "user_password")
|
|
userInfo["roles"] = make([]string, 0)
|
|
userInfo["posts"] = new([]*user_post.Entity)
|
|
userInfo["dept_info"] = nil
|
|
allRoles, err := auth_service.GetRoleList()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
roles, err := GetAdminRole(userEntity.Id, allRoles)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//角色
|
|
userInfo["roles"] = roles
|
|
//岗位
|
|
posts, err := GetPostsByUserId(userEntity.Id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
userInfo["posts"] = posts
|
|
//部门
|
|
if dept_info, err := sys_dept.GetDeptById(userEntity.DeptId); err != nil {
|
|
return nil, err
|
|
} else {
|
|
userInfo["dept_info"] = dept_info
|
|
}
|
|
|
|
return userInfo, nil
|
|
|
|
}
|
|
|
|
func GetPostsByUserId(id uint64) ([]*sys_post.Entity, error) {
|
|
return user_post.GetPostsByUserId(id)
|
|
}
|
|
|
|
//获取登陆用户ID
|
|
func GetLoginID(r *ghttp.Request) (userId uint64) {
|
|
userInfo := GetLoginAdminInfo(r)
|
|
if userInfo != nil {
|
|
userId = userInfo.Id
|
|
}
|
|
return
|
|
}
|
|
|
|
//获取缓存的用户信息
|
|
func GetLoginAdminInfo(r *ghttp.Request) (userInfo *user.Entity) {
|
|
resp := boot.AdminGfToken.GetTokenData(r)
|
|
gconv.Struct(resp.Get("data"), &userInfo)
|
|
return
|
|
}
|
|
|
|
//获取当前登录用户信息,直接从数据库获取
|
|
func GetCurrentUser(r *ghttp.Request) (userInfo *user.Entity, err error) {
|
|
id := GetLoginID(r)
|
|
userInfo, err = user.GetUserById(id)
|
|
return
|
|
}
|
|
|
|
//获取管理员列表
|
|
func GetAdminList(req *user.SearchReq) (total, page int, userList []*user.Entity, err error) {
|
|
if req.PageSize == 0 {
|
|
req.PageSize = service.AdminPageNum
|
|
}
|
|
var depts []*sys_dept.Dept
|
|
if req.DeptId != "" {
|
|
depts, err = sys_dept.GetList(&sys_dept.SearchParams{Status: "1"})
|
|
if err != nil {
|
|
g.Log().Error(err)
|
|
err = gerror.New("获取部门信息失败")
|
|
return
|
|
}
|
|
mDepts := gconv.SliceMap(depts)
|
|
deptId := gconv.Int(req.DeptId)
|
|
req.DeptIds = append(req.DeptIds, deptId)
|
|
childrenIds := utils.FindSonByParentId(mDepts, deptId, "parentId", "deptId")
|
|
for _, d := range childrenIds {
|
|
req.DeptIds = append(req.DeptIds, gconv.Int(d["deptId"]))
|
|
}
|
|
}
|
|
return user.GetAdminList(req)
|
|
}
|
|
|
|
//获取管理员的角色信息
|
|
func GetAdminRole(userId uint64, allRoleList []*role.Entity) (roles []*role.Entity, err error) {
|
|
roleIds, err := GetAdminRoleIds(userId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
roles = make([]*role.Entity, 0, len(allRoleList))
|
|
for _, v := range allRoleList {
|
|
for _, id := range roleIds {
|
|
if id == v.Id {
|
|
roles = append(roles, v)
|
|
}
|
|
}
|
|
if len(roles) == len(roleIds) {
|
|
break
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//获取管理员对应的角色ids
|
|
func GetAdminRoleIds(userId uint64) (roleIds []uint, err error) {
|
|
enforcer, e := casbin_adapter_service.GetEnforcer()
|
|
if e != nil {
|
|
err = e
|
|
return
|
|
}
|
|
//查询关联角色规则
|
|
groupPolicy := enforcer.GetFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId))
|
|
if len(groupPolicy) > 0 {
|
|
roleIds = make([]uint, len(groupPolicy))
|
|
//得到角色id的切片
|
|
for k, v := range groupPolicy {
|
|
roleIds[k] = gconv.Uint(gstr.SubStr(v[1], 2))
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func GetAdminPosts(userId uint64) (postIds []int64, err error) {
|
|
return user_post.GetAdminPosts(userId)
|
|
}
|
|
|
|
//获取菜单
|
|
func GetAllMenus() (menus g.List, err error) {
|
|
//获取所有开启的菜单
|
|
allMenus, err := auth_service.GetIsMenuStatusList()
|
|
if err != nil {
|
|
return
|
|
}
|
|
menus = make(g.List, len(allMenus))
|
|
for k, v := range allMenus {
|
|
menu := gconv.Map(v)
|
|
menu = setMenuMap(menu, v)
|
|
menus[k] = menu
|
|
}
|
|
menus = utils.PushSonToParent(menus, 0, "pid", "id", "children", "", nil, true)
|
|
return
|
|
}
|
|
|
|
//获取管理员所属角色菜单
|
|
func GetAdminMenusByRoleIds(roleIds []uint) (menus g.List, err error) {
|
|
//获取角色对应的菜单id
|
|
enforcer, e := casbin_adapter_service.GetEnforcer()
|
|
if e != nil {
|
|
err = e
|
|
return
|
|
}
|
|
menuIds := map[int64]int64{}
|
|
for _, roleId := range roleIds {
|
|
//查询当前权限
|
|
gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("g_%d", roleId))
|
|
for _, p := range gp {
|
|
mid := gconv.Int64(gstr.SubStr(p[1], 2))
|
|
menuIds[mid] = mid
|
|
}
|
|
}
|
|
//获取所有开启的菜单
|
|
allMenus, err := auth_service.GetIsMenuStatusList()
|
|
if err != nil {
|
|
return
|
|
}
|
|
roleMenus := make(g.List, 0, len(allMenus))
|
|
for _, v := range allMenus {
|
|
if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok {
|
|
roleMenu := gconv.Map(v)
|
|
roleMenu = setMenuMap(roleMenu, v)
|
|
roleMenus = append(roleMenus, roleMenu)
|
|
}
|
|
}
|
|
menus = utils.PushSonToParent(roleMenus, 0, "pid", "id", "children", "", nil, true)
|
|
return
|
|
}
|
|
|
|
//组合返回menu前端数据
|
|
func setMenuMap(menu g.Map, entity *auth_rule.Entity) g.Map {
|
|
menu["index"] = entity.Name
|
|
menu["name"] = gstr.UcFirst(entity.Path)
|
|
menu["menuName"] = entity.Title
|
|
if entity.MenuType != 0 {
|
|
menu["component"] = entity.Component
|
|
menu["path"] = entity.Path
|
|
} else {
|
|
menu["path"] = "/" + entity.Path
|
|
menu["component"] = "Layout"
|
|
}
|
|
menu["meta"] = g.MapStrStr{
|
|
"icon": entity.Icon,
|
|
"title": entity.Title,
|
|
}
|
|
if entity.AlwaysShow == 1 {
|
|
menu["hidden"] = false
|
|
} else {
|
|
menu["hidden"] = true
|
|
}
|
|
if entity.AlwaysShow == 1 && entity.MenuType == 0 {
|
|
menu["alwaysShow"] = true
|
|
} else {
|
|
menu["alwaysShow"] = false
|
|
}
|
|
return menu
|
|
}
|
|
|
|
func ChangeUserStatus(req *user.StatusReq) error {
|
|
return user.ChangeUserStatus(req)
|
|
}
|
|
|
|
func ResetUserPwd(req *user.ResetPwdReq) error {
|
|
//密码加密
|
|
req.Password = utils.EncryptCBC(gconv.String(req.Password), utils.AdminCbcPublicKey)
|
|
return user.ResetUserPwd(req)
|
|
}
|
|
|
|
func GetPermissions(roleIds []uint) ([]string, error) {
|
|
//获取角色对应的菜单id
|
|
enforcer, err := casbin_adapter_service.GetEnforcer()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
menuIds := map[int64]int64{}
|
|
for _, roleId := range roleIds {
|
|
//查询当前权限
|
|
gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("g_%d", roleId))
|
|
for _, p := range gp {
|
|
mid := gconv.Int64(gstr.SubStr(p[1], 2))
|
|
menuIds[mid] = mid
|
|
}
|
|
}
|
|
//获取所有开启的按钮
|
|
allButtons, err := auth_service.GetIsButtonStatusList()
|
|
userButtons := make([]string, 0, len(allButtons))
|
|
for _, button := range allButtons {
|
|
if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
|
|
userButtons = append(userButtons, button.Name)
|
|
}
|
|
}
|
|
return userButtons, nil
|
|
}
|