From 6d7f4ad1c697f9ad1b6063dba270fa833e1f6d2b Mon Sep 17 00:00:00 2001 From: Rogee Date: Tue, 30 Dec 2025 18:10:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E9=87=8D=E6=9E=84=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=B7=BB=E5=8A=A0OTP?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=92=8C=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/http/provider.go | 2 + backend/app/http/v1/{ => auth}/auth.go | 2 +- backend/app/http/v1/auth/dto/auth.go | 36 ++++++++++++++ backend/app/http/v1/auth/provider.gen.go | 37 +++++++++++++++ backend/app/http/v1/auth/routes.gen.go | 57 +++++++++++++++++++++++ backend/app/http/v1/auth/routes.manual.go | 9 ++++ backend/app/http/v1/provider.gen.go | 18 +++---- backend/app/http/v1/routes.gen.go | 12 ----- 8 files changed, 149 insertions(+), 24 deletions(-) rename backend/app/http/v1/{ => auth}/auth.go (98%) create mode 100644 backend/app/http/v1/auth/dto/auth.go create mode 100755 backend/app/http/v1/auth/provider.gen.go create mode 100644 backend/app/http/v1/auth/routes.gen.go create mode 100644 backend/app/http/v1/auth/routes.manual.go diff --git a/backend/app/http/provider.go b/backend/app/http/provider.go index b60d084..7e4719f 100644 --- a/backend/app/http/provider.go +++ b/backend/app/http/provider.go @@ -3,6 +3,7 @@ package http import ( super_v1 "quyun/v2/app/http/super/v1" v1 "quyun/v2/app/http/v1" + v1_auth "quyun/v2/app/http/v1/auth" "go.ipao.vip/atom/container" ) @@ -10,6 +11,7 @@ import ( func Providers() container.Providers { return container.Providers{ {Provider: v1.Provide}, + {Provider: v1_auth.Provide}, {Provider: super_v1.Provide}, } } diff --git a/backend/app/http/v1/auth.go b/backend/app/http/v1/auth/auth.go similarity index 98% rename from backend/app/http/v1/auth.go rename to backend/app/http/v1/auth/auth.go index 0835acf..a03544c 100644 --- a/backend/app/http/v1/auth.go +++ b/backend/app/http/v1/auth/auth.go @@ -1,4 +1,4 @@ -package v1 +package auth import ( "quyun/v2/app/http/v1/dto" diff --git a/backend/app/http/v1/auth/dto/auth.go b/backend/app/http/v1/auth/dto/auth.go new file mode 100644 index 0000000..3f3bef5 --- /dev/null +++ b/backend/app/http/v1/auth/dto/auth.go @@ -0,0 +1,36 @@ +package dto + +import "quyun/v2/pkg/consts" + +type SendOTPForm struct { + Phone string `json:"phone"` +} + +type LoginForm struct { + Phone string `json:"phone"` + OTP string `json:"otp"` +} + +type LoginResponse struct { + Token string `json:"token"` + User *User `json:"user"` +} + +type User struct { + ID string `json:"id"` + Phone string `json:"phone"` + Nickname string `json:"nickname"` + Avatar string `json:"avatar"` + Gender consts.Gender `json:"gender"` + Bio string `json:"bio"` + Birthday string `json:"birthday"` // YYYY-MM-DD + Location *Location `json:"location"` + Balance float64 `json:"balance"` + Points int64 `json:"points"` + IsRealNameVerified bool `json:"is_real_name_verified"` +} + +type Location struct { + Province string `json:"province"` + City string `json:"city"` +} diff --git a/backend/app/http/v1/auth/provider.gen.go b/backend/app/http/v1/auth/provider.gen.go new file mode 100755 index 0000000..5b1a579 --- /dev/null +++ b/backend/app/http/v1/auth/provider.gen.go @@ -0,0 +1,37 @@ +package auth + +import ( + "quyun/v2/app/middlewares" + + "go.ipao.vip/atom" + "go.ipao.vip/atom/container" + "go.ipao.vip/atom/contracts" + "go.ipao.vip/atom/opt" +) + +func Provide(opts ...opt.Option) error { + if err := container.Container.Provide(func() (*Auth, error) { + obj := &Auth{} + + return obj, nil + }); err != nil { + return err + } + if err := container.Container.Provide(func( + auth *Auth, + middlewares *middlewares.Middlewares, + ) (contracts.HttpRoute, error) { + obj := &Routes{ + auth: auth, + middlewares: middlewares, + } + if err := obj.Prepare(); err != nil { + return nil, err + } + + return obj, nil + }, atom.GroupRoutes); err != nil { + return err + } + return nil +} diff --git a/backend/app/http/v1/auth/routes.gen.go b/backend/app/http/v1/auth/routes.gen.go new file mode 100644 index 0000000..f163611 --- /dev/null +++ b/backend/app/http/v1/auth/routes.gen.go @@ -0,0 +1,57 @@ +// Code generated by atomctl. DO NOT EDIT. + +// Package auth provides HTTP route definitions and registration +// for the quyun/v2 application. +package auth + +import ( + "quyun/v2/app/http/v1/dto" + "quyun/v2/app/middlewares" + + "github.com/gofiber/fiber/v3" + log "github.com/sirupsen/logrus" + _ "go.ipao.vip/atom" + _ "go.ipao.vip/atom/contracts" + . "go.ipao.vip/atom/fen" +) + +// Routes implements the HttpRoute contract and provides route registration +// for all controllers in the auth module. +// +// @provider contracts.HttpRoute atom.GroupRoutes +type Routes struct { + log *log.Entry `inject:"false"` + middlewares *middlewares.Middlewares + // Controller instances + auth *Auth +} + +// Prepare initializes the routes provider with logging configuration. +func (r *Routes) Prepare() error { + r.log = log.WithField("module", "routes.auth") + r.log.Info("Initializing routes module") + return nil +} + +// Name returns the unique identifier for this routes provider. +func (r *Routes) Name() string { + return "auth" +} + +// Register registers all HTTP routes with the provided fiber router. +// Each route is registered with its corresponding controller action and parameter bindings. +func (r *Routes) Register(router fiber.Router) { + // Register routes for controller: Auth + r.log.Debugf("Registering route: Post /v1/auth/login -> auth.Login") + router.Post("/v1/auth/login"[len(r.Path()):], DataFunc1( + r.auth.Login, + Body[dto.LoginForm]("form"), + )) + r.log.Debugf("Registering route: Post /v1/auth/otp -> auth.SendOTP") + router.Post("/v1/auth/otp"[len(r.Path()):], Func1( + r.auth.SendOTP, + Body[dto.SendOTPForm]("form"), + )) + + r.log.Info("Successfully registered all routes") +} diff --git a/backend/app/http/v1/auth/routes.manual.go b/backend/app/http/v1/auth/routes.manual.go new file mode 100644 index 0000000..33d08ba --- /dev/null +++ b/backend/app/http/v1/auth/routes.manual.go @@ -0,0 +1,9 @@ +package auth + +func (r *Routes) Path() string { + return "/auth" +} + +func (r *Routes) Middlewares() []any { + return []any{} +} diff --git a/backend/app/http/v1/provider.gen.go b/backend/app/http/v1/provider.gen.go index 478a530..045491e 100755 --- a/backend/app/http/v1/provider.gen.go +++ b/backend/app/http/v1/provider.gen.go @@ -2,6 +2,7 @@ package v1 import ( "quyun/v2/app/middlewares" + "quyun/v2/providers/storage" "go.ipao.vip/atom" "go.ipao.vip/atom/container" @@ -10,13 +11,6 @@ import ( ) func Provide(opts ...opt.Option) error { - if err := container.Container.Provide(func() (*Auth, error) { - obj := &Auth{} - - return obj, nil - }); err != nil { - return err - } if err := container.Container.Provide(func() (*Common, error) { obj := &Common{} @@ -39,7 +33,6 @@ func Provide(opts ...opt.Option) error { return err } if err := container.Container.Provide(func( - auth *Auth, common *Common, content *Content, creator *Creator, @@ -50,7 +43,6 @@ func Provide(opts ...opt.Option) error { user *User, ) (contracts.HttpRoute, error) { obj := &Routes{ - auth: auth, common: common, content: content, creator: creator, @@ -68,8 +60,12 @@ func Provide(opts ...opt.Option) error { }, atom.GroupRoutes); err != nil { return err } - if err := container.Container.Provide(func() (*Storage, error) { - obj := &Storage{} + if err := container.Container.Provide(func( + storage *storage.Storage, + ) (*Storage, error) { + obj := &Storage{ + storage: storage, + } return obj, nil }); err != nil { diff --git a/backend/app/http/v1/routes.gen.go b/backend/app/http/v1/routes.gen.go index 971eafe..66a1fa9 100644 --- a/backend/app/http/v1/routes.gen.go +++ b/backend/app/http/v1/routes.gen.go @@ -24,7 +24,6 @@ type Routes struct { log *log.Entry `inject:"false"` middlewares *middlewares.Middlewares // Controller instances - auth *Auth common *Common content *Content creator *Creator @@ -49,17 +48,6 @@ func (r *Routes) Name() string { // Register registers all HTTP routes with the provided fiber router. // Each route is registered with its corresponding controller action and parameter bindings. func (r *Routes) Register(router fiber.Router) { - // Register routes for controller: Auth - r.log.Debugf("Registering route: Post /v1/auth/login -> auth.Login") - router.Post("/v1/auth/login"[len(r.Path()):], DataFunc1( - r.auth.Login, - Body[dto.LoginForm]("form"), - )) - r.log.Debugf("Registering route: Post /v1/auth/otp -> auth.SendOTP") - router.Post("/v1/auth/otp"[len(r.Path()):], Func1( - r.auth.SendOTP, - Body[dto.SendOTPForm]("form"), - )) // Register routes for controller: Common r.log.Debugf("Registering route: Post /v1/upload -> common.Upload") router.Post("/v1/upload"[len(r.Path()):], DataFunc2(