Initial setup of project files and directory structure.

This commit is contained in:
liu
2026-01-29 10:29:58 +08:00
parent b3488fa51a
commit 981b4ecf42
9 changed files with 1121 additions and 0 deletions

202
08-路径.md Normal file
View File

@@ -0,0 +1,202 @@
# 路径配置跨平台兼容性优化方案
## 1. 问题背景
在跨平台部署后端服务时不同操作系统Windows、Linux、macOS的路径格式存在差异可能导致路径处理错误。主要问题包括
- 路径分隔符不同Windows使用`\`Linux/macOS使用`/`
- 路径表示方式不同如Windows的盘符C:\与Linux的根目录/
- 相同路径的不同表示形式:如`C:\Users\test``C:/Users/test`
## 2. 优化目标
- 确保路径配置在不同操作系统上都能正确工作
- 统一路径在前端和后端之间的传输格式
- 提高路径处理的健壮性和安全性
- 保持与现有系统功能的兼容性
## 3. 优化方案
### 3.1 前端路径处理优化
#### 3.1.1 路径拼接逻辑
- **修改文件**`frontend/src/components/SettingsTab.vue`
- **优化内容**
- 将所有路径转换为POSIX格式使用`/`作为分隔符)
- 添加路径验证,检查是否包含非法字符
- 确保传递给后端的路径格式统一
#### 3.1.2 核心代码变更
```javascript
// 确保路径使用平台无关的表示方式,统一使用 / 作为分隔符
const normalizedRoot = root.replace(/\\/g, '/');
// 路径验证:检查是否包含非法字符
const invalidChars = /[<>:"|?*]/;
if (invalidChars.test(basePath.value)) {
message.value = { text: '路径包含非法字符,请检查', type: 'error' };
return;
}
```
### 3.2 后端路径处理优化
#### 3.2.1 路径工具类
- **创建文件**`backend/src/main/java/com/music/common/PathUtils.java`
- **核心功能**
- 路径规范化:将不同表示形式的路径转换为统一格式
- 跨平台路径转换支持POSIX格式与平台特定格式互转
- 路径验证:检查路径是否包含非法字符
- 路径拼接:使用平台无关的方式拼接路径
#### 3.2.2 ConfigService优化
- **修改文件**`backend/src/main/java/com/music/service/ConfigService.java`
- **优化内容**
- 在保存配置时验证并规范化basePath
- 在加载配置时规范化basePath
- 确保配置文件中存储的路径格式正确
#### 3.2.3 Config类优化
- **修改文件**`backend/src/main/java/com/music/dto/Config.java`
- **优化内容**
- 确保派生路径使用POSIX格式
- 统一路径分隔符为`/`
## 4. 实现细节
### 4.1 路径工具类核心方法
| 方法名 | 功能描述 |
| :--- | :--- |
| `normalizePath(String path)` | 规范化路径,去除`..`等相对路径部分 |
| `toPosixPath(String path)` | 将路径转换为POSIX格式使用`/` |
| `toPlatformPath(String path)` | 将路径转换为平台特定格式 |
| `isValidPath(String path)` | 验证路径是否合法 |
| `joinPath(String parent, String child)` | 拼接路径,使用平台无关的方式 |
### 4.2 路径验证规则
- 禁止包含以下非法字符:`< > : " | ? *`
- 路径必须是有效的文件系统路径
- 路径长度不能超过系统限制
## 5. 测试方案
### 5.1 单元测试
- **测试文件**`backend/src/test/java/com/music/common/PathUtilsTest.java`
- **测试场景**
- Windows路径规范化
- Linux路径规范化
- 跨平台路径转换
- 路径验证
- 路径拼接
### 5.2 集成测试
- 在不同操作系统上部署服务
- 测试路径配置功能
- 验证配置文件跨平台迁移
### 5.3 测试用例示例
```java
@Test
void testToPosixPath() {
// 测试Windows路径转POSIX路径
String windowsPath = "C:\\Users\\test\\MusicWork";
String posixPath = PathUtils.toPosixPath(windowsPath);
assertEquals("C:/Users/test/MusicWork", posixPath);
}
@Test
void testIsValidPath() {
// 测试合法路径
assertTrue(PathUtils.isValidPath("C:\\Users\\test\\MusicWork"));
// 测试非法路径
assertFalse(PathUtils.isValidPath("C:\\Users\\test\\Music<Work"));
}
```
## 6. 部署与迁移
### 6.1 部署注意事项
- 无需额外配置,优化后的代码会自动处理跨平台路径
- 确保配置文件中的路径格式正确
### 6.2 配置文件迁移
- 旧配置文件会在加载时自动规范化
- 迁移到新平台时,无需手动修改配置文件
## 7. 最佳实践
### 7.1 前端开发
- 始终使用`/`作为路径分隔符
- 在发送路径给后端前,先进行规范化处理
- 添加路径验证,确保路径格式正确
### 7.2 后端开发
- 使用`PathUtils`工具类处理所有路径操作
- 接收前端路径时,先进行规范化处理
- 保存路径时,使用平台无关的格式
## 8. 效果评估
- **兼容性**支持Windows、Linux、macOS等主流操作系统
- **健壮性**:能够处理各种格式的路径
- **安全性**:防止非法路径字符导致的安全问题
- **易用性**:开发人员无需关心平台差异
## 9. 经验教训与优化案例
### 9.1 案例Windows路径非法字符检测问题
#### 问题描述
用户在输入Windows 11路径"Z:\音视频"时,系统提示"路径包含非法字符,请检查"但该路径在Windows系统中是合法的。
#### 根本原因
前端正则表达式`/[<>:"|?*]/`将冒号`:`列为非法字符但在Windows路径中冒号是合法的用于分隔盘符和路径`Z:\音视频`)。
#### 解决方案
1. **前端修复**:修改正则表达式,移除冒号,并在验证前提取路径中的盘符部分
2. **后端同步**确保后端PathUtils类的验证逻辑与前端保持一致
3. **测试用例补充**添加中文路径和Windows盘符路径的测试用例
#### 修复代码示例
```javascript
// 前端修复后的验证逻辑
let pathToValidate = basePath.value;
// 移除盘符部分(如果有)
if (pathToValidate.match(/^[A-Za-z]:/)) {
pathToValidate = pathToValidate.substring(2);
}
const invalidChars = /[<>"|?*]/;
if (invalidChars.test(pathToValidate)) {
message.value = { text: '路径包含非法字符,请检查', type: 'error' };
return;
}
```
### 9.2 经验教训
1. **跨平台兼容性考虑**:在设计路径验证规则时,必须考虑不同操作系统的路径格式差异
2. **正则表达式精确性**避免将合法的路径分隔符如Windows的盘符冒号误判为非法字符
3. **前后端逻辑一致性**:确保前端和后端使用相同的路径验证规则
4. **充分测试**:添加覆盖不同平台、不同路径格式的测试用例
5. **用户友好提示**:提供更具体的错误提示,帮助用户理解问题所在
## 10. 后续优化方向
- 优化路径错误提示,提供更具体的错误信息
- 添加路径长度验证,防止超长路径
- 支持长路径前缀如Windows的`\\?\`
- 考虑添加路径自动修复功能
## 11. 总结
通过对前端和后端路径处理的优化,解决了跨平台部署时的路径兼容性问题。优化后的系统能够:
- 自动处理不同平台的路径格式
- 统一前端和后端之间的路径传输格式
- 正确处理Windows路径中的盘符冒号
- 支持中文路径
- 提高路径处理的健壮性和安全性
- 保持与现有系统功能的兼容性
这将使后端服务能够在不同操作系统上无缝部署和运行,提高了系统的可移植性和可靠性。通过本次修复案例,我们也积累了宝贵的跨平台路径处理经验,为未来的系统优化奠定了基础。