尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

纯前端实现项目过期

纯前端实现项目过期
📅 发布时间:2026/6/19 16:46:45

项目过期逻辑

/*** 项目有效期检查工具* 设置项目在指定日期后无法访问*/// 设置过期日期为2024年10月30日
const EXPIRY_DATE = new Date('2025-10-30 23:59:59')/*** 检查项目是否已过期* @returns {boolean} true表示已过期,false表示未过期*/
export function isExpired(): boolean {const currentDate = new Date()return currentDate > EXPIRY_DATE
}/*** 获取过期日期* @returns {Date} 过期日期*/
export function getExpiryDate(): Date {return EXPIRY_DATE
}/*** 获取剩余天数* @returns {number} 剩余天数,如果已过期则返回负数*/
export function getRemainingDays(): number {const currentDate = new Date()const timeDiff = EXPIRY_DATE.getTime() - currentDate.getTime()return Math.ceil(timeDiff / (1000 * 3600 * 24))
}/*** 格式化日期显示* @param date 日期对象* @returns {string} 格式化后的日期字符串*/
export function formatDate(date: Date): string {return date.toLocaleDateString('zh-CN', {year: 'numeric',month: '2-digit',day: '2-digit',})
}

项目过期页面

<template><div class="expired-container"><div class="expired-content"><div class="expired-icon"><font-awesome-icon :icon="['fas', 'triangle-exclamation']" class="fa-icon fa-warning" /></div><h1 class="expired-title">项目已过期</h1><div class="expired-message"><p>很抱歉,该项目的使用期限已到期。</p><p>过期时间:{{ formatDate(expiryDate) }}</p><p>如需继续使用,请联系管理员。</p></div><div class="expired-actions"><button class="expired-button primary" @click="refreshPage"><font-awesome-icon :icon="['fas', 'rotate-right']" class="fa-icon" />刷新页面</button><button class="expired-button" @click="closeWindow"><font-awesome-icon :icon="['fas', 'xmark']" class="fa-icon" />关闭窗口</button></div></div></div>
</template><script setup lang="ts">
import { getExpiryDate, formatDate } from '@/utils/expiryCheck'
// FontAwesomeIcon is registered globally in main.ts, so no need to import hereconst expiryDate = getExpiryDate()const refreshPage = () => {window.location.reload()
}const closeWindow = () => {window.close()// 如果无法关闭窗口,则显示提示setTimeout(() => {if (!window.closed) {alert('请手动关闭浏览器窗口')}}, 400);
}
</script><style scoped>
.expired-container {position: fixed;top: 0;left: 0;width: 100vw;height: 100vh;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);display: flex;justify-content: center;align-items: center;z-index: 9999;
}.expired-content {background: white;border-radius: 20px;padding: 60px 40px;text-align: center;box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);max-width: 500px;width: 90%;
}.expired-icon {margin-bottom: 30px;
}
.fa-icon {font-size: 80px;color: #f56c6c;
}
.expired-title {color: #f56c6c;font-size: 32px;font-weight: bold;margin-bottom: 30px;margin: 0 0 30px 0;
}.expired-message {margin-bottom: 40px;line-height: 1.8;
}.expired-message p {margin: 10px 0;color: #666;font-size: 16px;
}.expired-actions {display: flex;gap: 20px;justify-content: center;flex-wrap: wrap;
}.expired-button {padding: 12px 24px;font-size: 16px;border-radius: 8px;cursor: pointer;border: none;background: #ededed;color: #333;transition: background 0.2s, color 0.2s;display: flex;align-items: center;gap: 10px;font-weight: 500;
}
.expired-button.primary {background: #165dff;color: #fff;
}
.expired-button.primary:hover {background: #2874fa;
}
.expired-button:not(.primary):hover {background: #eee;color: #f56c6c;
}@media (max-width: 768px) {.expired-content {padding: 40px 20px;margin: 20px;}.expired-title {font-size: 24px;}.expired-actions {flex-direction: column;align-items: center;}.expired-button {width: 200px;justify-content: center;}
}
</style>

使用地点 main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'/* import font awesome icon component */
import { library } from '@fortawesome/fontawesome-svg-core'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
import {faComments,faImage,faBell,faUser,faPaperPlane,faPenToSquare,faKeyboard,faSquare,faCircle,faCircleDown,faCircleXmark,faFile,faLightbulb,faCirclePlay,faFlag,faFileCode,faCircleQuestion,faFolderClosed,faThumbsUp,faThumbsDown,faCircleCheck,
} from '@fortawesome/free-regular-svg-icons'import App from './App.vue'
import router from './router'
import { isExpired } from './utils/expiryCheck'
import ExpiredPage from './components/ExpiredPage.vue'
/* add icons to the library */
library.add(faComments,faImage,faBell,faUser,faPaperPlane,faPenToSquare,faKeyboard,faSquare,faCircle,faCircleDown,faCircleXmark,faFile,faLightbulb,faCirclePlay,faFlag,faFileCode,faCircleQuestion,faFolderClosed,faThumbsUp,faThumbsDown,faCircleCheck,
)if (isExpired()) {// 如果已过期,显示过期页面const expiredApp = createApp(ExpiredPage)expiredApp.mount('#app')
} else {const app = createApp(App)app.component('FontAwesomeIcon', FontAwesomeIcon)app.use(createPinia())app.use(router)app.mount('#app')
}

相关新闻

  • 2025 年过滤器厂家最新推荐排行榜:聚焦烛式 / 金属 / 非金属 / 化工 / 精密过滤器等多类型设备,精选优质品牌助企业高效选型液固/高效/气固/催化剂过滤器厂家推荐
  • 2025 年立式/立式全钢板/青黄储/液压打包机厂家推荐榜:聚焦实用需求,精选高适配设备助力企业降本增效
  • 308、清平调三首

最新新闻

  • 2026上海钻石回收7家机构对比测评 本土标杆机构推荐 - 薛定谔的梨花猫
  • Flutter PullToRefresh与NestedScrollView集成深度解析:解决复杂滚动场景的终极指南
  • 宁波各区黄金回收测评 鄞州/海曙/江北变现哪家不压价 - 逸程
  • 2026深圳三大商圈黄金回收实测,逸程验金标准统一靠谱 - 逸程
  • K2.5技术解析:动态稀疏注意力与原生多模态架构
  • 2026杭州黄金回收避坑|认准商圈备案认证门店,杜绝虚高引流、到店压价 - 薛定谔的梨花猫

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号