Explorar o código

【会员系统】注册登录逻辑串接

wanjun hai 4 meses
pai
achega
5094e703a8
Modificáronse 44 ficheiros con 2051 adicións e 13 borrados
  1. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/000000.colorset/Contents.json
  2. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/000000_0.1.colorset/Contents.json
  3. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/273C62.colorset/Contents.json
  4. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/273C62_0.4.colorset/Contents.json
  5. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/42464D.colorset/Contents.json
  6. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/4982E6.colorset/Contents.json
  7. 6 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/Contents.json
  8. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/DADBDE.colorset/Contents.json
  9. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/FA1E5D.colorset/Contents.json
  10. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/FFFFFF.colorset/Contents.json
  11. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/PlaceholderColor_757780.colorset/Contents.json
  12. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/Contents.json
  13. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/ic 1.pdf
  14. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/ic.pdf
  15. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/Contents.json
  16. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/ic 1.pdf
  17. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/ic.pdf
  18. 6 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/Contents.json
  19. 0 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/Contents.json
  20. 0 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/headPortrait 1.pdf
  21. 0 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/headPortrait.pdf
  22. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Contents.json
  23. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Property 1=Default 1.pdf
  24. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Property 1=Default.pdf
  25. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Contents.json
  26. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Property 1=重置密码 1.pdf
  27. BIN=BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Property 1=重置密码.pdf
  28. 83 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/1 1.pdf
  29. 83 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/1.pdf
  30. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/Contents.json
  31. 77 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/2 1.pdf
  32. 77 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/2.pdf
  33. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/Contents.json
  34. 17 0
      PDF Office/PDF Master/MemberCenter/Assets/en.lproj/MemberCenterLocalizable.strings
  35. 20 6
      PDF Office/PDF Master/MemberCenter/KMMemberCenterManager.swift
  36. 0 0
      PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterResult.swift
  37. 16 0
      PDF Office/PDF Master/MemberCenter/Model/KMMemberInfo.swift
  38. 16 0
      PDF Office/PDF Master/MemberCenter/Model/KMSignUpModel.swift
  39. 363 0
      PDF Office/PDF Master/MemberCenter/View/KMSignUpView.swift
  40. 465 0
      PDF Office/PDF Master/MemberCenter/View/KMSignUpView.xib
  41. 224 0
      PDF Office/PDF Master/MemberCenter/ViewModel/KMSignUpViewModel.swift
  42. 21 0
      PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.swift
  43. 7 5
      PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.xib
  44. 58 2
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/000000.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x00",
+          "green" : "0x00",
+          "red" : "0x00"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x00",
+          "green" : "0x00",
+          "red" : "0x00"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/000000_0.1.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "0.100",
+          "blue" : "0x00",
+          "green" : "0x00",
+          "red" : "0x00"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "0.100",
+          "blue" : "0x00",
+          "green" : "0x00",
+          "red" : "0x00"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/273C62.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x62",
+          "green" : "0x3C",
+          "red" : "0x27"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x62",
+          "green" : "0x3C",
+          "red" : "0x27"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/273C62_0.4.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "0.400",
+          "blue" : "0x62",
+          "green" : "0x3C",
+          "red" : "0x27"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "0.400",
+          "blue" : "0x62",
+          "green" : "0x3C",
+          "red" : "0x27"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/42464D.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x4D",
+          "green" : "0x46",
+          "red" : "0x42"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x4D",
+          "green" : "0x46",
+          "red" : "0x42"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/4982E6.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xE6",
+          "green" : "0x82",
+          "red" : "0x49"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xE6",
+          "green" : "0x82",
+          "red" : "0x49"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 6 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/DADBDE.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xDE",
+          "green" : "0xDB",
+          "red" : "0xDA"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xDE",
+          "green" : "0xDB",
+          "red" : "0xDA"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/FA1E5D.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x5D",
+          "green" : "0x1E",
+          "red" : "0xFA"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x5D",
+          "green" : "0x1E",
+          "red" : "0xFA"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/FFFFFF.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xFF",
+          "green" : "0xFF",
+          "red" : "0xFF"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0xFF",
+          "green" : "0xFF",
+          "red" : "0xFF"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 38 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/PlaceholderColor_757780.colorset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "colors" : [
+    {
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x80",
+          "green" : "0x77",
+          "red" : "0x75"
+        }
+      },
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "color" : {
+        "color-space" : "srgb",
+        "components" : {
+          "alpha" : "1.000",
+          "blue" : "0x80",
+          "green" : "0x77",
+          "red" : "0x75"
+        }
+      },
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "ic.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "ic 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/ic 1.pdf


BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxNor.imageset/ic.pdf


+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "ic.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "ic 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/ic 1.pdf


BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/CheckBoxSel.imageset/ic.pdf


+ 6 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/UserProfilePicture.imageset/Contents.json → PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/Contents.json


PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/UserProfilePicture.imageset/headPortrait 1.pdf → PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/headPortrait 1.pdf


PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/UserProfilePicture.imageset/headPortrait.pdf → PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture.imageset/headPortrait.pdf


+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "Property 1=Default.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "Property 1=Default 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Property 1=Default 1.pdf


BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro1.imageset/Property 1=Default.pdf


+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "Property 1=重置密码.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "Property 1=重置密码 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Property 1=重置密码 1.pdf


BIN=BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WelcomePDFReaderPro2.imageset/Property 1=重置密码.pdf


+ 83 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/1 1.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 2.696777 cm
+0.460000 0.465714 0.500000 scn
+11.303301 0.706950 m
+1.403806 10.606445 l
+0.696699 9.899339 l
+10.596194 -0.000156 l
+11.303301 0.706950 l
+h
+0.000000 5.303144 m
+0.000000 5.303144 0.697767 6.342149 1.820740 7.361084 c
+7.585757 1.596066 l
+7.080627 1.412907 6.548922 1.303144 6.000000 1.303144 c
+2.686291 1.303144 0.000000 5.303144 0.000000 5.303144 c
+h
+12.000000 5.303144 m
+12.000000 5.303144 11.302233 4.264140 10.179260 3.245204 c
+4.414242 9.010222 l
+4.919372 9.193382 5.451078 9.303144 6.000000 9.303144 c
+9.313708 9.303144 12.000000 5.303144 12.000000 5.303144 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  659
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000749 00000 n
+0000000771 00000 n
+0000000944 00000 n
+0000001018 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1077
+%%EOF

+ 83 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/1.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 2.696777 cm
+0.460000 0.465714 0.500000 scn
+11.303301 0.706950 m
+1.403806 10.606445 l
+0.696699 9.899339 l
+10.596194 -0.000156 l
+11.303301 0.706950 l
+h
+0.000000 5.303144 m
+0.000000 5.303144 0.697767 6.342149 1.820740 7.361084 c
+7.585757 1.596066 l
+7.080627 1.412907 6.548922 1.303144 6.000000 1.303144 c
+2.686291 1.303144 0.000000 5.303144 0.000000 5.303144 c
+h
+12.000000 5.303144 m
+12.000000 5.303144 11.302233 4.264140 10.179260 3.245204 c
+4.414242 9.010222 l
+4.919372 9.193382 5.451078 9.303144 6.000000 9.303144 c
+9.313708 9.303144 12.000000 5.303144 12.000000 5.303144 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  659
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000749 00000 n
+0000000771 00000 n
+0000000944 00000 n
+0000001018 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1077
+%%EOF

+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordUnVisible.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "1.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "1 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 77 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/2 1.pdf

@@ -0,0 +1,77 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 4.000000 cm
+0.460000 0.465714 0.500000 scn
+6.000000 0.000000 m
+9.313708 0.000000 12.000000 4.000000 12.000000 4.000000 c
+12.000000 4.000000 9.313708 8.000000 6.000000 8.000000 c
+2.686291 8.000000 0.000000 4.000000 0.000000 4.000000 c
+0.000000 4.000000 2.686291 0.000000 6.000000 0.000000 c
+h
+6.000000 2.000000 m
+7.104569 2.000000 8.000000 2.895431 8.000000 4.000000 c
+8.000000 5.104569 7.104569 6.000000 6.000000 6.000000 c
+4.895431 6.000000 4.000000 5.104569 4.000000 4.000000 c
+4.000000 2.895431 4.895431 2.000000 6.000000 2.000000 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  621
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000711 00000 n
+0000000733 00000 n
+0000000906 00000 n
+0000000980 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1039
+%%EOF

+ 77 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/2.pdf

@@ -0,0 +1,77 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 4.000000 cm
+0.460000 0.465714 0.500000 scn
+6.000000 0.000000 m
+9.313708 0.000000 12.000000 4.000000 12.000000 4.000000 c
+12.000000 4.000000 9.313708 8.000000 6.000000 8.000000 c
+2.686291 8.000000 0.000000 4.000000 0.000000 4.000000 c
+0.000000 4.000000 2.686291 0.000000 6.000000 0.000000 c
+h
+6.000000 2.000000 m
+7.104569 2.000000 8.000000 2.895431 8.000000 4.000000 c
+8.000000 5.104569 7.104569 6.000000 6.000000 6.000000 c
+4.895431 6.000000 4.000000 5.104569 4.000000 4.000000 c
+4.000000 2.895431 4.895431 2.000000 6.000000 2.000000 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  621
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000711 00000 n
+0000000733 00000 n
+0000000906 00000 n
+0000000980 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1039
+%%EOF

+ 22 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/passwordVisible.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "2.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "2 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 17 - 0
PDF Office/PDF Master/MemberCenter/Assets/en.lproj/MemberCenterLocalizable.strings

@@ -6,6 +6,7 @@
   
 */
 
+/* 服务器错误码 */
 "无效的token或者token已过期" = "无效的token或者token已过期";
 "您的登录设备已达上限,请退出其他设备重新登录" = "您的登录设备已达上限,请退出其他设备重新登录";
 "用户没有登录,请登录后再访问" = "用户没有登录,请登录后再访问";
@@ -29,3 +30,19 @@
 "UNKNOWN" = "UNKNOWN";
 "SUCCESS" = "SUCCESS";
 "Network error" = "Network error";
+
+/* 注册登录模块 */
+"Sign Up" = "Sign Up";
+"Verification code" = "Verification code";
+"Password" = "Password";
+"Send" = "Send";
+"Please enter Email" = "Please enter Email";
+"Enter Verification code" = "Enter Verification code";
+"Stay logged in" = "Stay logged in";
+"Forget Password?" = "Forget Password?";
+"Please enter right Address" = "Please enter right Address";
+"Please enter right Verification code" = "Please enter right Verification code";
+"I have read and agree to the %@ and %@, and an account will be automatically created after I log in to an unregistered email address" = "I have read and agree to the %@ and %@, and an account will be automatically created after I log in to an unregistered email address";
+"User Agreement" = "User Agreement";
+"Privacy Policy" = "Privacy Policy";
+"Resend" = "Resend";

+ 20 - 6
PDF Office/PDF Master/MemberCenter/KMMemberCenterManager.swift

