You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
3.9 KiB

package user
import (
"context"
"gf_demo_02/api/user/v1"
"gf_demo_02/internal/model/entity"
"gf_demo_02/internal/service"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"golang.org/x/crypto/bcrypt"
"strings"
)
type sUser struct {
}
func init() {
service.RegisterUser(&sUser{})
}
func (u *sUser) GetUser(cond g.Map) (user *entity.User, err error) {
model := g.Model("user")
if cond["id"] != nil && gconv.Uint(cond["id"]) != 0 {
model = model.Where("id", cond["id"])
} else if cond["name"] != nil && gconv.String(cond["name"]) != "" {
model = model.Where("name", cond["name"])
} else {
return nil, gerror.NewCode(gcode.New(88, "缺少查询条件", nil))
}
err = model.Scan(&user)
if err != nil {
return nil, err
}
if user == nil {
return nil, gerror.NewCode(gcode.New(483, "用户不存在!", nil))
}
return user, nil
}
func (*sUser) GetUserList(ctx context.Context) (users []entity.User, err error) {
all, err := g.DB().Model("user").All()
if err != nil {
return nil, gerror.NewCode(gcode.New(599, "数据库error", nil))
}
err = all.Structs(&users)
if err != nil {
return nil, err
}
return users, nil
}
func (*sUser) AddUser(ctx context.Context, req *user.EditUserReq) error {
u := entity.User{
Id: req.Id,
Name: req.Name,
Pass: req.Pass,
Property: req.Property,
}
one, _ := g.Model("user").Where("name", req.Name).One()
if one != nil {
return gerror.NewCode(gcode.New(480, "用户名重复", nil))
}
if len(req.Pass) < 6 {
return gerror.NewCode(gcode.New(481, "密码过短,至少6位", nil))
}
password, err := bcrypt.GenerateFromPassword([]byte(u.Pass), 10)
if err != nil {
return err
}
u.Pass = string(password)
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
_, err = tx.Model("user").Insert(u)
return err
})
}
func (*sUser) UpdateUser(ctx context.Context, req *user.EditUserReq) error {
u := entity.User{
Id: req.Id,
Name: req.Name,
Pass: req.Pass,
Property: req.Property,
}
one, _ := g.Model("user").Where("id", req.Id).One()
if one == nil {
return gerror.NewCode(gcode.New(483, "用户不存在!", nil))
}
one, _ = g.Model("user").Where("name", req.Name).WhereNot("id", u.Id).One()
if one != nil {
return gerror.NewCode(gcode.New(480, "用户名重复", nil))
}
if len(req.Pass) < 6 && req.Pass != "" {
return gerror.NewCode(gcode.New(481, "密码过短,至少6位", nil))
}
if req.Pass != "" {
password, err := bcrypt.GenerateFromPassword([]byte(u.Pass), 10)
if err != nil {
return err
}
u.Pass = string(password)
}
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
model := tx.Model("user").OmitEmptyData()
result, err := model.Where("id", u.Id).Update(u)
if err != nil {
return err
}
if affected, err := result.RowsAffected(); affected < 1 || err != nil {
return gerror.NewCode(gcode.New(500, "服务器错误", nil))
}
return nil
})
}
func (*sUser) DeleteUser(ctx context.Context, req *user.DeleteUserReq) error {
one, _ := g.DB().Model("user").Where("id", req.Id).One()
if one == nil {
return gerror.NewCode(gcode.New(483, "用户不存在!", nil))
}
tokenStr := g.RequestFromCtx(ctx).GetCtxVar("Authorization").String()
tokenStr = strings.TrimSpace(tokenStr)
tokenStr = strings.TrimPrefix(tokenStr, "Bearer ")
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
_, err := tx.Model("user").Where("id", req.Id).Delete()
return err
})
}
func (*sUser) SearchUser(ctx context.Context, keyword string) ([]entity.User, error) {
all, err := g.Model("user").WhereLike("name", "%"+keyword+"%").All()
if err != nil {
return nil, err
}
users := make([]entity.User, 0)
err = all.Structs(&users)
if err != nil {
return nil, err
}
return users, nil
}