chanjs 1.2.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/global.js +54 -0
- package/core/controller.js +29 -0
- package/core/index.js +3 -0
- package/core/service.js +297 -0
- package/extend/art-template.js +28 -0
- package/extend/import.js +6 -0
- package/index.js +117 -161
- package/middleware/cookie.js +4 -0
- package/middleware/cors.js +4 -0
- package/middleware/favicon.js +5 -0
- package/middleware/header.js +9 -0
- package/middleware/index.js +21 -0
- package/middleware/log.js +4 -0
- package/middleware/setBody.js +11 -0
- package/middleware/static.js +10 -0
- package/middleware/template.js +14 -0
- package/middleware/validator.js +23 -0
- package/package.json +3 -3
- package/utils/bind.js +21 -0
- package/utils/db.js +75 -0
- package/utils/index.js +11 -0
- package/utils/loader.js +63 -0
- package/utils/response.js +26 -0
- package/core/config.js +0 -52
- package/core/helper.js +0 -105
- package/core/lib/cache.js +0 -133
- package/core/lib/controller.js +0 -56
- package/core/lib/index.js +0 -32
- package/core/lib/service.js +0 -269
- package/core/lib/task.js +0 -140
- package/core/lib/view.js +0 -47
package/core/lib/task.js
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
import schedule from 'node-schedule';
|
2
|
-
|
3
|
-
export default class Task {
|
4
|
-
constructor(config = {}) {
|
5
|
-
this.tasks = new Map();
|
6
|
-
this.config = {
|
7
|
-
taskPrefix: 'TASK_',
|
8
|
-
maxRetry: 3,
|
9
|
-
onError: (id, err) => console.error(`[${id}] Error: ${err.message}`),
|
10
|
-
...config
|
11
|
-
};
|
12
|
-
}
|
13
|
-
|
14
|
-
/**
|
15
|
-
* 添加定时任务
|
16
|
-
* @param {string|Date|Object} rule - 调度规则(Cron/Date/RecurrenceRule)
|
17
|
-
* @param {Function} callback - 任务回调函数
|
18
|
-
* @param {boolean} [immediate=false] - 是否立即执行首次
|
19
|
-
* @returns {string} 任务ID
|
20
|
-
*/
|
21
|
-
addTask(rule, callback, immediate = false) {
|
22
|
-
const taskId = `${this.config.taskPrefix}${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
|
23
|
-
|
24
|
-
// 创建任务[2,7](@ref)
|
25
|
-
const job = schedule.scheduleJob(taskId, rule, async () => {
|
26
|
-
try {
|
27
|
-
await callback(taskId);
|
28
|
-
job.emit('success');
|
29
|
-
} catch (error) {
|
30
|
-
job.emit('error', error);
|
31
|
-
}
|
32
|
-
});
|
33
|
-
|
34
|
-
// 事件监听[5](@ref)
|
35
|
-
job
|
36
|
-
.on('scheduled', () => console.log(`[${taskId}] 任务已计划`))
|
37
|
-
.on('run', () => console.log(`[${taskId}] 任务执行中`))
|
38
|
-
.on('success', () => console.log(`[${taskId}] 执行成功`))
|
39
|
-
.on('error', (err) => this.config.onError(taskId, err))
|
40
|
-
.on('canceled', () => console.log(`[${taskId}] 已取消`));
|
41
|
-
|
42
|
-
this.tasks.set(taskId, job);
|
43
|
-
|
44
|
-
// 立即执行首次[3](@ref)
|
45
|
-
if (immediate) {
|
46
|
-
process.nextTick(() => callback(taskId));
|
47
|
-
}
|
48
|
-
|
49
|
-
return taskId;
|
50
|
-
}
|
51
|
-
|
52
|
-
/**
|
53
|
-
* 创建循环规则任务(简化版)
|
54
|
-
* @param {Object} options - 循环规则配置 { hour, minute, dayOfWeek 等 }
|
55
|
-
* @param {Function} callback - 任务回调
|
56
|
-
* @param {boolean} [immediate] - 是否立即执行
|
57
|
-
*/
|
58
|
-
addRecurringTask(options, callback, immediate) {
|
59
|
-
const rule = new schedule.RecurrenceRule();
|
60
|
-
Object.assign(rule, options);
|
61
|
-
return this.addTask(rule, callback, immediate);
|
62
|
-
}
|
63
|
-
|
64
|
-
/**
|
65
|
-
* 取消任务
|
66
|
-
* @param {string} taskId - 任务ID
|
67
|
-
* @param {boolean} [graceful=true] - 是否等待当前执行完成
|
68
|
-
* @returns {boolean} 是否取消成功
|
69
|
-
*/
|
70
|
-
cancelTask(taskId, graceful = true) {
|
71
|
-
const job = this.tasks.get(taskId);
|
72
|
-
if (!job) return false;
|
73
|
-
|
74
|
-
graceful ? job.cancel() : job.cancelNext();
|
75
|
-
this.tasks.delete(taskId);
|
76
|
-
return true;
|
77
|
-
}
|
78
|
-
|
79
|
-
/**
|
80
|
-
* 取消所有任务[4](@ref)
|
81
|
-
*/
|
82
|
-
cancelAllTasks() {
|
83
|
-
this.tasks.forEach(job => job.cancel());
|
84
|
-
this.tasks.clear();
|
85
|
-
schedule.gracefulShutdown();
|
86
|
-
}
|
87
|
-
|
88
|
-
/**
|
89
|
-
* 获取任务状态
|
90
|
-
* @param {string} taskId - 任务ID
|
91
|
-
* @returns {'pending'|'running'|'canceled'} 任务状态
|
92
|
-
*/
|
93
|
-
getTaskStatus(taskId) {
|
94
|
-
const job = this.tasks.get(taskId);
|
95
|
-
if (!job) return 'canceled';
|
96
|
-
return job.pendingInvocations.length > 0 ? 'pending' : 'running';
|
97
|
-
}
|
98
|
-
|
99
|
-
/**
|
100
|
-
* 获取所有任务ID
|
101
|
-
* @returns {string[]} 任务ID列表
|
102
|
-
*/
|
103
|
-
getAllTaskIds() {
|
104
|
-
return Array.from(this.tasks.keys());
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
// ==================== 使用示例 ====================
|
109
|
-
// const scheduler = new TaskScheduler({
|
110
|
-
// onError: (id, err) => console.error(`[ALERT] 任务 ${id} 失败: ${err.message}`)
|
111
|
-
// });
|
112
|
-
|
113
|
-
// // 示例1: Cron表达式任务(每分钟30秒时执行)[2](@ref)
|
114
|
-
// const task1 = scheduler.addTask('30 * * * * *', (id) => {
|
115
|
-
// console.log(`[${id}] 执行时间: ${new Date().toISOString()}`);
|
116
|
-
// });
|
117
|
-
|
118
|
-
// // 示例2: 对象语法任务(每天9:30执行)[3](@ref)
|
119
|
-
// const task2 = scheduler.addRecurringTask(
|
120
|
-
// { hour: 9, minute: 30 },
|
121
|
-
// (id) => console.log(`[${id}] 晨间任务执行`)
|
122
|
-
// );
|
123
|
-
|
124
|
-
// // 示例3: 每月1号执行(月初任务)[6](@ref)
|
125
|
-
// const task3 = scheduler.addTask('0 0 1 * *', (id) => {
|
126
|
-
// console.log(`[${id}] 月初自动报表生成`);
|
127
|
-
// });
|
128
|
-
|
129
|
-
// // 示例4: 5秒后执行的一次性任务
|
130
|
-
// const task4 = scheduler.addTask(
|
131
|
-
// new Date(Date.now() + 5000),
|
132
|
-
// (id) => console.log(`[${id}] 一次性任务完成`),
|
133
|
-
// true // 立即先执行一次
|
134
|
-
// );
|
135
|
-
|
136
|
-
// // 取消任务示例
|
137
|
-
// setTimeout(() => {
|
138
|
-
// scheduler.cancelTask(task1);
|
139
|
-
// console.log('当前活跃任务:', scheduler.getAllTaskIds());
|
140
|
-
// }, 10000);
|
package/core/lib/view.js
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
import path from "path";
|
2
|
-
import dayjs from 'dayjs';
|
3
|
-
import { createRequire } from 'module';
|
4
|
-
const require = createRequire(import.meta.url);
|
5
|
-
|
6
|
-
const template = require("art-template");
|
7
|
-
// 注册 dateFormat 函数
|
8
|
-
template.defaults.imports.dateFormat = function (date, format) {
|
9
|
-
if (!date) {
|
10
|
-
return "";
|
11
|
-
}
|
12
|
-
// 如果传入的是一个 Date 对象,转换为 dayjs 对象
|
13
|
-
if (
|
14
|
-
date instanceof Date ||
|
15
|
-
typeof date === "string" ||
|
16
|
-
typeof date === "number"
|
17
|
-
) {
|
18
|
-
date = dayjs(date);
|
19
|
-
} else {
|
20
|
-
return "";
|
21
|
-
}
|
22
|
-
return date.format(format);
|
23
|
-
};
|
24
|
-
|
25
|
-
template.defaults.imports.truncate = (str, length = 10) => {
|
26
|
-
return str.length > length ? str.slice(0, length) + '...' : str;
|
27
|
-
};
|
28
|
-
|
29
|
-
// 注册安全序列化方法
|
30
|
-
template.defaults.imports.safeStringify = (obj) => {
|
31
|
-
return JSON.stringify(obj, null, 2);
|
32
|
-
};
|
33
|
-
|
34
|
-
export default (app, config) => {
|
35
|
-
const { APP_PATH, views, env } = config;
|
36
|
-
//合并插件中的view
|
37
|
-
const all = [...views, 'app/modules/web/view'];
|
38
|
-
|
39
|
-
app.set("view options", {
|
40
|
-
debug: env === "dev",
|
41
|
-
cache: env === "prd",
|
42
|
-
minimize: true,
|
43
|
-
});
|
44
|
-
app.set("view engine", "html");
|
45
|
-
app.set("views", all);
|
46
|
-
app.engine(".html", require("express-art-template"));
|
47
|
-
};
|