@@ -45,7 +45,7 @@ class KMMemberCenterManager: NSObject {
     static let manager = KMMemberCenterManager()
     private let configuration: KMMemberCenterConfig = KMMemberCenterConfig()
     
-    // MARK: Network Request
+    // MARK: 登录模块
     
     /**
      @abstract 新会员系统重置密码
@@ -146,7 +146,7 @@ class KMMemberCenterManager: NSObject {
                                      "type": 0,
                                      "receiver": receiver,
                                      "appId": "1"]
-        KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: params) { requestSerializer in
             
         } completion: { [weak self] (task, responseObject, error) in
             var dic: NSDictionary = [:]
@@ -183,7 +183,7 @@ class KMMemberCenterManager: NSObject {
      @param code        验证码
      @param complete 回调
      */
-    func getVerificationCode(type: KMVerificationCodeType, account: String, code: String, complete: @escaping KMMemberCenterComplete) {
+    func checkVerificationCode(type: KMVerificationCodeType, account: String, code: String, complete: @escaping KMMemberCenterComplete) {
         let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/isEmailCodeValid"
         var actionType = "member_login"
         if type == .reset {
@@ -282,7 +282,9 @@ class KMMemberCenterManager: NSObject {
             }
             let loginResult = KMMemberLoginResult(refreshToken: refresh_token, accessToken: access_token, tokenType: token_type, expiresIn: expires_in, scope: scope)
             
-            let result = KMMemberCenterResult(loginResult: loginResult)
+            var result = KMMemberCenterResult(loginResult: loginResult)
+            result.code = code
+            result.msg = message
 //            let error = NSError(domain: message, code: code)
             if code == 200 {
                 complete(true, result)
@@ -297,7 +299,7 @@ class KMMemberCenterManager: NSObject {
      @param email       邮箱
      @param complete 回调
      */
-    func getVerificationCode(email: String, complete: @escaping KMMemberCenterComplete) {
+    func getUserDeviceList(email: String, complete: @escaping KMMemberCenterComplete) {
         let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/getLoginDeviceList"
         let params: [String: Any] = ["email": email,
                                      "appId": "1"]
@@ -362,7 +364,7 @@ class KMMemberCenterManager: NSObject {
      @param deviceId       设备记录ID
      @param complete 回调
      */
-    func getVerificationCode(deviceId: String, complete: @escaping KMMemberCenterComplete) {
+    func logoutDevice(deviceId: String, complete: @escaping KMMemberCenterComplete) {
         let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/logoutDevice"
         let params: [String: Any] = ["deviceId": deviceId]
         KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
@@ -394,6 +396,18 @@ class KMMemberCenterManager: NSObject {
         }
     }
     
+    // MARK: 个人信息模块
+    
+    
+    
+    // MARK: 商品模块
+    
+    // MARK: 个人中心模块
+    
+    // MARK: 订单模块
+
+    
+    
     // MARK: Error Code
     
     static func typeOfMessage(type: KMMemberCenterErrorCodeType?) -> String {

PDF Office/PDF Master/MemberCenter/KMMemberCenterResult.swift → PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterResult.swift


+ 16 - 0
PDF Office/PDF Master/MemberCenter/Model/KMMemberInfo.swift

@@ -0,0 +1,16 @@
+//
+//  KMMemberInfo.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/10/22.
+//
+
+import Cocoa
+
+class KMMemberInfo: NSObject {
+    
+    static let defaultManager = KMMemberInfo()
+    
+    var isLogin: Bool = false
+    
+}

+ 16 - 0
PDF Office/PDF Master/MemberCenter/Model/KMSignUpModel.swift

@@ -0,0 +1,16 @@
+//
+//  KMSignUpModel.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/10/22.
+//
+
+import Foundation
+import Combine
+
+class KMSignUpModel {
+    @Published var stayState: Bool = false
+    @Published var privacyState: Bool = false
+
+    
+}

+ 363 - 0
PDF Office/PDF Master/MemberCenter/View/KMSignUpView.swift

@@ -0,0 +1,363 @@
+//
+//  KMSignUpView.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/10/23.
+//
+
+import Cocoa
+import Combine
+
+class KMSignUpView: KMBaseXibView {
+    
+    @IBOutlet weak var signUpLabel: NSTextField!
+    @IBOutlet weak var loginModeBox: NSBox!
+    @IBOutlet weak var verificationCodeButton: NSButton!
+    @IBOutlet weak var selectBox1: NSBox!
+    @IBOutlet weak var passwordButton: NSButton!
+    @IBOutlet weak var selectBox2: NSBox!
+    @IBOutlet weak var emailBox: NSBox!
+    @IBOutlet weak var emailTextField: NSTextField!
+    @IBOutlet weak var emailErrorLabel: NSTextField!
+    @IBOutlet weak var passwordBox: NSBox!
+    @IBOutlet weak var verifficationView: NSView!
+    @IBOutlet weak var verifficationBox: NSBox!
+    @IBOutlet weak var verifficationTextField: NSTextField!
+    @IBOutlet weak var sendBox: KMBox!
+    @IBOutlet weak var sendLabel: NSTextField!
+    @IBOutlet weak var passwordView: NSView!
+    @IBOutlet weak var passwordTextField: NSTextField!
+    @IBOutlet weak var visibleButton: NSButton!
+    @IBOutlet weak var passwordErrorLabel: NSTextField!
+    @IBOutlet weak var stayCheckButton: NSButton!
+    @IBOutlet weak var stayLabel: NSTextField!
+    @IBOutlet weak var forgetButton: NSButton!
+    @IBOutlet weak var signUpBox: NSBox!
+    @IBOutlet weak var signUpButton: NSButton!
+    @IBOutlet weak var privacyCheckButton: NSButton!
+    @IBOutlet weak var privacyLabel: NSTextField!
+        
+    private var viewModel = KMSignUpViewModel()
+    private var cancellables = Set<AnyCancellable>()
+    
+
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+        
+        bindViewModel()
+        languageLocalized()
+        initializeUI()
+    }
+    
+    // MARK: Private Method
+    
+    private func languageLocalized() -> Void {
+        signUpLabel.stringValue = NSLocalizedString("Sign Up", tableName: "MemberCenterLocalizable", comment: "")
+        verificationCodeButton.title = NSLocalizedString("Verification code", tableName: "MemberCenterLocalizable", comment: "")
+        passwordButton.title = NSLocalizedString("Password", tableName: "MemberCenterLocalizable", comment: "")
+//        sendLabel.stringValue = NSLocalizedString("Send", tableName: "MemberCenterLocalizable", comment: "")
+        stayLabel.stringValue = NSLocalizedString("Stay logged in", tableName: "MemberCenterLocalizable", comment: "")
+        forgetButton.title = NSLocalizedString("Forget Password?", tableName: "MemberCenterLocalizable", comment: "")
+        signUpButton.title = NSLocalizedString("Sign Up", tableName: "MemberCenterLocalizable", comment: "")
+        emailErrorLabel.stringValue = String(format: "*%@", NSLocalizedString("Please enter right Address", tableName: "MemberCenterLocalizable", comment: ""))
+        passwordErrorLabel.stringValue = String(format: "*%@", NSLocalizedString("Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: ""))
+        emailTextField.placeholderString = NSLocalizedString("Please enter Email", tableName: "MemberCenterLocalizable", comment: "")
+        verifficationTextField.placeholderString = NSLocalizedString("Enter Verification code", tableName: "MemberCenterLocalizable", comment: "")
+        passwordTextField.placeholderString = NSLocalizedString("Password", tableName: "MemberCenterLocalizable", comment: "")
+    }
+    
+    private func initializeUI() -> Void {
+        emailTextField.delegate = self
+        verifficationTextField.delegate = self
+        passwordTextField.delegate = self
+        
+        signUpLabel.textColor = NSColor(named: "000000")
+        signUpLabel.font = NSFont.SFMediumFontWithSize(20)
+        selectBox1.fillColor = NSColor(named: "4982E6") ?? NSColor.blue
+        emailErrorLabel.isHidden = true
+        emailErrorLabel.textColor = NSColor(named: "FA1E5D")
+        emailErrorLabel.font = NSFont.SFProTextRegularFont(9)
+        passwordBox.borderColor = NSColor(named: "DADBDE") ?? NSColor.gray
+        verifficationBox.borderColor = NSColor(named: "FA1E5D") ?? NSColor.gray
+        sendBox.fillColor = NSColor(named: "273C62") ?? NSColor.blue
+        sendBox.borderColor = NSColor(named: "273C62") ?? NSColor.blue
+        sendLabel.textColor = NSColor(named: "FFFFFF") ?? NSColor.white
+        sendLabel.font = NSFont.SFProTextRegularFont(16)
+        passwordErrorLabel.isHidden = true
+        passwordErrorLabel.textColor = NSColor(named: "FA1E5D")
+        passwordErrorLabel.font = NSFont.SFProTextRegularFont(9)
+        stayCheckButton.image = NSImage(named: "CheckBoxNor")
+        stayLabel.textColor = NSColor(named: "0E1114") ?? NSColor.black
+        stayLabel.font = NSFont.SFProTextRegularFont(12)
+        forgetButton.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.blue, font: NSFont.SFProTextRegularFont(12))
+        signUpBox.fillColor = NSColor(named: "273C62") ?? NSColor.blue
+        signUpButton.setTitleColor(color: NSColor(named: "FFFFFF") ?? NSColor.white, font: NSFont.SFProTextRegularFont(16))
+        privacyCheckButton.image = NSImage(named: "CheckBoxNor")
+        privacyLabel.isEditable = false
+        privacyLabel.isSelectable = true
+        privacyLabel.allowsEditingTextAttributes = true
+        privacyLabel.textColor = NSColor.black
+        privacyLabel.font = NSFont.SFProTextRegularFont(16.0)
+        let tipsString = NSLocalizedString("I have read and agree to the %@ and %@, and an account will be automatically created after I log in to an unregistered email address", comment: "")
+        let specialOffer = NSLocalizedString("User Agreement", comment: "")
+        let contactsUs = NSLocalizedString("Privacy Policy", comment: "")
+        let fullString = String(format: tipsString, specialOffer, contactsUs)
+        let attributedString = NSMutableAttributedString(string: fullString)
+        // 定义链接的范围
+        let specialOfferRange = (fullString as NSString).range(of: specialOffer)
+        let contactsUsRange = (fullString as NSString).range(of: contactsUs)
+        let linkColor = NSColor(named: "4982E6") ?? NSColor.blue
+        let font = NSFont.SFProTextRegularFont(11.0) // 与普通文本相同的字体
+        attributedString.addAttributes([
+            .foregroundColor: NSColor(named: "0E1114") ?? NSColor.black as Any,
+            .font: font
+        ], range: (fullString as NSString).range(of: fullString))
+        attributedString.addAttributes([
+            .foregroundColor: linkColor,
+            .link: NSLocalizedString("https://www.pdfreaderpro.com/store?mode=edu", comment: ""),
+            .font: font
+        ], range: specialOfferRange)
+        attributedString.addAttributes([
+            .foregroundColor: linkColor,
+            .link: NSLocalizedString("https://www.pdfreaderpro.com/vpp-purchase-program", comment: ""),
+            .font: font
+        ], range: contactsUsRange)
+        privacyLabel.attributedStringValue = attributedString
+        
+        signUpStateChange()
+        visibleStateChange()
+        textfieldInputState(isEmail: true)
+        textfieldInputState(isEmail: false)
+        sendBoxRefresh()
+        
+        sendBox.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+            if self.viewModel.email.count <= 0 { return }
+            if self.viewModel.sendBoxSelect { return }
+            if mouseEntered {
+                self.sendBox.fillColor = NSColor(named: "000000_0.1") ?? NSColor.blue
+                self.sendBox.borderWidth = 1
+            } else {
+                self.sendBox.fillColor = NSColor(named: "273C62") ?? NSColor.blue
+            }
+        }
+        sendBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+            if self.viewModel.email.count <= 0 { return }
+            if self.viewModel.sendBoxSelect { return }
+            if downEntered {
+                self.sendBox.fillColor = NSColor(named: "273C62_0.4") ?? NSColor.blue
+                viewModel.countDown()
+            }
+        }
+    }
+    
+    private func signUpStateChange() -> Void {
+        if viewModel.signUpState == .verificationCode {
+            selectBox1.isHidden = false
+            selectBox2.isHidden = true
+            verificationCodeButton.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.black, font: NSFont.SFProTextRegularFont(14))
+            passwordButton.setTitleColor(color: NSColor(named: "42464D") ?? NSColor.black, font: NSFont.SFProTextRegularFont(14))
+            verifficationView.isHidden = false
+            passwordView.isHidden = true
+            passwordTextField.placeholderString = NSLocalizedString("Enter Verification code", tableName: "MemberCenterLocalizable", comment: "")
+            forgetButton.isHidden = true
+        } else if viewModel.signUpState == .password {
+            selectBox1.isHidden = true
+            selectBox2.isHidden = false
+            verificationCodeButton.setTitleColor(color: NSColor(named: "42464D") ?? NSColor.black, font: NSFont.SFProTextRegularFont(14))
+            passwordButton.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.black, font: NSFont.SFProTextRegularFont(14))
+            verifficationView.isHidden = true
+            passwordView.isHidden = false
+            passwordTextField.placeholderString = NSLocalizedString("Password", tableName: "MemberCenterLocalizable", comment: "")
+            forgetButton.isHidden = false
+        }
+    }
+    
+    private func checkStateChange(button: NSButton!, state: Bool) -> Void {
+        button.state = state ? .on : .off
+        if button.state == .on {
+            button.image = NSImage(named: "CheckBoxSel")
+        } else {
+            button.image = NSImage(named: "CheckBoxNor")
+        }
+    }
+    
+    private func visibleStateChange() -> Void {
+        if viewModel.isVisible {
+            visibleButton.image = NSImage(named: "PasswordVisible")
+        } else {
+            visibleButton.image = NSImage(named: "PasswordUnVisible")
+        }
+    }
+    
+    private func textfieldInputState(isEmail: Bool) -> Void {
+        if isEmail {
+            if viewModel.emailError {
+                emailBox.borderColor = NSColor(named: "FA1E5D") ?? NSColor.red
+            } else {
+                emailBox.borderColor = NSColor(named: "DADBDE") ?? NSColor.gray
+            }
+            emailErrorLabel.isHidden = !viewModel.emailError
+        } else {
+            if viewModel.passwordError {
+                if viewModel.signUpState == .verificationCode {
+                    passwordBox.borderWidth = 0
+                    verifficationBox.borderWidth = 1
+                } else if viewModel.signUpState == .password {
+                    passwordBox.borderWidth = 1
+                    verifficationBox.borderWidth = 0
+                }
+            } else {
+                if viewModel.signUpState == .verificationCode {
+                    passwordBox.borderWidth = 1
+                    verifficationBox.borderWidth = 0
+                } else if viewModel.signUpState == .password {
+                    passwordBox.borderWidth = 1
+                    verifficationBox.borderWidth = 0
+                }
+            }
+            passwordErrorLabel.isHidden = !viewModel.passwordError
+        }
+    }
+    
+    func sendBoxRefresh() -> Void {
+        sendLabel.stringValue = viewModel.sendContent
+        if viewModel.sendContent == NSLocalizedString("Send", tableName: "MemberCenterLocalizable", comment: "") {
+            if viewModel.email.count > 0 {
+                sendBox.fillColor = NSColor(named: "273C62") ?? NSColor.blue
+            } else {
+                sendBox.fillColor = NSColor(named: "273C62_0.4") ?? NSColor.blue
+            }
+        } else {
+            if viewModel.sendContent == NSLocalizedString("Resend", tableName: "MemberCenterLocalizable", comment: "") {
+                sendBox.fillColor = NSColor(named: "273C62") ?? NSColor.blue
+            } else {
+                sendBox.fillColor = NSColor(named: "DADBDE") ?? NSColor.gray
+            }
+        }
+    }
+    
+    // MARK: Bind Method
+    
+    func bindViewModel() -> Void {
+        viewModel.$isVisible
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.visibleStateChange()
+            }
+            .store(in: &cancellables)
+        viewModel.$stayState
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.checkStateChange(button: self?.stayCheckButton, state: newValue)
+            }
+            .store(in: &cancellables)
+        viewModel.$privacyState
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.checkStateChange(button: self?.privacyCheckButton, state: newValue)
+            }
+            .store(in: &cancellables)
+        viewModel.$signUpState
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.signUpStateChange()
+            }
+            .store(in: &cancellables)
+        viewModel.$emailError
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.textfieldInputState(isEmail: true)
+            }
+            .store(in: &cancellables)
+        viewModel.$passwordError
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.textfieldInputState(isEmail: false)
+            }
+            .store(in: &cancellables)
+        viewModel.$emailErrorMessage
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.emailErrorLabel.stringValue = newValue
+                self?.emailErrorLabel.isHidden = false
+            }
+            .store(in: &cancellables)
+        viewModel.$passwordErrorMessage
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.passwordErrorLabel.stringValue = newValue
+                self?.passwordErrorLabel.isHidden = false
+            }
+            .store(in: &cancellables)
+        viewModel.$sendContent
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.sendBoxRefresh()
+            }
+            .store(in: &cancellables)
+        viewModel.$email
+            .receive(on: RunLoop.main)
+            .sink { [weak self] newValue in
+                self?.sendBoxRefresh()
+            }
+            .store(in: &cancellables)
+    }
+        
+    // MARK: Action Method
+    
+    @IBAction func verificationCodeAction(_ sender: NSButton) {
+        viewModel.signUpStateChange(state: .verificationCode)
+    }
+    
+    @IBAction func passwordAction(_ sender: NSButton) {
+        viewModel.signUpStateChange(state: .password)
+    }
+    
+    @IBAction func visibleAction(_ sender: NSButton) {
+        viewModel.isVisible.toggle()
+    }
+    
+    @IBAction func stayCheckAction(_ sender: NSButton) {
+        viewModel.stayState.toggle()
+    }
+    
+    @IBAction func signUpAction(_ sender: NSButton) {
+        viewModel.signUpAction()
+    }
+    
+    @IBAction func forgetAction(_ sender: NSButton) {
+        
+    }
+    
+    @IBAction func privacyCheckAction(_ sender: NSButton) {
+        viewModel.privacyState.toggle()
+    }
+}
+
+extension KMSignUpView: NSTextFieldDelegate {
+    func controlTextDidEndEditing(_ obj: Notification) {
+        let textField = obj.object as? NSTextField
+        if textField == emailTextField {
+            viewModel.email = textField!.stringValue
+        } else if textField == verifficationTextField {
+            viewModel.verificationCode = textField!.stringValue
+        } else if textField == passwordTextField {
+            viewModel.password = textField!.stringValue
+        }
+    }
+    
+    func controlTextDidChange(_ obj: Notification) {
+        let textField = obj.object as? NSTextField
+        if textField == emailTextField {
+            viewModel.email = textField!.stringValue
+        } else if textField == verifficationTextField {
+            viewModel.verificationCode = textField!.stringValue
+        } else if textField == passwordTextField {
+            viewModel.password = textField!.stringValue
+        }
+    }
+}

