杨锴
2024-11-20 c649531411191cd60591eafcd9c3b9a9fede13e4
fix bug
8个文件已修改
634 ■■■■ 已修改文件
XQMuse/Root/Course/CCell/CourseOfficialItemCCell.xib 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/HomeVC.swift 571 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/PaymentOrderVC.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Login/VC/UpdatePhoneVC.swift 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Services.swift 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Plans/PlanGuideVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Plans/PlanGuide_3_VC.swift 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/SceneDelegate.swift 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Course/CCell/CourseOfficialItemCCell.xib
@@ -17,11 +17,11 @@
                <rect key="frame" x="0.0" y="0.0" width="114" height="109"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <subviews>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_1" translatesAutoresizingMaskIntoConstraints="NO" id="D7q-iI-B0n">
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_1" translatesAutoresizingMaskIntoConstraints="NO" id="D7q-iI-B0n">
                        <rect key="frame" x="39.666666666666664" y="29" width="34.999999999999993" height="31.666666666666671"/>
                        <constraints>
                            <constraint firstAttribute="width" relation="lessThanOrEqual" constant="35" id="A6U-Ns-BoS"/>
                            <constraint firstAttribute="height" relation="lessThanOrEqual" constant="31.5" id="xu0-nX-9PR"/>
                            <constraint firstAttribute="width" relation="lessThanOrEqual" constant="43" id="A6U-Ns-BoS"/>
                            <constraint firstAttribute="height" relation="lessThanOrEqual" constant="50" id="xu0-nX-9PR"/>
                        </constraints>
                    </imageView>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eyG-jG-ONh">
XQMuse/Root/Home/HomeVC.swift
@@ -18,28 +18,28 @@
let ReloadData_Noti = Notification.Name.init("ReloadData_Noti")
struct TitleItem{
                var id = 0
                var title = ""
                var subTitle = ""
                var hasMore:Bool = false
                var coverImage:String?
    var id = 0
    var title = ""
    var subTitle = ""
    var hasMore:Bool = false
    var coverImage:String?
}
class HomeViewModel{
                var homeTopMenuItems = [HomeTopMenuItem]()
                var homeBottomMenuItems = [HomeTopMenuItem]()
                var todyModel:ToDayMeditationModel?
                var privateTodyModels = [MeditationModel]()
                var meditationList = [MeditationListModel]()
    var homeTopMenuItems = [HomeTopMenuItem]()
    var homeBottomMenuItems = [HomeTopMenuItem]()
    var todyModel:ToDayMeditationModel?
    var privateTodyModels = [MeditationModel]()
    var meditationList = [MeditationListModel]()
}
class HomeVC: BaseVC {
                private var tableView:UITableView!
                private let topMenuView = HomeTopMenuView.jq_loadNibView()
                private var titleItems = [TitleItem]()
                private var viewModel = HomeViewModel()
    private var tableView:UITableView!
    private let topMenuView = HomeTopMenuView.jq_loadNibView()
    private var titleItems = [TitleItem]()
    private var viewModel = HomeViewModel()
    private var timer:Timer?
    private var needPopToTree:Bool = false //是否需要跳转到树苗
    private var needPopToTree:Bool = false //是否需跳转到树苗
    private var cellularData:CTCellularData!
@@ -84,20 +84,20 @@
    override func viewDidLoad() {
        super.viewDidLoad()
                                titleItems.removeAll()
        titleItems.removeAll()
        timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(autoUpdate), userInfo: nil, repeats: true)
        RunLoop.current.add(timer!, forMode: .default)
                                titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation"))
                                titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true))
                                titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide"))
        titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation"))
        titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true))
        titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide"))
                                if let setting = UserDefaultSettingViewModel.getSetting(){
                                                if let audioFile = setting.bgm?.audioFile{
                                                                AudioPlayer.getSharedInstance().playSceneAt(audioFile)
                                                }
                                }
        if let setting = UserDefaultSettingViewModel.getSetting(){
            if let audioFile = setting.bgm?.audioFile{
                AudioPlayer.getSharedInstance().playSceneAt(audioFile)
            }
        }
        tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
            self.getData()
