批量更新,增加用户管理

This commit is contained in:
2025-11-01 17:57:34 +08:00
parent 186dcb86d9
commit bfba8d7ad6
28 changed files with 2307 additions and 2377 deletions
+62 -51
View File
@@ -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
}