+ 465 - 0
PDF Office/PDF Master/MemberCenter/View/KMSignUpView.xib

@@ -0,0 +1,465 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="Named colors" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMSignUpView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="emailBox" destination="44b-nP-faG" id="FFg-jd-Ryt"/>
+                <outlet property="emailErrorLabel" destination="fa7-or-CZ6" id="7T2-R9-a5H"/>
+                <outlet property="emailTextField" destination="Lob-YZ-RnN" id="pJe-6N-Rdu"/>
+                <outlet property="forgetButton" destination="88J-bh-zlh" id="8Ni-Ql-rSm"/>
+                <outlet property="loginModeBox" destination="XV5-2b-Qw8" id="yoa-l2-Z0i"/>
+                <outlet property="passwordBox" destination="Jdf-So-7eK" id="fU8-Rj-b69"/>
+                <outlet property="passwordButton" destination="hI0-Ez-r1t" id="I2i-jA-JZ8"/>
+                <outlet property="passwordErrorLabel" destination="WaO-uv-Tcx" id="3eh-3A-B3w"/>
+                <outlet property="passwordTextField" destination="GgF-lg-2Qh" id="u9W-qC-4eI"/>
+                <outlet property="passwordView" destination="ttn-3w-NPP" id="Rag-3n-Ujm"/>
+                <outlet property="privacyCheckButton" destination="ykU-at-pNt" id="OPJ-2n-NC3"/>
+                <outlet property="privacyLabel" destination="nTy-dc-ic8" id="oHu-i2-R7L"/>
+                <outlet property="selectBox1" destination="P29-Ro-E8E" id="zVo-7Q-ZMX"/>
+                <outlet property="selectBox2" destination="nVe-Zg-4Ax" id="hQF-vQ-wpn"/>
+                <outlet property="sendBox" destination="YTg-zc-9kj" id="5n6-H0-Z96"/>
+                <outlet property="sendLabel" destination="9CR-yj-hV6" id="xaT-6I-MST"/>
+                <outlet property="signUpBox" destination="Zvy-4N-s24" id="QB8-nO-MdS"/>
+                <outlet property="signUpButton" destination="lP8-at-uhr" id="x82-l4-xcU"/>
+                <outlet property="signUpLabel" destination="BPG-eq-njN" id="k4r-WI-LHj"/>
+                <outlet property="stayCheckButton" destination="vOR-7V-O8S" id="6R0-YC-dWB"/>
+                <outlet property="stayLabel" destination="mrO-6N-8Nu" id="I6s-vA-NeK"/>
+                <outlet property="verifficationBox" destination="JUe-bQ-uSN" id="fXV-jb-Moe"/>
+                <outlet property="verifficationTextField" destination="Q4E-Ah-Yxy" id="IFj-a0-qCD"/>
+                <outlet property="verifficationView" destination="YST-rI-D70" id="FHy-CA-0Yp"/>
+                <outlet property="verificationCodeButton" destination="YK0-m7-FCm" id="IZe-gZ-bc4"/>
+                <outlet property="visibleButton" destination="fQP-aK-gzm" id="mNs-6I-6gF"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="JLT-ch-KZN">
+            <rect key="frame" x="0.0" y="0.0" width="361" height="443"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="51I-wG-3bd">
+                    <rect key="frame" x="46" y="47" width="279" height="350"/>
+                    <view key="contentView" id="WvZ-Os-Yih">
+                        <rect key="frame" x="0.0" y="0.0" width="279" height="350"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="Z9i-R9-yxT">
+                                <rect key="frame" x="0.0" y="326" width="279" height="24"/>
+                                <subviews>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BPG-eq-njN">
+                                        <rect key="frame" x="-2" y="4" width="37" height="16"/>
+                                        <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="23V-cH-HsX">
+                                            <font key="font" usesAppearanceFont="YES"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                    </textField>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="24" id="1iK-Q7-Qc3"/>
+                                    <constraint firstItem="BPG-eq-njN" firstAttribute="centerY" secondItem="Z9i-R9-yxT" secondAttribute="centerY" id="UiV-0R-2XE"/>
+                                    <constraint firstItem="BPG-eq-njN" firstAttribute="leading" secondItem="Z9i-R9-yxT" secondAttribute="leading" id="hLC-EE-Cpn"/>
+                                </constraints>
+                            </customView>
+                            <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="44b-nP-faG">
+                                <rect key="frame" x="0.0" y="230" width="279" height="28"/>
+                                <view key="contentView" id="I19-Y6-bbB">
+                                    <rect key="frame" x="1" y="1" width="277" height="26"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Lob-YZ-RnN">
+                                            <rect key="frame" x="6" y="5" width="265" height="16"/>
+                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" placeholderString="11111" id="pGk-LP-wDS">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstAttribute="trailing" secondItem="Lob-YZ-RnN" secondAttribute="trailing" constant="8" id="GJJ-qy-Tg7"/>
+                                        <constraint firstItem="Lob-YZ-RnN" firstAttribute="centerY" secondItem="I19-Y6-bbB" secondAttribute="centerY" id="Jbw-Im-zPq"/>
+                                        <constraint firstItem="Lob-YZ-RnN" firstAttribute="leading" secondItem="I19-Y6-bbB" secondAttribute="leading" constant="8" id="LI7-tT-NVu"/>
+                                    </constraints>
+                                </view>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="28" id="Zug-mv-ZZs"/>
+                                </constraints>
+                            </box>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="yZS-Ga-pGH">
+                                <rect key="frame" x="0.0" y="146" width="279" height="24"/>
+                                <subviews>
+                                    <button translatesAutoresizingMaskIntoConstraints="NO" id="vOR-7V-O8S">
+                                        <rect key="frame" x="0.0" y="5" width="14" height="14"/>
+                                        <buttonCell key="cell" type="bevel" bezelStyle="rounded" image="CheckBoxNor" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="CAG-2E-GNM">
+                                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                            <font key="font" metaFont="system"/>
+                                        </buttonCell>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="14" id="d4n-hC-xlM"/>
+                                            <constraint firstAttribute="width" constant="14" id="pxT-k9-TZE"/>
+                                        </constraints>
+                                        <connections>
+                                            <action selector="stayCheckAction:" target="-2" id="gGW-QU-qau"/>
+                                        </connections>
+                                    </button>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mrO-6N-8Nu">
+                                        <rect key="frame" x="16" y="4" width="37" height="16"/>
+                                        <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="deH-Gf-v4Z">
+                                            <font key="font" metaFont="system"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                    </textField>
+                                    <button translatesAutoresizingMaskIntoConstraints="NO" id="88J-bh-zlh">
+                                        <rect key="frame" x="234" y="4" width="45" height="16"/>
+                                        <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="3dl-zm-3mP">
+                                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                            <font key="font" metaFont="system"/>
+                                        </buttonCell>
+                                        <connections>
+                                            <action selector="forgetAction:" target="-2" id="vO0-6L-xk2"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="mrO-6N-8Nu" firstAttribute="leading" secondItem="vOR-7V-O8S" secondAttribute="trailing" constant="4" id="55Z-hm-Dka"/>
+                                    <constraint firstItem="vOR-7V-O8S" firstAttribute="centerY" secondItem="yZS-Ga-pGH" secondAttribute="centerY" id="5EG-kA-2l8"/>
+                                    <constraint firstItem="mrO-6N-8Nu" firstAttribute="centerY" secondItem="yZS-Ga-pGH" secondAttribute="centerY" id="PF6-Lv-ukk"/>
+                                    <constraint firstAttribute="height" constant="24" id="chD-C7-JnG"/>
+                                    <constraint firstAttribute="trailing" secondItem="88J-bh-zlh" secondAttribute="trailing" id="h8h-9C-zOH"/>
+                                    <constraint firstItem="88J-bh-zlh" firstAttribute="centerY" secondItem="yZS-Ga-pGH" secondAttribute="centerY" id="oFY-fI-gZz"/>
+                                    <constraint firstItem="vOR-7V-O8S" firstAttribute="leading" secondItem="yZS-Ga-pGH" secondAttribute="leading" id="rAs-gz-P90"/>
+                                </constraints>
+                            </customView>
+                            <box boxType="custom" borderWidth="0.0" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Zvy-4N-s24">
+                                <rect key="frame" x="0.0" y="94" width="279" height="32"/>
+                                <view key="contentView" id="m27-RS-jQR">
+                                    <rect key="frame" x="0.0" y="0.0" width="279" height="32"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <button translatesAutoresizingMaskIntoConstraints="NO" id="lP8-at-uhr">
+                                            <rect key="frame" x="0.0" y="0.0" width="279" height="32"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="QaA-05-5Ij">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="signUpAction:" target="-2" id="dR5-kF-f7h"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstItem="lP8-at-uhr" firstAttribute="leading" secondItem="m27-RS-jQR" secondAttribute="leading" id="9qR-FW-pDh"/>
+                                        <constraint firstItem="lP8-at-uhr" firstAttribute="top" secondItem="m27-RS-jQR" secondAttribute="top" id="IAl-74-wuU"/>
+                                        <constraint firstAttribute="trailing" secondItem="lP8-at-uhr" secondAttribute="trailing" id="OtM-3Z-dId"/>
+                                        <constraint firstAttribute="bottom" secondItem="lP8-at-uhr" secondAttribute="bottom" id="v0A-0M-BQL"/>
+                                    </constraints>
+                                </view>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="32" id="o9F-qs-GHs"/>
+                                </constraints>
+                            </box>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="Uda-x2-PoM">
+                                <rect key="frame" x="0.0" y="0.0" width="279" height="74"/>
+                                <subviews>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nTy-dc-ic8">
+                                        <rect key="frame" x="16" y="58" width="265" height="16"/>
+                                        <textFieldCell key="cell" title="Label" id="eQy-xd-X9I">
+                                            <font key="font" metaFont="system"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                    </textField>
+                                    <button translatesAutoresizingMaskIntoConstraints="NO" id="ykU-at-pNt">
+                                        <rect key="frame" x="0.0" y="60" width="14" height="14"/>
+                                        <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" image="CheckBoxNor" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="Fbb-PS-RV9">
+                                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                            <font key="font" metaFont="system"/>
+                                        </buttonCell>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="14" id="LkC-nm-XEa"/>
+                                            <constraint firstAttribute="width" constant="14" id="TbV-tv-PKB"/>
+                                        </constraints>
+                                        <connections>
+                                            <action selector="privacyCheckAction:" target="-2" id="gMc-Mf-Azw"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="nTy-dc-ic8" firstAttribute="top" secondItem="Uda-x2-PoM" secondAttribute="top" id="35P-C9-Zwh"/>
+                                    <constraint firstItem="ykU-at-pNt" firstAttribute="leading" secondItem="Uda-x2-PoM" secondAttribute="leading" id="AaN-bb-gh5"/>
+                                    <constraint firstItem="ykU-at-pNt" firstAttribute="top" secondItem="Uda-x2-PoM" secondAttribute="top" id="sMy-VY-WVe"/>
+                                    <constraint firstItem="nTy-dc-ic8" firstAttribute="leading" secondItem="ykU-at-pNt" secondAttribute="trailing" constant="4" id="ttj-Ay-FPr"/>
+                                    <constraint firstAttribute="trailing" secondItem="nTy-dc-ic8" secondAttribute="trailing" id="xbp-C8-Z3J"/>
+                                </constraints>
+                            </customView>
+                            <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="XV5-2b-Qw8">
+                                <rect key="frame" x="0.0" y="278" width="279" height="28"/>
+                                <view key="contentView" id="u2J-Do-dLL">
+                                    <rect key="frame" x="0.0" y="0.0" width="279" height="28"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <button translatesAutoresizingMaskIntoConstraints="NO" id="YK0-m7-FCm">
+                                            <rect key="frame" x="0.0" y="0.0" width="140" height="28"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="TR5-7V-IZH">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="verificationCodeAction:" target="-2" id="WkF-Tc-Sxd"/>
+                                            </connections>
+                                        </button>
+                                        <button translatesAutoresizingMaskIntoConstraints="NO" id="hI0-Ez-r1t">
+                                            <rect key="frame" x="140" y="0.0" width="139" height="28"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="3Nj-KL-9F9">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="passwordAction:" target="-2" id="A7x-sa-JI9"/>
+                                            </connections>
+                                        </button>
+                                        <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="P29-Ro-E8E">
+                                            <rect key="frame" x="0.0" y="0.0" width="140" height="2"/>
+                                            <view key="contentView" id="N8P-aS-fKp">
+                                                <rect key="frame" x="0.0" y="0.0" width="140" height="2"/>
+                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            </view>
+                                            <constraints>
+                                                <constraint firstAttribute="height" constant="2" id="xfb-7i-bKA"/>
+                                            </constraints>
+                                            <color key="borderColor" name="AccentColor"/>
+                                            <color key="fillColor" name="AccentColor"/>
+                                        </box>
+                                        <box hidden="YES" boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="nVe-Zg-4Ax">
+                                            <rect key="frame" x="140" y="0.0" width="139" height="2"/>
+                                            <view key="contentView" id="NGq-y3-VdV">
+                                                <rect key="frame" x="0.0" y="0.0" width="139" height="2"/>
+                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            </view>
+                                            <constraints>
+                                                <constraint firstAttribute="height" constant="2" id="C5b-hl-ecd"/>
+                                            </constraints>
+                                            <color key="borderColor" name="AccentColor"/>
+                                            <color key="fillColor" name="AccentColor"/>
+                                        </box>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="trailing" secondItem="nVe-Zg-4Ax" secondAttribute="trailing" id="5sv-tp-iSZ"/>
+                                        <constraint firstItem="P29-Ro-E8E" firstAttribute="leading" secondItem="YK0-m7-FCm" secondAttribute="leading" id="6r5-dG-sOa"/>
+                                        <constraint firstItem="YK0-m7-FCm" firstAttribute="leading" secondItem="u2J-Do-dLL" secondAttribute="leading" id="7Q5-8z-zXs"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="height" secondItem="YK0-m7-FCm" secondAttribute="height" id="7ur-GB-xcz"/>
+                                        <constraint firstAttribute="bottom" secondItem="YK0-m7-FCm" secondAttribute="bottom" id="C2l-XH-raV"/>
+                                        <constraint firstAttribute="bottom" secondItem="hI0-Ez-r1t" secondAttribute="bottom" id="DZR-eJ-kdw"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="top" secondItem="u2J-Do-dLL" secondAttribute="top" id="EnT-bI-BQK"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="width" secondItem="YK0-m7-FCm" secondAttribute="width" id="Ftz-cY-RPw"/>
+                                        <constraint firstItem="P29-Ro-E8E" firstAttribute="trailing" secondItem="YK0-m7-FCm" secondAttribute="trailing" id="Ieu-RZ-cHy"/>
+                                        <constraint firstAttribute="trailing" secondItem="hI0-Ez-r1t" secondAttribute="trailing" id="IhF-CX-Egi"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="leading" secondItem="nVe-Zg-4Ax" secondAttribute="leading" id="KW1-hB-IKX"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="bottom" secondItem="nVe-Zg-4Ax" secondAttribute="bottom" id="QAU-Mv-FLz"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="leading" secondItem="YK0-m7-FCm" secondAttribute="trailing" id="ed8-0x-k13"/>
+                                        <constraint firstItem="P29-Ro-E8E" firstAttribute="bottom" secondItem="YK0-m7-FCm" secondAttribute="bottom" id="fyS-Dy-xyo"/>
+                                        <constraint firstItem="hI0-Ez-r1t" firstAttribute="leading" secondItem="YK0-m7-FCm" secondAttribute="trailing" id="igR-QQ-r2N"/>
+                                        <constraint firstItem="YK0-m7-FCm" firstAttribute="top" secondItem="u2J-Do-dLL" secondAttribute="top" id="pFA-rm-YpJ"/>
+                                    </constraints>
+                                </view>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="28" id="caI-tY-Aot"/>
+                                </constraints>
+                            </box>
+                            <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Jdf-So-7eK">
+                                <rect key="frame" x="0.0" y="186" width="279" height="28"/>
+                                <view key="contentView" id="hWz-GX-iSg">
+                                    <rect key="frame" x="1" y="1" width="277" height="26"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="YST-rI-D70">
+                                            <rect key="frame" x="0.0" y="0.0" width="277" height="26"/>
+                                            <subviews>
+                                                <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="JUe-bQ-uSN">
+                                                    <rect key="frame" x="0.0" y="0.0" width="229" height="26"/>
+                                                    <view key="contentView" id="LsV-oy-6JL">
+                                                        <rect key="frame" x="1" y="1" width="227" height="24"/>
+                                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                        <subviews>
+                                                            <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Q4E-Ah-Yxy">
+                                                                <rect key="frame" x="6" y="4" width="215" height="16"/>
+                                                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" id="7p1-b6-AOB">
+                                                                    <font key="font" usesAppearanceFont="YES"/>
+                                                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                                </textFieldCell>
+                                                            </textField>
+                                                        </subviews>
+                                                        <constraints>
+                                                            <constraint firstItem="Q4E-Ah-Yxy" firstAttribute="leading" secondItem="LsV-oy-6JL" secondAttribute="leading" constant="8" id="2D9-8G-YYZ"/>
+                                                            <constraint firstAttribute="trailing" secondItem="Q4E-Ah-Yxy" secondAttribute="trailing" constant="8" id="iEr-Qs-rGx"/>
+                                                        </constraints>
+                                                    </view>
+                                                    <constraints>
+                                                        <constraint firstItem="Q4E-Ah-Yxy" firstAttribute="centerY" secondItem="JUe-bQ-uSN" secondAttribute="centerY" id="2IK-Rc-eUW"/>
+                                                    </constraints>
+                                                </box>
+                                                <box boxType="custom" borderWidth="0.0" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="YTg-zc-9kj" customClass="KMBox" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                                    <rect key="frame" x="229" y="0.0" width="48" height="26"/>
+                                                    <view key="contentView" id="zmY-cn-OGB">
+                                                        <rect key="frame" x="0.0" y="0.0" width="48" height="26"/>
+                                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                        <subviews>
+                                                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9CR-yj-hV6">
+                                                                <rect key="frame" x="-2" y="5" width="52" height="16"/>
+                                                                <textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Label" id="fPD-Vb-cyJ">
+                                                                    <font key="font" usesAppearanceFont="YES"/>
+                                                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                                </textFieldCell>
+                                                            </textField>
+                                                        </subviews>
+                                                        <constraints>
+                                                            <constraint firstItem="9CR-yj-hV6" firstAttribute="leading" secondItem="zmY-cn-OGB" secondAttribute="leading" id="cG0-dq-Jvg"/>
+                                                            <constraint firstAttribute="trailing" secondItem="9CR-yj-hV6" secondAttribute="trailing" id="fre-d6-d3d"/>
+                                                        </constraints>
+                                                    </view>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="48" id="2sv-YT-ZUH"/>
+                                                        <constraint firstItem="9CR-yj-hV6" firstAttribute="centerY" secondItem="YTg-zc-9kj" secondAttribute="centerY" id="em6-C3-SO0"/>
+                                                    </constraints>
+                                                </box>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstItem="JUe-bQ-uSN" firstAttribute="leading" secondItem="YST-rI-D70" secondAttribute="leading" id="0uc-OD-tgv"/>
+                                                <constraint firstItem="JUe-bQ-uSN" firstAttribute="top" secondItem="YST-rI-D70" secondAttribute="top" id="FFV-29-QkK"/>
+                                                <constraint firstAttribute="bottom" secondItem="YTg-zc-9kj" secondAttribute="bottom" id="GhS-hY-AqX"/>
+                                                <constraint firstItem="YTg-zc-9kj" firstAttribute="top" secondItem="YST-rI-D70" secondAttribute="top" id="NTj-ZZ-hiT"/>
+                                                <constraint firstItem="YTg-zc-9kj" firstAttribute="leading" secondItem="JUe-bQ-uSN" secondAttribute="trailing" id="W5j-3g-X0X"/>
+                                                <constraint firstAttribute="bottom" secondItem="JUe-bQ-uSN" secondAttribute="bottom" id="bdG-bM-DZZ"/>
+                                                <constraint firstAttribute="trailing" secondItem="YTg-zc-9kj" secondAttribute="trailing" id="hj5-tu-76Y"/>
+                                            </constraints>
+                                        </customView>
+                                        <customView hidden="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ttn-3w-NPP">
+                                            <rect key="frame" x="0.0" y="0.0" width="277" height="26"/>
+                                            <subviews>
+                                                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="GgF-lg-2Qh">
+                                                    <rect key="frame" x="6" y="5" width="247" height="16"/>
+                                                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" id="GAi-ha-pFG">
+                                                        <font key="font" usesAppearanceFont="YES"/>
+                                                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                    </textFieldCell>
+                                                </textField>
+                                                <button translatesAutoresizingMaskIntoConstraints="NO" id="fQP-aK-gzm">
+                                                    <rect key="frame" x="255" y="5" width="16" height="16"/>
+                                                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="s3G-l0-u3S">
+                                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                        <font key="font" metaFont="system"/>
+                                                    </buttonCell>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="16" id="i2t-qe-EJc"/>
+                                                        <constraint firstAttribute="height" constant="16" id="zmb-lz-F0N"/>
+                                                    </constraints>
+                                                    <connections>
+                                                        <action selector="visibleAction:" target="-2" id="iY0-5T-BlO"/>
+                                                    </connections>
+                                                </button>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstItem="GgF-lg-2Qh" firstAttribute="centerY" secondItem="ttn-3w-NPP" secondAttribute="centerY" id="3gb-p9-Bqy"/>
+                                                <constraint firstItem="fQP-aK-gzm" firstAttribute="leading" secondItem="GgF-lg-2Qh" secondAttribute="trailing" constant="4" id="J3B-3x-sHF"/>
+                                                <constraint firstItem="GgF-lg-2Qh" firstAttribute="leading" secondItem="ttn-3w-NPP" secondAttribute="leading" constant="8" id="ZH7-VU-G5L"/>
+                                                <constraint firstAttribute="trailing" secondItem="fQP-aK-gzm" secondAttribute="trailing" constant="6" id="fdS-R0-PTv"/>
+                                                <constraint firstItem="fQP-aK-gzm" firstAttribute="centerY" secondItem="ttn-3w-NPP" secondAttribute="centerY" id="tww-2G-77N"/>
+                                            </constraints>
+                                        </customView>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstAttribute="trailing" secondItem="YST-rI-D70" secondAttribute="trailing" id="Kjf-NP-y7p"/>
+                                        <constraint firstAttribute="trailing" secondItem="ttn-3w-NPP" secondAttribute="trailing" id="TuN-wX-fgV"/>
+                                        <constraint firstAttribute="bottom" secondItem="YST-rI-D70" secondAttribute="bottom" id="Vjk-7I-ys6"/>
+                                        <constraint firstItem="YST-rI-D70" firstAttribute="top" secondItem="hWz-GX-iSg" secondAttribute="top" id="daD-A2-sgW"/>
+                                        <constraint firstAttribute="bottom" secondItem="ttn-3w-NPP" secondAttribute="bottom" id="hVm-nA-P9e"/>
+                                        <constraint firstItem="YST-rI-D70" firstAttribute="leading" secondItem="hWz-GX-iSg" secondAttribute="leading" id="stU-CA-u3W"/>
+                                        <constraint firstItem="ttn-3w-NPP" firstAttribute="leading" secondItem="hWz-GX-iSg" secondAttribute="leading" id="vpp-GU-F61"/>
+                                        <constraint firstItem="ttn-3w-NPP" firstAttribute="top" secondItem="hWz-GX-iSg" secondAttribute="top" id="vxE-Zz-WFu"/>
+                                    </constraints>
+                                </view>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="28" id="tfq-Bb-vHg"/>
+                                </constraints>
+                            </box>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fa7-or-CZ6">
+                                <rect key="frame" x="-2" y="214" width="283" height="16"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="AU7-am-n4v">
+                                    <font key="font" usesAppearanceFont="YES"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WaO-uv-Tcx">
+                                <rect key="frame" x="-2" y="170" width="283" height="16"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="tnz-ZO-Lot">
+                                    <font key="font" metaFont="system"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="trailing" secondItem="Uda-x2-PoM" secondAttribute="trailing" id="0Cs-g2-tL5"/>
+                            <constraint firstAttribute="trailing" secondItem="Z9i-R9-yxT" secondAttribute="trailing" id="1Ja-34-jRd"/>
+                            <constraint firstItem="fa7-or-CZ6" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="4qf-cN-7Wz"/>
+                            <constraint firstItem="XV5-2b-Qw8" firstAttribute="top" secondItem="Z9i-R9-yxT" secondAttribute="bottom" constant="20" id="7Ee-6d-uup"/>
+                            <constraint firstItem="Uda-x2-PoM" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="7eK-AX-Lp4"/>
+                            <constraint firstItem="fa7-or-CZ6" firstAttribute="top" secondItem="44b-nP-faG" secondAttribute="bottom" id="Gcv-el-LnT"/>
+                            <constraint firstAttribute="trailing" secondItem="44b-nP-faG" secondAttribute="trailing" id="JaX-E0-TgB"/>
+                            <constraint firstItem="WaO-uv-Tcx" firstAttribute="top" secondItem="Jdf-So-7eK" secondAttribute="bottom" id="SyI-et-twW"/>
+                            <constraint firstItem="XV5-2b-Qw8" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="VlQ-jA-mbV"/>
+                            <constraint firstAttribute="trailing" secondItem="Zvy-4N-s24" secondAttribute="trailing" id="WUR-zP-PxW"/>
+                            <constraint firstAttribute="trailing" secondItem="XV5-2b-Qw8" secondAttribute="trailing" id="YJK-ZK-9kL"/>
+                            <constraint firstItem="yZS-Ga-pGH" firstAttribute="top" secondItem="Jdf-So-7eK" secondAttribute="bottom" constant="16" id="a9V-RH-pd3"/>
+                            <constraint firstItem="Jdf-So-7eK" firstAttribute="top" secondItem="44b-nP-faG" secondAttribute="bottom" constant="16" id="c5g-7n-wKS"/>
+                            <constraint firstAttribute="trailing" secondItem="WaO-uv-Tcx" secondAttribute="trailing" id="cgH-gj-VtL"/>
+                            <constraint firstAttribute="trailing" secondItem="yZS-Ga-pGH" secondAttribute="trailing" id="clt-hv-xYh"/>
+                            <constraint firstItem="Uda-x2-PoM" firstAttribute="top" secondItem="Zvy-4N-s24" secondAttribute="bottom" constant="20" id="eiD-5U-xAN"/>
+                            <constraint firstItem="44b-nP-faG" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="gp2-i4-w2l"/>
+                            <constraint firstItem="Jdf-So-7eK" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="hFH-p7-lzC"/>
+                            <constraint firstAttribute="bottom" secondItem="Uda-x2-PoM" secondAttribute="bottom" id="hb7-oc-ubi"/>
+                            <constraint firstItem="yZS-Ga-pGH" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="iPX-cE-sYA"/>
+                            <constraint firstItem="WaO-uv-Tcx" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="iPe-Zd-KUG"/>
+                            <constraint firstAttribute="trailing" secondItem="Jdf-So-7eK" secondAttribute="trailing" id="kzU-dN-d88"/>
+                            <constraint firstItem="Z9i-R9-yxT" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="mSy-Fs-nw5"/>
+                            <constraint firstItem="Zvy-4N-s24" firstAttribute="leading" secondItem="WvZ-Os-Yih" secondAttribute="leading" id="pan-z0-exL"/>
+                            <constraint firstItem="Z9i-R9-yxT" firstAttribute="top" secondItem="WvZ-Os-Yih" secondAttribute="top" id="rHx-6g-Bk7"/>
+                            <constraint firstItem="Zvy-4N-s24" firstAttribute="top" secondItem="yZS-Ga-pGH" secondAttribute="bottom" constant="20" id="tUO-Ja-byf"/>
+                            <constraint firstAttribute="trailing" secondItem="fa7-or-CZ6" secondAttribute="trailing" id="uoQ-gg-xkK"/>
+                            <constraint firstItem="44b-nP-faG" firstAttribute="top" secondItem="XV5-2b-Qw8" secondAttribute="bottom" constant="20" id="yPl-mp-07L"/>
+                        </constraints>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="279" id="jU5-z3-N5r"/>
+                        <constraint firstAttribute="height" constant="350" id="yqc-cy-SPD"/>
+                    </constraints>
+                </box>
+            </subviews>
+            <constraints>
+                <constraint firstItem="51I-wG-3bd" firstAttribute="leading" secondItem="JLT-ch-KZN" secondAttribute="leading" constant="46" id="SMc-wc-qAk"/>
+                <constraint firstItem="51I-wG-3bd" firstAttribute="top" secondItem="JLT-ch-KZN" secondAttribute="top" constant="46" id="XRd-jc-QZa"/>
+                <constraint firstAttribute="bottom" secondItem="51I-wG-3bd" secondAttribute="bottom" constant="47" id="Zfv-c5-vM0"/>
+                <constraint firstAttribute="trailing" secondItem="51I-wG-3bd" secondAttribute="trailing" constant="36" id="oLo-hC-piS"/>
+            </constraints>
+            <point key="canvasLocation" x="-57.5" y="114.5"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="CheckBoxNor" width="14" height="14"/>
+        <namedColor name="AccentColor">
+            <color red="0.0" green="0.46000000000000002" blue="0.89000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </namedColor>
+    </resources>
+</document>

