无故事王国
2024-07-26 e6636384e031aab3c38710c5d996c2e0d54e8860
fix bug
10个文件已修改
1116 ■■■■ 已修改文件
WanPai.xcodeproj/project.pbxproj 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Common/View/PaymentView.swift 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Info.plist 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/NetworkRequest.swift 572 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/View/CommonDatePickerView.swift 391 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareVC.swift 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareVC.xib 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/WanPaiDebug.entitlements 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/WanPaiRelease.entitlements 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai.xcodeproj/project.pbxproj
@@ -2193,7 +2193,7 @@
                CODE_SIGN_ENTITLEMENTS = WanPai/WanPaiDebug.entitlements;
                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                CODE_SIGN_STYLE = Manual;
                CURRENT_PROJECT_VERSION = 11;
                CURRENT_PROJECT_VERSION = 12;
                DEVELOPMENT_TEAM = "";
                "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 2MWV8K39DV;
                FRAMEWORK_SEARCH_PATHS = (
@@ -2222,7 +2222,7 @@
                    "$(inherited)",
                    "$(PROJECT_DIR)/WanPai/YYPaymentManager/WeChatPay",
                );
                MARKETING_VERSION = 2.0.0;
                MARKETING_VERSION = 2.0.2;
                OTHER_LDFLAGS = (
                    "$(inherited)",
                    "-ObjC",
@@ -2357,7 +2357,7 @@
                CODE_SIGN_ENTITLEMENTS = WanPai/WanPaiRelease.entitlements;
                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
                CODE_SIGN_STYLE = Manual;
                CURRENT_PROJECT_VERSION = 11;
                CURRENT_PROJECT_VERSION = 12;
                DEVELOPMENT_TEAM = "";
                "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 2MWV8K39DV;
                FRAMEWORK_SEARCH_PATHS = (
@@ -2386,7 +2386,7 @@
                    "$(inherited)",
                    "$(PROJECT_DIR)/WanPai/YYPaymentManager/WeChatPay",
                );
                MARKETING_VERSION = 2.0.0;
                MARKETING_VERSION = 2.0.2;
                OTHER_LDFLAGS = (
                    "$(inherited)",
                    "-ObjC",
WanPai/Common/View/PaymentView.swift
@@ -79,6 +79,7 @@
                                sceneDelegate?.window?.addSubview(paymentView)
                                paymentView.cons_bottom.constant = 0
                                //添加支付方式: 如果为空,则为免费
                                var customType = [PayType]()
                                if !paymentView.view_alipay.isHidden{customType.append(.aliPay)}
                                if !paymentView.view_wechat.isHidden{customType.append(.wechat)}
@@ -143,7 +144,7 @@
                @IBAction func paymentAction(_ sender: UIButton) {
                                //场地,游戏,门票 可免费,根据上面的金额,展示了哪些条目判断,如果都没展示,金额全部会是0
                                switch paymentEnumType {
                                                case .yard,.game:
                                                case .yard,.game,.worldCup:
                                                                if payType == nil && customType.count == 0{
                                                                                payType = .coin
                                                                }else{
WanPai/Info.plist
@@ -40,6 +40,7 @@
        <string>iosamap</string>
        <string>qqmap</string>
        <string>googlemap</string>
        <string>openapp.jdmobile</string>
    </array>
    <key>NSAppTransportSecurity</key>
    <dict>
WanPai/Network/NetworkRequest.swift
@@ -1,10 +1,10 @@
    //
    //  NetworkRequest.swift
    //  HandyJSON
    //
    //  Created by Sweet on 2018/12/25.
    //  Copyright © 2018 Sweet. All rights reserved.
    //
//
//  NetworkRequest.swift
//  HandyJSON
//
//  Created by Sweet on 2018/12/25.
//  Copyright © 2018 Sweet. All rights reserved.
//
import Foundation
import SwifterSwift
@@ -13,12 +13,12 @@
import RxSwift
import SVProgressHUD
    // 假设这是服务端返回的统一定义的response格式
// 假设这是服务端返回的统一定义的response格式
struct BaseResponse<T :HandyJSON>: HandyJSON {
    var sysTime: Int = 0
    var code: Int = -1 // 服务端返回码
    var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义
    var msg: String = ""
                var sysTime: Int = 0
                var code: Int = -1 // 服务端返回码
                var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义
                var msg: String = ""
}
struct BaseResponseList<T :HandyJSON>: HandyJSON {
@@ -27,27 +27,27 @@
}
struct BaseData<T: HandyJSON>: HandyJSON {
    var records = [T]()
                var records = [T]()
}
struct SimpleModel: HandyJSON {
}
struct HtmlModel: HandyJSON {
    var  content = ""
    var  content1 = ""
    var id = 0
    var type =  0
                var  content = ""
                var  content1 = ""
                var id = 0
                var type =  0
}
extension String: HandyJSON{
}
extension Array: HandyJSON{
}
extension Bool: HandyJSON{
}
extension Int: HandyJSON{
@@ -55,360 +55,222 @@
}
class ParamsAppender: NSObject {
    var url: URL
    var params:Dictionary = [String: Any]()
    private init(url: String){
        self.url = URL(string: url)!
    }
                var url: URL
                var params:Dictionary = [String: Any]()
    @discardableResult
    func interface(url: String) -> ParamsAppender {
        self.url.appendPathComponent(url)
        return self
    }
//    @discardableResult
//    func append(key: String,value: String) -> ParamsAppender {
//        if value.isEmpty{return self}
//        params += ["\(key)":"\(value)"]
//        return self
//    }
    @discardableResult
    func append(key: String,value: Bool) -> ParamsAppender {
        params += ["\(key)":"\(value)"]
        return self
    }
    @discardableResult
    func append(key: String,value: String?) -> ParamsAppender {
        if value != nil && value?.isEmpty == false {
            params += ["\(key)":"\(value!)"]
        }
        return self
    }
    @discardableResult
    func append(key: String,value: Array<String>) -> ParamsAppender {
        if value.isEmpty == false {
            params += ["\(key)":value]
        }
        return self
    }
    @discardableResult
    func append(key: String, value: Int?) -> ParamsAppender {
        if value != nil{
            params += ["\(key)":value!]
        }
        return self
    }
    @discardableResult
    func append(key: String, value: Int64) -> ParamsAppender {
        params += ["\(key)":value]
        return self
    }
    @discardableResult
    func append(key: String, value: Double?) -> ParamsAppender {
        if value != nil{
            params += ["\(key)":value!]
        }
        return self
    }
    @discardableResult
    func append(key: String,data: Data?) -> ParamsAppender {
        if data != nil{
            params += ["\(key)": data!]
        }
        return self
    }
    @discardableResult
    func append(key: String,url: URL) -> ParamsAppender {
        params += ["\(key)":"\(url)"]
        return self
    }
    @discardableResult
    func append(dic: [String : Any]) -> ParamsAppender {
        params += dic
        return self
    }
    /// 参数加密
    @discardableResult
    func done() -> Parameters {
        var paramsArray: [String] = []
            // 排序
        let sortedArray: [String] = Array(params.keys).sorted()
            //防止自签名而错误
        if !sortedArray.contains("sign"){
            for item in sortedArray{
                    // 拼接字符串
                if params.has(key: item){
                    paramsArray.append("\(item)=\(params[item]!)")
                private init(url: String){
                                self.url = URL(string: url)!
                }
            }
            let content = paramsArray.joined(separator: "&")
            params += ["sign": "\(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))"]
                @discardableResult
                func interface(url: String) -> ParamsAppender {
                                self.url.appendPathComponent(url)
                                return self
                }
                //    @discardableResult
                //    func append(key: String,value: String) -> ParamsAppender {
                //        if value.isEmpty{return self}
                //        params += ["\(key)":"\(value)"]
                //        return self
                //    }
                @discardableResult
                func append(key: String,value: Bool) -> ParamsAppender {
                                params += ["\(key)":"\(value)"]
                                return self
                }
                @discardableResult
                func append(key: String,value: String?) -> ParamsAppender {
                                if value != nil && value?.isEmpty == false {
                                                params += ["\(key)":"\(value!)"]
                                }
                                return self
                }
                @discardableResult
                func append(key: String,value: Array<String>) -> ParamsAppender {
                                if value.isEmpty == false {
                                                params += ["\(key)":value]
                                }
                                return self
                }
                @discardableResult
                func append(key: String, value: Int?) -> ParamsAppender {
                                if value != nil{
                                                params += ["\(key)":value!]
                                }
                                return self
                }
                @discardableResult
                func append(key: String, value: Int64) -> ParamsAppender {
                                params += ["\(key)":value]
                                return self
                }
                @discardableResult
                func append(key: String, value: Double?) -> ParamsAppender {
                                if value != nil{
                                                params += ["\(key)":value!]
                                }
                                return self
                }
                @discardableResult
                func append(key: String,data: Data?) -> ParamsAppender {
                                if data != nil{
                                                params += ["\(key)": data!]
                                }
                                return self
                }
                @discardableResult
                func append(key: String,url: URL) -> ParamsAppender {
                                params += ["\(key)":"\(url)"]
                                return self
                }
                @discardableResult
                func append(dic: [String : Any]) -> ParamsAppender {
                                params += dic
                                return self
                }
                /// 参数加密
                @discardableResult
                func done() -> Parameters {
                                var paramsArray: [String] = []
                                // 排序
                                let sortedArray: [String] = Array(params.keys).sorted()
                                //防止自签名而错误
                                if !sortedArray.contains("sign"){
                                                for item in sortedArray{
                                                                // 拼接字符串
                                                                if params.has(key: item){
                                                                                paramsArray.append("\(item)=\(params[item]!)")
                                                                }
                                                }
                                                let content = paramsArray.joined(separator: "&")
                                                params += ["sign": "\(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))"]
#if DEBUG
            LogInfo("签名:\(content) ----- \(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))")
                                                LogInfo("签名:\(content) ----- \(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))")
#endif
        }
        return self.params
    }
    class func build(url: String) -> ParamsAppender {
        return ParamsAppender(url: url)
    }
                                }
                                return self.params
                }
                class func build(url: String) -> ParamsAppender {
                                return ParamsAppender(url: url)
                }
}
class NetworkRequest {
    static let sharedSessionManager: Alamofire.Session = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 10
        return Alamofire.Session(configuration: configuration)
    }()
    enum NetRequestError: Error {
        case Other(Int,String)
        case URLNotFound
        case DownloadFailed
        case InvaildSession
        case ModelError(String)
        case DataAnalysis(String)
    }
    class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod,  encoding: ParameterEncoding? = nil, progress: Bool = true,ignoreAlert:Bool = false) -> Observable<BaseResponse<T>>{
        return Observable<BaseResponse<T>>.create{ ob in
            guard NetworkReachabilityManager.init(host: All_Url)!.isReachable else {
                alertError(msg: "当前网络不可用")
                ob.onError(AFError.invalidURL(url: params.url))
                return Disposables.create{}
            }
                static let sharedSessionManager: Alamofire.Session = {
                                let configuration = URLSessionConfiguration.default
                                configuration.timeoutIntervalForRequest = 10
                                return Alamofire.Session(configuration: configuration)
                }()
                enum NetRequestError: Error {
                                case Other(Int,String)
                                case URLNotFound
                                case DownloadFailed
                                case InvaildSession
                                case ModelError(String)
                                case DataAnalysis(String)
                }
            if progress {showHUD()}
                class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod,  encoding: ParameterEncoding? = nil, progress: Bool = true,ignoreAlert:Bool = false) -> Observable<BaseResponse<T>>{
            var headers = HTTPHeaders()
            if let token = UserViewModel.getToken(){
                headers.add(name: "Authorization", value: "Bearer" + " " + token)
                LogInfo("USER_token:Bearer \(token)")
            }
                                return Observable<BaseResponse<T>>.create{ ob in
                                                guard NetworkReachabilityManager.init(host: All_Url)!.isReachable else {
//                                                                alertError(msg: "当前网络不可用")
                                                                ob.onError(AFError.invalidURL(url: params.url))
                                                                return Disposables.create{}
                                                }
            if encoding is JSONEncoding {
                headers.add(name: "Content-Type", value: "application/json;charset=UTF-8")
            }
                                                if progress {showHUD()}
            var newEncoding: ParameterEncoding
            if encoding != nil {
                newEncoding = encoding!
            } else {
                newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
            }
            sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in
                LogInfo("请求地址:\(params.url)")
                LogInfo("请求参数:\(params.params)")
                hiddenHUD(0.5)
                                                var headers = HTTPHeaders()
                                                if let token = UserViewModel.getToken(){
                                                                headers.add(name: "Authorization", value: "Bearer" + " " + token)
                                                                LogInfo("USER_token:Bearer \(token)")
                                                }
                guard response.error == nil else {
                    LogError("\(response.error!)")
                                                if encoding is JSONEncoding {
                                                                headers.add(name: "Content-Type", value: "application/json;charset=UTF-8")
                                                }
                    var errorString = ""
                    errorString.append("服务器故障:\(response.error!.localizedDescription)")
                    if let code = response.error?.responseCode{
                        errorString.append("\n【错误码:\(code)】")
                    }
                    if !ignoreAlert{
                        alert(msg: errorString)
                    }
                    ob.onError(response.error!)
                    return
                }
                if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
                    LogResponse(try! JSONSerialization.jsonObject(with: data))
                    if let next = BaseResponse<T>.deserialize(from: jsonString){
                        switch next.code{
                            case 200:ob.onNext(next)
                            case 501:
                                CommonAlertView.show(title: "提示", content: next.msg,isSingle: true) { _ in
                                                var newEncoding: ParameterEncoding
                                                if encoding != nil {
                                                                newEncoding = encoding!
                                                } else {
                                                                newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
                                                }
                                                sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in
                                                                LogInfo("请求地址:\(params.url)")
                                                                LogInfo("请求参数:\(params.params)")
                                                                hiddenHUD(0.5)
                                                                guard response.error == nil else {
                                                                                LogError("\(response.error!)")
                                                                                var errorString = ""
                                                                                errorString.append("服务器故障:\(response.error!.localizedDescription)")
                                                                                if let code = response.error?.responseCode{
                                                                                                errorString.append("\n【错误码:\(code)】")
                                                                                }
                                                                                if !ignoreAlert{
                                                                                                alert(msg: errorString)
                                                                                }
                                                                                ob.onError(response.error!)
                                                                                return
                                                                }
                                                                if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
                                                                                LogResponse(try! JSONSerialization.jsonObject(with: data))
                                                                                if let next = BaseResponse<T>.deserialize(from: jsonString){
                                                                                                switch next.code{
                                                                                                                case 200:ob.onNext(next)
                                                                                                                case 501:
                                                                                                                                CommonAlertView.show(title: "提示", content: next.msg,isSingle: true) { _ in
                                                                                                                                }
                                                                                                                                ob.onError(NetRequestError.InvaildSession)
                                                                                                                case 600:
                                                                                                                                if !ignoreAlert{
                                                                                                                                                alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession)
                                                                                                                                }
                                                                                                                                app.needLogin()
                                                                                                                default:
                                                                                                                                if !ignoreAlert{
                                                                                                                                                alertError(msg: "\(next.msg)")
                                                                                                                                }
                                                                                                                                ob.onError(NetRequestError.Other(next.code,next.msg))
                                                                                                }
                                                                                }
                                                                }
                                                                ob.onCompleted()
                                                }
                                                return Disposables.create{}
                                }
                                ob.onError(NetRequestError.InvaildSession)
                            case 600:
                                if !ignoreAlert{
                                    alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession)
                                }
                                app.needLogin()
                            default:
                                if !ignoreAlert{
                                    alertError(msg: "\(next.msg)")
                                }
                                ob.onError(NetRequestError.Other(next.code,next.msg))
                        }
                    }
                }
                ob.onCompleted()
            }
            return Disposables.create{}
        }
    }
