Files
workspace/code/g3soft-erp/README.md
T
2026-10-09 22:05:02 +08:00

121 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 一律用组件库,不另起一套。