Initial commit

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
liu
2026-02-03 10:10:11 +08:00
commit 14289beb66
45 changed files with 15479 additions and 0 deletions

View File

@@ -0,0 +1,327 @@
# 模块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连接管理功能