杨锴
2024-09-19 642175113bf6f2c90894e689dacda50278cad570
complete most UI &  Mock API
52个文件已修改
1238 ■■■■■ 已修改文件
XQMuse/Config/Types.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/CCell/HomeRelaxBannerCCell.swift 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/CCell/HomeRelaxBannerCCell.xib 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/HomeVC.swift 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/TCell/Home_Style_5_TCell.swift 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/TCell/Home_Style_5_TCell.xib 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Login/LoginVC.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/BankInfoTCell.swift 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/ContactCustomerTCell.swift 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/ContactCustomerTCell.xib 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/MessageTCell.swift 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/MessageTCell.xib 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/SpendingDetailContentTCell.swift 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/TCell/SpendingDetailContentTCell.xib 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/AddBankInfoVC.swift 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/AddBankInfoVC.xib 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BankWithdrawVC.swift 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BankWithdrawVC.xib 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindAccountVC.swift 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindAccountVC.xib 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindPhone_1_VC.swift 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindPhone_2_VC.swift 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindPhone_3_VC.swift 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/BindPhone_3_VC.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/ContactCustomerDetailVC.swift 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/ContactCustomerDetailVC.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/ContactCustomerVC.swift 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/ContactCustomerVC.xib 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/LevelVC.swift 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/LevelVC.xib 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/LogoutAccountVC.swift 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/NoticeCenterSysDetailVC.swift 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/NoticeCenterSysDetailVC.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/NoticeCenterUserRepeaceDetailVC.swift 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/NoticeCenterUserRepeaceDetailVC.xib 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/NoticeCenterVC.swift 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SettingVC.swift 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailContentVC.swift 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailHeaderVC.swift 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailHeaderVC.xib 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailInfoVC.swift 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailInfoVC.xib 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/SpendingDetailVC.swift 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/StudyListVC.swift 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/TreatyVC.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/WalletVC.swift 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/WalletVC.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/WatchHistoryDetailVC.swift 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/WatchHistoryVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Models.swift 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Services.swift 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/SceneDelegate.swift 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Config/Types.swift
@@ -38,4 +38,8 @@
                case forgetPwd = 3
                ///第三方登录后验证手机
                case threePlantform = 4
                /// 切换手机
                case exchangePhone = 5
                /// 添加银行卡
                case addBank = 6
}
XQMuse/Root/Home/CCell/HomeRelaxBannerCCell.swift
@@ -30,4 +30,12 @@
                                img_vip.isHidden = model.chargeType != .vipFree
                }
                func setCourseModel(_ model:CourseModel){
                                img_cover.sd_setImage(with: URL(string: model.coverUrl))
                                label_title.text = model.courseTitle
                                label_subTitle.text = model.briefIntroduction
                                label_num.text = "\(model.count)"
                                img_vip.isHidden = model.chargeType != .vipFree
                }
}
XQMuse/Root/Home/CCell/HomeRelaxBannerCCell.xib
@@ -16,7 +16,7 @@
                <rect key="frame" x="0.0" y="0.0" width="165" height="218"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <subviews>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="u6A-Y4-rQ5">
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="u6A-Y4-rQ5">
                        <rect key="frame" x="0.0" y="0.0" width="165" height="218"/>
                    </imageView>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Emq-gn-QOX">
