Files
ns2.0/templates/base.html

1494 lines
42 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<script defer src="https://tj.vcck.cn/script.js" data-website-id="a06bbe36-03f8-4f84-987c-99d19567c512"></script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NEXT Store</title>
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" cache="force-cache">
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" cache="force-cache">
<link rel="shortcut icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" cache="force-cache">
<link rel="apple-touch-icon" href="{{ url_for('static', filename='favicon.ico') }}" cache="force-cache">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" cache="force-cache">
<link rel="stylesheet" href="{{ url_for('static', filename='css/all.min.css') }}" cache="force-cache">
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' nextstore.obs.cn-east-3.myhuaweicloud.com *.vcck.cn *.hc-cdn.com *.hicloud.com *.baidu.com *.hispace.dbankcloud.cn cdnjs.cloudflare.com ;
style-src 'self' 'unsafe-inline' cdnjs.cloudflare.com nextstore.obs.cn-east-3.myhuaweicloud.com;
img-src 'self' data: https:;
font-src 'self' data: cdnjs.cloudflare.com;
connect-src 'self' *.vcck.cn *.hc-cdn.com *.hicloud.com *.baidu.com *.hispace.dbankcloud.cn nextstore.obs.cn-east-3.myhuaweicloud.com;">
<style>
html { display: none; }
</style>
<script>
if (self === top) {
document.documentElement.style.display = 'block';
} else {
top.location = self.location;
}
</script>
<style>
/* 全局应用名称样式 */
.app-card .app-info h3,
.app-tile .app-info h3,
.app-item .app-info h4,
.app-name-category h4 {
font-size: 11px;
margin: 0;
line-height: 1.2;
height: auto;
max-height: 2.4em; /* 允许显示两行文字 */
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2; /* 限制最多显示两 */
-webkit-box-orient: vertical;
word-wrap: break-word; /* 允许单词内 */
word-break: break-all; /* 允许在任意字符间换行 */
width: 100%; /* 确保宽度占满容器 */
padding: 0; /* 移除内边距 */
box-sizing: border-box; /* 使用 border-box 盒模型 */
}
/* 英文应用名称限制 */
.app-info h3:lang(en),
.app-info h4:lang(en) {
max-width: 9ch; /* 限制英文宽度为9个字符 */
white-space: nowrap; /* 不换行 */
overflow: hidden;
text-overflow: ellipsis; /* 超出部分显示省略号 */
text-align: center; /* 短名称居中显示 */
direction: ltr; /* 从左到右显示 */
}
/* 中文应用名称限制 */
.app-info h3:lang(zh),
.app-info h4:lang(zh) {
max-width: 7em; /* 限制中文宽度为7个字 */
white-space: nowrap; /* 不换行 */
overflow: hidden;
text-overflow: ellipsis; /* 超出部分显示省略号 */
text-align: center; /* 短名称居中显示 */
direction: ltr; /* 从左到右显示 */
}
/* 确保应用信息容器正确对齐 */
.app-info {
display: flex;
flex-direction: column;
align-items: center; /* 居中对齐内容 */
width: 100%;
}
/* 长名称左对齐,短名称居中 */
.app-info h3,
.app-info h4 {
text-align: center; /* 默认居中 */
}
.app-info h3:not([style*="text-overflow: ellipsis"]),
.app-info h4:not([style*="text-overflow: ellipsis"]) {
text-align: center; /* 短名称居中 */
}
</style>
{% block head %}
<meta name="description" content="{{ settings.site_description if settings and settings.site_description else 'NEXT Store官网鸿蒙应用上架查询平台' }}">
<meta name="keywords" content="{{ settings.site_keywords if settings and settings.site_keywords else '鸿蒙系统,鸿蒙原生应用, 纯血鸿蒙,单框架鸿蒙' }}">
<meta name="author" content="{{ settings.site_name if settings and settings.site_name else 'NEXT Store' }}">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="{{ request.url }}">
<meta property="og:title" content="{{ settings.site_name if settings and settings.site_name else 'NEXT Store' }} - NEXT Store官网鸿蒙应用上架查询平台">
<meta property="og:description" content="{{ settings.site_description if settings and settings.site_description else '全面的鸿蒙原生应用资源平台,鸿蒙系统,鸿蒙原生应用, 纯血鸿蒙,单框架鸿蒙' }}">
<meta property="og:image" content="{{ url_for('static', filename='logo.png') }}">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:url" content="{{ request.url }}">
<meta name="twitter:title" content="{{ settings.site_name if settings and settings.site_name else 'NEXT Store' }} - NEXT Store官网鸿蒙应用上架查询平台">
<meta name="twitter:description" content="{{ settings.site_description if settings and settings.site_description else '全面的鸿蒙原生应用资源平台。鸿蒙系统,鸿蒙原生应用, 纯血鸿蒙,单框架鸿蒙' }}">
<meta name="twitter:image" content="{{ url_for('static', filename='logo.png') }}">
{% endblock %}
<!-- 添加反爬虫 meta 标签 -->
<meta name="robots" content="noindex,nofollow">
<!-- 添加基本的反爬虫检测 -->
<script>
// 检测是否是真实浏览器,使用更温和的检测方法
(function detectBot() {
try {
// 检查是否支持基本的浏览器功能
if (!window.localStorage || !window.sessionStorage) {
// 如果不支持基本存储功能,可能是爬虫
window.location.href = '/error';
return;
}
// 检查是否有明显的自动化工具标记
const automationTools = [
'_phantom',
'callPhantom',
'__nightmare',
'__selenium_evaluate',
'__webdriver_evaluate'
];
for (let tool of automationTools) {
if (window[tool]) {
window.location.href = '/error';
return;
}
}
// 检查是支持基本的DOM操作
if (!document.createElement || !document.querySelector) {
window.location.href = '/error';
return;
}
} catch (e) {
// 如果检测过程出错,记录错误但不阻止访问
console.error('Browser check error:', e);
}
})();
</script>
<style>
/* 全局样式 */
body {
background-color: #f5f5f7;
margin: 0;
padding: 0;
transition: background-color 0.3s ease;
}
/* 暗色模式全局样式 */
[data-theme="dark"] body {
background-color: #1a1a1a;
}
/* 确保所有内容区域也使用正确的背景色 */
[data-theme="dark"] .container,
[data-theme="dark"] main,
[data-theme="dark"] .content {
background-color: #1a1a1a;
}
</style>
<script>
// 立即执行主题初始化
(function() {
const theme = localStorage.getItem('theme') || 'light';
document.documentElement.setAttribute('data-theme', theme);
// 添加初始背景色样式
document.documentElement.style.backgroundColor = theme === 'dark' ? '#1a1a1a' : '#f5f5f7';
// 添加 body 的初始背景色
document.write(`<style>body { background-color: ${theme === 'dark' ? '#1a1a1a' : '#f5f5f7'}; }</style>`);
})();
</script>
<style>
html {
visibility: hidden;
background-color: #f5f5f7;
}
html[data-theme="dark"] {
background-color: #1a1a1a;
}
body {
margin: 0;
padding: 0;
transition: background-color 0.3s ease;
}
/* 页面准备好后显示 */
html.ready {
visibility: visible;
}
</style>
<script>
// 在 DOMContentLoaded 后添加 ready 类
document.addEventListener('DOMContentLoaded', () => {
document.documentElement.classList.add('ready');
});
</script>
{% if settings and settings.grayscale_enabled == '1' %}
<style>
html {
filter: grayscale(100%);
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
-webkit-filter: grayscale(1);
}
</style>
{% endif %}
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="flash">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
{# 只在首页显示特别鸣谢 #}
{% if request.endpoint == 'index' %}
<div class="credits-section">
<div class="credits-header">
<h4>特别鸣谢</h4>
</div>
<div class="credits-container">
<div class="credits-track">
<div class="credits-content" id="credits-content">
<!-- 动态加载内容 -->
</div>
</div>
</div>
</div>
<script>
// 使用严格模式
'use strict';
// 所有的事件监听器使用 addEventListener
document.addEventListener('DOMContentLoaded', function() {
// 初始化代码
});
// 避免使用 eval 和其他不安全的函数
// 获取并显示鸣谢用户
function loadCredits() {
fetch('/credits')
.then(response => response.json())
.then(credits => {
if (credits.length === 0) {
document.querySelector('.credits-section').style.display = 'none';
return;
}
// 生成内容
const content = credits.map(credit => `
<a href="${credit.link || '#'}" class="credit-item" ${credit.link ? 'target="_blank"' : ''}>
<img src="${credit.avatar_url}" alt="${credit.name}">
<span>${credit.name}</span>
</a>
`).join('');
document.getElementById('credits-content').innerHTML = content;
// 设置动画
function startAnimation() {
const track = document.querySelector('.credits-track');
const contentWidth = document.getElementById('credits-content').offsetWidth;
const screenWidth = window.innerWidth;
const totalDistance = contentWidth + screenWidth;
// 加快速度每100px取0.5秒
const duration = totalDistance / 200;
// 重置动画
track.style.animation = 'none';
track.offsetHeight; // 触发重排
track.style.animation = `scrollCredits ${duration}s linear`;
// 动画结束时重新开始
track.addEventListener('animationend', () => {
startAnimation();
}, { once: true });
}
// 开始第一次动画
setTimeout(startAnimation, 100);
})
.catch(error => {
console.error('Error loading credits:', error);
document.querySelector('.credits-section').style.display = 'none';
});
}
// 页面加载时获取鸣谢用户
document.addEventListener('DOMContentLoaded', loadCredits);
// 窗口大小改变时重新加载
window.addEventListener('resize', loadCredits);
</script>
{% endif %}
{% block footer %}{% endblock %}
<footer class="footer">
<div class="footer-container">
<div class="footer-grid">
<div class="footer-column">
<h4 class="footer-column-title">关于 NEXT Store</h4>
<p class="footer-description">NEXT Store 是一个展示和分享应用的平台</p>
<div class="footer-links-group">
<a href="{{ url_for('terms') }}" class="footer-link">使用条款</a>
<a href="{{ url_for('cookie_policy') }}" class="footer-link">Cookie 政策</a>
<a href="{{ url_for('privacy') }}" class="footer-link">隐私政策</a>
</div>
</div>
<div class="footer-column">
<h4 class="footer-column-title">联系我们</h4>
<div class="contact-methods">
<div class="contact-buttons">
{% if settings and settings.qq_group_link %}
<button class="contact-btn" onclick="showQQModal()" title="{{ settings.qq_group_text }}">
<i class="fab fa-qq"></i>
</button>
{% endif %}
{% if settings and settings.wechat_group_qrcode %}
<button class="contact-btn" onclick="showWeChatModal()" title="{{ settings.wechat_group_text }}">
<i class="fab fa-weixin"></i>
</button>
{% endif %}
{% if settings and settings.discord_link %}
<a href="{{ settings.discord_link }}" class="contact-btn" target="_blank" title="{{ settings.discord_text }}">
<i class="fab fa-discord"></i>
</a>
{% endif %}
</div>
<p class="contact-email">邮箱nvveex@petalmail.com</p>
</div>
</div>
<div class="footer-column">
<h4 class="footer-column-title">法律信息</h4>
<div class="license-info">
<div class="license-icons">
<i class="fab fa-creative-commons"></i>
<i class="fab fa-creative-commons-by"></i>
<i class="fab fa-creative-commons-nc"></i>
<i class="fab fa-creative-commons-sa"></i>
</div>
<div class="license-text">
<span>本站内容采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a> 进行许可</span>
</div>
</div>
</div>
</div>
<div class="footer-bottom">
<div class="footer-bottom-content">
<div class="footer-links">
<div class="footer-copyright">© 2024-2025 NEXT Store. 保留所有权利</div>
<a href="https://tj.vcck.cn/share/B2yaueygUSZ9lxxx/nextmax.cn" target="_blank" rel="noopener" class="footer-link">
<i class="fas fa-chart-bar"></i> 网站统计
</a>
<span class="divider">|</span>
<a href="https://jk.vcck.cn/status/next" target="_blank" rel="noopener" class="footer-link">
<i class="fas fa-signal"></i> 监控状态
</a>
<span class="divider">|</span>
<span class="footer-text">本网站仅用于演示目的,所有展示的应用仅供参考</span>
{% if settings and settings.icp_number %}
<span class="divider">|</span>
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener" class="icp-link">{{ settings.icp_number }}</a>
{% endif %}
</div>
</div>
</div>
</div>
</footer>
<style>
/* 修改二维码样式,保持原始尺寸 */
.qr-code {
max-width: 100%; /* 改为100%最大宽度 */
height: auto; /* 高度自适应 */
margin: 0px auto;
display: block;
border-radius: 8px;
object-fit: contain; /* 保持图片比例 */
}
/* 调整弹窗内容区域的宽度以适应二维码 */
.modal-content {
background: white;
border-radius: 12px;
padding: 0;
width: 90%;
max-width: 400px; /* 增加最大宽度 */
position: relative;
animation: modalShow 0.3s ease;
}
/* 调整弹窗内容的内边距 */
.modal-body {
padding: 20px;
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
}
.footer {
background-color: #f8f9fa;
padding: 30px 0 20px;
border-top: 1px solid rgba(0, 0, 0, 0.1);
transition: background-color 0.3s ease;
}
.footer-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.footer-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
margin-bottom: 40px;
}
.footer-column {
display: flex;
flex-direction: column;
}
.footer-column-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 15px;
color: #333;
text-transform: uppercase;
letter-spacing: 1px;
}
.footer-description {
font-size: 14px;
color: #666;
margin-bottom: 15px;
line-height: 1.6;
}
.footer-links-group {
display: flex;
gap: 15px;
}
.footer-links-group .footer-link {
font-size: 14px;
color: #666;
text-decoration: none;
transition: color 0.3s ease;
}
.footer-links-group .footer-link:hover {
color: #007AFF;
}
.contact-methods {
display: flex;
flex-direction: column;
}
.contact-buttons {
display: flex;
gap: 15px;
margin-bottom: 15px;
}
.contact-email {
font-size: 14px;
color: #666;
}
.license-info {
display: flex;
flex-direction: column;
gap: 15px;
}
.license-icons {
display: flex;
gap: 10px;
color: #666;
font-size: 24px;
}
.license-text {
font-size: 14px;
color: #888; /* Softer gray tone */
line-height: 1.6;
}
.license-text a {
color: #666; /* Slightly darker for better readability */
text-decoration: none;
transition: color 0.3s ease;
}
.license-text a:hover {
color: #444;
}
/* Dark mode styles */
[data-theme="dark"] .license-text {
color: #999; /* Lighter gray for dark mode */
}
[data-theme="dark"] .license-text a {
color: #bbb;
text-decoration: none;
}
[data-theme="dark"] .license-text a:hover {
color: #fff;
}
.footer-bottom {
border-top: 1px solid rgba(0, 0, 0, 0.1);
padding-top: 20px;
}
.footer-bottom-content {
display: flex;
justify-content: space-between;
align-items: center;
gap: 20px; /* 增加间距 */
}
.footer-copyright {
font-size: 14px;
color: #666;
opacity: 0.8;
margin-right: 20px; /* 增加右侧间距 */
}
.footer-links {
display: flex;
align-items: center;
gap: 15px;
}
.footer-links .footer-link,
.footer-links .icp-link {
color: #666;
text-decoration: none;
font-size: 14px;
display: inline-flex;
align-items: center;
gap: 6px;
transition: color 0.3s ease;
white-space: nowrap; /* 防止链接文字换行 */
}
.footer-links .footer-text {
color: #666;
font-size: 14px;
white-space: nowrap; /* 防止文字换行 */
}
.footer-links .divider {
color: #666;
font-size: 14px;
}
.footer-links i {
font-size: 14px;
}
/* 暗色模式适配 */
[data-theme="dark"] .footer-links .footer-link,
[data-theme="dark"] .footer-links .footer-text,
[data-theme="dark"] .footer-links .icp-link {
color: #ccc;
}
[data-theme="dark"] .footer-links .footer-link:hover,
[data-theme="dark"] .footer-links .icp-link:hover {
color: #fff;
}
[data-theme="dark"] .footer-links .divider {
color: #666;
}
/* 移动端适配 */
@media (max-width: 768px) {
.footer {
padding: 40px 0 20px;
}
.footer-grid {
grid-template-columns: 1fr;
gap: 30px;
}
.footer-column {
text-align: center;
align-items: center;
}
.footer-column-title {
text-align: center;
margin-bottom: 15px;
}
.footer-links-group {
justify-content: center;
flex-wrap: wrap;
gap: 10px;
}
.contact-buttons {
justify-content: center;
}
.license-info {
align-items: center;
}
.license-icons {
justify-content: center;
}
.license-text {
text-align: center;
}
.footer-bottom-content {
flex-direction: column;
gap: 15px;
text-align: center;
}
.footer-copyright {
margin-right: 0;
text-align: center;
order: 2; /* 确保版权信息在底部 */
}
.footer-links {
flex-direction: column;
align-items: center;
gap: 10px;
order: 1; /* 确保链接在版权信息之前 */
}
.footer-links .footer-link,
.footer-links .icp-link,
.footer-links .footer-text {
font-size: 12px;
}
.footer-links .divider {
display: none; /* 移动端完全隐藏分隔符 */
}
.footer-links {
flex-direction: column;
align-items: center;
gap: 10px;
}
.footer-links > * {
margin: 5px 0; /* 为每个元素添加垂直间距 */
}
}
/* 超小屏幕进一步优化 */
@media (max-width: 375px) {
.footer {
padding: 30px 0 15px;
}
.footer-grid {
gap: 20px;
}
.footer-column-title {
font-size: 14px;
}
.footer-links-group .footer-link,
.license-text {
font-size: 14px;
}
.license-icons {
font-size: 20px;
}
}
</style>
<style>
/* 分享按钮样式 */
.share-button button {
width: 40px;
height: 40px;
border-radius: 50%;
border: none;
background: #fff;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
padding: 0;
}
.share-button button:hover {
transform: scale(1.1);
}
.share-button i {
font-size: 18px;
color: #333;
}
/* 主题切换按钮样式 */
.theme-toggle {
width: 40px;
height: 40px;
border-radius: 50%;
background: #fff;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
cursor: pointer;
transition: all 0.3s ease;
}
/* 提示框样式 */
.toast {
position: absolute;
right: 55px;
top: 50%;
transform: translateY(-50%);
background: rgba(0, 0, 0, 0.8);
color: #fff;
padding: 8px 16px;
border-radius: 20px;
font-size: 14px;
opacity: 0;
visibility: hidden;
transition: all 0.3s ease;
white-space: nowrap;
}
.toast.show {
opacity: 1;
visibility: visible;
}
/* 暗色模式样式 */
[data-theme="dark"] .share-button button {
background: #333;
}
[data-theme="dark"] .share-button i {
color: #fff;
}
[data-theme="dark"] .theme-toggle {
background: #333;
color: #fff;
}
</style>
<style>
/* 修改主题切换按钮样式 */
.themeToggle {
color: #333;
width: 40px;
height: 40px;
background: #fff;
border-radius: 50%;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
display: flex;
align-items: center;
justify-content: center;
padding: 0;
transition: all 0.3s ease;
}
.themeToggle:hover {
transform: scale(1.1);
}
.st-sunMoonThemeToggleBtn {
position: relative;
cursor: pointer;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.st-sunMoonThemeToggleBtn .themeToggleInput {
opacity: 0;
width: 100%;
height: 100%;
position: absolute;
cursor: pointer;
}
.st-sunMoonThemeToggleBtn svg {
width: 24px;
height: 24px;
position: absolute;
transition: transform 0.4s ease;
transform: rotate(40deg);
}
.st-sunMoonThemeToggleBtn svg .sunMoon {
transform-origin: center center;
transition: inherit;
transform: scale(1);
}
.st-sunMoonThemeToggleBtn svg .sunRay {
transform-origin: center center;
transform: scale(0);
}
.st-sunMoonThemeToggleBtn svg mask > circle {
transition: transform 0.64s cubic-bezier(0.41, 0.64, 0.32, 1.575);
transform: translate(0px, 0px);
}
.st-sunMoonThemeToggleBtn svg .sunRay2 {
animation-delay: 0.05s !important;
}
.st-sunMoonThemeToggleBtn svg .sunRay3 {
animation-delay: 0.1s !important;
}
.st-sunMoonThemeToggleBtn svg .sunRay4 {
animation-delay: 0.17s !important;
}
.st-sunMoonThemeToggleBtn svg .sunRay5 {
animation-delay: 0.25s !important;
}
.st-sunMoonThemeToggleBtn svg .sunRay6 {
animation-delay: 0.29s !important;
}
.st-sunMoonThemeToggleBtn .themeToggleInput:checked + svg {
transform: rotate(90deg);
}
.st-sunMoonThemeToggleBtn .themeToggleInput:checked + svg mask > circle {
transform: translate(16px, -3px);
}
.st-sunMoonThemeToggleBtn .themeToggleInput:checked + svg .sunMoon {
transform: scale(0.55);
}
.st-sunMoonThemeToggleBtn .themeToggleInput:checked + svg .sunRay {
animation: showRay1832 0.4s ease 0s 1 forwards;
}
@keyframes showRay1832 {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
/* 暗色模式配 */
[data-theme="dark"] .themeToggle {
background: #333;
color: #fff;
}
/* 移动端适配 */
@media (max-width: 768px) {
.themeToggle {
width: 36px;
height: 36px;
}
.st-sunMoonThemeToggleBtn svg {
width: 20px;
height: 20px;
}
}
</style>
<script>
document.addEventListener('DOMContentLoaded', () => {
const themeToggle = document.getElementById('themeToggle');
// 设置初始状态
if (document.documentElement.getAttribute('data-theme') === 'dark') {
themeToggle.checked = true;
}
themeToggle.addEventListener('change', () => {
const newTheme = themeToggle.checked ? 'dark' : 'light';
// 设置主题
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
// 更新背景
document.documentElement.style.backgroundColor = newTheme === 'dark' ? '#1a1a1a' : '#f5f5f7';
document.body.style.backgroundColor = newTheme === 'dark' ? '#1a1a1a' : '#f5f5f7';
});
});
</script>
<!-- 在暗模式样式部分添加 credits-section 的样式 -->
<style>
/* 暗色模式下的 credits-section 样式 */
[data-theme="dark"] .credits-section {
background-color: #1a1a1a;
}
[data-theme="dark"] .credits-header {
background-color: #1a1a1a;
border-color: #333;
}
[data-theme="dark"] .credits-container {
background: #1a1a1a;
border-color: #333;
}
[data-theme="dark"] .credits-track {
background: #1a1a1a;
}
[data-theme="dark"] .credits-content {
background: #1a1a1a;
}
/* 添加滚动区域外的背景色 */
[data-theme="dark"] .credits-track::before,
[data-theme="dark"] .credits-track::after {
background: #1a1a1a;
}
/* 确保标题文字颜色正确 */
[data-theme="dark"] .credits-header h4 {
color: #fff;
}
/* 确保鸣谢项样式正确 */
[data-theme="dark"] .credit-item {
background: #242424;
border-color: #333;
}
[data-theme="dark"] .credit-item span {
color: #fff;
}
[data-theme="dark"] .credit-item:hover {
background: #333;
}
</style>
<!-- 暗色模式下的 donors-section 样式 -->
<style>
[data-theme="dark"] .donors-section {
background: #1a1a1a;
border: 1px solid #1a1a1a; /* 添加周边框颜色 */
margin: 0px auto; /* 保持原有间距 */
}
[data-theme="dark"] .donors-wall {
background: #1a1a1a;
}
/* 确保 donors-section 内的卡片样式正确 */
[data-theme="dark"] .donor-card {
background: #242424;
border-color: #333;
}
[data-theme="dark"] .donor-card:hover {
background: #333;
}
[data-theme="dark"] .donor-name {
color: #fff;
}
[data-theme="dark"] .donor-amount {
color: #007AFF; /* 保持原有的蓝色 */
}
[data-theme="dark"] .view-all-card {
background: #242424;
}
[data-theme="dark"] .view-all-card:hover {
background: #333;
}
</style>
<!-- 在暗色模式样式部分添加 footer 的样式 -->
<style>
/* 暗色模式下的页脚样式 */
[data-theme="dark"] .footer {
background-color: #1a1a1a;
color: #fff;
}
[data-theme="dark"] .footer-content {
background-color: #1a1a1a;
}
[data-theme="dark"] .footer-bottom {
background-color: #1a1a1a;
}
[data-theme="dark"] .footer-section h4 {
color: #fff;
}
[data-theme="dark"] .footer-section p,
[data-theme="dark"] .footer-bottom p {
color: #ccc;
}
[data-theme="dark"] .license-info {
color: #ccc;
}
[data-theme="dark"] .license-icons i {
color: #ccc;
}
[data-theme="dark"] .license-text span {
color: #ccc;
}
[data-theme="dark"] .license-info a {
color: #fff;
}
[data-theme="dark"] .license-info a:hover {
color: #ccc;
}
[data-theme="dark"] .analytics-link a {
color: #ccc;
}
[data-theme="dark"] .analytics-link a:hover {
color: #fff;
}
</style>
<!-- 添加 footer 链接样式 -->
<style>
/* 修改 footer 链接样式 */
.footer-link {
color: #666;
text-decoration: none;
transition: opacity 0.3s ease;
}
.footer-link:hover {
opacity: 0.8;
color: #666; /* 保持颜色不变,只改变透明度 */
}
.divider {
color: #666;
margin: 0 8px;
}
/* 暗色模式适配 */
[data-theme="dark"] .footer-link {
color: #888;
}
[data-theme="dark"] .footer-link:hover {
color: #888;
opacity: 0.8;
}
[data-theme="dark"] .divider {
color: #888;
}
/* 移动端适配 */
@media (max-width: 768px) {
.footer-links .divider {
display: none; /* 完全隐藏分隔符 */
}
.footer-links {
flex-direction: row; /* 改为水平布局 */
flex-wrap: wrap; /* 允许换行 */
justify-content: center;
align-items: center;
gap: 10px;
}
.footer-links > * {
margin: 5px; /* 调整间距 */
}
.footer-links .footer-link,
.footer-links .icp-link,
.footer-links .footer-text {
font-size: 12px;
}
.footer-copyright {
width: 100%;
text-align: center;
order: 2; /* 确保版权信息在底部 */
}
.footer-links .footer-text {
width: 100%;
text-align: center;
order: 3;
}
.footer-links .icp-link {
width: 100%;
text-align: center;
order: 4;
}
}
</style>
<script>
document.addEventListener('DOMContentLoaded', () => {
// 主题切换功能保持不变...
// 分享功能
const shareButton = document.getElementById('shareButton');
const toast = document.getElementById('toast');
shareButton.addEventListener('click', async () => {
try {
// 获取当前页面 URL
const url = window.location.href;
// 尝试使用新的 Clipboard API
if (navigator.clipboard && navigator.clipboard.writeText) {
await navigator.clipboard.writeText(url);
showToast();
} else {
// 回退到传统方法
const textarea = document.createElement('textarea');
textarea.value = url;
textarea.style.position = 'fixed'; // 避免页面滚动
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
showToast();
}
} catch (err) {
console.error('复制失败:', err);
// 如果复制失败,仍然尝试传统方法
const textarea = document.createElement('textarea');
textarea.value = url;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
showToast();
}
});
// 显示提示框的函数
function showToast() {
toast.classList.add('show');
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
}
});
</script>
<!-- 修改底部链接样式 -->
<style>
/* 修改底部链接样式 */
.footer-bottom-content {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 50px; /* 减少底部间距 */
}
.footer-links {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
flex-wrap: nowrap;
margin-bottom: 0; /* 移除底部间距 */
}
.footer-links .footer-link,
.footer-links .icp-link {
color: #666;
text-decoration: none;
font-size: 14px;
display: inline-flex;
align-items: center;
gap: 6px;
transition: color 0.3s ease;
white-space: nowrap; /* 防止链接文字换行 */
}
.footer-links .footer-text {
color: #666;
font-size: 14px;
white-space: nowrap; /* 防止文字换行 */
}
.footer-links .divider {
color: #666;
font-size: 14px;
}
.footer-links i {
font-size: 14px;
}
/* 暗色模式适配 */
[data-theme="dark"] .footer-links .footer-link,
[data-theme="dark"] .footer-links .footer-text,
[data-theme="dark"] .footer-links .icp-link {
color: #ccc;
}
[data-theme="dark"] .footer-links .footer-link:hover,
[data-theme="dark"] .footer-links .icp-link:hover {
color: #fff;
}
[data-theme="dark"] .footer-links .divider {
color: #666;
}
/* 移动端适配 */
@media (max-width: 768px) {
.footer-links {
flex-wrap: wrap;
justify-content: center;
gap: 15px;
margin-bottom: 0; /* 移除底部间距 */
}
.footer-links .footer-link {
font-size: 12px;
}
.footer-links .footer-text {
font-size: 12px;
width: 100%; /* 让说明文字单独占一行 */
text-align: center;
order: 2; /* 将说明文字放到倒数第二位 */
}
.footer-links .icp-link {
font-size: 12px;
width: 100%; /* 让备案号单独占一行 */
text-align: center;
order: 3; /* 将备案号放到最后 */
margin-top: 5px; /* 保持与上方内容的间距 */
display: flex; /* 使用 flex 布局 */
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
.footer-links i {
font-size: 12px;
}
}
</style>
<!-- 联系按钮样式 -->
<style>
/* 联系按钮样式 */
.contact-buttons {
display: flex;
gap: 12px; /* 减小按钮间距 */
margin: 10px 0; /* 减小上下边距 */
justify-content: flex-start; /* PC端靠左对齐 */
align-items: center;
}
.contact-btn {
width: 36px; /* 减小按钮尺寸 */
height: 36px;
border-radius: 50%;
border: none;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(255, 255, 255, 0.1);
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.contact-btn i {
font-size: 18px; /* 减小图标尺寸 */
}
.contact-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
/* QQ按钮特定样式 */
.contact-btn .fa-qq {
color: #12B7F5;
}
/* 微信按钮特定样式 */
.contact-btn .fa-weixin {
color: #07C160;
}
/* 暗色模式适配 */
[data-theme="dark"] .contact-btn {
background: rgba(255, 255, 255, 0.05);
}
/* 移动端适配 */
@media (max-width: 768px) {
.contact-buttons {
justify-content: center; /* 移动端居中显示 */
}
.contact-btn {
width: 32px; /* 移动端更小一点 */
height: 32px;
}
.contact-btn i {
font-size: 16px;
}
}
</style>
<!-- Discord 按钮特定样式 -->
<style>
/* Discord 按钮特定样式 */
.contact-btn .fa-discord {
color: #5865F2; /* Discord 品牌色 */
}
/* 暗色模式下的 Discord 图标 */
[data-theme="dark"] .contact-btn .fa-discord {
color: #5865F2; /* 保持相同的颜色以保持品牌识别度 */
}
</style>
<!-- 添加备案号样式 -->
<style>
.icp-info {
text-align: center;
margin-top: 8px;
font-size: 14px;
}
.icp-info a {
color: #666;
text-decoration: none;
transition: color 0.3s ease;
}
.icp-info a:hover {
color: #333;
}
/* 暗色模式适配 */
[data-theme="dark"] .icp-info a {
color: #999;
}
[data-theme="dark"] .icp-info a:hover {
color: #fff;
}
/* 移动端适配 */
@media (max-width: 768px) {
.icp-info {
font-size: 12px;
}
}
</style>
<script>
// QQ群弹窗函数
function showQQModal() {
const modal = document.getElementById('qq-modal');
if (modal) {
modal.style.display = 'flex';
document.body.style.overflow = 'hidden';
}
}
function closeQQModal() {
const modal = document.getElementById('qq-modal');
if (modal) {
modal.style.display = 'none';
document.body.style.overflow = '';
}
}
// 微信群弹窗函数
function showWeChatModal() {
const modal = document.getElementById('wechat-modal');
if (modal) {
modal.style.display = 'flex';
document.body.style.overflow = 'hidden';
}
}
function closeWeChatModal() {
const modal = document.getElementById('wechat-modal');
if (modal) {
modal.style.display = 'none';
document.body.style.overflow = '';
}
}
// 点击弹窗外部关闭
document.addEventListener('DOMContentLoaded', function() {
const modals = document.querySelectorAll('.modal');
modals.forEach(modal => {
modal.addEventListener('click', function(event) {
if (event.target === this) {
this.style.display = 'none';
document.body.style.overflow = '';
}
});
});
});
</script>
</body>
</html>