From e4e92ee9bf961d3eb92ec73e6010620dfec7209e Mon Sep 17 00:00:00 2001 From: zeng Date: Tue, 6 May 2025 17:10:49 +0800 Subject: [PATCH] =?UTF-8?q?VIP=E8=B4=AD=E4=B9=B0=EF=BC=8C=E5=90=84?= =?UTF-8?q?=E7=A7=8D=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoviaBox/Base/Extension/Date+SPAdd.swift | 24 +++++++++ .../Base/Networking/API/SPWalletAPI.swift | 53 ++++++++++++++++++- .../Controller/SPMineViewController.swift | 2 + .../Class/Mine/View/SPMineMemberView.swift | 1 + .../Class/Mine/View/SPMineMemberYesView.swift | 13 ++++- .../Player/View/SPPlayerControlView.swift | 3 ++ .../SPCoinOrderRecordViewController.swift | 48 ++++++++++++++++- .../SPConsumptionRecordsViewController.swift | 48 ++++++++++++++++- .../SPRewardCoinsViewController.swift | 47 +++++++++++++++- .../Controller/SPStoreViewController.swift | 13 +++++ .../SPVIPOrderRecordViewController.swift | 46 +++++++++++++++- .../Wallet/Model/SPBuyRecordsModel.swift | 15 ++++++ .../Wallet/Model/SPRechargeRecordModel.swift | 16 ++++++ .../Model/SPRewardCoinsRecordModel.swift | 19 +++++++ .../Wallet/View/SPCoinOrderRecordCell.swift | 12 +++-- .../Wallet/View/SPCoinRechargeView.swift | 12 +++-- .../View/SPConsumptionRecordsCell.swift | 6 +++ .../Wallet/View/SPMemberRechargeView.swift | 10 ++++ .../Class/Wallet/View/SPRewardCoinsCell.swift | 44 ++++++++++++--- .../Wallet/View/SPVIPOrderRecordCell.swift | 12 +++-- MoviaBox/Libs/SPIAPManager/SPIAPManager.swift | 2 +- .../SPIAPManager}/SPIAPOrderModel.swift | 3 ++ .../SPIAPManager}/SPIAPVerifyModel.swift | 0 MoviaBox/Libs/User/SPUserInfo.swift | 2 +- MoviaBox/Source/en.lproj/Localizable.strings | 6 +++ 25 files changed, 430 insertions(+), 27 deletions(-) create mode 100644 MoviaBox/Base/Extension/Date+SPAdd.swift create mode 100644 MoviaBox/Class/Wallet/Model/SPBuyRecordsModel.swift create mode 100644 MoviaBox/Class/Wallet/Model/SPRechargeRecordModel.swift create mode 100644 MoviaBox/Class/Wallet/Model/SPRewardCoinsRecordModel.swift rename MoviaBox/{Thirdparty/JXIAPManager => Libs/SPIAPManager}/SPIAPOrderModel.swift (83%) rename MoviaBox/{Thirdparty/JXIAPManager => Libs/SPIAPManager}/SPIAPVerifyModel.swift (100%) diff --git a/MoviaBox/Base/Extension/Date+SPAdd.swift b/MoviaBox/Base/Extension/Date+SPAdd.swift new file mode 100644 index 0000000..1dea5b4 --- /dev/null +++ b/MoviaBox/Base/Extension/Date+SPAdd.swift @@ -0,0 +1,24 @@ +// +// Date+SPAdd.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/6. +// + +import UIKit + +extension Date { + ///格式化时间 yyyy-MM-dd HH-mm-ss + func format(dateFormat: String) -> String { + let formatter = DateFormatter() + formatter.dateFormat = dateFormat + return formatter.string(from: self) + } + + func dateDifference(date: Date) -> Int { + let dateComponents = Calendar.current.dateComponents([.day], from: self, to: date) + return dateComponents.day ?? 0 + } +} + + diff --git a/MoviaBox/Base/Networking/API/SPWalletAPI.swift b/MoviaBox/Base/Networking/API/SPWalletAPI.swift index 093e80a..92a49b5 100644 --- a/MoviaBox/Base/Networking/API/SPWalletAPI.swift +++ b/MoviaBox/Base/Networking/API/SPWalletAPI.swift @@ -8,6 +8,10 @@ import UIKit class SPWalletAPI: NSObject { + enum BuyType: String { + case coins = "coins" + case vip = "vip" + } ///获取支付模版 static func requestPayTemplate(completer: ((_ model: SPPayTemplateModel?) -> Void)?) { @@ -30,7 +34,12 @@ class SPWalletAPI: NSObject { ] SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in - completer?(response.data) + if let message = response.data?.message, message.count > 0 { + SPToast.show(text: message) + completer?(nil) + } else { + completer?(response.data) + } } } @@ -50,4 +59,46 @@ class SPWalletAPI: NSObject { } } + ///赠币记录 + static func reuqestSendCoinRecord(page: Int, completer: ((_ listModel: SPListModel?) -> Void)?) { + + var param = SPNetworkParameters(path: "/sendCoinList") + param.parameters = [ + "page_size" : 20, + "current_page" : page + ] + SPNetwork.request(parameters: param) { (response: SPNetworkResponse>) in + completer?(response.data) + } + } + + ///充值记录 + static func requestRechargeRecord(buyType: BuyType, page: Int, completer: ((_ listModel: SPListModel?) -> Void)?) { + var param = SPNetworkParameters(path: "/getCustomerOrder") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page, + "buy_type" : buyType.rawValue + ] + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse>) in + completer?(response.data) + } + } + + ///消费购买记录 + static func requestBuyRecords(page: Int, completer: ((_ listModel: SPListModel?) -> Void)?) { + var param = SPNetworkParameters(path: "/getCustomerBuyRecords") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page, + ] + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse>) in + completer?(response.data) + } + } + } diff --git a/MoviaBox/Class/Mine/Controller/SPMineViewController.swift b/MoviaBox/Class/Mine/Controller/SPMineViewController.swift index 20c4069..1941e12 100644 --- a/MoviaBox/Class/Mine/Controller/SPMineViewController.swift +++ b/MoviaBox/Class/Mine/Controller/SPMineViewController.swift @@ -57,6 +57,8 @@ class SPMineViewController: SPViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) + self.headerView.userInfo = SPLoginManager.manager.userInfo + if isHaveEntered { requestData() } diff --git a/MoviaBox/Class/Mine/View/SPMineMemberView.swift b/MoviaBox/Class/Mine/View/SPMineMemberView.swift index 2ac41b8..529456c 100644 --- a/MoviaBox/Class/Mine/View/SPMineMemberView.swift +++ b/MoviaBox/Class/Mine/View/SPMineMemberView.swift @@ -28,6 +28,7 @@ class SPMineMemberView: UIView { var userInfo: SPUserInfo? { didSet { if userInfo?.is_vip == true { + yesView.userInfo = userInfo yesView.isHidden = false noView.isHidden = true bgImageView.image = UIImage(named: "member_bg_image_02") diff --git a/MoviaBox/Class/Mine/View/SPMineMemberYesView.swift b/MoviaBox/Class/Mine/View/SPMineMemberYesView.swift index d3b03a8..b94413d 100644 --- a/MoviaBox/Class/Mine/View/SPMineMemberYesView.swift +++ b/MoviaBox/Class/Mine/View/SPMineMemberYesView.swift @@ -9,6 +9,17 @@ import UIKit class SPMineMemberYesView: UIView { + var userInfo: SPUserInfo? { + didSet { + let date = Date(timeIntervalSince1970: userInfo?.vip_end_time ?? 0) +#if DEBUG + expirationTimeLabel.text = String(format: "VlP expiration time : %@".localized, date.format(dateFormat: "yyyy-MM-dd HH:mm:ss")) +#else + expirationTimeLabel.text = String(format: "VlP expiration time : %@".localized, date.format(dateFormat: "yyyy-MM-dd")) +#endif + + } + } //MARK: UI属性 private lazy var iconImageView: UIImageView = { @@ -59,8 +70,6 @@ class SPMineMemberYesView: UIView { override func layoutSubviews() { super.layoutSubviews() - -// titleLabelGradientLayer.frame = titleLabel.bounds } } diff --git a/MoviaBox/Class/Player/View/SPPlayerControlView.swift b/MoviaBox/Class/Player/View/SPPlayerControlView.swift index 8a5fb5e..b7cadc3 100644 --- a/MoviaBox/Class/Player/View/SPPlayerControlView.swift +++ b/MoviaBox/Class/Player/View/SPPlayerControlView.swift @@ -107,6 +107,9 @@ class SPPlayerControlView: UIView { return button }() + ///锁定视图 +// private lazy var lock + deinit { viewModel?.removeObserver(self, forKeyPath: "isPlaying") NotificationCenter.default.removeObserver(self) diff --git a/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift b/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift index 6dbe6cf..347f40c 100644 --- a/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift @@ -9,12 +9,23 @@ import UIKit class SPCoinOrderRecordViewController: SPViewController { + + private var dataArr: [SPRechargeRecordModel] = [] + private var page: Int = 1 + //MARK: UI属性 private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .plain) tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 70 + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) + tableView.sp_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.sp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } SPCoinOrderRecordCell.registerCell(tableView: tableView) return tableView }() @@ -24,10 +35,21 @@ class SPCoinOrderRecordViewController: SPViewController { super.viewDidLoad() setBackgroundView(isShowGradient: false, bgImage: nil, backgroundColor: .clear) + requestDataArr(page: 1, completer: nil) _setupUI() } - + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: 1) { [weak self] in + self?.tableView.sp_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.sp_endFooterRefreshing() + } + } } @@ -48,11 +70,33 @@ extension SPCoinOrderRecordViewController: UITableViewDelegate, UITableViewDataS func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = SPCoinOrderRecordCell.dequeueReusableCell(tableView: tableView, indexPath: indexPath) + cell.model = self.dataArr[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 10 + return self.dataArr.count + } + +} + +extension SPCoinOrderRecordViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + SPWalletAPI.requestRechargeRecord(buyType: .coins, page: page) { [weak self] listModel in + guard let self = self else { return } + if let list = listModel?.list { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + + self.tableView.reloadData() + } + + completer?() + } } } diff --git a/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift b/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift index 5e1e4eb..2f044c5 100644 --- a/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift @@ -10,6 +10,9 @@ import UIKit ///消费记录 class SPConsumptionRecordsViewController: SPViewController { + private var dataArr: [SPBuyRecordsModel] = [] + private var page: Int = 1 + //MARK: UI属性 private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .plain) @@ -17,6 +20,13 @@ class SPConsumptionRecordsViewController: SPViewController { tableView.dataSource = self tableView.rowHeight = 72 tableView.separatorInset = .init(top: 0, left: 32, bottom: 0, right: 32) + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) + tableView.sp_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.sp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } SPConsumptionRecordsCell.registerCell(tableView: tableView) return tableView }() @@ -27,6 +37,8 @@ class SPConsumptionRecordsViewController: SPViewController { self.edgesForExtendedLayout = .top _setupUI() + + requestDataArr(page: 1, completer: nil) } override func viewWillAppear(_ animated: Bool) { @@ -35,6 +47,18 @@ class SPConsumptionRecordsViewController: SPViewController { setNavigationNormalStyle(backgroundColor: .clear, isTranslucent: true) } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: 1) { [weak self] in + self?.tableView.sp_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.sp_endFooterRefreshing() + } + } } extension SPConsumptionRecordsViewController { @@ -52,10 +76,32 @@ extension SPConsumptionRecordsViewController { extension SPConsumptionRecordsViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = SPConsumptionRecordsCell.dequeueReusableCell(tableView: tableView, indexPath: indexPath) + cell.model = self.dataArr[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 10 + return self.dataArr.count } } + +extension SPConsumptionRecordsViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + SPWalletAPI.requestBuyRecords(page: page) { [weak self] listModel in + guard let self = self else { return } + if let list = listModel?.list { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + + self.tableView.reloadData() + } + + completer?() + } + } + +} diff --git a/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift b/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift index 0c007ef..d98411e 100644 --- a/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift @@ -10,12 +10,22 @@ import UIKit //赠币记录 class SPRewardCoinsViewController: SPViewController { + private var dataArr: [SPRewardCoinsRecordModel] = [] + private var page: Int = 1 + //MARK: UI属性 private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .plain) tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 96 + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) + tableView.sp_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.sp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } SPRewardCoinsCell.registerCell(tableView: tableView) return tableView }() @@ -26,6 +36,8 @@ class SPRewardCoinsViewController: SPViewController { self.edgesForExtendedLayout = .top _setupUI() + + requestDataArr(page: 1, completer: nil) } override func viewWillAppear(_ animated: Bool) { @@ -35,6 +47,17 @@ class SPRewardCoinsViewController: SPViewController { } + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: 1) { [weak self] in + self?.tableView.sp_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.sp_endFooterRefreshing() + } + } } @@ -55,10 +78,32 @@ extension SPRewardCoinsViewController { extension SPRewardCoinsViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = SPRewardCoinsCell.dequeueReusableCell(tableView: tableView, indexPath: indexPath) + cell.model = self.dataArr[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 10 + return self.dataArr.count } } + +extension SPRewardCoinsViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + SPWalletAPI.reuqestSendCoinRecord(page: page) { [weak self] listModel in + guard let self = self else { return } + if let list = listModel?.list { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + + self.tableView.reloadData() + } + + completer?() + } + } + +} diff --git a/MoviaBox/Class/Wallet/Controller/SPStoreViewController.swift b/MoviaBox/Class/Wallet/Controller/SPStoreViewController.swift index 8981ea5..19311b4 100644 --- a/MoviaBox/Class/Wallet/Controller/SPStoreViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPStoreViewController.swift @@ -24,11 +24,18 @@ class SPStoreViewController: SPViewController { private lazy var rechargeView: SPCoinRechargeView = { let view = SPCoinRechargeView() + view.userInfo = SPLoginManager.manager.userInfo + view.rechargeFinishHandle = { [weak self] in + self?.buyFinish() + } return view }() private lazy var memberView: SPMemberRechargeView = { let view = SPMemberRechargeView() + view.buyFinishHandle = { [weak self] in + self?.buyFinish() + } return view }() @@ -80,6 +87,12 @@ extension SPStoreViewController { } + @objc private func buyFinish() { + SPLoginManager.manager.updateUserInfo { [weak self] in + self?.rechargeView.userInfo = SPLoginManager.manager.userInfo + } + } + } extension SPStoreViewController { diff --git a/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift b/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift index a0ee283..a2960bb 100644 --- a/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift @@ -9,12 +9,22 @@ import UIKit class SPVIPOrderRecordViewController: SPViewController { + private var dataArr: [SPRechargeRecordModel] = [] + private var page: Int = 1 + //MARK: UI属性 private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .plain) tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 74 + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) + tableView.sp_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + tableView.sp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in + self?.handleFooterRefresh(nil) + } SPVIPOrderRecordCell.registerCell(tableView: tableView) return tableView }() @@ -24,10 +34,22 @@ class SPVIPOrderRecordViewController: SPViewController { super.viewDidLoad() setBackgroundView(isShowGradient: false, bgImage: nil, backgroundColor: .clear) + requestDataArr(page: 1, completer: nil) + _setupUI() } + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: 1) { [weak self] in + self?.tableView.sp_endHeaderRefreshing() + } + } + override func handleFooterRefresh(_ completer: (() -> Void)?) { + self.requestDataArr(page: self.page + 1) { [weak self] in + self?.tableView.sp_endFooterRefreshing() + } + } } @@ -47,11 +69,33 @@ extension SPVIPOrderRecordViewController: UITableViewDelegate, UITableViewDataSo func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = SPVIPOrderRecordCell.dequeueReusableCell(tableView: tableView, indexPath: indexPath) + cell.model = self.dataArr[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 10 + return self.dataArr.count + } + +} + +extension SPVIPOrderRecordViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)?) { + SPWalletAPI.requestRechargeRecord(buyType: .vip, page: page) { [weak self] listModel in + guard let self = self else { return } + if let list = listModel?.list { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + + self.tableView.reloadData() + } + + completer?() + } } } diff --git a/MoviaBox/Class/Wallet/Model/SPBuyRecordsModel.swift b/MoviaBox/Class/Wallet/Model/SPBuyRecordsModel.swift new file mode 100644 index 0000000..fa83784 --- /dev/null +++ b/MoviaBox/Class/Wallet/Model/SPBuyRecordsModel.swift @@ -0,0 +1,15 @@ +// +// SPBuyRecordsModel.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/6. +// + +import UIKit +import SmartCodable + +class SPBuyRecordsModel: SPModel, SmartCodable { + + + +} diff --git a/MoviaBox/Class/Wallet/Model/SPRechargeRecordModel.swift b/MoviaBox/Class/Wallet/Model/SPRechargeRecordModel.swift new file mode 100644 index 0000000..4fdb0fc --- /dev/null +++ b/MoviaBox/Class/Wallet/Model/SPRechargeRecordModel.swift @@ -0,0 +1,16 @@ +// +// SPRechargeRecordModel.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/6. +// + +import UIKit +import SmartCodable + +class SPRechargeRecordModel: SPModel, SmartCodable { + + var type: String? + var value: String? + var created_at: String? +} diff --git a/MoviaBox/Class/Wallet/Model/SPRewardCoinsRecordModel.swift b/MoviaBox/Class/Wallet/Model/SPRewardCoinsRecordModel.swift new file mode 100644 index 0000000..c7ae491 --- /dev/null +++ b/MoviaBox/Class/Wallet/Model/SPRewardCoinsRecordModel.swift @@ -0,0 +1,19 @@ +// +// SPRewardCoinsRecordModel.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/6. +// + +import UIKit +import SmartCodable + +class SPRewardCoinsRecordModel: SPModel, SmartCodable { + var id: String? + var created_at: String? + var type: String? + var left_coins: String? + var expired_time: TimeInterval? + var coins: Int? + var diff_datetime: String? +} diff --git a/MoviaBox/Class/Wallet/View/SPCoinOrderRecordCell.swift b/MoviaBox/Class/Wallet/View/SPCoinOrderRecordCell.swift index 4103b8a..9550487 100644 --- a/MoviaBox/Class/Wallet/View/SPCoinOrderRecordCell.swift +++ b/MoviaBox/Class/Wallet/View/SPCoinOrderRecordCell.swift @@ -9,6 +9,14 @@ import UIKit class SPCoinOrderRecordCell: SPTableViewCell { + var model: SPRechargeRecordModel? { + didSet { + titleLabel.text = "Recharge Coins".localized + timeLabel.text = model?.created_at + coinLabel.text = "+\(model?.value ?? "0")" + } + } + //MARK: UI属性 private lazy var titleLabel: UILabel = { let label = UILabel() @@ -38,9 +46,7 @@ class SPCoinOrderRecordCell: SPTableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - titleLabel.text = "Recharge Coins" - timeLabel.text = "2024-6-10 23:41:18" - coinLabel.text = "+20000" + _setupUI() } diff --git a/MoviaBox/Class/Wallet/View/SPCoinRechargeView.swift b/MoviaBox/Class/Wallet/View/SPCoinRechargeView.swift index 7f6f2e9..a618305 100644 --- a/MoviaBox/Class/Wallet/View/SPCoinRechargeView.swift +++ b/MoviaBox/Class/Wallet/View/SPCoinRechargeView.swift @@ -24,6 +24,12 @@ class SPCoinRechargeView: UIView { } } + var userInfo: SPUserInfo? { + didSet { + coinLabel.text = "\(userInfo?.coin_left_total ?? 0)" + } + } + //MARK: UI属性 private lazy var coinNameLabel: UILabel = { let label = UILabel() @@ -67,7 +73,7 @@ class SPCoinRechargeView: UIView { override init(frame: CGRect) { super.init(frame: frame) - coinLabel.text = "\(SPLoginManager.manager.userInfo?.coin_left_total ?? 0)" + _setupUI() } @@ -131,10 +137,6 @@ extension SPCoinRechargeView: UICollectionViewDelegate, UICollectionViewDataSour guard let model = self.dataArr?[indexPath.row] else { return } SPIAPManager.manager.startRecharge(model: model) { [weak self] finish in - - SPLoginManager.manager.updateUserInfo { - self?.coinLabel.text = "\(SPLoginManager.manager.userInfo?.coin_left_total ?? 0)" - } if finish { self?.rechargeFinishHandle?() } diff --git a/MoviaBox/Class/Wallet/View/SPConsumptionRecordsCell.swift b/MoviaBox/Class/Wallet/View/SPConsumptionRecordsCell.swift index 0103a1d..203b8ae 100644 --- a/MoviaBox/Class/Wallet/View/SPConsumptionRecordsCell.swift +++ b/MoviaBox/Class/Wallet/View/SPConsumptionRecordsCell.swift @@ -9,6 +9,12 @@ import UIKit class SPConsumptionRecordsCell: SPTableViewCell { + var model: SPBuyRecordsModel? { + didSet { + + } + } + //MARK: UI属性 private lazy var titleLabel: UILabel = { let label = UILabel() diff --git a/MoviaBox/Class/Wallet/View/SPMemberRechargeView.swift b/MoviaBox/Class/Wallet/View/SPMemberRechargeView.swift index c690ebb..0f33daa 100644 --- a/MoviaBox/Class/Wallet/View/SPMemberRechargeView.swift +++ b/MoviaBox/Class/Wallet/View/SPMemberRechargeView.swift @@ -16,6 +16,9 @@ class SPMemberRechargeView: UIView { return CGSize(width: kSPScreenWidth, height: height) } + ///会员购买成功 + var buyFinishHandle: (() -> Void)? + var dataArr: [SPPayTemplateItem]? { didSet { self.invalidateIntrinsicContentSize() @@ -96,6 +99,13 @@ extension SPMemberRechargeView: UICollectionViewDelegate, UICollectionViewDataSo } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let model = dataArr?[indexPath.row] else { return } + + SPIAPManager.manager.startRecharge(model: model) { [weak self] finish in + if finish { + self?.buyFinishHandle?() + } + } } } diff --git a/MoviaBox/Class/Wallet/View/SPRewardCoinsCell.swift b/MoviaBox/Class/Wallet/View/SPRewardCoinsCell.swift index 6378d3e..669a677 100644 --- a/MoviaBox/Class/Wallet/View/SPRewardCoinsCell.swift +++ b/MoviaBox/Class/Wallet/View/SPRewardCoinsCell.swift @@ -8,7 +8,43 @@ import UIKit class SPRewardCoinsCell: SPTableViewCell { - + + var model: SPRewardCoinsRecordModel? { + didSet { + timeLabel.text = model?.created_at + coinLabel.text = "+\(model?.coins ?? 0)" + remainingLabel.text = model?.left_coins + nameLabel.text = "Check in".localized + + + let expireDate = Date(timeIntervalSince1970: model?.expired_time ?? 0) + let nowDate = Date() + let days = nowDate.dateDifference(date: expireDate) + if days > 0 { + expireLabel.text = String(format: "Expires in %@ days".localized, "\(days)") + expireLabel.textColor = .colorFF3232() + expireIconImageView.isHidden = false + + expireLabel.snp.remakeConstraints { make in + make.centerY.equalTo(expireIconImageView) + make.left.equalTo(expireIconImageView.snp.right).offset(4) + } + + } else { + expireLabel.text = "Expired".localized + expireLabel.textColor = .colorFFFFFF() + expireIconImageView.isHidden = true + + expireLabel.snp.makeConstraints { make in + make.centerY.equalTo(expireIconImageView) + make.left.equalTo(timeLabel) + } + } + + } + } + + //MARK: UI属性 private lazy var timeLabel: UILabel = { let label = UILabel() label.font = .fontMedium(ofSize: 14) @@ -51,11 +87,7 @@ class SPRewardCoinsCell: SPTableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - timeLabel.text = "2024-6-10 23:41:18" - nameLabel.text = "Check in" - expireLabel.text = "Expires in 30 days" - coinLabel.text = "+30" - remainingLabel.text = "Remaining:30" + _setupUI() } diff --git a/MoviaBox/Class/Wallet/View/SPVIPOrderRecordCell.swift b/MoviaBox/Class/Wallet/View/SPVIPOrderRecordCell.swift index 213bb6f..cad1401 100644 --- a/MoviaBox/Class/Wallet/View/SPVIPOrderRecordCell.swift +++ b/MoviaBox/Class/Wallet/View/SPVIPOrderRecordCell.swift @@ -9,6 +9,14 @@ import UIKit class SPVIPOrderRecordCell: SPTableViewCell { + var model: SPRechargeRecordModel? { + didSet { + titleLabel.text = "Purchase VIP".localized + timeLabel.text = model?.created_at + dayLabel.text = model?.value + } + } + //MARK: UI属性 private lazy var titleLabel: UILabel = { let label = UILabel() @@ -35,9 +43,7 @@ class SPVIPOrderRecordCell: SPTableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) - titleLabel.text = "Purchase VIP" - timeLabel.text = "2024-6-10 23:41:18" - dayLabel.text = "+30 days" + _setupUI() } diff --git a/MoviaBox/Libs/SPIAPManager/SPIAPManager.swift b/MoviaBox/Libs/SPIAPManager/SPIAPManager.swift index c45fa57..5103cb7 100644 --- a/MoviaBox/Libs/SPIAPManager/SPIAPManager.swift +++ b/MoviaBox/Libs/SPIAPManager/SPIAPManager.swift @@ -66,7 +66,7 @@ extension SPIAPManager: JXIAPManagerDelegate { SPWalletAPI.requestVerifyOrder(orderCode: orderCode, payId: payId, productId: productId, purchaseToken: receipt) { model in SPHUD.dismiss() - if let model = model { + if model?.status == "success" { self.orderCode = nil self.payId = nil diff --git a/MoviaBox/Thirdparty/JXIAPManager/SPIAPOrderModel.swift b/MoviaBox/Libs/SPIAPManager/SPIAPOrderModel.swift similarity index 83% rename from MoviaBox/Thirdparty/JXIAPManager/SPIAPOrderModel.swift rename to MoviaBox/Libs/SPIAPManager/SPIAPOrderModel.swift index d89756b..ac10135 100644 --- a/MoviaBox/Thirdparty/JXIAPManager/SPIAPOrderModel.swift +++ b/MoviaBox/Libs/SPIAPManager/SPIAPOrderModel.swift @@ -14,4 +14,7 @@ class SPIAPOrderModel: SPModel, SmartCodable { var order_code: String? var money: String? var is_backhaul: String? + + var code: Int? + var message: String? } diff --git a/MoviaBox/Thirdparty/JXIAPManager/SPIAPVerifyModel.swift b/MoviaBox/Libs/SPIAPManager/SPIAPVerifyModel.swift similarity index 100% rename from MoviaBox/Thirdparty/JXIAPManager/SPIAPVerifyModel.swift rename to MoviaBox/Libs/SPIAPManager/SPIAPVerifyModel.swift diff --git a/MoviaBox/Libs/User/SPUserInfo.swift b/MoviaBox/Libs/User/SPUserInfo.swift index 3884280..c538c8e 100644 --- a/MoviaBox/Libs/User/SPUserInfo.swift +++ b/MoviaBox/Libs/User/SPUserInfo.swift @@ -18,7 +18,7 @@ class SPUserInfo: SPModel, SmartCodable, NSSecureCoding { var is_tourist: Bool? var family_name: String? var giving_name: String? - var vip_end_time: String? + var vip_end_time: TimeInterval? var third_access_id: String? var is_vip: Bool? var coin_left_total: Int? diff --git a/MoviaBox/Source/en.lproj/Localizable.strings b/MoviaBox/Source/en.lproj/Localizable.strings index 15b4970..e7ef05e 100644 --- a/MoviaBox/Source/en.lproj/Localizable.strings +++ b/MoviaBox/Source/en.lproj/Localizable.strings @@ -79,6 +79,12 @@ "Signout" = "Signout"; "Confirm logout?" = "Confirm logout?"; "Invalid in-app purchase" = "Invalid in-app purchase"; +"VlP expiration time : %@" = "VlP expiration time : %@"; +"Expires in %@ days" = "Expires in %@ days"; +"Expired" = "Expired"; +"Check in" = "Check in"; +"Recharge Coins" = "Recharge Coins"; +"Purchase VIP" = "Purchase VIP"; "kLoginAgreementText" = "By continuing, you agree to the User Agreement and Privacy Policy";