Преглед на файлове

【会员系统】打开DMG弹出引导弹窗视图补充

wanjun преди 4 месеца
родител
ревизия
e379e9ae6e
променени са 15 файла, в които са добавени 1639 реда и са изтрити 0 реда
  1. 38 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Color/101828.colorset/Contents.json
  2. 6 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/Contents.json
  3. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootBackground.imageset/Contents.json
  4. 608 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootBackground.imageset/bg (1) 1.pdf
  5. 608 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootBackground.imageset/bg (1).pdf
  6. 22 0
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootIcon.imageset/Contents.json
  7. BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootIcon.imageset/bg (2) 1.pdf
  8. BIN
      PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootIcon.imageset/bg (2).pdf
  9. 19 0
      PDF Office/PDF Master/MemberCenter/ViewModel/DMG/KMOpenDMGPopBootModel.swift
  10. 97 0
      PDF Office/PDF Master/MemberCenter/WindowsController/DMG/KMOpenDMGPopupBootWC.swift
  11. 176 0
      PDF Office/PDF Master/MemberCenter/WindowsController/DMG/KMOpenDMGPopupBootWC.xib
  12. 1 0
      PDF Office/PDF Master/MemberCenter/WindowsController/KMCloseApplyWC.swift
  13. 1 0
      PDF Office/PDF Master/MemberCenter/WindowsController/KMCloseVerificationWC.swift
  14. 1 0
      PDF Office/PDF Master/MemberCenter/WindowsController/KMMemberPromptWC.swift
  15. 40 0
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

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

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

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

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

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

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

Файловите разлики са ограничени, защото са твърде много
+ 608 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootBackground.imageset/bg (1) 1.pdf


Файловите разлики са ограничени, защото са твърде много
+ 608 - 0
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootBackground.imageset/bg (1).pdf


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

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

BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootIcon.imageset/bg (2) 1.pdf


BIN
PDF Office/PDF Master/MemberCenter/Assets/MemberCenter.xcassets/Image/DMG/OpenBootIcon.imageset/bg (2).pdf


+ 19 - 0
PDF Office/PDF Master/MemberCenter/ViewModel/DMG/KMOpenDMGPopBootModel.swift

@@ -0,0 +1,19 @@
+//
+//  KMOpenDMGPopBootModel.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/11/6.
+//
+
+import Foundation
+
+@objcMembers
+class KMOpenDMGPopBootModel: ObservableObject {
+    func getVipFree() -> Void {
+        
+    }
+    
+    func signUpAction() -> Void {
+        KMLoginWindowsController.shared.showWindow(nil)
+    }
+}

+ 97 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/DMG/KMOpenDMGPopupBootWC.swift

