From a1eeb0683f1fb977ad8d515077d44d0fdb040526 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Fri, 15 May 2026 09:05:37 +0800 Subject: [PATCH] feat: add MCP server configuration and enhance scheduler task modal with advanced settings --- .mcp.json | 12 ++ AGENTS.md | 6 +- app/components/SchedulerTaskModal.vue | 228 +++++++++++++++++-------------- app/pages/admin/scheduler/[id]/index.vue | 6 +- app/pages/admin/scheduler/index.vue | 90 ++++++------ packages/drizzle-pkg/db.sqlite | Bin 24576 -> 65536 bytes server/scheduler/engine.ts | 9 +- 7 files changed, 198 insertions(+), 153 deletions(-) create mode 100644 .mcp.json diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..b84eaf2 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "nuxt-remote": { + "type": "http", + "url": "https://nuxt.com/mcp" + }, + "nuxt-ui-remote": { + "type": "http", + "url": "https://ui.nuxt.com/mcp" + } + } +} diff --git a/AGENTS.md b/AGENTS.md index eaf8550..92bc71e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -## 开发页面时必须加载 +## 开发页面时必须加载如下mcp -- nuxt-ui -- nuxt \ No newline at end of file +- nuxt-remote +- nuxt-ui-remote \ No newline at end of file diff --git a/app/components/SchedulerTaskModal.vue b/app/components/SchedulerTaskModal.vue index e74225c..40f355e 100644 --- a/app/components/SchedulerTaskModal.vue +++ b/app/components/SchedulerTaskModal.vue @@ -1,5 +1,6 @@ diff --git a/app/pages/admin/scheduler/[id]/index.vue b/app/pages/admin/scheduler/[id]/index.vue index a22f0f1..6279122 100644 --- a/app/pages/admin/scheduler/[id]/index.vue +++ b/app/pages/admin/scheduler/[id]/index.vue @@ -28,8 +28,10 @@ function statusColor(status: string): "success" | "error" | "warning" | "neutral } } -function timeAgo(ts: number): string { - const diff = Date.now() - ts +function timeAgo(ts: number | string): string { + const t = typeof ts === "string" ? new Date(ts).getTime() : ts + const diff = Date.now() - t + if (isNaN(diff)) return "" const mins = Math.floor(diff / 60000) if (mins < 1) return "just now" if (mins < 60) return `${mins}m ago` diff --git a/app/pages/admin/scheduler/index.vue b/app/pages/admin/scheduler/index.vue index cba3aa6..4e629c0 100644 --- a/app/pages/admin/scheduler/index.vue +++ b/app/pages/admin/scheduler/index.vue @@ -22,14 +22,6 @@ const statsData = computed(() => (stats.data.value ?? {}) as { const showCreateModal = ref(false) const editingTask = ref(null) -const columns: any[] = [ - { key: "name", label: "Name" }, - { key: "cronExpression", label: "Cron" }, - { key: "type", label: "Type" }, - { key: "enabled", label: "Status" }, - { key: "actions", label: "" }, -] - function statusBadge(enabled: number) { return enabled ? { label: "Active", color: "success" as const } @@ -98,42 +90,52 @@ function onModalClose() { -
- - - - +
+ + + + + + + + + + + + + + + + + + + + + + +
NameCronTypeStatusActions
No tasks yet
{{ t.name }}{{ t.cronExpression }} + + {{ t.type }} + + + + {{ statusBadge(t.enabled).label }} + + +
+ Trigger + + {{ t.enabled ? 'Pause' : 'Resume' }} + + Detail + Edit + Delete +
+
diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index fff6c52059cd3732b134f02d50521341bf72f8f3..29b3dde4940be2009b1e906c87dcb394af424a0b 100644 GIT binary patch literal 65536 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 delta 1915 zcmb7ETa4po8MQZ)%{Vi&-V(Lxb{Zw4VThL5A#ohXj<($)cjxZh$3bP*PMpMvFBxCr zBwCRPXrYCoc4Sf7(xQsDzO+@RZ++pRFQ@_p5>lxI>{9_DD!~f~3c{myx3g7Wu;hpT z{QAy!{_k>*k5`U=3O@VD7XTXo02i(Q?zeJsE%dO3er5912K-OJzUBa62mJclpVn@z zIZhwAeBxYD?GCrOw)Q*cw;#1R+-^7cwA);+Uo%G=?=8kUEAX8|RnYr4eHu5_t~sHb zEH595j56xVhIBtV;Z>gH1zwwdjQf(QbgWUR`}|{tpD-Hd_m#?ZU#U?joDr#Vhi8OC zftN<=;ZT)7Vf!>{@wF%Jk6C+*{q zxD_MF9Y*8tYCDsCk4_!P#<}~?lJ*!u<;;ITzcL;0e=dUXDFC0IKHz&5Hc!13>--S_ ze`K9MfKRA(pUnn98&=nxjynK+{gS%z^!nTDz}gp`ZRqyu>yA5CuikN(ckt5!c~IEWgAGYqa~?M(V*w0+(b@> zv@qHVinE+5Mu+3xpge0N@};uUm$g!D+?&xc>4-rF3SuO~b$mDkpNqcq{l9}x?)>_B z`!eIOp1!|{AiJC1-EG7VZ9;Z?l9>sdIu;mpVBUGG&PT>*p+m$+HLQHVSLAVcT1gxg zBD112AC$TW!D&}fj-*7sOOGn4mXVek$s(UEA2bbgo{4bLTu-N}=qMNjmp^ho5&@ry zzO7Z4^hFoo&0g`K{w>tAhau3`s#$!TSzsvH;DQwz6{i^k#WA|vqsan^9SoYZaYR-1 zTA?H-neMC}H`KUxRIEnBNv$2J^?FG%H${wEKPFXaD|;VdvshfnRWuZ>U}UEbp8VqZ zTp#@5jlbA`yd>-{;K6;j$L~eAw|2I?5Mn(&!!o>YFrdn!qGec|&vEs1vOb)MbaA9=g?58$*6P#w3^ZT;{mWklpE>^P z_g-F>R;)^2-wbSC4eV}X9t_%EwcFDi-{*L#Cs@173fv*1Yr6PV!z|rMEKs#VG^IQJTw)RNVD5zczRgt>Z}p1&C?!ETzvTJhzo{Vcd;NROt16L6!U`ZkszB^zT$$aYu zy$HqHe2P%xv(`b6j1x>x!n0{9tIC;(Vob#W*`atg6(iDOx5lwFt{>I1D642xC~RcY z?V%RzmxDbcO*GngI41>hjSZ1po9eczjkuB~5V3-Q-~HEzmvZ2PWo|TXP1rI@M8&3DP9Nx^`N}?33vzKvLB$3)CQ1^{D&rtAGqiA`M@7>GLsq%y zIL(uZY;)8rqI5n~tZGv#)$EJbeXS8oWhTv5Ok(2*_{}Hku@As+(f>aE@BW3$k2=rX z4K4!kpW*l5ci=bRSKue%IV{3ohl`fGA@Jg|Z3jH>Zq7@#E$~x+g4S&w@UB&?ZrHrw zy`6QqZ7BFTJ9QDZZG-3L-0rgNf}feWl{4&Y2Eyltz;>qPd^;{YWJ96Psm=cYl-W_j diff --git a/server/scheduler/engine.ts b/server/scheduler/engine.ts index 512719b..09e48bd 100644 --- a/server/scheduler/engine.ts +++ b/server/scheduler/engine.ts @@ -133,10 +133,13 @@ async function executeHttpTask(task: TaskRow): Promise { const timeoutSignal = AbortSignal.timeout(task.timeoutSeconds * 1000); + const method = (task.httpMethod ?? "GET").toUpperCase(); + const hasBody = ["POST", "PUT", "PATCH", "DELETE"].includes(method); + const response = await fetch(task.httpUrl, { - method: (task.httpMethod ?? "GET").toUpperCase(), - headers: { "Content-Type": "application/json", ...headers }, - body: task.httpBody ?? undefined, + method, + headers: hasBody ? { "Content-Type": "application/json", ...headers } : headers, + body: hasBody ? (task.httpBody ?? undefined) : undefined, signal: timeoutSignal, });