/* ================================================================
数据配置:修改这里即可改变整个 UI 结构和内容
================================================================ */
const CATEGORIES = [
{ id: 'chat', name: 'AI对话', icon: '💬', desc: '智能对话与 AI 助手' },
{ id: 'music', name: '音乐库', icon: '🎵', desc: '在线音乐与无损下载' },
{ id: 'video', name: '影院', icon: '🎬', desc: '在线观影与影视资源' },
{ id: 'novel', name: '笔记小说', icon: '📚', desc: '小说阅读与笔记' },
{ id: 'coding', name: '编程', icon: '💻', desc: '开发工具与技术社区' },
{ id: 'games', name: '导航/游戏', icon: '🎮', desc: '游戏平台与导航合集' },
{ id: 'translate', name: '翻译官', icon: '🌐', desc: '在线翻译与词典' },
{ id: 'travel', name: '出行', icon: '✈️', desc: '机票酒店与旅行攻略' },
{ id: 'calendar', name: '日历', icon: '📅', desc: '日历与时间管理' },
{ id: 'law', name: '法律条文', icon: '⚖️', desc: '法律法规查询' },
{ id: 'command', name: '命令执行', icon: '⚡', desc: '命令行与脚本工具' },
{ id: 'aigen', name: '爬虫工具', icon: '🕷️', desc: '数据采集与爬虫' },
{ id: 'phonebook', name: '电话本', icon: '📞', desc: '常用电话与联系方式' },
{ id: 'usergallery',name: '生肖积分', icon: '🐉', desc: '生肖运势与积分' },
];
// 站点数据:每个分类下包含若干站点
let SITES_DATA = {
chat: [
{ name: 'ChatGPT', url: 'https://chat.openai.com', icon: '🤖', desc: 'OpenAI 对话模型' },
{ name: 'Claude', url: 'https://claude.ai', icon: '🧠', desc: 'Anthropic 助手' },
{ name: '文心一言', url: 'https://yiyan.baidu.com', icon: '💬', desc: '百度知识增强大模型' },
{ name: '通义千问', url: 'https://tongyi.aliyun.com', icon: '✨', desc: '阿里云大模型' },
],
music: [
{ name: '网易云音乐', url: 'https://music.163.com', icon: '🎧', desc: '在线听歌与社区' },
{ name: 'QQ音乐', url: 'https://y.qq.com', icon: '🎵', desc: '腾讯音乐平台' },
{ name: 'Spotify', url: 'https://open.spotify.com', icon: '🎶', desc: '全球音乐流媒体' },
],
video: [
{ name: '哔哩哔哩', url: 'https://www.bilibili.com', icon: '📺', desc: '弹幕视频网站' },
{ name: '爱奇艺', url: 'https://www.iqiyi.com', icon: '🎬', desc: '在线影视平台' },
{ name: '腾讯视频', url: 'https://v.qq.com', icon: '🍿', desc: '热门剧集与综艺' },
{ name: 'Netflix', url: 'https://www.netflix.com', icon: '🌍', desc: '全球流媒体巨头' },
],
novel: [
{ name: '起点中文网', url: 'https://www.qidian.com', icon: '📖', desc: '玄幻小说阅读' },
{ name: '晋江文学城', url: 'https://www.jjwxc.net', icon: '📚', desc: '女性向小说' },
{ name: '微信读书', url: 'https://weread.qq.com', icon: '📱', desc: '社交化阅读' },
],
coding: [
{ name: 'GitHub', url: 'https://github.com', icon: '🐙', desc: '代码托管平台' },
{ name: 'Stack Overflow', url: 'https://stackoverflow.com', icon: '💡', desc: '程序员问答' },
{ name: 'LeetCode', url: 'https://leetcode.cn', icon: '⚔️', desc: '算法刷题' },
{ name: 'MDN', url: 'https://developer.mozilla.org', icon: '📘', desc: 'Web 开发文档' },
],
games: [
{ name: 'Steam', url: 'https://store.steampowered.com', icon: '🎮', desc: '游戏平台' },
{ name: 'Epic Games', url: 'https://www.epicgames.com', icon: '🕹️', desc: '游戏商城' },
{ name: 'TapTap', url: 'https://www.taptap.cn', icon: '📲', desc: '手游社区' },
],
translate: [
{ name: 'DeepL', url: 'https://www.deepl.com', icon: '🌐', desc: '高质量机器翻译' },
{ name: 'Google 翻译', url: 'https://translate.google.com', icon: '🔤', desc: '多语言翻译' },
{ name: '有道翻译', url: 'https://fanyi.youdao.com', icon: '📝', desc: '词典与翻译' },
],
travel: [
{ name: '携程', url: 'https://www.ctrip.com', icon: '✈️', desc: '机票酒店预订' },
{ name: '去哪儿', url: 'https://www.qunar.com', icon: '🏨', desc: '旅行比价' },
{ name: 'Booking', url: 'https://www.booking.com', icon: '🌍', desc: '全球酒店预订' },
],
calendar: [
{ name: 'Google 日历', url: 'https://calendar.google.com', icon: '📅', desc: '在线日历' },
{ name: '飞书日历', url: 'https://calendar.feishu.cn', icon: '🗓️', desc: '协作日历' },
],
law: [
{ name: '国家法律法规数据库', url: 'https://flk.npc.gov.cn', icon: '⚖️', desc: '官方法律查询' },
{ name: '中国裁判文书网', url: 'https://wenshu.court.gov.cn', icon: '📜', desc: '裁判文书公开' },
],
command: [
{ name: 'Linux 命令大全', url: 'https://man.linuxde.net', icon: '💻', desc: '命令查询' },
{ name: 'ExplainShell', url: 'https://explainshell.com', icon: '🐚', desc: 'Shell 解释' },
],
aigen: [
{ name: 'Scrapy', url: 'https://scrapy.org', icon: '🕷️', desc: 'Python 爬虫框架' },
{ name: 'Postman', url: 'https://www.postman.com', icon: '📮', desc: 'API 测试与抓包' },
],
phonebook: [
{ name: '114 查号', url: 'https://www.114best.com', icon: '📞', desc: '电话号码查询' },
{ name: '企业信用查询', url: 'https://www.qcc.com', icon: '🏢', desc: '工商信息' },
],
usergallery: [
{ name: '生肖运势', url: 'https://www.xzw.com', icon: '🐉', desc: '星座生肖运势' },
{ name: '积分商城', url: 'https://example.com', icon: '🎁', desc: '示例站点' },
],
};
// 合并用户自定义站点(localStorage)
function loadCustomSites() {
const stored = localStorage.getItem('customSites');
if (stored) {
try {
const custom = JSON.parse(stored);
for (const catId in custom) {
if (SITES_DATA[catId]) {
SITES_DATA[catId] = SITES_DATA[catId].concat(custom[catId]);
}
}
} catch(e) { console.warn('自定义站点解析失败', e); }
}
}
loadCustomSites();
// 收藏数据(localStorage)
let favorites = JSON.parse(localStorage.getItem('favorites') || '[]');
/* ================================================================
DOM 引用
================================================================ */
const navMenu = document.getElementById('navMenu');
const cardGrid = document.getElementById('cardGrid');
const pageTitle = document.getElementById('pageTitle');
const pageDesc = document.getElementById('pageDesc');
const searchInput = document.getElementById('searchInput');
const btnFavorites = document.getElementById('btnFavorites');
const btnAddSite = document.getElementById('btnAddSite');
const modalOverlay = document.getElementById('modalOverlay');
const btnCancel = document.getElementById('btnCancel');
const btnSave = document.getElementById('btnSave');
const siteNameInput = document.getElementById('siteName');
const siteUrlInput = document.getElementById('siteUrl');
const siteIconInput = document.getElementById('siteIcon');
const siteDescInput = document.getElementById('siteDesc');
let currentCategory = CATEGORIES[0].id; // 当前分类
let showFavoritesOnly = false; // 是否只显示收藏
/* ================================================================
渲染函数
================================================================ */
function renderNavMenu() {
navMenu.innerHTML = CATEGORIES.map(cat => `
${cat.icon}
${cat.name}
`).join('');
}
function renderPage() {
// 更新标题
if (showFavoritesOnly) {
pageTitle.textContent = '⭐ 我的收藏';
pageDesc.textContent = '所有收藏的站点';
} else {
const cat = CATEGORIES.find(c => c.id === currentCategory);
pageTitle.textContent = `${cat.icon} ${cat.name}`;
pageDesc.textContent = cat.desc;
}
// 获取要显示的站点
let sites = [];
if (showFavoritesOnly) {
for (const catId in SITES_DATA) {
sites = sites.concat(SITES_DATA[catId].filter(site => favorites.includes(site.url)));
}
} else {
sites = SITES_DATA[currentCategory] || [];
}
// 搜索过滤
const keyword = searchInput.value.trim().toLowerCase();
if (keyword) {
sites = sites.filter(site =>
site.name.toLowerCase().includes(keyword) ||
(site.desc && site.desc.toLowerCase().includes(keyword)) ||
site.url.toLowerCase().includes(keyword)
);
}
// 渲染卡片
if (sites.length === 0) {
cardGrid.innerHTML = `
`;
return;
}
cardGrid.innerHTML = sites.map(site => {
const isFav = favorites.includes(site.url);
return `
${site.icon || '🌐'}
${site.name}
${site.desc || ''}
`;
}).join('');
// 绑定卡片点击事件
document.querySelectorAll('.site-card').forEach(card => {
card.addEventListener('click', (e) => {
if (e.target.classList.contains('fav-btn')) return;
const url = card.querySelector('.fav-btn').dataset.url;
window.open(url, '_blank');
});
});
// 绑定收藏按钮事件
document.querySelectorAll('.fav-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const url = btn.dataset.url;
if (favorites.includes(url)) {
favorites = favorites.filter(u => u !== url);
btn.classList.remove('active');
btn.textContent = '☆';
} else {
favorites.push(url);
btn.classList.add('active');
btn.textContent = '★';
}
localStorage.setItem('favorites', JSON.stringify(favorites));
if (showFavoritesOnly) renderPage();
});
});
}
/* ================================================================
事件监听
================================================================ */
navMenu.addEventListener('click', (e) => {
const item = e.target.closest('.nav-item');
if (!item) return;
currentCategory = item.dataset.cat;
showFavoritesOnly = false;
renderNavMenu();
renderPage();
});
btnFavorites.addEventListener('click', () => {
showFavoritesOnly = !showFavoritesOnly;
renderNavMenu();
renderPage();
});
searchInput.addEventListener('input', () => {
renderPage();
});
// 添加站点模态框
btnAddSite.addEventListener('click', () => {
modalOverlay.classList.add('open');
});
btnCancel.addEventListener('click', () => {
modalOverlay.classList.remove('open');
});
modalOverlay.addEventListener('click', (e) => {
if (e.target === modalOverlay) modalOverlay.classList.remove('open');
});
btnSave.addEventListener('click', () => {
const name = siteNameInput.value.trim();
const url = siteUrlInput.value.trim();
if (!name || !url) {
alert('请填写站点名称和网址');
return;
}
if (!/^https?:\/\//i.test(url)) {
alert('网址需以 http:// 或 https:// 开头');
return;
}
const icon = siteIconInput.value.trim() || '🌐';
const desc = siteDescInput.value.trim();
const customSites = JSON.parse(localStorage.getItem('customSites') || '{}');
if (!customSites[currentCategory]) customSites[currentCategory] = [];
customSites[currentCategory].push({ name, url, icon, desc });
localStorage.setItem('customSites', JSON.stringify(customSites));
SITES_DATA[currentCategory].push({ name, url, icon, desc });
siteNameInput.value = '';
siteUrlInput.value = '';
siteIconInput.value = '';
siteDescInput.value = '';
modalOverlay.classList.remove('open');
renderPage();
});
/* ================================================================
初始化
================================================================ */
renderNavMenu();
renderPage();
// 闹钟检测(每秒检查一次)
setInterval(() => {
const alarm = window.__alarmState;
if (!alarm || !alarm.active || !alarm.time) return;
const now = new Date();
const currentTime = String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0');
if (currentTime === alarm.time && now.getSeconds() === 0) {
// 触发提醒
alarm.active = false; // 避免重复触发
alarm.time = null;
ring(); // 调用你已有的 ring 函数
alert('⏰ 闹钟时间到:' + currentTime);
}
}, 1000);
// 如果你已有 ring 函数,可以复用;否则简单定义一个
function ring() {
try {
const c = new AudioContext();
for (let i = 0; i < 6; i++) { const o=c.createOscillator(), g=c.createGain(); o.connect(g); g.connect(c.destination); o.frequency.value=880; o.start(c.currentTime + i * 0.6); o.stop(c.currentTime + i * 0.6 + 0.3); } } catch (e) { /* 忽略自动播放限制 */ } }
// 2. 扫一扫功能(绑定到你刚刚添加的按钮)
function scanQRCode() {
wx.scanQRCode({
needResult: 1, // 返回扫码结果
scanType: ['qrCode', 'barCode'],
success: res => {
// res.resultStr 是扫码得到的字符串,可以直接发送给智能体
alert('扫码结果:' + res.resultStr);
// 你也可以把结果填入聊天输入框并自动发送:
// document.getElementById('chatInput').value = res.resultStr;
// sendMessage();
},
fail: err => {
alert('扫码失败');
}
});
}
操作成功