@@ -0,0 +1,97 @@
+//
+//  KMOpenDMGPopupBootWC.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/11/6.
+//  打开DMG时的弹窗引导
+//
+
+import Cocoa
+
+class KMOpenDMGPopupBootWC: NSWindowController {
+    
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var subTitleLabel: NSTextField!
+    @IBOutlet weak var freeBox: KMBox!
+    @IBOutlet weak var freeLabel: NSTextField!
+    @IBOutlet weak var signInTextView: NSTextView!
+    
+    private var viewModel = KMOpenDMGPopBootModel()
+    
+    static let shared: KMOpenDMGPopupBootWC = {
+        let windowC = KMOpenDMGPopupBootWC(windowNibName: "KMOpenDMGPopupBootWC")
+        return windowC
+    }()
+
+    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.
+        
+        languageLocalized()
+        initializeUI()
+    }
+    
+    // MARK: Private Method
+    
+    private func languageLocalized() -> Void {
+        titleLabel.stringValue = NSLocalizedString("Free to Get 7-Day VIP Now!", tableName: "MemberCenterLocalizable", comment: "")
+        subTitleLabel.stringValue = NSLocalizedString("· Use all functions without restrictions", tableName: "MemberCenterLocalizable", comment: "")
+        freeLabel.stringValue = NSLocalizedString("Get 7-Day VIP Free", tableName: "MemberCenterLocalizable", comment: "")
+    }
+    
+    private func initializeUI() -> Void {
+        titleLabel.textColor = NSColor(named: "4982E6")
+        titleLabel.font = NSFont.SFProTextSemiboldFont(24)
+        subTitleLabel.textColor = NSColor(named: "101828")
+        subTitleLabel.font = NSFont.SFProTextRegularFont(14)
+        freeBox.fillColor = NSColor(named: "273C62") ?? .blue
+        freeLabel.textColor = NSColor(named: "FFFFFF")
+        freeLabel.font = NSFont.SFProTextRegularFont(13)
+        signInTextView.isEditable = false
+        signInTextView.isSelectable = true
+        signInTextView.textColor = NSColor.black
+        signInTextView.font = NSFont.SFProTextRegularFont(12)
+        let tipsString = NSLocalizedString("Already have an account? %@", comment: "")
+        let specialOffer = NSLocalizedString("Sign in", comment: "")
+        let fullString = String(format: tipsString, specialOffer)
+        let attributedString = NSMutableAttributedString(string: fullString)
+        let specialOfferRange = (fullString as NSString).range(of: specialOffer)
+        let linkColor = NSColor(named: "4982E6") ?? NSColor.blue
+        let font = NSFont.SFProTextRegularFont(12)
+        attributedString.addAttributes([
+            .foregroundColor: NSColor(named: "42464D") ?? NSColor.black as Any,
+            .font: font
+        ], range: (fullString as NSString).range(of: fullString))
+        attributedString.addAttributes([
+            .foregroundColor: linkColor,
+            .link: "action://openDetail",
+            .font: font
+        ], range: specialOfferRange)
+        signInTextView.textStorage?.setAttributedString(attributedString)
+        signInTextView.delegate = self
+        
+        freeBox.moveCallback =  { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in
+            guard let self = self else { return }
+        }
+        freeBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in
+            guard let self = self else { return }
+            if downEntered {
+                viewModel.getVipFree()
+                self.window?.close()
+            }
+        }
+
+    }
+}
+
+extension KMOpenDMGPopupBootWC: NSTextViewDelegate {
+    func textView(_ textView: NSTextView, clickedOnLink link: Any, at charIndex: Int) -> Bool {
+        if let urlString = link as? String, urlString == "action://openDetail" {
+            print("按钮被点击,打开详细内容")
+            viewModel.signUpAction()
+            self.window?.close()
+        }
+        return false
+    }
+}

+ 176 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/DMG/KMOpenDMGPopupBootWC.xib

