Files
wehub-resource-sync a21fa4e11b
Go / Build (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:30:21 +08:00

396 lines
11 KiB
Go

package controllers
import (
"fmt"
"github.com/astaxie/beego/validation"
"github.com/phachon/mm-wiki/app/models"
"github.com/phachon/mm-wiki/app/utils"
"strings"
)
type UserController struct {
BaseController
}
func (this *UserController) Add() {
roles := []map[string]string{}
var err error
if this.IsRoot() {
roles, err = models.RoleModel.GetRoles()
} else {
roles, err = models.RoleModel.GetRolesNotContainRoot()
}
if err != nil {
this.ErrorLog("获取用户角色失败:" + err.Error())
this.ViewError("获取用户角色失败!")
}
this.Data["roles"] = roles
this.viewLayout("user/form", "user")
}
func (this *UserController) Save() {
if !this.IsPost() {
this.ViewError("请求方式有误!", "/system/user/add")
}
username := strings.TrimSpace(this.GetString("username", ""))
givenName := strings.TrimSpace(this.GetString("given_name", ""))
password := strings.TrimSpace(this.GetString("password", ""))
email := strings.TrimSpace(this.GetString("email", ""))
mobile := strings.TrimSpace(this.GetString("mobile", ""))
roleId := strings.TrimSpace(this.GetString("role_id", ""))
phone := strings.TrimSpace(this.GetString("phone", ""))
department := strings.TrimSpace(this.GetString("department", ""))
position := strings.TrimSpace(this.GetString("position", ""))
location := strings.TrimSpace(this.GetString("location", ""))
im := strings.TrimSpace(this.GetString("im", ""))
this.Ctx.Request.PostForm.Del("password")
v := validation.Validation{}
if username == "" {
this.jsonError("用户名不能为空!")
}
if !v.AlphaNumeric(username, "username").Ok {
this.jsonError("用户名格式不正确!")
}
if givenName == "" {
this.jsonError("姓名不能为空!")
}
if password == "" {
this.jsonError("密码不能为空!")
}
if email == "" {
this.jsonError("邮箱不能为空!")
}
if !v.Email(email, "email").Ok {
this.jsonError("邮箱格式不正确!")
}
if mobile == "" {
this.jsonError("手机号不能为空!")
}
//if !v.Mobile(mobile, "mobile").Ok {
// this.jsonError("手机号格式不正确!")
//}
if roleId == "" {
this.jsonError("没有选择角色!")
}
//if phone != "" && !v.Phone(phone, "phone").Ok {
// this.jsonError("电话格式不正确!")
//}
ok, err := models.UserModel.HasUsername(username)
if err != nil {
this.ErrorLog("添加用户失败:" + err.Error())
this.jsonError("添加用户失败!")
}
if ok {
this.jsonError("用户名已经存在!")
}
if !this.IsRoot() && roleId == fmt.Sprintf("%d", models.Role_Root_Id) {
this.jsonError("没有权限添加超级管理员!")
}
userId, err := models.UserModel.Insert(map[string]interface{}{
"username": username,
"given_name": givenName,
"password": models.UserModel.EncodePassword(password),
"email": email,
"mobile": mobile,
"phone": phone,
"department": department,
"position": position,
"location": location,
"im": im,
"role_id": roleId,
})
if err != nil {
this.ErrorLog("添加用户失败:" + err.Error())
this.jsonError("添加用户失败")
}
this.InfoLog("添加用户 " + utils.Convert.IntToString(userId, 10) + " 成功")
this.jsonSuccess("添加用户成功", nil, "/system/user/list")
}
func (this *UserController) List() {
keywords := map[string]string{}
page, _ := this.GetInt("page", 1)
username := strings.TrimSpace(this.GetString("username", ""))
roleId := strings.TrimSpace(this.GetString("role_id", ""))
number, _ := this.GetRangeInt("number", 20, 10, 100)
if username != "" {
keywords["username"] = username
}
if roleId != "" {
keywords["role_id"] = roleId
}
limit := (page - 1) * number
var err error
var count int64
var users []map[string]string
if len(keywords) != 0 {
count, err = models.UserModel.CountUsersByKeywords(keywords)
users, err = models.UserModel.GetUsersByKeywordsAndLimit(keywords, limit, number)
} else {
count, err = models.UserModel.CountUsers()
users, err = models.UserModel.GetUsersByLimit(limit, number)
}
if err != nil {
this.ErrorLog("获取用户列表失败: " + err.Error())
this.ViewError("获取用户列表失败", "/system/main/index")
}
var roleIds = []string{}
if roleId != "" {
roleIds = append(roleIds, roleId)
} else {
for _, user := range users {
roleIds = append(roleIds, user["role_id"])
}
}
roles, err := models.RoleModel.GetRoleByRoleIds(roleIds)
if err != nil {
this.ErrorLog("获取用户列表失败: " + err.Error())
this.ViewError("获取用户列表失败!", "/system/main/index")
}
var roleUsers = []map[string]string{}
for _, user := range users {
roleUser := user
for _, role := range roles {
if role["role_id"] == user["role_id"] {
roleUser["role_name"] = role["name"]
break
}
}
roleUsers = append(roleUsers, roleUser)
}
allRoles, err := models.RoleModel.GetRoles()
if err != nil {
this.ErrorLog("获取用户列表失败: " + err.Error())
this.ViewError("获取用户列表失败!", "/system/main/index")
}
this.Data["users"] = roleUsers
this.Data["username"] = username
this.Data["roleId"] = roleId
this.Data["roles"] = allRoles
this.SetPaginator(number, count)
this.viewLayout("user/list", "user")
}
func (this *UserController) Edit() {
userId := this.GetString("user_id", "")
if userId == "" {
this.ViewError("用户不存在!", "/system/user/list")
}
user, err := models.UserModel.GetUserByUserId(userId)
if err != nil {
this.ErrorLog("查找用户出错:" + err.Error())
this.ViewError("查找用户出错!", "/system/user/list")
}
if len(user) == 0 {
this.ViewError("用户不存在!", "/system/user/list")
}
// 登录非 root 用户不能修改 root 用户信息
if user["role_id"] == fmt.Sprintf("%d", models.Role_Root_Id) && !this.IsRoot() {
this.ViewError("没有权限修改!", "/system/user/list")
}
roles := []map[string]string{}
if this.IsRoot() {
roles, err = models.RoleModel.GetRoles()
} else {
roles, err = models.RoleModel.GetRolesNotContainRoot()
}
if err != nil {
this.ErrorLog("获取用户角色失败:" + err.Error())
this.ViewError("获取用户角色失败!")
}
this.Data["user"] = user
this.Data["roles"] = roles
this.viewLayout("user/edit", "user")
}
func (this *UserController) Modify() {
if !this.IsPost() {
this.ViewError("请求方式有误!", "/system/user/list")
}
userId := strings.TrimSpace(this.GetString("user_id", ""))
givenName := strings.TrimSpace(this.GetString("given_name", ""))
email := strings.TrimSpace(this.GetString("email", ""))
mobile := strings.TrimSpace(this.GetString("mobile", ""))
roleId := strings.TrimSpace(this.GetString("role_id", ""))
phone := strings.TrimSpace(this.GetString("phone", ""))
department := strings.TrimSpace(this.GetString("department", ""))
position := strings.TrimSpace(this.GetString("position", ""))
location := strings.TrimSpace(this.GetString("location", ""))
im := strings.TrimSpace(this.GetString("im", ""))
password := strings.TrimSpace(this.GetString("password", ""))
this.Ctx.Request.PostForm.Del("password")
v := validation.Validation{}
if givenName == "" {
this.jsonError("姓名不能为空!")
}
if email == "" {
this.jsonError("邮箱不能为空!")
}
if !v.Email(email, "email").Ok {
this.jsonError("邮箱格式不正确!")
}
if mobile == "" {
this.jsonError("手机号不能为空!")
}
//if !v.Mobile(mobile, "mobile").Ok {
// this.jsonError("手机号格式不正确!")
//}
//if roleId == "" {
// this.jsonError("没有选择角色!")
//}
//if phone != "" && !v.Phone(phone, "phone").Ok {
// this.jsonError("电话格式不正确!")
//}
user, err := models.UserModel.GetUserByUserId(userId)
if err != nil {
this.ErrorLog("修改用户 " + userId + " 失败:" + err.Error())
this.jsonError("修改用户出错!")
}
if len(user) == 0 {
this.jsonError("用户不存在!")
}
if user["role_id"] == fmt.Sprintf("%d", models.Role_Root_Id) {
roleId = fmt.Sprintf("%d", models.Role_Root_Id)
}
// 登录非 root 用户不能修改 root 用户信息
if user["role_id"] == fmt.Sprintf("%d", models.Role_Root_Id) && !this.IsRoot() {
this.jsonError("没有权限修改!")
}
updateUser := map[string]interface{}{
"given_name": givenName,
"email": email,
"mobile": mobile,
"phone": phone,
"department": department,
"position": position,
"location": location,
"im": im,
}
// 超级管理员才可以修改其他用户密码
if password != "" && this.IsRoot() {
updateUser["password"] = models.UserModel.EncodePassword(password)
}
if roleId != "" {
updateUser["role_id"] = roleId
}
_, err = models.UserModel.Update(userId, updateUser)
if err != nil {
this.ErrorLog("修改用户 " + userId + " 失败:" + err.Error())
this.jsonError("修改用户失败")
}
this.InfoLog("修改用户 " + userId + " 成功")
this.jsonSuccess("修改用户成功", nil, "/system/user/list")
}
func (this *UserController) Forbidden() {
if !this.IsPost() {
this.ViewError("请求方式有误!", "/system/user/list")
}
userId := this.GetString("user_id", "")
if userId == "" {
this.jsonError("用户不存在")
}
user, err := models.UserModel.GetUserByUserId(userId)
if err != nil {
this.ErrorLog("屏蔽用户 " + userId + " 失败: " + err.Error())
this.jsonError("屏蔽用户失败")
}
if len(user) == 0 {
this.jsonError("用户不存在")
}
if user["role_id"] == fmt.Sprintf("%d", models.Role_Root_Id) {
this.jsonError("不能操作超级管理员")
}
_, err = models.UserModel.Update(userId, map[string]interface{}{
"is_forbidden": models.User_Forbidden_True,
})
if err != nil {
this.ErrorLog("屏蔽用户 " + userId + " 失败: " + err.Error())
this.jsonError("屏蔽用户失败")
}
this.InfoLog("屏蔽用户 " + userId + " 成功")
this.jsonSuccess("屏蔽用户成功", nil, "/system/user/list")
}
func (this *UserController) Recover() {
if !this.IsPost() {
this.ViewError("请求方式有误!", "/system/user/list")
}
userId := this.GetString("user_id", "")
if userId == "" {
this.jsonError("用户不存在")
}
user, err := models.UserModel.GetUserByUserId(userId)
if err != nil {
this.ErrorLog("恢复用户 " + userId + " 失败: " + err.Error())
this.jsonError("恢复用户失败")
}
if len(user) == 0 {
this.jsonError("用户不存在")
}
if user["role_id"] == fmt.Sprintf("%d", models.Role_Root_Id) {
this.jsonError("不能操作超级管理员")
}
_, err = models.UserModel.Update(userId, map[string]interface{}{
"is_forbidden": models.User_Is_Forbidden_False,
})
if err != nil {
this.ErrorLog("恢复用户 " + userId + " 失败: " + err.Error())
this.jsonError("恢复用户失败")
}
this.InfoLog("恢复用户 " + userId + " 成功")
this.jsonSuccess("恢复用户成功", nil, "/system/user/list")
}
func (this *UserController) Info() {
userId := this.GetString("user_id", "")
if userId == "" {
this.ViewError("用户不存在!", "/system/user/list")
}
user, err := models.UserModel.GetUserByUserId(userId)
if err != nil {
this.ErrorLog("查找用户出错:" + err.Error())
this.ViewError("查找用户出错!", "/system/user/list")
}
if len(user) == 0 {
this.ViewError("用户不存在!", "/system/user/list")
}
role, err := models.RoleModel.GetRoleByRoleId(user["role_id"])
if err != nil {
this.ErrorLog("查找用户角色出错:" + err.Error())
this.ViewError("查找用户出错!", "/system/user/list")
}
this.Data["user"] = user
this.Data["role"] = role
this.viewLayout("user/info", "user")
}