@qlover/create-app 0.7.14 → 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.
- package/CHANGELOG.md +23 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/templates/next-app/README.en.md +131 -0
- package/dist/templates/next-app/README.md +115 -20
- package/dist/templates/next-app/docs/en/api.md +387 -0
- package/dist/templates/next-app/docs/en/component.md +544 -0
- package/dist/templates/next-app/docs/en/database.md +496 -0
- package/dist/templates/next-app/docs/en/development-guide.md +727 -0
- package/dist/templates/next-app/docs/en/env.md +563 -0
- package/dist/templates/next-app/docs/en/i18n.md +287 -0
- package/dist/templates/next-app/docs/en/index.md +166 -0
- package/dist/templates/next-app/docs/en/page.md +457 -0
- package/dist/templates/next-app/docs/en/project-structure.md +177 -0
- package/dist/templates/next-app/docs/en/router.md +427 -0
- package/dist/templates/next-app/docs/en/theme.md +532 -0
- package/dist/templates/next-app/docs/en/validator.md +478 -0
- package/dist/templates/next-app/docs/zh/api.md +387 -0
- package/dist/templates/next-app/docs/zh/component.md +544 -0
- package/dist/templates/next-app/docs/zh/database.md +496 -0
- package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
- package/dist/templates/next-app/docs/zh/env.md +563 -0
- package/dist/templates/next-app/docs/zh/i18n.md +287 -0
- package/dist/templates/next-app/docs/zh/index.md +166 -0
- package/dist/templates/next-app/docs/zh/page.md +457 -0
- package/dist/templates/next-app/docs/zh/project-structure.md +177 -0
- package/dist/templates/next-app/docs/zh/router.md +427 -0
- package/dist/templates/next-app/docs/zh/theme.md +532 -0
- package/dist/templates/next-app/docs/zh/validator.md +476 -0
- package/package.json +1 -1
- package/dist/templates/next-app/docs/env.md +0 -94
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
# Development Guidelines
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [Project Structure Guidelines](#project-structure-guidelines)
|
|
6
|
+
2. [Code Style Guidelines](#code-style-guidelines)
|
|
7
|
+
3. [Component Development Guidelines](#component-development-guidelines)
|
|
8
|
+
4. [State Management Guidelines](#state-management-guidelines)
|
|
9
|
+
5. [Router Development Guidelines](#router-development-guidelines)
|
|
10
|
+
6. [Internationalization Guidelines](#internationalization-guidelines)
|
|
11
|
+
7. [Theme Style Guidelines](#theme-style-guidelines)
|
|
12
|
+
8. [Testing Guidelines](#testing-guidelines)
|
|
13
|
+
9. [Documentation Guidelines](#documentation-guidelines)
|
|
14
|
+
|
|
15
|
+
## Project Structure Guidelines
|
|
16
|
+
|
|
17
|
+
> 💡 These are just basic guidelines. For complete project structure documentation, please refer to [Project Structure Documentation](./project-structure.md)
|
|
18
|
+
|
|
19
|
+
### 1. Directory Structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
src/
|
|
23
|
+
├── base/ # Base functionality implementation
|
|
24
|
+
│ ├── cases/ # Business case implementation
|
|
25
|
+
│ ├── services/ # Core service implementation
|
|
26
|
+
│ └── types/ # Type definitions
|
|
27
|
+
├── core/ # Core functionality
|
|
28
|
+
│ ├── bootstraps/ # Startup related
|
|
29
|
+
│ ├── clientIoc/ # Client IOC implementation
|
|
30
|
+
│ ├── serverIoc/ # Server IOC implementation
|
|
31
|
+
│ └── globals.ts # Global variables
|
|
32
|
+
├── pages/ # Page components
|
|
33
|
+
│ ├── auth/ # Authentication related pages
|
|
34
|
+
│ └── base/ # Base pages
|
|
35
|
+
├── styles/ # Style files
|
|
36
|
+
│ └── css/
|
|
37
|
+
│ ├── themes/ # Theme related
|
|
38
|
+
│ └── antd-themes/ # Ant Design themes
|
|
39
|
+
├── uikit/ # UI component library
|
|
40
|
+
│ ├── components/ # Common components
|
|
41
|
+
│ ├── contexts/ # React Context
|
|
42
|
+
│ ├── hooks/ # Custom Hooks
|
|
43
|
+
│ └── providers/ # Provider components
|
|
44
|
+
└── App.tsx # Application entry
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 2. Application Bootstrap Process
|
|
48
|
+
|
|
49
|
+
#### 2.1 Client Bootstrap Process
|
|
50
|
+
|
|
51
|
+
The client bootstrap process is handled by the `BootstrapClient` class, mainly including the following steps:
|
|
52
|
+
|
|
53
|
+
1. **Initialize IOC Container**
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Create IOC container instance
|
|
57
|
+
const clientIOC = new ClientIOC();
|
|
58
|
+
const ioc = clientIOC.create();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2. **Register Dependencies**
|
|
62
|
+
- Register global dependencies and services through `ClientIOCRegister`
|
|
63
|
+
- Mainly includes three types of registration:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// 1. Register global dependencies
|
|
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. Register core service implementations
|
|
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. Register common services and plugins
|
|
82
|
+
registerCommon(ioc: IOCContainerInterface) {
|
|
83
|
+
// Register request plugins, Mock plugins, etc.
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
3. **Start Application**
|
|
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
|
+
// Initialize bootstrapper
|
|
100
|
+
await bootstrap.initialize();
|
|
101
|
+
|
|
102
|
+
// Register bootstrap plugins
|
|
103
|
+
const bootstrapsRegistry = new BootstrapsRegistry(args);
|
|
104
|
+
await bootstrap.use(bootstrapsRegistry.register()).start();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
4. **Bootstrap Plugin Registration**
|
|
110
|
+
```typescript
|
|
111
|
+
class BootstrapsRegistry {
|
|
112
|
+
register(): BootstrapExecutorPlugin[] {
|
|
113
|
+
return [
|
|
114
|
+
i18nService, // Internationalization service
|
|
115
|
+
new AppUserApiBootstrap(), // User API
|
|
116
|
+
printBootstrap, // Development environment printing
|
|
117
|
+
IocIdentifierTest // IOC identifier test
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### 2.2 Server Bootstrap Process
|
|
124
|
+
|
|
125
|
+
The server bootstrap process is handled by the `BootstrapServer` class, mainly including the following steps:
|
|
126
|
+
|
|
127
|
+
1. **Initialize IOC Container**
|
|
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. **Register Server Dependencies**
|
|
151
|
+
- Register server-specific dependencies through `ServerIOCRegister`:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
class ServerIOCRegister {
|
|
155
|
+
// 1. Register global dependencies
|
|
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. Register server implementations
|
|
168
|
+
registerImplement(ioc: IOCContainerInterface) {
|
|
169
|
+
ioc.bind(I.DBBridgeInterface, ioc.get(SupabaseBridge));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
3. **Server Startup**
|
|
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
|
+
// Register server plugins
|
|
189
|
+
use(plugin: BootstrapExecutorPlugin): this {
|
|
190
|
+
this.executor.use(plugin);
|
|
191
|
+
return this;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Execute startup tasks
|
|
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 Container Usage
|
|
208
|
+
|
|
209
|
+
#### 3.1 Get Service Instance
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// Use in components
|
|
213
|
+
function UserProfile() {
|
|
214
|
+
const userService = IOC(UserService);
|
|
215
|
+
const i18nService = IOC(I.I18nServiceInterface);
|
|
216
|
+
|
|
217
|
+
// Use services...
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
#### 3.2 Register New Service
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// 1. Define service interface
|
|
225
|
+
interface MyServiceInterface {
|
|
226
|
+
doSomething(): void;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// 2. Add IOC identifier
|
|
230
|
+
export const IOCIdentifier = {
|
|
231
|
+
MyService: Symbol('MyService')
|
|
232
|
+
} as const;
|
|
233
|
+
|
|
234
|
+
// 3. Implement service
|
|
235
|
+
@injectable()
|
|
236
|
+
class MyService implements MyServiceInterface {
|
|
237
|
+
doSomething() {
|
|
238
|
+
// Implementation...
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 4. Register in IOC registrar
|
|
243
|
+
class ClientIOCRegister {
|
|
244
|
+
registerImplement(ioc: IOCContainerInterface) {
|
|
245
|
+
ioc.bind(I.MyService, ioc.get(MyService));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 2. Naming Conventions
|
|
251
|
+
|
|
252
|
+
- **File Naming**:
|
|
253
|
+
- Component files: `PascalCase.tsx` (e.g., `UserProfile.tsx`)
|
|
254
|
+
- Utility files: `camelCase.ts` (e.g., `formatDate.ts`)
|
|
255
|
+
- Type files: `PascalCase.types.ts` (e.g., `User.types.ts`)
|
|
256
|
+
- Style files: `camelCase.css` (e.g., `buttonStyles.css`)
|
|
257
|
+
|
|
258
|
+
- **Directory Naming**:
|
|
259
|
+
- All lowercase, using hyphens (e.g., `user-profile/`)
|
|
260
|
+
- Feature modules use singular form (e.g., `auth/`, not `auths/`)
|
|
261
|
+
|
|
262
|
+
## Code Style Guidelines
|
|
263
|
+
|
|
264
|
+
> 💡 These are just basic guidelines. For more TypeScript and React development guidelines, please refer to [TypeScript Development Guidelines](./typescript-guide.md)
|
|
265
|
+
|
|
266
|
+
### 1. TypeScript Guidelines
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// Use interface for object types
|
|
270
|
+
interface UserProfile {
|
|
271
|
+
id: string;
|
|
272
|
+
name: string;
|
|
273
|
+
age?: number; // Optional properties use ?
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Use type for union types or utility types
|
|
277
|
+
type Theme = 'light' | 'dark' | 'pink';
|
|
278
|
+
type Nullable<T> = T | null;
|
|
279
|
+
|
|
280
|
+
// Use enum for constant enumerations
|
|
281
|
+
enum UserRole {
|
|
282
|
+
ADMIN = 'ADMIN',
|
|
283
|
+
USER = 'USER',
|
|
284
|
+
GUEST = 'GUEST'
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Function type declarations
|
|
288
|
+
function processUser(user: UserProfile): void {
|
|
289
|
+
// Implementation
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Use meaningful names for generics
|
|
293
|
+
interface Repository<TEntity> {
|
|
294
|
+
find(id: string): Promise<TEntity>;
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### 2. React Guidelines
|
|
299
|
+
|
|
300
|
+
```tsx
|
|
301
|
+
// Use FC type for function components
|
|
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 guidelines
|
|
317
|
+
const useUser = (userId: string) => {
|
|
318
|
+
const [user, setUser] = useState<UserProfile | null>(null);
|
|
319
|
+
const [loading, setLoading] = useState(false);
|
|
320
|
+
|
|
321
|
+
useEffect(() => {
|
|
322
|
+
// Implementation
|
|
323
|
+
}, [userId]);
|
|
324
|
+
|
|
325
|
+
return { user, loading };
|
|
326
|
+
};
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## Component Development Guidelines
|
|
330
|
+
|
|
331
|
+
> 💡 These are just basic guidelines. For complete component development guide, please refer to [Component Development Guide](./component-guide.md)
|
|
332
|
+
|
|
333
|
+
### 1. Component Categories
|
|
334
|
+
|
|
335
|
+
- **Page Components**: Located in `pages/` directory
|
|
336
|
+
- **Business Components**: Located in corresponding business module directory
|
|
337
|
+
- **Common Components**: Located in `uikit/components/` directory
|
|
338
|
+
- **Layout Components**: Located in `uikit/layouts/` directory
|
|
339
|
+
|
|
340
|
+
### 2. Component Implementation
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
// 1. Import order
|
|
344
|
+
import { FC, useEffect, useState } from 'react'; // React related
|
|
345
|
+
import { useTranslation } from 'react-i18next'; // Third-party libraries
|
|
346
|
+
import { UserService } from '@/services/user'; // Internal project imports
|
|
347
|
+
import { Button } from './Button'; // Relative path imports
|
|
348
|
+
|
|
349
|
+
// 2. Type definitions
|
|
350
|
+
interface Props {
|
|
351
|
+
userId: string;
|
|
352
|
+
onUpdate?: (user: User) => void;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// 3. Component implementation
|
|
356
|
+
export const UserProfile: FC<Props> = ({ userId, onUpdate }) => {
|
|
357
|
+
// 3.1 Hooks declarations
|
|
358
|
+
const { t } = useTranslation();
|
|
359
|
+
const [user, setUser] = useState<User | null>(null);
|
|
360
|
+
|
|
361
|
+
// 3.2 Side effects
|
|
362
|
+
useEffect(() => {
|
|
363
|
+
// Implementation
|
|
364
|
+
}, [userId]);
|
|
365
|
+
|
|
366
|
+
// 3.3 Event handlers
|
|
367
|
+
const handleUpdate = () => {
|
|
368
|
+
// Implementation
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// 3.4 Render methods
|
|
372
|
+
const renderHeader = () => {
|
|
373
|
+
return <h2>{user?.name}</h2>;
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
// 3.5 Return JSX
|
|
377
|
+
return (
|
|
378
|
+
<div>
|
|
379
|
+
{renderHeader()}
|
|
380
|
+
<Button onClick={handleUpdate}>{t('common.update')}</Button>
|
|
381
|
+
</div>
|
|
382
|
+
);
|
|
383
|
+
};
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## State Management Guidelines
|
|
387
|
+
|
|
388
|
+
> 💡 These are just basic guidelines. For complete state management guide, please refer to [Store Development Guide](./store.md)
|
|
389
|
+
|
|
390
|
+
### 1. Store Implementation
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
// 1. State interface definition
|
|
394
|
+
interface UserState extends StoreStateInterface {
|
|
395
|
+
currentUser: User | null;
|
|
396
|
+
loading: boolean;
|
|
397
|
+
error: string | null;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// 2. Store implementation
|
|
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. Selector definitions
|
|
412
|
+
selector = {
|
|
413
|
+
currentUser: (state: UserState) => state.currentUser,
|
|
414
|
+
loading: (state: UserState) => state.loading
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
// 4. Operation methods
|
|
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 Usage
|
|
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
|
+
## Router Development Guidelines
|
|
447
|
+
|
|
448
|
+
> 💡 These are just basic guidelines. For complete router development guide, please refer to [Router Development Guide](./router.md)
|
|
449
|
+
|
|
450
|
+
### 1. Basic Guidelines
|
|
451
|
+
|
|
452
|
+
- Router configuration centrally managed in `config/app.router.ts`
|
|
453
|
+
- Use declarative router configuration
|
|
454
|
+
- Router components placed in `pages` directory
|
|
455
|
+
- Support route-level code splitting
|
|
456
|
+
- Router configuration includes metadata support
|
|
457
|
+
|
|
458
|
+
### 2. Example
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
// Router configuration example
|
|
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
|
+
For more router configuration and usage examples, please refer to [Router Development Guide](./router.md).
|
|
484
|
+
|
|
485
|
+
## Internationalization Guidelines
|
|
486
|
+
|
|
487
|
+
> 💡 These are just basic guidelines. For complete internationalization guide, please refer to [Internationalization Guide](./i18n.md)
|
|
488
|
+
|
|
489
|
+
### 1. Basic Guidelines
|
|
490
|
+
|
|
491
|
+
- Use identifier constants for translation keys
|
|
492
|
+
- Generate translation resources through TypeScript comments
|
|
493
|
+
- Support multi-language routing
|
|
494
|
+
- Centrally manage translation files
|
|
495
|
+
|
|
496
|
+
### 2. Example
|
|
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
|
+
For more internationalization configuration and usage examples, please refer to [Internationalization Guide](./i18n.md).
|
|
508
|
+
|
|
509
|
+
## Theme Style Guidelines
|
|
510
|
+
|
|
511
|
+
> 💡 These are just basic guidelines. For complete theme development guide, please refer to [Theme Development Guide](./theme.md)
|
|
512
|
+
|
|
513
|
+
### 1. Basic Guidelines
|
|
514
|
+
|
|
515
|
+
- Use CSS variables for theme management
|
|
516
|
+
- Follow Tailwind CSS usage guidelines
|
|
517
|
+
- Modularize component styles
|
|
518
|
+
- Support multi-theme switching
|
|
519
|
+
|
|
520
|
+
### 2. Example
|
|
521
|
+
|
|
522
|
+
```css
|
|
523
|
+
:root {
|
|
524
|
+
--color-brand: 37 99 235;
|
|
525
|
+
--text-primary: 15 23 42;
|
|
526
|
+
}
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
For more theme configuration and usage examples, please refer to [Theme Development Guide](./theme.md).
|
|
530
|
+
|
|
531
|
+
## Testing Guidelines
|
|
532
|
+
|
|
533
|
+
> 💡 These are just basic guidelines. For complete testing guide, please refer to [Testing Guide](./testing.md)
|
|
534
|
+
|
|
535
|
+
### 1. Basic Guidelines
|
|
536
|
+
|
|
537
|
+
- Unit tests cover core logic
|
|
538
|
+
- Component tests focus on interaction and rendering
|
|
539
|
+
- Use Jest and Testing Library
|
|
540
|
+
- Keep tests simple and maintainable
|
|
541
|
+
|
|
542
|
+
### 2. Example
|
|
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
|
+
For more testing examples and best practices, please refer to [Testing Guide](./testing.md).
|
|
555
|
+
|
|
556
|
+
## Documentation Guidelines
|
|
557
|
+
|
|
558
|
+
> 💡 These are just basic guidelines. For complete documentation writing guide, please refer to [Documentation Writing Guide](./documentation.md)
|
|
559
|
+
|
|
560
|
+
### 1. Code Comments
|
|
561
|
+
|
|
562
|
+
```typescript
|
|
563
|
+
/**
|
|
564
|
+
* User Service
|
|
565
|
+
*
|
|
566
|
+
* @description Handles user-related business logic
|
|
567
|
+
* @example
|
|
568
|
+
* const userService = IOC(UserService);
|
|
569
|
+
* await userService.login(credentials);
|
|
570
|
+
*/
|
|
571
|
+
@injectable()
|
|
572
|
+
export class UserService {
|
|
573
|
+
/**
|
|
574
|
+
* User login
|
|
575
|
+
*
|
|
576
|
+
* @param credentials - Login credentials
|
|
577
|
+
* @returns Logged in user information
|
|
578
|
+
* @throws {AuthError} Thrown when authentication fails
|
|
579
|
+
*/
|
|
580
|
+
async login(credentials: Credentials): Promise<User> {
|
|
581
|
+
// Implementation
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
### 2. Documentation Structure
|
|
587
|
+
|
|
588
|
+
- **README.md**: Project overview, installation instructions, quick start
|
|
589
|
+
- **docs/**:
|
|
590
|
+
- `zh/`: Chinese documentation
|
|
591
|
+
- `en/`: English documentation
|
|
592
|
+
- Organize documentation files by functional modules
|
|
593
|
+
|
|
594
|
+
### 3. Documentation Format
|
|
595
|
+
|
|
596
|
+
```markdown
|
|
597
|
+
# Module Name
|
|
598
|
+
|
|
599
|
+
## Overview
|
|
600
|
+
|
|
601
|
+
Brief explanation of module functionality and purpose.
|
|
602
|
+
|
|
603
|
+
## Usage
|
|
604
|
+
|
|
605
|
+
Code examples and usage instructions.
|
|
606
|
+
|
|
607
|
+
## API Documentation
|
|
608
|
+
|
|
609
|
+
Detailed API descriptions.
|
|
610
|
+
|
|
611
|
+
## Best Practices
|
|
612
|
+
|
|
613
|
+
Usage suggestions and considerations.
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
## Git Commit Guidelines
|
|
617
|
+
|
|
618
|
+
> 💡 These are just basic guidelines. For complete Git workflow, please refer to [Git Workflow Guide](./git-workflow.md)
|
|
619
|
+
|
|
620
|
+
### 1. Commit Message Format
|
|
621
|
+
|
|
622
|
+
```
|
|
623
|
+
<type>(<scope>): <subject>
|
|
624
|
+
|
|
625
|
+
<body>
|
|
626
|
+
|
|
627
|
+
<footer>
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
- **type**:
|
|
631
|
+
- `feat`: New feature
|
|
632
|
+
- `fix`: Bug fix
|
|
633
|
+
- `docs`: Documentation updates
|
|
634
|
+
- `style`: Code formatting (changes that do not affect code execution)
|
|
635
|
+
- `refactor`: Code refactoring
|
|
636
|
+
- `test`: Adding tests
|
|
637
|
+
- `chore`: Build process or auxiliary tool changes
|
|
638
|
+
|
|
639
|
+
- **scope**: Impact scope (optional)
|
|
640
|
+
- **subject**: Brief description
|
|
641
|
+
- **body**: Detailed description (optional)
|
|
642
|
+
- **footer**: Breaking changes, issue closure (optional)
|
|
643
|
+
|
|
644
|
+
### 2. Example
|
|
645
|
+
|
|
646
|
+
```
|
|
647
|
+
feat(auth): add user role management functionality
|
|
648
|
+
|
|
649
|
+
- Add role creation and editing interface
|
|
650
|
+
- Implement role permission configuration
|
|
651
|
+
- Add role assignment functionality
|
|
652
|
+
|
|
653
|
+
Closes #123
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
## Performance Optimization Guidelines
|
|
657
|
+
|
|
658
|
+
> 💡 These are just basic guidelines. For complete performance optimization guide, please refer to [Performance Optimization Guide](./performance.md)
|
|
659
|
+
|
|
660
|
+
### 1. Code Splitting
|
|
661
|
+
|
|
662
|
+
```typescript
|
|
663
|
+
// Route-level code splitting
|
|
664
|
+
const UserModule = lazy(() => import('./pages/users'));
|
|
665
|
+
|
|
666
|
+
// Component-level code splitting
|
|
667
|
+
const HeavyComponent = lazy(() => import('./components/Heavy'));
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
### 2. Performance Considerations
|
|
671
|
+
|
|
672
|
+
```typescript
|
|
673
|
+
// Use useMemo to cache computation results
|
|
674
|
+
const sortedUsers = useMemo(() => {
|
|
675
|
+
return users.sort((a, b) => a.name.localeCompare(b.name));
|
|
676
|
+
}, [users]);
|
|
677
|
+
|
|
678
|
+
// Use useCallback to cache functions
|
|
679
|
+
const handleUpdate = useCallback(() => {
|
|
680
|
+
// Implementation
|
|
681
|
+
}, [dependencies]);
|
|
682
|
+
|
|
683
|
+
// Use React.memo to avoid unnecessary re-renders
|
|
684
|
+
const UserCard = React.memo(({ user }) => {
|
|
685
|
+
return <div>{user.name}</div>;
|
|
686
|
+
});
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
## Security Guidelines
|
|
690
|
+
|
|
691
|
+
> 💡 These are just basic guidelines. For complete security development guide, please refer to [Security Development Guide](./security.md)
|
|
692
|
+
|
|
693
|
+
### 1. Data Handling
|
|
694
|
+
|
|
695
|
+
```typescript
|
|
696
|
+
// Sensitive data encryption
|
|
697
|
+
const encryptedData = encrypt(sensitiveData);
|
|
698
|
+
|
|
699
|
+
// XSS protection
|
|
700
|
+
const sanitizedHtml = sanitizeHtml(userInput);
|
|
701
|
+
|
|
702
|
+
// CSRF protection
|
|
703
|
+
api.defaults.headers['X-CSRF-Token'] = getCsrfToken();
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### 2. Access Control
|
|
707
|
+
|
|
708
|
+
```typescript
|
|
709
|
+
// Route permissions
|
|
710
|
+
const PrivateRoute: FC = ({ children }) => {
|
|
711
|
+
const auth = useAuth();
|
|
712
|
+
return auth.isAuthenticated ? children : <Navigate to="/login" />;
|
|
713
|
+
};
|
|
714
|
+
|
|
715
|
+
// Operation permissions
|
|
716
|
+
function AdminPanel() {
|
|
717
|
+
const { hasPermission } = useAuth();
|
|
718
|
+
|
|
719
|
+
return (
|
|
720
|
+
<div>
|
|
721
|
+
{hasPermission('ADMIN') && (
|
|
722
|
+
<button>Admin Operation</button>
|
|
723
|
+
)}
|
|
724
|
+
</div>
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
```
|