Implement permission-driven home tab aligned with Android.

Load role-permission on first visit to drive menus, role-based layout, store card, and location reporting with account-scoped persistence and unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 17:27:54 +08:00
parent 75d0cb1f9a
commit 3b17b7f7f0
27 changed files with 2573 additions and 10 deletions

View File

@ -0,0 +1,108 @@
//
// HomeRouteHandler.swift
// suixinkan
//
import UIKit
/// permission URI
enum HomeRouteHandler {
///
@MainActor
static func open(
uri: String,
from viewController: UIViewController,
storeItem: StoreItem?
) {
if uri == "pilot_controller" || uri == "more_functions" {
showDeveloping(from: viewController)
return
}
if uri != "pilot_controller", AppStore.shared.currentScenicId <= 0 {
showToast("请先选择景区", from: viewController)
return
}
switch uri {
case "verification_order":
selectTab(.orders, from: viewController)
case "photographer_stats":
selectTab(.statistics, from: viewController)
case "system_settings", "space_settings":
selectTab(.profile, from: viewController)
case "pilot_cert":
let controller = RealNameAuthViewController()
viewController.navigationController?.pushViewController(controller, animated: true)
case "operating-area":
handleOperatingArea(from: viewController, storeItem: storeItem)
case "cooperation_order":
if !hasCooperationOrderPermission() {
showToast("暂无合作订单权限", from: viewController)
return
}
showDeveloping(from: viewController)
default:
showDeveloping(from: viewController)
}
}
@MainActor
private static func handleOperatingArea(from viewController: UIViewController, storeItem: StoreItem?) {
guard let role = AppStore.shared.currentAppRole else {
showToast("当前账号暂不支持运营区域", from: viewController)
return
}
switch role {
case .storeAdmin:
guard let storeItem, storeItem.id > 0 else {
showToast("请先选择店铺", from: viewController)
return
}
showDeveloping(from: viewController)
case .scenicAdmin:
guard AppStore.shared.currentScenicId > 0 else {
showToast("请先选择景区", from: viewController)
return
}
showDeveloping(from: viewController)
default:
showToast("当前账号暂不支持运营区域", from: viewController)
}
}
private static func hasCooperationOrderPermission() -> Bool {
let permissions = AppStore.shared.permissionItems()
return permissions.contains { $0.uri == "cooperation_order" }
|| permissions.contains(where: { containsCooperationOrder(in: $0) })
}
private static func containsCooperationOrder(in item: HomePermissionItem) -> Bool {
item.uri == "cooperation_order"
}
@MainActor
private static func selectTab(_ tab: AppTab, from viewController: UIViewController) {
guard let tabBar = viewController.tabBarController as? MainTabBarController else { return }
tabBar.selectTab(tab)
}
@MainActor
private static func showDeveloping(from viewController: UIViewController) {
showToast("功能开发中", from: viewController)
}
@MainActor
private static func showToast(_ message: String, from viewController: UIViewController) {
if let base = viewController as? BaseViewController {
base.showToast(message)
return
}
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
viewController.present(alert, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
alert.dismiss(animated: true)
}
}
}