package service import ( "errors" "fmt" "path" "strconv" "strings" "time" "vamicro/extend/util" "vamicro/system-service/models" "vamicro/system-service/vo" "basic.com/fileServer/WeedFSClient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" uuid "github.com/satori/go.uuid" ) type UserService struct { } func (sv UserService) Login(loginVo vo.UserVo) (flag bool, loginAppUser vo.LoginAppUser) { if loginVo.UserName == "" || loginVo.Password == "" { return false, loginAppUser } /*if AuthInfo.ExpirationTime < time.Now().Unix() { loginAppUser.RoleName = "未授权用户" return false,loginAppUser }*/ var userE models.SysUser rows, err := userE.FindByName(loginVo.UserName) if err != nil || rows == 0 { return false, loginAppUser } if pwdStr, err := util.Encrypt(loginVo.Password); err == nil && pwdStr == userE.Password { user2LoginAppUser(&userE, &loginAppUser) var roleE models.SysRole roles := roleE.FindByUserId(userE.Id) loginAppUser.SysRoles = roles if len(roles) > 0 { loginAppUser.RoleName = roles[0].Name } loginAppUser.HeadPic = userE.HeadPic return true, loginAppUser } return false, loginAppUser } func user2LoginAppUser(userE *models.SysUser, loginAppUser *vo.LoginAppUser) { loginAppUser.Id = userE.Id loginAppUser.Username = userE.Username loginAppUser.Nickname = userE.Nickname loginAppUser.HeadPic = userE.HeadPic loginAppUser.BackgroundPic = userE.BackgroundPic loginAppUser.UseIconType = userE.UseIconType permissions := make([]string, 0) pM := make(map[string]models.SysMenu, 0) var roleE models.SysRole var menuE models.SysMenu var srm models.SysRoleMenu var sum models.SysUserMenu allMenus := menuE.FindAll() roles := roleE.FindByUserId(userE.Id) //用户角色 loginAppUser.SysRoles = roles if roles != nil && allMenus != nil { menuMap := make(map[string]models.SysMenu, 0) for _, menuE := range allMenus { menuMap[menuE.Id] = menuE } var userMenus []vo.SysMenuVo if len(roles) > 0 && roles[0].Name == "超级管理员" { for _, menuModel := range menuMap { userMenus = append(userMenus, vo.SysMenuVo{ SysMenu: menuModel, }) pM[menuModel.Id] = menuModel } } else { sumList, _ := sum.FindByRoleId(userE.Id) if nil != sumList && len(sumList) > 0 { for _, srmE := range sumList { if _, ok := pM[srmE.MenuId]; !ok { menuModel := menuMap[srmE.MenuId] pM[menuModel.Id] = menuModel pidArr := strings.Split(menuModel.ParentIds, ",") for _, pid := range pidArr { if pid != "" && pid != "0" { if _, k := pM[pid]; !k { pM[pid] = menuMap[pid] } } } userMenus = append(userMenus, vo.SysMenuVo{ SysMenu: menuModel, }) } } } else { for _, role := range roles { srmList, _ := srm.FindByRoleId(role.Id) if srmList != nil { //var userMenus []vo.SysMenuVo for _, srmE := range srmList { if _, ok := pM[srmE.MenuId]; !ok { menuModel := menuMap[srmE.MenuId] pM[menuModel.Id] = menuModel pidArr := strings.Split(menuModel.ParentIds, ",") for _, pid := range pidArr { if pid != "" && pid != "0" { if _, k := pM[pid]; !k { pM[pid] = menuMap[pid] } } } userMenus = append(userMenus, vo.SysMenuVo{ SysMenu: menuModel, }) } } } } } } loginAppUser.SysMenus = userMenus } for _, v := range pM { permissions = append(permissions, v.Permission) } loginAppUser.Permissions = permissions logger.Debug("permissions:", permissions) } func (sv UserService) UpdatePwd(userId string, oldPwd string, newPwd string, opUserId string) (bool, error) { var userE models.SysUser rows, err := userE.SelectById(userId) if err != nil || rows == 0 { return false, errors.New("用户未找到!") } if oldPwd != "" { if encryOldPwd, _ := util.Encrypt(oldPwd); encryOldPwd == userE.Password { //旧密码匹配 encryNewPwd, err := util.Encrypt(newPwd) if err == nil { return userE.UpdatePwd(userId, encryNewPwd), nil } else { return false, err } } else { return false, errors.New("原密码不正确!") } } else { var roleE models.SysRole roles := roleE.FindByUserId(userE.Id) //用户角色 opRoles := roleE.FindByUserId(opUserId) if len(roles) > 0 && roles[0].Name == "超级管理员" { return false, errors.New("您没有权限修改超级管理员的密码!") } if len(roles) > 0 && roles[0].Name == "管理员" { if len(opRoles) < 0 || opRoles[0].Name != "超级管理员" { return false, errors.New("您没有权限修改管理员的密码!") } } if len(roles) > 0 && roles[0].Name == "普通用户" { if len(opRoles) < 0 || opRoles[0].Name != "超级管理员" && opRoles[0].Name != "管理员" { return false, errors.New("您没有权限修改普通用户的密码!") } } encryNewPwd, err := util.Encrypt(newPwd) if err == nil { return userE.UpdatePwd(userId, encryNewPwd), nil } else { return false, err } } } func (sv UserService) AddUser(userVo vo.UserVo) (bool, string) { var userE models.SysUser var userR models.SysRole rows, err := userE.FindByName(userVo.UserName) if err != nil { return false, "" } if rows > 0 { return false, "用户名已存在" } else { if len([]byte(userVo.Password)) < 6 { return false, "密码长度不能小于6位" } pwdStr, err := util.Encrypt(userVo.Password) if err != nil { return false, "添加失败" } addModel := models.SysUser{ Username: userVo.UserName, Password: pwdStr, Nickname: userVo.Nickname, HeadPic: userVo.HeadPic, BackgroundPic: models.DefaultBgPic, } if flag, err := addModel.Insert(); flag && err == nil { if "" == userVo.RoleId { _, err := userR.FindByName("普通用户") if err == nil { userVo.RoleId = userR.Id } } if "" != userVo.RoleId { userRole := models.SysUserRole{ UserId: addModel.Id, RoleId: userVo.RoleId, } userRole.Insert() } return true, "添加成功" } else { return false, "添加失败" } } } func (sv UserService) FindAll(curUserId string) (allAppUser []vo.LoginAppUser, err error) { var userE models.SysUser rows, err := userE.SelectById(curUserId) if err != nil || rows == 0 { return nil, err } else { list, _ := userE.FindAll() var myself vo.LoginAppUser if list != nil { tmpList := make([]vo.LoginAppUser, 1) var roleE models.SysRole roles := roleE.FindByUserId(userE.Id) if roles != nil && len(roles) == 1 { if roles[0].Name == "超级管理员" { for _, u := range list { if u.Id == curUserId { user2LoginAppUser(&u, &myself) } else { var appUE vo.LoginAppUser user2LoginAppUser(&u, &appUE) tmpList = append(tmpList, appUE) } } } else if roles[0].Name == "管理员" { for _, u := range list { var appUE vo.LoginAppUser appUERoles := roleE.FindByUserId(u.Id) if appUERoles != nil && len(appUERoles) == 1 { if u.Id == curUserId { user2LoginAppUser(&u, &myself) } else if appUERoles[0].Name == "普通用户" { user2LoginAppUser(&u, &appUE) tmpList = append(tmpList, appUE) } } } } else if roles[0].Name == "普通用户" { for _, u := range list { //var appUE vo.LoginAppUser appUERoles := roleE.FindByUserId(u.Id) if appUERoles != nil && len(appUERoles) == 1 { if u.Id == curUserId { user2LoginAppUser(&u, &myself) } } } } } tmpList[0] = myself return tmpList, nil } else { return []vo.LoginAppUser{}, nil } } } func (sv UserService) FindByUserId(userId string) (userAuth vo.UserAuthVo, err error) { var userE models.SysUser rows, _ := userE.SelectById(userId) if rows > 0 { //userAuth.Id = userE.Id //userAuth.Username = userE.Username //userAuth.Nickname = userE.Nickname //userAuth.HeadPic = userE.HeadPic userAuth.SysUser = userE var appUE vo.LoginAppUser user2LoginAppUser(&userE, &appUE) userAuth.Menus = appUE.SysMenus //var roleE models.SysRole //var menuE models.SysMenu //userAuth.Menus = menuE.FindByUserId(userE.Id) //if nil == userAuth.Menus { // roles := roleE.FindByUserId(userE.Id) // if roles!=nil && len(roles) == 1{ // userAuth.Menus = menuE.FindByRoleId(roles[0].Id) // } //} return userAuth, nil } return userAuth, errors.New("user not found") } func (sv UserService) SaveAuth(userEditVo *vo.UserEditVo, opuserId string) error { var userE models.SysUser rows, e1 := userE.SelectById(userEditVo.Id) if e1 == nil && rows > 0 { //var userTmp models.SysUser //userEditVo.UserName = rows[] //existU, e2 := userTmp.FindByName(userEditVo.UserName) //existU := -1 e2 := e1 if e2 == nil { /*if existU > 0 && userTmp.Id != userE.Id { //企图修改为他人的用户名 return false } reUname := false if existU == 0 { //修改用户名为一个未被使用的用户名 reUname = true }*/ //uNewPwd, _ := util.Encrypt(userEditVo.NewPwd) var roleE models.SysRole roles := roleE.FindByUserId(userE.Id) if roles != nil && len(roles) == 1 { userRole := roles[0] oproles := roleE.FindByUserId(opuserId) if oproles[0].Name == "管理员" && userRole.Name != "普通用户" { return errors.New("管理员只能修改普通用户权限") } if oproles[0].Name == "普通用户" { return errors.New("普通用户不能修改权限") } //userRole := roles[0] var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() /*if reUname && userRole.Name == "普通用户" { //只有普通用户才允许修改用户名 err = tx.Exec("update sys_user set username=? where id=?", userEditVo.UserName, userEditVo.Id).Error if err !=nil { return false } } if userEditVo.NewPwd !="" {//如果密码不为空,则修改密码 err = tx.Exec("update sys_user set password=? where id=?",uNewPwd,userEditVo.Id).Error if err !=nil { return false } }*/ //处理当前用户权限 err = tx.Exec("delete from sys_user_menu where user_id=?", userE.Id).Error if err != nil { return err } for _, menuId := range userEditVo.MenuIds { err = tx.Exec("insert into sys_user_menu (id,user_id,menu_id) values (?,?,?)", uuid.NewV4().String(), userE.Id, menuId).Error if err != nil { return err } } tx.Commit() return nil } else { return errors.New("user role is not set") } } } return errors.New("user not found") } //上传头像 func (sv UserService) UploadHeadPic(fileBytes []byte, filename string) (string, error) { fileExt := path.Ext(filename) fileExt = strings.ToLower(fileExt) if fileExt != ".jpg" && fileExt != ".jpeg" && fileExt != ".png" { return "", errors.New("pic format error") } var sApi bhomedbapi.SysSetApi flag, localConf := sApi.GetServerInfo() if !flag || localConf.AlarmIp == "" || localConf.AlarmPort == 0 { logger.Debug("localConf err") return "", errors.New("localConf err") } var weedfsUri = "http://" + localConf.WebPicIp + ":" + strconv.Itoa(int(localConf.WebPicPort)) + "/submit?collection=headpic" logger.Debug("weedfsUri:", weedfsUri) weedFilePath, err := WeedFSClient.UploadFile(weedfsUri, filename, fileBytes, 5*time.Second) if err != nil { logger.Debug("WeedFSClient.UploadFile err:", err, filename) return "", errors.New("WeedFSClient.UploadFile err") } return weedFilePath, nil } //更新头像、昵称 func (sv UserService) UpdateProfile(userEditVo *vo.UserEditVo) bool { var userE models.SysUser rows, e1 := userE.SelectById(userEditVo.Id) if e1 == nil && rows > 0 { var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() if userEditVo.HeadPic != "" { err = tx.Exec("update sys_user set headpic=? where id=?", userEditVo.HeadPic, userEditVo.Id).Error if err != nil { return false } } if userEditVo.BackgroundPic != "" { err = tx.Exec("update sys_user set backgroundpic = ? where id = ?", userEditVo.BackgroundPic, userEditVo.Id).Error if err != nil { return false } } if userEditVo.IconType != 0 { err = tx.Exec("update sys_user set useIconType = ? where id = ?", userEditVo.IconType, userEditVo.Id).Error if err != nil { return false } } if userEditVo.Nickname != "" { err = tx.Exec("update sys_user set nickname=? where id=?", userEditVo.Nickname, userEditVo.Id).Error if err != nil { return false } } if userEditVo.NewPwd != "" { uppwd, err := util.Encrypt(userEditVo.NewPwd) if nil == err { err = tx.Exec("update sys_user set password=? where id=?", uppwd, userEditVo.Id).Error if err != nil { return false } } else { return false } } tx.Commit() return true } return false } func (sv UserService) GetRoles(useId string) ([]models.SysRole, error) { var roleE models.SysRole roles := roleE.FindByUserId(useId) tempList, err := roleE.FindAll() if nil != err { return tempList, err } var res = make([]models.SysRole, 1) for _, role := range tempList { if roles[0].Name == "管理员" { if role.Name == "普通用户" { res[0] = role } } else if "超级管理员" == roles[0].Name && role.Name != "超级管理员" { if role.Name == "管理员" { res[0] = role } else { res = append(res, role) } } } return res, nil } func (sv UserService) GetProfile(uid string) (loginAppUser vo.LoginAppUser) { var userE models.SysUser rows, err := userE.SelectById(uid) fmt.Println("user icon type is :", userE.UseIconType) if err != nil || rows == 0 { return loginAppUser } user2LoginAppUser(&userE, &loginAppUser) var roleE models.SysRole roles := roleE.FindByUserId(userE.Id) loginAppUser.SysRoles = roles if len(roles) > 0 { loginAppUser.RoleName = roles[0].Name } loginAppUser.HeadPic = userE.HeadPic loginAppUser.BackgroundPic = userE.BackgroundPic // loginAppUser.UseIconType = userE.UseIconType fmt.Println("loginAppUser icon type is :", loginAppUser.UseIconType) return loginAppUser }