Files
36Wisdom/biz/service/parent.go
T
2026-08-14 16:11:10 +08:00

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
}