@@ -0,0 +1,176 @@
+<?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="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMOpenDMGPopupBootWC" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="freeBox" destination="jx5-Fz-b1I" id="eWz-7k-sZR"/>
+                <outlet property="freeLabel" destination="kFX-dh-o8r" id="EpU-MB-onr"/>
+                <outlet property="signInTextView" destination="sot-Mw-XQF" id="TPh-Th-o9m"/>
+                <outlet property="subTitleLabel" destination="840-5T-fTs" id="oCl-wu-XmN"/>
+                <outlet property="titleLabel" destination="57i-Up-o4T" id="uf5-YP-KsQ"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <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"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="538" height="497"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <value key="minSize" type="size" width="538" height="497"/>
+            <value key="maxSize" type="size" width="538" height="497"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="538" height="497"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="BwP-wX-HC7">
+                        <rect key="frame" x="0.0" y="0.0" width="538" height="497"/>
+                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="OpenBootBackground" id="Gau-0v-ymS"/>
+                    </imageView>
+                    <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="LPZ-J5-zQ1">
+                        <rect key="frame" x="151" y="258" width="236" height="227"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="227" id="17q-0M-Vdt"/>
+                            <constraint firstAttribute="width" constant="236" id="khd-FP-hBg"/>
+                        </constraints>
+                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="OpenBootIcon" id="kFg-QT-7fE"/>
+                    </imageView>
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="VA6-Lb-SSr">
+                        <rect key="frame" x="0.0" y="218" width="538" height="16"/>
+                        <subviews>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="57i-Up-o4T">
+                                <rect key="frame" x="-2" y="0.0" width="542" height="16"/>
+                                <textFieldCell key="cell" alignment="center" title="Label" id="Zyy-Gg-dZ7">
+                                    <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="57i-Up-o4T" firstAttribute="leading" secondItem="VA6-Lb-SSr" secondAttribute="leading" id="1Wr-Fy-1Sz"/>
+                            <constraint firstItem="57i-Up-o4T" firstAttribute="top" secondItem="VA6-Lb-SSr" secondAttribute="top" id="RfR-yY-aYe"/>
+                            <constraint firstAttribute="trailing" secondItem="57i-Up-o4T" secondAttribute="trailing" id="gSc-1A-1D9"/>
+                            <constraint firstAttribute="bottom" secondItem="57i-Up-o4T" secondAttribute="bottom" id="mAB-SP-hia"/>
+                        </constraints>
+                    </customView>
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="0DW-MF-WYY">
+                        <rect key="frame" x="0.0" y="190" width="538" height="16"/>
+                        <subviews>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="840-5T-fTs">
+                                <rect key="frame" x="-2" y="0.0" width="542" height="16"/>
+                                <textFieldCell key="cell" alignment="center" title="Label" id="Pkb-5B-Nk6">
+                                    <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="trailing" secondItem="840-5T-fTs" secondAttribute="trailing" id="Mni-as-dzK"/>
+                            <constraint firstItem="840-5T-fTs" firstAttribute="top" secondItem="0DW-MF-WYY" secondAttribute="top" id="VQL-hO-2Xh"/>
+                            <constraint firstAttribute="bottom" secondItem="840-5T-fTs" secondAttribute="bottom" id="sKV-rf-hbR"/>
+                            <constraint firstItem="840-5T-fTs" firstAttribute="leading" secondItem="0DW-MF-WYY" secondAttribute="leading" id="xdK-N8-95A"/>
+                        </constraints>
+                    </customView>
+                    <box boxType="custom" borderWidth="0.0" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="jx5-Fz-b1I" customClass="KMBox" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                        <rect key="frame" x="183" y="134" width="173" height="32"/>
+                        <view key="contentView" id="Pws-CS-RiZ">
+                            <rect key="frame" x="0.0" y="0.0" width="173" height="32"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kFX-dh-o8r">
+                                    <rect key="frame" x="68" y="8" width="37" height="16"/>
+                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="oNq-bI-EOp">
+                                        <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="trailing" secondItem="kFX-dh-o8r" secondAttribute="trailing" constant="70" id="LRG-s2-iwp"/>
+                                <constraint firstItem="kFX-dh-o8r" firstAttribute="leading" secondItem="Pws-CS-RiZ" secondAttribute="leading" constant="70" id="Mbu-vc-fHg"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstItem="kFX-dh-o8r" firstAttribute="centerY" secondItem="jx5-Fz-b1I" secondAttribute="centerY" id="9h5-8F-nlv"/>
+                            <constraint firstAttribute="height" constant="32" id="r45-KC-pzt"/>
+                        </constraints>
+                    </box>
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="3If-uv-zMj">
+                        <rect key="frame" x="0.0" y="110" width="538" height="16"/>
+                        <subviews>
+                            <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8u9-6z-c22">
+                                <rect key="frame" x="0.0" y="0.0" width="538" height="16"/>
+                                <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="KwX-SL-d0a">
+                                    <rect key="frame" x="0.0" y="0.0" width="538" height="16"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <textView wantsLayer="YES" importsGraphics="NO" richText="NO" verticallyResizable="YES" spellingCorrection="YES" smartInsertDelete="YES" id="sot-Mw-XQF">
+                                            <rect key="frame" x="0.0" y="0.0" width="538" height="16"/>
+                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            <size key="minSize" width="538" height="16"/>
+                                            <size key="maxSize" width="538" height="10000000"/>
+                                            <color key="insertionPointColor" name="textInsertionPointColor" catalog="System" colorSpace="catalog"/>
+                                        </textView>
+                                    </subviews>
+                                </clipView>
+                                <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="jYM-XI-VRo">
+                                    <rect key="frame" x="-100" y="-100" width="225" height="15"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                                <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="3ew-yx-y5y">
+                                    <rect key="frame" x="-100" y="-100" width="15" height="135"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                            </scrollView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="8u9-6z-c22" firstAttribute="top" secondItem="3If-uv-zMj" secondAttribute="top" id="1NC-sW-tet"/>
+                            <constraint firstItem="8u9-6z-c22" firstAttribute="leading" secondItem="3If-uv-zMj" secondAttribute="leading" id="OIF-QL-5bC"/>
+                            <constraint firstAttribute="bottom" secondItem="8u9-6z-c22" secondAttribute="bottom" id="l7K-Q6-Hli"/>
+                            <constraint firstAttribute="trailing" secondItem="8u9-6z-c22" secondAttribute="trailing" id="vaZ-Le-PlL"/>
+                        </constraints>
+                    </customView>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="BwP-wX-HC7" secondAttribute="trailing" id="4E9-dT-bAQ"/>
+                    <constraint firstItem="BwP-wX-HC7" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="Jtj-7L-Pyy"/>
+                    <constraint firstItem="0DW-MF-WYY" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="ONN-f3-y6c"/>
+                    <constraint firstItem="VA6-Lb-SSr" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="Og8-xk-Jf7"/>
+                    <constraint firstAttribute="trailing" secondItem="0DW-MF-WYY" secondAttribute="trailing" id="RNY-MM-hmc"/>
+                    <constraint firstAttribute="trailing" secondItem="3If-uv-zMj" secondAttribute="trailing" id="Sh1-7s-X4s"/>
+                    <constraint firstItem="jx5-Fz-b1I" firstAttribute="top" secondItem="0DW-MF-WYY" secondAttribute="bottom" constant="24" id="WUB-hz-iSH"/>
+                    <constraint firstItem="BwP-wX-HC7" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="aO5-eg-uNy"/>
+                    <constraint firstItem="3If-uv-zMj" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="baN-2B-Wt9"/>
+                    <constraint firstAttribute="bottom" secondItem="BwP-wX-HC7" secondAttribute="bottom" id="dN1-8S-5ep"/>
+                    <constraint firstItem="3If-uv-zMj" firstAttribute="top" secondItem="jx5-Fz-b1I" secondAttribute="bottom" constant="8" id="dN5-XT-PID"/>
+                    <constraint firstItem="jx5-Fz-b1I" firstAttribute="centerX" secondItem="se5-gp-TjO" secondAttribute="centerX" id="f57-s4-yRs"/>
+                    <constraint firstItem="0DW-MF-WYY" firstAttribute="top" secondItem="VA6-Lb-SSr" secondAttribute="bottom" constant="12" id="fWL-SN-ejQ"/>
+                    <constraint firstItem="VA6-Lb-SSr" firstAttribute="top" secondItem="LPZ-J5-zQ1" secondAttribute="bottom" constant="24" id="gkm-H8-zpP"/>
+                    <constraint firstAttribute="trailing" secondItem="VA6-Lb-SSr" secondAttribute="trailing" id="iRu-tS-50u"/>
+                    <constraint firstItem="LPZ-J5-zQ1" firstAttribute="centerX" secondItem="se5-gp-TjO" secondAttribute="centerX" id="jfO-vv-VuK"/>
+                    <constraint firstAttribute="bottom" secondItem="3If-uv-zMj" secondAttribute="bottom" constant="110" id="vDn-cM-zaR"/>
+                    <constraint firstItem="LPZ-J5-zQ1" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="12" id="z1a-T5-vSe"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="139" y="137.5"/>
+        </window>
+    </objects>
+    <resources>
+        <image name="OpenBootBackground" width="538" height="497"/>
+        <image name="OpenBootIcon" width="236" height="257"/>
+    </resources>
+</document>

