WanPai/Model/CommonModels.swift
@@ -751,3 +751,19 @@ 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 = "" } WanPai/Network/NetworkRequest.swift
@@ -84,6 +84,15 @@ 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{ WanPai/Network/Services.swift
@@ -49,6 +49,48 @@ .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: -- 登录部分 @@ -58,7 +100,7 @@ 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) @@ -126,6 +168,13 @@ .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) } @@ -525,6 +574,17 @@ 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) WanPai/Root/Course/TCell/CourseBookingTCell.swift
@@ -17,11 +17,22 @@ 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! WanPai/Root/Course/TCell/CourseBooking_1_TCell.swift
@@ -67,6 +67,20 @@ } @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) } } WanPai/Root/Course/VC/CourseDetailApplyVC.swift
@@ -38,10 +38,11 @@ @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]() @@ -83,6 +84,12 @@ tableView.reloadData() changePrice(selectClassIndex) } if isExtend{ btn_handleBtn.setTitle("续课", for: .normal) }else{ btn_handleBtn.setTitle("立即报名", for: .normal) } } override func setUI() { @@ -105,9 +112,10 @@ 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) { WanPai/Root/Course/VC/CourseDetailApplyVC.xib
@@ -3,7 +3,7 @@ <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"/> @@ -15,6 +15,7 @@ <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"/> WanPai/Root/Course/VC/ExperienceCourseVC.swift
@@ -64,8 +64,18 @@ @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) } } } WanPai/Root/Course/VC/StudentCourseDetailVC.swift
@@ -77,7 +77,7 @@ 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) @@ -93,8 +93,6 @@ headView.img_stuProfile.sd_setImage(with: URL(string: studentModel.stuImage),placeholderImage: UIImage(named: "placeholder_1")) viewModel.beginRefresh() } override func setUI() { WanPai/Root/Games/TCell/GamesDataSourceTCell.swift
@@ -10,6 +10,9 @@ 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() WanPai/Root/Games/TCell/GamesDataSourceTCell.xib
@@ -3,7 +3,7 @@ <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"/> @@ -52,7 +52,7 @@ <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"/> @@ -120,6 +120,9 @@ </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"/> WanPai/Root/Games/VC/GamesDataSourceSubListVC.swift
@@ -6,16 +6,40 @@ // 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) { @@ -25,10 +49,22 @@ 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 @@ -47,10 +83,19 @@ 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 } } WanPai/Root/Games/VC/GamesDataSourceVC.swift
@@ -28,7 +28,7 @@ // 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) @@ -98,7 +98,7 @@ } 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 } } WanPai/Root/Games/VC/GamesSubListVC.swift
@@ -10,9 +10,9 @@ import RxSwift enum GamesSubType:Int{ case all = -1 case offline = 0 case online = 1 case crossMatch = 1 case accuracyMatch = 2 } class GamesOffLineViewModel:RefreshModel<GameListModel>{ WanPai/Root/Home/VC/HomeVC.swift
@@ -44,7 +44,7 @@ super.viewDidLoad() viewModel.configure(collectionView,needMore: false) startLocation() // startLocation() viewModel.dataSource.subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } @@ -65,6 +65,13 @@ } } } Services.homeInfo2(storeId: weakSelf.viewModel.storeId.value).subscribe(onNext: {data in }) { error in }.disposed(by: weakSelf.disposeBag) group.notify(queue: .main){ //重置Layout,不然不更新 @@ -262,8 +269,6 @@ extension HomeVC: WaterFallLayoutDelegate{ func waterFlowLayout(_ waterFlowLayout: WaterFallFlowLayout, itemHeight indexPath: IndexPath) -> CGFloat { let item = items[indexPath.row] if indexPath.row % 2 != 0{ return 185 }else{ WanPai/Root/Yard/VC/YardBookingDetailVC.swift
@@ -45,12 +45,12 @@ 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 ? "半场":"全场" @@ -72,6 +72,23 @@ 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