@qlover/create-app 0.7.13 → 0.7.15

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 (93) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/templates/next-app/README.en.md +131 -0
  5. package/dist/templates/next-app/README.md +115 -20
  6. package/dist/templates/next-app/config/IOCIdentifier.ts +14 -1
  7. package/dist/templates/next-app/config/Identifier/index.ts +1 -0
  8. package/dist/templates/next-app/config/Identifier/page.admin.ts +48 -0
  9. package/dist/templates/next-app/config/i18n/admin18n.ts +33 -0
  10. package/dist/templates/next-app/config/i18n/index.ts +3 -1
  11. package/dist/templates/next-app/docs/en/api.md +387 -0
  12. package/dist/templates/next-app/docs/en/component.md +544 -0
  13. package/dist/templates/next-app/docs/en/database.md +496 -0
  14. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  15. package/dist/templates/next-app/docs/en/env.md +563 -0
  16. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  17. package/dist/templates/next-app/docs/en/index.md +166 -0
  18. package/dist/templates/next-app/docs/en/page.md +457 -0
  19. package/dist/templates/next-app/docs/en/project-structure.md +177 -0
  20. package/dist/templates/next-app/docs/en/router.md +427 -0
  21. package/dist/templates/next-app/docs/en/theme.md +532 -0
  22. package/dist/templates/next-app/docs/en/validator.md +478 -0
  23. package/dist/templates/next-app/docs/zh/api.md +387 -0
  24. package/dist/templates/next-app/docs/zh/component.md +544 -0
  25. package/dist/templates/next-app/docs/zh/database.md +496 -0
  26. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  27. package/dist/templates/next-app/docs/zh/env.md +563 -0
  28. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  29. package/dist/templates/next-app/docs/zh/index.md +166 -0
  30. package/dist/templates/next-app/docs/zh/page.md +457 -0
  31. package/dist/templates/next-app/docs/zh/project-structure.md +177 -0
  32. package/dist/templates/next-app/docs/zh/router.md +427 -0
  33. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  34. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  35. package/dist/templates/next-app/migrations/schema/UserSchema.ts +2 -2
  36. package/dist/templates/next-app/next.config.ts +1 -1
  37. package/dist/templates/next-app/package.json +3 -1
  38. package/dist/templates/next-app/public/locales/en.json +8 -1
  39. package/dist/templates/next-app/public/locales/zh.json +8 -1
  40. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +1 -1
  41. package/dist/templates/next-app/src/app/[locale]/admin/page.tsx +14 -16
  42. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +10 -3
  43. package/dist/templates/next-app/src/app/[locale]/layout.tsx +1 -1
  44. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +1 -1
  45. package/dist/templates/next-app/src/app/[locale]/page.tsx +2 -3
  46. package/dist/templates/next-app/src/app/[locale]/register/page.tsx +1 -1
  47. package/dist/templates/next-app/src/app/api/ai/completions/route.ts +32 -0
  48. package/dist/templates/next-app/src/base/cases/AppConfig.ts +3 -0
  49. package/dist/templates/next-app/src/base/cases/ChatAction.ts +21 -0
  50. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +36 -0
  51. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +1 -3
  52. package/dist/templates/next-app/src/base/services/AdminUserService.ts +1 -1
  53. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +1 -1
  54. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +23 -1
  55. package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +2 -2
  56. package/dist/templates/next-app/src/base/types/PageProps.ts +1 -1
  57. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +1 -0
  58. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +1 -0
  59. package/dist/templates/next-app/src/core/globals.ts +2 -0
  60. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +4 -1
  61. package/dist/templates/next-app/src/{base/cases → server}/PageParams.ts +1 -1
  62. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +31 -0
  63. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +1 -1
  64. package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +6 -4
  65. package/dist/templates/next-app/src/server/services/AIService.ts +43 -0
  66. package/dist/templates/next-app/src/server/services/ApiUserService.ts +1 -1
  67. package/dist/templates/next-app/src/server/{SupabaseBridge.ts → sqlBridges/SupabaseBridge.ts} +16 -11
  68. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +4 -4
  69. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +1 -1
  70. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +32 -25
  71. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +12 -26
  72. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +37 -5
  73. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +17 -0
  74. package/dist/templates/next-app/src/uikit/components/ClientSeo.tsx +36 -0
  75. package/dist/templates/next-app/src/uikit/components/LanguageSwitcher.tsx +5 -6
  76. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +2 -0
  77. package/dist/templates/next-app/src/uikit/components/With.tsx +17 -0
  78. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +30 -0
  79. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +65 -0
  80. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +59 -0
  81. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +28 -0
  82. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +19 -0
  83. package/package.json +1 -1
  84. package/dist/templates/next-app/docs/env.md +0 -94
  85. package/dist/templates/next-app/src/base/port/DBBridgeInterface.ts +0 -21
  86. package/dist/templates/next-app/src/base/port/DBMigrationInterface.ts +0 -92
  87. package/dist/templates/next-app/src/base/port/MigrationApiInterface.ts +0 -3
  88. package/dist/templates/next-app/src/base/port/ServerApiResponseInterface.ts +0 -6
  89. package/dist/templates/next-app/src/base/services/migrations/MigrationsApi.ts +0 -43
  90. package/dist/templates/next-app/config/i18n/{HomeI18n .ts → HomeI18n.ts} +0 -0
  91. package/dist/templates/next-app/{build → make}/generateLocales.ts +2 -2
  92. /package/dist/templates/next-app/src/{base → server}/port/PaginationInterface.ts +0 -0
  93. /package/dist/templates/next-app/src/{base → server}/port/ParamsHandlerInterface.ts +0 -0