XQMuse/Root/Home/HomeVC.swift
@@ -22,6 +22,7 @@
class HomeViewModel{
                var homeTopMenuItems = [HomeTopMenuItem]()
                var homeBottomMenuItems = [HomeTopMenuItem]()
                var todyModel:MeditationModel?
                var privateTodyModels = [MeditationModel]()
                var meditationList = [MeditationListModel]()
@@ -155,6 +156,16 @@
                                                self.topMenuView.menu_collectionView.reloadData()
                                }).disposed(by: disposeBag)
                                Services.getCategoryListByType(type: 2).subscribe(onNext: { data in
                                                var items = [HomeTopMenuItem]()
                                                for v in data.data ?? []{
                                                                let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.firstIconUrl, imageFrom: .url)
                                                                items.append(model)
                                                }
                                                self.viewModel.homeBottomMenuItems = items
                                                self.tableView.reloadRows(at: [IndexPath(row: 3, section: 0)], with: .none)
                                }).disposed(by: disposeBag)
                                Services.getTopdayMedita().subscribe(onNext: { data in
                                                self.viewModel.todyModel = data.data?.clientMeditationVO
                                                self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
@@ -241,6 +252,7 @@
                                                let index = indexPath.section - 3
                                                if index == 0 && indexPath.row != 0{
                                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_5_TCell") as! Home_Style_5_TCell
                                                                cell.setHomeTopMenuItem(viewModel.homeBottomMenuItems)
                                                                return cell
                                                }else{
                                                                let m = viewModel.meditationList[index]
XQMuse/Root/Home/TCell/Home_Style_5_TCell.swift
@@ -6,18 +6,51 @@
//
import UIKit
import JQTools
class Home_Style_5_TCell: UITableViewCell {
                private var items = [HomeTopMenuItem]()
                @IBOutlet weak var btn_1: UIButton!
                @IBOutlet weak var btn_2: UIButton!
                @IBOutlet weak var btn_3: UIButton!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
                                btn_1.isHidden = true
                                btn_2.isHidden = true
                                btn_3.isHidden = true
                                btn_1.addTarget(self, action: #selector(tapAction), for: .touchUpInside)
                                btn_2.addTarget(self, action: #selector(tapAction), for: .touchUpInside)
                                btn_3.addTarget(self, action: #selector(tapAction), for: .touchUpInside)
                                btn_1.tag = 1000
                                btn_2.tag = 1001
                                btn_3.tag = 1002
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
                func setHomeTopMenuItem(_ items:[HomeTopMenuItem]){
                                self.items = items
                                for (index,v) in items.enumerated(){
                                                switch index {
                                                                case 0:
                                                                                btn_1.sd_setImage(with: URL(string: v.image), for: .normal)
                                                                                btn_1.isHidden = false
                                                                case 1:
                                                                                btn_2.sd_setImage(with: URL(string: v.image), for: .normal)
                                                                                btn_2.isHidden = false
                                                                case 2:
                                                                                btn_3.sd_setImage(with: URL(string: v.image), for: .normal)
                                                                                btn_3.isHidden = false
                                                                default:break
                                                }
                                }
                }
        // Configure the view for the selected state
    }
                @objc func tapAction(_ btn:UIButton){
                                let index = btn.tag - 1000
                                let vc = HomeItemDetailVC(id: items[index].id)
                                JQ_currentViewController().jq_push(vc: vc)
                }
}
XQMuse/Root/Home/TCell/Home_Style_5_TCell.xib
@@ -53,6 +53,11 @@
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="btn_1" destination="30T-1D-WNl" id="lfD-IP-ddb"/>
                <outlet property="btn_2" destination="vXA-OX-SB1" id="a4n-5r-1jP"/>
                <outlet property="btn_3" destination="xmc-SJ-H1U" id="uf7-FI-OON"/>
            </connections>
            <point key="canvasLocation" x="174.04580152671755" y="68.661971830985919"/>
        </tableViewCell>
    </objects>
XQMuse/Root/Login/LoginVC.swift
@@ -174,6 +174,7 @@
                                Services.loginBy(phone: viewModel.loginPhone.value, content: viewModel.loginContent.value, type: viewModel.loginType.value).subscribe(onNext: { data in
                                                if let model = data.data{
                                                                sceneDelegate?.loginSuccess()
                                                                self.dismiss(animated: true)
                                                                UserViewModel.saveLoginInfo(model)
XQMuse/Root/Me/TCell/BankInfoTCell.swift
@@ -14,7 +14,7 @@
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_bankNumber: UILabel!
                @IBOutlet weak var img_select: UIImageView!
                override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
@@ -27,4 +27,11 @@
                                view_content.jq_borderWidth = state ? 0:1
                                img_select.isHidden = !state
                }
                func setBankInfoModel(_ model:BankInfoModel){
                                label_title.text = model.bankName
                                let s = model.cardNo.count - 4
                                let b = model.cardNo.count
                                label_bankNumber.text = "**** **** **** **** " + model.cardNo.jq_substingInRange((s...b))!
                }
}
XQMuse/Root/Me/TCell/ContactCustomerTCell.swift
@@ -9,8 +9,15 @@
class ContactCustomerTCell: UITableViewCell {
    override func awakeFromNib() {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_content: UILabel!
                override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
                func setCommonQuestionModel(_ model:CommonQuestionModel){
                                label_title.text = model.questionName
                                label_content.text = model.questionDescription
                }
}
XQMuse/Root/Me/TCell/ContactCustomerTCell.xib
@@ -60,6 +60,10 @@
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="label_content" destination="Ufh-LH-iEl" id="E9Q-hb-p0q"/>
                <outlet property="label_title" destination="aBW-dt-2rJ" id="Mgo-cr-PxJ"/>
            </connections>
            <point key="canvasLocation" x="59.541984732824424" y="51.760563380281695"/>
        </tableViewCell>
    </objects>
XQMuse/Root/Me/TCell/MessageTCell.swift
@@ -8,9 +8,27 @@
import UIKit
class MessageTCell: UITableViewCell {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var view_isRead: UIView!
                @IBOutlet weak var label_sub: UILabel!
                @IBOutlet weak var label_date: UILabel!
                @IBOutlet weak var image_type: UIImageView!
    override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
                func setNoticeModel(_ model:NoticeModel){
                                label_title.text = model.title
                                view_isRead.isHidden = model.readStatus == 2
                                label_sub.text = model.content
                                label_date.text = model.createTime
                                if model.noticeType == 1{
                                                image_type.image = UIImage(named: "icon_msg_sys")
                                }else{
                                                image_type.image = UIImage(named: "icon_msg_user")
                                }
                }
}
XQMuse/Root/Me/TCell/MessageTCell.xib
@@ -89,6 +89,13 @@
                    <constraint firstItem="Ong-0k-h5l" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="5.5" id="T6a-mC-31G"/>
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="image_type" destination="RM7-YK-5IB" id="8aV-gV-e4I"/>
                <outlet property="label_date" destination="Tsl-3O-mZM" id="o6S-id-nya"/>
                <outlet property="label_sub" destination="Mbc-nK-0T7" id="xw6-Z9-y86"/>
                <outlet property="label_title" destination="cob-eJ-7In" id="B67-gU-yqI"/>
                <outlet property="view_isRead" destination="TdQ-J6-aEO" id="sI3-Wp-BR2"/>
            </connections>
            <point key="canvasLocation" x="219.84732824427479" y="40.492957746478872"/>
        </tableViewCell>
    </objects>
XQMuse/Root/Me/TCell/SpendingDetailContentTCell.swift
@@ -6,11 +6,28 @@
//
import UIKit
import JQTools
class SpendingDetailContentTCell: UITableViewCell {
    override func awakeFromNib() {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_datetime: UILabel!
                @IBOutlet weak var label_price: UILabel!
                override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
                func setBalanceInfoModel(_ model:BalanceInfoModel){
                                label_title.text = model.reason
                                label_datetime.text = model.createTime
                                if model.changeType == .decreate{
                                                label_price.text = String(format: "-%.2lf", model.amount)
                                                label_price.textColor = .black
                                }else{
                                                label_price.text = String(format: "+%.2lf", model.amount)
                                                label_price.textColor = UIColor(hexString: "#FE3211")
                                }
                }
}
XQMuse/Root/Me/TCell/SpendingDetailContentTCell.xib
@@ -68,6 +68,11 @@
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="label_datetime" destination="RqV-gN-LrA" id="oO9-Cp-5EZ"/>
                <outlet property="label_price" destination="5sc-jc-aUv" id="mKr-Tw-ONP"/>
                <outlet property="label_title" destination="fed-zq-HQC" id="Czk-MG-Otw"/>
            </connections>
            <point key="canvasLocation" x="161.83206106870227" y="32.04225352112676"/>
        </tableViewCell>
    </objects>
XQMuse/Root/Me/VC/AddBankInfoVC.swift
@@ -7,11 +7,73 @@
import UIKit
import QMUIKit
import RxRelay
import RxSwift
import JQTools
let AddBank_Noti = Notification.Name.init("AddBank_Noti")
class AddBankInfoVC: BaseVC {
                struct AddBankRequestModel{
                                var bankName = BehaviorRelay<String>(value:"")
                                var bankNo = BehaviorRelay<String>(value:"")
                                var holderName = BehaviorRelay<String>(value:"")
                                var idCard = BehaviorRelay<String>(value:"")
                                var phone = BehaviorRelay<String>(value:"")
                                var code = BehaviorRelay<String>(value:"")
                                func isAuth()->Bool{
                                                guard !bankName.value.isEmpty else{
                                                                alertError(msg: "请输入开户行");return false
                                                }
                                                guard !bankNo.value.isEmpty else{
                                                                alertError(msg: "请输入卡号");return false
                                                }
                                                guard !holderName.value.isEmpty else{
                                                                alertError(msg: "请输入持卡人");return false
                                                }
                                                guard !idCard.value.isEmpty else{
                                                                alertError(msg: "请输入身份证号");return false
                                                }
                                                guard idCard.value.jq_idCard() else {
                                                                alertError(msg: "请输入正确的身份证号");return false
                                                }
                                                guard !phone.value.isEmpty else{
                                                                alertError(msg: "请输入手机号");return false
                                                }
                                                guard phone.value.jq_isPhone else {
                                                                alertError(msg: "请输入正确的手机号");return false
                                                }
                                                guard !code.value.isEmpty else{
                                                                alertError(msg: "请输入验证码");return false
                                                }
                                                guard code.value.count == 6 else {
                                                                alertError(msg: "请输入正确的验证码");return false
                                                }
                                                return true
                                }
                                func toRequest()->Dictionary<String,Any>{
                                                return ["bankName":bankName.value,
                                                                                "cardNo":bankNo.value,
                                                                                "cardholder":holderName.value,
                                                                                "identityCard":idCard.value,
                                                                                "cellPhone":phone.value,
                                                                                "code":code.value]
                                }
                }
                @IBOutlet weak var tf_bankName: UITextField!
                @IBOutlet weak var tf_cardNo: QMUITextField!
                @IBOutlet weak var tf_holderName: QMUITextField!
                @IBOutlet weak var tf_idcard: QMUITextField!
                @IBOutlet weak var tf_phone: QMUITextField!
                @IBOutlet weak var btn_add: UIButton!
                @IBOutlet weak var tf_code: QMUITextField!
                private var requestModel = AddBankRequestModel()
                override func viewDidLoad() {
        super.viewDidLoad()
                                title = "添加银行卡"
@@ -23,9 +85,48 @@
                                tf_idcard.inputView = idCardView
    }
                override func setRx() {
                                tf_bankName.rx.text.orEmpty.bind(to: requestModel.bankName).disposed(by: disposeBag)
                                tf_cardNo.rx.text.orEmpty.bind(to: requestModel.bankNo).disposed(by: disposeBag)
                                tf_holderName.rx.text.orEmpty.bind(to: requestModel.holderName).disposed(by: disposeBag)
                                tf_idcard.rx.text.orEmpty.bind(to: requestModel.idCard).disposed(by: disposeBag)
                                tf_phone.rx.text.orEmpty.bind(to: requestModel.phone).disposed(by: disposeBag)
                                tf_code.rx.text.orEmpty.bind(to: requestModel.code).disposed(by: disposeBag)
                }
                override func setUI() {
                                view.backgroundColor = UIColor(hexString: "f6f6f6")
                                btn_add.localGradientColor(cornerRadius: 20)
                }
                @IBAction func addhandleAction(_ sender: UIButton) {
                                view.endEditing(true)
                                if requestModel.isAuth(){
                                                Services.addBank(requestModel).subscribe(onNext: {data in
                                                                alertSuccess(msg: "添加成功")
                                                                NotificationCenter.default.post(name: AddBank_Noti, object: nil)
                                                                DispatchQueue.main.asyncAfter(delay: 1.0) {
                                                                                self.navigationController?.popViewController()
                                                                }
                                                }).disposed(by: disposeBag)
                                }
                }
                @IBAction func sendCodeAction(_ sender: UIButton) {
                                guard !requestModel.phone.value.isEmpty else {
                                                alertError(msg: "请输入手机号");return
                                }
                                Services.sendCode(type: .addBank).subscribe(onNext: {_ in
                                                sender.jq_openCountDown(60, defultTitle: "发送验证码") {
                                                                sender.titleLabel?.font = UIFont.systemFont(ofSize: 12)
                                                                sender.setTitleColor(.black.withAlphaComponent(0.3), for: .normal)
                                                } completeClouse: {
                                                                sender.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium)
                                                                sender.setTitleColor(UIColor(hexStr: "#96AD81"), for: .normal)
                                                }
                                }).disposed(by: disposeBag)
                }
}
XQMuse/Root/Me/VC/AddBankInfoVC.xib
@@ -12,7 +12,12 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AddBankInfoVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="btn_add" destination="Flq-AM-akx" id="ZK1-cZ-cIZ"/>
                <outlet property="tf_bankName" destination="elz-Zp-tTi" id="7vA-Jq-Ypx"/>
                <outlet property="tf_cardNo" destination="lfq-e1-X3C" id="G23-dz-jkD"/>
                <outlet property="tf_code" destination="fdw-nZ-t66" id="VL7-ao-hB7"/>
                <outlet property="tf_holderName" destination="P5B-z6-sMX" id="tRC-Ol-ton"/>
                <outlet property="tf_idcard" destination="c3P-PL-JWg" id="f2k-T7-8VT"/>
                <outlet property="tf_phone" destination="BaQ-Md-hAN" id="zDM-Rm-72z"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
@@ -210,7 +215,10 @@
                                    <nil key="highlightedColor"/>
                                </label>
                                <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="fdw-nZ-t66" customClass="QMUITextField">
                                    <rect key="frame" x="126.33333333333334" y="14.666666666666686" width="49" height="21"/>
                                    <rect key="frame" x="126.33333333333334" y="14.666666666666686" width="100" height="21"/>
                                    <constraints>
                                        <constraint firstAttribute="width" constant="100" id="d1y-dU-luk"/>
                                    </constraints>
                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                    <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
                                    <userDefinedRuntimeAttributes>
@@ -233,6 +241,9 @@
                                    <state key="normal" title="发送验证码">
                                        <color key="titleColor" red="0.54117647058823526" green="0.68235294117647061" blue="0.396078431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                    <connections>
                                        <action selector="sendCodeAction:" destination="-1" eventType="touchUpInside" id="nrd-RO-yRb"/>
                                    </connections>
                                </button>
                            </subviews>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
@@ -272,6 +283,9 @@
                            <real key="value" value="20"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                    <connections>
                        <action selector="addhandleAction:" destination="-1" eventType="touchUpInside" id="1hn-2b-QRj"/>
                    </connections>
                </button>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
XQMuse/Root/Me/VC/BankWithdrawVC.swift
@@ -8,15 +8,33 @@
import UIKit
import QMUIKit
let WithDrawReply_Noti = Notification.Name.init("WithDrawReply_Noti")
class BankWithdrawVC: BaseVC {
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var tf_withdraw: UITextField!
                @IBOutlet weak var cons_height: NSLayoutConstraint!
                private var selectIndexPath = IndexPath(row: 0, section: 0)
                @IBOutlet weak var label_income: UILabel!
                private var selectIndexPath:IndexPath?
                private var bankModels = [BankInfoModel]()
                private var income:CGFloat = 0
                required init(income:Double){
                                super.init(nibName: nil, bundle: nil)
                                self.income = income
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                override func viewDidLoad() {
        super.viewDidLoad()
        title = "收益提现"
                                label_income.text = "可提现余额:¥" + income.jq_formatFloat
                                getBanks()
    }
                override func setUI() {
@@ -26,12 +44,64 @@
                                tableView.separatorStyle = .none
                                tableView.backgroundColor = .clear
                                tableView.register(UINib(nibName: "BankInfoTCell", bundle: nil), forCellReuseIdentifier: "_BankInfoTCell")
                                cons_height.constant = 84 * 2
                                cons_height.constant = 0
                }
                override func setRx() {
//                                AddBank_Noti
                                NotificationCenter.default.rx.notification(AddBank_Noti, object: nil).take(until: self.rx.deallocated).subscribe(onNext: { _ in
                                                self.getBanks()
                                }).disposed(by: disposeBag)
                }
                private func getBanks(){
                                Services.getMyBankList().subscribe(onNext: {data in
                                                self.bankModels = data.data ?? []
                                                self.tableView.reloadData()
                                                self.cons_height.constant = CGFloat(self.bankModels.count) * 84.0
                                }).disposed(by: disposeBag)
                }
                @IBAction func addBankCardAction(_ sender: QMUIButton) {
                                let vc = AddBankInfoVC()
                                push(vc: vc)
                }
                @IBAction func withdrawAllAction(_ sender: UIButton) {
                                tf_withdraw.resignFirstResponder()
                                tf_withdraw.text = income.jq_formatFloat
                }
                @IBAction func withdrawHandleAction(_ sender: UIButton) {
                                tf_withdraw.resignFirstResponder()
                                guard selectIndexPath != nil else {
                                                alertError(msg: "请选择提现银行卡");return
                                }
                                guard !tf_withdraw.text!.isEmpty else {
                                                alertError(msg: tf_withdraw.placeholder ?? "请输入提现余额");return
                                }
                                let handleMoney = tf_withdraw.text?.toDouble ?? 0
                                guard income >= handleMoney else {
                                                alertError(msg: "提现余额不足");return
                                }
                                Services.withdraw(bankId: bankModels[selectIndexPath!.row].id, money: tf_withdraw.text!.toDouble).subscribe(onNext: {data in
                                                self.income -= self.tf_withdraw.text!.toDouble
                                                alertSuccess(msg: "提现申请已提交")
                                                self.tf_withdraw.text = ""
                                                self.label_income.text = "可提现余额:¥\(self.income.jq_formatFloat)"
                                                NotificationCenter.default.post(name: WithDrawReply_Noti, object: nil)
                                                self.tf_withdraw.resignFirstResponder()
                                }).disposed(by: disposeBag)
                }
}
@@ -45,6 +115,7 @@
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_BankInfoTCell", for: indexPath) as! BankInfoTCell
                                cell.isSelect(indexPath == selectIndexPath)
                                cell.setBankInfoModel(bankModels[indexPath.row])
                                return cell
                }
@@ -53,7 +124,18 @@
                }
                func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
                                let id = bankModels[indexPath.row].id
                                CommonAlertView.show(title: "提示", content: "是否删除此张银行卡?") { _ in
                                                Services.deleteBank(id).subscribe(onNext: { _ in
                                                                self.tableView.beginUpdates()
                                                                self.bankModels.remove(at: indexPath.row)
                                                                self.tableView.deleteItemsAtIndexPaths([indexPath], animationStyle: .left)
                                                                self.tableView.endUpdates()
                                                                self.cons_height.constant = CGFloat(self.bankModels.count) * 84.0
                                                                UIView.animate(withDuration: 0.4) {
                                                                                self.view.layoutIfNeeded()
                                                                }
                                                }).disposed(by: self.disposeBag)
                                }
                }
@@ -66,9 +148,8 @@
                                return "删除"
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 2
                                return bankModels.count
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
XQMuse/Root/Me/VC/BankWithdrawVC.xib
@@ -12,7 +12,9 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BankWithdrawVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="cons_height" destination="JnR-vu-dbn" id="8dW-o7-cqk"/>
                <outlet property="label_income" destination="Jnw-DF-MrW" id="Geg-l9-clW"/>
                <outlet property="tableView" destination="ANy-Y0-lhb" id="VHQ-LH-zK3"/>
                <outlet property="tf_withdraw" destination="40r-zA-9fv" id="OMX-yr-zQ0"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
@@ -140,6 +142,9 @@
                                            <state key="normal" title="全部提现">
                                                <color key="titleColor" red="0.54117647058823526" green="0.68235294117647061" blue="0.396078431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            </state>
                                            <connections>
                                                <action selector="withdrawAllAction:" destination="-1" eventType="touchUpInside" id="b5v-FJ-iAk"/>
                                            </connections>
                                        </button>
                                    </subviews>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
@@ -193,6 +198,9 @@
                                            <real key="value" value="20"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="withdrawHandleAction:" destination="-1" eventType="touchUpInside" id="RAk-Ln-3YP"/>
                                    </connections>
                                </button>
                            </subviews>
                            <constraints>
XQMuse/Root/Me/VC/BindAccountVC.swift
@@ -8,10 +8,13 @@
import UIKit
class BindAccountVC: BaseVC {
                @IBOutlet weak var label_phone: UILabel!
                @IBOutlet weak var label_wchatBindState: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "账号绑定"
                                label_phone.text = UserViewModel.getAvatarInfo().cellPhone.jq_blotOutPhone()
    }
XQMuse/Root/Me/VC/BindAccountVC.xib
@@ -11,6 +11,8 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BindAccountVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="label_phone" destination="JiT-I4-fQb" id="pqq-l5-gv0"/>
                <outlet property="label_wchatBindState" destination="hyt-qR-dWk" id="BWl-xq-gRx"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
XQMuse/Root/Me/VC/BindPhone_1_VC.swift
@@ -16,6 +16,9 @@
                override func viewDidLoad() {
        super.viewDidLoad()
                                title = "绑定手机号"
                                //原型设计漏洞,可绕过原手机号的验证,直接通过截取Token修改新手机号【产品要求:涉及到的时候再优化 2024-09-19】
                                label_phone.text = UserViewModel.getAvatarInfo().cellPhone.jq_blotOutPhone()
    }
                override func viewDidLayoutSubviews() {
XQMuse/Root/Me/VC/BindPhone_2_VC.swift
@@ -19,16 +19,46 @@
                                title = "更改绑定手机"
    }
                @IBAction func sendCodeAction(_ sender: UIButton) {
                                Services.sendCode(type: .exchangePhone).subscribe(onNext: { data in
                                                if let _ = data.data{
                                                                sender.jq_openCountDown(60, defultTitle: "发送验证码") {
                                                                                sender.titleLabel?.font = UIFont.systemFont(ofSize: 12)
                                                                                sender.setTitleColor(.black.withAlphaComponent(0.3), for: .normal)
                                                                } completeClouse: {
                                                                                sender.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium)
                                                                                sender.setTitleColor(UIColor(hexStr: "#96AD81"), for: .normal)
                                                                }
                                                }
                                }).disposed(by: disposeBag)
                }
                @IBAction func completeAction(_ sender: UIButton) {
                                let vc = BindPhone_3_VC()
                                vc.modalPresentationStyle = .fullScreen
                                present(vc, animated: true)
                                view.endEditing(true)
                                guard !tf_phone.text!.isEmpty else{
                                                alertError(msg: "请输入手机号");return
                                }
                                guard tf_phone.text!.jq_isPhone else{
                                                alertError(msg: "请正确的手机号");return
                                }
                                guard !tf_code.text!.isEmpty else{
                                                alertError(msg: "请输入验证码");return
                                }
                                guard tf_code.text!.count == 6 else{
                                                alertError(msg: "请输入6位验证码");return
                                }
                                Services.changePhone(phone: tf_phone.text!, code: tf_code.text!).subscribe(onNext: {data in
                                                let vc = BindPhone_3_VC()
                                                vc.modalPresentationStyle = .fullScreen
                                                self.present(vc, animated: true)
                                }).disposed(by: disposeBag)
                }
                override func viewDidLayoutSubviews() {
XQMuse/Root/Me/VC/BindPhone_3_VC.swift
@@ -15,9 +15,14 @@
                override func viewDidLoad() {
        super.viewDidLoad()
                                title = "更换绑定手机"
    }
                @IBAction func needLoginAction(_ sender: Any) {
                                dismiss(animated: true) {
                                                sceneDelegate?.needLogin()
                                }
                }
                override func viewDidLayoutSubviews() {
                                super.viewDidLayoutSubviews()
                                btn_relogin.jq_gradientNibColor(colorArr: [UIColor(hexStr: "#8EA47A").cgColor,UIColor(hexStr: "#AFCA98").cgColor], cornerRadius: 20)
XQMuse/Root/Me/VC/BindPhone_3_VC.xib
@@ -54,6 +54,9 @@
                            <real key="value" value="20"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                    <connections>
                        <action selector="needLoginAction:" destination="-1" eventType="touchUpInside" id="wZx-Cb-jZz"/>
                    </connections>
                </button>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
XQMuse/Root/Me/VC/ContactCustomerDetailVC.swift
@@ -10,11 +10,47 @@
class ContactCustomerDetailVC: BaseVC {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_content: UILabel!
                @IBOutlet weak var webView: WKWebView!
                @IBOutlet weak var image_qrCode: UIImageView!
                private var model:CommonQuestionModel!
                private var customerImage:UIImage?
                required init(_ model:CommonQuestionModel,customerImage:UIImage?) {
                                super.init(nibName: nil, bundle: nil)
                                self.model = model
                                self.customerImage = customerImage
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                override func viewDidLoad() {
        super.viewDidLoad()
                                title = "问题详情"
                                label_title.text = model.questionName
                                label_content.text = model.content
                                Services.commonQuestionDetailBy(id: model.id).subscribe(onNext: {[weak self] data in
                                                if let m = data.data{
                                                                self?.webView.loadHTMLString(m.content.jq_wrapHtml(), baseURL: nil)
                                                }
                                }).disposed(by: disposeBag)
                                
                                if let image = customerImage{
                                                self.image_qrCode.image = image
                                }else{
                                                Services.getCustomerCode().subscribe(onNext: {data in
                                                                if let m = data.data{
                                                                                self.customerImage = UIImage.jq_GenerateQRCode(with: m, width: 200)
                                                                                self.image_qrCode.image = self.customerImage
                                                                }
                                                }).disposed(by: disposeBag)
                                }
    }
                override func setUI() {
XQMuse/Root/Me/VC/ContactCustomerDetailVC.xib
@@ -11,6 +11,9 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ContactCustomerDetailVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="image_qrCode" destination="2kC-yj-fW4" id="fPg-s8-9wb"/>
                <outlet property="label_content" destination="xb7-xl-air" id="reS-4e-B9w"/>
                <outlet property="label_title" destination="UU5-p7-Ba1" id="IfO-PC-kEX"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="webView" destination="RzU-MN-ulm" id="5nl-6O-ZZ8"/>
            </connections>
XQMuse/Root/Me/VC/ContactCustomerVC.swift
@@ -6,11 +6,22 @@
//
import UIKit
import RxSwift
class ContactCustomerViewModel:RefreshInnerModel<CommonQuestionModel>{
                override func api() -> (Observable<BaseResponse<BaseResponseList<CommonQuestionModel>>>)? {
                                return Services.commonQuestion(page: page, pageSize: 20)
                }
}
class ContactCustomerVC: BaseVC {
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var image_qrCode: UIImageView!
                
                private var viewModel = ContactCustomerViewModel()
                private var customerImage:UIImage?
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "联系客服"
@@ -20,22 +31,36 @@
                                tableView.dataSource = self
                                tableView.showsVerticalScrollIndicator = false
                                tableView.register(UINib(nibName: "ContactCustomerTCell", bundle: nil), forCellReuseIdentifier: "_ContactCustomerTCell")
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
                                Services.getCustomerCode().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                self.customerImage = UIImage.jq_GenerateQRCode(with: m, width: 200)
                                                                self.image_qrCode.image = self.customerImage
                                                }
                                }).disposed(by: disposeBag)
    }
}
extension ContactCustomerVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let vc = ContactCustomerDetailVC()
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                let vc = ContactCustomerDetailVC(model,customerImage: customerImage)
                                push(vc: vc)
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_ContactCustomerTCell", for: indexPath) as! ContactCustomerTCell
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_ContactCustomerTCell", for: indexPath) as!
                                ContactCustomerTCell
                                cell.setCommonQuestionModel(model)
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 10
                                return viewModel.dataSource.value?.list.count ?? 0
                }
XQMuse/Root/Me/VC/ContactCustomerVC.xib
@@ -11,6 +11,7 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ContactCustomerVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="image_qrCode" destination="5jI-tQ-uLM" id="Fxg-dZ-zU2"/>
                <outlet property="tableView" destination="cf6-0I-xxB" id="kE1-aF-snG"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
@@ -25,10 +26,19 @@
                </imageView>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qdl-41-EV1">
                    <rect key="frame" x="130.33333333333331" y="106.66666666666667" width="132.33333333333331" height="132.33333333333331"/>
                    <subviews>
                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5jI-tQ-uLM">
                            <rect key="frame" x="0.0" y="0.0" width="132.33333333333334" height="132.33333333333334"/>
                        </imageView>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstAttribute="width" constant="132.5" id="3xI-p5-QcI"/>
                        <constraint firstAttribute="trailing" secondItem="5jI-tQ-uLM" secondAttribute="trailing" id="75F-nx-DFC"/>
                        <constraint firstItem="5jI-tQ-uLM" firstAttribute="top" secondItem="Qdl-41-EV1" secondAttribute="top" id="AvE-uP-sXr"/>
                        <constraint firstItem="5jI-tQ-uLM" firstAttribute="leading" secondItem="Qdl-41-EV1" secondAttribute="leading" id="DpG-ZI-XEO"/>
                        <constraint firstAttribute="height" constant="132.5" id="ffo-MU-W1a"/>
                        <constraint firstAttribute="bottom" secondItem="5jI-tQ-uLM" secondAttribute="bottom" id="g7M-oD-LE2"/>
                    </constraints>
                </view>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="扫码添加客服微信" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fc3-8Q-v5s">
XQMuse/Root/Me/VC/LevelVC.swift
@@ -6,16 +6,36 @@
//
import UIKit
import WebKit
import JQTools
class LevelVC: BaseVC {
                @IBOutlet weak var image_level: UIImageView!
                @IBOutlet weak var label_currentLevel: UILabel!
                @IBOutlet weak var label_nextLevel: UILabel!
                @IBOutlet weak var progressView: UIProgressView!
                @IBOutlet weak var webView: WKWebView!
                override func viewDidLoad() {
        super.viewDidLoad()
                                super.viewDidLoad()
                                title = "当前等级"
                                DispatchQueue.main.asyncAfter(delay: 2.0) {
                                                self.progressView.setProgress(0.9, animated: true)
                                }
    }
                                Services.userHeadingLevel().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                let progress = Double(m.growthValue) / Double(m.nextLevel)
                                                                DispatchQueue.main.asyncAfter(delay: 0.5) {
                                                                                self.progressView.setProgress(Float(progress), animated: true)
                                                                }
                                                                self.image_level.sd_setImage(with: URL(string: m.levelIcon))
                                                                self.label_currentLevel.text = String(format: "%ld/%ld", m.level,10)
                                                                self.label_nextLevel.isHidden = m.level == 10
                                                                self.label_nextLevel.text = String(format: "你离下一等级还差%ld经验值,加油!", m.growthValue,m.nextLevel)
                                                                self.webView.loadHTMLString(m.content.jq_wrapHtml(), baseURL: nil)
                                                }
                                }).disposed(by: disposeBag)
                }
}
XQMuse/Root/Me/VC/LevelVC.xib
@@ -10,8 +10,12 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="LevelVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="image_level" destination="h9t-tx-RMl" id="mBI-RZ-5bd"/>
                <outlet property="label_currentLevel" destination="7JM-Vh-SUj" id="MYr-FY-PBt"/>
                <outlet property="label_nextLevel" destination="ZIY-z8-gex" id="F9R-Uc-pfU"/>
                <outlet property="progressView" destination="vEE-PO-MmZ" id="bFu-HY-IeG"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="webView" destination="fXz-og-D6V" id="ld9-Qo-ezl"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
