Browse Source

第三方登录

baxi 1 month ago
parent
commit
49f364a541
81 changed files with 10136 additions and 274 deletions
  1. 1 1
      assets/lobbyRes/scenes/Lobby.scene
  2. 385 7
      assets/lobbyRes/ui/home/HomeView.prefab
  3. 6374 55
      assets/lobbyRes/ui/login/LoginView.prefab
  4. 9 0
      assets/lobbyRes/ui/mail.meta
  5. 1039 0
      assets/lobbyRes/ui/mail/MailView.prefab
  6. 13 0
      assets/lobbyRes/ui/mail/MailView.prefab.meta
  7. 258 52
      assets/scenes/Test.scene
  8. 1 7
      assets/scripts/Test.ts
  9. 2 2
      assets/scripts/api/Config.ts
  10. 19 20
      assets/scripts/api/LobbyApi.ts
  11. 22 19
      assets/scripts/api/LoginApi.ts
  12. 8 32
      assets/scripts/api/PaymentApi.ts
  13. 0 29
      assets/scripts/api/WalletApi.ts
  14. 0 1
      assets/scripts/api/index.ts
  15. 7 3
      assets/scripts/app/AppConfig.ts
  16. 14 0
      assets/scripts/app/AppKernel.ts
  17. 9 0
      assets/scripts/components/button.meta
  18. 21 0
      assets/scripts/components/button/GoogleLoginBtn.ts
  19. 1 1
      assets/scripts/components/button/GoogleLoginBtn.ts.meta
  20. 6 2
      assets/scripts/define/Define.ts
  21. 5 0
      assets/scripts/define/ResDefine.ts
  22. 9 0
      assets/scripts/define/UIDefine.ts
  23. 132 16
      assets/scripts/framework/ui/UIManager.ts
  24. 13 0
      assets/scripts/framework/ui/UIView.ts
  25. 3 2
      assets/scripts/modules/lobby/ui/HomeView/GameItem.ts
  26. 8 1
      assets/scripts/modules/lobby/ui/HomeView/HomeView.ts
  27. 1 1
      assets/scripts/modules/lobby/ui/LoadingView.ts
  28. 143 6
      assets/scripts/modules/lobby/ui/LoginView.ts
  29. 9 0
      assets/scripts/modules/lobby/ui/MailView.meta
  30. 30 0
      assets/scripts/modules/lobby/ui/MailView/MailView.ts
  31. 9 0
      assets/scripts/modules/lobby/ui/MailView/MailView.ts.meta
  32. 9 0
      assets/scripts/platform/FaceBook.meta
  33. 15 0
      assets/scripts/platform/FaceBook/FBAndroidImpl.ts
  34. 9 0
      assets/scripts/platform/FaceBook/FBAndroidImpl.ts.meta
  35. 92 0
      assets/scripts/platform/FaceBook/FBH5Impl.ts
  36. 9 0
      assets/scripts/platform/FaceBook/FBH5Impl.ts.meta
  37. 16 0
      assets/scripts/platform/FaceBook/FBIOSImpl.ts
  38. 9 0
      assets/scripts/platform/FaceBook/FBIOSImpl.ts.meta
  39. 21 0
      assets/scripts/platform/FaceBook/Facebook.ts
  40. 9 0
      assets/scripts/platform/FaceBook/Facebook.ts.meta
  41. 28 0
      assets/scripts/platform/FaceBook/FacebookImpl.ts
  42. 9 0
      assets/scripts/platform/FaceBook/FacebookImpl.ts.meta
  43. 9 0
      assets/scripts/platform/Google.meta
  44. 21 0
      assets/scripts/platform/Google/Google.ts
  45. 9 0
      assets/scripts/platform/Google/Google.ts.meta
  46. 14 0
      assets/scripts/platform/Google/GoogleAndroidImpl.ts
  47. 9 0
      assets/scripts/platform/Google/GoogleAndroidImpl.ts.meta
  48. 268 0
      assets/scripts/platform/Google/GoogleH5Impl.ts
  49. 9 0
      assets/scripts/platform/Google/GoogleH5Impl.ts.meta
  50. 15 0
      assets/scripts/platform/Google/GoogleIOSImpl.ts
  51. 9 0
      assets/scripts/platform/Google/GoogleIOSImpl.ts.meta
  52. 40 0
      assets/scripts/platform/Google/GoogleImpl.ts
  53. 9 0
      assets/scripts/platform/Google/GoogleImpl.ts.meta
  54. 1 0
      assets/scripts/services/index.ts
  55. 0 1
      assets/scripts/services/lobby/LobbyService.ts
  56. 57 2
      assets/scripts/services/login/LoginService.ts
  57. 9 0
      assets/scripts/services/pay.meta
  58. 18 0
      assets/scripts/services/pay/PaymentServices.ts
  59. 9 0
      assets/scripts/services/pay/PaymentServices.ts.meta
  60. 9 0
      assets/scripts/store/checkInStore.meta
  61. 84 0
      assets/scripts/store/checkInStore/CheckInStore.ts
  62. 9 0
      assets/scripts/store/checkInStore/CheckInStore.ts.meta
  63. 30 0
      assets/scripts/store/checkInStore/data.ts
  64. 9 0
      assets/scripts/store/checkInStore/data.ts.meta
  65. 4 1
      assets/scripts/store/index.ts
  66. 9 0
      assets/scripts/store/mailStore.meta
  67. 102 0
      assets/scripts/store/mailStore/MailStore.ts
  68. 9 0
      assets/scripts/store/mailStore/MailStore.ts.meta
  69. 32 0
      assets/scripts/store/mailStore/data.ts
  70. 9 0
      assets/scripts/store/mailStore/data.ts.meta
  71. 135 9
      assets/scripts/store/mainStore/MainStore.ts
  72. 18 0
      assets/scripts/store/mainStore/data.ts
  73. 9 0
      assets/scripts/store/payStore.meta
  74. 200 0
      assets/scripts/store/payStore/PayStore.ts
  75. 9 0
      assets/scripts/store/payStore/PayStore.ts.meta
  76. 114 0
      assets/scripts/store/payStore/data.ts
  77. 9 0
      assets/scripts/store/payStore/data.ts.meta
  78. 23 1
      assets/scripts/utils/Helper.ts
  79. 8 0
      assets/scripts/utils/ResHelper.ts
  80. 9 0
      assets/scripts/utils/ResHelper.ts.meta
  81. 13 3
      assets/scripts/utils/UIHelper.ts

+ 1 - 1
assets/lobbyRes/scenes/Lobby.scene

@@ -120,7 +120,7 @@
     "_priority": 0,
     "_fov": 45,
     "_fovAxis": 0,
