create-dwy 0.15.0 → 0.16.1

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.
Files changed (89) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/bin/index.js +5 -3
  3. package/package.json +3 -2
  4. package/src/searchable-select.js +419 -0
  5. package/src/skills-install.js +48 -7
  6. package/src/sync-all.js +17 -25
  7. package/src/sync.js +38 -32
  8. package/templates/ai-tools/CHANGELOG.md +76 -0
  9. package/templates/ai-tools/CLAUDE.md +27 -0
  10. package/templates/ai-tools/VERSION +1 -0
  11. package/templates/ai-tools/hook-manifests/hooks.json +7 -0
  12. package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +57 -0
  13. package/templates/ai-tools/rules/Android/dwy-android-core.md +215 -4
  14. package/templates/ai-tools/rules/Android/dwy-android-pitfalls.md +52 -0
  15. package/templates/ai-tools/rules/Docker/dwy-docker.md +52 -1
  16. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +50 -1
  17. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-design.md +139 -0
  18. package/templates/ai-tools/rules/HarmonyOS/dwy-harmony-pitfalls.md +72 -0
  19. package/templates/ai-tools/rules/Python/dwy-python-backend.md +16 -63
  20. package/templates/ai-tools/rules/Python/dwy-python-base-lib.md +89 -0
  21. package/templates/ai-tools/rules/Python/dwy-python-pitfalls.md +49 -0
  22. package/templates/ai-tools/rules/Vue/dwy-vue-base-lib.md +127 -0
  23. package/templates/ai-tools/rules/Vue/dwy-vue-core.md +22 -86
  24. package/templates/ai-tools/rules/Vue/dwy-vue-pitfalls.md +66 -0
  25. package/templates/ai-tools/rules/iOS/dwy-ios-pitfalls.md +7 -0
  26. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +59 -0
  27. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +9 -6
  28. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-development.md +47 -2
  29. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/SKILL.md +511 -0
  30. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-data.md +126 -0
  31. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-network.md +88 -0
  32. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-runtime.md +195 -0
  33. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/security-doc-search.md +179 -0
  34. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_base.sh +39 -0
  35. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_capacity.sh +278 -0
  36. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_db.sh +147 -0
  37. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_docker.sh +230 -0
  38. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_env.sh +64 -0
  39. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_https.sh +60 -0
  40. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_logs.sh +209 -0
  41. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_nginx.sh +100 -0
  42. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_resilience.sh +157 -0
  43. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_secrets.sh +265 -0
  44. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_services.sh +94 -0
  45. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_ssh.sh +56 -0
  46. package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/run_all.sh +105 -0
  47. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-acceptance/SKILL.md +3 -2
  48. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +51 -9
  49. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-commercial/SKILL.md +58 -0
  50. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-competitor/SKILL.md +2 -1
  51. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-explore/SKILL.md +83 -0
  52. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-mvp/SKILL.md +2 -1
  53. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prd/SKILL.md +1 -0
  54. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/SKILL.md +14 -9
  55. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +65 -13
  56. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md +30 -11
  57. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-release/SKILL.md +3 -2
  58. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-design/SKILL.md +17 -10
  59. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-dev/SKILL.md +42 -10
  60. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-launch/SKILL.md +22 -10
  61. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-prd/SKILL.md +13 -4
  62. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-ship/SKILL.md +13 -4
  63. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tasks/SKILL.md +12 -2
  64. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tdd-dev/SKILL.md +15 -6
  65. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-validate/SKILL.md +2 -1
  66. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-version/SKILL.md +1 -0
  67. package/templates/ai-tools/skills//345/205/203/345/267/245/345/205/267/dwy-shared/SKILL.md +22 -1
  68. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +1 -1
  69. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +2 -2
  70. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +3 -3
  71. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_secrets.sh +1 -1
  72. package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/SKILL.md +176 -0
  73. package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/references/chapter-01-mirrors.md +112 -0
  74. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-ideate/SKILL.md +0 -21
  75. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/SKILL.md +0 -113
  76. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/templates/STATE.md +0 -56
  77. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dev-qa/SKILL.md +0 -117
  78. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-market-analysis/SKILL.md +0 -92
  79. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/SKILL.md +0 -72
  80. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/templates/prd-coarse.md +0 -61
  81. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/SKILL.md +0 -76
  82. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/templates/prd-detailed.md +0 -119
  83. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prototype/SKILL.md +0 -104
  84. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-spike/SKILL.md +0 -81
  85. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/SKILL.md +0 -212
  86. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/templates/impl-plan.md +0 -115
  87. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tech-feasibility/SKILL.md +0 -105
  88. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/SKILL.md +0 -64
  89. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/templates/version-plan.md +0 -72
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Docker 通用规则(镜像固定版本、容器内存上限、日志大小限制)
2
+ description: Docker 通用规则(镜像固定版本、容器内存上限、日志大小限制、配置变更重启姿势)
3
3
  ---
4
4
 
5
5
  # Docker 通用规则
@@ -69,3 +69,54 @@ services:
69
69
  max-size: "10m"
70
70
  max-file: "3"
