schema-dsl 1.2.4 → 2.0.0

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 (242) hide show
  1. package/CHANGELOG.md +87 -210
  2. package/README.md +391 -2249
  3. package/dist/DslBuilder-DQDN0ZxZ.d.cts +341 -0
  4. package/dist/DslBuilder-DkLaOo9Q.d.ts +341 -0
  5. package/dist/Validator-C7GsVQOH.d.cts +192 -0
  6. package/dist/Validator-hFWKGxir.d.ts +192 -0
  7. package/dist/index.cjs +6594 -0
  8. package/dist/index.d.cts +1145 -0
  9. package/dist/index.d.ts +1145 -0
  10. package/dist/index.js +6528 -0
  11. package/dist/plugin-CIKtTMtS.d.cts +246 -0
  12. package/dist/plugin-CIKtTMtS.d.ts +246 -0
  13. package/dist/plugins/custom-format.cjs +3802 -0
  14. package/dist/plugins/custom-format.d.cts +12 -0
  15. package/dist/plugins/custom-format.d.ts +12 -0
  16. package/dist/plugins/custom-format.js +3772 -0
  17. package/dist/plugins/custom-type-example.cjs +3795 -0
  18. package/dist/plugins/custom-type-example.d.cts +8 -0
  19. package/dist/plugins/custom-type-example.d.ts +8 -0
  20. package/dist/plugins/custom-type-example.js +3765 -0
  21. package/dist/plugins/custom-validator.cjs +146 -0
  22. package/dist/plugins/custom-validator.d.cts +10 -0
  23. package/dist/plugins/custom-validator.d.ts +10 -0
  24. package/dist/plugins/custom-validator.js +121 -0
  25. package/docs/FEATURE-INDEX.md +102 -68
  26. package/docs/add-custom-locale.md +48 -35
  27. package/docs/add-keyword.md +24 -0
  28. package/docs/api-reference.md +396 -154
  29. package/docs/api.md +13 -0
  30. package/docs/best-practices-project-structure.md +19 -10
  31. package/docs/best-practices.md +93 -53
  32. package/docs/cache-manager.md +23 -15
  33. package/docs/compile.md +45 -0
  34. package/docs/conditional-api.md +40 -11
  35. package/docs/custom-extensions-guide.md +80 -152
  36. package/docs/design-philosophy.md +76 -71
  37. package/docs/doc-index.md +324 -0
  38. package/docs/dsl-syntax.md +69 -19
  39. package/docs/dynamic-locale.md +24 -14
  40. package/docs/enum.md +12 -5
  41. package/docs/error-handling.md +53 -44
  42. package/docs/export-guide.md +47 -8
  43. package/docs/export-limitations.md +27 -11
  44. package/docs/faq.md +86 -67
  45. package/docs/frontend-i18n-guide.md +26 -12
  46. package/docs/i18n-user-guide.md +60 -47
  47. package/docs/i18n.md +51 -32
  48. package/docs/index.md +48 -0
  49. package/docs/json-schema-basics.md +40 -0
  50. package/docs/label-vs-description.md +12 -3
  51. package/docs/markdown-exporter.md +15 -6
  52. package/docs/mongodb-exporter.md +11 -4
  53. package/docs/multi-language.md +26 -0
  54. package/docs/multi-type-support.md +26 -33
  55. package/docs/mysql-exporter.md +9 -2
  56. package/docs/number-operators.md +12 -5
  57. package/docs/optional-marker-guide.md +28 -23
  58. package/docs/performance-guide.md +49 -0
  59. package/docs/plugin-system.md +205 -366
  60. package/docs/plugin-type-registration.md +34 -0
  61. package/docs/postgresql-exporter.md +9 -2
  62. package/docs/public/favicon.svg +5 -0
  63. package/docs/quick-start.md +37 -363
  64. package/docs/runtime-locale-support.md +20 -9
  65. package/docs/schema-helper.md +10 -5
  66. package/docs/schema-utils-advanced-issues.md +23 -0
  67. package/docs/schema-utils-best-practices.md +20 -0
  68. package/docs/schema-utils-chaining.md +7 -0
  69. package/docs/schema-utils.md +76 -42
  70. package/docs/security-checklist.md +20 -0
  71. package/docs/string-extensions.md +17 -9
  72. package/docs/troubleshooting.md +36 -21
  73. package/docs/type-converter.md +41 -50
  74. package/docs/type-reference.md +38 -15
  75. package/docs/typescript-guide.md +53 -42
  76. package/docs/union-type-guide.md +11 -1
  77. package/docs/union-types.md +10 -3
  78. package/docs/validate-async.md +36 -25
  79. package/docs/validate-batch.md +49 -0
  80. package/docs/validate-dsl-object-support.md +33 -28
  81. package/docs/validate.md +36 -16
  82. package/docs/validation-guide.md +25 -7
  83. package/docs/validator.md +39 -0
  84. package/package.json +85 -27
  85. package/plugins/custom-format.cjs +8 -0
  86. package/plugins/custom-type-example.cjs +8 -0
  87. package/plugins/custom-validator.cjs +8 -0
  88. package/src/adapters/DslAdapter.ts +111 -0
  89. package/src/adapters/index.ts +1 -0
  90. package/src/config/constants.ts +83 -0
  91. package/src/config/index.ts +2 -0
  92. package/src/config/patterns.ts +77 -0
  93. package/src/core/CacheManager.ts +159 -0
  94. package/src/core/ConditionalBuilder.ts +382 -0
  95. package/src/core/ConditionalRuntime.ts +28 -0
  96. package/src/core/ConditionalValidator.ts +255 -0
  97. package/src/core/DslBuilder.ts +677 -0
  98. package/src/core/ErrorCodes.ts +38 -0
  99. package/src/core/ErrorFormatter.ts +271 -0
  100. package/src/core/JSONSchemaCore.ts +65 -0
  101. package/src/core/Locale.ts +187 -0
  102. package/src/core/MessageTemplate.ts +42 -0
  103. package/src/core/ObjectDslBuilder.ts +64 -0
  104. package/src/core/PluginManager.ts +326 -0
  105. package/src/core/StringExtensions.ts +140 -0
  106. package/src/core/TemplateEngine.ts +44 -0
  107. package/src/core/Validator.ts +448 -0
  108. package/src/errors/I18nError.ts +159 -0
  109. package/src/errors/ValidationError.ts +105 -0
  110. package/src/exporters/BaseExporter.ts +60 -0
  111. package/src/exporters/MarkdownExporter.ts +305 -0
  112. package/src/exporters/MongoDBExporter.ts +126 -0
  113. package/src/exporters/MySQLExporter.ts +155 -0
  114. package/src/exporters/PostgreSQLExporter.ts +222 -0
  115. package/src/exporters/index.ts +18 -0
  116. package/src/index.ts +633 -0
  117. package/{lib/locales/en-US.js → src/locales/en-US.ts} +21 -37
  118. package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +63 -16
  119. package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +74 -27
  120. package/src/locales/index.ts +103 -0
  121. package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +59 -17
  122. package/src/locales/types.ts +156 -0
  123. package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +21 -38
  124. package/src/parser/ConstraintParser.ts +101 -0
  125. package/src/parser/DslParser.ts +470 -0
  126. package/src/parser/SchemaCompiler.ts +66 -0
  127. package/src/parser/TypeRegistry.ts +250 -0
  128. package/src/parser/index.ts +6 -0
  129. package/src/plugins/custom-format.ts +126 -0
  130. package/src/plugins/custom-type-example.ts +108 -0
  131. package/src/plugins/custom-validator.ts +140 -0
  132. package/src/types/conditional.ts +28 -0
  133. package/src/types/config.ts +59 -0
  134. package/src/types/dsl.ts +131 -0
  135. package/src/types/error.ts +60 -0
  136. package/src/types/index.ts +17 -0
  137. package/src/types/infer.ts +128 -0
  138. package/src/types/plugin.ts +58 -0
  139. package/src/types/safe-regex.d.ts +9 -0
  140. package/src/types/schema.ts +66 -0
  141. package/src/types/validate.ts +71 -0
  142. package/src/utils/SchemaHelper.ts +196 -0
  143. package/src/utils/SchemaUtils.ts +346 -0
  144. package/src/utils/TypeConverter.ts +215 -0
  145. package/src/utils/index.ts +10 -0
  146. package/src/validators/CustomKeywords.ts +477 -0
  147. package/.eslintignore +0 -11
  148. package/.eslintrc.json +0 -27
  149. package/CONTRIBUTING.md +0 -368
  150. package/STATUS.md +0 -491
  151. package/changelogs/v1.0.0.md +0 -328
  152. package/changelogs/v1.0.9.md +0 -367
  153. package/changelogs/v1.1.0.md +0 -389
  154. package/changelogs/v1.1.1.md +0 -308
  155. package/changelogs/v1.1.2.md +0 -183
  156. package/changelogs/v1.1.3.md +0 -161
  157. package/changelogs/v1.1.4.md +0 -432
  158. package/changelogs/v1.1.5.md +0 -493
  159. package/changelogs/v1.1.6.md +0 -211
  160. package/changelogs/v1.1.8.md +0 -376
  161. package/changelogs/v1.2.3.md +0 -124
  162. package/docs/INDEX.md +0 -252
  163. package/docs/issues-resolved-summary.md +0 -196
  164. package/docs/performance-benchmark-report.md +0 -179
  165. package/docs/performance-quick-reference.md +0 -123
  166. package/docs/user-questions-answered.md +0 -353
  167. package/docs/validation-rules-v1.0.2.md +0 -1608
  168. package/examples/README.md +0 -81
  169. package/examples/array-dsl-example.js +0 -227
  170. package/examples/conditional-example.js +0 -288
  171. package/examples/conditional-non-object.js +0 -129
  172. package/examples/conditional-validate-example.js +0 -321
  173. package/examples/custom-extension.js +0 -85
  174. package/examples/dsl-match-example.js +0 -74
  175. package/examples/dsl-style.js +0 -118
  176. package/examples/dynamic-locale-configuration.js +0 -348
  177. package/examples/dynamic-locale-example.js +0 -287
  178. package/examples/enum.examples.js +0 -324
  179. package/examples/export-demo.js +0 -130
  180. package/examples/express-integration.js +0 -376
  181. package/examples/i18n-error-handling-complete.js +0 -381
  182. package/examples/i18n-error-handling-quickstart.md +0 -0
  183. package/examples/i18n-error.examples.js +0 -181
  184. package/examples/i18n-full-demo.js +0 -301
  185. package/examples/i18n-memory-safety.examples.js +0 -268
  186. package/examples/markdown-export.js +0 -71
  187. package/examples/middleware-usage.js +0 -93
  188. package/examples/new-features-comparison.js +0 -315
  189. package/examples/password-reset/README.md +0 -153
  190. package/examples/password-reset/schema.js +0 -26
  191. package/examples/password-reset/test.js +0 -101
  192. package/examples/plugin-system.examples.js +0 -205
  193. package/examples/schema-utils-chaining.examples.js +0 -250
  194. package/examples/simple-example.js +0 -122
  195. package/examples/slug.examples.js +0 -179
  196. package/examples/string-extensions.js +0 -297
  197. package/examples/union-type-example.js +0 -127
  198. package/examples/union-types-example.js +0 -77
  199. package/examples/user-registration/README.md +0 -156
  200. package/examples/user-registration/routes.js +0 -92
  201. package/examples/user-registration/schema.js +0 -150
  202. package/examples/user-registration/server.js +0 -74
  203. package/index.d.ts +0 -3540
  204. package/index.js +0 -457
  205. package/index.mjs +0 -60
  206. package/lib/adapters/DslAdapter.js +0 -871
  207. package/lib/adapters/index.js +0 -20
  208. package/lib/config/constants.js +0 -286
  209. package/lib/config/patterns/common.js +0 -47
  210. package/lib/config/patterns/creditCard.js +0 -9
  211. package/lib/config/patterns/idCard.js +0 -9
  212. package/lib/config/patterns/index.js +0 -9
  213. package/lib/config/patterns/licensePlate.js +0 -4
  214. package/lib/config/patterns/passport.js +0 -4
  215. package/lib/config/patterns/phone.js +0 -9
  216. package/lib/config/patterns/postalCode.js +0 -5
  217. package/lib/core/CacheManager.js +0 -376
  218. package/lib/core/ConditionalBuilder.js +0 -503
  219. package/lib/core/DslBuilder.js +0 -1400
  220. package/lib/core/ErrorCodes.js +0 -233
  221. package/lib/core/ErrorFormatter.js +0 -445
  222. package/lib/core/JSONSchemaCore.js +0 -347
  223. package/lib/core/Locale.js +0 -130
  224. package/lib/core/MessageTemplate.js +0 -98
  225. package/lib/core/PluginManager.js +0 -448
  226. package/lib/core/StringExtensions.js +0 -240
  227. package/lib/core/Validator.js +0 -654
  228. package/lib/errors/I18nError.js +0 -328
  229. package/lib/errors/ValidationError.js +0 -191
  230. package/lib/exporters/MarkdownExporter.js +0 -420
  231. package/lib/exporters/MongoDBExporter.js +0 -162
  232. package/lib/exporters/MySQLExporter.js +0 -212
  233. package/lib/exporters/PostgreSQLExporter.js +0 -289
  234. package/lib/exporters/index.js +0 -24
  235. package/lib/locales/index.js +0 -8
  236. package/lib/utils/LRUCache.js +0 -174
  237. package/lib/utils/SchemaHelper.js +0 -240
  238. package/lib/utils/SchemaUtils.js +0 -445
  239. package/lib/utils/TypeConverter.js +0 -245
  240. package/lib/utils/index.js +0 -13
  241. package/lib/validators/CustomKeywords.js +0 -616
  242. package/lib/validators/index.js +0 -11