-    "_orthoHeight": 375,
+    "_orthoHeight": 380.5473214285714,
     "_near": 1,
     "_far": 2000,
     "_color": {

+ 385 - 7
assets/lobbyRes/ui/home/HomeView.prefab

@@ -35,22 +35,25 @@
       },
       {
         "__id__": 32
+      },
+      {
+        "__id__": 38
       }
     ],
     "_active": true,
     "_components": [
       {
-        "__id__": 38
+        "__id__": 52
       },
       {
-        "__id__": 40
+        "__id__": 54
       },
       {
-        "__id__": 42
+        "__id__": 56
       }
     ],
     "_prefab": {
-      "__id__": 44
+      "__id__": 58
     },
     "_lpos": {
       "__type__": "cc.Vec3",
@@ -919,18 +922,390 @@
     "targetOverrides": null,
     "nestedPrefabInstanceRoots": null
   },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnMail",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 39
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 45
+      },
+      {
+        "__id__": 47
+      },
+      {
+        "__id__": 49
+      }
+    ],
+    "_prefab": {
+      "__id__": 51
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 350,
+      "y": 300,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 38
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 40
+      },
+      {
+        "__id__": 42
+      }
+    ],
+    "_prefab": {
+      "__id__": 44
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
   {
     "__type__": "cc.UITransform",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
     "node": {
-      "__id__": 1
+      "__id__": 39
     },
     "_enabled": true,
     "__prefab": {
+      "__id__": 41
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "2cYtWLs1BBp4s3bSmdb1qX"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
       "__id__": 39
     },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 43
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "邮件",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "35tOOm1gtPnr7PHe85fCSD"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "1fzQprTdFGYph7okHQZ8NK",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 38
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 46
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "afkfdMC5lH7bsmDa9LM2mZ"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 38
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 48
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "51w6qA8+tCG66LFiwe9et1"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 38
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 50
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 38
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "75fcRpE7RCX6VG23e8UB61"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "acOFHB1PBK6oi1u5kY01ud",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 53
+    },
     "_contentSize": {
       "__type__": "cc.Size",
       "width": 1334,
@@ -957,7 +1332,7 @@
     },
     "_enabled": true,
     "__prefab": {
-      "__id__": 41
+      "__id__": 55
     },
     "_alignFlags": 45,
     "_target": null,
@@ -993,7 +1368,7 @@
     },
     "_enabled": true,
     "__prefab": {
-      "__id__": 43
+      "__id__": 57
     },
     "lblNickName": {
       "__id__": 17
@@ -1004,6 +1379,9 @@
     "gameRoot": {
       "__id__": 28
     },
+    "btnMail": {
+      "__id__": 38
+    },
     "_id": ""
   },
   {

+ 6374 - 55
assets/lobbyRes/ui/login/LoginView.prefab

@@ -26,22 +26,43 @@
       },
       {
         "__id__": 14
+      },
+      {
+        "__id__": 30
+      },
+      {
+        "__id__": 44
+      },
+      {
+        "__id__": 58
+      },
+      {
+        "__id__": 74
+      },
+      {
+        "__id__": 186
+      },
+      {
+        "__id__": 244
+      },
+      {
+        "__id__": 258
       }
     ],
     "_active": true,
     "_components": [
       {
-        "__id__": 28
+        "__id__": 272
       },
       {
-        "__id__": 30
+        "__id__": 274
       },
       {
-        "__id__": 32
+        "__id__": 276
       }
     ],
     "_prefab": {
-      "__id__": 34
+      "__id__": 278
     },
     "_lpos": {
       "__type__": "cc.Vec3",
@@ -232,7 +253,7 @@
     "_lpos": {
       "__type__": "cc.Vec3",
       "x": 0,
-      "y": 0,
+      "y": 216.4,
       "z": 0
     },
     "_lrot": {
@@ -369,8 +390,8 @@
   },
   {
     "__type__": "cc.Node",
-    "_name": "btnGuest",
-    "_objFlags": 0,
+    "_name": "btnLogout",
+    "_objFlags": 512,
     "__editorExtras__": {},
     "_parent": {
       "__id__": 1
@@ -390,15 +411,18 @@
       },
       {
         "__id__": 25
+      },
+      {
+        "__id__": 27
       }
     ],
     "_prefab": {
-      "__id__": 27
+      "__id__": 29
     },
     "_lpos": {
       "__type__": "cc.Vec3",
-      "x": 0,
-      "y": -143.5,
+      "x": 563.14,
+      "y": 305.496,
       "z": 0
     },
     "_lrot": {
@@ -500,7 +524,7 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "3da11JahpLj6t0jD50m016"
+    "fileId": "aatode2qhJRJ9Zp699w/3X"
   },
   {
     "__type__": "cc.Label",
@@ -524,7 +548,7 @@
       "b": 0,
       "a": 255
     },
-    "_string": "游客登录",
+    "_string": "LogOut",
     "_horizontalAlign": 1,
     "_verticalAlign": 1,
     "_actualFontSize": 20,
@@ -568,7 +592,7 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "5afLfLKZdH/6uC+9iDSFvr"
+    "fileId": "f1JS89+QhDaJdOsy06pd22"
   },
   {
     "__type__": "cc.PrefabInfo",
@@ -578,7 +602,7 @@
     "asset": {
       "__id__": 0
     },
-    "fileId": "75X/LUVgNEObDjZIFpeDKs",
+    "fileId": "bb7RCqhC1LmqVF4xw/l8tI",
     "instance": null,
     "targetOverrides": null,
     "nestedPrefabInstanceRoots": null
@@ -609,7 +633,7 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "15P4LDyHlE+ogDfqOKC/bM"
+    "fileId": "d5uy3C/7FBB7W8U+hJQmg3"
   },
   {
     "__type__": "cc.Sprite",
@@ -654,7 +678,7 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "6azv3ZrbpJa7HKzW3CRVNy"
+    "fileId": "dbyL+yCR5FFaBF2p+xyxjd"
   },
   {
     "__type__": "cc.Button",
@@ -724,7 +748,43 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "81Umle5pJH278c+/g/h2Sp"
+    "fileId": "44MTOuEOxLqakGiu+P5M4D"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 14
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 28
+    },
+    "_alignFlags": 33,
+    "_target": null,
+    "_left": 0,
+    "_right": 53.860000000000014,
+    "_top": 49.50400000000002,
+    "_bottom": 0,
+    "_horizontalCenter": 0,
+    "_verticalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 0,
+    "_originalHeight": 0,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "d6U3cx1LZGipzjmbs0lF9K"
   },
   {
     "__type__": "cc.PrefabInfo",
@@ -734,27 +794,134 @@
     "asset": {
       "__id__": 0
     },
-    "fileId": "60EdYBxVpPGaO1uryTZTGF",
+    "fileId": "be8beVumdF7oaNjEbuKuT4",
     "instance": null,
     "targetOverrides": null,
     "nestedPrefabInstanceRoots": null
   },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnGuest",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 31
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 37
+      },
+      {
+        "__id__": 39
+      },
+      {
+        "__id__": 41
+      }
+    ],
+    "_prefab": {
+      "__id__": 43
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 200,
+      "y": -250,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 30
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 32
+      },
+      {
+        "__id__": 34
+      }
+    ],
+    "_prefab": {
+      "__id__": 36
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
   {
     "__type__": "cc.UITransform",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
     "node": {
-      "__id__": 1
+      "__id__": 31
     },
     "_enabled": true,
     "__prefab": {
-      "__id__": 29
+      "__id__": 33
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 1280,
-      "height": 720
+      "width": 100,
+      "height": 40
     },
     "_anchorPoint": {
       "__type__": "cc.Vec2",
@@ -765,58 +932,6210 @@
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "numEYgChRzLEkacMhSrrjB"
+    "fileId": "3da11JahpLj6t0jD50m016"
   },
   {
-    "__type__": "cc.Widget",
+    "__type__": "cc.Label",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
     "node": {
-      "__id__": 1
+      "__id__": 31
     },
     "_enabled": true,
     "__prefab": {
-      "__id__": 31
+      "__id__": 35
     },
-    "_alignFlags": 45,
-    "_target": null,
-    "_left": 0,
-    "_right": 0,
-    "_top": 0,
-    "_bottom": 0,
-    "_horizontalCenter": 0,
-    "_verticalCenter": 0,
-    "_isAbsLeft": true,
-    "_isAbsRight": true,
-    "_isAbsTop": true,
-    "_isAbsBottom": true,
-    "_isAbsHorizontalCenter": true,
-    "_isAbsVerticalCenter": true,
-    "_originalWidth": 100,
-    "_originalHeight": 100,
-    "_alignMode": 2,
-    "_lockFlags": 0,
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "游客登录",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
     "_id": ""
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "c9NIh+KsUTQkaMufSxiCJk"
+    "fileId": "5afLfLKZdH/6uC+9iDSFvr"
   },
   {
-    "__type__": "0fef1W7qa5DY6adtEhIyauC",
-    "_name": "",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "node": {
+    "__type__": "cc.PrefabInfo",
+    "root": {
       "__id__": 1
     },
-    "_enabled": true,
-    "__prefab": {
-      "__id__": 33
+    "asset": {
+      "__id__": 0
     },
-    "btnGuest": {
-      "__id__": 25
+    "fileId": "75X/LUVgNEObDjZIFpeDKs",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 30
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 38
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "15P4LDyHlE+ogDfqOKC/bM"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 30
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 40
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6azv3ZrbpJa7HKzW3CRVNy"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 30
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 42
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 30
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "81Umle5pJH278c+/g/h2Sp"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "60EdYBxVpPGaO1uryTZTGF",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnFacebook",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 45
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 51
+      },
+      {
+        "__id__": 53
+      },
+      {
+        "__id__": 55
+      }
+    ],
+    "_prefab": {
+      "__id__": 57
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -200,
+      "y": -250,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 44
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 46
+      },
+      {
+        "__id__": 48
+      }
+    ],
+    "_prefab": {
+      "__id__": 50
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 45
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 47
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "09pmKRqYxESqOlWE+Yb6+8"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 45
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 49
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "FaceBook",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "b5hhTdAEhBfakzYlgvUteO"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "c9QGsArh9Am4NJvIoV3b9T",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 44
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 52
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "06SUOF0uRI2aletAtqF9iS"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 44
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 54
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "3bmrip7LFL0YwSH49bgNt+"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 44
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 56
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 44
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "a0JBfJCC1A77K4c6nctRib"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "8fik8eipJC7IuwG8LGCsQA",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnGoogle",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 59
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 65
+      },
+      {
+        "__id__": 67
+      },
+      {
+        "__id__": 69
+      },
+      {
+        "__id__": 71
+      }
+    ],
+    "_prefab": {
+      "__id__": 73
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": -250,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 58
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 60
+      },
+      {
+        "__id__": 62
+      }
+    ],
+    "_prefab": {
+      "__id__": 64
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 59
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 61
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "3deZ/DB0RFXLp3Tued2lTZ"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 59
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 63
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "Google",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "e7GDYAldFJPpnXNLRcLW0+"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "bdkEGKz2tC25EpSd2Ihw0z",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 58
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 66
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "5a0d68vfdP94r3fyCd1nQD"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 58
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 68
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "4aiypdC3NMmIOI6Ipk6P/+"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 58
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 70
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 58
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "3d/z4RcopPK6aKxr1UnDEk"
+  },
+  {
+    "__type__": "f0421HL4vlFLJbGTngmgT4g",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 58
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 72
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "349WZWhb1PCZfr/QHnegDA"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "e7P/Lm5yBM5507wCMbIlq3",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "registerNode",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 75
+      },
+      {
+        "__id__": 95
+      },
+      {
+        "__id__": 115
+      },
+      {
+        "__id__": 129
+      },
+      {
+        "__id__": 149
+      },
+      {
+        "__id__": 169
+      }
+    ],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 183
+      }
+    ],
+    "_prefab": {
+      "__id__": 185
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 61.46,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Account",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 76
+      },
+      {
+        "__id__": 82
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 88
+      },
+      {
+        "__id__": 90
+      },
+      {
+        "__id__": 92
+      }
+    ],
+    "_prefab": {
+      "__id__": 94
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 75,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 75
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 77
+      },
+      {
+        "__id__": 79
+      }
+    ],
+    "_prefab": {
+      "__id__": 81
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 76
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 78
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "80pC8UeZ9J+qGNyvrbj+OU"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 76
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 80
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "529Jr2bhdHHaXuJohXDQPw"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "a0JHbW0WZKOpywn8R2IJHw",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 75
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 83
+      },
+      {
+        "__id__": 85
+      }
+    ],
+    "_prefab": {
+      "__id__": 87
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 82
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 84
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "0523bp7npOyq5JkK2hR/IC"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 82
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 86
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Enter your email or phone number",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "f4lJEkIzlJH5S4+xekrom2"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "2eDGQYLlZIG73vrNvvpbrR",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 75
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 89
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 469.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "9cl5iYZHdHOKdbYf2mEBys"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 75
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 91
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "ee4Hk1XctDOa5k+wFQw7dF"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 75
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 93
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 79
+    },
+    "_placeholderLabel": {
+      "__id__": 85
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 10,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "506gtT6eZKzrMx4uzCQh1W"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "294aCEA/FI8JcpcPPvVrYV",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Code",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 96
+      },
+      {
+        "__id__": 102
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 108
+      },
+      {
+        "__id__": 110
+      },
+      {
+        "__id__": 112
+      }
+    ],
+    "_prefab": {
+      "__id__": 114
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -92.726,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 95
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 97
+      },
+      {
+        "__id__": 99
+      }
+    ],
+    "_prefab": {
+      "__id__": 101
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -140.138,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 96
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 98
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 282.276,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "aclFa8Ck5IZK8KerqPzrak"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 96
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 100
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "0fRJPACGhMgLIARjwnMaay"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "23qeo6PSFKc6Z9Vqnwcpza",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 95
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 103
+      },
+      {
+        "__id__": 105
+      }
+    ],
+    "_prefab": {
+      "__id__": 107
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -140.138,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 102
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 104
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 282.276,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "03Fj0O2j1Cwq831kQjvRhY"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 102
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 106
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Enter 6-digit code",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "caFJM1v4RE3aMgy1QHj2hA"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "67mVyB53xCAbN41a7QzKgj",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 95
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 109
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 284.276,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6dh76K4wlM2a+UNwuCrpbf"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 95
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 111
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "741kDM3c5G1Jhanji2CXvg"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 95
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 113
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 99
+    },
+    "_placeholderLabel": {
+      "__id__": 105
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 8,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "f3uasjCR5POpnBTodPOWNS"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "2aqxd96FtIzbGkGGBMhPhD",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnCode",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 116
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 122
+      },
+      {
+        "__id__": 124
+      },
+      {
+        "__id__": 126
+      }
+    ],
+    "_prefab": {
+      "__id__": 128
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 161.79599999999996,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 115
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 117
+      },
+      {
+        "__id__": 119
+      }
+    ],
+    "_prefab": {
+      "__id__": 121
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 116
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 118
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "53tb8NeNtGEaYPG47Y9ZNR"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 116
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 120
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "Send Code",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "f7gUrM4vdMHKg7++oqTFDO"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "f5jkAhzRRIWbVbquqTeM8v",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 115
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 123
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 131.008,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "592qWaeUJKYaOUQv9nx+Jj"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 115
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 125
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "76NY7VUoxBVrem5WOGDbsz"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 115
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 127
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 115
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "c6xtJWiTFD5rvXIN+Nxl3S"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "5fQAaUnsRPrrt9HOr8O9YA",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Password",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 130
+      },
+      {
+        "__id__": 136
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 142
+      },
+      {
+        "__id__": 144
+      },
+      {
+        "__id__": 146
+      }
+    ],
+    "_prefab": {
+      "__id__": 148
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": -75,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 129
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 131
+      },
+      {
+        "__id__": 133
+      }
+    ],
+    "_prefab": {
+      "__id__": 135
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 130
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 132
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "d5QZCeBPhCEaEe4eX7oCuA"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 130
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 134
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "1fMLz+fv9Phb7FLNAEWnRk"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "00+55oqFxBzZWdl2EXJw8U",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 129
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 137
+      },
+      {
+        "__id__": 139
+      }
+    ],
+    "_prefab": {
+      "__id__": 141
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 136
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 138
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "dd4gKfpANDqa6I9TjtZICt"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 136
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 140
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Create a password",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "92HMbYdx5ARIPSwqFwT3kd"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "ae6CvnLBhHU5n6w66Rq/co",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 129
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 143
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 469.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "86s8PfcsFDPoMIxb9NCM7S"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 129
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 145
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "e3EDieVIdF8ovLDFIobEi8"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 129
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 147
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 133
+    },
+    "_placeholderLabel": {
+      "__id__": 139
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 8,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "3agRmv/wBInKFMGu75BF6Y"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "ee21acCBFG5JiAORtZpeJm",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "RePassword",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 150
+      },
+      {
+        "__id__": 156
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 162
+      },
+      {
+        "__id__": 164
+      },
+      {
+        "__id__": 166
+      }
+    ],
+    "_prefab": {
+      "__id__": 168
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": -150,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 149
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 151
+      },
+      {
+        "__id__": 153
+      }
+    ],
+    "_prefab": {
+      "__id__": 155
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 150
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 152
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "767Jasl7BP846j+9zqyXnN"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 150
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 154
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "84Rico9eFNUoILdHM8ZROv"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "0e5uL9h1BBh4lHikWylM8Y",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 149
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 157
+      },
+      {
+        "__id__": 159
+      }
+    ],
+    "_prefab": {
+      "__id__": 161
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 156
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 158
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "911VLyjb9PsYrpPhDVW5lS"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 156
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 160
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Confirm password",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "e9Fpw3PFhAhbytBcZHOlHY"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "03axonavxOr6Rvo48SP9Fa",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 149
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 163
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 469.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "795k1fWsNHg6S3FLOSW1uB"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 149
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 165
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "93VTE/9IFPwZsyE5/duowN"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 149
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 167
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 153
+    },
+    "_placeholderLabel": {
+      "__id__": 159
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 8,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "02dWjn2/5Bm5iIfsjQBKja"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "d30q8slkxLFrUqrOOxLfnl",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnRegister",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 74
+    },
+    "_children": [
+      {
+        "__id__": 170
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 176
+      },
+      {
+        "__id__": 178
+      },
+      {
+        "__id__": 180
+      }
+    ],
+    "_prefab": {
+      "__id__": 182
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": -225,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 169
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 171
+      },
+      {
+        "__id__": 173
+      }
+    ],
+    "_prefab": {
+      "__id__": 175
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 170
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 172
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "694G/O5d9Lf4XrI3S0cyYp"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 170
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 174
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "Register",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6eDIcWMP1HKavnG+dfZGbu"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "93X2xlFm9JO7wVcA8uexFQ",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 169
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 177
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 131.008,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "8c4734nzdCsYZI3XaOOUfL"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 169
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 179
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "ceCKnyDARJLZqv2QD38TPW"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 169
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 181
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 169
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "34PUU56aVFxb2Fn7Zyu8Lu"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "a9+Lhp8ZZL7J6fgDPLpDYo",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 74
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 184
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 100
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "29LBLcC6xBIL10iceEImYr"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "f6nJJ2/m1C5YRrREhSSeox",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "loginNode",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 187
+      },
+      {
+        "__id__": 207
+      },
+      {
+        "__id__": 227
+      }
+    ],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 241
+      }
+    ],
+    "_prefab": {
+      "__id__": 243
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 61.46,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Account",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 186
+    },
+    "_children": [
+      {
+        "__id__": 188
+      },
+      {
+        "__id__": 194
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 200
+      },
+      {
+        "__id__": 202
+      },
+      {
+        "__id__": 204
+      }
+    ],
+    "_prefab": {
+      "__id__": 206
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 75,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 187
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 189
+      },
+      {
+        "__id__": 191
+      }
+    ],
+    "_prefab": {
+      "__id__": 193
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 188
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 190
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6cpvmmuEVCf6DlvVqgVyaE"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 188
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 192
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "79uDnUQktHlImkm7E+mdmD"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "37Q2q9oOBDJopVbt53gVeR",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 187
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 195
+      },
+      {
+        "__id__": 197
+      }
+    ],
+    "_prefab": {
+      "__id__": 199
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 194
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 196
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "afjJJWa+tEMas1wHwpx8HT"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 194
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 198
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Enter your email or phone number",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "1cj7Z37StLS517LkQpBv79"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "80e7Z4MeJDi5qnt6nkxT9e",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 187
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 201
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 469.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "9aRJlI/m1DSJ97gb6sSpRR"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 187
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 203
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "08f1yU3FVEirISy6QOzI7w"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 187
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 205
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 191
+    },
+    "_placeholderLabel": {
+      "__id__": 197
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 10,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "58zuji5XtKJ6v3b8nZGj+5"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "a0tG4o+SRCrbzv0YXslBRX",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Password",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 186
+    },
+    "_children": [
+      {
+        "__id__": 208
+      },
+      {
+        "__id__": 214
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 220
+      },
+      {
+        "__id__": 222
+      },
+      {
+        "__id__": 224
+      }
+    ],
+    "_prefab": {
+      "__id__": 226
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "TEXT_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 207
+    },
+    "_children": [],
+    "_active": false,
+    "_components": [
+      {
+        "__id__": 209
+      },
+      {
+        "__id__": 211
+      }
+    ],
+    "_prefab": {
+      "__id__": 213
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 208
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 210
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "02eWrha29Fu5YDaagfv3fu"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 208
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 212
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 40,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "14ajlbvlRLVYvOiApNhY0i"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "44rhOnUC9Etr7vgz700h1c",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "PLACEHOLDER_LABEL",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 207
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 215
+      },
+      {
+        "__id__": 217
+      }
+    ],
+    "_prefab": {
+      "__id__": 219
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -232.8645,
+      "y": 20,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 214
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 216
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 467.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 1
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "17CWz+y1VFRpsWciEXUCmG"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 214
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 218
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 187,
+      "g": 187,
+      "b": 187,
+      "a": 255
+    },
+    "_string": "Create a password",
+    "_horizontalAlign": 0,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6dUyZWfW9I75t9nPwSdKYL"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "73hccGDf5Em6UOtXZ9Gg7k",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 207
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 221
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 469.729,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "e0okFFc9NEi6OfaJqdkgFz"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 207
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 223
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "873r2t8MxLirqvS4UIPcjk"
+  },
+  {
+    "__type__": "cc.EditBox",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 207
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 225
+    },
+    "editingDidBegan": [],
+    "textChanged": [],
+    "editingDidEnded": [],
+    "editingReturn": [],
+    "_textLabel": {
+      "__id__": 211
+    },
+    "_placeholderLabel": {
+      "__id__": 217
+    },
+    "_returnType": 0,
+    "_string": "",
+    "_tabIndex": 0,
+    "_backgroundImage": {
+      "__uuid__": "bd1bcaba-bd7d-4a71-b143-997c882383e4@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_inputFlag": 5,
+    "_inputMode": 6,
+    "_maxLength": 8,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "130iWiD0xJLZGu5/xTVLMh"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "a6PEeZVlpN/ZrJJU8EEHYt",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnLogin",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 186
+    },
+    "_children": [
+      {
+        "__id__": 228
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 234
+      },
+      {
+        "__id__": 236
+      },
+      {
+        "__id__": 238
+      }
+    ],
+    "_prefab": {
+      "__id__": 240
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": -75,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 227
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 229
+      },
+      {
+        "__id__": 231
+      }
+    ],
+    "_prefab": {
+      "__id__": 233
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 228
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 230
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "a03vA4d05A9ohKARF1H9qp"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 228
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 232
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "Login",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "5bSKaa7OFOMr+iVGKfQ9s/"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "54VdTZ7J9ID44X/y0dUbbg",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 227
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 235
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 131.008,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "523P7crxVJRZ2DjnMVRV/z"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 227
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 237
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "caq+te2xREioWHT3HU0iap"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 227
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 239
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 227
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "a0tV/c93tJfpchLTyf4l36"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "48d0e1eqBGZK1nx9WyXcUv",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 186
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 242
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 100
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "caaC0xsKFCPb/etZPoXK0S"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "55G6giz6JI3rgyl5fvjp3c",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnLogin",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 245
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 251
+      },
+      {
+        "__id__": 253
+      },
+      {
+        "__id__": 255
+      }
+    ],
+    "_prefab": {
+      "__id__": 257
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -100,
+      "y": -310,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 244
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 246
+      },
+      {
+        "__id__": 248
+      }
+    ],
+    "_prefab": {
+      "__id__": 250
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 245
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 247
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "5c/RCFwqFOfaN9oDoTvcYk"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 245
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 249
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "登录界面",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "7eVwe/USxDNqw3uC9Rwh/T"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "a9xoGB1i1E65mOfkI1AEc9",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 244
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 252
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 120,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "698nsVZmZAUpGThni9RRWq"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 244
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 254
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "23A2OauR5GdIVrZJg6PExg"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 244
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 256
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 244
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "50N9ccUoFLD6c2Zs76UTIK"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "d2rW2qfiJFBaoXOxqK81Mw",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnRegister",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 259
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 265
+      },
+      {
+        "__id__": 267
+      },
+      {
+        "__id__": 269
+      }
+    ],
+    "_prefab": {
+      "__id__": 271
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 100,
+      "y": -310,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 258
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 260
+      },
+      {
+        "__id__": 262
+      }
+    ],
+    "_prefab": {
+      "__id__": 264
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 259
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 261
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "4aoQ4hNa9P6rb6IwBXqonM"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 259
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 263
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "注册界面",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "daS5U+cw9Lo4lIxX6cFUqs"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "4cSDfxmV5CTYVRl4qfvoNL",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 258
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 266
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 120,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "29FbPZYtJBQ4jEpagdYVdf"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 258
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 268
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6cZF1AEDlMPa/sqd4dAaSG"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 258
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 270
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 258
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "afh5Ko+xtPnqUwhG9UIW21"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "eeuIc46vlOxICT3LEv7lCG",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 273
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1334,
+      "height": 750
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "numEYgChRzLEkacMhSrrjB"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 275
+    },
+    "_alignFlags": 45,
+    "_target": null,
+    "_left": 0,
+    "_right": 0,
+    "_top": 0,
+    "_bottom": 0,
+    "_horizontalCenter": 0,
+    "_verticalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 100,
+    "_originalHeight": 100,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "c9NIh+KsUTQkaMufSxiCJk"
+  },
+  {
+    "__type__": "0fef1W7qa5DY6adtEhIyauC",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 277
+    },
+    "btnGuest": {
+      "__id__": 41
+    },
+    "btnFacebook": {
+      "__id__": 55
+    },
+    "btnGoogle": {
+      "__id__": 69
+    },
+    "btnLogOut": {
+      "__id__": 25
+    },
+    "registerNode": {
+      "__id__": 74
+    },
+    "loginNode": {
+      "__id__": 186
+    },
+    "btnRegisterNode": {
+      "__id__": 258
+    },
+    "btnLoginNode": {
+      "__id__": 244
+    },
+    "loginAccount": {
+      "__id__": 204
+    },
+    "loginPassword": {
+      "__id__": 224
+    },
+    "registerAccount": {
+      "__id__": 92
+    },
+    "registerCode": {
+      "__id__": 112
+    },
+    "registerPw": {
+      "__id__": 146
+    },
+    "btnRegister": {
+      "__id__": 169
+    },
+    "btnLogin": {
+      "__id__": 227
+    },
+    "btnSend": {
+      "__id__": 115
     },
     "_id": ""
   },