+ 224 - 0
PDF Office/PDF Master/MemberCenter/ViewModel/KMSignUpViewModel.swift

@@ -0,0 +1,224 @@
+//
+//  KMSignUpViewModel.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/10/24.
+//
+
+import Foundation
+import Combine
+
+@objc enum KMSignUpState : Int {
+    case verificationCode = 0   // 验证码
+    case password               // 密码
+}
+
+//// Email错误提示样式
+//@objc enum KMEmailErrorMessageType : Int {
+//    case existingAccount = 0   // 输入邮箱错误 - 已有账号
+//    case formattingError // 输入邮箱错误 - 邮箱格式错误
+//}
+//
+//// 验证码 & 密码 错误提示样式
+//@objc enum KMPasswordErrorMessageType : Int {
+//    case characterLack = 0 // 输入密码错误 - 密码字符不够
+//    case characterOverlong // 输入密码错误 - 密码字符过长
+//    case verificationError // 二次确认密码错误
+//}
+
+class KMSignUpViewModel: ObservableObject {
+    /**
+     是否可视,默认不可视
+     */
+    @Published var isVisible: Bool = false
+    /**
+     是否保持登录,默认不保持登录
+     */
+    @Published var stayState: Bool = false
+    /**
+     是否同意隐私权限
+     */
+    @Published var privacyState: Bool = false
+    /**
+     登录界面是验证码验证还是邮箱验证
+     */
+    @Published var signUpState: KMSignUpState = .verificationCode
+    /**
+     用户邮箱,字符串格式,默认为空
+     */
+    @Published var email: String = ""
+    /**
+     用户邮箱登录的验证码,字符串格式,默认为空
+     */
+    @Published var verificationCode: String = ""
+    /**
+     用户邮箱登录的密码,字符串格式,默认为空
+     */
+    @Published var password: String = ""
+    /**
+     邮箱格式错误
+     */
+    @Published var emailError: Bool = false
+    /**
+     验证码 / 密码 格式错误
+     */
+    @Published var passwordError: Bool = false
+    /**
+     邮件 错误提示文案
+     */
+    @Published var emailErrorMessage: String = ""
+    /**
+     验证码 / 密码 错误提示文案
+     */
+    @Published var passwordErrorMessage: String = ""
+    /**
+     序列码按钮 文案
+     */
+    @Published var sendContent: String = NSLocalizedString("Send", tableName: "MemberCenterLocalizable", comment: "")
+
+    @Published private var timer: AnyCancellable?
+    private var remainingSeconds: Int = 60
+    
+    var sendBoxSelect: Bool = false
+
+    // MARK: Public Method
+    
+    func signUpStateChange(state: KMSignUpState) -> Void {
+        if state == signUpState {
+            return
+        }
+        if signUpState == .verificationCode {
+            signUpState = .password
+        } else {
+            signUpState = .verificationCode
+        }
+    }
+    
+//    func getEmailErrorMessage() -> Void {
+//        
+//        switch emailErrorMessageType {
+//        case .existingAccount:
+//            emailErrorMessage = NSLocalizedString("This account is registered", tableName: "MemberCenterLocalizable", comment: "")
+//            break
+//        case .emailFormattingError:
+//            emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "")
+//            break
+//        case .passwordCharacterLack:
+//            errorMessage = NSLocalizedString("At least 6 characters", tableName: "MemberCenterLocalizable", comment: "")
+//            break
+//        case .passwordCharacterOverlong:
+//            errorMessage = NSLocalizedString("Up to 24 characters", tableName: "MemberCenterLocalizable", comment: "")
+//            break
+//        case .secondaryVerificationError:
+//            errorMessage = NSLocalizedString("*Password inconsistency", tableName: "MemberCenterLocalizable", comment: "")
+//            break
+//        default:
+//            
+//            break
+//        }
+//    }
+    
+    func countDown(count: Int = 60) -> Void {
+        getVerificationCode()
+        if emailErrorMessage.count <= 0 {
+            return
+        }
+        
+        sendBoxSelect = true
+        remainingSeconds = count
+        timer = Timer.publish(every: 1, on: .main, in: .common)
+            .autoconnect()
+            .sink { [weak self] _ in
+                guard let self = self else { return }
+                if self.remainingSeconds > 0 {
+                    self.remainingSeconds -= 1
+                    self.sendContent = String(format: "%d", self.remainingSeconds)
+                } else {
+                    // 倒计时结束,停止定时器
+                    self.timer?.cancel()
+                    self.sendContent = NSLocalizedString("Resend", tableName: "MemberCenterLocalizable", comment: "")
+                    sendBoxSelect = false
+                }
+            }
+    }
+    
+    // MARK: Public Method
+    
+    /**
+     @abstract 验证邮箱是否合规
+     */
+    private func isValidEmail() -> Bool {
+        let emailRegex = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"
+        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
+        return emailTest.evaluate(with: email)
+    }
+    
+    // MARK: Private Method
+    
+    private func getVerificationCode() -> Void {
+        if !isValidEmail() {
+            emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "")
+            return
+        }
+        KMMemberCenterManager.manager.getVerificationCode(action: .login, receiver: email) { [weak self] error, wrapper  in
+            guard let self = self else { return }
+            let resultDict = wrapper! as KMMemberCenterResult
+            let msg = resultDict.msg
+            let result: Bool = resultDict.result ?? false
+            if error {
+                if !result {
+                    self.emailErrorMessage = NSLocalizedString("*Please enter right Address", tableName: "MemberCenterLocalizable", comment: "")
+                    print("错误信息:%@", msg as Any)
+                }
+            } else {
+                if !result {
+                    self.emailErrorMessage = NSLocalizedString("*Please enter right Address", tableName: "MemberCenterLocalizable", comment: "")
+                } else {
+                    print("验证邮箱成功")
+                }
+            }
+        }
+    }
+    
+    // MARK: Action Method
+    
+    /**
+     @abstract 登录按钮响应事件
+     @param
+     */
+    func signUpAction() -> Void {
+        if email.count <= 0 {
+            emailError = true
+            return
+        }
+        if verificationCode.count <= 0 {
+            passwordError = true
+            return
+        }
+        if password.count <= 0 {
+            passwordError = true
+            return
+        }
+        
+        var code = password
+        if signUpState == .verificationCode {
+            code = verificationCode
+        }
+        KMMemberCenterManager.manager.emailLogin(email: email, code: code) { [weak self] error, wrapper  in
+            guard let self = self else { return }
+            let resultDict = wrapper! as KMMemberCenterResult
+            let msg = resultDict.msg
+            if error {
+                print("错误信息:%@", msg as Any)
+            } else {
+                let result: KMMemberLoginResult = resultDict.login_Result!
+                let refresh_token = result.refreshToken
+                let access_token = result.accessToken
+                let token_type = result.tokenType
+                let expires_in = result.expiresIn
+                let scope = result.scope
+
+            }
+        }
+    }
+}

