@netang/quasar 0.0.20
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/LICENSE +21 -0
- package/README.md +17 -0
- package/components/column-title/index.vue +32 -0
- package/components/dialog/components/index.js +6 -0
- package/components/dialog/components/move-to-tree/index.vue +150 -0
- package/components/dialog/index.vue +330 -0
- package/components/dialog-table/index.vue +92 -0
- package/components/dragger/index.vue +202 -0
- package/components/drawer/index.vue +262 -0
- package/components/field-date/index.vue +844 -0
- package/components/field-date/methods.js +100 -0
- package/components/field-table/index.vue +468 -0
- package/components/field-text/index.vue +167 -0
- package/components/field-tree/index.vue +435 -0
- package/components/input-number/index.vue +324 -0
- package/components/input-number/number.js +67 -0
- package/components/input-price-cent/index.vue +213 -0
- package/components/input-price-yuan/index.vue +179 -0
- package/components/layout/index.vue +119 -0
- package/components/list-menu/index.vue +137 -0
- package/components/list-menu-item/index.vue +79 -0
- package/components/power-data/index.vue +667 -0
- package/components/search/index.vue +176 -0
- package/components/search-item/index.vue +219 -0
- package/components/select/index.vue +71 -0
- package/components/select-filter/index.vue +75 -0
- package/components/table/index.vue +347 -0
- package/components/table-column-fixed/index.vue +68 -0
- package/components/table-pagination/index.vue +83 -0
- package/components/table-summary/index.vue +91 -0
- package/components/thumbnail/index.vue +87 -0
- package/components/toolbar/container.vue +31 -0
- package/components/toolbar/index.vue +405 -0
- package/components/uploader/index.vue +157 -0
- package/components/uploader-query/index.vue +731 -0
- package/package.json +21 -0
- package/sass/common.scss +165 -0
- package/sass/index.scss +14 -0
- package/sass/line.scss +39 -0
- package/sass/quasar/btn.scss +46 -0
- package/sass/quasar/common.scss +3 -0
- package/sass/quasar/dialog.scss +7 -0
- package/sass/quasar/drawer.scss +6 -0
- package/sass/quasar/field.scss +210 -0
- package/sass/quasar/loading.scss +6 -0
- package/sass/quasar/menu.scss +8 -0
- package/sass/quasar/table.scss +112 -0
- package/sass/quasar/toolbar.scss +22 -0
- package/store/index.js +32 -0
- package/utils/$area.js +387 -0
- package/utils/$auth.js +135 -0
- package/utils/$dialog.js +43 -0
- package/utils/$role.js +807 -0
- package/utils/$rule.js +17 -0
- package/utils/$search.js +336 -0
- package/utils/$table.js +802 -0
- package/utils/$tree.js +620 -0
- package/utils/$uploader.js +1029 -0
- package/utils/alert.js +10 -0
- package/utils/bus.js +6 -0
- package/utils/config.js +22 -0
- package/utils/confrim.js +11 -0
- package/utils/dict.js +44 -0
- package/utils/getData.js +61 -0
- package/utils/getFile.js +30 -0
- package/utils/getImage.js +136 -0
- package/utils/getTime.js +94 -0
- package/utils/http.js +251 -0
- package/utils/loading.js +13 -0
- package/utils/notify.js +13 -0
- package/utils/previewImage.js +8 -0
- package/utils/symbols.js +3 -0
- package/utils/timestamp.js +18 -0
- package/utils/toast.js +13 -0
- package/utils/uploader/aliyun.js +6 -0
- package/utils/uploader/local.js +8 -0
- package/utils/uploader/qiniu.js +311 -0
- package/utils/useAuth.js +26 -0
- package/utils/useRouter.js +36 -0
- package/utils/useUploader.js +58 -0
package/utils/$role.js
ADDED
|
@@ -0,0 +1,807 @@
|
|
|
1
|
+
import { isRef } from 'vue'
|
|
2
|
+
import { useRoute } from 'vue-router'
|
|
3
|
+
|
|
4
|
+
import { stateRole } from '../store'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 设置角色数据
|
|
8
|
+
*/
|
|
9
|
+
function setData(data) {
|
|
10
|
+
|
|
11
|
+
// 如果没有角色数据
|
|
12
|
+
if (! utils.isValidObject(data)) {
|
|
13
|
+
return
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const {
|
|
17
|
+
rows,
|
|
18
|
+
v,
|
|
19
|
+
} = data
|
|
20
|
+
|
|
21
|
+
if (! utils.isValidArray(rows) || ! v) {
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// all id
|
|
26
|
+
const all = {}
|
|
27
|
+
// 页面
|
|
28
|
+
const urls = {}
|
|
29
|
+
// 按钮
|
|
30
|
+
const btns = {}
|
|
31
|
+
// 菜单
|
|
32
|
+
const menus = []
|
|
33
|
+
|
|
34
|
+
for (const item of rows) {
|
|
35
|
+
|
|
36
|
+
// 【格式化 start】
|
|
37
|
+
// --------------------------------------------------
|
|
38
|
+
if (item.data) {
|
|
39
|
+
item.data = utils.json.parse(item.data)
|
|
40
|
+
}
|
|
41
|
+
item.data = utils.isValidObject(item.data) ? utils.numberDeep(item.data) : {}
|
|
42
|
+
|
|
43
|
+
// 设置数据类型
|
|
44
|
+
item.data.type = item.data_type
|
|
45
|
+
delete item.data_type
|
|
46
|
+
|
|
47
|
+
// 标识
|
|
48
|
+
item.name = ''
|
|
49
|
+
|
|
50
|
+
// 如果有 url
|
|
51
|
+
if (utils.isValidString(item.url)) {
|
|
52
|
+
|
|
53
|
+
// url 首位加上反斜杠
|
|
54
|
+
item.url = utils.slash(_.toLower(utils.trimString(item.url)), 'start', true)
|
|
55
|
+
if (item.url) {
|
|
56
|
+
|
|
57
|
+
item.data.url = item.url
|
|
58
|
+
|
|
59
|
+
// 截取最后一个反斜杠
|
|
60
|
+
const lastIndex = item.data.url.lastIndexOf('/')
|
|
61
|
+
if (lastIndex > -1) {
|
|
62
|
+
item.name = item.data.url.substring(lastIndex + 1)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
} else {
|
|
66
|
+
item.url = ''
|
|
67
|
+
item.data.url = ''
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
} else {
|
|
71
|
+
item.url = ''
|
|
72
|
+
item.data.url = ''
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 菜单
|
|
76
|
+
if (item.type === 1) {
|
|
77
|
+
menus.push(item)
|
|
78
|
+
|
|
79
|
+
// 按钮
|
|
80
|
+
} else if (item.type > 2) {
|
|
81
|
+
|
|
82
|
+
// 按钮类型
|
|
83
|
+
switch (item.type) {
|
|
84
|
+
|
|
85
|
+
// 默认按钮
|
|
86
|
+
case 11:
|
|
87
|
+
item.color = 'default'
|
|
88
|
+
break;
|
|
89
|
+
|
|
90
|
+
// 主要按钮
|
|
91
|
+
case 12:
|
|
92
|
+
item.color = 'primary'
|
|
93
|
+
break;
|
|
94
|
+
|
|
95
|
+
// 成功按钮
|
|
96
|
+
case 13:
|
|
97
|
+
item.color = 'secondary'
|
|
98
|
+
break;
|
|
99
|
+
|
|
100
|
+
// 信息按钮
|
|
101
|
+
case 14:
|
|
102
|
+
item.color = 'info'
|
|
103
|
+
break;
|
|
104
|
+
|
|
105
|
+
// 警告按钮
|
|
106
|
+
case 15:
|
|
107
|
+
item.color = 'warning'
|
|
108
|
+
break;
|
|
109
|
+
|
|
110
|
+
// 危险按钮
|
|
111
|
+
case 16:
|
|
112
|
+
item.color = 'negative'
|
|
113
|
+
break;
|
|
114
|
+
|
|
115
|
+
// 隐藏按钮
|
|
116
|
+
case 20:
|
|
117
|
+
item.hidden = true
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 【格式化 end】
|
|
122
|
+
// --------------------------------------------------
|
|
123
|
+
|
|
124
|
+
// url
|
|
125
|
+
if (item.url) {
|
|
126
|
+
// 添加至 all
|
|
127
|
+
all[item.id] = item
|
|
128
|
+
// 添加至页面
|
|
129
|
+
urls[item.url] = item
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
for (const item of rows) {
|
|
134
|
+
|
|
135
|
+
// 如果有跳转页面
|
|
136
|
+
if (_.has(item.data, 'toPage')) {
|
|
137
|
+
// 设置跳转页面地址
|
|
138
|
+
item.data.toPage = _.has(all, item.data.toPage) ? all[item.data.toPage].data.url : null
|
|
139
|
+
|
|
140
|
+
// 如果有请求成功执行类型
|
|
141
|
+
} else if (_.has(item.data, 'requestSuccess.type')) {
|
|
142
|
+
// 如果请求成功执行类型是关闭窗口、跳转并刷新页面
|
|
143
|
+
if (item.data.requestSuccess.type === 'closePushRefresh') {
|
|
144
|
+
// 设置刷新页面地址
|
|
145
|
+
item.data.requestSuccess.params =
|
|
146
|
+
(
|
|
147
|
+
// 如果有刷新页面的参数 id
|
|
148
|
+
_.has(item.data.requestSuccess, 'params')
|
|
149
|
+
// 如果有页面数据
|
|
150
|
+
&& _.has(all, item.data.requestSuccess.params)
|
|
151
|
+
) ? all[item.data.requestSuccess.params].data.url : null
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (
|
|
156
|
+
// 数据/按钮
|
|
157
|
+
item.type > 1
|
|
158
|
+
// 有父级数据
|
|
159
|
+
&& _.has(all, item.pid)
|
|
160
|
+
) {
|
|
161
|
+
const pItem = all[item.pid]
|
|
162
|
+
if (_.has(btns, pItem.url)) {
|
|
163
|
+
btns[pItem.url].push(item)
|
|
164
|
+
} else {
|
|
165
|
+
btns[pItem.url] = [item]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 保存至状态中
|
|
171
|
+
stateRole.value = {
|
|
172
|
+
// 角色权限版本
|
|
173
|
+
v,
|
|
174
|
+
// all id
|
|
175
|
+
all,
|
|
176
|
+
// 页面
|
|
177
|
+
urls,
|
|
178
|
+
// 按钮
|
|
179
|
+
btns,
|
|
180
|
+
// 菜单
|
|
181
|
+
menus,
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 获取管理端角色权限数据
|
|
187
|
+
*/
|
|
188
|
+
async function getData() {
|
|
189
|
+
|
|
190
|
+
// 如果没有管理端角色权限数据
|
|
191
|
+
if (! stateRole.value.v) {
|
|
192
|
+
|
|
193
|
+
// 获取管理端角色权限数据
|
|
194
|
+
const res = await utils.getData(utils.config('rolePowerName'))
|
|
195
|
+
if (res === false) {
|
|
196
|
+
stateRole.value = {
|
|
197
|
+
// 角色权限版本
|
|
198
|
+
v: null,
|
|
199
|
+
// all id
|
|
200
|
+
all: {},
|
|
201
|
+
// 页面
|
|
202
|
+
urls: {},
|
|
203
|
+
// 按钮
|
|
204
|
+
btns: {},
|
|
205
|
+
// 菜单
|
|
206
|
+
menus: [],
|
|
207
|
+
}
|
|
208
|
+
return utils.fail()
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// 如果有角色状态数据, 则直接返回
|
|
213
|
+
if (stateRole.value.v) {
|
|
214
|
+
return utils.success(_.cloneDeep(stateRole.value))
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return utils.fail()
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 解析传参
|
|
222
|
+
*/
|
|
223
|
+
function parseQuery(data, settings) {
|
|
224
|
+
|
|
225
|
+
// 如果配置是字符串
|
|
226
|
+
if (utils.isValidString(settings)) {
|
|
227
|
+
|
|
228
|
+
// 如果返回所有传参
|
|
229
|
+
if (settings === 'all') {
|
|
230
|
+
return utils.isValidObject(data) ? data : {}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// 将字符串放到数组中
|
|
234
|
+
settings = [settings]
|
|
235
|
+
|
|
236
|
+
// 如果配置是对象
|
|
237
|
+
} else if (utils.isValidObject(settings)) {
|
|
238
|
+
settings = [settings]
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const query = {}
|
|
242
|
+
|
|
243
|
+
// 如果配置是数组
|
|
244
|
+
if (utils.isValidArray(settings)) {
|
|
245
|
+
|
|
246
|
+
// 别名
|
|
247
|
+
const alias = {}
|
|
248
|
+
|
|
249
|
+
for (let item of settings) {
|
|
250
|
+
// 如果是需要的字段
|
|
251
|
+
if (utils.isValidString(item)) {
|
|
252
|
+
|
|
253
|
+
// 将字段转小写
|
|
254
|
+
item = _.toLower(utils.trimString(item))
|
|
255
|
+
|
|
256
|
+
// 判断字段是否有 as 别名
|
|
257
|
+
const arr = utils.split(item, ' as ')
|
|
258
|
+
|
|
259
|
+
// 如果有别名
|
|
260
|
+
if (arr.length === 2) {
|
|
261
|
+
alias[utils.trimString(arr[0])] = utils.trimString(arr[1])
|
|
262
|
+
|
|
263
|
+
// 否则别名就是当前字段本身
|
|
264
|
+
} else {
|
|
265
|
+
alias[item] = item
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// 否则如果是自定义传参
|
|
269
|
+
} else if (utils.isValidObject(item)) {
|
|
270
|
+
Object.assign(query, item)
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (
|
|
275
|
+
// 如果有参数数据
|
|
276
|
+
utils.isValidObject(data)
|
|
277
|
+
// 如果有定义别名
|
|
278
|
+
&& utils.isValidObject(alias)
|
|
279
|
+
) {
|
|
280
|
+
utils.forIn(data, function(value, key) {
|
|
281
|
+
|
|
282
|
+
// 如果当前字段在别名中
|
|
283
|
+
if (_.has(alias, key)) {
|
|
284
|
+
query[alias[key]] = value
|
|
285
|
+
}
|
|
286
|
+
})
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return query
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* 格式化权限按钮列表
|
|
295
|
+
*/
|
|
296
|
+
function formatRoleBtnLists(roleBtnLists, filterBtns, toObject = false) {
|
|
297
|
+
|
|
298
|
+
const newLists = []
|
|
299
|
+
|
|
300
|
+
utils.forEach(roleBtnLists, function(item) {
|
|
301
|
+
|
|
302
|
+
const {
|
|
303
|
+
name,
|
|
304
|
+
icon,
|
|
305
|
+
} = item
|
|
306
|
+
|
|
307
|
+
const newItem = Object.assign({}, item, {
|
|
308
|
+
// 图标
|
|
309
|
+
icon: icon || undefined,
|
|
310
|
+
// 隐藏按钮
|
|
311
|
+
hidden: _.get(item, 'hidden') === true,
|
|
312
|
+
// 显示按钮类型
|
|
313
|
+
show: _.has(item, 'data.show') ? item.data.show : true,
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
// 是否固定按钮
|
|
317
|
+
newItem.fixed =
|
|
318
|
+
// 非隐藏按钮
|
|
319
|
+
! newItem.hidden
|
|
320
|
+
// 固定列
|
|
321
|
+
&& _.get(newItem, 'data.fixed') === true
|
|
322
|
+
// 单个按钮
|
|
323
|
+
&& newItem.show === 'single'
|
|
324
|
+
// 按钮有图标
|
|
325
|
+
&& !! newItem.icon
|
|
326
|
+
|
|
327
|
+
// 如果是对象
|
|
328
|
+
if (utils.isValidObject(filterBtns)) {
|
|
329
|
+
if (_.has(filterBtns, name)) {
|
|
330
|
+
newLists.push(_.merge(newItem, filterBtns[name]))
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// 如果是数组
|
|
334
|
+
} else if (utils.isValidArray(filterBtns)) {
|
|
335
|
+
if (utils.indexOf(filterBtns, name) > -1) {
|
|
336
|
+
newLists.push(_.merge(newItem, filterBtns[name]))
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
} else {
|
|
340
|
+
newLists.push(newItem)
|
|
341
|
+
}
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
// 转数组
|
|
345
|
+
if (toObject) {
|
|
346
|
+
const obj = {}
|
|
347
|
+
for (const item of newLists) {
|
|
348
|
+
obj[item.name] = item
|
|
349
|
+
}
|
|
350
|
+
return obj
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return newLists
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* 获取请求传参
|
|
358
|
+
*/
|
|
359
|
+
function getRequestQuery(o) {
|
|
360
|
+
|
|
361
|
+
// 传参
|
|
362
|
+
const query = {}
|
|
363
|
+
|
|
364
|
+
// 如果有请求传参的传参设置
|
|
365
|
+
if (_.has(o.data, 'requestQuery.query')) {
|
|
366
|
+
const resQuery = parseQuery(o.query, o.data.requestQuery.query)
|
|
367
|
+
if (utils.isValidObject(resQuery)) {
|
|
368
|
+
Object.assign(query, resQuery)
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// 获取表格数据
|
|
373
|
+
if (
|
|
374
|
+
// 如果按钮参数有显示类型
|
|
375
|
+
_.has(o.data, 'show')
|
|
376
|
+
// 按钮参数的显示类型必须是单选或多选
|
|
377
|
+
&& utils.indexOf(['single', 'multi'], o.data.show) > -1
|
|
378
|
+
// 如果有请求传参的表格设置
|
|
379
|
+
&& _.has(o.data, 'requestQuery.table')
|
|
380
|
+
// 如果有表格数据
|
|
381
|
+
&& utils.isValidArray(o.tableSelected)
|
|
382
|
+
) {
|
|
383
|
+
let newQuery = {}
|
|
384
|
+
|
|
385
|
+
// 如果是单选
|
|
386
|
+
if (o.data.show === 'single') {
|
|
387
|
+
// 取表格选中第一条数据
|
|
388
|
+
newQuery = o.tableSelected[0]
|
|
389
|
+
|
|
390
|
+
// 否则是多选
|
|
391
|
+
} else {
|
|
392
|
+
// 合并表格选中的每一条数据
|
|
393
|
+
for (const item of o.tableSelected) {
|
|
394
|
+
utils.forIn(item, function(value, key) {
|
|
395
|
+
if (_.has(newQuery, key)) {
|
|
396
|
+
newQuery[key].push(value)
|
|
397
|
+
} else {
|
|
398
|
+
newQuery[key] = [value]
|
|
399
|
+
}
|
|
400
|
+
})
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const resTable = parseQuery(newQuery, o.data.requestQuery.table)
|
|
405
|
+
if (utils.isValidObject(resTable)) {
|
|
406
|
+
Object.assign(query, resTable)
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return _.merge({}, query)
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* 格式化参数
|
|
415
|
+
*/
|
|
416
|
+
function formatQuery(query, isJoinArr) {
|
|
417
|
+
|
|
418
|
+
const newQuery = {}
|
|
419
|
+
|
|
420
|
+
// 格式化参数
|
|
421
|
+
utils.forIn(query, function(value, key) {
|
|
422
|
+
|
|
423
|
+
// 如果是数字
|
|
424
|
+
if (utils.isNumeric(value)) {
|
|
425
|
+
newQuery[key] = _.isNumber(value) ? value : Number(value)
|
|
426
|
+
|
|
427
|
+
// 如果是字符串
|
|
428
|
+
} else if (utils.isValidString(value)) {
|
|
429
|
+
newQuery[key] = utils.trimString(value)
|
|
430
|
+
|
|
431
|
+
// 如果是数组
|
|
432
|
+
} else if (utils.isValidArray(value)) {
|
|
433
|
+
const arr = []
|
|
434
|
+
for (const val of value) {
|
|
435
|
+
// 如果是数字
|
|
436
|
+
if (utils.isNumeric(val)) {
|
|
437
|
+
arr.push(_.isNumber(val) ? val : Number(val))
|
|
438
|
+
|
|
439
|
+
// 如果是字符串
|
|
440
|
+
} else if (utils.isValidString(val)) {
|
|
441
|
+
arr.push(utils.trimString(val))
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (arr.length) {
|
|
445
|
+
newQuery[key] = isJoinArr ? utils.join(arr, ',') : arr
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
})
|
|
449
|
+
|
|
450
|
+
return newQuery
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* 角色请求
|
|
455
|
+
*/
|
|
456
|
+
async function request(params) {
|
|
457
|
+
|
|
458
|
+
// 参数
|
|
459
|
+
const o = _.merge({
|
|
460
|
+
// 按钮数据
|
|
461
|
+
data: {},
|
|
462
|
+
// 参数
|
|
463
|
+
query: {},
|
|
464
|
+
// 布局数据
|
|
465
|
+
layoutData: {},
|
|
466
|
+
// 表格选中数据
|
|
467
|
+
tableSelected: [],
|
|
468
|
+
// 表格刷新
|
|
469
|
+
tableRefresh: null,
|
|
470
|
+
// 检查是否正在上传文件
|
|
471
|
+
checkUploading: null,
|
|
472
|
+
// 表单节点
|
|
473
|
+
formRef: null,
|
|
474
|
+
// 表单数据
|
|
475
|
+
formData: null,
|
|
476
|
+
// 重置表单
|
|
477
|
+
resetForm: null,
|
|
478
|
+
// 请求前执行
|
|
479
|
+
requestBefore: null,
|
|
480
|
+
// 请求成功执行
|
|
481
|
+
requestSuccess: null,
|
|
482
|
+
// 请求失败执行
|
|
483
|
+
requestFail: null,
|
|
484
|
+
// 请求后执行
|
|
485
|
+
requestAfter: null,
|
|
486
|
+
}, params)
|
|
487
|
+
|
|
488
|
+
// 判断类型
|
|
489
|
+
if (! _.get(o.data, 'type')) {
|
|
490
|
+
|
|
491
|
+
// 【调试模式】
|
|
492
|
+
// --------------------------------------------------
|
|
493
|
+
// #ifdef IS_DEBUG
|
|
494
|
+
console.log('没有定义数据类型')
|
|
495
|
+
// #endif
|
|
496
|
+
// --------------------------------------------------
|
|
497
|
+
|
|
498
|
+
return
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// 判断 url
|
|
502
|
+
o.data.url = _.toLower(utils.trimString(o.data.url))
|
|
503
|
+
if (! o.data.url) {
|
|
504
|
+
|
|
505
|
+
if (
|
|
506
|
+
// 如果没有跳转页面地址
|
|
507
|
+
! _.has(o.data, 'toPage')
|
|
508
|
+
// 或跳转页面地址为空
|
|
509
|
+
|| ! utils.isValidString(o.data.toPage)
|
|
510
|
+
) {
|
|
511
|
+
// 【调试模式】
|
|
512
|
+
// --------------------------------------------------
|
|
513
|
+
// #ifdef IS_DEBUG
|
|
514
|
+
console.log('没有定义 url')
|
|
515
|
+
// #endif
|
|
516
|
+
// --------------------------------------------------
|
|
517
|
+
|
|
518
|
+
return
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// 用跳转页面地址替换 toPage
|
|
522
|
+
o.data = Object.assign({}, o.data, {
|
|
523
|
+
url: o.data.toPage,
|
|
524
|
+
})
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// 获取请求参数
|
|
528
|
+
const query = getRequestQuery(o)
|
|
529
|
+
|
|
530
|
+
// 如果是打开新窗口
|
|
531
|
+
// --------------------------------------------------
|
|
532
|
+
if (o.data.type === dicts.POWER_DATA_TYPE__OPEN) {
|
|
533
|
+
|
|
534
|
+
// 请求前执行
|
|
535
|
+
if (await utils.runAsync(o.requestBefore)({ params: o, requestData: query }) === false) {
|
|
536
|
+
return
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
utils.router.push({
|
|
540
|
+
path: o.data.url,
|
|
541
|
+
query: formatQuery(query, true),
|
|
542
|
+
})
|
|
543
|
+
return
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// 请求数据
|
|
547
|
+
let requestData = {}
|
|
548
|
+
|
|
549
|
+
// 如果是提交表单
|
|
550
|
+
// --------------------------------------------------
|
|
551
|
+
if (o.data.type === dicts.POWER_DATA_TYPE__FORM) {
|
|
552
|
+
|
|
553
|
+
// 如果验证表单
|
|
554
|
+
if (_.get(o.data, 'validate') !== false) {
|
|
555
|
+
|
|
556
|
+
let formRef
|
|
557
|
+
if (o.formRef) {
|
|
558
|
+
if (isRef(o.formRef)) {
|
|
559
|
+
formRef = o.formRef.value
|
|
560
|
+
} else if (_.isFunction(o.formRef)) {
|
|
561
|
+
formRef = o.formRef()
|
|
562
|
+
} else {
|
|
563
|
+
formRef = o.formRef
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// 如果没有绑定表单节点
|
|
568
|
+
if (! formRef) {
|
|
569
|
+
|
|
570
|
+
// 【调试模式】
|
|
571
|
+
// --------------------------------------------------
|
|
572
|
+
// #ifdef IS_DEBUG
|
|
573
|
+
console.log('没有绑定 fromRef')
|
|
574
|
+
// #endif
|
|
575
|
+
// --------------------------------------------------
|
|
576
|
+
|
|
577
|
+
return
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// 验证表单
|
|
581
|
+
if (! await formRef.validate()) {
|
|
582
|
+
return
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// 判断表单数据
|
|
587
|
+
if (! utils.isValidObject(o.formData)) {
|
|
588
|
+
|
|
589
|
+
// 【调试模式】
|
|
590
|
+
// --------------------------------------------------
|
|
591
|
+
// #ifdef IS_DEBUG
|
|
592
|
+
console.log('没有获取到表单数据')
|
|
593
|
+
// #endif
|
|
594
|
+
// --------------------------------------------------
|
|
595
|
+
|
|
596
|
+
return
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// 检查是否正在上传文件
|
|
600
|
+
if (_.isFunction(o.checkUploading) && o.checkUploading()) {
|
|
601
|
+
// 轻提示
|
|
602
|
+
utils.toast({
|
|
603
|
+
message: '文件上传中,请耐心等待',
|
|
604
|
+
})
|
|
605
|
+
return
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// 获取请求数据
|
|
609
|
+
requestData = _.merge({}, formatQuery(query, false), o.formData)
|
|
610
|
+
|
|
611
|
+
// 如果是请求数据
|
|
612
|
+
// --------------------------------------------------
|
|
613
|
+
} else {
|
|
614
|
+
// 获取请求数据
|
|
615
|
+
requestData = formatQuery(query, false)
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// 判断是否有确认框
|
|
619
|
+
const isConfirm = _.get(o.data, 'confirm')
|
|
620
|
+
if (
|
|
621
|
+
// 如果有确认框
|
|
622
|
+
isConfirm
|
|
623
|
+
// 如果有密码确认框
|
|
624
|
+
|| _.get(o.data, 'confirmPassword')
|
|
625
|
+
) {
|
|
626
|
+
// 如果需要先弹出确认框
|
|
627
|
+
if (isConfirm) {
|
|
628
|
+
|
|
629
|
+
// 确认框
|
|
630
|
+
utils.confirm({
|
|
631
|
+
// 重要操作,请输入登录密码并确认后操作
|
|
632
|
+
message: utils.isValidString(isConfirm) ? isConfirm : '确认要执行该操作吗?',
|
|
633
|
+
})
|
|
634
|
+
// 点击确认执行
|
|
635
|
+
.onOk(onRequest)
|
|
636
|
+
|
|
637
|
+
return
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// 否则执行请求
|
|
642
|
+
await onRequest()
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* 请求事件
|
|
646
|
+
*/
|
|
647
|
+
async function onRequest() {
|
|
648
|
+
|
|
649
|
+
// 请求前执行
|
|
650
|
+
if (await utils.runAsync(o.requestBefore)({ params: o, requestData }) === false) {
|
|
651
|
+
return
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// 请求
|
|
655
|
+
const res = await utils.http({
|
|
656
|
+
// 请求地址
|
|
657
|
+
url: o.data.url,
|
|
658
|
+
// 请求数据
|
|
659
|
+
data: requestData,
|
|
660
|
+
})
|
|
661
|
+
|
|
662
|
+
// 返回结果数据
|
|
663
|
+
const resultData = Object.assign({}, res, {
|
|
664
|
+
params: o,
|
|
665
|
+
requestData,
|
|
666
|
+
})
|
|
667
|
+
|
|
668
|
+
// 如果请求成功
|
|
669
|
+
if (res.status) {
|
|
670
|
+
|
|
671
|
+
// 下一步
|
|
672
|
+
function next(isNotify = true) {
|
|
673
|
+
|
|
674
|
+
// 轻提示
|
|
675
|
+
if (isNotify) {
|
|
676
|
+
utils.toast({
|
|
677
|
+
type: 'positive',
|
|
678
|
+
message: '恭喜您,操作成功',
|
|
679
|
+
})
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// 判断是否有请求成功后的操作动作
|
|
683
|
+
if (_.has(o.data, 'requestSuccess.type')) {
|
|
684
|
+
switch (o.data.requestSuccess.type) {
|
|
685
|
+
|
|
686
|
+
// 关闭当前页面
|
|
687
|
+
case 'close':
|
|
688
|
+
// 关闭窗口并跳转页面
|
|
689
|
+
case 'closePush':
|
|
690
|
+
// 关闭窗口、跳转并刷新页面
|
|
691
|
+
case 'closePushRefresh':
|
|
692
|
+
|
|
693
|
+
const opts = {
|
|
694
|
+
type: 'closeCurrentTab',
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// 如果不是关闭当前页面, 则为关闭窗口并跳转页面
|
|
698
|
+
if (o.data.requestSuccess.type !== 'close') {
|
|
699
|
+
Object.assign(opts, {
|
|
700
|
+
// 跳转页面地址
|
|
701
|
+
pushPage: o.data.requestSuccess.params,
|
|
702
|
+
// 是否跳转并刷新页面
|
|
703
|
+
isPushRefresh: o.data.requestSuccess.type === 'closePushRefresh',
|
|
704
|
+
})
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// 关闭当前标签页
|
|
708
|
+
utils.bus.emit('main', opts)
|
|
709
|
+
break
|
|
710
|
+
|
|
711
|
+
// 重置表单
|
|
712
|
+
case 'resetForm':
|
|
713
|
+
utils.run(o.resetForm)()
|
|
714
|
+
break
|
|
715
|
+
|
|
716
|
+
// 刷新表格
|
|
717
|
+
case 'refreshTable':
|
|
718
|
+
utils.run(o.tableRefresh)()
|
|
719
|
+
break
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// 请求成功执行
|
|
725
|
+
const res = await utils.runAsync(o.requestSuccess)(Object.assign({ next }, resultData))
|
|
726
|
+
if (res === false) {
|
|
727
|
+
return
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// 下一步
|
|
731
|
+
next()
|
|
732
|
+
|
|
733
|
+
} else {
|
|
734
|
+
// 请求失败执行
|
|
735
|
+
utils.run(o.requestFail)(resultData)
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
// 请求后执行
|
|
739
|
+
utils.run(o.requestAfter)(resultData)
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* 获取当前页面角色权限
|
|
745
|
+
*/
|
|
746
|
+
async function getPageData($route, pageStatus, emptyDescription, roleBtnLists) {
|
|
747
|
+
|
|
748
|
+
if (! $route) {
|
|
749
|
+
$route = useRoute()
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function fail(message) {
|
|
753
|
+
|
|
754
|
+
if (! _.isNil(pageStatus) && isRef(pageStatus)) {
|
|
755
|
+
pageStatus.value = false
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
if (! _.isNil(emptyDescription) && isRef(emptyDescription)) {
|
|
759
|
+
emptyDescription.value = message
|
|
760
|
+
|
|
761
|
+
} else {
|
|
762
|
+
// 提示框
|
|
763
|
+
utils.alert({
|
|
764
|
+
message,
|
|
765
|
+
})
|
|
766
|
+
}
|
|
767
|
+
return false
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
const path = _.get($route, 'path')
|
|
771
|
+
if (! path) {
|
|
772
|
+
return fail('路由参数错误')
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// 获取角色数据
|
|
776
|
+
const { status, data: { urls, btns } } = await utils.$role.getData()
|
|
777
|
+
if (! status || ! _.has(urls, path)) {
|
|
778
|
+
return fail('该页面没有权限')
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
// 设置权限按钮列表
|
|
782
|
+
const roleBtns = _.has(btns, path) ? btns[path] : []
|
|
783
|
+
if (! _.isNil(roleBtnLists) && isRef(roleBtnLists)) {
|
|
784
|
+
roleBtnLists.value = roleBtns
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return {
|
|
788
|
+
page: urls[path],
|
|
789
|
+
btns: roleBtns,
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/**
|
|
794
|
+
* 角色业务
|
|
795
|
+
*/
|
|
796
|
+
utils.$role = {
|
|
797
|
+
// 设置角色数据
|
|
798
|
+
setData,
|
|
799
|
+
// 获取角色数据
|
|
800
|
+
getData,
|
|
801
|
+
// 获取页面角色数据
|
|
802
|
+
getPageData,
|
|
803
|
+
// 格式化权限按钮列表
|
|
804
|
+
formatRoleBtnLists,
|
|
805
|
+
// 请求
|
|
806
|
+
request,
|
|
807
|
+
}
|