瀏覽代碼

【会员系统】用户个人中心不同场景下样式补全

wanjun 4 月之前
父節點
當前提交
98bf3c1739
共有 46 個文件被更改,包括 1474 次插入108 次删除
  1. 17 1
      PDF Office/PDF Master/AppDelegate.swift
  2. 23 9
      PDF Office/PDF Master/Class/Purchase/DMG/Verification/KMVerificationMessageViewController.m
  3. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/065CBC.colorset/Contents.json
  4. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/3091FF.colorset/Contents.json
  5. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/7094F6_0.1.colorset/Contents.json
  6. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/F5FAFF.colorset/Contents.json
  7. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/FFFFFF_0.2.colorset/Contents.json
  8. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AccountCenterImage_Hov.imageset/Contents.json
  9. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AccountCenterImage_Hov.imageset/icon_prefix (3) 1.pdf
  10. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AccountCenterImage_Hov.imageset/icon_prefix (3).pdf
  11. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AndroidPlatformImage2.imageset/Contents.json
  12. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AndroidPlatformImage2.imageset/platform 1.pdf
  13. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AndroidPlatformImage2.imageset/platform.pdf
  14. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/MacOSPlatformImage2.imageset/Contents.json
  15. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/MacOSPlatformImage2.imageset/platform 1.pdf
  16. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/MacOSPlatformImage2.imageset/platform.pdf
  17. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/SignOutImage_Hov.imageset/Contents.json
  18. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/SignOutImage_Hov.imageset/icon_prefix (4) 1.pdf
  19. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/SignOutImage_Hov.imageset/icon_prefix (4).pdf
  20. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage.imageset/Contents.json
  21. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage.imageset/Upgrade 1.pdf
  22. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage.imageset/Upgrade.pdf
  23. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage2.imageset/Contents.json
  24. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage2.imageset/Upgrade 1.pdf
  25. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage2.imageset/Upgrade.pdf
  26. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture1.imageset/Contents.json
  27. 154 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture1.imageset/Multi-Tab-User 1.pdf
  28. 154 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture1.imageset/Multi-Tab-User.pdf
  29. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture_Size.imageset/Contents.json
  30. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture_Size.imageset/headPortrait 1.pdf
  31. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture_Size.imageset/headPortrait.pdf
  32. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WindowsPlatformImage2.imageset/Contents.json
  33. 89 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WindowsPlatformImage2.imageset/platform 1.pdf
  34. 89 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WindowsPlatformImage2.imageset/platform.pdf
  35. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/iOSPlatformImage2.imageset/Contents.json
  36. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/iOSPlatformImage2.imageset/platform 1.pdf
  37. 二進制
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/iOSPlatformImage2.imageset/platform.pdf
  38. 8 11
      PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterManager.swift
  39. 27 27
      PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterResult.swift
  40. 69 7
      PDF Office/PDF Master/MemberCenter/Model/KMMemberInfo.swift
  41. 186 17
      PDF Office/PDF Master/MemberCenter/ViewController/KMUserInfoViewController.swift
  42. 106 15
      PDF Office/PDF Master/MemberCenter/ViewController/KMUserInfoViewController.xib
  43. 36 15
      PDF Office/PDF Master/MemberCenter/ViewModel/KMSignUpViewModel.swift
  44. 87 3
      PDF Office/PDF Master/MemberCenter/ViewModel/KMUserInfoVCModel.swift
  45. 18 1
      PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.swift
  46. 1 2
      PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.xib

+ 17 - 1
PDF Office/PDF Master/AppDelegate.swift

@@ -38,7 +38,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, iRateDelegate{
     
     func applicationDidFinishLaunching(_ aNotification: Notification) {
         // Insert code here to initialize your application
-        
+                
         //通知
         UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
             if granted {
@@ -203,6 +203,22 @@ class AppDelegate: NSObject, NSApplicationDelegate, iRateDelegate{
                 }
             }
         }
+        
+        let token = UserDefaults.standard.value(forKey: "MemberAccessToken")
+        if token is String {
+            if (token as! String).count > 0 {
+                KMMemberInfo.shared.access_token = token as! String
+                KMUserInfoVCModel().refreshUserInfo { success, msg in
+                    if success {
+                        KMMemberInfo.shared.isLogin = true
+                    } else {
+                        KMMemberInfo.shared.isLogin = false
+                    }
+                }
+                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "MemberCenterLoginSuccess"), object: nil)
+            }
+        }
+
         NotificationCenter.default.addObserver(self, selector: #selector(deviceActivateStatusChangeNotification), name: NSNotification.Name(rawValue: "kDeviceActivateNotification"), object: nil)
     }
     

+ 23 - 9
PDF Office/PDF Master/Class/Purchase/DMG/Verification/KMVerificationMessageViewController.m

@@ -348,6 +348,11 @@ NSPopoverDelegate>
     self.userButton.frame = CGRectMake(totalWidth, 0, userImageWidth, userImageWidth);
     totalWidth += userImageWidth;
     totalWidth += 8;
+    if ([KMMemberInfo shared].isLogin) {
+        self.userButton.image = [NSImage imageNamed:@"UserProfilePicture"];
+    } else {
+        self.userButton.image = [NSImage imageNamed:@"UserProfilePicture1"];
+    }
     
     if (!self.secondTrialBtn.hidden) {
         self.secondTrialBtn.frame = CGRectMake(MAX(CGRectGetMaxX(self.labelContentView.frame) - self.button.frame.size.width, 0), kbottomGap, self.button.frame.size.width, self.view.frame.size.height -2 *kbottomGap);
@@ -370,6 +375,7 @@ NSPopoverDelegate>
     self.bgImg.frame = rect;
     
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popoverShowNoti:) name:@"KMVerificationMessagePopShowNoti" object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccessNotification:) name:@"MemberCenterLoginSuccess" object:nil];
 }
 
 #pragma mark - Button Actions
@@ -598,15 +604,19 @@ NSPopoverDelegate>
 }
 
 - (IBAction)userButtonAction:(NSButton *)sender {
-    // 用户头像点击事件
-    NSMenu *menu = [[NSMenu alloc] init];
-    KMUserInfoViewController *userInfo = [[KMUserInfoViewController alloc] init];
-    userInfo.view.layer.backgroundColor = [NSColor clearColor].CGColor;
-    NSMenuItem *item = [menu addItemWithTitle:@"" action:nil target:@""];
-    item.target = self;
-    item.representedObject = userInfo;
-    item.view = userInfo.view;
-    [menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(-130, 30) inView:sender];
+    if ([KMMemberInfo shared].isLogin) {
+        // 用户头像点击事件
+        NSMenu *menu = [[NSMenu alloc] init];
+        KMUserInfoViewController *userInfo = [[KMUserInfoViewController alloc] init];
+        userInfo.view.layer.backgroundColor = [NSColor whiteColor].CGColor;
+        NSMenuItem *item = [menu addItemWithTitle:@"" action:nil target:@""];
+        item.target = self;
+        item.representedObject = userInfo;
+        item.view = userInfo.view;
+        [menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(-130, 30) inView:sender];
+    } else {
+        [KMLoginWindowsController.shared showWindow:nil];
+    }
 }
 
 #pragma mark - NSNotification Methods
@@ -663,6 +673,10 @@ NSPopoverDelegate>
     }
 }
 
