@gadmin2n/schematics 0.0.153 → 0.0.154
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/application/files/gadmin2-game-angle-demo/.git-blame-ignore-revs +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/.nvmrc +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/CODEBUDDY.md +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.codegen +16 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.server +21 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.web +11 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/PRODUCT.md +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/compose-ctl.sh +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.yml +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +22 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.oxfmtrc.json +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.oxlintrc.json +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +14 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/pnpm-workspace.yaml +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +4 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +6 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +6 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/permTransfer/page-transfer.service.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.service.spec.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +11 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.oxfmtrc.json +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.oxlintrc.json +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/README.MD +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/nginx.conf +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +17 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/pnpm-workspace.yaml +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.jsx +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +36 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +24 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +53 -41
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +8 -2
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +0 -28
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +0 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierrc +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +0 -38
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +0 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierrc +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
22
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
## 常用命令
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
cd server &&
|
|
11
|
-
cd web &&
|
|
12
|
-
cd server &&
|
|
10
|
+
cd server && pnpm start:dev # 后端,端口 8000(优先读 server/.env.local)
|
|
11
|
+
cd web && pnpm dev # 前端,端口 3000(优先读 web/.env.local)
|
|
12
|
+
cd server && pnpm seed # 执行 seed(页面/资源/权限声明)
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## 架构概览
|
|
@@ -69,7 +69,7 @@ server/src/
|
|
|
69
69
|
- 只改 ui 配置文件 → 执行 `gadmin2 g prisma`
|
|
70
70
|
- 修改 `config/prisma/` 后必须同步检查 `server/seed/`:
|
|
71
71
|
- raw SQL 引用的列/表、seed 数据的必填字段与字段名要与新 schema 一致
|
|
72
|
-
- 改完需要提醒开发者 `
|
|
72
|
+
- 改完需要提醒开发者 `pnpm seed` 验证
|
|
73
73
|
- **优先使用 skill 解决问题**,具体走哪条路径见下方「项目改动路径决策」
|
|
74
74
|
|
|
75
75
|
### 代码修改范围
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
# 本镜像不会被推送到 registry,仅在 Jenkins agent 本地 docker daemon 中存活,
|
|
9
9
|
# 流水线末尾会清理。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# pin 到 22:pnpm 11 要求 node >= 22.13(见 server/package.json engines)
|
|
12
|
+
FROM node:22-alpine
|
|
12
13
|
|
|
13
14
|
WORKDIR /app
|
|
14
15
|
|
|
@@ -18,18 +19,24 @@ RUN apk add --no-cache openssl
|
|
|
18
19
|
# 禁止 husky 在无 .git 环境下报错
|
|
19
20
|
ENV HUSKY=0
|
|
20
21
|
|
|
21
|
-
#
|
|
22
|
-
|
|
22
|
+
# 腾讯软件源:npm_config_registry 对 npm 与 pnpm 均生效(server/.npmrc 亦含 registry,
|
|
23
|
+
# 但全局安装 gadmin2 CLI 发生在 COPY .npmrc 之前,需要环境变量兜底)
|
|
24
|
+
ENV npm_config_registry=https://mirrors.cloud.tencent.com/npm/
|
|
23
25
|
|
|
24
|
-
#
|
|
25
|
-
RUN
|
|
26
|
+
# 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
|
|
27
|
+
RUN corepack enable && corepack install --global pnpm@11.23.0
|
|
28
|
+
|
|
29
|
+
# 安装 gadmin2 CLI(全局工具,用镜像自带 npm 即可,避免配置 pnpm global bin 路径)
|
|
30
|
+
RUN npm i -g @gadmin2n/cli@latest
|
|
26
31
|
|
|
27
32
|
# 先复制 server 依赖描述文件,源码未变时此层 layer cache 可复用
|
|
28
|
-
# (prisma generators 是 server 的 devDependencies,必须先
|
|
29
|
-
COPY server/package.json server/
|
|
33
|
+
# (prisma generators 是 server 的 devDependencies,必须先 pnpm install)
|
|
34
|
+
COPY server/package.json server/pnpm-lock.yaml server/pnpm-workspace.yaml server/.npmrc ./server/
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
# 显式指定 store 路径:默认路径随 HOME 变化,写死才能让下方 cache mount 生效
|
|
37
|
+
ENV PNPM_STORE_DIR=/pnpm/store
|
|
38
|
+
RUN --mount=type=cache,target=/pnpm/store \
|
|
39
|
+
cd server && pnpm install --frozen-lockfile
|
|
33
40
|
|
|
34
41
|
# 复制全部 codegen 输入:上层 config/、server/(含 schema.prisma 与 gadmin-cli.json)、web/
|
|
35
42
|
COPY config/ ./config/
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
#
|
|
3
3
|
# 通过 ARG CODEGEN_IMAGE + FROM ${CODEGEN_IMAGE} 引用 Jenkins 流水线先行构建的 codegen 镜像。
|
|
4
4
|
# 直接 COPY --from=gen /app/server,复用 codegen 已经装好的 server/node_modules
|
|
5
|
-
# (含 prisma client 与 gadmin2 generators),避免重复
|
|
5
|
+
# (含 prisma client 与 gadmin2 generators),避免重复 pnpm install。
|
|
6
6
|
|
|
7
7
|
ARG CODEGEN_IMAGE
|
|
8
8
|
FROM ${CODEGEN_IMAGE} AS gen
|
|
9
9
|
|
|
10
10
|
# ─── 阶段 1:构建 ────────────────────────────────────────────
|
|
11
|
-
|
|
11
|
+
# pin 到 22:pnpm 11 要求 node >= 22.13(见 server/package.json engines)
|
|
12
|
+
FROM node:22-alpine AS builder
|
|
12
13
|
|
|
13
14
|
WORKDIR /app
|
|
14
15
|
|
|
@@ -18,14 +19,17 @@ RUN apk add --no-cache openssl
|
|
|
18
19
|
# 禁止 husky 在无 .git 环境下报错
|
|
19
20
|
ENV HUSKY=0
|
|
20
21
|
|
|
22
|
+
# 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
|
|
23
|
+
RUN corepack enable && corepack install --global pnpm@11.23.0
|
|
24
|
+
|
|
21
25
|
# 从 codegen 镜像取完整 server/(含已生成代码 + 已安装的 node_modules)
|
|
22
26
|
COPY --from=gen /app/server ./server
|
|
23
27
|
|
|
24
28
|
# 编译
|
|
25
|
-
RUN cd server &&
|
|
29
|
+
RUN cd server && pnpm build
|
|
26
30
|
|
|
27
31
|
# ─── 阶段 2:运行 ────────────────────────────────────────────
|
|
28
|
-
FROM node:
|
|
32
|
+
FROM node:22-alpine AS runner
|
|
29
33
|
|
|
30
34
|
# Prisma 运行时需要 openssl;中国项目默认时区上海
|
|
31
35
|
RUN apk add --no-cache openssl tzdata && \
|
|
@@ -41,17 +45,21 @@ STOPSIGNAL SIGQUIT
|
|
|
41
45
|
ENV HUSKY=0 \
|
|
42
46
|
NODE_ENV=production
|
|
43
47
|
|
|
48
|
+
# 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
|
|
49
|
+
RUN corepack enable && corepack install --global pnpm@11.23.0
|
|
50
|
+
|
|
44
51
|
# 从 builder 复制依赖描述文件(其源头是 codegen 镜像)
|
|
45
|
-
COPY --from=builder --chown=node:node /app/server/package.json /app/server/
|
|
52
|
+
COPY --from=builder --chown=node:node /app/server/package.json /app/server/pnpm-lock.yaml /app/server/pnpm-workspace.yaml /app/server/.npmrc ./
|
|
46
53
|
|
|
47
|
-
# 注意:这里不能用 `
|
|
54
|
+
# 注意:这里不能用 `pnpm install --prod`。
|
|
48
55
|
# start-prod.sh 启动时需要:
|
|
49
|
-
# - prisma CLI(运行 `
|
|
50
|
-
# - ts-node + dotenv-cli(运行 `
|
|
51
|
-
# 这三者在 package.json 中位于 devDependencies,--
|
|
56
|
+
# - prisma CLI(运行 `pnpm migrate:deploy`)
|
|
57
|
+
# - ts-node + dotenv-cli(运行 `pnpm seed`)
|
|
58
|
+
# 这三者在 package.json 中位于 devDependencies,--prod 会跳过它们。
|
|
52
59
|
# 故安装全量依赖;产物体积增加约 80MB,换来启动脚本统一可用。
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
ENV PNPM_STORE_DIR=/pnpm/store
|
|
61
|
+
RUN --mount=type=cache,target=/pnpm/store \
|
|
62
|
+
pnpm install --frozen-lockfile
|
|
55
63
|
|
|
56
64
|
# 从构建阶段复制 Prisma 生成的 Client(含平台原生二进制)
|
|
57
65
|
COPY --from=builder --chown=node:node /app/server/node_modules/.prisma ./node_modules/.prisma
|
|
@@ -62,7 +70,7 @@ COPY --from=builder --chown=node:node /app/server/dist ./dist
|
|
|
62
70
|
# 复制 Prisma schema(feature 分支部署时 prisma db push 需要)
|
|
63
71
|
COPY --from=builder --chown=node:node /app/server/prisma ./prisma
|
|
64
72
|
|
|
65
|
-
# 复制 seed 源码与其依赖的 scripts/lib(启动时 `
|
|
73
|
+
# 复制 seed 源码与其依赖的 scripts/lib(启动时 `pnpm seed` 走 ts-node 直接执行 .ts)
|
|
66
74
|
COPY --from=builder --chown=node:node /app/server/seed ./seed
|
|
67
75
|
COPY --from=builder --chown=node:node /app/server/scripts ./scripts
|
|
68
76
|
COPY --from=builder --chown=node:node /app/server/tsconfig.json ./tsconfig.json
|
|
@@ -87,4 +95,4 @@ EXPOSE 8000
|
|
|
87
95
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
|
88
96
|
CMD wget -qO- http://127.0.0.1:8000/health/live || exit 1
|
|
89
97
|
|
|
90
|
-
CMD ["
|
|
98
|
+
CMD ["pnpm", "start:prod"]
|
|
@@ -11,25 +11,26 @@ ARG CODEGEN_IMAGE
|
|
|
11
11
|
FROM ${CODEGEN_IMAGE} AS gen
|
|
12
12
|
|
|
13
13
|
# ─── 阶段 1:构建 ────────────────────────────────────────────
|
|
14
|
-
|
|
14
|
+
# pin 到 22:pnpm 11 要求 node >= 22.13(见 web/package.json engines)
|
|
15
|
+
FROM node:22-alpine AS builder
|
|
15
16
|
|
|
16
17
|
WORKDIR /app
|
|
17
18
|
|
|
18
19
|
# 禁止 husky 在无 .git 环境下报错
|
|
19
20
|
ENV HUSKY=0
|
|
20
21
|
|
|
21
|
-
#
|
|
22
|
-
RUN
|
|
22
|
+
# 启用 corepack 并激活 web/package.json packageManager 字段指定的 pnpm 版本
|
|
23
|
+
RUN corepack enable && corepack install --global pnpm@11.23.0
|
|
23
24
|
|
|
24
|
-
#
|
|
25
|
-
|
|
25
|
+
# 显式指定 store 路径:默认路径随 HOME 变化,写死才能让下方 cache mount 生效
|
|
26
|
+
ENV PNPM_STORE_DIR=/pnpm/store
|
|
26
27
|
|
|
27
|
-
#
|
|
28
|
-
|
|
28
|
+
# 从 codegen 镜像取完整 web/(含生成代码、不含 node_modules;registry 由 web/.npmrc 提供)
|
|
29
|
+
COPY --from=gen /app/web ./web
|
|
29
30
|
|
|
30
31
|
# 安装依赖
|
|
31
|
-
RUN --mount=type=cache,target=/
|
|
32
|
-
cd web &&
|
|
32
|
+
RUN --mount=type=cache,target=/pnpm/store \
|
|
33
|
+
cd web && pnpm install --frozen-lockfile
|
|
33
34
|
|
|
34
35
|
# 声明构建参数
|
|
35
36
|
ARG NODE_ENV=production
|
|
@@ -38,8 +39,7 @@ ARG DEPLOY_NAME
|
|
|
38
39
|
ENV VITE_DEPLOY_NAME=${DEPLOY_NAME}
|
|
39
40
|
|
|
40
41
|
# 编译
|
|
41
|
-
RUN --
|
|
42
|
-
cd web && yarn build --mode ${NODE_ENV}
|
|
42
|
+
RUN cd web && pnpm build --mode ${NODE_ENV}
|
|
43
43
|
|
|
44
44
|
# ─── 阶段 2:运行 ────────────────────────────────────────────
|
|
45
45
|
FROM nginx:alpine
|
|
@@ -88,7 +88,7 @@ pipeline {
|
|
|
88
88
|
// 路径触发规则:
|
|
89
89
|
// web/** → web
|
|
90
90
|
// config/ui/** → web(前端 CRUD 代码由 config/ui 生成)
|
|
91
|
-
// config/prisma/** → server + web(后端模型由 prisma 生成;前端 enums 通过
|
|
91
|
+
// config/prisma/** → server + web(后端模型由 prisma 生成;前端 enums 通过 pnpm sync:code 与后端同步)
|
|
92
92
|
// server/** → server
|
|
93
93
|
buildWeb = matches(nonDoc, 'web/') || matches(nonDoc, 'config/ui/') || matches(nonDoc, 'config/prisma/')
|
|
94
94
|
buildServer = matches(nonDoc, 'server/') || matches(nonDoc, 'config/prisma/')
|
|
@@ -61,7 +61,7 @@ gadmin2 是一个低代码生成工具:给它一份 Prisma schema + 一份 UI
|
|
|
61
61
|
1. **数据优先于装饰** — 任何屏幕,先问「数据看清楚了吗」,再问「漂亮吗」。删掉一个分隔线、一个图标、一段说明文字而页面没有变难用,就该删。
|
|
62
62
|
2. **冷静的信息密度** — 同屏可以塞很多东西,但不能让人焦虑。靠间距节奏、字重对比和层级排布承载密度,不靠颜色或边框。Cards 是惰性答案,能用一条横分隔线解决就别套卡片。
|
|
63
63
|
3. **靠清晰建立信任** — 标签、错误信息、空状态、操作确认都用直白可执行的句子。不写「Oops!」「出了点小问题」之类粉饰;写「保存失败:第 3 行的 `email` 格式不合法」。
|
|
64
|
-
4. **配置即设计** — 因为页面由 prisma + ui 配置生成,所有视觉规范必须沉淀到 token、组件和默认值里,让一个新模型 `
|
|
64
|
+
4. **配置即设计** — 因为页面由 prisma + ui 配置生成,所有视觉规范必须沉淀到 token、组件和默认值里,让一个新模型 `pnpm generate` 出来就已经是合格的页面,工程师不需要写任何 CSS。
|
|
65
65
|
5. **保留专家流速** — 内部用户每天要重复几百次同样的操作。键盘快捷键、批量选择、复制 ID、可分享链接的过滤状态、自动聚焦的输入框,都比「视觉打磨」优先级更高。任何「为新人友好」的改动都不能减慢老用户。
|
|
66
66
|
|
|
67
67
|
## Accessibility & Inclusion
|
|
@@ -189,7 +189,7 @@ print_post_up_guide() {
|
|
|
189
189
|
清空数据回到种子状态 ./compose-ctl.sh --reset
|
|
190
190
|
|
|
191
191
|
提示:
|
|
192
|
-
· 前端开发请用 cd web &&
|
|
192
|
+
· 前端开发请用 cd web && pnpm dev (本 compose 的 web 是 nginx 静态镜像,无热更新)
|
|
193
193
|
· server-init 是一次性容器,跑完 migrate:deploy + seed 后退出 (Exited 0) 是正常的
|
|
194
194
|
EOF
|
|
195
195
|
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
# 首次使用先跑 `bash dev/register-tenant.sh` 注册本项目为租户。
|
|
37
37
|
#
|
|
38
38
|
# 提示:
|
|
39
|
-
# - web 是生产 nginx 镜像,不支持热更新;前端开发请直接 `cd web &&
|
|
39
|
+
# - web 是生产 nginx 镜像,不支持热更新;前端开发请直接 `cd web && pnpm dev`
|
|
40
40
|
# =============================================================================
|
|
41
41
|
|
|
42
42
|
services:
|
|
@@ -116,9 +116,9 @@ services:
|
|
|
116
116
|
- |
|
|
117
117
|
set -e
|
|
118
118
|
echo "[server-init] migrate deploy ..."
|
|
119
|
-
|
|
119
|
+
pnpm migrate:deploy
|
|
120
120
|
echo "[server-init] seed ..."
|
|
121
|
-
|
|
121
|
+
pnpm seed
|
|
122
122
|
echo "[server-init] done."
|
|
123
123
|
|
|
124
124
|
# ---------------------------------------------------------------------------
|
|
@@ -153,7 +153,7 @@ services:
|
|
|
153
153
|
# ---------------------------------------------------------------------------
|
|
154
154
|
# Web 前端(生产 nginx 镜像;本地仅用于完整集成验证)
|
|
155
155
|
# 镜像构建依赖 codegen:先 `docker compose --profile codegen build codegen`
|
|
156
|
-
# 开发态请用 `cd web &&
|
|
156
|
+
# 开发态请用 `cd web && pnpm dev`,热更新更顺手
|
|
157
157
|
# ---------------------------------------------------------------------------
|
|
158
158
|
web:
|
|
159
159
|
image: ${COMPOSE_PROJECT_NAME}-web:local
|
|
@@ -6,7 +6,7 @@ The gadmin2 CLI is a command-line interface tool that helps you to initialize, d
|
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
```
|
|
9
|
-
$
|
|
9
|
+
$ npm i -g @gadmin2n/cli@latest
|
|
10
10
|
```
|
|
11
11
|
Check CLI version
|
|
12
12
|
```
|
|
@@ -33,15 +33,15 @@ $ gadmin2 g prisma:dev # 生成 CRUD 代码 + 创建并应用迁移(内部调
|
|
|
33
33
|
### Start web DevServer
|
|
34
34
|
```
|
|
35
35
|
$ cd web
|
|
36
|
-
$
|
|
37
|
-
$
|
|
36
|
+
$ pnpm install #run once if dependancies installed failed
|
|
37
|
+
$ pnpm dev
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
### Start server(nestjs) DevServer
|
|
41
41
|
```
|
|
42
42
|
$ cd server
|
|
43
|
-
$
|
|
44
|
-
$
|
|
43
|
+
$ pnpm install #run once if dependancies installed failed
|
|
44
|
+
$ pnpm start:dev
|
|
45
45
|
```
|
|
46
46
|
About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/schematics/git/tree/master/src/lib/application/files/server/nest/README.md)
|
|
47
47
|
|
|
@@ -68,9 +68,9 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
|
|
|
68
68
|
| 环境 | 允许的迁移命令 |
|
|
69
69
|
|------|------|
|
|
70
70
|
| 本地开发(各自本地库) | `gadmin2 g prisma:dev` |
|
|
71
|
-
| 共享测试 / 生产库 | 仅 `
|
|
71
|
+
| 共享测试 / 生产库 | 仅 `pnpm migrate:deploy` |
|
|
72
72
|
|
|
73
|
-
### 命令详解:`gadmin2 g prisma:dev` vs `
|
|
73
|
+
### 命令详解:`gadmin2 g prisma:dev` vs `pnpm migrate:deploy`
|
|
74
74
|
|
|
75
75
|
**`gadmin2 g prisma:dev`(内部调 `migrate:dev` = `prisma migrate dev --name auto`)**
|
|
76
76
|
|
|
@@ -86,7 +86,7 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
|
|
|
86
86
|
- 检测到**漂移(drift)**(本地库和迁移历史对不上,如曾手动 `db push` 改过表)时,会**交互式提示重置数据库(drop 重建)**。纯拉取+应用别人迁移通常不触发;本地库被改脏才会。遇到时看清提示再决定,别盲目回车。
|
|
87
87
|
- 因为会改本地库且交互,**绝不能对共享/生产库运行**。
|
|
88
88
|
|
|
89
|
-
**`
|
|
89
|
+
**`pnpm migrate:deploy`(= `prisma migrate deploy`)**
|
|
90
90
|
|
|
91
91
|
- **只回放 pending 迁移,从不生成迁移、从不删数据、无交互**,也不会因 drift 提示 reset。
|
|
92
92
|
- **不重新生成后端 CRUD 代码**——若拉下来的变更带了新表/新字段需要 module 代码,还得再跑 `gadmin2 g prisma`(只生成代码、不碰库)。
|
|
@@ -97,14 +97,14 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
|
|
|
97
97
|
| 我的情况 | 用哪条 |
|
|
98
98
|
|------|------|
|
|
99
99
|
| 本地开发,且/或自己也改了 schema,要生成代码 | `gadmin2 g prisma:dev` |
|
|
100
|
-
| 本地开发,确定自己没改 schema,只想安全应用别人迁移 | `
|
|
101
|
-
| 共享测试 / 生产库 | 只能 `
|
|
100
|
+
| 本地开发,确定自己没改 schema,只想安全应用别人迁移 | `pnpm migrate:deploy`(如需代码再 `gadmin2 g prisma`) |
|
|
101
|
+
| 共享测试 / 生产库 | 只能 `pnpm migrate:deploy` |
|
|
102
102
|
|
|
103
103
|
### 日常开发流
|
|
104
104
|
|
|
105
105
|
```
|
|
106
106
|
1. 改 config/prisma/{module}.prisma # 唯一手写处
|
|
107
|
-
2.
|
|
107
|
+
2. pnpm migrate:create # 只生成迁移文件,不应用
|
|
108
108
|
3. 审查 server/prisma/migrations/xxx/migration.sql # 重点看 DROP / 改列类型 / NOT NULL
|
|
109
109
|
4. gadmin2 g prisma:dev # 生成 CRUD 代码 + 应用迁移到本地库
|
|
110
110
|
5. 提交 config/prisma/* + server/prisma/migrations/* + web/src/routes/*
|
|
@@ -119,7 +119,7 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
|
|
|
119
119
|
- 含 `config/prisma/*` 或新迁移 → 运行 `gadmin2 g prisma:dev`(应用新迁移 + 重新生成后端代码)
|
|
120
120
|
- 仅含 `config/ui/*` → 运行 `gadmin2 g prisma`(只重新生成前端代码)
|
|
121
121
|
|
|
122
|
-
hook 只提示、不自动执行(`migrate:dev`
|
|
122
|
+
hook 只提示、不自动执行(`migrate:dev` 会改本地库且交互,不宜静默跑);需先在项目根在 web 或 server 跑过一次 `pnpm install`(触发 `husky install`)hook 才生效。
|
|
123
123
|
|
|
124
124
|
### 首次接入迁移(baseline)
|
|
125
125
|
|
|
@@ -129,7 +129,7 @@ hook 只提示、不自动执行(`migrate:dev` 会改本地库且交互,不
|
|
|
129
129
|
|------|:---:|:---:|------|
|
|
130
130
|
| 已有本地库(db push 建的) | ❌ 文件已入库 | ✅ 必须一次 | 正常 `gadmin2 g prisma:dev` |
|
|
131
131
|
| 新环境 / 空库 | ❌ | ❌ 不需要 | 直接 `gadmin2 g prisma:dev` 建全表 |
|
|
132
|
-
| 共享测试/生产库(现存非空) | ❌ | ✅ 首次一次 | 之后 `
|
|
132
|
+
| 共享测试/生产库(现存非空) | ❌ | ✅ 首次一次 | 之后 `pnpm migrate:deploy` |
|
|
133
133
|
|
|
134
134
|
resolve 命令(在 `server/` 下执行,注意用本地 `dotenv-cli` 以避免命中全局 python-dotenv):
|
|
135
135
|
|
|
@@ -149,7 +149,7 @@ npx dotenv -e .env.local -e .env -- bash -c 'psql "${DATABASE_URL%%\?*}" -c "DEL
|
|
|
149
149
|
|
|
150
150
|
### 迁移冲突约定
|
|
151
151
|
|
|
152
|
-
两人各自基于同一父迁移生成迁移,合并后顺序会乱。约定:schema 改动**小步快合**;合并遇到迁移冲突时,**后合并者删掉自己的迁移文件、rebase 后重新 `
|
|
152
|
+
两人各自基于同一父迁移生成迁移,合并后顺序会乱。约定:schema 改动**小步快合**;合并遇到迁移冲突时,**后合并者删掉自己的迁移文件、rebase 后重新 `pnpm migrate:create`**,不要手改文件名时间戳。
|
|
153
153
|
|
|
154
154
|
## 构建与部署
|
|
155
155
|
|
|
@@ -191,7 +191,7 @@ docker compose up -d --build
|
|
|
191
191
|
|
|
192
192
|
详细使用与端口分配见 `docker-compose.md`。
|
|
193
193
|
|
|
194
|
-
> 注:开发态 web/server 推荐直接 `
|
|
194
|
+
> 注:开发态 web/server 推荐直接 `pnpm dev` / `pnpm start:dev`(见 Usage 章节),`docker compose` 是用于完整集成验证。
|
|
195
195
|
|
|
196
196
|
### CI/CD 流水线
|
|
197
197
|
|
|
@@ -249,8 +249,8 @@ post.always: 清理本地 codegen 中间镜像
|
|
|
249
249
|
│ • CREATE DATABASE temporal_visibility
|
|
250
250
|
│
|
|
251
251
|
├── server-init(一次性容器,depends_on postgres healthy)
|
|
252
|
-
│ •
|
|
253
|
-
│ •
|
|
252
|
+
│ • pnpm migrate:deploy (prisma 把 schema 推到 gadmin_demo)
|
|
253
|
+
│ • pnpm seed (播种 RBAC 等基础数据,跑完即退出 Exited 0)
|
|
254
254
|
│
|
|
255
255
|
└── server / web / temporal-* (正常服务)
|
|
256
256
|
```
|
|
@@ -278,13 +278,13 @@ container start
|
|
|
278
278
|
│ │
|
|
279
279
|
│ ├─ A. 临时环境(feature*/bugfix*/hotfix*):每次启动都重建分支 schema
|
|
280
280
|
│ │ • 改写 DATABASE_URL:schema=<DEPLOY_NAME>(- 与 / 替换为 _)
|
|
281
|
-
│ │ •
|
|
281
|
+
│ │ • pnpm migrate:deploy
|
|
282
282
|
│ │ • node migrate-between-pg-schemas.js (从 public schema 拷数据到分支 schema)
|
|
283
|
-
│ │ •
|
|
283
|
+
│ │ • pnpm seed (幂等,每次启动都跑)
|
|
284
284
|
│ │
|
|
285
285
|
│ └─ B. 非临时环境(默认 / production):按需初始化
|
|
286
286
|
│ • DATABASE_URL 兜底 schema=public
|
|
287
|
-
│ • 探测 t_role:不存在或 count=0 →
|
|
287
|
+
│ • 探测 t_role:不存在或 count=0 → pnpm migrate:deploy + pnpm seed;否则跳过
|
|
288
288
|
│ • 连接失败等异常 → 保守走初始化路径
|
|
289
289
|
│
|
|
290
290
|
└── exec node dist/src/main ← 启动 NestJS
|
|
@@ -301,8 +301,8 @@ container start
|
|
|
301
301
|
| 对象 | 本地 compose | 生产 / 临时环境 |
|
|
302
302
|
|---|---|---|
|
|
303
303
|
| 数据库(`gadmin_demo`) | `dev/postgres/init.sql`(pgdata 卷为空时) | `ensure-database.js`(每次启动幂等) |
|
|
304
|
-
| Schema + 表结构 | `server-init` 里 `
|
|
305
|
-
| 基础数据(seed) | `server-init` 里 `
|
|
304
|
+
| Schema + 表结构 | `server-init` 里 `pnpm migrate:deploy` | `start-prod.sh` 按分支策略 `pnpm migrate:deploy` |
|
|
305
|
+
| 基础数据(seed) | `server-init` 里 `pnpm seed` | `start-prod.sh` 按分支策略 `pnpm seed` |
|
|
306
306
|
| 临时环境 schema 隔离 | — | `start-prod.sh` 改写 DATABASE_URL + `migrate-between-pg-schemas.js` |
|
|
307
307
|
|
|
308
308
|
## Template Sync
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
|
3
|
+
"singleQuote": true,
|
|
4
|
+
"trailingComma": "all",
|
|
5
|
+
"printWidth": 80,
|
|
6
|
+
"sortPackageJson": false,
|
|
7
|
+
"ignorePatterns": [
|
|
8
|
+
"src/**/*.enum.ts",
|
|
9
|
+
"src/generated/**",
|
|
10
|
+
"dist/**",
|
|
11
|
+
"node_modules/**"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": ["typescript"],
|
|
4
|
+
"categories": {
|
|
5
|
+
"correctness": "warn"
|
|
6
|
+
},
|
|
7
|
+
"rules": {
|
|
8
|
+
"typescript/no-explicit-any": "off",
|
|
9
|
+
"no-empty-function": "warn"
|
|
10
|
+
},
|
|
11
|
+
"ignorePatterns": [
|
|
12
|
+
"dist/**",
|
|
13
|
+
"node_modules/**",
|
|
14
|
+
"src/generated/**",
|
|
15
|
+
"src/**/*.enum.ts"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"scripts": {
|
|
9
9
|
"prebuild": "rimraf dist",
|
|
10
10
|
"build": "nest build -c gadmin-cli.json",
|
|
11
|
-
"format": "
|
|
11
|
+
"format": "oxfmt src test",
|
|
12
|
+
"format:check": "oxfmt src test --check",
|
|
12
13
|
"prepare": "cd .. && husky install || true",
|
|
13
14
|
"start": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json",
|
|
14
15
|
"start:dev": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json --watch",
|
|
@@ -17,7 +18,8 @@
|
|
|
17
18
|
"start:debug": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json --debug --watch",
|
|
18
19
|
"start:prod": "/bin/sh start-prod.sh",
|
|
19
20
|
"typecheck": "tsc --noEmit",
|
|
20
|
-
"lint": "
|
|
21
|
+
"lint": "oxlint src test",
|
|
22
|
+
"lint:fix": "oxlint src test --fix",
|
|
21
23
|
"test": "jest",
|
|
22
24
|
"test:watch": "jest --watch",
|
|
23
25
|
"test:cov": "jest --coverage",
|
|
@@ -28,7 +30,7 @@
|
|
|
28
30
|
"migrate:deploy": "dotenv -e .env.local -e .env -- prisma migrate deploy",
|
|
29
31
|
"migrate:status": "dotenv -e .env.local -e .env -- prisma migrate status",
|
|
30
32
|
"generate": "dotenv -e .env.local -e .env -- npx prisma generate",
|
|
31
|
-
"generate:dev": "
|
|
33
|
+
"generate:dev": "pnpm migrate:dev",
|
|
32
34
|
"postgenerate:dev": "dotenv -e .env.local -e .env -- ts-node seed/data-mngt.seed.ts",
|
|
33
35
|
"postgadminGenerate": "node scripts/notify-dev-servers.js",
|
|
34
36
|
"push:db": "dotenv -e .env.local -e .env -- prisma db push --skip-generate",
|
|
@@ -69,8 +71,8 @@
|
|
|
69
71
|
"cache-manager": "^6.4.3",
|
|
70
72
|
"class-transformer": "^0.5.1",
|
|
71
73
|
"class-validator": "^0.13.2",
|
|
72
|
-
"cron-parser": "^5.0.0",
|
|
73
74
|
"cookie-parser": "^1.4.6",
|
|
75
|
+
"cron-parser": "^5.0.0",
|
|
74
76
|
"crypto-js": "^4.2.0",
|
|
75
77
|
"csvtojson": "^2.0.10",
|
|
76
78
|
"dayjs": "^1.10.7",
|
|
@@ -108,18 +110,13 @@
|
|
|
108
110
|
"@types/multer": "^1.4.7",
|
|
109
111
|
"@types/node": "^16.0.0",
|
|
110
112
|
"@types/supertest": "^2.0.11",
|
|
111
|
-
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
|
112
|
-
"@typescript-eslint/parser": "^5.0.0",
|
|
113
113
|
"concurrently": "^9.1.0",
|
|
114
|
-
"eslint": "^8.0.1",
|
|
115
|
-
"eslint-config-prettier": "^8.3.0",
|
|
116
|
-
"eslint-plugin-prettier": "^4.0.0",
|
|
117
114
|
"husky": "^8.0.0",
|
|
118
115
|
"jest": "^29.0.0",
|
|
119
116
|
"lint-staged": "^13.0.0",
|
|
120
117
|
"nodemon": "^3.1.7",
|
|
121
|
-
"
|
|
122
|
-
"
|
|
118
|
+
"oxfmt": "^0.68.0",
|
|
119
|
+
"oxlint": "^1.83.0",
|
|
123
120
|
"prisma-dbml-generator": "^0.9.1",
|
|
124
121
|
"source-map-support": "^0.5.20",
|
|
125
122
|
"supertest": "^6.1.3",
|
|
@@ -149,10 +146,14 @@
|
|
|
149
146
|
"_moduleAliases": {
|
|
150
147
|
"@": "src"
|
|
151
148
|
},
|
|
149
|
+
"packageManager": "pnpm@11.23.0",
|
|
150
|
+
"engines": {
|
|
151
|
+
"node": ">=22.13"
|
|
152
|
+
},
|
|
152
153
|
"prisma": {
|
|
153
|
-
"seed": "
|
|
154
|
+
"seed": "pnpm seed"
|
|
154
155
|
},
|
|
155
156
|
"lint-staged": {
|
|
156
|
-
"**/*.{ts,tsx}": "
|
|
157
|
+
"**/*.{ts,tsx}": "oxfmt"
|
|
157
158
|
}
|
|
158
159
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# pnpm 11 起,原先放在 package.json "pnpm" 字段的设置迁移至此文件。
|
|
2
|
+
# 本项目非 monorepo,此文件仅用于承载 pnpm 设置。
|
|
3
|
+
|
|
4
|
+
# gadmin2 CLI 与 nestjs-prisma 等工具按 yarn 扁平布局硬编码路径
|
|
5
|
+
# (如 server/node_modules/.prisma/client/index.d.ts),
|
|
6
|
+
# pnpm 默认的 isolated 布局会破坏它们,故使用 hoisted 模式(等价 yarn 扁平 node_modules)。
|
|
7
|
+
nodeLinker: hoisted
|
|
8
|
+
|
|
9
|
+
# 依赖的构建脚本默认被禁止执行(供应链安全考虑),需在此逐个放行。
|
|
10
|
+
allowBuilds:
|
|
11
|
+
# 必须放行:postinstall 负责下载/生成 Prisma 引擎与 Client,缺失则无法启动
|
|
12
|
+
prisma: true
|
|
13
|
+
'@prisma/client': true
|
|
14
|
+
'@prisma/engines': true
|
|
15
|
+
# nest build 使用的 SWC 原生二进制
|
|
16
|
+
'@swc/core': true
|
|
17
|
+
# esbuild(nest cli / ts-node 链路)原生二进制下载
|
|
18
|
+
esbuild: true
|
|
19
|
+
# temporal 链路依赖,postinstall 做 cli codegen 自检
|
|
20
|
+
protobufjs: true
|
|
21
|
+
# 以下脚本仅打印捐赠/统计信息,与产物无关,保持禁止
|
|
22
|
+
'@nestjs/core': false
|
|
23
|
+
'@scarf/scarf': false
|
|
@@ -97,7 +97,10 @@ async function issueGAdminTokenCookie(res, user: UserType) {
|
|
|
97
97
|
|
|
98
98
|
@Injectable()
|
|
99
99
|
export default class AuthGuard implements CanActivate {
|
|
100
|
-
constructor(
|
|
100
|
+
constructor(
|
|
101
|
+
private reflector: Reflector,
|
|
102
|
+
private userService: UserService,
|
|
103
|
+
) {}
|
|
101
104
|
|
|
102
105
|
private async getApikeyIdentity(req): Promise<UserType> {
|
|
103
106
|
const apiKey = req.headers['x-api-key'] ?? req.query.api_key;
|
|
@@ -56,8 +56,8 @@ export class StructuredAllExceptionsFilter implements ExceptionFilter {
|
|
|
56
56
|
typeof payload === 'string'
|
|
57
57
|
? payload
|
|
58
58
|
: statusCode === HttpStatus.INTERNAL_SERVER_ERROR
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
? 'Internal server error.'
|
|
60
|
+
: (controlled?.message ?? error),
|
|
61
61
|
error,
|
|
62
62
|
path,
|
|
63
63
|
});
|
|
@@ -58,12 +58,10 @@ class PrismaDbSpanProcessor implements SpanProcessor {
|
|
|
58
58
|
mutableSpan.attributes['db.name'] = dbInfo.name;
|
|
59
59
|
mutableSpan.attributes['db.instance'] = dbInfo.name;
|
|
60
60
|
mutableSpan.attributes['db.ip'] = dbInfo.host;
|
|
61
|
-
mutableSpan.attributes[
|
|
62
|
-
|
|
63
|
-
] =
|
|
64
|
-
|
|
65
|
-
'peer.filled'
|
|
66
|
-
] = `${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
|
|
61
|
+
mutableSpan.attributes['peer.service'] =
|
|
62
|
+
`${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
|
|
63
|
+
mutableSpan.attributes['peer.filled'] =
|
|
64
|
+
`${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
|
|
67
65
|
}
|
|
68
66
|
this.inner.onEnd(span);
|
|
69
67
|
}
|
|
@@ -440,8 +440,8 @@ export class AgendaService
|
|
|
440
440
|
? toggle === 'active'
|
|
441
441
|
? stateFiltered.filter((j) => !j.disabled)
|
|
442
442
|
: toggle === 'paused'
|
|
443
|
-
|
|
444
|
-
|
|
443
|
+
? stateFiltered.filter((j) => j.disabled)
|
|
444
|
+
: stateFiltered
|
|
445
445
|
: stateFiltered;
|
|
446
446
|
|
|
447
447
|
const total = toggleFiltered.length;
|
|
@@ -61,12 +61,12 @@ export class CodeRuntimeController {
|
|
|
61
61
|
node?.runtimeKey === 'code' && !input.configKey
|
|
62
62
|
? node.config
|
|
63
63
|
: node?.runtimeKey === 'human_approval' &&
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
input.configKey === 'creationResult'
|
|
65
|
+
? node.config.external?.creationResult
|
|
66
|
+
: node?.runtimeKey === 'human_approval' &&
|
|
67
|
+
input.configKey === 'approverLookupResult'
|
|
68
|
+
? dynamicSubject?.lookup?.result
|
|
69
|
+
: undefined;
|
|
70
70
|
if (
|
|
71
71
|
!version ||
|
|
72
72
|
version.workflowId !== instance.workflowId ||
|