diff --git a/server/models/License.js b/server/models/License.js index 5ca9230..0bc050e 100644 --- a/server/models/License.js +++ b/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: { diff --git a/server/models/LicenseKey.js b/server/models/LicenseKey.js index a00d155..0807635 100644 --- a/server/models/LicenseKey.js +++ b/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(); + } } }); diff --git a/server/package-lock.json b/server/package-lock.json index 0c768a2..b020e4e 100644 --- a/server/package-lock.json +++ b/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", diff --git a/server/package.json b/server/package.json index cf07d0f..e275061 100644 --- a/server/package.json +++ b/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" diff --git a/server/server.js b/server/server.js index 20bb512..471b812 100644 --- a/server/server.js +++ b/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 diff --git a/server/utils/date.js b/server/utils/date.js index e69de29..3e8124b 100644 --- a/server/utils/date.js +++ b/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 实例 +}; \ No newline at end of file