younger_times
2023-07-31 9add6fe63070124dea74f596e646eaae2f52ef17
新增
26个文件已修改
335 ■■■■■ 已修改文件
WanPai/AppDelegate.swift 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Config/Enums.swift 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Model/CommonModels.swift 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/NetworkRequest.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailVC.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityStudentListVC.swift 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityStudentListVC.xib 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseDetailApplyVC.swift 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseListVC.swift 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseOnlineListVC.swift 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/View/CityChooseSubTypeView.swift 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/VC/PaymentResultVC.swift 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/VC/ProfileVC.swift 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/RechargeCenterVC.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/RechargeCenterVC.xib 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/RechargeRecordVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareVC.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/TCell/YardBookingTCell.swift 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardBookingListVC.swift 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardBookingSubListVC.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardDetailVC.swift 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/SceneDelegate.swift 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/ViewModel/RefreshModel.swift 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/AppDelegate.swift
@@ -66,16 +66,16 @@
        let tabBar = BaseTabBarVC()
        let homeNav = BaseNav(rootViewController: HomeVC())
        homeNav.tabBarItem = UITabBarItem(title: "加入玩湃", image: UIImage(named: "tabbar_home"), selectedImage: UIImage(named: "tabbar_home_s"))
        homeNav.tabBarItem = UITabBarItem(title: "加入玩湃", image: UIImage(named: "tabbar_home"), selectedImage: UIImage(named: "tabbar_home_s")!.withRenderingMode(.alwaysOriginal))
        let clouseNav = BaseNav(rootViewController: CourseVC())
        clouseNav.tabBarItem = UITabBarItem(title: "开始上课", image: UIImage(named: "tabbar_course"), selectedImage: UIImage(named: "tabbar_course_s"))
        clouseNav.tabBarItem = UITabBarItem(title: "开始上课", image: UIImage(named: "tabbar_course"), selectedImage: UIImage(named: "tabbar_course_s")!.withRenderingMode(.alwaysOriginal))
        let welfareVCNav = BaseNav(rootViewController: WelfareVC())
        welfareVCNav.tabBarItem = UITabBarItem(title: "使用福利", image: UIImage(named: "tabbar_welfare"), selectedImage: UIImage(named: "tabbar_welfare_s"))
        welfareVCNav.tabBarItem = UITabBarItem(title: "使用福利", image: UIImage(named: "tabbar_welfare"), selectedImage: UIImage(named: "tabbar_welfare_s")!.withRenderingMode(.alwaysOriginal))
        let searchVCNav = BaseNav(rootViewController: SearchVC())
        searchVCNav.tabBarItem = UITabBarItem(title: "搜索玩湃", image: UIImage(named: "tabbar_search"), selectedImage: UIImage(named: "tabbar_search_s"))
        searchVCNav.tabBarItem = UITabBarItem(title: "搜索玩湃", image: UIImage(named: "tabbar_search"), selectedImage: UIImage(named: "tabbar_search_s")!.withRenderingMode(.alwaysOriginal))
        tabBar.viewControllers = [homeNav,clouseNav,welfareVCNav,searchVCNav]
        screnDelegate?.window?.rootViewController = tabBar
        screnDelegate?.window?.rootViewController?.view.addSubview(snapView!)
@@ -90,9 +90,10 @@
    }
    func needLogin(){
        let nav = LoginNav(rootViewController: LoginVC())
        window?.rootViewController =  nav
        window?.makeKeyAndVisible()
        UserViewModel.clearToken()
        let loginVC = LoginVC()
        loginVC.modalPresentationStyle = .fullScreen
        JQ_currentViewController().present(loginVC, animated: true)
    }
}
WanPai/Config/Enums.swift
@@ -8,6 +8,19 @@
import Foundation
import HandyJSON
enum BannerPositionType:Int{
        /// 首页
    case homeTop = 1
        ///首页底部
    case homeBottom = 2
        ///线上课得积分
    case onlineCourse = 3
        ///看视频得奖励
    case video = 4
        ///常见问题
    case qusition = 5
}
    /// 登录类型
