<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>开发指引 on Macula</title><link>https://macula.dev/docs/latest/04_devmanual/</link><description>Recent content in 开发指引 on Macula</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://macula.dev/docs/latest/04_devmanual/index.xml" rel="self" type="application/rss+xml"/><item><title>开发环境准备</title><link>https://macula.dev/docs/latest/04_devmanual/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87/</guid><description>&lt;h2 id="工具与平台"&gt;工具与平台&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Java 17、Maven&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译后端，版本与 Macula Boot Parent 保持一致&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Node.js 22、npm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;当前 Samples Admin 的 Dockerfile 使用 Node 22；按 package-lock.json 安装依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Docker Compose v2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启动本地中间件或完整应用容器&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Macula Cloud&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;已运行的 Gateway、IAM、System，提供登录、菜单、用户与权限能力&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Samples 不重复部署认证中心和系统管理。开始前，在 Macula Cloud 中登记 &lt;code&gt;macula-samples-admin-bff&lt;/code&gt; 应用及管理端使用的 OAuth Client。&lt;/p&gt;&#10;&lt;h2 id="获取源码"&gt;获取源码&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/macula-projects/macula-samples.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;cd&lt;/span&gt; macula-samples&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;单个仓库包含后端模块、Admin 前端和部署目录。将根 &lt;code&gt;pom.xml&lt;/code&gt; 导入 IDE，即可加载全部后端 Maven 模块；Admin 在自己的目录安装前端依赖。&lt;/p&gt;&#10;&lt;p&gt;也支持多仓模式，各模块可在独立仓库中维护，通过工作区统一组织，参考 &lt;a href="https://cnb.cool/macula-projects/macula-samples-workspace"&gt;macula-samples-workspace&lt;/a&gt;。本章后续步骤以单仓项目为准。&lt;/p&gt;&#10;&lt;h2 id="本地连接准备"&gt;本地连接准备&lt;/h2&gt;&#10;&lt;p&gt;Samples 的默认宿主机端口与 Macula Cloud 分开：MySQL &lt;code&gt;23306&lt;/code&gt;、Redis &lt;code&gt;26379&lt;/code&gt;、Nacos &lt;code&gt;28848&lt;/code&gt;、Samples Gateway &lt;code&gt;6000&lt;/code&gt;、Samples Admin &lt;code&gt;5800&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;在 &lt;code&gt;deploy/.env&lt;/code&gt; 中维护 Compose / Vite 使用的本地环境值。IDE 启动 Java 服务时使用 &lt;code&gt;local&lt;/code&gt; profile，需覆盖的值在 IDE 环境变量中显式设置，Java 不会自动读取该 &lt;code&gt;.env&lt;/code&gt; 文件。&lt;/p&gt;</description></item><item><title>获取与组织 Samples 项目</title><link>https://macula.dev/docs/latest/04_devmanual/%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8%E5%B9%B3%E5%8F%B0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8%E5%B9%B3%E5%8F%B0/</guid><description>&lt;h2 id="单仓项目结构"&gt;单仓项目结构&lt;/h2&gt;&#10;&lt;p&gt;Macula Samples 将后端、前端和部署配置放在同一 Git 仓库中。根 &lt;code&gt;pom.xml&lt;/code&gt; 聚合八个后端模块，&lt;code&gt;deploy/&lt;/code&gt; 统一维护本地编排；Admin 前端在自身目录构建，不属于 Maven 聚合模块。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;macula-samples/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── pom.xml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── deploy/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-parent/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-api/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-gateway/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-admin-bff/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-service1/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-basic/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-openapi/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── macula-samples-thirdparty/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── macula-samples-admin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="应用内的依赖关系"&gt;应用内的依赖关系&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Parent 统一后端依赖、插件与环境 profile，运行模块继承该 Parent。&lt;/li&gt;&#10;&lt;li&gt;API 聚合 Basic API 和 Service1 API，放置可被其他服务引用的接口契约。&lt;/li&gt;&#10;&lt;li&gt;BFF 依赖 Service1 API，通过 Feign 调用 Service1；业务实现留在 Service1 中。&lt;/li&gt;&#10;&lt;li&gt;Gateway 路由到 BFF / OpenAPI，Admin 通过同源 &lt;code&gt;/api&lt;/code&gt; 访问 Gateway。&lt;/li&gt;&#10;&lt;li&gt;Basic、Thirdparty 与 OpenAPI 是不同职责的运行模块，按实际业务扩展。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;完整说明见&lt;a href="https://macula.dev/docs/latest/04_devmanual/%E6%A8%A1%E5%9D%97%E8%AF%B4%E6%98%8E/"&gt;模块说明&lt;/a&gt;。API 与 Parent 不作为独立的 Spring Boot 服务启动。&lt;/p&gt;</description></item><item><title>Samples 模块说明</title><link>https://macula.dev/docs/latest/04_devmanual/%E6%A8%A1%E5%9D%97%E8%AF%B4%E6%98%8E/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E6%A8%A1%E5%9D%97%E8%AF%B4%E6%98%8E/</guid><description>&lt;h2 id="模块总览"&gt;模块总览&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模块&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;默认本地端口&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Parent&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后端依赖、插件、构建 profile&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;API&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Basic / Service1 的服务间契约&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Gateway&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;路由、IAM Token 验证、内部 JWT 转换&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6000&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Admin BFF&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;管理端接口聚合与 Macula Cloud 接入&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6001&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OpenAPI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;面向外部调用方的接口聚合边界&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6002&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Service1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;业务实现、数据访问与数据库迁移&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6003&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Basic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可独立部署的公共服务边界&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6004&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Thirdparty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对第三方协议和模型的封装边界&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;6005&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Admin&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vue 管理端&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;5800&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;端口用于 IDE 本地运行。完整容器模式只对宿主机发布 Gateway 和 Admin，其余后端通过容器网络访问。&lt;/p&gt;&#10;&lt;h2 id="parent统一构建"&gt;Parent：统一构建&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;macula-samples-parent/pom.xml&lt;/code&gt; 维护后端公共依赖、插件及 &lt;code&gt;local/dev/stg/pet/prd&lt;/code&gt; profile，使用 &lt;code&gt;profile.active&lt;/code&gt; 将构建环境传给资源配置。模块内按需声明 Starter，公共版本由 Parent / Macula Boot 管理。&lt;/p&gt;&#10;&lt;p&gt;Parent 是构建模块，没有 application.yml，也不启动 Web 服务。前端依赖由 Admin 的 package.json 与锁文件管理。&lt;/p&gt;</description></item><item><title>application.yml 配置规范</title><link>https://macula.dev/docs/latest/04_devmanual/%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE/</guid><description>&lt;h2 id="配置入口与职责"&gt;配置入口与职责&lt;/h2&gt;&#10;&lt;p&gt;Samples 的后端统一使用 &lt;code&gt;src/main/resources/application.yml&lt;/code&gt;，按 YAML 多文档和 profile 分层。公共约定放在公共段，本地连接值放在 &lt;code&gt;local&lt;/code&gt;，容器网络差异放在 &lt;code&gt;docker&lt;/code&gt;；&lt;code&gt;dev/stg/pet/prd&lt;/code&gt; 保留配置中心连接信息，业务配置由 Nacos 提供。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;配置范围&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;放置内容&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;公共段&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应用名、端口占位、profile group、配置导入、路由 / 组件结构&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;local&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IDE 可用的本机地址、开发端口和本地开关&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;docker&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;容器 DNS、容器端口以及与 local 不同的值&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dev / stg / pet / prd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对应环境的 Nacos 连接；其余环境值通过 Data ID 管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;共享的模块版本由 Parent 管理，application.yml 只承载运行配置。地址和凭据使用环境变量 / 配置中心提供的值。&lt;/p&gt;&#10;&lt;h2 id="公共段与配置导入"&gt;公共段与配置导入&lt;/h2&gt;&#10;&lt;p&gt;以下是以 Service1 为例的配置骨架；完整字段以相应模块源码为准：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;server&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;port&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${SERVER_PORT:6003}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;spring&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;application&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;name&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;macula-samples-service1&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;profiles&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;active&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#39;@profile.active@&amp;#39;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;group&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;docker&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;local&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;config&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;- &lt;span style="color:#000"&gt;optional:nacos:${spring.application.name}.yml?refreshEnabled=true&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;- &lt;span style="color:#000"&gt;optional:nacos:${spring.application.name}-${spring.profiles.active}.yml?refreshEnabled=true&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;cloud&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;nacos&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;server-addr&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${spring.config.nacos.server-addr}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;namespace&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${spring.config.nacos.namespace}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;username&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${spring.config.nacos.username}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;password&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${spring.config.nacos.password}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;discovery&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;namespace&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;${spring.cloud.nacos.namespace}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;@profile.active@&lt;/code&gt; 由 Maven profile 在构建时替换；&lt;code&gt;local/dev/stg/pet/prd&lt;/code&gt; 定义在 Samples Parent。运行时可通过 &lt;code&gt;SPRING_PROFILES_ACTIVE&lt;/code&gt; 选择环境，完整容器使用 &lt;code&gt;docker&lt;/code&gt;，并通过 profile group 叠加 &lt;code&gt;local&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>部署Macula平台</title><link>https://macula.dev/docs/latest/04_devmanual/%E9%83%A8%E7%BD%B2macula%E5%B9%B3%E5%8F%B0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E9%83%A8%E7%BD%B2macula%E5%B9%B3%E5%8F%B0/</guid><description>&lt;h2 id="代码与运行方式"&gt;代码与运行方式&lt;/h2&gt;&#10;&lt;p&gt;Macula Cloud 后端和管理端共用一个仓库，管理端位于 &lt;code&gt;macula-cloud-admin/&lt;/code&gt;。本页根据当前仓库的本地部署说明整理；完整配置、端口与排错步骤见&lt;a href="https://github.com/macula-projects/macula-cloud/blob/7d5404146483d7ccbce5e95411fe9c1e5de361a6/deploy/README.md"&gt;部署 README&lt;/a&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/macula-projects/macula-cloud.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;cd&lt;/span&gt; macula-cloud&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp deploy/.env.example deploy/.env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按本机环境修改 &lt;code&gt;deploy/.env&lt;/code&gt;。开发编排用于本地开发与集成验证；共享或生产环境需要另行配置凭据、证书、备份和高可用。&lt;/p&gt;&#10;&lt;h2 id="方式一ide-调试"&gt;方式一：IDE 调试&lt;/h2&gt;&#10;&lt;p&gt;先启动中间件和初始化任务：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后端需要 Java 17 与 Maven。按部署 README 完成数据库迁移和 IDE 启动配置，再启动 IAM、Gateway、System 等所需服务。&lt;/p&gt;&#10;&lt;p&gt;管理端使用推荐的 Node.js 24 LTS，在同一仓库内运行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;cd&lt;/span&gt; macula-cloud-admin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm ci&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方式二完整容器"&gt;方式二：完整容器&lt;/h2&gt;&#10;&lt;p&gt;使用 Docker Compose v2，并在 &lt;code&gt;deploy/.env&lt;/code&gt; 中提供当前部署说明要求的配置，再启用 &lt;code&gt;apps&lt;/code&gt; profile：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh config-apps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh up-apps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该模式包含后端应用与 Admin。默认管理端地址为 &lt;code&gt;http://127.0.0.1:5900/&lt;/code&gt;，可通过环境配置调整端口。&lt;/p&gt;&#10;&lt;h2 id="配置与更新"&gt;配置与更新&lt;/h2&gt;&#10;&lt;p&gt;后端使用 &lt;code&gt;application.yml&lt;/code&gt; 和环境 profile；共享环境的配置按当前 Data ID 规则放入 Nacos。数据库使用 Flyway 管理，启动顺序、服务地址和持久化卷处理以部署 README 为准。&lt;/p&gt;</description></item><item><title>以 Service1 开发业务服务</title><link>https://macula.dev/docs/latest/04_devmanual/%E5%88%9B%E5%BB%BA%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E5%88%9B%E5%BB%BA%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97/</guid><description>&lt;h2 id="从一个完整调用链开始"&gt;从一个完整调用链开始&lt;/h2&gt;&#10;&lt;p&gt;当前已提交的 Service1 示例提供应用管理接口，可按以下链路阅读：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Admin → Gateway → Admin BFF → ApplicationFeignClient → Service1 → Mapper / 数据库&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;本页以该主线代码说明新增业务的方法；应用接入与环境字段见&lt;a href="https://macula.dev/docs/latest/04_devmanual/%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE/"&gt;配置规范&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="应用分层规范"&gt;应用分层规范&lt;/h2&gt;&#10;&lt;p&gt;Samples 以 &lt;code&gt;Controller → Service → Mapper&lt;/code&gt; 为业务服务的基本调用方向。先明确每层职责，再新增接口和模型；完整规范见&lt;a href="https://macula.dev/docs/latest/03_devrules/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/%E5%BA%94%E7%94%A8%E5%88%86%E5%B1%82/"&gt;后端开发规范 → 应用分层&lt;/a&gt;。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Controller&lt;/strong&gt;：接收 HTTP 请求、校验参数并调用 Service，返回业务对象，由 Web Starter 统一包装响应；不直接操作 Mapper、不吞异常。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt;：实现业务规则、授权与事务边界，需要原子性的写操作在公开业务方法上声明事务。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Mapper&lt;/strong&gt;：执行数据访问，查询时落实用户、租户和数据范围，使用参数绑定。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Converter&lt;/strong&gt;：使用 MapStruct 转换各层模型，避免在 Controller 中堆叠字段复制。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;模型沿用 Query（查询条件）、Form（写入表单）、DTO（传输）、VO（展示结果）、BO（组合业务对象）、Entity（表映射）的语义。Entity 留在持久化边界内，不作为新增 REST / Feign 公共契约。&lt;/p&gt;&#10;&lt;p&gt;BFF 负责页面聚合，Service1 负责核心业务；跨服务只依赖 &lt;code&gt;*-api&lt;/code&gt; 契约，不直接引用其他服务的 Service 实现、Mapper 或 Entity。方法与资源授权的接入见 &lt;a href="https://macula.dev/docs/latest/01_services/%E6%A1%86%E6%9E%B6%E5%9F%BA%E7%A1%80/security/"&gt;Security&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="1-先定义服务间契约"&gt;1. 先定义服务间契约&lt;/h2&gt;&#10;&lt;p&gt;在 &lt;code&gt;macula-samples-api/macula-samples-service1-api&lt;/code&gt; 定义请求表单、查询条件、返回 VO、错误约定和 Feign 接口。现有 &lt;code&gt;ApplicationFeignClient&lt;/code&gt; 声明 &lt;code&gt;/api/v1/app&lt;/code&gt; 的分页、创建、更新、删除与维护人相关操作，服务发现目标为 &lt;code&gt;macula-samples-service1&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Samples 运行与测试</title><link>https://macula.dev/docs/latest/04_devmanual/%E8%BF%90%E8%A1%8C%E4%B8%8E%E6%B5%8B%E8%AF%95/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E8%BF%90%E8%A1%8C%E4%B8%8E%E6%B5%8B%E8%AF%95/</guid><description>&lt;p&gt;本页介绍 macula-samples 单仓项目的运行与测试。以下命令均从仓库根目录开始，前端命令另在 Admin 目录执行。&lt;/p&gt;&#10;&lt;h2 id="启动前准备"&gt;启动前准备&lt;/h2&gt;&#10;&lt;p&gt;确认 Macula Cloud IAM、Gateway、System 已运行，并登记 BFF 应用与管理端 OAuth Client。复制并编辑仓库根目录的 &lt;code&gt;deploy/.env&lt;/code&gt;，然后启动 Samples 本地基础设施：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp deploy/.env.example deploy/.env&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该模式启动 MySQL、Redis、Nacos 和初始化任务，应用在 IDE 中以 &lt;code&gt;local&lt;/code&gt; profile 运行。Java 服务不会自动加载 &lt;code&gt;.env&lt;/code&gt;，需要覆盖的值在 IDE 中设置。&lt;/p&gt;&#10;&lt;h2 id="应用启动顺序"&gt;应用启动顺序&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Service1、Basic、OpenAPI、Thirdparty。&lt;/li&gt;&#10;&lt;li&gt;Admin BFF。&lt;/li&gt;&#10;&lt;li&gt;Samples Gateway。&lt;/li&gt;&#10;&lt;li&gt;Admin 管理端。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Parent 和 API 契约模块不单独启动。Service1 通过 Flyway 管理数据库迁移。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;cd&lt;/span&gt; macula-samples-admin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm ci&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器访问 &lt;code&gt;http://127.0.0.1:5800&lt;/code&gt;。Vite 的 &lt;code&gt;/api&lt;/code&gt; 默认代理到 &lt;code&gt;http://127.0.0.1:6000&lt;/code&gt;，登录请求直接访问外部 IAM。&lt;/p&gt;&#10;&lt;h2 id="后端测试"&gt;后端测试&lt;/h2&gt;&#10;&lt;p&gt;在 macula-samples 仓库根目录执行，并显式选择环境：&lt;/p&gt;</description></item><item><title>Samples 打包与本地部署</title><link>https://macula.dev/docs/latest/04_devmanual/%E6%89%93%E5%8C%85%E9%83%A8%E7%BD%B2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/04_devmanual/%E6%89%93%E5%8C%85%E9%83%A8%E7%BD%B2/</guid><description>&lt;h2 id="两种本地运行方式"&gt;两种本地运行方式&lt;/h2&gt;&#10;&lt;p&gt;Samples 的 &lt;code&gt;deploy/&lt;/code&gt; 支持仅启动基础设施的 IDE 模式，以及使用 &lt;code&gt;apps&lt;/code&gt; profile 启动完整应用的容器模式。Macula Cloud IAM、Gateway 和 System 是外部依赖，不包含在 Samples 编排中。&lt;/p&gt;&#10;&lt;h2 id="检查与启动"&gt;检查与启动&lt;/h2&gt;&#10;&lt;p&gt;在 macula-samples 仓库根目录复制 &lt;code&gt;deploy/.env.example&lt;/code&gt; 为 &lt;code&gt;deploy/.env&lt;/code&gt;，设置 Cloud IAM、Cloud Gateway、Cloud System Redis 与登记的应用 / OAuth 信息。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh config-apps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh up-apps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./deploy/scripts/compose.sh status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完整模式构建并启动各应用，只向宿主机发布 Samples Gateway &lt;code&gt;6000&lt;/code&gt; 与 Admin &lt;code&gt;5800&lt;/code&gt;；BFF、Service1、Basic、OpenAPI、Thirdparty 通过容器网络访问。&lt;/p&gt;&#10;&lt;p&gt;普通停止使用 &lt;code&gt;./deploy/scripts/compose.sh down&lt;/code&gt;，保留持久化数据。具体日志、镜像和卷操作以仓库内的 &lt;code&gt;deploy/README.md&lt;/code&gt; 为准。&lt;/p&gt;&#10;&lt;h2 id="容器与浏览器地址"&gt;容器与浏览器地址&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;后端在容器内使用 Compose 服务名；非网关模块的 JWK 地址为 &lt;code&gt;http://macula-samples-gateway:6000/oauth2/jwks&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;BFF 的 &lt;code&gt;MACULA_CLOUD_GATEWAY_INTERNAL_URL&lt;/code&gt; 是后端访问外部 Cloud 的地址。&lt;/li&gt;&#10;&lt;li&gt;管理端 IAM 地址必须能被浏览器访问；Admin 的业务请求通过同源 &lt;code&gt;/api&lt;/code&gt; 进入 Samples Gateway。&lt;/li&gt;&#10;&lt;li&gt;Admin 的 Docker 运行配置由启动时的 &lt;code&gt;config.js&lt;/code&gt; 提供，开发模式由 Vite 环境配置提供。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="构建与环境"&gt;构建与环境&lt;/h2&gt;&#10;&lt;p&gt;Samples Parent 定义 &lt;code&gt;local/dev/stg/pet/prd&lt;/code&gt; Maven profile。模块构建时选择目标环境，运行时再按部署方式指定对应 Spring profile；配置规范见&lt;a href="https://macula.dev/docs/latest/04_devmanual/%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE/"&gt;application.yml 配置规范&lt;/a&gt;。&lt;/p&gt;</description></item></channel></rss>