Files
sftp-manager/docs/02-数据模型设计.md
liu 14289beb66 Initial commit
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 10:10:11 +08:00

328 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 模块02数据模型设计
---
## 🎨 UI设计系统概览
> **完整设计系统文档请参考:** `UI设计系统.md`
### 核心设计原则
- **现代简约**:界面清晰,层次分明
- **专业高效**:减少操作步骤,提升工作效率
- **一致性**:统一的视觉语言和交互模式
- **可访问性**符合WCAG 2.1 AA标准
### 关键设计令牌
**颜色系统:**
- 主色:`#0d6efd`(操作按钮、选中状态)
- 成功:`#198754`(连接成功状态)
- 危险:`#dc3545`(删除操作、错误提示)
- 深灰:`#212529`(导航栏背景)
- 浅灰:`#e9ecef`(工具栏背景)
**字体系统:**
- 字体族:系统字体栈(-apple-system, Segoe UI, Roboto等
- 正文14px行高1.5
- 标题20-32px行高1.2-1.4
- 小号文字12px文件大小、日期等
**间距系统:**
- 基础单位8px
- 标准间距16px1rem
- 组件内边距8px-16px
**组件规范:**
- 导航栏高度48px深色背景
- 工具栏浅灰背景按钮间距8px
- 文件项最小高度44px悬停效果150ms
- 按钮圆角4px过渡150ms
**交互规范:**
- 悬停效果150ms过渡
- 触摸目标最小44x44px
- 键盘导航Tab、Enter、Delete、F2、F5、Esc
- 焦点状态2px蓝色轮廓
**响应式断点:**
- 移动端:< 768px双面板垂直排列
- 平板768px - 1024px
- 桌面:> 1024px标准布局
---
## 2.1 连接实体Connection.java
### 字段说明
```java
package com.sftp.manager.model;
import lombok.Data;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "connections")
public class Connection {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 连接ID主键
@Column(nullable = false)
private String name; // 连接名称(用户自定义)
@Column(nullable = false)
private String host; // SFTP服务器地址
private Integer port; // SFTP端口默认22
@Column(nullable = false)
private String username; // 用户名
@Column(columnDefinition = "TEXT")
private String password; // 密码(加密存储)
private String privateKeyPath; // 私钥路径(可选)
private String passPhrase; // 私钥密码(可选)
private Integer connectTimeout; // 连接超时时间
private String rootPath; // 默认登录后路径
@Column(name = "created_at")
private LocalDateTime createdAt; // 创建时间
@Column(name = "updated_at")
private LocalDateTime updatedAt; // 更新时间
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
if (port == null) {
port = 22;
}
if (connectTimeout == null) {
connectTimeout = 10000;
}
}
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
}
```
### 设计要点
1. **密码字段加密**建议使用AES或Base64加密存储
2. **双重认证支持**:支持密码认证和密钥认证两种方式
3. **时间自动记录**:使用`@PrePersist``@PreUpdate`自动设置创建和更新时间
4. **默认值设置**端口默认22超时默认10秒
## 2.2 文件信息实体FileInfo.java
### 字段说明
```java
package com.sftp.manager.model;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class FileInfo {
private String name; // 文件名
private String path; // 完整路径
private long size; // 文件大小(字节)
private boolean isDirectory; // 是否为目录
private LocalDateTime modifiedTime; // 修改时间
private String permissions; // 文件权限(如:-rw-r--r--
}
```
### 设计要点
1. **DTO模式**:不持久化到数据库,仅用于数据传输
2. **统一表示**统一本地文件和SFTP文件的表示方式
3. **完整元数据**:包含文件名、路径、大小、类型、修改时间、权限等
## 2.3 通用响应对象ApiResponse.java
### 设计说明
```java
package com.sftp.manager.dto;
import lombok.Data;
@Data
public class ApiResponse<T> {
private boolean success; // 操作是否成功
private String message; // 响应消息
private T data; // 响应数据
private String error; // 错误信息
public static <T> ApiResponse<T> success(T data) {
ApiResponse<T> response = new ApiResponse<>();
response.setSuccess(true);
response.setData(data);
return response;
}
public static <T> ApiResponse<T> success(String message, T data) {
ApiResponse<T> response = new ApiResponse<>();
response.setSuccess(true);
response.setMessage(message);
response.setData(data);
return response;
}
public static <T> ApiResponse<T> error(String message) {
ApiResponse<T> response = new ApiResponse<>();
response.setSuccess(false);
response.setMessage(message);
return response;
}
public static <T> ApiResponse<T> error(String message, String error) {
ApiResponse<T> response = new ApiResponse<>();
response.setSuccess(false);
response.setMessage(message);
response.setError(error);
return response;
}
}
```
### 使用场景
1. **统一响应格式**所有API返回统一的结构
2. **便于前端处理**前端可以根据success字段判断操作结果
3. **泛型支持**:灵活适配不同数据类型
4. **静态工厂方法**:简化对象创建
## 2.4 数据传输对象DTO
### 2.4.1 连接请求DTOConnectionRequest.java
```java
package com.sftp.manager.dto;
import lombok.Data;
@Data
public class ConnectionRequest {
private Long id; // 连接ID用于保存配置
private String name; // 连接名称
private String host; // 主机地址
private Integer port; // 端口
private String username; // 用户名
private String password; // 密码
private String privateKeyPath; // 私钥路径
private String passPhrase; // 私钥密码
}
```
### 2.4.2 文件操作请求DTOFileOperationRequest.java
```java
package com.sftp.manager.dto;
import lombok.Data;
@Data
public class FileOperationRequest {
private String sessionId; // 会话ID标识是本地还是哪个SFTP连接
private String path; // 操作的文件路径
private String newName; // 新文件名(重命名使用)
private String targetPath; // 目标路径(移动/复制使用)
private String targetSessionId; // 目标会话ID跨服务器传输使用
}
```
### 2.4.3 文件列表请求DTOFileListRequest.java
```java
package com.sftp.manager.dto;
import lombok.Data;
@Data
public class FileListRequest {
private String sessionId; // 会话ID"local"表示本地否则为SFTP连接ID
private String path; // 要浏览的目录路径
}
```
## 2.5 文件传输请求DTOTransferRequest.java
```java
package com.sftp.manager.dto;
import lombok.Data;
@Data
public class TransferRequest {
private String sourceSessionId; // 源会话ID
private String sourcePath; // 源文件路径
private String targetSessionId; // 目标会话ID
private String targetPath; // 目标路径
}
```
## 实施步骤
1. **创建实体类**
```
# Connection.java
touch src/main/java/com/sftp/manager/model/Connection.java
# FileInfo.java
touch src/main/java/com/sftp/manager/model/FileInfo.java
```
2. **创建DTO类**
```
# ApiResponse.java
touch src/main/java/com/sftp/manager/dto/ApiResponse.java
# ConnectionRequest.java
touch src/main/java/com/sftp/manager/dto/ConnectionRequest.java
# FileOperationRequest.java
touch src/main/java/com/sftp/manager/dto/FileOperationRequest.java
# FileListRequest.java
touch src/main/java/com/sftp/manager/dto/FileListRequest.java
# TransferRequest.java
touch src/main/java/com/sftp/manager/dto/TransferRequest.java
```
3. **验证文件创建**
```
ls -la src/main/java/com/sftp/manager/model/
ls -la src/main/java/com/sftp/manager/dto/
```
4. **编译测试**
```
mvn clean compile
```
## 注意事项
1. **Lombok注解**`@Data`自动生成getter/setter/toString等方法
2. **JPA注解**`@Entity`、`@Table`、`@Id`等用于数据库映射
3. **DTO vs Entity**DTO用于数据传输Entity用于数据库持久化
4. **序列化**所有DTO都需要可序列化JSON
## 下一步
完成模块02后继续模块03连接管理功能