71
71
  ```
72
+
73
+ ## 三、配置变更重启姿势(env_file / environment / .env)
74
+
75
+ ### 根因
76
+
77
+ `docker compose restart` 只重启**已存在的容器进程**,**不会重读** `env_file` / `environment` / `.env`。env 变量只在**容器创建时**注入容器配置;restart 沿用旧容器的旧环境,新 env 永远进不去。
78
+
79
+ ### 现象(真实踩坑)
80
+
81
+ 预览机改了 `.env` 的 `DOLPHINDB_FACTOR__PORT=18560`,用 `docker compose restart` 加载 → preview 容器一直拿不到新值,因子 provider 静默回退到主库 8848,功能"看起来通了"实际走错库。当时报"已验证"是错的——只验了隧道连通,没验 app 实际配置(`printenv`)。
82
+
83
+ release 环境没踩坑:deploy-bg 是 build 后 `up -d`,镜像变更触发容器重建,重建时重读了 env_file。
84
+
85
+ ### 强制规则
86
+
87
+ **改了 env_file / environment / `.env` 后,必须重建容器,不能只 restart:**
88
+
89
+ ```bash
90
+ # 正确:重建容器,重读 env
91
+ docker compose up -d --force-recreate backend
92
+
93
+ # 或更精准:只重建受影响服务,不动依赖
94
+ docker compose up -d --force-recreate --no-deps backend
95
+
96
+ # 错误:restart 不重读 env,新配置永远不生效
97
+ docker compose restart backend
98
+ ```
99
+
100
+ ### 判断容器是否重建的速查
101
+
102
+ | 操作 | 容器是否重建 | env 是否重读 |
103
+ |------|------------|------------|
104
+ | `docker compose restart` | 否(仅重启进程) | **否** |
105
+ | `docker compose up -d`(镜像无变化) | 否 | 否 |
106
+ | `docker compose up -d`(镜像有变化) | 是 | 是 |
107
+ | `docker compose up -d --force-recreate` | 是 | 是 |
108
+ | `docker compose up -d --env-file .env.prod`(换了 env 文件) | 是 | 是 |
109
+
110
+ ### 验证清单(改 env 后必跑)
111
+
112
+ ```bash
113
+ # 1. 确认容器内实际生效的 env(不是宿主机的 .env)
114
+ docker compose exec backend printenv | grep DOLPHINDB_FACTOR__
115
+
116
+ # 2. 不要只验连通性,要验 app 实际读到的配置
117
+ # 连通=隧道通,不代表 app 配置对
118
+ ```
119
+
120
+ ### 一句话
121
+
122
+ > 配置改了别 restart,`up -d --force-recreate`。验证别只看连通,`printenv` 看容器内真值。
@@ -8,7 +8,13 @@ paths:
8
8
 
9
9
  # ArkUI / 工程 / 运行时 避坑
10
10
 
11
- `dwy-arkts-strict.md` 管语言语法层;本文件管 **ArkUI 组件、V2 状态管理、资源(图标)、工程构建、运行时容错**。
11
+ | 文件 | 层 |
12
+ |---|---|
13
+ | `dwy-arkts-strict.md` | 语言语法(arkts-no-*) |
14
+ | **本文件** | 组件 API、V2 状态、资源、工程构建、设备/运行时 |
15
+ | `dwy-arkts-ui-design.md` | UI 设计与交互(弹层关闭、加载三态等事前约束) |
16
+ | `dwy-harmony-pitfalls.md` | 四栏踩坑归档 |
17
+
12
18
  均为真机/DevEco 构建实测踩坑(编译期或运行期暴露,命令行 tsc 查不出)。
13
19
 
14
20
  ## 1. sys.symbol 图标名 ≠ SF Symbols 名,必须查鸿蒙清单逐个映射
@@ -191,3 +197,46 @@ $NODE $HVIGOR --mode module -p module=entry@default -p product=default -p pageTy
191
197
  见 `dwy-arkts-strict.md` 第 9 条(cryptoFramework 签名规格 / 公钥 DER 格式 / TCPSocket 局域网)。
192
198
  补充:手撸 HTTP/2 的 HPACK 全字面量是否被对端(如 grpc-netty)接受、华为 IAP 需 AGC 后台
193
199
  配商品 + 真机华为账号、asset/Preferences 在不同设备的可用性,均真机才能定论。
200
+
201
+ ## 11. assembleHap 未配 signingConfigs → unsigned.hap
202
+
203
+ - **现象**:`hvigorw assembleHap` 成功但日志 `Will skip sign 'hos_hap'`,产物 `entry-default-unsigned.hap`;真机拒装。
204
+ - **根因**:`build-profile.json5` 的 `signingConfigs` 为空。
205
+ - **正确做法**:DevEco → Project Structure → Signing Configs 自动签名写回工程;**模拟器**可装 unsigned;**真机**必须签名。
206
+ - **适用**:CLI / CI 打包。
207
+
208
+ ## 12. 本地模拟器(HVD)命令行:`-hvd` + hdc `127.0.0.1:5555`
209
+
210
+ - **现象**:不知如何脱离 IDE 起模拟器、装 HAP。
211
+ - **正确做法**:
212
+ - 启动:`/Applications/DevEco-Studio.app/Contents/tools/emulator/Emulator -hvd "Pura 90"`(名见 `~/.Huawei/Emulator/deployed/*.ini`)。
213
+ - 设备:`hdc list targets` → 常见 `127.0.0.1:5555`。
214
+ - 安装:`hdc -t 127.0.0.1:5555 install entry/.../entry-default-unsigned.hap`。
215
+ - 启动:`hdc -t 127.0.0.1:5555 shell aa start -a EntryAbility -b <bundleName>`。
216
+ - **适用**:无 GUI / 脚本化调试。
217
+
218
+ ## 13. 模拟器验不了局域网 TCP / mDNS / 设备发现
219
+
220
+ - **现象**:模拟器里 app 连不上局域网电视、ADB、mDNS 服务。
221
+ - **根因**:HVD 网络多为 NAT,**不是**与电脑同 Wi-Fi 的 peer;模拟器「代理设置」只影响 HTTP 出网,**不能**桥接局域网。
222
+ - **正确做法**:依赖局域网原始 TCP / mDNS 的链路(ADB 5555、插件 28100、无线调试配对)必须 **鸿蒙真机 + 与目标设备同 Wi-Fi**。模拟器只做 UI / 导航 / 无网逻辑。
223
+ - **适用**:任何局域网设备调试类 app。
224
+
225
+ ## 14. ScanKit `generateBarcode` 在模拟器常失败
226
+
227
+ - **现象**:二维码区域一直 spinner / 空白,业务 payload(如配对码数字)已生成。
228
+ - **根因**:`@kit.ScanKit` 的 `generateBarcode.createBarcode` 在 HVD 或部分镜像不可用。
229
+ - **正确做法**:
230
+ 1. 调用时显式 `backgroundColor` / `pixelMapColor` / `margin`。
231
+ 2. `catch` 后 **纯逻辑矩阵兜底**(自研或库 → `image.createPixelMap` RGBA),保证有图。
232
+ 3. UI:仅生成中 spinner;失败出文案,禁止永久 loading(见 `dwy-arkts-ui-design.md`)。
233
+ - **适用**:任何依赖出码展示的页面。
234
+
235
+ ## 文件职责(与本目录其它规则)
236
+
237
+ | 文件 | 管什么 |
238
+ |---|---|
239
+ | `dwy-arkts-strict.md` | 语言:禁用语法、arkts-no-* |
240
+ | `dwy-arkts-ui-build.md`(本文件) | 组件 API、状态、资源、构建、运行时/设备坑 |
241
+ | `dwy-arkts-ui-design.md` | **UI 设计规范**(弹层/顶栏/加载态/图标语义,事前约束) |
242
+ | `dwy-harmony-pitfalls.md` | 踩坑四栏归档(现象/根因/做法/适用),新坑先记这里再回写规范 |
@@ -0,0 +1,139 @@
1
+ ---
2
+ description: HarmonyOS ArkUI UI 设计与交互规范(弹层/顶栏/加载态/图标语义,事前约束,避免 bindSheet 重叠等坑)
3
+ paths:
4
+ - "**/*.ets"
5
+ ---
6
+
7
+ # ArkUI UI 设计规范
8
+
9
+ 与 `dwy-arkts-ui-build.md`(怎么编译/踩过哪些 API 坑)配套:本文件管 **长什么样、交互怎么关、加载怎么显**。
10
+ 写页面 / sheet **先按本规范搭骨架**,再写业务。踩到新 UI 坑:先记 `dwy-harmony-pitfalls.md`,再回写本文件。
11
+
12
+ ## 1. 分层约定
13
+
14
+ | 层 | 职责 | 典型 API |
15
+ |---|---|---|
16
+ | 系统 chrome | 系统提供的关闭/拖拽指示 | `bindSheet` 的 `showClose`、下拉关闭 |
17
+ | 内容顶栏 | 标题 + 业务操作 +(可选)自绘关闭 | `SheetHeader` / 自绘 `Row` |
18
+ | 内容区 | 表单、列表、图 | 业务组件 |
19
+
20
+ **硬规则:系统关闭钮与内容自绘「关弹层」× 禁止同时出现。**
21
+
22
+ ## 2. bindSheet 关闭策略(二选一)
23
+
24
+ ### 2.1 模式 A:自绘关闭(工具页 / 表单 / 顶栏有右侧操作)
25
+
26
+ 适用:Shell、进程、性能、调试、代理、录屏、快捷指令、设备编辑、**配对弹层**、设备信息(有「复制全部」等)。
27
+
28
+ ```ets
29
+ .bindSheet(this.open, this.content(), {
30
+ detents: [SheetSize.LARGE],
31
+ backgroundColor: Palette.device,
32
+ showClose: false, // 必须关系统 ×
33
+ onDisappear: () => { this.open = false; },
34
+ })
35
+
36
+ @Builder
37
+ content(): void {
38
+ FooPage({ onClose: () => { this.open = false; } })
39
+ }
40
+ ```
41
+
42
+ 内容顶栏结构(从左到右):
43
+
44
+ ```
45
+ [ 标题(layoutWeight 1,单行省略) ] [ 可选业务按钮 ] [ 关闭 × ]
46
+ ```
47
+
48
+ - 关闭用 `sys.symbol.xmark`,固定触控约 `36×36`,勿与分段按钮同一 `Row` 抢宽。
49
+ - 分段 / Tab 切换放在 **顶栏下一行**,整行 `width('100%')`,不得伸进系统 chrome 区域。
50
+
51
+ ### 2.2 模式 B:仅系统关闭(纯浏览 / 轻列表)
52
+
53
+ 适用:语言选择、截图预览、无业务顶栏操作的列表。
54
+
55
+ ```ets
56
+ .bindSheet(this.open, this.content(), {
57
+ showClose: true,
58
+ onDisappear: () => { this.open = false; },
59
+ })
60
+ ```
61
+
62
+ - 内容 **禁止** 再画关闭 ×。
63
+ - 顶栏右侧 **禁止** 放会与系统 × 重叠的控件(可放在内容区下方或用「完成」文字按钮在底部)。
64
+
65
+ ### 2.3 禁止
66
+
67
+ | 禁止 | 原因 |
68
+ |---|---|
69
+ | `showClose: true` + `SheetHeader` / 自绘 × | 双 × 重叠 |
70
+ | `showClose` 省略 + 自绘 × | 默认常带系统 ×,仍重叠 |
71
+ | 系统 × 与「新增 / 复制全部 / 分段 Tab」同一视觉行 | 贴边、难点 |
72
+ | 关闭回调空实现(`onClose` 未注入) | × 点了无反应 |
73
+
74
+ ## 3. 图标语义(禁止混用)
75
+
76
+ | 语义 | 推荐符号 | 禁止 |
77
+ |---|---|---|
78
+ | 关弹层 | `xmark`(顶栏) | 与「清空」共用同一位置无说明 |
79
+ | 清空输入 | `xmark_circle_fill`(输入框旁) | 当成关 sheet |
80
+ | 返回上一页 | `chevron_left`(`PageHeaderBar`) | 用 × 表示返回 |
81
+ | 删除 | `trash` | 用 × 表示删除条目 |
82
+
83
+ 输入弹层(键盘):**关 sheet 用模式 B(系统 ×)**;清空用输入框旁圆形 ×,注释写明「清空非关闭」。
84
+
85
+ ## 4. 加载与空态(禁止永久 spinner)
86
+
87
+ 异步出图 / 出列表必须三态:
88
+
89
+ | 状态 | UI |
90
+ |---|---|
91
+ | 加载中 | `LoadingProgress`(限在固定占位区域内) |
92
+ | 成功 | 内容(图 / 列表) |
93
+ | 失败 | 文案说明 + 可选重试;**禁止**继续转圈 |
94
+
95
+ 二维码 / 图片:
96
+
97
+ 1. 优先系统能力(如 ScanKit)。
98
+ 2. 失败必须有 **可见兜底**(纯逻辑绘制 / 占位文案),不能空白。
99
+ 3. 占位区 **固定宽高**,避免生成前后布局跳动。
100
+
101
+ ## 5. 顶栏与安全区
102
+
103
+ - **Push 页**:`PageHeaderBar`(返回 + 标题 + trailing),前景在安全区内。
104
+ - **Sheet**:见 §2;全屏背景可用,主交互勿进系统手势死角。
105
+ - 标题:`maxLines(1)` + `TextOverflow.Ellipsis`,避免长文案挤掉按钮。
106
+ - 触控目标:主要按钮高度建议 ≥ 40;图标按钮约 36×36。
107
+
108
+ ## 6. 布局与间距(基线)
109
+
110
+ - 页面水平 padding 统一 **16 / 20**(工具页内容区常用 16–20)。
111
+ - 卡片圆角与描边走 **设计 token**(如 `Palette.surface2` + `hairline`),禁止业务页散落硬编码色。
112
+ - 列表/宫格:用 `List` / `Grid` + 间距系统,不用绝对 `offset` 拼主布局。
113
+ - 固定视觉比例控件(二维码、D-pad)可用固定边长,**外层容器仍自适应宽度**。
114
+
115
+ ## 7. 颜色与动效
116
+
117
+ - 颜色只从 `Palette`(或项目 token)取,禁止裸 `0xFF...` 散落业务页(生成图 RGBA 缓冲区除外)。
118
+ - 动效优先项目统一 spring / 系统默认;新增动画参数与现有 `Motion` 一致。
119
+ - 强调色用于主按钮;关闭/次要操作用 `Palette.sub`,删除用 `Palette.red`。
120
+
121
+ ## 8. 文案与国际化
122
+
123
+ - 所有用户可见文案走 `loc('key')` + 资源表,禁止硬编码中文/英文(调试日志除外)。
124
+ - 新 key 至少补齐 **开发语言 + en**;其它语言可后续补。
125
+
126
+ ## 9. 自检清单(PR / 提交前)
127
+
128
+ - [ ] 每个 `bindSheet` 已显式 `showClose: true` 或 `false`(不省略)。
129
+ - [ ] 自绘 × 的 sheet 已 `showClose: false` 且 `onClose` 接通。
130
+ - [ ] 系统 × 的 sheet 内容无第二颗关闭钮、右侧无抢位控件。
131
+ - [ ] 异步区有失败态,无永久 spinner。
132
+ - [ ] 出码/出图有 ScanKit 失败兜底(若依赖)。
133
+ - [ ] 图标名在 `id_defined.json` 存在(见 ui-build §1)。
134
+ - [ ] 文案全部 `loc`。
135
+
136
+ ## 10. 与 iOS 对照时注意
137
+
138
+ - iOS `sheet` + 导航栏 toolbar 关闭 ≠ 鸿蒙默认 `showClose`;移植时 **重新选 §2 模式**,不要两端各画一套再叠系统。
139
+ - SF Symbols 名不能直接当 `sys.symbol`(见 ui-build §1)。
@@ -0,0 +1,72 @@
1
+ ---
2
+ description: 鸿蒙踩坑四栏归档(现象/根因/正确做法/适用)。事前规范见 dwy-arkts-ui-design / dwy-arkts-ui-build / dwy-arkts-strict
3
+ paths:
4
+ - "**/*.ets"
5
+ - "**/build-profile.json5"
6
+ ---
7
+
8
+ # 鸿蒙开发坑清单(归档)
9
+
10
+ > **事前约束**请先读:
11
+ >
12
+ > | 文件 | 用途 |
13
+ > |---|---|
14
+ > | `dwy-arkts-strict.md` | 语言禁用语法 |
15
+ > | `dwy-arkts-ui-build.md` | 组件 API / 构建 / 设备与运行时 |
16
+ > | `dwy-arkts-ui-design.md` | UI 弹层/顶栏/加载态规范 |
17
+ >
18
+ > 本文件只记 **已踩过的坑**(四栏)。新坑:先按格式追加 → 再把「正确做法」回写到对应规范文件,避免规范与归档脱节。
19
+
20
+ ## 分类索引
21
+
22
+ - ArkUI 弹层 / 出码
23
+ - 工程与设备网络
24
+
25
+ ---
26
+
27
+ ## ArkUI 弹层 / 出码
28
+
29
+ ### bindSheet 系统 × 与内容自绘 × / 顶栏按钮重叠
30
+
31
+ - **现象**:右上两颗 ×,或系统 × 与「扫码/配对码」「新增」「复制全部」贴在一起。
32
+ - **根因**:`showClose` 与内容自绘关闭/右侧操作同区叠放。
33
+ - **正确做法**:见 `dwy-arkts-ui-design.md` §2(二选一);禁止省略 `showClose`。
34
+ - **适用**:所有 `bindSheet`。
35
+
36
+ ### 内容区 × 是清空不是关 sheet
37
+
38
+ - **现象**:键盘输入框旁 × 被当成关弹层。
39
+ - **根因**:语义是清空输入。
40
+ - **正确做法**:见 `dwy-arkts-ui-design.md` §3。
41
+ - **适用**:Keyboard / 搜索。
42
+
43
+ ### ScanKit 二维码模拟器空白 + 永久 spinner
44
+
45
+ - **现象**:配对扫码页只转圈,无码图。
46
+ - **根因**:HVD 上 `generateBarcode` 常失败;失败 UI 仍 loading。
47
+ - **正确做法**:见 `dwy-arkts-ui-build.md` §14 + `dwy-arkts-ui-design.md` §4(兜底出图 + 三态)。
48
+ - **适用**:出码展示。
49
+
50
+ ---
51
+
52
+ ## 工程与设备网络
53
+
54
+ ### unsigned.hap 真机装不上
55
+
56
+ - **现象**:CLI 打包成功,真机安装失败。
57
+ - **根因**:未配置 `signingConfigs`。
58
+ - **正确做法**:见 `dwy-arkts-ui-build.md` §11。
59
+ - **适用**:真机分发。
60
+
61
+ ### 模拟器代理设置无法让 ADB 连局域网电视
62
+
63
+ - **现象**:在 HVD「代理设置」里配代理/DNS,仍连不上 `192.168.x.x:5555`。
64
+ - **根因**:代理只走 HTTP 出网;app 用原始 TCP;HVD 为 NAT 非 LAN peer。
65
+ - **正确做法**:见 `dwy-arkts-ui-build.md` §13;真机同 Wi-Fi。
66
+ - **适用**:局域网调试类产品。
67
+
68
+ ### HVD 命令行启停
69
+
70
+ - **现象**:不会脱离 IDE 起模拟器。
71
+ - **正确做法**:见 `dwy-arkts-ui-build.md` §12。
72
+ - **适用**:脚本化调试。
@@ -10,52 +10,6 @@ paths:
10
10
 
