100 lines
2.7 KiB
Go
100 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"golang.org/x/crypto/bcrypt"
|
|
|
|
"36wisdom/biz/consts"
|
|
"36wisdom/biz/dao"
|
|
"36wisdom/biz/model/dto"
|
|
"36wisdom/common/auth"
|
|
)
|
|
|
|
type parent struct{}
|
|
|
|
var Parent = &parent{}
|
|
|
|
// Register 家长注册:手机号唯一、bcrypt 落库、签发 token。
|
|
func (s *parent) Register(ctx context.Context, req *dto.RegisterReq) (*dto.RegisterRes, error) {
|
|
rec, err := dao.Parent.GetByPhone(ctx, req.Phone)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if rec != nil {
|
|
return nil, gerror.Newf("手机号 %s 已注册", req.Phone)
|
|
}
|
|
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
parentId, err := dao.Parent.InsertAndReturnId(ctx, g.Map{
|
|
"phone": req.Phone,
|
|
"password": string(hash),
|
|
"nickname": req.Nickname,
|
|
"status": consts.StatusEnabled,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
token, err := auth.GenerateToken(auth.Secret(ctx), parentId, consts.RoleParent, consts.AuthExpireSeconds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.RegisterRes{Token: token, ParentId: parentId}, nil
|
|
}
|
|
|
|
// Login 家长登录:校验手机号与密码,签发 token。
|
|
func (s *parent) Login(ctx context.Context, req *dto.LoginReq) (*dto.LoginRes, error) {
|
|
rec, err := dao.Parent.GetByPhone(ctx, req.Phone)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if rec == nil {
|
|
return nil, gerror.New("手机号或密码错误")
|
|
}
|
|
if err = bcrypt.CompareHashAndPassword([]byte(rec.Password), []byte(req.Password)); err != nil {
|
|
return nil, gerror.New("手机号或密码错误")
|
|
}
|
|
token, err := auth.GenerateToken(auth.Secret(ctx), rec.Id, consts.RoleParent, consts.AuthExpireSeconds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.LoginRes{Token: token, ParentId: rec.Id}, nil
|
|
}
|
|
|
|
// ---------- 后台管理 ----------
|
|
|
|
type adminParent struct{}
|
|
|
|
var AdminParent = &adminParent{}
|
|
|
|
// List 全部家长(含各家长孩子数)。
|
|
func (s *adminParent) List(ctx context.Context, req *dto.AdminParentListReq) (*dto.AdminParentListRes, error) {
|
|
recs, err := dao.Parent.ListAll(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ids := make([]int64, 0, len(recs))
|
|
for _, r := range recs {
|
|
ids = append(ids, r.Id)
|
|
}
|
|
counts, err := dao.Child.CountByParentIds(ctx, ids)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
items := make([]*dto.AdminParentItem, 0, len(recs))
|
|
for _, r := range recs {
|
|
items = append(items, &dto.AdminParentItem{
|
|
Id: r.Id, Phone: r.Phone, Openid: r.Openid,
|
|
Nickname: r.Nickname, Avatar: r.Avatar,
|
|
Status: r.Status, CreatedAt: timeString(r.CreatedAt),
|
|
ChildCount: counts[r.Id],
|
|
})
|
|
}
|
|
return &dto.AdminParentListRes{List: items}, nil
|
|
}
|