+ 21 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.swift

@@ -6,6 +6,7 @@
 //
 
 import Cocoa
+import SwiftUI
 
 class KMLoginWindowsController: NSWindowController {
     
@@ -13,11 +14,31 @@ class KMLoginWindowsController: NSWindowController {
     @IBOutlet weak var leftImageView: NSImageView!
     
     @IBOutlet weak var rightBox: NSBox!
+    
+    var memberInfo: KMMemberInfo = KMMemberInfo.defaultManager
 
     override func windowDidLoad() {
         super.windowDidLoad()
 
         // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
+        window?.styleMask.insert([.titled, .closable, .miniaturizable, .fullSizeContentView])
+        window?.titleVisibility = .visible
+        
+        initializeUI()
+    }
+    
+    // MARK: Private Action
+    
+    private func initializeUI() -> Void {
+        if memberInfo.isLogin {
+            
+        } else {
+            leftImageView.image = NSImage(named: "WelcomePDFReaderPro1")
+            
+            let signUpView = KMSignUpView()
+            signUpView.frame = rightBox.frame
+            rightBox.contentView = signUpView
+        }
     }
     
 }

+ 7 - 5
PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.xib

@@ -21,18 +21,20 @@
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="196" y="240" width="661" height="443"/>
             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <value key="minSize" type="size" width="661" height="443"/>
+            <value key="maxSize" type="size" width="661" height="443"/>
             <view key="contentView" id="se5-gp-TjO">
                 <rect key="frame" x="0.0" y="0.0" width="661" height="443"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
-                    <box boxType="custom" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="YDG-OZ-oQi">
+                    <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="YDG-OZ-oQi">
                         <rect key="frame" x="0.0" y="0.0" width="300" height="443"/>
                         <view key="contentView" id="jLg-6t-1HG">
-                            <rect key="frame" x="1" y="1" width="298" height="441"/>
+                            <rect key="frame" x="0.0" y="0.0" width="300" height="443"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                             <subviews>
                                 <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Vcr-VH-8V2">
-                                    <rect key="frame" x="0.0" y="0.0" width="298" height="441"/>
+                                    <rect key="frame" x="0.0" y="0.0" width="300" height="443"/>
                                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="IaG-H6-8fu"/>
                                 </imageView>
                             </subviews>
@@ -47,10 +49,10 @@
                             <constraint firstAttribute="width" constant="300" id="gk9-9U-WMj"/>
                         </constraints>
                     </box>
-                    <box boxType="custom" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="L5U-6O-P63">
+                    <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="L5U-6O-P63">
                         <rect key="frame" x="300" y="0.0" width="361" height="443"/>
                         <view key="contentView" id="rUc-R1-ocT">
-                            <rect key="frame" x="1" y="1" width="359" height="441"/>
+                            <rect key="frame" x="0.0" y="0.0" width="361" height="443"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         </view>
                     </box>

+ 58 - 2
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -797,6 +797,9 @@
 		9F4ACED12CC79D0B005CF727 /* MemberCenter.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9F4ACED02CC79D0B005CF727 /* MemberCenter.xcassets */; };
 		9F4ACED22CC79D0B005CF727 /* MemberCenter.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9F4ACED02CC79D0B005CF727 /* MemberCenter.xcassets */; };
 		9F4ACED32CC79D0B005CF727 /* MemberCenter.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9F4ACED02CC79D0B005CF727 /* MemberCenter.xcassets */; };
