| | |
| | | |
| | | class CourseListViewModel:RefreshModel<CourseItemModel>{ |
| | | |
| | | var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil) |
| | | var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil) |
| | | var selectPackeType = BehaviorRelay<NormalSimpleModel?>(value: nil) |
| | | var selectStore = BehaviorRelay<NormalSimpleModel?>(value: nil) |
| | | var distanceSort = BehaviorRelay<SortType?>(value: nil) |
| | | var salesRanking = BehaviorRelay<SortType?>(value: nil) |
| | | var search = BehaviorRelay<String?>(value: nil) |
| | | var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil) |
| | | var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil) |
| | | var selectPackeType = BehaviorRelay<NormalSimpleModel?>(value: nil) |
| | | var selectStore = 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) |
| | | } |
| | | 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 |
| | | if var datas = data.data{ |
| | | datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0) |
| | | self?.packageTypeData.accept(datas) |
| | | } |
| | | }) { error in |
| | | func getDefaultData(){ |
| | | Services.coursePackageType().subscribe(onNext: {[weak self] data in |
| | | if var datas = data.data{ |
| | | datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0) |
| | | self?.packageTypeData.accept(datas) |
| | | } |
| | | }) { error in |
| | | |
| | | }.disposed(by: disposeBag) |
| | | }.disposed(by: disposeBag) |
| | | |
| | | Services.queryStoreList().subscribe(onNext: {[weak self] data in |
| | | if var datas = data.data{ |
| | | datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0) |
| | | self?.storesData.accept(datas) |
| | | } |
| | | }) { error in |
| | | Services.queryStoreList().subscribe(onNext: {[weak self] data in |
| | | if var datas = data.data{ |
| | | datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0) |
| | | self?.storesData.accept(datas) |
| | | } |
| | | }) { error in |
| | | |
| | | }.disposed(by: disposeBag) |
| | | } |
| | | }.disposed(by: disposeBag) |
| | | } |
| | | } |
| | | |
| | | class CourseListVC: BaseVC{ |
| | | |
| | | @IBOutlet weak var view_topView: UIView! |
| | | @IBOutlet weak var tf_search: QMUITextField! |
| | | @IBOutlet weak var tableView: BaseTableView! |
| | | @IBOutlet weak var btn_courseType: QMUIButton! |
| | | @IBOutlet weak var btn_stores: QMUIButton! |
| | | @IBOutlet weak var btn_sales: QMUIButton! |
| | | @IBOutlet weak var btn_distance: QMUIButton! |
| | | @IBOutlet weak var view_topView: UIView! |
| | | @IBOutlet weak var tf_search: QMUITextField! |
| | | @IBOutlet weak var tableView: BaseTableView! |
| | | @IBOutlet weak var btn_courseType: QMUIButton! |
| | | @IBOutlet weak var btn_stores: QMUIButton! |
| | | @IBOutlet weak var btn_sales: QMUIButton! |
| | | @IBOutlet weak var btn_distance: QMUIButton! |
| | | |
| | | private var viewModel = CourseListViewModel() |
| | | private var showSubTypeView:CourseSubTypeView? |
| | | private var viewModel = CourseListViewModel() |
| | | private var showSubTypeView:CourseSubTypeView? |
| | | |
| | | init(selectStore:NormalSimpleModel? = nil) { |
| | | super.init(nibName: nil, bundle: nil) |
| | | if selectStore != nil{ |
| | | viewModel.selectStore.accept(selectStore) |
| | | } |
| | | } |
| | | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | title = "运动营列表" |
| | | viewModel.getDefaultData() |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | override func setUI() { |
| | | btn_courseType.imagePosition = .right |
| | | btn_stores.imagePosition = .right |
| | | btn_sales.imagePosition = .right |
| | | btn_distance.imagePosition = .right |
| | | |
| | | btn_courseType.spacingBetweenImageAndTitle = 5 |
| | | btn_stores.spacingBetweenImageAndTitle = 5 |
| | | btn_sales.spacingBetweenImageAndTitle = 5 |
| | | btn_distance.spacingBetweenImageAndTitle = 5 |
| | | init(selectStore:NormalSimpleModel? = nil) { |
| | | super.init(nibName: nil, bundle: nil) |
| | | if selectStore != nil{ |
| | | viewModel.selectStore.accept(selectStore) |
| | | } |
| | | } |
| | | |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell") |
| | | tableView.separatorStyle = .none |
| | | tf_search.delegate = self |
| | | viewModel.configure(tableView,needMore: false) |
| | | btn_stores.setTitle(viewModel.selectStore.value?.name ?? "所在门店", for: .normal) |
| | | } |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | title = "运动营列表" |
| | | viewModel.getDefaultData() |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | override func setRx() { |
| | | tf_search.rx.controlEvent(.editingDidEnd).subscribe(onNext: { [weak self] in |
| | | if self?.tf_search.text?.isEmpty ?? true{ |
| | | self?.viewModel.search.accept(nil) |
| | | }else{ |
| | | self?.viewModel.search.accept(self?.tf_search.text!) |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | override func setUI() { |
| | | btn_courseType.imagePosition = .right |
| | | btn_stores.imagePosition = .right |
| | | btn_sales.imagePosition = .right |
| | | btn_distance.imagePosition = .right |
| | | |
| | | private func cleanOther(){ |
| | | showSubTypeView?.removeFromSuperview() |
| | | btn_courseType.isSelected = false |
| | | btn_stores.isSelected = false |
| | | btn_sales.isSelected = false |
| | | btn_distance.isSelected = false |
| | | } |
| | | |
| | | @IBAction func searchAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard !tf_search.isEmpty else { |
| | | alert(msg: "请输入搜索内容");return |
| | | } |
| | | viewModel.beginRefresh() |
| | | } |
| | | btn_courseType.spacingBetweenImageAndTitle = 5 |
| | | btn_stores.spacingBetweenImageAndTitle = 5 |
| | | btn_sales.spacingBetweenImageAndTitle = 5 |
| | | btn_distance.spacingBetweenImageAndTitle = 5 |
| | | |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell") |
| | | tableView.separatorStyle = .none |
| | | tf_search.delegate = self |
| | | viewModel.configure(tableView,needMore: false) |
| | | btn_stores.setTitle(viewModel.selectStore.value?.name ?? "所在门店", for: .normal) |
| | | } |
| | | |
| | | override func setRx() { |
| | | tf_search.rx.controlEvent(.editingDidEnd).subscribe(onNext: { [weak self] in |
| | | if self?.tf_search.text?.isEmpty ?? true{ |
| | | self?.viewModel.search.accept(nil) |
| | | }else{ |
| | | self?.viewModel.search.accept(self?.tf_search.text!) |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | |
| | | private func cleanOther(){ |
| | | showSubTypeView?.removeFromSuperview() |
| | | btn_courseType.isSelected = false |
| | | btn_stores.isSelected = false |
| | | btn_sales.isSelected = false |
| | | btn_distance.isSelected = false |
| | | } |
| | | |
| | | @IBAction func searchAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard !tf_search.isEmpty else { |
| | | alert(msg: "请输入搜索内容");return |
| | | } |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | |
| | | @IBAction func enrolledAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | let vc = SignUpCourseVC() |
| | | push(vc: vc) |
| | | } |
| | | |
| | | |
| | | @IBAction func crouseTypeAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard viewModel.packageTypeData.value != nil else { |
| | | alertError(msg: "分类数据加载失败,请再试一次") |
| | | viewModel.getDefaultData() |
| | | return |
| | | } |
| | | |
| | | guard !sender.isSelected else {return} |
| | | cleanOther() |
| | | sender.isSelected = true |
| | | showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.packageTypeData.value!,selectModel: viewModel.selectPackeType.value) { [weak self] m in |
| | | if m.name != "全部"{ |
| | | sender.setTitle(m.name, for: .normal) |
| | | self?.viewModel.selectPackeType.accept(m) |
| | | }else{ |
| | | sender.setTitle("运动营类型", for: .normal) |
| | | self?.viewModel.selectPackeType.accept(nil) |
| | | } |
| | | sender.isSelected = false |
| | | self?.viewModel.beginRefresh() |
| | | } closeClouse: { |
| | | sender.isSelected = false |
| | | } |
| | | } |
| | | |
| | | @IBAction func inStoresAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard viewModel.storesData.value != nil else { |
| | | alertError(msg: "分类数据加载失败,请再试一次") |
| | | viewModel.getDefaultData() |
| | | return |
| | | } |
| | | |
| | | guard !sender.isSelected else {return} |
| | | cleanOther() |
| | | sender.isSelected = true |
| | | showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.storesData.value!,selectModel: viewModel.selectStore.value) { [weak self] m in |
| | | if m.name != "全部"{ |
| | | sender.setTitle(m.name, for: .normal) |
| | | self?.viewModel.selectStore.accept(m) |
| | | }else{ |
| | | sender.setTitle("所在门店", for: .normal) |
| | | self?.viewModel.selectStore.accept(nil) |
| | | } |
| | | sender.isSelected = false |
| | | self?.viewModel.beginRefresh() |
| | | } closeClouse: { |
| | | sender.isSelected = false |
| | | } |
| | | } |
| | | |
| | | @IBAction func saleAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | sender.isSelected = !sender.isSelected |
| | | let sortType = sender.isSelected ? SortType.desc:SortType.asc |
| | | viewModel.salesRanking.accept(sortType) |
| | | sender.setImage(viewModel.salesRanking.value?.img, for: .normal) |
| | | |
| | | //复原距离 |
| | | viewModel.distanceSort.accept(nil) |
| | | btn_distance.isSelected = false |
| | | btn_distance.setImage(SortType.def.img, for: .normal) |
| | | |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | @IBAction func distanceAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | sender.isSelected = !sender.isSelected |
| | | let sortType = sender.isSelected ? SortType.desc:SortType.asc |
| | | viewModel.distanceSort.accept(sortType) |
| | | sender.setImage(viewModel.distanceSort.value?.img, for: .normal) |
| | | @IBAction func enrolledAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | let vc = SignUpCourseVC() |
| | | push(vc: vc) |
| | | } |
| | | |
| | | |
| | | //复原销量 |
| | | viewModel.salesRanking.accept(nil) |
| | | btn_sales.isSelected = false |
| | | btn_sales.setImage(SortType.def.img, for: .normal) |
| | | @IBAction func crouseTypeAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard viewModel.packageTypeData.value != nil else { |
| | | alertError(msg: "分类数据加载失败,请再试一次") |
| | | viewModel.getDefaultData() |
| | | return |
| | | } |
| | | |
| | | viewModel.beginRefresh() |
| | | } |
| | | guard !sender.isSelected else {return} |
| | | cleanOther() |
| | | sender.isSelected = true |
| | | showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.packageTypeData.value!,selectModel: viewModel.selectPackeType.value) { [weak self] m in |
| | | if m.name != "全部"{ |
| | | sender.setTitle(m.name, for: .normal) |
| | | self?.viewModel.selectPackeType.accept(m) |
| | | }else{ |
| | | sender.setTitle("运动营类型", for: .normal) |
| | | self?.viewModel.selectPackeType.accept(nil) |
| | | } |
| | | sender.isSelected = false |
| | | self?.viewModel.beginRefresh() |
| | | } closeClouse: { |
| | | sender.isSelected = false |
| | | } |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | } |
| | | @IBAction func inStoresAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | guard viewModel.storesData.value != nil else { |
| | | alertError(msg: "分类数据加载失败,请再试一次") |
| | | viewModel.getDefaultData() |
| | | return |
| | | } |
| | | |
| | | guard !sender.isSelected else {return} |
| | | cleanOther() |
| | | sender.isSelected = true |
| | | showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.storesData.value!,selectModel: viewModel.selectStore.value) { [weak self] m in |
| | | if m.name != "全部"{ |
| | | sender.setTitle(m.name, for: .normal) |
| | | self?.viewModel.selectStore.accept(m) |
| | | }else{ |
| | | sender.setTitle("所在门店", for: .normal) |
| | | self?.viewModel.selectStore.accept(nil) |
| | | } |
| | | sender.isSelected = false |
| | | self?.viewModel.beginRefresh() |
| | | } closeClouse: { |
| | | sender.isSelected = false |
| | | } |
| | | } |
| | | |
| | | @IBAction func saleAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | sender.isSelected = !sender.isSelected |
| | | let sortType = sender.isSelected ? SortType.desc:SortType.asc |
| | | viewModel.salesRanking.accept(sortType) |
| | | sender.setImage(viewModel.salesRanking.value?.img, for: .normal) |
| | | |
| | | //复原距离 |
| | | viewModel.distanceSort.accept(nil) |
| | | btn_distance.isSelected = false |
| | | btn_distance.setImage(SortType.def.img, for: .normal) |
| | | |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | @IBAction func distanceAction(_ sender: UIButton) { |
| | | view.endEditing(true) |
| | | sender.isSelected = !sender.isSelected |
| | | let sortType = sender.isSelected ? SortType.desc:SortType.asc |
| | | viewModel.distanceSort.accept(sortType) |
| | | sender.setImage(viewModel.distanceSort.value?.img, for: .normal) |
| | | |
| | | |
| | | //复原销量 |
| | | viewModel.salesRanking.accept(nil) |
| | | btn_sales.isSelected = false |
| | | btn_sales.setImage(SortType.def.img, for: .normal) |
| | | |
| | | viewModel.beginRefresh() |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | } |
| | | |
| | | } |
| | | |
| | | extension CourseListVC:UITableViewDelegate{ |
| | | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| | | let item = viewModel.dataSource.value[indexPath.row] |
| | | let vc = CourseDetailVC(id: item.id) |
| | | push(vc: vc) |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| | | 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 = viewModel.dataSource.value[indexPath.row] |
| | | return cell |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| | | return viewModel.dataSource.value.count |
| | | } |
| | | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseTCell") as! CourseTCell |
| | | cell.courseItemModel = viewModel.dataSource.value[indexPath.row] |
| | | return cell |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| | | return viewModel.dataSource.value.count |
| | | } |
| | | } |
| | | |
| | | extension CourseListVC:QMUITextFieldDelegate{ |
| | | func textFieldShouldReturn(_ textField: UITextField) -> Bool { |
| | | textField.resignFirstResponder() |
| | | viewModel.beginRefresh() |
| | | return true |
| | | } |
| | | func textFieldShouldReturn(_ textField: UITextField) -> Bool { |
| | | textField.resignFirstResponder() |
| | | viewModel.beginRefresh() |
| | | return true |
| | | } |
| | | } |