enum LoginType{
    case pwd,smsCode
@@ -153,7 +166,7 @@
}
enum Sort2Type:Int,HandyJSONEnum{
    //1积分高到低 2积分从低到高 3兑换从高到低
        //1积分高到低 2积分从低到高 3兑换从高到低
    case coinAsc = 1
    case coinDesc = 2
    case exAsc = 3
@@ -190,11 +203,11 @@
}
enum RegisterAcitivyType:Int,HandyJSONEnum{
    /// 全部用户
        /// 全部用户
    case allUser = 1
    /// 仅限年度会员参与
        /// 仅限年度会员参与
    case vip = 2
    ///仅限学员参与
        ///仅限学员参与
    case student = 3
    var strTitle:String{
@@ -276,7 +289,7 @@
}
enum ExchangeType:Int,HandyJSONEnum{
    //商品类型 1实物 2课包 3门票 4优惠券
        //商品类型 1实物 2课包 3门票 4优惠券
    case goods = 1
    case course = 2
    case ticket = 3
@@ -373,15 +386,15 @@
    }
        /**
    /**
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_1"), t1: "COURSE", t2: "俱乐部之星"))
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_2"), t1: "EVENTS", t2: "运动大人"))
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_3"), t1: "ON_LINE", t2: "社区之王"))
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_4"), t1: "APPOINTMENT", t2: "深度玩家"))
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_5"), t1: "EVENTS", t2: "月度冠军"))
         mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_6"), t1: "MORE", t2: "更多"))*/
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_1"), t1: "COURSE", t2: "俱乐部之星"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_2"), t1: "EVENTS", t2: "运动大人"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_3"), t1: "ON_LINE", t2: "社区之王"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_4"), t1: "APPOINTMENT", t2: "深度玩家"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_5"), t1: "EVENTS", t2: "月度冠军"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_6"), t1: "MORE", t2: "更多"))*/
}
WanPai/Model/CommonModels.swift
@@ -272,18 +272,20 @@
}
struct YardBookingModel:HandyJSON{
    var appointment: String = ""
    var id: Int = 0
    var insertTime: TimeInterval = 0
    var name: String = ""
    var payMoney:Double = 0
    var siteTypeName: String = ""
    var status: YardBookingType = .none
    var storeAddress: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
class YardBookingModel:HandyJSON{
    var appointment: String = ""
    var id: Int = 0
    var insertTime: TimeInterval = 0
    var name: String = ""
    var payMoney:Double = 0
    var siteTypeName: String = ""
    var status: YardBookingType = .none
    var storeAddress: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
    required init() {}
}
struct YardBookingContinuePriceModel:HandyJSON{
@@ -402,7 +404,7 @@
    var isMember: String = ""
    var userHeadImg: String = ""
    var userIntegral: Int = 0
    var userName: String = ""
    var userName: String = "未命名"
    var wpCoin: Int = 0
}
WanPai/Network/NetworkRequest.swift
@@ -217,6 +217,7 @@
                        switch next.code{
                            case 200:ob.onNext(next)
                            case 600:alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession)
                                app.needLogin()
                            default:alertError(msg: "\(next.msg)");ob.onError(NetRequestError.Other(next.msg))
                        }
                    }