+		9F4ACED62CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */; };
+		9F4ACED72CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */; };
+		9F4ACED82CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */; };
 		9F512CC72B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F512CC52B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift */; };
 		9F512CC82B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F512CC52B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift */; };
 		9F512CC92B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F512CC52B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift */; };
@@ -836,6 +839,12 @@
 		9F5752EC2B58FF73005DC303 /* KMAnnotationFromViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F5752E82B58FF73005DC303 /* KMAnnotationFromViewController.xib */; };
 		9F5752ED2B58FF73005DC303 /* KMAnnotationFromViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F5752E82B58FF73005DC303 /* KMAnnotationFromViewController.xib */; };
 		9F5752EE2B58FF73005DC303 /* KMAnnotationFromViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F5752E82B58FF73005DC303 /* KMAnnotationFromViewController.xib */; };
+		9F58E8852CC8CC14002457F1 /* KMSignUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F58E8842CC8CC14002457F1 /* KMSignUpView.swift */; };
+		9F58E8862CC8CC14002457F1 /* KMSignUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F58E8842CC8CC14002457F1 /* KMSignUpView.swift */; };
+		9F58E8872CC8CC14002457F1 /* KMSignUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F58E8842CC8CC14002457F1 /* KMSignUpView.swift */; };
+		9F58E8892CC8CD07002457F1 /* KMSignUpView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F58E8882CC8CD07002457F1 /* KMSignUpView.xib */; };
+		9F58E88A2CC8CD07002457F1 /* KMSignUpView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F58E8882CC8CD07002457F1 /* KMSignUpView.xib */; };
+		9F58E88B2CC8CD07002457F1 /* KMSignUpView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F58E8882CC8CD07002457F1 /* KMSignUpView.xib */; };
 		9F69DBB22B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69DBB02B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift */; };
 		9F69DBB32B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69DBB02B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift */; };
 		9F69DBB42B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69DBB02B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift */; };