@@ -0,0 +1,727 @@
1
+ # 开发规范指南
2
+
3
+ ## 目录
4
+
5
+ 1. [项目结构规范](#项目结构规范)
6
+ 2. [代码风格规范](#代码风格规范)
7
+ 3. [组件开发规范](#组件开发规范)
8
+ 4. [状态管理规范](#状态管理规范)
9
+ 5. [路由开发规范](#路由开发规范)
10
+ 6. [国际化开发规范](#国际化开发规范)
11
+ 7. [主题样式规范](#主题样式规范)
12
+ 8. [测试规范](#测试规范)
13
+ 9. [文档规范](#文档规范)
14
+
15
+ ## 项目结构规范
16
+
17
+ > 💡 这里仅列出基本规范,完整的项目结构说明请参考 [项目结构文档](./project-structure.md)
18
+
19
+ ### 1. 目录结构
20
+
21
+ ```
22
+ src/
23
+ ├── base/ # 基础功能实现
24
+ │ ├── cases/ # 业务场景实现
25
+ │ ├── services/ # 核心服务实现
26
+ │ └── types/ # 类型定义
27
+ ├── core/ # 核心功能
28
+ │ ├── bootstraps/ # 启动相关
29
+ │ ├── clientIoc/ # 客户端 IOC 实现
30
+ │ ├── serverIoc/ # 服务端 IOC 实现
31
+ │ └── globals.ts # 全局变量
32
+ ├── pages/ # 页面组件
33
+ │ ├── auth/ # 认证相关页面
34
+ │ └── base/ # 基础页面
35
+ ├── styles/ # 样式文件
36
+ │ └── css/
37
+ │ ├── themes/ # 主题相关
38
+ │ └── antd-themes/ # Ant Design 主题
39
+ ├── uikit/ # UI 组件库
40
+ │ ├── components/ # 通用组件
41
+ │ ├── contexts/ # React Context
42
+ │ ├── hooks/ # 自定义 Hooks
43
+ │ └── providers/ # 提供者组件
44
+ └── App.tsx # 应用入口
45
+ ```
46
+
47
+ ### 2. 应用启动流程
48
+
49
+ #### 2.1 客户端启动流程
50
+
51
+ 客户端的启动流程由 `BootstrapClient` 类负责,主要包含以下步骤:
52
+
53
+ 1. **初始化 IOC 容器**
54
+
55
+ ```typescript
56
+ // 创建 IOC 容器实例
57
+ const clientIOC = new ClientIOC();
58
+ const ioc = clientIOC.create();
59
+ ```
60
+
61
+ 2. **注册依赖**
62
+ - 通过 `ClientIOCRegister` 注册全局依赖和服务
63
+ - 主要包括三类注册:
64
+
65
+ ```typescript
66
+ // 1. 注册全局依赖
67
+ registerGlobals(ioc: IOCContainerInterface) {
68
+ ioc.bind(I.JSONSerializer, JSON);
69
+ ioc.bind(I.Logger, logger);
70
+ ioc.bind(I.AppConfig, appConfig);
71
+ ioc.bind(I.DialogHandler, dialogHandler);
72
+ }
73
+
74
+ // 2. 注册核心服务实现
75
+ registerImplement(ioc: IOCContainerInterface) {
76
+ ioc.bind(I.I18nServiceInterface, new I18nService());
77
+ ioc.bind(I.RouterServiceInterface, ioc.get(RouterService));
78
+ ioc.bind(I.UserServiceInterface, ioc.get(UserService));
79
+ }
80
+
81
+ // 3. 注册通用服务和插件
82
+ registerCommon(ioc: IOCContainerInterface) {
83
+ // 注册请求插件、Mock插件等
84
+ }
85
+ ```
86
+
87
+ 3. **启动应用**
88
+
89
+ ```typescript
90
+ export class BootstrapClient {
91
+ static async main(args: BootstrapAppArgs) {
92
+ const bootstrap = new Bootstrap({
93
+ root,
94
+ logger,
95
+ ioc: { manager: IOC },
96
+ globalOptions: { sources: globals }
97
+ });
98
+
99
+ // 初始化启动器
100
+ await bootstrap.initialize();
101
+
102
+ // 注册启动插件
103
+ const bootstrapsRegistry = new BootstrapsRegistry(args);
104
+ await bootstrap.use(bootstrapsRegistry.register()).start();
105
+ }
106
+ }
107
+ ```
108
+
109
+ 4. **启动插件注册**
110
+ ```typescript
111
+ class BootstrapsRegistry {
112
+ register(): BootstrapExecutorPlugin[] {
113
+ return [
114
+ i18nService, // 国际化服务
115
+ new AppUserApiBootstrap(), // 用户 API
116
+ printBootstrap, // 开发环境打印
117
+ IocIdentifierTest // IOC 标识符测试
118
+ ];
119
+ }
120
+ }
121
+ ```
122
+
123
+ #### 2.2 服务端启动流程
124
+
125
+ 服务端的启动流程由 `BootstrapServer` 类负责,主要包含以下步骤:
126
+
127
+ 1. **初始化 IOC 容器**
128
+
129
+ ```typescript
130
+ export class ServerIOC {
131
+ static create(): ServerIOC {
132
+ if (this.instance) return this.instance;
133
+ this.instance = new ServerIOC();
134
+ return this.instance;
135
+ }
136
+
137
+ create() {
138
+ this.ioc = createIOCFunction<IOCIdentifierMapServer>(
139
+ new InversifyContainer()
140
+ );
141
+ const register = new ServerIOCRegister({
142
+ appConfig: new AppConfig()
143
+ });
144
+ register.register(this.ioc.implemention!, this.ioc);
145
+ return this.ioc;
146
+ }
147
+ }
148
+ ```
149
+
150
+ 2. **注册服务端依赖**
151
+ - 通过 `ServerIOCRegister` 注册服务端特有的依赖:
152
+
153
+ ```typescript
154
+ class ServerIOCRegister {
155
+ // 1. 注册全局依赖
156
+ registerGlobals(ioc: IOCContainerInterface) {
157
+ ioc.bind(I.AppConfig, appConfig);
158
+ ioc.bind(
159
+ I.Logger,
160
+ new Logger({
161
+ handlers: new ConsoleHandler(new TimestampFormatter()),
162
+ level: appConfig.env === 'development' ? 'debug' : 'info'
163
+ })
164
+ );
165
+ }
166
+
167
+ // 2. 注册服务端实现
168
+ registerImplement(ioc: IOCContainerInterface) {
169
+ ioc.bind(I.DBBridgeInterface, ioc.get(SupabaseBridge));
170
+ }
171
+ }
172
+ ```
173
+
174
+ 3. **服务器启动**
175
+
176
+ ```typescript
177
+ export class BootstrapServer implements ServerInterface {
178
+ constructor() {
179
+ const serverIOC = ServerIOC.create();
180
+ const ioc = serverIOC.create();
181
+ const logger = ioc(I.Logger);
182
+
183
+ this.executor = new AsyncExecutor();
184
+ this.IOC = ioc;
185
+ this.logger = logger;
186
+ }
187
+
188
+ // 注册服务端插件
189
+ use(plugin: BootstrapExecutorPlugin): this {
190
+ this.executor.use(plugin);
191
+ return this;
192
+ }
193
+
194
+ // 执行启动任务
195
+ execNoError(task?: PromiseTask) {
196
+ const context = {
197
+ logger: this.logger,
198
+ root: this.root,
199
+ ioc: this.IOC.implemention!,
200
+ IOC: this.IOC
201
+ };
202
+ return this.executor.execNoError(context, task);
203
+ }
204
+ }
205
+ ```
206
+
207
+ ### 3. IOC 容器使用
208
+
209
+ #### 3.1 获取服务实例
210
+
211
+ ```typescript
212
+ // 在组件中使用
213
+ function UserProfile() {
214
+ const userService = IOC(UserService);
215
+ const i18nService = IOC(I.I18nServiceInterface);
216
+
217
+ // 使用服务...
218
+ }
219
+ ```
220
+
221
+ #### 3.2 注册新服务
222
+
223
+ ```typescript
224
+ // 1. 定义服务接口
225
+ interface MyServiceInterface {
226
+ doSomething(): void;
227
+ }
228
+
229
+ // 2. 添加 IOC 标识符
230
+ export const IOCIdentifier = {
231
+ MyService: Symbol('MyService')
232
+ } as const;
233
+
234
+ // 3. 实现服务
235
+ @injectable()
236
+ class MyService implements MyServiceInterface {
237
+ doSomething() {
238
+ // 实现...
239
+ }
240
+ }
241
+
242
+ // 4. 在 IOC 注册器中注册
243
+ class ClientIOCRegister {
244
+ registerImplement(ioc: IOCContainerInterface) {
245
+ ioc.bind(I.MyService, ioc.get(MyService));
246
+ }
247
+ }
248
+ ```
249
+
250
+ ### 2. 命名规范
251
+
252
+ - **文件命名**:
253
+ - 组件文件:`PascalCase.tsx`(如:`UserProfile.tsx`)
254
+ - 工具文件:`camelCase.ts`(如:`formatDate.ts`)
255
+ - 类型文件:`PascalCase.types.ts`(如:`User.types.ts`)
256
+ - 样式文件:`camelCase.css`(如:`buttonStyles.css`)
257
+
258
+ - **目录命名**:
259
+ - 全小写,使用连字符分隔(如:`user-profile/`)
260
+ - 功能模块使用单数形式(如:`auth/`,而不是 `auths/`)
261
+
262
+ ## 代码风格规范
263
+
264
+ > 💡 这里仅列出基本规范,更多 TypeScript 和 React 开发规范请参考 [TypeScript 开发规范](./typescript-guide.md)
265
+
266
+ ### 1. TypeScript 规范
267
+
268
+ ```typescript
269
+ // 使用 interface 定义对象类型
270
+ interface UserProfile {
271
+ id: string;
272
+ name: string;
273
+ age?: number; // 可选属性使用 ?
274
+ }
275
+
276
+ // 使用 type 定义联合类型或工具类型
277
+ type Theme = 'light' | 'dark' | 'pink';
278
+ type Nullable<T> = T | null;
279
+
280
+ // 使用 enum 定义常量枚举
281
+ enum UserRole {
282
+ ADMIN = 'ADMIN',
283
+ USER = 'USER',
284
+ GUEST = 'GUEST'
285
+ }
286
+
287
+ // 函数类型声明
288
+ function processUser(user: UserProfile): void {
289
+ // 实现
290
+ }
291
+
292
+ // 泛型使用有意义的名称
293
+ interface Repository<TEntity> {
294
+ find(id: string): Promise<TEntity>;
295
+ }
296
+ ```
297
+
298
+ ### 2. React 规范
299
+
300
+ ```tsx
301
+ // 函数组件使用 FC 类型
302
+ interface Props {
303
+ name: string;
304
+ age: number;
305
+ }
306
+
307
+ const UserCard: FC<Props> = ({ name, age }) => {
308
+ return (
309
+ <div>
310
+ <h3>{name}</h3>
311
+ <p>{age}</p>
312
+ </div>
313
+ );
314
+ };
315
+
316
+ // Hooks 规范
317
+ const useUser = (userId: string) => {
318
+ const [user, setUser] = useState<UserProfile | null>(null);
319
+ const [loading, setLoading] = useState(false);
320
+
321
+ useEffect(() => {
322
+ // 实现
323
+ }, [userId]);
324
+
325
+ return { user, loading };
326
+ };
327
+ ```
328
+
329
+ ## 组件开发规范
330
+
331
+ > 💡 这里仅列出基本规范,完整的组件开发指南请参考 [组件开发指南](./component-guide.md)
332
+
333
+ ### 1. 组件分类
334
+
335
+ - **页面组件**:放在 `pages/` 目录下
336
+ - **业务组件**:放在对应业务模块目录下
337
+ - **通用组件**:放在 `uikit/components/` 目录下
338
+ - **布局组件**:放在 `uikit/layouts/` 目录下
339
+
340
+ ### 2. 组件实现
341
+
342
+ ```tsx
343
+ // 1. 导入顺序
344
+ import { FC, useEffect, useState } from 'react'; // React 相关
345
+ import { useTranslation } from 'react-i18next'; // 第三方库
346
+ import { UserService } from '@/services/user'; // 项目内部导入
347
+ import { Button } from './Button'; // 相对路径导入
348
+
349
+ // 2. 类型定义
350
+ interface Props {
351
+ userId: string;
352
+ onUpdate?: (user: User) => void;
353
+ }
354
+
355
+ // 3. 组件实现
356
+ export const UserProfile: FC<Props> = ({ userId, onUpdate }) => {
357
+ // 3.1 Hooks 声明
358
+ const { t } = useTranslation();
359
+ const [user, setUser] = useState<User | null>(null);
360
+
361
+ // 3.2 副作用
362
+ useEffect(() => {
363
+ // 实现
364
+ }, [userId]);
365
+
366
+ // 3.3 事件处理
367
+ const handleUpdate = () => {
368
+ // 实现
369
+ };
370
+
371
+ // 3.4 渲染方法
372
+ const renderHeader = () => {
373
+ return <h2>{user?.name}</h2>;
374
+ };
375
+
376
+ // 3.5 返回 JSX
377
+ return (
378
+ <div>
379
+ {renderHeader()}
380
+ <Button onClick={handleUpdate}>{t('common.update')}</Button>
381
+ </div>
382
+ );
383
+ };
384
+ ```
385
+
386
+ ## 状态管理规范
387
+
388
+ > 💡 这里仅列出基本规范,完整的状态管理指南请参考 [Store 开发指南](./store.md)
389
+
390
+ ### 1. Store 实现
391
+
392
+ ```typescript
393
+ // 1. 状态接口定义
394
+ interface UserState extends StoreStateInterface {
395
+ currentUser: User | null;
396
+ loading: boolean;
397
+ error: string | null;
398
+ }
399
+
400
+ // 2. Store 实现
401
+ @injectable()
402
+ export class UserStore extends StoreInterface<UserState> {
403
+ constructor() {
404
+ super(() => ({
405
+ currentUser: null,
406
+ loading: false,
407
+ error: null
408
+ }));
409
+ }
410
+
411
+ // 3. 选择器定义
412
+ selector = {
413
+ currentUser: (state: UserState) => state.currentUser,
414
+ loading: (state: UserState) => state.loading
415
+ };
416
+
417
+ // 4. 操作方法
418
+ async fetchUser(id: string) {
419
+ try {
420
+ this.emit({ ...this.state, loading: true });
421
+ const user = await api.getUser(id);
422
+ this.emit({ ...this.state, currentUser: user, loading: false });
423
+ } catch (error) {
424
+ this.emit({
425
+ ...this.state,
426
+ error: error.message,
427
+ loading: false
428
+ });
429
+ }
430
+ }
431
+ }
432
+ ```
433
+
434
+ ### 2. Store 使用
435
+
436
+ ```tsx
437
+ function UserProfile() {
438
+ const userStore = IOC(UserStore);
439
+ const user = useStore(userStore, userStore.selector.currentUser);
440
+ const loading = useStore(userStore, userStore.selector.loading);
441
+
442
+ return <div>{loading ? <Loading /> : <UserInfo user={user} />}</div>;
443
+ }
444
+ ```
445
+
446
+ ## 路由开发规范
447
+
448
+ > 💡 这里仅列出基本规范,完整的路由开发指南请参考 [路由开发指南](./router.md)
449
+
450
+ ### 1. 基本规范
451
+
452
+ - 路由配置集中管理在 `config/app.router.ts` 中
453
+ - 使用声明式路由配置
454
+ - 路由组件放置在 `pages` 目录下
455
+ - 支持路由级别的代码分割
456
+ - 路由配置包含元数据支持
457
+
458
+ ### 2. 示例
459
+
460
+ ```typescript
461
+ // 路由配置示例
462
+ export const baseRoutes: RouteConfigValue[] = [
463
+ {
464
+ path: '/:lng',
465
+ element: 'base/Layout',
466
+ meta: {
467
+ category: 'main'
468
+ },
469
+ children: [
470
+ {
471
+ path: 'users',
472
+ element: 'users/UserList',
473
+ meta: {
474
+ title: i18nKeys.PAGE_USERS_TITLE,
475
+ auth: true
476
+ }
477
+ }
478
+ ]
479
+ }
480
+ ];
481
+ ```
482
+
483
+ 更多路由配置和使用示例,请参考 [路由开发指南](./router.md)。
484
+
485
+ ## 国际化开发规范
486
+
487
+ > 💡 这里仅列出基本规范,完整的国际化开发指南请参考 [国际化开发指南](./i18n.md)
488
+
489
+ ### 1. 基本规范
490
+
491
+ - 使用标识符常量管理翻译键
492
+ - 通过 TypeScript 注释生成翻译资源
493
+ - 支持多语言路由
494
+ - 集中管理翻译文件
495
+
496
+ ### 2. 示例
497
+
498
+ ```typescript
499
+ /**
500
+ * @description User list page title
501
+ * @localZh 用户列表
502
+ * @localEn User List
503
+ */
504
+ export const PAGE_USERS_TITLE = 'page.users.title';
505
+ ```
506
+
507
+ 更多国际化配置和使用示例,请参考 [国际化开发指南](./i18n.md)。
508
+
509
+ ## 主题样式规范
510
+
511
+ > 💡 这里仅列出基本规范,完整的主题开发指南请参考 [主题开发指南](./theme.md)
512
+
513
+ ### 1. 基本规范
514
+
515
+ - 使用 CSS 变量管理主题
516
+ - 遵循 Tailwind CSS 使用规范
517
+ - 组件样式模块化
518
+ - 支持多主题切换
519
+
520
+ ### 2. 示例
521
+
522
+ ```css
523
+ :root {
524
+ --color-brand: 37 99 235;
525
+ --text-primary: 15 23 42;
526
+ }
527
+ ```
528
+
529
+ 更多主题配置和使用示例,请参考 [主题开发指南](./theme.md)。
530
+
531
+ ## 测试规范
532
+
533
+ > 💡 这里仅列出基本规范,完整的测试指南请参考 [测试开发指南](./testing.md)
534
+
535
+ ### 1. 基本规范
536
+
537
+ - 单元测试覆盖核心逻辑
538
+ - 组件测试关注交互和渲染
539
+ - 使用 Jest 和 Testing Library
540
+ - 保持测试简单和可维护
541
+
542
+ ### 2. 示例
543
+
544
+ ```typescript
545
+ describe('UserProfile', () => {
546
+ it('should render user info', () => {
547
+ const user = { id: '1', name: 'Test' };
548
+ render(<UserProfile user={user} />);
549
+ expect(screen.getByText(user.name)).toBeInTheDocument();
550
+ });
551
+ });
552
+ ```
553
+
554
+ 更多测试示例和最佳实践,请参考 [测试开发指南](./testing.md)。
555
+
556
+ ## 文档规范
557
+
558
+ > 💡 这里仅列出基本规范,完整的文档编写指南请参考 [文档编写指南](./documentation.md)
559
+
560
+ ### 1. 代码注释
561
+
562
+ ```typescript
563
+ /**
564
+ * 用户服务
565
+ *
566
+ * @description 处理用户相关的业务逻辑
567
+ * @example
568
+ * const userService = IOC(UserService);
569
+ * await userService.login(credentials);
570
+ */
571
+ @injectable()
572
+ export class UserService {
573
+ /**
574
+ * 用户登录
575
+ *
576
+ * @param credentials - 登录凭证
577
+ * @returns 登录成功的用户信息
578
+ * @throws {AuthError} 认证失败时抛出
579
+ */
580
+ async login(credentials: Credentials): Promise<User> {
581
+ // 实现
582
+ }
583
+ }
584
+ ```
585
+
586
+ ### 2. 文档结构
587
+
588
+ - **README.md**:项目概述、安装说明、快速开始
589
+ - **docs/**:
590
+ - `zh/`:中文文档
591
+ - `en/`:英文文档
592
+ - 按功能模块组织文档文件
593
+
594
+ ### 3. 文档格式
595
+
596
+ ```markdown
597
+ # 模块名称
598
+
599
+ ## 概述
600
+
601
+ 简要说明模块的功能和用途。
602
+
603
+ ## 使用方式
604
+
605
+ 代码示例和使用说明。
606
+
607
+ ## API 文档
608
+
609
+ 详细的 API 说明。
610
+
611
+ ## 最佳实践
612
+
613
+ 使用建议和注意事项。
614
+ ```
615
+
616
+ ## Git 提交规范
617
+
618
+ > 💡 这里仅列出基本规范,完整的 Git 工作流程请参考 [Git 工作流指南](./git-workflow.md)
619
+
620
+ ### 1. 提交消息格式
621
+
622
+ ```
623
+ <type>(<scope>): <subject>
624
+
625
+ <body>
626
+
627
+ <footer>
628
+ ```
629
+
630
+ - **type**:
631
+ - `feat`:新功能
632
+ - `fix`:修复
633
+ - `docs`:文档更新
634
+ - `style`:代码格式(不影响代码运行的变动)
635
+ - `refactor`:重构
636
+ - `test`:增加测试
637
+ - `chore`:构建过程或辅助工具的变动
638
+
639
+ - **scope**:影响范围(可选)
640
+ - **subject**:简短描述
641
+ - **body**:详细描述(可选)
642
+ - **footer**:不兼容变动、关闭 issue(可选)
643
+
644
+ ### 2. 示例
645
+
646
+ ```
647
+ feat(auth): 添加用户角色管理功能
648
+
649
+ - 添加角色创建和编辑界面
650
+ - 实现角色权限配置
651
+ - 添加角色分配功能
652
+
653
+ Closes #123
654
+ ```
655
+
656
+ ## 性能优化规范
657
+
658
+ > 💡 这里仅列出基本规范,完整的性能优化指南请参考 [性能优化指南](./performance.md)
659
+
660
+ ### 1. 代码分割
661
+
662
+ ```typescript
663
+ // 路由级别的代码分割
664
+ const UserModule = lazy(() => import('./pages/users'));
665
+
666
+ // 组件级别的代码分割
667
+ const HeavyComponent = lazy(() => import('./components/Heavy'));
668
+ ```
669
+
670
+ ### 2. 性能考虑
671
+
672
+ ```typescript
673
+ // 使用 useMemo 缓存计算结果
674
+ const sortedUsers = useMemo(() => {
675
+ return users.sort((a, b) => a.name.localeCompare(b.name));
676
+ }, [users]);
677
+
678
+ // 使用 useCallback 缓存函数
679
+ const handleUpdate = useCallback(() => {
680
+ // 实现
681
+ }, [dependencies]);
682
+
683
+ // 使用 React.memo 避免不必要的重渲染
684
+ const UserCard = React.memo(({ user }) => {
685
+ return <div>{user.name}</div>;
686
+ });
687
+ ```
688
+
689
+ ## 安全规范
690
+
691
+ > 💡 这里仅列出基本规范,完整的安全开发指南请参考 [安全开发指南](./security.md)
692
+
693
+ ### 1. 数据处理
694
+
695
+ ```typescript
696
+ // 敏感数据加密
697
+ const encryptedData = encrypt(sensitiveData);
698
+
699
+ // XSS 防护
700
+ const sanitizedHtml = sanitizeHtml(userInput);
701
+
702
+ // CSRF 防护
703
+ api.defaults.headers['X-CSRF-Token'] = getCsrfToken();
704
+ ```
705
+
706
+ ### 2. 权限控制
707
+
708
+ ```typescript
709
+ // 路由权限
710
+ const PrivateRoute: FC = ({ children }) => {
711
+ const auth = useAuth();
712
+ return auth.isAuthenticated ? children : <Navigate to="/login" />;
713
+ };
714
+
715
+ // 操作权限
716
+ function AdminPanel() {
717
+ const { hasPermission } = useAuth();
718
+
719
+ return (
720
+ <div>
721
+ {hasPermission('ADMIN') && (
722
+ <button>管理员操作</button>
723
+ )}
724
+ </div>
725
+ );
726
+ }
727
+ ```