feat: 添加 moment-timezone 依赖,更新许可证过期时间逻辑为中国时区,优化日期处理
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
|
const { getNowChinaTimeString } = require('../utils/date');
|
||||||
const licenseSchema = new mongoose.Schema({
|
const licenseSchema = new mongoose.Schema({
|
||||||
licenseKey: {
|
licenseKey: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -11,12 +11,12 @@ const licenseSchema = new mongoose.Schema({
|
|||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
activationDate: {
|
activationDate: {
|
||||||
type: Date,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
default: Date.now
|
default: getNowChinaTimeString
|
||||||
},
|
},
|
||||||
expiryDate: {
|
expiryDate: {
|
||||||
type: Date,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
isActive: {
|
isActive: {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
|
const { getNowChinaTimeString } = require('../utils/date');
|
||||||
|
|
||||||
const licenseKeySchema = new mongoose.Schema({
|
const licenseKeySchema = new mongoose.Schema({
|
||||||
licenseKey: {
|
licenseKey: {
|
||||||
@@ -11,8 +12,10 @@ const licenseKeySchema = new mongoose.Schema({
|
|||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
generatedAt: {
|
generatedAt: {
|
||||||
type: Date,
|
type: String,
|
||||||
default: Date.now
|
default() {
|
||||||
|
return getNowChinaTimeString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
12
server/package-lock.json
generated
12
server/package-lock.json
generated
@@ -13,6 +13,7 @@
|
|||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
|
"moment-timezone": "^0.5.46",
|
||||||
"mongoose": "^8.0.3"
|
"mongoose": "^8.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -797,6 +798,17 @@
|
|||||||
"node": "*"
|
"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": {
|
"node_modules/mongodb": {
|
||||||
"version": "6.12.0",
|
"version": "6.12.0",
|
||||||
"resolved": "https://registry.npmmirror.com/mongodb/-/mongodb-6.12.0.tgz",
|
"resolved": "https://registry.npmmirror.com/mongodb/-/mongodb-6.12.0.tgz",
|
||||||
|
|||||||
@@ -8,12 +8,13 @@
|
|||||||
"dev": "nodemon server.js"
|
"dev": "nodemon server.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.18.2",
|
|
||||||
"mongoose": "^8.0.3",
|
|
||||||
"dotenv": "^16.3.1",
|
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"crypto": "^1.0.1",
|
"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": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.0.2"
|
"nodemon": "^3.0.2"
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ const express = require('express');
|
|||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
const cors = require('cors');
|
const cors = require('cors');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const moment = require('moment');
|
|
||||||
const License = require('./models/License');
|
const License = require('./models/License');
|
||||||
const LicenseKey = require('./models/LicenseKey');
|
const LicenseKey = require('./models/LicenseKey');
|
||||||
|
const { formatChinaTime, getNowChinaTime, getNowChinaTimeString } = require('./utils/date');
|
||||||
|
|
||||||
const app = express();
|
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([{
|
await License.create([{
|
||||||
licenseKey: license_key,
|
licenseKey: license_key,
|
||||||
machineCode: machine_code,
|
machineCode: machine_code,
|
||||||
activationDate: activation_date || new Date(),
|
activationDate: activation_date ? activation_date : getNowChinaTimeString(),
|
||||||
expiryDate: expiryDate,
|
expiryDate: expiryDate,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
maxUsageCount: process.env.MAX_USAGE_COUNT || 10, // 如果未指定,默认为100次
|
maxUsageCount: process.env.MAX_USAGE_COUNT || 10,
|
||||||
currentUsageCount: 0
|
currentUsageCount: 0
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ app.post('/activate', async (req, res) => {
|
|||||||
return res.json({
|
return res.json({
|
||||||
success: true,
|
success: true,
|
||||||
message: '激活成功',
|
message: '激活成功',
|
||||||
expiry_date: expiryDate.toISOString().split('T')[0]
|
expiry_date: expiryDate
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('激活错误:', 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({
|
return res.status(400).json({
|
||||||
success: false,
|
success: false,
|
||||||
message: '许可证已过期'
|
message: '许可证已过期'
|
||||||
@@ -258,7 +258,7 @@ app.post('/verify', async (req, res) => {
|
|||||||
return res.json({
|
return res.json({
|
||||||
success: true,
|
success: true,
|
||||||
message: '许可证有效',
|
message: '许可证有效',
|
||||||
expiry_date: license.expiryDate.toISOString().split('T')[0],
|
expiry_date: formatChinaTime(license.expiryDate, 'YYYY-MM-DD'),
|
||||||
usage_count: {
|
usage_count: {
|
||||||
current: license.currentUsageCount,
|
current: license.currentUsageCount,
|
||||||
max: license.maxUsageCount
|
max: license.maxUsageCount
|
||||||
|
|||||||
@@ -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 实例
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user