package auth import ( "base-go-v2/internal/api/money" "base-go-v2/internal/db" response "base-go-v2/internal/reponse" "base-go-v2/internal/router" "base-go-v2/internal/routinex" "base-go-v2/internal/utils/idgen" "base-go-v2/internal/utils/jwtx" "base-go-v2/internal/utils/mapx" "base-go-v2/internal/utils/timex" ) func InitAuthRouter(r *router.Router) { group := r.Group("auth") group.POST("/login/default", loginDefault) group.POST("/register/default", registerDefault) group.GET("/refresh/token", RefreshAccessToken) } func RefreshAccessToken(c *router.Context) error { // 从 Header 获取 Refresh Token refreshToken := c.Header("refreshToken") if refreshToken == "" { return response.Fail(c). Code(response.HttpCode.Unauthorized). Message("未提供 Token"). Send() } // 验证 Refresh Token tokenResult := jwtx.VerifyToken(refreshToken) if !tokenResult.IsValid || tokenResult.IsExpired { // Refresh Token 无效或过期,需要重新登录 return response.Fail(c). Code(response.HttpCode.Unauthorized). Message("登录已过期,请重新登录"). Send() } userID := tokenResult.Claims.UserID // 生成新的 Access Token newAccessToken, err := jwtx.CreateAccessToken(userID) if err != nil { return err } return response.Success(c). Data(newAccessToken). Send() } // 默认登录 func loginDefault(c *router.Context) error { // 获取请求体并校验必填字段 bodyData, err := c.GetBodyWithRequired("account", "password") if err != nil { return c.AddError(err) } account := bodyData.GetString("account") password := bodyData.GetString("password") // 查询用户 userQuery := mapx.New().SetKV( "account", account, "password", password, ) user, err := db.FindOne("user_info", userQuery) if err != nil { return response.Success(c).Message("查询用户失败,请稍后重试").Send() } if user == nil { // 账号或密码错误 return response.Fail(c). Message("账号或密码错误"). Send() } userId := user.GetInt64("id") // 创建 Access Token 和 Refresh Token accessToken, err := jwtx.CreateAccessToken(userId) if err != nil { return err } refreshToken, err := jwtx.CreateRefreshToken(userId) if err != nil { return err } // 返回数据 respData := mapx.New(). SetKV( "userId", userId, "username", user.GetString("username"), "seqNo", user.GetInt("seq_no"), "gender", user.GetInt("gender"), "token", accessToken, "refreshToken", refreshToken, ) routinex.Go(func() { kv := mapx.New().SetKV( "last_login_time", timex.NowString(), ) _, _ = db.UpdateOne("user_info", "id", userId, kv) }) return response.Success(c). Data(respData). Send() } func registerDefault(c *router.Context) error { bodyData, err := c.GetBodyWithRequired("account", "password") if err != nil { return c.AddError(err) } account := bodyData.GetString("account") password := bodyData.GetString("password") // 构造查询条件,检查账号是否已存在 accountQuery := mapx.New().SetKV("account", account) existingUsers, err := db.FindOne("user_info", accountQuery) if err != nil { return c.AddError(err) } if existingUsers != nil { return response.Fail(c).Message("该账号已被注册").Send() } userId := idgen.NextId() // 构造新用户数据 newUserData := mapx.New().SetKV( "id", userId, "account", account, "password", password, ) // 插入新用户 insertedRows, err := db.InsertOne("user_info", newUserData) if err != nil { return response.Fail(c).Message("注册失败").Send() } if insertedRows != 1 { return response.Fail(c).Message("注册失败").Send() } err = money.InitDefaultCategories(userId) if err != nil { return c.AddError(err) } return response.Success(c).Message("注册成功").Send() }