{"id":15154458,"url":"https://github.com/ahoo-wang/wow-project-template","last_synced_at":"2025-10-24T10:31:10.581Z","repository":{"id":210235586,"uuid":"725994253","full_name":"Ahoo-Wang/wow-project-template","owner":"Ahoo-Wang","description":"用于快速构建基于 Wow 框架的 DDD 项目模板。","archived":false,"fork":false,"pushed_at":"2024-10-29T14:19:17.000Z","size":871,"stargazers_count":13,"open_issues_count":4,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-29T14:21:28.679Z","etag":null,"topics":["cqrs","ddd-architecture","eventsourcing","eventstore","kafka","mongodb","r2dbc","reactive-programming","spring-boot","wow"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ahoo-Wang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-01T10:02:16.000Z","updated_at":"2024-10-24T21:36:38.000Z","dependencies_parsed_at":"2024-02-26T04:25:12.001Z","dependency_job_id":"befa9941-0405-4249-bff1-ad8adaec4344","html_url":"https://github.com/Ahoo-Wang/wow-project-template","commit_stats":{"total_commits":344,"total_committers":2,"mean_commits":172.0,"dds":0.2441860465116279,"last_synced_commit":"1c3231c67eb7b43055c34f71cd0051987fd42c0a"},"previous_names":["ahoo-wang/wow-project-template"],"tags_count":41,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahoo-Wang%2Fwow-project-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahoo-Wang%2Fwow-project-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahoo-Wang%2Fwow-project-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahoo-Wang%2Fwow-project-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ahoo-Wang","download_url":"https://codeload.github.com/Ahoo-Wang/wow-project-template/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237950923,"owners_count":19392667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cqrs","ddd-architecture","eventsourcing","eventstore","kafka","mongodb","r2dbc","reactive-programming","spring-boot","wow"],"created_at":"2024-09-26T17:40:21.961Z","updated_at":"2025-10-24T10:31:10.576Z","avatar_url":"https://github.com/Ahoo-Wang.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 基于 Wow 框架的 DDD 项目模版\n\n[![codecov](https://codecov.io/gh/Ahoo-Wang/wow-project-template/graph/badge.svg?token=lvvGMBqmMh)](https://codecov.io/gh/Ahoo-Wang/wow-project-template)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Ahoo-Wang/wow-project-template)\n\n用于快速构建基于 [Wow 框架](https://github.com/Ahoo-Wang/Wow) 的 DDD 项目模板。\n\n## 模块介绍\n\n| 模块                                              | 说明                                                                                                                                |\n|-------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|\n| [api](./api)                                    | **API 层**，定义聚合命令（Command）、领域事件（Domain Event）以及查询视图模型（Query View Model）。充当各个模块之间通信的“发布语言”，同时提供详细的 API 文档，助力开发者理解和使用接口。             |\n| [domain](./domain)                              | **领域层**，包含聚合根和业务约束的实现。聚合根充当领域模型的入口点，负责协调领域对象的操作，确保业务规则的正确执行。业务约束包括领域对象的验证规则、领域事件的处理等。模块内附有详细的领域模型文档，助力团队深入了解业务逻辑。                 |\n| [server](./server)                              | **宿主服务**，应用程序的启动点。负责整合其他模块，并提供应用程序的入口。涉及配置依赖项、连接数据库、启动 API 服务等任务。此外，server 模块提供了容器化部署的支持，包括 Docker 构建镜像和 Kubernetes 部署文件，简化了部署过程。 |\n| [client](./client)                              | **客户端库**，使用 [fetcher-generator](https://github.com/Ahoo-Wang/fetcher) 自动生成的 TypeScript 客户端库，提供类型安全的 API 调用接口，方便前端或其他服务与后端交互。支持自动生成命令客户端和查询客户端，包含完整的类型定义和错误处理。 |\n| [code-coverage-report](./code-coverage-report)  | **测试覆盖率**，用于生成详细的测试覆盖率报告，以及验证覆盖率是否符合要求。帮助开发团队了解项目测试的全面性和质量。                                                                       |\n| [dependencies](./dependencies)                  | **依赖项管理**，这个模块负责管理项目的依赖关系，确保各个模块能够正确地引用和使用所需的外部库和工具。                                                                              |\n| [bom](./bom)                                    | **项目的 BOM（Bill of Materials）**                                                                                                    |\n| [libs.versions.toml](gradle/libs.versions.toml) | **依赖版本配置文件**，明确了项目中各个库的版本，方便团队协作和保持版本的一致性。                                                                                        |\n| [deploy](./deploy)                              | **Kubernetes 部署文件**，提供了在 Kubernetes 上部署应用程序所需的配置文件，简化了部署过程。                                                                       |\n| [Dockerfile](server/Dockerfile)                 | **server Docker 构建镜像**，通过 Dockerfile 文件定义了应用程序的容器化构建步骤，方便部署和扩展。                                                                   |\n| [document](document)                            | **项目文档**，包括 UML 图和上下文映射图，为团队成员提供了对整个项目结构和业务逻辑的清晰理解。                                                                               |\n\n## 安装模板\n\n[IDEA 项目模板](https://www.jetbrains.com/help/idea/saving-project-as-template.html)\n\n[IDEA 配置目录](https://www.jetbrains.com/help/idea/directories-used-by-the-ide-to-store-settings-caches-plugins-and-logs.html#config-directory)\n\n- IDEA 项目模板目录：`\u003cIDE config home\u003e/projectTemplates`\n  - Windows: `C:\\Users\\\u003cUSERNAME\u003e\\AppData\\Roaming\\JetBrains\\\u003cPRODUCT\u003e\u003cVERSION\u003e\\projectTemplates\\`\n  - Mac OS:`~/Library/Application\\ Support/JetBrains/\u003cPRODUCT\u003e\u003cVERSION/projectTemplates/`\n  - Linux: `~/.config/JetBrains/\u003cPRODUCT\u003e\u003cVERSION\u003e/projectTemplates/`\n- 将模板压缩包放到 IDEA 项目模板目录下\n    - 模板压缩包: https://gitee.com/AhooWang/wow-project-template/releases/download/v6.2.8/wow-project-template.zip\n\n## 创建项目\n\n\u003e [使用模板创建项目](https://www.jetbrains.com/help/idea/saving-project-as-template.html#create-project-from-template)\n\n![创建项目](./document/assets/new-project.png)\n\n- 修改 `settings.gradle.kts` 文件，将 `rootProject.name` 修改为项目名称\n- 修改 `api/{package}/DemoService`\n- 修改 `domain/{package}/DemoBoundedContext`\n\n\u003e WARN: IDEA 基于模版创建项目会将 `gradlew` 脚本被注释，需要重新从模板项目中Copy过来。\n\n```shell\nchmod +x ./gradlew\n```\n\n## Git\n\n```shell\ngit init\ngit remote add origin \u003cyour-repo-url\u003e\n# 如果远端仓库有内容，需要先拉取\ngit pull origin master\n# gradlew 脚本被注释，需要重新从模板项目中Copy过来\nchmod +x gradlew\n# 清理构建目录\ngradle clean\ngit add .\ngit commit -m \"Initial commit\"\n# 推送到远端仓库\ngit push -u origin master\n```\n\n## 启动服务\n\n\u003cp align=\"center\" style=\"text-align:center\"\u003e\n  \u003cimg src=\"./document/assets/run-server.png\" alt=\"启动服务\"/\u003e\n\u003c/p\u003e\n\n\u003e 访问：[http://localhost:8080/swagger-ui.html](http://localhost:8080/swagger-ui.html)\n\n\u003cp align=\"center\" style=\"text-align:center\"\u003e\n  \u003cimg src=\"./document/assets/swagger-ui.png\" alt=\"Swagger-UI\"/\u003e\n\u003c/p\u003e\n\n## 使用客户端\n\n客户端库提供类型安全的 API 调用接口，支持命令和查询操作。\n\n1. **生成客户端代码**：\n\n   ```shell\n   cd client\n   pnpm install\n   pnpm generate\n   ```\n\n2. **构建客户端库**：\n\n   ```shell\n   pnpm build\n   ```\n\n3. **在项目中使用**：\n\n   ```typescript\n   import { DemoCommandClient, demoQueryClientFactory } from '@ahoo-wang/wow-client';\n   const demoCommandClient = new DemoCommandClient()\n   // 发送命令\n   await demoCommandClient.createDemo({ /* 参数 */ });\n\n   const demoQueryClient = demoQueryClientFactory.createSnapshotQueryClient()\n   // 查询数据\n   ```\n\n   详细使用说明请参考 [client/README.md](./client/README.md)。\n\n## 验证测试覆盖率\n\n```shell\n./gradlew domain:jacocoTestCoverageVerification\n```\n\n\u003e 查看测试覆盖率报告：`domain/build/reports/jacoco/test/html/index.html`\n\n\u003cp align=\"center\" style=\"text-align:center\"\u003e\n  \u003cimg src=\"./document/assets/TestCoverage.png\" alt=\"Wow-CI-Flow\"/\u003e\n\u003c/p\u003e\n\n## CI/CD 流水线\n\n\u003cp align=\"center\" style=\"text-align:center\"\u003e\n  \u003cimg src=\"./document/assets/CI-Flow.png\" alt=\"Wow-CI-Flow\"/\u003e\n\u003c/p\u003e\n\n### 测试阶段\n\n\u003e 代码风格检查(Check CodeStyle)\n\n```shell\n./gradlew detekt\n```\n\u003e 领域模型单元测试 (Check Domain)\n\n```shell\n./gradlew domain:check\n```\n\u003e 测试覆盖率验证(Check CodeCoverage)\n\n```shell\n./gradlew domain:jacocoTestCoverageVerification\n```\n### 构建阶段\n\n\u003e 生成部署包 (Build Server)\n\n```shell\n./gradlew server:installDist\n```\n\n\u003e 发布 Docker 镜像 (Push Image)\n\n[Dockerfile](server/Dockerfile)\n\n```shell\ndocker login --username=\u003cusername\u003e --password=\u003c******\u003e \u003cregistry\u003e\ndocker build -t \u003cregistry\u003e/\u003cimage\u003e:\u003ctag\u003e server\ndocker push \u003cregistry\u003e/\u003cimage\u003e:\u003ctag\u003e\n```\n\n### 部署阶段\n\n\u003e 部署到 Kubernetes (Deploy Kubernetes)\n\n[deploy](./deploy)\n\n```shell [部署到 Kubernetes (Deploy Kubernetes)]\nkubectl apply -f deploy\n```\n\n### 流水线配置（阿里云效）\n\n```yaml\nsources:\n  repo:\n    type: codeup\n    name: Wow 项目模板代码源\n    endpoint: \u003cyour-project-repo\u003e\n    branch: main\n    certificate:\n      type: serviceConnection\n      serviceConnection: \u003cyour-service-connection-id\u003e\nstages:\n  test:\n    name: \"测试\"\n    jobs:\n      code_style:\n        name: \"Check CodeStyle\"\n        runsOn: public/cn-hongkong\n        steps:\n          code_style:\n            name: \"代码风格检查\"\n            step: \"JavaBuild\"\n            runsOn: public/\n            with:\n              jdkVersion: \"17\"\n              run: ./gradlew detekt\n\n      test:\n        name: \"Check Domain\"\n        runsOn: public/cn-hongkong\n        steps:\n          test:\n            name: \"Check Domain\"\n            step: \"GradleUnitTest\"\n            with:\n              jdkVersion: \"17\"\n              run: ./gradlew domain:check\n              reportDir: \"domain/build/reports/tests/test\"\n              reportIndex: \"index.html\"\n          coverage:\n            name: \"Check CodeCoverage\"\n            step: \"JaCoCo\"\n            with:\n              jdkVersion: \"17\"\n              run: ./gradlew domain:jacocoTestCoverageVerification\n              reportDir: \"domain/build/reports/jacoco/test/html\"\n  build:\n    name: \"构建\"\n    jobs:\n      build:\n        name: \"Build Server And Push Image\"\n        runsOn: public/cn-hongkong\n        steps:\n          build:\n            name: \"Build Server\"\n            step: \"JavaBuild\"\n            with:\n              jdkVersion: \"17\"\n              run: ./gradlew server:installDist\n          publish_image:\n            name: \"Push Image\"\n            step: \"ACRDockerBuild\"\n            with:\n              artifact: \"image\"\n              dockerfilePath: \"server/Dockerfile\"\n              dockerRegistry: \"\u003cyour-docker-registry—url\u003e\"\n              dockerTag: ${DATETIME}\n              region: \"cn-hangzhou\"\n              serviceConnection: \"\u003cyour-service-connection-id\u003e\"\n  deploy:\n    name: \"部署\"\n    jobs:\n      deploy:\n        name: \"Deploy\"\n        runsOn: public/cn-hongkong\n        steps:\n          deploy:\n            name: \"Deploy\"\n            step: \"KubectlApply\"\n            with:\n              skipTlsVerify: false\n              kubernetesCluster: \"\u003cyour-kubernetes-id\u003e\"\n              useReplace: false\n              namespace: \"dev\"\n              kubectlVersion: \"1.22.9\"\n              yamlPath: \"deploy\"\n              skipVariableVerify: false\n              variables:\n                - key: IMAGE\n                  value: $[stages.build.build.publish_image.artifacts.image]\n                - key: REPLICAS\n                  value: 2\n                - key: SERVICE_NAME\n                  value: \"\u003cservice-name\u003e\"\n```\n\n## 设计文档\n\n### 用例图\n\n\u003cp align=\"center\" style=\"text-align:center\"\u003e\n  \u003cimg src=\"./document/assets/UseCase.svg\" alt=\"Wow-UseCase\"/\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahoo-wang%2Fwow-project-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahoo-wang%2Fwow-project-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahoo-wang%2Fwow-project-template/lists"}