182 lines
5.7 KiB
JavaScript
Raw Normal View History

2025-04-28 12:25:20 +08:00
/**
* 文件操作相关的功能类
* @type {module}
*/
import { XmlUtils } from './xml-utils.js';
export class FileOperations {
/**
* 加载服务文件列表
*/
static async loadServiceFiles() {
try {
const response = await fetch('/api/service-files');
if (!response.ok) {
throw new Error(`服务器响应错误: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('加载服务文件失败:', error);
// 延迟3秒后重试
return new Promise((resolve) => {
setTimeout(async () => {
try {
console.log('尝试重新加载服务文件列表...');
const retryResponse = await fetch('/api/service-files');
if (retryResponse.ok) {
resolve(await retryResponse.json());
} else {
console.error('重试加载服务文件失败');
resolve([]);
}
} catch (retryError) {
console.error('重试加载服务文件失败:', retryError);
resolve([]);
}
}, 3000);
});
}
}
/**
* 加载文件内容
*/
static async loadFileContent(filePath) {
try {
const response = await fetch(`/api/service-file-content?path=${encodeURIComponent(filePath)}`);
if (!response.ok) {
throw new Error(`服务器响应错误: ${response.status}`);
}
const content = await response.text();
// 解析XML内容
const parser = new DOMParser();
let xmlDoc;
try {
xmlDoc = parser.parseFromString(content, 'application/xml');
// 检查解析错误
const parseError = xmlDoc.querySelector('parsererror');
if (parseError) {
throw new Error('XML解析错误');
}
// 特殊处理CommandList元素确保命令以属性方式存储
XmlUtils.ensureCommandListFormat(xmlDoc);
return {
content,
xmlDoc,
error: null
};
} catch (parseError) {
console.error('XML解析错误:', parseError);
}
} catch (error) {
console.error('加载文件内容失败:', error);
return {
content: null,
xmlDoc: null,
error: error.message
};
}
}
/**
* 保存文件内容
*/
static async saveFileContent(filePath, content) {
try {
const response = await fetch('/api/save-service-file', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
path: filePath,
content: content
})
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || `保存失败: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('保存文件失败:', error);
throw error;
}
}
/**
* 创建新配置
*/
static async createNewConfig(fileName) {
try {
const response = await fetch('/api/create-service-file', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ fileName })
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || `创建失败: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('创建新配置文件失败:', error);
throw error;
}
}
/**
* 另存为新文件
*/
static async saveFileAs(fileName, content, currentFile, overwrite = false) {
try {
const response = await fetch('/api/save-service-as', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
fileName,
content,
currentFile,
overwrite
})
});
if (!response.ok) {
const errorData = await response.json();
return {
success: false,
data: errorData,
error: errorData.error || `保存失败: ${response.status}`
};
}
const result = await response.json();
return {
success: true,
data: result,
error: null
};
} catch (error) {
console.error('另存为失败:', error);
return {
success: false,
data: null,
error: error.message
};
}
}
}