11
11
  ---
12
12
 
13
- ## 零、优先使用 `dwyeapi` 基础框架库(强制)
14
-
15
- `dwyeapi` 是团队内部 PyPI 基础设施包,已封装后端项目所需的通用能力。**凡是 dwyeapi 已提供的能力,禁止自行实现,也禁止引入其他库重复造轮子。**
16
-
17
- ### 必须复用 dwyeapi 的能力域
18
-
19
- | 能力域 | 内容 |
20
- |--------|------|
21
- | 配置管理 | 应用 Settings 基类、运行环境识别(dev / prod) |
22
- | 异常体系 | 业务异常基类与全局异常处理器注册 |
23
- | 统一响应 | `{ code, message, data, timestamp }` 包装 |
24
- | 分页 | 分页查询参数模型与分页响应封装 |
25
- | 数据库 | ORM 声明式基类、时间戳 Mixin、异步引擎与会话工厂 |
26
- | 依赖注入 | FastAPI `get_db` 工厂 |
27
- | 安全 | 密码哈希、JWT 创建与解码 |
28
- | 缓存 | 共享异步 Redis 客户端 |
29
- | 时间 | 业务时间统一入口(Asia/Shanghai) |
30
- | 脱敏 | PII 数据脱敏函数 |
31
- | 日志 | 全局日志配置与门面 |
32
- | 健康检查 | 健康检查路由工厂 |
33
- | 异步任务 | 耗时任务队列与上下文 |
34
- | 邮件 | 邮件验证码可插拔通道 |
35
-
36
- ### 查阅方式(关键)
37
-
38
- **在编写任何后端代码前,以及调用任何 dwyeapi 提供的 API 之前,必须先用 `Skill` 工具加载 `dwy-eapi` skill 查阅当前最新接口。** 本文件**只规定约束与边界**,**不固化** dwyeapi 的具体模块路径、类名、函数签名、参数 —— 这些会随版本演进,固化在 rules 里会与实际包不同步。
39
-
40
- ```
41
- Skill 工具调用:skill="dwy-eapi"
42
- ```
43
-
44
- ### 强制规则
45
-
46
- - 涉及上表任一能力域,**先查 skill 拿到当前 API,再写代码**
47
- - **禁止**自造异常基类,必须复用 dwyeapi 异常体系
48
- - **禁止**手写 bcrypt / PyJWT 调用,必须走 dwyeapi 安全模块
49
- - **禁止**自定义统一响应包装函数,必须用 dwyeapi 响应模块
50
- - **禁止**自定义分页模型,必须用 dwyeapi 分页模块
51
- - **禁止**自定义 `DeclarativeBase`,模型必须继承 dwyeapi 提供的基类
52
- - **禁止**在路由函数中直接创建数据库会话,必须用 dwyeapi 依赖工厂
53
- - **禁止**自建 Redis 连接池,必须用 dwyeapi 共享客户端
54
- - **禁止**在业务代码中直接使用 `datetime.now()`,必须用 dwyeapi 时间模块
55
- - **禁止**自行 `logging.basicConfig`,必须用 dwyeapi 日志模块
56
-
57
- ---
58
-
59
13
  ## 一、项目结构与业务聚合(强制)
