117 lines
4.2 KiB
JavaScript
117 lines
4.2 KiB
JavaScript
/**
|
||
* modules-api.js - M23 光湖首页 · 跨模块数据桥
|
||
* 版本:v1.0
|
||
* 开发者:DEV-012 Awen
|
||
* 功能:从M22读取公告数据 + 模块状态API + 错误降级
|
||
*/
|
||
|
||
(function() {
|
||
'use strict';
|
||
|
||
// ===== Mock数据(降级兜底·当API不可用时使用) =====
|
||
const FALLBACK_ANNOUNCEMENTS = [
|
||
{
|
||
"id": 1,
|
||
"title": "光湖实验室v1.0全面开发中",
|
||
"content": "12位开发者并行推进,多模块同步建设。光湖系统正在从蓝图变为现实。",
|
||
"date": "2026-03-14",
|
||
"type": "update",
|
||
"priority": "high"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"title": "M22主域公告栏已上线",
|
||
"content": "公告栏支持多语言、无障碍访问、骨架屏加载、实时数据接入。由DEV-012 Awen独立完成。",
|
||
"date": "2026-03-13",
|
||
"type": "update",
|
||
"priority": "normal"
|
||
},
|
||
{
|
||
"id": 3,
|
||
"title": "模块进度总览",
|
||
"content": "多个模块已上线,更多模块建设中。",
|
||
"date": "2026-03-14",
|
||
"type": "status",
|
||
"priority": "normal"
|
||
},
|
||
{
|
||
"id": 4,
|
||
"title": "欢迎新开发者",
|
||
"content": "光湖实验室持续壮大,欢迎每一位共建者。",
|
||
"date": "2026-03-14",
|
||
"type": "welcome",
|
||
"priority": "normal"
|
||
}
|
||
];
|
||
|
||
const FALLBACK_STATUS = {
|
||
status: "building",
|
||
name: "未知模块",
|
||
lastUpdate: new Date().toISOString().split('T')[0]
|
||
};
|
||
|
||
// ===== 公告数据API =====
|
||
async function getAnnouncements() {
|
||
try {
|
||
// 优先从M22共享数据文件读取
|
||
const response = await fetch('/bulletin-board/shared-announcements.json');
|
||
if (!response.ok) throw new Error('M22 data not available: ' + response.status);
|
||
const data = await response.json();
|
||
console.log('[ModulesAPI] M22公告数据加载成功,共' + data.length + '条');
|
||
return { source: 'M22-live', data: data };
|
||
} catch (err) {
|
||
console.warn('[ModulesAPI] M22数据不可用,使用降级数据:', err.message);
|
||
return { source: 'fallback', data: FALLBACK_ANNOUNCEMENTS };
|
||
}
|
||
}
|
||
|
||
// ===== 模块状态API =====
|
||
async function getModuleStatus(moduleId) {
|
||
try {
|
||
const response = await fetch('./module-status.json');
|
||
if (!response.ok) throw new Error('Status data not available');
|
||
const allStatus = await response.json();
|
||
if (allStatus[moduleId]) {
|
||
return { source: 'local-registry', ...allStatus[moduleId] };
|
||
}
|
||
return { source: 'fallback', ...FALLBACK_STATUS };
|
||
} catch (err) {
|
||
console.warn('[ModulesAPI] 状态数据不可用:', err.message);
|
||
return { source: 'fallback', ...FALLBACK_STATUS };
|
||
}
|
||
}
|
||
|
||
// ===== 批量获取所有模块状态 =====
|
||
async function getAllModuleStatus() {
|
||
try {
|
||
const response = await fetch('./module-status.json');
|
||
if (!response.ok) throw new Error('Status data not available');
|
||
const data = await response.json();
|
||
console.log('[ModulesAPI] 模块状态加载成功, 共' + Object.keys(data).length + '个模块');
|
||
return { source: 'local-registry', data: data };
|
||
} catch (err) {
|
||
console.warn('[ModulesAPI] 状态数据不可用, 使用降级');
|
||
return { source: 'fallback', data: {} };
|
||
}
|
||
}
|
||
|
||
// ===== API可用性检测 =====
|
||
async function isAPIAvailable() {
|
||
try {
|
||
const response = await fetch('../bulletin-board/shared-announcements.json', { method: 'HEAD' });
|
||
return response.ok;
|
||
} catch {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// ===== 导出到全局 =====
|
||
window.ModulesAPI = {
|
||
getAnnouncements: getAnnouncements,
|
||
getModuleStatus: getModuleStatus,
|
||
getAllModuleStatus: getAllModuleStatus,
|
||
isAPIAvailable: isAPIAvailable
|
||
};
|
||
|
||
console.log('[ModulesAPI] 跨模块数据桥已初始化');
|
||
})(); |