@@ -1,156 +0,0 @@
1
- # 用户注册系统示例
2
-
3
- 完整的企业级用户注册验证示例,展示 SchemaIO 的所有高级功能。
4
-
5
- ## 功能展示
6
-
7
- - ✅ 错误消息定制
8
- - ✅ 字段标签
9
- - ✅ 多语言支持
10
- - ✅ 异步验证(数据库检查)
11
- - ✅ 密码强度验证
12
- - ✅ 字段引用(密码确认)
13
- - ✅ 自定义验证器
14
- - ✅ Express路由集成
15
-
16
- ## 文件结构
17
-
18
- ```
19
- examples/user-registration/
20
- ├── README.md # 本文件
21
- ├── schema.js # Schema定义
22
- ├── routes.js # Express路由
23
- ├── database.js # 模拟数据库
24
- └── server.js # 服务器启动
25
- ```
26
-
27
- ## 快速开始
28
-
29
- ### 1. 安装依赖
30
-
31
- ```bash
32
- npm install express body-parser
33
- ```
34
-
35
- ### 2. 启动服务器
36
-
37
- ```bash
38
- node examples/user-registration/server.js
39
- ```
40
-
41
- ### 3. 测试API
42
-
43
- ```bash
44
- # 成功注册
45
- curl -X POST http://localhost:3000/api/register \
46
- -H "Content-Type: application/json" \
47
- -d '{
48
- "username": "john_doe",
49
- "email": "john@example.com",
50
- "password": "Password123",
51
- "confirmPassword": "Password123",
52
- "phone": "13800138000"
53
- }'
54
-
55
- # 验证失败(用户名太短)
56
- curl -X POST http://localhost:3000/api/register \
57
- -H "Content-Type: application/json" \
58
- -d '{
59
- "username": "ab",
60
- "email": "john@example.com",
61
- "password": "Password123",
62
- "confirmPassword": "Password123",
63
- "phone": "13800138000"
64
- }'
65
-
66
- # 密码不一致
67
- curl -X POST http://localhost:3000/api/register \
68
- -H "Content-Type: application/json" \
69
- -d '{
70
- "username": "john_doe",
71
- "email": "john@example.com",
72
- "password": "Password123",
73
- "confirmPassword": "Different123",
74
- "phone": "13800138000"
75
- }'
76
- ```
77
-
78
- ## 多语言测试
79
-
80
- ```bash
81
- # 中文错误消息
82
- curl -X POST http://localhost:3000/api/register \
83
- -H "Content-Type: application/json" \
84
- -H "Accept-Language: zh-CN" \
85
- -d '{ "username": "ab" }'
86
-
87
- # 英文错误消息
88
- curl -X POST http://localhost:3000/api/register \
89
- -H "Content-Type: application/json" \
90
- -H "Accept-Language: en-US" \
91
- -d '{ "username": "ab" }'
92
- ```
93
-
94
- ## Schema说明
95
-
96
- 详见 `schema.js` 文件,包含:
97
-
98
- - 用户名:3-32字符,字母数字下划线,自动转小写
99
- - 邮箱:自动转小写,去空格,异步检查重复
100
- - 密码:8-64字符,必须包含大小写字母和数字
101
- - 确认密码:必须与密码字段一致
102
- - 手机号:中国大陆11位,异步检查重复
103
-
104
- ## 响应格式
105
-
106
- ### 成功响应
107
-
108
- ```json
109
- {
110
- "success": true,
111
- "data": {
112
- "userId": "507f1f77bcf86cd799439011",
113
- "username": "john_doe"
114
- }
115
- }
116
- ```
117
-
118
- ### 验证失败响应
119
-
120
- ```json
121
- {
122
- "success": false,
123
- "code": "VALIDATION_ERROR",
124
- "message": "请检查输入信息",
125
- "errors": [
126
- {
127
- "field": "username",
128
- "message": "用户名长度不能少于3个字符",
129
- "code": "string.min",
130
- "context": {
131
- "label": "用户名",
132
- "limit": 3,
133
- "value": "ab"
134
- }
135
- }
136
- ]
137
- }
138
- ```
139
-
140
- ## 技术要点
141
-
142
- 1. **错误消息定制**: 每个字段都有友好的中文错误提示
143
- 2. **字段标签**: 使用 `.label()` 设置字段的友好名称
144
- 3. **异步验证**: 使用 `.custom()` 实现数据库重复检查
145
- 4. **密码确认**: 使用 `.valid(ref('password'))` 引用密码字段
146
- 5. **自动转换**: 使用 `.lowercase()` 和 `.trim()` 自动清洗数据
147
- 6. **多语言**: 根据 `Accept-Language` 头自动切换语言
148
-
149
- ## 扩展建议
150
-
151
- 1. 添加验证码验证
152
- 2. 添加邀请码功能
153
- 3. 集成真实数据库(MongoDB/MySQL)
154
- 4. 添加邮箱验证
155
- 5. 添加手机号验证码
156
-
@@ -1,92 +0,0 @@
1
- /**
2
- * Express路由实现
3
- * 展示如何在实际项目中使用SchemaIO
4
- */
5
-
6
- const express = require('express');
7
- const { createRegisterSchema, db } = require('./schema');
8
-
9
- const router = express.Router();
10
-
11
- /**
12
- * 注册API
13
- * POST /api/register
14
- */
15
- router.post('/register', async (req, res) => {
16
- try {
17
- // 获取用户语言(从请求头)
18
- const userLang = req.headers['accept-language'] || 'zh-CN';
19
- const lang = userLang.startsWith('zh') ? 'zh-CN' : 'en-US';
20
-
21
- // 创建Schema
22
- const schema = createRegisterSchema(lang);
23
-
24
- // 验证数据(传入整个body作为context用于password确认)
25
- const result = await schema.validate(req.body, {
26
- abortEarly: false, // 收集所有错误
27
- context: req.body // 传递上下文给自定义验证器
28
- });
29
-
30
- if (!result.isValid) {
31
- return res.status(400).json({
32
- success: false,
33
- code: 'VALIDATION_ERROR',
34
- message: lang === 'zh-CN' ? '请检查输入信息' : 'Please check your input',
35
- errors: result.errors.map(err => ({
36
- field: err.path ? err.path.join('.') : err.context?.key,
37
- message: err.message,
38
- code: err.type,
39
- context: err.context
40
- }))
41
- });
42
- }
43
-
44
- // 创建用户(模拟)
45
- const newUser = {
46
- id: Date.now().toString(),
47
- username: result.data.username,
48
- email: result.data.email,
49
- phone: result.data.phone,
50
- createdAt: new Date().toISOString()
51
- };
52
-
53
- db.users.push(newUser);
54
-
55
- // 返回成功
56
- res.json({
57
- success: true,
58
- message: lang === 'zh-CN' ? '注册成功' : 'Registration successful',
59
- data: {
60
- userId: newUser.id,
61
- username: newUser.username
62
- }
63
- });
64
-
65
- } catch (error) {
66
- console.error('注册失败:', error);
67
- res.status(500).json({
68
- success: false,
69
- code: 'SERVER_ERROR',
70
- message: '服务器内部错误'
71
- });
72
- }
73
- });
74
-
75
- /**
76
- * 获取已注册用户列表(测试用)
77
- * GET /api/users
78
- */
79
- router.get('/users', (req, res) => {
80
- res.json({
81
- success: true,
82
- data: db.users.map(u => ({
83
- username: u.username,
84
- email: u.email,
85
- phone: u.phone
86
- }))
87
- });
88
- });
89
-
90
- module.exports = router;
91
-
92
-
@@ -1,150 +0,0 @@
1
- /**
2
- * 用户注册Schema定义 v2.0.1
3
- *
4
- * 展示所有高级功能:
5
- * - ✨ String扩展链式调用
6
- * - 错误消息定制
7
- * - 字段标签
8
- * - 多语言支持
9
- * - 自定义验证器(异步)
10
- */
11
-
12
- const { dsl } = require('../../index');
13
- const Locale = require('../../lib/core/Locale');
14
-
15
- // 模拟数据库
16
- const db = {
17
- users: [
18
- { username: 'admin', email: 'admin@example.com', phone: '13800138000' }
19
- ]
20
- };
21
-
22
- /**
23
- * 检查用户名是否已存在
24
- */
25
- async function checkUsernameExists(username) {
26
- return new Promise((resolve) => {
27
- setTimeout(() => {
28
- const exists = db.users.some(u => u.username === username);
29
- resolve(exists);
30
- }, 100);
31
- });
32
- }
33
-
34
- /**
35
- * 检查邮箱是否已存在
36
- */
37
- async function checkEmailExists(email) {
38
- return new Promise((resolve) => {
39
- setTimeout(() => {
40
- const exists = db.users.some(u => u.email === email);
41
- resolve(exists);
42
- }, 100);
43
- });
44
- }
45
-
46
- /**
47
- * 检查手机号是否已存在
48
- */
49
- async function checkPhoneExists(phone) {
50
- return new Promise((resolve) => {
51
- setTimeout(() => {
52
- const exists = db.users.some(u => u.phone === phone);
53
- resolve(exists);
54
- }, 100);
55
- });
56
- }
57
-
58
- /**
59
- * 注册Schema定义(使用 v2.0.1 String扩展)
60
- */
61
- function createRegisterSchema(lang = 'zh-CN') {
62
- // 设置语言
63
- Locale.setLocale(lang);
64
-
65
- return dsl({
66
- // ✨ 用户名:String扩展 + 自定义验证
67
- username: 'string:3-32!'
68
- .pattern(/^[a-zA-Z0-9_]+$/)
69
- .label('用户名')
70
- .messages({
71
- 'min': '{{#label}}长度不能少于{{#limit}}个字符',
72
- 'max': '{{#label}}长度不能超过{{#limit}}个字符',
73
- 'pattern': '{{#label}}只能包含字母、数字和下划线'
74
- })
75
- .custom(async (value) => {
76
- const exists = await checkUsernameExists(value);
77
- if (exists) {
78
- return { error: 'username.exists', message: '用户名已被占用,请换一个试试' };
79
- }
80
- return true;
81
- }),
82
-
83
- // ✨ 邮箱:String扩展 + 异步验证
84
- email: 'email!'
85
- .label('邮箱地址')
86
- .messages({
87
- 'format.email': '请输入有效的{{#label}}'
88
- })
89
- .custom(async (value) => {
90
- const exists = await checkEmailExists(value);
91
- if (exists) {
92
- return { error: 'email.exists', message: '该邮箱已被注册' };
93
- }
94
- return true;
95
- }),
96
-
97
- // ✨ 密码:String扩展 + 复杂正则
98
- password: 'string:8-64!'
99
- .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/)
100
- .label('密码')
101
- .messages({
102
- 'min': '{{#label}}长度不能少于{{#limit}}位',
103
- 'max': '{{#label}}长度不能超过{{#limit}}位',
104
- 'pattern': '{{#label}}必须包含大小写字母和数字'
105
- }),
106
-
107
- // ✨ 确认密码:String扩展
108
- confirmPassword: 'string!'
109
- .label('确认密码')
110
- .messages({
111
- 'password.mismatch': '两次输入的密码不一致'
112
- })
113
- .custom((value, context) => {
114
- // 临时实现:手动检查password字段
115
- if (context && context.password && value !== context.password) {
116
- return { error: 'password.mismatch', message: '两次输入的密码不一致' };
117
- }
118
- return true;
119
- })
120
- .required(),
121
-
122
- // ✨ 手机号:String扩展 + 异步验证
123
- phone: 'string:11!'
124
- .pattern(/^1[3-9]\d{9}$/)
125
- .label('手机号')
126
- .messages({
127
- 'pattern': '请输入正确的{{#label}}格式'
128
- })
129
- .custom(async (value) => {
130
- const exists = await checkPhoneExists(value);
131
- if (exists) {
132
- return { error: 'phone.exists', message: '该手机号已被注册' };
133
- }
134
- return true;
135
- }),
136
-
137
- // 简单字段:纯DSL
138
- agreeTerms: 'boolean!'
139
- });
140
- }
141
-
142
- module.exports = {
143
- createRegisterSchema,
144
- db,
145
- checkUsernameExists,
146
- checkEmailExists,
147
- checkPhoneExists
148
- };
149
-
150
-
@@ -1,74 +0,0 @@
1
- /**
2
- * 用户注册服务器
3
- *
4
- * 启动方法:node examples/user-registration/server.js
5
- */
6
-
7
- const express = require('express');
8
- const bodyParser = require('body-parser');
9
- const routes = require('./routes');
10
-
11
- const app = express();
12
- const PORT = process.env.PORT || 3000;
13
-
14
- // 中间件
15
- app.use(bodyParser.json());
16
- app.use(bodyParser.urlencoded({ extended: true }));
17
-
18
- // 路由
19
- app.use('/api', routes);
20
-
21
- // 首页
22
- app.get('/', (req, res) => {
23
- res.send(`
24
- <h1>SchemaIO 用户注册示例</h1>
25
- <p>请使用POST请求测试API:</p>
26
- <pre>
27
- POST http://localhost:${PORT}/api/register
28
- Content-Type: application/json
29
- Accept-Language: zh-CN
30
-
31
- {
32
- "username": "john_doe",
33
- "email": "john@example.com",
34
- "password": "Password123",
35
- "confirmPassword": "Password123",
36
- "phone": "13800138001",
37
- "agreeTerms": true
38
- }
39
- </pre>
40
- <p><a href="/api/users">查看已注册用户</a></p>
41
- `);
42
- });
43
-
44
- // 错误处理
45
- app.use((err, req, res, next) => {
46
- console.error(err.stack);
47
- res.status(500).json({
48
- success: false,
49
- code: 'SERVER_ERROR',
50
- message: '服务器内部错误'
51
- });
52
- });
53
-
54
- // 启动服务器
55
- app.listen(PORT, () => {
56
- console.log(`
57
- ========================================
58
- 用户注册示例服务器已启动
59
- ========================================
60
- 地址: http://localhost:${PORT}
61
- API: http://localhost:${PORT}/api/register
62
-
63
- 测试命令:
64
- curl -X POST http://localhost:${PORT}/api/register \\
65
- -H "Content-Type: application/json" \\
66
- -H "Accept-Language: zh-CN" \\
67
- -d '{"username":"test","email":"test@example.com","password":"Password123","confirmPassword":"Password123","phone":"13800138001","agreeTerms":true}'
68
- ========================================
69
- `);
70
- });
71
-
72
- module.exports = app;
73
-
74
-