# g3soft-erp G3Soft ERP 前后端同仓。业务域:海运 / 空运 / 箱管 / 财务 / CRM。 > **当前状态:前端骨架已搭好并可运行;后端尚未开始。** > 元数据驱动引擎(通用查询 / 保存 / 权限)**未开始设计**,属后续独立立项。 ## 目录结构 ``` g3soft-erp/ ├── pnpm-workspace.yaml # 仓库唯一配置文件:overrides + allowBuilds ├── web/ # 前端应用(前端唯一的 package.json 在这里) │ ├── package.json │ ├── vite.config.ts │ ├── vitest.config.ts │ ├── tsconfig.json │ ├── .oxlintrc.json │ ├── .oxfmtrc.json │ └── src/ ├── server/ # 后端占位(Maven + Spring Boot,未开始) ├── docs/ # 设计文档 └── README.md ``` **根目录刻意不放 `package.json`** —— 前端可交付物只有 `web/` 一个包,那个 `package.json` 就是 `web/package.json`。根目录只有 `pnpm-workspace.yaml` 一个配置文件。 ## 环境要求 - Node.js >= 20.19 - pnpm 11 - **`g3soft-libs` 需与 `g3soft-erp` 平级**(同在 `D:\workspace\code\` 下),因为 `overrides` 用相对路径 link 组件库 ## 快速开始 ```bash # 1) 先构建组件库(@g3soft/ui 的 exports 指向 dist,必须先有产物) cd ../g3soft-libs && pnpm --filter @g3soft/tokens build && pnpm --filter @g3soft/ui build # 2) 回到本项目 cd ../g3soft-erp/web pnpm install pnpm dev # http://localhost:5090 ``` > **命令都在 `web/` 下跑**,根目录没有 `package.json`,所以根目录敲不了 `pnpm dev`。 ## 脚本(在 `web/` 下执行) | 命令 | 说明 | |---|---| | `pnpm dev` | 开发服务器(端口 5090,`/api` 代理到 8088) | | `pnpm build` | 类型检查 + 生产构建 | | `pnpm typecheck` | 仅 `vue-tsc --noEmit` | | `pnpm test` | Vitest | | `pnpm lint` / `pnpm fmt` | oxlint / oxfmt | | `pnpm check` | lint + fmt:check + build(提交前跑这个) | ## `@g3soft/ui` 接入方式 组件库的 `exports` 指向 `dist/`,所以**改完组件库必须重新 build**。 开发期通过 `pnpm-workspace.yaml` 的 `overrides` 指向本地包: ```yaml overrides: '@g3soft/tokens': link:../g3soft-libs/packages/tokens '@g3soft/ui': link:../g3soft-libs/packages/ui ``` **三个注意点**: 1. **`overrides` 只在 workspace 根生效**,写在 `web/package.json` 里无效。 2. **`vite.config.ts` 必须保留 `dedupe: ['vue', ...]`**。link 进来的包会带自己的 Vue 副本,不去重会导致组件内响应式失效(组件内部 ref 变化不触发外部渲染)——link 方案最经典的坑。 3. **CI / 其他机器**:相对路径依赖目录层级。私库就绪后应把开发期 `link:` 换成私库版本号。 ### 想要组件库热更新? `link:` 指向**已构建的 `dist/`**,改源码不会即时生效。若要像 `g3soft-libs/docs` 那样直连源码,在 `vite.config.ts` 里加 alias: ```ts resolve: { alias: { '@g3soft/ui': fileURLToPath(new URL('../../g3soft-libs/packages/ui/src/index.ts', import.meta.url)), }, } ``` ## 环境变量 | 变量 | 默认值 | 说明 | |---|---|---| | `VITE_PROXY_TARGET` | `http://127.0.0.1:8088` | 开发环境 `/api` 代理目标 | | `VITE_API_BASE` | `/api` | 接口基础路径 | | `VITE_APP_TITLE` | `G3Soft ERP` | 应用标题 | ## 将来加 H5 端 **`@g3soft/ui` 只给 web 用,H5 不用。** 所以两端是基本独立的应用,只是碰巧同仓,**不需要抽任何共享层**。 加 H5 时的步骤: 1. 建 `h5/` 目录(与 `web/` 平级),它有自己的 `package.json` 2. `pnpm-workspace.yaml` 的 `packages` 改为 `['web', 'h5']` 3. 若 H5 也要用某个 g3soft 包,在 `overrides` 里加一条;不用就不用加 4. 各端独立构建、独立部署 ## 仓库纪律(重要) 前后端同仓,但**必须各自独立**: 1. **独立构建** —— 前端 `pnpm build` 不管后端,后端 `mvn package` 不管前端,**任何一方都不触发另一方构建**(不要引入 `frontend-maven-plugin` 这类东西)。 2. **独立版本** —— tag 分开打(`web-v1.2.0` / `api-v1.2.0`)。 3. **唯一契约是 HTTP 接口** —— 前端不读后端源码,后端不管前端怎么调;契约写进 `docs/`。 破坏这三条,同仓的好处立刻变成耦合的代价。 ## 相关仓库 - **`g3soft-libs`** —— `@g3soft/ui`(组件库)、`@g3soft/tokens`(设计变量)。web 端 UI 一律用组件库,不另起一套。