+ 1 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMCloseApplyWC.swift

@@ -3,6 +3,7 @@
 //  PDF Reader Pro
 //
 //  Created by wanjun on 2024/11/5.
+//  手动撤销申请WindowController
 //
 
 import Cocoa

+ 1 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMCloseVerificationWC.swift

@@ -3,6 +3,7 @@
 //  PDF Reader Pro
 //
 //  Created by wanjun on 2024/11/5.
+//  手动撤销验证码WindowController
 //
 
 import Cocoa

+ 1 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMMemberPromptWC.swift

@@ -3,6 +3,7 @@
 //  PDF Reader Pro
 //
 //  Created by wanjun on 2024/11/4.
+//  会员提示通用WindowController
 //
 
 import Cocoa

+ 40 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -781,6 +781,15 @@
 		9F33C9DC2CDA370D0080D3C2 /* KMCloseApplyWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9D82CDA370D0080D3C2 /* KMCloseApplyWC.xib */; };
 		9F33C9DD2CDA370D0080D3C2 /* KMCloseApplyWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9D82CDA370D0080D3C2 /* KMCloseApplyWC.xib */; };
 		9F33C9DE2CDA370D0080D3C2 /* KMCloseApplyWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9D82CDA370D0080D3C2 /* KMCloseApplyWC.xib */; };
+		9F33C9E22CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E02CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift */; };
+		9F33C9E32CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E02CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift */; };
+		9F33C9E42CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E02CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift */; };
+		9F33C9E52CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9E12CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib */; };
+		9F33C9E62CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9E12CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib */; };
+		9F33C9E72CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F33C9E12CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib */; };
+		9F33C9E92CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E82CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift */; };
+		9F33C9EA2CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E82CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift */; };
+		9F33C9EB2CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F33C9E82CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift */; };
 		9F39B9442A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
 		9F39B9452A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
 		9F39B9462A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
