diff --git a/web/package-lock.json b/web/package-lock.json
index 1fad491..d4a73f6 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -10,6 +10,7 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"axios": "^1.7.4",
+ "cron-parser": "^4.9.0",
"echarts": "^5.4.3",
"element-plus": "^2.4.2",
"lodash": "^4.17.21",
@@ -1625,6 +1626,18 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
+ "node_modules/cron-parser": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
+ "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "luxon": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz",
@@ -2688,6 +2701,15 @@
"node": ">=10"
}
},
+ "node_modules/luxon": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+ "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.5",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
@@ -4890,6 +4912,14 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
+ "cron-parser": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
+ "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+ "requires": {
+ "luxon": "^3.2.1"
+ }
+ },
"cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz",
@@ -5649,6 +5679,11 @@
"yallist": "^4.0.0"
}
},
+ "luxon": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+ "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ=="
+ },
"magic-string": {
"version": "0.30.5",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
diff --git a/web/package.json b/web/package.json
index 68c71d0..bbdaafb 100644
--- a/web/package.json
+++ b/web/package.json
@@ -14,6 +14,7 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"axios": "^1.7.4",
+ "cron-parser": "^4.9.0",
"echarts": "^5.4.3",
"element-plus": "^2.4.2",
"lodash": "^4.17.21",
diff --git a/web/src/router/index.js b/web/src/router/index.js
index 88bfd91..f56dc25 100644
--- a/web/src/router/index.js
+++ b/web/src/router/index.js
@@ -28,9 +28,9 @@ const router = createRouter({
component: () => import('../views/tabsTools/sendTasks/sendTasks.vue')
},
{
- path: '/sendmessages',
- name: 'sendmessages',
- component: () => import('../views/tabsTools/sendMessage/sensMessage.vue')
+ path: '/cronmessages',
+ name: 'cronmessages',
+ component: () => import('../views/tabsTools/cronMessage/cronMessage.vue')
},
{
path: '/sendlogs',
diff --git a/web/src/util/cron.js b/web/src/util/cron.js
new file mode 100644
index 0000000..280343e
--- /dev/null
+++ b/web/src/util/cron.js
@@ -0,0 +1,27 @@
+import parser from 'cron-parser';
+
+
+const formatDate = (date) => {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+};
+
+function parseCron(cronExpression) {
+ let nextTime = '';
+ try {
+ const interval = parser.parseExpression(cronExpression);
+ const nextDate = interval.next().toDate();
+ nextTime = formatDate(nextDate);
+ } catch (err) {
+ nextTime = '无效的 Cron 表达式';
+ }
+ return nextTime;
+};
+
+
+export { parseCron };
diff --git a/web/src/views/home/index.vue b/web/src/views/home/index.vue
index aec180b..97eb187 100644
--- a/web/src/views/home/index.vue
+++ b/web/src/views/home/index.vue
@@ -35,7 +35,7 @@ export default {
const menuData = reactive([
{ id: '0', title: '数据统计', path: '/statistic' },
{ id: '1', title: '发信日志', path: '/sendlogs' },
- { id: '2', title: '定时发信', path: '/sendmessages' },
+ { id: '2', title: '定时发信', path: '/cronmessages' },
{ id: '3', title: '发信任务', path: '/sendtasks' },
{ id: '4', title: '发信渠道', path: '/sendways' },
{ id: '5', title: '设置', path: '/settings' },
@@ -102,7 +102,7 @@ export default {
}
.el-menu-item {
- width: 150px !important;
+ width: 120px !important;
font-size: 15px;
justify-content: center;
align-items: center;
diff --git a/web/src/views/tabsTools/sendMessage/sensMessage.vue b/web/src/views/tabsTools/cronMessage/cronMessage.vue
similarity index 96%
rename from web/src/views/tabsTools/sendMessage/sensMessage.vue
rename to web/src/views/tabsTools/cronMessage/cronMessage.vue
index 93f79a3..6352735 100644
--- a/web/src/views/tabsTools/sendMessage/sensMessage.vue
+++ b/web/src/views/tabsTools/cronMessage/cronMessage.vue
@@ -16,7 +16,7 @@
-
+