=> {
return request.post('/api/system/site-info/check-port', { port });
};
```
### 表单验证规则
```typescript
// validation/siteInfoRules.ts
import { z } from 'zod';
export const siteInfoSchema = z.object({
siteName: z.string()
.min(1, '站点名称不能为空')
.max(50, '站点名称最多50个字符'),
aeTitle: z.string()
.min(1, 'AE Title 不能为空')
.max(16, 'AE Title 最多16个字符')
.regex(/^[A-Z0-9_]+$/, 'AE Title 只能包含大写字母、数字和下划线'),
port: z.number()
.int('端口必须是整数')
.min(1, '端口号最小为1')
.max(65535, '端口号最大为65535'),
institutionName: z.string()
.max(100, '机构名称最多100个字符')
.optional(),
siteCode: z.string()
.max(20, '站点编码最多20个字符')
.optional(),
description: z.string()
.max(500, '描述最多500个字符')
.optional(),
});
```
### 组件实现骨架
```typescript
// sections/SystemHome/SiteInfo.tsx
import React, { useEffect } from 'react';
import { Form, Input, InputNumber, Button, message, Spin } from 'antd';
import { useAppDispatch, useAppSelector } from '@/states/store';
import { fetchSiteInfo, saveSiteInfo } from '@/states/siteInfoSlice';
const SiteInfo: React.FC = () => {
const [form] = Form.useForm();
const dispatch = useAppDispatch();
const { data, loading, saving } = useAppSelector(state => state.siteInfo);
// 加载数据
useEffect(() => {
dispatch(fetchSiteInfo());
}, [dispatch]);
// 数据加载后填充表单
useEffect(() => {
if (data) {
form.setFieldsValue(data);
}
}, [data, form]);
// 保存处理
const handleSave = async () => {
try {
const values = await form.validateFields();
await dispatch(saveSiteInfo(values)).unwrap();
message.success('保存成功');
} catch (error) {
message.error('保存失败');
}
};
// 重置处理
const handleReset = () => {
form.resetFields();
};
if (loading) {
return ;
}
return (
站点信息
);
};
export default SiteInfo;
```
### 交互流程图
```
用户打开页面
↓
加载站点信息 (fetchSiteInfo)
↓
显示加载状态
↓
数据加载成功 → 填充表单
↓
用户编辑表单
↓
实时验证 (可选)
↓
点击保存按钮
↓
前端验证
↓
验证失败 → 显示错误
↓
验证成功 → 提交到后端
↓
显示保存状态
↓
保存成功 → 显示成功消息
↓
保存失败 → 显示错误 + 重试选项
```
### 国际化支持
```typescript
// assets/i18n/zh-CN.json
{
"systemSettings": {
"siteInfo": {
"title": "站点信息",
"siteName": "站点名称",
"aeTitle": "AE Title",
"port": "端口",
"institutionName": "机构名称",
"siteCode": "站点编码",
"description": "描述",
"save": "保存",
"reset": "重置",
"saveSuccess": "保存成功",
"saveFailed": "保存失败"
}
}
}
```
## 7️⃣ 测试要点
### 单元测试
- 表单验证规则测试
- Redux slice 逻辑测试
- API 接口调用测试
### 集成测试
- 完整的数据加载-编辑-保存流程
- 错误处理测试
- 边界值测试
### E2E 测试
- 用户操作流程测试
- 跨浏览器兼容性测试
## 8️⃣ 性能优化建议
1. **防抖处理**:保存按钮添加防抖,避免重复提交
2. **数据缓存**:考虑缓存站点信息,避免重复加载
3. **懒加载**:如果站点信息较多,考虑分步加载
4. **错误边界**:添加 Error Boundary 捕获组件错误
## 9️⃣ 安全性考虑
1. **输入过滤**:防止 XSS 注入
2. **数据验证**:前后端双重验证
3. **权限控制**:只有管理员可以修改站点信息
4. **操作日志**:记录站点信息的修改历史