This commit is contained in:
2025-04-14 15:28:51 +08:00
parent f100427f8b
commit 371b89ee8d
93 changed files with 3757 additions and 1038 deletions

View File

@@ -12,6 +12,8 @@ import (
"management/internal/erpserver/store"
"management/internal/pkg/redis"
"management/internal/pkg/session"
"github.com/drhin/logger"
)
// IBiz 定义了业务层需要实现的方法.
@@ -36,20 +38,22 @@ type IBiz interface {
type biz struct {
database store.IStore
store db.Store
redis redis.IRedis
session session.ISession
redis redis.RedisCache
session session.Session
logger *logger.Logger
}
// 确保 biz 实现了 IBiz 接口.
var _ IBiz = (*biz)(nil)
// NewBiz 创建一个 IBiz 类型的实例.
func NewBiz(database store.IStore, store db.Store, redis redis.IRedis, session session.ISession) *biz {
func NewBiz(database store.IStore, store db.Store, redis redis.RedisCache, session session.Session, logger *logger.Logger) *biz {
return &biz{
database: database,
store: store,
redis: redis,
session: session,
logger: logger,
}
}
@@ -60,7 +64,7 @@ func (b *biz) CommonV1() commonv1.CommonBiz {
// SystemV1 返回一个实现了 SystemBiz 接口的实例.
func (b *biz) SystemV1() systemv1.SystemBiz {
return systemv1.New(b.database, b.store, b.redis, b.session)
return systemv1.New(b.database, b.store, b.redis, b.session, b.logger)
}
func (b *biz) ProjectV1() projectv1.ProjectBiz {

View File

@@ -16,12 +16,12 @@ type BudgetBiz interface {
type budgetBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ BudgetBiz = (*budgetBiz)(nil)
func New(store db.Store, redis redis.IRedis) *budgetBiz {
func New(store db.Store, redis redis.RedisCache) *budgetBiz {
return &budgetBiz{
store: store,
redis: redis,

View File

@@ -16,12 +16,12 @@ type CustomerBiz interface {
type customerBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ CustomerBiz = (*customerBiz)(nil)
func New(store db.Store, redis redis.IRedis) *customerBiz {
func New(store db.Store, redis redis.RedisCache) *customerBiz {
return &customerBiz{
store: store,
redis: redis,

View File

@@ -22,12 +22,12 @@ type ExpenseBiz interface {
type expenseBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ ExpenseBiz = (*expenseBiz)(nil)
func New(store db.Store, redis redis.IRedis) *expenseBiz {
func New(store db.Store, redis redis.RedisCache) *expenseBiz {
return &expenseBiz{
store: store,
redis: redis,

View File

@@ -22,12 +22,12 @@ type IncomeBiz interface {
type incomeBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ IncomeBiz = (*incomeBiz)(nil)
func New(store db.Store, redis redis.IRedis) *incomeBiz {
func New(store db.Store, redis redis.RedisCache) *incomeBiz {
return &incomeBiz{
store: store,
redis: redis,

View File

@@ -31,12 +31,12 @@ type ProjectExpansion interface {
type projectBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ ProjectBiz = (*projectBiz)(nil)
func New(store db.Store, redis redis.IRedis) *projectBiz {
func New(store db.Store, redis redis.RedisCache) *projectBiz {
return &projectBiz{
store: store,
redis: redis,

View File

@@ -40,12 +40,12 @@ type CategoryBiz interface {
type categoryBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ CategoryBiz = (*categoryBiz)(nil)
func NewCategory(store db.Store, redis redis.IRedis) *categoryBiz {
func NewCategory(store db.Store, redis redis.RedisCache) *categoryBiz {
return &categoryBiz{
store: store,
redis: redis,

View File

@@ -27,12 +27,12 @@ type ConfigExpansion interface {
type configBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ ConfigBiz = (*configBiz)(nil)
func NewConfig(store db.Store, redis redis.IRedis) *configBiz {
func NewConfig(store db.Store, redis redis.RedisCache) *configBiz {
return &configBiz{
store: store,
redis: redis,

View File

@@ -36,12 +36,12 @@ type DepartmentExpansion interface{}
type departmentBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ DepartmentBiz = (*departmentBiz)(nil)
func NewDepartment(store db.Store, redis redis.IRedis) *departmentBiz {
func NewDepartment(store db.Store, redis redis.RedisCache) *departmentBiz {
return &departmentBiz{
store: store,
redis: redis,

View File

@@ -2,68 +2,41 @@ package system
import (
"context"
"time"
"management/internal/db/model/dto"
db "management/internal/db/sqlc"
systemmodel "management/internal/erpserver/model/system"
"management/internal/erpserver/store"
)
type LoginLogBiz interface {
Create(ctx context.Context, arg *db.CreateSysUserLoginLogParams) error
List(ctx context.Context, q dto.SearchDto) ([]*db.SysUserLoginLog, int64, error)
Create(ctx context.Context, obj *systemmodel.LoginLog) error
List(ctx context.Context, q dto.SearchDto) ([]*systemmodel.LoginLog, int64, error)
}
type loginLogBiz struct {
store db.Store
database store.IStore
store db.Store
}
var _ LoginLogBiz = (*loginLogBiz)(nil)
func NewLoginLog(store db.Store) *loginLogBiz {
func NewLoginLog(database store.IStore, store db.Store) *loginLogBiz {
return &loginLogBiz{
store: store,
database: database,
store: store,
}
}
func (b *loginLogBiz) Create(ctx context.Context, arg *db.CreateSysUserLoginLogParams) error {
return b.store.CreateSysUserLoginLog(ctx, arg)
func (b *loginLogBiz) Create(ctx context.Context, obj *systemmodel.LoginLog) error {
return b.database.LoginLog().Create(ctx, obj)
}
func (b *loginLogBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysUserLoginLog, int64, error) {
start, err := time.ParseInLocation(time.DateTime, q.SearchTimeBegin, time.Local)
if err != nil {
return nil, 0, err
}
end, err := time.ParseInLocation(time.DateTime, q.SearchTimeEnd, time.Local)
func (b *loginLogBiz) List(ctx context.Context, q dto.SearchDto) ([]*systemmodel.LoginLog, int64, error) {
res, count, err := b.database.LoginLog().List(ctx, q)
if err != nil {
return nil, 0, err
}
countArg := &db.CountSysUserLoginLogConditionParams{
StartAt: start,
EndAt: end,
Email: q.SearchEmail,
Username: q.SearchName,
}
dataArg := &db.ListSysUserLoginLogConditionParams{
StartAt: start,
EndAt: end,
Email: q.SearchEmail,
Username: q.SearchName,
Skip: (int32(q.Page) - 1) * int32(q.Rows),
Size: int32(q.Rows),
}
count, err := b.store.CountSysUserLoginLogCondition(ctx, countArg)
if err != nil {
return nil, 0, err
}
logs, err := b.store.ListSysUserLoginLogCondition(ctx, dataArg)
if err != nil {
return nil, 0, err
}
return logs, count, nil
return res, count, nil
}

View File

@@ -42,12 +42,12 @@ type MenuExpansion interface {
type menuBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ MenuBiz = (*menuBiz)(nil)
func NewMenu(store db.Store, redis redis.IRedis) *menuBiz {
func NewMenu(store db.Store, redis redis.RedisCache) *menuBiz {
return &menuBiz{
store: store,
redis: redis,

View File

@@ -37,12 +37,12 @@ type RoleExpansion interface{}
type roleBiz struct {
store db.Store
redis redis.IRedis
redis redis.RedisCache
}
var _ RoleBiz = (*roleBiz)(nil)
func NewRole(store db.Store, redis redis.IRedis) *roleBiz {
func NewRole(store db.Store, redis redis.RedisCache) *roleBiz {
return &roleBiz{
store: store,
redis: redis,

View File

@@ -5,6 +5,8 @@ import (
"management/internal/erpserver/store"
"management/internal/pkg/redis"
"management/internal/pkg/session"
"github.com/drhin/logger"
)
type SystemBiz interface {
@@ -21,23 +23,25 @@ type SystemBiz interface {
type systemBiz struct {
database store.IStore
store db.Store
redis redis.IRedis
session session.ISession
redis redis.RedisCache
session session.Session
logger *logger.Logger
}
var _ SystemBiz = (*systemBiz)(nil)
func New(database store.IStore, store db.Store, redis redis.IRedis, session session.ISession) *systemBiz {
func New(database store.IStore, store db.Store, redis redis.RedisCache, session session.Session, logger *logger.Logger) *systemBiz {
return &systemBiz{
database: database,
store: store,
redis: redis,
session: session,
logger: logger,
}
}
func (b *systemBiz) UserBiz() UserBiz {
return NewUser(b.database, b.store, b.session)
return NewUser(b.database, b.store, b.session, b.logger)
}
func (b *systemBiz) MenuBiz() MenuBiz {
@@ -61,7 +65,7 @@ func (b *systemBiz) AuditBiz() AuditBiz {
}
func (b *systemBiz) LoginLogBiz() LoginLogBiz {
return NewLoginLog(b.store)
return NewLoginLog(b.database, b.store)
}
func (b *systemBiz) CategoryBiz() CategoryBiz {

View File

@@ -4,13 +4,13 @@ import (
"context"
"encoding/json"
"errors"
"fmt"
"strconv"
"time"
"management/internal/db/model/dto"
db "management/internal/db/sqlc"
"management/internal/erpserver/model/form"
systemmodel "management/internal/erpserver/model/system"
"management/internal/erpserver/model/view"
"management/internal/erpserver/store"
"management/internal/pkg/crypto"
@@ -18,7 +18,9 @@ import (
"management/internal/pkg/rand"
"management/internal/pkg/session"
"github.com/drhin/logger"
"github.com/google/uuid"
"go.uber.org/zap"
)
// UserBiz 定义处理用户请求所需的方法.
@@ -43,17 +45,19 @@ type UserExpansion interface {
type userBiz struct {
database store.IStore
store db.Store
session session.ISession
session session.Session
log *logger.Logger
}
// 确保 userBiz 实现了 UserBiz 接口.
var _ UserBiz = (*userBiz)(nil)
func NewUser(database store.IStore, store db.Store, session session.ISession) *userBiz {
func NewUser(database store.IStore, store db.Store, session session.Session, log *logger.Logger) *userBiz {
return &userBiz{
database: database,
store: store,
session: session,
log: log,
}
}
@@ -183,73 +187,67 @@ func (b *userBiz) XmSelect(ctx context.Context) ([]*view.XmSelect, error) {
}
func (b *userBiz) Login(ctx context.Context, req *form.Login) error {
log := &db.CreateSysUserLoginLogParams{
CreatedAt: time.Now(),
Email: req.Email,
IsSuccess: false,
RefererUrl: req.Referrer,
Url: req.Url,
Os: req.Os,
Ip: req.Ip,
Browser: req.Browser,
}
user, err := b.database.User().GetByEmail(ctx, req.Email)
// user, err = b.store.GetSysUserByEmail(ctx, req.Email)
l := systemmodel.NewLoginLog(req.Email, req.Os, req.Ip, req.Browser, req.Url, req.Referrer)
err := b.login(ctx, req)
if err != nil {
if err := b.database.LoginLog().Create(ctx, l.SetMessage(err.Error())); err != nil {
b.log.Error(err.Error(), err, zap.Any("login_log", l))
}
return err
}
if err := b.database.LoginLog().Create(ctx, l.SetOk("登录成功")); err != nil {
b.log.Error(err.Error(), err, zap.Any("login_log", l))
}
return nil
}
func (b *userBiz) login(ctx context.Context, req *form.Login) error {
user, err := b.database.User().GetByEmail(ctx, req.Email)
if err != nil {
log.Message = err.Error()
_ = b.store.CreateSysUserLoginLog(ctx, log)
return err
}
fmt.Printf("%+v", user)
log.UserUuid = user.Uuid
log.Username = user.Username
err = crypto.BcryptComparePassword(user.HashedPassword, req.Password+user.Salt)
if err != nil {
log.Message = "compare password failed"
_ = b.store.CreateSysUserLoginLog(ctx, log)
return errors.New(log.Message)
return errors.New("账号或密码错误")
}
user.Role, err = b.database.Role().Get(ctx, user.RoleID)
if err != nil {
return err
}
if user.Role == nil || user.Role.ID == 0 {
return errors.New("账号没有配置角色, 请联系管理员")
}
// 登陆成功
if user.RoleID == 0 {
log.Message = "账号没有配置角色, 请联系管理员"
_ = b.store.CreateSysUserLoginLog(ctx, log)
return errors.New(log.Message)
}
sysRole, err := b.store.GetSysRole(ctx, user.RoleID)
err = b.loginSuccess(ctx, user, req)
if err != nil {
log.Message = "账号配置的角色错误, 请联系管理员"
_ = b.store.CreateSysUserLoginLog(ctx, log)
return errors.New(log.Message)
return err
}
return nil
}
func (b *userBiz) loginSuccess(ctx context.Context, user *systemmodel.User, req *form.Login) error {
auth := dto.AuthorizeUser{
ID: user.ID,
Uuid: user.Uuid,
Email: user.Email,
Username: user.Username,
RoleID: sysRole.ID,
RoleName: sysRole.Name,
OS: log.Os,
IP: log.Ip,
Browser: log.Browser,
RoleID: user.Role.ID,
RoleName: user.Role.Name,
OS: req.Os,
IP: req.Ip,
Browser: req.Browser,
}
gob, err := json.Marshal(auth)
if err != nil {
log.Message = err.Error()
_ = b.store.CreateSysUserLoginLog(ctx, log)
return err
}
b.session.Put(ctx, know.StoreName, gob)
log.IsSuccess = true
log.Message = "登陆成功"
_ = b.store.CreateSysUserLoginLog(ctx, log)
return nil
}