You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:05:07