XQMuse/Root/Me/VC/LogoutAccountVC.swift
@@ -18,9 +18,11 @@
    }
                @IBAction func completeAction(_ sender: UIButton) {
                                CommonAlertView.show(title: "提示", content: "已提交注销申请,请耐心等待平台审核", cancelStr: nil, completeStr: "确定", isSingle: true) { _ in
                                }
                                Services.deleteUser().subscribe(onNext: {data in
                                                CommonAlertView.show(title: "提示", content: "已提交注销申请,请耐心等待平台审核", cancelStr: nil, completeStr: "确定", isSingle: true) { _ in
                                                                sceneDelegate?.needLogin()
                                                }
                                }).disposed(by: disposeBag)
                }
                
                override func viewDidLayoutSubviews() {
XQMuse/Root/Me/VC/NoticeCenterSysDetailVC.swift
@@ -9,10 +9,27 @@
class NoticeCenterSysDetailVC: BaseVC {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_date: UILabel!
                @IBOutlet weak var label_content: UILabel!
                private var model:NoticeDetailModel!
                required init(_ model:NoticeDetailModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.model = model
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "系统消息"
                                label_title.text = model.title
                                label_content.text = model.reply
                                label_date.text = model.publishTime
    }
                override func setUI() {
XQMuse/Root/Me/VC/NoticeCenterSysDetailVC.xib
@@ -11,6 +11,9 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NoticeCenterSysDetailVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="label_content" destination="JPR-7W-qZh" id="OVn-ry-qIR"/>
                <outlet property="label_date" destination="en7-Qa-xJB" id="N6v-cR-rI3"/>
                <outlet property="label_title" destination="gQK-sP-1w2" id="nXw-fW-7RU"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
XQMuse/Root/Me/VC/NoticeCenterUserRepeaceDetailVC.swift
@@ -8,10 +8,40 @@
import UIKit
class NoticeCenterUserRepeaceDetailVC: BaseVC {
                @IBOutlet weak var image_avartar: UIImageView!
                @IBOutlet weak var label_name: UILabel!
                @IBOutlet weak var label_content: UILabel!
                @IBOutlet weak var btn_islike: UIButton!
                @IBOutlet weak var image_reply_userAvartar: UIImageView!
                @IBOutlet weak var label_reply_name: UILabel!
                @IBOutlet weak var label_reply_content: UILabel!
                @IBOutlet weak var label_reply_date: UILabel!
                @IBOutlet weak var view_plantfrom: UIView!
                @IBOutlet weak var view_plantfrom_reply: UILabel!
                private var model:NoticeDetailModel!
                required init(_ model:NoticeDetailModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.model = model
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "回复消息"
                                image_avartar.sd_setImage(with: URL(string: model.iconUrl))
                                label_name.text = model.meditationTitle
                                label_content.text = model.coverDescription
                                image_reply_userAvartar.sd_setImage(with: URL(string: model.avatar))
                                label_reply_name.text = model.nickname
                                label_reply_content.text = model.content
                                label_reply_date.text = model.publishTime
                                view_plantfrom.isHidden = model.replyContent.isEmpty
                                view_plantfrom_reply.text = model.reply
    }
}
XQMuse/Root/Me/VC/NoticeCenterUserRepeaceDetailVC.xib
@@ -11,7 +11,17 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NoticeCenterUserRepeaceDetailVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="btn_islike" destination="D0U-is-fLy" id="Nol-JH-4e8"/>
                <outlet property="image_avartar" destination="z1T-aN-oSN" id="EC2-yy-BZh"/>
                <outlet property="image_reply_userAvartar" destination="BAp-Ga-8ex" id="90g-66-wf5"/>
                <outlet property="label_content" destination="rDr-su-720" id="ual-Wr-y4F"/>
                <outlet property="label_name" destination="ckR-f8-uGd" id="ETi-d0-eFM"/>
                <outlet property="label_reply_content" destination="hpx-3J-7nI" id="ZhF-ia-Nmn"/>
                <outlet property="label_reply_date" destination="I4t-Mk-xsI" id="vQo-sa-xEV"/>
                <outlet property="label_reply_name" destination="PoX-Mz-vPh" id="ofg-uR-tbP"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="view_plantfrom" destination="96T-Ma-Y0w" id="gYY-40-WMM"/>
                <outlet property="view_plantfrom_reply" destination="3rx-FM-iyi" id="SO3-Mk-Z4s"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
XQMuse/Root/Me/VC/NoticeCenterVC.swift
@@ -6,15 +6,26 @@
//
import UIKit
import RxSwift
import RxDataSources
class NoticeCenterViewModel:RefreshInnerModel<NoticeModel>{
                override func api() -> (Observable<BaseResponse<BaseResponseList<NoticeModel>>>)? {
                                return Services.noticeList(page: page, pageSize: 20)
                }
}
class NoticeCenterVC: BaseVC {
                private var tableView:UITableView!
                private var viewModel = NoticeCenterViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "消息通知"
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
    }
                override func setUI() {
@@ -38,20 +49,32 @@
extension NoticeCenterVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                if indexPath.row == 0{
                                                let vc = NoticeCenterSysDetailVC()
                                                push(vc: vc)
                                }
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                model.readStatus = 2
                                tableView.reloadRows(at: [indexPath], with: .none)
                                if indexPath.row == 1{
                                                let vc = NoticeCenterUserRepeaceDetailVC()
                                                push(vc: vc)
                                }
                                Services.noticeDetailId(model.id).subscribe(onNext: {data in
                                                if let m = data.data{
                                                                if model.noticeType == 1{
                                                                                let vc = NoticeCenterSysDetailVC(m)
                                                                                self.push(vc: vc)
                                                                }
                                                                if model.noticeType == 2{
                                                                                let vc = NoticeCenterUserRepeaceDetailVC(m)
                                                                                self.push(vc: vc)
                                                                }
                                                }
                                }).disposed(by: disposeBag)
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_MessageTCell", for: indexPath) as! MessageTCell
                                cell.backgroundColor = .clear
                                cell.setNoticeModel(model)
                                return cell
                }
@@ -60,7 +83,7 @@
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 10
                                return viewModel.dataSource.value?.list.count ?? 0
                }
XQMuse/Root/Me/VC/SettingVC.swift
@@ -6,6 +6,7 @@
//
import UIKit
import JQTools
class SettingVC: BaseVC {
@@ -26,11 +27,13 @@
                }
                @IBAction func cancelCacheAction(_ sender: TapBtn) {
                                alertSuccess(msg: "清理成功")
                                JQTool.cleanCache {
                                                alertSuccess(msg: "清理成功")
                                }
                }
                @IBAction func aboutUsAction(_ sender: TapBtn) {
                                let vc = WebVC()
                                let vc = WebVC(type: .aboutUs)
                                vc.title = "关于心泉"
                                push(vc: vc)
                }
@@ -46,10 +49,10 @@
                }
                @IBAction func exchangeAccountAction(_ sender: UIButton) {
                                sceneDelegate?.needLogin()
                }
                @IBAction func quitAccountAction(_ sender: UIButton) {
                                sceneDelegate?.needLogin()
                }
}
XQMuse/Root/Me/VC/SpendingDetailContentVC.swift
@@ -7,15 +7,26 @@
import UIKit
import JQTools
import RxSwift
import RxRelay
class SpendingDetailViewModel:RefreshInnerModel<BalanceInfoModel>{
                var state = BehaviorRelay<Int>(value: 1)
                override func api() -> (Observable<BaseResponse<BaseResponseList<BalanceInfoModel>>>)? {
                                return Services.balanceRecordList(page: page, pageSize: 20, state: state.value)
                }
}
class SpendingDetailContentVC: BaseVC {
                private var page:Int!
                private var tableView:UITableView!
                private var viewModel = SpendingDetailViewModel()
                init(page:Int) {
                init(state:Int) {
                                super.init(nibName: nil, bundle: nil)
                                self.page = page
                                viewModel.state.accept(state)
                }
                
                required init?(coder: NSCoder) {
@@ -25,7 +36,8 @@
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
    }
                override func setUI() {
@@ -45,18 +57,20 @@
extension SpendingDetailContentVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let vc = SpendingDetailInfoVC()
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                let vc = SpendingDetailInfoVC(id: model.id)
                                JQ_currentViewController().jq_push(vc: vc, animated: true)
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let model = viewModel.dataSource.value!.list[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_SpendingDetailContentTCell", for: indexPath) as! SpendingDetailContentTCell
                                cell.setBalanceInfoModel(model)
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 10
                                return viewModel.dataSource.value?.list.count ?? 0
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
XQMuse/Root/Me/VC/SpendingDetailHeaderVC.swift
@@ -10,12 +10,14 @@
class SpendingDetailHeaderVC: BaseVC {
    override func viewDidLoad() {
                @IBOutlet weak var label_balance: UILabel!
                var income:Double = 0
                override func viewDidLoad() {
        super.viewDidLoad()
    }
                @IBAction func withdrawAction(_ sender: UIButton) {
                                let vc = BankWithdrawVC()
                                let vc = BankWithdrawVC(income: income)
                                JQ_currentViewController().jq_push(vc: vc)
                }
}
XQMuse/Root/Me/VC/SpendingDetailHeaderVC.xib
@@ -10,6 +10,7 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SpendingDetailHeaderVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="label_balance" destination="iKf-J7-77x" id="9rV-mO-0wq"/>
                <outlet property="view" destination="iN0-l3-epB" id="dt1-eq-STC"/>
            </connections>
        </placeholder>
XQMuse/Root/Me/VC/SpendingDetailInfoVC.swift
@@ -9,10 +9,70 @@
class SpendingDetailInfoVC: BaseVC {
                @IBOutlet weak var label_price: UILabel!
                @IBOutlet weak var label_incomeType: UILabel!
                @IBOutlet weak var label_datetime: UILabel!
                @IBOutlet weak var label_orderNum: UILabel!
                @IBOutlet weak var label_subUserName: UILabel!
                @IBOutlet weak var image_subUserAvartar: UIImageView!
                @IBOutlet weak var label_remakr: UILabel!
                @IBOutlet weak var view_incomeType: UIView!
                @IBOutlet weak var view_datetime: UIView!
                @IBOutlet weak var view_orderNum: UIView!
                @IBOutlet weak var view_subUser: UIView!
                @IBOutlet weak var view_remark: UIView!
                private var id:Int!
                required init(id:Int) {
                                super.init(nibName: nil, bundle: nil)
                                self.id = id
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "收入详情"
                                navigationController?.navigationBar.scrollEdgeAppearance?.backgroundColor = .white
                                view_incomeType.isHidden = true
                                view_datetime.isHidden = true
                                view_orderNum.isHidden = true
                                view_subUser.isHidden = true
                                view_remark.isHidden = true
                                Services.balanceDetail(id: id).subscribe(onNext: {data in
                                                if let m = data.data{
                                                                self.view_incomeType.isHidden = false
                                                                self.view_datetime.isHidden = false
                                                                self.view_orderNum.isHidden = false
                                                                self.view_remark.isHidden = false
                                                                if m.changeType == .increase{
                                                                                self.label_price.text = String(format: "+%.2lf", m.amount)
                                                                                self.label_price.textColor = UIColor(hexString: "#FE3211")?.withAlphaComponent(0.8)
                                                                }else{
                                                                                self.label_price.text = String(format: "-%.2lf", m.amount)
                                                                                self.label_price.textColor = .black.withAlphaComponent(0.8)
                                                                }
                                                                self.label_incomeType.text = m.type
                                                                self.label_datetime.text = m.paymentTime
                                                                self.label_orderNum.text = m.payOrderNo
                                                                self.view_subUser.isHidden = m.userName.isEmpty
                                                                self.label_subUserName.text = m.userName
                                                                self.image_subUserAvartar.sd_setImage(with: URL(string: m.avatar))
                                                                self.label_remakr.text = m.remark
                                                }
                                }).disposed(by: disposeBag)
    }
                override func viewWillDisappear(_ animated: Bool) {
                                super.viewDidDisappear(animated)
XQMuse/Root/Me/VC/SpendingDetailInfoVC.xib
@@ -11,7 +11,19 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SpendingDetailInfoVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="image_subUserAvartar" destination="Xrs-Ns-uus" id="BWY-Ym-dbP"/>
                <outlet property="label_datetime" destination="Cv1-Z7-VpI" id="dAs-uh-cnZ"/>
                <outlet property="label_incomeType" destination="Vch-45-s0U" id="Fka-TJ-wqx"/>
                <outlet property="label_orderNum" destination="fQy-0x-TJ9" id="Nea-dJ-cM9"/>
                <outlet property="label_price" destination="5gW-lj-8Uk" id="U1G-mZ-ph0"/>
                <outlet property="label_remakr" destination="3JX-nJ-8Mi" id="gVL-aU-3ws"/>
                <outlet property="label_subUserName" destination="lLV-Rs-74K" id="48c-Ll-e0R"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="view_datetime" destination="7Ym-dd-vx2" id="JUw-DQ-17I"/>
                <outlet property="view_incomeType" destination="paU-qi-7Zk" id="yQ6-0X-6cq"/>
                <outlet property="view_orderNum" destination="nvZ-aC-LZK" id="Ss6-sC-tZB"/>
                <outlet property="view_remark" destination="Yhm-fa-EN3" id="AiJ-rj-8ZG"/>
                <outlet property="view_subUser" destination="AKh-er-j4M" id="hyW-dn-tPY"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
XQMuse/Root/Me/VC/SpendingDetailVC.swift
@@ -38,10 +38,24 @@
                                return pageViewController
                }()
                private var balance:Double = 0
                private var income:Double = 0
                required init(balance:Double,income:Double) {
                                super.init(nibName: nil, bundle: nil)
                                self.balance = balance
                                self.income = income
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "余额明细"
                                headerVC.label_balance.text = "\(balance)"
                                headerVC.income = income
    }
                override func setUI() {
@@ -71,7 +85,7 @@
                }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                let v = SpendingDetailContentVC(page: page)
                                let v = SpendingDetailContentVC(state: page + 1)
                                return v
                }
XQMuse/Root/Me/VC/StudyListVC.swift
@@ -12,14 +12,29 @@
class StudyListVC: BaseVC {
                @IBOutlet weak var collectionView: UICollectionView!
                private var datas:MyStudyModel?
                override func viewDidLoad() {
        super.viewDidLoad()
                                title = "学习"
                                Services.studyPage().subscribe(onNext: {data in
                                                self.datas = data.data
                                                self.collectionView.reloadData()
                                }).disposed(by: disposeBag)
    }
                override func setUI() {
                                super.setUI()
                                view.backgroundColor = UIColor(hexString: "#F6F6F6")
                                let layout = HoverHeaderFlowLayout()
                                layout.naviHeight = 0
                                let w = (JQ_ScreenW - 18 * 3) / 2
                                layout.itemSize = CGSize(width: w, height: w * 1.319)
                                layout.headerReferenceSize = CGSize(width: JQ_ScreenW, height: 59)
                                collectionView.collectionViewLayout = layout
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.backgroundColor = UIColor(hexString: "#F6F6F6")
@@ -37,25 +52,52 @@
extension StudyListVC:UICollectionViewDelegate & UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                var modelId:Int?
                                if indexPath.section == 0{
                                                modelId = datas?.courseList[indexPath.row].id
                                }
                                if indexPath.section == 0{
                                                modelId = datas?.freeCourseList[indexPath.row].id
                                }
                                if let id = modelId{
                                                let vc = CourseDetialVC(courseId: id)
                                                push(vc: vc)
                                }
                }
                func numberOfSections(in collectionView: UICollectionView) -> Int {
                                return 2
                }
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                if indexPath.section == 0{
                                            let cell    = collectionView.dequeueReusableCell(withReuseIdentifier: "_EmptyCCell", for: indexPath) as! EmptyCCell
                                                let count = datas?.courseList.count ?? 0
                                                if count == 0{
                                                                let cell    = collectionView.dequeueReusableCell(withReuseIdentifier: "_EmptyCCell", for: indexPath) as! EmptyCCell
                                                                return cell
                                                }else{
                                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeRelaxBanner_2_1_CCell", for: indexPath) as! HomeRelaxBanner_2_1_CCell
                                                                cell.setCourseModel(datas!.courseList[indexPath.row])
                                                                return cell
                                                }
                                }else{
                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeRelaxBanner_2_1_CCell", for: indexPath) as! HomeRelaxBanner_2_1_CCell
                                                cell.setCourseModel(datas!.freeCourseList[indexPath.row])
                                                return cell
                                }
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeRelaxBanner_2_1_CCell", for: indexPath) as! HomeRelaxBanner_2_1_CCell
                                cell.backgroundColor = .jq_randomColor
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                if section == 0{
                                                let count = datas?.courseList.count ?? 0
                                                if count > 0{return count}
                                                return 1
                                }else {
                                                return 5
                                                return datas?.freeCourseList.count ?? 0
                                }
                }
}
@@ -88,7 +130,10 @@
                }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                                if indexPath.section == 0{
                                let count = datas?.courseList.count ?? 0
                                if indexPath.section == 0 && count == 0{
                                                return CGSize(width: JQ_ScreenW, height: 279)
                                }
XQMuse/Root/Me/VC/TreatyVC.swift
@@ -93,6 +93,10 @@
                }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                return WebVC(url: "https://www.baidu.com")
                                if page == 0{
                                                return WebVC(type: .user)
                                }else{
                                                return WebVC(type: .privacy)
                                }
                }
}
XQMuse/Root/Me/VC/WalletVC.swift
@@ -6,20 +6,46 @@
//
import UIKit
import JQTools
class WalletVC: BaseVC {
                @IBOutlet weak var label_balance: UILabel!
                @IBOutlet weak var label_recharge: UILabel!
                @IBOutlet weak var label_income: UILabel!
                private var walletModel:WalletModel?
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "钱包"
                                getData()
    }
                override func setRx() {
                                NotificationCenter.default.rx.notification(WithDrawReply_Noti).subscribe(onNext: {_ in
                                                self.getData()
                                }).disposed(by: disposeBag)
                }
                private func getData(){
                                Services.myWallet().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                self.walletModel = m
                                                                self.label_balance.text = m.balance.jq_formatFloat
                                                                self.label_recharge.text = m.recharge.jq_formatFloat
                                                                self.label_income.text = m.income.jq_formatFloat
                                                }
                                }).disposed(by: disposeBag)
                }
                override func setUI() {
                                view.backgroundColor = UIColor(hexString: "#fafafa")
                }
                @IBAction func withdrawAction(_ sender: UIButton) {
                                let vc = BankWithdrawVC()
                                let vc = BankWithdrawVC(income: walletModel?.income ?? 0)
                                push(vc: vc)
                }
