Commit cc8ea2ff ilCode

大数据详情页

1 个父辈 7fdb2569
正在显示 18 个修改的文件 包含 599 行增加238 行删除
......@@ -42,6 +42,9 @@
5E93B48E2C1A98BE00CD6536 /* RegisterController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E93B48D2C1A98BE00CD6536 /* RegisterController.swift */; };
5E93B4902C1A9BDC00CD6536 /* LoginTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E93B48F2C1A9BDC00CD6536 /* LoginTools.swift */; };
5E93B4922C1AA0D200CD6536 /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E93B4912C1AA0D200CD6536 /* UIViewController+Ext.swift */; };
5E9827BE2C2F95E6006D74D4 /* HadoopDetailRadarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9827BD2C2F95E6006D74D4 /* HadoopDetailRadarView.swift */; };
5E9827C02C2FBA96006D74D4 /* HadoopDetailGameInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9827BF2C2FBA96006D74D4 /* HadoopDetailGameInfoView.swift */; };
5E9827C22C2FC2D1006D74D4 /* HadoopDetailStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9827C12C2FC2D1006D74D4 /* HadoopDetailStatusView.swift */; };
5E9A19EC2C0EAC0200321AC5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9A19EB2C0EAC0200321AC5 /* AppDelegate.swift */; };
5E9A19F52C0EAC0300321AC5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E9A19F42C0EAC0300321AC5 /* Assets.xcassets */; };
5E9A1A052C0EAF7600321AC5 /* goal.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 5E9A19FF2C0EAF7600321AC5 /* goal.mp3 */; };
......@@ -135,6 +138,9 @@
5E93B48D2C1A98BE00CD6536 /* RegisterController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterController.swift; sourceTree = "<group>"; };
5E93B48F2C1A9BDC00CD6536 /* LoginTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginTools.swift; sourceTree = "<group>"; };
5E93B4912C1AA0D200CD6536 /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = "<group>"; };
5E9827BD2C2F95E6006D74D4 /* HadoopDetailRadarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HadoopDetailRadarView.swift; sourceTree = "<group>"; };
5E9827BF2C2FBA96006D74D4 /* HadoopDetailGameInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HadoopDetailGameInfoView.swift; sourceTree = "<group>"; };
5E9827C12C2FC2D1006D74D4 /* HadoopDetailStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HadoopDetailStatusView.swift; sourceTree = "<group>"; };
5E9A19E82C0EAC0200321AC5 /* AoleiSports.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AoleiSports.app; sourceTree = BUILT_PRODUCTS_DIR; };
5E9A19EB2C0EAC0200321AC5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
5E9A19F42C0EAC0300321AC5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
......@@ -271,6 +277,33 @@
path = Root;
sourceTree = "<group>";
};
5E9827C32C300DB3006D74D4 /* BigDataList */ = {
isa = PBXGroup;
children = (
5EB268772C295DA80044BA0C /* HadoopController.swift */,
5E720D072C2B9FBE00D30A16 /* HadoopRequestModel.swift */,
5E720D0B2C2C200700D30A16 /* HadoopMatchFilterGroupModel.swift */,
5EC3AD922C2CEB7200DCFB26 /* RaceTypeModel.swift */,
5EB268792C2974B40044BA0C /* HustleScoreCell.swift */,
5E5A69D42C2A5F7F0063B726 /* HadoopHeaderView.swift */,
5EB2687B2C29764B0044BA0C /* MatchFilterHeaderView.swift */,
5E5A69D82C2ACA9B0063B726 /* HadoopMatchFilterView.swift */,
);
path = BigDataList;
sourceTree = "<group>";
};
5E9827C42C300DDD006D74D4 /* BigDataDetail */ = {
isa = PBXGroup;
children = (
5E5A69D62C2AB0560063B726 /* HadoopDetailController.swift */,
5E56F0B02C2EB88100EA3C10 /* HadoopDetailRequestModel.swift */,
5E9827BF2C2FBA96006D74D4 /* HadoopDetailGameInfoView.swift */,
5E9827BD2C2F95E6006D74D4 /* HadoopDetailRadarView.swift */,
5E9827C12C2FC2D1006D74D4 /* HadoopDetailStatusView.swift */,
);
path = BigDataDetail;
sourceTree = "<group>";
};
5E9A19DF2C0EAC0200321AC5 = {
isa = PBXGroup;
children = (
......@@ -427,17 +460,9 @@
5EC3AD942C2D4F0500DCFB26 /* BigDataResearch */ = {
isa = PBXGroup;
children = (
5EB268772C295DA80044BA0C /* HadoopController.swift */,
5E5A69D62C2AB0560063B726 /* HadoopDetailController.swift */,
5E5A69D42C2A5F7F0063B726 /* HadoopHeaderView.swift */,
5EB2687B2C29764B0044BA0C /* MatchFilterHeaderView.swift */,
5E5A69D82C2ACA9B0063B726 /* HadoopMatchFilterView.swift */,
5EB268792C2974B40044BA0C /* HustleScoreCell.swift */,
5E720D052C2B9D7500D30A16 /* HadoopProvider.swift */,
5E720D072C2B9FBE00D30A16 /* HadoopRequestModel.swift */,
5E720D0B2C2C200700D30A16 /* HadoopMatchFilterGroupModel.swift */,
5EC3AD922C2CEB7200DCFB26 /* RaceTypeModel.swift */,
5E56F0B02C2EB88100EA3C10 /* HadoopDetailRequestModel.swift */,
5E9827C32C300DB3006D74D4 /* BigDataList */,
5E9827C42C300DDD006D74D4 /* BigDataDetail */,
);
path = BigDataResearch;
sourceTree = "<group>";
......@@ -606,6 +631,7 @@
5E93B4902C1A9BDC00CD6536 /* LoginTools.swift in Sources */,
5EC03E532C118FA00068A5CB /* ScoreProvider.swift in Sources */,
5E9A1A522C0F205A00321AC5 /* LeagueController.swift in Sources */,
5E9827BE2C2F95E6006D74D4 /* HadoopDetailRadarView.swift in Sources */,
5E9165D82C1D3F45004A3C5E /* UserProvider.swift in Sources */,
5E9A1A282C0EF51600321AC5 /* GKNavigationBarConfigure.swift in Sources */,
5EC03E4A2C1155530068A5CB /* NetworkTools.swift in Sources */,
......@@ -631,6 +657,7 @@
5E9A1A362C0EF51600321AC5 /* UIViewController+GKGesture.swift in Sources */,
5E6CF00A2C12FAD600BF3CF5 /* TargetController.swift in Sources */,
5E9A1A4C2C0F144200321AC5 /* ColorTools.swift in Sources */,
5E9827C22C2FC2D1006D74D4 /* HadoopDetailStatusView.swift in Sources */,
5EB268782C295DA80044BA0C /* HadoopController.swift in Sources */,
5E9A1A482C0F0DC400321AC5 /* BaseController.swift in Sources */,
5E47C9732C1FCB87002EA39E /* InfoController.swift in Sources */,
......@@ -640,6 +667,7 @@
5E65F88B2C2275DB0082D374 /* RefreshFooterAnimator.swift in Sources */,
5EC03E4E2C1155720068A5CB /* CacheTools.swift in Sources */,
5EB2687C2C29764B0044BA0C /* MatchFilterHeaderView.swift in Sources */,
5E9827C02C2FBA96006D74D4 /* HadoopDetailGameInfoView.swift in Sources */,
5E9A1A2F2C0EF51600321AC5 /* UIBarButtonItem+GKExtension.swift in Sources */,
5EA670622C104D2800CEEA01 /* LoggerTools.swift in Sources */,
5E9A1A312C0EF51600321AC5 /* UINavigationController+GKExtension.swift in Sources */,
......
//
// HadoopDetailController.swift
// AoleiSports
//
// Created by ilCode on 2024/6/25.
//
import UIKit
class HadoopDetailController: BaseController {
let yqId: Int
var provider: HadoopProvider<HadoopTarget>?
let contentView = UIView()
private lazy var scrollView: UIScrollView = {
let view = UIScrollView()
view.showsVerticalScrollIndicator = false
return view
}()
private lazy var header: UIView = {
let view = UIView(frame: CGRect(x: 0, y: -999, width: kScreenW, height: 999 + 60))
view.backgroundColor = UIColor.colorWith(hexString: "122063")
view.corners(radius: 30)
return view
}()
private lazy var teamView: HadoopDetailGameInfoView = {
let view = HadoopDetailGameInfoView(frame: CGRect(x: 10, y: 10, width: kScreenW - 20, height: 100))
return view
}()
private lazy var radarView: HadoopDetailRadarView = {
let view = HadoopDetailRadarView()
return view
}()
private lazy var statusView: HadoopDetailStatusView = {
let view = HadoopDetailStatusView()
return view
}()
init(yqId: Int) {
self.yqId = yqId
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
gk_navTitle = "大数据研究"
gk_navBackgroundColor = UIColor.colorWith(hexString: "122063")
gk_navTitleColor = kWhite
gk_backImage = R.image.btn_back_white()
view.addSubview(scrollView)
scrollView.addSubview(contentView)
contentView.addSubview(header)
contentView.addSubview(teamView)
contentView.addSubview(radarView)
contentView.addSubview(statusView)
scrollView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(kNavBarH)
make.left.right.bottom.equalToSuperview()
}
contentView.snp.makeConstraints { make in
make.edges.equalToSuperview()
make.width.equalToSuperview()
}
radarView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.right.equalToSuperview().offset(-10)
make.top.equalTo(teamView.snp.bottom).offset(10)
}
statusView.snp.makeConstraints { make in
make.top.equalTo(radarView.snp.bottom).offset(10)
make.left.right.equalTo(radarView)
make.bottom.equalToSuperview().offset(-10)
}
initProvider()
handleRefresh()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func handleRefresh() {
super.handleRefresh()
provider?.bigDataDetailRequest(yqId: yqId, completion: { logicResult in
if case .failure(let err) = logicResult {
if case AsError.netErr(let message) = err {
self.showEmpty(type: .netErr, message: message)
} else {
self.showEmpty(type: .other, message: err.localizedDescription)
}
}
})
}
}
extension HadoopDetailController {
private func initProvider() {
provider = HadoopProvider(vc: self, showErr: false)
provider?.bigDataDetail
.asObservable()
.subscribe(onNext: { [weak self] tmpDetail in
guard let self = self else { return }
if tmpDetail == nil {
self.scrollView.isHidden = true
self.showEmpty(type: .noData)
} else {
self.dismissEmpty()
self.scrollView.isHidden = false
}
})
.disposed(by: disposeBag)
teamView.setProvider(provider: provider)
radarView.setProvider(provider: provider)
statusView.setProvider(provider: provider)
}
}
//
// HadoopDetailGameInfoView.swift
// AoleiSports
//
// Created by ilCode on 2024/6/29.
//
import UIKit
class HadoopDetailGameInfoView: UIView {
let disposeBag = DisposeBag()
var provider: HadoopProvider<HadoopTarget>?
private lazy var gameLab: UILabel = {
let lab = UILabel()
lab.font = kBoldFontSize(14)
lab.textAlignment = .center
lab.textColor = kMainTitleColor
return lab
}()
private lazy var matchTimeLab: UILabel = {
let lab = UILabel()
lab.font = kBoldFontSize(13)
lab.textAlignment = .center
lab.textColor = kSubTitleColor
return lab
}()
private lazy var vsLab: UILabel = {
let lab = UILabel()
lab.font = kBoldFontSize(20)
lab.text = "VS"
lab.textAlignment = .center
lab.textColor = kMainTitleColor
return lab
}()
private lazy var gameStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [gameLab, matchTimeLab, vsLab])
stackView.axis = .vertical
stackView.alignment = .center
stackView.spacing = 5
return stackView
}()
private lazy var hostBtn: UIButton = {
let btn = UIButton()
btn.setTitleColor(kMainTitleColor, for: .normal)
btn.titleLabel?.font = kBoldFontSize(16)
return btn
}()
private lazy var hostRankLab: UILabel = {
let lab = UILabel()
lab.font = kFontSize(13)
lab.textAlignment = .center
lab.textColor = kMidTitleColor
return lab
}()
private lazy var hostStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [hostBtn, hostRankLab])
stackView.axis = .vertical
stackView.alignment = .center
stackView.spacing = 5
return stackView
}()
private lazy var guestBtn: UIButton = {
let btn = UIButton()
btn.setTitleColor(kMainTitleColor, for: .normal)
btn.titleLabel?.font = kBoldFontSize(16)
return btn
}()
private lazy var guestRankLab: UILabel = {
let lab = UILabel()
lab.font = kFontSize(13)
lab.textAlignment = .center
lab.textColor = kMidTitleColor
return lab
}()
private lazy var guestStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [guestBtn, guestRankLab])
stackView.axis = .vertical
stackView.alignment = .center
stackView.spacing = 5
return stackView
}()
private lazy var infoStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [hostStackView, gameStackView, guestStackView])
stackView.axis = .horizontal
stackView.alignment = .center
stackView.distribution = .fillEqually
return stackView
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.colorWith(hexString: "ECECED")
corners(radius: 20)
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = [UIColor.colorWith(hexString: "DADADA").cgColor, UIColor.colorWith(hexString: "F4F4F4").cgColor, UIColor.colorWith(hexString: "DADADA").cgColor]
gradientLayer.locations = [0.0, 0.5, 1.0]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
layer.insertSublayer(gradientLayer, at: 0)
addSubview(infoStackView)
infoStackView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
gameStackView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setProvider(provider: HadoopProvider<HadoopTarget>?) {
self.provider = provider
self.provider?.gameInfo
.asObservable()
.subscribe(onNext: { [weak self] tmpGameInfo in
guard let self = self else { return }
self.update(model: tmpGameInfo)
})
.disposed(by: disposeBag)
}
private func update(model: GameInfoModel?) {
if let infoModel = model,
let hostTeam = infoModel.hostTeam,
let guestTeam = infoModel.awayTeam,
let com = infoModel.competition {
let processor = ResizingImageProcessor(referenceSize: CGSize(width: 50, height: 50), mode: .aspectFit)
let comName = com.shortName ?? com.name ?? ""
let hostRank = hostTeam.rank ?? ""
let guestRank = guestTeam.rank ?? ""
self.hostBtn.setTitle(hostTeam.shortName ?? hostTeam.name ?? "", for: .normal)
self.hostBtn.kf.setImage(with: URL(string: hostTeam.logo ?? ""), for: .normal, placeholder: R.image.default_user(), options: [.processor(processor)], completionHandler: { _ in
self.hostBtn.adjustImage(position: .top, spacing: 5)
})
self.hostRankLab.text = hostRank.isEmpty ? "" : "\(comName)\(hostRank)"
self.gameLab.text = comName
self.matchTimeLab.text = ScoreTools.getFormatMatchTime(time: infoModel.matchTime, format: "MM/dd HH:mm")
self.guestBtn.setTitle(guestTeam.shortName ?? guestTeam.name ?? "", for: .normal)
self.guestBtn.kf.setImage(with: URL(string: guestTeam.logo ?? ""), for: .normal, placeholder: R.image.default_user(), options: [.processor(processor)], completionHandler: { _ in
self.guestBtn.adjustImage(position: .top, spacing: 5)
})
self.guestRankLab.text = guestRank.isEmpty ? "" : "\(comName)\(guestRank)"
}
}
}
......@@ -39,6 +39,7 @@ struct TeamModel: Mappable {
var name: String?
var shortName: String?
var logo: String?
var rank: String?
init?(map: ObjectMapper.Map) { }
......@@ -46,6 +47,7 @@ struct TeamModel: Mappable {
name <- map["name"]
shortName <- map["short_name"]
logo <- map["logo"]
rank <- map["rank"]
}
}
......@@ -64,12 +66,16 @@ struct DetailComModel: Mappable {
}
struct BigDataDetailModel: Mappable {
var hostName: String?
var guestName: String?
var radarChartData: RadarChartDataModel?
var statusAnalysis: StatusAnalysisModel?
init?(map: ObjectMapper.Map) { }
mutating func mapping(map: ObjectMapper.Map) {
hostName <- map["home_name"]
guestName <- map["away_name"]
radarChartData <- map["radar_chart_data"]
statusAnalysis <- map["status_analysis"]
}
......
//
// HadoopDetailStatusView.swift
// AoleiSports
//
// Created by ilCode on 2024/6/29.
//
import UIKit
class HadoopDetailStatusView: UIView {
private lazy var titleLab: UILabel = {
let lab = UILabel()
lab.text = "状态分析"
lab.textAlignment = .center
lab.font = kBoldFontSize(16)
lab.textColor = kMainTitleColor
return lab
}()
private lazy var borderView: UIView = {
let view = UIView()
view.backgroundColor = kWhite
view.corners(radius: 10)
view.border(borderColor: UIColor.colorWith(hexString: "F2F1F1"))
return view
}()
private lazy var hostStatusCell: StatusCell = {
let cell = StatusCell()
return cell
}()
private lazy var guestStatusCell: StatusCell = {
let cell = StatusCell()
return cell
}()
let disposeBag = DisposeBag()
var provider: HadoopProvider<HadoopTarget>?
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(titleLab)
addSubview(borderView)
borderView.addSubview(hostStatusCell)
borderView.addSubview(guestStatusCell)
titleLab.snp.makeConstraints { make in
make.top.centerX.equalToSuperview()
}
borderView.snp.makeConstraints { make in
make.top.equalTo(titleLab.snp.bottom).offset(10)
make.left.right.equalToSuperview()
make.bottom.equalToSuperview().offset(-10)
}
hostStatusCell.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
}
guestStatusCell.snp.makeConstraints { make in
make.top.equalTo(hostStatusCell.snp.bottom).offset(10)
make.left.right.equalTo(hostStatusCell)
make.bottom.equalToSuperview().offset(-10)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setProvider(provider: HadoopProvider<HadoopTarget>?) {
self.provider = provider
self.provider?.bigDataDetail
.asObservable()
.subscribe(onNext: { [weak self] tmpDetail in
guard let self = self else { return }
if let hostName = tmpDetail?.hostName,
let guestName = tmpDetail?.guestName,
let statusAnalysisModel = tmpDetail?.statusAnalysis,
let hostResult = statusAnalysisModel.homeResult,
let awayResult = statusAnalysisModel.awayResult {
self.hostStatusCell.update(teamName: hostName, score: hostResult.statusScore, tag: hostResult.statusTxt, result: hostResult.resultValue)
self.guestStatusCell.update(teamName: guestName, score: awayResult.statusScore, tag: awayResult.statusTxt, result: awayResult.resultValue)
}
})
.disposed(by: disposeBag)
}
}
//MARK: - 状态分析view
class StatusCell: UIView {
private lazy var teamLab: UILabel = {
let lab = UILabel()
lab.font = kBoldFontSize(14)
lab.textColor = kMainTitleColor
return lab
}()
private lazy var teamProgressView: UIProgressView = {
let proView = UIProgressView()
proView.trackTintColor = UIColor.colorWith(hexString: "E6EFF7")
proView.progressTintColor = UIColor.colorWith(hexString: "1EA1FC")
proView.corners(radius: 8)
return proView
}()
private lazy var teamValueLab: UILabel = {
let lab = UILabel()
lab.font = kFontSize(12)
lab.textAlignment = .right
lab.textColor = UIColor.colorWith(hexString: "475086")
return lab
}()
private lazy var teamTagLab: UILabel = {
let lab = UILabel()
lab.font = kFontSize(12)
lab.textAlignment = .center
lab.textColor = kWhite
return lab
}()
private lazy var teamStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [teamLab, teamProgressView, teamValueLab, teamTagLab])
stackView.axis = .horizontal
stackView.alignment = .center
stackView.spacing = 10
return stackView
}()
private lazy var teamStatusInfoLab: UILabel = {
let lab = UILabel()
lab.font = kFontSize(14)
lab.numberOfLines = 0
lab.textColor = UIColor.colorWith(hexString: "475086")
return lab
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(teamStackView)
addSubview(teamStatusInfoLab)
teamStackView.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
}
teamProgressView.snp.makeConstraints { make in
make.height.equalTo(16)
}
teamStatusInfoLab.snp.makeConstraints { make in
make.top.equalTo(teamStackView.snp.bottom).offset(10)
make.left.right.equalTo(teamStackView)
make.bottom.equalToSuperview().offset(-10)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
let corners: UIRectCorner = [.topLeft, .topRight, .bottomRight]
teamTagLab.setCorners(corners: corners, radius: 5)
}
func update(teamName: String?, score: Int?, tag: String?, result: String?) {
let tmpScore = score ?? 0
teamLab.text = teamName
teamProgressView.progress = Float(tmpScore)/100.0
teamValueLab.text = tmpScore > 0 ? "\(tmpScore)分" : ""
teamTagLab.text = tag
teamStatusInfoLab.text = result
if let tmpTag = tag {
var bgColor = "F39322"
if tmpTag == "非常好" {
bgColor = "F7492C"
} else if tmpTag == "很好" {
bgColor = "F67966"
} else if tmpTag == "较好" {
bgColor = "F39322"
} else if tmpTag == "一般" {
bgColor = "F4B057"
} else if tmpTag == "较差" {
bgColor = "F4C281"
}
teamTagLab.backgroundColor = UIColor.colorWith(hexString: bgColor)
}
teamTagLab.sizeToFit()
teamTagLab.snp.remakeConstraints { make in
make.size.equalTo(CGSize(width: teamTagLab.width + 8, height: 20))
}
}
}
......@@ -99,11 +99,9 @@ class HadoopHeaderView: UIView {
}
// 获取动态高度
setNeedsLayout()
layoutIfNeeded()
self.height = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
}
func setProvider(_ provider: HadoopProvider<HadoopTarget>?) {
self.provider = provider
......@@ -111,7 +109,23 @@ class HadoopHeaderView: UIView {
.asObservable()
.subscribe(onNext: { [weak self] tmpList in
guard let self = self else { return }
self.preCollectionView.update(topList: tmpList)
if tmpList.isEmpty {
self.yesPreBtn.snp.remakeConstraints { make in
make.left.right.equalTo(self.detailLab)
make.top.equalTo(self.detailLab.snp.bottom).offset(15)
make.height.equalTo(0)
}
self.preCollectionView.snp.remakeConstraints { make in
make.top.equalTo(self.yesPreBtn.snp.bottom).offset(15)
make.left.right.equalToSuperview()
make.height.equalTo(0)
make.bottom.equalToSuperview().offset(-20).priority(.high)
}
self.height = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
} else {
self.preCollectionView.update(topList: tmpList)
}
})
.disposed(by: disposeBag)
}
......
//
// HadoopDetailController.swift
// AoleiSports
//
// Created by ilCode on 2024/6/25.
//
import UIKit
import DGCharts
class HadoopDetailController: BaseController {
let yqId: Int
var provider: HadoopProvider<HadoopTarget>?
let activities = ["进攻", "排名", "技术", "状态", "防守"]
private lazy var header: UIView = {
let view = UIView(frame: CGRect(x: 0, y: -30, width: kScreenW, height: kNavBarH + 90))
view.backgroundColor = UIColor.colorWith(hexString: "122063")
view.corners(radius: 30)
return view
}()
private lazy var teamView: UIView = {
let view = UIView(frame: CGRect(x: 10, y: kNavBarH, width: kScreenW - 20, height: 100))
view.backgroundColor = UIColor.colorWith(hexString: "ECECED")
view.corners(radius: 20)
let gradientLayer = CAGradientLayer()
gradientLayer.frame = view.bounds
gradientLayer.colors = [UIColor.colorWith(hexString: "DADADA").cgColor, UIColor.colorWith(hexString: "F4F4F4").cgColor, UIColor.colorWith(hexString: "DADADA").cgColor]
gradientLayer.locations = [0.0, 0.5, 1.0]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
view.layer.insertSublayer(gradientLayer, at: 0)
return view
}()
private lazy var radarView: UIView = {
let view = UIView()
view.backgroundColor = kWhite
view.corners(radius: 10)
view.border(borderColor: UIColor.colorWith(hexString: "F2F1F1"))
return view
}()
private lazy var radarChartView: RadarChartView = {
let chartView = RadarChartView()
chartView.chartDescription.enabled = false
chartView.webLineWidth = 1
chartView.innerWebLineWidth = 1
chartView.webColor = UIColor.colorWith(hexString: "CADEF1")
chartView.innerWebColor = UIColor.colorWith(hexString: "CADEF1")
chartView.webAlpha = 1
chartView.backgroundColor = .clear
chartView.rotationEnabled = false
return chartView
}()
init(yqId: Int) {
self.yqId = yqId
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
gk_navTitle = "大数据研究"
gk_navBackgroundColor = UIColor.colorWith(hexString: "122063")
gk_navTitleColor = kWhite
gk_backImage = R.image.btn_back_white()
// view.addSubview(header)
// view.addSubview(teamView)
// view.addSubview(radarView)
// radarView.addSubview(radarChartView)
//
// radarView.snp.makeConstraints { make in
// make.left.equalToSuperview().offset(10)
// make.right.equalToSuperview().offset(-10)
// make.top.equalTo(teamView.snp.bottom).offset(10)
// }
// radarChartView.snp.makeConstraints { make in
// make.centerX.equalToSuperview()
// make.top.equalToSuperview().offset(10)
// make.width.height.equalTo(300)
// make.bottom.equalToSuperview().offset(-10)
// }
//
// self.initRadarChartView()
// self.showRadarChartView()
initProvider()
handleRefresh()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func handleRefresh() {
super.handleRefresh()
provider?.bigDataDetailRequest(yqId: yqId, completion: { logicResult in
if case .failure(let err) = logicResult {
if case AsError.netErr(let message) = err {
self.showEmpty(type: .netErr, message: message)
} else {
self.showEmpty(type: .other, message: err.localizedDescription)
}
}
})
}
private func initRadarChartView() {
let xAxis = radarChartView.xAxis
xAxis.labelFont = kBoldFontSize(12)
xAxis.xOffset = 0
xAxis.yOffset = 0
xAxis.valueFormatter = self
xAxis.labelTextColor = UIColor.colorWith(hexString: "475086")
let yAxis = radarChartView.yAxis
yAxis.labelFont = kBoldFontSize(12)
yAxis.axisMinimum = 0
yAxis.drawLabelsEnabled = false
yAxis.labelTextColor = UIColor.colorWith(hexString: "475086")
let l = radarChartView.legend
l.form = .circle
l.horizontalAlignment = .center
l.verticalAlignment = .bottom
l.orientation = .horizontal
l.drawInside = true
l.font = kFontSize(12)
l.xEntrySpace = 10
l.textColor = kMainTitleColor
}
func showRadarChartView() {
let hostList = [44, 85, 71, 86, 80]
let guestList = [17, 91, 45, 83, 77]
let axisRanges: [(min: Double, max: Double)] = [
(min: 0, max: 54),
(min: 0, max: 100),
(min: 0, max: 100),
(min: 0, max: 100),
(min: 0, max: 100)
]
// 归一化数据
let normalizedHostList = zip(hostList, axisRanges).map { value, range in
return RadarChartDataEntry(value: (Double(value) - range.min) / (range.max - range.min))
}
let normalizedGuestList = zip(guestList, axisRanges).map { value, range in
return RadarChartDataEntry(value: (Double(value) - range.min) / (range.max - range.min))
}
let set1 = RadarChartDataSet(entries: normalizedHostList, label: "主队")
set1.setColor(UIColor.colorWith(hexString: "1EA1FC"))
set1.fillColor = UIColor.colorWith(hexString: "73C4FD")
set1.drawFilledEnabled = true
set1.fillAlpha = 0.7
set1.lineWidth = 2
set1.drawHighlightCircleEnabled = true
set1.setDrawHighlightIndicators(false)
let set2 = RadarChartDataSet(entries: normalizedGuestList, label: "客队")
set2.setColor(UIColor.colorWith(hexString: "FC9377"))
set2.fillColor = UIColor.colorWith(hexString: "FBBAAA")
set2.drawFilledEnabled = true
set2.fillAlpha = 0.7
set2.lineWidth = 2
set2.drawHighlightCircleEnabled = true
set2.setDrawHighlightIndicators(false)
let data: RadarChartData = [set1, set2]
data.setDrawValues(false)
radarChartView.data = data
radarChartView.animate(xAxisDuration: 0, yAxisDuration: 1.4, easingOption: .linear)
}
}
extension HadoopDetailController: AxisValueFormatter {
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return activities[Int(value) % activities.count]
}
}
extension HadoopDetailController {
private func initProvider() {
provider = HadoopProvider(vc: self, showErr: false)
// provider?.matchList
// .asObservable()
// .subscribe(onNext: { [weak self] tmpModels in
// guard let self = self else { return }
//
//
// })
// .disposed(by: disposeBag)
}
}
......@@ -42,6 +42,9 @@ class HadoopProvider<Target: TargetType>: BaseMoyaProvider<Target> {
var comList = BehaviorRelay<[HadoopComModel]>(value: [])
var matchList = BehaviorRelay<[HadoopMatchModel]>(value: [])
var gameInfo = BehaviorRelay<GameInfoModel?>(value: nil)
var bigDataDetail = BehaviorRelay<BigDataDetailModel?>(value: nil)
// 大数据列表请求
func bigDataListRequest(completion: @escaping (Result<Bool, AsError>) -> Void) {
moyaPost(api: APIs.kBigDataList, target: HadoopTarget.bigDataList) { midResult in
......@@ -60,7 +63,7 @@ class HadoopProvider<Target: TargetType>: BaseMoyaProvider<Target> {
}
if let predictTopList = requestModel?.predictData?.predictTopList,
!predictTopList.isEmpty,
!predictTopList.isEmpty,
let recentCount = requestModel?.predictData?.recentCount {
let tmpTopList = predictTopList.prefix(3).map { tmpModel in
var newModel = tmpModel
......@@ -98,7 +101,15 @@ class HadoopProvider<Target: TargetType>: BaseMoyaProvider<Target> {
switch midResult {
case let .success(midSuccessResult):
let requestModel = HadoopDetailRequestModel(JSON: midSuccessResult)
if let tmpGameInfo = requestModel?.gameInfo {
self.gameInfo.accept(tmpGameInfo)
}
if let tmpDetail = requestModel?.bigDataDetail {
self.bigDataDetail.accept(tmpDetail)
}
completion(.success(true))
case .failure(let err):
completion(.failure(err))
......
......@@ -26,6 +26,16 @@ extension UIView {
line.backgroundColor = color
return line
}
// 设置圆角
func setCorners(corners: UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
}
extension UIView {
......
......@@ -8,24 +8,33 @@
import Foundation
struct ScoreTools {
static func getFormatMatchTime(time: String?, format: String = "HH:mm") -> String {
guard let oriTime = time else {
return ""
}
// 创建日期格式化器来解析输入日期字符串
let inputDateFormatter = DateFormatter()
inputDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
guard let date = inputDateFormatter.date(from: oriTime) else {
return ""
}
static func getFormatMatchTime(time: Any?, format: String = "HH:mm") -> String {
// 创建日期格式化器来格式化日期为目标格式
let targetDateFormatter = DateFormatter()
targetDateFormatter.dateFormat = format
var date: Date?
// 处理String类型的时间
if let oriTime = time as? String {
let inputDateFormatter = DateFormatter()
inputDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
date = inputDateFormatter.date(from: oriTime)
}
// 处理Int类型的时间戳
else if let timestamp = time as? Int {
date = Date(timeIntervalSince1970: TimeInterval(timestamp))
}
// 处理Double类型的时间戳(可选)
else if let timestamp = time as? Double {
date = Date(timeIntervalSince1970: timestamp)
}
guard let validDate = date else {
return ""
}
// 返回格式化后的日期字符串
return targetDateFormatter.string(from: date)
return targetDateFormatter.string(from: validDate)
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!