@@ -6039,6 +6048,9 @@
 		9F33C9D02CDA21D70080D3C2 /* KMCloseVerificationWC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMCloseVerificationWC.xib; sourceTree = "<group>"; };
 		9F33C9D72CDA370D0080D3C2 /* KMCloseApplyWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCloseApplyWC.swift; sourceTree = "<group>"; };
 		9F33C9D82CDA370D0080D3C2 /* KMCloseApplyWC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMCloseApplyWC.xib; sourceTree = "<group>"; };
+		9F33C9E02CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMOpenDMGPopupBootWC.swift; sourceTree = "<group>"; };
+		9F33C9E12CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMOpenDMGPopupBootWC.xib; sourceTree = "<group>"; };
+		9F33C9E82CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMOpenDMGPopBootModel.swift; sourceTree = "<group>"; };
 		9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHomeScrollView.swift; sourceTree = "<group>"; };
 		9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPurchaseEmbeddedWindowController.swift; sourceTree = "<group>"; };
 		9F3A48C42C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPurchaseEmbeddedWindowController.xib; sourceTree = "<group>"; };
@@ -9037,6 +9049,23 @@
 			path = "Tab Strip";
 			sourceTree = "<group>";
 		};
+		9F33C9DF2CDB04460080D3C2 /* DMG */ = {
+			isa = PBXGroup;
+			children = (
+				9F33C9E02CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift */,
+				9F33C9E12CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib */,
+			);
+			path = DMG;
+			sourceTree = "<group>";
+		};
+		9F33C9ED2CDB08AA0080D3C2 /* DMG */ = {
+			isa = PBXGroup;
+			children = (
+				9F33C9E82CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift */,
+			);
+			path = DMG;
+			sourceTree = "<group>";
+		};
 		9F4ACEA22CC5F2D2005CF727 /* MemberCenter */ = {
 			isa = PBXGroup;
 			children = (
@@ -9073,6 +9102,7 @@
 				9F33C9D02CDA21D70080D3C2 /* KMCloseVerificationWC.xib */,
 				9F33C9D72CDA370D0080D3C2 /* KMCloseApplyWC.swift */,
 				9F33C9D82CDA370D0080D3C2 /* KMCloseApplyWC.xib */,
+				9F33C9DF2CDB04460080D3C2 /* DMG */,
 			);
 			path = WindowsController;
 			sourceTree = "<group>";
@@ -9323,6 +9353,7 @@
 			children = (
 				9FBD84332CC9DAA20071B9C3 /* KMSignUpViewModel.swift */,
 				9FC3466C2CD35D2800F35823 /* KMUserInfoVCModel.swift */,
+				9F33C9ED2CDB08AA0080D3C2 /* DMG */,
 			);
 			path = ViewModel;
 			sourceTree = "<group>";
@@ -15163,6 +15194,7 @@
 				BB5F8A1C29BB15AD00365ADB /* KMEmailSubWindowController.xib in Resources */,
 				9F221EDA29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */,
 				BBB2ACE02B5943F800098854 /* Quick Start Guide.pdf in Resources */,
+				9F33C9E52CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */,
 				9F33C9CC2CDA05B80080D3C2 /* KMCloseAccountWC.xib in Resources */,
 				9F1FE4E729406E4700E952CA /* COPYING in Resources */,
 				AD7D5CDF2B957693006562CD /* KMBookmarkOutlineFileCellView.xib in Resources */,
@@ -15743,6 +15775,7 @@
 				BBD922342B50D61200DB9585 /* KMRateWindowController.xib in Resources */,
 				ADBC373829CA975B00D93208 /* KMCompatative.xcassets in Resources */,
 				BB4EEF3129763EE7003A3537 /* KMRedactBaseWindowController.xib in Resources */,
+				9F33C9E62CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */,
 				9F33C9CD2CDA05B80080D3C2 /* KMCloseAccountWC.xib in Resources */,
 				BB1B0B082B4FC6E900889528 /* KMGuideCoverView.xib in Resources */,
 				BB6347B12AF1F0BB00F5438E /* KMBatchOperateConvertViewController.xib in Resources */,
@@ -16326,6 +16359,7 @@
 				9F0CB4AC296CF19600007028 /* KMPropertiesPanelListMenuSubVC.xib in Resources */,
 				BB9599C92B3164B40062D346 /* KMRedactPropertiesWindowController.xib in Resources */,
 				ADB2D6FF294882B70029D2B3 /* KMTextFieldStepperView.xib in Resources */,
+				9F33C9E72CDB05010080D3C2 /* KMOpenDMGPopupBootWC.xib in Resources */,
 				9FB221042B18866E00A5B208 /* KMAnnotationSelfSignViewController.xib in Resources */,
 				BB031B802C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */,
 				BB7648EA29ECECBF00931039 /* Color.xcassets in Resources */,
@@ -17531,6 +17565,7 @@
 				BB1BFF8A2AEA4725003EB179 /* KMTableHeaderCell.swift in Sources */,
 				ADAFD9F32AE68A7400F084BC /* KMCreatPDFView.swift in Sources */,
 				ADE86AC82B034CB200414DFA /* KMAddBackgroundView.swift in Sources */,
+				9F33C9E22CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */,
 				BBB9B32E299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization.m in Sources */,
 				BB3198162AC55E6D00107371 /* CPDFDocument+KMExtension.swift in Sources */,
 				BB1B0ADA2B4FC6E900889528 /* KMOpenFileGuideToolbar.swift in Sources */,
@@ -17871,6 +17906,7 @@
 				BB031B5D2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */,
 				9F0201722A1B488C00C9B673 /* KMAITranslationVC.swift in Sources */,
 				9FF816F32AFB18290087EFC5 /* NSGeometry_KMExtensions.swift in Sources */,
+				9F33C9E92CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */,
 				9FDD0F8C2952FCE0000C4DAD /* KMGlobalParser.swift in Sources */,
 				ADAFDA822AEB804B00F084BC /* KMQucikToolCollectionViewItem.swift in Sources */,
 				BB897251294C3F660045787C /* KMMenuTableView.swift in Sources */,
@@ -18213,6 +18249,7 @@
 				BB4BD9CD2909026500A66A65 /* KMRightSideViewController.swift in Sources */,
 				BB1A916B2AFB7868005E5FD8 /* KMConvertWindowController.swift in Sources */,
 				BB276A532B03776000AB5578 /* KMConvertOperationQueue.swift in Sources */,
+				9F33C9EA2CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */,
 				BB8810652B4F74DD00AFA63E /* KMRepeatTrialAlertController.m in Sources */,
 				BB162E8F294FFC0C0088E9D1 /* KMWatermarkPDFView.swift in Sources */,
 				AD9527C7295295110039D2BC /* KMPrintPrinterModel.swift in Sources */,
@@ -19185,6 +19222,7 @@
 				9F1FE49D29406E4700E952CA /* HoverCloseButton.m in Sources */,
 				9F1F82C4292F113A0092C4B4 /* KMHomeDragView.swift in Sources */,
 				BB3A81B12AC2B82A006FC66C /* KMPageSizeTool.swift in Sources */,
+				9F33C9E32CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */,
 				ADAFDA352AE8EE9300F084BC /* KMAdvertisementImage.swift in Sources */,
 				9F1F82CB292F6CF90092C4B4 /* KMPDFInsertPageWindow.swift in Sources */,
 				BB031B6D2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */,
@@ -19447,6 +19485,7 @@
 				ADBC2D13299CCD05006280C8 /* KMTextfieldButton.swift in Sources */,
 				BB162E90294FFC0C0088E9D1 /* KMWatermarkPDFView.swift in Sources */,
 				ADFA8F0B2B579945002595A4 /* KMSearchFindView.swift in Sources */,
+				9F33C9EB2CDB08990080D3C2 /* KMOpenDMGPopBootModel.swift in Sources */,
 				AD3AAD652B0DA3F600DE5FE7 /* KMCompareTextHeaderView.swift in Sources */,
 				BB0A55232A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				AD9527C8295295110039D2BC /* KMPrintPrinterModel.swift in Sources */,
@@ -19828,6 +19867,7 @@
 				9FF816DF2AFA5B8E0087EFC5 /* KMAnnotationTableViewController.swift in Sources */,
 				9F0CB52F298656D900007028 /* KMDesignToken+BorderWidthRight.swift in Sources */,
 				9FF371D72C69B8CA005F9CC5 /* CAreaMeasureInfoWindowController.swift in Sources */,
+				9F33C9E42CDB05010080D3C2 /* KMOpenDMGPopupBootWC.swift in Sources */,
 				ADDEEA602AD39DC500EF675D /* KMSignatureManager.swift in Sources */,
 				BBBE208D2B21649100509C4E /* KMPDFEditWindowController.swift in Sources */,
 				BBA8B7B1293600D70097D183 /* KMPasswordInputWindow.swift in Sources */,