Compare commits
7 Commits
ee28b380f6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| db21c042f2 | |||
| 52ccc5b999 | |||
| 61673809c8 | |||
| 31eadfc38c | |||
| caad50d831 | |||
| e6182b6c36 | |||
| 9ed40b384d |
@@ -1,235 +0,0 @@
|
||||
# DeEarthX-CE - 改进计划
|
||||
|
||||
## 项目分析
|
||||
|
||||
DeEarthX-CE 是一个与 Minecraft 相关的工具,包含以下组件:
|
||||
|
||||
* **后端**:TypeScript + Express 构建,提供模组检测、过滤、平台集成等功能
|
||||
|
||||
* **前端**:Vue 3 + Ant Design Vue + Tauri 构建的桌面应用
|
||||
|
||||
* **文档**:VitePress 构建的文档网站
|
||||
|
||||
## 改进任务列表
|
||||
|
||||
### \[ ] 任务 1:代码质量检查与优化
|
||||
|
||||
* **Priority**:P1
|
||||
|
||||
* **Depends On**:None
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 检查并清理未使用的依赖
|
||||
|
||||
* 统一代码风格和命名规范
|
||||
|
||||
* 优化错误处理机制
|
||||
|
||||
* 提高代码可读性和可维护性
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 所有依赖都是必要的
|
||||
|
||||
* 代码风格统一
|
||||
|
||||
* 错误处理完善
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-1.1:运行 `npm run build` 无错误
|
||||
|
||||
* `programmatic` TR-1.2:运行代码检查工具无严重警告
|
||||
|
||||
* `human-judgement` TR-1.3:代码结构清晰,注释完善
|
||||
|
||||
### \[ ] 任务 2:性能优化
|
||||
|
||||
* **Priority**:P2
|
||||
|
||||
* **Depends On**:任务 1
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 优化文件操作性能
|
||||
|
||||
* 优化网络请求和响应
|
||||
|
||||
* 减少不必要的计算和重复操作
|
||||
|
||||
* 提高模组处理速度
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 文件操作速度提升
|
||||
|
||||
* 网络请求响应时间减少
|
||||
|
||||
* 模组处理效率提高
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-2.1:模组处理时间减少 20%
|
||||
|
||||
* `programmatic` TR-2.2:内存使用降低 15%
|
||||
|
||||
* `human-judgement` TR-2.3:用户操作响应更流畅
|
||||
|
||||
### \[ ] 任务 3:安全性增强
|
||||
|
||||
* **Priority**:P1
|
||||
|
||||
* **Depends On**:任务 1
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 检查并修复安全漏洞
|
||||
|
||||
* 加强输入验证
|
||||
|
||||
* 优化文件操作安全性
|
||||
|
||||
* 检查依赖的安全状态
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 无安全漏洞
|
||||
|
||||
* 输入验证完善
|
||||
|
||||
* 依赖无安全问题
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-3.1:运行安全扫描工具无严重漏洞
|
||||
|
||||
* `programmatic` TR-3.2:所有输入都经过验证
|
||||
|
||||
* `human-judgement` TR-3.3:安全措施到位
|
||||
|
||||
### \[ ] 任务 4:功能增强
|
||||
|
||||
* **Priority**:P2
|
||||
|
||||
* **Depends On**:任务 1, 任务 3
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 完善用户界面交互
|
||||
|
||||
* 增加更多模组平台支持
|
||||
|
||||
* 优化模板管理功能
|
||||
|
||||
* 增强多语言支持
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 用户界面更友好
|
||||
|
||||
* 支持更多模组平台
|
||||
|
||||
* 模板管理更便捷
|
||||
|
||||
* 多语言支持更完善
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-4.1:所有新增功能正常工作
|
||||
|
||||
* `human-judgement` TR-4.2:用户界面美观易用
|
||||
|
||||
* `human-judgement` TR-4.3:多语言支持准确
|
||||
|
||||
### \[ ] 任务 5:构建和部署优化
|
||||
|
||||
* **Priority**:P2
|
||||
|
||||
* **Depends On**:任务 1, 任务 2
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 优化构建流程
|
||||
|
||||
* 减少构建时间
|
||||
|
||||
* 优化打包大小
|
||||
|
||||
* 完善部署文档
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 构建流程更高效
|
||||
|
||||
* 构建时间减少
|
||||
|
||||
* 打包大小优化
|
||||
|
||||
* 部署文档完善
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-5.1:构建时间减少 25%
|
||||
|
||||
* `programmatic` TR-5.2:打包大小减少 20%
|
||||
|
||||
* `human-judgement` TR-5.3:部署文档清晰完整
|
||||
|
||||
### \[ ] 任务 6:测试覆盖度提升
|
||||
|
||||
* **Priority**:P3
|
||||
|
||||
* **Depends On**:任务 1
|
||||
|
||||
* **Description**:
|
||||
|
||||
* 增加单元测试
|
||||
|
||||
* 增加集成测试
|
||||
|
||||
* 提高测试覆盖度
|
||||
|
||||
* 建立测试自动化流程
|
||||
|
||||
* **Success Criteria**:
|
||||
|
||||
* 测试覆盖度达到 80% 以上
|
||||
|
||||
* 关键功能有测试用例
|
||||
|
||||
* 测试自动化流程建立
|
||||
|
||||
* **Test Requirements**:
|
||||
|
||||
* `programmatic` TR-6.1:测试覆盖度达到 80% 以上
|
||||
|
||||
* `programmatic` TR-6.2:所有测试用例通过
|
||||
|
||||
* `human-judgement` TR-6.3:测试用例设计合理
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 首先进行代码质量检查与优化(任务 1)
|
||||
2. 然后进行安全性增强(任务 3)
|
||||
3. 接着进行性能优化(任务 2)
|
||||
4. 之后进行功能增强(任务 4)
|
||||
5. 然后进行构建和部署优化(任务 5)
|
||||
6. 最后进行测试覆盖度提升(任务 6)
|
||||
|
||||
## 预期成果
|
||||
|
||||
通过以上改进,DeEarthX-CE 项目将:
|
||||
|
||||
* 代码质量更高,更易维护
|
||||
|
||||
* 性能更优,响应更快
|
||||
|
||||
* 安全性更强,更可靠
|
||||
|
||||
* 功能更完善,用户体验更好
|
||||
|
||||
* 构建和部署更高效
|
||||
|
||||
* 测试覆盖更全面,质量更有保障
|
||||
|
||||
@@ -27,7 +27,8 @@ export default {
|
||||
dedupe: ['tslib']
|
||||
}),
|
||||
commonjs({
|
||||
transformMixedEsModules: true
|
||||
transformMixedEsModules: true,
|
||||
ignoreDynamicRequires: true
|
||||
}),
|
||||
json(),
|
||||
terser({
|
||||
|
||||
@@ -204,7 +204,7 @@ export class Core {
|
||||
return res.status(400).json({ status: 400, message: "缺少 path 参数" });
|
||||
}
|
||||
|
||||
const { ModCheckService } = await import('./dearth/index.js');
|
||||
const { ModCheckService } = await import('./dearth/index');
|
||||
const checkService = new ModCheckService(modsPath);
|
||||
const results = await checkService.checkMods();
|
||||
|
||||
@@ -238,7 +238,7 @@ export class Core {
|
||||
bundleName: bundleName.trim()
|
||||
});
|
||||
|
||||
const { ModCheckService } = await import('./dearth/index.js');
|
||||
const { ModCheckService } = await import('./dearth/index');
|
||||
const checkService = new ModCheckService(folderPath);
|
||||
const results = await checkService.checkModsWithBundle(bundleName.trim());
|
||||
|
||||
@@ -295,7 +295,7 @@ export class Core {
|
||||
// 获取模板列表
|
||||
this.app.get('/templates', async (req, res) => {
|
||||
try {
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
const templates = await templateManager.getTemplates();
|
||||
@@ -321,7 +321,7 @@ export class Core {
|
||||
return;
|
||||
}
|
||||
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
|
||||
@@ -353,7 +353,7 @@ export class Core {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateService = (templateModule as any).TemplateService;
|
||||
const templateService = new TemplateService();
|
||||
|
||||
@@ -385,7 +385,7 @@ export class Core {
|
||||
return;
|
||||
}
|
||||
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
|
||||
@@ -414,7 +414,7 @@ export class Core {
|
||||
const { id } = req.params;
|
||||
const path = await import('path');
|
||||
const { exec } = await import('child_process');
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
|
||||
const templateManager = new TemplateManager();
|
||||
@@ -449,7 +449,7 @@ export class Core {
|
||||
this.app.get('/templates/:id/export', async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
|
||||
@@ -491,7 +491,7 @@ export class Core {
|
||||
return res.status(400).json({ status: 400, message: "只支持 .zip 文件" });
|
||||
}
|
||||
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
|
||||
@@ -631,7 +631,7 @@ export class Core {
|
||||
unlinkSync(tempFilePath);
|
||||
|
||||
// 导入模板
|
||||
const templateModule = await import('./template/index.js');
|
||||
const templateModule = await import('./template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
|
||||
@@ -661,8 +661,8 @@ export class Core {
|
||||
});
|
||||
} catch (err) {
|
||||
const error = err as Error;
|
||||
const { requestId } = req.body;
|
||||
logger.error("/templates/install-from-url 路由错误", error);
|
||||
const { requestId, url } = req.body;
|
||||
logger.error("/templates/install-from-url 路由错误", { error: error.message, stack: error.stack, url });
|
||||
|
||||
// 发送错误信息到SSE连接
|
||||
if (sseConnections.has(requestId)) {
|
||||
@@ -670,7 +670,8 @@ export class Core {
|
||||
sseRes.write(`data: ${JSON.stringify({
|
||||
type: 'error',
|
||||
status: 500,
|
||||
message: "安装模板失败"
|
||||
message: "安装模板失败",
|
||||
details: error.message
|
||||
})}\n\n`);
|
||||
sseRes.end();
|
||||
sseConnections.delete(requestId);
|
||||
@@ -679,7 +680,11 @@ export class Core {
|
||||
// 清理下载状态
|
||||
downloadStates.delete(requestId);
|
||||
|
||||
res.status(500).json({ status: 500, message: "安装模板失败" });
|
||||
res.status(500).json({
|
||||
status: 500,
|
||||
message: "安装模板失败",
|
||||
details: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -716,7 +721,7 @@ export class Core {
|
||||
const { default: got } = await import('got');
|
||||
|
||||
// 从指定URL获取模板商店数据
|
||||
const response = await got('http://dex.xcclyc.cn/template/template_stor.json');
|
||||
const response = await got('http://git.xcclyc.cn/xcclyc/DeEarthX-CE-Tems/raw/branch/main/template_stor.json');
|
||||
const data = JSON.parse(response.body);
|
||||
|
||||
// 确保返回的数据结构符合前端预期
|
||||
|
||||
@@ -550,7 +550,7 @@ export class ModCheckService {
|
||||
jarData = fs.readFileSync(file.filename);
|
||||
}
|
||||
|
||||
const { yauzl_promise } = await import("../utils/ziplib.js");
|
||||
const { yauzl_promise } = await import("../utils/ziplib");
|
||||
const zipEntries = await yauzl_promise(jarData);
|
||||
|
||||
for (const entry of zipEntries) {
|
||||
|
||||
@@ -38,7 +38,7 @@ export async function mlsetup(ml: string, mcv: string, mlv: string, path: string
|
||||
messageWS.serverInstallStep(`Applying Template: ${template}`, 1, totalSteps);
|
||||
}
|
||||
|
||||
const templateModule = await import('../template/index.js');
|
||||
const templateModule = await import('../template/index');
|
||||
const TemplateManager = (templateModule as any).TemplateManager;
|
||||
const templateManager = new TemplateManager();
|
||||
const templates = await templateManager.getTemplates();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"common": {
|
||||
"app_name": "DeEarthX",
|
||||
"app_name": "DeEarthX-CE ",
|
||||
"version": "版本",
|
||||
"status_loading": "启动中",
|
||||
"status_success": "正常",
|
||||
@@ -42,7 +42,7 @@
|
||||
"step1_title": "解压整合包",
|
||||
"step1_desc": "解压内容并下载文件",
|
||||
"step2_title": "筛选模组",
|
||||
"step2_desc": "DeEarthX 的核心功能",
|
||||
"step2_desc": "DeEarthX-CE 的核心功能",
|
||||
"step3_title": "下载服务端",
|
||||
"step3_desc": "安装模组加载器服务端",
|
||||
"step4_title": "完成",
|
||||
@@ -171,8 +171,8 @@
|
||||
"store_load_failed": "加载模板商店失败"
|
||||
},
|
||||
"setting": {
|
||||
"title": "DeEarthX 设置",
|
||||
"subtitle": "让 DeEarthX V3 更适合你!",
|
||||
"title": "DeEarthX-CE 设置",
|
||||
"subtitle": "让 DeEarthX-CE V3 更适合你!",
|
||||
"category_filter": "模组筛选设置",
|
||||
"category_mirror": "下载源设置",
|
||||
"category_system": "系统管理设置",
|
||||
@@ -210,7 +210,7 @@
|
||||
"config_invalid_format": "配置文件格式无效"
|
||||
},
|
||||
"about": {
|
||||
"title": "关于 DeEarthX",
|
||||
"title": "关于 DeEarthX-CE",
|
||||
"subtitle": "专业的 Minecraft 整合包服务端制作工具",
|
||||
"about_software": "关于软件",
|
||||
"current_version": "当前版本:",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "3.0.36",
|
||||
"buildTime": "2026-03-15",
|
||||
"version": "3.0.37",
|
||||
"buildTime": "2026-03-17",
|
||||
"author": "xcclyc"
|
||||
}
|
||||
|
||||
@@ -27,6 +27,11 @@
|
||||
"csp": null
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"shell": {
|
||||
"open": true
|
||||
}
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
|
||||
@@ -5,6 +5,7 @@ import { SettingOutlined, UploadOutlined, UserOutlined, WindowsOutlined, Loading
|
||||
import { useRouter, useRoute } from 'vue-router';
|
||||
import { Command } from '@tauri-apps/plugin-shell';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { ErrorCode, createErrorInfo } from './utils/errorCodes';
|
||||
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
@@ -82,9 +83,11 @@ async function runCoreProcess() {
|
||||
|
||||
if (portStatus === 'wrong_app') {
|
||||
// 端口被其他应用占用
|
||||
const errorInfo = createErrorInfo(ErrorCode.BACKEND_PORT_OCCUPIED);
|
||||
backendStatus.value = 'error';
|
||||
backendErrorInfo.value = t('message.backend_port_occupied');
|
||||
message.error(t('message.backend_port_occupied'));
|
||||
backendErrorInfo.value = `${errorInfo.message} (错误码: ${errorInfo.code})`;
|
||||
message.error(backendErrorInfo.value);
|
||||
router.push(`/error?e=${encodeURIComponent(backendErrorInfo.value)}&code=${errorInfo.code}`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -105,15 +108,19 @@ async function runCoreProcess() {
|
||||
backendErrorInfo.value = '';
|
||||
message.success(t('message.backend_started'));
|
||||
} else {
|
||||
const errorInfo = createErrorInfo(ErrorCode.BACKEND_RESPONSE_ERROR, `HTTP 状态码: ${response.status}`);
|
||||
backendStatus.value = 'error';
|
||||
backendErrorInfo.value = t('common.status_error');
|
||||
router.push('/error');
|
||||
backendErrorInfo.value = `${errorInfo.message} (错误码: ${errorInfo.code})`;
|
||||
message.error(backendErrorInfo.value);
|
||||
router.push(`/error?e=${encodeURIComponent(backendErrorInfo.value)}&code=${errorInfo.code}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("后端连接失败:", error);
|
||||
const errorInfo = createErrorInfo(ErrorCode.BACKEND_CONNECTION_FAILED, error instanceof Error ? error.message : String(error));
|
||||
backendStatus.value = 'error';
|
||||
backendErrorInfo.value = t('common.status_error');
|
||||
router.push('/error');
|
||||
backendErrorInfo.value = `${errorInfo.message} (错误码: ${errorInfo.code})`;
|
||||
message.error(backendErrorInfo.value);
|
||||
router.push(`/error?e=${encodeURIComponent(backendErrorInfo.value)}&code=${errorInfo.code}`);
|
||||
}
|
||||
}, 3000); // 等待3秒让后端启动
|
||||
})
|
||||
@@ -127,9 +134,11 @@ async function runCoreProcess() {
|
||||
runCoreProcess();
|
||||
}, 2000);
|
||||
} else {
|
||||
const errorInfo = createErrorInfo(ErrorCode.BACKEND_START_FAILED, `已重试 ${maxRetries} 次`);
|
||||
backendStatus.value = 'error';
|
||||
backendErrorInfo.value = t('message.backend_start_failed', { count: maxRetries });
|
||||
message.error(t('message.backend_start_failed', { count: maxRetries }));
|
||||
backendErrorInfo.value = `${errorInfo.message} (错误码: ${errorInfo.code})`;
|
||||
message.error(backendErrorInfo.value);
|
||||
router.push(`/error?e=${encodeURIComponent(backendErrorInfo.value)}&code=${errorInfo.code}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { ref, inject, watch, onUnmounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { message, notification } from 'ant-design-vue';
|
||||
import { sendNotification } from '@tauri-apps/plugin-notification';
|
||||
import { ErrorCode, createErrorInfo } from '../utils/errorCodes';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
@@ -239,61 +240,49 @@ onUnmounted(() => {
|
||||
function handleError(result: any) {
|
||||
if (result === 'jini') {
|
||||
javaAvailable.value = false;
|
||||
const errorInfo = createErrorInfo(ErrorCode.JAVA_NOT_FOUND);
|
||||
notification.error({
|
||||
message: t('home.java_error_title'),
|
||||
description: t('home.java_error_desc'),
|
||||
message: `${t('home.java_error_title')} (错误码: ${errorInfo.code})`,
|
||||
description: `${t('home.java_error_desc')}\n\n${t('home.suggestions')}:\n${errorInfo.suggestions?.map((s, i) => `${i + 1}. ${s}`).join('\n')}`,
|
||||
duration: 0
|
||||
});
|
||||
} else if (typeof result === 'string') {
|
||||
let errorTitle = t('home.backend_error');
|
||||
let errorDesc = t('home.backend_error_desc', { error: result });
|
||||
let suggestions: string[] = [];
|
||||
let errorInfo;
|
||||
|
||||
if (result.includes('network') || result.includes('connection') || result.includes('timeout')) {
|
||||
errorTitle = t('home.network_error_title');
|
||||
errorDesc = t('home.network_error_desc', { error: result });
|
||||
suggestions = [
|
||||
t('home.suggestion_check_network'),
|
||||
t('home.suggestion_check_firewall'),
|
||||
t('home.suggestion_retry')
|
||||
];
|
||||
errorInfo = createErrorInfo(ErrorCode.NETWORK_ERROR, result);
|
||||
} else if (result.includes('file') || result.includes('permission') || result.includes('disk')) {
|
||||
errorTitle = t('home.file_error_title');
|
||||
errorDesc = t('home.file_error_desc', { error: result });
|
||||
suggestions = [
|
||||
t('home.suggestion_check_disk_space'),
|
||||
t('home.suggestion_check_permission'),
|
||||
t('home.suggestion_check_file_format')
|
||||
];
|
||||
} else if (result.includes('memory') || result.includes('out of memory') || result.includes('heap')) {
|
||||
errorTitle = t('home.memory_error_title');
|
||||
errorDesc = t('home.memory_error_desc', { error: result });
|
||||
suggestions = [
|
||||
t('home.suggestion_increase_memory'),
|
||||
t('home.suggestion_close_other_apps'),
|
||||
t('home.suggestion_restart_application')
|
||||
];
|
||||
if (result.includes('not found')) {
|
||||
errorInfo = createErrorInfo(ErrorCode.FILE_NOT_FOUND, result);
|
||||
} else if (result.includes('permission')) {
|
||||
errorInfo = createErrorInfo(ErrorCode.FILE_PERMISSION_ERROR, result);
|
||||
} else if (result.includes('format')) {
|
||||
errorInfo = createErrorInfo(ErrorCode.FILE_FORMAT_ERROR, result);
|
||||
} else {
|
||||
suggestions = [
|
||||
t('home.suggestion_check_backend'),
|
||||
t('home.suggestion_check_logs'),
|
||||
t('home.suggestion_contact_support')
|
||||
];
|
||||
errorInfo = createErrorInfo(ErrorCode.FILE_NOT_FOUND, result);
|
||||
}
|
||||
} else if (result.includes('memory') || result.includes('out of memory') || result.includes('heap')) {
|
||||
errorInfo = createErrorInfo(ErrorCode.MEMORY_INSUFFICIENT, result);
|
||||
} else if (result.includes('disk') || result.includes('space')) {
|
||||
errorInfo = createErrorInfo(ErrorCode.DISK_SPACE_INSUFFICIENT, result);
|
||||
} else {
|
||||
errorInfo = createErrorInfo(ErrorCode.UNKNOWN_ERROR, result);
|
||||
}
|
||||
|
||||
const fullDescription = `${errorDesc}\n\n${t('home.suggestions')}:\n${suggestions.map((s, i) => `${i + 1}. ${s}`).join('\n')}`;
|
||||
const fullDescription = `${errorInfo.message}: ${errorInfo.details}\n\n${t('home.suggestions')}:\n${errorInfo.suggestions?.map((s, i) => `${i + 1}. ${s}`).join('\n')}`;
|
||||
|
||||
notification.error({
|
||||
message: errorTitle,
|
||||
message: `${errorInfo.message} (错误码: ${errorInfo.code})`,
|
||||
description: fullDescription,
|
||||
duration: 0
|
||||
});
|
||||
|
||||
resetState();
|
||||
} else {
|
||||
const errorInfo = createErrorInfo(ErrorCode.UNKNOWN_ERROR);
|
||||
notification.error({
|
||||
message: t('home.unknown_error_title'),
|
||||
description: t('home.unknown_error_desc'),
|
||||
message: `${t('home.unknown_error_title')} (错误码: ${errorInfo.code})`,
|
||||
description: `${t('home.unknown_error_desc')}\n\n${t('home.suggestions')}:\n${errorInfo.suggestions?.map((s, i) => `${i + 1}. ${s}`).join('\n')}`,
|
||||
duration: 0
|
||||
});
|
||||
resetState();
|
||||
|
||||
153
front/src/utils/errorCodes.ts
Normal file
153
front/src/utils/errorCodes.ts
Normal file
@@ -0,0 +1,153 @@
|
||||
// 错误码定义
|
||||
export enum ErrorCode {
|
||||
// 后端启动相关错误
|
||||
BACKEND_START_FAILED = 1001,
|
||||
BACKEND_PORT_OCCUPIED = 1002,
|
||||
BACKEND_CONNECTION_FAILED = 1003,
|
||||
BACKEND_RESPONSE_ERROR = 1004,
|
||||
|
||||
// 网络相关错误
|
||||
NETWORK_ERROR = 2001,
|
||||
NETWORK_TIMEOUT = 2002,
|
||||
NETWORK_CONNECTION_REFUSED = 2003,
|
||||
|
||||
// 文件相关错误
|
||||
FILE_NOT_FOUND = 3001,
|
||||
FILE_PERMISSION_ERROR = 3002,
|
||||
FILE_FORMAT_ERROR = 3003,
|
||||
FILE_SIZE_ERROR = 3004,
|
||||
|
||||
// 系统相关错误
|
||||
JAVA_NOT_FOUND = 4001,
|
||||
DISK_SPACE_INSUFFICIENT = 4002,
|
||||
MEMORY_INSUFFICIENT = 4003,
|
||||
|
||||
// 未知错误
|
||||
UNKNOWN_ERROR = 9999
|
||||
}
|
||||
|
||||
// 错误信息映射
|
||||
export const errorMessages: Record<ErrorCode, string> = {
|
||||
[ErrorCode.BACKEND_START_FAILED]: '后端服务启动失败',
|
||||
[ErrorCode.BACKEND_PORT_OCCUPIED]: '后端服务端口被占用',
|
||||
[ErrorCode.BACKEND_CONNECTION_FAILED]: '后端服务连接失败',
|
||||
[ErrorCode.BACKEND_RESPONSE_ERROR]: '后端服务响应错误',
|
||||
[ErrorCode.NETWORK_ERROR]: '网络连接错误',
|
||||
[ErrorCode.NETWORK_TIMEOUT]: '网络连接超时',
|
||||
[ErrorCode.NETWORK_CONNECTION_REFUSED]: '网络连接被拒绝',
|
||||
[ErrorCode.FILE_NOT_FOUND]: '文件未找到',
|
||||
[ErrorCode.FILE_PERMISSION_ERROR]: '文件权限错误',
|
||||
[ErrorCode.FILE_FORMAT_ERROR]: '文件格式错误',
|
||||
[ErrorCode.FILE_SIZE_ERROR]: '文件大小错误',
|
||||
[ErrorCode.JAVA_NOT_FOUND]: 'Java 未找到',
|
||||
[ErrorCode.DISK_SPACE_INSUFFICIENT]: '磁盘空间不足',
|
||||
[ErrorCode.MEMORY_INSUFFICIENT]: '内存不足',
|
||||
[ErrorCode.UNKNOWN_ERROR]: '未知错误'
|
||||
};
|
||||
|
||||
// 错误建议映射
|
||||
export const errorSuggestions: Record<ErrorCode, string[]> = {
|
||||
[ErrorCode.BACKEND_START_FAILED]: [
|
||||
'检查 37019 端口是否被占用',
|
||||
'检查后端服务是否正常',
|
||||
'重启应用程序'
|
||||
],
|
||||
[ErrorCode.BACKEND_PORT_OCCUPIED]: [
|
||||
'关闭占用 37019 端口的其他应用',
|
||||
'检查是否有其他 DeEarthX 实例在运行',
|
||||
'重启计算机后再试'
|
||||
],
|
||||
[ErrorCode.BACKEND_CONNECTION_FAILED]: [
|
||||
'检查后端服务是否正在运行',
|
||||
'检查网络连接是否正常',
|
||||
'重启应用程序'
|
||||
],
|
||||
[ErrorCode.BACKEND_RESPONSE_ERROR]: [
|
||||
'检查后端服务是否正常',
|
||||
'重启后端服务',
|
||||
'联系技术支持'
|
||||
],
|
||||
[ErrorCode.NETWORK_ERROR]: [
|
||||
'检查网络连接是否正常',
|
||||
'检查防火墙设置',
|
||||
'稍后重试'
|
||||
],
|
||||
[ErrorCode.NETWORK_TIMEOUT]: [
|
||||
'检查网络连接速度',
|
||||
'稍后重试',
|
||||
'检查目标服务器是否可访问'
|
||||
],
|
||||
[ErrorCode.NETWORK_CONNECTION_REFUSED]: [
|
||||
'检查目标服务器是否正在运行',
|
||||
'检查网络连接是否正常',
|
||||
'检查防火墙设置'
|
||||
],
|
||||
[ErrorCode.FILE_NOT_FOUND]: [
|
||||
'确认文件路径是否正确',
|
||||
'检查文件是否存在',
|
||||
'重新上传文件'
|
||||
],
|
||||
[ErrorCode.FILE_PERMISSION_ERROR]: [
|
||||
'检查文件权限设置',
|
||||
'以管理员身份运行应用程序',
|
||||
'检查文件是否被其他程序占用'
|
||||
],
|
||||
[ErrorCode.FILE_FORMAT_ERROR]: [
|
||||
'确认文件格式是否正确',
|
||||
'重新上传正确格式的文件',
|
||||
'检查文件是否损坏'
|
||||
],
|
||||
[ErrorCode.FILE_SIZE_ERROR]: [
|
||||
'检查文件大小是否符合要求',
|
||||
'压缩文件后再上传',
|
||||
'检查磁盘空间是否充足'
|
||||
],
|
||||
[ErrorCode.JAVA_NOT_FOUND]: [
|
||||
'安装 Java 17 或更高版本',
|
||||
'配置 Java 环境变量',
|
||||
'重启应用程序'
|
||||
],
|
||||
[ErrorCode.DISK_SPACE_INSUFFICIENT]: [
|
||||
'清理磁盘空间',
|
||||
'选择其他存储位置',
|
||||
'删除不必要的文件'
|
||||
],
|
||||
[ErrorCode.MEMORY_INSUFFICIENT]: [
|
||||
'增加系统内存',
|
||||
'关闭其他占用内存的应用程序',
|
||||
'减少同时处理的任务数量'
|
||||
],
|
||||
[ErrorCode.UNKNOWN_ERROR]: [
|
||||
'重启应用程序',
|
||||
'检查系统日志',
|
||||
'联系技术支持'
|
||||
]
|
||||
};
|
||||
|
||||
// 获取错误信息
|
||||
export function getErrorMessage(code: ErrorCode): string {
|
||||
return errorMessages[code] || errorMessages[ErrorCode.UNKNOWN_ERROR];
|
||||
}
|
||||
|
||||
// 获取错误建议
|
||||
export function getErrorSuggestions(code: ErrorCode): string[] {
|
||||
return errorSuggestions[code] || errorSuggestions[ErrorCode.UNKNOWN_ERROR];
|
||||
}
|
||||
|
||||
// 错误对象接口
|
||||
export interface ErrorInfo {
|
||||
code: ErrorCode;
|
||||
message: string;
|
||||
details?: string;
|
||||
suggestions?: string[];
|
||||
}
|
||||
|
||||
// 创建错误信息
|
||||
export function createErrorInfo(code: ErrorCode, details?: string): ErrorInfo {
|
||||
return {
|
||||
code,
|
||||
message: getErrorMessage(code),
|
||||
details,
|
||||
suggestions: getErrorSuggestions(code)
|
||||
};
|
||||
}
|
||||
@@ -1,22 +1,75 @@
|
||||
<template>
|
||||
<div class="tw:h-full tw:w-full tw:flex tw:flex-col tw:justify-center tw:items-center">
|
||||
<div class="tw:w-32 tw:h-32 tw:mb-25">
|
||||
<svg class="w-32 h-32 mb-4" viewBox="0 0 120 120">
|
||||
<circle cx="60" cy="60" r="50" fill="#ef4444" />
|
||||
<path d="M40,40 L80,80 M80,40 L40,80" stroke="white" stroke-width="10" stroke-linecap="round" />
|
||||
<div class="tw:h-screen tw:w-full tw:flex tw:flex-col tw:justify-center tw:items-center tw:bg-gradient-to-br tw:from-gray-50 tw:to-gray-100">
|
||||
<div class="tw:w-32 tw:h-32 tw:mb-8">
|
||||
<svg class="w-32 h-32 mb-4 tw:transition-all tw:duration-300 tw:hover:scale-110" viewBox="0 0 120 120">
|
||||
<circle cx="60" cy="60" r="50" fill="#ef4444" class="tw:opacity-80" />
|
||||
<path d="M40,40 L80,80 M80,40 L40,80" stroke="white" stroke-width="10" stroke-linecap="round" class="tw:opacity-90" />
|
||||
</svg>
|
||||
<p class="tw:text-2xl tw:font-bold tw:text-center tw:mb-20 tw:text-red-500">Error</p>
|
||||
<p class="tw:text-sm tw:text-center tw:text-gray-500">
|
||||
</div>
|
||||
<h1 class="tw:text-3xl tw:font-bold tw:text-center tw:mb-6 tw:text-red-500">错误提示</h1>
|
||||
<div class="tw:w-1/2 tw:max-w-md tw:bg-white tw:p-8 tw:rounded-xl tw:shadow-xl tw:border tw:border-gray-100 tw:transition-all tw:duration-300 tw:hover:shadow-2xl">
|
||||
<div class="tw:text-center tw:mb-6">
|
||||
<p class="tw:text-lg tw:font-medium tw:text-gray-700 mb-2">
|
||||
{{ errorMessage }}
|
||||
</p>
|
||||
<div v-if="errorCode" class="tw:inline-block tw:px-4 tw:py-1 tw:bg-red-50 tw:text-red-600 tw:rounded-full tw:text-sm tw:font-medium mt-2">
|
||||
错误码:{{ errorCode }}
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="suggestions.length > 0" class="tw:mt-6 tw:bg-gray-50 tw:p-4 tw:rounded-lg">
|
||||
<p class="tw:text-sm tw:font-medium tw:text-gray-700 mb-3">建议解决方案:</p>
|
||||
<ul class="tw:text-sm tw:text-gray-600">
|
||||
<li v-for="(suggestion, index) in suggestions" :key="index" class="tw:mb-2 tw:flex tw:items-start">
|
||||
<span class="tw:w-5 tw:h-5 tw:flex tw:items-center tw:justify-center tw:bg-red-100 tw:text-red-500 tw:rounded-full tw:mr-3 tw:mt-0.5">
|
||||
{{ index + 1 }}
|
||||
</span>
|
||||
<span>{{ suggestion }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tw:mt-8 tw:flex tw:justify-center tw:gap-4">
|
||||
<button
|
||||
class="tw:px-6 tw:py-2.5 tw:bg-[#67eac3] tw:text-gray-800 tw:rounded-lg tw:hover:bg-[#56d9b0] tw:transition-all tw:duration-300 tw:font-medium tw:shadow-sm tw:hover:shadow"
|
||||
@click="goBack"
|
||||
>
|
||||
返回首页
|
||||
</button>
|
||||
<button
|
||||
v-if="errorCode"
|
||||
class="tw:px-6 tw:py-2.5 tw:bg-white tw:text-[#67eac3] tw:rounded-lg tw:hover:bg-gray-50 tw:transition-all tw:duration-300 tw:font-medium tw:shadow-sm tw:hover:shadow tw:border tw:border-[#67eac3]"
|
||||
@click="openErrorDoc"
|
||||
>
|
||||
文档帮助
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tw:mt-8 tw:text-xs tw:text-gray-400">
|
||||
DeEarthX Core © {{ new Date().getFullYear() }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { useRoute } from 'vue-router';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { ErrorCode, getErrorSuggestions } from '../utils/errorCodes';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const errorReason = route.query.e as string;
|
||||
const errorMessage = errorReason ? `错误原因:${errorReason}` : 'DeEarthX.Core 启动失败!';
|
||||
const errorCodeStr = route.query.code as string;
|
||||
const errorCode = errorCodeStr ? parseInt(errorCodeStr) as ErrorCode : undefined;
|
||||
const errorMessage = errorReason ? errorReason : 'DeEarthX.Core 启动失败!';
|
||||
const suggestions = errorCode ? getErrorSuggestions(errorCode) : [];
|
||||
|
||||
function goBack() {
|
||||
router.push('/');
|
||||
}
|
||||
|
||||
function openErrorDoc() {
|
||||
if (errorCode) {
|
||||
const url = `https://dex.xcclyc.cn/api/error-codes.html#_${errorCode}`;
|
||||
open(url);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { ref, onMounted, computed } from 'vue';
|
||||
import { message } from 'ant-design-vue';
|
||||
import { PlusOutlined, DeleteOutlined, FolderOutlined, ExclamationCircleOutlined, EditOutlined, UploadOutlined, DownloadOutlined } from '@ant-design/icons-vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
@@ -25,6 +25,8 @@ interface StoreTemplate {
|
||||
description: string;
|
||||
size: string;
|
||||
downloadUrls: string[];
|
||||
version: string;
|
||||
tag: string;
|
||||
}
|
||||
|
||||
const templates = ref<Template[]>([]);
|
||||
@@ -81,6 +83,29 @@ async function testDownloadSpeed(urls: string[]): Promise<string> {
|
||||
const storeTemplates = ref<StoreTemplate[]>([]);
|
||||
const storeLoading = ref(false);
|
||||
const activeTab = ref('local'); // 'local' 或 'store'
|
||||
const selectedTag = ref<string>('all'); // 'all', 'dex', 'CE'
|
||||
const searchKeyword = ref('');
|
||||
|
||||
// 过滤后的模板
|
||||
const filteredStoreTemplates = computed(() => {
|
||||
let filtered = storeTemplates.value;
|
||||
|
||||
// 按标签筛选
|
||||
if (selectedTag.value !== 'all') {
|
||||
filtered = filtered.filter(template => template.tag === selectedTag.value);
|
||||
}
|
||||
|
||||
// 按关键词搜索
|
||||
if (searchKeyword.value) {
|
||||
const keyword = searchKeyword.value.toLowerCase();
|
||||
filtered = filtered.filter(template =>
|
||||
template.name.toLowerCase().includes(keyword) ||
|
||||
template.description.toLowerCase().includes(keyword)
|
||||
);
|
||||
}
|
||||
|
||||
return filtered;
|
||||
});
|
||||
|
||||
const newTemplate = ref({
|
||||
name: '',
|
||||
@@ -533,7 +558,9 @@ async function downloadAndInstallTemplate(template: StoreTemplate) {
|
||||
// 关闭通知
|
||||
message.destroy(notificationKey);
|
||||
|
||||
message.error(data.message || t('template.install_failed'));
|
||||
const errorMessage = data.message || t('template.install_failed');
|
||||
const errorDetails = data.details ? ` (${data.details})` : '';
|
||||
message.error(errorMessage + errorDetails);
|
||||
// 重置状态
|
||||
downloadLoading.value = false;
|
||||
showDownloadProgress.value = false;
|
||||
@@ -583,7 +610,7 @@ onMounted(() => {
|
||||
<div class="tw:flex tw:justify-between tw:items-center tw:mb-6">
|
||||
<div>
|
||||
<h1 class="tw:text-2xl tw:font-bold tw:text-gray-800">{{ t('template.title') }}</h1>
|
||||
<p class="tw:text-gray-600 tw:mt-1">{{ t('template.description') }}</p>
|
||||
<p class="tw:text-gray-600 tw:mt-1">可选 | 模板是DeEarthX的一种扩展方式,用于快速生成服务端和增加稳定性</p>
|
||||
</div>
|
||||
<div class="tw:flex tw:gap-2">
|
||||
<a-upload
|
||||
@@ -672,7 +699,27 @@ onMounted(() => {
|
||||
|
||||
<!-- 模板商店 -->
|
||||
<a-spin v-if="activeTab === 'store'" :spinning="storeLoading">
|
||||
<div v-if="storeTemplates.length === 0 && !storeLoading" class="tw:text-center tw:py-16 tw:text-gray-500">
|
||||
<!-- 搜索和筛选 -->
|
||||
<div v-if="storeTemplates.length > 0 && !storeLoading" class="tw:flex tw:flex-wrap tw:justify-between tw:items-center tw:mb-4">
|
||||
<div class="tw:flex tw:gap-2">
|
||||
<a-radio-group v-model:value="selectedTag" class="tw-mr-4">
|
||||
<a-radio-button value="all">全部</a-radio-button>
|
||||
<a-radio-button value="dex">官方</a-radio-button>
|
||||
<a-radio-button value="CE">社区</a-radio-button>
|
||||
</a-radio-group>
|
||||
</div>
|
||||
<a-input-search
|
||||
v-model:value="searchKeyword"
|
||||
placeholder="搜索模板"
|
||||
style="width: 200px"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p class="tw:text-xs tw:text-gray-400 tw:mt-1">社区提供的模板官方未经检测,请自行选择使用</p>
|
||||
</div>
|
||||
|
||||
<div v-if="filteredStoreTemplates.length === 0 && !storeLoading" class="tw:text-center tw:py-16 tw:text-gray-500">
|
||||
<DownloadOutlined style="font-size: 64px; margin-bottom: 16px;" />
|
||||
<p class="tw:text-lg">{{ t('template.store_empty') }}</p>
|
||||
<p class="tw:text-sm tw:mt-2">{{ t('template.store_empty_hint') }}</p>
|
||||
@@ -680,16 +727,24 @@ onMounted(() => {
|
||||
|
||||
<div v-else class="tw:grid tw:grid-cols-1 md:tw:grid-cols-2 lg:tw:grid-cols-3 tw:gap-4">
|
||||
<div
|
||||
v-for="template in storeTemplates"
|
||||
v-for="template in filteredStoreTemplates"
|
||||
:key="template.id"
|
||||
class="tw:bg-white tw:rounded-lg tw:shadow-md tw:p-5 tw:h-48 tw:flex tw:flex-col tw:border tw:border-gray-200 tw:transition-all tw:duration-300 hover:tw:shadow-lg hover:tw:border-blue-300"
|
||||
>
|
||||
<div class="tw:flex-1 tw:overflow-hidden">
|
||||
<div class="tw:flex tw:justify-between tw:items-start tw:mb-2">
|
||||
<h3 class="tw:text-lg tw:font-semibold tw:truncate tw:flex-1 tw:mr-2">{{ template.name }}</h3>
|
||||
<div class="tw:flex tw:gap-2">
|
||||
<a-tag color="green" size="small">{{ template.size }}</a-tag>
|
||||
<a-tag :color="template.tag === 'dex' ? 'blue' : 'orange'" size="small">
|
||||
{{ template.tag === 'dex' ? '官方' : '社区' }}
|
||||
</a-tag>
|
||||
</div>
|
||||
</div>
|
||||
<p class="tw:text-sm tw:text-gray-600 tw:line-clamp-2 tw:mb-3">{{ template.description }}</p>
|
||||
<div class="tw:flex tw:justify-between tw:text-xs tw:text-gray-500">
|
||||
<span>版本: {{ template.version }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tw:flex tw:justify-end tw:mt-4 tw:pt-4 tw:border-t tw:border-gray-100">
|
||||
<a-button type="primary" size="small" @click="downloadAndInstallTemplate(template)">
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
"size": "108.6MB",
|
||||
"downloadUrls": [
|
||||
"https://pan.xcclyc.cn/f/pjfR/xccdex-official-fabric-1.20.1-0.18.4.zip"
|
||||
]
|
||||
],
|
||||
"version": "0.18.4",
|
||||
"tag": "dex"
|
||||
}
|
||||
]
|
||||
}
|
||||
1173
pnpm-lock.yaml
generated
1173
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
84
word/.vitepress/cache/deps/@theme_index.js
vendored
84
word/.vitepress/cache/deps/@theme_index.js
vendored
@@ -8,59 +8,59 @@ import {
|
||||
watch
|
||||
} from "./chunk-VIGQSUQT.js";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/index.js
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/fonts.css";
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/index.js
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/fonts.css";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/without-fonts.js
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/vars.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/base.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/icons.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/utils.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
|
||||
import VPBadge from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
|
||||
import Layout from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/Layout.vue";
|
||||
import { default as default2 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
|
||||
import { default as default3 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPButton.vue";
|
||||
import { default as default4 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
|
||||
import { default as default5 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue";
|
||||
import { default as default6 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue";
|
||||
import { default as default7 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
|
||||
import { default as default8 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue";
|
||||
import { default as default9 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
|
||||
import { default as default10 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPImage.vue";
|
||||
import { default as default11 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPLink.vue";
|
||||
import { default as default12 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue";
|
||||
import { default as default13 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue";
|
||||
import { default as default14 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue";
|
||||
import { default as default15 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue";
|
||||
import { default as default16 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
|
||||
import { default as default17 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue";
|
||||
import { default as default18 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
|
||||
import { default as default19 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/without-fonts.js
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/vars.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/base.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/icons.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/utils.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css";
|
||||
import "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
|
||||
import VPBadge from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
|
||||
import Layout from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/Layout.vue";
|
||||
import { default as default2 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
|
||||
import { default as default3 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPButton.vue";
|
||||
import { default as default4 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
|
||||
import { default as default5 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue";
|
||||
import { default as default6 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue";
|
||||
import { default as default7 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
|
||||
import { default as default8 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue";
|
||||
import { default as default9 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
|
||||
import { default as default10 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPImage.vue";
|
||||
import { default as default11 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPLink.vue";
|
||||
import { default as default12 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue";
|
||||
import { default as default13 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue";
|
||||
import { default as default14 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue";
|
||||
import { default as default15 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue";
|
||||
import { default as default16 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
|
||||
import { default as default17 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue";
|
||||
import { default as default18 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
|
||||
import { default as default19 } from "D:/Users/Grace-X/Desktop/DeEarthX-CE/node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
|
||||
import { onContentUpdated } from "vitepress";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/outline.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/outline.js
|
||||
import { getScrollOffset } from "vitepress";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/support/utils.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/support/utils.js
|
||||
import { withBase } from "vitepress";
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/data.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/data.js
|
||||
import { useData as useData$ } from "vitepress";
|
||||
var useData = useData$;
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/support/utils.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/support/utils.js
|
||||
function ensureStartingSlash(path) {
|
||||
return path.startsWith("/") ? path : `/${path}`;
|
||||
}
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/support/sidebar.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/support/sidebar.js
|
||||
function getSidebar(_sidebar, path) {
|
||||
if (Array.isArray(_sidebar))
|
||||
return addBase(_sidebar);
|
||||
@@ -103,7 +103,7 @@ function addBase(items, _base) {
|
||||
});
|
||||
}
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/sidebar.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/sidebar.js
|
||||
function useSidebar() {
|
||||
const { frontmatter, page, theme: theme2 } = useData();
|
||||
const is960 = useMediaQuery("(min-width: 960px)");
|
||||
@@ -160,7 +160,7 @@ function useSidebar() {
|
||||
};
|
||||
}
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/outline.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/outline.js
|
||||
var ignoreRE = /\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/;
|
||||
var resolvedHeaders = [];
|
||||
function getHeaders(range) {
|
||||
@@ -225,7 +225,7 @@ function buildTree(data, min, max) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
|
||||
function useLocalNav() {
|
||||
const { theme: theme2, frontmatter } = useData();
|
||||
const headers = shallowRef([]);
|
||||
@@ -241,7 +241,7 @@ function useLocalNav() {
|
||||
};
|
||||
}
|
||||
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/without-fonts.js
|
||||
// ../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/without-fonts.js
|
||||
var theme = {
|
||||
Layout,
|
||||
enhanceApp: ({ app }) => {
|
||||
|
||||
File diff suppressed because one or more lines are too long
18
word/.vitepress/cache/deps/_metadata.json
vendored
18
word/.vitepress/cache/deps/_metadata.json
vendored
@@ -1,31 +1,31 @@
|
||||
{
|
||||
"hash": "6976e0a7",
|
||||
"configHash": "16b5e256",
|
||||
"lockfileHash": "b21b0169",
|
||||
"browserHash": "1a32ef31",
|
||||
"hash": "c346a9bf",
|
||||
"configHash": "efc30d79",
|
||||
"lockfileHash": "1f28932e",
|
||||
"browserHash": "a0a1bed8",
|
||||
"optimized": {
|
||||
"vue": {
|
||||
"src": "../../../../node_modules/.pnpm/vue@3.5.29_typescript@5.9.3/node_modules/vue/dist/vue.runtime.esm-bundler.js",
|
||||
"file": "vue.js",
|
||||
"fileHash": "7e923f01",
|
||||
"fileHash": "f9cb5b91",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > @vue/devtools-api": {
|
||||
"src": "../../../../node_modules/.pnpm/@vue+devtools-api@7.7.9/node_modules/@vue/devtools-api/dist/index.js",
|
||||
"file": "vitepress___@vue_devtools-api.js",
|
||||
"fileHash": "0373f16c",
|
||||
"fileHash": "6601cb18",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > @vueuse/core": {
|
||||
"src": "../../../../node_modules/.pnpm/@vueuse+core@12.8.2_typescript@5.9.3/node_modules/@vueuse/core/index.mjs",
|
||||
"file": "vitepress___@vueuse_core.js",
|
||||
"fileHash": "67853364",
|
||||
"fileHash": "37e71cfa",
|
||||
"needsInterop": false
|
||||
},
|
||||
"@theme/index": {
|
||||
"src": "../../../../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_b21953e64bdc687d6358312771661039/node_modules/vitepress/dist/client/theme-default/index.js",
|
||||
"src": "../../../../node_modules/.pnpm/vitepress@1.6.4_@algolia+cl_24d2dfd0c17bd24a27a1736f87e83da8/node_modules/vitepress/dist/client/theme-default/index.js",
|
||||
"file": "@theme_index.js",
|
||||
"fileHash": "58797fc7",
|
||||
"fileHash": "8723d3d2",
|
||||
"needsInterop": false
|
||||
}
|
||||
},
|
||||
|
||||
@@ -33,14 +33,15 @@ export default defineConfig({
|
||||
items: [
|
||||
{ text: '核心模块', link: '/api/core' },
|
||||
{ text: '后端 API', link: '/api/backend' },
|
||||
{ text: '前端 API', link: '/api/frontend' }
|
||||
{ text: '前端 API', link: '/api/frontend' },
|
||||
{ text: '错误码说明', link: '/api/error-codes' }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
socialLinks: [
|
||||
{ icon: 'github', link: 'https://github.com' }
|
||||
{ icon: 'gitea', link: 'https://git.xcclyc.cn/xcclyc/DeEarthX-CE' }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
266
word/api/error-codes.md
Normal file
266
word/api/error-codes.md
Normal file
@@ -0,0 +1,266 @@
|
||||
# 错误码说明
|
||||
|
||||
本文档详细说明了 DeEarthX 应用中使用的错误码系统,帮助用户和开发者理解和排查错误。
|
||||
|
||||
## 错误码格式
|
||||
|
||||
错误码采用四位数字格式,第一位数字表示错误类别,后三位数字表示具体错误:
|
||||
|
||||
- `1xxx`: 后端启动相关错误
|
||||
- `2xxx`: 网络相关错误
|
||||
- `3xxx`: 文件相关错误
|
||||
- `4xxx`: 系统相关错误
|
||||
- `9999`: 未知错误
|
||||
|
||||
## 错误码详情
|
||||
|
||||
### 1. 后端启动相关错误
|
||||
|
||||
#### 1001
|
||||
|
||||
**错误信息**: 后端服务启动失败
|
||||
|
||||
**可能原因**:
|
||||
- 后端服务无法启动
|
||||
- 可能是权限问题(不要安装在C盘哦~)
|
||||
- 可能是文件损坏
|
||||
- 可能是端口被占用
|
||||
|
||||
**解决方案**:
|
||||
1. 检查 37019 端口是否被占用
|
||||
2. 检查后端服务是否正常
|
||||
3. 重启应用程序
|
||||
|
||||
#### 1002
|
||||
|
||||
**错误信息**: 后端服务端口被占用
|
||||
|
||||
**可能原因**:
|
||||
- 37019 端口已被其他应用占用
|
||||
- 可能有其他 DeEarthX 实例在运行
|
||||
|
||||
**解决方案**:
|
||||
1. 关闭占用 37019 端口的其他应用
|
||||
2. 检查是否有其他 DeEarthX 实例在运行
|
||||
3. 重启计算机后再试
|
||||
|
||||
#### 1003
|
||||
|
||||
**错误信息**: 后端服务连接失败
|
||||
|
||||
**可能原因**:
|
||||
- 无法连接到后端服务
|
||||
- 后端服务可能未启动
|
||||
- 网络连接可能存在问题
|
||||
|
||||
**解决方案**:
|
||||
1. 检查后端服务是否正在运行
|
||||
2. 检查网络连接是否正常
|
||||
3. 重启应用程序
|
||||
|
||||
#### 1004
|
||||
|
||||
**错误信息**: 后端服务响应错误
|
||||
|
||||
**可能原因**:
|
||||
- 后端服务返回错误响应
|
||||
- 后端服务可能出现内部错误
|
||||
|
||||
**解决方案**:
|
||||
1. 检查后端服务是否正常
|
||||
2. 重启后端服务
|
||||
3. 联系技术支持
|
||||
|
||||
### 2. 网络相关错误
|
||||
|
||||
#### 2001
|
||||
|
||||
**错误信息**: 网络连接错误
|
||||
|
||||
**可能原因**:
|
||||
- 网络连接出现问题
|
||||
- 网络不稳定
|
||||
- 网络中断
|
||||
|
||||
**解决方案**:
|
||||
1. 检查网络连接是否正常
|
||||
2. 检查防火墙设置
|
||||
3. 稍后重试
|
||||
|
||||
#### 2002
|
||||
|
||||
**错误信息**: 网络连接超时
|
||||
|
||||
**可能原因**:
|
||||
- 网络连接超时
|
||||
- 网络速度过慢
|
||||
- 目标服务器响应缓慢
|
||||
|
||||
**解决方案**:
|
||||
1. 检查网络连接速度
|
||||
2. 稍后重试
|
||||
3. 检查目标服务器是否可访问
|
||||
|
||||
#### 2003
|
||||
|
||||
**错误信息**: 网络连接被拒绝
|
||||
|
||||
**可能原因**:
|
||||
- 网络连接被拒绝
|
||||
- 目标服务器可能未运行
|
||||
- 防火墙可能阻止连接
|
||||
|
||||
**解决方案**:
|
||||
1. 检查目标服务器是否正在运行
|
||||
2. 检查网络连接是否正常
|
||||
3. 检查防火墙设置
|
||||
|
||||
### 3. 文件相关错误
|
||||
|
||||
#### 3001
|
||||
|
||||
**错误信息**: 文件未找到
|
||||
|
||||
**可能原因**:
|
||||
- 文件不存在
|
||||
- 文件路径不正确
|
||||
- 文件可能被删除或移动
|
||||
|
||||
**解决方案**:
|
||||
1. 确认文件路径是否正确
|
||||
2. 检查文件是否存在
|
||||
3. 重新上传文件
|
||||
|
||||
#### 3002
|
||||
|
||||
**错误信息**: 文件权限错误
|
||||
|
||||
**可能原因**:
|
||||
- 没有文件操作权限
|
||||
- 文件可能被其他程序占用
|
||||
- 应用程序可能没有足够的权限
|
||||
|
||||
**解决方案**:
|
||||
1. 检查文件权限设置
|
||||
2. 以管理员身份运行应用程序
|
||||
3. 检查文件是否被其他程序占用
|
||||
|
||||
#### 3003
|
||||
|
||||
**错误信息**: 文件格式错误
|
||||
|
||||
**可能原因**:
|
||||
- 文件格式不正确
|
||||
- 文件可能损坏
|
||||
- 文件类型不符合要求
|
||||
|
||||
**解决方案**:
|
||||
1. 确认文件格式是否正确
|
||||
2. 重新上传正确格式的文件
|
||||
3. 检查文件是否损坏
|
||||
|
||||
#### 3004
|
||||
|
||||
**错误信息**: 文件大小错误
|
||||
|
||||
**可能原因**:
|
||||
- 文件大小不符合要求
|
||||
- 磁盘空间可能不足
|
||||
- 文件可能过大
|
||||
|
||||
**解决方案**:
|
||||
1. 检查文件大小是否符合要求
|
||||
2. 压缩文件后再上传
|
||||
3. 检查磁盘空间是否充足
|
||||
|
||||
### 4. 系统相关错误
|
||||
|
||||
#### 4001
|
||||
|
||||
**错误信息**: Java 未找到
|
||||
|
||||
**可能原因**:
|
||||
- 系统中未安装 Java
|
||||
- Java 环境变量未配置
|
||||
- Java 版本可能不兼容
|
||||
|
||||
**解决方案**:
|
||||
1. 安装 Java 17 或更高版本
|
||||
2. 配置 Java 环境变量
|
||||
3. 重启应用程序
|
||||
|
||||
#### 4002
|
||||
|
||||
**错误信息**: 磁盘空间不足
|
||||
|
||||
**可能原因**:
|
||||
- 磁盘空间不足
|
||||
- 目标存储位置空间已满
|
||||
|
||||
**解决方案**:
|
||||
1. 清理磁盘空间
|
||||
2. 选择其他存储位置
|
||||
3. 删除不必要的文件
|
||||
|
||||
#### 4003
|
||||
|
||||
**错误信息**: 内存不足
|
||||
|
||||
**可能原因**:
|
||||
- 系统内存不足
|
||||
- 应用程序占用内存过多
|
||||
- 其他应用程序占用大量内存
|
||||
|
||||
**解决方案**:
|
||||
1. 增加系统内存
|
||||
2. 关闭其他占用内存的应用程序
|
||||
3. 减少同时处理的任务数量
|
||||
|
||||
### 5. 未知错误
|
||||
|
||||
#### 9999
|
||||
|
||||
**错误信息**: 未知错误
|
||||
|
||||
**可能原因**:
|
||||
- 发生未知错误
|
||||
- 可能是应用程序内部错误
|
||||
- 可能是系统环境问题
|
||||
|
||||
**解决方案**:
|
||||
1. 重启应用程序
|
||||
2. 检查系统日志
|
||||
3. 联系技术支持
|
||||
|
||||
## 错误处理流程
|
||||
|
||||
当应用遇到错误时,会:
|
||||
|
||||
1. 生成相应的错误码和错误信息
|
||||
2. 在界面上显示错误信息和错误码
|
||||
3. 提供可能的解决方案
|
||||
4. 记录错误日志以便排查
|
||||
|
||||
## 如何使用错误码
|
||||
|
||||
当您遇到错误时:
|
||||
|
||||
1. 查看错误信息和错误码
|
||||
2. 参考本文档中的解决方案尝试解决
|
||||
3. 如果问题仍然存在,请联系技术支持并提供错误码和详细的错误信息
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 错误码仅用于参考,具体错误原因可能因环境不同而有所差异
|
||||
- 如遇到持续的错误,请检查系统环境和网络连接
|
||||
- 定期更新应用程序以获取最新的错误处理机制
|
||||
|
||||
## 其它
|
||||
|
||||
如果解决不了,请向QQ群反馈,你需要反馈(CE或者主版本群都可以):
|
||||
```
|
||||
你好,我有XXX问题,错误码XXX
|
||||
我的安装路径是XXX
|
||||
环境是WindowsXXX,Java版本XXX
|
||||
程序是XXX版本(CE或者主版本)
|
||||
```
|
||||
@@ -4,13 +4,15 @@
|
||||
|
||||
感谢您对 DeEarthX-CE 项目的关注和支持!我们欢迎来自社区的贡献,包括代码提交、问题报告、功能建议等。本指南将帮助您了解如何参与项目开发。
|
||||
|
||||
[XCCGit仓库](https://git.xcclyc.cn/xcclyc/DeEarthX-CE)
|
||||
|
||||
## 开发环境设置
|
||||
|
||||
### 前提条件
|
||||
|
||||
在开始贡献之前,请确保您的系统满足以下要求:
|
||||
|
||||
- **Node.js**:v16.0+(推荐使用最新稳定版)
|
||||
- **Node.js**:v22.0+(推荐使用最新稳定版)
|
||||
- **pnpm**:v8.0+(包管理器)
|
||||
- **Rust**:最新稳定版(用于 Tauri 构建)
|
||||
- **Git**:用于版本控制
|
||||
@@ -18,7 +20,7 @@
|
||||
### 克隆仓库
|
||||
|
||||
```bash
|
||||
git clone https://github.com/yourusername/DeEarthX-CE.git
|
||||
git clone https://git.xcclyc.cn/xcclyc/DeEarthX-CE.git
|
||||
cd DeEarthX-CE
|
||||
```
|
||||
|
||||
@@ -35,7 +37,7 @@ pnpm install
|
||||
pnpm run dev
|
||||
|
||||
# 启动后端开发服务器(如果需要)
|
||||
pnpm run backend:dev
|
||||
pnpm run test
|
||||
```
|
||||
|
||||
## 代码规范
|
||||
@@ -123,7 +125,7 @@ pnpm run test
|
||||
|
||||
## 问题报告
|
||||
|
||||
如果您发现了 bug 或有功能建议,请在 GitHub Issues 页面提交:
|
||||
如果您发现了 bug 或有功能建议,请在 XCCGit Issues 页面提交:
|
||||
|
||||
1. **搜索现有问题**:确保问题尚未被报告
|
||||
2. **创建新问题**:提供详细的问题描述
|
||||
@@ -133,7 +135,9 @@ pnpm run test
|
||||
|
||||
## 功能请求
|
||||
|
||||
如果您有新功能的想法,请在 GitHub Issues 页面提交功能请求:
|
||||
如果您有新功能的想法,请在 XCCGit Issues 页面提交功能请求:
|
||||
|
||||
[XCCGit](https://git.xcclyc.cn/xcclyc/DeEarthX-CE/issues)
|
||||
|
||||
1. **搜索现有请求**:确保功能尚未被请求
|
||||
2. **创建新请求**:提供详细的功能描述
|
||||
@@ -179,7 +183,7 @@ MAJOR.MINOR.PATCH
|
||||
2. **更新 CHANGELOG**:记录版本变更内容
|
||||
3. **构建项目**:确保项目能够正常构建
|
||||
4. **运行测试**:确保所有测试通过
|
||||
5. **创建发布**:在 GitHub 上创建新的发布
|
||||
5. **创建发布**:在 XCCGit 上创建新的发布
|
||||
6. **部署**:部署到相关平台
|
||||
|
||||
## 行为准则
|
||||
@@ -196,8 +200,8 @@ MAJOR.MINOR.PATCH
|
||||
|
||||
如果您有任何问题或需要帮助,可以通过以下方式联系我们:
|
||||
|
||||
- **GitHub Issues**:用于问题报告和功能请求
|
||||
- **Discord**:用于实时讨论和社区交流
|
||||
- **XCCGit Issues**:用于问题报告和功能请求
|
||||
- **QQ**:简单直接
|
||||
- **Email**:用于重要事项的沟通
|
||||
|
||||
## 致谢
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
本指南旨在帮助开发者理解 DeEarthX-CE 项目的架构和开发流程,以便能够顺利地为项目做出贡献。
|
||||
|
||||
项目地址: [https://git.xcclyc.com.cn/xcclyc/DeEarthX-CE.git](https://git.xcclyc.com.cn/xcclyc/DeEarthX-CE.git)
|
||||
|
||||
## 项目架构
|
||||
|
||||
DeEarthX-CE 采用前后端分离架构:
|
||||
@@ -191,23 +193,14 @@ pnpm run test
|
||||
### 构建应用
|
||||
|
||||
```bash
|
||||
# 构建前端
|
||||
cd front
|
||||
# 全自动构建
|
||||
pnpm run build
|
||||
|
||||
# 构建后端
|
||||
cd ../backend
|
||||
pnpm run build
|
||||
|
||||
# 构建桌面应用
|
||||
cd ..
|
||||
pnpm run tauri build
|
||||
```
|
||||
|
||||
### 部署
|
||||
|
||||
- **桌面应用**:分发构建后的安装包
|
||||
- **文档**:部署到 GitHub Pages 或其他静态网站托管服务
|
||||
- **文档**:部署到 XCCGit Pages 或其他静态网站托管服务
|
||||
|
||||
## 代码规范
|
||||
|
||||
@@ -271,7 +264,7 @@ pnpm run tauri build
|
||||
|
||||
## 贡献流程
|
||||
|
||||
1. ** Fork 仓库**:在 GitHub 上 fork 项目仓库
|
||||
1. ** Fork 仓库**:在 XCCGit 上 fork 项目仓库
|
||||
2. **克隆仓库**:克隆 fork 后的仓库到本地
|
||||
3. **创建分支**:从 develop 分支创建新的功能分支
|
||||
4. **开发代码**:实现功能或修复 bug
|
||||
@@ -300,6 +293,6 @@ pnpm run tauri build
|
||||
|
||||
## 联系方式
|
||||
|
||||
- **GitHub Issues**:用于问题报告和功能请求
|
||||
- **XCCGit Issues**:用于问题报告和功能请求
|
||||
- **Discord**:用于实时讨论和社区交流
|
||||
- **Email**:用于重要事项的沟通
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
## 基本问题
|
||||
|
||||
### 错误码
|
||||
|
||||
错误码是DeEarthX-CE用于分辨的码
|
||||
|
||||
错误码信息:[错误码](../api/error-codes.html)
|
||||
|
||||
如果下面解决不了你的问题,你可以看看上面的错误码
|
||||
|
||||
### DeEarthX-CE 是什么?
|
||||
|
||||
DeEarthX-CE 是一个功能强大的 Minecraft 模组管理工具,旨在简化模组的安装、更新和管理流程。它支持多个模组平台,提供智能的模组过滤功能,并允许用户创建和管理模组包模板。
|
||||
@@ -21,7 +29,7 @@ DeEarthX-CE 支持 Windows 10/11、macOS 10.15+ 和 Linux (Ubuntu 20.04+) 操作
|
||||
- 检查是否满足系统要求
|
||||
- 尝试以管理员身份运行安装程序
|
||||
- 查看安装日志获取详细错误信息
|
||||
- 访问 GitHub Issues 页面寻求帮助
|
||||
- 访问 XCCGit Issues 页面寻求帮助
|
||||
|
||||
### 安装后无法启动应用怎么办?
|
||||
|
||||
@@ -84,7 +92,7 @@ DeEarthX-CE 支持 Windows 10/11、macOS 10.15+ 和 Linux (Ubuntu 20.04+) 操作
|
||||
### 如何更新 DeEarthX-CE?
|
||||
|
||||
- 自动更新:应用会定期检查更新并提示安装
|
||||
- 手动更新:访问 GitHub Releases 页面下载最新版本并安装
|
||||
- 手动更新:访问 XCCGit Releases 页面下载最新版本并安装
|
||||
|
||||
### 如何贡献代码?
|
||||
|
||||
@@ -93,5 +101,14 @@ DeEarthX-CE 支持 Windows 10/11、macOS 10.15+ 和 Linux (Ubuntu 20.04+) 操作
|
||||
### 遇到其他问题怎么办?
|
||||
|
||||
- 查看应用日志获取详细错误信息
|
||||
- 访问 GitHub Issues 页面提交问题
|
||||
- 加入社区 Discord 服务器寻求帮助
|
||||
- 访问 XCCGit Issues 页面提交问题
|
||||
|
||||
## 其它
|
||||
|
||||
如果解决不了,请向QQ群反馈,你需要反馈(CE或者主版本群都可以):
|
||||
```
|
||||
你好,我有XXX问题,错误码XXX
|
||||
我的安装路径是XXX
|
||||
环境是WindowsXXX,Java版本XXX
|
||||
程序是XXX版本(CE或者主版本)
|
||||
```
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
1. **克隆仓库**
|
||||
```bash
|
||||
git clone https://github.com/yourusername/DeEarthX-CE.git
|
||||
git clone https://git.xcclyc.cn/xcclyc/DeEarthX-CE.git
|
||||
cd DeEarthX-CE
|
||||
```
|
||||
|
||||
@@ -77,6 +77,5 @@
|
||||
|
||||
### 权限错误
|
||||
|
||||
- 确保应用有足够的权限访问 Minecraft 目录
|
||||
- 在 Windows 上尝试以管理员身份运行
|
||||
- 在 macOS 上检查应用权限设置
|
||||
Reference in New Issue
Block a user