//    class func requestData(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<Data>{
//        return Observable<Data>.create{ ob in
//            if progress {
//                SVProgressHUD.show()
//            }
//
//            var headers = HTTPHeaders()
//                //            if let token = UserViewModel.getUserInfo()?.token {
//                //                headers.add(name: "Authorization", value: "Bearer" + " " + token)
//                //                LogInfo("USER_token:\(token)")
//                //            }
//            if encoding is JSONEncoding {
//                headers.add(name: "Content-Type", value: "application/json;charset=UTF-8")
//            }
//
//            var newEncoding: ParameterEncoding
//            if encoding != nil {
//                newEncoding = encoding!
//            } else {
//                newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
//            }
//
//            sharedSessionManager.request(params.url.absoluteString, method: method, parameters: params.done(), encoding: newEncoding, headers: headers).validate().responseData{response in
//                LogInfo("请求地址:\(params.url)")
//                LogInfo("请求参数:\(params.params)")
//                SVProgressHUD.dismiss()
//                if response.error != nil {
//                    LogError("\(response.error!)")
//                    ob.onError(response.error!)
//                }else if let data = response.data{
//                    LogInfo("返回数据:\(data)")
//                    ob.onNext(data)
//                }
//                ob.onCompleted()
//            }
//            return Disposables.create{}
//        }
//    }
//
//        /// 带code请求的
//        /// - Parameters:
//        ///   - params: <#params description#>
//        ///   - method: <#method description#>
//        ///   - progress: <#progress description#>
//        /// - Returns: <#description#>
//    class func requestCode<T: HandyJSON>(params: ParamsAppender,method: HTTPMethod,progress: Bool = true) -> Observable<BaseResponse<T>>{
//        return Observable<BaseResponse<T>>.create{ ob in
//            if progress {
//                SVProgressHUD.show()
//            }
//            sharedSessionManager.request(params.url.absoluteString, method: method, parameters:
//                                            params.done(),encoding: URLEncoding.default).validate().responseData{response in
//                LogInfo("请求地址:\(params.url)")
//                LogInfo("请求参数:\(params.params)")
//                if response.error != nil {
//                    SVProgressHUD.dismiss()
//                    LogInfo("\(response.error!)")
//                    ob.onError(response.error!)
//                }else if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
//
//                    SVProgressHUD.dismiss()
//                    LogInfo("返回数据:\(jsonString)")
//                    if let next = BaseResponse<T>.deserialize(from: jsonString){
//                        ob.onNext(next)
//                    }else{
//                        SVProgressHUD.dismiss()
//                            //                            alert(msg: "请求失败")
//                        LogInfo("error")
//                    }
//                }else{
//                    SVProgressHUD.dismiss()
//                        //                        alert(msg: "请求失败")
//                    LogInfo("Netrequest-Tag:No data")
//                }
//                ob.onCompleted()
//            }
//            return Disposables.create{}
//        }
//    }
//        /// 上传
//        /// - Parameter params: <#params description#>
//    class func upload<T: HandyJSON>(params: ParamsAppender) -> Observable<BaseResponse<T>> {
//        return Observable<BaseResponse<T>>.create{ob in
//                //            let hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
//                //            hud.bezelView.style = .solidColor
//                //            hud.contentColor = .white
//                //            hud.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
//                //            hud.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
//                //            hud.removeFromSuperViewOnHide = true
//
//            var headers = HTTPHeaders()
//                //            if let token = UserViewModel.getUserInfo()?.token {
//                //                headers.add(name: "Authorization", value: "Bearer" + " " + token)
//                //                LogInfo("USER_token:\(token)")
//                //            }
//
//
//            AF.upload(multipartFormData: { data in
//                let p = params
//                LogInfo("Netrequest-Upload-Starting.")
//                for key in p.params{
//                    if let d = key.value as? Data {
//                        LogInfo("Netrequest-Upload-Appending-Data: Length = \(d.count) bytes")
//
//                        data.append(d, withName: key.key, fileName: "\(Date().timeIntervalSince1970).png", mimeType: "image/png")
//                    } else if let url = key.value as? URL {
//                        LogInfo("Netrequest-Upload-Appending-Data: Url = \(url)")
//                        data.append(url, withName: key.key)
//                    }
//                }
//            }, to: params.url, method: .post, headers: headers) .uploadProgress(queue: .main, closure: { progress in
//                    //                progressClosure(progress.fractionCompleted)
//            }).responseJSON(completionHandler: { data in
//                print("upload finished: \(data)")
//
//            }).response { (response) in
//
//                    //                hud.hide(animated: true)
//                switch response.result {
//                    case .success(let dataObj):
//                            //                    alert(msg: "上传成功")
//                        let jsonString = String(data: dataObj ?? Data(), encoding: String.Encoding.utf8)
//                        if let next = BaseResponse<T>.deserialize(from: jsonString){
//                            ob.onNext(next)
//                        }
//                    case .failure(let err):
//                        alert(msg: "上传失败")
//                        print("upload err: \(err)")
//                }
//
//            }
//            return Disposables.create{
//
//            }
//
//        }
//    }
                }
}
extension Dictionary {
    mutating func append(dict: Dictionary) {
        dict.forEach { (key, value) in
            self.updateValue(value, forKey: key)
        }
    }
                mutating func append(dict: Dictionary) {
                                dict.forEach { (key, value) in
                                                self.updateValue(value, forKey: key)
                                }
                }
}
func createError(text:String,code:Int)->AFError{
    return AFError.createURLRequestFailed(error: NSError(domain: text, code: code))
                return AFError.createURLRequestFailed(error: NSError(domain: text, code: code))
}
WanPai/Network/Services.swift
@@ -68,7 +68,7 @@
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 启动本地游戏
                /// 启动本地游戏【未使用】
                class func game_gameStart(gameId:Int,spaceId:Int,sutuId:Int,userID:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/gameStart")
@@ -80,7 +80,7 @@
                                return NetworkRequest.request(params: params, method: .post, encoding: JSONEncoding.default, progress: false)
                }
                /// 开门
                /// 开门 【未使用】
                class func game_OpenDoorCode(userID:Int)->Observable<BaseResponse<DoorModel>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/getOpenDoorCode")
