Initial commit: suixinkan_ios UIKit rewrite project.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-26 14:33:31 +08:00
commit 9edf993432
297 changed files with 47151 additions and 0 deletions

View File

@ -0,0 +1,111 @@
//
// PilotCertificationViewController.swift
// suixinkan
//
// Created by Codex on 2026/6/26.
//
import SnapKit
import UIKit
///
final class PilotCertificationViewController: ModuleTableViewController {
private let viewModel = PilotCertificationViewModel()
private let statusLabel = UILabel()
override func viewDidLoad() {
title = "飞手认证"
navigationItem.rightBarButtonItem = UIBarButtonItem(
title: "提交",
style: .done,
target: self,
action: #selector(submit)
)
super.viewDidLoad()
setupHeader()
wireViewModel(viewModel) { [weak self] in self?.updateHeader() }
}
private func setupHeader() {
statusLabel.numberOfLines = 0
statusLabel.font = .systemFont(ofSize: 14)
statusLabel.textColor = AppDesign.textSecondary
statusLabel.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 80)
tableView.tableHeaderView = statusLabel
}
override func numberOfSections(in tableView: UITableView) -> Int { 2 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
section == 0 ? formRows.count : 1
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
section == 0 ? "认证信息" : "操作"
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: TitleSubtitleTableViewCell.reuseIdentifier,
for: indexPath
) as! TitleSubtitleTableViewCell
if indexPath.section == 0 {
let row = formRows[indexPath.row]
cell.configure(title: row.title, subtitle: row.value)
} else {
cell.configure(title: "发送验证码", subtitle: viewModel.phone)
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if indexPath.section == 1 {
Task {
do {
try await viewModel.sendCode(api: services.pilotCertificationAPI)
showToast("验证码已发送")
} catch {
showToast(error.localizedDescription)
}
}
}
}
override func reloadContent() async {
await viewModel.load(api: services.pilotCertificationAPI, realNameAPI: services.profileAPI)
updateHeader()
}
@objc private func submit() {
Task {
do {
try await viewModel.submit(
api: services.pilotCertificationAPI,
uploader: services.ossUploadService,
scenicId: services.currentScenicId
)
services.toastCenter.show("提交成功")
} catch {
services.toastCenter.show(error.localizedDescription)
}
}
}
private var formRows: [(title: String, value: String)] {
[
("姓名", viewModel.name),
("证件号", viewModel.certNo),
("手机号", viewModel.phone),
("无人机型号", viewModel.droneModel),
("序列号", viewModel.droneSerialNo)
]
}
private func updateHeader() {
let status = viewModel.auditStatusText
statusLabel.text = "状态:\(status)\n\(viewModel.statusMessage ?? "")"
}
}
extension PilotCertificationViewModel: ViewModelBindable {}