10 KiB
10 KiB
Agent 行为准则 & HealthEmergency iOS 开发规范
一、Agent 行为准则
0. 语言强制
- 强制使用简体中文进行所有交互(代码除外)。
1. 抽象设计确认
- 涉及抽象设计、架构调整或新功能模块时,必须先用文字或 Mermaid 图对齐设计思路。
- 必须等待用户确认方案后,才能开始编写代码。
2. 任务清单确认
- 执行任何实质性任务前,必须先列出详细的任务清单。
- 必须等待用户明确回复(如"好的"、"开始")后,才能进入执行阶段。
3. 分步执行与确认
- 代码量较大或逻辑复杂的任务,禁止一次性完成。
- 拆分为多个步骤,每步完成后汇报进度并询问"是否可以进行下一步?"。
4. 所有修改必须确认
- 对代码库的任何修改(新建文件、修改文件、删除文件、执行 pod install 等)前,必须先描述变更内容。
- 必须等待用户明确回复"确认"或"同意"后,才能执行。
5. 代码注释语言规范
- 所有注释使用简体中文。
- 标识符(变量名、函数名、类名)仍使用英文。
二、项目技术规范
技术栈
- 主语言: Swift(混编 Objective-C,Swift 为主)
- UI 框架: UIKit
- 架构模式: MVC + BasicModule 基础设施层
- 包管理: CocoaPods,使用
.xcworkspace打开项目 - 最低系统版本: iOS 13.0
- 布局: SnapKit(主要)+ frame
- 网络: Moya + Alamofire
- 图片加载: Kingfisher
- 主题: SwiftTheme
三、项目目录结构
HealthEmergency/
├── BasicModule/ # 基础设施层(非业务)
│ ├── Base/ # 基类(MktViewController、MktNavigatonController)
│ ├── Network/ # 网络层(RequestManager、RequestTarget、NetworkParser)
│ ├── Extension/ # Swift 扩展
│ ├── Util/ # 工具类(ThemeManager、Foundation.swift)
│ ├── Helper/ # POP 动画 & 自定义辅助类
│ ├── CacheKit/ # 缓存工具
│ └── Configuration/ # APIKey 等配置(敏感,勿外传)
├── Class/ # 业务模块
│ ├── Home/ # 首页(应用)
│ ├── Dangan/ # 档案(健康记录)
│ ├── AI/ # AI 助手
│ ├── Knowledge/ # 知识库
│ ├── Mine/ # 我的(用户中心)
│ ├── Market/ # 市场/产品(未在主 TabBar)
│ ├── Message/ # 消息(TUI IM 集成)
│ └── Login/ # 登录模块
├── Resources/
│ └── Themes/ # 主题配置(blue/red/green/purple.plist)
└── HealthEmergency-Bridging-Header.h
新增业务模块按以下结构组织:
Class/ModuleName/
├── ViewController/ # 视图控制器
├── View/ # 自定义视图
└── Model/ # 数据模型(Codable struct)
四、命名规范
类名(PascalCase):
- 基类及核心组件使用
Mkt前缀,如MktViewController、MktNavigatonController - 业务类按模块语义命名,如
HomeViewController、DanganHomeViewController - 数据模型用
Model后缀,如BannerModel、MarketProductModel
文件组织:
- 扩展文件:
Extension+Feature.swift,如Extension+UIView.swift - 模型文件:放在对应模块的
Model/子目录
方法名(camelCase):
func setupUI()
func updateThemeUI()
func loadData(page: Int)
常量:
// Swift 常量用 camelCase
let defaultPageSize = 20
// OC 宏用大写
JPScaleValue(16)
五、代码组织
// MARK: - Life Cycle
// MARK: - Setup
// MARK: - Network
// MARK: - Actions
// MARK: - ThemeProtocol / Theme
// MARK: - UITableViewDataSource
// MARK: - UITableViewDelegate
六、网络层规范
发起请求
项目网络层统一使用 RequestTarget + RequestManager,通过 Moya 封装:
// GET 请求(带分页参数)
RequestTarget.get("/api/v1/list", query: ["page": 1, "size": 20])
.sendParsed(showHUD: true, type: [ItemModel].self) { success, data, msg in
guard success, let items = data else { return }
self.items = items
self.tableView.reloadData()
}
// POST 请求
RequestTarget.post("/api/v1/submit", body: ["key": "value"])
.sendParsed(showHUD: true, type: ResultModel.self) { success, data, msg in
if success {
Mkt.makeToast("提交成功")
}
}
// 文件上传
RequestTarget.upload("/api/v1/upload", files: [fileData], names: ["file"])
.sendParsed(showHUD: true, type: UploadResult.self) { success, data, msg in
// ...
}
响应码说明
| 响应码 | 含义 |
|---|---|
0000 / 200 |
请求成功 |
4001 |
Token 过期,自动跳转登录 |
-888 |
网络不可用 |
-999 |
请求超时 |
-666 |
服务器异常 |
数据模型结构
// 服务端统一响应结构
struct Response<T: Codable> {
var retCode: String // 响应码
var retMsg: String // 响应信息
var retData: T? // 业务数据
}
// 数据模型使用 Codable struct
struct ItemModel: Codable {
var id: String?
var name: String?
var createdAt: String?
}
注意事项
- API 地址统一定义在
BasicModule/Configuration/APIKey.swift,禁止在业务代码中硬编码 URL - SDK Key / Secret 统一放
APIKey.swift,禁止散落在业务文件 - 网络回调默认在主线程,可直接操作 UI
七、主题系统
项目支持 4 套主题(blue / red / green / purple),配置文件在 Resources/Themes/*.plist。
初始化(AppDelegate)
AppThemeManager.shared.setup()
切换主题
AppThemeManager.shared.switchTheme(to: .blue)
在视图中应用主题
override func viewDidLoad() {
super.viewDidLoad()
setupTheme()
}
private func setupTheme() {
updateThemeUI()
observeThemeChanges { [weak self] in
self?.updateThemeUI()
}
}
private func updateThemeUI() {
// 使用 ThemeKey 绑定(推荐,自动响应主题切换)
view.theme_backgroundColor = ThemeKey.backgroundColor
titleLabel.theme_textColor = ThemeKey.textColor
navBar.theme_backgroundColor = ThemeKey.navBarColor
}
常用 ThemeKey
ThemeKey.primaryColor // 主色调
ThemeKey.backgroundColor // 页面背景色
ThemeKey.textColor // 正文文字色
ThemeKey.navBarColor // 导航栏背景色
ThemeKey.navBarTextColor // 导航栏文字色
ThemeKey.buttonBgColor // 按钮背景色
ThemeKey.tabBarSelectedColor // TabBar 选中色
八、常用工具速查
Mkt 全局结构体(BasicModule/Util/Foundation.swift)
Mkt.appName // App 名称
Mkt.isDebug // 是否 Debug 模式
Mkt.isDevice // 真机 vs 模拟器
Mkt.screenWidth // 屏幕宽度
Mkt.screenHeight // 屏幕高度
Mkt.safe_top // 安全区上边距
Mkt.safe_bottom // 安全区下边距
Mkt.topBarHeight // 导航栏 + 安全区高度
Mkt.keyWindow // 当前活跃 UIWindow
Mkt.makeToast("提示") // Toast 提示
Mkt.jsonToModel() // JSON ↔ Codable 模型转换
日志(DEBUG 模式有效)
dlog("请求参数: \(params)") // 带文件名/函数名/行号自动输出
JPConstant.h 宏(OC 层,通过 Bridging Header 可用)
JPScaleValue(16) // 按屏幕宽度等比缩放数值(基准 375pt)
JPScaleFont(14) // 等比缩放字体
JPRGBColor(r, g, b) // RGB 0-255 创建颜色
JPStringEqual(a, b) // 安全字符串比较
用户管理
UserManager.shared.isLoggedIn // 是否已登录
UserManager.shared.currentUser // 当前用户信息(UserInfo?)
UserManager.shared.token // 当前 Token
九、UI 布局规范
优先使用 SnapKit:
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.left.right.equalToSuperview().inset(20)
make.height.equalTo(JPScaleValue(44))
}
屏幕适配统一用 JPScaleValue():
// 设计稿 375pt 基准,所有固定尺寸都过 JPScaleValue
let itemHeight = JPScaleValue(80)
let fontSize = JPScaleFont(14)
UIView 扩展(Extension+UIView.swift)常用方法:
view.setCornerRadius(8) // 圆角
view.setShadow(color: .black, opacity: 0.1) // 阴影
view.addGradient(colors: [.blue, .cyan]) // 渐变
十、内存管理
Block / 闭包内防循环引用,统一使用 [weak self]:
RequestTarget.get("/api/list")
.sendParsed(type: [Item].self) { [weak self] success, data, msg in
guard let self = self else { return }
self.items = data ?? []
self.tableView.reloadData()
}
十一、各模块职责
| 模块 | 路径 | 职责 |
|---|---|---|
| Home | Class/Home/ |
首页 Dashboard、Banner、应用入口 |
| Dangan | Class/Dangan/ |
健康档案、体检记录 |
| AI | Class/AI/ |
AI 健康助手对话 |
| Knowledge | Class/Knowledge/ |
健康知识库、文章 |
| Mine | Class/Mine/ |
用户中心、设置、个人信息 |
| Market | Class/Market/ |
产品/服务目录(不在主 TabBar) |
| Message | Class/Message/ |
IM 消息列表(TUIKit 集成) |
| Login | Class/Login/ |
登录、注册、忘记密码 |
| BasicModule/Network | — | 全局网络请求封装,禁止绕过 |
| BasicModule/Base | — | 所有 VC 的基类,提供主题/导航能力 |
十二、禁止事项
- 禁止将 API Key、SDK AppID 等敏感信息硬编码在业务文件中(统一放
APIKey.swift) - 禁止在主线程执行网络请求、数据库读写、文件 IO 等耗时操作
- 禁止绕过
RequestTarget/RequestManager直接使用 Alamofire 发起请求 - 禁止在未通知用户的情况下引入新的 Pod 依赖
- 禁止修改
BasicModule/Base/中的基类,除非经用户明确确认 - 禁止在 Swift Extension 中添加存储属性(使用 AssociatedObject 或重构为子类)
- 禁止未经确认自行切换主题或修改
Resources/Themes/*.plist