WanPai/Root/Other/View/CommonDatePickerView.swift
@@ -1,231 +1,242 @@
    //
    //  CommonDatePickerView.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/6/27.
    //
//
//  CommonDatePickerView.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/6/27.
//
import UIKit
import JQTools
class CommonDatePickerView: UIView,JQNibView{
    enum DatePickerType{
        case YMD,YM,HHmm
    }
                enum DatePickerType{
                                case YMD,YM,HHmm
                }
    @IBOutlet weak var view_container: UIView!
    @IBOutlet weak var cons_bottom: NSLayoutConstraint!
    @IBOutlet weak var pickerView: UIPickerView!
    private var type:DatePickerType!
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var cons_bottom: NSLayoutConstraint!
                @IBOutlet weak var pickerView: UIPickerView!
                private var type:DatePickerType!
    private var years = [Int]()
    private var months = [12,11,10,9,8,7,6,5,4,3,2,1]
    private var hours = [Int]()
    private var minutes = [Int]()
    private var days = [Int]()
    private var clouse:((Int?,Int?,Int?,Int?,Int?)->Void)?
                private var years = [Int]()
                private var months = [12,11,10,9,8,7,6,5,4,3,2,1]
                private var hours = [Int]()
                private var minutes = [Int]()
                private var days = [Int]()
                private var clouse:((Int?,Int?,Int?,Int?,Int?)->Void)?
    override func awakeFromNib() {
        super.awakeFromNib()
        cons_bottom.constant = -(JQ_ScreenW * 0.6974)
        alpha = 0
        layoutIfNeeded()
        pickerView.delegate = self
        pickerView.dataSource = self
    }
                override func awakeFromNib() {
                                super.awakeFromNib()
                                cons_bottom.constant = -(JQ_ScreenW * 0.6974)
                                alpha = 0
                                layoutIfNeeded()
                                pickerView.delegate = self
                                pickerView.dataSource = self
                }
        /// 初始化
        /// - Parameters:
        ///   - before: 向上N年
        ///   - after: 向下N年
        ///   - type: 显示状态
    static func show(before:Int = 0,after:Int = 0,type:DatePickerType = .YM,clouse:@escaping (Int?,Int?,Int?,Int?,Int?)->Void){
        let pickerView = CommonDatePickerView.jq_loadNibView()
        pickerView.type = type
        pickerView.clouse = clouse
                /// 初始化
                /// - Parameters:
                ///   - before: 向上N年
                ///   - after: 向下N年
                ///   - type: 显示状态
                static func show(before:Int = 0,after:Int = 0,type:DatePickerType = .YM,clouse:@escaping (Int?,Int?,Int?,Int?,Int?)->Void){
                                let pickerView = CommonDatePickerView.jq_loadNibView()
                                pickerView.type = type
                                pickerView.clouse = clouse
        if type == .YM || type == .YMD{
            if before > 0{
                for i in 0...before{
                    pickerView.years.append(Date().jq_nowYear() - i)
                }
            }
                                if type == .YM || type == .YMD{
                                                if before > 0{
                                                                for i in 0...before{
                                                                                pickerView.years.append(Date().jq_nowYear() - i)
                                                                }
                                                }
            if after > 0{
                for i in 0...after{
                    pickerView.years.append(Date().jq_nowYear() + i)
                }
            }
        }
                                                if after > 0{
                                                                for i in 0...after{
                                                                                pickerView.years.append(Date().jq_nowYear() + i)
                                                                }
                                                }
                                }
        if type == .HHmm{
            for i in 0...24{
                pickerView.hours.append(i)
            }
                                if type == .HHmm{
                                                for i in 0...24{
                                                                pickerView.hours.append(i)
                                                }
            for i in 0...59{
                pickerView.minutes.append(i)
            }
        }
                                                for i in 0...59{
                                                                pickerView.minutes.append(i)
                                                }
                                }
                                pickerView.frame = sceneDelegate?.window?.frame ?? .zero
                                sceneDelegate?.window?.addSubview(pickerView)
                                pickerView.cons_bottom.constant = 0
                                UIView.animate(withDuration: 0.4) {
                                                pickerView.alpha = 1
                                                pickerView.layoutIfNeeded()
                                }
                                pickerView.pickerView.reloadAllComponents()
                }
                @IBAction func hiddenAction(_ sender: UIButton) {
                                cons_bottom.constant = -(JQ_ScreenW * 0.6974)
                                UIView.animate(withDuration: 0.4) {
                                                self.alpha = 0
                                                self.layoutIfNeeded()
                                } completion: { _ in
                                                self.removeFromSuperview()
                                }
                }
                @IBAction func completeAction(_ sender: UIButton) {
        pickerView.frame = sceneDelegate?.window?.frame ?? .zero
        sceneDelegate?.window?.addSubview(pickerView)
                                var year:Int?
                                var month:Int?
                                var day:Int?
                                var hour:Int?
                                var minute:Int?
        pickerView.cons_bottom.constant = 0
        UIView.animate(withDuration: 0.4) {
            pickerView.alpha = 1
            pickerView.layoutIfNeeded()
        }
                                switch type{
                                                case .YMD:
                                                                year = years[pickerView.selectedRow(inComponent: 0)]
                                                                if year == Date().jq_nowYear(){
                                                                                month = months[pickerView.selectedRow(inComponent: 1)] - (12 - Date().jq_nowMonth())
                                                                }else{
                                                                                month = months[pickerView.selectedRow(inComponent: 1)]
                                                                }
                                                                day = pickerView.selectedRow(inComponent: 2) + 1
                                                case .YM:
                                                                year = years[pickerView.selectedRow(inComponent: 0)]
                                                                if year == Date().jq_nowYear(){
                                                                                month = months[pickerView.selectedRow(inComponent: 1)] - (12 - Date().jq_nowMonth())
                                                                }else{
                                                                                month = months[pickerView.selectedRow(inComponent: 1)]
                                                                }
                                                case .HHmm:
                                                                hour = hours[pickerView.selectedRow(inComponent: 0)]
                                                                minute = minutes[pickerView.selectedRow(inComponent: 1)]
                                                case .none:break
                                }
        pickerView.pickerView.reloadAllComponents()
    }
    @IBAction func hiddenAction(_ sender: UIButton) {
        cons_bottom.constant = -(JQ_ScreenW * 0.6974)
        UIView.animate(withDuration: 0.4) {
            self.alpha = 0
            self.layoutIfNeeded()
        } completion: { _ in
            self.removeFromSuperview()
        }
    }
    @IBAction func completeAction(_ sender: UIButton) {
        var year:Int?
        var month:Int?
        var day:Int?
        var hour:Int?
        var minute:Int?
        switch type{
            case .YMD:
                year = years[pickerView.selectedRow(inComponent: 0)]
                month = months[pickerView.selectedRow(inComponent: 1)]
                day = pickerView.selectedRow(inComponent: 2) + 1
            case .YM:
                year = years[pickerView.selectedRow(inComponent: 0)]
                month = months[pickerView.selectedRow(inComponent: 1)]
            case .HHmm:
                hour = hours[pickerView.selectedRow(inComponent: 0)]
                minute = minutes[pickerView.selectedRow(inComponent: 1)]
            case .none:break
        }
        cons_bottom.constant = -(JQ_ScreenW * 0.6974)
        UIView.animate(withDuration: 0.4) {
            self.alpha = 0
            self.layoutIfNeeded()
        } completion: { _ in
            self.removeFromSuperview()
            self.clouse?(year,month,day,hour,minute)
        }
    }
                                cons_bottom.constant = -(JQ_ScreenW * 0.6974)
                                UIView.animate(withDuration: 0.4) {
                                                self.alpha = 0
                                                self.layoutIfNeeded()
                                } completion: { _ in
                                                self.removeFromSuperview()
                                                self.clouse?(year,month,day,hour,minute)
                                }
                }
    override func layoutSubviews() {
        super.layoutSubviews()
        view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20)
    }
                override func layoutSubviews() {
                                super.layoutSubviews()
                                view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20)
                }
}
extension CommonDatePickerView:UIPickerViewDelegate{
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0{
            pickerView.reloadComponent(1)
            if type == .YMD{pickerView.reloadComponent(2)}
        }
        if component == 1{
            if type == .YMD{pickerView.reloadComponent(2)}
        }
    }
                func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
                                if component == 0{
                                                pickerView.reloadComponent(1)
                                                if type == .YMD{pickerView.reloadComponent(2)}
                                }
                                if component == 1{
                                                if type == .YMD{pickerView.reloadComponent(2)}
                                }
                }
}
extension CommonDatePickerView:UIPickerViewDataSource{
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
                func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if component == 0{
            switch type{
                case .YM,.YMD:return years.count
                case .HHmm:return hours.count
                case .none:return 0
            }
        }
                                if component == 0{
                                                switch type{
                                                                case .YM,.YMD:return years.count
                                                                case .HHmm:return hours.count
                                                                case .none:return 0
                                                }
                                }
        if component == 1{
            switch type{
                case .YM,.YMD:
                    if component == 1 && pickerView.selectedRow(inComponent: 0) == 0{
                        return Date().jq_nowMonth()
                    }
                    return months.count
                case .HHmm:
                    return minutes.count
                case .none:
                    return 0
            }
        }
                                if component == 1{
                                                switch type{
                                                                case .YM,.YMD:
                                                                                if component == 1 && pickerView.selectedRow(inComponent: 0) == 0{
                                                                                                return Date().jq_nowMonth()
                                                                                }
                                                                                return months.count
                                                                case .HHmm:
                                                                                return minutes.count
                                                                case .none:
                                                                                return 0
                                                }
                                }
        if component == 2{
            switch type{
                case .YMD:
                    let year = years[pickerView.selectedRow(inComponent: 0)]
                    let month = months[pickerView.selectedRow(inComponent: 1)]
                                if component == 2{
                                                switch type{
                                                                case .YMD:
                                                                                let year = years[pickerView.selectedRow(inComponent: 0)]
                                                                                let month = months[pickerView.selectedRow(inComponent: 1)]
                    if year == Date().jq_nowYear() && month == Date().jq_nowMonth(){
                        return Date().jq_nowDay()
                    }else{
                        return Date.jq_getDays(year, month)
                    }
                default:return 0
            }
        }
                                                                                if year == Date().jq_nowYear() && month == Date().jq_nowMonth(){
                                                                                                return Date().jq_nowDay()
                                                                                }else{
                                                                                                return Date.jq_getDays(year, month)
                                                                                }
                                                                default:return 0
                                                }
                                }
        return 0
    }
                                return 0
                }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        switch type{
            case .YM,.HHmm:return 2
            case .YMD:return 3
            case .none:return 0
        }
    }
                func numberOfComponents(in pickerView: UIPickerView) -> Int {
                                switch type{
                                                case .YM,.HHmm:return 2
                                                case .YMD:return 3
                                                case .none:return 0
                                }
                }
    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 55
    }
                func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
                                return 55
                }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0{
            switch type{
                case .YM,.YMD:return "\(years[row])年"
                case .HHmm:return String(format: "%02ld时", hours[row])
                default:return nil
            }
        }
                func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
                                if component == 0{
                                                switch type{
                                                                case .YM,.YMD:return "\(years[row])年"
                                                                case .HHmm:return String(format: "%02ld时", hours[row])
                                                                default:return nil
                                                }
                                }
        if component == 1{
            switch type{
                case .YM,.YMD:return "\(months[row])月"
                case .HHmm:return String(format: "%02ld分", minutes[row])
                default:return nil
            }
        }
                                if component == 1{
                                                switch type{
                                                                case .YM,.YMD:
                                                                                if pickerView.selectedRow(inComponent: 0) == 0{
                                                                                                return "\(11 - Date().jq_nowMonth() - row - 1)月"
                                                                                }
                                                                                return "\(months[row])月"
                                                                case .HHmm:return String(format: "%02ld分", minutes[row])
                                                                default:return nil
                                                }
                                }
        if component == 2{
            switch type{
                case .YMD:return "\(row + 1)日"
                default:return nil
            }
        }
                                if component == 2{
                                                switch type{
                                                                case .YMD:return "\(row + 1)日"
                                                                default:return nil
                                                }
                                }
        return nil
    }
                                return nil
                }
}
WanPai/Root/Welfare/VC/WelfareVC.swift
@@ -21,6 +21,7 @@
                @IBOutlet weak var scrollView: UIScrollView!
                @IBOutlet weak var coinCollectionView: UICollectionView!
                @IBOutlet weak var btn_coupon: UIButton!
                @IBOutlet weak var btn_shopping: UIButton!
                //    @IBOutlet weak var btn_shoppping: UIButton!
                //    @IBOutlet weak var btn_weekly: UIButton!
                //    @IBOutlet weak var btn_todayFree: UIButton!