60
14
 
61
15
  ### 核心原则
@@ -103,7 +57,7 @@ app/
103
57
  - 测试镜像功能聚合结构:`tests/users/test_router.py` / `tests/users/test_service.py`(详见第九节)
104
58
 
105
59
  ### 例外
106
- - 通用基础设施代码(如 dwyeapi 内部)可保持技术层结构
60
+ - 通用基础设施代码(如基础框架库内部)可保持技术层结构
107
61
 
108
62
  ---
109
63
 
@@ -167,11 +121,11 @@ async def create_user(
167
121
 
168
122
  ### 统一响应格式
169
123
 
170
- 所有成功 / 分页 / 错误响应统一走 dwyeapi 响应与异常模块(具体 API 与字段结构查 `dwy-eapi` skill),**禁止**自造响应包装函数,**禁止**在 router 中手动构造 `{"success": true, ...}` 等非标准格式。
124
+ 所有成功 / 分页 / 错误响应统一走项目级响应与异常模块,**禁止**自造响应包装函数,**禁止**在 router 中手动构造 `{"success": true, ...}` 等非标准格式。
171
125
 
172
126
  ### 分页
173
127
 
174
- 分页参数模型与响应包装统一走 dwyeapi(具体 API 查 `dwy-eapi` skill),**禁止**自定义。
128
+ 分页参数模型与响应包装统一走项目级分页模块,**禁止**自定义。
175
129
 
176
130
  ---
177
131
 
@@ -234,7 +188,7 @@ class UserResponse(UserBase):
234
188
 
235
189
  - 数据库会话、当前用户、配置等**必须**通过 `Depends()` 注入
236
190
  - **禁止**在路由函数中直接创建数据库会话或实例化 service
237
- - `get_db` 依赖必须用 dwyeapi 提供的工厂生成(具体 API 查 `dwy-eapi` skill)
191
+ - `get_db` 依赖必须用项目级工厂生成,**禁止**每个路由各自创建
238
192
 
239
193
  ```python
240
194
  # 反例:路由中直接创建会话
@@ -258,8 +212,8 @@ async def get_user(
258
212
 
259
213
  ### 强制规则
260
214
 
261
- - **必须**复用 dwyeapi 异常体系与全局处理器(具体异常类与注册方法查 `dwy-eapi` skill),**禁止**自造异常基类
262
- - 项目级扩展异常必须继承 dwyeapi 异常基类
215
+ - **必须**复用项目级异常体系与全局处理器,**禁止**自造异常基类
216
+ - 项目级扩展异常必须继承统一异常基类
263
217
  - **service 层**抛业务异常,**禁止**抛 `HTTPException`(service 不感知 HTTP)
264
218
  - **router 层**不写 `try / except`,由全局 handler 统一处理
265
219
  - **禁止**裸 `except:` 或 `except Exception: pass`
@@ -273,7 +227,7 @@ async def get_user(
273
227
  ### 强制规则
274
228
 
275
229
  - 必须使用 **SQLAlchemy 2.0** 声明式映射 + async
276
- - 模型继承 dwyeapi 提供的声明式基类与时间戳 Mixin(具体类名查 `dwy-eapi` skill),**禁止**自定义 `DeclarativeBase`
230
+ - 模型继承项目级统一声明式基类与时间戳 Mixin,**禁止**每个模型各自定义 `DeclarativeBase`
277
231
  - 数据库迁移使用 **Alembic**,**禁止**手动执行 DDL
278
232
  - **禁止**在路由层直接写 SQL 查询
279
233
  - **禁止**使用 SQLAlchemy 1.x 风格的 `session.query(...)`
@@ -283,7 +237,7 @@ from sqlalchemy.orm import Mapped, mapped_column
283
237
  from sqlalchemy import String
284
238
  import uuid as uuid_lib
285
239
 
286
- class User(BaseFromDwyeapi, TimestampMixinFromDwyeapi): # 实际基类名以 skill 为准
240
+ class User(Base, TimestampMixin): # 项目级统一基类与时间戳 Mixin
287
241
  __tablename__ = "users"
288
242
 
289
243
  id: Mapped[int] = mapped_column(primary_key=True)
@@ -328,10 +282,10 @@ user = result.scalar_one_or_none()
328
282
 
329
283
  | 规则 | 说明 |
330
284
  |------|------|
331
- | 存储算法 | **只允许 bcrypt**,必须走 dwyeapi 安全模块,**禁止**手写 bcrypt 调用或使用 MD5 / SHA / 明文 |
285
+ | 存储算法 | **只允许 bcrypt**,必须走项目级统一安全模块,**禁止**散落手写 bcrypt 调用或使用 MD5 / SHA / 明文 |
332
286
  | 接口返回 | **永远不返回**密码字段,Response Schema 中不包含 |
333
287
  | 密码强度 | **长度 ≥ 8 字符**,且**必须**包含 **大写字母、小写字母、数字、特殊符号** 中的至少 **3 类** |
334
- | 密码长度上限 | Schema 必须 `max_length=72`(bcrypt 输入硬上限,超过会被静默截断),除非 dwyeapi 已做 SHA-256 预哈希 |
288
+ | 密码长度上限 | Schema 必须 `max_length=72`(bcrypt 输入硬上限,超过会被静默截断),除非安全模块已做 SHA-256 预哈希 |
335
289
  | 登录错误 | 返回"用户名或密码错误",**不区分**是用户名不存在还是密码错误 |
336
290
  | 强度校验位置 | Pydantic Schema 层用 `field_validator` 校验复杂度,**禁止**只校长度 |
337
291
 
@@ -361,12 +315,12 @@ class UserCreate(BaseModel):
361
315
  return v
362
316
  ```
363
317
 
364
- > 该 validator 建议下沉到 dwyeapi 提供统一的 `PasswordStr` 类型,避免每个项目重复实现。
318
+ > 该 validator 建议下沉为项目级统一的 `PasswordStr` 类型,避免每个模块重复实现。
365
319
 
366
320
  ### 7.3 接口认证与授权
367
321
 
368
322
  - 所有 API **必须** JWT 认证(白名单除外:`/health` / `/auth/login` / `/auth/register`)
369
- - JWT 创建与解码**必须**走 dwyeapi 安全模块,**禁止**直接调用 PyJWT
323
+ - JWT 创建与解码**必须**走项目级统一安全模块,**禁止**散落直接调用 PyJWT
370
324
  - Token 黑名单存 Redis(登出后失效,TTL = 剩余有效期)
371
325
  - Secret Key 必须从环境变量读取,**禁止**硬编码
372
326
  - Secret Key 长度与生成方式(按字节算,不按字符算):
@@ -389,7 +343,7 @@ class UserCreate(BaseModel):
389
343
 
390
344
  - **禁止**直接返回 ORM 对象(可能暴露 password、内部 ID 等)
391
345
  - 列表接口**必须**分页,**禁止**返回全量数据
392
- - PII 字段(手机号 / 邮箱 / 身份证 / 银行卡 / 姓名 / 地址 / IP / 车牌)必须使用 dwyeapi 脱敏函数处理
346
+ - PII 字段(手机号 / 邮箱 / 身份证 / 银行卡 / 姓名 / 地址 / IP / 车牌)必须使用项目级统一脱敏函数处理
393
347
 
394
348
  ### 7.5 错误处理安全
395
349
 
@@ -449,7 +403,7 @@ file_path = Path("/uploads") / safe_name
449
403
 
450
404
  ### 7.8 审计日志
451
405
 
452
- 通过 dwyeapi 日志模块获取审计 logger,记录以下操作:
406
+ 通过项目级统一日志模块获取审计 logger,记录以下操作:
453
407
 
454
408
  | 操作 | 记录内容 |
455
409
  |------|---------|
@@ -510,8 +464,7 @@ AI 编写或审查后端代码时,**必须**检查以下违规模式,按严
510
464
 
511
465
  | 检查项 | 违规模式 | 严重程度 |
512
466
  |--------|---------|---------|
513
- | 重复造轮子 | 自造异常基类 / 自封装统一响应 / 手写 bcrypt 或 JWT 调用 / 自建 Redis 连接池 等 dwyeapi 已提供能力 | 高 |
514
- | 未查 skill | 调用 dwyeapi 能力域却未先查 `dwy-eapi` skill 拿当前 API | 高 |
467
+ | 重复造轮子 | 自造异常基类 / 自封装统一响应 / 散落手写 bcrypt 或 JWT 调用 / 自建 Redis 连接池 等本应走项目级统一模块的能力 | 高 |
515
468
  | 技术层散落 | 顶级出现 `routers/` / `services/` / `models/` / `schemas/` 等技术层目录把不同功能文件混放,未按功能聚合 | 高 |
516
469
  | 测试与源码混放 | 测试文件放在源码目录中(如 `app/users/test_router.py`),未独立到测试目录 | 高 |
517
470
  | 密码明文 | `password` 字段出现在 Response Schema | **致命 → STOP** |
@@ -528,5 +481,5 @@ AI 编写或审查后端代码时,**必须**检查以下违规模式,按严
528
481
  | service 抛 HTTPException | service 层直接 `raise HTTPException` | 高 |
529
482
  | 路由中开会话 | 路由函数中 `async with session_factory()` | 高 |
530
483
  | 旧式查询 | `session.query(...)` 而非 `select(...)` | 高 |
531
- | `datetime.now()` 直用 | 业务代码直接 `datetime.now()` 而非走 dwyeapi 时间模块 | 高 |
484
+ | `datetime.now()` 直用 | 业务代码直接 `datetime.now()` 而非走项目级统一时间模块 | 高 |
532
485
  | 物理删除业务数据 | 对业务数据执行物理删除 | 中 |
@@ -0,0 +1,89 @@
1
+ ---
2
+ description: 团队内部 dwyeapi 基础框架库强制复用规范(配置 / 异常 / 响应 / 分页 / ORM / 安全 / 缓存 / 时间 / 脱敏 / 日志:禁重复造轮子)
3
+ paths:
4
+ - "**/*.py"
5
+ ---
6
+
7
+ # Python 后端 dwyeapi 基础库强制复用规范
8
+
9
+ `dwy-python-backend` rule 的团队内补充。通用 FastAPI / SQLAlchemy / 安全编码规范见 `dwy-python-backend`;本文件只管「凡 dwyeapi 已提供的能力,禁止自行实现,也禁止引入其他库重复造轮子」。
10
+
11
+ `dwyeapi` 是团队内部 PyPI 基础设施包,已封装后端项目所需的通用能力。
12
+
13
+ ---
14
+
15
+ ## 一、必须复用 dwyeapi 的能力域
16
+
17
+ | 能力域 | 内容 |
18
+ |--------|------|
19
+ | 配置管理 | 应用 Settings 基类、运行环境识别(dev / prod) |
20
+ | 异常体系 | 业务异常基类与全局异常处理器注册 |
21
+ | 统一响应 | `{ code, message, data, timestamp }` 包装 |
22
+ | 分页 | 分页查询参数模型与分页响应封装 |
23
+ | 数据库 | ORM 声明式基类、时间戳 Mixin、异步引擎与会话工厂 |
24
+ | 依赖注入 | FastAPI `get_db` 工厂 |
25
+ | 安全 | 密码哈希、JWT 创建与解码 |
26
+ | 缓存 | 共享异步 Redis 客户端 |
27
+ | 时间 | 业务时间统一入口(Asia/Shanghai) |
28
+ | 脱敏 | PII 数据脱敏函数 |
29
+ | 日志 | 全局日志配置与门面 |
30
+ | 健康检查 | 健康检查路由工厂 |
31
+ | 异步任务 | 耗时任务队列与上下文 |
32
+ | 邮件 | 邮件验证码可插拔通道 |
33
+
34
+ ### 查阅方式(关键)
35
+
36
+ **在编写任何后端代码前,以及调用任何 dwyeapi 提供的 API 之前,必须先用 `Skill` 工具加载 `dwy-eapi` skill 查阅当前最新接口。** 本文件**只规定约束与边界**,**不固化** dwyeapi 的具体模块路径、类名、函数签名、参数 —— 这些会随版本演进,固化在 rules 里会与实际包不同步。
37
+
38
+ ```
39
+ Skill 工具调用:skill="dwy-eapi"
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 二、强制规则
45
+
46
+ - 涉及上表任一能力域,**先查 skill 拿到当前 API,再写代码**
47
+ - **禁止**自造异常基类,必须复用 dwyeapi 异常体系
48
+ - **禁止**手写 bcrypt / PyJWT 调用,必须走 dwyeapi 安全模块
49
+ - **禁止**自定义统一响应包装函数,必须用 dwyeapi 响应模块
50
+ - **禁止**自定义分页模型,必须用 dwyeapi 分页模块
51
+ - **禁止**自定义 `DeclarativeBase`,模型必须继承 dwyeapi 提供的基类
52
+ - **禁止**在路由函数中直接创建数据库会话,必须用 dwyeapi 依赖工厂
53
+ - **禁止**自建 Redis 连接池,必须用 dwyeapi 共享客户端
54
+ - **禁止**在业务代码中直接使用 `datetime.now()`,必须用 dwyeapi 时间模块
55
+ - **禁止**自行 `logging.basicConfig`,必须用 dwyeapi 日志模块
56
+
57
+ ---
58
+
59
+ ## 三、各能力域 dwyeapi 落点
60
+
61
+ 通用规范(路由 / Schema / ORM / 安全编码本身的要求)见 `dwy-python-backend` 对应章节;本节只说明这些规范在团队项目里**必须落到哪个 dwyeapi 模块**。
62
+
63
+ | 能力 | 团队项目落点 | 对应通用规范 |
64
+ |------|-------------|-------------|
65
+ | 统一响应 / 异常 | dwyeapi 响应模块 + 异常体系(禁自造) | backend 二、五 |
66
+ | 分页 | dwyeapi 分页模块(禁自定义) | backend 二 |
67
+ | ORM 基类 / 时间戳 | 继承 dwyeapi 声明式基类与 Mixin | backend 六 |
68
+ | `get_db` 依赖 | dwyeapi 依赖工厂 | backend 四 |
69
+ | 密码哈希 | dwyeapi 安全模块(bcrypt,禁手写) | backend 7.2 |
70
+ | JWT 创建 / 解码 | dwyeapi 安全模块(禁直接 PyJWT) | backend 7.3 |
71
+ | PII 脱敏 | dwyeapi 脱敏函数 | backend 7.4 |
72
+ | 审计日志 | dwyeapi 日志模块获取审计 logger | backend 7.8 |
73
+ | 业务时间 | dwyeapi 时间模块(禁裸 `datetime.now()`) | backend 六 / 七 |
74
+ | Redis 缓存 | dwyeapi 共享客户端(禁自建连接池) | backend 八 |
75
+
76
+ > 密码复杂度校验建议下沉到 dwyeapi 提供统一的 `PasswordStr` 类型,避免每个项目重复实现。
77
+
78
+ ---
79
+
80
+ ## 四、违规检测清单(dwyeapi 相关)
81
+
82
+ 通用后端违规清单见 `dwy-python-backend` 第十节;涉及 dwyeapi 必须额外检查:
83
+
84
+ | 检查项 | 违规模式 | 严重程度 |
85
+ |--------|---------|---------|
86
+ | 重复造轮子 | 自造异常基类 / 自封装统一响应 / 手写 bcrypt 或 JWT 调用 / 自建 Redis 连接池 等 dwyeapi 已提供能力 | 高 |
87
+ | 未查 skill | 调用 dwyeapi 能力域却未先查 `dwy-eapi` skill 拿当前 API | 高 |
88
+ | 密码弱存储 | 使用 MD5 / SHA 而非 dwyeapi 安全模块的 bcrypt | **致命 → STOP** |
89
+ | `datetime.now()` 直用 | 业务代码直接 `datetime.now()` 而非走 dwyeapi 时间模块 | 高 |
@@ -0,0 +1,49 @@
1
+ ---
2
+ description: Python 后端开发避坑清单(FastAPI / SQLAlchemy / async / 依赖 / 部署踩坑),按分类持续追加
3
+ paths:
4
+ - "**/*.py"
5
+ - "**/pyproject.toml"
6
+ - "**/uv.lock"
7
+ ---
8
+
9
+ # Python 开发坑清单
10
+
11
+ > 动手前先对照本清单避开已知坑;踩到新坑随手按四栏格式(现象 / 根因 / 正确做法 / 适用)追加到对应分类,没有合适分类就新建一个。
12
+ >
13
+ > 通用开发规范见 `dwy-python-core` / `dwy-python-backend` rule,本文件只记**非显而易见的实战坑**。
14
+
15
+ ## 分类索引
16
+
17
+ - 依赖与环境(uv / venv / 版本)
18
+ - async / 并发(事件循环、阻塞调用、连接池)
19
+ - FastAPI / Pydantic(路由、Schema、校验、序列化)
20
+ - SQLAlchemy / ORM(异步 session、懒加载、事务)
21
+ - 部署与运行时(打包、环境变量、进程模型)
22
+ - 排查方法论
23
+ - 其他分类遇到再加
24
+
25
+ ---
26
+
27
+ ## 依赖与环境
28
+
29
+ <!-- 待填:踩到坑按四栏格式追加 -->
30
+
31
+ ## async / 并发
32
+
33
+ <!-- 待填 -->
34
+
35
+ ## FastAPI / Pydantic
36
+
37
+ <!-- 待填 -->
38
+
39
+ ## SQLAlchemy / ORM
40
+
41
+ <!-- 待填 -->
42
+
43
+ ## 部署与运行时
44
+
45
+ <!-- 待填 -->
46
+
47
+ ## 排查方法论
48
+
49
+ <!-- 待填 -->