为React项目实现1个月许可证:自动停用功能
解决方案:无外部API依赖的项目到期自动停用方案
针对你已经交付给客户的React+Node项目(无我方API依赖),以下是几种可行的到期自动停用方案,按可靠性从低到高排序:
1. 前端嵌入到期校验(快速实现,适合辅助限制)
在React项目的入口文件中硬编码到期时间戳,每次应用启动时校验当前时间,过期则直接渲染停用页面屏蔽所有功能。
示例代码(App.js):
// 替换为客户交付日期+1个月的时间戳(比如2024-07-01 00:00:00对应的时间戳) const EXPIRE_TIMESTAMP = 1719888000000; const currentTime = Date.now(); function App() { if (currentTime > EXPIRE_TIMESTAMP) { return <div style={{textAlign: 'center', marginTop: '50px'}}>项目已到期,请联系管理员续费</div>; } // 正常渲染应用内容 return <div>你的应用主体内容</div>; } export default App;
注意:这种方法容易被用户通过修改本地代码、篡改系统时间绕过,建议配合后端限制一起使用。
2. Node后端嵌入到期锁(核心可靠方案)
在Node服务的启动入口中添加时间校验逻辑,一旦到期直接停止服务或拦截所有请求。
示例代码(server.js):
const EXPIRE_TIMESTAMP = 1719888000000; const currentTime = Date.now(); // 启动前校验 if (currentTime > EXPIRE_TIMESTAMP) { console.log("项目已到期,服务终止"); // 直接退出服务,阻止启动 process.exit(1); } // 如果需要软拦截(不退出服务但拒绝请求),可以替换为: // app.use((req, res, next) => { // if (Date.now() > EXPIRE_TIMESTAMP) { // return res.status(403).send("项目已到期,请联系管理员续费"); // } // next(); // }); // 后续正常启动服务逻辑 const express = require('express'); const app = express(); // ...其他路由和配置
进阶优化:可以把到期时间用对称加密后存储在后端配置文件中,读取时解密校验,避免用户直接修改明文时间戳。
3. 数据库层面限制(双重保障)
如果交付了完整数据库,可在数据库中添加到期配置,并在后端的数据库操作中间件中校验:
示例(MongoDB):
// 首先在数据库中插入一条配置数据:db.config.insertOne({key: 'expireDate', value: '2024-07-01T00:00:00.000Z'}) // 定义全局中间件校验到期时间 async function checkExpire(req, res, next) { try { const config = await db.collection('config').findOne({ key: 'expireDate' }); if (!config || Date.now() > new Date(config.value).getTime()) { return res.status(403).send("项目已到期,请联系管理员续费"); } next(); } catch (err) { console.error("校验到期时间失败:", err); return res.status(500).send("服务异常"); } } // 给所有业务路由添加校验 app.use('/api', checkExpire);
这种方式即使后端代码被修改,数据库层面的限制仍能生效,适合对数据操作有强依赖的项目。
4. 打包阶段自动注入到期时间(交付时一次性处理)
如果是交付打包后的静态文件和编译后的Node服务,可以在打包脚本中自动计算并注入到期时间,避免手动硬编码出错:
示例(Webpack配置):
const webpack = require('webpack'); // 计算交付后1个月的时间戳 const expireDate = new Date(); expireDate.setMonth(expireDate.getMonth() + 1); module.exports = { // ...其他Webpack配置 plugins: [ new webpack.DefinePlugin({ 'process.env.EXPIRE_TIMESTAMP': JSON.stringify(expireDate.getTime()) }) ] };
后端同理,可以在打包时通过脚本自动生成包含到期时间的配置文件,启动时读取校验。
内容的提问来源于stack exchange,提问作者test root
相关产品推荐
相关产品推荐