@@ -73,6 +74,11 @@
                                                                                self?.btn_coupon.sd_setImage(with: URL(string: coupon), for: .normal, placeholderImage: nil,context: nil)
                                                                }
                                                                if let onlineShop = model.image?.onlineShop{
                                                                                self?.btn_shopping.sd_setImage(with: URL(string: onlineShop), for: .normal, placeholderImage: nil,context: nil)
                                                                }
                                                                if let weeksBenefit = model.image?.weeksBenefit{
                                                                                //                    self?.btn_weekly.sd_setImage(with: URL(string: weeksBenefit), for: .normal, placeholderImage: nil, context: nil)
                                                                }
@@ -94,6 +100,23 @@
                @IBAction func billAction(_ sender: UIButton) {
                                let vc = WelfareBillListVC()
                                push(vc: vc)
                }
                @IBAction func shoppingAction(_ sender: UIButton) {
                                CommonAlertView.show(title: "提示", content: "即将打开京东,是否继续?") { status in
                                                if status{
                                                                if UIApplication.shared.canOpenURL(URL(string: "openApp.jdMobile://")!){
                                                                                let url = "openApp.jdMobile://virtual?params={\"category\":\"jump\",\"des\":\"jshopMain\",\"shopId\":\"15995015\",\"sourceType\":\"APP\",\"sourceValue\":\"1000\",\"landPageId\":\"iOS\"}"
                                                                                UIApplication.shared.open(URL(string: url)!)
                                                                }else{
                                                                                let url = "https://shop.m.jd.com/shop/home?shopId=15995015"
                                                                                UIApplication.shared.open(URL(string: url)!)
                                                                }
                                                }
                                }
                }
                @IBAction func couponsAction(_ sender: UIButton) {
@@ -128,11 +151,11 @@
                                }
                }
                @IBAction func storeAction(_ sender: Any) {
                                let vc = CoinStoreCenterVC()
                                vc.benefitHomeModel = benefitHomeModel
                                push(vc: vc)
                }
