This commit is contained in:
oneao committed 2025-11-29 17:23:27 +08:00
1 parent 8408cf779f
commit 25a9e41025
58 files changed
+2079 -6308

No files matched your search

@@ -0,0 +1,66 @@
// Code generated by hertz generator.
package auth
import (
"cn/oneao/base-go/db"
dbtype "cn/oneao/base-go/db/sqlc"
"cn/oneao/base-go/logx"
"cn/oneao/base-go/utils/jwtx"
"cn/oneao/base-go/utils/response"
"context"
"cn/oneao/base-go/biz/model/auth"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// LoginDefault .
// @router /auth/login/default [POST]
func LoginDefault(ctx context.Context, c *app.RequestContext) {
var err error
var req auth.LoginDefaultReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
// 登录
account := req.Account
password := req.Password
params := dbtype.GetUserForLoginParams{
Account: account,
Password: password,
}
loginUser, err := db.Queries.GetUserForLogin(ctx, params)
if err != nil {
response.Fail(c).Message("账号或密码错误!").Send()
return
}
// 异步更新登录事件
go func(userID int64) {
time, err := db.Queries.UpdateUserLoginLastTime(ctx, userID)
if err != nil || time == 0 {
logx.CtxError(ctx, "更新用户登录时间失败,UserID=%d, err=%v", loginUser.ID, err)
}
}(loginUser.ID)
// 包装数据
token, err := jwtx.CreateAccessToken(loginUser.ID)
refreshToken, err := jwtx.CreateRefreshToken(loginUser.ID)
resp := new(auth.LoginDefaultResp)
resp.Token = token
resp.RefreshToken = refreshToken
resp.UserId = loginUser.ID
resp.Gender = loginUser.Gender.Int32
resp.SeqNo = loginUser.SeqNo.Int32
resp.Username = loginUser.Username.String
response.Success(c).Data(resp).Send()
}
@@ -0,0 +1,118 @@
// Code generated by hertz generator.
package auth
import (
auth "cn/oneao/base-go/biz/model/auth"
"cn/oneao/base-go/db"
dbtype "cn/oneao/base-go/db/sqlc"
"cn/oneao/base-go/utils/errorx"
"cn/oneao/base-go/utils/idgen"
"cn/oneao/base-go/utils/response"
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/jackc/pgx/v5"
)
// RegisterDefault .
// @router /auth/register/default [POST]
func RegisterDefault(ctx context.Context, c *app.RequestContext) {
var err error
var req auth.RegisterDefaultReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
account := req.Account
password := req.Password
_, err = db.Queries.GetUserByAccount(ctx, account)
if err != nil {
if errorx.IsNotFound(err) {
// 忽略
} else {
errorx.AddError(c, err)
return
}
} else {
response.Fail(c).Message("该账号已被注册").Send()
return
}
// 开启事务
tx, err := db.DB.BeginTx(ctx, pgx.TxOptions{})
if err != nil {
errorx.AddError(c, err)
return
}
defer func() {
if err != nil {
err := tx.Rollback(ctx)
if err != nil {
return
}
} else {
err := tx.Commit(ctx)
if err != nil {
return
}
}
}()
// 插入用户
params := dbtype.InsertUserParams{
ID: idgen.NextId(),
Account: account,
Password: password,
}
insert, err := db.Queries.WithTx(tx).InsertUser(ctx, params)
if err != nil || insert == 0 {
errorx.AddError(c, err)
return
}
// 初始化用户分类
err = initMoneyCategoryTx(ctx, tx, params.ID)
if err != nil {
errorx.AddError(c, err)
return
}
// 注册成功
response.Success(c).Message("注册成功").Send()
}
func initMoneyCategoryTx(ctx context.Context, tx pgx.Tx, userId int64) error {
sysCategories, err := db.Queries.ListMoneySysCategory(ctx)
if err != nil {
return err
}
if len(sysCategories) == 0 {
return nil
}
userCategories := make([]dbtype.BatchInsertMoneyUserCategoriesParams, 0, len(sysCategories))
for _, sysCat := range sysCategories {
userCategories = append(userCategories, dbtype.BatchInsertMoneyUserCategoriesParams{
ID: idgen.NextId(),
UserID: userId,
Name: sysCat.Name,
Icon: sysCat.Icon,
Type: sysCat.Type,
SortNumber: sysCat.SortNumber,
})
}
_, err = db.Queries.WithTx(tx).BatchInsertMoneyUserCategories(ctx, userCategories)
if err != nil {
return err
}
return nil
}
@@ -0,0 +1,59 @@
// Code generated by hertz generator.
package auth
import (
"cn/oneao/base-go/utils/errorx"
"cn/oneao/base-go/utils/jwtx"
"cn/oneao/base-go/utils/response"
"context"
auth "cn/oneao/base-go/biz/model/auth"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// RefreshAccessToken .
// @router /auth/refreshToken [POST]
func RefreshAccessToken(ctx context.Context, c *app.RequestContext) {
var err error
var req auth.RefreshAccessTokenReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
refreshToken := string(c.GetHeader("refreshToken"))
if refreshToken == "" {
response.Fail(c).
Code(response.HttpCode.Unauthorized).
Send()
return
}
tokenResult := jwtx.VerifyToken(refreshToken)
if !tokenResult.IsValid || tokenResult.IsExpired {
// Refresh Token 无效或过期,需要重新登录
response.Fail(c).
Code(response.HttpCode.Unauthorized).
Send()
return
}
userID := tokenResult.Claims.UserID
// 生成新的 Access Token
newAccessToken, err := jwtx.CreateAccessToken(userID)
if err != nil {
errorx.AddError(c, err)
return
}
resp := new(auth.RefreshAccessTokenResp)
resp.AccessToken = newAccessToken
response.Success(c).
Data(resp).
Send()
}