241 lines
6.0 KiB
Go
241 lines
6.0 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"myschools.me/heritage/heritage-api/model"
|
|
"myschools.me/heritage/heritage-api/mysql"
|
|
)
|
|
|
|
// UserCreateRequest 创建用户请求
|
|
type UserCreateRequest struct {
|
|
UserName string `json:"userName" binding:"required"`
|
|
Password string `json:"password" binding:"required"`
|
|
RoleID string `json:"roleId" binding:"required"`
|
|
OrgID string `json:"orgId" binding:"required"`
|
|
}
|
|
|
|
// UserUpdateRequest 更新用户请求
|
|
type UserUpdateRequest struct {
|
|
UserName string `json:"userName"`
|
|
RoleID string `json:"roleId"`
|
|
OrgID string `json:"orgId"`
|
|
}
|
|
|
|
// UserPasswordUpdateRequest 更新密码请求
|
|
type UserPasswordUpdateRequest struct {
|
|
OldPassword string `json:"oldPassword" binding:"required"`
|
|
NewPassword string `json:"newPassword" binding:"required"`
|
|
}
|
|
|
|
// UserResponse 用户响应
|
|
type UserResponse struct {
|
|
User *model.User `json:"user"`
|
|
}
|
|
|
|
// UserListResponse 用户列表响应
|
|
type UserListResponse struct {
|
|
Users []model.User `json:"users"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// UserCreate 创建用户
|
|
func UserCreate(req UserCreateRequest) (*model.User, error) {
|
|
// 检查用户名是否已存在
|
|
existingUser, err := mysql.UserByUserName(&req.UserName)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserCreate",
|
|
}).Warnf("mysql.UserByUserName: %v", err)
|
|
return nil, err
|
|
}
|
|
if existingUser != nil && existingUser.ID != "" {
|
|
return nil, errors.New("用户名已存在")
|
|
}
|
|
|
|
// 密码加密
|
|
h, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserCreate",
|
|
}).Warnf("bcrypt.GenerateFromPassword: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 创建用户
|
|
user := &model.User{
|
|
ID: newUserID(),
|
|
UserName: req.UserName,
|
|
PasswordHash: string(h),
|
|
RoleID: req.RoleID,
|
|
OrgID: req.OrgID,
|
|
}
|
|
|
|
createdUser, err := mysql.UserCreate(user)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserCreate",
|
|
}).Warnf("mysql.UserCreate: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
return createdUser, nil
|
|
}
|
|
|
|
// UserUpdate 更新用户
|
|
func UserUpdate(userID string, req UserUpdateRequest) (*model.User, error) {
|
|
// 检查用户是否存在
|
|
existingUser, err := mysql.UserFirst(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserUpdate",
|
|
}).Warnf("mysql.UserFirst: %v", err)
|
|
return nil, err
|
|
}
|
|
if existingUser.ID == "" {
|
|
return nil, errors.New("用户不存在")
|
|
}
|
|
|
|
// 检查用户名是否已被其他用户使用
|
|
if req.UserName != "" && req.UserName != existingUser.UserName {
|
|
otherUser, err := mysql.UserByUserName(&req.UserName)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserUpdate",
|
|
}).Warnf("mysql.UserByUserName: %v", err)
|
|
return nil, err
|
|
}
|
|
if otherUser != nil && otherUser.ID != userID {
|
|
return nil, errors.New("用户名已存在")
|
|
}
|
|
}
|
|
|
|
// 构建更新数据
|
|
updateData := make(map[string]any)
|
|
if req.UserName != "" {
|
|
updateData["user_name"] = req.UserName
|
|
}
|
|
if req.RoleID != "" {
|
|
updateData["role_id"] = req.RoleID
|
|
}
|
|
if req.OrgID != "" {
|
|
updateData["org_id"] = req.OrgID
|
|
}
|
|
|
|
// 更新用户
|
|
if err := mysql.UserUpdate(&userID, updateData); err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserUpdate",
|
|
}).Warnf("mysql.UserUpdate: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 获取更新后的用户
|
|
updatedUser, err := mysql.UserFirst(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserUpdate",
|
|
}).Warnf("mysql.UserFirst: %v", err)
|
|
return nil, err
|
|
}
|
|
if updatedUser.ID == "" {
|
|
return nil, errors.New("用户不存在")
|
|
}
|
|
|
|
return updatedUser, nil
|
|
}
|
|
|
|
// UserDelete 删除用户
|
|
func UserDelete(userID string) (bool, error) {
|
|
// 检查用户是否存在
|
|
existingUser, err := mysql.UserFirst(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserDelete",
|
|
}).Warnf("mysql.UserFirst: %v", err)
|
|
return false, err
|
|
}
|
|
if existingUser.ID == "" {
|
|
return false, errors.New("用户不存在")
|
|
}
|
|
|
|
// 这里可以添加删除用户的逻辑
|
|
// 例如:软删除或硬删除
|
|
// 由于当前 mysql 包中没有提供删除用户的函数,我们可以先返回一个错误
|
|
return false, errors.New("删除用户功能暂未实现")
|
|
}
|
|
|
|
// UserGet 获取用户
|
|
func UserGet(userID string) (*model.User, error) {
|
|
// 检查用户是否存在
|
|
user, err := mysql.UserFirst(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserGet",
|
|
}).Warnf("mysql.UserFirst: %v", err)
|
|
return nil, err
|
|
}
|
|
if user.ID == "" {
|
|
return nil, errors.New("用户不存在")
|
|
}
|
|
|
|
return user, nil
|
|
}
|
|
|
|
// UserList 获取用户列表
|
|
func UserList(page, pageSize int) ([]model.User, int64, error) {
|
|
// 获取所有用户
|
|
users, total, err := mysql.UserList(page, pageSize, nil)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserList",
|
|
}).Warnf("mysql.UserList: %v", err)
|
|
return nil, 0, err
|
|
}
|
|
|
|
return users, total, nil
|
|
}
|
|
|
|
// UserPasswordUpdate 更新用户密码
|
|
func UserPasswordUpdate(userID string, req UserPasswordUpdateRequest) error {
|
|
// 检查用户是否存在
|
|
user, err := mysql.UserFirst(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserPasswordUpdate",
|
|
}).Warnf("mysql.UserFirst: %v", err)
|
|
return err
|
|
}
|
|
if user.ID == "" {
|
|
return errors.New("用户不存在")
|
|
}
|
|
|
|
// 验证旧密码
|
|
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.OldPassword))
|
|
if err != nil {
|
|
return errors.New("旧密码错误")
|
|
}
|
|
|
|
// 密码加密
|
|
h, err := bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserPasswordUpdate",
|
|
}).Warnf("bcrypt.GenerateFromPassword: %v", err)
|
|
return err
|
|
}
|
|
|
|
// 更新密码
|
|
err = mysql.UserUpdate(&userID, map[string]any{"password_hash": string(h)})
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "UserPasswordUpdate",
|
|
}).Warnf("mysql.UserUpdate: %v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|