+- (void)loginSuccessNotification:(NSNotification *)noti {
+    _userButton.image = [NSImage imageNamed:@"UserProfilePicture"];
+}
+
 - (void)popOverCloseAction {
     if (self.stopPopOverHide == NO) {
         if (ActivityStatusTrialExpire == [VerificationManager manager].status ||

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

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

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

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

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

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

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

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

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

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

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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AccountCenterImage_Hov.imageset/icon_prefix (3) 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AccountCenterImage_Hov.imageset/icon_prefix (3).pdf


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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AndroidPlatformImage2.imageset/platform 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/AndroidPlatformImage2.imageset/platform.pdf


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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/MacOSPlatformImage2.imageset/platform 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/MacOSPlatformImage2.imageset/platform.pdf


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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/SignOutImage_Hov.imageset/icon_prefix (4) 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/SignOutImage_Hov.imageset/icon_prefix (4).pdf


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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage.imageset/Upgrade 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage.imageset/Upgrade.pdf


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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage2.imageset/Upgrade 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UpgradeImage2.imageset/Upgrade.pdf


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

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

+ 154 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture1.imageset/Multi-Tab-User 1.pdf

@@ -0,0 +1,154 @@
+%PDF-1.7
+
+1 0 obj
+  << /Type /XObject
+     /Length 2 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 24.000000 24.000000 ]
+  >>
+stream
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 -7.000000 cm
+1.000000 1.000000 1.000000 scn
+10.000000 18.000000 m
+12.209139 18.000000 14.000000 19.790861 14.000000 22.000000 c
+14.000000 24.209139 12.209139 26.000000 10.000000 26.000000 c
+7.790861 26.000000 6.000000 24.209139 6.000000 22.000000 c
+6.000000 19.790861 7.790861 18.000000 10.000000 18.000000 c
+h
+10.000000 0.000000 m
+15.522847 0.000000 20.000000 3.581722 20.000000 8.000000 c
+20.000000 12.418278 15.522847 16.000000 10.000000 16.000000 c
+4.477152 16.000000 0.000000 12.418278 0.000000 8.000000 c
+0.000000 3.581722 4.477152 0.000000 10.000000 0.000000 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+2 0 obj
+  625
+endobj
+
+3 0 obj
+  << /Type /XObject
+     /Length 4 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 24.000000 24.000000 ]
+  >>
+stream
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 2.000000 cm
+0.254902 0.352941 0.505882 scn
+20.000000 10.000000 m
+20.000000 4.477153 15.522847 0.000000 10.000000 0.000000 c
+4.477152 0.000000 0.000000 4.477153 0.000000 10.000000 c
+0.000000 15.522848 4.477152 20.000000 10.000000 20.000000 c
+15.522847 20.000000 20.000000 15.522848 20.000000 10.000000 c
+h
+f
+n
+Q
+
+endstream
+endobj
+
+4 0 obj
+  359
+endobj
+
+5 0 obj
+  << /XObject << /X1 1 0 R >>
+     /ExtGState << /E1 << /SMask << /Type /Mask
+                                    /G 3 0 R
+                                    /S /Alpha
+                                 >>
+                          /Type /ExtGState
+                       >> >>
+  >>
+endobj
+
+6 0 obj
+  << /Length 7 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
+0.580392 0.596078 0.611765 scn
+24.000000 12.000000 m
+24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
+5.372583 0.000000 0.000000 5.372583 0.000000 12.000000 c
+0.000000 18.627417 5.372583 24.000000 12.000000 24.000000 c
+18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
+h
+f
+n
+Q
+q
+/E1 gs
+/X1 Do
+Q
+
+endstream
+endobj
+
+7 0 obj
+  405
+endobj
+
+8 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 5 0 R
+     /Contents 6 0 R
+     /Parent 9 0 R
+  >>
+endobj
+
+9 0 obj
+  << /Kids [ 8 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+10 0 obj
+  << /Pages 9 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000010 00000 n
+0000000883 00000 n
+0000000905 00000 n
+0000001512 00000 n
+0000001534 00000 n
+0000001832 00000 n
+0000002293 00000 n
+0000002315 00000 n
+0000002488 00000 n
+0000002562 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 10 0 R
+   /Size 11
+>>
+startxref
+2622
+%%EOF

+ 154 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture1.imageset/Multi-Tab-User.pdf

@@ -0,0 +1,154 @@
+%PDF-1.7
+
+1 0 obj
+  << /Type /XObject
+     /Length 2 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 24.000000 24.000000 ]
+  >>
+stream
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 -7.000000 cm
+1.000000 1.000000 1.000000 scn
+10.000000 18.000000 m
+12.209139 18.000000 14.000000 19.790861 14.000000 22.000000 c
+14.000000 24.209139 12.209139 26.000000 10.000000 26.000000 c
+7.790861 26.000000 6.000000 24.209139 6.000000 22.000000 c
+6.000000 19.790861 7.790861 18.000000 10.000000 18.000000 c
+h
+10.000000 0.000000 m
+15.522847 0.000000 20.000000 3.581722 20.000000 8.000000 c
+20.000000 12.418278 15.522847 16.000000 10.000000 16.000000 c
+4.477152 16.000000 0.000000 12.418278 0.000000 8.000000 c
+0.000000 3.581722 4.477152 0.000000 10.000000 0.000000 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+2 0 obj
+  625
+endobj
+
+3 0 obj
+  << /Type /XObject
+     /Length 4 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 24.000000 24.000000 ]
+  >>
+stream
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 2.000000 cm
+0.254902 0.352941 0.505882 scn
+20.000000 10.000000 m
+20.000000 4.477153 15.522847 0.000000 10.000000 0.000000 c
+4.477152 0.000000 0.000000 4.477153 0.000000 10.000000 c
+0.000000 15.522848 4.477152 20.000000 10.000000 20.000000 c
+15.522847 20.000000 20.000000 15.522848 20.000000 10.000000 c
+h
+f
+n
+Q
+
+endstream
+endobj
+
+4 0 obj
+  359
+endobj
+
+5 0 obj
+  << /XObject << /X1 1 0 R >>
+     /ExtGState << /E1 << /SMask << /Type /Mask
+                                    /G 3 0 R
+                                    /S /Alpha
+                                 >>
+                          /Type /ExtGState
+                       >> >>
+  >>
+endobj
+
+6 0 obj
+  << /Length 7 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
+0.580392 0.596078 0.611765 scn
+24.000000 12.000000 m
+24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
+5.372583 0.000000 0.000000 5.372583 0.000000 12.000000 c
+0.000000 18.627417 5.372583 24.000000 12.000000 24.000000 c
+18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
+h
+f
+n
+Q
+q
+/E1 gs
+/X1 Do
+Q
+
+endstream
+endobj
+
+7 0 obj
+  405
+endobj
+
+8 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 5 0 R
+     /Contents 6 0 R
+     /Parent 9 0 R
+  >>
+endobj
+
+9 0 obj
+  << /Kids [ 8 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+10 0 obj
+  << /Pages 9 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000010 00000 n
+0000000883 00000 n
+0000000905 00000 n
+0000001512 00000 n
+0000001534 00000 n
+0000001832 00000 n
+0000002293 00000 n
+0000002315 00000 n
+0000002488 00000 n
+0000002562 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 10 0 R
+   /Size 11
+>>
+startxref
+2622
+%%EOF

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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture_Size.imageset/headPortrait 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/UserProfilePicture_Size.imageset/headPortrait.pdf


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

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

+ 89 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WindowsPlatformImage2.imageset/platform 1.pdf

@@ -0,0 +1,89 @@
+%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.857178 2.857422 cm
+1.000000 1.000000 1.000000 scn
+0.000000 14.285156 m
+6.493537 14.285156 l
+6.493537 7.791687 l
+0.000000 7.791687 l
+0.000000 14.285156 l
+h
+7.792245 14.285156 m
+14.285782 14.285156 l
+14.285782 7.791687 l
+7.792245 7.791687 l
+7.792245 14.285156 l
+h
+0.000000 6.492993 m
+6.493537 6.492993 l
+6.493537 -0.000477 l
+0.000000 -0.000477 l
+0.000000 6.492993 l
+h
+7.792245 6.492993 m
+14.285782 6.492993 l
+14.285782 -0.000477 l
+7.792245 -0.000477 l
+7.792245 6.492993 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  547
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.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
+0000000637 00000 n
+0000000659 00000 n
+0000000832 00000 n
+0000000906 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+965
+%%EOF

+ 89 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/WindowsPlatformImage2.imageset/platform.pdf

@@ -0,0 +1,89 @@
+%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.857178 2.857422 cm
+1.000000 1.000000 1.000000 scn
+0.000000 14.285156 m
+6.493537 14.285156 l
+6.493537 7.791687 l
+0.000000 7.791687 l
+0.000000 14.285156 l
+h
+7.792245 14.285156 m
+14.285782 14.285156 l
+14.285782 7.791687 l
+7.792245 7.791687 l
+7.792245 14.285156 l
+h
+0.000000 6.492993 m
+6.493537 6.492993 l
+6.493537 -0.000477 l
+0.000000 -0.000477 l
+0.000000 6.492993 l
+h
+7.792245 6.492993 m
+14.285782 6.492993 l
+14.285782 -0.000477 l
+7.792245 -0.000477 l
+7.792245 6.492993 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  547
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.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
+0000000637 00000 n
+0000000659 00000 n
+0000000832 00000 n
+0000000906 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+965
+%%EOF

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

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

二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/iOSPlatformImage2.imageset/platform 1.pdf


二進制
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/iOSPlatformImage2.imageset/platform.pdf


+ 8 - 11
PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterManager.swift

@@ -280,8 +280,7 @@ class KMMemberCenterManager: NSObject {
             if let token = result_dict["access_token"] { access_token = token as! String }
             if let token = result_dict["token_type"] { token_type = token as! String }
             if let token = result_dict["expires_in"] { expires_in = token as! String }
-            if let token = result_dict["scope"] { scope = token as! String }
-            let loginResult = KMMemberLoginResult(refreshToken: refresh_token, accessToken: access_token, tokenType: token_type, expiresIn: expires_in, scope: scope)
+            let loginResult = KMMemberLoginResult(refreshToken: refresh_token, accessToken: access_token, tokenType: token_type, expiresIn: expires_in)
             
             let result = KMMemberCenterResult(loginResult: loginResult)
             result.code = code
@@ -396,7 +395,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func getInviteNum(_ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }
@@ -436,7 +435,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func userInfo(_ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }
@@ -468,7 +467,6 @@ class KMMemberCenterManager: NSObject {
             var activeVIP = KMMemberUserInfo()
             var aiPoint = 0
             var validFlag = ""
-            var isHavePwd = ""
             var isHaveAIDiscount = ""
             var canTrail = ""
             if let token = result_dict["id"] { userId = token as! String }
@@ -504,11 +502,10 @@ class KMMemberCenterManager: NSObject {
 
             if let token = result_dict["aiPoint"] { aiPoint = token as! Int }
             if let token = result_dict["validFlag"] { validFlag = token as! String }
-            if let token = result_dict["isHavePwd"] { isHavePwd = token as! String }
             if let token = result_dict["isHaveAIDiscount"] { isHaveAIDiscount = token as! String }
             if let token = result_dict["canTrail"] { canTrail = token as! String }
 
-            let userInfo = KMMemberUserInfo(id: userId, email: email, fullName: fullName, activeVIP: [userInfoActiveVIP], aiPoint: aiPoint, validFlag: validFlag, isHavePwd: isHavePwd, isHaveAIDiscount: isHaveAIDiscount, canTrail: canTrail)
+            let userInfo = KMMemberUserInfo(id: userId, email: email, fullName: fullName, activeVIP: [userInfoActiveVIP], aiPoint: aiPoint, validFlag: validFlag, isHaveAIDiscount: isHaveAIDiscount, canTrail: canTrail)
             
             let result = KMMemberCenterResult(code: code, msg: message, userInfo: userInfo)
 //            let error = NSError(domain: message, code: code)
@@ -526,7 +523,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func userLogout(_ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }
@@ -565,7 +562,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func userRightList(_ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }
@@ -635,7 +632,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func userLogOffForUser(code: String, _ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }
@@ -682,7 +679,7 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func userRevokeCancel(_ complete: @escaping KMMemberCenterComplete) {
-        let token: String = KMMemberInfo.defaultManager.access_token
+        let token: String = KMMemberInfo.shared.access_token
         if token == "" {
             return
         }

+ 27 - 27
PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterResult.swift

@@ -112,7 +112,7 @@ class KMMemberLoginResult: NSObject {
     var expiresIn           : String?
     var scope               : String?
     
-    init(refreshToken: String, accessToken: String, tokenType: String, expiresIn: String, scope: String) {
+    init(refreshToken: String, accessToken: String, tokenType: String, expiresIn: String, scope: String = "") {
         self.refreshToken = refreshToken
         self.accessToken = accessToken
         self.tokenType = tokenType
@@ -159,44 +159,44 @@ class KMMemberDeviceList: NSObject {
 
 
 class KMMemberUserInfo: NSObject {
-    var id              : String? // 【必需】用户id
-    var email           : String? // 【必需】邮箱
-    var fullName        : String? // 【必需】名称
-    var activeVIP       : [KMMemberUserInfoActiveVIP]? // 【必需】活跃的会员
-    var aiPoint         : Int?    // 【必需】ai点数
-    var validFlag       : String? // 【必需】注销(0), * 正常(1), * 停用(2), * 注销中(5);
-    var isHavePwd       : String? // 【必需】1是0否 是否设置了密码
-    var isHaveAIDiscount: String? // 【必需】1是0否 是否有ai折扣
-    var canTrail        : String? // 【必需】1是0否 是否能试用
-    
-    init(id: String? = "", email: String? = "", fullName: String? = "", activeVIP: [KMMemberUserInfoActiveVIP]? = [], aiPoint: Int? = 0, validFlag: String? = "", isHavePwd: String? = "", isHaveAIDiscount: String? = "", canTrail: String? = "") {
+    var id              : String = "" // 【必需】用户id
+    var email           : String = "" // 【必需】邮箱
+    var fullName        : String = "" // 【必需】名称
+    var activeVIP       : [KMMemberUserInfoActiveVIP] = [] // 【必需】活跃的会员
+    var aiPoint         : Int = 0     // 【必需】ai点数
+    var validFlag       : String = "" // 【必需】注销(0), * 正常(1), * 停用(2), * 注销中(5);
+//    var isHavePwd       : String = "" // 【必需】1是0否 是否设置了密码
+    var isHaveAIDiscount: String = "" // 【必需】1是0否 是否有ai折扣
+    var canTrail        : String = "" // 【必需】1是0否 是否能试用
+    
+    init(id: String = "", email: String = "", fullName: String = "", activeVIP: [KMMemberUserInfoActiveVIP] = [], aiPoint: Int = 0, validFlag: String = ""/*, isHavePwd: String = ""*/, isHaveAIDiscount: String = "", canTrail: String = "") {
         self.id = id
         self.email = email
         self.fullName = fullName
         self.activeVIP = activeVIP
         self.aiPoint = aiPoint
         self.validFlag = validFlag
-        self.isHavePwd = isHavePwd
+//        self.isHavePwd = isHavePwd
         self.isHaveAIDiscount = isHaveAIDiscount
         self.canTrail = canTrail
     }
 }
 
 class KMMemberUserInfoActiveVIP: NSObject {
-    var id              : String? // 【可选】id   
-    var userId          : String? // 【可选】用户id
-    var status          : Int?    // 【可选】状态 0注册1订阅中2订阅过期3试用中4试用过期
-    var endDate         : String? // 【可选】到期时间
-    var payType         : Int?    // 【可选】0未开启自动续订 1自动续订
-    var productName     : String? // 【可选】产品名字
-    var levels          : String? // 【可选】会员等级 1是免费 2是标准 3是高级
-    var platforms       : String? // 【可选】支持的平台
-    var point           : Int?    // 【可选】剩余ai点数(svip才有)
-    var maxDeviceNum    : Int?    // 【可选】最大登录设备限制数
-    var paymentModel    : String? // 【可选】支付方式 付费模式(1自动续订(vip svip) 2单次付费(永久会员))
-    var isAi            : String? // 【可选】是否是ai产品(0否1是)
-    
-    init(id: String? = "", userId: String? = "", status: Int? = 0, endDate: String? = "", payType: Int? = 0, productName: String? = "", levels: String? = "", platforms: String? = "", point: Int? = 0, maxDeviceNum: Int? = 0, paymentModel: String? = "", isAi: String? = "") {
+    var id              : String = "" // 【可选】id
+    var userId          : String = "" // 【可选】用户id
+    var status          : Int    = 0  // 【可选】状态 0注册1订阅中2订阅过期3试用中4试用过期
+    var endDate         : String = "" // 【可选】到期时间
+    var payType         : Int    = 0  // 【可选】0未开启自动续订 1自动续订
+    var productName     : String = "" // 【可选】产品名字
+    var levels          : String = "" // 【可选】会员等级 1是免费 2是标准 3是高级
+    var platforms       : String = "" // 【可选】支持的平台
+    var point           : Int    = 0  // 【可选】剩余ai点数(svip才有)
+    var maxDeviceNum    : Int    = 0  // 【可选】最大登录设备限制数
+    var paymentModel    : String = "" // 【可选】支付方式 付费模式(1自动续订(vip svip) 2单次付费(永久会员))
+    var isAi            : String = "" // 【可选】是否是ai产品(0否1是)
+    
+    init(id: String = "", userId: String = "", status: Int = 0, endDate: String = "", payType: Int = 0, productName: String = "", levels: String = "", platforms: String = "", point: Int = 0, maxDeviceNum: Int = 0, paymentModel: String = "", isAi: String = "") {
         self.id = id
         self.userId = userId
         self.status = status

+ 69 - 7
PDF Office/PDF Master/MemberCenter/Model/KMMemberInfo.swift

@@ -7,18 +7,80 @@
 
 import Cocoa
 
-class KMMemberInfo: NSObject {
+@objcMembers class KMMemberInfo: NSObject {
     
-    static let defaultManager = KMMemberInfo()
+    static let shared = KMMemberInfo()
     
     var isLogin: Bool = false
     
     /**
      登录
      */
-    var refresh_token: String = ""
-    var access_token: String = ""
-    var token_type: String = ""
-    var expires_in: String = ""
-    var scope: String = ""
+    private var _refresh_token: String = "" // 刷新Token
+    private var _access_token: String = "" // 访问Token
+    private var _token_type: String = "" // Token 类型
+    private var _expires_in: String = ""
+    private var _scope: String = ""
+    /**
+     登录
+     */
+    var userID: String = "" // 用户ID
+    var userEmail: String = "" // 用户邮箱
+    var fullName: String = "" // 用户名称
+    var activeVips: [KMMemberUserInfoActiveVIP] = [] // 活跃的会员
+    var aiPoint: Int = 0 // AI 点数
+    var validFlag: String = "" // 账户状态
+    var isHaveAIDiscount: String = "" // 是否有ai折扣
+    var canTrail: String = "" // 是否能试用
+
+    
+    // MARK: Get & Set
+    
+    var refresh_token: String {
+        get {
+            let token = UserDefaults.standard.value(forKey: "MemberRefreshToken")
+            if token is String {
+                return token as! String
+            }
+            return _refresh_token
+        }
+        set {
+            _refresh_token = newValue
+            UserDefaults.standard.setValue(newValue, forKey: "MemberRefreshToken")
+        }
+    }
+    
+    var access_token: String {
+        get {
+            let token = UserDefaults.standard.value(forKey: "MemberAccessToken")
+            if token is String {
+                return token as! String
+            }
+            return _access_token
+        }
+        set {
+            _access_token = newValue
+            UserDefaults.standard.setValue(newValue, forKey: "MemberAccessToken")
+        }
+    }
+    var token_type: String {
+        get {
+            return _token_type
+        }
+        set {
+            _token_type = newValue
+        }
+    }
+    
+    // MARK: Public Method
+    
+    func memberUserInfo(model: KMMemberUserInfo) -> Void {
+        userID = model.id
+        userEmail = model.email
+        fullName = model.fullName
+        aiPoint = model.aiPoint
+        validFlag = model.validFlag
+        isHaveAIDiscount = model.isHaveAIDiscount
+        canTrail = model.canTrail
+    }
 }

+ 186 - 17
PDF Office/PDF Master/MemberCenter/ViewController/KMUserInfoViewController.swift

@@ -19,9 +19,11 @@ class KMUserInfoViewController: NSViewController {
     @IBOutlet weak var lockedImageView: NSImageView!
     @IBOutlet weak var lockedLabel: NSTextField!
 
+    @IBOutlet weak var centerBackgroud: NSImageView!
     @IBOutlet weak var rightsBox: NSBox!
     @IBOutlet var rightsView: NSView!
     @IBOutlet weak var number1Label: NSTextField!
+    @IBOutlet weak var number1ImageView: NSImageView!
     @IBOutlet weak var number2Label: NSTextField!
     @IBOutlet weak var iconBox: NSBox!
     @IBOutlet var iconView1: NSView!
@@ -31,6 +33,13 @@ class KMUserInfoViewController: NSViewController {
     @IBOutlet weak var icon4ImageView: NSImageView!
     @IBOutlet var iconView2: NSView!
     @IBOutlet weak var icon5ImageView: NSImageView!
+    @IBOutlet weak var icon6ImageView: NSImageView!
+    @IBOutlet weak var icon7ImageView: NSImageView!
+    @IBOutlet var iconView3: NSView!
+    @IBOutlet weak var icon8ImageView: NSImageView!
+    @IBOutlet weak var icon9ImageView: NSImageView!
+    @IBOutlet var iconView4: NSView!
+    @IBOutlet weak var icon10ImageView: NSImageView!
     @IBOutlet weak var number3Label: NSTextField!
     @IBOutlet weak var number4Label: NSTextField!
     @IBOutlet weak var number5Label: NSTextField!
@@ -64,11 +73,16 @@ class KMUserInfoViewController: NSViewController {
     
     private var viewModel = KMUserInfoVCModel()
     private var cancellables = Set<AnyCancellable>()
-    
+    private var userState: KMUserState = .unPay_UnTrial
+
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do view setup here.
         
+        self.view.wantsLayer = true
+        self.view.layer?.backgroundColor = .white
+        userState = viewModel.refreshUserState()
+        
         bindViewModel()
         languageLocalized()
         initializeUI()
@@ -77,25 +91,47 @@ class KMUserInfoViewController: NSViewController {
     // MARK: Private Method
     
     private func languageLocalized() -> Void {
-        emailLabel.stringValue = ""
+        emailLabel.stringValue = KMMemberInfo.shared.userEmail
         productLabel.stringValue = NSLocalizedString("PDF Reader Pro Account", tableName: "MemberCenterLocalizable", comment: "")
         membershipLabel.stringValue = NSLocalizedString("Membership Benefits", tableName: "MemberCenterLocalizable", comment: "")
         lockedLabel.stringValue = NSLocalizedString("Locked", tableName: "MemberCenterLocalizable", comment: "")
-        number1Label.stringValue = NSLocalizedString("150+", tableName: "MemberCenterLocalizable", comment: "")
-        number2Label.stringValue = NSLocalizedString("Benefits of functions", tableName: "MemberCenterLocalizable", comment: "")
-        number3Label.stringValue = NSLocalizedString("All-platform available", tableName: "MemberCenterLocalizable", comment: "")
-        number4Label.stringValue = NSLocalizedString("4 devices", tableName: "MemberCenterLocalizable", comment: "")
-        number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "")
         buyNow1Label.stringValue = NSLocalizedString("Buy Now", tableName: "MemberCenterLocalizable", comment: "")
         buyNow2Label.stringValue = NSLocalizedString("Buy Now", tableName: "MemberCenterLocalizable", comment: "")
-        buyNow3Label.stringValue = NSLocalizedString("Buy Now", tableName: "MemberCenterLocalizable", comment: "")
+        buyNow3Label.stringValue = NSLocalizedString("Upgrade", tableName: "MemberCenterLocalizable", comment: "")
         accountLabel.stringValue = NSLocalizedString("Account Center", tableName: "MemberCenterLocalizable", comment: "")
         signOutLabel.stringValue = NSLocalizedString("Sign out", tableName: "MemberCenterLocalizable", comment: "")
         closeAccountLabel.stringValue = NSLocalizedString("Close account", tableName: "MemberCenterLocalizable", comment: "")
+        if userState == .unPay_UnTrial {
+            number1Label.stringValue = NSLocalizedString("150+", tableName: "MemberCenterLocalizable", comment: "")
+            number2Label.stringValue = NSLocalizedString("Benefits of functions", tableName: "MemberCenterLocalizable", comment: "")
+            number3Label.stringValue = NSLocalizedString("All-platform available", tableName: "MemberCenterLocalizable", comment: "")
+            number4Label.stringValue = NSLocalizedString("4 devices", tableName: "MemberCenterLocalizable", comment: "")
+            number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "")
+        } else if userState == .permanentAccount {
+            number1Label.stringValue = NSLocalizedString("", tableName: "MemberCenterLocalizable", comment: "")
+            number2Label.stringValue = NSLocalizedString("Advanced Version", tableName: "MemberCenterLocalizable", comment: "")
+            number3Label.stringValue = NSLocalizedString("Platform", tableName: "MemberCenterLocalizable", comment: "")
+            number4Label.stringValue = NSLocalizedString("2 devices", tableName: "MemberCenterLocalizable", comment: "")
+            number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "")
+        } else if userState == .unAutomatic_RemainValid {
+            number1Label.stringValue = NSLocalizedString("", tableName: "MemberCenterLocalizable", comment: "")
+            number2Label.stringValue = NSLocalizedString("Standard Version", tableName: "MemberCenterLocalizable", comment: "")
+            number3Label.stringValue = NSLocalizedString("Platform", tableName: "MemberCenterLocalizable", comment: "")
+            number4Label.stringValue = NSLocalizedString("4 devices", tableName: "MemberCenterLocalizable", comment: "")
+            number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "")
+            buyNow3Label.stringValue = NSLocalizedString("Renew now", tableName: "MemberCenterLocalizable", comment: "")
+        } else if userState == .expired {
+            number1Label.stringValue = NSLocalizedString("150+", tableName: "MemberCenterLocalizable", comment: "")
+            number2Label.stringValue = NSLocalizedString("Benefits of functions", tableName: "MemberCenterLocalizable", comment: "")
+            number3Label.stringValue = NSLocalizedString("All-platform available", tableName: "MemberCenterLocalizable", comment: "")
+            number4Label.stringValue = NSLocalizedString("4 devices", tableName: "MemberCenterLocalizable", comment: "")
+            number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "")
+            buyNow2Label.stringValue = NSLocalizedString("Renew now", tableName: "MemberCenterLocalizable", comment: "")
+        }
     }
     
     private func initializeUI() -> Void {
-        userImageView.image = NSImage(named: "UserProfilePicture")
+        userImageView.image = NSImage(named: "UserProfilePicture_Size")
         emailLabel.textColor = NSColor(named: "0E1114")
         emailLabel.font = NSFont.SFMediumFontWithSize(14)
         productLabel.textColor = NSColor(named: "42464D")
@@ -103,30 +139,32 @@ class KMUserInfoViewController: NSViewController {
         membershipLabel.textColor = NSColor(named: "0E1114")
         membershipLabel.font = NSFont.SFMediumFontWithSize(16)
         lockedBackgroud.image = NSImage(named: "ButtonBackgroundImage1")
-        lockedImageView.image = NSImage(named: "LockedImage")
         lockedLabel.textColor = NSColor(named: "42464D")
         lockedLabel.font = NSFont.SFMediumFontWithSize(12)
+        rightsBox.contentView = rightsView
         number1Label.textColor = NSColor(named: "0E1114")
         number1Label.font = NSFont.SFMediumFontWithSize(24)
+        number1ImageView.image = NSImage(named: "UpgradeImage")
         number2Label.textColor = NSColor(named: "42464D")
         number2Label.font = NSFont.SFProTextRegularFont(12)
-        icon1ImageView.image = NSImage(named: "WindowsPlatformImage")
-        icon2ImageView.image = NSImage(named: "MacOSPlatformImage")
-        icon3ImageView.image = NSImage(named: "iOSPlatformImage")
-        icon4ImageView.image = NSImage(named: "AndroidPlatformImage")
         number3Label.textColor = NSColor(named: "42464D")
         number3Label.font = NSFont.SFProTextRegularFont(12)
         number5Label.textColor = NSColor(named: "42464D")
         number5Label.font = NSFont.SFProTextRegularFont(12)
+        buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2")
+        buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2")
+        buyNow3ImageView.image = NSImage(named: "ButtonBackgroundImage2")
         buyNow1Label.textColor = NSColor(named: "FFFFFF")
         buyNow1Label.font = NSFont.SFProTextRegularFont(14)
         buyNow1ImageView.image = NSImage(named: "BuyNewArrowImage1")
         buyNow2Label.textColor = NSColor(named: "FFFFFF")
         buyNow2Label.font = NSFont.SFProTextRegularFont(14)
         buyNow2ImageView.image = NSImage(named: "BuyNewArrowImage1")
-        buyNow3Label.textColor = NSColor(named: "FFFFFF")
+        buyNow3Label.textColor = NSColor(named: "000000")
         buyNow3Label.font = NSFont.SFProTextRegularFont(14)
-        buyNow3ImageView.image = NSImage(named: "BuyNewArrowImage1")
+        buyNow3ImageView.image = NSImage(named: "BuyNewArrowImage2")
+        accountCenterBox.borderColor = NSColor(named: "3091FF") ?? .blue
+        accountCenterBox.fillColor = .clear
         accountLabel.textColor = NSColor(named: "065CBC")
         accountLabel.font = NSFont.SFProTextRegularFont(14)
         accountImageView.image = NSImage(named: "AccountCenterImage")
@@ -136,8 +174,139 @@ class KMUserInfoViewController: NSViewController {
         closeAccountLabel.textColor = NSColor(named: "065CBC")
         closeAccountLabel.font = NSFont.SFProTextRegularFont(14)
         closeAccountImageView.image = NSImage(named: "CloseAccountImage")
+        
+        if userState == .unPay_UnTrial {
+            lockedImageView.image = NSImage(named: "LockedImage")
+            centerBackgroud.image = NSImage(named: "ButtonBackgroundImage3")
+            rightsBox.fillColor = NSColor(named: "7094F6_0.1") ?? .white
+            number1ImageView.isHidden = true
+            number1Label.isHidden = false
+            buyBox.contentView = buyView1
+            buyNow1ImageView.isHidden = false
+            buyNow2ImageView.isHidden = false
+        } else if userState == .permanentAccount {
+            lockedImageView.image = NSImage(named: "UpgradeImage2")
+            centerBackgroud.image = NSImage(named: "ButtonBackgroundImage4")
+            rightsBox.fillColor = NSColor(named: "FFFFFF_0.2") ?? .white
+            number1ImageView.isHidden = false
+            number1Label.isHidden = true
+            buyBox.contentView = buyView2
+            buyNow3ImageView.isHidden = true
+        } else if userState == .unAutomatic_RemainValid {
+            lockedImageView.image = NSImage(named: "UpgradeImage2")
+            centerBackgroud.image = NSImage(named: "ButtonBackgroundImage5")
+            rightsBox.fillColor = NSColor(named: "FFFFFF_0.2") ?? .white
+            number1ImageView.isHidden = false
+            number1Label.isHidden = true
+            buyBox.contentView = buyView2
+            buyNow3ImageView.isHidden = true
+        } else if userState == .expired {
+            lockedImageView.image = NSImage(named: "LockedImage")
+            centerBackgroud.image = NSImage(named: "ButtonBackgroundImage3")
+            rightsBox.fillColor = NSColor(named: "7094F6_0.1") ?? .white
+            number1ImageView.isHidden = true
+            number1Label.isHidden = false
+            buyBox.contentView = buyView1
+            buyNow1ImageView.isHidden = true
+            buyNow2ImageView.isHidden = false
+        }
+        let platforms = viewModel.getPlatformsImages()
+        if platforms.count == 4 {
+            iconBox.contentView = iconView1
+            icon1ImageView.image = platforms[0]
+            icon2ImageView.image = platforms[1]
+            icon3ImageView.image = platforms[2]
+            icon4ImageView.image = platforms[3]
+        } else if platforms.count == 3 {
+            iconBox.contentView = iconView2
+            icon5ImageView.image = platforms[0]
+            icon6ImageView.image = platforms[1]
+            icon7ImageView.image = platforms[2]
+        } else if platforms.count == 2 {
+            iconBox.contentView = iconView3
+            icon8ImageView.image = platforms[0]
+            icon9ImageView.image = platforms[1]
+        } else if platforms.count == 1 {
+            iconBox.contentView = iconView4
+            icon10ImageView.image = platforms[0]
+        }
+        
+        buyNow1Box.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+            if mouseEntered {
+                self.buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2_Hov")
+            } else {
+                self.buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2")
+            }
+        }
+        buyNow1Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
+        
+        buyNow2Box.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+            if mouseEntered {
+                self.buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2_Hov")
+            } else {
+                self.buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2")
+            }
+        }
+        buyNow2Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
+        
+        buyNow3Box.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+        }
+        buyNow3Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
+        
+        accountCenterBox.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+            if mouseEntered {
+                self.accountCenterBox.fillColor = NSColor(named: "F5FAFF") ?? NSColor.gray
+                self.accountLabel.textColor = NSColor(named: "3091FF")
+                self.accountImageView.image = NSImage(named: "AccountCenterImage_Hov")
+            } else {
+                self.accountCenterBox.fillColor = .clear
+                self.accountLabel.textColor = NSColor(named: "065CBC")
+                self.accountImageView.image = NSImage(named: "AccountCenterImage")
+            }
+        }
+        accountCenterBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
+        
+        signOutBox.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+            if mouseEntered {
+                self.signOutLabel.textColor = NSColor(named: "3091FF")
+                self.signOutImageView.image = NSImage(named: "SignOutImage_Hov")
+            } else {
+                self.signOutLabel.textColor = NSColor(named: "065CBC")
+                self.signOutImageView.image = NSImage(named: "SignOutImage")
+            }
+        }
+        signOutBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
+        
+        closeAccountBox.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+
+        }
+        closeAccountBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+
+        }
     }
-    
+
     // MARK: Bind Method
     
     func bindViewModel() -> Void {

+ 106 - 15
PDF Office/PDF Master/MemberCenter/ViewController/KMUserInfoViewController.xib

@@ -26,22 +26,31 @@
                 <outlet property="buyNow3Label" destination="t8m-r3-wJE" id="uab-UM-rqz"/>
                 <outlet property="buyView1" destination="eaW-Ib-hWZ" id="c1o-Al-LRn"/>
                 <outlet property="buyView2" destination="Y2y-Al-WV5" id="LmR-C6-i8w"/>
+                <outlet property="centerBackgroud" destination="4aL-rJ-kZA" id="pMs-fZ-dSl"/>
                 <outlet property="closeAccountBox" destination="hfG-Wb-F5L" id="GKW-fv-gOQ"/>
                 <outlet property="closeAccountImageView" destination="tXO-N8-CEa" id="8SG-J5-Gxd"/>
                 <outlet property="closeAccountLabel" destination="C2d-c1-mrd" id="oYy-9e-mqM"/>
                 <outlet property="emailLabel" destination="Cus-b6-bPl" id="1c8-gF-YXH"/>
+                <outlet property="icon10ImageView" destination="nOF-iL-zm5" id="B5z-Ie-cWA"/>
                 <outlet property="icon1ImageView" destination="Ics-O8-TXw" id="LIU-Ny-4RP"/>
                 <outlet property="icon2ImageView" destination="6sf-ZV-5F4" id="v2m-Pq-2hf"/>
                 <outlet property="icon3ImageView" destination="B0R-9G-G2O" id="AIH-kn-Isf"/>
                 <outlet property="icon4ImageView" destination="pIY-JL-b1q" id="sVH-bD-wef"/>
-                <outlet property="icon5ImageView" destination="nOF-iL-zm5" id="5bH-1S-4ZB"/>
+                <outlet property="icon5ImageView" destination="hnA-cv-Aat" id="j0W-UH-Rby"/>
+                <outlet property="icon6ImageView" destination="pLW-6m-7eV" id="Gpd-fP-jsb"/>
+                <outlet property="icon7ImageView" destination="x82-Va-7XL" id="KJl-1N-9rj"/>
+                <outlet property="icon8ImageView" destination="ZSy-bS-Y5N" id="ge3-vV-NdW"/>
+                <outlet property="icon9ImageView" destination="GPn-Jy-4u9" id="VKE-gA-fV5"/>
                 <outlet property="iconBox" destination="t60-Rf-slE" id="ZAK-Ur-Xtr"/>
                 <outlet property="iconView1" destination="jXd-gD-DUM" id="JaT-3D-khU"/>
-                <outlet property="iconView2" destination="Z7T-fU-CU5" id="H7b-Ie-1K2"/>
+                <outlet property="iconView2" destination="v1h-r9-dBQ" id="thC-TC-OVI"/>
+                <outlet property="iconView3" destination="DeW-Iv-IzB" id="eYI-RA-WIc"/>
+                <outlet property="iconView4" destination="Z7T-fU-CU5" id="Q6b-tu-Tg9"/>
                 <outlet property="lockedBackgroud" destination="uEq-Mo-zJU" id="d4Q-Vm-l3Y"/>
                 <outlet property="lockedImageView" destination="wcT-k3-31w" id="wHQ-RN-sc9"/>
                 <outlet property="lockedLabel" destination="Yp0-r5-Zyn" id="jNX-dC-Fjg"/>
                 <outlet property="membershipLabel" destination="gGn-tS-WsW" id="1I5-50-bap"/>
+                <outlet property="number1ImageView" destination="5md-dc-o6U" id="NmQ-pX-esg"/>
                 <outlet property="number1Label" destination="3Lv-MN-obu" id="3vH-6p-wk7"/>
                 <outlet property="number2Label" destination="1xg-TB-Y3K" id="5Y7-gd-Lkh"/>
                 <outlet property="number3Label" destination="IbY-zZ-3eY" id="fzG-y7-GG3"/>
@@ -139,11 +148,15 @@
                         <rect key="frame" x="0.0" y="0.0" width="335" height="250"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
+                            <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4aL-rJ-kZA">
+                                <rect key="frame" x="0.0" y="0.0" width="335" height="250"/>
+                                <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="odU-R3-m9L"/>
+                            </imageView>
                             <customView translatesAutoresizingMaskIntoConstraints="NO" id="l0E-Jy-WiT">
                                 <rect key="frame" x="20" y="80" width="295" height="146"/>
                                 <subviews>
                                     <customView translatesAutoresizingMaskIntoConstraints="NO" id="M5x-Un-8s5">
-                                        <rect key="frame" x="20" y="98" width="255" height="24"/>
+                                        <rect key="frame" x="0.0" y="122" width="295" height="24"/>
                                         <subviews>
                                             <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gGn-tS-WsW">
                                                 <rect key="frame" x="-2" y="4" width="37" height="16"/>
@@ -206,9 +219,9 @@
                                         </constraints>
                                     </customView>
                                     <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="i59-vk-E69">
-                                        <rect key="frame" x="20" y="0.0" width="255" height="86"/>
+                                        <rect key="frame" x="0.0" y="0.0" width="295" height="110"/>
                                         <view key="contentView" id="gIt-eM-0Hd">
-                                            <rect key="frame" x="0.0" y="0.0" width="255" height="86"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="295" height="110"/>
                                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                         </view>
                                     </box>
@@ -216,11 +229,11 @@
                                 <constraints>
                                     <constraint firstItem="i59-vk-E69" firstAttribute="top" secondItem="M5x-Un-8s5" secondAttribute="bottom" constant="12" id="AHh-Z0-JMe"/>
                                     <constraint firstAttribute="bottom" secondItem="i59-vk-E69" secondAttribute="bottom" id="HsX-4p-5Ql"/>
-                                    <constraint firstItem="M5x-Un-8s5" firstAttribute="leading" secondItem="l0E-Jy-WiT" secondAttribute="leading" constant="20" id="NGY-al-TJB"/>
+                                    <constraint firstItem="M5x-Un-8s5" firstAttribute="leading" secondItem="l0E-Jy-WiT" secondAttribute="leading" id="NGY-al-TJB"/>
                                     <constraint firstItem="i59-vk-E69" firstAttribute="leading" secondItem="M5x-Un-8s5" secondAttribute="leading" id="NsF-Y1-t6w"/>
-                                    <constraint firstAttribute="trailing" secondItem="M5x-Un-8s5" secondAttribute="trailing" constant="20" id="OWd-Yp-Dwo"/>
+                                    <constraint firstAttribute="trailing" secondItem="M5x-Un-8s5" secondAttribute="trailing" id="OWd-Yp-Dwo"/>
                                     <constraint firstAttribute="height" constant="146" id="YvW-Dl-djO"/>
-                                    <constraint firstItem="M5x-Un-8s5" firstAttribute="top" secondItem="l0E-Jy-WiT" secondAttribute="top" constant="24" id="aty-iB-1Sb"/>
+                                    <constraint firstItem="M5x-Un-8s5" firstAttribute="top" secondItem="l0E-Jy-WiT" secondAttribute="top" id="aty-iB-1Sb"/>
                                     <constraint firstItem="i59-vk-E69" firstAttribute="trailing" secondItem="M5x-Un-8s5" secondAttribute="trailing" id="fEa-dl-89Q"/>
                                 </constraints>
                             </customView>
@@ -237,11 +250,15 @@
                         </subviews>
                         <constraints>
                             <constraint firstItem="l0E-Jy-WiT" firstAttribute="top" secondItem="XIf-JW-n7T" secondAttribute="top" constant="24" id="49m-9F-OVA"/>
+                            <constraint firstAttribute="bottom" secondItem="4aL-rJ-kZA" secondAttribute="bottom" id="Cea-ml-eHo"/>
                             <constraint firstItem="JDC-Jw-Qew" firstAttribute="trailing" secondItem="l0E-Jy-WiT" secondAttribute="trailing" id="Jf6-Mt-yWb"/>
                             <constraint firstItem="l0E-Jy-WiT" firstAttribute="leading" secondItem="XIf-JW-n7T" secondAttribute="leading" constant="20" id="Ve3-QE-5Gb"/>
+                            <constraint firstItem="4aL-rJ-kZA" firstAttribute="top" secondItem="XIf-JW-n7T" secondAttribute="top" id="W2r-ol-5py"/>
                             <constraint firstAttribute="trailing" secondItem="l0E-Jy-WiT" secondAttribute="trailing" constant="20" id="gVb-3g-f7q"/>
                             <constraint firstItem="JDC-Jw-Qew" firstAttribute="leading" secondItem="l0E-Jy-WiT" secondAttribute="leading" id="jGc-0e-fm3"/>
                             <constraint firstItem="JDC-Jw-Qew" firstAttribute="top" secondItem="l0E-Jy-WiT" secondAttribute="bottom" constant="24" id="k3f-dk-Sn2"/>
+                            <constraint firstAttribute="trailing" secondItem="4aL-rJ-kZA" secondAttribute="trailing" id="wmf-ei-gL9"/>
+                            <constraint firstItem="4aL-rJ-kZA" firstAttribute="leading" secondItem="XIf-JW-n7T" secondAttribute="leading" id="wtB-gr-9tk"/>
                         </constraints>
                     </view>
                     <constraints>
@@ -597,8 +614,8 @@
                             <rect key="frame" x="0.0" y="0.0" width="77" height="42"/>
                             <subviews>
                                 <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1xg-TB-Y3K">
-                                    <rect key="frame" x="20" y="13" width="37" height="16"/>
-                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="BjT-9Y-iWk">
+                                    <rect key="frame" x="-2" y="13" width="81" height="16"/>
+                                    <textFieldCell key="cell" alignment="center" title="Label" id="BjT-9Y-iWk">
                                         <font key="font" usesAppearanceFont="YES"/>
                                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -607,7 +624,9 @@
                             </subviews>
                             <constraints>
                                 <constraint firstItem="1xg-TB-Y3K" firstAttribute="centerY" secondItem="ze2-xr-PdX" secondAttribute="centerY" id="Enc-tX-3zX"/>
+                                <constraint firstItem="1xg-TB-Y3K" firstAttribute="leading" secondItem="ze2-xr-PdX" secondAttribute="leading" id="Huh-Dr-dgG"/>
                                 <constraint firstItem="1xg-TB-Y3K" firstAttribute="centerX" secondItem="ze2-xr-PdX" secondAttribute="centerX" id="Tkj-Ma-QMd"/>
+                                <constraint firstAttribute="trailing" secondItem="1xg-TB-Y3K" secondAttribute="trailing" id="pH8-vI-ws4"/>
                             </constraints>
                         </customView>
                     </subviews>
@@ -630,8 +649,8 @@
                             <rect key="frame" x="0.0" y="0.0" width="77" height="42"/>
                             <subviews>
                                 <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IbY-zZ-3eY">
-                                    <rect key="frame" x="20" y="13" width="37" height="16"/>
-                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="n6X-fr-0ua">
+                                    <rect key="frame" x="-2" y="13" width="81" height="16"/>
+                                    <textFieldCell key="cell" alignment="center" title="Label" id="n6X-fr-0ua">
                                         <font key="font" usesAppearanceFont="YES"/>
                                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -641,7 +660,9 @@
                             <constraints>
                                 <constraint firstItem="IbY-zZ-3eY" firstAttribute="centerX" secondItem="89K-8f-Pew" secondAttribute="centerX" id="Mtq-ag-k25"/>
                                 <constraint firstAttribute="height" constant="42" id="ZIw-HR-m8s"/>
+                                <constraint firstAttribute="trailing" secondItem="IbY-zZ-3eY" secondAttribute="trailing" id="erg-6q-pHN"/>
                                 <constraint firstItem="IbY-zZ-3eY" firstAttribute="centerY" secondItem="89K-8f-Pew" secondAttribute="centerY" id="hSx-wO-FJl"/>
+                                <constraint firstItem="IbY-zZ-3eY" firstAttribute="leading" secondItem="89K-8f-Pew" secondAttribute="leading" id="vgv-ij-879"/>
                             </constraints>
                         </customView>
                         <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="t60-Rf-slE">
@@ -689,8 +710,8 @@
                             <rect key="frame" x="0.0" y="0.0" width="77" height="42"/>
                             <subviews>
                                 <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MZb-0e-sV1">
-                                    <rect key="frame" x="20" y="13" width="37" height="16"/>
-                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="llq-2h-fj6">
+                                    <rect key="frame" x="-2" y="13" width="81" height="16"/>
+                                    <textFieldCell key="cell" alignment="center" title="Label" id="llq-2h-fj6">
                                         <font key="font" usesAppearanceFont="YES"/>
                                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -698,8 +719,10 @@
                                 </textField>
                             </subviews>
                             <constraints>
+                                <constraint firstAttribute="trailing" secondItem="MZb-0e-sV1" secondAttribute="trailing" id="JcY-6R-wc3"/>
                                 <constraint firstItem="MZb-0e-sV1" firstAttribute="centerX" secondItem="O6K-wF-0oc" secondAttribute="centerX" id="L8P-oi-nXY"/>
                                 <constraint firstItem="MZb-0e-sV1" firstAttribute="centerY" secondItem="O6K-wF-0oc" secondAttribute="centerY" id="Uvr-Eq-aBE"/>
+                                <constraint firstItem="MZb-0e-sV1" firstAttribute="leading" secondItem="O6K-wF-0oc" secondAttribute="leading" id="chw-H9-7Fv"/>
                             </constraints>
                         </customView>
                     </subviews>
@@ -792,6 +815,74 @@
             </constraints>
             <point key="canvasLocation" x="63.5" y="1070.5"/>
         </customView>
+        <customView id="v1h-r9-dBQ">
+            <rect key="frame" x="0.0" y="0.0" width="77" height="60"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="hnA-cv-Aat">
+                    <rect key="frame" x="0.0" y="20" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="7g9-f4-1MH"/>
+                        <constraint firstAttribute="width" constant="20" id="zmC-eE-KKk"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="kEC-He-lnV"/>
+                </imageView>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="pLW-6m-7eV">
+                    <rect key="frame" x="29" y="20" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="Ffp-aL-GuT"/>
+                        <constraint firstAttribute="width" constant="20" id="p33-Sj-rJb"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="t7M-mt-e8c"/>
+                </imageView>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="x82-Va-7XL">
+                    <rect key="frame" x="57" y="20" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="Hul-bC-XeU"/>
+                        <constraint firstAttribute="width" constant="20" id="xrZ-Wu-ZmY"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="xCM-ai-F7H"/>
+                </imageView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="pLW-6m-7eV" firstAttribute="centerX" secondItem="v1h-r9-dBQ" secondAttribute="centerX" id="26Y-Lz-6Xj"/>
+                <constraint firstItem="hnA-cv-Aat" firstAttribute="centerY" secondItem="v1h-r9-dBQ" secondAttribute="centerY" id="8iR-df-46e"/>
+                <constraint firstItem="pLW-6m-7eV" firstAttribute="centerY" secondItem="v1h-r9-dBQ" secondAttribute="centerY" id="9jJ-hn-Xp1"/>
+                <constraint firstAttribute="trailing" secondItem="x82-Va-7XL" secondAttribute="trailing" id="VUb-gI-lny"/>
+                <constraint firstItem="x82-Va-7XL" firstAttribute="centerY" secondItem="v1h-r9-dBQ" secondAttribute="centerY" id="oQ1-hz-1Zz"/>
+                <constraint firstItem="hnA-cv-Aat" firstAttribute="leading" secondItem="v1h-r9-dBQ" secondAttribute="leading" id="x2d-Km-hps"/>
+            </constraints>
+            <point key="canvasLocation" x="63.5" y="1173"/>
+        </customView>
+        <customView id="DeW-Iv-IzB">
+            <rect key="frame" x="0.0" y="0.0" width="77" height="60"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ZSy-bS-Y5N">
+                    <rect key="frame" x="0.0" y="20" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="20" id="Ubf-07-kht"/>
+                        <constraint firstAttribute="height" constant="20" id="dwc-AB-kDp"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="4hx-KA-aR1"/>
+                </imageView>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="GPn-Jy-4u9">
+                    <rect key="frame" x="57" y="20" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="20" id="I2e-wa-ORi"/>
+                        <constraint firstAttribute="height" constant="20" id="rhX-Wh-9iB"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="pfe-j7-dKW"/>
+                </imageView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="ZSy-bS-Y5N" firstAttribute="centerY" secondItem="DeW-Iv-IzB" secondAttribute="centerY" id="Cgb-eP-GhK"/>
+                <constraint firstItem="ZSy-bS-Y5N" firstAttribute="leading" secondItem="DeW-Iv-IzB" secondAttribute="leading" id="KPL-uR-dl4"/>
+                <constraint firstAttribute="trailing" secondItem="GPn-Jy-4u9" secondAttribute="trailing" id="aIS-1r-3v3"/>
+                <constraint firstItem="GPn-Jy-4u9" firstAttribute="centerY" secondItem="DeW-Iv-IzB" secondAttribute="centerY" id="tZe-42-NzY"/>
+            </constraints>
+            <point key="canvasLocation" x="63.5" y="1281"/>
+        </customView>
         <customView id="Z7T-fU-CU5">
             <rect key="frame" x="0.0" y="0.0" width="77" height="57"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
@@ -809,7 +900,7 @@
                 <constraint firstItem="nOF-iL-zm5" firstAttribute="centerY" secondItem="Z7T-fU-CU5" secondAttribute="centerY" id="0VO-XK-1Du"/>
                 <constraint firstItem="nOF-iL-zm5" firstAttribute="centerX" secondItem="Z7T-fU-CU5" secondAttribute="centerX" id="ENj-AS-aMF"/>
             </constraints>
-            <point key="canvasLocation" x="64" y="1189"/>
+            <point key="canvasLocation" x="64" y="1393"/>
         </customView>
     </objects>
 </document>

+ 36 - 15
PDF Office/PDF Master/MemberCenter/ViewModel/KMSignUpViewModel.swift

@@ -99,8 +99,6 @@ class KMSignUpViewModel: ObservableObject {
             }
     }
     
-    // MARK: Public Method
-    
     /**
      邮件 错误提示文案
      */
@@ -120,7 +118,6 @@ class KMSignUpViewModel: ObservableObject {
         }
         return false
     }
-
     
     // MARK: Private Method
     
@@ -141,6 +138,21 @@ class KMSignUpViewModel: ObservableObject {
         let regex = try! NSRegularExpression(pattern: pattern)
         return regex.firstMatch(in: verificationCode, options: [], range: NSRange(location: 0, length: verificationCode.utf16.count)) != nil
     }
+    
+    /**
+     @abstract 刷新用户个人信息
+     */
+    private func refreshUserInfo() -> Void {
+        KMUserInfoVCModel().refreshUserInfo { success, msg in
+            if success {
+                KMMemberInfo.shared.isLogin = true
+            } else {
+                KMMemberInfo.shared.isLogin = false
+            }
+        }
+        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "MemberCenterLoginSuccess"), object: nil)
+    }
+
         
     // MARK: Action Method
     
@@ -175,23 +187,32 @@ class KMSignUpViewModel: ObservableObject {
                 return
             }
         }
-        KMMemberCenterManager.manager.emailLogin(email: email, code: code) { [weak self] error, wrapper  in
+        KMMemberCenterManager.manager.emailLogin(email: email, code: code) { [weak self] success, wrapper  in
             guard let self = self else { return }
             let resultDict = wrapper! as KMMemberCenterResult
             let msg = resultDict.msg
-            if error {
-                print("错误信息:%@", msg as Any)
-            } else {
-                if resultDict.code == 200 {
-                    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
+            if success {
+                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
+                if self.stayState {
+                    UserDefaults.standard.setValue(refresh_token, forKey: "MemberRefreshToken")
+                    UserDefaults.standard.setValue(access_token, forKey: "MemberAccessToken")
+                    UserDefaults.standard.synchronize()
                 } else {
-                    print("错误信息:%@", msg as Any)
+                    UserDefaults.standard.setValue("", forKey: "MemberRefreshToken")
+                    UserDefaults.standard.setValue("", forKey: "MemberAccessToken")
+                    UserDefaults.standard.synchronize()
                 }
+                KMMemberInfo.shared.refresh_token = refresh_token!
+                KMMemberInfo.shared.access_token = access_token!
+                KMMemberInfo.shared.token_type = token_type!
+                self.refreshUserInfo()
+            } else {
+                print("错误信息:%@", msg as Any)
             }
         }
     }

+ 87 - 3
PDF Office/PDF Master/MemberCenter/ViewModel/KMUserInfoVCModel.swift

@@ -10,13 +10,97 @@ import Combine
 
 @objc enum KMUserState : Int {
     case unPay_UnTrial = 0      // 未付费且未试用
-    case trial                  // 试用阶段
-    case buyOut                 // 买断用户
-    case automatic              // 自动续订
+    case permanentAccount       // 永久账户用户
     case unAutomatic_RemainValid// 取消自动续费,但仍在有效期内
     case expired                // 已到期用户
 }
 
+typealias UserInfoComplete = (_ success: Bool,_ msg: String) -> Void
+
 class KMUserInfoVCModel: ObservableObject {
     
+    /**
+     @abstract 刷新个人权益
+     @param
+     */
+    func refreshUserInfo(_ complete: @escaping UserInfoComplete) -> Void {
+        KMMemberCenterManager.manager.userInfo { success, result in
+            guard let result = result else { return }
+            let resultDict = result as KMMemberCenterResult
+            let msg = resultDict.msg
+            if success {
+                let userInfo = resultDict.userInfo
+                guard let userInfo = resultDict.userInfo else { return }
+                KMMemberInfo.shared.memberUserInfo(model: userInfo)
+                complete(true, "")
+            } else {
+                complete(false, "")
+            }
+        }
+    }
+    
+    /**
+     @abstract 刷新用户状态 0(未付费且未试用)、1(永久账户用户)、2(取消自动续费,但仍在有效期内)、3(已到期用户)
+     @param
+     */
+    func refreshUserState() -> KMUserState {
+        
+        return .unPay_UnTrial
+    }
+    
+    /**
+     @abstract 根据用户支持的平台返回外部视图需要的平台图片数组
+     @param
+     */
+    func getPlatformsImages() -> [NSImage] {
+        var images: [NSImage] = []
+        for platform in userPlatforms() {
+            if refreshUserState() == .permanentAccount ||
+                refreshUserState() == .unAutomatic_RemainValid {
+                if platform == "mac" {
+                    images.append(NSImage(named: "MacOSPlatformImage2")!)
+                } else if platform == "ios" {
+                    images.append(NSImage(named: "iOSPlatformImage2")!)
+                } else if platform == "windows" {
+                    images.append(NSImage(named: "WindowsPlatformImage2")!)
+                } else if platform == "android" {
+                    images.append(NSImage(named: "AndroidPlatformImage2")!)
+                }
+            } else {
+                if platform == "mac" {
+                    images.append(NSImage(named: "MacOSPlatformImage")!)
+                } else if platform == "ios" {
+                    images.append(NSImage(named: "iOSPlatformImage")!)
+                } else if platform == "windows" {
+                    images.append(NSImage(named: "WindowsPlatformImage")!)
+                } else if platform == "android" {
+                    images.append(NSImage(named: "AndroidPlatformImage")!)
+                }
+            }
+        }
+        return images
+    }
+    
+    /**
+     @abstract 获取用户支持的最大设备数
+     @param
+     */
+    private func maxDeviceNum() -> Int {
+        
+        return 4
+//        return 0
+    }
+    
+    /**
+     @abstract 用户支持的平台
+     @param
+     */
+    private func userPlatforms() -> [String] {
+        let platforms = "android, ios, mac, windows"
+        let platformsArray = platforms
+            .components(separatedBy: ",")
+            .map { $0.trimmingCharacters(in: .whitespaces) }
+        return platformsArray
+    }
+
 }

+ 18 - 1
PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.swift

@@ -7,6 +7,7 @@
 
 import Cocoa
 
+@objcMembers
 class KMLoginWindowsController: NSWindowController {
     
     @IBOutlet weak var leftBox: NSBox!
@@ -14,7 +15,14 @@ class KMLoginWindowsController: NSWindowController {
     
     @IBOutlet weak var rightBox: NSBox!
     
-    var memberInfo: KMMemberInfo = KMMemberInfo.defaultManager
+    var memberInfo: KMMemberInfo = KMMemberInfo.shared
+    
+    private static var _existFlag = false
+    static let shared: KMLoginWindowsController = {
+        let windowC = KMLoginWindowsController(windowNibName: "KMLoginWindowsController")
+        return windowC
+    }()
+
 
     override func windowDidLoad() {
         super.windowDidLoad()
@@ -24,8 +32,11 @@ class KMLoginWindowsController: NSWindowController {
 //        window?.titleVisibility = .visible
         
         initializeUI()
+        
+        NotificationCenter.default.addObserver(self, selector: #selector(loginSuccessNotification), name: NSNotification.Name(rawValue: "MemberCenterLoginSuccess"), object: nil)
     }
     
+    
     // MARK: Private Action
     
     private func initializeUI() -> Void {
@@ -40,4 +51,10 @@ class KMLoginWindowsController: NSWindowController {
         }
     }
     
+    // MARK: public Action
+    
+    @objc func loginSuccessNotification() -> Void {
+        window?.close()
+    }
+    
 }

+ 1 - 2
PDF Office/PDF Master/MemberCenter/WindowsController/KMLoginWindowsController.xib

@@ -17,8 +17,7 @@
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
-            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
-            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <windowStyleMask key="styleMask" titled="YES" closable="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"/>