| | |
| | | |
| | | 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!) |
| | |
| | | } |
| | | |
| | | 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) |
| | | } |
| | | } |
| | | |
| | |
| | | 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 |
| | |
| | | } |
| | | |
| | | enum Sort2Type:Int,HandyJSONEnum{ |
| | | //1积分高到低 2积分从低到高 3兑换从高到低 |
| | | //1积分高到低 2积分从低到高 3兑换从高到低 |
| | | case coinAsc = 1 |
| | | case coinDesc = 2 |
| | | case exAsc = 3 |
| | |
| | | } |
| | | |
| | | enum RegisterAcitivyType:Int,HandyJSONEnum{ |
| | | /// 全部用户 |
| | | /// 全部用户 |
| | | case allUser = 1 |
| | | /// 仅限年度会员参与 |
| | | /// 仅限年度会员参与 |
| | | case vip = 2 |
| | | ///仅限学员参与 |
| | | ///仅限学员参与 |
| | | case student = 3 |
| | | |
| | | var strTitle:String{ |
| | |
| | | } |
| | | |
| | | enum ExchangeType:Int,HandyJSONEnum{ |
| | | //商品类型 1实物 2课包 3门票 4优惠券 |
| | | //商品类型 1实物 2课包 3门票 4优惠券 |
| | | case goods = 1 |
| | | case course = 2 |
| | | case ticket = 3 |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | /** |
| | | |
| | | |
| | | 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: "更多"))*/ |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | 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{ |
| | |
| | | var isMember: String = "" |
| | | var userHeadImg: String = "" |
| | | var userIntegral: Int = 0 |
| | | var userName: String = "" |
| | | var userName: String = "未命名" |
| | | var wpCoin: Int = 0 |
| | | } |
| | | |
| | |
| | | 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)) |
| | | } |
| | | } |
| | |
| | | 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" |
| | |
| | | |
| | | /// 获取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) |
| | | } |
| | | } |
| | |
| | | /// 探索玩湃首页数据 |
| | | 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) |
| | |
| | | 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) |
| | | } |
| | | |
| | |
| | | .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) |
| | | } |
| | | |
| | | |
| | |
| | | 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) |
| | |
| | | .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) |
| | | } |
| | |
| | | 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) |
| | | } |
| | |
| | | |
| | | let radio = img.size.width / img.size.height |
| | | self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW |
| | | self?.img_enrollRequired.image = img |
| | | } |
| | | |
| | | |
| | |
| | | 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() { |
| | |
| | | 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() { |
| | |
| | | <?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"/> |
| | |
| | | <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> |
| | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | 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) |
| | |
| | | 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 |
| | |
| | | } |
| | | } |
| | | |
| | | class CourseListVC: BaseVC,Refreshable{ |
| | | class CourseListVC: BaseVC{ |
| | | |
| | | @IBOutlet weak var view_topView: UIView! |
| | | @IBOutlet weak var tf_search: QMUITextField! |
| | |
| | | @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? |
| | |
| | | super.viewDidLoad() |
| | | title = "课程列表" |
| | | viewModel.getDefaultData() |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | override func setUI() { |
| | |
| | | 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() { |
| | |
| | | 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(){ |
| | |
| | | |
| | | 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) |
| | | } |
| | |
| | | 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 |
| | | } |
| | | } |
| | | |
| | |
| | | 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 |
| | | |
| | |
| | | |
| | | viewModel.configure(collectionView,needMore: false) |
| | | viewModel.beginRefresh() |
| | | collectionView.jq_setEmptyView() |
| | | collectionView.jq_setEmptyView { setView in |
| | | setView.verticalOffset(-300) |
| | | } |
| | | } |
| | | |
| | | override func setUI() { |
| | |
| | | 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{ |
| | |
| | | } |
| | | } |
| | | 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) |
| | |
| | | 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() |
| | | } |
| | |
| | | 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) |
| | | // |
| | | // } |
| | | } |
| | | } |
| | |
| | | |
| | | 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 //场地预约 |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | 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) { |
| | |
| | | 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") |
| | |
| | | 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) |
| | |
| | | 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 |
| | | } |
| | |
| | | } |
| | | |
| | | @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) |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @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) { |
| | |
| | | @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! |
| | |
| | | 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() |
| | |
| | | </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"/> |
| | |
| | | </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="储值说明?"> |
| | |
| | | </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"/> |
| | |
| | | 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) |
| | | |
| | |
| | | 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() |
| | |
| | | @IBOutlet weak var btn_cancel: UIButton! |
| | | |
| | | private var timer:Timer? |
| | | var indexPath:IndexPath! |
| | | private var disposeBag = DisposeBag() |
| | | |
| | | var yardBookingModel:YardBookingModel!{ |
| | |
| | | } |
| | | |
| | | @objc func runTimer(){ |
| | | let second = yardBookingModel.insertTime - Date().timeIntervalSince1970 |
| | | let second = (yardBookingModel.insertTime / 1000) - Date().timeIntervalSince1970 |
| | | if second <= 0{ |
| | | timer?.invalidate() |
| | | }else{ |
| | |
| | | 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) |
| | | } |
| | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | |
| | | // item |
| | | pageMenu.spacing = 20.0 |
| | | pageMenu.permutationWay = .scrollAdaptContent |
| | | pageMenu.permutationWay = .notScrollAdaptContent |
| | | pageMenu.setItems(["全部","待核销","已核销","已过期","已取消","待支付"], selectedItemIndex: 0) |
| | | |
| | | // 字体 |
| | |
| | | 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) |
| | |
| | | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | 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 |
| | | } |
| | |
| | | |
| | | @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 |
| | |
| | | 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 |
| | | } |
| | | } |
| | |
| | | |
| | | |
| | | 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) |
| | |
| | | static func refreshing(with refreshingBlock: @escaping MJRefreshComponentAction) -> MJRefreshAutoNormalFooter? { |
| | | let refrehFooter = MJRefreshAutoNormalFooter(refreshingBlock: refreshingBlock) |
| | | refrehFooter.isRefreshingTitleHidden = true |
| | | refrehFooter.stateLabel?.isHidden = true |
| | | return refrehFooter |
| | | } |
| | | } |
| | |
| | | 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: |