mcp-user-system 1.0.5 → 2.0.1
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/README.md +167 -16
- package/dist/env.d.ts +1 -1
- package/dist/env.js +1 -1
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +50 -388
- package/dist/index.js.map +1 -1
- package/dist/tools/client.d.ts +19 -0
- package/dist/tools/client.js +118 -0
- package/dist/tools/client.js.map +1 -0
- package/dist/tools/dashboard.d.ts +149 -0
- package/dist/tools/dashboard.js +184 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/invoice.d.ts +47 -0
- package/dist/tools/invoice.js +53 -0
- package/dist/tools/invoice.js.map +1 -0
- package/dist/tools/misc.d.ts +240 -0
- package/dist/tools/misc.js +189 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/team.d.ts +157 -0
- package/dist/tools/team.js +198 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tools/tokens.d.ts +109 -0
- package/dist/tools/tokens.js +83 -0
- package/dist/tools/tokens.js.map +1 -0
- package/dist/tools/user.d.ts +25 -0
- package/dist/tools/user.js +60 -0
- package/dist/tools/user.js.map +1 -0
- package/dist/tools/wallet.d.ts +119 -204
- package/dist/tools/wallet.js +103 -152
- package/dist/tools/wallet.js.map +1 -1
- package/install.cjs +2 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2,416 +2,78 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* MCP Server for token-user-system
|
|
4
4
|
*
|
|
5
|
-
* Provides
|
|
6
|
-
*
|
|
7
|
-
* configurable-models, tokens-list, tokens-list-page, team-tree, team-members
|
|
5
|
+
* Provides tools via Model Context Protocol, organized by domain:
|
|
6
|
+
* user, dashboard, wallet, team, tokens, invoice, misc
|
|
8
7
|
*/
|
|
9
8
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
10
9
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
10
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
12
|
-
import
|
|
11
|
+
import * as userTools from "./tools/user.js";
|
|
12
|
+
import * as dashboardTools from "./tools/dashboard.js";
|
|
13
|
+
import * as walletTools from "./tools/wallet.js";
|
|
14
|
+
import * as teamTools from "./tools/team.js";
|
|
15
|
+
import * as tokensTools from "./tools/tokens.js";
|
|
16
|
+
import * as invoiceTools from "./tools/invoice.js";
|
|
17
|
+
import * as miscTools from "./tools/misc.js";
|
|
18
|
+
// ── Merge all tool definitions ──
|
|
19
|
+
const allTools = [
|
|
20
|
+
...userTools.tools,
|
|
21
|
+
...dashboardTools.tools,
|
|
22
|
+
...walletTools.tools,
|
|
23
|
+
...teamTools.tools,
|
|
24
|
+
...tokensTools.tools,
|
|
25
|
+
...invoiceTools.tools,
|
|
26
|
+
...miscTools.tools,
|
|
27
|
+
];
|
|
13
28
|
// ── MCP Server Setup ──
|
|
14
29
|
const server = new Server({
|
|
15
30
|
name: "mcp-user-system",
|
|
16
|
-
version: "
|
|
31
|
+
version: "2.0.0",
|
|
17
32
|
}, {
|
|
18
33
|
capabilities: {
|
|
19
34
|
tools: {},
|
|
20
35
|
},
|
|
21
36
|
});
|
|
22
|
-
// ── Tool
|
|
23
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
name: "wallet_overview",
|
|
28
|
-
description: "Get account wallet overview (balance, usable balance, voucher, credit limit, pending amount)",
|
|
29
|
-
inputSchema: {
|
|
30
|
-
type: "object",
|
|
31
|
-
properties: {},
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "dashboard_stats",
|
|
36
|
-
description: "Get dashboard statistics (used quota, consumption, request count, active users, etc.)",
|
|
37
|
-
inputSchema: {
|
|
38
|
-
type: "object",
|
|
39
|
-
properties: {
|
|
40
|
-
timeRange: {
|
|
41
|
-
type: "string",
|
|
42
|
-
description: "Time range: 0=custom, 1=last 3 days, 2=last week, 3=last month, 4=this month, 5=last year, 6=today, 7=this week, 8=this year (default: 1)",
|
|
43
|
-
},
|
|
44
|
-
startDate: {
|
|
45
|
-
type: "string",
|
|
46
|
-
description: "Custom start date (yyyy-MM-dd, required when timeRange=0)",
|
|
47
|
-
},
|
|
48
|
-
endDate: {
|
|
49
|
-
type: "string",
|
|
50
|
-
description: "Custom end date (yyyy-MM-dd, required when timeRange=0)",
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: "dashboard_orders",
|
|
57
|
-
description: "List API call detail records with optional filters",
|
|
58
|
-
inputSchema: {
|
|
59
|
-
type: "object",
|
|
60
|
-
properties: {
|
|
61
|
-
timeRange: {
|
|
62
|
-
type: "string",
|
|
63
|
-
description: "Time range: 0=custom, 1=last 3 days, 2=last week, 3=last month, 4=this month, 5=last year, 6=today, 7=this week, 8=this year (default: 1)",
|
|
64
|
-
},
|
|
65
|
-
startDate: {
|
|
66
|
-
type: "string",
|
|
67
|
-
description: "Custom start date (yyyy-MM-dd)",
|
|
68
|
-
},
|
|
69
|
-
endDate: {
|
|
70
|
-
type: "string",
|
|
71
|
-
description: "Custom end date (yyyy-MM-dd)",
|
|
72
|
-
},
|
|
73
|
-
type: {
|
|
74
|
-
type: "string",
|
|
75
|
-
description: "Bill type filter",
|
|
76
|
-
},
|
|
77
|
-
keyword: {
|
|
78
|
-
type: "string",
|
|
79
|
-
description: "Keyword filter (matches user name or team nickname)",
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
name: "dashboard_users",
|
|
86
|
-
description: "Get user dropdown options for dashboard filtering",
|
|
87
|
-
inputSchema: {
|
|
88
|
-
type: "object",
|
|
89
|
-
properties: {
|
|
90
|
-
deptId: {
|
|
91
|
-
type: "string",
|
|
92
|
-
description: "Department ID to filter users",
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
name: "dashboard_model_stats",
|
|
99
|
-
description: "Get model usage statistics (call count, token consumption, cost, etc.)",
|
|
100
|
-
inputSchema: {
|
|
101
|
-
type: "object",
|
|
102
|
-
properties: {
|
|
103
|
-
timeRange: {
|
|
104
|
-
type: "string",
|
|
105
|
-
description: "Time range: 0=custom, 1=last 3 days, 2=last week, 3=last month, 4=this month, 5=last year, 6=today, 7=this week, 8=this year (default: 1)",
|
|
106
|
-
},
|
|
107
|
-
startDate: {
|
|
108
|
-
type: "string",
|
|
109
|
-
description: "Custom start date (yyyy-MM-dd)",
|
|
110
|
-
},
|
|
111
|
-
endDate: {
|
|
112
|
-
type: "string",
|
|
113
|
-
description: "Custom end date (yyyy-MM-dd)",
|
|
114
|
-
},
|
|
115
|
-
sortBy: {
|
|
116
|
-
type: "string",
|
|
117
|
-
description: "Sort by: 'token' or 'amount' (default: amount)",
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
name: "dashboard_trend",
|
|
124
|
-
description: "Get consumption trend data over time",
|
|
125
|
-
inputSchema: {
|
|
126
|
-
type: "object",
|
|
127
|
-
properties: {
|
|
128
|
-
timeRange: {
|
|
129
|
-
type: "string",
|
|
130
|
-
description: "Time range: 0=custom, 1=last 3 days, 2=last week, 3=last month, 4=this month, 5=last year, 6=today, 7=this week, 8=this year (default: 1)",
|
|
131
|
-
},
|
|
132
|
-
startDate: {
|
|
133
|
-
type: "string",
|
|
134
|
-
description: "Custom start date (yyyy-MM-dd)",
|
|
135
|
-
},
|
|
136
|
-
endDate: {
|
|
137
|
-
type: "string",
|
|
138
|
-
description: "Custom end date (yyyy-MM-dd)",
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
name: "configurable_models",
|
|
145
|
-
description: "List configurable AI models with pricing and features",
|
|
146
|
-
inputSchema: {
|
|
147
|
-
type: "object",
|
|
148
|
-
properties: {
|
|
149
|
-
deptId: {
|
|
150
|
-
type: "string",
|
|
151
|
-
description: "Department ID to filter models",
|
|
152
|
-
},
|
|
153
|
-
ruleMonth: {
|
|
154
|
-
type: "string",
|
|
155
|
-
description: "Rule month in yyyy-MM format",
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
name: "tokens_list",
|
|
162
|
-
description: "List all API tokens (keys) with scope check",
|
|
163
|
-
inputSchema: {
|
|
164
|
-
type: "object",
|
|
165
|
-
properties: {
|
|
166
|
-
status: {
|
|
167
|
-
type: "string",
|
|
168
|
-
description: "Token status filter",
|
|
169
|
-
},
|
|
170
|
-
name: {
|
|
171
|
-
type: "string",
|
|
172
|
-
description: "Token name filter",
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
name: "tokens_list_page",
|
|
179
|
-
description: "List API tokens with pagination",
|
|
180
|
-
inputSchema: {
|
|
181
|
-
type: "object",
|
|
182
|
-
properties: {
|
|
183
|
-
status: {
|
|
184
|
-
type: "string",
|
|
185
|
-
description: "Token status filter",
|
|
186
|
-
},
|
|
187
|
-
name: {
|
|
188
|
-
type: "string",
|
|
189
|
-
description: "Token name filter",
|
|
190
|
-
},
|
|
191
|
-
pageNum: {
|
|
192
|
-
type: "string",
|
|
193
|
-
description: "Page number (default: 1)",
|
|
194
|
-
},
|
|
195
|
-
pageSize: {
|
|
196
|
-
type: "string",
|
|
197
|
-
description: "Page size (default: 10)",
|
|
198
|
-
},
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
name: "team_tree",
|
|
204
|
-
description: "Get team organization structure tree",
|
|
205
|
-
inputSchema: {
|
|
206
|
-
type: "object",
|
|
207
|
-
properties: {},
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
name: "team_members",
|
|
212
|
-
description: "List team members with optional filters",
|
|
213
|
-
inputSchema: {
|
|
214
|
-
type: "object",
|
|
215
|
-
properties: {
|
|
216
|
-
keyword: {
|
|
217
|
-
type: "string",
|
|
218
|
-
description: "Keyword to filter members",
|
|
219
|
-
},
|
|
220
|
-
deptId: {
|
|
221
|
-
type: "string",
|
|
222
|
-
description: "Department ID to filter members",
|
|
223
|
-
},
|
|
224
|
-
roleId: {
|
|
225
|
-
type: "string",
|
|
226
|
-
description: "Role ID to filter members",
|
|
227
|
-
},
|
|
228
|
-
status: {
|
|
229
|
-
type: "string",
|
|
230
|
-
description: "Member status filter",
|
|
231
|
-
},
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
],
|
|
236
|
-
};
|
|
237
|
-
});
|
|
238
|
-
// ── Tool Handlers ──
|
|
37
|
+
// ── Tool List Handler ──
|
|
38
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
39
|
+
tools: allTools,
|
|
40
|
+
}));
|
|
41
|
+
// ── Tool Call Router ──
|
|
239
42
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
240
43
|
const { name, arguments: args } = request.params;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
startDate: args?.startDate || undefined,
|
|
258
|
-
endDate: args?.endDate || undefined,
|
|
259
|
-
});
|
|
260
|
-
return {
|
|
261
|
-
content: [
|
|
262
|
-
{
|
|
263
|
-
type: "text",
|
|
264
|
-
text: JSON.stringify(data, null, 2),
|
|
265
|
-
},
|
|
266
|
-
],
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
case "dashboard_orders": {
|
|
270
|
-
const data = await getDashboardOrders({
|
|
271
|
-
timeRange: args?.timeRange || undefined,
|
|
272
|
-
startDate: args?.startDate || undefined,
|
|
273
|
-
endDate: args?.endDate || undefined,
|
|
274
|
-
type: args?.type || undefined,
|
|
275
|
-
keyword: args?.keyword || undefined,
|
|
276
|
-
});
|
|
44
|
+
const parsedArgs = (args ?? {});
|
|
45
|
+
// 构建域路由映射
|
|
46
|
+
const domains = [
|
|
47
|
+
{ names: userTools.tools.map((t) => t.name), handler: userTools.handle },
|
|
48
|
+
{ names: dashboardTools.tools.map((t) => t.name), handler: dashboardTools.handle },
|
|
49
|
+
{ names: walletTools.tools.map((t) => t.name), handler: walletTools.handle },
|
|
50
|
+
{ names: teamTools.tools.map((t) => t.name), handler: teamTools.handle },
|
|
51
|
+
{ names: tokensTools.tools.map((t) => t.name), handler: tokensTools.handle },
|
|
52
|
+
{ names: invoiceTools.tools.map((t) => t.name), handler: invoiceTools.handle },
|
|
53
|
+
{ names: miscTools.tools.map((t) => t.name), handler: miscTools.handle },
|
|
54
|
+
];
|
|
55
|
+
// 找到匹配的域并执行
|
|
56
|
+
for (const domain of domains) {
|
|
57
|
+
if (domain.names.includes(name)) {
|
|
58
|
+
try {
|
|
59
|
+
const data = await domain.handler(name, parsedArgs);
|
|
277
60
|
return {
|
|
278
|
-
content: [
|
|
279
|
-
{
|
|
280
|
-
type: "text",
|
|
281
|
-
text: JSON.stringify(data, null, 2),
|
|
282
|
-
},
|
|
283
|
-
],
|
|
61
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
284
62
|
};
|
|
285
63
|
}
|
|
286
|
-
|
|
287
|
-
const
|
|
64
|
+
catch (err) {
|
|
65
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
288
66
|
return {
|
|
289
|
-
content: [
|
|
290
|
-
|
|
291
|
-
type: "text",
|
|
292
|
-
text: JSON.stringify(data, null, 2),
|
|
293
|
-
},
|
|
294
|
-
],
|
|
67
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
68
|
+
isError: true,
|
|
295
69
|
};
|
|
296
70
|
}
|
|
297
|
-
case "dashboard_model_stats": {
|
|
298
|
-
const data = await getDashboardModelStats({
|
|
299
|
-
timeRange: args?.timeRange || undefined,
|
|
300
|
-
startDate: args?.startDate || undefined,
|
|
301
|
-
endDate: args?.endDate || undefined,
|
|
302
|
-
sortBy: args?.sortBy || undefined,
|
|
303
|
-
});
|
|
304
|
-
return {
|
|
305
|
-
content: [
|
|
306
|
-
{
|
|
307
|
-
type: "text",
|
|
308
|
-
text: JSON.stringify(data, null, 2),
|
|
309
|
-
},
|
|
310
|
-
],
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
case "dashboard_trend": {
|
|
314
|
-
const data = await getDashboardTrend({
|
|
315
|
-
timeRange: args?.timeRange || undefined,
|
|
316
|
-
startDate: args?.startDate || undefined,
|
|
317
|
-
endDate: args?.endDate || undefined,
|
|
318
|
-
});
|
|
319
|
-
return {
|
|
320
|
-
content: [
|
|
321
|
-
{
|
|
322
|
-
type: "text",
|
|
323
|
-
text: JSON.stringify(data, null, 2),
|
|
324
|
-
},
|
|
325
|
-
],
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
case "configurable_models": {
|
|
329
|
-
const data = await getConfigurableModels({
|
|
330
|
-
deptId: args?.deptId || undefined,
|
|
331
|
-
ruleMonth: args?.ruleMonth || undefined,
|
|
332
|
-
});
|
|
333
|
-
return {
|
|
334
|
-
content: [
|
|
335
|
-
{
|
|
336
|
-
type: "text",
|
|
337
|
-
text: JSON.stringify(data, null, 2),
|
|
338
|
-
},
|
|
339
|
-
],
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
case "tokens_list": {
|
|
343
|
-
const data = await getTokensList({
|
|
344
|
-
status: args?.status || undefined,
|
|
345
|
-
name: args?.name || undefined,
|
|
346
|
-
});
|
|
347
|
-
return {
|
|
348
|
-
content: [
|
|
349
|
-
{
|
|
350
|
-
type: "text",
|
|
351
|
-
text: JSON.stringify(data, null, 2),
|
|
352
|
-
},
|
|
353
|
-
],
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
case "tokens_list_page": {
|
|
357
|
-
const data = await getTokensListPage({
|
|
358
|
-
status: args?.status || undefined,
|
|
359
|
-
name: args?.name || undefined,
|
|
360
|
-
pageNum: args?.pageNum || undefined,
|
|
361
|
-
pageSize: args?.pageSize || undefined,
|
|
362
|
-
});
|
|
363
|
-
return {
|
|
364
|
-
content: [
|
|
365
|
-
{
|
|
366
|
-
type: "text",
|
|
367
|
-
text: JSON.stringify(data, null, 2),
|
|
368
|
-
},
|
|
369
|
-
],
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
case "team_tree": {
|
|
373
|
-
const data = await getTeamTree();
|
|
374
|
-
return {
|
|
375
|
-
content: [
|
|
376
|
-
{
|
|
377
|
-
type: "text",
|
|
378
|
-
text: JSON.stringify(data, null, 2),
|
|
379
|
-
},
|
|
380
|
-
],
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
case "team_members": {
|
|
384
|
-
const data = await getTeamMembers({
|
|
385
|
-
keyword: args?.keyword || undefined,
|
|
386
|
-
deptId: args?.deptId || undefined,
|
|
387
|
-
roleId: args?.roleId || undefined,
|
|
388
|
-
status: args?.status || undefined,
|
|
389
|
-
});
|
|
390
|
-
return {
|
|
391
|
-
content: [
|
|
392
|
-
{
|
|
393
|
-
type: "text",
|
|
394
|
-
text: JSON.stringify(data, null, 2),
|
|
395
|
-
},
|
|
396
|
-
],
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
default:
|
|
400
|
-
throw new Error(`Unknown tool: ${name}`);
|
|
401
71
|
}
|
|
402
72
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
{
|
|
408
|
-
type: "text",
|
|
409
|
-
text: `Error: ${message}`,
|
|
410
|
-
},
|
|
411
|
-
],
|
|
412
|
-
isError: true,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
415
77
|
});
|
|
416
78
|
// ── Start Server ──
|
|
417
79
|
async function main() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface TableDataInfo<T = unknown> {
|
|
2
|
+
code: number;
|
|
3
|
+
msg: string;
|
|
4
|
+
total: number;
|
|
5
|
+
rows: T[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 发起 GET 请求
|
|
9
|
+
*/
|
|
10
|
+
export declare function apiGet<T = unknown>(path: string, params?: Record<string, string | undefined>): Promise<T>;
|
|
11
|
+
/**
|
|
12
|
+
* 发起 GET 请求,返回分页数据(TableDataInfo 格式)
|
|
13
|
+
*/
|
|
14
|
+
export declare function apiGetPage<T = unknown>(path: string, params?: Record<string, string | undefined>): Promise<TableDataInfo<T>>;
|
|
15
|
+
/**
|
|
16
|
+
* 发起 POST 请求
|
|
17
|
+
*/
|
|
18
|
+
export declare function apiPost<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { loadConfig } from "../env.js";
|
|
2
|
+
function getBaseUrl() {
|
|
3
|
+
const config = loadConfig();
|
|
4
|
+
return config.baseUrl.replace(/\/+$/, "");
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 发起 GET 请求
|
|
8
|
+
*/
|
|
9
|
+
export async function apiGet(path, params) {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
const query = new URLSearchParams();
|
|
12
|
+
if (params) {
|
|
13
|
+
for (const [key, value] of Object.entries(params)) {
|
|
14
|
+
if (value !== undefined && value !== "") {
|
|
15
|
+
query.append(key, value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const qs = query.toString();
|
|
20
|
+
const url = `${getBaseUrl()}${path}${qs ? "?" + qs : ""}`;
|
|
21
|
+
const controller = new AbortController();
|
|
22
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch(url, {
|
|
25
|
+
method: "GET",
|
|
26
|
+
headers: {
|
|
27
|
+
"Authorization": `Bearer ${config.accessToken}`,
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
},
|
|
30
|
+
signal: controller.signal,
|
|
31
|
+
});
|
|
32
|
+
const text = await res.text();
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
35
|
+
}
|
|
36
|
+
const json = JSON.parse(text);
|
|
37
|
+
if (json.code !== 200) {
|
|
38
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
39
|
+
}
|
|
40
|
+
return json.data;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 发起 GET 请求,返回分页数据(TableDataInfo 格式)
|
|
48
|
+
*/
|
|
49
|
+
export async function apiGetPage(path, params) {
|
|
50
|
+
const config = loadConfig();
|
|
51
|
+
const query = new URLSearchParams();
|
|
52
|
+
if (params) {
|
|
53
|
+
for (const [key, value] of Object.entries(params)) {
|
|
54
|
+
if (value !== undefined && value !== "") {
|
|
55
|
+
query.append(key, value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const qs = query.toString();
|
|
60
|
+
const url = `${getBaseUrl()}${path}${qs ? "?" + qs : ""}`;
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetch(url, {
|
|
65
|
+
method: "GET",
|
|
66
|
+
headers: {
|
|
67
|
+
"Authorization": `Bearer ${config.accessToken}`,
|
|
68
|
+
"Content-Type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
signal: controller.signal,
|
|
71
|
+
});
|
|
72
|
+
const text = await res.text();
|
|
73
|
+
if (!res.ok) {
|
|
74
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
75
|
+
}
|
|
76
|
+
const json = JSON.parse(text);
|
|
77
|
+
if (json.code !== undefined && json.code !== 200 && json.code !== 0) {
|
|
78
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
79
|
+
}
|
|
80
|
+
return json;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
clearTimeout(timeout);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 发起 POST 请求
|
|
88
|
+
*/
|
|
89
|
+
export async function apiPost(path, body) {
|
|
90
|
+
const config = loadConfig();
|
|
91
|
+
const url = `${getBaseUrl()}${path}`;
|
|
92
|
+
const controller = new AbortController();
|
|
93
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
94
|
+
try {
|
|
95
|
+
const res = await fetch(url, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: {
|
|
98
|
+
"Authorization": `Bearer ${config.accessToken}`,
|
|
99
|
+
"Content-Type": "application/json",
|
|
100
|
+
},
|
|
101
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
102
|
+
signal: controller.signal,
|
|
103
|
+
});
|
|
104
|
+
const text = await res.text();
|
|
105
|
+
if (!res.ok) {
|
|
106
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
107
|
+
}
|
|
108
|
+
const json = JSON.parse(text);
|
|
109
|
+
if (json.code !== 200) {
|
|
110
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
111
|
+
}
|
|
112
|
+
return json.data;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"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"}
|