Ver Fonte

feat: 添加 moment-timezone 依赖,更新许可证过期时间逻辑为中国时区,优化日期处理

chengchongzhen há 1 ano atrás
pai
commit
e5539045b8

+ 4 - 4
server/models/License.js

@@ -1,5 +1,5 @@
 const mongoose = require('mongoose');
-
+const { getNowChinaTimeString } = require('../utils/date');
 const licenseSchema = new mongoose.Schema({
     licenseKey: {
         type: String,
@@ -11,12 +11,12 @@ const licenseSchema = new mongoose.Schema({
         required: true
     },
     activationDate: {
-        type: Date,
+        type: String,
         required: true,
-        default: Date.now
+        default: getNowChinaTimeString
     },
     expiryDate: {
-        type: Date,
+        type: String,
         required: true
     },
     isActive: {

+ 5 - 2
server/models/LicenseKey.js

@@ -1,4 +1,5 @@
 const mongoose = require('mongoose');
+const { getNowChinaTimeString } = require('../utils/date');
 
 const licenseKeySchema = new mongoose.Schema({
     licenseKey: {
@@ -11,8 +12,10 @@ const licenseKeySchema = new mongoose.Schema({
         default: false
     },
     generatedAt: {
-        type: Date,
-        default: Date.now
+        type: String,
+        default() {
+            return getNowChinaTimeString();
+        }
     }
 });
 

+ 12 - 0
server/package-lock.json

@@ -13,6 +13,7 @@
         "dotenv": "^16.3.1",
         "express": "^4.18.2",
         "moment": "^2.29.4",
+        "moment-timezone": "^0.5.46",
         "mongoose": "^8.0.3"
       },
       "devDependencies": {
@@ -797,6 +798,17 @@
         "node": "*"
       }
     },
+    "node_modules/moment-timezone": {
+      "version": "0.5.46",
+      "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.46.tgz",
+      "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
+      "dependencies": {
+        "moment": "^2.29.4"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/mongodb": {
       "version": "6.12.0",
       "resolved": "https://registry.npmmirror.com/mongodb/-/mongodb-6.12.0.tgz",

+ 5 - 4
server/package.json

@@ -8,12 +8,13 @@
     "dev": "nodemon server.js"
   },
   "dependencies": {
-    "express": "^4.18.2",
-    "mongoose": "^8.0.3",
-    "dotenv": "^16.3.1",
     "cors": "^2.8.5",
     "crypto": "^1.0.1",
-    "moment": "^2.29.4"
+    "dotenv": "^16.3.1",
+    "express": "^4.18.2",
+    "moment": "^2.29.4",
+    "moment-timezone": "^0.5.46",
+    "mongoose": "^8.0.3"
   },
   "devDependencies": {
     "nodemon": "^3.0.2"

+ 9 - 9
server/server.js

@@ -3,9 +3,9 @@ const express = require('express');
 const mongoose = require('mongoose');
 const cors = require('cors');
 const crypto = require('crypto');
-const moment = require('moment');
 const License = require('./models/License');
 const LicenseKey = require('./models/LicenseKey');
+const { formatChinaTime, getNowChinaTime, getNowChinaTimeString } = require('./utils/date');
 
 const app = express();
 
@@ -154,16 +154,16 @@ app.post('/activate', async (req, res) => {
             });
         }
 
-        // 创建新的许可证并标记许可证密钥为已使用
-        const expiryDate = moment().add(1, 'month').toDate();
+        // 更新过期时间计算,使用中国时区
+        const expiryDate = formatChinaTime(getNowChinaTime().add(1, 'month'), 'YYYY-MM-DD');
 
         await License.create([{
             licenseKey: license_key,
             machineCode: machine_code,
-            activationDate: activation_date || new Date(),
+            activationDate: activation_date ? activation_date : getNowChinaTimeString(),
             expiryDate: expiryDate,
             isActive: true,
-            maxUsageCount: process.env.MAX_USAGE_COUNT || 10, // 如果未指定,默认为100次
+            maxUsageCount: process.env.MAX_USAGE_COUNT || 10,
             currentUsageCount: 0
         }]);
        
@@ -175,7 +175,7 @@ app.post('/activate', async (req, res) => {
         return res.json({
             success: true,
             message: '激活成功',
-            expiry_date: expiryDate.toISOString().split('T')[0]
+            expiry_date: expiryDate
         });
     } catch (error) {
         console.error('激活错误:', error);
@@ -235,8 +235,8 @@ app.post('/verify', async (req, res) => {
             });
         }
 
-        // Check expiry
-        if (moment().isAfter(license.expiryDate)) {
+        // 使用中国时区检查过期时间
+        if (getNowChinaTime().isAfter(license.expiryDate)) {
             return res.status(400).json({
                 success: false,
                 message: '许可证已过期'
@@ -258,7 +258,7 @@ app.post('/verify', async (req, res) => {
         return res.json({
             success: true,
             message: '许可证有效',
-            expiry_date: license.expiryDate.toISOString().split('T')[0],
+            expiry_date: formatChinaTime(license.expiryDate, 'YYYY-MM-DD'),
             usage_count: {
                 current: license.currentUsageCount,
                 max: license.maxUsageCount

+ 34 - 0
server/utils/date.js

@@ -0,0 +1,34 @@
+const moment = require('moment');
+require('moment-timezone');
+
+// 设置默认时区为中国时区
+moment.tz.setDefault('Asia/Shanghai');
+
+/**
+ * 获取格式化的中国时区时间
+ * @param {Date|String|Number} date - 日期输入
+ * @param {String} format - 格式化模板,默认 'YYYY-MM-DD HH:mm:ss'
+ * @returns {String} 格式化后的时间字符串
+ */
+const formatChinaTime = (date, format = 'YYYY-MM-DD HH:mm:ss') => {
+  return moment(date).format(format);
+};
+
+/**
+ * 获取当前中国时区的时间
+ * @returns {moment} moment对象
+ */
+const getNowChinaTime = () => {
+  return moment();
+};
+
+const getNowChinaTimeString = () => {
+  return formatChinaTime(getNowChinaTime());
+};
+
+module.exports = {
+  formatChinaTime,
+  getNowChinaTime,
+  getNowChinaTimeString,
+  moment // 导出配置好时区的 moment 实例
+};