@@ -107,7 +107,7 @@
            topMenuView.image_top.sd_setImage(with: URL(string: m.imageUrl.jq_urlEncoded()))
        }
                                getData()
        getData()
        cellularData = CTCellularData()
        cellularData.cellularDataRestrictionDidUpdateNotifier = {[weak self] state in
@@ -142,95 +142,95 @@
        }
    }
                override func setUI() {
                                super.setUI()
    override func setUI() {
        super.setUI()
                                let titleView = UIView()
                                titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
                                let titleL = UILabel()
                                titleL.font = Def_SourceHanSansCN_Regular(fontSize: 21)
                                titleL.text = "心 泉 疗 愈"
                                titleL.textAlignment = .center
                                titleL.textColor = UIColor(hexStr: "#252A23")
                                titleL.frame = CGRect(x: 0, y: 0, width: 100, height: 19)
        let titleView = UIView()
        titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
        let titleL = UILabel()
        titleL.font = Def_SourceHanSansCN_Regular(fontSize: 21)
        titleL.text = "心 泉 疗 愈"
        titleL.textAlignment = .center
        titleL.textColor = UIColor(hexStr: "#252A23")
        titleL.frame = CGRect(x: 0, y: 0, width: 100, height: 19)
                                let subTitleL = UILabel()
                                subTitleL.font = Def_Agenda_Light(fontSize: 8)
                                subTitleL.text = "XIN QUAN"
                                subTitleL.textAlignment = .center
                                subTitleL.textColor = UIColor(hexStr: "#252A23")
                                subTitleL.frame = CGRect(x: 0, y: 20, width: 100, height: 19)
        let subTitleL = UILabel()
        subTitleL.font = Def_Agenda_Light(fontSize: 8)
        subTitleL.text = "XIN QUAN"
        subTitleL.textAlignment = .center
        subTitleL.textColor = UIColor(hexStr: "#252A23")
        subTitleL.frame = CGRect(x: 0, y: 20, width: 100, height: 19)
                                titleView.addSubview(titleL)
                                titleView.addSubview(subTitleL)
        titleView.addSubview(titleL)
        titleView.addSubview(subTitleL)
                                navigationItem.titleView = titleView
        navigationItem.titleView = titleView
                                 let search = UIButton(type: .custom)
                                search.setImage(UIImage(named: "btn_search"), for: .normal)
                                search.addTarget(self, action: #selector(searchAction), for: .touchUpInside)
                                search.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
                                navigationItem.leftBarButtonItem = UIBarButtonItem(customView: search)
        let search = UIButton(type: .custom)
        search.setImage(UIImage(named: "btn_search"), for: .normal)
        search.addTarget(self, action: #selector(searchAction), for: .touchUpInside)
        search.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: search)
                                let voices = UIButton(type: .custom)
                                voices.setImage(UIImage(named: "btn_voices"), for: .normal)
                                voices.addTarget(self, action: #selector(settingvoiceAction), for: .touchUpInside)
                                voices.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
                                navigationItem.rightBarButtonItem = UIBarButtonItem(customView: voices)
        let voices = UIButton(type: .custom)
        voices.setImage(UIImage(named: "btn_voices"), for: .normal)
        voices.addTarget(self, action: #selector(settingvoiceAction), for: .touchUpInside)
        voices.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: voices)
                                tableView = UITableView(frame: .zero, style: .plain)
                                tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)
                                tableView.showsVerticalScrollIndicator = false
                                DispatchQueue.main.async {
                                                let h = 119 + 20.5 + JQ_ScreenW * 0.913
                                                self.topMenuView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: h)
                                                self.tableView.tableHeaderView = self.topMenuView
                                }
        tableView = UITableView(frame: .zero, style: .plain)
        tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)
        tableView.showsVerticalScrollIndicator = false
        DispatchQueue.main.async {
            let h = 119 + 20.5 + JQ_ScreenW * 0.913
            self.topMenuView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: h)
            self.tableView.tableHeaderView = self.topMenuView
        }
                                tableView.tableHeaderView = topMenuView
        tableView.tableHeaderView = topMenuView
                                tableView.register(UINib(nibName: "Home_Style_1_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_1_TCell")
                                tableView.register(UINib(nibName: "Home_Style_2_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_2_TCell")
                                tableView.register(UINib(nibName: "Home_Style_3_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_3_TCell")
                                tableView.register(UINib(nibName: "Home_Style_4_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_4_TCell")
        tableView.register(UINib(nibName: "Home_Style_1_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_1_TCell")
        tableView.register(UINib(nibName: "Home_Style_2_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_2_TCell")
        tableView.register(UINib(nibName: "Home_Style_3_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_3_TCell")
        tableView.register(UINib(nibName: "Home_Style_4_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_4_TCell")
                                tableView.register(UINib(nibName: "Home_Style_5_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_5_TCell")
        tableView.register(UINib(nibName: "Home_Style_5_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_5_TCell")
                                tableView.separatorStyle = .none
                                tableView.delegate = self
                                tableView.dataSource = self
                                if #available(iOS 15.0, *) {
                                                tableView.sectionHeaderTopPadding = 0
                                } else {
        tableView.separatorStyle = .none
        tableView.delegate = self
        tableView.dataSource = self
        if #available(iOS 15.0, *) {
            tableView.sectionHeaderTopPadding = 0
        } else {
                                }
                                tableView.register(HomeHeaderView.self, forHeaderFooterViewReuseIdentifier: "_HomeHeaderView")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                }
        }
        tableView.register(HomeHeaderView.self, forHeaderFooterViewReuseIdentifier: "_HomeHeaderView")
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }
                override func setRx() {
                                topMenuView.clickItemAt {[unowned self] item in
    override func setRx() {
        topMenuView.clickItemAt {[unowned self] item in
            let vc = HomeItemListVC(topTitle: item.title, id: item.id, showType:.vertical)
                                                self.push(vc: vc)
                                }
            self.push(vc: vc)
        }
                                NotificationCenter.default.rx.notification(SetBGMSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
                                                self.topMenuView.resetTopImage()
                                }).disposed(by: disposeBag)
        NotificationCenter.default.rx.notification(SetBGMSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
            self.topMenuView.resetTopImage()
        }).disposed(by: disposeBag)
                                NotificationCenter.default.rx.notification(PlantGuideQuit_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]data in
        NotificationCenter.default.rx.notification(PlantGuideQuit_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]data in
            guard let weakSelf = self else { return }
            weakSelf.needPopToTree = data.object as? Bool ?? false
            weakSelf.getData()
                                }).disposed(by: disposeBag)
        }).disposed(by: disposeBag)
        NotificationCenter.default.rx.notification(LoginSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
            self.getData()
@@ -244,40 +244,40 @@
        NotificationCenter.default.rx.notification(ReloadData_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
            self.tableView.reloadData()
        }).disposed(by: disposeBag)
                }
    }
                private func getData(){
    private func getData(){
        tableView.mj_header?.endRefreshing()
                                Services.getCategoryListByType(type: 1).subscribe(onNext: { data in
                                                var items = [HomeTopMenuItem]()
                                                for v in data.data ?? []{
        Services.getCategoryListByType(type: 1).subscribe(onNext: { data in
            var items = [HomeTopMenuItem]()
            for v in data.data ?? []{
                let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.firstIconUrl.jq_urlEncoded(), imageFrom: .url)
                                                                items.append(model)
                                                }
                items.append(model)
            }
                                                self.viewModel.homeTopMenuItems = items
                                                let h = ceil(Double(items.count) / 4.0) * 119 + 20.5 + JQ_ScreenW * 0.913
                                                self.topMenuView.menu_height.constant = ceil(Double(items.count) / 4.0) * 119
                                                self.tableView.tableHeaderView?.frame = CGRect(origin: .zero, size: CGSizeMake(JQ_ScreenW, h))
                                                self.topMenuView.resetItems(items)
                                                self.topMenuView.menu_collectionView.reloadData()
                                }).disposed(by: disposeBag)
            self.viewModel.homeTopMenuItems = items
            let h = ceil(Double(items.count) / 4.0) * 119 + 20.5 + JQ_ScreenW * 0.913
            self.topMenuView.menu_height.constant = ceil(Double(items.count) / 4.0) * 119
            self.tableView.tableHeaderView?.frame = CGRect(origin: .zero, size: CGSizeMake(JQ_ScreenW, h))
            self.topMenuView.resetItems(items)
            self.topMenuView.menu_collectionView.reloadData()
        }).disposed(by: disposeBag)
                                Services.getCategoryListByType(type: 2).subscribe(onNext: { data in
                                                var items = [HomeTopMenuItem]()
                                                for v in data.data ?? []{
        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.secondIconUrl.jq_urlEncoded(), imageFrom: .url)
                                                                items.append(model)
                                                }
                items.append(model)
            }
            self.viewModel.homeBottomMenuItems = items
                                                self.tableView.reloadRows(at: [IndexPath(row: 4, section: 0)], with: .none)
                                }).disposed(by: disposeBag)
            self.tableView.reloadRows(at: [IndexPath(row: 4, section: 0)], with: .none)
        }).disposed(by: disposeBag)
                                Services.getTopdayMedita().subscribe(onNext: { data in
                                                self.viewModel.todyModel = data.data
                                                self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
                                }).disposed(by: disposeBag)
        Services.getTopdayMedita().subscribe(onNext: { data in
            self.viewModel.todyModel = data.data
            self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
        }).disposed(by: disposeBag)
