返回列表 发布新帖
查看: 1|回复: 0

网站维护页面Plus + HTML源码

<
灌水成绩
1845
27
27
主题
帖子
回贴

等级头衔
UID : 1
组图 :
用户组 :
星级 :

积分成就 威望 : 3 个
贡献 : 57 点
星源币 : 539150 元
违规 : 0
在线时间 : 305 小时
注册时间 : 2025-2-17
最后登录 : 2025-6-8

荣誉勋章

最佳新人活跃会员热心会员推广达人宣传达人灌水之王优秀版主荣誉管理精华达人金牌管理创始人男员勋章歌唱达人音乐达人交友达人

联系方式

QQ

发表于 昨天 18:30 | 查看全部 |阅读模式 来自 中国–广东 电信
网站维护页面Plus + HTML源码

* 维护时间配置区域 – 请修改以下时间设置

* 格式:”年.月.日 时:分” (24小时制)

* 示例:”2025.05.31 00:00″

const config = {
maintenanceStartTime: “2025.06.05 03:23”, // 维护开始时间
maintenanceEndTime: “2025.06.06 03:25” // 维护结束时间
};

设置你需要的时间 就好了

只需要设置好时间 倒计时结束就转到维护完成页面了

倒计时结束 就算下次再访问也不会重置倒计时 直接到维护完成页面
1.png 2.png 3.png

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>系统维护通知</title>
  7.     <script src="https://cdn.tailwindcss.com"></script>
  8.     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
  9.     <script>
  10.         tailwind.config = {
  11.             theme: {
  12.                 extend: {
  13.                     colors: {
  14.                         primary: '#165DFF',
  15.                         secondary: '#36D399',
  16.                         neutral: '#F8FAFC',
  17.                         dark: '#1E293B',
  18.                         success: '#22C55E',
  19.                         warning: '#FBBF24',
  20.                         highlight: '#FFD700',
  21.                         info: '#3B82F6'
  22.                     },
  23.                     fontFamily: {
  24.                         inter: ['Inter', 'system-ui', 'sans-serif'],
  25.                     },
  26.                 }
  27.             }
  28.         }
  29.     </script>
  30.     <style type="text/tailwindcss">
  31.         @layer utilities {
  32.             .content-auto {
  33.                 content-visibility: auto;
  34.             }
  35.             .text-shadow {
  36.                 text-shadow: 0 2px 4px rgba(0,0,0,0.1);
  37.             }
  38.             .bg-gradient-blue {
  39.                 background: linear-gradient(135deg, #165DFF 0%, #0A3CA0 100%);
  40.             }
  41.             .bg-gradient-green {
  42.                 background: linear-gradient(135deg, #36D399 0%, #10B981 100%);
  43.             }
  44.             .pulse-animation {
  45.                 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
  46.             }
  47.             .fade-in {
  48.                 animation: fadeIn 0.8s ease-in-out;
  49.             }
  50.             .slide-up {
  51.                 animation: slideUp 0.8s ease-out;
  52.             }
  53.             .bounce-in {
  54.                 animation: bounceIn 0.6s cubic-bezier(0.215, 0.610, 0.355, 1.000);
  55.             }
  56.             .progress-pulse {
  57.                 animation: progressPulse 1.5s ease-in-out infinite;
  58.             }
  59.             .step-highlight {
  60.                 animation: stepHighlight 1.5s ease-in-out infinite alternate;
  61.             }
  62.         }

  63.         @keyframes pulse {
  64.             0%, 100% {
  65.                 opacity: 1;
  66.             }
  67.             50% {
  68.                 opacity: 0.7;
  69.             }
  70.         }

  71.         @keyframes fadeIn {
  72.             from { opacity: 0; }
  73.             to { opacity: 1; }
  74.         }

  75.         @keyframes slideUp {
  76.             from { transform: translateY(20px); opacity: 0; }
  77.             to { transform: translateY(0); opacity: 1; }
  78.         }

  79.         @keyframes bounceIn {
  80.             0% { transform: scale(0.3); opacity: 0; }
  81.             20% { transform: scale(1.1); }
  82.             40% { transform: scale(0.9); }
  83.             60% { transform: scale(1.03); opacity: 1; }
  84.             80% { transform: scale(0.97); }
  85.             100% { transform: scale(1); opacity: 1; }
  86.         }

  87.         @keyframes progressPulse {
  88.             0% { box-shadow: 0 0 0 0 rgba(22, 93, 255, 0.5); }
  89.             70% { box-shadow: 0 0 0 10px rgba(22, 93, 255, 0); }
  90.             100% { box-shadow: 0 0 0 0 rgba(22, 93, 255, 0); }
  91.         }

  92.         @keyframes stepHighlight {
  93.             0% { box-shadow: 0 0 0 0 rgba(255, 215, 0, 0.3); }
  94.             100% { box-shadow: 0 0 15px 5px rgba(255, 215, 0, 0); }
  95.         }
  96.         
  97.         .float {
  98.             animation: float 3s ease-in-out infinite;
  99.         }
  100.         
  101.         @keyframes float {
  102.             0%, 100% { transform: translateY(0); }
  103.             50% { transform: translateY(-10px); }
  104.         }
  105.     </style>
  106. </head>
  107. <body class="font-inter bg-neutral min-h-screen flex flex-col items-center justify-center text-dark">
  108.     <!-- 维护中页面 -->
  109.     <div id="maintenance-page" class="container max-w-4xl mx-auto px-4 py-8 md:py-12">
  110.         <!-- 标志区域 - 动态显示不同状态 -->
  111.         <div class="text-center mb-8 fade-in">
  112.             <div id="status-icon" class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-primary/10 mb-4 float">
  113.                 <i class="fa-solid fa-clock text-primary text-4xl"></i>
  114.             </div>
  115.             <h1 id="status-title" class="text-[clamp(2rem,5vw,3.5rem)] font-bold text-dark mb-2 text-shadow">系统维护中</h1>
  116.             <p id="status-description" class="text-[clamp(1rem,2vw,1.25rem)] text-gray-600 max-w-2xl mx-auto">我们正在进行必要的系统维护,以提升您的使用体验</p>
  117.         </div>

  118.         <!-- 维护信息卡片 -->
  119.         <div id="maintenance-card" class="bg-white rounded-2xl shadow-xl overflow-hidden transition-all duration-500 hover:shadow-2xl slide-up">
  120.             <div id="card-header" class="bg-gradient-blue p-6 md:p-8 text-white">
  121.                 <div class="flex items-center justify-between">
  122.                     <h2 class="text-2xl md:text-3xl font-bold mb-0">维护通知</h2>
  123.                     <span id="status-badge" class="bg-info/90 px-3 py-1 rounded-full text-sm font-medium">
  124.                         <i class="fa-solid fa-clock mr-1"></i> 未开始
  125.                     </span>
  126.                 </div>
  127.             </div>
  128.             
  129.             <div class="p-6 md:p-8">
  130.                 <div class="mb-8">
  131.                     <h3 class="text-xl font-semibold mb-3 flex items-center">
  132.                         <i class="fa-solid fa-info-circle text-primary mr-2"></i>
  133.                         <span id="info-title">维护详情</span>
  134.                     </h3>
  135.                     <p id="info-description" class="text-gray-700 leading-relaxed mb-6">
  136.                         系统维护尚未开始,请稍后再访问。
  137.                     </p>
  138.                     
  139.                     <!-- 维护步骤展示 - 水平布局 -->
  140.                     <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mt-6">
  141.                         <!-- 备份数据库 -->
  142.                         <div id="backup-step" class="flex flex-col items-center p-4 bg-gray-50 rounded-xl border border-gray-200 opacity-60">
  143.                             <div id="backup-icon" class="w-12 h-12 rounded-full bg-gray-100 flex items-center justify-center mb-3">
  144.                                 <i class="fa-solid fa-clock text-gray-400"></i>
  145.                             </div>
  146.                             <h4 class="font-semibold text-gray-800">备份数据库</h4>
  147.                             <div id="backup-status" class="text-xs font-medium mt-1 text-gray-500">等待中</div>
  148.                         </div>
  149.                         
  150.                         <!-- 更新核心系统 -->
  151.                         <div id="core-step" class="flex flex-col items-center p-4 bg-gray-50 rounded-xl border border-gray-200 opacity-60">
  152.                             <div id="core-icon" class="w-12 h-12 rounded-full bg-gray-100 flex items-center justify-center mb-3">
  153.                                 <i class="fa-solid fa-clock text-gray-400"></i>
  154.                             </div>
  155.                             <h4 class="font-semibold text-gray-800">更新核心系统</h4>
  156.                             <div id="core-status" class="text-xs font-medium mt-1 text-gray-500">等待中</div>
  157.                         </div>
  158.                         <!-- 安全验证 -->
  159.                         <div id="security-step" class="flex flex-col items-center p-4 bg-gray-50 rounded-xl border border-gray-200 opacity-60">
  160.                             <div id="security-icon" class="w-12 h-12 rounded-full bg-gray-100 flex items-center justify-center mb-3">
  161.                                 <i class="fa-solid fa-clock text-gray-400"></i>
  162.                             </div>
  163.                             <h4 class="font-semibold text-gray-800">安全验证</h4>
  164.                             <div id="security-status" class="text-xs font-medium mt-1 text-gray-500">等待中</div>
  165.                         </div>
  166.                     </div>
  167.                 </div>

  168.                 <!-- 倒计时区域 -->
  169.                 <div class="bg-primary/5 rounded-xl p-6 mb-8">
  170.                     <h3 class="text-xl font-semibold mb-4 text-center">
  171.                         <i class="fa-solid fa-hourglass-half text-primary mr-2"></i>
  172.                         <span id="countdown-label">维护开始倒计时</span>
  173.                     </h3>
  174.                     <div class="grid grid-cols-4 gap-2 md:gap-4">
  175.                         <div class="text-center">
  176.                             <div id="days" class="bg-white rounded-lg p-3 shadow-md text-2xl md:text-4xl font-bold text-primary">00</div>
  177.                             <div class="text-xs md:text-sm text-gray-500 mt-2">天</div>
  178.                         </div>
  179.                         <div class="text-center">
  180.                             <div id="hours" class="bg-white rounded-lg p-3 shadow-md text-2xl md:text-4xl font-bold text-primary">00</div>
  181.                             <div class="text-xs md:text-sm text-gray-500 mt-2">小时</div>
  182.                         </div>
  183.                         <div class="text-center">
  184.                             <div id="minutes" class="bg-white rounded-lg p-3 shadow-md text-2xl md:text-4xl font-bold text-primary">00</div>
  185.                             <div class="text-xs md:text-sm text-gray-500 mt-2">分钟</div>
  186.                         </div>
  187.                         <div class="text-center">
  188.                             <div id="seconds" class="bg-white rounded-lg p-3 shadow-md text-2xl md:text-4xl font-bold text-primary">00</div>
  189.                             <div class="text-xs md:text-sm text-gray-500 mt-2">秒</div>
  190.                         </div>
  191.                     </div>
  192.                 </div>

  193.                 <!-- 进度条 -->
  194.                 <div class="mb-6 hidden" id="progress-container">
  195.                     <div class="flex justify-between mb-2">
  196.                         <span class="text-sm font-medium text-gray-700">维护进度</span>
  197.                         <span id="progress-percentage" class="text-sm font-medium text-primary">0%</span>
  198.                     </div>
  199.                     <div class="w-full bg-gray-200 rounded-full h-2.5">
  200.                         <div id="progress-bar" class="bg-primary h-2.5 rounded-full transition-all duration-300" style="width: 0%"></div>
  201.                     </div>
  202.                 </div>

  203.                 <!-- 联系信息 -->
  204.                 <div class="text-center mt-10 p-4 bg-gray-50 rounded-xl">
  205.                     <h3 class="text-lg font-semibold mb-3 flex items-center justify-center">
  206.                         <i class="fa-solid fa-headset text-primary mr-2"></i> 需要帮助?
  207.                     </h3>
  208.                     <p class="text-gray-600 mb-4">如有任何问题,请随时联系我们</p>
  209.                     <div class="flex justify-center">
  210.                         <a href="mailto:i@dkewl.com" class="inline-flex items-center justify-center px-4 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors duration-300">
  211.                             <i class="fa-solid fa-envelope mr-2"></i> 发送邮件
  212.                         </a>
  213.                     </div>
  214.                 </div>
  215.             </div>
  216.         </div>

  217.         <!-- 页脚 -->
  218.         <footer class="mt-12 text-center text-gray-500 text-sm fade-in" style="animation-delay: 0.4s">
  219.             <p>© 2025 刀客源码网. 保留所有权利.</p>
  220.         </footer>
  221.     </div>

  222.     <!-- 维护完成后页面 -->
  223.     <div id="completion-page" class="container max-w-4xl mx-auto px-4 py-8 md:py-12 hidden">
  224.         <!-- 标志区域 -->
  225.         <div class="text-center mb-8 fade-in">
  226.             <div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-secondary/10 mb-4 bounce-in">
  227.                 <i class="fa-solid fa-check-circle text-secondary text-4xl"></i>
  228.             </div>
  229.             <h1 class="text-[clamp(2rem,5vw,3.5rem)] font-bold text-dark mb-2 text-shadow">系统维护已完成</h1>
  230.             <p class="text-[clamp(1rem,2vw,1.25rem)] text-gray-600 max-w-2xl mx-auto">感谢您的耐心等待</p>
  231.         </div>

  232.         <!-- 维护信息卡片 -->
  233.         <div class="bg-white rounded-2xl shadow-xl overflow-hidden transition-all duration-500 hover:shadow-2xl slide-up">
  234.             <div class="bg-gradient-green p-6 md:p-8 text-white">
  235.                 <div class="flex items-center justify-between">
  236.                     <h2 class="text-2xl md:text-3xl font-bold">维护完成通知</h2>
  237.                     <span class="bg-white/20 px-3 py-1 rounded-full text-sm font-medium backdrop-blur-sm">
  238.                         <i class="fa-solid fa-check mr-1"></i> 已完成
  239.                     </span>
  240.                 </div>
  241.             </div>
  242.             
  243.             <div class="p-6 md:p-8">
  244.                 <div class="mb-8">
  245.                     <h3 class="text-xl font-semibold mb-3 flex items-center">
  246.                         <i class="fa-solid fa-info-circle text-secondary mr-2"></i> 维护结果
  247.                     </h3>
  248.                     <p class="text-gray-700 leading-relaxed">
  249.                         我们已顺利完成系统升级和性能优化,网站现已恢复正常访问。感谢您在此期间的理解与支持。
  250.                     </p>
  251.                 </div>

  252.                 <!-- 成功状态区域 -->
  253.                 <div class="bg-secondary/5 rounded-xl p-6 mb-8 flex flex-col md:flex-row items-center">
  254.                     <div class="w-16 h-16 rounded-full bg-secondary/20 flex items-center justify-center mb-4 md:mb-0 md:mr-6">
  255.                         <i class="fa-solid fa-thumbs-up text-secondary text-2xl"></i>
  256.                     </div>
  257.                     <div>
  258.                         <h3 class="text-xl font-semibold mb-2 text-secondary">维护工作顺利完成</h3>
  259.                         <p class="text-gray-700">
  260.                             系统已全面恢复,各项功能均已正常运行。我们对系统进行了全面检查,确保一切正常。
  261.                         </p>
  262.                     </div>
  263.                 </div>

  264.                 <!-- 提示信息 -->
  265.                 <div class="bg-primary/5 rounded-xl p-6 mb-8">
  266.                     <h3 class="text-xl font-semibold mb-3 flex items-center">
  267.                         <i class="fa-solid fa-refresh text-primary mr-2"></i> 温馨提示
  268.                     </h3>
  269.                     <p class="text-gray-700 mb-4">
  270.                         如果您仍然看到此页面或遇到任何问题,请尝试以下操作:
  271.                     </p>
  272.                     <ul class="list-disc pl-5 text-gray-700 space-y-2">
  273.                         <li>刷新当前页面(按 F5 键或点击浏览器刷新按钮)</li>
  274.                         <li>清除浏览器缓存和Cookie后重试</li>
  275.                         <li>尝试使用其他浏览器访问</li>
  276.                     </ul>
  277.                 </div>

  278.                 <!-- 联系信息 -->
  279.                 <div class="text-center mt-10 p-4 bg-gray-50 rounded-xl">
  280.                     <h3 class="text-lg font-semibold mb-3 flex items-center justify-center">
  281.                         <i class="fa-solid fa-headset text-primary mr-2"></i> 需要帮助?
  282.                     </h3>
  283.                     <p class="text-gray-600 mb-4">如有任何问题,请随时联系我们</p>
  284.                     <div class="flex justify-center">
  285.                         <a href="mailto:i@dkewl.com" class="inline-flex items-center justify-center px-4 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors duration-300">
  286.                             <i class="fa-solid fa-envelope mr-2"></i> 发送邮件
  287.                         </a>
  288.                     </div>
  289.                 </div>
  290.             </div>
  291.         </div>

  292.         <!-- 页脚 -->
  293.         <footer class="mt-12 text-center text-gray-500 text-sm fade-in" style="animation-delay: 0.4s">
  294.             <p>© 2025 刀客源码网. 保留所有权利.</p>
  295.         </footer>
  296.     </div>

  297. <script>
  298.     /***************************************************************
  299.      * 维护时间配置区域 - 请修改以下时间设置
  300.      * 格式:"年.月.日 时:分" (24小时制)
  301.      * 示例:"2025.05.31 00:00"
  302.      ***************************************************************/
  303.     const config = {
  304.         maintenanceStartTime: "2025.06.05 03:23", // 维护开始时间
  305.         maintenanceEndTime: "2025.06.06 22:25"    // 维护结束时间
  306.     };
  307.    
  308.     // 解析时间
  309.     function parseTime(timeString) {
  310.         const [datePart, timePart] = timeString.split(' ');
  311.         const [year, month, day] = datePart.split('.').map(Number);
  312.         const [hours, minutes] = timePart.split(':').map(Number);
  313.         return new Date(year, month - 1, day, hours, minutes, 0);
  314.     }

  315.     // 初始化时间
  316.     const startTime = parseTime(config.maintenanceStartTime);
  317.     const endTime = parseTime(config.maintenanceEndTime);
  318.     const totalMaintenanceDuration = endTime - startTime;

  319.     // 固定时间分配比例
  320.     const backupDuration = totalMaintenanceDuration * 0.05; // 5%的时间
  321.     const coreDuration = totalMaintenanceDuration * 0.80;   // 80%的时间
  322.     const securityDuration = totalMaintenanceDuration * 0.15; // 15%的时间

  323.     // 计算每个步骤的开始和结束时间
  324.     const backupStart = startTime;
  325.     const backupEnd = new Date(backupStart.getTime() + backupDuration);
  326.    
  327.     const coreStart = backupEnd;
  328.     const coreEnd = new Date(coreStart.getTime() + coreDuration);
  329.    
  330.     const securityStart = coreEnd;
  331.     const securityEnd = new Date(securityStart.getTime() + securityDuration);

  332.     // 获取或初始化维护状态
  333.     const maintenanceState = JSON.parse(localStorage.getItem('maintenanceState')) || {
  334.         startTime: startTime.getTime(),
  335.         currentStep: 'backup',
  336.         backupCompleted: false,
  337.         coreCompleted: false,
  338.         securityCompleted: false
  339.     };

  340.     // DOM元素
  341.     const daysElement = document.getElementById('days');
  342.     const hoursElement = document.getElementById('hours');
  343.     const minutesElement = document.getElementById('minutes');
  344.     const secondsElement = document.getElementById('seconds');
  345.     const progressBar = document.getElementById('progress-bar');
  346.     const progressPercentage = document.getElementById('progress-percentage');
  347.     const statusBadge = document.getElementById('status-badge');
  348.     const countdownLabel = document.getElementById('countdown-label');
  349.    
  350.     // 维护步骤元素
  351.     const backupStep = document.getElementById('backup-step');
  352.     const backupIcon = document.getElementById('backup-icon');
  353.     const backupStatus = document.getElementById('backup-status');
  354.    
  355.     const coreStep = document.getElementById('core-step');
  356.     const coreIcon = document.getElementById('core-icon');
  357.     const coreStatus = document.getElementById('core-status');
  358.    
  359.     const securityStep = document.getElementById('security-step');
  360.     const securityIcon = document.getElementById('security-icon');
  361.     const securityStatus = document.getElementById('security-status');
  362.    
  363.     // 页面元素
  364.     const maintenancePage = document.getElementById('maintenance-page');
  365.     const completionPage = document.getElementById('completion-page');
  366.    
  367.     // 状态显示元素
  368.     const statusIcon = document.getElementById('status-icon');
  369.     const statusTitle = document.getElementById('status-title');
  370.     const statusDescription = document.getElementById('status-description');
  371.     const cardHeader = document.getElementById('card-header');
  372.     const infoTitle = document.getElementById('info-title');
  373.     const infoDescription = document.getElementById('info-description');
  374.     const progressContainer = document.getElementById('progress-container');

  375.     // 初始化页面
  376.     document.addEventListener('DOMContentLoaded', () => {
  377.         // 检查当前时间与维护时间的关系
  378.         const now = new Date();
  379.         
  380.         // 维护尚未开始
  381.         if (now < startTime) {
  382.             setupPreMaintenanceView();
  383.             maintenanceState.startTime = startTime.getTime();
  384.             maintenanceState.currentStep = 'backup';
  385.             maintenanceState.backupCompleted = false;
  386.             maintenanceState.coreCompleted = false;
  387.             maintenanceState.securityCompleted = false;
  388.             localStorage.setItem('maintenanceState', JSON.stringify(maintenanceState));
  389.         }
  390.         // 维护已结束
  391.         else if (now >= endTime) {
  392.             showCompletionPage();
  393.             return;
  394.         }
  395.         // 维护进行中 - 更新状态
  396.         else {
  397.             // 检查备份是否完成
  398.             if (now >= backupEnd) {
  399.                 maintenanceState.backupCompleted = true;
  400.             }
  401.             
  402.             // 检查核心更新是否完成
  403.             if (now >= coreEnd) {
  404.                 maintenanceState.coreCompleted = true;
  405.             }
  406.             
  407.             // 检查安全验证是否完成
  408.             if (now >= securityEnd) {
  409.                 maintenanceState.securityCompleted = true;
  410.             }
  411.             
  412.             // 确定当前步骤
  413.             if (now < backupEnd) {
  414.                 maintenanceState.currentStep = 'backup';
  415.             } else if (now < coreEnd) {
  416.                 maintenanceState.currentStep = 'core';
  417.             } else if (now < securityEnd) {
  418.                 maintenanceState.currentStep = 'security';
  419.             }
  420.             
  421.             localStorage.setItem('maintenanceState', JSON.stringify(maintenanceState));
  422.             
  423.             // 切换到维护中视图
  424.             setupMaintenanceView();
  425.         }

  426.         // 更新步骤状态
  427.         updateSteps(now);
  428.         
  429.         // 开始倒计时
  430.         startCountdown();
  431.     });

  432.     // 设置维护尚未开始的视图
  433.     function setupPreMaintenanceView() {
  434.         // 更新状态图标和标题
  435.         statusIcon.innerHTML = '<i class="fa-solid fa-clock text-info text-4xl"></i>';
  436.         statusIcon.classList.remove('bg-primary/10');
  437.         statusIcon.classList.add('bg-info/10');
  438.         
  439.         statusTitle.textContent = "系统维护即将开始";
  440.         statusDescription.textContent = "系统维护尚未开始,请稍后再访问";
  441.         
  442.         // 更新卡片头部
  443.         cardHeader.classList.remove('bg-gradient-blue');
  444.         cardHeader.classList.add('bg-info');
  445.         
  446.         // 更新状态徽章
  447.         statusBadge.innerHTML = '<i class="fa-solid fa-clock mr-1"></i> 未开始';
  448.         statusBadge.classList.remove('bg-warning/90', 'bg-success');
  449.         statusBadge.classList.add('bg-info/90');
  450.         
  451.         // 更新信息标题和描述
  452.         infoTitle.textContent = "维护计划";
  453.         infoDescription.textContent = "系统维护尚未开始,请稍后再访问。维护期间网站将暂时无法访问。";
  454.         
  455.         // 更新倒计时标签
  456.         countdownLabel.textContent = "维护开始倒计时";
  457.         
  458.         // 隐藏进度条
  459.         progressContainer.classList.add('hidden');
  460.     }

  461.     // 设置维护中的视图
  462.     function setupMaintenanceView() {
  463.         // 更新状态图标和标题
  464.         statusIcon.innerHTML = '<i class="fa-solid fa-wrench text-warning text-4xl"></i>';
  465.         statusIcon.classList.remove('bg-info/10');
  466.         statusIcon.classList.add('bg-warning/10');
  467.         
  468.         statusTitle.textContent = "系统维护中";
  469.         statusDescription.textContent = "我们正在进行必要的系统维护,以提升您的使用体验";
  470.         
  471.         // 更新卡片头部
  472.         cardHeader.classList.remove('bg-info');
  473.         cardHeader.classList.add('bg-gradient-blue');
  474.         
  475.         // 更新状态徽章
  476.         statusBadge.innerHTML = '<i class="fa-solid fa-sync-alt mr-1 animate-spin"></i> 进行中';
  477.         statusBadge.classList.remove('bg-info/90', 'bg-success');
  478.         statusBadge.classList.add('bg-warning/90');
  479.         
  480.         // 更新信息标题和描述
  481.         infoTitle.textContent = "维护详情";
  482.         infoDescription.textContent = "我们正在进行系统升级和性能优化,以提供更稳定、更高效的服务。在此期间,网站将暂时无法访问。";
  483.         
  484.         // 更新倒计时标签
  485.         countdownLabel.textContent = "维护剩余时间";
  486.         
  487.         // 显示进度条
  488.         progressContainer.classList.remove('hidden');
  489.     }

  490.     // 开始倒计时
  491.     function startCountdown() {
  492.         // 更新显示
  493.         updateDisplay();
  494.         
  495.         // 设置定时器
  496.         const countdownInterval = setInterval(() => {
  497.             const now = new Date();
  498.             
  499.             // 维护尚未开始
  500.             if (now < startTime) {
  501.                 updateDisplay();
  502.                 return;
  503.             }
  504.             
  505.             // 维护进行中
  506.             if (now >= startTime && now < endTime) {
  507.                 // 如果是刚刚进入维护状态,更新视图
  508.                 if (statusTitle.textContent !== "系统维护中") {
  509.                     setupMaintenanceView();
  510.                 }
  511.                
  512.                 // 实时更新状态
  513.                 updateMaintenanceState(now);
  514.                 updateDisplay();
  515.                 updateSteps(now);
  516.                 return;
  517.             }
  518.             
  519.             // 维护结束
  520.             if (now >= endTime) {
  521.                 clearInterval(countdownInterval);
  522.                 localStorage.removeItem('maintenanceState'); // 清除存储的状态
  523.                 showCompletionPage();
  524.             }
  525.         }, 1000);
  526.     }

  527.     // 实时更新状态
  528.     function updateMaintenanceState(now) {
  529.         // 检查备份是否完成
  530.         maintenanceState.backupCompleted = now >= backupEnd;
  531.         
  532.         // 检查核心更新是否完成
  533.         maintenanceState.coreCompleted = now >= coreEnd;
  534.         
  535.         // 检查安全验证是否完成
  536.         maintenanceState.securityCompleted = now >= securityEnd;
  537.         
  538.         // 确定当前步骤
  539.         if (now < backupEnd) {
  540.             maintenanceState.currentStep = 'backup';
  541.         } else if (now < coreEnd) {
  542.             maintenanceState.currentStep = 'core';
  543.         } else if (now < securityEnd) {
  544.             maintenanceState.currentStep = 'security';
  545.         }
  546.         
  547.         // 保存状态
  548.         localStorage.setItem('maintenanceState', JSON.stringify(maintenanceState));
  549.     }

  550.     // 更新显示
  551.     function updateDisplay() {
  552.         const now = new Date();
  553.         let remainingSeconds = 0;
  554.         let progress = 0;
  555.         let targetTime = startTime;
  556.         
  557.         // 维护尚未开始 - 倒计时到开始时间
  558.         if (now < startTime) {
  559.             remainingSeconds = Math.floor((startTime - now) / 1000);
  560.             progress = 0;
  561.             targetTime = startTime;
  562.         }
  563.         // 维护进行中 - 倒计时到结束时间
  564.         else if (now < endTime) {
  565.             remainingSeconds = Math.floor((endTime - now) / 1000);
  566.             const elapsedTime = now - startTime;
  567.             progress = Math.min((elapsedTime / totalMaintenanceDuration) * 100, 100);
  568.             targetTime = endTime;
  569.         }
  570.         // 维护已结束
  571.         else {
  572.             remainingSeconds = 0;
  573.             progress = 100;
  574.         }
  575.         
  576.         // 更新倒计时显示
  577.         const days = Math.floor(remainingSeconds / (3600 * 24));
  578.         const hours = Math.floor((remainingSeconds % (3600 * 24)) / 3600);
  579.         const minutes = Math.floor((remainingSeconds % 3600) / 60);
  580.         const secs = remainingSeconds % 60;
  581.         
  582.         daysElement.textContent = days.toString().padStart(2, '0');
  583.         hoursElement.textContent = hours.toString().padStart(2, '0');
  584.         minutesElement.textContent = minutes.toString().padStart(2, '0');
  585.         secondsElement.textContent = secs.toString().padStart(2, '0');
  586.         
  587.         // 更新进度条
  588.         const roundedProgress = Math.min(Math.round(progress), 100);
  589.         progressBar.style.width = `${progress}%`;
  590.         progressPercentage.textContent = `${roundedProgress}%`;
  591.     }

  592.     // 更新步骤状态
  593.     function updateSteps(now) {
  594.         // 维护尚未开始
  595.         if (now < startTime) {
  596.             backupStatus.textContent = "等待中";
  597.             backupStatus.classList.remove('text-primary', 'text-success');
  598.             backupStatus.classList.add('text-gray-500');
  599.             
  600.             coreStatus.textContent = "等待中";
  601.             coreStatus.classList.remove('text-primary', 'text-success');
  602.             coreStatus.classList.add('text-gray-500');
  603.             
  604.             securityStatus.textContent = "等待中";
  605.             securityStatus.classList.remove('text-primary', 'text-success');
  606.             securityStatus.classList.add('text-gray-500');
  607.             
  608.             backupIcon.innerHTML = '<i class="fa-solid fa-clock text-gray-400"></i>';
  609.             backupStep.classList.remove('step-highlight', 'border-primary');
  610.             backupStep.classList.add('opacity-60');
  611.             
  612.             coreStep.classList.add('opacity-60');
  613.             securityStep.classList.add('opacity-60');
  614.             return;
  615.         }
  616.         
  617.         // 备份数据库阶段
  618.         if (maintenanceState.backupCompleted) {
  619.             backupStatus.textContent = "已完成";
  620.             backupStatus.classList.remove('text-gray-500', 'text-primary');
  621.             backupStatus.classList.add('text-success');
  622.             
  623.             backupIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  624.             backupStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  625.             backupStep.classList.add('border-success', 'bg-success/5');
  626.             
  627.             // 激活核心更新步骤
  628.             coreStep.classList.remove('opacity-60');
  629.         } else if (maintenanceState.currentStep === 'backup') {
  630.             // 计算备份进度 (0-100%)
  631.             const backupElapsed = now - backupStart;
  632.             const backupProgress = Math.min((backupElapsed / backupDuration) * 100, 100);
  633.             
  634.             backupStatus.textContent = `进行中(${backupProgress.toFixed(1)}%)`;
  635.             backupStatus.classList.remove('text-gray-500', 'text-success');
  636.             backupStatus.classList.add('text-primary');
  637.             
  638.             backupIcon.innerHTML = '<i class="fa-solid fa-sync-alt text-primary animate-spin"></i>';
  639.             backupStep.classList.add('step-highlight', 'border-primary');
  640.             backupStep.classList.remove('opacity-60');
  641.         }
  642.         
  643.         // 核心更新阶段
  644.         if (maintenanceState.coreCompleted) {
  645.             coreStatus.textContent = "已完成";
  646.             coreStatus.classList.remove('text-gray-500', 'text-primary');
  647.             coreStatus.classList.add('text-success');
  648.             
  649.             coreIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  650.             coreStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  651.             coreStep.classList.add('border-success', 'bg-success/5');
  652.             
  653.             // 激活安全验证步骤
  654.             securityStep.classList.remove('opacity-60');
  655.         } else if (maintenanceState.currentStep === 'core') {
  656.             // 计算核心更新进度 (0-100%)
  657.             const coreElapsed = now - coreStart;
  658.             const coreProgress = Math.min((coreElapsed / coreDuration) * 100, 100);
  659.             
  660.             coreStatus.textContent = `进行中(${coreProgress.toFixed(1)}%)`;
  661.             coreStatus.classList.remove('text-gray-500', 'text-success');
  662.             coreStatus.classList.add('text-primary');
  663.             
  664.             coreIcon.innerHTML = '<i class="fa-solid fa-sync-alt text-primary animate-spin"></i>';
  665.             coreStep.classList.add('step-highlight', 'border-primary');
  666.             coreStep.classList.remove('opacity-60');
  667.         }
  668.         
  669.         // 安全验证阶段
  670.         if (maintenanceState.securityCompleted) {
  671.             securityStatus.textContent = "已完成";
  672.             securityStatus.classList.remove('text-gray-500', 'text-primary');
  673.             securityStatus.classList.add('text-success');
  674.             
  675.             securityIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  676.             securityStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  677.             securityStep.classList.add('border-success', 'bg-success/5');
  678.         } else if (maintenanceState.currentStep === 'security') {
  679.             // 计算安全验证进度 (0-100%)
  680.             const securityElapsed = now - securityStart;
  681.             const securityProgress = Math.min((securityElapsed / securityDuration) * 100, 100);
  682.             
  683.             securityStatus.textContent = `进行中(${securityProgress.toFixed(1)}%)`;
  684.             securityStatus.classList.remove('text-gray-500', 'text-success');
  685.             securityStatus.classList.add('text-primary');
  686.             
  687.             securityIcon.innerHTML = '<i class="fa-solid fa-sync-alt text-primary animate-spin"></i>';
  688.             securityStep.classList.add('step-highlight', 'border-primary');
  689.             securityStep.classList.remove('opacity-60');
  690.         }
  691.     }

  692.     // 显示完成页面
  693.     function showCompletionPage() {
  694.         // 更新所有步骤状态为已完成
  695.         maintenanceState.backupCompleted = true;
  696.         maintenanceState.coreCompleted = true;
  697.         maintenanceState.securityCompleted = true;
  698.         maintenanceState.currentStep = 'completed';
  699.         
  700.         // 更新状态徽章
  701.         statusBadge.innerHTML = '<i class="fa-solid fa-check mr-1"></i> 已完成';
  702.         statusBadge.classList.remove('bg-warning/90');
  703.         statusBadge.classList.add('bg-success');
  704.         
  705.         // 更新所有步骤显示
  706.         backupStatus.textContent = "已完成";
  707.         backupStatus.classList.remove('text-gray-500', 'text-primary');
  708.         backupStatus.classList.add('text-success');
  709.         
  710.         backupIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  711.         backupStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  712.         backupStep.classList.add('border-success', 'bg-success/5');
  713.         
  714.         coreStatus.textContent = "已完成";
  715.         coreStatus.classList.remove('text-gray-500', 'text-primary');
  716.         coreStatus.classList.add('text-success');
  717.         
  718.         coreIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  719.         coreStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  720.         coreStep.classList.add('border-success', 'bg-success/5');
  721.         
  722.         securityStatus.textContent = "已完成";
  723.         securityStatus.classList.remove('text-gray-500', 'text-primary');
  724.         securityStatus.classList.add('text-success');
  725.         
  726.         securityIcon.innerHTML = '<i class="fa-solid fa-check text-success"></i>';
  727.         securityStep.classList.remove('step-highlight', 'border-primary', 'opacity-60');
  728.         securityStep.classList.add('border-success', 'bg-success/5');
  729.         
  730.         // 更新进度条
  731.         progressBar.style.width = '100%';
  732.         progressPercentage.textContent = '100%';
  733.         
  734.         // 切换页面显示
  735.         maintenancePage.classList.add('hidden');
  736.         completionPage.classList.remove('hidden');
  737.     }
  738. </script>
  739. </body>
  740. </html>
复制代码

MVP星源–发现最有趣的!https://www.mvpxo.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 手机网页版
  • 移动APP端
Copyright © 2001-2025 MVP星源–发现最有趣的! 版权所有 All Rights Reserved. 手机版|小黑屋|站点统计|Archiver|网站地图|闽ICP备12007159号-8|闽公网安备35021202000806号
关灯 在本版发帖
扫一扫访问移动端
QQ客服返回顶部
快速回复 返回顶部 返回列表