//                @IBAction func storeAction(_ sender: Any) {
//                                let vc = CoinStoreCenterVC()
//                                vc.benefitHomeModel = benefitHomeModel
//                                push(vc: vc)
//                }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .lightContent
WanPai/Root/Welfare/VC/WelfareVC.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -12,6 +12,7 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WelfareVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="btn_coupon" destination="Kte-Xd-tVd" id="Xg6-k9-w88"/>
                <outlet property="btn_shopping" destination="D6T-vb-qxm" id="Xh1-D1-Qbr"/>
                <outlet property="btn_vip" destination="6lk-Nd-Tug" id="fed-2F-KP6"/>
                <outlet property="coinCollectionView" destination="yBw-of-rdU" id="g6s-C7-Axj"/>
                <outlet property="img_userProfile" destination="7GZ-X8-dwC" id="nYH-xs-aFt"/>
@@ -31,7 +32,7 @@
                    <rect key="frame" x="0.0" y="59" width="393" height="759"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1kO-ug-2Gd">
                            <rect key="frame" x="0.0" y="0.0" width="393" height="715"/>
                            <rect key="frame" x="0.0" y="0.0" width="393" height="1123"/>
                            <subviews>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qtJ-Db-Js8">
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="152"/>
@@ -235,29 +236,78 @@
                                        <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
                                    </collectionViewFlowLayout>
                                </collectionView>
                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我的券包" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GiC-Xf-dhQ">
                                    <rect key="frame" x="30" y="389" width="65.333333333333329" height="22"/>
                                    <constraints>
                                        <constraint firstAttribute="height" constant="22" id="egh-AJ-1Zh"/>
                                    </constraints>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <nil key="textColor"/>
                                    <nil key="highlightedColor"/>
                                </label>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="-55" translatesAutoresizingMaskIntoConstraints="NO" id="3kA-cL-Ed9">
                                    <rect key="frame" x="0.0" y="422" width="393" height="283"/>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="65" translatesAutoresizingMaskIntoConstraints="NO" id="3kA-cL-Ed9">
                                    <rect key="frame" x="0.0" y="399" width="393" height="714"/>
                                    <subviews>
                                        <button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Kte-Xd-tVd">
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="283"/>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="X4v-IX-hDR">
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="324.33333333333331"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我的券包" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GiC-Xf-dhQ">
                                                    <rect key="frame" x="30" y="0.0" width="65.333333333333329" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="egh-AJ-1Zh"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Kte-Xd-tVd">
                                                    <rect key="frame" x="0.0" y="41" width="393" height="283"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" secondItem="Kte-Xd-tVd" secondAttribute="height" multiplier="1:0.72" id="9pS-AQ-07b"/>
                                                    </constraints>
                                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                    <connections>
                                                        <action selector="couponsAction:" destination="-1" eventType="touchUpInside" id="DXv-od-Hy1"/>
                                                    </connections>
                                                </button>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstAttribute="width" secondItem="Kte-Xd-tVd" secondAttribute="height" multiplier="1:0.72" id="9pS-AQ-07b"/>
                                                <constraint firstItem="GiC-Xf-dhQ" firstAttribute="leading" secondItem="X4v-IX-hDR" secondAttribute="leading" constant="30" id="Dec-YC-3qM"/>
                                                <constraint firstItem="Kte-Xd-tVd" firstAttribute="top" secondItem="GiC-Xf-dhQ" secondAttribute="bottom" constant="19" id="HAU-iu-rUs"/>
                                                <constraint firstItem="Kte-Xd-tVd" firstAttribute="leading" secondItem="X4v-IX-hDR" secondAttribute="leading" id="JPC-1V-Ig8"/>
                                                <constraint firstAttribute="width" secondItem="X4v-IX-hDR" secondAttribute="height" multiplier="1:0.8256" id="hJH-lU-jCy"/>
                                                <constraint firstItem="GiC-Xf-dhQ" firstAttribute="top" secondItem="X4v-IX-hDR" secondAttribute="top" id="xSy-sX-IkY"/>
                                                <constraint firstAttribute="trailing" secondItem="Kte-Xd-tVd" secondAttribute="trailing" id="xTo-qF-TJ3"/>
                                            </constraints>
                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                            <connections>
                                                <action selector="couponsAction:" destination="-1" eventType="touchUpInside" id="DXv-od-Hy1"/>
                                            </connections>
                                        </button>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="okD-Z6-aC0">
                                            <rect key="frame" x="0.0" y="389.33333333333337" width="393" height="324.66666666666663"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="线上商城" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Hzq-tj-g2o">
                                                    <rect key="frame" x="30" y="0.0" width="65.333333333333329" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="xoC-bO-hxC"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="D6T-vb-qxm">
                                                    <rect key="frame" x="0.0" y="41" width="393" height="283"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" secondItem="D6T-vb-qxm" secondAttribute="height" multiplier="1:0.72" id="zKH-g5-bXq"/>
                                                    </constraints>
                                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                    <connections>
                                                        <action selector="shoppingAction:" destination="-1" eventType="touchUpInside" id="6s8-FW-YEn"/>
                                                    </connections>
                                                </button>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="Hzq-tj-g2o" firstAttribute="leading" secondItem="okD-Z6-aC0" secondAttribute="leading" constant="30" id="08z-gj-SzQ"/>
                                                <constraint firstAttribute="trailing" secondItem="D6T-vb-qxm" secondAttribute="trailing" id="2Qz-Ji-mSW"/>
                                                <constraint firstItem="Hzq-tj-g2o" firstAttribute="top" secondItem="okD-Z6-aC0" secondAttribute="top" id="9gD-nA-mY5"/>
                                                <constraint firstItem="D6T-vb-qxm" firstAttribute="leading" secondItem="okD-Z6-aC0" secondAttribute="leading" id="K5r-lx-K63"/>
                                                <constraint firstItem="D6T-vb-qxm" firstAttribute="top" secondItem="Hzq-tj-g2o" secondAttribute="bottom" constant="19" id="dzC-KC-UcZ"/>
                                            </constraints>
                                        </view>
                                    </subviews>
                                    <constraints>
                                        <constraint firstItem="okD-Z6-aC0" firstAttribute="width" secondItem="okD-Z6-aC0" secondAttribute="height" multiplier="1:0.8256" id="1ux-eE-MRG"/>
                                    </constraints>
                                </stackView>
                            </subviews>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
