From 8f3f6982db66b55821bb7d739b847f625e24144c Mon Sep 17 00:00:00 2001 From: oneao Date: Sun, 25 Jan 2026 22:18:27 +0800 Subject: [PATCH] u --- .../biz/handler/auth/login_service.go | 294 ++++- .../biz/handler/auth/register_service.go | 138 -- .../biz/handler/auth/token_service.go | 60 - .../biz/handler/space/space_service.go | 101 -- .../biz/handler/space/space_user_service.go | 2 +- .../allapp-go/biz/model/auth/auth.pb.go | 433 ++----- .../allapp-go/biz/model/space/space.pb.go | 143 +-- .../biz/model/space/space_types.pb.go | 9 +- .../biz/model/space/space_user_types.pb.go | 8 +- code/allapp/allapp-go/biz/router/auth/auth.go | 11 +- .../allapp-go/biz/router/auth/middleware.go | 15 + .../allapp-go/biz/router/middleware/auth.go | 6 +- .../allapp-go/biz/router/space/space.go | 1 - code/allapp/allapp-go/conf/conf.go | 14 +- code/allapp/allapp-go/conf/dev/conf.yaml | 7 +- code/allapp/allapp-go/db/queries/space.sql | 3 +- code/allapp/allapp-go/db/queries/user.sql | 32 + .../allapp/allapp-go/db/queries/user_info.sql | 5 - .../allapp-go/db/queries/user_oauth.sql | 13 + code/allapp/allapp-go/db/repo/models.go | 44 +- code/allapp/allapp-go/db/repo/space.sql.go | 19 +- code/allapp/allapp-go/db/repo/user.sql.go | 95 ++ .../allapp/allapp-go/db/repo/user_info.sql.go | 28 - .../allapp-go/db/repo/user_oauth.sql.go | 40 + code/allapp/allapp-go/db/schema.sql | 35 +- code/allapp/allapp-go/idl/auth.proto | 64 +- code/allapp/allapp-go/idl/space/space.proto | 4 - code/allapp/allapp-go/utils/httpx/index.go | 165 +++ code/allapp/allapp-go/utils/index.go | 17 +- code/allapp/allapp-go/utils/jwtx/jwt.go | 74 +- .../allapp/allapp-go/utils/pgtypex/pgtypex.go | 7 + code/allapp/allapp-rn/.env | 1 + code/allapp/allapp-rn/app.json | 14 +- code/allapp/allapp-rn/babel.config.js | 13 +- .../allapp-rn/credentials/credentials.json | 17 + .../credentials/oneao-android.keystore | Bin 0 -> 2253 bytes code/allapp/allapp-rn/package.json | 31 +- .../allapp-rn/plugins/withAndroidSignature.js | 47 + code/allapp/allapp-rn/pnpm-lock.yaml | 1108 ++++++++--------- .../allapp-rn/src/app/(tabs)/_layout.tsx | 64 +- .../allapp-rn/src/app/(tabs)/_layout2.tsx | 0 .../allapp-rn/src/app/(tabs)/user/index.tsx | 4 +- code/allapp/allapp-rn/src/app/auth/index.tsx | 291 ++++- .../setting/components/EditCategory.tsx | 1 - .../src/components/common/ao/Button.tsx | 63 +- .../src/components/common/ao/Checkbox.tsx | 15 +- .../src/components/ui/avatar/index.tsx | 89 +- code/allapp/allapp-rn/src/request/api/auth.ts | 10 +- code/allapp/allapp-rn/src/request/index.ts | 115 +- code/allapp/allapp-rn/src/store/user.ts | 2 +- code/allapp/allapp-rn/src/types/auth.ts | 22 +- code/allapp/allapp-rn/src/types/global.d.ts | 10 +- code/allapp/allapp-rn/test.html | 147 +++ hz.txt | 2 +- 54 files changed, 2076 insertions(+), 1877 deletions(-) delete mode 100644 code/allapp/allapp-go/biz/handler/auth/register_service.go delete mode 100644 code/allapp/allapp-go/biz/handler/auth/token_service.go create mode 100644 code/allapp/allapp-go/db/queries/user.sql create mode 100644 code/allapp/allapp-go/db/queries/user_oauth.sql create mode 100644 code/allapp/allapp-go/db/repo/user.sql.go create mode 100644 code/allapp/allapp-go/db/repo/user_oauth.sql.go create mode 100644 code/allapp/allapp-go/utils/httpx/index.go create mode 100644 code/allapp/allapp-rn/.env create mode 100644 code/allapp/allapp-rn/credentials/credentials.json create mode 100644 code/allapp/allapp-rn/credentials/oneao-android.keystore create mode 100644 code/allapp/allapp-rn/plugins/withAndroidSignature.js create mode 100644 code/allapp/allapp-rn/src/app/(tabs)/_layout2.tsx create mode 100644 code/allapp/allapp-rn/test.html diff --git a/code/allapp/allapp-go/biz/handler/auth/login_service.go b/code/allapp/allapp-go/biz/handler/auth/login_service.go index 57a4ed56..431356ad 100644 --- a/code/allapp/allapp-go/biz/handler/auth/login_service.go +++ b/code/allapp/allapp-go/biz/handler/auth/login_service.go @@ -3,65 +3,289 @@ package auth import ( + "allapp/biz/model/auth" + "allapp/conf" "allapp/db" "allapp/db/repo" - "allapp/logx" + "allapp/utils" + "allapp/utils/errorx" + "allapp/utils/httpx" + "allapp/utils/idgen" "allapp/utils/jwtx" "allapp/utils/response" "context" - - "allapp/biz/model/auth" + "fmt" "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 { +// LoginQq QQ 登录 +// @router /auth/login/qq [POST] +func LoginQq(ctx context.Context, c *app.RequestContext) { + var req auth.LoginQqReq + if err := c.BindAndValidate(&req); err != nil { c.String(consts.StatusBadRequest, err.Error()) return } - // 登录 - account := req.Account - password := req.Password + resp := &auth.LoginResp{} + openid := req.Openid + nickname := req.Username + avatar := req.Avatar - params := repo.GetUserForLoginParams{ - Account: account, - Password: password, - } - loginUser, err := db.Queries.GetUserForLogin(ctx, params) + // ---------- 通用逻辑:查询用户 ---------- + user, err := db.Queries.FindUserByOpenID(ctx, repo.FindUserByOpenIDParams{ + Openid: openid, + Type: 1, + }) + + isExist := true if err != nil { - response.Fail(c).Message("账号或密码错误!").Send() + if errorx.IsNotFound(err) { + isExist = false + } else { + errorx.AddError(c, err) + return + } + } + + if isExist { + if user.Status == 0 { + response.Fail(c).Message("账号已被禁用").Send() + return + } + + _ = db.Queries.UpdateUserLastLoginTime(ctx, user.UserID) + token, _ := jwtx.CreateToken(user.UserID) + + resp.Token = token + resp.UserId = user.UserID + resp.Username = user.Username + resp.Avatar = user.Avatar + response.Success(c).Data(resp).Send() return } - // 异步更新登录事件 - go func(userID int64) { - err = db.Queries.UpdateUserLoginLastTime(ctx, userID) - if err != nil { - logx.CtxError(ctx, "更新用户登录时间失败,UserID=%d, err=%v", loginUser.ID, err) + // ---------- 用户不存在 → 注册 ---------- + registerUser(ctx, c, openid, nickname, avatar, 1) +} + +// LoginWx 微信登录 +// @router /auth/login/wx [POST] +func LoginWx(ctx context.Context, c *app.RequestContext) { + var req auth.LoginWxReq + if err := c.BindAndValidate(&req); err != nil { + c.String(consts.StatusBadRequest, err.Error()) + return + } + + resp := &auth.LoginResp{} + openid := "" + nickname := "" + avatar := "" + accessToken := "" + + // 微信登录:code换access_token + openid + status, body, err := httpx.Get(ctx, "https://api.weixin.qq.com/sns/oauth2/access_token", map[string][]any{ + "appid": {conf.GetConf().Wx.AppId}, + "secret": {conf.GetConf().Wx.AppSecret}, + "code": {req.Code}, + "grant_type": {"authorization_code"}, + }) + + if err != nil || status != 200 { + errorx.AddError(c, fmt.Errorf("获取 openid 失败: %w, body: %s", err, body)) + return + } + + accessMap, err := httpx.JSONStringToMap(body) + + if err != nil { + errorx.AddError(c, fmt.Errorf("解析 access_token 失败: %w", err)) + return + } + + accessTokenVal, ok1 := accessMap["access_token"].(string) + openidVal, ok2 := accessMap["openid"].(string) + if !ok1 || !ok2 || accessTokenVal == "" || openidVal == "" { + errorx.AddError(c, fmt.Errorf("access_token 或 openid 不存在, body: %s", body)) + return + } + openid = openidVal + accessToken = accessTokenVal + + // ---------- 通用逻辑:查询用户 ---------- + user, err := db.Queries.FindUserByOpenID(ctx, repo.FindUserByOpenIDParams{ + Openid: openid, + Type: 0, + }) + + // 是否已注册 + isExist := true + + if err != nil { + if errorx.IsNotFound(err) { + isExist = false + } else { + errorx.AddError(c, err) + return } - }(loginUser.ID) + } - // 包装数据 - token, err := jwtx.CreateAccessToken(loginUser.ID) - refreshToken, err := jwtx.CreateRefreshToken(loginUser.ID) + if isExist { + if user.Status == 0 { + response.Fail(c).Message("账号已被禁用").Send() + return + } - resp := new(auth.LoginDefaultResp) + _ = db.Queries.UpdateUserLastLoginTime(ctx, user.UserID) + token, _ := jwtx.CreateToken(user.UserID) - 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 + resp.Token = token + resp.UserId = user.UserID + resp.Username = user.Username + resp.Avatar = user.Avatar + response.Success(c).Data(resp).Send() + return + } + // ---------- 用户不存在 → 注册 ---------- + // 用 access_token 获取用户信息 + status, body, err = httpx.Get(ctx, "https://api.weixin.qq.com/sns/userinfo", map[string][]any{ + "access_token": {accessToken}, + "openid": {openid}, + }) + if err != nil || status != 200 { + errorx.AddError(c, fmt.Errorf("获取用户信息失败: %w, body: %s", err, body)) + return + } + userMap, err := httpx.JSONStringToMap(body) + if err != nil { + errorx.AddError(c, fmt.Errorf("解析用户信息失败: %w", err)) + return + } + nickname, _ = userMap["nickname"].(string) + avatar, _ = userMap["headimgurl"].(string) + + registerUser(ctx, c, openid, nickname, avatar, 0) // 0 = 微信 +} + +// registerUser 注册通用函数 +func registerUser(ctx context.Context, c *app.RequestContext, openid, nickname, avatar string, loginType int32) { + userId := idgen.NextId() + spaceId := idgen.NextId() + + if nickname == "" { + nickname = fmt.Sprintf("用户_%d", userId) + } + if avatar == "" { + avatar = "https://default-avatar-url.com/default.png" + } + + err := db.WithTx(ctx, func(q *repo.Queries) error { + // 生成唯一邀请码 + var inviteCode string + for { + code := utils.GenerateCode(6) + _, err := q.FindSpaceByInviteCode(ctx, code) + if errorx.IsNotFound(err) { + inviteCode = code + break + } else if err != nil { + return err + } + } + + // 插入空间 + if err := q.InsertSpace(ctx, repo.InsertSpaceParams{ + ID: spaceId, + InviteCode: inviteCode, + }); err != nil { + return err + } + + // 插入空间用户 + if err := q.InsertSpaceUser(ctx, repo.InsertSpaceUserParams{ + ID: idgen.NextId(), + SpaceID: spaceId, + UserID: userId, + }); err != nil { + return err + } + + // 插入用户 + if err := q.InsertUser(ctx, repo.InsertUserParams{ + ID: userId, + Username: nickname, + Avatar: avatar, + Status: 1, + }); err != nil { + return err + } + + // 插入第三方登录信息 + if err := q.InsertUserOAuth(ctx, repo.InsertUserOAuthParams{ + ID: idgen.NextId(), + UserID: userId, + Type: loginType, + Openid: openid, + }); err != nil { + return err + } + + // 初始化记账分类 + if err := initMoneyCategoryTx(ctx, q, userId); err != nil { + return fmt.Errorf("初始化记账分类失败: %w", err) + } + + return nil + }) + + if err != nil { + errorx.AddError(c, err) + return + } + + token, _ := jwtx.CreateToken(userId) + resp := &auth.LoginResp{ + Token: token, + UserId: userId, + Username: nickname, + Avatar: avatar, + } response.Success(c).Data(resp).Send() } + +func initMoneyCategoryTx(ctx context.Context, q *repo.Queries, userId int64) error { + sysCategories, err := q.ListMoneySysCategory(ctx) + if err != nil { + return err + } + if len(sysCategories) == 0 { + return nil + } + + userCategories := make([]repo.BatchInsertMoneyUserCategoriesParams, 0, len(sysCategories)) + for _, sysCat := range sysCategories { + userCategories = append(userCategories, repo.BatchInsertMoneyUserCategoriesParams{ + ID: idgen.NextId(), + UserID: userId, + Name: sysCat.Name, + Icon: sysCat.Icon, + Type: sysCat.Type, + SortNumber: sysCat.SortNumber, + }) + } + + if err := q.DeleteMoneyCategoryByUserId(ctx, userId); err != nil { + return err + } + + if _, err := q.BatchInsertMoneyUserCategories(ctx, userCategories); err != nil { + return err + } + + return nil +} diff --git a/code/allapp/allapp-go/biz/handler/auth/register_service.go b/code/allapp/allapp-go/biz/handler/auth/register_service.go deleted file mode 100644 index e8983e4c..00000000 --- a/code/allapp/allapp-go/biz/handler/auth/register_service.go +++ /dev/null @@ -1,138 +0,0 @@ -// Code generated by hertz generator. - -package auth - -import ( - auth "allapp/biz/model/auth" - "allapp/db" - "allapp/db/repo" - "allapp/utils" - "allapp/utils/errorx" - "allapp/utils/idgen" - "allapp/utils/pgtypex" - "allapp/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 - } - } - }() - - generateCode, err := utils.GenerateCode(8) - if err != nil { - errorx.AddError(c, err) - return - } - - // 插入用户 - params := repo.InsertUserParams{ - ID: idgen.NextId(), - Account: account, - Password: password, - Username: pgtypex.StringToText("a_" + generateCode), - } - - 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 { - - q := db.Queries.WithTx(tx) - - sysCategories, err := q.ListMoneySysCategory(ctx) - if err != nil { - return err - } - if len(sysCategories) == 0 { - return nil - } - - userCategories := make([]repo.BatchInsertMoneyUserCategoriesParams, 0, len(sysCategories)) - for _, sysCat := range sysCategories { - userCategories = append(userCategories, repo.BatchInsertMoneyUserCategoriesParams{ - ID: idgen.NextId(), - UserID: userId, - Name: sysCat.Name, - Icon: sysCat.Icon, - Type: sysCat.Type, - SortNumber: sysCat.SortNumber, - }) - } - - // ⚠️ 注意:这里是 DeleteMoneyCategoryByUserId,不是 ById(你代码里疑似写错) - if err := q.DeleteMoneyCategoryByUserId(ctx, userId); err != nil { - return err - } - - if _, err := q.BatchInsertMoneyUserCategories(ctx, userCategories); err != nil { - return err - } - - return nil -} diff --git a/code/allapp/allapp-go/biz/handler/auth/token_service.go b/code/allapp/allapp-go/biz/handler/auth/token_service.go deleted file mode 100644 index 90a4f5c9..00000000 --- a/code/allapp/allapp-go/biz/handler/auth/token_service.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by hertz generator. - -package auth - -import ( - "allapp/utils/errorx" - "allapp/utils/jwtx" - "allapp/utils/response" - "context" - - auth "allapp/biz/model/auth" - - "github.com/cloudwego/hertz/pkg/app" - "github.com/cloudwego/hertz/pkg/protocol/consts" -) - -// RefreshAccessToken . -// @router /auth/refresh/token [GET] -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() -} diff --git a/code/allapp/allapp-go/biz/handler/space/space_service.go b/code/allapp/allapp-go/biz/handler/space/space_service.go index bcfb5844..6643469c 100644 --- a/code/allapp/allapp-go/biz/handler/space/space_service.go +++ b/code/allapp/allapp-go/biz/handler/space/space_service.go @@ -6,9 +6,7 @@ import ( "allapp/biz/router/middleware" "allapp/db" "allapp/db/repo" - "allapp/utils" "allapp/utils/errorx" - "allapp/utils/idgen" "allapp/utils/response" "context" @@ -18,105 +16,6 @@ import ( "github.com/cloudwego/hertz/pkg/protocol/consts" ) -// CreateSpace . -// @router /space/create [POST] -func CreateSpace(ctx context.Context, c *app.RequestContext) { - var err error - var req space.CreateSpaceParams - err = c.BindAndValidate(&req) - if err != nil { - c.String(consts.StatusBadRequest, err.Error()) - return - } - - userID := middleware.GetUserID(ctx) - - // 检查该用户是否已经加入空间了 - _, err = db.Queries.GetSpaceByUserId(ctx, userID) - - if err != nil { - if errorx.IsNotFound(err) { - // 忽略 - } else { - errorx.AddError(c, err) - return - } - } else { - response.Fail(c).Message("请先退出已加入的空间").Send() - return - } - - // 生成邀请码 - var inviteCode string - - for { - // 生成邀请码 - code, err := utils.GenerateCode(6) - if err != nil { - errorx.AddError(c, err) - return - } - - // 检查数据库是否存在 - _, err = db.Queries.GetSpaceByInviteCode(ctx, code) - if err != nil { - if errorx.IsNotFound(err) { - // 不存在,唯一,直接使用 - inviteCode = code - break - } else { - // 系统错误 - errorx.AddError(c, err) - return - } - } - - // 如果存在,继续循环重新生成 - } - - spaceId := idgen.NextId() - - err = db.WithTx(ctx, func(q *repo.Queries) error { - // 创建空间 - params := repo.InsertSpaceParams{ - ID: spaceId, - InviteCode: inviteCode, - } - - err = q.InsertSpace(ctx, params) - - if err != nil { - return err - } - // 将创建用户默认添加到该空间内 - userParams := repo.InsertSpaceUserParams{ - ID: idgen.NextId(), - SpaceID: spaceId, - UserID: userID, - Role: 0, - } - err := q.InsertSpaceUser(ctx, userParams) - - if err != nil { - return err - } - - return nil - }) - - if err != nil { - errorx.AddError(c, err) - return - } - - resp := &space.CreateSpaceResult{ - Id: spaceId, - InviteCode: inviteCode, - } - - response.Success(c).Data(resp).Send() -} - // DissolveSpace . // @router /space/dissolve [POST] func DissolveSpace(ctx context.Context, c *app.RequestContext) { diff --git a/code/allapp/allapp-go/biz/handler/space/space_user_service.go b/code/allapp/allapp-go/biz/handler/space/space_user_service.go index cfd9ba2a..0bc1a4e6 100644 --- a/code/allapp/allapp-go/biz/handler/space/space_user_service.go +++ b/code/allapp/allapp-go/biz/handler/space/space_user_service.go @@ -177,7 +177,7 @@ func JoinSpace(ctx context.Context, c *app.RequestContext) { } // 检查验证码是否有效 - spaceByCode, err := db.Queries.GetSpaceByInviteCode(ctx, inviteCode) + spaceByCode, err := db.Queries.FindSpaceByInviteCode(ctx, inviteCode) if err != nil { if errorx.IsNotFound(err) { diff --git a/code/allapp/allapp-go/biz/model/auth/auth.pb.go b/code/allapp/allapp-go/biz/model/auth/auth.pb.go index 277a34c6..f3061d50 100644 --- a/code/allapp/allapp-go/biz/model/auth/auth.pb.go +++ b/code/allapp/allapp-go/biz/model/auth/auth.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v4.25.3 +// protoc v6.33.1 // source: auth.proto package auth @@ -21,18 +21,18 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// 登录请求 -type LoginDefaultReq struct { +type LoginQqReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Account string `protobuf:"bytes,1,opt,name=Account,proto3" form:"account" json:"account" vd:"$!=''"` - Password string `protobuf:"bytes,2,opt,name=Password,proto3" form:"password" json:"password" vd:"$!=''"` + Openid string `protobuf:"bytes,1,opt,name=openid,proto3" form:"openid" json:"openid" query:"openid"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" form:"username" json:"username" query:"username"` + Avatar string `protobuf:"bytes,3,opt,name=avatar,proto3" form:"avatar" json:"avatar" query:"avatar"` } -func (x *LoginDefaultReq) Reset() { - *x = LoginDefaultReq{} +func (x *LoginQqReq) Reset() { + *x = LoginQqReq{} if protoimpl.UnsafeEnabled { mi := &file_auth_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -40,13 +40,13 @@ func (x *LoginDefaultReq) Reset() { } } -func (x *LoginDefaultReq) String() string { +func (x *LoginQqReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LoginDefaultReq) ProtoMessage() {} +func (*LoginQqReq) ProtoMessage() {} -func (x *LoginDefaultReq) ProtoReflect() protoreflect.Message { +func (x *LoginQqReq) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -58,41 +58,42 @@ func (x *LoginDefaultReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LoginDefaultReq.ProtoReflect.Descriptor instead. -func (*LoginDefaultReq) Descriptor() ([]byte, []int) { +// Deprecated: Use LoginQqReq.ProtoReflect.Descriptor instead. +func (*LoginQqReq) Descriptor() ([]byte, []int) { return file_auth_proto_rawDescGZIP(), []int{0} } -func (x *LoginDefaultReq) GetAccount() string { +func (x *LoginQqReq) GetOpenid() string { if x != nil { - return x.Account + return x.Openid } return "" } -func (x *LoginDefaultReq) GetPassword() string { +func (x *LoginQqReq) GetUsername() string { if x != nil { - return x.Password + return x.Username } return "" } -// 登录响应 -type LoginDefaultResp struct { +func (x *LoginQqReq) GetAvatar() string { + if x != nil { + return x.Avatar + } + return "" +} + +type LoginWxReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=Token,proto3" form:"token" json:"token"` - RefreshToken string `protobuf:"bytes,2,opt,name=RefreshToken,proto3" form:"refreshToken" json:"refreshToken"` - UserId int64 `protobuf:"varint,3,opt,name=UserId,proto3" form:"userId" json:"userId"` - Username string `protobuf:"bytes,4,opt,name=Username,proto3" form:"username" json:"username"` - SeqNo int32 `protobuf:"varint,5,opt,name=SeqNo,proto3" form:"seqNo" json:"seqNo"` - Gender int32 `protobuf:"varint,6,opt,name=Gender,proto3" form:"gender" json:"gender"` + Code string `protobuf:"bytes,1,opt,name=code,proto3" form:"code" json:"code" query:"code"` } -func (x *LoginDefaultResp) Reset() { - *x = LoginDefaultResp{} +func (x *LoginWxReq) Reset() { + *x = LoginWxReq{} if protoimpl.UnsafeEnabled { mi := &file_auth_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -100,13 +101,13 @@ func (x *LoginDefaultResp) Reset() { } } -func (x *LoginDefaultResp) String() string { +func (x *LoginWxReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LoginDefaultResp) ProtoMessage() {} +func (*LoginWxReq) ProtoMessage() {} -func (x *LoginDefaultResp) ProtoReflect() protoreflect.Message { +func (x *LoginWxReq) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -118,65 +119,36 @@ func (x *LoginDefaultResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LoginDefaultResp.ProtoReflect.Descriptor instead. -func (*LoginDefaultResp) Descriptor() ([]byte, []int) { +// Deprecated: Use LoginWxReq.ProtoReflect.Descriptor instead. +func (*LoginWxReq) Descriptor() ([]byte, []int) { return file_auth_proto_rawDescGZIP(), []int{1} } -func (x *LoginDefaultResp) GetToken() string { +func (x *LoginWxReq) GetCode() string { if x != nil { - return x.Token + return x.Code } return "" } -func (x *LoginDefaultResp) GetRefreshToken() string { - if x != nil { - return x.RefreshToken - } - return "" -} - -func (x *LoginDefaultResp) GetUserId() int64 { - if x != nil { - return x.UserId - } - return 0 -} - -func (x *LoginDefaultResp) GetUsername() string { - if x != nil { - return x.Username - } - return "" -} - -func (x *LoginDefaultResp) GetSeqNo() int32 { - if x != nil { - return x.SeqNo - } - return 0 -} - -func (x *LoginDefaultResp) GetGender() int32 { - if x != nil { - return x.Gender - } - return 0 -} - -// 注册请求 -type RegisterDefaultReq struct { +// 登录响应 +type LoginResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Account string `protobuf:"bytes,1,opt,name=Account,proto3" form:"account" json:"account" vd:"$!=''"` - Password string `protobuf:"bytes,2,opt,name=Password,proto3" form:"password" json:"password" vd:"$!=''"` + // JWT + Token string `protobuf:"bytes,1,opt,name=token,proto3" form:"token" json:"token"` + // 用户ID + UserId int64 `protobuf:"varint,2,opt,name=userId,proto3" form:"userId" json:"userId"` + // 昵称 + Username string `protobuf:"bytes,3,opt,name=username,proto3" form:"username" json:"username"` + // 头像 + Avatar string `protobuf:"bytes,4,opt,name=avatar,proto3" form:"avatar" json:"avatar"` } -func (x *RegisterDefaultReq) Reset() { - *x = RegisterDefaultReq{} +func (x *LoginResp) Reset() { + *x = LoginResp{} if protoimpl.UnsafeEnabled { mi := &file_auth_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -184,13 +156,13 @@ func (x *RegisterDefaultReq) Reset() { } } -func (x *RegisterDefaultReq) String() string { +func (x *LoginResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RegisterDefaultReq) ProtoMessage() {} +func (*LoginResp) ProtoMessage() {} -func (x *RegisterDefaultReq) ProtoReflect() protoreflect.Message { +func (x *LoginResp) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -202,147 +174,35 @@ func (x *RegisterDefaultReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RegisterDefaultReq.ProtoReflect.Descriptor instead. -func (*RegisterDefaultReq) Descriptor() ([]byte, []int) { +// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead. +func (*LoginResp) Descriptor() ([]byte, []int) { return file_auth_proto_rawDescGZIP(), []int{2} } -func (x *RegisterDefaultReq) GetAccount() string { +func (x *LoginResp) GetToken() string { if x != nil { - return x.Account + return x.Token } return "" } -func (x *RegisterDefaultReq) GetPassword() string { +func (x *LoginResp) GetUserId() int64 { if x != nil { - return x.Password + return x.UserId + } + return 0 +} + +func (x *LoginResp) GetUsername() string { + if x != nil { + return x.Username } return "" } -// 注册响应 -type RegisterDefaultResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RegisterDefaultResp) Reset() { - *x = RegisterDefaultResp{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterDefaultResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterDefaultResp) ProtoMessage() {} - -func (x *RegisterDefaultResp) ProtoReflect() protoreflect.Message { - mi := &file_auth_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterDefaultResp.ProtoReflect.Descriptor instead. -func (*RegisterDefaultResp) Descriptor() ([]byte, []int) { - return file_auth_proto_rawDescGZIP(), []int{3} -} - -// 刷新 access token 请求 -type RefreshAccessTokenReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RefreshAccessTokenReq) Reset() { - *x = RefreshAccessTokenReq{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RefreshAccessTokenReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RefreshAccessTokenReq) ProtoMessage() {} - -func (x *RefreshAccessTokenReq) ProtoReflect() protoreflect.Message { - mi := &file_auth_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RefreshAccessTokenReq.ProtoReflect.Descriptor instead. -func (*RefreshAccessTokenReq) Descriptor() ([]byte, []int) { - return file_auth_proto_rawDescGZIP(), []int{4} -} - -// 刷新 access token 响应 -type RefreshAccessTokenResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AccessToken string `protobuf:"bytes,1,opt,name=AccessToken,proto3" form:"accessToken" json:"accessToken"` -} - -func (x *RefreshAccessTokenResp) Reset() { - *x = RefreshAccessTokenResp{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RefreshAccessTokenResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RefreshAccessTokenResp) ProtoMessage() {} - -func (x *RefreshAccessTokenResp) ProtoReflect() protoreflect.Message { - mi := &file_auth_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RefreshAccessTokenResp.ProtoReflect.Descriptor instead. -func (*RefreshAccessTokenResp) Descriptor() ([]byte, []int) { - return file_auth_proto_rawDescGZIP(), []int{5} -} - -func (x *RefreshAccessTokenResp) GetAccessToken() string { +func (x *LoginResp) GetAvatar() string { if x != nil { - return x.AccessToken + return x.Avatar } return "" } @@ -351,70 +211,36 @@ var File_auth_proto protoreflect.FileDescriptor var file_auth_proto_rawDesc = []byte{ 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x61, 0x75, - 0x74, 0x68, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, - 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x2e, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x14, 0xca, 0xbb, 0x18, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xda, 0xbb, - 0x18, 0x05, 0x24, 0x21, 0x3d, 0x27, 0x27, 0x52, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x31, 0x0a, 0x08, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x15, 0xca, 0xbb, 0x18, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0xda, 0xbb, 0x18, 0x05, 0x24, 0x21, 0x3d, 0x27, 0x27, 0x52, 0x08, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1f, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xca, 0xbb, 0x18, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x0a, 0x0c, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x10, 0xca, 0xbb, 0x18, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x22, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x0a, 0xca, 0xbb, 0x18, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x52, 0x06, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xca, 0xbb, 0x18, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x05, 0x53, 0x65, 0x71, 0x4e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xca, 0xbb, - 0x18, 0x05, 0x73, 0x65, 0x71, 0x4e, 0x6f, 0x52, 0x05, 0x53, 0x65, 0x71, 0x4e, 0x6f, 0x12, 0x22, - 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0a, - 0xca, 0xbb, 0x18, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x47, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x22, 0x77, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x12, 0x2e, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xca, 0xbb, 0x18, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xda, 0xbb, 0x18, 0x05, 0x24, 0x21, 0x3d, 0x27, 0x27, 0x52, - 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xca, 0xbb, 0x18, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0xda, 0xbb, 0x18, 0x05, 0x24, 0x21, 0x3d, 0x27, - 0x27, 0x52, 0x08, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x22, 0x4b, 0x0a, 0x16, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0xca, 0xbb, 0x18, 0x0b, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0b, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x66, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x56, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x16, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x17, 0xd2, 0xc1, 0x18, 0x13, 0x2f, 0x61, 0x75, - 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x32, 0x75, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, - 0x1a, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x1a, 0xd2, 0xc1, 0x18, - 0x16, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x32, 0x78, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x12, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x61, 0x75, 0x74, - 0x68, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x17, 0xca, 0xc1, 0x18, 0x13, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x42, 0x21, 0x5a, 0x1f, 0x63, 0x6e, 0x2f, 0x6f, 0x6e, 0x65, 0x61, 0x6f, 0x2f, 0x62, 0x61, - 0x73, 0x65, 0x2d, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, - 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x68, 0x1a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x58, 0x0a, + 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x51, 0x71, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x70, 0x65, + 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x20, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x57, 0x78, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x09, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1f, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xca, 0xbb, 0x18, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, 0xca, 0xbb, 0x18, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, + 0xca, 0xbb, 0x18, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xca, 0xbb, 0x18, 0x06, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x32, 0x92, 0x01, 0x0a, 0x0c, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x51, 0x71, 0x12, 0x10, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x51, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x12, 0xd2, 0xc1, 0x18, 0x0e, 0x2f, + 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x71, 0x71, 0x12, 0x40, 0x0a, + 0x07, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x57, 0x78, 0x12, 0x10, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x57, 0x78, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x12, 0xd2, 0xc1, 0x18, + 0x0e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x77, 0x78, 0x42, + 0x17, 0x5a, 0x15, 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x70, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -429,24 +255,19 @@ func file_auth_proto_rawDescGZIP() []byte { return file_auth_proto_rawDescData } -var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_auth_proto_goTypes = []interface{}{ - (*LoginDefaultReq)(nil), // 0: auth.LoginDefaultReq - (*LoginDefaultResp)(nil), // 1: auth.LoginDefaultResp - (*RegisterDefaultReq)(nil), // 2: auth.RegisterDefaultReq - (*RegisterDefaultResp)(nil), // 3: auth.RegisterDefaultResp - (*RefreshAccessTokenReq)(nil), // 4: auth.RefreshAccessTokenReq - (*RefreshAccessTokenResp)(nil), // 5: auth.RefreshAccessTokenResp + (*LoginQqReq)(nil), // 0: auth.LoginQqReq + (*LoginWxReq)(nil), // 1: auth.LoginWxReq + (*LoginResp)(nil), // 2: auth.LoginResp } var file_auth_proto_depIdxs = []int32{ - 0, // 0: auth.LoginService.LoginDefault:input_type -> auth.LoginDefaultReq - 2, // 1: auth.RegisterService.RegisterDefault:input_type -> auth.RegisterDefaultReq - 4, // 2: auth.TokenService.RefreshAccessToken:input_type -> auth.RefreshAccessTokenReq - 1, // 3: auth.LoginService.LoginDefault:output_type -> auth.LoginDefaultResp - 3, // 4: auth.RegisterService.RegisterDefault:output_type -> auth.RegisterDefaultResp - 5, // 5: auth.TokenService.RefreshAccessToken:output_type -> auth.RefreshAccessTokenResp - 3, // [3:6] is the sub-list for method output_type - 0, // [0:3] is the sub-list for method input_type + 0, // 0: auth.LoginService.LoginQq:input_type -> auth.LoginQqReq + 1, // 1: auth.LoginService.LoginWx:input_type -> auth.LoginWxReq + 2, // 2: auth.LoginService.LoginQq:output_type -> auth.LoginResp + 2, // 3: auth.LoginService.LoginWx:output_type -> auth.LoginResp + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -459,7 +280,7 @@ func file_auth_proto_init() { } if !protoimpl.UnsafeEnabled { file_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginDefaultReq); i { + switch v := v.(*LoginQqReq); i { case 0: return &v.state case 1: @@ -471,7 +292,7 @@ func file_auth_proto_init() { } } file_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginDefaultResp); i { + switch v := v.(*LoginWxReq); i { case 0: return &v.state case 1: @@ -483,43 +304,7 @@ func file_auth_proto_init() { } } file_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterDefaultReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterDefaultResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshAccessTokenReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshAccessTokenResp); i { + switch v := v.(*LoginResp); i { case 0: return &v.state case 1: @@ -537,9 +322,9 @@ func file_auth_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_auth_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 3, NumExtensions: 0, - NumServices: 3, + NumServices: 1, }, GoTypes: file_auth_proto_goTypes, DependencyIndexes: file_auth_proto_depIdxs, diff --git a/code/allapp/allapp-go/biz/model/space/space.pb.go b/code/allapp/allapp-go/biz/model/space/space.pb.go index aa424f7b..6c875e34 100644 --- a/code/allapp/allapp-go/biz/model/space/space.pb.go +++ b/code/allapp/allapp-go/biz/model/space/space.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v4.25.3 +// protoc v6.33.1 // source: space.proto package space @@ -28,86 +28,77 @@ var file_space_proto_rawDesc = []byte{ 0x17, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xc2, 0x01, 0x0a, 0x0c, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x1a, 0x18, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x11, 0xd2, 0xc1, 0x18, 0x0d, - 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x5c, 0x0a, - 0x0d, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, - 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x1a, 0x2e, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x13, 0xd2, 0xc1, 0x18, 0x0f, 0x2f, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x2f, 0x64, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x32, 0xdc, 0x03, 0x0a, 0x10, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x59, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x19, 0x2e, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x13, 0xca, 0xc1, 0x18, 0x0f, 0x2f, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x09, 0x45, - 0x78, 0x69, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2e, 0x45, 0x78, 0x69, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x1a, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x69, 0x74, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, 0xd2, 0xc1, 0x18, 0x10, 0x2f, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x65, 0x78, 0x69, 0x74, 0x12, 0x60, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x1b, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x1b, 0x2e, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, 0xd2, 0xc1, 0x18, 0x10, - 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x65, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x1a, 0x1c, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x16, 0xd2, 0xc1, 0x18, 0x12, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x51, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4a, 0x6f, 0x69, - 0x6e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x16, 0x2e, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, 0xd2, 0xc1, 0x18, 0x10, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x42, 0x22, 0x5a, 0x20, 0x63, 0x6e, - 0x2f, 0x6f, 0x6e, 0x65, 0x61, 0x6f, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x67, 0x6f, 0x2f, 0x62, - 0x69, 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x6c, 0x0a, 0x0c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, + 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x1a, 0x1a, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x13, 0xd2, 0xc1, 0x18, 0x0f, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x64, 0x69, 0x73, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x32, 0xdc, 0x03, 0x0a, 0x10, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x59, 0x0a, 0x0c, 0x67, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x19, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x13, 0xca, 0xc1, 0x18, 0x0f, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x67, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x09, 0x45, 0x78, 0x69, 0x74, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x69, 0x74, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2e, 0x45, 0x78, 0x69, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x14, 0xd2, 0xc1, 0x18, 0x10, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x65, 0x78, 0x69, 0x74, 0x12, 0x60, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x1b, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x14, 0xd2, 0xc1, 0x18, 0x10, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x1c, 0x2e, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0xd2, 0xc1, 0x18, 0x12, 0x2f, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x12, 0x51, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x2e, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x16, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4a, 0x6f, + 0x69, 0x6e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, 0xd2, + 0xc1, 0x18, 0x10, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6a, + 0x6f, 0x69, 0x6e, 0x42, 0x18, 0x5a, 0x16, 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x70, 0x2f, 0x62, 0x69, + 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_space_proto_goTypes = []interface{}{ - (*CreateSpaceParams)(nil), // 0: space.CreateSpaceParams - (*DissolveSpaceParams)(nil), // 1: space.DissolveSpaceParams - (*GetUserSpaceParams)(nil), // 2: space.GetUserSpaceParams - (*ExitSpaceParams)(nil), // 3: space.ExitSpaceParams - (*ListSpaceUsersParams)(nil), // 4: space.ListSpaceUsersParams - (*RemoveSpaceUserParams)(nil), // 5: space.RemoveSpaceUserParams - (*JoinSpaceParams)(nil), // 6: space.JoinSpaceParams - (*DissolveSpaceResult)(nil), // 7: space.DissolveSpaceResult - (*GetUserSpaceResult)(nil), // 8: space.GetUserSpaceResult - (*ExitSpaceResult)(nil), // 9: space.ExitSpaceResult - (*ListSpaceUsersResult)(nil), // 10: space.ListSpaceUsersResult - (*RemoveSpaceUserResult)(nil), // 11: space.RemoveSpaceUserResult - (*JoinSpaceResult)(nil), // 12: space.JoinSpaceResult + (*DissolveSpaceParams)(nil), // 0: space.DissolveSpaceParams + (*GetUserSpaceParams)(nil), // 1: space.GetUserSpaceParams + (*ExitSpaceParams)(nil), // 2: space.ExitSpaceParams + (*ListSpaceUsersParams)(nil), // 3: space.ListSpaceUsersParams + (*RemoveSpaceUserParams)(nil), // 4: space.RemoveSpaceUserParams + (*JoinSpaceParams)(nil), // 5: space.JoinSpaceParams + (*DissolveSpaceResult)(nil), // 6: space.DissolveSpaceResult + (*GetUserSpaceResult)(nil), // 7: space.GetUserSpaceResult + (*ExitSpaceResult)(nil), // 8: space.ExitSpaceResult + (*ListSpaceUsersResult)(nil), // 9: space.ListSpaceUsersResult + (*RemoveSpaceUserResult)(nil), // 10: space.RemoveSpaceUserResult + (*JoinSpaceResult)(nil), // 11: space.JoinSpaceResult } var file_space_proto_depIdxs = []int32{ - 0, // 0: space.SpaceService.CreateSpace:input_type -> space.CreateSpaceParams - 1, // 1: space.SpaceService.DissolveSpace:input_type -> space.DissolveSpaceParams - 2, // 2: space.SpaceUserService.getUserSpace:input_type -> space.GetUserSpaceParams - 3, // 3: space.SpaceUserService.ExitSpace:input_type -> space.ExitSpaceParams - 4, // 4: space.SpaceUserService.ListSpaceUsers:input_type -> space.ListSpaceUsersParams - 5, // 5: space.SpaceUserService.RemoveSpaceUser:input_type -> space.RemoveSpaceUserParams - 6, // 6: space.SpaceUserService.JoinSpace:input_type -> space.JoinSpaceParams - 0, // 7: space.SpaceService.CreateSpace:output_type -> space.CreateSpaceParams - 7, // 8: space.SpaceService.DissolveSpace:output_type -> space.DissolveSpaceResult - 8, // 9: space.SpaceUserService.getUserSpace:output_type -> space.GetUserSpaceResult - 9, // 10: space.SpaceUserService.ExitSpace:output_type -> space.ExitSpaceResult - 10, // 11: space.SpaceUserService.ListSpaceUsers:output_type -> space.ListSpaceUsersResult - 11, // 12: space.SpaceUserService.RemoveSpaceUser:output_type -> space.RemoveSpaceUserResult - 12, // 13: space.SpaceUserService.JoinSpace:output_type -> space.JoinSpaceResult - 7, // [7:14] is the sub-list for method output_type - 0, // [0:7] is the sub-list for method input_type + 0, // 0: space.SpaceService.DissolveSpace:input_type -> space.DissolveSpaceParams + 1, // 1: space.SpaceUserService.getUserSpace:input_type -> space.GetUserSpaceParams + 2, // 2: space.SpaceUserService.ExitSpace:input_type -> space.ExitSpaceParams + 3, // 3: space.SpaceUserService.ListSpaceUsers:input_type -> space.ListSpaceUsersParams + 4, // 4: space.SpaceUserService.RemoveSpaceUser:input_type -> space.RemoveSpaceUserParams + 5, // 5: space.SpaceUserService.JoinSpace:input_type -> space.JoinSpaceParams + 6, // 6: space.SpaceService.DissolveSpace:output_type -> space.DissolveSpaceResult + 7, // 7: space.SpaceUserService.getUserSpace:output_type -> space.GetUserSpaceResult + 8, // 8: space.SpaceUserService.ExitSpace:output_type -> space.ExitSpaceResult + 9, // 9: space.SpaceUserService.ListSpaceUsers:output_type -> space.ListSpaceUsersResult + 10, // 10: space.SpaceUserService.RemoveSpaceUser:output_type -> space.RemoveSpaceUserResult + 11, // 11: space.SpaceUserService.JoinSpace:output_type -> space.JoinSpaceResult + 6, // [6:12] is the sub-list for method output_type + 0, // [0:6] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/code/allapp/allapp-go/biz/model/space/space_types.pb.go b/code/allapp/allapp-go/biz/model/space/space_types.pb.go index 0ae10dec..2d53ce81 100644 --- a/code/allapp/allapp-go/biz/model/space/space_types.pb.go +++ b/code/allapp/allapp-go/biz/model/space/space_types.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v4.25.3 +// protoc v6.33.1 // source: space/space_types.proto package space @@ -207,10 +207,9 @@ var file_space_space_types_proto_rawDesc = []byte{ 0x64, 0x65, 0x52, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x22, 0x5a, 0x20, - 0x63, 0x6e, 0x2f, 0x6f, 0x6e, 0x65, 0x61, 0x6f, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x67, 0x6f, - 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x18, 0x5a, 0x16, + 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x70, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/code/allapp/allapp-go/biz/model/space/space_user_types.pb.go b/code/allapp/allapp-go/biz/model/space/space_user_types.pb.go index 574ade09..d355d059 100644 --- a/code/allapp/allapp-go/biz/model/space/space_user_types.pb.go +++ b/code/allapp/allapp-go/biz/model/space/space_user_types.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v4.25.3 +// protoc v6.33.1 // source: space/space_user_types.proto package space @@ -588,9 +588,9 @@ var file_space_space_user_types_proto_rawDesc = []byte{ 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x08, 0xca, 0xbb, 0x18, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x42, - 0x22, 0x5a, 0x20, 0x63, 0x6e, 0x2f, 0x6f, 0x6e, 0x65, 0x61, 0x6f, 0x2f, 0x62, 0x61, 0x73, 0x65, - 0x2d, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x18, 0x5a, 0x16, 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x70, 0x2f, 0x62, 0x69, 0x7a, 0x2f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/code/allapp/allapp-go/biz/router/auth/auth.go b/code/allapp/allapp-go/biz/router/auth/auth.go index 774957bc..9f15aae2 100644 --- a/code/allapp/allapp-go/biz/router/auth/auth.go +++ b/code/allapp/allapp-go/biz/router/auth/auth.go @@ -21,15 +21,8 @@ func Register(r *server.Hertz) { _auth := root.Group("/auth", _authMw()...) { _login := _auth.Group("/login", _loginMw()...) - _login.POST("/default", append(_logindefaultMw(), auth.LoginDefault)...) - } - { - _refresh := _auth.Group("/refresh", _refreshMw()...) - _refresh.GET("/token", append(_refreshaccesstokenMw(), auth.RefreshAccessToken)...) - } - { - _register := _auth.Group("/register", _registerMw()...) - _register.POST("/default", append(_registerdefaultMw(), auth.RegisterDefault)...) + _login.POST("/qq", append(_loginqqMw(), auth.LoginQq)...) + _login.POST("/wx", append(_loginwxMw(), auth.LoginWx)...) } } } diff --git a/code/allapp/allapp-go/biz/router/auth/middleware.go b/code/allapp/allapp-go/biz/router/auth/middleware.go index acfd187a..fca3ed86 100644 --- a/code/allapp/allapp-go/biz/router/auth/middleware.go +++ b/code/allapp/allapp-go/biz/router/auth/middleware.go @@ -45,3 +45,18 @@ func _refreshMw() []app.HandlerFunc { // your code... return nil } + +func _loginthirdpartyMw() []app.HandlerFunc { + // your code... + return nil +} + +func _loginqqMw() []app.HandlerFunc { + // your code... + return nil +} + +func _loginwxMw() []app.HandlerFunc { + // your code... + return nil +} diff --git a/code/allapp/allapp-go/biz/router/middleware/auth.go b/code/allapp/allapp-go/biz/router/middleware/auth.go index cb5559ae..1c85b677 100644 --- a/code/allapp/allapp-go/biz/router/middleware/auth.go +++ b/code/allapp/allapp-go/biz/router/middleware/auth.go @@ -43,11 +43,11 @@ func Auth() app.HandlerFunc { return } - verifyToken := jwtx.VerifyToken(token) + verifyToken, flag := jwtx.VerifyToken(token) - if verifyToken.IsValid { + if flag { user := &ContextUser{ - UserID: verifyToken.Claims.UserID, + UserID: verifyToken.UserID, SpaceID: 0, } if spaceId != "" { diff --git a/code/allapp/allapp-go/biz/router/space/space.go b/code/allapp/allapp-go/biz/router/space/space.go index bc84a7b9..8794bf5d 100644 --- a/code/allapp/allapp-go/biz/router/space/space.go +++ b/code/allapp/allapp-go/biz/router/space/space.go @@ -19,7 +19,6 @@ func Register(r *server.Hertz) { root := r.Group("/", rootMw()...) { _space := root.Group("/space", _spaceMw()...) - _space.POST("/create", append(_createspaceMw(), space.CreateSpace)...) _space.POST("/dissolve", append(_dissolvespaceMw(), space.DissolveSpace)...) { _user := _space.Group("/user", _userMw()...) diff --git a/code/allapp/allapp-go/conf/conf.go b/code/allapp/allapp-go/conf/conf.go index 5cb2992c..04f8ec44 100644 --- a/code/allapp/allapp-go/conf/conf.go +++ b/code/allapp/allapp-go/conf/conf.go @@ -1,11 +1,12 @@ package conf import ( - "github.com/spf13/viper" "os" "path/filepath" "sync" "time" + + "github.com/spf13/viper" ) var ( @@ -21,6 +22,7 @@ type Config struct { Snowflake SnowflakeConfig `mapstructure:"snowflake" yaml:"snowflake"` Pgsql PgsqlConfig `mapstructure:"pgsql" yaml:"pgsql"` Log LogConfig `mapstructure:"log" yaml:"log"` + Wx WxConfig `mapstructure:"wx" yaml:"wx"` } type ServerConfig struct { @@ -29,9 +31,8 @@ type ServerConfig struct { } type JwtConfig struct { - Secret string `mapstructure:"secret" yaml:"secret"` - AccessExpiry time.Duration `mapstructure:"access_expiry" yaml:"access_expiry"` - RefreshExpiry time.Duration `mapstructure:"refresh_expiry" yaml:"refresh_expiry"` + Secret string `mapstructure:"secret" yaml:"secret"` + AccessExpiry time.Duration `mapstructure:"access_expiry" yaml:"access_expiry"` } type SnowflakeConfig struct { @@ -61,6 +62,11 @@ type LogConfig struct { Compress bool `mapstructure:"compress" yaml:"compress"` } +type WxConfig struct { + AppId string `mapstructure:"app_id" yaml:"app_id"` + AppSecret string `mapstructure:"app_secret" yaml:"app_secret"` +} + func GetConf() *Config { once.Do(initConf) return conf diff --git a/code/allapp/allapp-go/conf/dev/conf.yaml b/code/allapp/allapp-go/conf/dev/conf.yaml index 38516cfd..5c066a2c 100644 --- a/code/allapp/allapp-go/conf/dev/conf.yaml +++ b/code/allapp/allapp-go/conf/dev/conf.yaml @@ -5,7 +5,6 @@ server: jwt: secret: 3Bde3BGEbYqtqyEUzW3ry8jKFcaPH17fRmTmqE7MDr05Lwj95uruRKrrkb44TJ4s access_expiry: -1 - refresh_expiry: -1 snowflake: datacenter_id: 1 @@ -29,4 +28,8 @@ log: max_size: 10 max_backups: 30 max_age: 7 - compress: true \ No newline at end of file + compress: true + +wx: + app_id: wxdab3e21a1f7e392f + app_secret: 0895443c6fedfc21cb92c9cd60de2a26 diff --git a/code/allapp/allapp-go/db/queries/space.sql b/code/allapp/allapp-go/db/queries/space.sql index d18911a7..8d6ba46c 100644 --- a/code/allapp/allapp-go/db/queries/space.sql +++ b/code/allapp/allapp-go/db/queries/space.sql @@ -18,7 +18,6 @@ FROM space s ON s.id = m.space_id WHERE m.user_id = $1; --- 根据验证码获取空间 --- name: GetSpaceByInviteCode :one +-- name: FindSpaceByInviteCode :one SELECT * FROM space WHERE invite_code = $1; diff --git a/code/allapp/allapp-go/db/queries/user.sql b/code/allapp/allapp-go/db/queries/user.sql new file mode 100644 index 00000000..eb6a321e --- /dev/null +++ b/code/allapp/allapp-go/db/queries/user.sql @@ -0,0 +1,32 @@ +-- name: FindUserByOpenID :one +SELECT + u.id AS user_id, + u.username, + u.avatar, + u.status, + o.type AS login_type, + o.openid +FROM user_oauth o + JOIN "user" u ON u.id = o.user_id +WHERE o.openid = $1 + AND o.type = $2 +LIMIT 1; + +-- name: InsertUser :exec +INSERT INTO "user" ( + id, + username, + avatar, + status, + create_time, + update_time, + last_login_time +) VALUES ( + $1, $2, $3,$4, NOW(), NOW(),now() + ) +RETURNING id; + +-- name: UpdateUserLastLoginTime :exec +UPDATE "user" +SET last_login_time = NOW() +WHERE id = $1; diff --git a/code/allapp/allapp-go/db/queries/user_info.sql b/code/allapp/allapp-go/db/queries/user_info.sql index b3f1248a..bd5aff45 100644 --- a/code/allapp/allapp-go/db/queries/user_info.sql +++ b/code/allapp/allapp-go/db/queries/user_info.sql @@ -1,8 +1,3 @@ --- 插入用户并返回刚创建的记录 --- name: InsertUser :execrows -INSERT INTO user_info (id, account, password,username) -VALUES ($1, $2, $3,$4); - -- 根据 ID 查询单条用户记录 -- name: GetUserById :one SELECT * diff --git a/code/allapp/allapp-go/db/queries/user_oauth.sql b/code/allapp/allapp-go/db/queries/user_oauth.sql new file mode 100644 index 00000000..c8cabfcc --- /dev/null +++ b/code/allapp/allapp-go/db/queries/user_oauth.sql @@ -0,0 +1,13 @@ +-- name: InsertUserOAuth :exec +INSERT INTO user_oauth ( + id, + user_id, + type, + openid, + create_time, + update_time +) VALUES ( + $1, $2, $3, $4, NOW(), NOW() +); + + diff --git a/code/allapp/allapp-go/db/repo/models.go b/code/allapp/allapp-go/db/repo/models.go index 27104c83..d2af97eb 100644 --- a/code/allapp/allapp-go/db/repo/models.go +++ b/code/allapp/allapp-go/db/repo/models.go @@ -38,34 +38,32 @@ type MoneyUserCategory struct { CreateTime pgtype.Timestamp } -// 共享空间(一个空间包含多个成员) type Space struct { - // 空间ID - ID int64 - // 空间名称 - Name pgtype.Text - // 空间邀请码 + ID int64 + Name pgtype.Text InviteCode string - // 空间创建时间 CreateTime pgtype.Timestamp - // 空间更新时间 UpdateTime pgtype.Timestamp } -// 共享空间成员表 type SpaceUser struct { - // 主键ID - ID int64 - // 所属空间ID - SpaceID int64 - // 用户ID(唯一,每用户只加入一个空间) - UserID int64 - // 成员角色:0创建者 1管理员 2普通 - Role int32 - // 加入空间时间 + ID int64 + SpaceID int64 + UserID int64 + Role int32 JoinTime pgtype.Timestamp } +type User struct { + ID int64 + Username string + Avatar string + Status int32 + LastLoginTime pgtype.Timestamptz + CreateTime pgtype.Timestamptz + UpdateTime pgtype.Timestamptz +} + type UserInfo struct { ID int64 SeqNo pgtype.Int4 @@ -79,3 +77,13 @@ type UserInfo struct { ActiveTime pgtype.Timestamp LastLoginTime pgtype.Timestamp } + +type UserOauth struct { + ID int64 + UserID int64 + Type int32 + Openid string + Unionid pgtype.Text + CreateTime pgtype.Timestamptz + UpdateTime pgtype.Timestamptz +} diff --git a/code/allapp/allapp-go/db/repo/space.sql.go b/code/allapp/allapp-go/db/repo/space.sql.go index abe5fa9e..7541576c 100644 --- a/code/allapp/allapp-go/db/repo/space.sql.go +++ b/code/allapp/allapp-go/db/repo/space.sql.go @@ -19,13 +19,12 @@ func (q *Queries) DeleteSpace(ctx context.Context, id int64) error { return err } -const getSpaceById = `-- name: GetSpaceById :one -SELECT id, name, invite_code, create_time, update_time FROM space WHERE id = $1 +const findSpaceByInviteCode = `-- name: FindSpaceByInviteCode :one +SELECT id, name, invite_code, create_time, update_time FROM space WHERE invite_code = $1 ` -// 根据id获取分享空间信息 -func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) { - row := q.db.QueryRow(ctx, getSpaceById, id) +func (q *Queries) FindSpaceByInviteCode(ctx context.Context, inviteCode string) (Space, error) { + row := q.db.QueryRow(ctx, findSpaceByInviteCode, inviteCode) var i Space err := row.Scan( &i.ID, @@ -37,13 +36,13 @@ func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) { return i, err } -const getSpaceByInviteCode = `-- name: GetSpaceByInviteCode :one -SELECT id, name, invite_code, create_time, update_time FROM space WHERE invite_code = $1 +const getSpaceById = `-- name: GetSpaceById :one +SELECT id, name, invite_code, create_time, update_time FROM space WHERE id = $1 ` -// 根据验证码获取空间 -func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (Space, error) { - row := q.db.QueryRow(ctx, getSpaceByInviteCode, inviteCode) +// 根据id获取分享空间信息 +func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) { + row := q.db.QueryRow(ctx, getSpaceById, id) var i Space err := row.Scan( &i.ID, diff --git a/code/allapp/allapp-go/db/repo/user.sql.go b/code/allapp/allapp-go/db/repo/user.sql.go new file mode 100644 index 00000000..cd0d92f1 --- /dev/null +++ b/code/allapp/allapp-go/db/repo/user.sql.go @@ -0,0 +1,95 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: user.sql + +package repo + +import ( + "context" +) + +const findUserByOpenID = `-- name: FindUserByOpenID :one +SELECT + u.id AS user_id, + u.username, + u.avatar, + u.status, + o.type AS login_type, + o.openid +FROM user_oauth o + JOIN "user" u ON u.id = o.user_id +WHERE o.openid = $1 + AND o.type = $2 +LIMIT 1 +` + +type FindUserByOpenIDParams struct { + Openid string + Type int32 +} + +type FindUserByOpenIDRow struct { + UserID int64 + Username string + Avatar string + Status int32 + LoginType int32 + Openid string +} + +func (q *Queries) FindUserByOpenID(ctx context.Context, arg FindUserByOpenIDParams) (FindUserByOpenIDRow, error) { + row := q.db.QueryRow(ctx, findUserByOpenID, arg.Openid, arg.Type) + var i FindUserByOpenIDRow + err := row.Scan( + &i.UserID, + &i.Username, + &i.Avatar, + &i.Status, + &i.LoginType, + &i.Openid, + ) + return i, err +} + +const insertUser = `-- name: InsertUser :exec +INSERT INTO "user" ( + id, + username, + avatar, + status, + create_time, + update_time +) VALUES ( + $1, $2, $3,$4, NOW(), NOW() + ) +RETURNING id +` + +type InsertUserParams struct { + ID int64 + Username string + Avatar string + Status int32 +} + +func (q *Queries) InsertUser(ctx context.Context, arg InsertUserParams) error { + _, err := q.db.Exec(ctx, insertUser, + arg.ID, + arg.Username, + arg.Avatar, + arg.Status, + ) + return err +} + +const updateUserLastLoginTime = `-- name: UpdateUserLastLoginTime :exec +UPDATE "user" +SET last_login_time = NOW() +WHERE id = $1 +` + +func (q *Queries) UpdateUserLastLoginTime(ctx context.Context, id int64) error { + _, err := q.db.Exec(ctx, updateUserLastLoginTime, id) + return err +} diff --git a/code/allapp/allapp-go/db/repo/user_info.sql.go b/code/allapp/allapp-go/db/repo/user_info.sql.go index b4f22221..eb875aaf 100644 --- a/code/allapp/allapp-go/db/repo/user_info.sql.go +++ b/code/allapp/allapp-go/db/repo/user_info.sql.go @@ -7,8 +7,6 @@ package repo import ( "context" - - "github.com/jackc/pgx/v5/pgtype" ) const getUserByAccount = `-- name: GetUserByAccount :one @@ -95,32 +93,6 @@ func (q *Queries) GetUserForLogin(ctx context.Context, arg GetUserForLoginParams return i, err } -const insertUser = `-- name: InsertUser :execrows -INSERT INTO user_info (id, account, password,username) -VALUES ($1, $2, $3,$4) -` - -type InsertUserParams struct { - ID int64 - Account string - Password string - Username pgtype.Text -} - -// 插入用户并返回刚创建的记录 -func (q *Queries) InsertUser(ctx context.Context, arg InsertUserParams) (int64, error) { - result, err := q.db.Exec(ctx, insertUser, - arg.ID, - arg.Account, - arg.Password, - arg.Username, - ) - if err != nil { - return 0, err - } - return result.RowsAffected(), nil -} - const updateUserActiveTime = `-- name: UpdateUserActiveTime :exec UPDATE user_info SET active_time = now() diff --git a/code/allapp/allapp-go/db/repo/user_oauth.sql.go b/code/allapp/allapp-go/db/repo/user_oauth.sql.go new file mode 100644 index 00000000..771e0a74 --- /dev/null +++ b/code/allapp/allapp-go/db/repo/user_oauth.sql.go @@ -0,0 +1,40 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: user_oauth.sql + +package repo + +import ( + "context" +) + +const insertUserOAuth = `-- name: InsertUserOAuth :exec +INSERT INTO user_oauth ( + id, + user_id, + type, + openid, + create_time, + update_time +) VALUES ( + $1, $2, $3, $4, NOW(), NOW() +) +` + +type InsertUserOAuthParams struct { + ID int64 + UserID int64 + Type int32 + Openid string +} + +func (q *Queries) InsertUserOAuth(ctx context.Context, arg InsertUserOAuthParams) error { + _, err := q.db.Exec(ctx, insertUserOAuth, + arg.ID, + arg.UserID, + arg.Type, + arg.Openid, + ) + return err +} diff --git a/code/allapp/allapp-go/db/schema.sql b/code/allapp/allapp-go/db/schema.sql index 176a8481..c072a598 100644 --- a/code/allapp/allapp-go/db/schema.sql +++ b/code/allapp/allapp-go/db/schema.sql @@ -12,6 +12,25 @@ CREATE TABLE user_info ( last_login_time TIMESTAMP ); +CREATE TABLE "user" ( + "id" int8 NOT NULL, + "username" varchar(255) NOT NULL , + "avatar" varchar(255) NOT NULL , + "status" int4 NOT NULL DEFAULT 1, + "last_login_time" timestamptz(6), + "create_time" timestamptz(6), + "update_time" timestamptz(6) +); + +CREATE TABLE "user_oauth" ( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "type" int4 NOT NULL, + "openid" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "create_time" timestamptz(6) NOT NULL, + "update_time" timestamptz(6) NOT NULL +); + CREATE TABLE money_record( id BIGINT PRIMARY KEY, category_id BIGINT NOT NULL, @@ -51,18 +70,9 @@ CREATE TABLE space ( update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); --- 注释 -COMMENT ON TABLE space IS '共享空间(一个空间包含多个成员)'; -COMMENT ON COLUMN space.id IS '空间ID'; -COMMENT ON COLUMN space.name IS '空间名称'; -COMMENT ON COLUMN space.invite_code IS '空间邀请码'; -COMMENT ON COLUMN space.create_time IS '空间创建时间'; -COMMENT ON COLUMN space.update_time IS '空间更新时间'; - ALTER TABLE space ADD CONSTRAINT space_invite_code_key UNIQUE (invite_code); - -- 空间成员表(每个用户只能加入一个空间) CREATE TABLE space_user ( id BIGSERIAL PRIMARY KEY, @@ -72,10 +82,3 @@ CREATE TABLE space_user ( join_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); --- 注释 -COMMENT ON TABLE space_user IS '共享空间成员表'; -COMMENT ON COLUMN space_user.id IS '主键ID'; -COMMENT ON COLUMN space_user.space_id IS '所属空间ID'; -COMMENT ON COLUMN space_user.user_id IS '用户ID(唯一,每用户只加入一个空间)'; -COMMENT ON COLUMN space_user.role IS '成员角色:0创建者 1管理员 2普通'; -COMMENT ON COLUMN space_user.join_time IS '加入空间时间'; diff --git a/code/allapp/allapp-go/idl/auth.proto b/code/allapp/allapp-go/idl/auth.proto index 4b61af07..aed8f591 100644 --- a/code/allapp/allapp-go/idl/auth.proto +++ b/code/allapp/allapp-go/idl/auth.proto @@ -6,56 +6,34 @@ option go_package = "auth"; import "api.proto"; -// 登录请求 -message LoginDefaultReq { - string Account = 1 [(api.body)="account", (api.vd)="$!=''"]; - string Password = 2 [(api.body)="password", (api.vd)="$!=''"]; +message LoginQqReq { + string openid = 1; + string username = 2; + string avatar = 3; +} + +message LoginWxReq { + string code = 1; } // 登录响应 -message LoginDefaultResp { - string Token = 1 [(api.body)="token"]; - string RefreshToken = 2 [(api.body)="refreshToken"]; - int64 UserId = 3 [(api.body)="userId"]; - string Username = 4 [(api.body)="username"]; - int32 SeqNo = 5 [(api.body)="seqNo"]; - int32 Gender = 6 [(api.body)="gender"]; -} - -// 注册请求 -message RegisterDefaultReq { - string Account = 1 [(api.body)="account", (api.vd)="$!=''"]; - string Password = 2 [(api.body)="password", (api.vd)="$!=''"]; -} - -// 注册响应 -message RegisterDefaultResp {} - -// 刷新 access token 请求 -message RefreshAccessTokenReq {} - -// 刷新 access token 响应 -message RefreshAccessTokenResp { - string AccessToken = 1 [(api.body)="accessToken"]; +message LoginResp { + // JWT + string token = 1 [(api.body)="token"]; + // 用户ID + int64 userId = 2 [(api.body)="userId"]; + // 昵称 + string username = 3 [(api.body)="username"]; + // 头像 + string avatar = 4 [(api.body)="avatar"]; } // 登录服务 service LoginService { - rpc LoginDefault(LoginDefaultReq) returns(LoginDefaultResp) { - option (api.post) = "/auth/login/default"; + rpc LoginQq(LoginQqReq) returns (LoginResp) { + option (api.post) = "/auth/login/qq"; } -} - -// 注册服务 -service RegisterService { - rpc RegisterDefault(RegisterDefaultReq) returns(RegisterDefaultResp) { - option (api.post) = "/auth/register/default"; - } -} - -// token 服务 -service TokenService { - rpc RefreshAccessToken(RefreshAccessTokenReq) returns(RefreshAccessTokenResp) { - option (api.get) = "/auth/refresh/token"; + rpc LoginWx(LoginWxReq) returns (LoginResp) { + option (api.post) = "/auth/login/wx"; } } diff --git a/code/allapp/allapp-go/idl/space/space.proto b/code/allapp/allapp-go/idl/space/space.proto index f5d584df..b638fa10 100644 --- a/code/allapp/allapp-go/idl/space/space.proto +++ b/code/allapp/allapp-go/idl/space/space.proto @@ -10,10 +10,6 @@ import "space/space_types.proto"; import "space/space_user_types.proto"; service SpaceService { - rpc CreateSpace(CreateSpaceParams) returns (CreateSpaceParams){ - option (api.post) = '/space/create'; - }; - rpc DissolveSpace(DissolveSpaceParams) returns (DissolveSpaceResult){ option (api.post) = '/space/dissolve'; }; diff --git a/code/allapp/allapp-go/utils/httpx/index.go b/code/allapp/allapp-go/utils/httpx/index.go new file mode 100644 index 00000000..6829b808 --- /dev/null +++ b/code/allapp/allapp-go/utils/httpx/index.go @@ -0,0 +1,165 @@ +package httpx + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "sync" + "time" + + "github.com/cloudwego/hertz/pkg/app/client" + "github.com/cloudwego/hertz/pkg/protocol" + "github.com/cloudwego/hertz/pkg/protocol/consts" +) + +var ( + once sync.Once + clientInstance *HertzClient +) + +// HertzClient 定义 +type HertzClient struct { + Client *client.Client + Timeout time.Duration + Header map[string]string +} + +// Init 初始化单例 +func Init() { + once.Do(func() { + c, _ := client.NewClient() + clientInstance = &HertzClient{ + Client: c, + Timeout: 5 * time.Second, + Header: make(map[string]string), + } + }) +} + +// SetHeader 设置默认 header +func SetHeader(key, value string) { + if clientInstance == nil { + Init() + } + clientInstance.Header[key] = value +} + +// 支持 value 为任意类型 +func buildQueryString(query map[string][]any) string { + if len(query) == 0 { + return "" + } + + values := url.Values{} + for k, arr := range query { + for _, v := range arr { + values.Add(k, fmt.Sprintf("%v", v)) // 自动转 string + } + } + return values.Encode() +} + +func Get(ctx context.Context, urlStr string, query map[string][]any) (int, string, error) { + if clientInstance == nil { + Init() + } + h := clientInstance + req := &protocol.Request{} + res := &protocol.Response{} + + req.Header.SetMethod(consts.MethodGet) + req.SetRequestURI(urlStr) + if qs := buildQueryString(query); qs != "" { + req.SetQueryString(qs) + } + + for k, v := range h.Header { + req.Header.Set(k, v) + } + + ctx, cancel := context.WithTimeout(ctx, h.Timeout) + defer cancel() + + err := h.Client.Do(ctx, req, res) + if err != nil { + return 0, "", err + } + + return res.StatusCode(), string(res.Body()), nil +} + +func PostJSON(ctx context.Context, urlStr string, query map[string][]any, payload any) (int, string, error) { + if clientInstance == nil { + Init() + } + h := clientInstance + req := &protocol.Request{} + res := &protocol.Response{} + + req.Header.SetMethod(consts.MethodPost) + req.Header.SetContentTypeBytes([]byte("application/json")) + req.SetRequestURI(urlStr) + if qs := buildQueryString(query); qs != "" { + req.SetQueryString(qs) + } + + data, err := json.Marshal(payload) + if err != nil { + return 0, "", fmt.Errorf("marshal json error: %w", err) + } + req.SetBody(data) + + for k, v := range h.Header { + req.Header.Set(k, v) + } + + ctx, cancel := context.WithTimeout(ctx, h.Timeout) + defer cancel() + + err = h.Client.Do(ctx, req, res) + if err != nil { + return 0, "", err + } + + return res.StatusCode(), string(res.Body()), nil +} + +func PostForm(ctx context.Context, urlStr string, query map[string][]any, form map[string]string) (int, string, error) { + if clientInstance == nil { + Init() + } + h := clientInstance + req := &protocol.Request{} + res := &protocol.Response{} + + req.Header.SetMethod(consts.MethodPost) + req.SetRequestURI(urlStr) + if qs := buildQueryString(query); qs != "" { + req.SetQueryString(qs) + } + + req.SetFormData(form) + + for k, v := range h.Header { + req.Header.Set(k, v) + } + + ctx, cancel := context.WithTimeout(ctx, h.Timeout) + defer cancel() + + err := h.Client.Do(ctx, req, res) + if err != nil { + return 0, "", err + } + + return res.StatusCode(), string(res.Body()), nil +} + +func JSONStringToMap(jsonStr string) (map[string]interface{}, error) { + var result map[string]interface{} + if err := json.Unmarshal([]byte(jsonStr), &result); err != nil { + return nil, err + } + return result, nil +} diff --git a/code/allapp/allapp-go/utils/index.go b/code/allapp/allapp-go/utils/index.go index f2de3a69..35a9b6f7 100644 --- a/code/allapp/allapp-go/utils/index.go +++ b/code/allapp/allapp-go/utils/index.go @@ -6,17 +6,22 @@ import ( ) // GenerateCode 生成指定长度的随机邀请码(大写字母+数字) -func GenerateCode(length int) (string, error) { +// 不会返回错误,如果随机失败,会自动重试 +func GenerateCode(length int) string { const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" code := make([]byte, length) for i := 0; i < length; i++ { - num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset)))) - if err != nil { - return "", err + for { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset)))) + if err != nil { + // 随机失败,重试 + continue + } + code[i] = charset[num.Int64()] + break } - code[i] = charset[num.Int64()] } - return string(code), nil + return string(code) } diff --git a/code/allapp/allapp-go/utils/jwtx/jwt.go b/code/allapp/allapp-go/utils/jwtx/jwt.go index ef76f7e7..a3133a60 100644 --- a/code/allapp/allapp-go/utils/jwtx/jwt.go +++ b/code/allapp/allapp-go/utils/jwtx/jwt.go @@ -13,16 +13,9 @@ type CustomClaims struct { jwt.RegisteredClaims } -type TokenResult struct { - Claims *CustomClaims - IsValid bool - IsExpired bool -} - type jwtManager struct { - secret string - accessExpiry time.Duration - refreshExpiry time.Duration + secret string + tokenExpiry time.Duration } var ( @@ -30,76 +23,59 @@ var ( once sync.Once ) -// InitJwt 初始化全局 JWT 配置,只能调用一次 +// InitJwt 初始化全局 JWT 配置 func InitJwt() { once.Do(func() { manager = &jwtManager{ - secret: conf.GetConf().JWT.Secret, - accessExpiry: conf.GetConf().JWT.AccessExpiry, - refreshExpiry: conf.GetConf().JWT.RefreshExpiry, + secret: conf.GetConf().JWT.Secret, + tokenExpiry: conf.GetConf().JWT.AccessExpiry, // 直接当唯一 token } }) } -// CreateAccessToken 全局函数创建 Access Token -func CreateAccessToken(userID int64) (string, error) { - return manager.createToken(userID, manager.accessExpiry) +// CreateToken 创建 JWT +func CreateToken(userID int64) (string, error) { + if manager == nil { + return "", jwt.ErrTokenInvalidClaims + } + return manager.createToken(userID) } -// CreateRefreshToken 全局函数创建 Refresh Token -func CreateRefreshToken(userID int64) (string, error) { - return manager.createToken(userID, manager.refreshExpiry) -} - -// VerifyToken 全局函数验证 Token -func VerifyToken(tokenString string) TokenResult { - result := TokenResult{IsValid: false, IsExpired: false} - +// VerifyToken 校验 JWT(合法 or 不合法) +func VerifyToken(tokenString string) (*CustomClaims, bool) { if tokenString == "" || manager == nil { - return result + return nil, false } token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(manager.secret), nil }) - if token == nil { - return result + if err != nil || !token.Valid { + return nil, false } claims, ok := token.Claims.(*CustomClaims) if !ok { - return result + return nil, false } - if err != nil || !token.Valid { - return result - } - - result.Claims = claims - result.IsValid = true - if claims.ExpiresAt != nil && time.Now().After(claims.ExpiresAt.Time) { - result.IsExpired = true - } - return result + return claims, true } -// 内部方法,生成 Token -func (j *jwtManager) createToken(userID int64, expiry time.Duration) (string, error) { +func (j *jwtManager) createToken(userID int64) (string, error) { + now := time.Now() + claims := &CustomClaims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ - IssuedAt: jwt.NewNumericDate(time.Now()), + IssuedAt: jwt.NewNumericDate(now), }, } - switch { - case expiry > 0: - claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(expiry)) - case expiry == -1: - claims.ExpiresAt = nil // 永不过期 - default: - claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(time.Hour)) + // 只有大于 0 才设置过期时间 + if j.tokenExpiry > 0 { + claims.ExpiresAt = jwt.NewNumericDate(now.Add(j.tokenExpiry)) } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) diff --git a/code/allapp/allapp-go/utils/pgtypex/pgtypex.go b/code/allapp/allapp-go/utils/pgtypex/pgtypex.go index d981dbb6..2c04b123 100644 --- a/code/allapp/allapp-go/utils/pgtypex/pgtypex.go +++ b/code/allapp/allapp-go/utils/pgtypex/pgtypex.go @@ -135,3 +135,10 @@ func DateToString(d pgtype.Date) string { } return d.Time.Format("2006-01-02") } + +func Int32ToPgInt4(value int32) pgtype.Int4 { + return pgtype.Int4{ + Int32: value, + Valid: true, + } +} diff --git a/code/allapp/allapp-rn/.env b/code/allapp/allapp-rn/.env new file mode 100644 index 00000000..511c27a4 --- /dev/null +++ b/code/allapp/allapp-rn/.env @@ -0,0 +1 @@ +EXPO_PUBLIC_QQ_ID=102826474 \ No newline at end of file diff --git a/code/allapp/allapp-rn/app.json b/code/allapp/allapp-rn/app.json index 8b1b44e1..26c0d9f3 100644 --- a/code/allapp/allapp-rn/app.json +++ b/code/allapp/allapp-rn/app.json @@ -9,7 +9,8 @@ "newArchEnabled": true, "scheme": [ "oneao", - "tencent102826474" + "tencent102826474", + "wxdab3e21a1f7e392f" ], "splash": { "image": "./assets/splash-icon.png", @@ -32,6 +33,7 @@ "favicon": "./assets/favicon.png" }, "plugins": [ + "./plugins/withAndroidSignature", "expo-router", "expo-font", [ @@ -39,6 +41,16 @@ { "appId": "102826474" } + ], + "expo-wechat", + [ + "expo-build-properties", + { + "android": { + "usesCleartextTraffic": true, + "extraProguardRules": "-keep class com.tencent.mm.opensdk.** { *; }\n-keep class com.tencent.wxop.** { *; }\n-keep class com.tencent.mm.sdk.** { *; }" + } + } ] ] } diff --git a/code/allapp/allapp-rn/babel.config.js b/code/allapp/allapp-rn/babel.config.js index c771c108..275b9697 100644 --- a/code/allapp/allapp-rn/babel.config.js +++ b/code/allapp/allapp-rn/babel.config.js @@ -4,17 +4,6 @@ module.exports = function (api) { presets: [ ['babel-preset-expo', { jsxImportSource: 'nativewind' }], 'nativewind/babel', - ], - plugins: [ - [ - 'module-resolver', - { - root: ['./src'], - alias: { - '@': './src', - }, - }, - ], - ], + ] } } diff --git a/code/allapp/allapp-rn/credentials/credentials.json b/code/allapp/allapp-rn/credentials/credentials.json new file mode 100644 index 00000000..4f43db65 --- /dev/null +++ b/code/allapp/allapp-rn/credentials/credentials.json @@ -0,0 +1,17 @@ +{ + "android": { + "keystore": { + "keystorePath": "credentials/oneao-android.keystore", + "keystorePassword": "zhang520..", + "keyAlias": "oneao-android", + "keyPassword": "zhang520.." + } + }, + "ios": { + "provisioningProfilePath": "ios/certs/profile.mobileprovision", + "distributionCertificate": { + "path": "ios/certs/dist-cert.p12", + "password": "password" + } + } +} diff --git a/code/allapp/allapp-rn/credentials/oneao-android.keystore b/code/allapp/allapp-rn/credentials/oneao-android.keystore new file mode 100644 index 0000000000000000000000000000000000000000..05b3583cf176c68ca217e89834dcc5f132920e4f GIT binary patch literal 2253 zcmciDc{J1u8wc?D%_=oimPE=rBr#-H*|LPeSc+^>ldNNHWH)sgC0n*3Mo6+|D>6#T zHoRRT&DbJIgUOb$kJq{9z4zR6`v3jo`RDW3bH3+$o`=KYus|RXcyEBe28s8>x#3T{ z`CSjhdtTquT&A_NEC>Vxqlr)sng`B(3JyR4Iq)F>fPtVy=&aQ$p}BaA=_4I9oINQI zmm$YqM7tN&Nb$Y#CKqKvwkJwm7~N8+H&5@MB8d_L7wWLMUTEVJ;%)u_`Sa2p2}J{W z*xioZtmIE7c+06HQo{)Qd{ioHN~mjpdDFD-&k5bC$}PEBR#Rd>H$wAEl(N_5MgwGk zzb&Oo!-{X?QH=n`tM}E_!BmI>?dX_82p>Cij>igB66Ro9Arx4;G%DM(Du+0=*`%vE za0q6wv~-RUSr|h;^FblfX`HE0Kq zyn9NOv`)HlVln!;rdyszbzQlM)dAO|YlQYC*_==<2|t|mCw+$ykq7dQGegvGP#I6( z3Dr`uOltV}n9q(yiCVx|Vu&%;79*lQ%7M8ok7Tnf)S4H&tMfuotNMHcl4YRmLyeu4 z^V6Q9+TH0rf|hd0`}gz z|J<8;cB-bT!9hC+!B^isGS^Mfw(Tr9`e%qIckcm&~2jURd@2M=$i$UmTL-Z?yM zXDkz(cWdF^9p}MoX7t;vrkT6cDr@X3Y%Sk%+SfH}?naFOu#9WZ~f?x3QSi0L&8!fK5jAJ2IkfKJW@ykB+{UNF)Ln1}#%4VOh2Qiud^ zXkwYkC%RD!M+;`Y<(S&o@8D?cI8}hmaEGWn4YM=XXM5@gRhqvouLM+Yz<(I7xVDQW z4uTFO$)`UJ3y;ASRD_~hD(Z7h!^b1kg8N7ZzdGYqMy;Ko2HYy?;Z7GRZ9_w|;Dg=P zk^f0h9g5*UjFUGI&lvt$%6cZ)E3fAHt2nx*@m;D)kHUSIxX|N}hK_m_7w5Iq~Dr#%=j1d(>eQmcoL3I?<_#i!|@{-q_N($yp z<{zwY-QgUxi<+qG)&5+LebiPP)%KTJ6^9ZZEs(?RLl$?|6ewDCx?BwuTIA;mO zrn!4tq&xPL(iU?PS9FXltN(CmHJ-Df6oGwsP1nEDG)~eP-H1GtcFOK?!sE*Yb3s|N zeK8y^MFYZ|*Ygk$=FsDNvx^(uuB{u>X$OCiXgGH{R>{v|WarxZ!}_)4OI%@Ylg{z) zCAiMV$Tn5-G#yd0_z8`YC_gzI=M|f-&`GhcG>S%HmOO;Fy;UFXGP6DE&*ckp%!bg# zln(+nMw1&0dILX>iF5^YTphY8!^r%$E8mbmZ%)6Ss9-Xq&rs*m%E5hxU}<%KvshE)7<KU|}68eAef8K`( zNc=mHy?+5A0=ytJ5#RvQVVve zwxljS25_0uyHeTA07C!}P$Z5%ffn8Ch$s(K5X!F&v!sadgvP&?p96L1CBX- z>iL)hyCo~&)&49Y!GpNTotkzjgcFj}NFJX?K*e5a_Zcyy$uj zV>0F$Yao9|!pUG { + if (config.modResults.language === 'groovy') { + config.modResults.contents = setAndroidSignature(config.modResults.contents) + } + else { + throw new Error('如果不是 groovy,则无法在 app/build.gradle 中设置 signingConfigs') + } + return config + }) +} + +function setAndroidSignature(appBuildGradle) { + if (!fs.existsSync(path.resolve(__dirname, '../credentials/credentials.json'))) { + console.warn('警告:没有设置正式版本的 Android Keystore 文件,因为 credentials.json 不存在。') + return appBuildGradle + } + const info = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../credentials/credentials.json'), { encoding: 'utf8' })) + + // 使用正则表达式插入签名信息 + let output = appBuildGradle.replace( + /(signingConfigs\s*\{)/, + `$1 + release { + storeFile file(${JSON.stringify(path.resolve(__dirname, '../credentials/oneao-android.keystore'))}) + storePassword ${JSON.stringify(info.android.keystore.keystorePassword)} + keyAlias ${JSON.stringify(info.android.keystore.keyAlias)} + keyPassword ${JSON.stringify(info.android.keystore.keyPassword)} + }`, + ) + + // 使用正则表达式替换 signingConfig + output = output.replace( + /(release\s*\{)[^}]*?signingConfig\s+signingConfigs\.debug/, + `$1 + signingConfig signingConfigs.release +`, + ) + + return output +} diff --git a/code/allapp/allapp-rn/pnpm-lock.yaml b/code/allapp/allapp-rn/pnpm-lock.yaml index f559fdea..92b49902 100644 --- a/code/allapp/allapp-rn/pnpm-lock.yaml +++ b/code/allapp/allapp-rn/pnpm-lock.yaml @@ -29,14 +29,8 @@ importers: '@react-native-async-storage/async-storage': specifier: 2.2.0 version: 2.2.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - '@react-native-community/datetimepicker': - specifier: 8.4.4 - version: 8.4.4(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@react-native-segmented-control/segmented-control': - specifier: 2.5.7 - version: 2.5.7(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@react-navigation/drawer': - specifier: ^7.7.9 + specifier: ^7.5.0 version: 7.7.9(@react-navigation/native@7.1.19(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@yz1311/react-native-wheel-picker': specifier: ^0.4.5 @@ -54,44 +48,47 @@ importers: specifier: ^1.11.19 version: 1.11.19 expo: - specifier: ~54.0.23 - version: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + specifier: ~54.0.32 + version: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-blur: - specifier: ~15.0.7 - version: 15.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + specifier: ~15.0.8 + version: 15.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-build-properties: + specifier: ~1.0.10 + version: 1.0.10(expo@54.0.32) expo-clipboard: - specifier: ~8.0.7 - version: 8.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-constants: - specifier: ~18.0.10 - version: 18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - expo-font: - specifier: ~14.0.9 - version: 14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-linear-gradient: - specifier: ~15.0.7 - version: 15.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-linking: specifier: ~8.0.8 - version: 8.0.8(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 8.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: + specifier: ~18.0.13 + version: 18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + expo-font: + specifier: ~14.0.11 + version: 14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-linear-gradient: + specifier: ~15.0.8 + version: 15.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-linking: + specifier: ~8.0.11 + version: 8.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-qq: - specifier: ^0.1.5 - version: 0.1.5(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + specifier: ^0.1.6 + version: 0.1.6(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-router: - specifier: ~6.0.17 - version: 6.0.17(349aaac499003fc399e184fbbadde92f) + specifier: ~6.0.22 + version: 6.0.22(9f92a432648b6fec77143fe8d4a0fa6a) expo-splash-screen: - specifier: ~31.0.10 - version: 31.0.10(expo@54.0.23) + specifier: ~31.0.13 + version: 31.0.13(expo@54.0.32) expo-status-bar: - specifier: ~3.0.8 - version: 3.0.8(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + specifier: ~3.0.9 + version: 3.0.9(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-wechat: + specifier: ^0.2.6 + version: 0.2.6(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) lucide-react-native: specifier: ^0.510.0 version: 0.510.0(react-native-svg@15.12.1(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - moment: - specifier: ^2.30.1 - version: 2.30.1 nativewind: specifier: ^4.2.1 version: 4.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.12.1(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(yaml@2.8.1)) @@ -156,6 +153,9 @@ importers: '@antfu/eslint-config': specifier: ^6.2.0 version: 6.2.0(@vue/compiler-sfc@3.5.24)(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@babel/plugin-transform-react-jsx': + specifier: ^7.28.6 + version: 7.28.6(@babel/core@7.28.5) '@types/big.js': specifier: ^6.2.2 version: 6.2.2 @@ -165,6 +165,9 @@ importers: babel-plugin-module-resolver: specifier: ^5.0.2 version: 5.0.2 + babel-preset-expo: + specifier: ^54.0.10 + version: 54.0.10(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.32)(react-refresh@0.14.2) baseline-browser-mapping: specifier: ^2.9.14 version: 2.9.14 @@ -272,6 +275,10 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.5': resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} @@ -284,6 +291,10 @@ packages: resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -321,6 +332,10 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} @@ -335,6 +350,10 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.27.1': resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} @@ -380,6 +399,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-decorators@7.28.0': resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} engines: {node: '>=6.9.0'} @@ -458,6 +482,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -680,8 +710,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -760,14 +790,26 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.5': resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -847,8 +889,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@expo/cli@54.0.16': - resolution: {integrity: sha512-hY/OdRaJMs5WsVPuVSZ+RLH3VObJmL/pv5CGCHEZHN2PxZjSZSdctyKV8UcFBXTF0yIKNAJ9XLs1dlNYXHh4Cw==} + '@expo/cli@54.0.22': + resolution: {integrity: sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==} hasBin: true peerDependencies: expo: '*' @@ -860,23 +902,23 @@ packages: react-native: optional: true - '@expo/code-signing-certificates@0.0.5': - resolution: {integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==} + '@expo/code-signing-certificates@0.0.6': + resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} - '@expo/config-plugins@54.0.2': - resolution: {integrity: sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==} + '@expo/config-plugins@54.0.4': + resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==} - '@expo/config-types@54.0.8': - resolution: {integrity: sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==} + '@expo/config-types@54.0.10': + resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} - '@expo/config@12.0.10': - resolution: {integrity: sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==} + '@expo/config@12.0.13': + resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} - '@expo/devcert@1.2.0': - resolution: {integrity: sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==} + '@expo/devcert@1.2.1': + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} - '@expo/devtools@0.1.7': - resolution: {integrity: sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==} + '@expo/devtools@0.1.8': + resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==} peerDependencies: react: '*' react-native: '*' @@ -886,32 +928,24 @@ packages: react-native: optional: true - '@expo/env@2.0.7': - resolution: {integrity: sha512-BNETbLEohk3HQ2LxwwezpG8pq+h7Fs7/vAMP3eAtFT1BCpprLYoBBFZH7gW4aqGfqOcVP4Lc91j014verrYNGg==} + '@expo/env@2.0.8': + resolution: {integrity: sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==} - '@expo/fingerprint@0.15.3': - resolution: {integrity: sha512-8YPJpEYlmV171fi+t+cSLMX1nC5ngY9j2FiN70dHldLpd6Ct6ouGhk96svJ4BQZwsqwII2pokwzrDAwqo4Z0FQ==} + '@expo/fingerprint@0.15.4': + resolution: {integrity: sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==} hasBin: true '@expo/html-elements@0.12.5': resolution: {integrity: sha512-28KWO88YKykKU7ke5sEQs5TivFRMs1Aktz13xxgqAf5rTgb+lka0VKVt3W2fG7ksbUQ407rtUqz7SEAq298NvQ==} - '@expo/image-utils@0.8.7': - resolution: {integrity: sha512-SXOww4Wq3RVXLyOaXiCCuQFguCDh8mmaHBv54h/R29wGl4jRY8GEyQEx8SypV/iHt1FbzsU/X3Qbcd9afm2W2w==} + '@expo/image-utils@0.8.8': + resolution: {integrity: sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==} - '@expo/json-file@10.0.7': - resolution: {integrity: sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==} + '@expo/json-file@10.0.8': + resolution: {integrity: sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==} - '@expo/mcp-tunnel@0.1.0': - resolution: {integrity: sha512-rJ6hl0GnIZj9+ssaJvFsC7fwyrmndcGz+RGFzu+0gnlm78X01957yjtHgjcmnQAgL5hWEOR6pkT0ijY5nU5AWw==} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.13.2 - peerDependenciesMeta: - '@modelcontextprotocol/sdk': - optional: true - - '@expo/metro-config@54.0.9': - resolution: {integrity: sha512-CRI4WgFXrQ2Owyr8q0liEBJveUIF9DcYAKadMRsJV7NxGNBdrIIKzKvqreDfsGiRqivbLsw6UoNb3UE7/SvPfg==} + '@expo/metro-config@54.0.14': + resolution: {integrity: sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==} peerDependencies: expo: '*' peerDependenciesMeta: @@ -929,27 +963,24 @@ packages: react-dom: optional: true - '@expo/metro@54.1.0': - resolution: {integrity: sha512-MgdeRNT/LH0v1wcO0TZp9Qn8zEF0X2ACI0wliPtv5kXVbXWI+yK9GyrstwLAiTXlULKVIg3HVSCCvmLu0M3tnw==} + '@expo/metro@54.2.0': + resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==} - '@expo/osascript@2.3.7': - resolution: {integrity: sha512-IClSOXxR0YUFxIriUJVqyYki7lLMIHrrzOaP01yxAL1G8pj2DWV5eW1y5jSzIcIfSCNhtGsshGd1tU/AYup5iQ==} + '@expo/osascript@2.3.8': + resolution: {integrity: sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==} engines: {node: '>=12'} - '@expo/package-manager@1.9.8': - resolution: {integrity: sha512-4/I6OWquKXYnzo38pkISHCOCOXxfeEmu4uDoERq1Ei/9Ur/s9y3kLbAamEkitUkDC7gHk1INxRWEfFNzGbmOrA==} + '@expo/package-manager@1.9.10': + resolution: {integrity: sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==} - '@expo/plist@0.4.7': - resolution: {integrity: sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==} + '@expo/plist@0.4.8': + resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} - '@expo/prebuild-config@54.0.6': - resolution: {integrity: sha512-xowuMmyPNy+WTNq+YX0m0EFO/Knc68swjThk4dKivgZa8zI1UjvFXOBIOp8RX4ljCXLzwxQJM5oBBTvyn+59ZA==} + '@expo/prebuild-config@54.0.8': + resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==} peerDependencies: expo: '*' - '@expo/schema-utils@0.1.7': - resolution: {integrity: sha512-jWHoSuwRb5ZczjahrychMJ3GWZu54jK9ulNdh1d4OzAEq672K9E5yOlnlBsfIHWHGzUAT+0CL7Yt1INiXTz68g==} - '@expo/schema-utils@0.1.8': resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==} @@ -1044,6 +1075,14 @@ packages: '@internationalized/string@3.2.7': resolution: {integrity: sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1648,25 +1687,6 @@ packages: peerDependencies: react-native: ^0.0.0-0 || >=0.65 <1.0 - '@react-native-community/datetimepicker@8.4.4': - resolution: {integrity: sha512-bc4ZixEHxZC9/qf5gbdYvIJiLZ5CLmEsC3j+Yhe1D1KC/3QhaIfGDVdUcid0PdlSoGOSEq4VlB93AWyetEyBSQ==} - peerDependencies: - expo: '>=52.0.0' - react: '*' - react-native: '*' - react-native-windows: '*' - peerDependenciesMeta: - expo: - optional: true - react-native-windows: - optional: true - - '@react-native-segmented-control/segmented-control@2.5.7': - resolution: {integrity: sha512-l84YeVX8xAU3lvOJSvV4nK/NbGhIm2gBfveYolwaoCbRp+/SLXtc6mYrQmM9ScXNwU14mnzjQTpTHWl5YPnkzQ==} - peerDependencies: - react: '>=16.0' - react-native: '>=0.62' - '@react-native/assets-registry@0.81.5': resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} engines: {node: '>= 20.19.4'} @@ -2356,6 +2376,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alova@3.3.4: resolution: {integrity: sha512-UKKqXdvf8aQ4C7m3brO77YWe5CDz8N59PdAUz7M8gowKUUXTutbk0Vk5DRBrCe0hMUyyNMUhdCZ38llGxCViyQ==} engines: {node: '>= 18.0.0'} @@ -2491,8 +2514,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-expo@54.0.7: - resolution: {integrity: sha512-JENWk0bvxW4I1ftveO8GRtX2t2TH6N4Z0TPvIHxroZ/4SswUfyNsUNbbP7Fm4erj3ar/JHGri5kTZ+s3xdjHZw==} + babel-preset-expo@54.0.10: + resolution: {integrity: sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==} peerDependencies: '@babel/runtime': ^7.20.0 expo: '*' @@ -3260,91 +3283,96 @@ packages: exec-async@2.2.0: resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} - expo-asset@12.0.9: - resolution: {integrity: sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==} + expo-asset@12.0.12: + resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-blur@15.0.7: - resolution: {integrity: sha512-SugQQbQd+zRPy8z2G5qDD4NqhcD7srBF7fN7O7yq6q7ZFK59VWvpDxtMoUkmSfdxgqONsrBN/rLdk00USADrMg==} + expo-blur@15.0.8: + resolution: {integrity: sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-clipboard@8.0.7: - resolution: {integrity: sha512-zvlfFV+wB2QQrQnHWlo0EKHAkdi2tycLtE+EXFUWTPZYkgu1XcH+aiKfd4ul7Z0SDF+1IuwoiW9AA9eO35aj3Q==} + expo-build-properties@1.0.10: + resolution: {integrity: sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q==} + peerDependencies: + expo: '*' + + expo-clipboard@8.0.8: + resolution: {integrity: sha512-VKoBkHIpZZDJTB0jRO4/PZskHdMNOEz3P/41tmM6fDuODMpqhvyWK053X0ebspkxiawJX9lX33JXHBCvVsTTOA==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-constants@18.0.10: - resolution: {integrity: sha512-Rhtv+X974k0Cahmvx6p7ER5+pNhBC0XbP1lRviL2J1Xl4sT2FBaIuIxF/0I0CbhOsySf0ksqc5caFweAy9Ewiw==} + expo-constants@18.0.13: + resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==} peerDependencies: expo: '*' react-native: '*' - expo-file-system@19.0.17: - resolution: {integrity: sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==} + expo-file-system@19.0.21: + resolution: {integrity: sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==} peerDependencies: expo: '*' react-native: '*' - expo-font@14.0.9: - resolution: {integrity: sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==} + expo-font@14.0.11: + resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-keep-awake@15.0.7: - resolution: {integrity: sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==} + expo-keep-awake@15.0.8: + resolution: {integrity: sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==} peerDependencies: expo: '*' react: '*' - expo-linear-gradient@15.0.7: - resolution: {integrity: sha512-yF+y+9Shpr/OQFfy/wglB/0bykFMbwHBTuMRa5Of/r2P1wbkcacx8rg0JsUWkXH/rn2i2iWdubyqlxSJa3ggZA==} + expo-linear-gradient@15.0.8: + resolution: {integrity: sha512-V2d8Wjn0VzhPHO+rrSBtcl+Fo+jUUccdlmQ6OoL9/XQB7Qk3d9lYrqKDJyccwDxmQT10JdST3Tmf2K52NLc3kw==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-linking@8.0.8: - resolution: {integrity: sha512-MyeMcbFDKhXh4sDD1EHwd0uxFQNAc6VCrwBkNvvvufUsTYFq3glTA9Y8a+x78CPpjNqwNAamu74yIaIz7IEJyg==} + expo-linking@8.0.11: + resolution: {integrity: sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==} peerDependencies: react: '*' react-native: '*' - expo-modules-autolinking@3.0.21: - resolution: {integrity: sha512-pOtPDLln3Ju8DW1zRW4OwZ702YqZ8g+kM/tEY1sWfv22kWUtxkvK+ytRDRpRdnKEnC28okbhWqeMnmVkSFzP6Q==} + expo-modules-autolinking@3.0.24: + resolution: {integrity: sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==} hasBin: true - expo-modules-core@3.0.25: - resolution: {integrity: sha512-0P8PT8UV6c5/+p8zeVM/FXvBgn/ErtGcMaasqUgbzzBUg94ktbkIrij9t9reGCrir03BYt/Bcpv+EQtYC8JOug==} + expo-modules-core@3.0.29: + resolution: {integrity: sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==} peerDependencies: react: '*' react-native: '*' - expo-qq@0.1.5: - resolution: {integrity: sha512-wEL+QOJpjSIJ0QdHcl726elSnIZryt/0QpVuZhcY5h9Iaq5iGMssdgRQtk2aCyvMhFnUpGxP9ckVSJsqcUvwgg==} + expo-qq@0.1.6: + resolution: {integrity: sha512-aHy6J/qJOQmFb7X+IazakPYcrUWxIwfyo8qoNTFCsje5sp8t+10R2hFV9fZTEwEjrW75TK2LoOyxcFvoXjK4FQ==} peerDependencies: expo: '*' react: '*' react-native: '*' - expo-router@6.0.17: - resolution: {integrity: sha512-2n0lTidH2H+dOjk/Lu+krKIgK7b1qQ3O/9RWmf9P5IEuFiu7BSUgSDc+g69bUEElTnca8FR+zPTyk15kMXHrXg==} + expo-router@6.0.22: + resolution: {integrity: sha512-6eOwobaVZQRsSQv0IoWwVlPbJru1zbreVsuPFIWwk7HApENStU2MggrceHXJqXjGho+FKeXxUop/gqOFDzpOMg==} peerDependencies: '@expo/metro-runtime': ^6.1.2 '@react-navigation/drawer': ^7.5.0 '@testing-library/react-native': '>= 12.0.0' expo: '*' - expo-constants: ^18.0.11 - expo-linking: ^8.0.10 + expo-constants: ^18.0.13 + expo-linking: ^8.0.11 react: '*' react-dom: '*' react-native: '*' @@ -3353,7 +3381,7 @@ packages: react-native-safe-area-context: '>= 5.4.0' react-native-screens: '*' react-native-web: '*' - react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 + react-server-dom-webpack: ~19.0.3 || ~19.1.4 || ~19.2.3 peerDependenciesMeta: '@react-navigation/drawer': optional: true @@ -3370,27 +3398,30 @@ packages: react-server-dom-webpack: optional: true - expo-server@1.0.4: - resolution: {integrity: sha512-IN06r3oPxFh3plSXdvBL7dx0x6k+0/g0bgxJlNISs6qL5Z+gyPuWS750dpTzOeu37KyBG0RcyO9cXUKzjYgd4A==} - engines: {node: '>=20.16.0'} - expo-server@1.0.5: resolution: {integrity: sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==} engines: {node: '>=20.16.0'} - expo-splash-screen@31.0.10: - resolution: {integrity: sha512-i6g9IK798mae4yvflstQ1HkgahIJ6exzTCTw4vEdxV0J2SwiW3Tj+CwRjf0te7Zsb+7dDQhBTmGZwdv00VER2A==} + expo-splash-screen@31.0.13: + resolution: {integrity: sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==} peerDependencies: expo: '*' - expo-status-bar@3.0.8: - resolution: {integrity: sha512-L248XKPhum7tvREoS1VfE0H6dPCaGtoUWzRsUv7hGKdiB4cus33Rc0sxkWkoQ77wE8stlnUlL5lvmT0oqZ3ZBw==} + expo-status-bar@3.0.9: + resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==} peerDependencies: react: '*' react-native: '*' - expo@54.0.23: - resolution: {integrity: sha512-b4uQoiRwQ6nwqsT2709RS15CWYNGF3eJtyr1KyLw9WuMAK7u4jjofkhRiO0+3o1C2NbV+WooyYTOZGubQQMBaQ==} + expo-wechat@0.2.6: + resolution: {integrity: sha512-hLWFPDqSKwEgG8Jm0cTthyQftD/ip9xjJLQUEd+fJJVq8YEiEt0gJCCgCEMbr1SrEjoK4TUlkG/HETZobNReuQ==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo@54.0.32: + resolution: {integrity: sha512-yL9eTxiQ/QKKggVDAWO5CLjUl6IS0lPYgEvC3QM4q4fxd6rs7ks3DnbXSGVU3KNFoY/7cRNYihvd0LKYP+MCXA==} hasBin: true peerDependencies: '@expo/dom-webview': '*' @@ -3425,6 +3456,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -3594,6 +3628,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3878,6 +3916,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4101,6 +4142,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4189,117 +4234,59 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - metro-babel-transformer@0.83.2: - resolution: {integrity: sha512-rirY1QMFlA1uxH3ZiNauBninwTioOgwChnRdDcbB4tgRZ+bGX9DiXoh9QdpppiaVKXdJsII932OwWXGGV4+Nlw==} - engines: {node: '>=20.19.4'} - metro-babel-transformer@0.83.3: resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} - metro-cache-key@0.83.2: - resolution: {integrity: sha512-3EMG/GkGKYoTaf5RqguGLSWRqGTwO7NQ0qXKmNBjr0y6qD9s3VBXYlwB+MszGtmOKsqE9q3FPrE5Nd9Ipv7rZw==} - engines: {node: '>=20.19.4'} - metro-cache-key@0.83.3: resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} engines: {node: '>=20.19.4'} - metro-cache@0.83.2: - resolution: {integrity: sha512-Z43IodutUZeIS7OTH+yQFjc59QlFJ6s5OvM8p2AP9alr0+F8UKr8ADzFzoGKoHefZSKGa4bJx7MZJLF6GwPDHQ==} - engines: {node: '>=20.19.4'} - metro-cache@0.83.3: resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} engines: {node: '>=20.19.4'} - metro-config@0.83.2: - resolution: {integrity: sha512-1FjCcdBe3e3D08gSSiU9u3Vtxd7alGH3x/DNFqWDFf5NouX4kLgbVloDDClr1UrLz62c0fHh2Vfr9ecmrOZp+g==} - engines: {node: '>=20.19.4'} - metro-config@0.83.3: resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} engines: {node: '>=20.19.4'} - metro-core@0.83.2: - resolution: {integrity: sha512-8DRb0O82Br0IW77cNgKMLYWUkx48lWxUkvNUxVISyMkcNwE/9ywf1MYQUE88HaKwSrqne6kFgCSA/UWZoUT0Iw==} - engines: {node: '>=20.19.4'} - metro-core@0.83.3: resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} engines: {node: '>=20.19.4'} - metro-file-map@0.83.2: - resolution: {integrity: sha512-cMSWnEqZrp/dzZIEd7DEDdk72PXz6w5NOKriJoDN9p1TDQ5nAYrY2lHi8d6mwbcGLoSlWmpPyny9HZYFfPWcGQ==} - engines: {node: '>=20.19.4'} - metro-file-map@0.83.3: resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} engines: {node: '>=20.19.4'} - metro-minify-terser@0.83.2: - resolution: {integrity: sha512-zvIxnh7U0JQ7vT4quasKsijId3dOAWgq+ip2jF/8TMrPUqQabGrs04L2dd0haQJ+PA+d4VvK/bPOY8X/vL2PWw==} - engines: {node: '>=20.19.4'} - metro-minify-terser@0.83.3: resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} engines: {node: '>=20.19.4'} - metro-resolver@0.83.2: - resolution: {integrity: sha512-Yf5mjyuiRE/Y+KvqfsZxrbHDA15NZxyfg8pIk0qg47LfAJhpMVEX+36e6ZRBq7KVBqy6VDX5Sq55iHGM4xSm7Q==} - engines: {node: '>=20.19.4'} - metro-resolver@0.83.3: resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} engines: {node: '>=20.19.4'} - metro-runtime@0.83.2: - resolution: {integrity: sha512-nnsPtgRvFbNKwemqs0FuyFDzXLl+ezuFsUXDbX8o0SXOfsOPijqiQrf3kuafO1Zx1aUWf4NOrKJMAQP5EEHg9A==} - engines: {node: '>=20.19.4'} - metro-runtime@0.83.3: resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} engines: {node: '>=20.19.4'} - metro-source-map@0.83.2: - resolution: {integrity: sha512-5FL/6BSQvshIKjXOennt9upFngq2lFvDakZn5LfauIVq8+L4sxXewIlSTcxAtzbtjAIaXeOSVMtCJ5DdfCt9AA==} - engines: {node: '>=20.19.4'} - metro-source-map@0.83.3: resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} engines: {node: '>=20.19.4'} - metro-symbolicate@0.83.2: - resolution: {integrity: sha512-KoU9BLwxxED6n33KYuQQuc5bXkIxF3fSwlc3ouxrrdLWwhu64muYZNQrukkWzhVKRNFIXW7X2iM8JXpi2heIPw==} - engines: {node: '>=20.19.4'} - hasBin: true - metro-symbolicate@0.83.3: resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==} engines: {node: '>=20.19.4'} hasBin: true - metro-transform-plugins@0.83.2: - resolution: {integrity: sha512-5WlW25WKPkiJk2yA9d8bMuZrgW7vfA4f4MBb9ZeHbTB3eIAoNN8vS8NENgG/X/90vpTB06X66OBvxhT3nHwP6A==} - engines: {node: '>=20.19.4'} - metro-transform-plugins@0.83.3: resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} - metro-transform-worker@0.83.2: - resolution: {integrity: sha512-G5DsIg+cMZ2KNfrdLnWMvtppb3+Rp1GMyj7Bvd9GgYc/8gRmvq1XVEF9XuO87Shhb03kFhGqMTgZerz3hZ1v4Q==} - engines: {node: '>=20.19.4'} - metro-transform-worker@0.83.3: resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} - metro@0.83.2: - resolution: {integrity: sha512-HQgs9H1FyVbRptNSMy/ImchTTE5vS2MSqLoOo7hbDoBq6hPPZokwJvBMwrYSxdjQZmLXz2JFZtdvS+ZfgTc9yw==} - engines: {node: '>=20.19.4'} - hasBin: true - metro@0.83.3: resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==} engines: {node: '>=20.19.4'} @@ -4417,6 +4404,10 @@ packages: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4508,8 +4499,8 @@ packages: encoding: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} node-int64@0.4.0: @@ -4532,10 +4523,6 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - ob1@0.83.2: - resolution: {integrity: sha512-XlK3w4M+dwd1g1gvHzVbxiXEbUllRONEgcF2uEO0zm4nxa0eKlh41c6N65q1xbiDOeKKda1tvNOAD33fNjyvCg==} - engines: {node: '>=20.19.4'} - ob1@0.83.3: resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} engines: {node: '>=20.19.4'} @@ -4668,6 +4655,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5386,6 +5377,11 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5442,6 +5438,7 @@ packages: tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} @@ -5834,14 +5831,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.6: - resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} - peerDependencies: - zod: ^3.24.1 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zustand@5.0.8: resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} engines: {node: '>=12.20.0'} @@ -5938,6 +5927,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.5': {} '@babel/core@7.28.5': @@ -5963,14 +5958,22 @@ snapshots: '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -6015,8 +6018,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -6027,6 +6030,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -6038,16 +6048,18 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -6056,14 +6068,14 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -6075,16 +6087,16 @@ snapshots: '@babel/helper-wrap-function@7.28.3': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/highlight@7.25.9': dependencies: @@ -6095,7 +6107,11 @@ snapshots: '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': dependencies: @@ -6171,6 +6187,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -6226,7 +6247,7 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -6276,13 +6297,13 @@ snapshots: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -6310,7 +6331,7 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -6355,7 +6376,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -6402,7 +6423,7 @@ snapshots: '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) transitivePeerDependencies: - supports-color @@ -6416,14 +6437,14 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/types': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -6496,7 +6517,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: @@ -6519,7 +6540,13 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@babel/traverse@7.28.5': dependencies: @@ -6533,11 +6560,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 @@ -6643,24 +6687,23 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@expo/cli@54.0.16(expo-router@6.0.17)(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))': + '@expo/cli@54.0.22(expo-router@6.0.22)(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))': dependencies: '@0no-co/graphql.web': 1.2.0 - '@expo/code-signing-certificates': 0.0.5 - '@expo/config': 12.0.10 - '@expo/config-plugins': 54.0.2 - '@expo/devcert': 1.2.0 - '@expo/env': 2.0.7 - '@expo/image-utils': 0.8.7 - '@expo/json-file': 10.0.7 - '@expo/mcp-tunnel': 0.1.0 - '@expo/metro': 54.1.0 - '@expo/metro-config': 54.0.9(expo@54.0.23) - '@expo/osascript': 2.3.7 - '@expo/package-manager': 1.9.8 - '@expo/plist': 0.4.7 - '@expo/prebuild-config': 54.0.6(expo@54.0.23) - '@expo/schema-utils': 0.1.7 + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devcert': 1.2.1 + '@expo/env': 2.0.8 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.14(expo@54.0.32) + '@expo/osascript': 2.3.8 + '@expo/package-manager': 1.9.10 + '@expo/plist': 0.4.8 + '@expo/prebuild-config': 54.0.8(expo@54.0.32) + '@expo/schema-utils': 0.1.8 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.3.2 @@ -6678,14 +6721,14 @@ snapshots: connect: 3.7.0 debug: 4.4.3 env-editor: 0.4.2 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-server: 1.0.4 + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-server: 1.0.5 freeport-async: 2.0.0 getenv: 2.0.0 - glob: 10.4.5 + glob: 13.0.0 lan-network: 0.1.7 minimatch: 9.0.5 - node-forge: 1.3.1 + node-forge: 1.3.3 npm-package-arg: 11.0.3 ora: 3.4.0 picomatch: 3.0.1 @@ -6711,30 +6754,28 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.18.3 optionalDependencies: - expo-router: 6.0.17(349aaac499003fc399e184fbbadde92f) + expo-router: 6.0.22(9f92a432648b6fec77143fe8d4a0fa6a) react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - - '@modelcontextprotocol/sdk' - bufferutil - graphql - supports-color - utf-8-validate - '@expo/code-signing-certificates@0.0.5': + '@expo/code-signing-certificates@0.0.6': dependencies: - node-forge: 1.3.1 - nullthrows: 1.1.1 + node-forge: 1.3.3 - '@expo/config-plugins@54.0.2': + '@expo/config-plugins@54.0.4': dependencies: - '@expo/config-types': 54.0.8 - '@expo/json-file': 10.0.7 - '@expo/plist': 0.4.7 + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 + '@expo/plist': 0.4.8 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 debug: 4.4.3 getenv: 2.0.0 - glob: 10.4.5 + glob: 13.0.0 resolve-from: 5.0.0 semver: 7.7.3 slash: 3.0.0 @@ -6744,42 +6785,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/config-types@54.0.8': {} + '@expo/config-types@54.0.10': {} - '@expo/config@12.0.10': + '@expo/config@12.0.13': dependencies: '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 54.0.2 - '@expo/config-types': 54.0.8 - '@expo/json-file': 10.0.7 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 deepmerge: 4.3.1 getenv: 2.0.0 - glob: 10.4.5 + glob: 13.0.0 require-from-string: 2.0.2 resolve-from: 5.0.0 resolve-workspace-root: 2.0.0 semver: 7.7.3 slugify: 1.6.6 - sucrase: 3.35.0 + sucrase: 3.35.1 transitivePeerDependencies: - supports-color - '@expo/devcert@1.2.0': + '@expo/devcert@1.2.1': dependencies: '@expo/sudo-prompt': 9.3.2 debug: 3.2.7 - glob: 10.4.5 transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.7(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - '@expo/env@2.0.7': + '@expo/env@2.0.8': dependencies: chalk: 4.1.2 debug: 4.4.3 @@ -6789,14 +6829,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/fingerprint@0.15.3': + '@expo/fingerprint@0.15.4': dependencies: '@expo/spawn-async': 1.7.2 arg: 5.0.2 chalk: 4.1.2 debug: 4.4.3 getenv: 2.0.0 - glob: 10.4.5 + glob: 13.0.0 ignore: 5.3.2 minimatch: 9.0.5 p-limit: 3.1.0 @@ -6807,7 +6847,7 @@ snapshots: '@expo/html-elements@0.12.5': {} - '@expo/image-utils@0.8.7': + '@expo/image-utils@0.8.8': dependencies: '@expo/spawn-async': 1.7.2 chalk: 4.1.2 @@ -6820,29 +6860,20 @@ snapshots: temp-dir: 2.0.0 unique-string: 2.0.0 - '@expo/json-file@10.0.7': + '@expo/json-file@10.0.8': dependencies: '@babel/code-frame': 7.10.4 json5: 2.2.3 - '@expo/mcp-tunnel@0.1.0': + '@expo/metro-config@54.0.14(expo@54.0.32)': dependencies: - ws: 8.18.3 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@expo/metro-config@54.0.9(expo@54.0.23)': - dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@expo/config': 12.0.10 - '@expo/env': 2.0.7 - '@expo/json-file': 10.0.7 - '@expo/metro': 54.1.0 + '@babel/generator': 7.28.6 + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 '@expo/spawn-async': 1.7.2 browserslist: 4.28.0 chalk: 4.1.2 @@ -6850,7 +6881,7 @@ snapshots: dotenv: 16.4.7 dotenv-expand: 11.0.7 getenv: 2.0.0 - glob: 10.4.5 + glob: 13.0.0 hermes-parser: 0.29.1 jsc-safe-url: 0.2.4 lightningcss: 1.30.2 @@ -6858,16 +6889,16 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/metro-runtime@6.1.2(expo@54.0.23)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/metro-runtime@6.1.2(expo@54.0.32)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: anser: 1.4.10 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) @@ -6876,63 +6907,63 @@ snapshots: optionalDependencies: react-dom: 19.1.0(react@19.1.0) - '@expo/metro@54.1.0': + '@expo/metro@54.2.0': dependencies: - metro: 0.83.2 - metro-babel-transformer: 0.83.2 - metro-cache: 0.83.2 - metro-cache-key: 0.83.2 - metro-config: 0.83.2 - metro-core: 0.83.2 - metro-file-map: 0.83.2 - metro-resolver: 0.83.2 - metro-runtime: 0.83.2 - metro-source-map: 0.83.2 - metro-transform-plugins: 0.83.2 - metro-transform-worker: 0.83.2 + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-minify-terser: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/osascript@2.3.7': + '@expo/osascript@2.3.8': dependencies: '@expo/spawn-async': 1.7.2 exec-async: 2.2.0 - '@expo/package-manager@1.9.8': + '@expo/package-manager@1.9.10': dependencies: - '@expo/json-file': 10.0.7 + '@expo/json-file': 10.0.8 '@expo/spawn-async': 1.7.2 chalk: 4.1.2 npm-package-arg: 11.0.3 ora: 3.4.0 resolve-workspace-root: 2.0.0 - '@expo/plist@0.4.7': + '@expo/plist@0.4.8': dependencies: '@xmldom/xmldom': 0.8.11 base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@54.0.6(expo@54.0.23)': + '@expo/prebuild-config@54.0.8(expo@54.0.32)': dependencies: - '@expo/config': 12.0.10 - '@expo/config-plugins': 54.0.2 - '@expo/config-types': 54.0.8 - '@expo/image-utils': 0.8.7 - '@expo/json-file': 10.0.7 + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 transitivePeerDependencies: - supports-color - '@expo/schema-utils@0.1.7': {} - '@expo/schema-utils@0.1.8': {} '@expo/sdk-runtime-versions@1.0.0': {} @@ -6943,9 +6974,9 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@15.0.3(expo-font@14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/vector-icons@15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - expo-font: 14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-font: 14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) @@ -7039,6 +7070,12 @@ snapshots: dependencies: '@swc/helpers': 0.5.17 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -7957,24 +7994,11 @@ snapshots: merge-options: 3.0.4 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - '@react-native-community/datetimepicker@8.4.4(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': - dependencies: - invariant: 2.2.4 - react: 19.1.0 - react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - optionalDependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - - '@react-native-segmented-control/segmented-control@2.5.7(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': - dependencies: - react: 19.1.0 - react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - '@react-native/assets-registry@0.81.5': {} '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.28.5)': dependencies: - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 '@react-native/codegen': 0.81.5(@babel/core@7.28.5) transitivePeerDependencies: - '@babel/core' @@ -8012,7 +8036,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) @@ -8022,7 +8046,7 @@ snapshots: '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.28.5) babel-plugin-syntax-hermes-parser: 0.29.1 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.5) @@ -8654,23 +8678,23 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/big.js@6.2.2': {} @@ -8841,7 +8865,7 @@ snapshots: '@vue/compiler-core@3.5.24': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.6 '@vue/shared': 3.5.24 entities: 4.5.0 estree-walker: 2.0.2 @@ -8854,7 +8878,7 @@ snapshots: '@vue/compiler-sfc@3.5.24': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.6 '@vue/compiler-core': 3.5.24 '@vue/compiler-dom': 3.5.24 '@vue/compiler-ssr': 3.5.24 @@ -8905,6 +8929,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + alova@3.3.4: dependencies: '@alova/shared': 1.3.1 @@ -9005,7 +9036,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -9043,7 +9074,7 @@ snapshots: babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 babel-plugin-react-native-web@0.21.2: {} @@ -9076,7 +9107,7 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) - babel-preset-expo@54.0.7(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.23)(react-refresh@0.14.2): + babel-preset-expo@54.0.10(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.32)(react-refresh@0.14.2): dependencies: '@babel/helper-module-imports': 7.27.1 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) @@ -9103,7 +9134,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.28.4 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -9886,63 +9917,69 @@ snapshots: exec-async@2.2.0: {} - expo-asset@12.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-asset@12.0.12(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - '@expo/image-utils': 0.8.7 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-constants: 18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + '@expo/image-utils': 0.8.8 + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color - expo-blur@15.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-blur@15.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-clipboard@8.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-build-properties@1.0.10(expo@54.0.32): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + ajv: 8.17.1 + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + semver: 7.7.3 + + expo-clipboard@8.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-constants@18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)): + expo-constants@18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)): dependencies: - '@expo/config': 12.0.10 - '@expo/env': 2.0.7 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color - expo-file-system@19.0.17(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)): + expo-file-system@19.0.21(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-font@14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-font@14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) fontfaceobserver: 2.3.0 react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-keep-awake@15.0.7(expo@54.0.23)(react@19.1.0): + expo-keep-awake@15.0.8(expo@54.0.32)(react@19.1.0): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 - expo-linear-gradient@15.0.7(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-linear-gradient@15.0.8(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-linking@8.0.8(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-linking@8.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo-constants: 18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) invariant: 2.2.4 react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) @@ -9950,7 +9987,7 @@ snapshots: - expo - supports-color - expo-modules-autolinking@3.0.21: + expo-modules-autolinking@3.0.24: dependencies: '@expo/spawn-async': 1.7.2 chalk: 4.1.2 @@ -9958,21 +9995,21 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 - expo-modules-core@3.0.25(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-modules-core@3.0.29(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: invariant: 2.2.4 react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-qq@0.1.5(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-qq@0.1.6(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) - expo-router@6.0.17(349aaac499003fc399e184fbbadde92f): + expo-router@6.0.22(9f92a432648b6fec77143fe8d4a0fa6a): dependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.23)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@expo/schema-utils': 0.1.8 '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0) '@radix-ui/react-tabs': 1.1.13(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -9982,9 +10019,9 @@ snapshots: client-only: 0.0.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-constants: 18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - expo-linking: 8.0.8(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + expo-linking: 8.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-server: 1.0.5 fast-deep-equal: 3.1.3 invariant: 2.2.4 @@ -10014,53 +10051,56 @@ snapshots: - '@types/react-dom' - supports-color - expo-server@1.0.4: {} - expo-server@1.0.5: {} - expo-splash-screen@31.0.10(expo@54.0.23): + expo-splash-screen@31.0.13(expo@54.0.32): dependencies: - '@expo/prebuild-config': 54.0.6(expo@54.0.23) - expo: 54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/prebuild-config': 54.0.8(expo@54.0.32) + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - supports-color - expo-status-bar@3.0.8(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo@54.0.23(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.17)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-wechat@0.2.6(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + expo: 54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + + expo@54.0.32(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: '@babel/runtime': 7.28.4 - '@expo/cli': 54.0.16(expo-router@6.0.17)(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - '@expo/config': 12.0.10 - '@expo/config-plugins': 54.0.2 - '@expo/devtools': 0.1.7(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@expo/fingerprint': 0.15.3 - '@expo/metro': 54.1.0 - '@expo/metro-config': 54.0.9(expo@54.0.23) - '@expo/vector-icons': 15.0.3(expo-font@14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/cli': 54.0.22(expo-router@6.0.22)(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/fingerprint': 0.15.4 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.14(expo@54.0.32) + '@expo/vector-icons': 15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.7(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.23)(react-refresh@0.14.2) - expo-asset: 12.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-constants: 18.0.10(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - expo-file-system: 19.0.17(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) - expo-font: 14.0.9(expo@54.0.23)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-keep-awake: 15.0.7(expo@54.0.23)(react@19.1.0) - expo-modules-autolinking: 3.0.21 - expo-modules-core: 3.0.25(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + babel-preset-expo: 54.0.10(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.32)(react-refresh@0.14.2) + expo-asset: 12.0.12(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + expo-file-system: 19.0.21(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)) + expo-font: 14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-keep-awake: 15.0.8(expo@54.0.32)(react@19.1.0) + expo-modules-autolinking: 3.0.24 + expo-modules-core: 3.0.29(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 optionalDependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.23)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@babel/core' - - '@modelcontextprotocol/sdk' - bufferutil - expo-router - graphql @@ -10085,6 +10125,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.1.0: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -10263,6 +10305,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -10559,6 +10607,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -10739,6 +10789,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -10894,15 +10946,6 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.83.2: - dependencies: - '@babel/core': 7.28.5 - flow-enums-runtime: 0.0.6 - hermes-parser: 0.32.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - metro-babel-transformer@0.83.3: dependencies: '@babel/core': 7.28.5 @@ -10912,23 +10955,10 @@ snapshots: transitivePeerDependencies: - supports-color - metro-cache-key@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - metro-cache-key@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.2: - dependencies: - exponential-backoff: 3.1.3 - flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 - metro-core: 0.83.2 - transitivePeerDependencies: - - supports-color - metro-cache@0.83.3: dependencies: exponential-backoff: 3.1.3 @@ -10938,21 +10968,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-config@0.83.2: - dependencies: - connect: 3.7.0 - flow-enums-runtime: 0.0.6 - jest-validate: 29.7.0 - metro: 0.83.2 - metro-cache: 0.83.2 - metro-core: 0.83.2 - metro-runtime: 0.83.2 - yaml: 2.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro-config@0.83.3: dependencies: connect: 3.7.0 @@ -10968,32 +10983,12 @@ snapshots: - supports-color - utf-8-validate - metro-core@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - lodash.throttle: 4.1.1 - metro-resolver: 0.83.2 - metro-core@0.83.3: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 metro-resolver: 0.83.3 - metro-file-map@0.83.2: - dependencies: - debug: 4.4.3 - fb-watchman: 2.0.2 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-worker: 29.7.0 - micromatch: 4.0.8 - nullthrows: 1.1.1 - walker: 1.0.8 - transitivePeerDependencies: - - supports-color - metro-file-map@0.83.3: dependencies: debug: 4.4.3 @@ -11008,53 +11003,24 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - terser: 5.44.1 - metro-minify-terser@0.83.3: dependencies: flow-enums-runtime: 0.0.6 terser: 5.44.1 - metro-resolver@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - metro-resolver@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.83.2: - dependencies: - '@babel/runtime': 7.28.4 - flow-enums-runtime: 0.0.6 - metro-runtime@0.83.3: dependencies: '@babel/runtime': 7.28.4 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.2: - dependencies: - '@babel/traverse': 7.28.5 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.5' - '@babel/types': 7.28.5 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-symbolicate: 0.83.2 - nullthrows: 1.1.1 - ob1: 0.83.2 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - metro-source-map@0.83.3: dependencies: '@babel/traverse': 7.28.5 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.5' + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.6' '@babel/types': 7.28.5 flow-enums-runtime: 0.0.6 invariant: 2.2.4 @@ -11066,17 +11032,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-source-map: 0.83.2 - nullthrows: 1.1.1 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - metro-symbolicate@0.83.3: dependencies: flow-enums-runtime: 0.0.6 @@ -11088,54 +11043,23 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.2: - dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - flow-enums-runtime: 0.0.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - metro-transform-plugins@0.83.3: dependencies: '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 + '@babel/generator': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.2: - dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - flow-enums-runtime: 0.0.6 - metro: 0.83.2 - metro-babel-transformer: 0.83.2 - metro-cache: 0.83.2 - metro-cache-key: 0.83.2 - metro-minify-terser: 0.83.2 - metro-source-map: 0.83.2 - metro-transform-plugins: 0.83.2 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro-transform-worker@0.83.3: dependencies: '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 flow-enums-runtime: 0.0.6 metro: 0.83.3 metro-babel-transformer: 0.83.3 @@ -11150,53 +11074,6 @@ snapshots: - supports-color - utf-8-validate - metro@0.83.2: - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - accepts: 1.3.8 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 - error-stack-parser: 2.1.4 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - hermes-parser: 0.32.0 - image-size: 1.2.1 - invariant: 2.2.4 - jest-worker: 29.7.0 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.2 - metro-cache: 0.83.2 - metro-cache-key: 0.83.2 - metro-config: 0.83.2 - metro-core: 0.83.2 - metro-file-map: 0.83.2 - metro-resolver: 0.83.2 - metro-runtime: 0.83.2 - metro-source-map: 0.83.2 - metro-symbolicate: 0.83.2 - metro-transform-plugins: 0.83.2 - metro-transform-worker: 0.83.2 - mime-types: 2.1.35 - nullthrows: 1.1.1 - serialize-error: 2.1.0 - source-map: 0.5.7 - throat: 5.0.0 - ws: 7.5.10 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro@0.83.3: dependencies: '@babel/code-frame': 7.27.1 @@ -11204,8 +11081,8 @@ snapshots: '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -11459,6 +11336,10 @@ snapshots: mimic-fn@1.2.0: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -11541,7 +11422,7 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-forge@1.3.1: {} + node-forge@1.3.3: {} node-int64@0.4.0: {} @@ -11562,10 +11443,6 @@ snapshots: nullthrows@1.1.1: {} - ob1@0.83.2: - dependencies: - flow-enums-runtime: 0.0.6 - ob1@0.83.3: dependencies: flow-enums-runtime: 0.0.6 @@ -11691,6 +11568,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + path-type@4.0.0: {} pathe@2.0.3: {} @@ -12507,6 +12389,16 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -12925,12 +12817,6 @@ snapshots: yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.6(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod@3.25.76: {} - zustand@5.0.8(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): optionalDependencies: '@types/react': 19.1.17 diff --git a/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx b/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx index ecc7d722..f1426720 100644 --- a/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx +++ b/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx @@ -1,47 +1,27 @@ -import type { TabbarItem } from '@/components/custom/Tabbar' -import CustomTabbar from '@/components/custom/Tabbar' -import { toast } from '@/utils/toast' - -export const unstable_settings = { - initialRouteName: 'money/index', -} +import { TabSlot } from 'expo-router/ui' +import { Text, View } from 'react-native' export default function TabsLayout() { - const tabbarOptions: TabbarItem[] = [ - { - name: 'money', - href: '/money', - icon: 'CircleDollarSign', - }, - { - name: 'love', - href: '/love', - icon: 'Heart', - }, - { - name: 'app', - icon: 'LayoutGrid', - activeIcon: 'Smile', - iconSize: 26, - onPress: () => { - toast.show({ - title: '该功能尚未开发,请尽情期待!', - }) - }, - }, - { - name: 'chat', - href: '/chat', - icon: 'MessageCircle', - }, - { - name: 'user', - href: '/user', - icon: 'CircleUserRound', - }, - ] - return ( - + + + + + + + + + + + ) } diff --git a/code/allapp/allapp-rn/src/app/(tabs)/_layout2.tsx b/code/allapp/allapp-rn/src/app/(tabs)/_layout2.tsx new file mode 100644 index 00000000..e69de29b diff --git a/code/allapp/allapp-rn/src/app/(tabs)/user/index.tsx b/code/allapp/allapp-rn/src/app/(tabs)/user/index.tsx index c3707e9b..d3f4bfcf 100644 --- a/code/allapp/allapp-rn/src/app/(tabs)/user/index.tsx +++ b/code/allapp/allapp-rn/src/app/(tabs)/user/index.tsx @@ -13,11 +13,11 @@ export default function User() { return ( - + {userStore.userInfo?.username} diff --git a/code/allapp/allapp-rn/src/app/auth/index.tsx b/code/allapp/allapp-rn/src/app/auth/index.tsx index 19cc2145..76cb17f7 100644 --- a/code/allapp/allapp-rn/src/app/auth/index.tsx +++ b/code/allapp/allapp-rn/src/app/auth/index.tsx @@ -1,94 +1,263 @@ import { useEvent } from 'expo' import ExpoQQ from 'expo-qq' import { useRouter } from 'expo-router' -import { useEffect } from 'react' +import ExpoWeChat from 'expo-wechat' +import { useEffect, useState } from 'react' import { Image, Text, View } from 'react-native' +import { AButton, ACheckbox } from '@/components/common/ao' import CustomHeader from '@/components/custom/Header' -import { Button, ButtonText } from '@/components/ui/button' +import { IconQq, IconWeixin } from '@/components/iconfont' +import { loginQqApi, loginWxApi } from '@/request/api/auth' +import { useUserStore } from '@/store/user' +import { toast } from '@/utils/toast' + +export default function LoginScreen() { + const [loading, setLoading] = useState(false) + const [isAgree, setIsAgree] = useState(true) + const [form, setForm] = useState({ + type: 0, + openid: '', + code: '', + }) -export default function AuthIndex() { const router = useRouter() + const userStore = useUserStore() - function toPath(url: string) { - router.push(url) + const onLoginFinished = useEvent(ExpoQQ, 'onLoginFinished') + const onGetUserInfo = useEvent(ExpoQQ, 'onGetUserInfo') + const authResult = useEvent(ExpoWeChat, 'onAuthResult') + + async function onQQLogin() { + setLoading(true) + setForm(val => ({ + ...val, + type: 1, + })) + await ExpoQQ.login(['get_user_info']) } - // /// 监听登录结果,你也可以使用ExpoQQ.addListener('onLoginFinished', callback)来实现,但请不要忘记移除监听 - // const onSendLoginFinished = useEvent(ExpoQQ, 'onGetUserInfo') - // const onLoginFinished = useEvent(ExpoQQ, 'onLoginFinished') + async function onWeChatLogin() { + setLoading(true) - // useEffect(() => { - // console.log(onSendLoginFinished) - // }, [onSendLoginFinished]) + // 检查微信是否安装 + const isInstalled = await ExpoWeChat.isWXAppInstalled() + if (!isInstalled) { + toast.show({ + title: onLoginFinished?.errorMessage || '请先安装微信', + }) + setLoading(false) + return + } - // /// 国内应用需要在用户接受隐私协议后再初始化 - // useEffect(() => { - // const init = async () => { - // await ExpoQQ.init('102826474', 'universal link') - // } - // init() - // }, []) + setForm(val => ({ + ...val, + type: 0, + })) - // useEffect(() => { - // if (!onLoginFinished || !onLoginFinished.success) - // return + ExpoWeChat.sendAuthRequest('snsapi_userinfo', 'state123') + } - // const fetchUserInfo = async () => { - // try { - // // 1️⃣ 确认 SDK 已经拿到 token - // const tokenInfo = await ExpoQQ.getLoginTokenInfo() - // console.log('tokenInfo', tokenInfo) + useEffect(() => { + ExpoQQ.init('102826474', '') + ExpoWeChat.registerApp('wxdab3e21a1f7e392f', '') + }, []) - // // 2️⃣ 再请求用户信息 - // await ExpoQQ.sendGetUserInfoReq() - // } - // catch (e) { - // console.error('QQ 登录未完成', e) - // } - // } + useEffect(() => { + if (!onLoginFinished) { + return + } - // fetchUserInfo() - // }, [onLoginFinished]) + if (!onLoginFinished.success) { + toast.show({ + title: onLoginFinished?.errorMessage || '授权失败,请检查手机是否安装 QQ 或确认授权', + }) + setLoading(false) + return + } - // /// 调用qq登陆 - // const loginByQQ = async () => { - // await ExpoQQ.login(['get_user_info']) - // } + const fetchUserInfo = async () => { + try { + const tokenInfo = await ExpoQQ.getLoginTokenInfo() + if (!tokenInfo.openId) { + toast.show({ + title: tokenInfo?.errorMessage || '授权失败,请检查手机是否安装 QQ 或确认授权', + }) + setLoading(false) + return + } + + setForm(val => ({ + ...val, + openid: String(tokenInfo.openId), + })) + + await ExpoQQ.sendGetUserInfoReq() + } + catch (e) { + console.error('QQ 登录未完成', e) + setLoading(false) + } + } + + fetchUserInfo() + }, [onLoginFinished]) + + // QQ登录 + useEffect(() => { + const handleLogin = async () => { + if (!onGetUserInfo) + return + + try { + const loginRes = await loginQqApi({ + openid: form.openid, + username: onGetUserInfo.nickname || '', + avatar: onGetUserInfo.figureurlQq_2 || onGetUserInfo.figureurl_2, + }) + + if (loginRes.isSuccess) { + userStore.setUserInfo({ + token: loginRes.data.token, + id: loginRes.data.userId, + username: loginRes.data.username, + avatar: loginRes.data.avatar, + }) + + console.log(loginRes.data.token) + + router.push('/') + } + } + catch (err) { + console.error('登录接口出错', err) + } + finally { + setLoading(false) + } + } + + handleLogin() + }, [onGetUserInfo]) + + // 微信登录 + useEffect(() => { + if (!authResult) + return + + const handleLogin = async () => { + if (authResult.errorCode === 0) { + try { + const loginRes = await loginWxApi({ + code: authResult.code, + }) + + if (loginRes.isSuccess) { + userStore.setUserInfo({ + token: loginRes.data.token, + id: loginRes.data.userId, + username: loginRes.data.username, + avatar: loginRes.data.avatar, + }) + + router.push('/') + } + } + catch (err) { + console.error('登录接口出错', err) + } + finally { + setLoading(false) + } + } + else { + console.log('授权失败:', authResult.errorMessage) + setLoading(false) + } + } + + handleLogin() + }, [authResult]) + + function testLogin() { + // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo3NjY3ODU5ODIxNjUwNjEsImlhdCI6MTc2OTM0ODI0Nn0.17ZNaHD3HSLM8dVn_JQK-gvsG9MKj47IRYV9D4xZkzs + + userStore.setUserInfo({ + token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo3NjY3ODU5ODIxNjUwNjEsImlhdCI6MTc2OTM0ODI0Nn0.17ZNaHD3HSLM8dVn_JQK-gvsG9MKj47IRYV9D4xZkzs', + id: 766785982165061, + username: 'Zhang', + avatar: 'http://thirdqq.qlogo.cn/ek_qqapp/AQHVialeUibE42oV8RvTTVZ4tyRlPYeJrUibWTwtCPfV68E4rSzn9cw00GkXQ3QDTiawwhjoqQb7/100', + }) + + router.push('/') + } return ( - + - - - + - - - ONEAO + + Welcome to OneAO + - - + + + } + loading={loading} + onPress={onWeChatLogin} + > + WeChat + - - + + } + loading={loading} + onPress={onQQLogin} + > + QQ + + + + } + loading={loading} + onPress={testLogin} + > + 模拟登录 + + + + + + 登录即表示你同意我们的 + 用户协议 + 和 + 隐私政策 + + )} + onChange={(val) => { + setIsAgree(val) + }} + /> - ) } diff --git a/code/allapp/allapp-rn/src/app/money/category/setting/components/EditCategory.tsx b/code/allapp/allapp-rn/src/app/money/category/setting/components/EditCategory.tsx index d1866b3f..ab74f3cb 100644 --- a/code/allapp/allapp-rn/src/app/money/category/setting/components/EditCategory.tsx +++ b/code/allapp/allapp-rn/src/app/money/category/setting/components/EditCategory.tsx @@ -157,7 +157,6 @@ export default function CreateCategory({ data={flatListData} keyExtractor={([groupName]) => groupName} renderItem={renderGroup} - initialNumToRender={1} /> ) diff --git a/code/allapp/allapp-rn/src/components/common/ao/Button.tsx b/code/allapp/allapp-rn/src/components/common/ao/Button.tsx index 45918f3c..5dd4bb90 100644 --- a/code/allapp/allapp-rn/src/components/common/ao/Button.tsx +++ b/code/allapp/allapp-rn/src/components/common/ao/Button.tsx @@ -1,15 +1,13 @@ -import type { icons } from 'lucide-react-native' import type { ViewStyle } from 'react-native' -import type { LucideIconProps } from './LucideIcon' import React from 'react' +import { View } from 'react-native' import { ButtonSpinner, ButtonText, Button as NativeButton, } from '@/components/ui/button' -import LucideIcon from './LucideIcon' -type IconProp = (LucideIconProps & { icon: keyof typeof icons }) | React.ReactNode +type IconProp = React.ReactNode | (() => React.ReactNode) interface CustomButtonProps { children?: React.ReactNode @@ -21,7 +19,6 @@ interface CustomButtonProps { action?: 'primary' | 'secondary' | 'positive' | 'negative' | 'default' variant?: 'solid' | 'outline' | 'link' size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' - leftIcon?: IconProp rightIcon?: IconProp } @@ -41,31 +38,39 @@ const Button: React.FC = ({ }) => { const isDisabled = disabled || loading const hasChildren = !!children - const renderLeftIcon = () => { - if (loading) - return - if (!leftIcon) + const renderIcon = ( + icon?: IconProp, + position: 'left' | 'right' = 'left', + ) => { + if (!icon) return null - if (React.isValidElement(leftIcon)) { - return {leftIcon} + if (loading && position === 'left') { + const spinnerColor = variant === 'outline' + ? 'rgba(0,0,0,0.6)' + : 'rgba(255,255,255,0.9)' + return ( + + + + ) } - const { icon, ...props } = leftIcon as LucideIconProps & { icon: keyof typeof icons } - return - } + const node = typeof icon === 'function' + ? icon() + : icon - const renderRightIcon = () => { - if (!rightIcon) - return null - - if (React.isValidElement(rightIcon)) { - return {rightIcon} - } - - const { icon, ...props } = rightIcon as LucideIconProps & { icon: keyof typeof icons } - return + return ( + + {node} + + ) } return ( @@ -78,13 +83,9 @@ const Button: React.FC = ({ variant={variant} size={size} > - {renderLeftIcon()} - { - children && ( - {children} - ) - } - {renderRightIcon()} + {renderIcon(leftIcon, 'left')} + {children && {children}} + {renderIcon(rightIcon, 'right')} ) } diff --git a/code/allapp/allapp-rn/src/components/common/ao/Checkbox.tsx b/code/allapp/allapp-rn/src/components/common/ao/Checkbox.tsx index fd18b4f8..38c22911 100644 --- a/code/allapp/allapp-rn/src/components/common/ao/Checkbox.tsx +++ b/code/allapp/allapp-rn/src/components/common/ao/Checkbox.tsx @@ -11,33 +11,36 @@ import { CheckIcon } from '@/components/ui/icon' interface CustomCheckboxProps { value?: string - isChecked: boolean - onChange: (checked: boolean) => void - label: React.ReactNode + checked?: boolean + onChange?: (checked: boolean) => void + label?: React.ReactNode className?: string style?: ViewStyle disabled?: boolean icon?: React.ElementType + size?: 'sm' | 'md' | 'lg' } const Checkbox: React.FC = ({ value, - isChecked, + checked, onChange, label, className, style, disabled, icon, + size, }) => { return ( diff --git a/code/allapp/allapp-rn/src/components/ui/avatar/index.tsx b/code/allapp/allapp-rn/src/components/ui/avatar/index.tsx index 20acba7d..32534ebb 100644 --- a/code/allapp/allapp-rn/src/components/ui/avatar/index.tsx +++ b/code/allapp/allapp-rn/src/components/ui/avatar/index.tsx @@ -1,24 +1,21 @@ -'use client'; -import React from 'react'; -import { createAvatar } from '@gluestack-ui/core/avatar/creator'; +'use client' +import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils' +import { createAvatar } from '@gluestack-ui/core/avatar/creator' -import { View, Text, Image, Platform } from 'react-native'; +import { tva, useStyleContext, withStyleContext } from '@gluestack-ui/utils/nativewind-utils' -import { tva } from '@gluestack-ui/utils/nativewind-utils'; -import { - withStyleContext, - useStyleContext, -} from '@gluestack-ui/utils/nativewind-utils'; -const SCOPE = 'AVATAR'; -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; +import React from 'react' +import { Image, Platform, Text, View } from 'react-native' + +const SCOPE = 'AVATAR' const UIAvatar = createAvatar({ Root: withStyleContext(View, SCOPE), Badge: View, Group: View, - Image: Image, + Image, FallbackText: Text, -}); +}) const avatarStyle = tva({ base: 'rounded-full justify-center items-center relative bg-primary-600 group-[.avatar-group]/avatar-group:-ml-2.5', @@ -32,7 +29,7 @@ const avatarStyle = tva({ '2xl': 'w-32 h-32', }, }, -}); +}) const avatarFallbackTextStyle = tva({ base: 'text-typography-0 font-semibold overflow-hidden text-transform:uppercase web:cursor-default', @@ -47,11 +44,11 @@ const avatarFallbackTextStyle = tva({ '2xl': 'text-5xl', }, }, -}); +}) const avatarGroupStyle = tva({ base: 'group/avatar-group flex-row-reverse relative avatar-group', -}); +}) const avatarBadgeStyle = tva({ base: 'w-5 h-5 bg-success-500 rounded-full absolute right-0 bottom-0 border-background-0 border-2', @@ -65,22 +62,22 @@ const avatarBadgeStyle = tva({ '2xl': 'w-8 h-8', }, }, -}); +}) const avatarImageStyle = tva({ base: 'h-full w-full rounded-full absolute', -}); +}) type IAvatarProps = Omit< React.ComponentPropsWithoutRef, 'context' -> & - VariantProps; +> +& VariantProps const Avatar = React.forwardRef< React.ComponentRef, IAvatarProps ->(function Avatar({ className, size = 'md', ...props }, ref) { +>(({ className, size = 'md', ...props }, ref) => { return ( - ); -}); + ) +}) -type IAvatarBadgeProps = React.ComponentPropsWithoutRef & - VariantProps; +type IAvatarBadgeProps = React.ComponentPropsWithoutRef + & VariantProps const AvatarBadge = React.forwardRef< React.ComponentRef, IAvatarBadgeProps ->(function AvatarBadge({ className, size, ...props }, ref) { - const { size: parentSize } = useStyleContext(SCOPE); +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE) return ( - ); -}); + ) +}) type IAvatarFallbackTextProps = React.ComponentPropsWithoutRef< typeof UIAvatar.FallbackText -> & - VariantProps; +> +& VariantProps const AvatarFallbackText = React.forwardRef< React.ComponentRef, IAvatarFallbackTextProps ->(function AvatarFallbackText({ className, size, ...props }, ref) { - const { size: parentSize } = useStyleContext(SCOPE); +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE) return ( - ); -}); + ) +}) -type IAvatarImageProps = React.ComponentPropsWithoutRef & - VariantProps; +type IAvatarImageProps = React.ComponentPropsWithoutRef + & VariantProps const AvatarImage = React.forwardRef< React.ComponentRef, IAvatarImageProps ->(function AvatarImage({ className, ...props }, ref) { +>(({ className, ...props }, ref) => { return ( - ); -}); + ) +}) -type IAvatarGroupProps = React.ComponentPropsWithoutRef & - VariantProps; +type IAvatarGroupProps = React.ComponentPropsWithoutRef + & VariantProps const AvatarGroup = React.forwardRef< React.ComponentRef, IAvatarGroupProps ->(function AvatarGroup({ className, ...props }, ref) { +>(({ className, ...props }, ref) => { return ( - ); -}); + ) +}) -export { Avatar, AvatarBadge, AvatarFallbackText, AvatarImage, AvatarGroup }; +export { Avatar, AvatarBadge, AvatarFallbackText, AvatarGroup, AvatarImage } diff --git a/code/allapp/allapp-rn/src/request/api/auth.ts b/code/allapp/allapp-rn/src/request/api/auth.ts index ff111604..4c29e034 100644 --- a/code/allapp/allapp-rn/src/request/api/auth.ts +++ b/code/allapp/allapp-rn/src/request/api/auth.ts @@ -1,12 +1,12 @@ -import type { LoginDefaultParams, LoginDefaultResult, RegisterDefaultParams } from '@/types/auth' +import type { LoginQqParams, LoginResult, LoginWxParams } from '@/types/auth' import alovaInstance from '../index' const API_PREFIX = '/auth' -export function registerDefaultApi(params: RegisterDefaultParams) { - return alovaInstance.Post>(`${API_PREFIX}/register/default`, params) +export function loginQqApi(params: LoginQqParams) { + return alovaInstance.Post>(`${API_PREFIX}/login/qq`, params) } -export function loginDefaultApi(params: LoginDefaultParams) { - return alovaInstance.Post>(`${API_PREFIX}/login/default`, params) +export function loginWxApi(params: LoginWxParams) { + return alovaInstance.Post>(`${API_PREFIX}/login/wx`, params) } diff --git a/code/allapp/allapp-rn/src/request/index.ts b/code/allapp/allapp-rn/src/request/index.ts index 476eb11d..9c71bff7 100644 --- a/code/allapp/allapp-rn/src/request/index.ts +++ b/code/allapp/allapp-rn/src/request/index.ts @@ -1,6 +1,5 @@ import type { Method } from 'alova' import type { AxiosError } from 'axios' -import type { RefreshTokenResult } from '@/types/auth' import { axiosRequestAdapter } from '@alova/adapter-axios' import { createAlova } from 'alova' import { useNavStore } from '@/store/navigation' @@ -11,14 +10,13 @@ import { toast } from '@/utils/toast' enum HttpCode { Success = 200, Unauthorized = 401, - RefreshToken = 402, Fail = 500, } +// 仅保留「无需登录」接口 const WhiteList = [ '/auth/login/**', '/auth/register/**', - '/auth/refresh/token', ] function isWhiteListed(url: string) { @@ -32,13 +30,14 @@ function isWhiteListed(url: string) { } const alovaInstance = createAlova({ - // baseURL: 'http://192.168.5.6:8086/app', - baseURL: 'http://192.168.1.137:8086/app', + baseURL: 'http://192.168.5.6:8086/app', + // baseURL: 'http://192.168.1.137:8086/app', requestAdapter: axiosRequestAdapter(), timeout: 5000, cacheFor: null, + responded: { - onSuccess: async (response, method: Method) => { + onSuccess: async (response, _method: Method) => { const resData = response.data as ResponseData const result = { @@ -46,116 +45,78 @@ const alovaInstance = createAlova({ isSuccess: resData.code === HttpCode.Success, } - // Access Token 失效 → 重新登录 + /** + * 登录态失效: + * - 清空本地状态 + * - 跳转登录页 + * - 不做 token 刷新、不重试请求 + */ if (resData.code === HttpCode.Unauthorized) { + useUserStore.getState().clear() useNavStore.getState().navigateToAuth() - return - } - - // Access Token 过期但 Refresh Token 有效 → 刷新 token 并重试 - if (resData.code === HttpCode.RefreshToken) { - try { - const refreshToken = useUserStore.getState().userInfo?.refreshToken - if (!refreshToken) { - useNavStore.getState().navigateToAuth() - return - } - - // 调用刷新接口 - const res = await alovaInstance.Get>('/auth/refresh/token', { - headers: { refreshToken }, - }).send() - - const newToken = res.data.refreshToken - - // 更新 store - useUserStore.getState().setUserInfo({ - ...useUserStore.getState().userInfo!, - token: newToken, - }) - - // 重试原请求 - method.config.headers.token = newToken - const retryResult = await method.send() - - return retryResult - } - catch (err) { - return Promise.reject(err) - } + return Promise.reject(new Error('登录已失效')) } return result }, - onError: (error: AxiosError, _method) => { - console.log(error.status) - switch (error.status) { + onError: (error: AxiosError) => { + const status = error.status + + switch (status) { case 400: - toast.show({ - title: '请求错误,请检查输入参数', - }) + toast.show({ title: '请求错误,请检查输入参数' }) break case 401: - toast.show({ - title: '未授权,请重新登录', - }) + toast.show({ title: '未授权,请重新登录' }) break case 403: - toast.show({ - title: '没有权限访问该资源', - }) + toast.show({ title: '没有权限访问该资源' }) break case 404: - toast.show({ - title: '请求丢失啦,请稍后再试!', - }) + toast.show({ title: '请求丢失啦,请稍后再试!' }) break case 500: - toast.show({ - title: '服务器出错啦,请稍后重试', - }) + toast.show({ title: '服务器出错啦,请稍后重试' }) break case 502: - toast.show({ - title: '网关错误,请稍后重试', - }) + toast.show({ title: '网关错误,请稍后重试' }) break case 503: - toast.show({ - title: '服务暂不可用,请稍后再试', - }) + toast.show({ title: '服务暂不可用,请稍后再试' }) break case 504: - toast.show({ - title: '网关超时,请稍后再试', - }) + toast.show({ title: '网关超时,请稍后再试' }) break default: - toast.show({ - title: `服务器出错啦,请稍后重试`, - }) + toast.show({ title: '服务器出错啦,请稍后重试' }) break } + return Promise.reject(error) }, }, + beforeRequest(method) { + // 白名单接口直接放行 if (isWhiteListed(method.url)) return - if (!useUserStore.getState().isLoggedIn()) { + const userStore = useUserStore.getState() + + // 未登录直接拦截 + if (!userStore.isLoggedIn()) { useNavStore.getState().navigateToAuth() return Promise.reject(new Error('未登录')) } - method.config.headers.token = useUserStore.getState().userInfo?.token ?? '' + // 注入 JWT + method.config.headers.token = userStore.userInfo!.token + // 注入 space 信息(如果存在) const userSpace = useSpaceStore.getState().userSpace - if (userSpace !== null) { - const spaceID = userSpace.space_id - - method.config.headers['x-space-id'] = spaceID + if (userSpace) { + method.config.headers['x-space-id'] = userSpace.space_id } }, }) diff --git a/code/allapp/allapp-rn/src/store/user.ts b/code/allapp/allapp-rn/src/store/user.ts index 86dac85a..642d7efc 100644 --- a/code/allapp/allapp-rn/src/store/user.ts +++ b/code/allapp/allapp-rn/src/store/user.ts @@ -26,7 +26,7 @@ const useUserStore = create()( set({ userInfo: null, userSpace: null }) }, - isLoggedIn: () => !!get().userInfo?.token, + isLoggedIn: () => Boolean(get().userInfo?.token), }), { name: 'user-storage', diff --git a/code/allapp/allapp-rn/src/types/auth.ts b/code/allapp/allapp-rn/src/types/auth.ts index 65118857..18512d35 100644 --- a/code/allapp/allapp-rn/src/types/auth.ts +++ b/code/allapp/allapp-rn/src/types/auth.ts @@ -1,22 +1,16 @@ -export interface RefreshTokenResult { - refreshToken: string +export interface LoginQqParams { + openid: string + username: string + avatar: string } -export interface RegisterDefaultParams { - account: string - password: string +export interface LoginWxParams { + code: string } -export interface LoginDefaultParams { - account: string - password: string -} - -export interface LoginDefaultResult { +export interface LoginResult { token: string - refreshToken: string userId: number username: string - seqNo: number - gender: number + avatar: string } diff --git a/code/allapp/allapp-rn/src/types/global.d.ts b/code/allapp/allapp-rn/src/types/global.d.ts index 6b4e5962..b038a71f 100644 --- a/code/allapp/allapp-rn/src/types/global.d.ts +++ b/code/allapp/allapp-rn/src/types/global.d.ts @@ -10,14 +10,10 @@ declare global { } interface UserInfo { - account: string id: number - seqNo: number - username: string - gender: number - token?: string - refreshToken?: string - rememberMe?: boolean + token: string + username?: string + avatar?: string } interface UserSpace { diff --git a/code/allapp/allapp-rn/test.html b/code/allapp/allapp-rn/test.html new file mode 100644 index 00000000..2f9a1cfa --- /dev/null +++ b/code/allapp/allapp-rn/test.html @@ -0,0 +1,147 @@ + + + + + + Bottom Nav Demo + + + + + +
+

当前工具内容区域

+
+ + +
+
视图切换
+
工具设置
+
导出数据
+
清空记录
+
+ + + + + + + + diff --git a/hz.txt b/hz.txt index d90cafdd..610c72a7 100644 --- a/hz.txt +++ b/hz.txt @@ -4,4 +4,4 @@ https://www.bootstrapmb.com/item/14502/preview -111 \ No newline at end of file +sqlc generate -f sqlc.yaml \ No newline at end of file