WanPai/Network/Services.swift
@@ -12,7 +12,8 @@
import JQTools
#if DEBUG
let All_Url = "https://console-mock.apipost.cn/mock/b5b2dee0-5564-40ae-f082-a352d502a153"
let All_Url = "http://192.168.110.44:56666"
//let All_Url = "https://console-mock.apipost.cn/mock/b5b2dee0-5564-40ae-f082-a352d502a153"
//let All_Url = "http://192.168.110.165:10393/mock/b5b2dee0-5564-40ae-f082-a352d502a153"
#else
let All_Url = "http://192.168.110.80:5209"
@@ -40,10 +41,10 @@
        /// 获取banner图
        /// - Parameter position: 位置(1=首页,2=首页底部,3=线上课得积分,4=看视频得奖励,5=常见问题)
    class func bannerList(position:Int)->Observable<BaseResponse<[BannerModel]>>{
    class func bannerList(position:BannerPositionType)->Observable<BaseResponse<[BannerModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/banner/queryBannerList")
            .append(key: "position", value: position)
            .append(key: "position", value: position.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
}
@@ -419,7 +420,7 @@
        /// 探索玩湃首页数据
    static func exploreHome()->Observable<BaseResponse<[StartClouseExploreModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/exploreWP/indexOfExl")
            .interface(url: "/account/api/exploreWP/indexOfEx")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
@@ -596,6 +597,7 @@
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteTimes")
            .append(key: "id", value: id)
            .append(key: "day", value: day)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
@@ -620,7 +622,7 @@
            .append(key: "siteId", value: siteId)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
@@ -628,7 +630,7 @@
    class func queryMySite(page:Int,pageSize:Int = 20,status:YardBookingType?)->Observable<BaseResponse<[YardBookingModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/queryMySite")
            .append(key: "page", value: page)
            .append(key: "pageNo", value: page)
            .append(key: "pageSize", value: pageSize)
            .append(key: "status", value: status?.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
@@ -754,10 +756,10 @@
            .append(key: "birthday", value: model.birthday)
            .append(key: "headImg", value: model.headImg)
            .append(key: "height", value: model.height.string)
            .append(key: "idCard", value: model.idCard)
            .append(key: "idcard", value: model.idCard)
            .append(key: "name", value: model.name)
            .append(key: "phone", value: model.phone)
            .append(key: "sex", value: model.sex.rawValue)
            .append(key: "gender", value: model.sex.rawValue)
            .append(key: "weight", value: model.weight.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift
@@ -129,11 +129,9 @@
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                            case .cancel:
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                            case .failure(_):
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                alert(msg: "已取消")
                                            case .failure(let error):
                                                let vc = PaymentResultVC(result: .fail(error.localizedDescription), objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                        }
WanPai/Root/Activity/VC/ActivityDetailVC.swift
@@ -55,6 +55,7 @@
                let radio = img.size.width / img.size.height
                self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW
                self?.img_enrollRequired.image = img
            }
WanPai/Root/Activity/VC/ActivityStudentListVC.swift
@@ -21,7 +21,7 @@
class ActivityStudentListVC: BaseVC {
    @IBOutlet weak var btn_addStudent: QMUIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var tableView: BaseTableView!
    private var viewModel = ActivityStudentViewModel()
    override func viewDidLoad() {
@@ -39,6 +39,7 @@
        tableView.dataSource = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
        tableView.jq_setEmptyView("暂无参赛人员")
    }
    override func setRx() {
WanPai/Root/Activity/VC/ActivityStudentListVC.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -38,7 +38,7 @@
                        <action selector="addStudentAction:" destination="-1" eventType="touchUpInside" id="WZr-mv-Q2g"/>
                    </connections>
                </button>
                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="3eN-Lo-KNQ">
                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="3eN-Lo-KNQ" customClass="BaseTableView" customModule="WanPai" customModuleProvider="target">
                    <rect key="frame" x="0.0" y="109" width="393" height="709"/>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                </tableView>
WanPai/Root/Course/VC/CourseDetailApplyVC.swift
@@ -140,10 +140,9 @@
                                                    let vc = PaymentResultVC(result: .success, objType: .courseApply)
                                                    self?.present(vc, animated: true)
                                                case .cancel:
                                                    let vc = PaymentResultVC(result: .fail, objType: .courseApply)
                                                    self?.present(vc, animated: true)
                                                    alert(msg: "已取消")
                                                case .failure(let error):
                                                    let vc = PaymentResultVC(result: .fail, objType: .courseApply)
                                                    let vc = PaymentResultVC(result: .fail(error.localizedDescription), objType: .courseApply)
                                                    self?.present(vc, animated: true)
                                            }
                                        }
WanPai/Root/Course/VC/CourseListVC.swift
@@ -12,9 +12,7 @@
import RxDataSources
import RxCocoa
class CourseListViewModel{
    var disposeBag = DisposeBag()
class CourseListViewModel:RefreshModel<CourseItemModel>{
    var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
    var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
@@ -23,6 +21,10 @@
    var distanceSort = BehaviorRelay<SortType?>(value: nil)
    var salesRanking = BehaviorRelay<SortType?>(value: nil)
    var search = BehaviorRelay<String?>(value: nil)
    override func api() -> (Observable<BaseResponse<[CourseItemModel]>>)? {
        return Services.queryCourseList(typeId: selectPackeType.value?.id, distanceSort: distanceSort.value, salesRanking: salesRanking.value, search: search.value, storeId: selectStore.value?.id)
    }
    func getDefaultData(){
        Services.coursePackageType().subscribe(onNext: {[weak self] data in
@@ -45,7 +47,7 @@
    }
}
class CourseListVC: BaseVC,Refreshable{
class CourseListVC: BaseVC{
    @IBOutlet weak var view_topView: UIView!
    @IBOutlet weak var tf_search: QMUITextField!
@@ -54,7 +56,6 @@
    @IBOutlet weak var btn_stores: QMUIButton!
    @IBOutlet weak var btn_sales: QMUIButton!
    @IBOutlet weak var btn_distance: QMUIButton!
    var items = [CourseItemModel]()
    private var viewModel = CourseListViewModel()
    private var showSubTypeView:CourseSubTypeView?
@@ -63,6 +64,7 @@
        super.viewDidLoad()
        title = "课程列表"
        viewModel.getDefaultData()
        viewModel.beginRefresh()
    }
    
    override func setUI() {
@@ -81,13 +83,8 @@
        tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell")
        tableView.separatorStyle = .none
        tf_search.delegate = self
        viewModel.configure(tableView,needMore: false)
        tableView.jq_setEmptyView()
        refreshStatusBind(to: tableView) {[weak self] in
            self?.getData()
        } footer: {}
        refreshStatus.onNext(.beingHeaderRefresh)
    }
    override func setRx() {
@@ -98,17 +95,6 @@
                self?.viewModel.search.accept(self?.tf_search.text!)
            }
        }).disposed(by: disposeBag)
    }
    private func getData(_ header:Bool = true){
        Services.queryCourseList(typeId: viewModel.selectPackeType.value?.id, distanceSort: viewModel.distanceSort.value, salesRanking: viewModel.salesRanking.value, search: viewModel.search.value, storeId: viewModel.selectStore.value?.id).subscribe { [weak self] data in
            self?.refreshStatus.onNext(.endAll)
            self?.items = data.data ?? []
            self?.tableView.reloadData()
        } onError: {[weak self] error in
            self?.refreshStatus.onNext(.endAll)
        }.disposed(by: disposeBag)
    }
    private func cleanOther(){
@@ -193,7 +179,7 @@
extension CourseListVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let item = items[indexPath.row]
        let item = viewModel.dataSource.value[indexPath.row]
        let vc = CourseDetailVC(id: item.id)
        push(vc: vc)
    }
@@ -203,12 +189,12 @@
extension CourseListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseTCell") as! CourseTCell
        cell.courseItemModel = items[indexPath.row]
        cell.courseItemModel = viewModel.dataSource.value[indexPath.row]
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
        return viewModel.dataSource.value.count
    }
}
WanPai/Root/Course/VC/CourseOnlineListVC.swift
@@ -48,7 +48,7 @@
    override func viewDidLoad() {
        super.viewDidLoad()
        Services.bannerList(position: 3).subscribe(onNext: {[weak self] data in
        Services.bannerList(position: .onlineCourse).subscribe(onNext: {[weak self] data in
            if let models = data.data{
                self?.searchView.bannerView.setImages(images: models.map({$0.img}),type: .URL, imageClickBlock: { index in
@@ -58,7 +58,9 @@
        viewModel.configure(collectionView,needMore: false)
        viewModel.beginRefresh()
        collectionView.jq_setEmptyView()
        collectionView.jq_setEmptyView { setView in
            setView.verticalOffset(-300)
        }
    }
    override func setUI() {
WanPai/Root/Course/View/CityChooseSubTypeView.swift
@@ -27,10 +27,17 @@
        layoutIfNeeded()
        tableView.delegate = self
        tableView.dataSource = self
        if #available(iOS 15.0, *) {
            tableView.sectionHeaderTopPadding = 0
        } else {
        }
        tableView.separatorStyle = .none
        tableView.sectionIndexColor = Def_ThemeColor
        tableView.register(UINib(nibName: "CommonSingleTCell", bundle: nil), forCellReuseIdentifier: "_CommonSingleTCell")
        startLocation()
        Services.queryAllCity().subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            if let models = data.data{
                self?.datas = models
                for v in models{
@@ -42,6 +49,12 @@
                    }
                }
                self?.keys = self?.dataDict.keys.sorted() ?? []
                let finalHei = JQ_ScreenH - 175  - UIDevice.jq_safeEdges.top - JQ_NavBarHeight
                let ecxclueHei = Double(weakSelf.dataDict.values.count) * 46.0 + Double(weakSelf.keys.count) * 35.0 + 50
                self?.cons_viewHeight.constant = min(finalHei, ecxclueHei)
                self?.layoutIfNeeded()
                self?.tableView.reloadData()
            }
        }).disposed(by: disposeBag)
@@ -61,7 +74,7 @@
        UIView.animate(withDuration: 0.2) {
            subTypeView.alpha = 1
        } completion: { _ in
            subTypeView.cons_viewHeight.constant = JQ_ScreenH - 175  - UIDevice.jq_safeEdges.top - JQ_NavBarHeight
//            subTypeView.cons_viewHeight.constant = JQ_ScreenH - 175  - UIDevice.jq_safeEdges.top - JQ_NavBarHeight
            UIView.animate(withDuration: 0.2) {
                subTypeView.layoutIfNeeded()
            }
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift
@@ -55,15 +55,6 @@
                    default:break
                }
            }).disposed(by: self.disposeBag)
        }
//        PaymentView.show { status in
//            let paymentState:PaymentResultVC.PaymentResult = status ? .success:.fail
//            let vc = PaymentResultVC(result: paymentState, objType: .member)
//            vc.modalPresentationStyle = .fullScreen
//            self.present(vc, animated: true)
//
//        }
    }
}
WanPai/Root/Other/VC/PaymentResultVC.swift
@@ -10,14 +10,15 @@
class PaymentResultVC: BaseVC {
    
    enum PaymentResult{
    enum PaymentResult:Equatable{
        case success
        case fail
        case fail(String)
    }
    enum PaymentObjType{
        case member //会员
        case courseApply //课程报名
        case activityApply //活动报名
        case yard //场地预约
    }
    
    
@@ -30,11 +31,13 @@
    
    private var result:PaymentResult!
    private var objType:PaymentObjType!
    private var handleVC:UIViewController?
    
    required init(result:PaymentResult,objType:PaymentObjType) {
    required init(result:PaymentResult,objType:PaymentObjType,handleVC:UIViewController? = nil) {
        super.init(nibName: nil, bundle: nil)
        self.result = result
        self.objType = objType
        self.handleVC = handleVC
    }
    
    required init?(coder: NSCoder) {
@@ -50,8 +53,8 @@
        case .member:
            btn_again.isHidden = result == .success
            btn_back.isHidden = result == .success
            btn_backHome.isHidden = result == .fail
            collectionView.isHidden =  result == .fail
            btn_backHome.isHidden = result != .success
            collectionView.isHidden =  result != .success
            switch result {
            case .fail:
                img_paymentState.image = UIImage(named: "icon_fail")
@@ -65,11 +68,11 @@
            btn_backHome.isHidden = true
            collectionView.isHidden =  true
            switch result {
            case .fail:
            case .fail(let str):
                btn_again.setTitle("再次支付", for: .normal)
                btn_back.setTitle("返回", for: .normal)
                img_paymentState.image = UIImage(named: "icon_fail")
                label_content.text = "报名失败,这是失败原因!"
                label_content.text = str
            case .success:
                btn_again.setTitle("立即预约", for: .normal)
                btn_back.setTitle("返回首页", for: .normal)
@@ -94,6 +97,23 @@
                label_content.text = "报名成功,请注意赛事开始时间!"
            case .none:break
            }
            case .yard:
                btn_backHome.isHidden = true
                collectionView.isHidden =  true
                switch result {
                case .fail(let str):
                    btn_again.setTitle("再次支付", for: .normal)
                    btn_back.setTitle("返回", for: .normal)
                    img_paymentState.image = UIImage(named: "icon_fail")
                    label_content.text = str
                case .success:
                    btn_again.setTitle("查看预约", for: .normal)
                    btn_back.setTitle("返回首页", for: .normal)
                    img_paymentState.image = UIImage(named: "icon_success")
                    label_content.text = "报名成功,请注意预约开始时间!"
                case .none:break
                }
            
        case .none:break
        }
@@ -106,12 +126,24 @@
    }
    
    @IBAction func paymentAgainAction(_ sender: UIButton) {
        let str = sender.titleLabel?.text ?? ""
        switch str{
            case "查看预约":
                dismiss(animated:true) {[weak self] in
                    let vc = YardBookingListVC()
                    self?.handleVC?.navigationController?.pushViewController(vc)
                }
            default:break
        }
    }
    
    
    @IBAction func backAction(_ sender: UIButton) {
        dismiss(animated: true)
        dismiss(animated: true) {
            self.navigationController?.popToRootViewController(animated: true)
        }
    }
}
WanPai/Root/Other/VC/ProfileVC.swift
@@ -39,7 +39,14 @@
    }
    @IBAction func logoutAction(_ sender: UIButton) {
        CommonAlertView.show(title: "退出登录", content: "是否退出当前账号?") { status in
            if status{
                UserViewModel.clearToken()
                let loginVC = LoginVC()
                loginVC.modalPresentationStyle = .fullScreen
                self.present(loginVC, animated: true)
            }
        }
    }
    @IBAction func updateProfileAction(_ sender: UIButton) {
WanPai/Root/Welfare/VC/RechargeCenterVC.swift
@@ -24,8 +24,8 @@
    @IBOutlet weak var collectionView: UICollectionView!
    private var items = [RechargeItem]()
    private let cellW = (JQ_ScreenW - 100) / 3.0
    private let cellH = ((JQ_ScreenW - 100) / 3.0) * 0.5148
    private let cellW = (JQ_ScreenW - 88) / 3.0
    private let cellH = ((JQ_ScreenW - 88) / 3.0) * 0.5148
    private var selectIndex = 0
    var viewModel:RechargeRecordViewModel!
@@ -52,7 +52,7 @@
    override func setUI() {
        let colors = [UIColor(hexStr: "#FD8C02").cgColor,
                      UIColor(hexStr: "#FD7202").cgColor,]
        view_topBg.jq_gradientColor(colorArr: colors)
        view_topBg.jq_gradientColor(colorArr: colors,bounds: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.5923))
        btn_rechange.jq_gradientNibColor(colorArr: colors, cornerRadius: 20)
        let attribute = AttributedStringbuilder()
WanPai/Root/Welfare/VC/RechargeCenterVC.xib
@@ -59,13 +59,13 @@
                    </constraints>
                </view>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NJG-QQ-aLa">
                    <rect key="frame" x="14" y="208.66666666666663" width="365" height="264"/>
                    <rect key="frame" x="14" y="208.66666666666663" width="365" height="294"/>
                    <subviews>
                        <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="B8L-Mr-AHI">
                            <rect key="frame" x="0.0" y="18" width="365" height="120"/>
                            <rect key="frame" x="0.0" y="18" width="365" height="150"/>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="120" id="wmy-oP-k65"/>
                                <constraint firstAttribute="height" constant="150" id="wmy-oP-k65"/>
                            </constraints>
                            <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="8kV-wB-1G8">
                                <size key="itemSize" width="128" height="128"/>
@@ -75,7 +75,7 @@
                            </collectionViewFlowLayout>
                        </collectionView>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lGL-wI-nEC">
                            <rect key="frame" x="289" y="155.00000000000003" width="72" height="29"/>
                            <rect key="frame" x="289" y="185.00000000000003" width="72" height="29"/>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="储值说明?">
@@ -86,7 +86,7 @@
                            </connections>
                        </button>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UvJ-Vs-VJ9">
                            <rect key="frame" x="86" y="214.00000000000003" width="193" height="40"/>
                            <rect key="frame" x="86" y="244" width="193" height="40"/>
                            <color key="backgroundColor" name="FE6E0D"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="40" id="JLC-JS-byh"/>
WanPai/Root/Welfare/VC/RechargeRecordVC.swift
@@ -69,7 +69,7 @@
        btn_filter.spacingBetweenImageAndTitle = 3
        let colors = [UIColor(hexStr: "#FD8C02").cgColor,
                      UIColor(hexStr: "#FD7202").cgColor,]
        view_topBg.jq_gradientColor(colorArr: colors)
        view_topBg.jq_gradientColor(colorArr: colors,bounds: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.5923))
        btn_rechange.jq_gradientNibColor(colorArr: colors, cornerRadius: 20)
        view_container.jq_addShadows(shadowColor: UIColor(hexStr: "#D5D5D5").withAlphaComponent(0.5), corner: 10, radius: 4, offset: CGSize(width: 0, height: 2), opacity: 1)
WanPai/Root/Welfare/VC/WelfareVC.swift
@@ -35,8 +35,8 @@
            if let model = data.data{
                self?.benefitHomeModel = model
                self?.img_userProfile.sd_setImage(with: URL(string: model.userHeadImg))
                self?.label_username.text = model.userName
                self?.btn_vip.isHidden = model.isMember == "年度会员"
                self?.label_username.text = model.userName.isEmpty ? "未命名":model.userName
                self?.btn_vip.isHidden = model.isMember != "年度会员"
                self?.label_coin.text = "\(model.wpCoin)"
                self?.label_score.text = "\(model.userIntegral)"
                self?.coinCollectionView.reloadData()
WanPai/Root/Yard/TCell/YardBookingTCell.swift
@@ -20,6 +20,7 @@
    @IBOutlet weak var btn_cancel: UIButton!
    private var timer:Timer?
    var indexPath:IndexPath!
    private var disposeBag = DisposeBag()
    var yardBookingModel:YardBookingModel!{
@@ -60,7 +61,7 @@
    }
    @objc func runTimer(){
        let second = yardBookingModel.insertTime - Date().timeIntervalSince1970
        let second = (yardBookingModel.insertTime / 1000) - Date().timeIntervalSince1970
        if second <= 0{
            timer?.invalidate()
        }else{
@@ -87,7 +88,7 @@
                                            case .cancel:
                                                alert(msg: "交易取消")
                                            case .failure(let error):
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                let vc = PaymentResultVC(result: .fail(error.localizedDescription), objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                JQ_currentViewController().present(vc, animated: true)
                                        }
@@ -110,7 +111,7 @@
            if status{
                Services.cancelMySite(id: weakSelf.yardBookingModel.id).subscribe(onNext: {data in
                    alertSuccess(msg: "取消成功")
                    NotificationCenter.default.post(name: RefreshBooking_Noti, object: nil)
                    NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath)
                }).disposed(by: weakSelf.disposeBag)
            }
        }
WanPai/Root/Yard/VC/YardBookingListVC.swift
@@ -27,7 +27,7 @@
        // item
        pageMenu.spacing = 20.0
        pageMenu.permutationWay = .scrollAdaptContent
        pageMenu.permutationWay = .notScrollAdaptContent
        pageMenu.setItems(["全部","待核销","已核销","已过期","已取消","待支付"], selectedItemIndex: 0)
        // 字体
@@ -97,9 +97,9 @@
        switch page{
            case 1:index = .pending
            case 2:index = .inStore
            case 3:index = .complete
            case 4:index = .overdue
            case 5:index = .cancel
            case 3:index = .overdue
            case 4:index = .cancel
            case 5:index = .waitPayment
            default:break
        }
        return YardBookingSubListVC(type: index)
WanPai/Root/Yard/VC/YardBookingSubListVC.swift
@@ -60,7 +60,22 @@
    override func setRx() {
        NotificationCenter.default.rx.notification(RefreshBooking_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            self?.viewModel.beginRefresh()
            guard let weakSelf = self else { return }
            if let indexPath = noti.object as? IndexPath{
                weakSelf.tableView.beginUpdates()
                if weakSelf.viewModel.type.value == nil{
                    weakSelf.viewModel.dataSource.value[indexPath.row].status = .cancel
                    weakSelf.tableView.reloadRows(at: [indexPath], with: .automatic)
                }else{
                    var tempValue = weakSelf.viewModel.dataSource.value
                    tempValue.remove(at: indexPath.row)
                    weakSelf.viewModel.dataSource.accept(tempValue)
                    weakSelf.tableView.deleteRows(at: [indexPath], with: .automatic)
                }
                weakSelf.tableView.endUpdates()
                weakSelf.tableView.reloadData()
            }
        }).disposed(by: disposeBag)
    }
}
@@ -81,6 +96,7 @@
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_YardBookingTCell") as! YardBookingTCell
        cell.indexPath = indexPath
        cell.yardBookingModel = model
        return cell
    }
WanPai/Root/Yard/VC/YardDetailVC.swift
@@ -196,10 +196,10 @@
    @IBAction func bookingAction(_ sender: UIButton) {
        guard !YardDetailDateManager.shared().dates.value.isEmpty else {alertError(msg: "请选择预约时间");return}
        guard !tf_person.isEmpty else {alertError(msg: "请输入预约人");return}
        guard !tf_phone.isEmpty else {alertError(msg: "请输入联系方式");return}
        guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的联系方式");return}
        guard !YardDetailDateManager.shared().dates.value.isEmpty else {alertError(msg: "请选择预约时间");return}
        StoresInfoView.show(siteDetailModel) { [weak self] status in
@@ -222,20 +222,23 @@
                                    YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in
                                        switch result {
                                            case .success:
                                                let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                                let vc = PaymentResultVC(result: .success, objType: .yard,handleVC: weakSelf)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                            case .cancel:
                                                alert(msg: "交易取消")
                                            case .failure(let error):
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                let vc = PaymentResultVC(result: .fail(error.localizedDescription), objType: .yard,handleVC: weakSelf)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                        }
                                    }
                                case .wechat:break
                                case .coin:break
                                case .coin:
                                    let vc = PaymentResultVC(result: .success, objType: .yard,handleVC: weakSelf)
                                    vc.modalPresentationStyle = .fullScreen
                                    weakSelf.present(vc, animated: true)
                                case .courseNum:break
                            }
                        }
WanPai/SceneDelegate.swift
@@ -19,25 +19,9 @@
        if UserViewModel.getToken() != nil{
            let tabBar = BaseTabBarVC()
            let homeNav = BaseNav(rootViewController: HomeVC())
            homeNav.tabBarItem = UITabBarItem(title: "加入玩湃", image: UIImage(named: "tabbar_home"), selectedImage: UIImage(named: "tabbar_home_s"))
            let clouseNav = BaseNav(rootViewController: CourseVC())
            clouseNav.tabBarItem = UITabBarItem(title: "开始上课", image: UIImage(named: "tabbar_course"), selectedImage: UIImage(named: "tabbar_course_s"))
            let welfareVCNav = BaseNav(rootViewController: WelfareVC())
            welfareVCNav.tabBarItem = UITabBarItem(title: "使用福利", image: UIImage(named: "tabbar_welfare"), selectedImage: UIImage(named: "tabbar_welfare_s"))
            let searchVCNav = BaseNav(rootViewController: SearchVC())
            searchVCNav.tabBarItem = UITabBarItem(title: "搜索玩湃", image: UIImage(named: "tabbar_search"), selectedImage: UIImage(named: "tabbar_search_s"))
            tabBar.viewControllers = [homeNav,clouseNav,welfareVCNav,searchVCNav]
            window?.rootViewController = tabBar
            window?.makeKeyAndVisible()
            app.registerAndLoginSuccess()
        }else{
            let nav = LoginNav(rootViewController: LoginVC())
            window?.rootViewController =  nav
            window?.makeKeyAndVisible()
            app.needLogin()
        }
        SVProgressHUD.setContainerView(window)
WanPai/ViewModel/RefreshModel.swift
@@ -117,6 +117,7 @@
    static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshAutoNormalFooter? {
        let refrehFooter = MJRefreshAutoNormalFooter(refreshingBlock: refreshingBlock)
        refrehFooter.isRefreshingTitleHidden = true
        refrehFooter.stateLabel?.isHidden = true
        return refrehFooter
    }
}
@@ -137,6 +138,7 @@
                    DispatchQueue.main.async {
                        self.base.reloadData()
                    }
                    (self.base.mj_footer as? MJRefreshAutoNormalFooter)?.stateLabel?.isHidden = false
                    self.base.mj_footer?.endRefreshingWithNoMoreData()
                    self.base.mj_header?.endRefreshing()
                case .completedLoad: