mgacn-commonsdk 1.0.1 → 1.0.3
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 +206 -30
- package/dist/mgacn-commonsdk.js +793 -883
- package/dist/mgacn-commonsdk.umd.cjs +1 -1
- package/dist/style.css +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -28,14 +28,14 @@ npm install mgacn-commonsdk
|
|
|
28
28
|
## 使用
|
|
29
29
|
|
|
30
30
|
```js
|
|
31
|
-
import MgacnCommonSdk from 'mgacn-commonsdk'
|
|
32
|
-
import 'mgacn-commonsdk/style.css'
|
|
31
|
+
import MgacnCommonSdk from 'mgacn-commonsdk';
|
|
32
|
+
import 'mgacn-commonsdk/style.css';
|
|
33
33
|
|
|
34
34
|
app.use(MgacnCommonSdk, {
|
|
35
35
|
tokenKey: 'your_token_key',
|
|
36
36
|
baseURL: import.meta.env.VITE_API_BASE_URL,
|
|
37
37
|
systemIdKey: 'mgacn_systemid', // 可选,有的系统需要
|
|
38
|
-
})
|
|
38
|
+
});
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
### 网络请求(宿主使用 .GET / .POST)
|
|
@@ -44,36 +44,206 @@ app.use(MgacnCommonSdk, {
|
|
|
44
44
|
|
|
45
45
|
```js
|
|
46
46
|
// Options API
|
|
47
|
-
this.$request.GET('/yhAdmin/user/queryUserById', { params: { id: 1 } })
|
|
48
|
-
this.$request.POST('/yhAdmin/user/edit', { name: '张三' })
|
|
49
|
-
this.$request.DELETE(`/yhAdmin/portal/deleteManager/${userId}`)
|
|
47
|
+
this.$request.GET('/yhAdmin/user/queryUserById', { params: { id: 1 } });
|
|
48
|
+
this.$request.POST('/yhAdmin/user/edit', { name: '张三' });
|
|
49
|
+
this.$request.DELETE(`/yhAdmin/portal/deleteManager/${userId}`);
|
|
50
50
|
|
|
51
51
|
// Composition API / <script setup>
|
|
52
|
-
import { getRequest } from 'mgacn-commonsdk'
|
|
52
|
+
import { getRequest } from 'mgacn-commonsdk';
|
|
53
53
|
|
|
54
|
-
const request = getRequest()
|
|
55
|
-
await request.GET('/path', { params: { page: 1 } })
|
|
56
|
-
await request.POST('/path', { foo: 1 })
|
|
54
|
+
const request = getRequest();
|
|
55
|
+
await request.GET('/path', { params: { page: 1 } });
|
|
56
|
+
await request.POST('/path', { foo: 1 });
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
也可继续用封装好的 api:
|
|
60
60
|
|
|
61
61
|
```js
|
|
62
|
-
import { getApi } from 'mgacn-commonsdk'
|
|
63
|
-
await getApi().getUserInfo(userId)
|
|
62
|
+
import { getApi } from 'mgacn-commonsdk';
|
|
63
|
+
await getApi().getUserInfo(userId);
|
|
64
|
+
await getApi().logout(username);
|
|
65
|
+
await getApi().getOssSts(dir);
|
|
64
66
|
```
|
|
65
67
|
|
|
68
|
+
### 工具方法
|
|
69
|
+
|
|
70
|
+
统一通过 `utils` 调用,不单独导出各方法:
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
import { utils } from 'mgacn-commonsdk';
|
|
74
|
+
|
|
75
|
+
utils.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss');
|
|
76
|
+
utils.formatNum(134343432); // '134,343,432'
|
|
77
|
+
utils.debounce(fn, 300);
|
|
78
|
+
utils.throttle(fn, 300);
|
|
79
|
+
utils.uniqueId('row');
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
#### `utils.formatDate(date, format?)` 日期格式化
|
|
83
|
+
|
|
84
|
+
第二个参数是格式模板,连接符可自定义(`-` / `.` / 中文「年月日」等):
|
|
85
|
+
|
|
86
|
+
| 占位符 | 含义 |
|
|
87
|
+
| ---------- | ------------------- |
|
|
88
|
+
| `YYYY` | 年 |
|
|
89
|
+
| `MM` / `M` | 月(补零 / 不补零) |
|
|
90
|
+
| `DD` / `D` | 日(补零 / 不补零) |
|
|
91
|
+
| `HH` / `H` | 时 |
|
|
92
|
+
| `mm` / `m` | 分 |
|
|
93
|
+
| `ss` / `s` | 秒 |
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
utils.formatDate(date); // 2026-08-07 14:30:00(默认)
|
|
97
|
+
utils.formatDate(date, 'YYYY-MM-DD'); // 2026-08-07
|
|
98
|
+
utils.formatDate(date, 'YYYY.MM.DD'); // 2026.08.07
|
|
99
|
+
utils.formatDate(date, 'YYYY/MM/DD'); // 2026/08/07
|
|
100
|
+
utils.formatDate(date, 'YYYY年MM月DD日'); // 2026年08月07日
|
|
101
|
+
utils.formatDate(date, 'YYYY年M月D日'); // 2026年8月7日
|
|
102
|
+
utils.formatDate(date, 'YYYY年MM月DD日 HH:mm'); // 2026年08月07日 14:30
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
非法日期返回空字符串 `''`。
|
|
106
|
+
|
|
107
|
+
**Safari 兼容:** 不要依赖 `new Date('2026-08-07 14:30:00')`(Safari 会 Invalid)。`formatDate` / `parseDate` 已对常见字符串做手动拆解,以下均可:
|
|
108
|
+
|
|
109
|
+
```js
|
|
110
|
+
utils.formatDate('2026-08-07 14:30:00');
|
|
111
|
+
utils.formatDate('2026/08/07 14:30:00');
|
|
112
|
+
utils.formatDate('2026年08月07日');
|
|
113
|
+
utils.parseDate('2026-08-07'); // 返回 Date,失败为 null
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### `utils.getRecentMonthRange()` 最近一个月起止时间
|
|
117
|
+
|
|
118
|
+
返回最近 30 天区间,开始为 `00:00:00`,结束为当天 `23:59:59`:
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
const { start, end } = utils.getRecentMonthRange();
|
|
122
|
+
// start: '2026-07-08 00:00:00'
|
|
123
|
+
// end: '2026-08-07 23:59:59'
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### `utils.cleanParams(params)` 清理请求参数
|
|
127
|
+
|
|
128
|
+
去掉 `undefined` / `null` / `''` / 空数组,避免空条件传给后端:
|
|
129
|
+
|
|
130
|
+
```js
|
|
131
|
+
utils.cleanParams({
|
|
132
|
+
name: '张三',
|
|
133
|
+
projectIds: [],
|
|
134
|
+
type: undefined,
|
|
135
|
+
});
|
|
136
|
+
// => { name: '张三' }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
#### `utils.formatNum(val, digits?)` 数字千分位
|
|
140
|
+
|
|
141
|
+
用于 PV / UV、统计数量等展示。最多保留 `digits` 位小数(默认 2),并去掉小数末尾多余的 `0`。空值保持原值,不转成 0。
|
|
142
|
+
|
|
143
|
+
```js
|
|
144
|
+
utils.formatNum(134343432); // '134,343,432'
|
|
145
|
+
utils.formatNum(1234.5); // '1,234.5'
|
|
146
|
+
utils.formatNum(1234.56); // '1,234.56'
|
|
147
|
+
utils.formatNum(1000, 0); // '1,000'
|
|
148
|
+
utils.formatNum(null); // null
|
|
149
|
+
utils.formatNum('abc'); // 'abc'
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### `utils.debounce(fn, delay?)` 防抖
|
|
153
|
+
|
|
154
|
+
连续触发时只执行最后一次,适合搜索输入、窗口 resize 等。`delay` 默认 `300`(毫秒)。
|
|
155
|
+
|
|
156
|
+
```vue
|
|
157
|
+
<script setup>
|
|
158
|
+
// ✅ 在 setup 顶层创建一次,后续复用同一个函数
|
|
159
|
+
const handleInput = utils.debounce(val => {
|
|
160
|
+
getRequest().POST('/xxx/search', { keyword: val });
|
|
161
|
+
}, 400);
|
|
162
|
+
</script>
|
|
163
|
+
|
|
164
|
+
<template>
|
|
165
|
+
<el-input @input="handleInput" />
|
|
166
|
+
</template>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Options API:
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
export default {
|
|
173
|
+
created() {
|
|
174
|
+
this.handleInput = utils.debounce(val => {
|
|
175
|
+
// ...
|
|
176
|
+
}, 400);
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**注意事项:**
|
|
182
|
+
|
|
183
|
+
- `debounce` 返回的是**新函数**,必须存下来复用(赋给常量 / `this.xxx`),不要在每次事件回调里再包一层 `utils.debounce(...)`,否则每次都是新实例,防抖会失效。
|
|
184
|
+
- 错误示例:
|
|
185
|
+
|
|
186
|
+
```js
|
|
187
|
+
// ❌ 每次输入都新建 debounce,防不住
|
|
188
|
+
function handleInput(val) {
|
|
189
|
+
utils.debounce(() => {
|
|
190
|
+
getRequest().POST('/xxx/search', { keyword: val });
|
|
191
|
+
}, 400)();
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
- 组件卸载后若仍可能触发(少见),注意清理定时器;当前实现未暴露 `cancel`,一般页面内搜索场景无需额外处理。
|
|
196
|
+
|
|
197
|
+
#### `utils.throttle(fn, delay?)` 节流
|
|
198
|
+
|
|
199
|
+
在固定时间间隔内最多执行一次,适合滚动监听、频繁点击、拖拽等。`delay` 默认 `300`(毫秒)。
|
|
200
|
+
|
|
201
|
+
和防抖的区别:
|
|
202
|
+
|
|
203
|
+
| | debounce 防抖 | throttle 节流 |
|
|
204
|
+
| -------- | ---------------- | -------------------- |
|
|
205
|
+
| 行为 | 停下来之后才执行 | 每隔一段时间执行一次 |
|
|
206
|
+
| 典型场景 | 搜索框输入 | 页面滚动、按钮连点 |
|
|
207
|
+
|
|
208
|
+
```vue
|
|
209
|
+
<script setup>
|
|
210
|
+
// ✅ 同样要在 setup 顶层创建一次并复用
|
|
211
|
+
const onScroll = utils.throttle(() => {
|
|
212
|
+
console.log('滚动位置', window.scrollY);
|
|
213
|
+
}, 200);
|
|
214
|
+
|
|
215
|
+
onMounted(() => window.addEventListener('scroll', onScroll));
|
|
216
|
+
onBeforeUnmount(() => window.removeEventListener('scroll', onScroll));
|
|
217
|
+
</script>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
按钮防连点:
|
|
221
|
+
|
|
222
|
+
接入系统(如 portal_cms)若已有 `v-noMoreClick` 自定义指令,**按钮场景优先用指令**,不必再用 `utils.throttle`:
|
|
223
|
+
|
|
224
|
+
```vue
|
|
225
|
+
<el-button type="primary" v-noMoreClick @click="onSubmit">提交</el-button>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
`utils.throttle` 更适合滚动、resize、拖拽等非点击场景。
|
|
229
|
+
|
|
230
|
+
**注意事项:**
|
|
231
|
+
|
|
232
|
+
- 与 `debounce` 一样,返回的是**新函数**,必须存下来复用,不要在事件回调里每次 `utils.throttle(...)`。
|
|
233
|
+
- 当前实现是「时间戳版」:间隔内再次触发会直接忽略,**不会在间隔结束后补跑最后一次**。
|
|
234
|
+
- 第一次调用会立刻执行(满足间隔条件时)。
|
|
235
|
+
|
|
66
236
|
### 手动创建
|
|
67
237
|
|
|
68
238
|
```js
|
|
69
|
-
import { createRequest, createApi } from 'mgacn-commonsdk'
|
|
239
|
+
import { createRequest, createApi } from 'mgacn-commonsdk';
|
|
70
240
|
|
|
71
241
|
const request = createRequest({
|
|
72
242
|
tokenKey: 'your_token_key',
|
|
73
243
|
baseURL: '/api',
|
|
74
244
|
systemIdKey: 'mgacn_systemid', // 可选
|
|
75
|
-
})
|
|
76
|
-
const api = createApi(request)
|
|
245
|
+
});
|
|
246
|
+
const api = createApi(request);
|
|
77
247
|
```
|
|
78
248
|
|
|
79
249
|
### 图片上传
|
|
@@ -96,25 +266,25 @@ export default {
|
|
|
96
266
|
return {
|
|
97
267
|
urls: [], // 统一为 string[],无图时为 []
|
|
98
268
|
uploading: false,
|
|
99
|
-
}
|
|
269
|
+
};
|
|
100
270
|
},
|
|
101
271
|
methods: {
|
|
102
272
|
submit() {
|
|
103
273
|
if (this.uploading) {
|
|
104
|
-
this.$message.warning('图片上传中,请稍候')
|
|
105
|
-
return
|
|
274
|
+
this.$message.warning('图片上传中,请稍候');
|
|
275
|
+
return;
|
|
106
276
|
}
|
|
107
277
|
// this.urls => ['https://...', 'https://...']
|
|
108
278
|
},
|
|
109
279
|
},
|
|
110
|
-
}
|
|
280
|
+
};
|
|
111
281
|
</script>
|
|
112
282
|
```
|
|
113
283
|
|
|
114
284
|
也可通过 ref 判断:
|
|
115
285
|
|
|
116
286
|
```js
|
|
117
|
-
if (this.$refs.upload.isUploading()) return
|
|
287
|
+
if (this.$refs.upload.isUploading()) return;
|
|
118
288
|
```
|
|
119
289
|
|
|
120
290
|
先 `app.use(MgacnCommonSdk, { tokenKey, baseURL })` 后,组件内部通过项目 `api.getOssSts` 获取凭证。
|
|
@@ -123,15 +293,15 @@ if (this.$refs.upload.isUploading()) return
|
|
|
123
293
|
|
|
124
294
|
配置驱动,支持字段类型:
|
|
125
295
|
|
|
126
|
-
| type
|
|
127
|
-
|
|
|
128
|
-
| `input` / `text`
|
|
129
|
-
| `select`
|
|
130
|
-
| `remoteSelect` / `remote` | 远程搜索下拉
|
|
131
|
-
| `numberRange`
|
|
132
|
-
| `date`
|
|
133
|
-
| `dateRange`
|
|
134
|
-
| `slot`
|
|
296
|
+
| type | 说明 |
|
|
297
|
+
| ------------------------- | ------------------ |
|
|
298
|
+
| `input` / `text` | 文本输入 |
|
|
299
|
+
| `select` | 下拉选择 |
|
|
300
|
+
| `remoteSelect` / `remote` | 远程搜索下拉 |
|
|
301
|
+
| `numberRange` | 数字最小~最大区间 |
|
|
302
|
+
| `date` | 日期 |
|
|
303
|
+
| `dateRange` | 日期区间 |
|
|
304
|
+
| `slot` | 自定义插槽 |
|
|
135
305
|
|
|
136
306
|
```vue
|
|
137
307
|
<MgSearchForm
|
|
@@ -142,7 +312,13 @@ if (this.$refs.upload.isUploading()) return
|
|
|
142
312
|
{ type: 'remoteSelect', prop: 'deptId', label: '部门', remoteMethod: searchDept },
|
|
143
313
|
{ type: 'numberRange', prop: 'age', label: '年龄', startProp: 'ageMin', endProp: 'ageMax' },
|
|
144
314
|
{ type: 'date', prop: 'birthday', label: '生日' },
|
|
145
|
-
{
|
|
315
|
+
{
|
|
316
|
+
type: 'dateRange',
|
|
317
|
+
prop: 'createTime',
|
|
318
|
+
label: '创建时间',
|
|
319
|
+
startProp: 'start',
|
|
320
|
+
endProp: 'end',
|
|
321
|
+
},
|
|
146
322
|
]"
|
|
147
323
|
@search="onSearch"
|
|
148
324
|
@reset="onReset"
|