本地私有开发规范
本文档面向 私有部署(private) 场景下的本地开发、构建与调试,区别于 SaaS 多租户模式。
1. 环境要求
| 工具 | 版本要求 | 说明 |
|---|---|---|
| Java | 17+ | 建议 Eclipse Adoptium / Microsoft JDK |
| Kotlin | 1.9.24 | 由 Gradle 插件管理 |
| Gradle | 8.13+ | 使用项目自带的 gradlew 包装器 |
| Node.js | 18+ | 仅用于前端开发 |
| pnpm / npm | 最新稳定版 | 前端依赖管理 |
| MySQL | 8.0+ / PostgreSQL | 数据库 |
| Git | 2.40+ | 版本控制 |
Windows 特别注意
- 请使用 PowerShell 执行 Gradle 命令。
JAVA_HOME必须显式指向 JDK 17 安装目录。- 避免在
.gitignore忽略的目录(如.gradle/)下执行构建命令。
# PowerShell 示例
$env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-17.0.13.11-hotspot"
& "E:\develop-space\dimebia-com\gradlew" build -x test
2. 项目结构
dimebia-com/
├── core/ # MIT License - 核心领域层
│ ├── model/ # JPA 实体
│ ├── repository/ # 数据访问层(JPA + jOOQ)
│ ├── service/ # 业务逻辑
│ ├── account/ # 账户管理
│ ├── billing/ # 计费引擎
│ ├── reconciliation/ # 对账引擎
│ ├── tax/ # 税务计算
│ ├── plugin/ # 支付插件系统
│ ├── invoice/ # 发票管理
│ ├── iso20022/ # ISO 20022 消息
│ ├── dto/ # 数据传输对象
│ ├── util/ # 工具类
│ ├── exception/ # 异常处理
│ └── audit/ # 审计日志
├── saas/ # Commercial License - SaaS 扩展
│ ├── config/ # 租户配置
│ ├── security/ # JWT、认证
│ ├── notification/ # 邮件、短信、Webhook
│ ├── report/ # 报表服务
│ └── admin/ # 管理后台
├── boot/ # MIT License - 应用启动模块
│ ├── src/main/kotlin/.../controller/ # REST 控制器
│ ├── src/main/kotlin/.../configuration/ # 配置类
│ ├── src/main/resources/ # 配置文件、Flyway 迁移
│ └── src/main/resources/webapp/ # 前端构建产物(自动复制)
├── admin-ui/ # MIT License - Web 管理界面
│ ├── src/
│ │ ├── lib/
│ │ │ ├── api/ # API 客户端
│ │ │ ├── components/ # Svelte UI 组件
│ │ │ ├── pages/ # 页面组件
│ │ │ ├── stores/ # Svelte stores
│ │ │ └── types/ # TypeScript 类型
│ │ └── routes/ # SvelteKit 路由
│ ├── package.json
│ ├── svelte.config.js
│ ├── vite.config.ts
│ └── tailwind.config.ts
├── openspec/ # 技术规范与变更提案
│ ├── changes/ # 进行中的变更
│ │ └── archive/ # 已归档的变更
│ └── specs/ # 已发布的技术规范
├── docs/ # 文档
├── docker/ # Docker 配置
└── build.gradle.kts # Gradle 构建脚本
模块依赖关系
boot → saas → core
- core:纯领域逻辑,不依赖任何上层模块。
- saas:SaaS 多租户扩展,依赖 core。
- boot:应用入口、Web 层、配置,依赖 saas 和 core。
3. 开发命令
后端(Kotlin / Gradle)
# 编译所有模块(跳过测试)
$env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-17.0.13.11-hotspot"
& "E:\develop-space\dimebia-com\gradlew" build -x test
# 仅编译 Kotlin 源码
& "E:\develop-space\dimebia-com\gradlew" compileKotlin
# 运行测试
& "E:\develop-space\dimebia-com\gradlew" test
# 构建生产 JAR(shadow)
& "E:\develop-space\dimebia-com\gradlew" :boot:shadowJar
# 前端构建并复制到后端资源目录
& "E:\develop-space\dimebia-com\gradlew" :boot:copyFrontendToBackend
前端(Svelte / Vite)
# 安装依赖
cd E:\develop-space\dimebia-com\admin-ui
pnpm install
# 开发模式(热重载)
pnpm run dev
# 生产构建
pnpm run build
# 预览生产构建
pnpm run preview
Docker
# 构建镜像
docker build -f docker/Dockerfile -t dimebia:latest .
# 启动服务
docker-compose -f docker/docker-compose.yml up -d
4. 代码规范
4.1 Kotlin 后端
| 项目 | 规范 |
|---|---|
| 包名 | 全小写,无下划线,如 com.alaikis.dimebia.service |
| 类名 | PascalCase,如 DeveloperService |
| 函数/变量 | camelCase,如 generateDeveloper() |
| 常量 | UPPER_SNAKE_CASE,如 MAX_RETRY_COUNT |
| 文件编码 | UTF-8,LF 换行(Git 会自动转换 CRLF) |
| 导入顺序 | 标准库 → 第三方库 → 项目内部 |
| 空安全 | 优先使用非空类型,必要时使用 ? |
| 数据类 | 优先使用 data class 表示 DTO/Entity |
| 单例 | 使用 object 声明工具类 |
| 依赖注入 | 构造参数注入,避免字段注入 |
| 日志 | 使用 SLF4J,private val logger = LoggerFactory.getLogger(XXX::class.java) |
Controller 层规范
- 所有 Controller 必须标注
@Controller和@Mapping。 - 方法返回
Map<String, Any>,统一响应格式:mapOf("code" to 200,"message" to "success","data" to result) - 异常捕获:在 Controller 层捕获异常,返回
code: 500和错误信息。 - 鉴权:使用
SecurityContext获取当前用户信息。
Service 层规范
- 标记为
@Component以便 Solon DI 装配。 - 业务逻辑必须放在 Service 层,Controller 只做参数校验和响应包装。
- 事务边界:默认方法级事务,复杂场景使用
@Transactional。
Repository 层规范
- 简单 CRUD 使用 JPA
EntityManager。 - 复杂查询使用 jOOQ。
- 禁止使用 JPA Criteria API(项目规范)。
4.2 前端(Svelte / TypeScript)
| 项目 | 规范 |
|---|---|
| 组件名 | PascalCase,如 Card.svelte |
| 文件编码 | UTF-8 |
| 样式 | Tailwind CSS utility-first |
| 图标 | lucide-svelte |
| 状态管理 | Svelte stores(src/lib/stores/) |
| API 调用 | 统一通过 src/lib/api/client.ts |
| 类型定义 | 放在 src/lib/types/ |
组件规范
- Props:使用
export let声明。 - 事件:使用
createEventDispatcher或直接传递回调。 - 生命周期:使用
onMount、onDestroy。 - 响应式:使用
$:reactive statements。
API 调用规范
- 所有 API 请求必须通过
src/lib/api/client.ts中的api对象。 - 不要在组件中直接使用
fetch。 - 认证失败自动 refresh token 逻辑已在
client.ts中实现。
5. 数据库规范
5.1 迁移脚本
- 使用 Flyway 管理数据库版本。
- 迁移脚本放在:
core/src/main/resources/db/migration/(核心表)boot/src/main/resources/db/migration/(启动模块表)
- 命名规范:
V{版本号}__{描述}.sql,如V1__create_core_tables.sql。 - 版本号递增,不可重复。