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 6643469c..c3bc74f3 100644 --- a/code/allapp/allapp-go/biz/handler/space/space_service.go +++ b/code/allapp/allapp-go/biz/handler/space/space_service.go @@ -63,3 +63,21 @@ func DissolveSpace(ctx context.Context, c *app.RequestContext) { response.Success(c).Send() } + +// EnterSpace . +// @router /space/enter [POST] +func EnterSpace(ctx context.Context, c *app.RequestContext) { + var err error + var req space.EnterSpaceParams + err = c.BindAndValidate(&req) + if err != nil { + c.String(consts.StatusBadRequest, err.Error()) + return + } + + resp := new(space.EnterSpaceResult) + + userID := middleware.GetUserID(ctx) + + c.JSON(consts.StatusOK, resp) +} 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 6c875e34..8c067df8 100644 --- a/code/allapp/allapp-go/biz/model/space/space.pb.go +++ b/code/allapp/allapp-go/biz/model/space/space.pb.go @@ -28,77 +28,86 @@ 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, 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, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xbe, 0x01, 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, 0x12, 0x50, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x17, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x17, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x10, 0xd2, 0xc1, 0x18, 0x0c, 0x2f, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2f, 0x65, 0x6e, 0x74, 0x65, 0x72, 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, - 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, + 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{}{ (*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 + (*EnterSpaceParams)(nil), // 1: space.EnterSpaceParams + (*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 + (*EnterSpaceResult)(nil), // 8: space.EnterSpaceResult + (*GetUserSpaceResult)(nil), // 9: space.GetUserSpaceResult + (*ExitSpaceResult)(nil), // 10: space.ExitSpaceResult + (*ListSpaceUsersResult)(nil), // 11: space.ListSpaceUsersResult + (*RemoveSpaceUserResult)(nil), // 12: space.RemoveSpaceUserResult + (*JoinSpaceResult)(nil), // 13: space.JoinSpaceResult } var file_space_proto_depIdxs = []int32{ 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 + 1, // 1: space.SpaceService.EnterSpace:input_type -> space.EnterSpaceParams + 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 + 7, // 7: space.SpaceService.DissolveSpace:output_type -> space.DissolveSpaceResult + 8, // 8: space.SpaceService.EnterSpace:output_type -> space.EnterSpaceResult + 9, // 9: space.SpaceUserService.getUserSpace:output_type -> space.GetUserSpaceResult + 10, // 10: space.SpaceUserService.ExitSpace:output_type -> space.ExitSpaceResult + 11, // 11: space.SpaceUserService.ListSpaceUsers:output_type -> space.ListSpaceUsersResult + 12, // 12: space.SpaceUserService.RemoveSpaceUser:output_type -> space.RemoveSpaceUserResult + 13, // 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: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 2d53ce81..68d4c9ba 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 @@ -192,6 +192,91 @@ func (*DissolveSpaceResult) Descriptor() ([]byte, []int) { return file_space_space_types_proto_rawDescGZIP(), []int{3} } +type EnterSpaceParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SpaceId int64 `protobuf:"varint,1,opt,name=SpaceId,proto3" form:"space_id" json:"space_id"` +} + +func (x *EnterSpaceParams) Reset() { + *x = EnterSpaceParams{} + if protoimpl.UnsafeEnabled { + mi := &file_space_space_types_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnterSpaceParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnterSpaceParams) ProtoMessage() {} + +func (x *EnterSpaceParams) ProtoReflect() protoreflect.Message { + mi := &file_space_space_types_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 EnterSpaceParams.ProtoReflect.Descriptor instead. +func (*EnterSpaceParams) Descriptor() ([]byte, []int) { + return file_space_space_types_proto_rawDescGZIP(), []int{4} +} + +func (x *EnterSpaceParams) GetSpaceId() int64 { + if x != nil { + return x.SpaceId + } + return 0 +} + +type EnterSpaceResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *EnterSpaceResult) Reset() { + *x = EnterSpaceResult{} + if protoimpl.UnsafeEnabled { + mi := &file_space_space_types_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnterSpaceResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnterSpaceResult) ProtoMessage() {} + +func (x *EnterSpaceResult) ProtoReflect() protoreflect.Message { + mi := &file_space_space_types_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 EnterSpaceResult.ProtoReflect.Descriptor instead. +func (*EnterSpaceResult) Descriptor() ([]byte, []int) { + return file_space_space_types_proto_rawDescGZIP(), []int{5} +} + var File_space_space_types_proto protoreflect.FileDescriptor var file_space_space_types_proto_rawDesc = []byte{ @@ -207,7 +292,12 @@ 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, 0x18, 0x5a, 0x16, + 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x0a, 0x10, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x26, 0x0a, 0x07, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x0c, 0xca, 0xbb, 0x18, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x52, + 0x07, 0x53, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x6e, 0x74, 0x65, + 0x72, 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, } @@ -224,12 +314,14 @@ func file_space_space_types_proto_rawDescGZIP() []byte { return file_space_space_types_proto_rawDescData } -var file_space_space_types_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_space_space_types_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_space_space_types_proto_goTypes = []interface{}{ (*CreateSpaceParams)(nil), // 0: space.CreateSpaceParams (*CreateSpaceResult)(nil), // 1: space.CreateSpaceResult (*DissolveSpaceParams)(nil), // 2: space.DissolveSpaceParams (*DissolveSpaceResult)(nil), // 3: space.DissolveSpaceResult + (*EnterSpaceParams)(nil), // 4: space.EnterSpaceParams + (*EnterSpaceResult)(nil), // 5: space.EnterSpaceResult } var file_space_space_types_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type @@ -293,6 +385,30 @@ func file_space_space_types_proto_init() { return nil } } + file_space_space_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnterSpaceParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_space_space_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnterSpaceResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -300,7 +416,7 @@ func file_space_space_types_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_space_space_types_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/code/allapp/allapp-go/biz/router/space/middleware.go b/code/allapp/allapp-go/biz/router/space/middleware.go index 48a340f5..cffaab6f 100644 --- a/code/allapp/allapp-go/biz/router/space/middleware.go +++ b/code/allapp/allapp-go/biz/router/space/middleware.go @@ -80,3 +80,8 @@ func _getuserspaceMw() []app.HandlerFunc { // your code... return nil } + +func _enterspaceMw() []app.HandlerFunc { + // your code... + return nil +} diff --git a/code/allapp/allapp-go/biz/router/space/space.go b/code/allapp/allapp-go/biz/router/space/space.go index 8794bf5d..6fc94d8f 100644 --- a/code/allapp/allapp-go/biz/router/space/space.go +++ b/code/allapp/allapp-go/biz/router/space/space.go @@ -20,6 +20,7 @@ func Register(r *server.Hertz) { { _space := root.Group("/space", _spaceMw()...) _space.POST("/dissolve", append(_dissolvespaceMw(), space.DissolveSpace)...) + _space.POST("/enter", append(_enterspaceMw(), space.EnterSpace)...) { _user := _space.Group("/user", _userMw()...) _user.POST("/exit", append(_exitspaceMw(), space.ExitSpace)...) diff --git a/code/allapp/allapp-go/conf/conf.go b/code/allapp/allapp-go/conf/conf.go index 04f8ec44..119792bb 100644 --- a/code/allapp/allapp-go/conf/conf.go +++ b/code/allapp/allapp-go/conf/conf.go @@ -23,6 +23,7 @@ type Config struct { Pgsql PgsqlConfig `mapstructure:"pgsql" yaml:"pgsql"` Log LogConfig `mapstructure:"log" yaml:"log"` Wx WxConfig `mapstructure:"wx" yaml:"wx"` + Redis RedisConfig `mapstructure:"redis" yaml:"redis"` } type ServerConfig struct { @@ -67,6 +68,13 @@ type WxConfig struct { AppSecret string `mapstructure:"app_secret" yaml:"app_secret"` } +type RedisConfig struct { + Host string `mapstructure:"host" yaml:"host"` + Port int `mapstructure:"port" yaml:"port"` + Db int `mapstructure:"db" yaml:"db"` + Password string `mapstructure:"password" yaml:"password"` +} + 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 5c066a2c..c362dfd1 100644 --- a/code/allapp/allapp-go/conf/dev/conf.yaml +++ b/code/allapp/allapp-go/conf/dev/conf.yaml @@ -22,6 +22,12 @@ pgsql: conn_max_lifetime: 30m sll_mode: false +redis: + host: 117.72.182.135 + port: 6379 + password: zhang520.. + db: 0 + log: level: "debug" dir: "./logs" @@ -33,3 +39,4 @@ log: wx: app_id: wxdab3e21a1f7e392f app_secret: 0895443c6fedfc21cb92c9cd60de2a26 + diff --git a/code/allapp/allapp-go/go.mod b/code/allapp/allapp-go/go.mod index b1b46006..c8367155 100644 --- a/code/allapp/allapp-go/go.mod +++ b/code/allapp/allapp-go/go.mod @@ -3,15 +3,15 @@ module allapp go 1.25.3 require ( - github.com/cloudwego/hertz v0.10.3 + github.com/cloudwego/hertz v0.10.4 github.com/golang-jwt/jwt/v4 v4.5.2 - github.com/hertz-contrib/jwt v1.0.4 github.com/hertz-contrib/requestid v1.1.0 - github.com/jackc/pgx/v5 v5.7.6 + github.com/jackc/pgx/v5 v5.8.0 github.com/pkg/errors v0.9.1 + github.com/shopspring/decimal v1.4.0 github.com/spf13/viper v1.21.0 go.uber.org/zap v1.27.1 - google.golang.org/protobuf v1.36.10 + google.golang.org/protobuf v1.36.11 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) @@ -23,22 +23,25 @@ require ( github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/bmatcuk/doublestar v1.3.4 // indirect github.com/bytedance/gopkg v0.1.3 // indirect - github.com/bytedance/sonic v1.14.2 // indirect - github.com/bytedance/sonic/loader v0.4.0 // indirect + github.com/bytedance/sonic v1.15.0 // indirect + github.com/bytedance/sonic/loader v0.5.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect - github.com/cloudwego/gopkg v0.1.7 // indirect + github.com/cloudwego/gopkg v0.1.8 // indirect github.com/cloudwego/netpoll v0.7.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/elastic/pkcs8 v1.0.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-openapi/inflect v0.21.3 // indirect github.com/go-sql-driver/mysql v1.9.3 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.24.0 // indirect + github.com/hertz-contrib/jwt v1.0.4 // indirect github.com/hertz-contrib/logger/zap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect @@ -47,10 +50,10 @@ require ( github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/nyaruka/phonenumbers v1.6.7 // indirect + github.com/nyaruka/phonenumbers v1.6.8 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/redis/go-redis/v9 v9.17.3 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect - github.com/shopspring/decimal v1.4.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect @@ -66,13 +69,13 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.23.0 // indirect - golang.org/x/crypto v0.45.0 // indirect - golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.31.0 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect + golang.org/x/mod v0.32.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect + golang.org/x/tools v0.41.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect xorm.io/builder v0.3.13 // indirect xorm.io/xorm v1.3.11 // indirect diff --git a/code/allapp/allapp-go/go.sum b/code/allapp/allapp-go/go.sum index de6b8615..b2ad0abb 100644 --- a/code/allapp/allapp-go/go.sum +++ b/code/allapp/allapp-go/go.sum @@ -21,17 +21,27 @@ github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= +github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= +github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= +github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI= github.com/cloudwego/gopkg v0.1.7 h1:P9+HwBwKIayJOg0V6hsxS3WVPzlad5BKxmDlZ8c8EkI= github.com/cloudwego/gopkg v0.1.7/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI= +github.com/cloudwego/gopkg v0.1.8 h1:ma9oACsY3v6xJwQ8NUc/h19GLV2ZCIjx0P6hqaSIlt4= +github.com/cloudwego/gopkg v0.1.8/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI= github.com/cloudwego/hertz v0.4.2/go.mod h1:K1U0RlU07CDeBINfHNbafH/3j9uSgIW8otbjUys3OPY= github.com/cloudwego/hertz v0.10.3 h1:NFcQAjouVJsod79XPLC/PaFfHgjMTYbiErmW+vGBi8A= github.com/cloudwego/hertz v0.10.3/go.mod h1:W5dUFXZPZkyfjMMo3EQrMQbofuvTsctM9IxmhbkuT18= +github.com/cloudwego/hertz v0.10.4 h1:xJxomApZYR67cROevam6SrtUBDvhcI4ZZhx/WgvpHwU= +github.com/cloudwego/hertz v0.10.4/go.mod h1:tZXEi/4o7R0Ho9yw5V2C+k/wVx3S8+wuuiJGDMopnpg= github.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= github.com/cloudwego/netpoll v0.7.2 h1:4qDBGQ6CG2SvEXhZSDxMdtqt/NLDxjAVk0PC/biKiJo= github.com/cloudwego/netpoll v0.7.2/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU= @@ -39,6 +49,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/elastic/pkcs8 v1.0.0 h1:HhitlUKxhN288kcNcYkjW6/ouvuwJWd9ioxpjnD9jVA= github.com/elastic/pkcs8 v1.0.0/go.mod h1:ipsZToJfq1MxclVTwpG7U/bgeDtf+0HkUiOxebk95+0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -56,6 +68,8 @@ github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= @@ -92,6 +106,8 @@ github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7Ulw github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk= github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= +github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= @@ -119,6 +135,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= github.com/nyaruka/phonenumbers v1.6.7 h1:WmebT8TNEzNaui5QlrGqbccRC6dZkEkYc+MGQoILSSo= github.com/nyaruka/phonenumbers v1.6.7/go.mod h1:7gjs+Lchqm49adhAKB5cdcng5ZXgt6x7Jgvi0ZorUtU= +github.com/nyaruka/phonenumbers v1.6.8 h1:k7HAJ/LeBkXE0vfbajITzTCZD0z0j+epdBNx43yTygk= +github.com/nyaruka/phonenumbers v1.6.8/go.mod h1:IUu45lj2bSeYXQuxDyyuzOrdV10tyRa1YSsfH8EKN5c= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -130,6 +148,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/v9 v9.17.3 h1:fN29NdNrE17KttK5Ndf20buqfDZwGNgoUr9qjl1DQx4= +github.com/redis/go-redis/v9 v9.17.3/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= @@ -206,14 +226,20 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -230,6 +256,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -244,6 +272,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -258,18 +288,24 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= diff --git a/code/allapp/allapp-go/idl/space/space.proto b/code/allapp/allapp-go/idl/space/space.proto index b638fa10..814ee573 100644 --- a/code/allapp/allapp-go/idl/space/space.proto +++ b/code/allapp/allapp-go/idl/space/space.proto @@ -13,6 +13,10 @@ service SpaceService { rpc DissolveSpace(DissolveSpaceParams) returns (DissolveSpaceResult){ option (api.post) = '/space/dissolve'; }; + // 进入空间 + rpc EnterSpace(EnterSpaceParams) returns (EnterSpaceResult){ + option (api.post) = '/space/enter'; + } } service SpaceUserService{ diff --git a/code/allapp/allapp-go/idl/space/space_types.proto b/code/allapp/allapp-go/idl/space/space_types.proto index 51d623f7..dff57608 100644 --- a/code/allapp/allapp-go/idl/space/space_types.proto +++ b/code/allapp/allapp-go/idl/space/space_types.proto @@ -25,3 +25,8 @@ message DissolveSpaceResult { } +message EnterSpaceParams { + int64 SpaceId = 1 [(api.body)="space_id"]; +} +message EnterSpaceResult { +} \ No newline at end of file diff --git a/code/allapp/allapp-go/main.go b/code/allapp/allapp-go/main.go index 41c2d99b..b0c9ebc9 100644 --- a/code/allapp/allapp-go/main.go +++ b/code/allapp/allapp-go/main.go @@ -7,6 +7,7 @@ import ( "allapp/logx" "allapp/utils/idgen" "allapp/utils/jwtx" + "allapp/utils/redisx" "github.com/cloudwego/hertz/pkg/app/server" "github.com/hertz-contrib/requestid" @@ -19,6 +20,8 @@ func main() { // 数据库 db.InitDB() + // Redis + redisx.Init() // 日志 logx.InitLog() // jwt diff --git a/code/allapp/allapp-go/utils/redisx/helper.go b/code/allapp/allapp-go/utils/redisx/helper.go new file mode 100644 index 00000000..91a031ca --- /dev/null +++ b/code/allapp/allapp-go/utils/redisx/helper.go @@ -0,0 +1,27 @@ +package redisx + +import ( + "context" + "time" +) + +// Set 设置 key +func Set(ctx context.Context, key string, value any, ttl time.Duration) error { + return Client().Set(ctx, key, value, ttl).Err() +} + +// Get 获取 string +func Get(ctx context.Context, key string) (string, error) { + return Client().Get(ctx, key).Result() +} + +// Del 删除 +func Del(ctx context.Context, keys ...string) error { + return Client().Del(ctx, keys...).Err() +} + +// Exists 是否存在 +func Exists(ctx context.Context, key string) (bool, error) { + n, err := Client().Exists(ctx, key).Result() + return n > 0, err +} diff --git a/code/allapp/allapp-go/utils/redisx/redis.go b/code/allapp/allapp-go/utils/redisx/redis.go new file mode 100644 index 00000000..fc1c08e5 --- /dev/null +++ b/code/allapp/allapp-go/utils/redisx/redis.go @@ -0,0 +1,49 @@ +package redisx + +import ( + "allapp/conf" + "context" + "fmt" + "sync" + "time" + + "github.com/redis/go-redis/v9" +) + +var ( + client *redis.Client + once sync.Once +) + +// Init 初始化 Redis(只会执行一次) +func Init() *redis.Client { + once.Do(func() { + redisConfig := conf.GetConf().Redis + + addr := fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port) + + client = redis.NewClient(&redis.Options{ + Addr: addr, + Password: redisConfig.Password, + DB: redisConfig.Db, + }) + + // 启动时检测连接 + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + if err := client.Ping(ctx).Err(); err != nil { + panic("redis 连接失败: " + err.Error()) + } + }) + + return client +} + +// Client 获取 Redis 客户端 +func Client() *redis.Client { + if client == nil { + panic("redis 尚未初始化") + } + return client +} diff --git a/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx b/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx index 13c5c50e..4981cfd7 100644 --- a/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx +++ b/code/allapp/allapp-rn/src/app/(tabs)/_layout.tsx @@ -1,43 +1,40 @@ -import type { icons } from 'lucide-react-native' import type { SortableGridRenderItem } from 'react-native-sortables' +import type { NavItem } from '@/store/navigation' import { Slot, usePathname, useRouter } from 'expo-router' import { useCallback, useEffect, useState } from 'react' -import { Pressable, Text, TouchableOpacity, Vibration, View } from 'react-native' +import { Text, TouchableOpacity, View } from 'react-native' import Animated, { useAnimatedRef } from 'react-native-reanimated' import Sortable from 'react-native-sortables' import { ADrawer, LucideIcon } from '@/components/common/ao' - -interface NavItem { - label: string - path: string - icon: keyof typeof icons -} - -const NAV_MENUS: NavItem[] = [ - { label: '记账', path: '/money', icon: 'CircleDollarSign' }, - { label: '恋爱记', path: '/love', icon: 'Heart' }, - { label: '聊天', path: '/chat', icon: 'MessageCircle' }, - { label: '个人中心', path: '/user', icon: 'CircleUserRound' }, -] +import { useNavStore } from '@/store/navigation' export default function TabsLayout() { const scrollableRef = useAnimatedRef() const router = useRouter() const pathname = usePathname() + const navStore = useNavStore() + const [showNavDrawer, setShowNavDrawer] = useState(false) - const [draggingId, setDraggingId] = useState('') + const [currentNav, setCurrentNav] = useState({ - label: '', - path: '', - icon: 'AArrowDown', + label: 'Welcome', + path: '/', + icon: 'Sparkles', }) useEffect(() => { - const current = NAV_MENUS.find(item => item.path === pathname) + const current = navStore.navMenus.find(item => item.path === pathname) if (current) { setCurrentNav(current) } + else { + setCurrentNav({ + label: 'Welcome', + path: '/', + icon: 'Sparkles', + }) + } }, [pathname]) const refreshPage = () => { @@ -46,15 +43,14 @@ export default function TabsLayout() { const renderNavItem = useCallback>( ({ item }) => ( - { @@ -66,7 +62,7 @@ export default function TabsLayout() { {item.label} - + ), [], ) @@ -86,6 +82,7 @@ export default function TabsLayout() { px-2 gap-4 " + style={{ zIndex: 0 }} > @@ -128,11 +125,15 @@ export default function TabsLayout() { columnGap={16} rowGap={16} columns={3} - data={NAV_MENUS} + data={navStore.navMenus} keyExtractor={item => item.path} renderItem={renderNavItem} scrollableRef={scrollableRef} autoScrollActivationOffset={200} + showDropIndicator + onDragEnd={(dragData) => { + navStore.setNavMenus(dragData.data) + }} /> diff --git a/code/allapp/allapp-rn/src/app/(tabs)/_layout2.tsx b/code/allapp/allapp-rn/src/app/(tabs)/_layout2.tsx deleted file mode 100644 index e69de29b..00000000 diff --git a/code/allapp/allapp-rn/src/app/(tabs)/index.tsx b/code/allapp/allapp-rn/src/app/(tabs)/index.tsx index ad9e78c2..dc0f8167 100644 --- a/code/allapp/allapp-rn/src/app/(tabs)/index.tsx +++ b/code/allapp/allapp-rn/src/app/(tabs)/index.tsx @@ -1,20 +1,34 @@ import { useRouter } from 'expo-router' -import { Text, View } from 'react-native' +import { Image, Text, View } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' import { AButton } from '@/components/common/ao' -// 这个页面的作用是作为占位页,避免进入 (tabs) layout 时出现 404 页面。 -// 如果想指定默认页面,可以通过 router.replace 或 TabTrigger 指向具体子页面。 + export default function Index() { const router = useRouter() return ( - - - { - router.push('/money') - }} + + + + + + + 🎉 欢迎使用 OneAO + + + + 记录生活,记录情绪,也记录每一笔重要的支出 + + + router.replace('/money')} > - 测试 + 开始使用 diff --git a/code/allapp/allapp-rn/src/app/(tabs)/money/index.tsx b/code/allapp/allapp-rn/src/app/(tabs)/money/index.tsx index 8c6cb1ec..4d8d1e53 100644 --- a/code/allapp/allapp-rn/src/app/(tabs)/money/index.tsx +++ b/code/allapp/allapp-rn/src/app/(tabs)/money/index.tsx @@ -1,20 +1,17 @@ import { useFocusEffect, useRouter } from 'expo-router' import React, { useCallback, useEffect, useState } from 'react' import { Image, Text, TouchableOpacity, View } from 'react-native' -import { Drawer } from 'react-native-drawer-layout' import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context' -import { ADatePicker, AListItem, LucideIcon } from '@/components/common/ao' +import { ADatePicker, ADrawer, AListItem, LucideIcon } from '@/components/common/ao' import { Fab, FabIcon } from '@/components/ui/fab' import { AddIcon } from '@/components/ui/icon' import { queryMoneyRecordsApi } from '@/request/api/money/record' -import { useAppStore } from '@/store/app' import { useMoneyRecordStore } from '@/store/moneyRecord' import { getCurrentYearMonth } from '@/utils/time' import { toast } from '@/utils/toast' import TransactionsList from './components/TransactionsList' export default function Money() { - const appStore = useAppStore() const moneyRecordStore = useMoneyRecordStore() const router = useRouter() // 安全高度 @@ -47,12 +44,6 @@ export default function Money() { }) } - useEffect(() => { - if (!appStore.ready) - return - getMoneyRecords() - }, [appStore.ready, searchParams]) - useFocusEffect( useCallback(() => { // 页面显示 / 返回时 @@ -68,120 +59,78 @@ export default function Money() { - setShowActionsMenu(true)} - onClose={() => setShowActionsMenu(false)} - drawerPosition="right" - drawerStyle={{ - width: '70%', - }} - renderDrawerContent={() => { - return ( - - - - - 管理功能 - - - { - router.navigate('/money/category/setting') - }} - /> - - - - - 统计分析 - - - - - - - ) + - - - setShowDatePicker(true)} - className="flex flex-row items-center gap-1" - > - {searchParams.record_time} - - - - { - setShowActionsMenu(true) - }} - > - - - - - - + setShowDatePicker(true)} + className="flex flex-row items-center gap-1" > - - - 收入 - - {moneyRecordStore.getTotalIncome()} - - + {searchParams.record_time} + + - - 支出 - - {moneyRecordStore.getTotalExpense()} - - + { + setShowActionsMenu(true) + }} + > + + - - 结余 - - {moneyRecordStore.getTotalBalance()} - - + + + + + + 收入 + + {moneyRecordStore.getTotalIncome()} + - {/* + 支出 + + {moneyRecordStore.getTotalExpense()} + + + + + 结余 + + {moneyRecordStore.getTotalBalance()} + + + + + {/* 点击设置 */} - + - - { - router.navigate({ - pathname: '/money/record/editor', - params: { id: data.id }, - }) - }} - onDetail={(id) => { - router.navigate({ - pathname: '/money/record/detail', - params: { id }, - }) - }} - onDelete={(id) => { - moneyRecordStore.deleteMoneyRecord(id) - }} - onRefreshData={() => { - getMoneyRecords() - }} - /> - - - { - router.navigate('/money/record/editor') - }} - > - - - - { - setSearchParams({ - ...searchParams, - record_time: val, + + { + router.navigate({ + pathname: '/money/record/editor', + params: { id: data.id }, }) - setShowDatePicker(false) }} - onClose={() => { - setShowDatePicker(false) + onDetail={(id) => { + router.navigate({ + pathname: '/money/record/detail', + params: { id }, + }) + }} + onDelete={(id) => { + moneyRecordStore.deleteMoneyRecord(id) + }} + onRefreshData={() => { + getMoneyRecords() }} /> - + + + { + router.navigate('/money/record/editor') + }} + className="mb-20" + > + + + + { + setSearchParams({ + ...searchParams, + record_time: val, + }) + setShowDatePicker(false) + }} + onClose={() => { + setShowDatePicker(false) + }} + /> + + { + setShowActionsMenu(false) + }} + menuPosition="right" + height="60%" + showHeader={false} + > + + + + + 管理功能 + + + { + router.navigate('/money/category/setting') + }} + /> + + + + + 统计分析 + + + + + + + ) } diff --git a/code/allapp/allapp-rn/src/app/auth/login.tsx b/code/allapp/allapp-rn/src/app/auth/login.tsx deleted file mode 100644 index 8578e399..00000000 --- a/code/allapp/allapp-rn/src/app/auth/login.tsx +++ /dev/null @@ -1,152 +0,0 @@ -import { useRouter } from 'expo-router' -import { useState } from 'react' -import { Image, Text, View } from 'react-native' -import { AButton, ACheckbox, AForm, AFormItem, AInput } from '@/components/common/ao' -import CustomHeader from '@/components/custom/Header' -import { IconQq, IconWeixin, IconZhiwen } from '@/components/iconfont' -import { Divider } from '@/components/ui/divider' -import useFormValidation from '@/hooks/useFormValidation' -import { loginDefaultApi } from '@/request/api/auth' -import { useAppStore } from '@/store/app' -import { useUserStore } from '@/store/user' -import { toast } from '@/utils/toast' - -interface LoginForm { - account: string - password: string - rememberMe: boolean - socialType?: 'qq' | 'weixin' | 'fingerprint' -} - -export default function AuthLogin() { - const router = useRouter() - const userStore = useUserStore() - const appStore = useAppStore() - - const [loading, setLoading] = useState(false) - const [form, setForm] = useState({ - account: userStore.userInfo?.account || '', - password: '', - rememberMe: true, - }) - - const handleInputChange = (field: keyof LoginForm, value: string) => { - setForm(prev => ({ ...prev, [field]: value })) - } - - const rules = { - account: { required: true, message: '账号是必填项' }, - password: { required: true, message: '密码是必填项' }, - } - - const { isValid } = useFormValidation(form, rules) - - const loginDefault = () => { - setLoading(true) - loginDefaultApi({ - account: form.account, - password: form.password, - }).then((res) => { - if (res.isSuccess) { - toast.show({ - title: '登录成功', - }) - - userStore.setUserInfo({ - account: form.account, - id: res.data.userId, - seqNo: res.data.seqNo, - username: res.data.username, - gender: res.data.gender, - token: res.data.token, - refreshToken: res.data.refreshToken, - rememberMe: form.rememberMe, - }) - - appStore.init() - - router.replace('/money') - } - else { - toast.show({ - title: res.message || '登录失败', - }) - } - }).catch((_err) => { - - }).finally(() => { - setLoading(false) - }) - } - - const loginQq = () => { - toast.show({ title: '功能待开发,请稍等. . .' }) - } - const loginWx = () => { - toast.show({ title: '功能待开发,请稍等. . .' }) - } - const loginZhiwen = () => { - toast.show({ title: '功能待开发,请稍等. . .' }) - } - - return ( - - - - - - - - handleInputChange('account', text)} - /> - - - - handleInputChange('password', text)} - /> - - - - - setForm(prev => ({ ...prev, rememberMe: checked }))} - label="记住我" - /> - - 忘记密码? - - - - 登录 - - - - - - - 社交账号 - - - - - - - - - - - - - - ) -} diff --git a/code/allapp/allapp-rn/src/app/auth/register.tsx b/code/allapp/allapp-rn/src/app/auth/register.tsx deleted file mode 100644 index b1ccc8d8..00000000 --- a/code/allapp/allapp-rn/src/app/auth/register.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import type { AFormRef } from '@/components/common/ao' -import { useRouter } from 'expo-router' -import { Lock, UserRound } from 'lucide-react-native' -import { useRef, useState } from 'react' - -import { Image, ScrollView, View } from 'react-native' -import { AButton, AForm, AFormItem, AInput } from '@/components/common/ao' -import CustomHeader from '@/components/custom/Header' -import { registerDefaultApi } from '@/request/api/auth' -import { toast } from '@/utils/toast' - -interface RegisterForm { - username: string - password: string - confirmPassword: string -} - -export default function AuthRegister() { - const router = useRouter() - const scrollRef = useRef(null) - - const [form, setForm] = useState({ - username: '', - password: '', - confirmPassword: '', - }) - const [loading, setLoading] = useState(false) - const formRef = useRef(null) - - const handleInputChange = (field: keyof RegisterForm, value: string) => { - setForm(prev => ({ ...prev, [field]: value })) - } - - const handleRegister = async () => { - if (formRef.current?.validate()) { - setLoading(true) - - await registerDefaultApi({ - account: form.username, - password: form.password, - }).then((res) => { - if (res.isSuccess) { - toast.show({ - title: '注册成功', - }) - router.replace('/auth/login') - } - else { - toast.show({ - title: res.message || '注册失败', - }) - } - }).catch((_err) => { - }).finally(() => { - setLoading(false) - }) - } - } - - return ( - - - - - - - - - handleInputChange('username', text)} - /> - - - - handleInputChange('password', text)} - /> - - - val === form.password, - message: '两次密码不一致', - }, - ]} - > - handleInputChange('confirmPassword', text)} - /> - - - - - - 注册 - - - - - - ) -} diff --git a/code/allapp/allapp-rn/src/components/common/ao/Drawer.tsx b/code/allapp/allapp-rn/src/components/common/ao/Drawer.tsx index 0c5a1bdb..ddbea8c2 100644 --- a/code/allapp/allapp-rn/src/components/common/ao/Drawer.tsx +++ b/code/allapp/allapp-rn/src/components/common/ao/Drawer.tsx @@ -1,19 +1,18 @@ import type { ReactNode } from 'react' import type { DimensionValue, ViewStyle } from 'react-native' -import React, { useCallback, useEffect, useRef, useState } from 'react' -import { - Animated, - Dimensions, - Modal, - Platform, - StyleSheet, - Text, - TouchableWithoutFeedback, - View, -} from 'react-native' +import React, { useEffect, useMemo, useState } from 'react' +import { Dimensions, StyleSheet, Text, View } from 'react-native' +import { Gesture, GestureDetector } from 'react-native-gesture-handler' +import Animated, { + interpolate, + runOnJS, + useAnimatedStyle, + useSharedValue, + withTiming, +} from 'react-native-reanimated' import LucideIcon from './LucideIcon' -const WINDOW = Dimensions.get('window') +const SCREEN = Dimensions.get('screen') interface DrawerMenuProps { visible: boolean @@ -27,218 +26,145 @@ interface DrawerMenuProps { CircleNum?: number isShadowHideModal?: boolean title?: string + showHeader?: boolean } export default function Drawer({ visible, - height, + height = 300, hideModal, duration = 300, isCircle, menuPosition = 'bottom', children, - CircleNum = 8, + CircleNum = 12, isShadowHideModal = true, header, title, + showHeader = true, }: DrawerMenuProps) { - const [menuPositionStyle, setMenuPositionStyle] = useState() - const [drawerMenuBox, setDrawerMenuBox] = useState() + const progress = useSharedValue(0) + const drag = useSharedValue(0) const [innerVisible, setInnerVisible] = useState(false) - const anim = useRef(new Animated.Value(0)).current - + /* ================= 显隐 ================= */ useEffect(() => { if (visible) { setInnerVisible(true) - open() + progress.value = withTiming(1, { duration }) } else { - close() + progress.value = withTiming(0, { duration }, () => { + runOnJS(setInnerVisible)(false) + }) } }, [visible]) - useEffect(() => { + /* ================= Drawer 尺寸 ================= */ + const drawerBox = useMemo(() => { switch (menuPosition) { case 'left': - setMenuPositionStyle({ - flex: 1, - backgroundColor: '#fff', - borderTopRightRadius: isCircle ? CircleNum : 0, - borderBottomRightRadius: isCircle ? CircleNum : 0, - }) - setDrawerMenuBox({ - width: height, - height: WINDOW.height, - position: 'absolute', - left: 0, - top: 0, - }) - break - + return { width: height, left: 0, top: 0, bottom: 0 } case 'right': - setMenuPositionStyle({ - flex: 1, - backgroundColor: '#fff', - borderTopLeftRadius: isCircle ? CircleNum : 0, - borderBottomLeftRadius: isCircle ? CircleNum : 0, - }) - setDrawerMenuBox({ - width: height, - height: WINDOW.height, - position: 'absolute', - right: 0, - top: 0, - }) - break - + return { width: height, right: 0, top: 0, bottom: 0 } case 'top': - setMenuPositionStyle({ - flex: 1, - backgroundColor: '#fff', - borderBottomLeftRadius: isCircle ? CircleNum : 0, - borderBottomRightRadius: isCircle ? CircleNum : 0, - }) - setDrawerMenuBox({ - width: WINDOW.width, - height, - position: 'absolute', - top: 0, - right: 0, - }) - break - + return { height, left: 0, right: 0, top: 0 } case 'bottom': default: - setMenuPositionStyle({ - flex: 1, - backgroundColor: '#fff', - borderTopLeftRadius: isCircle ? CircleNum : 0, - borderTopRightRadius: isCircle ? CircleNum : 0, - }) - setDrawerMenuBox({ - width: WINDOW.width, - height, - position: 'absolute', - bottom: 0, - right: 0, - }) - break + return { height, left: 0, right: 0, bottom: 0 } } - }, [menuPosition, height, isCircle, CircleNum]) + }, [menuPosition, height]) - /* ================== 动画 ================== */ - const open = () => { - Animated.timing(anim, { - toValue: 1, - duration, - useNativeDriver: true, - }).start() - } + /* ================= 动画样式(关键) ================= */ + const drawerStyle = useAnimatedStyle(() => { + switch (menuPosition) { + case 'bottom': { + const y = interpolate(progress.value, [0, 1], [SCREEN.height, 0], 'clamp') + return { transform: [{ translateY: y + drag.value }] } + } + case 'top': { + const y = interpolate(progress.value, [0, 1], [-SCREEN.height, 0], 'clamp') + return { transform: [{ translateY: y }] } + } + case 'left': { + const x = interpolate(progress.value, [0, 1], [-SCREEN.width, 0], 'clamp') + return { transform: [{ translateX: x }] } + } + case 'right': { + const x = interpolate(progress.value, [0, 1], [SCREEN.width, 0], 'clamp') + return { transform: [{ translateX: x }] } + } + default: + return {} + } + }) - const close = () => { - Animated.timing(anim, { - toValue: 0, - duration, - useNativeDriver: true, - }).start(({ finished }) => { - if (finished) { - setInnerVisible(false) - hideModal() + const maskStyle = useAnimatedStyle(() => ({ + opacity: interpolate(progress.value, [0, 1], [0, 0.45], 'clamp'), + })) + + /* ================= 手势(只给 bottom) ================= */ + const pan = Gesture.Pan() + .onUpdate((e) => { + if (menuPosition === 'bottom' && e.translationY > 0) { + drag.value = e.translationY + } + }) + .onEnd(() => { + if (menuPosition === 'bottom' && drag.value > 120) { + progress.value = withTiming(0, { duration }, () => { + drag.value = 0 + runOnJS(hideModal)() + }) + } + else { + drag.value = withTiming(0) } }) - } - - /* ================== 位移 ================== */ - const getTransform = useCallback(() => { - switch (menuPosition) { - case 'left': - return { - translateX: anim.interpolate({ - inputRange: [0, 1], - outputRange: [-WINDOW.width, 0], - }), - } - case 'right': - return { - translateX: anim.interpolate({ - inputRange: [0, 1], - outputRange: [WINDOW.width, 0], - }), - } - case 'top': - return { - translateY: anim.interpolate({ - inputRange: [0, 1], - outputRange: [-WINDOW.height, 0], - }), - } - case 'bottom': - default: - return { - translateY: anim.interpolate({ - inputRange: [0, 1], - outputRange: [WINDOW.height, 0], - }), - } - } - }, [menuPosition]) if (!innerVisible) return null return ( - + {/* 遮罩 */} - isShadowHideModal && close()}> - - + isShadowHideModal && hideModal()} + /> {/* Drawer */} - - - - {menuPosition !== 'bottom' && ( - - )} - - { - header || ( + + + + {showHeader && ( + header ?? ( {title} ) - } + )} + {children} - - + + - + ) } @@ -247,18 +173,25 @@ const styles = StyleSheet.create({ ...StyleSheet.absoluteFillObject, backgroundColor: '#000', }, - container: { - height: '100%', - width: '100%', + drawerBox: { position: 'absolute', }, + drawer: { + flex: 1, + backgroundColor: '#fff', + }, headTitle: { - width: '100%', - padding: 10, - justifyContent: 'center', + padding: 12, alignItems: 'center', + justifyContent: 'center', }, title: { fontSize: 18, + fontWeight: '600', + }, + close: { + position: 'absolute', + right: 16, + top: 12, }, }) diff --git a/code/allapp/allapp-rn/src/request/index.ts b/code/allapp/allapp-rn/src/request/index.ts index e1c32c43..9c71bff7 100644 --- a/code/allapp/allapp-rn/src/request/index.ts +++ b/code/allapp/allapp-rn/src/request/index.ts @@ -30,8 +30,8 @@ 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, diff --git a/code/allapp/allapp-rn/src/static/images/welcome.png b/code/allapp/allapp-rn/src/static/images/welcome.png new file mode 100644 index 00000000..51e36f88 Binary files /dev/null and b/code/allapp/allapp-rn/src/static/images/welcome.png differ diff --git a/code/allapp/allapp-rn/src/store/app.ts b/code/allapp/allapp-rn/src/store/app.ts index 9f229324..be92310d 100644 --- a/code/allapp/allapp-rn/src/store/app.ts +++ b/code/allapp/allapp-rn/src/store/app.ts @@ -26,21 +26,19 @@ export const useAppStore = create((set, get) => ({ const moneyCategoryStore = useMoneyCategoryStore.getState() const spaceStore = useSpaceStore.getState() - // 未登录:跳转到登录页,但认为初始化已完成(允许 UI 继续渲染) if (!userStore.isLoggedIn()) { navStore.navigateToAuth() set({ ready: true }) return } - // 登录状态:执行完整初始化流程 try { // 分类初始化 await moneyCategoryStore.init() // 获取空间信息 const res = await getUserSpaceApi() - spaceStore.setUserSpace(res.data) + spaceStore.setUserSpace(res.data) } catch (err) { console.error('app init error:', err) diff --git a/code/allapp/allapp-rn/src/store/navigation.ts b/code/allapp/allapp-rn/src/store/navigation.ts index b8f9473a..20739a16 100644 --- a/code/allapp/allapp-rn/src/store/navigation.ts +++ b/code/allapp/allapp-rn/src/store/navigation.ts @@ -1,21 +1,49 @@ +import type { icons } from 'lucide-react-native' +import AsyncStorage from '@react-native-async-storage/async-storage' import { router } from 'expo-router' -// store/navigation.ts import { create } from 'zustand' +import { createJSONStorage, persist } from 'zustand/middleware' + +export interface NavItem { + label: string + path: string + icon: keyof typeof icons +} interface NavState { + navMenus: NavItem[] pathname: string setPathname: (p: string) => void navigateToAuth: () => void + setNavMenus: (menus: NavItem[]) => void } -export const useNavStore = create(set => ({ - pathname: '/', - setPathname: (p: string) => set({ pathname: p }), - navigateToAuth: () => { - const pathname = useNavStore.getState().pathname +const DEFAULT_NAV_MENUS: NavItem[] = [ + { label: '记账', path: '/money', icon: 'CircleDollarSign' }, + { label: '恋爱记', path: '/love', icon: 'Heart' }, + { label: '聊天', path: '/chat', icon: 'MessageCircle' }, + { label: '个人中心', path: '/user', icon: 'CircleUserRound' }, +] - if (!pathname.startsWith('/auth')) { - router.replace('/auth') - } - }, -})) +export const useNavStore = create()( + persist( + (set, get) => ({ + pathname: '/', + navMenus: DEFAULT_NAV_MENUS, + + setPathname: (p: string) => set({ pathname: p }), + navigateToAuth: () => { + const pathname = useNavStore.getState().pathname + + if (!pathname.startsWith('/auth')) { + router.replace('/auth') + } + }, + setNavMenus: navMenus => set({ navMenus }), + }), + { + name: 'nav-storage', + storage: createJSONStorage(() => AsyncStorage), + }, + ), +) diff --git a/code/base-project/go.mod b/code/base-project/go.mod new file mode 100644 index 00000000..68dec248 --- /dev/null +++ b/code/base-project/go.mod @@ -0,0 +1,9 @@ +module allapp-go + +go 1.25.3 + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/redis/go-redis/v9 v9.17.3 // indirect +) diff --git a/code/base-project/go.sum b/code/base-project/go.sum new file mode 100644 index 00000000..cfd379aa --- /dev/null +++ b/code/base-project/go.sum @@ -0,0 +1,6 @@ +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/redis/go-redis/v9 v9.17.3 h1:fN29NdNrE17KttK5Ndf20buqfDZwGNgoUr9qjl1DQx4= +github.com/redis/go-redis/v9 v9.17.3/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= diff --git a/code/docusaurus b/code/docusaurus index 55d88676..4f58d5b9 160000 --- a/code/docusaurus +++ b/code/docusaurus @@ -1 +1 @@ -Subproject commit 55d88676f302e5e16d6da7a17ff21816d3c87613 +Subproject commit 4f58d5b99b0def543df87b1c72211456b00292dc