无故事王国
2023-09-25 69d86fd3224046b2e2b57a71fcfcd8706d179e21
新增
16个文件已修改
268 ■■■■ 已修改文件
WanPai/Model/CommonModels.swift 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/NetworkRequest.swift 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/TCell/CourseBookingTCell.swift 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/TCell/CourseBooking_1_TCell.swift 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseDetailApplyVC.swift 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseDetailApplyVC.xib 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/ExperienceCourseVC.swift 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/StudentCourseDetailVC.swift 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/TCell/GamesDataSourceTCell.swift 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/TCell/GamesDataSourceTCell.xib 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesDataSourceSubListVC.swift 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesDataSourceVC.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesSubListVC.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/HomeVC.swift 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardBookingDetailVC.swift 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
@@ -1,9 +1,9 @@
//
//  YardBookingDetailVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/9/13.
//
    //
    //  YardBookingDetailVC.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/9/13.
    //
import UIKit
import JQTools
@@ -33,24 +33,24 @@
        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 ? "半场":"全场"
@@ -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
@@ -88,7 +105,7 @@
    @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