refactor:优化settings代码结构

This commit is contained in:
Baobhan Sith
2025-05-11 21:12:43 +08:00
parent 7ee8ffb90a
commit 0b08a221b1
14 changed files with 1706 additions and 1062 deletions
@@ -0,0 +1,75 @@
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import apiClient from '../../utils/apiClient';
import { isAxiosError } from 'axios';
export function useDataManagement() {
const { t } = useI18n();
// --- Export Connections State & Method ---
const exportConnectionsLoading = ref(false);
const exportConnectionsMessage = ref('');
const exportConnectionsSuccess = ref(false);
const handleExportConnections = async () => {
exportConnectionsLoading.value = true;
exportConnectionsMessage.value = '';
exportConnectionsSuccess.value = false;
try {
const response = await apiClient.get('/settings/export-connections', {
responseType: 'blob',
});
let filename = 'nexus_connections_export.zip';
const disposition = response.headers['content-disposition'];
if (disposition && disposition.includes('attachment')) {
const filenameRegex = /filename[^;=\n]*=(?:(?:["'])(?<quoted>.*?)\1|(?<unquoted>[^;\n]*))/;
const matches = filenameRegex.exec(disposition);
if (matches?.groups?.quoted || matches?.groups?.unquoted) {
filename = matches.groups.quoted || matches.groups.unquoted;
}
}
const blob = new Blob([response.data], { type: response.headers['content-type'] || 'application/zip' });
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
exportConnectionsMessage.value = t('settings.exportConnections.success', '导出成功。文件已开始下载。');
exportConnectionsSuccess.value = true;
} catch (error: any) {
console.error('导出连接失败:', error);
let message = t('settings.exportConnections.error', '导出连接时发生错误。');
if (isAxiosError(error) && error.response && error.response.data) {
if (error.response.data instanceof Blob && error.response.data.type === 'application/json') {
try {
const errorJson = JSON.parse(await error.response.data.text());
message = errorJson.message || message;
} catch (e) { /* Blob not valid JSON */ }
} else if (typeof error.response.data === 'string' && error.response.data.length < 200) { // Avoid overly long string errors
message = error.response.data;
} else if (error.response.data && typeof error.response.data.message === 'string') {
message = error.response.data.message;
}
} else if (error.message) {
message = error.message;
}
exportConnectionsMessage.value = message;
exportConnectionsSuccess.value = false;
} finally {
exportConnectionsLoading.value = false;
}
};
return {
exportConnectionsLoading,
exportConnectionsMessage,
exportConnectionsSuccess,
handleExportConnections,
};
}