@@ -975,6 +984,9 @@
 		9F8DDF342924DA6B006CDC73 /* KMPDFToolsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8DDF332924DA6B006CDC73 /* KMPDFToolsCollectionView.swift */; };
 		9F8DDF352924DA6B006CDC73 /* KMPDFToolsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8DDF332924DA6B006CDC73 /* KMPDFToolsCollectionView.swift */; };
 		9F8DDF362924DA6B006CDC73 /* KMPDFToolsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8DDF332924DA6B006CDC73 /* KMPDFToolsCollectionView.swift */; };
+		9F9085CF2CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */; };
+		9F9085D02CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */; };
+		9F9085D12CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */; };
 		9F94617D2BD643720076574B /* KMTableAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F94617B2BD643720076574B /* KMTableAnnotation.m */; };
 		9F94617E2BD643720076574B /* KMTableAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F94617B2BD643720076574B /* KMTableAnnotation.m */; };
 		9F94617F2BD643720076574B /* KMTableAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F94617B2BD643720076574B /* KMTableAnnotation.m */; };
@@ -1104,6 +1116,9 @@
 		9FBC48BF299E23B100CA39D7 /* NSViewController+DesignToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBC48BE299E23B100CA39D7 /* NSViewController+DesignToken.swift */; };
 		9FBC48C0299E23B100CA39D7 /* NSViewController+DesignToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBC48BE299E23B100CA39D7 /* NSViewController+DesignToken.swift */; };
 		9FBC48C1299E23B100CA39D7 /* NSViewController+DesignToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBC48BE299E23B100CA39D7 /* NSViewController+DesignToken.swift */; };
+		9FBD84342CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */; };
+		9FBD84352CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */; };
+		9FBD84362CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */; };
 		9FC444FA2AA61EDE00D7187C /* ZipArchive.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC444F82AA5F7D600D7187C /* ZipArchive.framework */; };
 		9FC444FB2AA61EDE00D7187C /* ZipArchive.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC444F82AA5F7D600D7187C /* ZipArchive.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		9FCFEC682AC2EAD500EAD2CB /* CPDFListViewColorMenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCFEC672AC2EAD500EAD2CB /* CPDFListViewColorMenuItemView.swift */; };
@@ -5988,6 +6003,7 @@
 		9F4ACEC82CC79270005CF727 /* KMLoginWindowsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLoginWindowsController.swift; sourceTree = "<group>"; };
 		9F4ACEC92CC79270005CF727 /* KMLoginWindowsController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLoginWindowsController.xib; sourceTree = "<group>"; };
 		9F4ACED02CC79D0B005CF727 /* MemberCenter.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = MemberCenter.xcassets; sourceTree = "<group>"; };
+		9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMemberInfo.swift; sourceTree = "<group>"; };
 		9F512CC52B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageDisplayCustomThemesCollectionViewItem.swift; sourceTree = "<group>"; };
 		9F512CC62B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPageDisplayCustomThemesCollectionViewItem.xib; sourceTree = "<group>"; };
 		9F512CCD2B469A7600EC0BC3 /* KMPageDisplayThemeCollectionViewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPageDisplayThemeCollectionViewItem.swift; sourceTree = "<group>"; };
@@ -6001,6 +6017,8 @@
 		9F5664862988B16F00020985 /* KMTextfieldVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMTextfieldVC.xib; sourceTree = "<group>"; };
 		9F5752E72B58FF73005DC303 /* KMAnnotationFromViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationFromViewController.swift; sourceTree = "<group>"; };
 		9F5752E82B58FF73005DC303 /* KMAnnotationFromViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAnnotationFromViewController.xib; sourceTree = "<group>"; };
+		9F58E8842CC8CC14002457F1 /* KMSignUpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSignUpView.swift; sourceTree = "<group>"; };
+		9F58E8882CC8CD07002457F1 /* KMSignUpView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSignUpView.xib; sourceTree = "<group>"; };
 		9F69DBB02B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationTextWidgetOptionsViewController.swift; sourceTree = "<group>"; };
 		9F69DBB12B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAnnotationTextWidgetOptionsViewController.xib; sourceTree = "<group>"; };
 		9F69DBB82B55014F003D4C45 /* KMAnnotationButtonWidgetAppearanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationButtonWidgetAppearanceViewController.swift; sourceTree = "<group>"; };
@@ -6048,6 +6066,7 @@
 		9F8DDF2B2924B855006CDC73 /* KMPDFToolsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFToolsViewController.swift; sourceTree = "<group>"; };
 		9F8DDF2C2924B855006CDC73 /* KMPDFToolsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPDFToolsViewController.xib; sourceTree = "<group>"; };
 		9F8DDF332924DA6B006CDC73 /* KMPDFToolsCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFToolsCollectionView.swift; sourceTree = "<group>"; };
+		9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMSignUpModel.swift; sourceTree = "<group>"; };
 		9F94617B2BD643720076574B /* KMTableAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMTableAnnotation.m; sourceTree = "<group>"; };
 		9F94617C2BD643720076574B /* KMTableAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMTableAnnotation.h; sourceTree = "<group>"; };
 		9F9461802BD644BE0076574B /* KMTableDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMTableDataManager.h; sourceTree = "<group>"; };
@@ -6095,6 +6114,7 @@
 		9FBC48B6299B44C600CA39D7 /* KMSecondaryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMSecondaryViewController.h; sourceTree = "<group>"; };
 		9FBC48B7299B44C600CA39D7 /* KMSecondaryViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMSecondaryViewController.xib; sourceTree = "<group>"; };
 		9FBC48BE299E23B100CA39D7 /* NSViewController+DesignToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSViewController+DesignToken.swift"; sourceTree = "<group>"; };
+		9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSignUpViewModel.swift; sourceTree = "<group>"; };
 		9FBDA7282A4D32A500A972F3 /* KMWebsocket.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWebsocket.swift; sourceTree = "<group>"; };
 		9FBDA72C2A4D532700A972F3 /* KMWebsocketManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWebsocketManager.swift; sourceTree = "<group>"; };
 		9FC444F82AA5F7D600D7187C /* ZipArchive.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ZipArchive.framework; sourceTree = "<group>"; };
@@ -8949,12 +8969,12 @@
 			isa = PBXGroup;
 			children = (
 				9F4ACEA72CC600EB005CF727 /* Assets */,
-				9F4ACEA32CC5F328005CF727 /* KMMemberCenterManager.swift */,
-				9F4ACEBD2CC631CF005CF727 /* KMMemberCenterResult.swift */,
 				9F4ACEC12CC63DA8005CF727 /* KMMemberCenterConfig.swift */,
+				9F4ACED42CC7C783005CF727 /* Model */,
 				9F4ACEC52CC790BC005CF727 /* WindowsController */,
 				9F4ACEC62CC790F9005CF727 /* ViewController */,
 				9F4ACEC72CC79110005CF727 /* View */,
