| | |
| | | var icon = "" |
| | | } |
| | | |
| | | struct DoorModel:HandyJSON{ |
| | | var app_user_id = "" |
| | | var time:DoorTimeModel? |
| | | } |
| | | |
| | | struct DoorTimeModel:HandyJSON{ |
| | | var start_time:TimeInterval? |
| | | var end_time:TimeInterval? |
| | | } |
| | | |
| | | struct GamesRecordModel:HandyJSON{ |
| | | var game_name = "" |
| | | var score = 0 |
| | | var time = "" |
| | | } |
| | | |
| | |
| | | return self |
| | | } |
| | | |
| | | @discardableResult |
| | | func append(key: String,value: Array<String>) -> ParamsAppender { |
| | | if value.isEmpty == false { |
| | | params += ["\(key)":value] |
| | | } |
| | | return self |
| | | } |
| | | |
| | | |
| | | @discardableResult |
| | | func append(key: String, value: Int?) -> ParamsAppender { |
| | | if value != nil{ |
| | |
| | | .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B") |
| | | return NetworkRequest.request(params: params, method: .post, encoding: JSONEncoding.default, progress: false) |
| | | } |
| | | |
| | | /// 开门 |
| | | class func game_OpenDoorCode(userID:Int)->Observable<BaseResponse<DoorModel>>{ |
| | | let params = ParamsAppender.build(url: Game_Url) |
| | | .interface(url: "/v7/user_api/general/getOpenDoorCode") |
| | | .append(key: "app_user_id", value: userID) |
| | | .append(key: "sign", value: "") |
| | | return NetworkRequest.request(params: params, method: .get, progress: false) |
| | | } |
| | | |
| | | /// 用户单机游戏记录 |
| | | class func game_generalGameRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{ |
| | | let params = ParamsAppender.build(url: Game_Url) |
| | | .interface(url: "/v7/user_api/general/gameRecord") |
| | | .append(key: "uid", value: userId) |
| | | .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B") |
| | | .append(key: "page", value: page) |
| | | .append(key: "limit", value: 20) |
| | | return NetworkRequest.request(params: params, method: .post, progress: false) |
| | | } |
| | | |
| | | /// 用户跨城游戏记录 |
| | | class func game_generalGameCrossRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{ |
| | | let params = ParamsAppender.build(url: Game_Url) |
| | | .interface(url: "/v7/user_api/general/cityGameRecord") |
| | | .append(key: "uid", value: userId) |
| | | .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B") |
| | | .append(key: "page", value: page) |
| | | .append(key: "limit", value: 20) |
| | | return NetworkRequest.request(params: params, method: .post, progress: false) |
| | | } |
| | | |
| | | /// 用户跨城游戏记录 |
| | | class func game_generalGameAccuracyRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{ |
| | | let params = ParamsAppender.build(url: Game_Url) |
| | | .interface(url: "/v7/user_api/general/accuracyGameRecord") |
| | | .append(key: "uid", value: userId) |
| | | .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B") |
| | | .append(key: "page", value: page) |
| | | .append(key: "limit", value: 20) |
| | | return NetworkRequest.request(params: params, method: .post, progress: false) |
| | | } |
| | | } |
| | | |
| | | // MARK: -- 登录部分 |
| | |
| | | let params = ParamsAppender.build(url: All_Url) |
| | | if type == .pwd{ |
| | | params.interface(url: "/account/base/appUser/loginPassword") |
| | | params.append(key: "password", value: verity.jq_md5String().uppercased()) |
| | | params.append(key: "password", value: verity.jq_md5String().lowercased()) |
| | | }else{ |
| | | params.interface(url: "/account/base/appUser/loginSMSCode") |
| | | params.append(key: "code", value: verity) |
| | |
| | | .interface(url: "/account/api/appUser/queryJoinPlayPai") |
| | | .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) |
| | | } |
| | | |
| | | class func homeInfo2(storeId:Int)->Observable<BaseResponse<HomeStoreModel>>{ |
| | | let params = ParamsAppender.build(url: All_Url) |
| | | .interface(url: "/other/base/store/queryIndexSet") |
| | | .append(key: "id", value: storeId) |
| | | return NetworkRequest.request(params: params, method: .post, progress: false) |
| | | } |
| | | |
| | |
| | | return NetworkRequest.request(params: params, method: .post, progress: true) |
| | | } |
| | | |
| | | /// 确认购课 |
| | | static func payCourse(courseId:Int,num:Int,oldCourseId:Int,time:[String])->Observable<BaseResponse<SimpleModel>>{ |
| | | let params = ParamsAppender.build(url: All_Url) |
| | | .interface(url: "/course/api/startCource/payCourse") |
| | | .append(key: "courseId", value: courseId) |
| | | .append(key: "num", value: num) |
| | | .append(key: "oldCourseId", value: oldCourseId) |
| | | .append(key: "time", value: time.joined(separator: ",").replacingOccurrences(of: ".", with: "-")) |
| | | return NetworkRequest.request(params: params, method: .post, progress: true) |
| | | } |
| | | |
| | | /// 学员勋章详情 |
| | | static func courseStuMedal(stuId:Int)->Observable<BaseResponse<[StudentMedalInfoModel]>>{ |
| | | let params = ParamsAppender.build(url: All_Url) |
| | |
| | | |
| | | if weeklyCourseItemModel.type == 1{ |
| | | btn_handle.setTitle("请假", for: .normal) |
| | | btn_handle.isEnabled = true |
| | | btn_handle.backgroundColor = UIColor(hexStr: "#6CC366") |
| | | } |
| | | |
| | | if weeklyCourseItemModel.type == 2{ |
| | | btn_handle.setTitle("购课", for: .normal) |
| | | btn_handle.isEnabled = true |
| | | btn_handle.backgroundColor = UIColor(hexStr: "#6CC366") |
| | | } |
| | | |
| | | if weeklyCourseItemModel.type == 3{ |
| | | btn_handle.setTitle("已请假", for: .normal) |
| | | btn_handle.isEnabled = false |
| | | btn_handle.backgroundColor = UIColor(hexStr: "#C0C0C0") |
| | | } |
| | | |
| | | } |
| | | } |
| | | @IBOutlet weak var label_title: UILabel! |
| | |
| | | } |
| | | |
| | | @IBAction func QRCodeAction(_ sender: UIButton) { |
| | | QRPreview.show("1231122") |
| | | |
| | | Services.userDetails().subscribe(onNext: {[weak self] data in |
| | | guard let weakSelf = self else { return } |
| | | if let m = data.data{ |
| | | Services.game_OpenDoorCode(userID: m.userId).subscribe(onNext: { data in |
| | | if let str = data.data?.toJSONString(){ |
| | | QRPreview.show(str) |
| | | } |
| | | }) { error in |
| | | |
| | | }.disposed(by: weakSelf.disposeBag) |
| | | } |
| | | }){ error in |
| | | |
| | | }.disposed(by: disposeBag) |
| | | } |
| | | } |
| | |
| | | @IBOutlet weak var label_vaild: UILabel! |
| | | @IBOutlet weak var studentTableView: UITableView! |
| | | @IBOutlet weak var view_packageList: UIView! |
| | | |
| | | @IBOutlet weak var btn_handleBtn: UIButton! |
| | | |
| | | private var detailModel:CourseDetailModel? |
| | | private var selectClassIndex:Int = 0 |
| | | private var isExtend:Bool = false |
| | | private var CellW:Double! |
| | | private var CellH:Double! |
| | | private var studentModels = [CourseDetailStudentModel]() |
| | |
| | | tableView.reloadData() |
| | | changePrice(selectClassIndex) |
| | | } |
| | | |
| | | if isExtend{ |
| | | btn_handleBtn.setTitle("续课", for: .normal) |
| | | }else{ |
| | | btn_handleBtn.setTitle("立即报名", for: .normal) |
| | | } |
| | | } |
| | | |
| | | override func setUI() { |
| | |
| | | btn_addStudent.spacingBetweenImageAndTitle = 3 |
| | | } |
| | | |
| | | init(detailModel:CourseDetailModel) { |
| | | init(detailModel:CourseDetailModel,isExtend:Bool = false) { |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.detailModel = detailModel |
| | | self.isExtend = isExtend |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | |
| | | <device id="retina6_12" orientation="portrait" appearance="light"/> |
| | | <dependencies> |
| | | <deployment identifier="iOS"/> |
| | | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22129"/> |
| | | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/> |
| | | <capability name="Named colors" minToolsVersion="9.0"/> |
| | | <capability name="Safe area layout guides" minToolsVersion="9.0"/> |
| | | <capability name="System colors in document resources" minToolsVersion="11.0"/> |
| | |
| | | <outlet property="btn_addStudent" destination="kv0-E8-XGD" id="H56-eE-BCc"/> |
| | | <outlet property="btn_coupon" destination="XNI-Vj-heV" id="es4-Cw-MCW"/> |
| | | <outlet property="btn_couponInfo" destination="uvW-sZ-v3z" id="0Up-RU-njq"/> |
| | | <outlet property="btn_handleBtn" destination="Dbs-38-o1O" id="yfU-7Z-g1N"/> |
| | | <outlet property="btn_hasCoupon" destination="XNI-Vj-heV" id="680-zV-BEX"/> |
| | | <outlet property="collectionView" destination="ZtR-nH-Ly1" id="Snf-0R-x4b"/> |
| | | <outlet property="cons_collHei" destination="wOm-8j-9fG" id="gZo-vk-a95"/> |
| | |
| | | @IBAction func paymenAction(_ sender: UIButton) { |
| | | let n = (experienceCourseModel?.num ?? 0) * (experienceCourseModel?.time.count ?? 0) * selectIndexs.count |
| | | if let storeId = UserDefaults.standard.value(forKey: "Current_StoreID") as? Int{ |
| | | PaymentCourseView.show(storeId: storeId, number: n) { s in |
| | | PaymentCourseView.show(storeId: storeId, number: n) {[weak self] s in |
| | | guard let weakSelf = self else { return } |
| | | |
| | | var t = [String]() |
| | | for selectIndex in weakSelf.selectIndexs { |
| | | t.append(weakSelf.experienceCourseModel!.day[selectIndex]) |
| | | } |
| | | Services.payCourse(courseId: weakSelf.courseId, num: n, oldCourseId: s, time: t).subscribe(onNext: {data in |
| | | alertSuccess(msg: "购买成功") |
| | | }) { error in |
| | | |
| | | }.disposed(by: weakSelf.disposeBag) |
| | | } |
| | | } |
| | | } |
| | |
| | | let model = weakSelf.models[weakSelf.headView.pageMenu.selectedItemIndex] |
| | | Services.queryCourseInfo(id: model.courseId).subscribe(onNext: {[weak self] data in |
| | | if let m = data.data{ |
| | | let vc = CourseDetailApplyVC(detailModel: m) |
| | | let vc = CourseDetailApplyVC(detailModel: m,isExtend: true) |
| | | self?.push(vc: vc) |
| | | } |
| | | }).disposed(by: weakSelf.disposeBag) |
| | |
| | | headView.img_stuProfile.sd_setImage(with: URL(string: studentModel.stuImage),placeholderImage: UIImage(named: "placeholder_1")) |
| | | |
| | | viewModel.beginRefresh() |
| | | |
| | | |
| | | } |
| | | |
| | | override func setUI() { |
| | |
| | | |
| | | class GamesDataSourceTCell: UITableViewCell { |
| | | |
| | | @IBOutlet weak var label_gameName: UILabel! |
| | | @IBOutlet weak var label_type: UILabel! |
| | | @IBOutlet weak var label_score: UILabel! |
| | | @IBOutlet weak var view_container: UIView! |
| | | override func awakeFromNib() { |
| | | super.awakeFromNib() |
| | |
| | | <device id="retina6_12" orientation="portrait" appearance="light"/> |
| | | <dependencies> |
| | | <deployment identifier="iOS"/> |
| | | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22129"/> |
| | | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/> |
| | | <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"/> |
| | |
| | | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4g8-fE-Wqg"> |
| | | <rect key="frame" x="0.0" y="31" width="330" height="17"/> |
| | | <subviews> |
| | | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="游戏类型" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Urs-ko-JX5"> |
| | | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="游戏时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Urs-ko-JX5"> |
| | | <rect key="frame" x="0.0" y="1.3333333333333366" width="49.333333333333336" height="14.333333333333336"/> |
| | | <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/> |
| | | <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> |
| | |
| | | </tableViewCellContentView> |
| | | <viewLayoutGuide key="safeArea" id="njF-e1-oar"/> |
| | | <connections> |
| | | <outlet property="label_gameName" destination="JC0-fu-Ikf" id="E5a-Ix-MyY"/> |
| | | <outlet property="label_score" destination="aQt-6B-IPi" id="t2Q-AY-Mxf"/> |
| | | <outlet property="label_type" destination="JNb-qy-xgC" id="N90-ux-Gm2"/> |
| | | <outlet property="view_container" destination="vxE-Af-LEe" id="ppq-jB-bEl"/> |
| | | </connections> |
| | | <point key="canvasLocation" x="99.236641221374043" y="52.112676056338032"/> |
| | |
| | | // |
| | | |
| | | import UIKit |
| | | import RxRelay |
| | | import RxSwift |
| | | |
| | | class GamesDataSourceViewModel:RefreshModel<GamesRecordModel>{ |
| | | private var type:GamesSubType! |
| | | |
| | | init(type:GamesSubType) { |
| | | super.init() |
| | | self.type = type |
| | | } |
| | | |
| | | let userId = BehaviorRelay<Int>(value:0) |
| | | |
| | | override func api() -> (Observable<BaseResponse<[GamesRecordModel]>>)? { |
| | | if type == .offline{ |
| | | return Services.game_generalGameRecord(userId: userId.value, page: page) |
| | | }else if type == .crossMatch{ |
| | | return Services.game_generalGameCrossRecord(userId: userId.value, page: page) |
| | | }else{ |
| | | return Services.game_generalGameAccuracyRecord(userId: userId.value, page: page) |
| | | } |
| | | } |
| | | } |
| | | |
| | | class GamesDataSourceSubListVC: BaseVC { |
| | | |
| | | private var type:GamesSubType! |
| | | |
| | | private var tableView:UITableView! |
| | | private var tableView:BaseTableView! |
| | | private var viewModel:GamesDataSourceViewModel! |
| | | |
| | | init(type:GamesSubType) { |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.type = type |
| | | self.viewModel = GamesDataSourceViewModel(type: type) |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | |
| | | |
| | | |
| | | tableView.jq_setEmptyView() |
| | | viewModel.configure(tableView) |
| | | Services.userDetails().subscribe(onNext: {[weak self] data in |
| | | if let userId = data.data?.userId{ |
| | | self?.viewModel.userId.accept(userId) |
| | | self?.viewModel.beginRefresh() |
| | | } |
| | | }) { error in |
| | | |
| | | }.disposed(by: disposeBag) |
| | | } |
| | | |
| | | override func setUI() { |
| | | tableView = UITableView(frame: .zero, style: .plain) |
| | | tableView = BaseTableView(frame: .zero, style: .plain) |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | tableView.separatorStyle = .none |
| | |
| | | extension GamesDataSourceSubListVC:UITableViewDataSource{ |
| | | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_GamesDataSourceTCell") as! GamesDataSourceTCell |
| | | |
| | | if type == .offline{ |
| | | cell.label_gameName.text = viewModel.dataSource.value[indexPath.row].game_name |
| | | cell.label_score.text = "\(viewModel.dataSource.value[indexPath.row].score)" |
| | | cell.label_type.text = viewModel.dataSource.value[indexPath.row].time |
| | | } |
| | | return cell |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| | | return 5 |
| | | if type == .offline{ |
| | | return viewModel.dataSource.value.count |
| | | } |
| | | return 0 |
| | | } |
| | | } |
| | |
| | | // item |
| | | pageMenu.spacing = 20.0 |
| | | pageMenu.permutationWay = .notScrollEqualWidths |
| | | pageMenu.setItems(["全部数据","单机游戏","互联比赛"], selectedItemIndex: 0) |
| | | pageMenu.setItems(["单机游戏","跨城赛","90°准度赛"], selectedItemIndex: 0) |
| | | |
| | | // 字体 |
| | | pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 14, weight: .semibold) |
| | |
| | | } |
| | | |
| | | func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController { |
| | | let vc = GamesDataSourceSubListVC(type: GamesSubType(rawValue: page - 1)!) |
| | | let vc = GamesDataSourceSubListVC(type: GamesSubType(rawValue: page)!) |
| | | return vc |
| | | } |
| | | } |
| | |
| | | import RxSwift |
| | | |
| | | enum GamesSubType:Int{ |
| | | case all = -1 |
| | | case offline = 0 |
| | | case online = 1 |
| | | case crossMatch = 1 |
| | | case accuracyMatch = 2 |
| | | } |
| | | |
| | | class GamesOffLineViewModel:RefreshModel<GameListModel>{ |
| | |
| | | super.viewDidLoad() |
| | | viewModel.configure(collectionView,needMore: false) |
| | | |
| | | startLocation() |
| | | // startLocation() |
| | | |
| | | viewModel.dataSource.subscribe(onNext: {[weak self] data in |
| | | guard let weakSelf = self else { return } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | Services.homeInfo2(storeId: weakSelf.viewModel.storeId.value).subscribe(onNext: {data in |
| | | |
| | | }) { error in |
| | | |
| | | }.disposed(by: weakSelf.disposeBag) |
| | | |
| | | |
| | | group.notify(queue: .main){ |
| | | //重置Layout,不然不更新 |
| | |
| | | |
| | | extension HomeVC: WaterFallLayoutDelegate{ |
| | | func waterFlowLayout(_ waterFlowLayout: WaterFallFlowLayout, itemHeight indexPath: IndexPath) -> CGFloat { |
| | | let item = items[indexPath.row] |
| | | |
| | | if indexPath.row % 2 != 0{ |
| | | return 185 |
| | | }else{ |
| | |
| | | // |
| | | // YardBookingDetailVC.swift |
| | | // WanPai |
| | | // |
| | | // Created by 无故事王国 on 2023/9/13. |
| | | // |
| | | // |
| | | // YardBookingDetailVC.swift |
| | | // WanPai |
| | | // |
| | | // Created by 无故事王国 on 2023/9/13. |
| | | // |
| | | |
| | | import UIKit |
| | | import JQTools |
| | |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.yardBookingModel = model |
| | | } |
| | | |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | } |
| | | |
| | | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | super.viewDidLoad() |
| | | title = "我的预约" |
| | | |
| | | label_title.text = yardBookingModel.name |
| | | label_address.text = String(format: "%@(%@)", yardBookingModel.storeName,yardBookingModel.storeAddress) |
| | | label_type.text = yardBookingModel.siteTypeName |
| | | img_QRCode.image = QRCodeImage(string: "1", size: 132 * sceneDelegate!.window!.screen.scale) |
| | | getData() |
| | | } |
| | | } |
| | | |
| | | private func getData(){ |
| | | Services.siteDetail(id: yardBookingModel.id).subscribe(onNext: {[weak self] data in |
| | | guard let weakSelf = self else { return } |
| | | if let model = data.data{ |
| | | self?.label_yardName.text = model.nextName |
| | | self?.label_bookingType.text = model.isHalf == 1 ? "半场":"全场" |
| | |
| | | case .cancel,.complete: |
| | | self?.view_qrCode.isHidden = true |
| | | self?.btn_payment.isHidden = true |
| | | |
| | | case .pending: |
| | | Services.userDetails().subscribe(onNext: {[weak self] data in |
| | | guard let weakSelf = self else { return } |
| | | if let m = data.data{ |
| | | Services.game_OpenDoorCode(userID: m.userId).subscribe(onNext: {[weak self] data in |
| | | if let str = data.data?.toJSONString(){ |
| | | self?.img_QRCode.image = QRCodeImage(string: str, size: 132 * sceneDelegate!.window!.screen.scale) |
| | | } |
| | | }) { error in |
| | | |
| | | }.disposed(by: weakSelf.disposeBag) |
| | | } |
| | | }){ error in |
| | | |
| | | }.disposed(by: weakSelf.disposeBag) |
| | | fallthrough |
| | | default: |
| | | self?.label_paymentTime.text = Date.jq_format(TimeInterval(model.payTime / 1000), formatter: "yyyy-MM-dd") |
| | | self?.label_usedState.text = model.state.titleRaw |
| | |
| | | @IBAction func callAction(_ sender: UIButton) { |
| | | UIApplication.shared.open(URL(string: "tell://\(yardBookingModel.phone)")!, options: [:], completionHandler: nil) |
| | | } |
| | | |
| | | |
| | | |
| | | @IBAction func cancelAction(_ sender: UIButton) { |
| | | CommonAlertView.show(title: "提示", content: "确认取消本次的预约吗?") {[weak self] status in |