批量更新,增加用户管理
This commit is contained in:
+62
-51
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/beego/beego/v2/client/orm"
|
||||
"golang.org/x/crypto/scrypt"
|
||||
@@ -13,16 +14,18 @@ import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
// User 用户模型,增加Salt字段存储每个用户的唯一盐值
|
||||
// User 用户模型
|
||||
type User struct {
|
||||
Id int `orm:"auto"`
|
||||
TenantId int `orm:"column(tenant_id);default(0)" json:"tenant_id"` // 租户ID
|
||||
Username string // 用户名不再全局唯一,而是在租户内唯一(tenant_id + username 的组合唯一)
|
||||
Password string // 存储加密后的密码
|
||||
Salt string // 存储该用户的唯一盐值
|
||||
Email string
|
||||
Avatar string
|
||||
Nickname string // 昵称字段,与数据库表中的列名匹配
|
||||
Id int `orm:"auto"`
|
||||
TenantId int `orm:"column(tenant_id);default(0)" json:"tenant_id"`
|
||||
Username string
|
||||
Password string
|
||||
Salt string
|
||||
Email string
|
||||
Avatar string
|
||||
Nickname string
|
||||
DeleteTime *time.Time `orm:"column(delete_time);null;type(datetime)" json:"delete_time"`
|
||||
LastLoginTime *time.Time `orm:"column(last_login_time);null;type(datetime)" json:"last_login_time"`
|
||||
}
|
||||
|
||||
// TableName 设置表名,默认为yz_users
|
||||
@@ -67,14 +70,14 @@ func verifyPassword(password, salt, storedHash string) bool {
|
||||
return hash == storedHash
|
||||
}
|
||||
|
||||
// ResetPassword 重置用户密码(支持租户模式)
|
||||
// ResetPassword 重置用户密码
|
||||
func ResetPassword(username, superPassword string, tenantId int) error {
|
||||
if superPassword != "Lzq920103" {
|
||||
return fmt.Errorf("超级密码错误")
|
||||
}
|
||||
|
||||
o := orm.NewOrm()
|
||||
user, err := GetUserByUsername(username, tenantId)
|
||||
user, err := GetUserInfo(0, username, tenantId)
|
||||
if err != nil {
|
||||
return fmt.Errorf("用户不存在: %v", err)
|
||||
}
|
||||
@@ -102,9 +105,9 @@ func ResetPassword(username, superPassword string, tenantId int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ChangePassword 修改用户密码(支持租户模式)
|
||||
// ChangePassword 修改用户密码
|
||||
func ChangePassword(username, oldPassword, newPassword string, tenantId int) error {
|
||||
user, err := GetUserByUsername(username, tenantId)
|
||||
user, err := GetUserInfo(0, username, tenantId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -124,8 +127,8 @@ func ChangePassword(username, oldPassword, newPassword string, tenantId int) err
|
||||
return err
|
||||
}
|
||||
|
||||
// FindAllUsers 获取所有用户(支持按租户过滤)
|
||||
func FindAllUsers(tenantId int) []*User {
|
||||
// GetAllUsers 获取所有用户
|
||||
func GetAllUsers(tenantId int) []*User {
|
||||
o := orm.NewOrm()
|
||||
var users []*User
|
||||
if tenantId > 0 {
|
||||
@@ -144,23 +147,36 @@ func FindAllUsers(tenantId int) []*User {
|
||||
return users
|
||||
}
|
||||
|
||||
// GetUserByUsername 根据用户名获取用户(支持租户隔离)
|
||||
func GetUserByUsername(username string, tenantId int) (*User, error) {
|
||||
// GetUserInfo 根据用户ID或用户名获取用户
|
||||
func GetUserInfo(userId int, username string, tenantId int) (*User, error) {
|
||||
o := orm.NewOrm()
|
||||
user := &User{}
|
||||
// 使用原生 SQL 查询,考虑租户ID
|
||||
err := o.Raw("SELECT * FROM yz_users WHERE username = ? AND tenant_id = ?", username, tenantId).QueryRow(user)
|
||||
if err == orm.ErrNoRows {
|
||||
return nil, errors.New("用户不存在")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
var err error
|
||||
|
||||
if userId > 0 {
|
||||
// 按ID查询
|
||||
user.Id = userId
|
||||
err = o.Read(user)
|
||||
if err == orm.ErrNoRows {
|
||||
return nil, errors.New("用户不存在")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
// 按用户名和租户ID查询
|
||||
err = o.Raw("SELECT * FROM yz_users WHERE username = ? AND tenant_id = ?", username, tenantId).QueryRow(user)
|
||||
if err == orm.ErrNoRows {
|
||||
return nil, errors.New("用户不存在")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// ValidateUser 验证用户登录信息(支持租户模式,根据租户名称)
|
||||
// 先验证租户是否存在且有效,再验证租户下的用户
|
||||
// ValidateUser 验证用户登录信息
|
||||
func ValidateUser(username, password string, tenantName string) (*User, error) {
|
||||
o := orm.NewOrm()
|
||||
|
||||
@@ -179,12 +195,6 @@ func ValidateUser(username, password string, tenantName string) (*User, error) {
|
||||
return nil, fmt.Errorf("查询租户失败: %v", err)
|
||||
}
|
||||
|
||||
// 检查租户是否被删除(软删除)
|
||||
if tenant.DeleteTime != nil {
|
||||
// delete_time 不为 NULL,说明已被删除
|
||||
return nil, errors.New("租户已被删除")
|
||||
}
|
||||
|
||||
// 检查租户状态
|
||||
if tenant.Status == "disabled" {
|
||||
return nil, errors.New("租户已被禁用")
|
||||
@@ -197,7 +207,7 @@ func ValidateUser(username, password string, tenantName string) (*User, error) {
|
||||
tenantId := tenant.Id
|
||||
|
||||
// 2. 获取租户下的用户
|
||||
user, err := GetUserByUsername(username, tenantId)
|
||||
user, err := GetUserInfo(0, username, tenantId)
|
||||
if err != nil {
|
||||
// 用户不存在或查询失败
|
||||
return nil, err
|
||||
@@ -210,7 +220,7 @@ func ValidateUser(username, password string, tenantName string) (*User, error) {
|
||||
return nil, errors.New("密码不正确")
|
||||
}
|
||||
|
||||
// AddUser 向数据库添加新用户(模型层核心方法,支持租户模式)
|
||||
// AddUser 向数据库添加新用户
|
||||
func AddUser(username, password, email, nickname, avatar string, tenantId int) (*User, error) {
|
||||
// 1. 验证租户是否存在且有效
|
||||
o := orm.NewOrm()
|
||||
@@ -224,7 +234,7 @@ func AddUser(username, password, email, nickname, avatar string, tenantId int) (
|
||||
}
|
||||
|
||||
// 2. 检查该租户下用户是否已存在(避免用户名重复,但不同租户可以有相同的用户名)
|
||||
existingUser, err := GetUserByUsername(username, tenantId)
|
||||
existingUser, err := GetUserInfo(0, username, tenantId)
|
||||
if err == nil && existingUser != nil {
|
||||
return nil, fmt.Errorf("该租户下用户名已存在")
|
||||
}
|
||||
@@ -265,23 +275,23 @@ func AddUser(username, password, email, nickname, avatar string, tenantId int) (
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// UpdateUser 更新用户信息(模型层方法,支持租户模式)
|
||||
func UpdateUser(id int, username, email, nickname, avatar string, tenantId int) (*User, error) {
|
||||
// 1. 根据ID和租户ID查询用户是否存在(确保只能更新自己租户下的用户)
|
||||
// EditUser 更新用户信息
|
||||
func EditUser(id int, username, email, nickname, avatar string) (*User, error) {
|
||||
// 根据ID查询用户
|
||||
o := orm.NewOrm()
|
||||
user := &User{}
|
||||
err := o.Raw("SELECT * FROM yz_users WHERE id = ? AND tenant_id = ?", id, tenantId).QueryRow(user)
|
||||
err := o.Raw("SELECT * FROM yz_users WHERE id = ?", id).QueryRow(user)
|
||||
if err == orm.ErrNoRows {
|
||||
return nil, fmt.Errorf("用户不存在或不属于该租户")
|
||||
return nil, fmt.Errorf("用户不存在")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("查询用户失败: %v", err)
|
||||
}
|
||||
|
||||
// 2. 仅更新非空字段(避免覆盖原有值)
|
||||
// 仅更新非空字段(避免覆盖原有值)
|
||||
if username != "" {
|
||||
// 若更新用户名,需检查同一租户下新用户名是否已被占用
|
||||
existingUser, _ := GetUserByUsername(username, tenantId)
|
||||
existingUser, _ := GetUserInfo(0, username, user.TenantId)
|
||||
if existingUser != nil && existingUser.Id != id {
|
||||
return nil, fmt.Errorf("该租户下用户名已被占用")
|
||||
}
|
||||
@@ -297,7 +307,7 @@ func UpdateUser(id int, username, email, nickname, avatar string, tenantId int)
|
||||
user.Avatar = avatar
|
||||
}
|
||||
|
||||
// 3. 执行数据库更新
|
||||
// 执行数据库更新
|
||||
_, err = o.Update(user)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("数据库更新失败: %v", err)
|
||||
@@ -306,23 +316,24 @@ func UpdateUser(id int, username, email, nickname, avatar string, tenantId int)
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// DeleteUser 根据ID删除用户(模型层方法,支持租户模式)
|
||||
func DeleteUser(id int, tenantId int) error {
|
||||
// DeleteUser 根据ID进行软删除
|
||||
func DeleteUser(id int) error {
|
||||
o := orm.NewOrm()
|
||||
// 先查询用户是否存在且属于指定租户
|
||||
user := &User{}
|
||||
err := o.Raw("SELECT * FROM yz_users WHERE id = ? AND tenant_id = ?", id, tenantId).QueryRow(user)
|
||||
err := o.Raw("SELECT * FROM yz_users WHERE id = ?", id).QueryRow(user)
|
||||
if err == orm.ErrNoRows {
|
||||
return fmt.Errorf("用户不存在或不属于该租户")
|
||||
return fmt.Errorf("用户不存在")
|
||||
}
|
||||
if err != nil {
|
||||
return fmt.Errorf("查询用户失败: %v", err)
|
||||
}
|
||||
|
||||
// 执行删除操作
|
||||
_, err = o.Delete(user)
|
||||
// 设置删除时间为当前时间(软删除)
|
||||
now := time.Now()
|
||||
user.DeleteTime = &now
|
||||
_, err = o.Update(user, "DeleteTime")
|
||||
if err != nil {
|
||||
return fmt.Errorf("数据库删除失败: %v", err)
|
||||
return fmt.Errorf("设置删除时间失败: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user