go-view-server/internal/logic/admin/site.go

126 lines
2.7 KiB
Go

package admin
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/token"
"hotgo/internal/model"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/adminin"
"hotgo/internal/service"
"hotgo/utility/simple"
)
type sAdminSite struct{}
func NewAdminSite() *sAdminSite {
return &sAdminSite{}
}
func init() {
service.RegisterAdminSite(NewAdminSite())
}
// Register 账号注册
func (s *sAdminSite) Register(ctx context.Context, in *adminin.RegisterInp) (err error) {
err = gerror.New("暂未开放注册")
return
}
// AccountLogin 账号登录
func (s *sAdminSite) AccountLogin(ctx context.Context, in *adminin.AccountLoginInp) (res *adminin.LoginModel, err error) {
var mb *entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("username", in.Username).Scan(&mb); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return
}
if mb == nil {
err = gerror.New("账号不存在")
return
}
if mb.Salt == "" {
err = gerror.New("用户信息错误")
return
}
if err = simple.CheckPassword(in.Password, mb.Salt, mb.PasswordHash); err != nil {
return
}
if mb.Status != consts.StatusEnabled {
err = gerror.New("账号已被禁用")
return
}
res, err = s.handleLogin(ctx, mb)
return
}
// handleLogin .
func (s *sAdminSite) handleLogin(ctx context.Context, mb *entity.AdminMember) (res *adminin.LoginModel, err error) {
user := &model.Identity{
Id: mb.Id,
Username: mb.Username,
Nickname: mb.Nickname,
Avatar: mb.Avatar,
App: consts.AppAdmin,
LoginAt: gtime.Now(),
}
tk, expires, err := token.Login(ctx, user)
if err != nil {
return nil, err
}
res = &adminin.LoginModel{
UserInfo: &adminin.LoginUserInfo{
Id: user.Id,
Username: user.Username,
Nickname: user.Nickname,
},
Token: &adminin.LoginToken{
TokenName: "Authorization",
TokenValue: tk,
Expires: expires,
},
}
return
}
// BindUserContext 绑定用户上下文
func (s *sAdminSite) BindUserContext(ctx context.Context, claims *model.Identity) (err error) {
var mb *entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("id", claims.Id).Scan(&mb); err != nil {
err = gerror.Wrap(err, "获取用户信息失败,请稍后重试!")
return
}
if mb == nil {
err = gerror.Wrap(err, "账号不存在或已被删除!")
return
}
if mb.Status != consts.StatusEnabled {
err = gerror.New("账号已被禁用,如有疑问请联系管理员")
return
}
user := &model.Identity{
Id: mb.Id,
Username: mb.Username,
Nickname: mb.Nickname,
Avatar: mb.Avatar,
App: claims.App,
LoginAt: claims.LoginAt,
}
contexts.SetUser(ctx, user)
return
}