+				9FBD84322CC9DA7E0071B9C3 /* ViewModel */,
 			);
 			path = MemberCenter;
 			sourceTree = "<group>";
@@ -8987,10 +9007,23 @@
 		9F4ACEC72CC79110005CF727 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				9F58E8842CC8CC14002457F1 /* KMSignUpView.swift */,
+				9F58E8882CC8CD07002457F1 /* KMSignUpView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
 		};
+		9F4ACED42CC7C783005CF727 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				9F4ACEA32CC5F328005CF727 /* KMMemberCenterManager.swift */,
+				9F4ACEBD2CC631CF005CF727 /* KMMemberCenterResult.swift */,
+				9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */,
+				9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		9F5664842987EBE500020985 /* Recovered References */ = {
 			isa = PBXGroup;
 			children = (
@@ -9196,6 +9229,14 @@
 			path = Split;
 			sourceTree = "<group>";
 		};
+		9FBD84322CC9DA7E0071B9C3 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
 		9FBDA7272A4D326800A972F3 /* Websocket */ = {
 			isa = PBXGroup;
 			children = (
@@ -15407,6 +15448,7 @@
 				ADFCEB482B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				ADFA8F0D2B579957002595A4 /* KMSearchFindView.xib in Resources */,
 				BB6710612BC672260018CE54 /* KMSignatureWindowController.xib in Resources */,
+				9F58E8892CC8CD07002457F1 /* KMSignUpView.xib in Resources */,
 				BBFA1CD12B609EC50053AD4A /* KMScreenShotMaskWindowController.xib in Resources */,
 				9FDD0FA22952FF4D000C4DAD /* $themes.json in Resources */,
 				BB69C95C299116FD0001A9B1 /* five_line_score.pdf in Resources */,
@@ -15978,6 +16020,7 @@
 				AD88108829A719E500178CA1 /* KMRegisterView.xib in Resources */,
 				ADE86AF32B0AF56C00414DFA /* KMCompareCoveringSettingView.xib in Resources */,
 				ADC63E3B2A49813E00854E02 /* KMSubscribeSuccessWindowController.xib in Resources */,
+				9F58E88A2CC8CD07002457F1 /* KMSignUpView.xib in Resources */,
 				BBFD2B172AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */,
 				BB1BFF7E2AEA0BE8003EB179 /* KMBatchOperateRightViewController.xib in Resources */,
 				ADFCEB622B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
@@ -16451,6 +16494,7 @@
 				BB88106C2B4F771D00AFA63E /* KMVerificationInfoViewController.xib in Resources */,
 				9F1F82C1292E01860092C4B4 /* KMCloudEmptyCollectionViewItem.xib in Resources */,
 				9F00CF562A38657400AC462E /* GoogleService-Info.plist in Resources */,
+				9F58E88B2CC8CD07002457F1 /* KMSignUpView.xib in Resources */,
 				9FDD0F69294AB645000C4DAD /* KMMainViewController.xib in Resources */,
 				9FBA0EF328FFC716001117AF /* KMHomeFastToolViewController.xib in Resources */,
 				BB10FAEB2AFE03CD00F18D65 /* KMPDFEditPageRangeWindowController.xib in Resources */,
@@ -16775,6 +16819,7 @@
 				9FA607DE28FD4C9F00B46586 /* KMHomePopViewController.swift in Sources */,
 				BBDA8A692A31B50C006A2C4E /* KMCustomStepperView.swift in Sources */,
 				BBBAED142B57E97000266BD3 /* SKTypeSelectHelper.swift in Sources */,
+				9F9085CF2CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */,
 				BB162E9B295073B40088E9D1 /* KMWatermarkManager.swift in Sources */,
 				BB4BD9CC2909026500A66A65 /* KMRightSideViewController.swift in Sources */,
 				AD2D74B529F0D39500EDC5E4 /* KMCancellationSuccessView.swift in Sources */,
@@ -17219,6 +17264,7 @@
 				ADBC2D11299CCD05006280C8 /* KMTextfieldButton.swift in Sources */,
 				9FCFEC982AD14EEF00EAD2CB /* KMMailHelper.swift in Sources */,
 				ADAFDA302AE8E45000F084BC /* KMAdvertisementConfig.swift in Sources */,
+				9FBD84342CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */,
 				BB1B0AEC2B4FC6E900889528 /* KMGuideCoverView.swift in Sources */,
 				9FAAA325290A69920046FFCE /* KMToolSetScroller.swift in Sources */,
 				BBBE208B2B21649100509C4E /* KMPDFEditWindowController.swift in Sources */,
@@ -17325,6 +17371,7 @@
 				9F1F82B4292DEF370092C4B4 /* KMCloudDocumentsViewController.swift in Sources */,
 				ADE8BC2529F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */,
 				BB6347AE2AF1F0A500F5438E /* KMBatchOperateConvertViewController.swift in Sources */,
+				9F4ACED62CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */,
 				BB4F7E812B0C4E140077EC8C /* KMNoteFilterCollevtionViewItem.swift in Sources */,
 				BB4DD047299B294000E80DF6 /* KMCloudFileEmptyView.swift in Sources */,
 				ADD272D029B9CFD30032B5D6 /* KMLightNoNetworkView.swift in Sources */,
@@ -17484,6 +17531,7 @@
 				BBFEF72F2B3A794700C28AC0 /* KMSystemViewMenu.swift in Sources */,
 				BBC8DC702B57854800270C98 /* KMSecondaryPDFView.swift in Sources */,
 				9FCFEC902AD11E5F00EAD2CB /* KMSplitView.swift in Sources */,
+				9F58E8852CC8CC14002457F1 /* KMSignUpView.swift in Sources */,
 				BBEC00D9295C39FD00A26C98 /* KMBatesPropertyInfoController.swift in Sources */,
 				9F0CB529298656C900007028 /* KMDesignToken+BorderWidthTop.swift in Sources */,
 				BB4EEF482976504C003A3537 /* KMRedactColorView.swift in Sources */,
@@ -18171,6 +18219,7 @@
 				9FDD0FB329534FEA000C4DAD /* KMGlobal.swift in Sources */,
 				ADF6B87F2A485A8F0090CB78 /* KMComparativeViewCollectionItemItem.swift in Sources */,
 				AD3AAD892B10349600DE5FE7 /* KMHeaderFooterWindowController.swift in Sources */,
+				9FBD84352CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */,
 				BBB7B4922A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */,
 				ADDEEA8F2AD78E4400EF675D /* KMSelfSignAnnotation.swift in Sources */,
 				6554450F2C88483C00BD9010 /* KMDiscountToSaveWindowController.m in Sources */,
@@ -18341,6 +18390,7 @@
 				BB981E562AD4F638001988CA /* KMPageIndicator.swift in Sources */,
 				AD055E4B2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				BB3A669B2B07520800575343 /* KMCustomOutlineView.swift in Sources */,
+				9F9085D02CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */,
 				BB04FD0D2B206F3600D80F7B /* KMPlanViewController.swift in Sources */,
 				AD1FE8422BD7C98300AA4A9B /* KMPosterPrintManager.m in Sources */,
 				9FB2210F2B1AE35E00A5B208 /* NSBitmapImageRep_KMExtension.swift in Sources */,
@@ -18932,6 +18982,7 @@
 				BBFE6E66293097A600142C01 /* KMPageRangePickerWindowController.swift in Sources */,
 				BB83639B2C199C20002CE43A /* KMBotaModel.swift in Sources */,
 				BBEC00E6295C4D3C00A26C98 /* KMBatesPageInfoView.swift in Sources */,
+				9F4ACED72CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */,
 				9F88108E2B56614600F69815 /* KMAnnotationChoiceWidgetAppearanceViewController.swift in Sources */,
 				BB2C84762BAE71E400AF6142 /* KMThumbnailTableviewCell.swift in Sources */,
 				BB276A512B0376B300AB5578 /* KMBatchOperateRemoveHeaderFooterViewController.swift in Sources */,
@@ -19137,6 +19188,7 @@
 				BB35C4A02975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
 				BB49ECEE293F3B0D00C82CA2 /* KMConvertOCRSettingItemView.swift in Sources */,
 				BBBE20942B21B18900509C4E /* KMPDFInsertWindowController.swift in Sources */,
+				9F58E8862CC8CC14002457F1 /* KMSignUpView.swift in Sources */,
 				89D2D309295A83B500BFF5FE /* KMEditPDFTextPropertyViewController.swift in Sources */,
 				9F0CB4DE2986554D00007028 /* KMDesignToken+HorizontalPadding.swift in Sources */,
 				BBBAED112B57E76400266BD3 /* NSGraphics_SKExtensions.m in Sources */,
@@ -19243,6 +19295,7 @@
 				BB93CDEB2AE7B6E100B29C57 /* KMToolbarView.swift in Sources */,
 				BB3D1EB42C3EAE5B001D1BBE /* KMAlignmentController.swift in Sources */,
 				BB83B8EE2BA8415A00EFF584 /* KMPageEditExtractWindowController.swift in Sources */,
+				9F58E8872CC8CC14002457F1 /* KMSignUpView.swift in Sources */,
 				AD1D48232AFB6BBA007AC1F0 /* KMMergeView.swift in Sources */,
 				BB403BAC2B15CA6E00B3106D /* KMBatchConvertOperation.swift in Sources */,
 				BB1EC8002967B26700EC0BC3 /* KMPDFEditViewController.swift in Sources */,
@@ -19317,6 +19370,7 @@
 				658FDBB42C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.swift in Sources */,
 				9FE0BBF22B0F2FB000CD1CAC /* KMAnnotationLineWindowController.swift in Sources */,
 				F37322F5292DF9410013862C /* CSelfSignAnnotationFreeText.m in Sources */,
+				9F9085D12CC7CB7400ACAF58 /* KMSignUpModel.swift in Sources */,
 				BB031B622C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */,
 				BB73F28A2C63147E00131EE7 /* KMUnbindAlertViewController.swift in Sources */,
 				AD5999382AD7D9C200412F8B /* KMPropertiesViewPopController.swift in Sources */,
@@ -20116,6 +20170,7 @@
 				BB96A0B22AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */,
 				9F0201802A1BAC1600C9B673 /* KMAIRewritingVC.swift in Sources */,
 				BBCE57122A72712200508EFC /* NSWindowController+KMExtension.swift in Sources */,
+				9F4ACED82CC7C9E4005CF727 /* KMMemberInfo.swift in Sources */,
 				BB10FAF02AFE233C00F18D65 /* KMLineInspector.swift in Sources */,
 				BB04FD0E2B206F3600D80F7B /* KMPlanViewController.swift in Sources */,
 				ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */,
@@ -20441,6 +20496,7 @@
 				BB146FAD299DC0D000784A6A /* GTLRBatchQuery.m in Sources */,
 				65AED4B52CAA55A8005C44B3 /* KMMergeViewModel.swift in Sources */,
 				BB2EDF72296ECE17003BCF58 /* KMPageEditThumbnailView.swift in Sources */,
+				9FBD84362CC9DAA20071B9C3 /* KMSignUpViewModel.swift in Sources */,
 				9F1FE3E0293EE51F00E952CA /* KMMainDocument.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;