@@ -268,12 +318,10 @@
                                <constraint firstItem="qtJ-Db-Js8" firstAttribute="top" secondItem="1kO-ug-2Gd" secondAttribute="top" id="ArH-VK-Ih1"/>
                                <constraint firstItem="15P-Xn-N3C" firstAttribute="leading" secondItem="1kO-ug-2Gd" secondAttribute="leading" constant="30" id="E7I-5W-IU3"/>
                                <constraint firstAttribute="trailing" secondItem="yBw-of-rdU" secondAttribute="trailing" id="IP4-Gn-Ai6"/>
                                <constraint firstItem="3kA-cL-Ed9" firstAttribute="top" secondItem="GiC-Xf-dhQ" secondAttribute="bottom" constant="11" id="Kru-uw-J4P"/>
                                <constraint firstItem="3kA-cL-Ed9" firstAttribute="leading" secondItem="1kO-ug-2Gd" secondAttribute="leading" id="WeR-P6-ZdV"/>
                                <constraint firstAttribute="trailing" secondItem="3kA-cL-Ed9" secondAttribute="trailing" id="bts-6y-Zk6"/>
                                <constraint firstAttribute="bottom" secondItem="3kA-cL-Ed9" secondAttribute="bottom" constant="10" id="eyB-YC-OJF"/>
                                <constraint firstItem="GiC-Xf-dhQ" firstAttribute="leading" secondItem="1kO-ug-2Gd" secondAttribute="leading" constant="30" id="gY0-D8-1VM"/>
                                <constraint firstItem="GiC-Xf-dhQ" firstAttribute="top" secondItem="yBw-of-rdU" secondAttribute="bottom" constant="17" id="nqA-X1-BoF"/>
                                <constraint firstItem="3kA-cL-Ed9" firstAttribute="top" secondItem="yBw-of-rdU" secondAttribute="bottom" constant="27" id="nHY-om-rxY"/>
                                <constraint firstItem="yBw-of-rdU" firstAttribute="top" secondItem="15P-Xn-N3C" secondAttribute="bottom" constant="9" id="tn6-cH-k2u"/>
                                <constraint firstItem="qtJ-Db-Js8" firstAttribute="leading" secondItem="1kO-ug-2Gd" secondAttribute="leading" id="vz9-lC-ac4"/>
                            </constraints>
@@ -309,7 +357,7 @@
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
        <systemColor name="tertiarySystemGroupedBackgroundColor">
            <color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <color red="0.94901960780000005" green="0.94901960780000005" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </systemColor>
    </resources>
</document>
WanPai/WanPaiDebug.entitlements
@@ -4,7 +4,7 @@
<dict>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>webcredentials:www.weparklife.com/</string>
        <string>webcredentials:www.weparklife.com/app/</string>
    </array>
</dict>
</plist>
WanPai/WanPaiRelease.entitlements
@@ -4,7 +4,7 @@
<dict>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>webcredentials:www.weparklife.com/</string>
        <string>webcredentials:www.weparklife.com/app/</string>
    </array>
</dict>
</plist>