+ 9 - 0
assets/lobbyRes/ui/mail.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "8d0f766a-9f15-4650-a61d-ef92b921d6c0",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 1039 - 0
assets/lobbyRes/ui/mail/MailView.prefab

@@ -0,0 +1,1039 @@
+[
+  {
+    "__type__": "cc.Prefab",
+    "_name": "MailView",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_native": "",
+    "data": {
+      "__id__": 1
+    },
+    "optimizationPolicy": 0,
+    "persistent": false
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "MailView",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": null,
+    "_children": [
+      {
+        "__id__": 2
+      },
+      {
+        "__id__": 12
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 38
+      },
+      {
+        "__id__": 40
+      },
+      {
+        "__id__": 42
+      }
+    ],
+    "_prefab": {
+      "__id__": 44
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "shadow",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 3
+      },
+      {
+        "__id__": 5
+      },
+      {
+        "__id__": 7
+      },
+      {
+        "__id__": 9
+      }
+    ],
+    "_prefab": {
+      "__id__": 11
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 4
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1334,
+      "height": 750
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "0e3UjYPWVGE6rMC/+lm0O8"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 6
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 150
+    },
+    "_spriteFrame": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "b93xynAj5DfqWn8q26N59F"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 8
+    },
+    "_alignFlags": 45,
+    "_target": null,
+    "_left": 0,
+    "_right": 0,
+    "_top": 0,
+    "_bottom": 0,
+    "_horizontalCenter": 0,
+    "_verticalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 40,
+    "_originalHeight": 36,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "c9ISNt6SlDFJThkwbejx2a"
+  },
+  {
+    "__type__": "cc.BlockInputEvents",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 10
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "54t8SLpjNETLx3a5H1tFkr"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "37umOa6ahCcYmYbJRDkQ1u",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "container",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 13
+      },
+      {
+        "__id__": 19
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 33
+      },
+      {
+        "__id__": 35
+      }
+    ],
+    "_prefab": {
+      "__id__": 37
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "lblTitle",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 12
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 14
+      },
+      {
+        "__id__": 16
+      }
+    ],
+    "_prefab": {
+      "__id__": 18
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 164.498,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 13
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 15
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 40,
+      "height": 50.4
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "8akZnb+h1BmIXdkgS0pnub"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 13
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 17
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "邮箱",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 0,
+    "_enableWrapText": true,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "ceEvUOZYRCI7+NaLyy2szT"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "6a2dwuHGVNWor26HA7QYw5",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btnClose",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 12
+    },
+    "_children": [
+      {
+        "__id__": 20
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 26
+      },
+      {
+        "__id__": 28
+      },
+      {
+        "__id__": 30
+      }
+    ],
+    "_prefab": {
+      "__id__": 32
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 260.348,
+      "y": 174.31,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 19
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 21
+      },
+      {
+        "__id__": 23
+      }
+    ],
+    "_prefab": {
+      "__id__": 25
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 20
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 22
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "cduidAxPpKCKdX50uilvVY"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 20
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 24
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "close",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "76qZye6WJLG7hltrarOrsJ"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "8fhIJ+ONhD1rMUBvzT7V+t",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 19
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 27
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "f5gByIDpBFCqX4POHuB8WA"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 19
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 29
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "164tdVBDFJ/IcCsS3wfxVg"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 19
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 31
+    },
+    "clickEvents": [],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 19
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "c9lzrFAe5C6bOpHypCMUzu"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "7c7YophmZDAIplaoS5/Iqn",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 12
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 34
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 622.3689999999999,
+      "height": 389.427
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "b02qOlbplHlIMBCqcy5rzE"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 12
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 36
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "b730527c-3233-41c2-aaf7-7cdab58f9749@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "12kE+/d9ZCCKfdLoQG316L"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "3a0rQ3M1BMxIxc1FelGwOE",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 39
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1334,
+      "height": 750
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "88OYOirAdNqanyz7PB3Jua"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 41
+    },
+    "_alignFlags": 45,
+    "_target": null,
+    "_left": 0,
+    "_right": 0,
+    "_top": 0,
+    "_bottom": 0,
+    "_horizontalCenter": 0,
+    "_verticalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 100,
+    "_originalHeight": 100,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "86ZHGXsbVCT7B2TpQmJiAh"
+  },
+  {
+    "__type__": "82cfbCYFlNIuoooKLizdzZN",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 43
+    },
+    "btnClose": {
+      "__id__": 30
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "64sj9oi+FEm5MXqGD5Jpb9"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "c46/YsCPVOJYA4mWEpNYRx",
+    "instance": null,
+    "targetOverrides": null
+  }
+]

+ 13 - 0
assets/lobbyRes/ui/mail/MailView.prefab.meta

@@ -0,0 +1,13 @@
+{
+  "ver": "1.1.50",
+  "importer": "prefab",
+  "imported": true,
+  "uuid": "dc18995e-bf3e-4a01-82cb-c5240b5cfe85",
+  "files": [
+    ".json"
+  ],
+  "subMetas": {},
+  "userData": {
+    "syncNodeName": "MailView"
+  }
+}

+ 258 - 52
assets/scenes/Test.scene

@@ -52,7 +52,7 @@
     },
     "autoReleaseAssets": false,
     "_globals": {
-      "__id__": 13
+      "__id__": 17
     },
     "_id": "60c57827-b15d-4b16-b79e-7ea2a022ec44"
   },
@@ -75,23 +75,23 @@
     "_active": true,
     "_components": [
       {
-        "__id__": 9
+        "__id__": 13
       },
       {
-        "__id__": 10
+        "__id__": 14
       },
       {
-        "__id__": 11
+        "__id__": 15
       },
       {
-        "__id__": 12
+        "__id__": 16
       }
     ],
     "_prefab": null,
     "_lpos": {
       "__type__": "cc.Vec3",
-      "x": 640,
-      "y": 360,
+      "x": 667,
+      "y": 375,
       "z": 0
     },
     "_lrot": {
@@ -176,7 +176,7 @@
     "_priority": 0,
     "_fov": 45,
     "_fovAxis": 0,
-    "_orthoHeight": 360,
+    "_orthoHeight": 375,
     "_near": 0,
     "_far": 2000,
     "_color": {
@@ -210,18 +210,70 @@
   },
   {
     "__type__": "cc.Node",
-    "_name": "webView",
+    "_name": "Button",
     "_objFlags": 0,
     "__editorExtras__": {},
     "_parent": {
       "__id__": 2
     },
-    "_children": [],
+    "_children": [
+      {
+        "__id__": 6
+      }
+    ],
     "_active": true,
     "_components": [
       {
-        "__id__": 6
+        "__id__": 9
+      },
+      {
+        "__id__": 10
       },
+      {
+        "__id__": 11
+      }
+    ],
+    "_prefab": null,
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_lrot": {
+      "__type__": "cc.Quat",
+      "x": 0,
+      "y": 0,
+      "z": 0,
+      "w": 1
+    },
+    "_lscale": {
+      "__type__": "cc.Vec3",
+      "x": 1,
+      "y": 1,
+      "z": 1
+    },
+    "_mobility": 0,
+    "_layer": 33554432,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": "0csZgKGJBDzIAP9VzEReaz"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Label",
+    "_objFlags": 512,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 5
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
       {
         "__id__": 7
       },
@@ -257,7 +309,91 @@
       "y": 0,
       "z": 0
     },
-    "_id": "30kSeKB89IJqi3wIkPpLaA"
+    "_id": "0f7JvptAlJw7u+FKVQWL9f"
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 6
+    },
+    "_enabled": true,
+    "__prefab": null,
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 40
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": "d6Sp+kyvhIcqpUWX0ubFn2"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 6
+    },
+    "_enabled": true,
+    "__prefab": null,
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_string": "Login",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 20,
+    "_fontSize": 20,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 1,
+    "_enableWrapText": false,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": false,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": false,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": "1e5+hViexPLI36+UrrnIx7"
   },
   {
     "__type__": "cc.UITransform",
@@ -271,18 +407,18 @@
     "__prefab": null,
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 1280,
-      "height": 720
+      "width": 100,
+      "height": 40
     },
     "_anchorPoint": {
       "__type__": "cc.Vec2",
       "x": 0.5,
       "y": 0.5
     },
-    "_id": "cfymSNG1FJ2Lqvu+gjKccd"
+    "_id": "f4wkDvaq1KuoUVNZpJ6Q5+"
   },
   {
-    "__type__": "cc.Widget",
+    "__type__": "cc.Sprite",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
@@ -291,28 +427,37 @@
     },
     "_enabled": true,
     "__prefab": null,
-    "_alignFlags": 45,
-    "_target": null,
-    "_left": 0,
-    "_right": 0,
-    "_top": 0,
-    "_bottom": 0,
-    "_horizontalCenter": 0,
-    "_verticalCenter": 0,
-    "_isAbsLeft": true,
-    "_isAbsRight": true,
-    "_isAbsTop": true,
-    "_isAbsBottom": true,
-    "_isAbsHorizontalCenter": true,
-    "_isAbsVerticalCenter": true,
-    "_originalWidth": 100,
-    "_originalHeight": 100,
-    "_alignMode": 2,
-    "_lockFlags": 0,
-    "_id": "f2NiyVQjJNB7R3e4l0ZMEH"
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 1,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": "b4tiJykZdF2Jl/LMObBQK+"
   },
   {
-    "__type__": "cc.WebView",
+    "__type__": "cc.Button",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
@@ -321,9 +466,73 @@
     },
     "_enabled": true,
     "__prefab": null,