@@ -29,7 +55,7 @@
                }
                @IBAction func spendingDetailAction(_ sender: TapBtn) {
                                let vc = SpendingDetailVC()
                                let vc = SpendingDetailVC(balance: walletModel?.balance ?? 0, income: walletModel?.income ?? 0)
                                push(vc: vc)
                }
                
XQMuse/Root/Me/VC/WalletVC.xib
@@ -11,6 +11,9 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WalletVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="label_balance" destination="ytR-o7-C2p" id="ZJD-cY-KS9"/>
                <outlet property="label_income" destination="0xP-OZ-ZWR" id="j2F-dD-gQ9"/>
                <outlet property="label_recharge" destination="RPE-c0-yYK" id="XNA-Kd-EpG"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
XQMuse/Root/Me/VC/WatchHistoryDetailVC.swift
@@ -7,53 +7,89 @@
import UIKit
import JQTools
import RxRelay
import RxSwift
class WatchHistoryViewModel:RefreshInnerModel<CourseModel>{
                let state = BehaviorRelay<Int>(value: 1)
                var type = BehaviorRelay<WatchType>(value: .collect)
                override func api() -> (Observable<BaseResponse<BaseResponseList<CourseModel>>>)? {
                                switch type.value {
                                                case .history:Services.lookHistory(page: page, pageSize: 20, state: state.value)
                                                case .collect:Services.myCollect(page: page, pageSize: 20, state: state.value)
                                                case .payment:Services.myOrderCourse(page: page, pageSize: 20, state: state.value)
                                }
                }
}
class WatchHistoryDetailVC: BaseVC {
                private var page:Int!
                private var viewModel = WatchHistoryViewModel()
                private var collectionView:UICollectionView!
                init(page:Int) {
                init(state:Int,type:WatchType) {
                                super.init(nibName: nil, bundle: nil)
                                self.page = page
                                self.viewModel.type.accept(type)
                                self.viewModel.state.accept(state)
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                override func viewDidLoad() {
                                super.viewDidLoad()
                                let layout = UICollectionViewFlowLayout()
                                collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.showsVerticalScrollIndicator = false
                                collectionView.backgroundColor = .clear
                                collectionView.register(UINib(nibName: "HomeRelaxBannerCCell", bundle: nil), forCellWithReuseIdentifier: "_HomeRelaxBannerCCell")
                                collectionView.contentInset = UIEdgeInsets(top: 29, left: 29.5 , bottom: 0, right: 29.5)
                                collectionView.contentInset = UIEdgeInsets(top: 0, left: 29.5 , bottom: 0, right: 29.5)
                                view.addSubview(collectionView)
                                collectionView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                                make.top.equalTo(0)
                                                make.left.right.bottom.equalToSuperview()
                                }
    }
                                viewModel.configure(collectionView)
                                viewModel.beginRefresh()
                }
}
extension WatchHistoryDetailVC:UICollectionViewDelegate & UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 5
                                return viewModel.dataSource.value?.list.count ?? 0
                }
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeRelaxBannerCCell", for: indexPath) as! HomeRelaxBannerCCell
                                cell.contentView.backgroundColor = .jq_randomColor
                                let m = viewModel.dataSource.value!.list[indexPath.row]
                                cell.setCourseModel(m)
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                                return CGSizeMake(JQ_ScreenW, 29)
                }
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                                let vc = HomeItemDetailVC(id: 0)
                                let m = viewModel.dataSource.value!.list[indexPath.row]
                                if viewModel.state.value == 1{
                                                let vc = HomeItemDetailVC(id: m.id)
                                                JQ_currentViewController().jq_push(vc: vc)
                                }else{
                                                let vc = CourseDetialVC(courseId: m.id)
                                                JQ_currentViewController().jq_push(vc: vc)
                                }
                }
}
XQMuse/Root/Me/VC/WatchHistoryVC.swift
@@ -123,6 +123,6 @@
                }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                return WatchHistoryDetailVC(page: page)
                                return WatchHistoryDetailVC(state: page+1, type: watchType)
                }
}
XQMuse/Root/Network/Models.swift
@@ -252,8 +252,8 @@
                var continuity: Int = 0
                var cumulative: Int = 0
                var level: Int = 0
                var levelIcon: String?
                var levelName: String?
                var levelIcon: String = ""
                var levelName: String = ""
                var today: Int = 0
}
@@ -343,6 +343,115 @@
                var indexPath:IndexPath?
}
struct HeadingLevelModel:HandyJSON{
                var content: String = ""
                var differenceLevel: Int = 0
                var growthValue: Int = 0
                var level: Int = 0
                var levelIcon: String = ""
                var levelName: String = ""
                var nextLevel: Int = 0
}
struct MyStudyModel:HandyJSON{
                var courseList = [CourseModel]()
                var freeCourseList = [CourseModel]()
}
struct WalletModel:HandyJSON{
                var balance:Double = 0
                var income:Double = 0
                var recharge:Double = 0
}
struct BankInfoModel:HandyJSON{
                var appUserId: Int = 0
                var bankName: String = ""
                var cardholder: String = ""
                var cardNo: String = ""
                var cellPhone: String = ""
                var createBy: String = ""
                var createTime: String = ""
                var delFlag: Int = 0
                var id: Int = 0
                var identityCard: String = ""
                var updateBy: String = ""
                var updateTime: String = ""
}
struct BalanceInfoModel:HandyJSON{
                var changeType:EnergyChangeType = .increase
                var id = 0
                var reason = ""
                var createTime = ""
                var amount:Double = 0
}
struct BalanceInfoDetailModel:HandyJSON{
                var amount: Double = 0
                var avatar: String = ""
                var changeType:EnergyChangeType = .increase
                var id: Int = 0
                var paymentTime: String = ""
                var payOrderNo: String = ""
                var remark: String = ""
                var type: String = ""
                var userName: String = ""
}
struct CommonQuestionModel:HandyJSON{
                var content: String = ""
                var createBy: String = ""
                var createTime: String = ""
                var customerServiceQrCode: String = ""
                var delFlag: Int = 0
                var id: Int = 0
                var questionDescription: String = ""
                var questionName: String = ""
                var sortNum: Int = 0
                var type: Int = 0
                var updateBy: String = ""
                var updateTime: String = ""
}
class NoticeModel:HandyJSON{
                var appUserId: Int = 0
                var content: String = ""
                var createBy: String = ""
                var createTime: String = ""
                var delFlag: Int = 0
                var id: Int = 0
                var meditationQuestionId: Int = 0
                var noticeType: Int = 0
                var readStatus: Int = 0
                var time: String = ""
                var title: String = ""
                var updateBy: String = ""
                var updateTime: String = ""
                required init() {}
}
struct NoticeDetailModel:HandyJSON{
                var avatar: String = ""
                var content: String = ""
                var coverDescription: String = ""
                var iconUrl: String = ""
                var meditationQuestionId: Int = 0
                var meditationTitle: String = ""
                var nickname: String = ""
                var noticeType: Int = 0
                var publishTime: String = ""
                var realname: String = ""
                var reply: String = ""
                var replyContent: String = ""
                var time: String = ""
                var title: String = ""
}
struct ResponseUserAnswerModel:HandyJSON{
                var tagsId = "" //问题二 多个tagId使用英文逗号拼接字符串
                var userAnswerOneDTOList = [ResponseUserAnswerDTOModel]()
XQMuse/Root/Network/Services.swift
@@ -247,6 +247,14 @@
                                                .append(key: "apipost_id", value: "2d2eb9d23993c2")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                //学习
                class func studyPage()->Observable<BaseResponse<MyStudyModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/course/client/course/course/studyPage")
                                                .append(key: "apipost_id", value: "2d2eb9d23993be")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
/// 疗愈馆
@@ -351,6 +359,125 @@
                                                .append(key: "apipost_id", value: "25c3dab9f0e025")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                /// 冥想等级
                class func userHeadingLevel()->Observable<BaseResponse<HeadingLevelModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/client/app-user/healingLevel")
                                                .append(key: "apipost_id", value: "34d924b4b991f0")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                class func myWallet()->Observable<BaseResponse<WalletModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/wallet")
                                                .append(key: "apipost_id", value: "3518e3f0b99420")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                class func getMyBankList()->Observable<BaseResponse<[BankInfoModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/wallet")
                                                .append(key: "apipost_id", value: "361bdf11f992d2")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                class func withdraw(bankId:Int,money:Double)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-withdraw/withdraw")
                                                .append(key: "apipost_id", value: "361bdf11f992d3")
                                                .append(key: "bankId", value: bankId)
                                                .append(key: "money", value: money)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                //添加银行卡
                class func addBank(_ model:AddBankInfoVC.AddBankRequestModel)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-withdraw/withdraw")
                                                .append(key: "apipost_id", value: "361bdf11f992d1")
                                                .append(dic: model.toRequest())
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                //添加银行卡
                class func deleteBank(_ id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-withdraw/deleteBank")
                                                .append(key: "apipost_id", value: "362cb08c799646")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                /// 余额明细表
                /// - Parameters:
                ///   - state: 1全部 2收入 3支出
                class func balanceRecordList(page:Int,pageSize:Int = 20,state:Int)->Observable<BaseResponse<BaseResponseList<BalanceInfoModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-wallet-record/balanceList")
                                                .append(key: "apipost_id", value: "361bdf11b992d0")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "state", value: state)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 观看历史
                /// - Parameters:
                ///   - state: 1冥想 2课程
                class func lookHistory(page:Int,pageSize:Int = 20,state:Int)->Observable<BaseResponse<BaseResponseList<CourseModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/user/app-user-viewing-history/lookHistory")
                                                .append(key: "apipost_id", value: "361bdf123992fb")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "state", value: state)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 我的收藏
                /// - Parameters:
                ///   - state: 1冥想 2课程
                class func myCollect(page:Int,pageSize:Int = 20,state:Int)->Observable<BaseResponse<BaseResponseList<CourseModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/course/client/course/course/myCollect")
                                                .append(key: "apipost_id", value: "365e099bb9988b")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "state", value: state)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 我的购买
                /// - Parameters:
                ///   - state: 1冥想 2课程
                class func myOrderCourse(page:Int,pageSize:Int = 20,state:Int)->Observable<BaseResponse<BaseResponseList<CourseModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/order/client/order/order/myOrderCourse")
                                                .append(key: "apipost_id", value: "365f4fc1b99030")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "state", value: state)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                class func balanceDetail(id:Int)->Observable<BaseResponse<BalanceInfoDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user-wallet-record/balanceDetail")
                                                .append(key: "apipost_id", value: "361bdf11b992cf")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                class func changePhone(phone:String,code:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/changePhone")
                                                .append(key: "apipost_id", value: "361bdf11f992e6")
                                                .append(key: "phone", value: phone)
                                                .append(key: "code", value: code)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
@@ -447,4 +574,50 @@
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
                /// 问题列表
                class func commonQuestion(page:Int,pageSize:Int = 20)->Observable<BaseResponse<BaseResponseList<CommonQuestionModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/system/system/common-question/commonQuestion")
                                                .append(key: "apipost_id", value: "36618045f991c4")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                /// 问题列表
                class func commonQuestionDetailBy(id:Int)->Observable<BaseResponse<CommonQuestionModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/system/system/common-question/getQuestionById")
                                                .append(key: "apipost_id", value: "366180463991c5")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                class func deleteUser()->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/user/client/app-user/deleteUser")
                                                .append(key: "apipost_id", value: "361bdf11f992e7")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                class func noticeList(page:Int,pageSize:Int = 20)->Observable<BaseResponse<BaseResponseList<NoticeModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/user/client/user/notice-record/noticeList")
                                                .append(key: "apipost_id", value: "361bdf123992f9")
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
                class func noticeDetailId(_ id:Int)->Observable<BaseResponse<NoticeDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/user/client/user/notice-record/noticeDetail")
                                                .append(key: "apipost_id", value: "361bdf123992f8")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
XQMuse/SceneDelegate.swift
@@ -44,8 +44,9 @@
                                loginNav.modalPresentationStyle = .fullScreen
                                JQ_currentViewController().present(loginNav, animated: true)
                }
                func loginSuccess(){
                }
                func sceneDidDisconnect(_ scene: UIScene) {