- 业务源码位于
lib/,核心目录包括:lib/api/v2/:Retrofit API 客户端lib/core/:基础设施与核心服务lib/data/:数据模型与仓库lib/features/:业务功能模块lib/pages/:页面容器lib/shared/:共享组件与常量
- 平台目录位于
android/、ios/、macos/、windows/、linux/、web/。 - 测试目录位于
test/,覆盖目录位于coverage/。 - 结构规则:当同一功能模块达到 2 个及以上文件时,必须建立独立子目录(例如
lib/core/auth/)。
docs/OpenSource/1Panel/**为上游镜像与参考资料,整个目录只读。- 禁止直接或间接修改
docs/OpenSource/1Panel/**下任何文件,包括frontend/、core/、agent/等子目录。 - 模块能力设计必须参考 1Panel Web 前端行为与交互语义,在客户端完成高保真功能还原。
- 在能力还原基础上允许客户端增强,增强方向至少包含:多机统一管理、MFA(多因素认证)等移动端价值能力。
- 当 Swagger、注解、路由与真实返回不一致时:
- 必须通过客户端 API 测试确认真实行为并在客户端兼容;
- 严禁通过修改
docs/OpenSource/1Panel/**来“修复契约”。
- 共享业务核心必须由 Dart 实现,原生层只承载 UI 容器与平台能力接入。
- 强制六层划分:
- 状态层:默认 Provider,连接 UI 与业务逻辑(
lib/features/*/providers/) - 服务层:业务规则与数据加工(
lib/core/services/或业务模块*_service.dart) - 仓库层:数据单一事实来源(
lib/data/repositories/) - 模型层:实体与请求响应结构(
lib/data/models/) - API/基础设施层:外部通信、存储、平台交互(
lib/api/v2/、lib/core/network/、lib/core/storage/、lib/core/channel/) - 核心配置层:路由、主题、国际化、全局配置(
lib/core/)
- 状态层:默认 Provider,连接 UI 与业务逻辑(
- 依赖方向仅允许:
Presentation -> State -> Service/Repository -> API/Infra。 - UI 层禁止直接调用
lib/api/v2/,必须通过 Service/Repository。 - 业务逻辑禁止写在 Widget
build()或原生 UI 控制器内。 - 状态管理默认 Provider,其他模式需评审通过。
- 适配范围:Android、iOS、iPadOS、macOS、Windows、Linux、HarmonyOS(目标平台);Web 不在当前适配范围。
- MDUI3 是全平台可用基线,必须持续可运行,不得降级为“仅回退方案”。
- Apple(iOS/iPadOS/macOS)与 Windows 必须建设原生 UI 轨道,同时保留 MDUI3 通用轨道。
- 允许并鼓励多设计系统与多主题,但必须走统一注册中心与主题控制,禁止页面私自定义独立体系。
- 设计系统与主题是两层概念:
- 设计系统:MDUI3、Apple 风格、Fluent/WinUI3 等
- 主题配置:浅色、深色、动态色、品牌色、用户自定义方案
- 平台策略:
- Windows:强制建设 Fluent/WinUI3 原生轨道
- iOS/iPadOS/macOS:强制建设 SwiftUI 原生轨道,视觉方向适配 Liquid Glass 风格
- Android:Dart MDUI3 为默认落地路径;原生实现仅允许经评审批准后引入
- Linux:当前阶段以 Dart MDUI3 交付为主,原生容器能力按社区扩展路线规划
- HarmonyOS:纳入目标平台并规划原生里程碑,当前阶段允许
UiTarget/Channel/Provider 占位并保持共享业务在 Dart 层
- 无论使用何种 UI 体系,共享业务逻辑都必须复用同一套 Dart State/Service/Repository/API,不得分叉为多套业务实现。
- 原生 UI 同样必须遵守
Presentation -> State -> Service/Repository -> API/Infra,不得跨层直接访问 API。 - 桌面缓存模块页必须禁用非当前页 Hero;带
FloatingActionButton的页面必须显式设置heroTag或显式禁用 Hero。 - 禁止可变 widget 自引用包装链(例如反复重写
content并在后续 builder 中引用当前content)。 - 桌面模块切换必须留在统一壳内,普通切换不得再次
push完整壳或首页。 - 桌面
Scaffold/AppBar/NavigationRail/ 壳内容区默认必须使用surface或surfaceContainer*,禁止整页透明背景。
- 所有代码文件(文档与 Swagger 产物除外)硬上限为
1000 LOC,超出必须拆分。 - 推荐阈值:
- 逻辑文件(Provider/ViewModel/Service/Repository/Model/Utils)建议不超过
500 LOC - UI 文件(Page/复合 Widget)建议不超过
800 LOC
- 逻辑文件(Provider/ViewModel/Service/Repository/Model/Utils)建议不超过
- 单一逻辑/架构文件不得承担 3 个及以上功能域(职责上限为 2 个)。
- LOC 统计口径为非空非注释行,
*.g.dart、*.freezed.dart不计入。
- 所有模块开发必须按照以下自动化闭环执行,不得跳步:
- 需求拆解(明确能力边界、依赖、验收条件)
- 测试用例设计(单测、集成、UI/交互、契约偏差用例)
- 自动化测试基线准备(脚本、夹具、环境变量、门禁)
- 功能开发实现(按分层架构落地)
- 单元测试执行与修复
- 集成测试执行与修复(涉及 API/网络/数据写入时为必跑项)
- 文档与基线回写(模块文档、分析基线、兼容策略)
- 任一步骤失败必须回到对应步骤修复后再继续,不允许“带失败推进”。
flutter pub get:安装依赖flutter run:调试运行flutter analyze:静态分析flutter test:执行全部测试flutter test test/<file>_test.dart:执行单个测试文件flutter test --coverage:生成覆盖率报告flutter packages pub run build_runner build:生成模型与 Retrofit 代码flutter build apk --release/flutter build appbundle/flutter build ios --release:发布构建
- Dart 使用 2 空格缩进,启用
flutter_lints。 - 文件命名使用小写下划线。
- 后缀规范:
_page.dart、_widget.dart、_service.dart、_model.dart、_repository.dart。 - 日志规则:禁止使用
print()或debugPrint(),统一使用lib/core/services/logger_service.dart中的appLogger。
- 测试文件以
_test.dart结尾,按功能归档到test/子目录。 - Bug 修复必须补充回归测试。
- 提交前必须可运行
flutter analyze。 - 提交前必须可运行
dart run test/scripts/test_runner.dart unit。 - 涉及 API/网络或数据写入时,必须运行
dart run test/scripts/test_runner.dart integration。 - 涉及 UI 改动时,必须运行
dart run test/scripts/test_runner.dart ui。 - 涉及 Windows 原生 UI 轨道改动时,必须运行
dotnet build windows/runner/native_host/OnePanelNativeHost/OnePanelNativeHost.csproj -c Debug。 - 涉及 Apple 原生 UI 轨道改动时,必须在 macOS/CI 环境运行
xcodebuild(iOS + macOS)构建门禁并附结果。 - 原生 UI 适配门禁失败必须阻断推进,不允许“带失败继续”。
- 回归基线使用
dart run test/scripts/test_runner.dart all。
- 重大架构决策、关键约定、通用踩坑必须写入
agent-memory-mcp(decision/pattern)。 - 实施前应先执行
memory_search检索既有结论,避免重复决策。 - 规范变更必须同步更新
AGENTS.md与CLAUDE.md。 - 涉及跨平台 UI 或原生扩展策略变更时,必须同步更新
docs/development/cross_platform_ui_governance.md、docs/模块适配专属工作流.md、docs/原生UI适配专属工作流.md。
- 提交信息遵循 Conventional Commits,例如:
feat(scope): ...、fix(scope): ...、chore: ...、refactor: ...。 - PR 需保持小步提交;大改动先开 issue 对齐范围。
- PR 必须包含:变更说明、测试结果、UI 变更截图(如适用)。
- 严禁在 issue、日志、截图中泄露密钥与敏感信息。
- 长期主干分支:
dev-v2,对标 1Panel 服务端dev-v2的单主干策略。 main分支计划移除,所有功能集成、稳定验证与发布准备均围绕dev-v2展开。- Android APK 使用 tag 驱动发布:
debug-*、beta-*、pre-release-*、v*。 - tag 来源约束:
debug/beta/pre-release/v*均必须来自dev-v2
- 渠道映射:
debug -> Alphabeta -> Beta(公开预览)pre-release -> Pre-Releasev* -> Release
- 版本号策略:
- 当前默认仍采用客户端自身语义化版本,如
v0.6.0 - 与 1Panel V2 版本号同步的方案暂缓实施,需在功能与服务端版本真正对齐后再评估,例如
v2.1.0-client
- 当前默认仍采用客户端自身语义化版本,如
- API 访问使用 1Panel API Key,禁止提交密钥或令牌。
- 分享日志或复现步骤时必须脱敏 IP、用户名、凭据。