Files
anytunnel/at-admin/app/controllers/user.go
T
2019-08-08 17:13:34 +08:00

300 lines
8.1 KiB
Go

package controllers
import (
"anytunnel/at-admin/app/models"
"anytunnel/at-admin/app/utils"
"regexp"
"strings"
"time"
"fmt"
validation "github.com/go-ozzo/ozzo-validation"
"github.com/go-ozzo/ozzo-validation/is"
)
type UserController struct {
BaseAdminController
}
func (this *UserController) Forbidden() {
userModel := models.User{}
userId := this.GetString("user_id")
if userId == "1" {
this.jsonError("系统用户不能禁用")
}
err := userModel.Forbidden(userId)
if err != nil {
this.jsonError(err)
}
this.jsonSuccess("")
}
func (this *UserController) Review() {
userModel := models.User{}
userId := this.GetString("user_id")
if userId == "1" {
this.jsonError("系统用户不能操作")
}
err := userModel.Review(userId)
if err != nil {
this.jsonError(err)
}
this.jsonSuccess("")
}
func (this *UserController) ChangePassword() {
userModel := models.User{}
if this.Ctx.Input.IsPost() {
newpassword := this.GetString("password")
oldpassword := this.GetString("password_old")
errs := validation.Errors{
"旧密码": validation.Validate(oldpassword,
validation.Required.Error("不能为空")),
"新密码": validation.Validate(newpassword,
validation.Required.Error("不能为空"),
validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符")),
}
err := errs.Filter()
if err != nil {
this.jsonError(err)
}
err = userModel.ChangePassword(this.loginUser["user_id"], newpassword, oldpassword)
if err != nil {
this.jsonError("修改密码失败:" + err.Error())
}
this.jsonSuccess("")
} else {
this.viewLayout("user/changepassword", "form")
}
}
func (this *UserController) Add() {
userModel := models.User{}
roleModel := models.Role{}
userRoleModel := models.UserRole{}
if this.Ctx.Input.IsPost() {
_, data := this.getUserFromPost(false)
username := this.GetString("username")
roleIds := this.GetStrings("role_ids", []string{})
if len(roleIds) == 0 {
this.jsonError("没有选择角色")
}
HasUsername, err := userModel.HasUsername(username)
if err != nil {
this.jsonError(err)
}
if HasUsername {
this.jsonError("用户名已经存在")
}
userId, err := userModel.Insert(data)
if err != nil {
this.jsonError("添加用户失败:" + err.Error())
}
//添加用户与角色对应关系
_, err = userRoleModel.Insert(utils.NewConvert().IntToString(userId, 10), roleIds)
if err != nil {
this.jsonError("添加用户角色失败:" + err.Error())
}
this.jsonSuccess("")
} else {
roles := []map[string]string{}
allRoles, _ := roleModel.GetAllRoles()
for _, allRole := range allRoles {
role := allRole
role["is_default"] = "0"
roles = append(roles, role)
}
this.Data["action"] = "add"
this.Data["roles"] = roles
this.viewLayout("user/form", "form")
}
}
func (this *UserController) Edit() {
userModel := models.User{}
roleModel := models.Role{}
userRoleModel := models.UserRole{}
userId := this.GetString("user_id")
if this.Ctx.Input.IsPost() {
_, data := this.getUserFromPost(true)
username := this.GetString("username")
roleIds := this.GetStrings("role_ids", []string{})
if len(roleIds) == 0 {
this.jsonError("没有选择角色")
}
HasSameUsername, err := userModel.HasSameUsername(userId, username)
if err != nil {
this.jsonError(err)
}
if HasSameUsername {
this.jsonError("用户名已经存在")
}
_, err = userModel.Update(userId, data)
if err != nil {
this.jsonError("修改用户失败:" + err.Error())
}
//添加用户与角色对应关系
_, err = userRoleModel.Insert(userId, roleIds)
if err != nil {
this.jsonError("修改用户角色失败:" + err.Error())
}
this.jsonSuccess("")
} else {
roles := []map[string]string{}
user, err := userModel.GetUserByUserId(userId)
allRoles, _ := roleModel.GetAllRoles()
userRoles, _ := userRoleModel.GetUserRolesByUserId(userId)
for _, allRole := range allRoles {
role := allRole
if len(userRoles) == 0 {
role["is_default"] = "0"
} else {
for _, userRoles := range userRoles {
if allRole["role_id"] == userRoles["role_id"] {
role["is_default"] = "1"
break
}
role["is_default"] = "0"
}
}
roles = append(roles, role)
}
if err != nil {
this.jsonError(err, "")
}
if len(user) == 0 {
this.jsonError("用户不存在")
}
this.Data["user"] = user
this.Data["roles"] = roles
this.Data["action"] = "edit"
this.viewLayout("user/form", "form")
}
}
func (this *UserController) getUserFromPost(isUpdate bool) (userId string, user map[string]interface{}) {
userModel := models.User{}
user = map[string]interface{}{
"username": this.GetString("username"),
"given_name": this.GetString("given_name"),
"email": this.GetString("email"),
"mobile": this.GetString("mobile"),
}
errs := validation.Errors{
"手机号": validation.Validate(user["mobile"],
validation.Match(regexp.MustCompile("^1[3|4|5|7|8][0-9]{9}$")).Error("格式错误")),
"邮箱": validation.Validate(user["email"],
validation.Required.Error("不能为空"),
is.Email.Error("格式错误")),
"姓名": validation.Validate(user["given_name"],
validation.Required.Error("不能为空"),
validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
//"角色": validation.Validate(user["role_ids"]),
// validation.Required.Error("没有选择角色"),
}
if !isUpdate {
errs["用户名"] = validation.Validate(user["username"],
validation.Required.Error("不能为空"),
validation.Match(regexp.MustCompile("^[0-9_a-zA-Z]{1,15}$")).Error("只能包含数字字母和下划线,且1-15字符"))
// errs["密码"] = validation.Validate(this.GetString("password"),
// validation.Required.Error("不能为空"),
// validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符"))
}
err := errs.Filter()
if err != nil {
this.jsonError(err)
}
if isUpdate {
// if this.GetString("password") != "" {
// user["password"] = userModel.EncodePassword(this.GetString("password"))
// }
user["update_time"] = time.Now().Unix()
delete(user, "username")
} else {
user["is_forbidden"] = 0
user["password"] = userModel.EncodePassword(this.GetString("password"))
user["create_time"] = time.Now().Unix()
}
return
}
func (this *UserController) List() {
keyword := strings.Trim(this.GetString("keyword", ""), " ")
page, err := this.GetInt("page", 1)
if err != nil {
page = 1
}
//每页的条数
pageSize := 10
limit := (page - 1) * pageSize
userModel := models.User{}
var users = []map[string]string{}
var userCount = 0
if keyword == "" {
userCount, err = userModel.CountUsers()
users, err = userModel.GetUsersByLimit(limit, pageSize)
} else {
userCount, err = userModel.CountUsersByKeyword(keyword)
users, err = userModel.GetUsersByKeywordAndLimit(keyword, limit, pageSize)
}
if err != nil {
this.viewError(err.Error())
}
roleModel := models.Role{}
userRoles := map[string]string{}
//用户角色
for _, user := range users {
userId := user["user_id"]
var names = ""
roles, err := roleModel.GetRolesByUserId(userId)
if err != nil {
this.viewError(err.Error())
}
for _, role := range roles {
names += "," + role["name"]
}
userRoles[user["user_id"]] = strings.Replace(names, ",", "", 1)
}
this.Data["users"] = users
this.Data["userRoles"] = userRoles
this.Data["keyword"] = keyword
this.Data["page"] = utils.NewMisc().Page(userCount, page, pageSize, "/user/list?page={page}")
this.viewLayoutTitle("用户列表", "user/list", "form")
}
//个人资料
func (this *UserController) Profile() {
userModel := models.User{}
if this.Ctx.Input.IsPost() {
_, data := this.getUserFromPost(true)
fmt.Println(data)
userId := this.GetString("user_id")
_, err := userModel.Update(userId, data)
if err != nil {
this.jsonError("修改个人资料失败:" + err.Error())
}
this.jsonSuccess("")
} else {
user := this.GetSession("author").(map[string]string)
this.Data["user"] = user
this.viewLayout("user/profile", "form")
}
}