-    "_url": "https://www.baidu.com",
-    "webviewEvents": [],
-    "_id": "02EiWUjPdHZYSxe/OTCYte"
+    "clickEvents": [
+      {
+        "__id__": 12
+      }
+    ],
+    "_interactable": true,
+    "_transition": 2,
+    "_normalColor": {
+      "__type__": "cc.Color",
+      "r": 214,
+      "g": 214,
+      "b": 214,
+      "a": 255
+    },
+    "_hoverColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_pressedColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_normalSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_hoverSprite": {
+      "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_pressedSprite": {
+      "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_disabledSprite": {
+      "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_duration": 0.1,
+    "_zoomScale": 1.2,
+    "_target": {
+      "__id__": 5
+    },
+    "_id": "df7Js8yH9HgI1ySxOkgfrA"
+  },
+  {
+    "__type__": "cc.ClickEvent",
+    "target": {
+      "__id__": 2
+    },
+    "component": "",
+    "_componentId": "c4ceeXZmQJAyY6/pBFi7Cwk",
+    "handler": "onFBLoginClick",
+    "customEventData": ""
   },
   {
     "__type__": "cc.UITransform",
@@ -337,8 +546,8 @@
     "__prefab": null,
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 1280,
-      "height": 720
+      "width": 1334,
+      "height": 750
     },
     "_anchorPoint": {
       "__type__": "cc.Vec2",
@@ -403,36 +612,33 @@
     },
     "_enabled": true,
     "__prefab": null,
-    "webView": {
-      "__id__": 8
-    },
     "_id": "68nuuLXylOuKTMM1My38bv"
   },
   {
     "__type__": "cc.SceneGlobals",
     "ambient": {
-      "__id__": 14
+      "__id__": 18
     },
     "shadows": {
-      "__id__": 15
+      "__id__": 19
     },
     "_skybox": {
-      "__id__": 16
+      "__id__": 20
     },
     "fog": {
-      "__id__": 17
+      "__id__": 21
     },
     "octree": {
-      "__id__": 18
+      "__id__": 22
     },
     "skin": {
-      "__id__": 19
+      "__id__": 23
     },
     "lightProbeInfo": {
-      "__id__": 20
+      "__id__": 24
     },
     "postSettings": {
-      "__id__": 21
+      "__id__": 25
     },
     "bakedWithStationaryMainLight": false,
     "bakedWithHighpLightmap": false

+ 1 - 7
assets/scripts/Test.ts

@@ -4,18 +4,12 @@ const { ccclass, property } = _decorator;
 @ccclass('Test')
 export class Test extends Component {
 
-    @property(WebView)
-    webView: WebView = null;
 
     start() {
-        setTimeout(() => {
-            const parent = this.webView.nativeWebView.parentElement;
-            
-        }, 1000);
 
     }
 
-    update(deltaTime: number) {
+    onFBLoginClick() {
 
     }
 }

+ 2 - 2
assets/scripts/api/Config.ts

@@ -7,9 +7,9 @@ export const API_BASE_URL = AppConfig.IsDebugEnv ? AppConfig.TestApiUrl : AppCon
 
 export const API_BASE_WS = AppConfig.IsDebugEnv ? AppConfig.TestWsUrl : AppConfig.MainWsUrl;
 
-export const get = (path: string): ApiEndpoint => ({ method: 'GET', path });
+export const get = (path: string, prefix = API_BASE_PREFIX): ApiEndpoint => ({ method: 'GET', path: prefix + path });
 
-export const post = (path: string): ApiEndpoint => ({ method: 'POST', path });
+export const post = (path: string, prefix = API_BASE_PREFIX): ApiEndpoint => ({ method: 'POST', path: prefix + path });
 
 export const API_CODE_SUCCESS = 200;
 

+ 19 - 20
assets/scripts/api/LobbyApi.ts

@@ -1,29 +1,28 @@
 import { API_BASE_PREFIX, get, post } from './Config';
 
-export const APP_ROUTES = get(API_BASE_PREFIX + 'routes');
+export const APP_ROUTES = get('routes');
 export const APP_PAGE_MODULE = API_BASE_PREFIX + 'pageModules/';
-export const APP_GAME_LIST = get(API_BASE_PREFIX + 'gameList');
-export const APP_GAME_CARD_INFO = get(API_BASE_PREFIX + 'gameinfo');
-export const APP_GAME_ENTER_RECORD = get(API_BASE_PREFIX + 'game_enter/record');
+export const APP_GAME_LIST = get('gameList');
+export const APP_GAME_CARD_INFO = get('gameinfo');
+export const APP_GAME_ENTER_RECORD = get('game_enter/record');
 
-export const APP_FAVORITE_ADD = get(API_BASE_PREFIX + 'favo/add');
-export const APP_FAVORITE_REMOVE = get(API_BASE_PREFIX + 'favo/remove');
-export const APP_FAVORITE_GET = get(API_BASE_PREFIX + 'favo/get');
+export const APP_FAVO_ADD = get('favo/add');
+export const APP_FAVO_REMOVE = get('favo/remove');
+export const APP_FAVO_GET = get('favo/get');
 
-export const APP_SERVICE = get(API_BASE_PREFIX + 'service');
-export const APP_USER_MESSAGE = get(API_BASE_PREFIX + 'user/message');
-export const APP_MAIL_LIST = get(API_BASE_PREFIX + 'mail/list');
-export const APP_MAIL_CHECK = get(API_BASE_PREFIX + 'mail/check');
-export const APP_MAIL_READ = get(API_BASE_PREFIX + 'mail/read');
-export const APP_MAIL_DELETE = get(API_BASE_PREFIX + 'mail/del');
-export const APP_MAIL_TAKE = get(API_BASE_PREFIX + 'mail/take');
+export const APP_SERVICE = get('service');
+export const APP_USER_MESSAGE = get('user/message');
+export const APP_MAIL_LIST = get('mail/list');
+export const APP_MAIL_CHECK = get('mail/check');
+export const APP_MAIL_READ = get('mail/read');
+export const APP_MAIL_DELETE = get('mail/del');
+export const APP_MAIL_TAKE = get('mail/take');
 
 
-export const APP_CHECKIN_CHECK = get(API_BASE_PREFIX + 'checkin/check');
-export const APP_CHECKIN_GET = get(API_BASE_PREFIX + 'checkin/get');
+export const APP_CHECKIN_CHECK = get('checkin/check');
+export const APP_CHECKIN_GET = get('checkin/get');
 
-export const APP_PROTECT_CHECK = get(API_BASE_PREFIX + 'protect/check');
-export const APP_PROTECT_GET = get(API_BASE_PREFIX + 'protect/get');
-
-export const APP_LOG = post(API_BASE_PREFIX + 'log');
+export const APP_PROTECT_CHECK = get('protect/check');
+export const APP_PROTECT_GET = get('protect/get');
 
+export const APP_LOG = post('log');

+ 22 - 19
assets/scripts/api/LoginApi.ts

@@ -1,37 +1,40 @@
-import { API_BASE_PREFIX, get, post } from './Config';
+import { get, post } from './Config';
 
-export const API_LOGIN = post(API_BASE_PREFIX + 'login');
+export const APP_LOGIN = post('login');
 
-export const API_REGISTER = post(API_BASE_PREFIX + 'register');
+/** 第三方授权登录 */
+export const APP_LOGIN_3RD = post('thirdPartyLogin');
 
-export const API_GET_REGISTER_GOLD = post(API_BASE_PREFIX + 'getRegisterGold');
+export const APP_REGISTER = post('register');
 
-export const API_LOGOUT = get(API_BASE_PREFIX + 'logout');
+export const APP_GET_REGISTER_GOLD = post('getRegisterGold');
 
-export const API_RESET_LOGIN_STATE = get(API_BASE_PREFIX + 'resetLoginState');
+export const APP_LOGOUT = get('logout');
 
-export const API_USER_INFO = get(API_BASE_PREFIX + 'info');
+export const APP_RESET_LOGIN_STATE = get('resetLoginState');
 
-export const API_CHANGE_INFO = post(API_BASE_PREFIX + 'changeInfo');
+export const APP_USER_INFO = get('info');
 
-export const API_CHANGE_PASS = post(API_BASE_PREFIX + 'changePass');
+export const APP_CHANGE_INFO = post('changeInfo');
 
-export const API_CHANGE_PHONE = post(API_BASE_PREFIX + 'changePhone');
+export const APP_CHANGE_PASS = post('changePass');
 
-export const API_CHANGE_EMAIL = post(API_BASE_PREFIX + 'changeEmail');
+export const APP_CHANGE_PHONE = post('changePhone');
 
-export const API_SEND_CODE = get(API_BASE_PREFIX + 'send_code');
+export const APP_CHANGE_EMAIL = post('changeEmail');
 
-export const API_BIND_SMS = post(API_BASE_PREFIX + 'bindsms');
+export const APP_SEND_CODE = get('send_code');
 
-export const API_SMS_LOGIN = post(API_BASE_PREFIX + 'smslogin');
+export const APP_BIND_SMS = post('bindsms');
 
-export const API_FORGET_PASS = post(API_BASE_PREFIX + 'forgetPass');
+export const APP_SMS_LOGIN = post('smslogin');
 
-export const API_CHANGE_PHONE_VERIFY = post(API_BASE_PREFIX + 'changePhoneVerify');
+export const APP_FORGET_PASS = post('forgetPass');
 
-export const API_CHANGE_BIND_PHONE = post(API_BASE_PREFIX + 'changeBindPhone');
+export const APP_CHANGE_PHONE_VERIFY = post('changePhoneVerify');
 
-export const API_CHANGE_LIMIT_INFO = get(API_BASE_PREFIX + 'changeLimitInfo');
+export const APP_CHANGE_BIND_PHONE = post('changeBindPhone');
 
-export const API_COUNTRY_CODE = get(API_BASE_PREFIX + 'country_code');
+export const APP_CHANGE_LIMIT_INFO = get('changeLimitInfo');
+
+export const APP_COUNTRY_CODE = get('country_code');

+ 8 - 32
assets/scripts/api/PaymentApi.ts

@@ -1,41 +1,17 @@
-import { API_BASE_PREFIX, get, post } from './Config';
+import { get, post } from './Config';
 
-export const API_RECHARGE_GEAR = get(API_BASE_PREFIX + 'recharge/gear');
 
-export const API_FIRST_PAY_CONFIG = get(API_BASE_PREFIX + 'recharge/firstPayConfig');
+export const APP_RECHARGE_CONFIG = get("recharge/gear");
 
-export const API_ACCOUNTS_PAY_INFO = get(API_BASE_PREFIX + 'api/get_accounts_pay_info');
+export const APP_PAYMENT_ORDER = get("payment_entry/pay");
 
-export const API_PAYMENT_PAY = get(API_BASE_PREFIX + 'payment_entry/pay');
+export const APP_PAY_ORDER_LIST = get("pay/orderList");
 
-export const API_PAYMENT_PAY_QR = get(API_BASE_PREFIX + 'payment_entry/payqr');
 
-export const API_PAY_ORDER_LIST = get(API_BASE_PREFIX + 'pay/orderList');
+export const APP_WITHDRAW_BASE_INFO = post("withDraw/baseInfo");
 
-export const API_FIRST_PAY_MULTI = get(API_BASE_PREFIX + 'pay/first_pay_multi');
+export const APP_WITHDRAW_RECORD = post("withDraw/record");
 
-export const API_SECOND_PAY_REWARD = get(API_BASE_PREFIX + 'pay/get_second');
+export const APP_WITHDRAW_SET_INFO = post("withDraw/withDrawInfo");
 
-export const API_KYC_EU = post(API_BASE_PREFIX + 'kyc/eu');
-
-export const API_FIRST_PAY_GIFT = get(API_BASE_PREFIX + 'pay/first_pay_gift');
-
-export const API_CLAIM_FIRST_PAY_GIFT = get(API_BASE_PREFIX + 'pay/claim_first_pay_gift');
-
-export const API_BANKRUPTCY_GIFT = get(API_BASE_PREFIX + 'pay/bankruptcy_gift');
-
-export const API_DAILY_FIRST_RECHARGE_GIFT = get(API_BASE_PREFIX + 'pay/daily_first_recharge_gift');
-
-export const API_DAILY_GIFT = get(API_BASE_PREFIX + 'pay/daily_gift');
-
-export const API_CLAIM_DAILY_GIFT_BONUS = post(API_BASE_PREFIX + 'pay/claim_daily_gift_bonus');
-
-export const API_FREE_BONUS_GIFT = get(API_BASE_PREFIX + 'pay/free_bonus_gift');
-
-export const API_VIP_INACTIVE_GIFT = post(API_BASE_PREFIX + 'pay/vip_inactive_gift');
-
-export const API_VIP_INACTIVE_GIFT_INFO = post(API_BASE_PREFIX + 'pay/vip_inactive_gift_info');
-
-export const API_CLAIM_VIP_INACTIVE_GIFT_DAY = post(API_BASE_PREFIX + 'pay/claim_vip_inactive_gift_day');
-
-export const API_COUPON_LIST = get(API_BASE_PREFIX + 'coupon/list');
+export const APP_WITHDRAW_PAYOUT = post("withDraw/payout");

+ 0 - 29
assets/scripts/api/WalletApi.ts

@@ -1,29 +0,0 @@
-import { API_BASE_PREFIX, get, post } from './Config';
-
-export const API_WITHDRAW_TAX = get('api/api/withDrawTax');
-
-export const API_WITHDRAW_BASE_INFO = post(API_BASE_PREFIX + 'withDraw/baseInfo');
-
-export const API_GET_WITHDRAW_INFO = post(API_BASE_PREFIX + 'withDraw/getWithDrawInfo');
-
-export const API_CHANGE_PAY_PASS = post(API_BASE_PREFIX + 'changePayPass');
-
-export const API_FORGET_PAY_PASS = post(API_BASE_PREFIX + 'forgetPayPass');
-
-export const API_WITHDRAW_RECORD = post(API_BASE_PREFIX + 'withDraw/record');
-
-export const API_SAVE_WITHDRAW_INFO = post(API_BASE_PREFIX + 'withDraw/withDrawInfo');
-
-export const API_SAVE_MEXICO_WITHDRAW_INFO = post(API_BASE_PREFIX + 'withDraw/mexWithDrawInfo');
-
-export const API_SAVE_RUSSIA_WITHDRAW_INFO = post(API_BASE_PREFIX + 'withDraw/ruWithDrawInfo');
-
-export const API_SAVE_CPF = get(API_BASE_PREFIX + 'withDraw/savecpf');
-
-export const API_WITHDRAW_PAYOUT = post(API_BASE_PREFIX + 'withDraw/payout');
-
-export const API_FREE_WITHDRAW_INFO = get(API_BASE_PREFIX + 'withDraw/freeWithDrawInfo');
-
-export const API_VIP_WITHDRAW_TASKS = get(API_BASE_PREFIX + 'vip-withdraw/tasks');
-
-export const API_VIP_WITHDRAW_CLAIM = get(API_BASE_PREFIX + 'vip-withdraw/claim');

+ 0 - 1
assets/scripts/api/index.ts

@@ -2,4 +2,3 @@ export * from './Config';
 export * from './LobbyApi';
 export * from './LoginApi';
 export * from './PaymentApi';
-export * from './WalletApi';

+ 7 - 3
assets/scripts/app/AppConfig.ts

@@ -5,10 +5,10 @@ const AppConfig = {
     ProductName: "lionhalo",
     ProductID: "1",
 
-    MainApiUrl: "https://testapi.usgamewin.com/",
+    MainApiUrl: "https://testapi.usgamewin.com/",       ///testapixyz
     MainWsUrl: "wss://testapi.usgamewin.com:10000",
-    TestApiUrl: "https://testapi.usgamewin.com/",
-    TestWsUrl: "wss://testapi.usgamewin.com:10000",
+    TestApiUrl: "https://testapi.usgamewin.com/",//"https://testapixyz.usgamewin.com/",
+    TestWsUrl: "wss://testapi.usgamewin.com:10000",//"wss://testapixyz.usgamewin.com:10000",
     GameScheme: "game2c",
 
     /**
@@ -17,6 +17,10 @@ const AppConfig = {
      */
     HotUpdateUrl: "",
     HotUpdateEnable: true,
+
+
+    FBAppID: "1056149470661855",
+    GoogleID: "984811369314-r66m16sppu58oej4lji56bgnernamhut.apps.googleusercontent.com",
 };
 
 export default AppConfig;

+ 14 - 0
assets/scripts/app/AppKernel.ts

@@ -12,6 +12,8 @@ import { HotUpdateService } from '../services/hotupdate/HotUpdateService';
 import { VersionService } from '../services/version/VersionService';
 import * as stores from '../store';
 import * as services from '../services';
+import fb from '@scripts/platform/FaceBook/Facebook';
+import google from '@scripts/platform/Google/Google';
 
 
 export class AppKernel {
@@ -65,6 +67,14 @@ export class AppKernel {
     return this.Instance.services;
   }
 
+  static get fb(): typeof fb {
+    return this.Instance.fb;
+  }
+
+  static get google(): typeof google {
+    return this.Instance.google;
+  }
+
   readonly events = new EventManager<AppEventMap>();
   readonly resources = new ResourceManager();
   readonly ui = new UIManager(this.resources);
@@ -74,9 +84,13 @@ export class AppKernel {
   readonly platform: PlatformBridge;
   readonly stores = stores;
   readonly services = services;
+  readonly fb = fb;
+  readonly google = google;
 
   private constructor() {
     this.platform = this.createPlatformBridge();
+    this.fb.init();
+    this.google.init();
   }
 
   private createPlatformBridge(): PlatformBridge {

+ 9 - 0
assets/scripts/components/button.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "4c0921f8-0c89-425d-9392-6edbacdd89d3",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 21 - 0
assets/scripts/components/button/GoogleLoginBtn.ts

@@ -0,0 +1,21 @@
+import { _decorator, Component, Node } from 'cc';
+const { ccclass, property } = _decorator;
+
+@ccclass('GoogleH5Login')
+export class GoogleH5Login extends Component {
+
+    protected onLoad(): void {
+
+    }
+
+
+    start() {
+
+    }
+
+    update(deltaTime: number) {
+
+    }
+}
+
+

+ 1 - 1
assets/scripts/api/WalletApi.ts.meta → assets/scripts/components/button/GoogleLoginBtn.ts.meta

@@ -2,7 +2,7 @@
   "ver": "4.0.24",
   "importer": "typescript",
   "imported": true,
-  "uuid": "fbe89f97-1b8c-44f7-b6d1-0d4b8d914c7c",
+  "uuid": "f04211cb-e2f9-452c-96c6-4e7826813e20",
   "files": [],
   "subMetas": {},
   "userData": {}

+ 6 - 2
assets/scripts/define/Define.ts

@@ -1,13 +1,17 @@
 import { API_BASE_WS } from "../api"
 
-export const LoginType = {
+export const APP_LOGIN_TYPE = {
     ID: "id",
     PHONE: "phone",
     SMS: "sms",
     MAIL: "mail",
-    GUEST: "guest"
+    GUEST: "guest",
+    FACEBOOK: "facebook",
+    GOOGLE: "google",
 }
 
+export type Login3rdType = "facebook" | "google";
+
 export const APP_SERVER = {
     SERVER_URL: API_BASE_WS,
     ROOM_HALL: "hall",

+ 5 - 0
assets/scripts/define/ResDefine.ts

@@ -1,3 +1,8 @@
 export const BUNDLE_ID = {
     Lobby: "lobbyRes",
 }
+
+/** 道具ID */
+export const APP_PROPS = {
+
+}

+ 9 - 0
assets/scripts/define/UIDefine.ts

@@ -4,6 +4,7 @@ export const UIViewID = {
     LoginView: 'LoginView',
     HomeView: 'HomeView',
     LoadingView: "LoadingView",
+    MailView: "MailView",
 } as const;
 
 export type UIViewID = typeof UIViewID[keyof typeof UIViewID];
@@ -14,6 +15,8 @@ export interface UIViewConfig {
     bundle?: string;
     cache?: UICachePolicy;
     mutexGroup?: string;
+    /** true 时,打开该界面不自动显示 LoadingView,默认 false。 */
+    ignoreLoading?: boolean;
 }
 
 /**
@@ -36,6 +39,12 @@ export const UIViewConfigs: Record<string, UIViewConfig> = {
         prefabPath: 'ui/loading/LoadingView',
         layer: UILayer.Loading,
         cache: UICachePolicy.Persist,
+        ignoreLoading: true,
+    },
+    [UIViewID.MailView]: {
+        id: UIViewID.MailView,
+        prefabPath: 'ui/mail/MailView',
+        layer: UILayer.Popup
     },
 };
 

+ 132 - 16
assets/scripts/framework/ui/UIManager.ts

@@ -21,6 +21,7 @@ export class UIManager {
 
   private readonly records = new Map<UIViewID, UIViewRecord>();
   private readonly roots = new Map<UILayer, Node>();
+  private loadingCount = 0;
 
   constructor(private readonly resources: ResourceManager) { }
 
@@ -125,23 +126,50 @@ export class UIManager {
   }
 
   async open<TView extends UIView, TParams = unknown>(viewId: UIViewID, params?: TParams): Promise<TView | null> {
+    const config = getUIViewConfig(viewId);
+    const currentRecord = this.records.get(viewId);
+    const shouldShowLoading = config.ignoreLoading !== true
+      && currentRecord?.state !== UIViewState.Opened
+      && !currentRecord?.opening;
+
+    if (!shouldShowLoading) {
+      return this.openView<TView, TParams>(viewId, params);
+    }
+
+    await this.loading(true);
+    try {
+      return await this.openView<TView, TParams>(viewId, params);
+    } finally {
+      await this.loading(false);
+    }
+  }
+
+  private async openView<TView extends UIView, TParams = unknown>(
+    viewId: UIViewID,
+    params?: TParams,
+  ): Promise<TView | null> {
     let record = this.records.get(viewId);
+    if (record?.closing) {
+      await record.closing;
+      record = this.records.get(viewId);
+    }
     if (record?.view && !record.view.node.isValid) {
       this.forgetRecord(record);
       record = undefined;
     }
     if (record?.state === UIViewState.Opened) return record.view as TView;
     if (record?.opening) return record.opening as Promise<TView | null>;
-    if (record?.closing) await record.closing;
     if (record) this.cancelDelayedDestroy(record);
 
     if (record?.state === UIViewState.Cached && record.view?.node.isValid) {
-      await this.closeMutexViews(record.config);
-      record.state = UIViewState.Opening;
-      record.view.node.active = true;
-      await record.view.internalOpen(params);
-      record.state = UIViewState.Opened;
-      return record.view as TView;
+      const generation = ++record.generation;
+      const opening = this.performCachedOpen(record, params, generation);
+      record.opening = opening;
+      try {
+        return await opening as TView | null;
+      } finally {
+        if (record.opening === opening) record.opening = null;
+      }
     }
 
     const config = getUIViewConfig(viewId);
@@ -162,11 +190,12 @@ export class UIManager {
     this.records.set(viewId, record);
 
     const generation = ++record.generation;
-    record.opening = this.performOpen(record, root, params, generation);
+    const opening = this.performOpen(record, root, params, generation);
+    record.opening = opening;
     try {
-      return await record.opening as TView | null;
+      return await opening as TView | null;
     } finally {
-      if (record.generation === generation) record.opening = null;
+      if (record.opening === opening) record.opening = null;
     }
   }
 
@@ -176,7 +205,15 @@ export class UIManager {
       : [...this.records.values()].find((item) => item.view === viewIdOrInstance);
     if (!record) return false;
     if (record.closing) return record.closing;
-    if (record.state === UIViewState.Cached) return true;
+    if (record.state === UIViewState.Cached) {
+      if (record.opening) {
+        ++record.generation;
+        if ((record.config.cache || UICachePolicy.None) === UICachePolicy.Delayed) {
+          this.scheduleDelayedDestroy(record);
+        }
+      }
+      return true;
+    }
 
     ++record.generation;
     record.closing = this.performClose(record, reason);
@@ -202,6 +239,25 @@ export class UIManager {
     const prefab = await this.resources.loadPrefab(bundleName, record.config.prefabPath);
     if (generation !== record.generation) return null;
 
+    const prefabView = prefab.data?.getComponent?.(UIView) as UIView | null;
+    if (!prefabView) {
+      record.state = UIViewState.None;
+      throw new Error(`[UIManager] Prefab has no UIView component: ${record.config.id}`);
+    }
+
+    let allowOpen: boolean;
+    try {
+      allowOpen = await prefabView.internalOpenBefore(params);
+    } catch (error) {
+      if (generation === record.generation) record.state = UIViewState.None;
+      throw error;
+    }
+    if (generation !== record.generation) return null;
+    if (!allowOpen) {
+      record.state = UIViewState.None;
+      return null;
+    }
+
     record.state = UIViewState.Creating;
     const node = instantiate(prefab);
     root.addChild(node);
@@ -229,6 +285,49 @@ export class UIManager {
     return view;
   }
 
+  private async performCachedOpen(
+    record: UIViewRecord,
+    params: unknown,
+    generation: number,
+  ): Promise<UIView | null> {
+    const view = record.view;
+    if (!view?.node?.isValid) return null;
+
+    let allowOpen: boolean;
+    try {
+      allowOpen = await view.internalOpenBefore(params);
+    } catch (error) {
+      if (generation === record.generation) this.restoreCachedRecord(record);
+      throw error;
+    }
+    if (generation !== record.generation || !view.node.isValid) return null;
+    if (!allowOpen) {
+      this.restoreCachedRecord(record);
+      return null;
+    }
+
+    await this.closeMutexViews(record.config);
+    if (generation !== record.generation || !view.node.isValid) return null;
+
+    record.state = UIViewState.Opening;
+    view.node.active = true;
+    await view.internalOpen(params);
+    if (generation !== record.generation || !view.node.isValid) return null;
+
+    record.state = UIViewState.Opened;
+    return view;
+  }
+
+  private restoreCachedRecord(record: UIViewRecord): void {
+    if (!record.view?.node?.isValid || this.records.get(record.config.id) !== record) return;
+
+    record.view.node.active = false;
+    record.state = UIViewState.Cached;
+    if ((record.config.cache || UICachePolicy.None) === UICachePolicy.Delayed) {
+      this.scheduleDelayedDestroy(record);
+    }
+  }
+
   private async performClose(record: UIViewRecord, reason: UICloseReason): Promise<boolean> {
     if (!record.view?.node?.isValid) {
       this.cancelDelayedDestroy(record);
@@ -321,15 +420,32 @@ export class UIManager {
     await Promise.all(tasks);
   }
 
-  loading(active: boolean) {
+  async loading(active: boolean): Promise<void> {
     if (active) {
-      this.open(UIViewID.LoadingView);
-    } else {
-      this.close(UIViewID.LoadingView);
+      ++this.loadingCount;
+      try {
+        await this.open(UIViewID.LoadingView);
+        if (this.loadingCount === 0) {
+          await this.close(UIViewID.LoadingView);
+        }
+      } catch (error) {
+        this.loadingCount = Math.max(0, this.loadingCount - 1);
+        throw error;
+      }
+      return;
+    }
+
+    if (this.loadingCount > 0) --this.loadingCount;
+    if (this.loadingCount > 0) return;
+
+    await this.close(UIViewID.LoadingView);
+    // close 等待期间可能又有新的加载任务,需重新显示 LoadingView。
+    if (this.loadingCount > 0) {
+      await this.open(UIViewID.LoadingView);
     }
   }
 
-  toast() {
+  toast(msg: string) {
 
   }
 

+ 13 - 0
assets/scripts/framework/ui/UIView.ts

@@ -17,6 +17,14 @@ export class UIView<TParams = unknown> extends Component {
     return this.viewId;
   }
 
+  /**
+   * 在界面实例化(首次打开)或显示(缓存界面再次打开)之前执行。
+   * 首次打开时 this 是 Prefab 模板组件,只应进行鉴权、请求数据等无节点状态操作。
+   */
+  async internalOpenBefore(params: TParams): Promise<boolean> {
+    return (await this.onOpenBefore(params)) !== false;
+  }
+
   async internalCreate(): Promise<void> {
     await this.onCreate();
   }
@@ -42,6 +50,11 @@ export class UIView<TParams = unknown> extends Component {
     AppKernel.events.offTarget(this);
   }
 
+  protected async closeSelf() {
+    await AppKernel.ui.close(this.getViewID());
+  }
+
+  protected onOpenBefore(_params: TParams): boolean | void | Promise<boolean | void> { return true; }
   protected onCreate(): void | Promise<void> { }
   protected onOpen(_params: TParams): void | Promise<void> { }
   protected onFocus(): void { }

+ 3 - 2
assets/scripts/modules/lobby/ui/HomeView/GameItem.ts

@@ -1,5 +1,6 @@
 import { AppKernel } from '@scripts/app/AppKernel';
 import { IGameInfo } from '@scripts/store/pageSlice/data';
+import { addBtnClick, removeBtnClick } from '@scripts/utils/UIHelper';
 import { _decorator, Component, Node, Sprite } from 'cc';
 const { ccclass, property } = _decorator;
 
@@ -11,11 +12,11 @@ export class GameItem extends Component {
     private _gameConfig: IGameInfo;
 
     protected onLoad(): void {
-        this.node.on(Node.EventType.TOUCH_END, this.onClick, this);
+        addBtnClick(this.node, this.onClick, this);
     }
 
     protected onDestroy(): void {
-        this.node.off(Node.EventType.TOUCH_END, this.onClick, this);
+        removeBtnClick(this.node, this.onClick, this);
     }
 
     public async initView(game: IGameInfo) {

+ 8 - 1
assets/scripts/modules/lobby/ui/HomeView/HomeView.ts

@@ -4,6 +4,7 @@ import { IGameInfo } from '@scripts/store/pageSlice/data';
 import { UIView } from '@scripts/framework/ui/UIView';
 import { UIViewID } from '@scripts/define/UIDefine';
 import { GameItem } from './GameItem';
+import { addBtnClick } from '@scripts/utils/UIHelper';
 
 const { ccclass, property } = _decorator;
 
@@ -20,15 +21,18 @@ export class HomeView extends UIView {
     @property(Node)
     gameRoot: Node;
 
+    @property(Node)
+    btnMail: Node;
+
     protected onCreate(): void | Promise<void> {
         AppKernel.events.on('login:success', this.updateView, this);
+        addBtnClick(this.btnMail, this.onBtnMailClick, this);
     }
 
     protected onOpen(_params: unknown): void | Promise<void> {
         this.updateView();
     }
 
-
     private updateView() {
         const mainStore = AppKernel.stores.mainStore;
         this.lblNickName.string = mainStore.userInfo?.NickName || "";
@@ -50,4 +54,7 @@ export class HomeView extends UIView {
         gameNode.initView(game);
     }
 
+    private onBtnMailClick() {
+        AppKernel.ui.open(UIViewID.MailView);
+    }
 }

+ 1 - 1
assets/scripts/modules/lobby/ui/LoadingView.ts

@@ -13,7 +13,7 @@ export class LoadingView extends UIView {
 
     protected onOpen(_params: unknown): void | Promise<void> {
         Tween.stopAllByTarget(this.circleNode);
-        tween(this.circleNode).by(0.5, { angle: 50 }).repeatForever().start();
+        tween(this.circleNode).by(0.5, { angle: -200 }).repeatForever().start();
     }
 
     protected onClose(_reason: UICloseReason): void | Promise<void> {

+ 143 - 6
assets/scripts/modules/lobby/ui/LoginView.ts

@@ -1,8 +1,11 @@
-import { _decorator, Button, Node } from 'cc';
+import { _decorator, Button, EditBox, Node } from 'cc';
 import { UIView } from '@scripts/framework/ui/UIView';
 import { AppKernel } from '@scripts/app/AppKernel';
-import { LoginType } from '@scripts/define/Define';
+import { APP_LOGIN_TYPE } from '@scripts/define/Define';
 import { UIViewID } from '@scripts/define/UIDefine';
+import { UICloseReason } from '@scripts/framework/ui/UILayer';
+import { formatCurrency } from '@scripts/utils/Helper';
+import { addBtnClick } from '@scripts/utils/UIHelper';
 
 const { ccclass, property } = _decorator;
 
@@ -13,16 +16,150 @@ export class LoginView extends UIView {
     @property(Button)
     btnGuest: Button;
 
+    @property(Button)
+    btnFacebook: Button;
+
+    @property(Button)
+    btnGoogle: Button;
+
+    @property(Button)
+    btnLogOut: Button;
+
+    @property(Node)
+    registerNode: Node;
+
+    @property(Node)
+    loginNode: Node;
+
+    @property(Node)
+    btnRegisterNode: Node;
+
+    @property(Node)
+    btnLoginNode: Node;
+
+    @property(EditBox)
+    loginAccount: EditBox;
+
+    @property(EditBox)
+    loginPassword: EditBox;
+
+    @property(EditBox)
+    registerAccount: EditBox;
+
+    @property(EditBox)
+    registerCode: EditBox;
+
+    @property(EditBox)
+    registerPw: EditBox;
+
+    @property(Node)
+    btnRegister: Node;
+
+    @property(Node)
+    btnLogin: Node;
+
+    @property(Node)
+    btnSend: Node;
+
+
+    private _googleWebBtn;
 
     protected onCreate(): void | Promise<void> {
-        this.btnGuest.node.on(Node.EventType.TOUCH_END, this.onBtnGuestClick, this);
+        addBtnClick(this.btnGuest.node, this.onBtnGuestClick, this);
+        addBtnClick(this.btnFacebook.node, this.onBtnFBClick, this);
+        addBtnClick(this.btnGoogle.node, this.onBtnGoogleClick, this);
+        addBtnClick(this.btnLogOut.node, this.onBtnLogOutClick, this);
+        this._googleWebBtn = AppKernel.google.createLoginBtn(
+            this.btnGoogle.node,
+            res => this.onGoogleWebLogin(res),
+        );
+
+        ///////////////// Test
+        addBtnClick(this.btnLoginNode, this.onShowLoginNode, this);
+        addBtnClick(this.btnRegisterNode, this.onShowRegisterNode, this);
+        addBtnClick(this.btnLogin, this.onBtnLoginClick, this);
+        addBtnClick(this.btnRegister, this.onBtnRegisterClick, this);
+        addBtnClick(this.btnSend, this.onBtnSendClick, this);
+
+        console.log(">>>>>>>>>", formatCurrency(12345678.9), formatCurrency(12345678.9, 2))
+    }
+
+    protected onOpen(_params: unknown): void | Promise<void> {
+        /// 播放完打开动画后 再显示h5 google login btn dom
+        this._googleWebBtn?.setActive(true);
+    }
+
+    protected onClose(_reason: UICloseReason): void | Promise<void> {
+        this._googleWebBtn?.setActive(false);
+    }
+
+    protected onDestroy(): void {
+        this._googleWebBtn?.clear();
     }
 
     private async onBtnGuestClick() {
         AppKernel.ui.loading(true);
-        const loggedIn = await AppKernel.stores.mainStore.reqLogin({ type: LoginType.GUEST });
-        if (!loggedIn) return;
-        await AppKernel.services.lobbyService.onLoginSuccess();
+        await AppKernel.services.loginService.guestLogin();
+        AppKernel.ui.loading(false);
+    }
+
+    private async onBtnFBClick() {
+        AppKernel.ui.loading(true);
+        await AppKernel.services.loginService.fbLogin();
+        AppKernel.ui.loading(false);
+    }
+
+    private async onBtnLogOutClick() {
+        // AppKernel.ui.loading(true);
+        // const res = await AppKernel.fb.logOut();
+        // console.log('facebook logout res: ', res);
+        // AppKernel.ui.loading(false);
+    }
+
+    private async onGoogleWebLogin(res) {
+        AppKernel.ui.loading(true);
+        await AppKernel.services.loginService.googleLogin(res);
         AppKernel.ui.loading(false);
     }
+
+    private async onBtnGoogleClick() {
+        AppKernel.ui.loading(true);
+        await AppKernel.services.loginService.googleLogin();
+        AppKernel.ui.loading(false);
+    }
+
+
+
+
+
+
+    ///////////////// Test
+
+    private onShowLoginNode() {
+        this.loginNode.active = !this.loginNode.active;
+    }
+
+    private onShowRegisterNode() {
+        this.registerNode.active = !this.registerNode.active;
+    }
+
+    private onBtnLoginClick() {
+        const account = this.loginAccount.string;
+        const password = this.loginPassword.string;
+
+        AppKernel.services.loginService.loginAccount(account, password);
+    }
+
+    private onBtnRegisterClick() {
+        const account = this.registerAccount.string;
+        const code = this.registerCode.string;
+        const password = this.registerPw.string;
+        AppKernel.services.loginService.register({ account, code, password });
+    }
+
+    private onBtnSendClick() {
+        const account = this.registerAccount.string;
+        const mainStore = AppKernel.stores.mainStore;
+        mainStore.reqSendCode(account);
+    }
 }

+ 9 - 0
assets/scripts/modules/lobby/ui/MailView.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "a350af1c-db28-4505-9d8f-e6b125554441",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 30 - 0
assets/scripts/modules/lobby/ui/MailView/MailView.ts

@@ -0,0 +1,30 @@
+import { AppKernel } from '@scripts/app/AppKernel';
+import { UIViewID } from '@scripts/define/UIDefine';
+import { UIView } from '@scripts/framework/ui/UIView';
+import { addBtnClick } from '@scripts/utils/UIHelper';
+import { _decorator, Button, Component, Node } from 'cc';
+const { ccclass, property } = _decorator;
+
+@ccclass('MailView')
+export class MailView extends UIView {
+    readonly viewId: UIViewID = UIViewID.MailView;
+
+    @property(Button)
+    btnClose: Button;
+
+    protected async onOpenBefore(_params: unknown): Promise<boolean> {
+        const mailStore = AppKernel.stores.mailStore;
+        const res = await mailStore.reqMailList();
+        return res;
+    }
+
+    protected onCreate(): void | Promise<void> {
+        addBtnClick(this.btnClose.node, this.onBtnCloseClick, this);
+    }
+
+    private onBtnCloseClick() {
+        this.closeSelf();
+    }
+}
+
+

+ 9 - 0
assets/scripts/modules/lobby/ui/MailView/MailView.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "82cfb098-1653-48ba-8a28-28b8b377364d",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 9 - 0
assets/scripts/platform/FaceBook.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "3359a5e5-1203-4990-9c90-2fd0c08fc6fa",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 15 - 0
assets/scripts/platform/FaceBook/FBAndroidImpl.ts

@@ -0,0 +1,15 @@
+import { FacebookImpl } from "./FacebookImpl";
+
+export class FBAndroidImpl extends FacebookImpl {
+    init() {
+
+    }
+
+    protected async onLogin() {
+        return { accessToken: "", isCancel: false };
+    }
+
+    async logOut() {
+        return true;
+    }
+}

+ 9 - 0
assets/scripts/platform/FaceBook/FBAndroidImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "9cbe5430-29fb-468a-96ae-7c57e998b75d",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 92 - 0
assets/scripts/platform/FaceBook/FBH5Impl.ts

@@ -0,0 +1,92 @@
+import AppConfig from "@scripts/app/AppConfig";
+import { FacebookImpl, IFBLoginRes } from "./FacebookImpl";
+
+export class FBH5Impl extends FacebookImpl {
+    private _isLogined = false;
+
+    init() {
+        //@ts-ignore
+        window.fbAsyncInit = () => {
+            //@ts-ignore
+            FB.init({
+                appId: AppConfig.FBAppID,
+                cookie: true,
+                xfbml: true,
+                version: 'v26.0'
+            })
+
+            //@ts-ignore
+            FB.AppEvents.logPageView();
+            console.log("fb sdk init!!!");
+
+            this.getLoginStatus();
+            this.onInited();
+        };
+
+        const script = document.createElement('script');
+        script.id = 'facebook-jssdk';
+        script.async = true;
+        script.defer = true;
+        script.crossOrigin = 'anonymous';
+        script.src = 'https://connect.facebook.net/en_US/sdk.js';
+
+        script.onerror = () => {
+            console.log(new Error('Facebook JavaScript SDK 下载失败'));
+        };
+        document.head.appendChild(script);
+        this._isLogined = false;
+    }
+
+    private async getLoginStatus() {
+        return new Promise<boolean>((resolve, reject) => {
+            //@ts-ignore
+            FB.getLoginStatus(response => {
+                console.log('[Facebook] login status:', response);
+                this._isLogined = response?.status === 'connected';
+                resolve(response?.status === 'connected');
+            });
+        })
+    }
+
+    protected async onLogin() {
+        if (this._isLogined) {
+            await this.logOut();
+        }
+
+        return new Promise<IFBLoginRes>((resolve, reject) => {
+            //@ts-ignore
+            FB.login(response => {
+                console.log('[Facebook] login response: ', response);
+                const res: IFBLoginRes = {
+                    accessToken: "",
+                    isCancel: false
+                }
+
+                if (response.authResponse) {
+
+                    res.accessToken = response.authResponse?.accessToken || "";
+                }
+
+                this._isLogined = !!res.accessToken;
+                if (!res.accessToken) {
+                    res.isCancel = true;
+                }
+
+                resolve(res);
+            })
+        });
+    }
+
+    async logOut() {
+        if (!this._isLogined) return true;
+
+        return new Promise<boolean>((resolve, reject) => {
+            //@ts-ignore
+            FB.logout(response => {
+                this._isLogined = false;
+                console.log('[Facebook] logout: ', response);
+                resolve(true);
+            })
+        })
+    }
+}

+ 9 - 0
assets/scripts/platform/FaceBook/FBH5Impl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "e5b2e999-9205-4cbd-9dae-6f693f73bc48",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 16 - 0
assets/scripts/platform/FaceBook/FBIOSImpl.ts

@@ -0,0 +1,16 @@
+import { FacebookImpl } from "./FacebookImpl";
+
+export class FBIOSImpl extends FacebookImpl {
+    init() {
+
+
+    }
+
+    protected async onLogin() {
+        return { accessToken: "", isCancel: false };
+    }
+
+    async logOut() {
+        return true;
+    }
+}

+ 9 - 0
assets/scripts/platform/FaceBook/FBIOSImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "e924a4b7-be34-4811-b30f-6d47ea6e8e11",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 21 - 0
assets/scripts/platform/FaceBook/Facebook.ts

@@ -0,0 +1,21 @@
+import { ANDROID, IOS } from "cc/env";
+import { FacebookImpl } from "./FacebookImpl";
+import { FBAndroidImpl } from "./FBAndroidImpl";
+import { FBH5Impl } from "./FBH5Impl";
+import { FBIOSImpl } from "./FBIOSImpl";
+
+
+function getFaceBookImpl(): FacebookImpl {
+    if (ANDROID) {
+        return new FBAndroidImpl();
+    }
+
+    if (IOS) {
+        return new FBIOSImpl();
+    }
+
+    return new FBH5Impl();
+}
+
+const fb = getFaceBookImpl();
+export default fb;

+ 9 - 0
assets/scripts/platform/FaceBook/Facebook.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "a201cb12-d3cf-496f-932b-18ec46e8cf38",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 28 - 0
assets/scripts/platform/FaceBook/FacebookImpl.ts

@@ -0,0 +1,28 @@
+export interface IFBLoginRes {
+    accessToken: string;
+    isCancel: boolean;
+    status?: string;
+    reason?: string;
+}
+
+export abstract class FacebookImpl {
+    private _isInitialized = false;
+
+    public get isInitialized() { return this._isInitialized; }
+
+    abstract init();
+
+    protected onInited() {
+        this._isInitialized = true;
+    }
+
+    async login(): Promise<IFBLoginRes> {
+        const res = await this.onLogin();
+        return res;
+    }
+
+    protected abstract onLogin(): Promise<IFBLoginRes>;
+
+
+    abstract logOut(): Promise<boolean>;
+}

+ 9 - 0
assets/scripts/platform/FaceBook/FacebookImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "ec861da8-b346-49fd-bc9f-12b5680efadb",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 9 - 0
assets/scripts/platform/Google.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "a0754499-4b95-47e1-b2ff-8fc627f0b0e5",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 21 - 0
assets/scripts/platform/Google/Google.ts

@@ -0,0 +1,21 @@
+import { ANDROID, IOS } from "cc/env";
+import { GoogleImpl } from "./GoogleImpl";
+import { GoogleAndroidImpl } from "./GoogleAndroidImpl";
+import { GoogleIOSImpl } from "./GoogleIOSImpl";
+import { GoogleH5Impl } from "./GoogleH5Impl";
+
+
+function getGoogleImpl(): GoogleImpl {
+    if (ANDROID) {
+        return new GoogleAndroidImpl();
+    }
+
+    if (IOS) {
+        return new GoogleIOSImpl();
+    }
+
+    return new GoogleH5Impl();
+}
+
+const google = getGoogleImpl();
+export default google;

+ 9 - 0
assets/scripts/platform/Google/Google.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "4755b3c1-9920-43ed-8831-69b51e0ed6a4",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 14 - 0
assets/scripts/platform/Google/GoogleAndroidImpl.ts

@@ -0,0 +1,14 @@
+import { GoogleImpl, IGoogleLoginRes } from "./GoogleImpl";
+
+export class GoogleAndroidImpl extends GoogleImpl {
+    init() {
+        throw new Error("Method not implemented.");
+    }
+    protected onLogin(): Promise<IGoogleLoginRes> {
+        throw new Error("Method not implemented.");
+    }
+    logOut(): Promise<boolean> {
+        throw new Error("Method not implemented.");
+    }
+
+}

+ 9 - 0
assets/scripts/platform/Google/GoogleAndroidImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "abc9bb18-9534-4f77-a0a0-b2643f1025a9",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 268 - 0
assets/scripts/platform/Google/GoogleH5Impl.ts

@@ -0,0 +1,268 @@
+import AppConfig from "@scripts/app/AppConfig";
+import { Camera, Canvas, Node, screen, UITransform, Vec3 } from "cc";
+import { GoogleImpl, IGoogleBtnLogin, IGoogleLoginRes } from "./GoogleImpl";
+
+interface GoogleCredentialResponse {
+    credential?: string;
+    select_by?: string;
+}
+
+interface GoogleIdentityService {
+    initialize: (config: {
+        client_id: string;
+        callback: (response: GoogleCredentialResponse) => void;
+        ux_mode?: "popup" | "redirect";
+    }) => void;
+    renderButton: (parent: HTMLElement, options: {
+        type?: "standard" | "icon";
+        theme?: "outline" | "filled_blue" | "filled_black";
+        size?: "large" | "medium" | "small";
+        text?: "signin_with" | "signup_with" | "continue_with" | "signin";
+        shape?: "rectangular" | "pill" | "circle" | "square";
+        logo_alignment?: "left" | "center";
+        width?: number;
+    }) => void;
+    disableAutoSelect: () => void;
+}
+
+interface GoogleSdkWindow extends Window {
+    google?: {
+        accounts?: {
+            id?: GoogleIdentityService;
+        };
+    };
+}
+
+const GOOGLE_SDK_ID = "google-identity-services";
+const GOOGLE_SDK_URL = "https://accounts.google.com/gsi/client";
+
+export class GoogleH5Impl extends GoogleImpl {
+    private _initPromise: Promise<void> | null = null;
+    private _loginCallback: (res: IGoogleLoginRes) => void;
+    private _buttonSeed = 0;
+
+    init(): Promise<void> {
+        if (this.isInitialized) return Promise.resolve();
+        if (this._initPromise) return this._initPromise;
+
+        this._initPromise = this.loadGoogleSdk()
+            .then(() => {
+                const googleIdentity = this.getGoogleIdentity();
+                if (!googleIdentity) {
+                    throw new Error("Google Identity Services 初始化失败");
+                }
+
+                googleIdentity.initialize({
+                    client_id: AppConfig.GoogleID,
+                    ux_mode: "popup",
+                    callback: response => this.handleCredentialResponse(response),
+                });
+                this.onInited();
+
+                console.log(googleIdentity);
+            })
+            .catch(error => {
+                this._initPromise = null;
+                throw error;
+            });
+
+        return this._initPromise;
+    }
+
+    protected async onLogin(): Promise<IGoogleLoginRes> {
+        return null;
+    }
+
+    async logOut(): Promise<boolean> {
+        return true;
+    }
+
+    createLoginBtn(node: Node, callback: (res: IGoogleLoginRes) => void): IGoogleBtnLogin {
+        const container = document.createElement("div");
+        container.id = `google-login-button-${++this._buttonSeed}`;
+        container.style.position = "fixed";
+        container.style.zIndex = "9999";
+        container.style.display = "flex";
+        container.style.alignItems = "center";
+        container.style.justifyContent = "center";
+        container.style.overflow = "hidden";
+        container.style.boxSizing = "border-box";
+        container.style.opacity = "0";
+        document.body.appendChild(container);
+
+        let active = node.activeInHierarchy;
+        let cleared = false;
+        let animationFrameId = 0;
+
+        this._loginCallback = callback;
+
+        const clear = () => {
+            if (cleared) return;
+            cleared = true;
+            window.cancelAnimationFrame(animationFrameId);
+            container.remove();
+        };
+
+        const update = () => {
+            if (cleared) return;
+            if (!node.isValid) {
+                clear();
+                return;
+            }
+
+            this.syncDomLayout(container, node, active);
+            animationFrameId = window.requestAnimationFrame(update);
+        };
+
+        this.syncDomLayout(container, node, active);
+        animationFrameId = window.requestAnimationFrame(update);
+
+        this.init()
+            .then(() => {
+                if (cleared || !node.isValid) return;
+
+                this.syncDomLayout(container, node, active);
+                const containerWidth = Math.round(container.getBoundingClientRect().width) || 280;
+                const width = Math.max(40, Math.min(400, containerWidth));
+                this.getGoogleIdentity()?.renderButton(container, {
+                    type: "standard",
+                    theme: "outline",
+                    size: "large",
+                    text: "signin_with",
+                    shape: "rectangular",
+                    logo_alignment: "left",
+                    width,
+                });
+            })
+            .catch(error => {
+                console.error("[Google] 登录按钮创建失败", error);
+                clear();
+            });
+        return {
+            active,
+            setActive: (visible: boolean) => {
+                if (cleared) return;
+                if (!node.isValid) {
+                    clear();
+                    return;
+                }
+                active = visible;
+                this.syncDomLayout(container, node, active);
+            },
+            clear,
+        };
+    }
+
+    private handleCredentialResponse(response: GoogleCredentialResponse): void {
+        console.log('[Google] handleCredentialResponse:', response, !!this._loginCallback)
+        const credential = response?.credential || "";
+        const result: IGoogleLoginRes = {
+            // GIS 返回的是 JWT ID Token,沿用项目接口的 accessToken 字段传递。
+            accessToken: credential,
+            isCancel: !credential,
+            status: credential ? "connected" : "failed",
+            reason: credential ? undefined : "Google 登录未返回 credential",
+        };
+
+        this._loginCallback?.(result);
+    }
+
+    private getGoogleIdentity(): GoogleIdentityService | undefined {
+        return (window as GoogleSdkWindow).google?.accounts?.id;
+    }
+
+    private loadGoogleSdk(): Promise<void> {
+        if (this.getGoogleIdentity()) return Promise.resolve();
+
+        return new Promise((resolve, reject) => {
+            let script = document.getElementById(GOOGLE_SDK_ID) as HTMLScriptElement | null;
+            if (!script) {
+                script = document.createElement("script");
+                script.id = GOOGLE_SDK_ID;
+                script.src = GOOGLE_SDK_URL;
+                script.async = true;
+                script.defer = true;
+                document.head.appendChild(script);
+            }
+
+            const clearListeners = () => {
+                window.clearTimeout(timeoutId);
+                script?.removeEventListener("load", onLoad);
+                script?.removeEventListener("error", onError);
+            };
+            const onLoad = () => {
+                clearListeners();
+                this.getGoogleIdentity()
+                    ? resolve()
+                    : reject(new Error("Google Identity Services SDK 不可用"));
+            };
+            const onError = () => {
+                clearListeners();
+                script?.remove();
+                reject(new Error("Google Identity Services SDK 下载失败"));
+            };
+            const timeoutId = window.setTimeout(() => {
+                clearListeners();
+                script?.remove();
+                reject(new Error("Google Identity Services SDK 加载超时"));
+            }, 15000);
+
+            script.addEventListener("load", onLoad, { once: true });
+            script.addEventListener("error", onError, { once: true });
+        });
+    }
+
+    private syncDomLayout(container: HTMLDivElement, node: Node, active: boolean): void {
+        if (!active || !node.activeInHierarchy) {
+            container.style.display = "none";
+            return;
+        }
+
+        const uiTransform = node.getComponent(UITransform);
+        const camera = this.findCanvasCamera(node);
+        const gameCanvas = this.getGameCanvas();
+        if (!uiTransform || !camera || !gameCanvas) {
+            container.style.display = "none";
+            return;
+        }
+
+        const worldBounds = uiTransform.getBoundingBoxToWorld();
+        const worldZ = node.worldPosition.z;
+        const bottomLeft = camera.worldToScreen(new Vec3(worldBounds.xMin, worldBounds.yMin, worldZ));
+        const topRight = camera.worldToScreen(new Vec3(worldBounds.xMax, worldBounds.yMax, worldZ));
+        const screenWidth = screen.windowSize.width || gameCanvas.width;
+        const screenHeight = screen.windowSize.height || gameCanvas.height;
+        if (screenWidth <= 0 || screenHeight <= 0) {
+            container.style.display = "none";
+            return;
+        }
+
+        const canvasRect = gameCanvas.getBoundingClientRect();
+        const minX = Math.min(bottomLeft.x, topRight.x);
+        const maxX = Math.max(bottomLeft.x, topRight.x);
+        const minY = Math.min(bottomLeft.y, topRight.y);
+        const maxY = Math.max(bottomLeft.y, topRight.y);
+
+        container.style.display = "flex";
+        container.style.left = `${canvasRect.left + minX / screenWidth * canvasRect.width}px`;
+        container.style.top = `${canvasRect.top + (1 - maxY / screenHeight) * canvasRect.height}px`;
+        container.style.width = `${(maxX - minX) / screenWidth * canvasRect.width}px`;
+        container.style.height = `${(maxY - minY) / screenHeight * canvasRect.height}px`;
+    }
+
+    private findCanvasCamera(node: Node): Camera | null {
+        let current: Node | null = node;
+        while (current) {
+            const canvas = current.getComponent(Canvas);
+            if (canvas) return canvas.cameraComponent || current.getComponent(Camera);
+            current = current.parent;
+        }
+        return null;
+    }
+
+    private getGameCanvas(): HTMLCanvasElement | null {
+        const gameCanvas = document.getElementById("GameCanvas");
+        if (gameCanvas instanceof HTMLCanvasElement) return gameCanvas;
+        return document.querySelector("canvas");
+    }
+}

+ 9 - 0
assets/scripts/platform/Google/GoogleH5Impl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "e36570e0-16d6-4278-a369-725064cadeb6",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 15 - 0
assets/scripts/platform/Google/GoogleIOSImpl.ts

@@ -0,0 +1,15 @@
+import { GoogleImpl, IGoogleLoginRes } from "./GoogleImpl";
+
+export class GoogleIOSImpl extends GoogleImpl {
+    init() {
+        throw new Error("Method not implemented.");
+    }
+    
+    protected onLogin(): Promise<IGoogleLoginRes> {
+        throw new Error("Method not implemented.");
+    }
+
+    logOut(): Promise<boolean> {
+        throw new Error("Method not implemented.");
+    }
+}

+ 9 - 0
assets/scripts/platform/Google/GoogleIOSImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "83576cdb-390d-4cbb-873e-7a615fda3950",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 40 - 0
assets/scripts/platform/Google/GoogleImpl.ts

@@ -0,0 +1,40 @@
+import { Node } from "cc";
+
+export interface IGoogleLoginRes {
+    accessToken: string;
+    isCancel: boolean;
+    status?: string;
+    reason?: string;
+}
+
+export interface IGoogleBtnLogin {
+    active: boolean,
+    setActive: (active: boolean) => void,
+    clear: () => void,
+}
+
+
+export abstract class GoogleImpl {
+    private _isInitialized = false;
+
+    public get isInitialized() { return this._isInitialized; }
+
+    abstract init();
+
+    protected onInited() {
+        this._isInitialized = true;
+    }
+
+    async login(): Promise<IGoogleLoginRes> {
+        const res = await this.onLogin();
+        return res;
+    }
+
+    protected abstract onLogin(): Promise<IGoogleLoginRes>;
+
+    abstract logOut(): Promise<boolean>;
+
+    createLoginBtn(node: Node, callback: (res: IGoogleLoginRes) => void): IGoogleBtnLogin {
+        return null;
+    }
+}

+ 9 - 0
assets/scripts/platform/Google/GoogleImpl.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "cee9a64d-34d2-41a3-a73d-eef44d31f22b",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 1 - 0
assets/scripts/services/index.ts

@@ -2,3 +2,4 @@ export * from './lobby/LobbyService';
 export * from './login/LoginService';
 export * from './hall/HallService';
 export * from './game/GameService';
+export * from './pay/PaymentServices';

+ 0 - 1
assets/scripts/services/lobby/LobbyService.ts

@@ -56,7 +56,6 @@ class LobbyService {
 
     }
 
-
     async openGame(gameID: number) {
         const hallService = AppKernel.services.hallService;
         const mainStore = AppKernel.stores.mainStore;

+ 57 - 2
assets/scripts/services/login/LoginService.ts

@@ -1,8 +1,63 @@
+import { Login3rdType, APP_LOGIN_TYPE } from "@scripts/define/Define";
 import { AppKernel } from "../../app/AppKernel";
+import { IGoogleLoginRes } from "@scripts/platform/Google/GoogleImpl";
 
 class LoginService {
-    async startLogin() {
-        await AppKernel.stores.mainStore.reqGetRoutes();
+    async guestLogin() {
+        const mainStore = AppKernel.stores.mainStore;
+        const loggedIn = await mainStore.reqLogin({ type: APP_LOGIN_TYPE.GUEST });
+        if (!!loggedIn) {
+            await AppKernel.services.lobbyService.onLoginSuccess();
+            return true;
+        }
+        return false;
+    }
+
+    async fbLogin() {
+        const res = await AppKernel.fb.login();
+        if (res.accessToken) {
+            await this.login3rd('facebook', res.accessToken);
+        }
+        console.log("facebook login res: ", res);
+    }
+
+    async googleLogin(res?: IGoogleLoginRes) {
+        if (!res) {
+            /// h5 通过dom按钮触发登录
+            res = await AppKernel.google.login();
+        }
+
+        if (res && res.accessToken) {
+            await this.login3rd('google', res.accessToken);
+        }
+        return true;
+    }
+
+    async login3rd(type: Login3rdType, token: string) {
+        const mainStore = AppKernel.stores.mainStore;
+        const loggedIn = await mainStore.reqLogin3rd(type, token);
+        if (!!loggedIn) {
+            await AppKernel.services.lobbyService.onLoginSuccess();
+            return true;
+        }
+        return false;
+    }
+
+    async loginAccount(account: string, password: string) {
+        const mainStore = AppKernel.stores.mainStore;
+        mainStore.reqLogin({
+            type: APP_LOGIN_TYPE.ID,
+            password,
+            account,
+        })
+    }
+
+    async logOut() {
+    }
+
+    async register({ account, code, password }) {
+        const mainStore = AppKernel.stores.mainStore;
+        await mainStore.reqRegister({ account, code, password })
     }
 }
 

+ 9 - 0
assets/scripts/services/pay.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "cc0029cf-c5b8-412e-9e77-100937c38584",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 18 - 0
assets/scripts/services/pay/PaymentServices.ts

@@ -0,0 +1,18 @@
+import { AppKernel } from "@scripts/app/AppKernel";
+import { UIViewID } from "@scripts/define/UIDefine";
+import { IGoodsConfig } from "@scripts/store/payStore/data";
+
+class PaymentServices {
+    async startPayment(goods: IGoodsConfig) {
+        if (!goods.choiseGear) {
+            //打开选择支付方式的弹窗
+            //goods.choiseGear = await AppKernel.ui.open(UIViewID)
+        }
+    }
+
+    protected async getPaymentOrder(goods: IGoodsConfig) {
+
+    }
+}
+
+export const paymentServices = new PaymentServices();

+ 9 - 0
assets/scripts/services/pay/PaymentServices.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "979c3644-22b6-4758-9612-8a59b86f3877",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 9 - 0
assets/scripts/store/checkInStore.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "3848189e-d697-4aed-9810-40c96c331dd8",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 84 - 0
assets/scripts/store/checkInStore/CheckInStore.ts

@@ -0,0 +1,84 @@
+import {
+    APP_CHECKIN_CHECK,
+    APP_CHECKIN_GET,
+    success,
+} from '../../api';
+import { ApiEnvelope, Http } from '../../request';
+import { ICheckInData, ICheckInResponseData } from './data';
+
+class CheckInStore {
+    private _checkInData: ICheckInData = null;
+    private _nextCheckInTime = 0;
+    private _canCheckIn = false;
+
+    public get checkInData() { return this._checkInData; }
+
+    public get nextCheckInTime() { return this._nextCheckInTime; }
+
+    public get canCheckIn() { return this._canCheckIn; }
+
+    async reqCheckinCheck(): Promise<boolean> {
+        const res = await Http.call<ICheckInResponseData>(APP_CHECKIN_CHECK);
+        if (success(res) && res.data) {
+            this.parseCheckInData(res.data);
+            return this._canCheckIn;
+        }
+        return false;
+    }
+
+    async reqCheckinGet(): Promise<ApiEnvelope> {
+        const res = await Http.call(APP_CHECKIN_GET);
+        if (success(res)) {
+            this._canCheckIn = false;
+            try {
+                await this.reqCheckinCheck();
+            } catch (error) {
+                console.warn('[CheckInStore] failed to refresh check-in info', error);
+            }
+        }
+        return res;
+    }
+
+    clear() {
+        this._checkInData = null;
+        this._nextCheckInTime = 0;
+        this._canCheckIn = false;
+    }
+
+    private parseCheckInData(data: ICheckInResponseData) {
+        const config = Array.isArray(data.config) ? data.config : [];
+        const record = String(data.RecordDay || '');
+        let signInDay = -1;
+
+        const dailyRewards = config.map((item, index) => {
+            signInDay = Number(item.SignInDay);
+            return {
+                dayNumber: Number(item.DayNumber),
+                rewardScore: Number(item.RewardScore) / 100,
+                isCheckedIn: Number.parseInt(record.substring(index, index + 1), 10) > 0,
+            };
+        });
+
+        const seconds = Number(data.seconds || 0);
+        const nextCheckInTime = seconds > 0 ? Date.now() + seconds * 1000 : 0;
+        let nextDayNumber = Number(data.NextDayNumber || 0);
+        let canCheckIn = nextCheckInTime === 0 || Date.now() >= nextCheckInTime;
+        if (nextDayNumber > 7) {
+            nextDayNumber = 7;
+            canCheckIn = false;
+        }
+
+        const parsedLastDate = data.LastDate ? Date.parse(String(data.LastDate)) : 0;
+        this._checkInData = {
+            ...data,
+            dailyRewards,
+            nDayNumber: signInDay,
+            LastDate: Number.isFinite(parsedLastDate) ? parsedLastDate : 0,
+            NextDayNumber: nextDayNumber,
+        };
+        this._nextCheckInTime = nextCheckInTime;
+        this._canCheckIn = canCheckIn;
+    }
+}
+
+export const checkInStore = new CheckInStore();

+ 9 - 0
assets/scripts/store/checkInStore/CheckInStore.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "5695b3e7-bc12-4a39-bc4c-fc6eab60d2c5",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 30 - 0
assets/scripts/store/checkInStore/data.ts

@@ -0,0 +1,30 @@
+export interface ICheckInConfig {
+    DayNumber: string | number;
+    RewardScore: string | number;
+    SignInDay: string | number;
+    RecordDay?: string;
+    [key: string]: unknown;
+}
+
+export interface ICheckInResponseData {
+    config?: ICheckInConfig[];
+    RecordDay?: string;
+    LastDate?: string | number;
+    NextDayNumber?: string | number;
+    seconds?: string | number;
+    TotalReward?: string | number;
+    [key: string]: unknown;
+}
+
+export interface ICheckInDailyReward {
+    dayNumber: number;
+    rewardScore: number;
+    isCheckedIn: boolean;
+}
+
+export interface ICheckInData extends ICheckInResponseData {
+    dailyRewards: ICheckInDailyReward[];
+    nDayNumber: number;
+    LastDate: number;
+    NextDayNumber: number;
+}

+ 9 - 0
assets/scripts/store/checkInStore/data.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "b5cf3b1d-743d-47bd-ac38-d56e4d27716f",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 4 - 1
assets/scripts/store/index.ts

@@ -1,2 +1,5 @@
 export * from './mainStore/MainStore'
-export * from './pageSlice/PageStore'
+export * from './pageSlice/PageStore'
+export * from './mailStore/MailStore'
+export * from './payStore/PayStore'
+export * from './checkInStore/CheckInStore'

+ 9 - 0
assets/scripts/store/mailStore.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "469c8615-554c-464d-b122-525d3202b487",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 102 - 0
assets/scripts/store/mailStore/MailStore.ts

@@ -0,0 +1,102 @@
+import {
+    APP_MAIL_CHECK,
+    APP_MAIL_DELETE,
+    APP_MAIL_LIST,
+    APP_MAIL_READ,
+    APP_MAIL_TAKE,
+    success,
+} from '../../api';
+import { Http } from '../../request';
+import { IMailActionData, IMailCheckData, IMailItem, IMailPageData } from './data';
+
+class MailStore {
+    private _pageData: IMailPageData = null;
+    private _newMailCount = 0;
+    private _mailList: IMailItem[] = [];
+    private _readMailID = 0;
+
+    public get pageData() { return this._pageData; }
+
+    public get newMailCount() { return this._newMailCount; }
+
+    public get mailList() { return this._mailList; }
+
+    public get readMailID() { return this._readMailID; }
+
+    getMail(mailID: number) {
+        return this._mailList.find(item => Number(item.MailID) === Number(mailID)) || null;
+    }
+
+    selectMail(mailID: number) {
+        this._readMailID = mailID;
+    }
+
+    async reqMailList() {
+        const res = await Http.call<IMailPageData>(APP_MAIL_LIST);
+        if (success(res) && res.data) {
+            this._pageData = res.data;
+            this._mailList = Array.isArray(res.data.data) ? res.data.data : [];
+            return true;
+        }
+        return false;
+    }
+
+    async reqMailCheck() {
+        const res = await Http.call<IMailCheckData>(APP_MAIL_CHECK);
+        if (success(res) && res.data) {
+            const count = Number(res.data.new || 0);
+            this._newMailCount = Number.isFinite(count) ? Math.max(0, count) : 0;
+            return true;
+        }
+        return false;
+    }
+
+    async reqMailRead(mailID: number) {
+        const res = await Http.call<IMailActionData>(APP_MAIL_READ, { MailID: mailID });
+        if (success(res)) {
+            const responseMailID = Number(res.data?.MailID ?? mailID);
+            const item = this.getMail(responseMailID);
+            if (item && Number(item.MailStatus) < 2) {
+                item.MailStatus = '2';
+                this._newMailCount = Math.max(0, this._newMailCount - 1);
+            }
+
+            return true;
+        }
+        return false;
+    }
+
+    async reqMailDelete(mailID: number) {
+        const res = await Http.call(APP_MAIL_DELETE, { MailID: mailID });
+        if (success(res)) {
+            if (mailID === 0) {
+                this._mailList = [];
+            } else {
+                this._mailList = this._mailList.filter(item => Number(item.MailID) !== Number(mailID));
+            }
+            if (this._readMailID === mailID) this._readMailID = 0;
+            return true;
+        }
+        return false;
+    }
+
+    async reqMailTake(mailID: number) {
+        const res = await Http.call<IMailActionData>(APP_MAIL_TAKE, { MailID: mailID });
+        if (success(res)) {
+            const responseMailID = Number(res.data?.MailID ?? mailID);
+            const item = this.getMail(responseMailID);
+            if (item) item.MailStatus = '3';
+            return true;
+        }
+        return false;
+    }
+
+    clear() {
+        this._pageData = null;
+        this._newMailCount = 0;
+        this._mailList = [];
+        this._readMailID = 0;
+    }
+}
+
+export const mailStore = new MailStore();

+ 9 - 0
assets/scripts/store/mailStore/MailStore.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "a599c2e4-43c4-4d57-aafe-466869bd4d28",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 32 - 0
assets/scripts/store/mailStore/data.ts

@@ -0,0 +1,32 @@
+export interface IMailItem {
+    MailID: number;
+    MailStatus: string | number;
+    UserID?: number;
+    CreateTime?: string | number;
+    strkBonus?: string;
+    strkText?: string;
+    strkTitle?: string;
+    [key: string]: unknown;
+}
+
+export interface IMailPageData {
+    data?: IMailItem[];
+    page?: number;
+    pageSize?: number;
+    total?: number;
+    totalPage?: number;
+    [key: string]: unknown;
+}
+
+export interface IMailCheckData {
+    new?: string | number;
+    [key: string]: unknown;
+}
+
+export interface IMailActionData {
+    MailID?: string | number;
+    NowScore?: string | number;
+    OrgScore?: string | number;
+    GiftScore?: string | number;
+    [key: string]: unknown;
+}

+ 9 - 0
assets/scripts/store/mailStore/data.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "2c6ab431-bf31-4f92-9dd2-6981da98e96c",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 135 - 9
assets/scripts/store/mainStore/MainStore.ts

@@ -1,11 +1,30 @@
-import { API_LOGIN, APP_ROUTES, success, APP_GAME_CARD_INFO } from "../../api";
+import {
+    APP_LOGIN,
+    APP_LOGIN_3RD,
+    APP_REGISTER,
+    APP_FAVO_ADD,
+    APP_FAVO_GET,
+    APP_FAVO_REMOVE,
+    APP_GAME_CARD_INFO,
+    APP_PROTECT_CHECK,
+    APP_PROTECT_GET,
+    APP_ROUTES,
+    success,
+    APP_SEND_CODE,
+} from "../../api";
 import { AppKernel } from "../../app/AppKernel";
-import { LoginType } from "../../define/Define";
+import { Login3rdType, APP_LOGIN_TYPE } from "../../define/Define";
 import { LOCAL_SIGN } from "../../constants/Localkey";
-import { Http } from "../../request";
+import { ApiEnvelope, Http } from "../../request";
 import { getEnterPlatform, localStorageSet } from "../../utils/Helper";
 import { IGameInfo } from "../pageSlice/data";
-import { IRoutesResponse, IUserData, IWithdrawChannel } from "./data";
+import {
+    IFavoriteRequest,
+    IProtectInfo,
+    IRoutesResponse,
+    IUserData,
+    IWithdrawChannel,
+} from "./data";
 
 class MainStore {
     private _firstLaunch = true;
@@ -21,6 +40,9 @@ class MainStore {
     private _landscapeGames: string[];
     private _withdrawChannel: IWithdrawChannel;
     private _serverKick: boolean;
+    private _favorites: number[] = [];
+    private _favoriteGames: IGameInfo[] = [];
+    private _protectInfo: IProtectInfo = null;
 
     private _gameCardInfo = {};
 
@@ -59,6 +81,11 @@ class MainStore {
 
     public get serverKick() { return this._serverKick; }
 
+    public get favorites() { return this._favorites; }
+
+    public get favoriteGames() { return this._favoriteGames; }
+
+    public get protectInfo() { return this._protectInfo; }
 
     async reqGetRoutes() {
         const platform = AppKernel.platform;
@@ -210,6 +237,23 @@ class MainStore {
         return true;
     }
 
+    async reqRegister({ account, code, password }) {
+        const params = {
+            type: APP_LOGIN_TYPE.PHONE,
+            country: 1,
+            phone: account,
+            code: code,
+            password,
+            repassword: password,
+        }
+        const res = await Http.call<IUserData>(APP_REGISTER, params);
+        if (success(res)) {
+            this.parseLogin(res.data);
+            return true;
+        }
+        return false;
+    }
+
     async reqLogin(arg) {
         const loginType = arg.type;
         // const lang = global.i18n?.getCurrLang?.() || "";
@@ -221,22 +265,35 @@ class MainStore {
         }
 
         switch (loginType) {
-            case LoginType.ID:
+            case APP_LOGIN_TYPE.ID:
                 params.account = arg.account;
                 break;
-            case LoginType.PHONE:
+            case APP_LOGIN_TYPE.PHONE:
                 params.country = arg.country;
                 params.account = arg.phone;
                 break;
-            case LoginType.MAIL:
+            case APP_LOGIN_TYPE.MAIL:
                 params.account = arg.email;
                 break;
-            case LoginType.GUEST:
+            case APP_LOGIN_TYPE.GUEST:
                 delete params.password;
                 break;
         }
 
-        const res = await Http.call<IUserData>(API_LOGIN, params)
+        const res = await Http.call<IUserData>(APP_LOGIN, params)
+        if (success(res)) {
+            this.parseLogin(res.data);
+            return true;
+        }
+        return false;
+    }
+
+    async reqLogin3rd(type: Login3rdType, token: string) {
+        const params: any = {
+            provider: type,
+            token: token
+        }
+        const res = await Http.call<IUserData>(APP_LOGIN_3RD, params);
         if (success(res)) {
             this.parseLogin(res.data);
             return true;
@@ -276,6 +333,75 @@ class MainStore {
         }
     }
 
+    async reqSendCode(account: string) {
+        const params = {
+            Phone: account,
+            country: 1,
+        }
+
+        const res = await Http.call(APP_SEND_CODE, params);
+        return success(res);
+    }
+
+    async reqFavoAdd(id: number) {
+        const res = await Http.call(APP_FAVO_ADD, { id });
+        if (success(res)) this.addFavorite(id);
+        return res;
+    }
+
+    async reqFavoRemove(id: number) {
+        const res = await Http.call(APP_FAVO_REMOVE, { id });
+        if (success(res)) this.removeFavorite(id);
+        return res;
+    }
+
+    async reqUpdateFavoInfo(arg: IFavoriteRequest) {
+        return arg.like === 1
+            ? this.reqFavoAdd(arg.id)
+            : this.reqFavoRemove(arg.id);
+    }
+
+    async reqFavoGet() {
+        const res = await Http.call<IGameInfo[]>(APP_FAVO_GET);
+        if (!success(res)) return res;
+
+        this._favoriteGames = Array.isArray(res.data) ? res.data : [];
+        this._favorites = this._favoriteGames
+            .map(item => Number(item?.id))
+            .filter(id => Number.isFinite(id));
+        return res;
+    }
+
+    async reqProtectCheck() {
+        const res = await Http.call<IProtectInfo[]>(APP_PROTECT_CHECK);
+        if (success(res) && Array.isArray(res.data) && res.data[0]) {
+            const info = { ...res.data[0] };
+            info.TotalReward = Number(info.total_recharge || 0) - Number(info.can_receive_num || 0);
+            this._protectInfo = info;
+        }
+        return res;
+    }
+
+    async reqProtectGet(): Promise<ApiEnvelope> {
+        const res = await Http.call(APP_PROTECT_GET);
+        if (success(res) && this._protectInfo) {
+            this._protectInfo.CurProtectTimes = Number(this._protectInfo.CurProtectTimes || 0) + 1;
+        }
+        return res;
+    }
+
+    private addFavorite(id: number) {
+        const favoriteId = Number(id);
+        if (!Number.isFinite(favoriteId) || this._favorites.includes(favoriteId)) return;
+        this._favorites = [...this._favorites, favoriteId];
+    }
+
+    private removeFavorite(id: number) {
+        const favoriteId = Number(id);
+        this._favorites = this._favorites.filter(item => item !== favoriteId);
+        this._favoriteGames = this._favoriteGames.filter(item => Number(item?.id) !== favoriteId);
+    }
+
     async getGameCardInfo(gameId: number) {
         if (this._gameCardInfo[gameId]) {
             return this._gameCardInfo[gameId];

+ 18 - 0
assets/scripts/store/mainStore/data.ts

@@ -42,3 +42,21 @@ export interface IWithdrawChannel {
     cashapp: IWithdrawConfig;
     paypal: IWithdrawConfig;
 }
+
+export interface IFavoriteRequest {
+    id: number;
+    like: number;
+}
+
+export interface IProtectInfo {
+    CurProtectTimes?: string | number;
+    ProtectLimit?: string | number;
+    ProtectNum?: string | number;
+    ProtectTimes?: string | number;
+    Alpha?: string | number;
+    can_receive?: string | number;
+    can_receive_num?: string | number;
+    total_recharge?: string | number;
+    TotalReward?: number;
+    [key: string]: unknown;
+}

+ 9 - 0
assets/scripts/store/payStore.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "e51ca1ae-e679-4b11-b761-ad8167a28e8f",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 200 - 0
assets/scripts/store/payStore/PayStore.ts

@@ -0,0 +1,200 @@
+import {
+    APP_PAYMENT_ORDER,
+    APP_PAY_ORDER_LIST,
+    APP_RECHARGE_CONFIG,
+    APP_WITHDRAW_BASE_INFO,
+    APP_WITHDRAW_PAYOUT,
+    APP_WITHDRAW_RECORD,
+    APP_WITHDRAW_SET_INFO,
+    success,
+} from '@scripts/api';
+import { ApiEnvelope, Http } from '@scripts/request';
+import {
+    IGoodsConfig,
+    IPaymentOrder,
+    IPaymentOrderRequest,
+    IPayOrderItem,
+    IPayOrderPageData,
+    IRechargeConfigData,
+    IWithdrawBaseInfo,
+    IWithdrawBaseInfoRequest,
+    IWithdrawPayoutRequest,
+    IWithdrawRecordItem,
+    IWithdrawRecordPageData,
+    IWithdrawRecordRequest,
+    IWithdrawSetInfoRequest,
+} from './data';
+
+class PayStore {
+    private _config: IGoodsConfig[] = [];
+    private _showBonus: boolean | number = false;
+    private _cpfFirst: boolean | number = false;
+    private _currPayOrder: IPaymentOrder = null;
+    private _currPayGiftID = -1;
+    private _payOrderList: IPayOrderItem[] = [];
+    private _withdrawBaseInfo: IWithdrawBaseInfo = null;
+    private _withdrawRecord: IWithdrawRecordItem[] = [];
+
+    public get config() { return this._config; }
+
+    public get showBonus() { return this._showBonus; }
+
+    public get cpfFirst() { return this._cpfFirst; }
+
+    public get currPayOrder() { return this._currPayOrder; }
+
+    public get currPayGiftID() { return this._currPayGiftID; }
+
+    public get payOrderList() { return this._payOrderList; }
+
+    public get withdrawBaseInfo() { return this._withdrawBaseInfo; }
+
+    public get withdrawRecord() { return this._withdrawRecord; }
+
+    async reqRechargeConfig() {
+        const res = await Http.call<IRechargeConfigData>(APP_RECHARGE_CONFIG);
+        if (success(res) && res.data) {
+            this._config = Array.isArray(res.data.list) ? res.data.list : [];
+            this._showBonus = res.data.bonus_show ?? false;
+            this._cpfFirst = res.data.cpf_first ?? false;
+        }
+        return res;
+    }
+
+    async reqPaymentOrder(arg: IPaymentOrderRequest): Promise<boolean> {
+        const user = arg.user;
+        const price = arg.price ?? arg.prices;
+        const params = {
+            tranType: '0502',
+            payAmt: price,
+            goodsName: arg.goodsName,
+            buyIp: '',
+            pay_type: arg.payType,
+            pay_method: arg.pay_method,
+            GiftsID: arg.GiftsID,
+            eventType: arg.eventType || 1,
+            AdId: user?.GlobalUID,
+            userName: user?.NickName,
+            userEmail: user?.Email,
+            userPhone: user?.Phone,
+            rand_str: Date.now(),
+            cpf_first: arg.cpf_first || 0,
+        };
+        const res = await Http.call<Record<string, unknown>>(APP_PAYMENT_ORDER, params);
+        if (success(res) && res.data && !Array.isArray(res.data)) {
+            const orderArg: Partial<IPaymentOrderRequest> = { ...arg };
+            delete orderArg.user;
+
+            this._currPayOrder = {
+                ...res.data,
+                createAt: Date.now(),
+                deadline: Number(res.data.deadline ?? 15 * 60),
+                status: 'pending',
+                arg: orderArg,
+            };
+            this._currPayGiftID = Number(arg.GiftsID ?? -1);
+            return true;
+        }
+        return false;
+    }
+
+    async reqPayOrderList(page = 1, pageSize = 10) {
+        const res = await Http.call<IPayOrderPageData>(APP_PAY_ORDER_LIST, { page, pageSize });
+        if (success(res) && res.data) {
+            this._payOrderList = Array.isArray(res.data.data) ? res.data.data : [];
+            return true;
+        }
+        return false;
+    }
+
+    async reqWithdrawBaseInfo(arg: IWithdrawBaseInfoRequest = {}): Promise<boolean> {
+        const res = await Http.call<IWithdrawBaseInfo>(APP_WITHDRAW_BASE_INFO, {
+            paypass: arg.paypass || '',
+        });
+        if (success(res) && res.data) {
+            this._withdrawBaseInfo = this.parseWithdrawBaseInfo(res.data);
+            return true;
+        }
+        return false;
+    }
+
+    async reqWithdrawRecord(arg: IWithdrawRecordRequest = {}) {
+        const params: Record<string, unknown> = {
+            paypass: arg.paypass || '',
+        };
+        if (arg.score_type !== undefined) params.score_type = arg.score_type;
+        if (arg.sort_by !== undefined) params.sort_by = arg.sort_by;
+        if (arg.sort !== undefined) params.sort = arg.sort;
+
+        const res = await Http.call<IWithdrawRecordPageData>(APP_WITHDRAW_RECORD, params);
+        if (success(res) && res.data) {
+            this._withdrawRecord = Array.isArray(res.data.data) ? res.data.data : [];
+            return true;
+        }
+        return false;
+    }
+
+    async reqWithdrawSetInfo(arg: IWithdrawSetInfoRequest): Promise<boolean> {
+        const params = {
+            paypass: arg.paypass || '',
+            cbPixType: arg.PixType,
+            bank: arg.bank,
+            account: arg.account,
+            userName: arg.userName,
+            phone: arg.phone,
+            PAN: arg.PAN,
+            email: arg.email,
+            IFSC: arg.IFSC,
+            adhaar: arg.adhaar,
+            branceBank: arg.branceBank,
+            PixNum: arg.PixNum,
+            code: arg.code || '',
+        };
+        const res = await Http.call(APP_WITHDRAW_SET_INFO, params);
+        if (success(res)) {
+            await this.reqWithdrawBaseInfo({ paypass: arg.paypass });
+            return true;
+        }
+        return false;
+    }
+
+    async reqWithdrawPayout(arg: IWithdrawPayoutRequest): Promise<boolean> {
+        const res = await Http.call(APP_WITHDRAW_PAYOUT, {
+            paypass: arg.paypass || '',
+            score: arg.score,
+        });
+        if (success(res)) {
+            await this.reqWithdrawBaseInfo({ paypass: arg.paypass });
+            return true;
+        }
+        return false;
+    }
+
+    clear() {
+        this._currPayOrder = null;
+        this._currPayGiftID = -1;
+        this._payOrderList = [];
+        this._withdrawBaseInfo = null;
+        this._withdrawRecord = [];
+    }
+
+    private parseWithdrawBaseInfo(data: IWithdrawBaseInfo): IWithdrawBaseInfo {
+        const info = { ...data };
+        if (Number(info.SumCanExchange) < 0) info.SumCanExchange = 0;
+
+        const defaultCooldown = Number(info.withdraw_info_cooldown_seconds || 0);
+        const cashappCooldown = Number(
+            info.withdraw_info_precheck?.cashapp?.cooldown_seconds ?? defaultCooldown,
+        );
+        const paypalCooldown = Number(
+            info.withdraw_info_precheck?.paypal?.cooldown_seconds ?? defaultCooldown,
+        );
+
+        info.cashapp_update_cd = cashappCooldown > 0 ? Date.now() + cashappCooldown * 1000 : 0;
+        info.paypal_update_cd = paypalCooldown > 0 ? Date.now() + paypalCooldown * 1000 : 0;
+        info.lastUpdateTs = Date.now() - Number(info.withdraw_info_update_time_pass || 0) * 1000;
+        return info;
+    }
+}
+
+export const payStore = new PayStore();

+ 9 - 0
assets/scripts/store/payStore/PayStore.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "e52152ca-4da1-4294-bb06-e5c5a7d3b752",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 114 - 0
assets/scripts/store/payStore/data.ts

@@ -0,0 +1,114 @@
+export interface IGoodsConfig {
+    prices: number;
+    price?: number;
+    goodsName: string;
+    payType: string;
+    GiftsID: number;
+    gear: string;
+    choiseGear?: string;
+    coupon_id: number;
+}
+
+export interface IPaymentUser {
+    GlobalUID: string;
+    NickName: string;
+    Email: string;
+    Phone: string;
+}
+
+export interface IPaymentOrderRequest extends Partial<IGoodsConfig> {
+    user: IPaymentUser;
+    eventType?: number;
+    cpf_first?: number;
+    pay_method?: string;
+}
+
+export interface IRechargeConfigData {
+    list?: IGoodsConfig[];
+    bonus_show?: boolean | number;
+    cpf_first?: boolean | number;
+    [key: string]: unknown;
+}
+
+export interface IPaymentOrder {
+    createAt: number;
+    deadline: number;
+    status: string;
+    arg: Partial<IPaymentOrderRequest>;
+    [key: string]: unknown;
+}
+
+export interface IPayOrderItem {
+    amount?: string | number;
+    created_at?: string;
+    finished_at?: string;
+    pay_status?: string | number;
+    payment_sn?: string;
+    [key: string]: unknown;
+}
+
+export interface IPayOrderPageData {
+    data?: IPayOrderItem[];
+    [key: string]: unknown;
+}
+
+export interface IWithdrawBaseInfo {
+    SumCanExchange?: string | number;
+    withdraw_info_cooldown_seconds?: string | number;
+    withdraw_info_update_time_pass?: string | number;
+    withdraw_info_precheck?: {
+        cashapp?: { cooldown_seconds?: string | number };
+        paypal?: { cooldown_seconds?: string | number };
+        [key: string]: unknown;
+    };
+    paypal_update_cd?: number;
+    cashapp_update_cd?: number;
+    lastUpdateTs?: number;
+    [key: string]: unknown;
+}
+
+export interface IWithdrawBaseInfoRequest {
+    paypass?: string;
+}
+
+export interface IWithdrawRecordRequest {
+    paypass?: string;
+    score_type?: number;
+    sort_by?: string;
+    sort?: string;
+}
+
+export interface IWithdrawRecordItem {
+    WithDraw?: string | number;
+    ServiceFee?: string | number;
+    State?: string | number;
+    OrderId?: string;
+    CreateDate?: string;
+    [key: string]: unknown;
+}
+
+export interface IWithdrawRecordPageData {
+    data?: IWithdrawRecordItem[];
+    [key: string]: unknown;
+}
+
+export interface IWithdrawSetInfoRequest {
+    paypass?: string;
+    PixType?: string | number;
+    bank?: string;
+    account?: string;
+    userName?: string;
+    phone?: string;
+    PAN?: string;
+    email?: string;
+    IFSC?: string;
+    adhaar?: string;
+    branceBank?: string;
+    PixNum?: string;
+    code?: string;
+}
+
+export interface IWithdrawPayoutRequest {
+    paypass?: string;
+    score: string | number;
+}

+ 9 - 0
assets/scripts/store/payStore/data.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "6d992b89-92ef-4929-9959-763e7b273281",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 23 - 1
assets/scripts/utils/Helper.ts

@@ -5,6 +5,28 @@ const STORAGE_ENCRYPTION_HEAD = 'a6072637';
 const STORAGE_ENCRYPTION_PASSWORD = 'xbd4jl';
 const STORAGE_ENCRYPTION_ENABLED = true;
 
+/**
+ * 将数字格式化为财务展示格式:使用千位分隔符并保留两位小数。
+ * 例如:1234567.8 -> 1,234,567.80。
+ */
+export function formatCurrency(value: number, decimal = 0): string {
+    if (!Number.isFinite(value)) value = 0;
+
+    return value.toLocaleString('en-US', {
+        minimumFractionDigits: decimal,
+        maximumFractionDigits: decimal,
+        useGrouping: true,
+    });
+}
+
+export function formatSCNum(value: number) {
+    return formatCurrency(value, 2);
+}
+
+export function formatGCNum(value: number) {
+    return formatCurrency(value, 0);
+}
+
 /**
  * 读取本地数据,并兼容 game_web_us2 写入的加密格式。
  */
@@ -200,4 +222,4 @@ export function getUrlParams(url: string) {
     }
 
     return params;
-}
+}

+ 8 - 0
assets/scripts/utils/ResHelper.ts

@@ -0,0 +1,8 @@
+import { AppKernel } from "@scripts/app/AppKernel";
+import { BUNDLE_ID } from "@scripts/define/ResDefine";
+
+export default class ResHelper {
+    static async loadAvatar() {
+        // AppKernel.resources.load(BUNDLE_ID, "")
+    }
+}

+ 9 - 0
assets/scripts/utils/ResHelper.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "4.0.24",
+  "importer": "typescript",
+  "imported": true,
+  "uuid": "3d121df3-8b04-4a57-afe3-a386cf93bb4e",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

+ 13 - 3
assets/scripts/utils/UIHelper.ts

@@ -1,5 +1,15 @@
-import { Button } from "cc";
+import { Button, Node } from "cc";
 
-export function addButtonListener(btn: Button) {
-    
+export function addBtnClick(btn: Button | Node, onClick, target) {
+    if (btn instanceof Node) {
+        btn.on(Node.EventType.TOUCH_END, onClick, target);
+        return;
+    }
+}
+
+export function removeBtnClick(btn: Button | Node, onClick, target) {
+    if (btn instanceof Node) {
+        btn.off(Node.EventType.TOUCH_END, onClick, target);
+        return;
+    }
 }