@@ -285,36 +285,36 @@
        let m = MeditationModel()
        m.id = 0
        self.viewModel.privateTodyModels = [m]
//        if !(UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true){
            Services.getPersonalityPlan().subscribe(onNext: { data in
                if let m = data.data{
                    if m.count > 0{
                        self.viewModel.privateTodyModels = m
                    }
                    self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none)
        //        if !(UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true){
        Services.getPersonalityPlan().subscribe(onNext: { data in
            if let m = data.data{
                if m.count > 0{
                    self.viewModel.privateTodyModels = m
                }
            }).disposed(by: disposeBag)
//        }else{
//            self.tableView.reloadData()
//        }
                self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none)
            }
        }).disposed(by: disposeBag)
        //        }else{
        //            self.tableView.reloadData()
        //        }
                                Services.getMeditationAndCateList().subscribe(onNext: { data in
                                                if let m = data.data{
                                                                self.viewModel.meditationList.removeAll()
        Services.getMeditationAndCateList().subscribe(onNext: { data in
            if let m = data.data{
                self.viewModel.meditationList.removeAll()
                self.titleItems.removeAll()
                self.titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation"))
                self.titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true))
                self.titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide"))
                                                                self.viewModel.meditationList = m
                self.viewModel.meditationList = m
                for v in self.viewModel.meditationList{
                    if v.clientMeditationCategoryVO?.categoryName.isEmpty ?? true{continue}
                                                                                self.titleItems.append(TitleItem(title: v.clientMeditationCategoryVO?.categoryName ?? "", subTitle: v.clientMeditationCategoryVO?.description ?? "",hasMore:true))
                                                                }
                                                                self.tableView.reloadData()
                                                }
                                }).disposed(by: disposeBag)
                    self.titleItems.append(TitleItem(title: v.clientMeditationCategoryVO?.categoryName ?? "", subTitle: v.clientMeditationCategoryVO?.description ?? "",hasMore:true))
                }
                self.tableView.reloadData()
            }
        }).disposed(by: disposeBag)
        Services.getLunchPage().subscribe(onNext: {data in
@@ -340,106 +340,120 @@
            }
        }).disposed(by: disposeBag)
                }
    }
    @objc func autoUpdate(){
        guard !(viewModel.todyModel?.endPlayTime.isEmpty ?? true) else {return}
    @objc func autoUpdate() {
        guard let endPlayTime = viewModel.todyModel?.endPlayTime, !endPlayTime.isEmpty else { return }
        let todayEndDay = Date().jq_format("yyyy-MM-dd") + " \(viewModel.todyModel!.endPlayTime)"
        let endDayInterval = Date.jq_StringToTimeInterval(todayEndDay,"yyyy-MM-dd HH:mm:ss")
        let todayEndDay = Date().jq_format("yyyy-MM-dd") + " \(endPlayTime)"
        let endDayInterval = Date.jq_StringToTimeInterval(todayEndDay, "yyyy-MM-dd HH:mm:ss")
        if Date().timeIntervalSince1970 > endDayInterval{
            Services.getTopdayMedita().subscribe(onNext: { data in
        if Date().timeIntervalSince1970 > endDayInterval {
            Services.getTopdayMedita().subscribe(onNext: { [weak self] data in
                guard let self = self else { return }
                self.viewModel.todyModel = data.data
                self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
            }).disposed(by: disposeBag)
        }
    }
                @objc func searchAction(){
    @objc func searchAction(){
        let vc = SearchVC(serchType: .muse)
                                push(vc: vc)
                }
        push(vc: vc)
    }
                @objc func settingvoiceAction(){
    @objc func settingvoiceAction(){
        let vc = BackgroundVoiceVC(isFromFist: false)
                                push(vc: vc)
                }
        push(vc: vc)
    }
                @objc func jumpMoreAction(_ sender:UIButton){
                                switch sender.tag {
                                                case 201:
                                                                //跳转计划引导
    @objc func jumpMoreAction(_ sender:UIButton){
        switch sender.tag {
            case 201:
                //跳转计划引导
                let nav    = BaseNav(rootViewController: PlanGuideVC(isFromFist: false))
                                                                nav.modalPresentationStyle = .fullScreen
                                                                present(nav, animated: true)
                                                                break
                                                default:
                                                                 let topTitle = titleItems[sender.tag - 200].title
                                                                let m = viewModel.meditationList[sender.tag - 200 - 3]
                                                                if let id = m.clientMeditationCategoryVO?.id{
                nav.modalPresentationStyle = .fullScreen
                present(nav, animated: true)
                break
            default:
                let topTitle = titleItems[sender.tag - 200].title
                let m = viewModel.meditationList[sender.tag - 200 - 3]
                if let id = m.clientMeditationCategoryVO?.id{
                    let vc = HomeItemListVC(topTitle: topTitle, id: id,showType: .vertical)
                                                                                push(vc: vc)
                                                                }
                                }
                }
                    push(vc: vc)
                }
        }
    }
    deinit {
        // 使定时器失效
        timer?.invalidate()
        // 移除通知中心观察者
        NotificationCenter.default.removeObserver(self)
    }
}
extension HomeVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.section == 0{
            if let m = viewModel.todyModel,let detailId = m.clientMeditationVO?.id{
                if AudioPlayer.getSharedInstance().meditationModel?.id == m.meditationId{
                    if AudioPlayer.getSharedInstance().bgmPlayer?.timeControlStatus == .paused{
                        AudioPlayer.getSharedInstance().bgmPlayer?.play()
                        AudioPlayer.getSharedInstance().masterPlayer?.play()
                        PayMusicVC.updateStatus(.playing)
                        self.viewModel.todyModel?.playAtMe = true
                    }else{
                        AudioPlayer.getSharedInstance().bgmPlayer?.pause()
                        AudioPlayer.getSharedInstance().masterPlayer?.pause()
                        PayMusicVC.updateStatus(.pause)
                        self.viewModel.todyModel?.playAtMe = false
            guard let m = viewModel.todyModel, let detailId = m.clientMeditationVO?.id else {
                alert(msg: "平台暂未设置今日疗愈")
                return
            }
            let audioPlayer = AudioPlayer.getSharedInstance()
            let isSameMeditation = audioPlayer.meditationModel?.id == m.meditationId
            let isPaused = audioPlayer.bgmPlayer?.timeControlStatus == .paused
            if isSameMeditation {
                if isPaused {
                    audioPlayer.bgmPlayer?.play()
                    audioPlayer.masterPlayer?.play()
                    PayMusicVC.updateStatus(.playing)
                    viewModel.todyModel?.playAtMe = true
                } else {
                    audioPlayer.bgmPlayer?.pause()
                    audioPlayer.masterPlayer?.pause()
                    PayMusicVC.updateStatus(.pause)
                    viewModel.todyModel?.playAtMe = false
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
                    self.tableView.reloadData()
                }
            } else {
                // 游客模式都能播放
                Services.getMeditationDetail(id: detailId).subscribe(onNext: { [weak self] data in
                    guard let self = self, let m = data.data else { return }
                    if audioPlayer.meditationModel?.id == m.id && audioPlayer.bgmPlayer?.timeControlStatus == .playing {
                        return
                    }
                    DispatchQueue.main.asyncAfter(delay: 0.4) {
                    audioPlayer.playBGMAt(firstPlayIndex: 0, model: m, delegate: self)
                    PayMusicVC.show(model: m, isHidden: false)
                    self.viewModel.todyModel?.playAtMe = true
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                        self.tableView.reloadData()
                    }
                }else{
                    //游客模式都能播放
                    Services.getMeditationDetail(id: detailId).subscribe(onNext: {[weak self]data in
                        if let m = data.data{
                            if AudioPlayer.getSharedInstance().meditationModel?.id == m.id && AudioPlayer.getSharedInstance().bgmPlayer?.timeControlStatus == .playing{
                                return
                            }
                            AudioPlayer.getSharedInstance().playBGMAt(firstPlayIndex: 0, model: m, delegate: self)
                            PayMusicVC.show(model: m,isHidden: false)
                            self?.viewModel.todyModel?.playAtMe = true
                            DispatchQueue.main.asyncAfter(delay: 1.0) {
                                self?.tableView.reloadData()
                            }
                        }
                    }).disposed(by: disposeBag)
                }
            }else{
                alert(msg: "平台暂未设置今日疗愈")
                }).disposed(by: disposeBag)
            }
        }
                                if indexPath.section == 2{
                                                let vc = WebVC(type: .guide)
                                                vc.title = "泉疗愈"
                                                push(vc: vc)
                                }
                }
        if indexPath.section == 2{
            let vc = WebVC(type: .guide)
            vc.title = "泉疗愈"
            push(vc: vc)
        }
    }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 && indexPath.row == 0{
            //每日疗愈
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_1_TCell") as! Home_Style_1_TCell
            let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_1_TCell") as! Home_Style_1_TCell
            if viewModel.todyModel?.id != 0{
                cell.model = viewModel.todyModel
                cell.view_data.isHidden = false
@@ -449,109 +463,108 @@
            }
            cell.setplaying()
                                                return cell
                                }else if indexPath.section == 1 && indexPath.row == 0{
            return cell
        }else if indexPath.section == 1 && indexPath.row == 0{
            //私人定制
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
                                                cell.style = .style1
            let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
            cell.style = .style1
            cell.setModels(viewModel.privateTodyModels,showType: .horizontal)
                                                return cell
                                }else if indexPath.section == 2 && indexPath.row == 0{
            return cell
        }else if indexPath.section == 2 && indexPath.row == 0{
            // 新手冥想指南
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_2_TCell") as! Home_Style_2_TCell
            let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_2_TCell") as! Home_Style_2_TCell
            cell.imgView.image = UIImage(named: "bg_guide_home")
                                                cell.view_shadow.isHidden = true
                                                return cell
                                }else {
            cell.view_shadow.isHidden = true
            return cell
        }else {
                                                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
            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]
                                                                if m.clientMeditationCategoryVO!.showType == .horizontal{
                                                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
                                                                                cell.style = .style2
                return cell
            }else{
                let m = viewModel.meditationList[index]
                if m.clientMeditationCategoryVO!.showType == .horizontal{
                    let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
                    cell.style = .style2
                    cell.setModels(m.clientMeditationVOList,showType: .horizontal)
                                                                                return cell
                                                                }else if m.clientMeditationCategoryVO!.showType == .vertical{
                                                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_3_TCell") as! Home_Style_3_TCell
                    return cell
                }else if m.clientMeditationCategoryVO!.showType == .vertical{
                    let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_3_TCell") as! Home_Style_3_TCell
                    cell.setModels(m.clientMeditationVOList,showType: .vertical)
                                                                                return cell
                                                                }
                                                }
                                                return UITableViewCell()
                                }
                }
                    return cell
                }
            }
            return UITableViewCell()
        }
    }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                if section - 3 == 0{
                                                return 2
                                }
                                return 1
                }
        if section - 3 == 0{
            return 2
        }
        return 1
    }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 2{
                                                return JQ_ScreenW * 0.551
                                }else{
                                                let index = indexPath.section - 3
                                                let m = viewModel.meditationList[index]
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 2{
            return JQ_ScreenW * 0.551
        }else{
            let index = indexPath.section - 3
            let m = viewModel.meditationList[index]
                                                if index == 0 && indexPath.row != 0 {
                                                                return 236
                                                }
            if index == 0 && indexPath.row != 0 {
                return 236
            }
                                                if m.clientMeditationCategoryVO?.showType == .horizontal{
                                                                return 328
                                                }else{
                                                                return 213
                                                }
                                }
                }
            if m.clientMeditationCategoryVO?.showType == .horizontal{
                return 328
            }else{
                return 213
            }
        }
    }
                func numberOfSections(in tableView: UITableView) -> Int {
                                return titleItems.count
                }
    func numberOfSections(in tableView: UITableView) -> Int {
        return titleItems.count
    }
                func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
                                return 80.5
                }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 80.5
    }
                func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
                                let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_HomeHeaderView") as! HomeHeaderView
                                headerView.setTitle(titleItems[section].title, subTitle: titleItems[section].subTitle)
                                headerView.btn_more.isHidden = !titleItems[section].hasMore
                                headerView.btn_more.tag = section + 200
                                headerView.btn_more.addTarget(self, action: #selector(jumpMoreAction(_:)), for: .touchUpInside)
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_HomeHeaderView") as! HomeHeaderView
        headerView.setTitle(titleItems[section].title, subTitle: titleItems[section].subTitle)
        headerView.btn_more.isHidden = !titleItems[section].hasMore
        headerView.btn_more.tag = section + 200
        headerView.btn_more.addTarget(self, action: #selector(jumpMoreAction(_:)), for: .touchUpInside)
                                if section == 1{
                                                headerView.btn_more.setImage(UIImage(named: "btn_more"), for: .normal)
                                }else{
                                                headerView.btn_more.setImage(UIImage(named: "icon_exchange"), for: .normal)
                                }
                                return headerView
                }
        if section == 1{
            headerView.btn_more.setImage(UIImage(named: "btn_more"), for: .normal)
        }else{
            headerView.btn_more.setImage(UIImage(named: "icon_exchange"), for: .normal)
        }
        return headerView
    }
}
extension HomeVC:UIScrollViewDelegate{
                func scrollViewDidScroll(_ scrollView: UIScrollView) {
//                                let v = min(scrollView.contentOffset.y / JQ_NavBarHeight, 1)
//                                navigationController?.navigationBar.standardAppearance.backgroundColor = .white.withAlphaComponent(v)
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //                                let v = min(scrollView.contentOffset.y / JQ_NavBarHeight, 1)
        //                                navigationController?.navigationBar.standardAppearance.backgroundColor = .white.withAlphaComponent(v)
        navigationController?.navigationBar.standardAppearance.backgroundColor = .white
        navigationController?.navigationBar.scrollEdgeAppearance?.backgroundColor = .white
                }
    }
}
extension HomeVC:PayMusicDelegate{
    func playState(_ state: PlayMusicState) {
    }
}
XQMuse/Root/Home/VC/PaymentOrderVC.swift
@@ -172,7 +172,7 @@
                                                alertError(msg: "请输入正确的手机号");return
                                }
                                Services.searchUserByPhone(tf_phone.text!).subscribe(onNext: { data in
        Services.searchUserByPhone(tf_phone.text!,ignoreAlert: false).subscribe(onNext: { data in
                                                self.view_searchUserResult.isHidden = false
                                                if let m = data.data,m.id != 0{
                                                                self.giftUserId = m.id
@@ -229,6 +229,10 @@
        if let m = museModel{
            money = m.iosPrice
            id = m.id
            guard id != UserViewModel.getAvatarInfo().id else {
                alertError(msg: "不能赠送给自己");return
            }
        }
        guard btn_isRead.isSelected else {
XQMuse/Root/Login/VC/UpdatePhoneVC.swift
@@ -119,11 +119,20 @@
        }
        Services.confirmByApple(cellPhone: tf_phone.text!, captcha: tf_code.text!, loginType: threePlantformLoginType, wxOrAppleId: unionId,name: formatName, mail: credential!.email).subscribe(onNext: {data in
        Services.confirmByApple(cellPhone: tf_phone.text!, captcha: tf_code.text!, loginType: threePlantformLoginType, wxOrAppleId: unionId,name: formatName, mail: credential?.email).subscribe(onNext: {data in
            if var model = data.data{
                model.loginByAppleToken = String(data: self.credential!.identityToken!, encoding: .utf8)
                if threePlantformLoginType == .apple{
                    model.loginByAppleToken = String(data: self.credential!.identityToken!, encoding: .utf8)
                    model.appleId = self.credential!.user
                }
                if threePlantformLoginType == .wechat{
                    model.wechatOpenId = unionId
                }
                model.accessToken = model.accessToken
                model.appleId = self.credential!.user
                UserViewModel.saveLoginInfo(model)
                Services.getUserInfo().subscribe(onNext: {data in
XQMuse/Root/Network/Services.swift
@@ -13,8 +13,8 @@
import CoreLocation
#if DEBUG
//let All_Url = "https://xq.xqzhihui.com/api"
let All_Url = "http://192.168.110.64:9000"
let All_Url = "https://xq.xqzhihui.com/api"
//let All_Url = "http://192.168.110.64:9000"
//let All_Url = "https://mock.apipost.net/mock/31b303c60464000"
#else
let All_Url = "https://xq.xqzhihui.com/api"
@@ -416,12 +416,12 @@
///用户相关
extension Services{
                class func searchUserByPhone(_ phone:String)->Observable<BaseResponse<UserInfoModel>>{
    class func searchUserByPhone(_ phone:String,ignoreAlert:Bool)->Observable<BaseResponse<UserInfoModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/getUserByPhone")
                                                .append(key: "phone", value: phone)
                                                .append(key: "apipost_id", value: "2e763463799135")
        return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
        return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: ignoreAlert)
                }
                /// 获取用户信息
@@ -499,11 +499,12 @@
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
                class func saveUserAnswers(_ model:ResponseUserAnswerModel)->Observable<BaseResponse<SimpleModel>>{
    class func saveUserAnswers(_ model:ResponseUserAnswerModel,device:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/user/client/app-user/saveUserAnswers")
                                                .append(dic: model.toJSON()!)
                                                .append(key: "apipost_id", value: "25c3dab9f0e025")
            .append(key: "device", value: device)
        return NetworkRequest.request(params: params, method: .post,encoding: JSONEncoding(), progress: true)
                }
XQMuse/Root/Plans/PlanGuideVC.swift
@@ -98,7 +98,7 @@
                                label_title.font = Def_FlyFlowerSong(fontSize: 35)
                                label_title.textColor = .white
                                label_subTitle.attributedText =     AttributedStringbuilder.build().add(string: "亲爱的家人,温暖喜悦问候您\n我是心泉老师\n欢迎来到泉疗愈空间\n愿这一方空间为您带来\n平和 喜悦 放松 宁静", withFont: Def_SourceHanSerif_Regular(fontSize: 17), withColor: .white,lineSpace: 10).mutableAttributedString
                                label_subTitle.attributedText =     AttributedStringbuilder.build().add(string: "亲爱的家人,温暖喜悦问候您\n我是心泉老师\n欢迎来到泉疗愈空间\n愿这一方空间为您带来\n放松 平和 宁静 与喜悦", withFont: Def_SourceHanSerif_Regular(fontSize: 17), withColor: .white,lineSpace: 10).mutableAttributedString
                                label_subTitle.textAlignment = .center
XQMuse/Root/Plans/PlanGuide_3_VC.swift
@@ -70,9 +70,16 @@
                @IBAction func nextAction(_ sender: UIButton) {
        responseUserAnswerModel.tagIds = selectModels.map({"\($0.id)"}).joined(separator: ",")
                                Services.saveUserAnswers(responseUserAnswerModel).subscribe(onNext: { data in
                                                NotificationCenter.default.post(name: PlantGuideQuit_Noti, object: true)
                                }).disposed(by: disposeBag)
        if UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true{
            UserDefaults.standard.set(responseUserAnswerModel.toJSONString(), forKey: "saveUserAnswers")
            UserDefaults.standard.synchronize()
            NotificationCenter.default.post(name: PlantGuideQuit_Noti, object: true)
        }else{
            Services.saveUserAnswers(responseUserAnswerModel, device: UserViewModel.DeviceUUID).subscribe(onNext: { data in
                NotificationCenter.default.post(name: PlantGuideQuit_Noti, object: true)
            }).disposed(by: disposeBag)
        }
                }
                @IBAction func previousAction(_ sender: UIButton) {
XQMuse/SceneDelegate.swift
@@ -87,6 +87,15 @@
                func loginSuccess(){
        NotificationCenter.default.post(name: LoginSuccess_Noti, object: nil)
        if let jsonString = UserDefaults.standard.value(forKey: "saveUserAnswers") as? String{
            if let model = ResponseUserAnswerModel.deserialize(from: jsonString){
                Services.saveUserAnswers(model, device: UserViewModel.DeviceUUID).subscribe(onNext: { data in
                    UserDefaults.standard.set(nil, forKey: "saveUserAnswers")
                    NotificationCenter.default.post(name: LoginSuccess_Noti, object: nil, userInfo: nil)
                }).disposed(by: JQ_disposeBag)
            }
        }
                }
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
@@ -114,6 +123,7 @@
                                                    Services.getUserInfo().subscribe(onNext: {data in
                                                        if let model = data.data{
                                                            UserViewModel.saveAvatarInfo(model)
                                                            sceneDelegate?.loginSuccess()
                                                        }
                                                    }).disposed(by: JQ_disposeBag)
                                                }else{