@deepstorm/cli 0.10.2 → 0.11.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.
- package/README.md +8 -8
- package/dist/build-registry.js +11 -5
- package/dist/cli.js +1256 -634
- package/dist/mcp/code-hosting/github.json +14 -1
- package/dist/mcp/docs-reference/context7.json +1 -10
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +8 -5
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +10 -8
- package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +21 -20
- package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +17 -17
- package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +20 -20
- package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +8 -8
- package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +13 -12
- package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +10 -10
- package/dist/registry.json +10 -0
- package/dist/skills/atoll-ops/SKILL.md +4 -0
- package/dist/skills/reef-commit/SKILL.md +9 -5
- package/dist/skills/reef-commit/scripts/branch-check.mjs +5 -11
- package/dist/skills/reef-commit/scripts/check-openspec-status.mjs +6 -12
- package/dist/skills/reef-commit/scripts/collect-git-context.mjs +13 -11
- package/dist/skills/reef-gen-backend/variants/java/steps.md +7 -7
- package/dist/skills/reef-gen-backend/variants/nodejs/steps.md +7 -7
- package/dist/skills/reef-gen-backend/variants/python/steps.md +7 -7
- package/dist/skills/reef-gen-frontend/variants/angular/steps.md +5 -5
- package/dist/skills/reef-gen-frontend/variants/react/steps.md +6 -6
- package/dist/skills/reef-gen-frontend/variants/vue/steps.md +6 -6
- package/dist/skills/reef-harden/EXAMPLES.md +12 -10
- package/dist/skills/reef-harden/SKILL.md +6 -0
- package/dist/skills/reef-harden/scripts/find-change-dir.mjs +13 -13
- package/dist/skills/reef-pr/SKILL.md +7 -0
- package/dist/skills/reef-pr/scripts/create-pr.mjs +31 -29
- package/dist/skills/reef-scope/SKILL.md +6 -6
- package/dist/skills/reef-start/references/jira-start-subagent.md +7 -7
- package/dist/skills/reef-start/references/risk-routing-card.md +28 -25
- package/dist/skills/reef-start/references/stage-4-implementation.md +33 -21
- package/dist/skills/reef-start/references/superpowers-gate.md +9 -9
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +2 -2
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +11 -0
- package/dist/skills/reef-style-backend/fragments/java/api-spec/jackson-polymorphism.md +36 -40
- package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +11 -10
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +24 -21
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +10 -8
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +2 -2
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +5 -5
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +1 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +12 -12
- package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +13 -12
- package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +11 -9
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +6 -6
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +8 -8
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +8 -7
- package/dist/skills/reef-style-backend/fragments/nodejs/eslint-config.json +1 -4
- package/dist/skills/reef-style-backend/fragments/nodejs/nestjs-structure.md +9 -9
- package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +2 -1
- package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +10 -10
- package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +24 -22
- package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +10 -9
- package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +3 -0
- package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +10 -7
- package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +2 -0
- package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +2 -0
- package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +11 -9
- package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +3 -0
- package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +3 -4
- package/dist/skills/reef-style-backend/variants/java/quick-reference.md +31 -29
- package/dist/skills/reef-style-backend/variants/nodejs/examples/module-example.md +2 -8
- package/dist/skills/reef-style-backend/variants/nodejs/quick-reference.md +35 -36
- package/dist/skills/reef-style-backend/variants/python/quick-reference.md +32 -31
- package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +9 -7
- package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +9 -4
- package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +4 -4
- package/dist/skills/reef-style-frontend/fragments/test/vitest-react/examples/testing.md +135 -140
- package/dist/skills/reef-style-frontend/fragments/test/vitest-react/quick-reference.md +32 -32
- package/dist/skills/reef-style-frontend/fragments/test/vitest-vue/examples/testing.md +161 -162
- package/dist/skills/reef-style-frontend/fragments/test/vitest-vue/quick-reference.md +42 -42
- package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +16 -10
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd/examples/ui-components.md +72 -87
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd/quick-reference.md +14 -10
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd-vue/examples/ui-components.md +93 -111
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd-vue/quick-reference.md +29 -33
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +14 -23
- package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +15 -17
- package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +22 -5
- package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +52 -22
- package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +17 -20
- package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +8 -11
- package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +27 -27
- package/dist/skills/reef-style-frontend/variants/react/examples/code-wrapping.md +14 -27
- package/dist/skills/reef-style-frontend/variants/react/examples/component-types-pipes.md +45 -52
- package/dist/skills/reef-style-frontend/variants/react/examples/entity-types.md +44 -44
- package/dist/skills/reef-style-frontend/variants/react/examples/forms-layer.md +56 -85
- package/dist/skills/reef-style-frontend/variants/react/examples/service-routing.md +114 -88
- package/dist/skills/reef-style-frontend/variants/react/quick-reference.md +48 -42
- package/dist/skills/reef-style-frontend/variants/vue/examples/code-wrapping.md +24 -43
- package/dist/skills/reef-style-frontend/variants/vue/examples/component-types-pipes.md +48 -49
- package/dist/skills/reef-style-frontend/variants/vue/examples/entity-types.md +45 -45
- package/dist/skills/reef-style-frontend/variants/vue/examples/forms-layer.md +64 -68
- package/dist/skills/reef-style-frontend/variants/vue/examples/service-routing.md +85 -84
- package/dist/skills/reef-style-frontend/variants/vue/quick-reference.md +46 -51
- package/dist/skills/reef-testcase/SKILL.md +19 -19
- package/dist/skills/reef-testcase/references/coverage-dimensions.md +8 -0
- package/dist/skills/reef-testcase/references/test-case-template.md +16 -16
- package/dist/skills/sweep-explore/SKILL.md +824 -0
- package/dist/skills/sweep-explore/references/explore-flow-template.md +61 -0
- package/dist/skills/sweep-init/SKILL.md +4 -0
- package/dist/skills/sweep-init/scripts/flow-selector.mjs +6 -11
- package/dist/skills/sweep-init/scripts/init-project.mjs +68 -51
- package/dist/skills/sweep-plan/references/test-flow-template.md +12 -6
- package/dist/skills/sweep-record/SKILL.md +358 -0
- package/dist/skills/sweep-run/SKILL.md +59 -50
- package/dist/skills/sweep-run/scripts/env-manager.mjs +4 -5
- package/dist/skills/sweep-run/scripts/flow-parser.mjs +7 -6
- package/dist/skills/sweep-run/scripts/flow-selector.mjs +4 -15
- package/dist/skills/sweep-run/scripts/generate-report.mjs +1 -2
- package/dist/skills/sweep-run/scripts/mcp-manager.mjs +107 -14
- package/dist/skills/sweep-run/scripts/spec-compiler.mjs +19 -9
- package/dist/skills/tide-discuss/references/checklists.md +32 -32
- package/dist/skills/tide-discuss/references/data-format.md +85 -77
- package/dist/skills/tide-discuss/references/prd-template.md +21 -19
- package/dist/skills/tide-discuss/references/publish-flow.md +30 -11
- package/dist/skills/tide-discuss/references/role-prompts.md +5 -5
- package/package.json +5 -3
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
```tsx
|
|
6
6
|
// shared/types/entity.ts
|
|
7
7
|
export interface ImmutableEntity {
|
|
8
|
-
readonly id: string
|
|
9
|
-
readonly createdAt: string
|
|
10
|
-
readonly updatedAt: string
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly createdAt: string;
|
|
10
|
+
readonly updatedAt: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export interface Entity extends ImmutableEntity {
|
|
14
|
-
version: number
|
|
14
|
+
version: number;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface Auditable<T> extends Entity {
|
|
18
|
-
createdBy: T
|
|
19
|
-
updatedBy: T
|
|
18
|
+
createdBy: T;
|
|
19
|
+
updatedBy: T;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export interface ImmutableAuditable<T> extends ImmutableEntity {
|
|
23
|
-
createdBy: T
|
|
23
|
+
createdBy: T;
|
|
24
24
|
}
|
|
25
25
|
```
|
|
26
26
|
|
|
@@ -29,19 +29,19 @@ export interface ImmutableAuditable<T> extends ImmutableEntity {
|
|
|
29
29
|
```tsx
|
|
30
30
|
// shared/types/api.ts
|
|
31
31
|
export interface PageResponse<T> {
|
|
32
|
-
content: T[]
|
|
33
|
-
totalElements: number
|
|
34
|
-
totalPages: number
|
|
35
|
-
number: number
|
|
36
|
-
size: number
|
|
37
|
-
first: boolean
|
|
38
|
-
last: boolean
|
|
32
|
+
content: T[];
|
|
33
|
+
totalElements: number;
|
|
34
|
+
totalPages: number;
|
|
35
|
+
number: number;
|
|
36
|
+
size: number;
|
|
37
|
+
first: boolean;
|
|
38
|
+
last: boolean;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export interface ApiError {
|
|
42
|
-
code: string
|
|
43
|
-
message: string
|
|
44
|
-
details?: Record<string, string[]
|
|
42
|
+
code: string;
|
|
43
|
+
message: string;
|
|
44
|
+
details?: Record<string, string[]>;
|
|
45
45
|
}
|
|
46
46
|
```
|
|
47
47
|
|
|
@@ -50,12 +50,12 @@ export interface ApiError {
|
|
|
50
50
|
```tsx
|
|
51
51
|
// shared/types/user.ts
|
|
52
52
|
export interface User extends Auditable<string> {
|
|
53
|
-
username: string
|
|
54
|
-
email: string
|
|
55
|
-
displayName: string
|
|
56
|
-
avatar?: string
|
|
57
|
-
role: UserRole
|
|
58
|
-
active: boolean
|
|
53
|
+
username: string;
|
|
54
|
+
email: string;
|
|
55
|
+
displayName: string;
|
|
56
|
+
avatar?: string;
|
|
57
|
+
role: UserRole;
|
|
58
|
+
active: boolean;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export enum UserRole {
|
|
@@ -65,16 +65,16 @@ export enum UserRole {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export interface CreateUserRequest {
|
|
68
|
-
username: string
|
|
69
|
-
email: string
|
|
70
|
-
displayName: string
|
|
71
|
-
role: UserRole
|
|
68
|
+
username: string;
|
|
69
|
+
email: string;
|
|
70
|
+
displayName: string;
|
|
71
|
+
role: UserRole;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
export interface UpdateUserRequest {
|
|
75
|
-
email?: string
|
|
76
|
-
displayName?: string
|
|
77
|
-
role?: UserRole
|
|
75
|
+
email?: string;
|
|
76
|
+
displayName?: string;
|
|
77
|
+
role?: UserRole;
|
|
78
78
|
}
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -83,9 +83,9 @@ export interface UpdateUserRequest {
|
|
|
83
83
|
```tsx
|
|
84
84
|
// 通用组件:具名导出 + interface Props
|
|
85
85
|
export interface UserAvatarProps {
|
|
86
|
-
user: Pick<User, 'username' | 'avatar'
|
|
87
|
-
size?: 'sm' | 'md' | 'lg'
|
|
88
|
-
onClick?: () => void
|
|
86
|
+
user: Pick<User, 'username' | 'avatar'>;
|
|
87
|
+
size?: 'sm' | 'md' | 'lg';
|
|
88
|
+
onClick?: () => void;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
export const UserAvatar: React.FC<UserAvatarProps> = ({ user, size = 'md', onClick }) => {
|
|
@@ -97,8 +97,8 @@ export const UserAvatar: React.FC<UserAvatarProps> = ({ user, size = 'md', onCli
|
|
|
97
97
|
onClick={onClick}
|
|
98
98
|
style={{ cursor: onClick ? 'pointer' : 'default' }}
|
|
99
99
|
/>
|
|
100
|
-
)
|
|
101
|
-
}
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
102
|
|
|
103
103
|
// 页面组件:默认导出 + Props 从路由参数推断
|
|
104
104
|
export interface UserListPageProps {
|
|
@@ -106,22 +106,22 @@ export interface UserListPageProps {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
const UserListPage: React.FC<UserListPageProps> = () => {
|
|
109
|
-
const { users, loading } = useUsers()
|
|
110
|
-
return <UserTable users={users} loading={loading}
|
|
111
|
-
}
|
|
112
|
-
export default UserListPage
|
|
109
|
+
const { users, loading } = useUsers();
|
|
110
|
+
return <UserTable users={users} loading={loading} />;
|
|
111
|
+
};
|
|
112
|
+
export default UserListPage;
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
## Discriminated Union 类型
|
|
116
116
|
|
|
117
117
|
```tsx
|
|
118
118
|
// 用于多状态组件
|
|
119
|
-
export type NotificationType = 'success' | 'error' | 'warning' | 'info'
|
|
119
|
+
export type NotificationType = 'success' | 'error' | 'warning' | 'info';
|
|
120
120
|
|
|
121
121
|
export interface NotificationConfig {
|
|
122
|
-
type: NotificationType
|
|
123
|
-
title: string
|
|
124
|
-
message: string
|
|
125
|
-
duration?: number
|
|
122
|
+
type: NotificationType;
|
|
123
|
+
title: string;
|
|
124
|
+
message: string;
|
|
125
|
+
duration?: number;
|
|
126
126
|
}
|
|
127
127
|
```
|
|
@@ -4,37 +4,32 @@
|
|
|
4
4
|
|
|
5
5
|
```tsx
|
|
6
6
|
interface CreateUserFormValues {
|
|
7
|
-
username: string
|
|
8
|
-
email: string
|
|
9
|
-
displayName: string
|
|
10
|
-
role: UserRole
|
|
7
|
+
username: string;
|
|
8
|
+
email: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
role: UserRole;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const CreateUserForm: React.FC = () => {
|
|
14
|
-
const [form] = Form.useForm<CreateUserFormValues>()
|
|
15
|
-
const [loading, setLoading] = useState(false)
|
|
14
|
+
const [form] = Form.useForm<CreateUserFormValues>();
|
|
15
|
+
const [loading, setLoading] = useState(false);
|
|
16
16
|
|
|
17
17
|
const handleSubmit = async (values: CreateUserFormValues) => {
|
|
18
|
-
setLoading(true)
|
|
18
|
+
setLoading(true);
|
|
19
19
|
try {
|
|
20
|
-
await createUser(values)
|
|
21
|
-
message.success('用户创建成功')
|
|
22
|
-
form.resetFields()
|
|
20
|
+
await createUser(values);
|
|
21
|
+
message.success('用户创建成功');
|
|
22
|
+
form.resetFields();
|
|
23
23
|
} catch (err) {
|
|
24
24
|
// Ant Design Form 会自动捕获校验错误
|
|
25
|
-
message.error('创建失败,请重试')
|
|
25
|
+
message.error('创建失败,请重试');
|
|
26
26
|
} finally {
|
|
27
|
-
setLoading(false)
|
|
27
|
+
setLoading(false);
|
|
28
28
|
}
|
|
29
|
-
}
|
|
29
|
+
};
|
|
30
30
|
|
|
31
31
|
return (
|
|
32
|
-
<Form
|
|
33
|
-
form={form}
|
|
34
|
-
layout="vertical"
|
|
35
|
-
onFinish={handleSubmit}
|
|
36
|
-
autoComplete="off"
|
|
37
|
-
>
|
|
32
|
+
<Form form={form} layout="vertical" onFinish={handleSubmit} autoComplete="off">
|
|
38
33
|
<Form.Item
|
|
39
34
|
name="username"
|
|
40
35
|
label="用户名"
|
|
@@ -57,19 +52,11 @@ const CreateUserForm: React.FC = () => {
|
|
|
57
52
|
<Input placeholder="请输入邮箱" />
|
|
58
53
|
</Form.Item>
|
|
59
54
|
|
|
60
|
-
<Form.Item
|
|
61
|
-
name="displayName"
|
|
62
|
-
label="显示名称"
|
|
63
|
-
rules={[{ required: true, message: '请输入显示名称' }]}
|
|
64
|
-
>
|
|
55
|
+
<Form.Item name="displayName" label="显示名称" rules={[{ required: true, message: '请输入显示名称' }]}>
|
|
65
56
|
<Input placeholder="请输入显示名称" />
|
|
66
57
|
</Form.Item>
|
|
67
58
|
|
|
68
|
-
<Form.Item
|
|
69
|
-
name="role"
|
|
70
|
-
label="角色"
|
|
71
|
-
rules={[{ required: true, message: '请选择角色' }]}
|
|
72
|
-
>
|
|
59
|
+
<Form.Item name="role" label="角色" rules={[{ required: true, message: '请选择角色' }]}>
|
|
73
60
|
<Select placeholder="请选择角色">
|
|
74
61
|
<Select.Option value="ADMIN">管理员</Select.Option>
|
|
75
62
|
<Select.Option value="EDITOR">编辑</Select.Option>
|
|
@@ -83,21 +70,21 @@ const CreateUserForm: React.FC = () => {
|
|
|
83
70
|
</Button>
|
|
84
71
|
</Form.Item>
|
|
85
72
|
</Form>
|
|
86
|
-
)
|
|
87
|
-
}
|
|
73
|
+
);
|
|
74
|
+
};
|
|
88
75
|
```
|
|
89
76
|
|
|
90
77
|
## 编辑表单(初始值)
|
|
91
78
|
|
|
92
79
|
```tsx
|
|
93
80
|
interface EditUserFormProps {
|
|
94
|
-
user: User
|
|
95
|
-
onSuccess: () => void
|
|
81
|
+
user: User;
|
|
82
|
+
onSuccess: () => void;
|
|
96
83
|
}
|
|
97
84
|
|
|
98
85
|
const EditUserForm: React.FC<EditUserFormProps> = ({ user, onSuccess }) => {
|
|
99
|
-
const [form] = Form.useForm()
|
|
100
|
-
const [loading, setLoading] = useState(false)
|
|
86
|
+
const [form] = Form.useForm();
|
|
87
|
+
const [loading, setLoading] = useState(false);
|
|
101
88
|
|
|
102
89
|
// 初始值填充
|
|
103
90
|
useEffect(() => {
|
|
@@ -105,52 +92,38 @@ const EditUserForm: React.FC<EditUserFormProps> = ({ user, onSuccess }) => {
|
|
|
105
92
|
displayName: user.displayName,
|
|
106
93
|
email: user.email,
|
|
107
94
|
role: user.role,
|
|
108
|
-
})
|
|
109
|
-
}, [user, form])
|
|
95
|
+
});
|
|
96
|
+
}, [user, form]);
|
|
110
97
|
|
|
111
98
|
const handleSubmit = async (values: Partial<CreateUserRequest>) => {
|
|
112
|
-
setLoading(true)
|
|
99
|
+
setLoading(true);
|
|
113
100
|
try {
|
|
114
|
-
await updateUser(user.id, values)
|
|
115
|
-
message.success('用户信息已更新')
|
|
116
|
-
onSuccess()
|
|
101
|
+
await updateUser(user.id, values);
|
|
102
|
+
message.success('用户信息已更新');
|
|
103
|
+
onSuccess();
|
|
117
104
|
} catch {
|
|
118
|
-
message.error('更新失败')
|
|
105
|
+
message.error('更新失败');
|
|
119
106
|
} finally {
|
|
120
|
-
setLoading(false)
|
|
107
|
+
setLoading(false);
|
|
121
108
|
}
|
|
122
|
-
}
|
|
109
|
+
};
|
|
123
110
|
|
|
124
111
|
return (
|
|
125
|
-
<Form
|
|
126
|
-
form={form}
|
|
127
|
-
layout="vertical"
|
|
128
|
-
onFinish={handleSubmit}
|
|
129
|
-
>
|
|
112
|
+
<Form form={form} layout="vertical" onFinish={handleSubmit}>
|
|
130
113
|
{/* 用户名只读展示 */}
|
|
131
114
|
<Form.Item label="用户名">
|
|
132
115
|
<Input value={user.username} disabled />
|
|
133
116
|
</Form.Item>
|
|
134
117
|
|
|
135
|
-
<Form.Item
|
|
136
|
-
name="email"
|
|
137
|
-
label="邮箱"
|
|
138
|
-
rules={[{ type: 'email' }]}
|
|
139
|
-
>
|
|
118
|
+
<Form.Item name="email" label="邮箱" rules={[{ type: 'email' }]}>
|
|
140
119
|
<Input />
|
|
141
120
|
</Form.Item>
|
|
142
121
|
|
|
143
|
-
<Form.Item
|
|
144
|
-
name="displayName"
|
|
145
|
-
label="显示名称"
|
|
146
|
-
>
|
|
122
|
+
<Form.Item name="displayName" label="显示名称">
|
|
147
123
|
<Input />
|
|
148
124
|
</Form.Item>
|
|
149
125
|
|
|
150
|
-
<Form.Item
|
|
151
|
-
name="role"
|
|
152
|
-
label="角色"
|
|
153
|
-
>
|
|
126
|
+
<Form.Item name="role" label="角色">
|
|
154
127
|
<Select>
|
|
155
128
|
<Select.Option value="ADMIN">管理员</Select.Option>
|
|
156
129
|
<Select.Option value="EDITOR">编辑</Select.Option>
|
|
@@ -164,37 +137,31 @@ const EditUserForm: React.FC<EditUserFormProps> = ({ user, onSuccess }) => {
|
|
|
164
137
|
</Button>
|
|
165
138
|
</Form.Item>
|
|
166
139
|
</Form>
|
|
167
|
-
)
|
|
168
|
-
}
|
|
140
|
+
);
|
|
141
|
+
};
|
|
169
142
|
```
|
|
170
143
|
|
|
171
144
|
## 搜索表单(非受控 + 联动 Table)
|
|
172
145
|
|
|
173
146
|
```tsx
|
|
174
147
|
const UserListPage: React.FC = () => {
|
|
175
|
-
const [searchForm] = Form.useForm()
|
|
176
|
-
const [query, setQuery] = useState<Record<string, string>>({})
|
|
148
|
+
const [searchForm] = Form.useForm();
|
|
149
|
+
const [query, setQuery] = useState<Record<string, string>>({});
|
|
177
150
|
|
|
178
151
|
const handleSearch = (values: Record<string, string>) => {
|
|
179
152
|
// 过滤空值
|
|
180
|
-
const filtered = Object.fromEntries(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
setQuery(filtered)
|
|
184
|
-
}
|
|
153
|
+
const filtered = Object.fromEntries(Object.entries(values).filter(([, v]) => v !== undefined && v !== ''));
|
|
154
|
+
setQuery(filtered);
|
|
155
|
+
};
|
|
185
156
|
|
|
186
157
|
const handleReset = () => {
|
|
187
|
-
searchForm.resetFields()
|
|
188
|
-
setQuery({})
|
|
189
|
-
}
|
|
158
|
+
searchForm.resetFields();
|
|
159
|
+
setQuery({});
|
|
160
|
+
};
|
|
190
161
|
|
|
191
162
|
return (
|
|
192
163
|
<div>
|
|
193
|
-
<Form
|
|
194
|
-
form={searchForm}
|
|
195
|
-
layout="inline"
|
|
196
|
-
onFinish={handleSearch}
|
|
197
|
-
>
|
|
164
|
+
<Form form={searchForm} layout="inline" onFinish={handleSearch}>
|
|
198
165
|
<Form.Item name="keyword">
|
|
199
166
|
<Input.Search placeholder="搜索用户名/邮箱" onSearch={() => searchForm.submit()} />
|
|
200
167
|
</Form.Item>
|
|
@@ -211,22 +178,26 @@ const UserListPage: React.FC = () => {
|
|
|
211
178
|
</Select>
|
|
212
179
|
</Form.Item>
|
|
213
180
|
<Form.Item>
|
|
214
|
-
<Button type="primary" htmlType="submit"
|
|
215
|
-
|
|
181
|
+
<Button type="primary" htmlType="submit">
|
|
182
|
+
查询
|
|
183
|
+
</Button>
|
|
184
|
+
<Button onClick={handleReset} style={{ marginLeft: 8 }}>
|
|
185
|
+
重置
|
|
186
|
+
</Button>
|
|
216
187
|
</Form.Item>
|
|
217
188
|
</Form>
|
|
218
189
|
|
|
219
190
|
<UserTable query={query} />
|
|
220
191
|
</div>
|
|
221
|
-
)
|
|
222
|
-
}
|
|
192
|
+
);
|
|
193
|
+
};
|
|
223
194
|
```
|
|
224
195
|
|
|
225
196
|
## 全局校验信息配置
|
|
226
197
|
|
|
227
198
|
```tsx
|
|
228
199
|
// 在应用入口统一配置校验信息
|
|
229
|
-
import { ConfigProvider } from 'antd'
|
|
200
|
+
import { ConfigProvider } from 'antd';
|
|
230
201
|
|
|
231
202
|
const App: React.FC = () => (
|
|
232
203
|
<ConfigProvider
|
|
@@ -247,5 +218,5 @@ const App: React.FC = () => (
|
|
|
247
218
|
>
|
|
248
219
|
{/* Router 和页面内容 */}
|
|
249
220
|
</ConfigProvider>
|
|
250
|
-
)
|
|
221
|
+
);
|
|
251
222
|
```
|