@netang/quasar 0.2.19 → 0.2.21
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/.editorconfig +12 -12
- package/_docs/docs/components/field-table.md +58 -58
- package/_docs/docs/components/field-tree.md +21 -21
- package/_docs/docs/components/table.md +24 -24
- package/_docs/docs/utils/table.md +196 -196
- package/components/column-title/index.vue +38 -38
- package/components/data/index.vue +20 -20
- package/components/dialog/img-viewer/index.vue +697 -697
- package/components/dragger/index.vue +203 -203
- package/components/drawer/index.vue +303 -303
- package/components/editor-code/index.vue +325 -325
- package/components/empty/index.vue +82 -82
- package/components/field-date/index.vue +850 -850
- package/components/field-date/methods.js +100 -100
- package/components/field-table/index.vue +1482 -1482
- package/components/field-text/index.vue +165 -165
- package/components/field-tree/index.vue +754 -754
- package/components/img/index.vue +279 -279
- package/components/list-menu/index.vue +149 -149
- package/components/list-menu-item/index.vue +79 -79
- package/components/mixed-table/index.vue +532 -532
- package/components/mixed-table-splitter/index.vue +377 -377
- package/components/power-page/index.vue +96 -96
- package/components/price/index.vue +188 -188
- package/components/private/components/index.js +11 -11
- package/components/private/components/move-to-tree/index.vue +154 -154
- package/components/private/edit-power-data/index.vue +846 -846
- package/components/private/table-visible-columns-button/index.vue +114 -114
- package/components/render/index.vue +123 -123
- package/components/search/index.vue +231 -231
- package/components/search-item/index.vue +210 -210
- package/components/select/index.vue +177 -177
- package/components/splitter/index.vue +422 -422
- package/components/table/index.vue +513 -513
- package/components/table-column-fixed/index.vue +110 -110
- package/components/table-pagination/index.vue +192 -192
- package/components/table-summary/index.vue +107 -107
- package/components/thumbnail/index.vue +72 -72
- package/components/toolbar/index.vue +146 -146
- package/components/tree/index.vue +1728 -1728
- package/components/uploader/index.vue +195 -195
- package/components/uploader-query/index.vue +945 -945
- package/components/value-format/index.vue +274 -274
- package/configs/area3.js +1 -1
- package/docs/404.html +33 -33
- package/docs/assets/404.html-60b35caa.js +1 -1
- package/docs/assets/404.html-d1e63d77.js +1 -1
- package/docs/assets/alert.html-b2a2a72f.js +5 -5
- package/docs/assets/alert.html-ba46d137.js +1 -1
- package/docs/assets/app-9f30aa4b.js +6 -6
- package/docs/assets/area.html-01b9b58d.js +42 -42
- package/docs/assets/area.html-9a4fce6a.js +1 -1
- package/docs/assets/arr.html-145d27e7.js +1 -1
- package/docs/assets/arr.html-674e65ab.js +11 -11
- package/docs/assets/auth.html-579fa830.js +1 -1
- package/docs/assets/auth.html-8544ed95.js +8 -8
- package/docs/assets/bus.html-c71254aa.js +1 -1
- package/docs/assets/bus.html-dc7d3d19.js +6 -6
- package/docs/assets/column-title.html-c735cb5a.js +3 -3
- package/docs/assets/column-title.html-e9316762.js +1 -1
- package/docs/assets/confirm.html-ddfdc27f.js +10 -10
- package/docs/assets/confirm.html-ef3e2bef.js +1 -1
- package/docs/assets/copy.html-d20345b6.js +1 -1
- package/docs/assets/copy.html-ef8c8571.js +13 -13
- package/docs/assets/data.html-6432175d.js +30 -30
- package/docs/assets/data.html-a3b05d5b.js +1 -1
- package/docs/assets/dialog.html-1f698e5a.js +1 -1
- package/docs/assets/dialog.html-62902b83.js +68 -68
- package/docs/assets/dialog.html-baea77c9.js +1 -1
- package/docs/assets/dialog.html-bb082fc4.js +1 -1
- package/docs/assets/dict.html-1311da3d.js +23 -23
- package/docs/assets/dict.html-b96fbf0c.js +1 -1
- package/docs/assets/dictOptions.html-7c4f40a5.js +1 -1
- package/docs/assets/dictOptions.html-fb99d175.js +5 -5
- package/docs/assets/dragger.html-668d3efa.js +1 -1
- package/docs/assets/dragger.html-749d585a.js +1 -1
- package/docs/assets/editor-code.html-6ab26ea9.js +1 -1
- package/docs/assets/editor-code.html-d196205d.js +1 -1
- package/docs/assets/empty.html-1c139131.js +1 -1
- package/docs/assets/empty.html-1e9c441d.js +1 -1
- package/docs/assets/field-date.html-069fdb13.js +1 -1
- package/docs/assets/field-date.html-ad204aa9.js +1 -1
- package/docs/assets/field-table.html-ce480f03.js +1 -1
- package/docs/assets/field-table.html-d9236160.js +1 -1
- package/docs/assets/field-text.html-7277c62f.js +1 -1
- package/docs/assets/field-text.html-ccb4cecf.js +1 -1
- package/docs/assets/field-tree.html-519bfb45.js +1 -1
- package/docs/assets/field-tree.html-fdc748d6.js +1 -1
- package/docs/assets/form.html-2b562c37.js +2 -2
- package/docs/assets/form.html-75104cd5.js +1 -1
- package/docs/assets/framework-204010b2.js +5 -5
- package/docs/assets/getData.html-990e3787.js +1 -1
- package/docs/assets/getData.html-bb72025f.js +34 -34
- package/docs/assets/getFile.html-42368004.js +1 -1
- package/docs/assets/getFile.html-99abd054.js +3 -3
- package/docs/assets/getImage.html-3429c5a1.js +1 -1
- package/docs/assets/getImage.html-4d886d83.js +3 -3
- package/docs/assets/getTime.html-7435f922.js +1 -1
- package/docs/assets/getTime.html-b37f49eb.js +20 -20
- package/docs/assets/img.html-7d1da657.js +1 -1
- package/docs/assets/img.html-fbea1105.js +1 -1
- package/docs/assets/index.html-1695dd7c.js +1 -1
- package/docs/assets/index.html-65a4aa67.js +1 -1
- package/docs/assets/index.html-7b98d5bd.js +1 -1
- package/docs/assets/index.html-c01f2648.js +1 -1
- package/docs/assets/input-number.html-0b250d2a.js +1 -1
- package/docs/assets/input-number.html-a8eb0378.js +1 -1
- package/docs/assets/list-menu-item.html-7f1b4611.js +1 -1
- package/docs/assets/list-menu-item.html-84ed5ab8.js +1 -1
- package/docs/assets/list-menu.html-28b4163f.js +1 -1
- package/docs/assets/list-menu.html-cb6ba95b.js +1 -1
- package/docs/assets/loading.html-dae9e39d.js +6 -6
- package/docs/assets/loading.html-dc74c9e6.js +1 -1
- package/docs/assets/notify.html-e6c4c514.js +1 -1
- package/docs/assets/notify.html-f2c4d914.js +8 -8
- package/docs/assets/power-page.html-32e02f82.js +1 -1
- package/docs/assets/power-page.html-485e77da.js +1 -1
- package/docs/assets/power.html-d258cc19.js +93 -93
- package/docs/assets/power.html-e490bd32.js +1 -1
- package/docs/assets/previewImage.html-6a6b4245.js +1 -1
- package/docs/assets/previewImage.html-c5b7e945.js +2 -2
- package/docs/assets/price.html-1882c548.js +19 -19
- package/docs/assets/price.html-94d3f5be.js +1 -1
- package/docs/assets/price.html-d213df0f.js +1 -1
- package/docs/assets/price.html-deaf880f.js +1 -1
- package/docs/assets/render.html-8efcbdd4.js +1 -1
- package/docs/assets/render.html-df228e38.js +1 -1
- package/docs/assets/rule.html-2cd57fc2.js +13 -13
- package/docs/assets/rule.html-61662001.js +1 -1
- package/docs/assets/ruleValid.html-04fe2552.js +1 -1
- package/docs/assets/ruleValid.html-e0a776af.js +14 -14
- package/docs/assets/search-0782d0d1.svg +1 -1
- package/docs/assets/search-item.html-3f75394c.js +1 -1
- package/docs/assets/search-item.html-4e942ecd.js +1 -1
- package/docs/assets/search.html-2807043e.js +1 -1
- package/docs/assets/search.html-c24f8806.js +1 -1
- package/docs/assets/select.html-00d0607c.js +1 -1
- package/docs/assets/select.html-de7731f5.js +1 -1
- package/docs/assets/splitter.html-56f51a70.js +1 -1
- package/docs/assets/splitter.html-f5c836d7.js +1 -1
- package/docs/assets/style-161e43ab.css +1 -1
- package/docs/assets/symbols.html-a6aea4bf.js +1 -1
- package/docs/assets/symbols.html-b1f65bad.js +21 -21
- package/docs/assets/table-column-fixed.html-3a69e7b2.js +1 -1
- package/docs/assets/table-column-fixed.html-e763c38b.js +1 -1
- package/docs/assets/table-pagination.html-236934d3.js +1 -1
- package/docs/assets/table-pagination.html-c37ee2ac.js +1 -1
- package/docs/assets/table-splitter.html-07eab15c.js +1 -1
- package/docs/assets/table-splitter.html-7670ee65.js +1 -1
- package/docs/assets/table-summary.html-04db434f.js +1 -1
- package/docs/assets/table-summary.html-943c65a0.js +1 -1
- package/docs/assets/table.html-36253ad7.js +1 -1
- package/docs/assets/table.html-7f9c5d1b.js +38 -38
- package/docs/assets/table.html-93d53dc8.js +1 -1
- package/docs/assets/table.html-ac99b9cb.js +1 -1
- package/docs/assets/thumbnail.html-bab1976b.js +1 -1
- package/docs/assets/thumbnail.html-eb64e5e8.js +1 -1
- package/docs/assets/timestamp.html-4e54f79b.js +13 -13
- package/docs/assets/timestamp.html-d0e1b88a.js +1 -1
- package/docs/assets/toast.html-58ecbe21.js +1 -1
- package/docs/assets/toast.html-c9b9d36b.js +6 -6
- package/docs/assets/toolbar.html-83d9f97c.js +1 -1
- package/docs/assets/toolbar.html-ff7b8c92.js +1 -1
- package/docs/assets/tree.html-d07cbe79.js +23 -23
- package/docs/assets/tree.html-ea04193e.js +1 -1
- package/docs/assets/uploader-query.html-05590718.js +1 -1
- package/docs/assets/uploader-query.html-3175bac5.js +1 -1
- package/docs/assets/uploader.html-36da4394.js +2 -2
- package/docs/assets/uploader.html-6b5f3079.js +1 -1
- package/docs/assets/uploader.html-b9340b57.js +1 -1
- package/docs/assets/uploader.html-bc1c22e3.js +1 -1
- package/docs/assets/value-format.html-8ae3d47d.js +1 -1
- package/docs/assets/value-format.html-afa99b3d.js +1 -1
- package/docs/components/column-title.html +35 -35
- package/docs/components/data.html +62 -62
- package/docs/components/dialog.html +33 -33
- package/docs/components/dragger.html +33 -33
- package/docs/components/editor-code.html +33 -33
- package/docs/components/empty.html +33 -33
- package/docs/components/field-date.html +33 -33
- package/docs/components/field-table.html +33 -33
- package/docs/components/field-text.html +33 -33
- package/docs/components/field-tree.html +33 -33
- package/docs/components/img.html +33 -33
- package/docs/components/input-number.html +33 -33
- package/docs/components/list-menu-item.html +33 -33
- package/docs/components/list-menu.html +33 -33
- package/docs/components/power-page.html +33 -33
- package/docs/components/price.html +33 -33
- package/docs/components/render.html +33 -33
- package/docs/components/search-item.html +33 -33
- package/docs/components/search.html +33 -33
- package/docs/components/select.html +33 -33
- package/docs/components/splitter.html +33 -33
- package/docs/components/table-column-fixed.html +33 -33
- package/docs/components/table-pagination.html +33 -33
- package/docs/components/table-splitter.html +33 -33
- package/docs/components/table-summary.html +33 -33
- package/docs/components/table.html +33 -33
- package/docs/components/thumbnail.html +33 -33
- package/docs/components/toolbar.html +33 -33
- package/docs/components/uploader-query.html +33 -33
- package/docs/components/uploader.html +33 -33
- package/docs/components/value-format.html +33 -33
- package/docs/css/index.css +3 -3
- package/docs/index.html +33 -33
- package/docs/utils/alert.html +37 -37
- package/docs/utils/area.html +74 -74
- package/docs/utils/arr.html +43 -43
- package/docs/utils/auth.html +40 -40
- package/docs/utils/bus.html +38 -38
- package/docs/utils/confirm.html +42 -42
- package/docs/utils/copy.html +45 -45
- package/docs/utils/dialog.html +100 -100
- package/docs/utils/dict.html +55 -55
- package/docs/utils/dictOptions.html +37 -37
- package/docs/utils/form.html +34 -34
- package/docs/utils/getData.html +66 -66
- package/docs/utils/getFile.html +35 -35
- package/docs/utils/getImage.html +35 -35
- package/docs/utils/getTime.html +52 -52
- package/docs/utils/index.html +33 -33
- package/docs/utils/loading.html +38 -38
- package/docs/utils/notify.html +40 -40
- package/docs/utils/power.html +125 -125
- package/docs/utils/previewImage.html +34 -34
- package/docs/utils/price.html +51 -51
- package/docs/utils/rule.html +45 -45
- package/docs/utils/ruleValid.html +46 -46
- package/docs/utils/symbols.html +53 -53
- package/docs/utils/table.html +70 -70
- package/docs/utils/timestamp.html +45 -45
- package/docs/utils/toast.html +38 -38
- package/docs/utils/tree.html +55 -55
- package/docs/utils/uploader.html +34 -34
- package/package.json +25 -25
- package/sass/common.scss +184 -184
- package/sass/index.scss +12 -12
- package/sass/line.scss +39 -39
- package/sass/quasar/btn.scss +46 -46
- package/sass/quasar/common.scss +3 -3
- package/sass/quasar/drawer.scss +6 -6
- package/sass/quasar/field.scss +259 -259
- package/sass/quasar/loading.scss +6 -6
- package/sass/quasar/table.scss +168 -168
- package/sass/quasar/toolbar.scss +22 -22
- package/sass/variables.scss +140 -140
- package/store/index.js +29 -29
- package/utils/$auth.js +127 -127
- package/utils/$form.js +72 -72
- package/utils/$power.js +1486 -1486
- package/utils/$render.js +75 -75
- package/utils/$rule.js +13 -13
- package/utils/$ruleValid.js +10 -10
- package/utils/$search.js +416 -416
- package/utils/$table.js +1275 -1275
- package/utils/alert.js +12 -12
- package/utils/area.js +400 -400
- package/utils/arr.js +51 -51
- package/utils/bus.js +6 -6
- package/utils/config.js +64 -62
- package/utils/confirm.js +11 -11
- package/utils/copy.js +30 -30
- package/utils/dialog.js +36 -36
- package/utils/dict.js +21 -21
- package/utils/dictOptions.js +28 -28
- package/utils/getData.js +88 -88
- package/utils/getFile.js +67 -67
- package/utils/getImage.js +276 -236
- package/utils/getTime.js +113 -113
- package/utils/index.js +67 -67
- package/utils/loading.js +15 -15
- package/utils/notify.js +13 -13
- package/utils/play.js +40 -40
- package/utils/previewImage.js +14 -14
- package/utils/price.js +18 -18
- package/utils/symbols.js +18 -18
- package/utils/timestamp.js +18 -18
- package/utils/toast.js +13 -13
- package/utils/uploader.js +2114 -2099
- package/utils/useAuth.js +30 -30
- package/utils/useFileUrl.js +26 -26
- package/utils/useRouter.js +47 -47
- package/utils/useSearch.js +499 -499
package/utils/$power.js
CHANGED
|
@@ -1,1486 +1,1486 @@
|
|
|
1
|
-
import { provide, inject, ref, computed } from 'vue'
|
|
2
|
-
import { useQuasar } from 'quasar'
|
|
3
|
-
|
|
4
|
-
import $n_has from 'lodash/has'
|
|
5
|
-
import $n_get from 'lodash/get'
|
|
6
|
-
import $n_merge from 'lodash/merge'
|
|
7
|
-
import $n_filter from 'lodash/filter'
|
|
8
|
-
import $n_toLower from 'lodash/toLower'
|
|
9
|
-
import $n_isNumber from 'lodash/isNumber'
|
|
10
|
-
import $n_cloneDeep from 'lodash/cloneDeep'
|
|
11
|
-
import $n_isFunction from 'lodash/isFunction'
|
|
12
|
-
import $n_pick from 'lodash/pick'
|
|
13
|
-
import $n_omit from 'lodash/omit'
|
|
14
|
-
|
|
15
|
-
import $n_router from '@netang/utils/vue/router'
|
|
16
|
-
|
|
17
|
-
import $n_isValidArray from '@netang/utils/isValidArray'
|
|
18
|
-
import $n_isValidObject from '@netang/utils/isValidObject'
|
|
19
|
-
import $n_isValidString from '@netang/utils/isValidString'
|
|
20
|
-
import $n_isRequired from '@netang/utils/isRequired'
|
|
21
|
-
import $n_isNumeric from '@netang/utils/isNumeric'
|
|
22
|
-
import $n_forEach from '@netang/utils/forEach'
|
|
23
|
-
import $n_forIn from '@netang/utils/forIn'
|
|
24
|
-
import $n_slash from '@netang/utils/slash'
|
|
25
|
-
import $n_json from '@netang/utils/json'
|
|
26
|
-
import $n_join from '@netang/utils/join'
|
|
27
|
-
import $n_fail from '@netang/utils/fail'
|
|
28
|
-
import $n_success from '@netang/utils/success'
|
|
29
|
-
import $n_split from '@netang/utils/split'
|
|
30
|
-
import $n_trimString from '@netang/utils/trimString'
|
|
31
|
-
import $n_numberDeep from '@netang/utils/numberDeep'
|
|
32
|
-
import $n_indexOf from '@netang/utils/indexOf'
|
|
33
|
-
import $n_runAsync from '@netang/utils/runAsync'
|
|
34
|
-
import $n_run from '@netang/utils/run'
|
|
35
|
-
import $n_http from '@netang/utils/http'
|
|
36
|
-
|
|
37
|
-
import { statePower } from '../store'
|
|
38
|
-
import { NRenderKey, NPowerKey, NDialogKey, NFormKey, NTableKey } from './symbols'
|
|
39
|
-
|
|
40
|
-
import $n_getData from './getData'
|
|
41
|
-
import $n_toast from './toast'
|
|
42
|
-
import $n_confirm from './confirm'
|
|
43
|
-
import $n_bus from './bus'
|
|
44
|
-
|
|
45
|
-
import $n_config from './config'
|
|
46
|
-
|
|
47
|
-
import { configs } from './config'
|
|
48
|
-
|
|
49
|
-
const {
|
|
50
|
-
// 字典常量
|
|
51
|
-
dicts,
|
|
52
|
-
} = configs
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* 获取来源页面完整地址
|
|
56
|
-
*/
|
|
57
|
-
function getFromPageFullUrl({ path, query }) {
|
|
58
|
-
|
|
59
|
-
const {
|
|
60
|
-
fullPath
|
|
61
|
-
} = $n_router.resolve({
|
|
62
|
-
path,
|
|
63
|
-
query: $n_omit(query, ['n_page_title', 'n_from_page']),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
return encodeURIComponent(fullPath)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 创建权限实例
|
|
71
|
-
*/
|
|
72
|
-
function create(options) {
|
|
73
|
-
|
|
74
|
-
// 获取参数
|
|
75
|
-
const o = Object.assign({
|
|
76
|
-
// 路由路径
|
|
77
|
-
path: '',
|
|
78
|
-
// 路由参数
|
|
79
|
-
query: {},
|
|
80
|
-
// 是否加载页面
|
|
81
|
-
pageLoading: false,
|
|
82
|
-
// 页面状态
|
|
83
|
-
pageStatus: null,
|
|
84
|
-
// 空状态描述
|
|
85
|
-
emptyDescription: '',
|
|
86
|
-
// 是否开启权限
|
|
87
|
-
power: true,
|
|
88
|
-
// 是否显示权限按钮
|
|
89
|
-
showPowerBtns: true,
|
|
90
|
-
// 是否显示工具栏权限按钮
|
|
91
|
-
showToolbarPowerBtns: true,
|
|
92
|
-
// 格式化权限按钮
|
|
93
|
-
formatPowerBtns: null,
|
|
94
|
-
// 左边侧滑菜单图标
|
|
95
|
-
leftDrawerIcon: 'format_list_bulleted',
|
|
96
|
-
// 右边侧滑菜单图标
|
|
97
|
-
rightDrawerIcon: 'search',
|
|
98
|
-
// 请求上传网络外链
|
|
99
|
-
requestUploadNet: null,
|
|
100
|
-
// 请求前执行
|
|
101
|
-
requestBefore: null,
|
|
102
|
-
// 请求成功执行
|
|
103
|
-
requestSuccess: null,
|
|
104
|
-
// 请求失败执行
|
|
105
|
-
requestFail: null,
|
|
106
|
-
// 请求后执行
|
|
107
|
-
requestAfter: null,
|
|
108
|
-
}, options)
|
|
109
|
-
|
|
110
|
-
// 获取对话框渲染注入
|
|
111
|
-
const $dialog = $n_has(options, '$dialog') ? options.$dialog : inject(NDialogKey)
|
|
112
|
-
const hasDialog = !! $dialog
|
|
113
|
-
|
|
114
|
-
// 获取渲染注入
|
|
115
|
-
const $render = $n_has(options, '$render') ? options.$render : inject(NRenderKey)
|
|
116
|
-
const hasRender = !! $render
|
|
117
|
-
|
|
118
|
-
// 如果有对话框注入
|
|
119
|
-
if (hasDialog) {
|
|
120
|
-
const {
|
|
121
|
-
dialogProps,
|
|
122
|
-
} = $dialog
|
|
123
|
-
|
|
124
|
-
// 合并权限参数
|
|
125
|
-
Object.assign(o, $n_pick(dialogProps, [ 'path', 'query' ]))
|
|
126
|
-
|
|
127
|
-
// 合并权限参数
|
|
128
|
-
if ($n_has($dialog, 'props.powerProps') && $n_isValidObject($dialog.props.powerProps)) {
|
|
129
|
-
$n_merge(o, $dialog.props.powerProps)
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// 如果有渲染注入
|
|
134
|
-
if (hasRender) {
|
|
135
|
-
// 如果有权限传参, 则合并参数
|
|
136
|
-
const powerProps = $n_get($render, 'props.powerProps')
|
|
137
|
-
if ($n_isValidObject(powerProps)) {
|
|
138
|
-
$n_merge(o, powerProps)
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// 获取当前路由
|
|
143
|
-
const $currentRoute = $n_router.getRoute()
|
|
144
|
-
|
|
145
|
-
// 权限路由
|
|
146
|
-
let $route
|
|
147
|
-
|
|
148
|
-
// 自定义参数
|
|
149
|
-
const optionsQuery = $n_isValidObject(o.query) ? o.query : {}
|
|
150
|
-
|
|
151
|
-
// 如果没有路由
|
|
152
|
-
if (o.path === false) {
|
|
153
|
-
|
|
154
|
-
// 设为空路由
|
|
155
|
-
$route = {
|
|
156
|
-
fullPath: '',
|
|
157
|
-
path: '',
|
|
158
|
-
query: optionsQuery,
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// 如果有自定义路径
|
|
162
|
-
} else if ($n_isValidString(o.path)) {
|
|
163
|
-
|
|
164
|
-
// 获取自定义路由
|
|
165
|
-
$route = $n_router.resolve({
|
|
166
|
-
path: o.path,
|
|
167
|
-
query: optionsQuery,
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
} else {
|
|
171
|
-
|
|
172
|
-
// 如果在渲染组件内 && 该渲染组件有自定义路由
|
|
173
|
-
$route = hasRender && $n_has($render, 'getRoute')
|
|
174
|
-
// 设为渲染组件的路由
|
|
175
|
-
? $render.getRoute()
|
|
176
|
-
// 否则获取当前路由
|
|
177
|
-
: $currentRoute
|
|
178
|
-
Object.assign($route.query, optionsQuery)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// quasar 对象
|
|
182
|
-
const $q = useQuasar()
|
|
183
|
-
|
|
184
|
-
// 表格已选数据
|
|
185
|
-
const tableSelected = ref([])
|
|
186
|
-
|
|
187
|
-
// 是否显示左边侧滑菜单
|
|
188
|
-
const leftDrawerModelValue = ref(null)
|
|
189
|
-
|
|
190
|
-
// 是否显示右边侧滑菜单
|
|
191
|
-
const rightDrawerModelValue = ref(null)
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* 检查是否上传中
|
|
195
|
-
*/
|
|
196
|
-
function checkUploading() {
|
|
197
|
-
for (const uploader of data.uploader) {
|
|
198
|
-
// 检查是否上传中
|
|
199
|
-
if (uploader.checkUploading()) {
|
|
200
|
-
return true
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return false
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* 上传网络外链
|
|
208
|
-
*/
|
|
209
|
-
async function uploadNet(callback) {
|
|
210
|
-
|
|
211
|
-
// 是否全部完成
|
|
212
|
-
let isFinish = false
|
|
213
|
-
|
|
214
|
-
// 回调
|
|
215
|
-
function cb() {
|
|
216
|
-
|
|
217
|
-
// 如果没有回调方法
|
|
218
|
-
if (! $n_isFunction(callback)) {
|
|
219
|
-
return
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// 是否上传中
|
|
223
|
-
const uploading = checkUploading()
|
|
224
|
-
|
|
225
|
-
// 如果全部完成
|
|
226
|
-
if (isFinish) {
|
|
227
|
-
// 则无任何操作
|
|
228
|
-
return
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// let loaded = 0
|
|
232
|
-
// let total = 0
|
|
233
|
-
// let progress = 0
|
|
234
|
-
|
|
235
|
-
if (
|
|
236
|
-
// 上传完成
|
|
237
|
-
! uploading
|
|
238
|
-
// 未完成
|
|
239
|
-
&& ! isFinish
|
|
240
|
-
) {
|
|
241
|
-
// 全部完成
|
|
242
|
-
isFinish = true
|
|
243
|
-
// 进度
|
|
244
|
-
// progress = 100
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
// else {
|
|
248
|
-
// for (const uploader of data.uploader) {
|
|
249
|
-
// const p = uploader.getUploadNetProgress()
|
|
250
|
-
// loaded += p.loaded
|
|
251
|
-
// total += p.total
|
|
252
|
-
// }
|
|
253
|
-
// progress = Math.round(loaded * 100 / total)
|
|
254
|
-
// }
|
|
255
|
-
|
|
256
|
-
// 回调
|
|
257
|
-
callback({
|
|
258
|
-
uploading,
|
|
259
|
-
uploader: data.uploader,
|
|
260
|
-
// loaded,
|
|
261
|
-
// total,
|
|
262
|
-
// progress,
|
|
263
|
-
})
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
for (const uploader of data.uploader) {
|
|
267
|
-
// 初始化上传网络外链列表
|
|
268
|
-
uploader.initUploadNetLists(cb)
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
for (const uploader of data.uploader) {
|
|
272
|
-
// 上传网络外链文件
|
|
273
|
-
await uploader.uploadNet()
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// 执行回调
|
|
277
|
-
cb()
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const _data = {
|
|
281
|
-
// 表格实例
|
|
282
|
-
$table: null,
|
|
283
|
-
// 表单实例
|
|
284
|
-
$form: null,
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// 注入数据
|
|
288
|
-
const data = {
|
|
289
|
-
// 页面加载
|
|
290
|
-
pageLoading: ref(o.pageLoading),
|
|
291
|
-
// 页面状态
|
|
292
|
-
pageStatus: ref(o.pageStatus),
|
|
293
|
-
// 空状态描述
|
|
294
|
-
emptyDescription: ref(o.emptyDescription),
|
|
295
|
-
|
|
296
|
-
// 当前路由全路径
|
|
297
|
-
routeFullPath: $route.fullPath,
|
|
298
|
-
// 当前路由路径
|
|
299
|
-
routePath: $route.path,
|
|
300
|
-
// 当前路由参数
|
|
301
|
-
routeQuery: $route.query,
|
|
302
|
-
// 获取当前路由
|
|
303
|
-
getRoute() {
|
|
304
|
-
return $route
|
|
305
|
-
},
|
|
306
|
-
// 格式化权限按钮
|
|
307
|
-
formatPowerBtns: o.formatPowerBtns,
|
|
308
|
-
|
|
309
|
-
// 左边侧滑菜单数据
|
|
310
|
-
leftDrawer: {
|
|
311
|
-
// 图标
|
|
312
|
-
icon: o.leftDrawerIcon,
|
|
313
|
-
// 是否显示
|
|
314
|
-
modelValue: leftDrawerModelValue,
|
|
315
|
-
// 是否显示切换按钮
|
|
316
|
-
showButton() {
|
|
317
|
-
return leftDrawerModelValue.value !== null
|
|
318
|
-
},
|
|
319
|
-
// 切换
|
|
320
|
-
toggle() {
|
|
321
|
-
if (leftDrawerModelValue.value !== null) {
|
|
322
|
-
leftDrawerModelValue.value = ! leftDrawerModelValue.value
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
},
|
|
326
|
-
// 右边侧滑菜单数据
|
|
327
|
-
rightDrawer: {
|
|
328
|
-
// 图标
|
|
329
|
-
icon: o.rightDrawerIcon,
|
|
330
|
-
// 是否显示
|
|
331
|
-
modelValue: rightDrawerModelValue,
|
|
332
|
-
// 是否显示切换按钮
|
|
333
|
-
showButton() {
|
|
334
|
-
return rightDrawerModelValue.value !== null
|
|
335
|
-
},
|
|
336
|
-
// 切换
|
|
337
|
-
toggle() {
|
|
338
|
-
if (rightDrawerModelValue.value !== null) {
|
|
339
|
-
rightDrawerModelValue.value = ! rightDrawerModelValue.value
|
|
340
|
-
}
|
|
341
|
-
},
|
|
342
|
-
},
|
|
343
|
-
// 表格已选数据
|
|
344
|
-
tableSelected,
|
|
345
|
-
// 上传器
|
|
346
|
-
uploader: [],
|
|
347
|
-
// 检查是否上传中
|
|
348
|
-
checkUploading,
|
|
349
|
-
// 上传网络外链
|
|
350
|
-
uploadNet,
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// 如果是权限页面
|
|
354
|
-
if (o.power) {
|
|
355
|
-
|
|
356
|
-
// 获取当前页面角色权限
|
|
357
|
-
const { status, data: res } = getPageData($route)
|
|
358
|
-
if (! status) {
|
|
359
|
-
o.pageStatus = false
|
|
360
|
-
o.emptyDescription = res.msg
|
|
361
|
-
o.power = false
|
|
362
|
-
|
|
363
|
-
} else {
|
|
364
|
-
// 当前页面权限
|
|
365
|
-
data.powerPage = res.page
|
|
366
|
-
// 当前页面权限按钮
|
|
367
|
-
data.powerBtns = ref(o.showPowerBtns ? res.btns.map(e => { e.loading = false; return e }) : [])
|
|
368
|
-
// 当前页面工具栏权限按钮
|
|
369
|
-
data.toolbarPowerBtns = computed(function() {
|
|
370
|
-
|
|
371
|
-
if (
|
|
372
|
-
// 如果显示工具栏权限按钮
|
|
373
|
-
o.showToolbarPowerBtns
|
|
374
|
-
// 有权限按钮数据
|
|
375
|
-
&& $n_isValidArray(data.powerBtns.value)
|
|
376
|
-
) {
|
|
377
|
-
const lists = []
|
|
378
|
-
|
|
379
|
-
// 格式化权限按钮列表
|
|
380
|
-
$n_forEach($n_filter(formatBtns(data.powerBtns.value), e => e.type > 2), function(item) {
|
|
381
|
-
|
|
382
|
-
if (! item.hidden) {
|
|
383
|
-
|
|
384
|
-
// 如果是单条数据显示
|
|
385
|
-
const isSingle = item.show === 'single'
|
|
386
|
-
|
|
387
|
-
// 如果是单条 || 多条显示
|
|
388
|
-
if (isSingle || item.show === 'multiple') {
|
|
389
|
-
|
|
390
|
-
// 初始为不显示
|
|
391
|
-
item.show = false
|
|
392
|
-
|
|
393
|
-
// 如果有表格选中数据
|
|
394
|
-
if ($n_isValidArray(data.tableSelected.value)) {
|
|
395
|
-
// 如果是单个显示
|
|
396
|
-
if (isSingle) {
|
|
397
|
-
item.show = data.tableSelected.value.length === 1
|
|
398
|
-
|
|
399
|
-
// 否则是多个显示
|
|
400
|
-
} else {
|
|
401
|
-
item.show = data.tableSelected.value.length >= 1
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// 如果是手机模式
|
|
407
|
-
if ($q.platform.is.mobile) {
|
|
408
|
-
item.icon = undefined
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
if (
|
|
413
|
-
// 如果有格式化权限按钮方法
|
|
414
|
-
$n_isFunction(o.formatPowerBtns)
|
|
415
|
-
&& o.formatPowerBtns(item, false, tableSelected.value) === false
|
|
416
|
-
) {
|
|
417
|
-
return
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
lists.push(item)
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
return lists
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
return []
|
|
427
|
-
})
|
|
428
|
-
|
|
429
|
-
// 权限按钮点击
|
|
430
|
-
data.powerBtnClick = async function (powerBtn, tableSelected) {
|
|
431
|
-
|
|
432
|
-
async function next() {
|
|
433
|
-
|
|
434
|
-
// 权限请求
|
|
435
|
-
await request({
|
|
436
|
-
// power
|
|
437
|
-
$power: data,
|
|
438
|
-
// 按钮数据
|
|
439
|
-
powerBtn,
|
|
440
|
-
// 权限路由参数
|
|
441
|
-
$route,
|
|
442
|
-
// 当前路由参数
|
|
443
|
-
$currentRoute,
|
|
444
|
-
// 表格选中数据
|
|
445
|
-
tableSelected,
|
|
446
|
-
// 表格实例
|
|
447
|
-
$table: _data.$table,
|
|
448
|
-
// 表单实例
|
|
449
|
-
$form: _data.$form,
|
|
450
|
-
// 检查是否正在上传文件
|
|
451
|
-
checkUploading,
|
|
452
|
-
// 加载中
|
|
453
|
-
loading(status) {
|
|
454
|
-
powerBtn.loading = status
|
|
455
|
-
},
|
|
456
|
-
// 上传网络外链
|
|
457
|
-
uploadNet,
|
|
458
|
-
// 请求上传网络外链
|
|
459
|
-
requestUploadNet: o.requestUploadNet,
|
|
460
|
-
// 请求前执行
|
|
461
|
-
requestBefore: o.requestBefore,
|
|
462
|
-
// 请求成功执行
|
|
463
|
-
requestSuccess: o.requestSuccess,
|
|
464
|
-
// 请求失败执行
|
|
465
|
-
requestFail: o.requestFail,
|
|
466
|
-
// 请求后执行
|
|
467
|
-
requestAfter: o.requestAfter,
|
|
468
|
-
})
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
// 如果权限按钮有自定义 click 事件
|
|
472
|
-
if (
|
|
473
|
-
$n_has(powerBtn, 'click')
|
|
474
|
-
&& $n_isFunction(powerBtn.click)
|
|
475
|
-
&& await $n_runAsync(powerBtn.click)({ powerBtn, tableSelected, next }) === false
|
|
476
|
-
) {
|
|
477
|
-
return
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
await next()
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
// 如果没有开启权限
|
|
486
|
-
if (! o.power) {
|
|
487
|
-
// 当前页面权限
|
|
488
|
-
data.powerPage = {}
|
|
489
|
-
// 当前页面权限按钮
|
|
490
|
-
data.powerBtns = ref([])
|
|
491
|
-
// 当前页面工具栏权限按钮
|
|
492
|
-
data.toolbarPowerBtns = ref([])
|
|
493
|
-
// 权限按钮点击
|
|
494
|
-
data.powerBtnClick = ()=>{}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// 更新数据
|
|
498
|
-
data.update = function(cb) {
|
|
499
|
-
cb(data, _data)
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// 提供可以被后代组件注入的值
|
|
503
|
-
provide(NPowerKey, data)
|
|
504
|
-
|
|
505
|
-
return data
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
/**
|
|
509
|
-
* 设置权限数据
|
|
510
|
-
*/
|
|
511
|
-
function setData(data) {
|
|
512
|
-
|
|
513
|
-
// 如果没有角色数据
|
|
514
|
-
if (! $n_isValidObject(data)) {
|
|
515
|
-
return
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
const {
|
|
519
|
-
rows,
|
|
520
|
-
v,
|
|
521
|
-
} = data
|
|
522
|
-
|
|
523
|
-
if (! $n_isValidArray(rows) || ! v) {
|
|
524
|
-
return
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
// all id
|
|
528
|
-
const all = {}
|
|
529
|
-
// 页面
|
|
530
|
-
const urls = {}
|
|
531
|
-
// 按钮
|
|
532
|
-
const btns = {}
|
|
533
|
-
// 菜单
|
|
534
|
-
const menus = []
|
|
535
|
-
|
|
536
|
-
for (const item of rows) {
|
|
537
|
-
|
|
538
|
-
// 【格式化 start】
|
|
539
|
-
// --------------------------------------------------
|
|
540
|
-
if (item.data) {
|
|
541
|
-
item.data = $n_json.parse(item.data)
|
|
542
|
-
}
|
|
543
|
-
item.data = $n_isValidObject(item.data) ? $n_numberDeep(item.data) : {}
|
|
544
|
-
|
|
545
|
-
// 设置数据类型
|
|
546
|
-
item.data.type = item.data_type
|
|
547
|
-
delete item.data_type
|
|
548
|
-
|
|
549
|
-
// 标识
|
|
550
|
-
item.name = ''
|
|
551
|
-
|
|
552
|
-
// 如果有 url
|
|
553
|
-
if ($n_isValidString(item.url)) {
|
|
554
|
-
|
|
555
|
-
// url 首位加上反斜杠
|
|
556
|
-
item.url = $n_slash($n_toLower($n_trimString(item.url)), 'start', true)
|
|
557
|
-
if (item.url) {
|
|
558
|
-
|
|
559
|
-
item.data.url = item.url
|
|
560
|
-
|
|
561
|
-
// 截取最后一个反斜杠
|
|
562
|
-
const lastIndex = item.data.url.lastIndexOf('/')
|
|
563
|
-
if (lastIndex > -1) {
|
|
564
|
-
item.name = item.data.url.substring(lastIndex + 1)
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
} else {
|
|
568
|
-
item.url = ''
|
|
569
|
-
item.data.url = ''
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
} else {
|
|
573
|
-
item.url = ''
|
|
574
|
-
item.data.url = ''
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// 菜单
|
|
578
|
-
if (item.type === 1) {
|
|
579
|
-
menus.push(item)
|
|
580
|
-
|
|
581
|
-
// 按钮
|
|
582
|
-
} else if (item.type > 2) {
|
|
583
|
-
|
|
584
|
-
// 按钮类型
|
|
585
|
-
switch (item.type) {
|
|
586
|
-
|
|
587
|
-
// 默认按钮
|
|
588
|
-
case 11:
|
|
589
|
-
item.color = 'default'
|
|
590
|
-
break;
|
|
591
|
-
|
|
592
|
-
// 主要按钮
|
|
593
|
-
case 12:
|
|
594
|
-
item.color = 'primary'
|
|
595
|
-
break;
|
|
596
|
-
|
|
597
|
-
// 成功按钮
|
|
598
|
-
case 13:
|
|
599
|
-
item.color = 'secondary'
|
|
600
|
-
break;
|
|
601
|
-
|
|
602
|
-
// 信息按钮
|
|
603
|
-
case 14:
|
|
604
|
-
item.color = 'info'
|
|
605
|
-
break;
|
|
606
|
-
|
|
607
|
-
// 警告按钮
|
|
608
|
-
case 15:
|
|
609
|
-
item.color = 'warning'
|
|
610
|
-
break;
|
|
611
|
-
|
|
612
|
-
// 危险按钮
|
|
613
|
-
case 16:
|
|
614
|
-
item.color = 'negative'
|
|
615
|
-
break;
|
|
616
|
-
|
|
617
|
-
// 隐藏按钮
|
|
618
|
-
case 20:
|
|
619
|
-
item.hidden = true
|
|
620
|
-
break;
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
// 【格式化 end】
|
|
624
|
-
// --------------------------------------------------
|
|
625
|
-
|
|
626
|
-
// url
|
|
627
|
-
if (item.url) {
|
|
628
|
-
// 添加至 all
|
|
629
|
-
all[item.id] = item
|
|
630
|
-
// 添加至页面
|
|
631
|
-
urls[item.url] = item
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
for (const item of rows) {
|
|
636
|
-
|
|
637
|
-
// 如果有跳转页面
|
|
638
|
-
if ($n_has(item.data, 'toPage')) {
|
|
639
|
-
// 设置跳转页面地址
|
|
640
|
-
item.data.toPage = $n_has(all, item.data.toPage) ? all[item.data.toPage].data.url : null
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
// 如果有请求成功执行类型
|
|
644
|
-
// else if ($n_has(item.data, 'requestSuccess.type')) {
|
|
645
|
-
// // 如果请求成功执行类型是关闭窗口、跳转并刷新页面
|
|
646
|
-
// if (item.data.requestSuccess.type === 'closePushRefresh') {
|
|
647
|
-
// // 设置刷新页面地址
|
|
648
|
-
// item.data.requestSuccess.params =
|
|
649
|
-
// (
|
|
650
|
-
// // 如果有刷新页面的参数 id
|
|
651
|
-
// $n_has(item.data.requestSuccess, 'params')
|
|
652
|
-
// // 如果有页面数据
|
|
653
|
-
// && $n_has(all, item.data.requestSuccess.params)
|
|
654
|
-
// ) ? all[item.data.requestSuccess.params].data.url : null
|
|
655
|
-
// }
|
|
656
|
-
// }
|
|
657
|
-
|
|
658
|
-
if (
|
|
659
|
-
// 数据/按钮
|
|
660
|
-
item.type > 1
|
|
661
|
-
// 有父级数据
|
|
662
|
-
&& $n_has(all, item.pid)
|
|
663
|
-
) {
|
|
664
|
-
const pItem = all[item.pid]
|
|
665
|
-
if ($n_has(btns, pItem.url)) {
|
|
666
|
-
btns[pItem.url].push(item)
|
|
667
|
-
} else {
|
|
668
|
-
btns[pItem.url] = [item]
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
// 保存至权限状态中
|
|
674
|
-
statePower.value = {
|
|
675
|
-
// 角色权限版本
|
|
676
|
-
v,
|
|
677
|
-
// all id
|
|
678
|
-
all,
|
|
679
|
-
// 页面
|
|
680
|
-
urls,
|
|
681
|
-
// 按钮
|
|
682
|
-
btns,
|
|
683
|
-
// 菜单
|
|
684
|
-
menus,
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/**
|
|
689
|
-
* 获取权限
|
|
690
|
-
*/
|
|
691
|
-
async function getData() {
|
|
692
|
-
|
|
693
|
-
// 如果没有权限数据
|
|
694
|
-
if (! statePower.value.v) {
|
|
695
|
-
|
|
696
|
-
// 获取权限数据
|
|
697
|
-
const res = await $n_getData($n_config('apiDataPowerName'))
|
|
698
|
-
if (res === false) {
|
|
699
|
-
statePower.value = {
|
|
700
|
-
// 权限版本
|
|
701
|
-
v: null,
|
|
702
|
-
// all id
|
|
703
|
-
all: {},
|
|
704
|
-
// 页面
|
|
705
|
-
urls: {},
|
|
706
|
-
// 按钮
|
|
707
|
-
btns: {},
|
|
708
|
-
// 菜单
|
|
709
|
-
menus: [],
|
|
710
|
-
}
|
|
711
|
-
return $n_fail()
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// 如果有权限状态数据, 则直接返回
|
|
716
|
-
if (statePower.value.v) {
|
|
717
|
-
return $n_success($n_cloneDeep(statePower.value))
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
return $n_fail()
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/**
|
|
724
|
-
* 解析传参
|
|
725
|
-
*/
|
|
726
|
-
function parseQuery(data, settings) {
|
|
727
|
-
|
|
728
|
-
// 如果配置是字符串
|
|
729
|
-
if ($n_isValidString(settings)) {
|
|
730
|
-
|
|
731
|
-
// 如果返回所有传参
|
|
732
|
-
if (settings === 'all') {
|
|
733
|
-
return $n_isValidObject(data) ? data : {}
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
// 将字符串放到数组中
|
|
737
|
-
settings = [settings]
|
|
738
|
-
|
|
739
|
-
// 如果配置是对象
|
|
740
|
-
} else if ($n_isValidObject(settings)) {
|
|
741
|
-
settings = [settings]
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
const query = {}
|
|
745
|
-
|
|
746
|
-
// 如果配置是数组
|
|
747
|
-
if ($n_isValidArray(settings)) {
|
|
748
|
-
|
|
749
|
-
// 别名
|
|
750
|
-
const alias = {}
|
|
751
|
-
|
|
752
|
-
for (let item of settings) {
|
|
753
|
-
// 如果是需要的字段
|
|
754
|
-
if ($n_isValidString(item)) {
|
|
755
|
-
|
|
756
|
-
// 将字段转小写
|
|
757
|
-
item = $n_toLower($n_trimString(item))
|
|
758
|
-
|
|
759
|
-
// 判断字段是否有 as 别名
|
|
760
|
-
const arr = $n_split(item, ' as ')
|
|
761
|
-
|
|
762
|
-
// 如果有别名
|
|
763
|
-
if (arr.length === 2) {
|
|
764
|
-
alias[$n_trimString(arr[0])] = $n_trimString(arr[1])
|
|
765
|
-
|
|
766
|
-
// 否则别名就是当前字段本身
|
|
767
|
-
} else {
|
|
768
|
-
alias[item] = item
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
// 否则如果是自定义传参
|
|
772
|
-
} else if ($n_isValidObject(item)) {
|
|
773
|
-
Object.assign(query, item)
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
if (
|
|
778
|
-
// 如果有参数数据
|
|
779
|
-
$n_isValidObject(data)
|
|
780
|
-
// 如果有定义别名
|
|
781
|
-
&& $n_isValidObject(alias)
|
|
782
|
-
) {
|
|
783
|
-
$n_forIn(data, function(value, key) {
|
|
784
|
-
|
|
785
|
-
// 如果当前字段在别名中
|
|
786
|
-
if ($n_has(alias, key)) {
|
|
787
|
-
query[alias[key]] = value
|
|
788
|
-
}
|
|
789
|
-
})
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
return query
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
/**
|
|
797
|
-
* 格式化权限按钮
|
|
798
|
-
*/
|
|
799
|
-
function formatBtns(powerBtns, filterBtns, toObject = false) {
|
|
800
|
-
|
|
801
|
-
const newLists = []
|
|
802
|
-
|
|
803
|
-
$n_forEach(powerBtns, function(item) {
|
|
804
|
-
|
|
805
|
-
item = $n_cloneDeep(item)
|
|
806
|
-
|
|
807
|
-
const {
|
|
808
|
-
name,
|
|
809
|
-
icon,
|
|
810
|
-
} = item
|
|
811
|
-
|
|
812
|
-
Object.assign(item, {
|
|
813
|
-
// 图标
|
|
814
|
-
icon: icon || undefined,
|
|
815
|
-
// 隐藏按钮
|
|
816
|
-
hidden: $n_get(item, 'hidden') === true,
|
|
817
|
-
// 显示按钮类型
|
|
818
|
-
show: $n_has(item, 'data.show') ? item.data.show : true,
|
|
819
|
-
})
|
|
820
|
-
|
|
821
|
-
// 是否固定按钮
|
|
822
|
-
item.fixed =
|
|
823
|
-
// 非隐藏按钮
|
|
824
|
-
! item.hidden
|
|
825
|
-
// 固定列
|
|
826
|
-
&& $n_get(item, 'data.fixed') === true
|
|
827
|
-
// 单个按钮
|
|
828
|
-
&& item.show === 'single'
|
|
829
|
-
// 按钮有图标
|
|
830
|
-
&& !! item.icon
|
|
831
|
-
|
|
832
|
-
// 如果是对象
|
|
833
|
-
if ($n_isValidObject(filterBtns)) {
|
|
834
|
-
if ($n_has(filterBtns, name)) {
|
|
835
|
-
newLists.push($n_merge(item, filterBtns[name]))
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
// 如果是数组
|
|
839
|
-
} else if ($n_isValidArray(filterBtns)) {
|
|
840
|
-
if ($n_indexOf(filterBtns, name) > -1) {
|
|
841
|
-
newLists.push($n_merge(item, filterBtns[name]))
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
} else {
|
|
845
|
-
newLists.push(item)
|
|
846
|
-
}
|
|
847
|
-
})
|
|
848
|
-
|
|
849
|
-
// 转数组
|
|
850
|
-
if (toObject) {
|
|
851
|
-
const obj = {}
|
|
852
|
-
for (const item of newLists) {
|
|
853
|
-
obj[item.name] = item
|
|
854
|
-
}
|
|
855
|
-
return obj
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
return newLists
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
/**
|
|
862
|
-
* 获取请求传参
|
|
863
|
-
*/
|
|
864
|
-
function getRequestQuery(o) {
|
|
865
|
-
|
|
866
|
-
// 传参
|
|
867
|
-
const query = {}
|
|
868
|
-
|
|
869
|
-
// 如果有请求传参的传参设置
|
|
870
|
-
if ($n_has(o.powerBtn.data, 'requestQuery.query')) {
|
|
871
|
-
const resQuery = parseQuery(o.query, o.powerBtn.data.requestQuery.query)
|
|
872
|
-
if ($n_isValidObject(resQuery)) {
|
|
873
|
-
Object.assign(query, resQuery)
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
// 获取列表数据
|
|
878
|
-
if (
|
|
879
|
-
// 如果按钮参数有显示类型
|
|
880
|
-
// $n_has(o.powerBtn.data, 'show')
|
|
881
|
-
// 按钮参数的显示类型必须是单选或多选
|
|
882
|
-
// && $n_indexOf(['single', 'multiple'], o.powerBtn.data.show) > -1
|
|
883
|
-
// 如果有请求传参的列表设置
|
|
884
|
-
$n_has(o.powerBtn.data, 'requestQuery.list')
|
|
885
|
-
// 如果有表格数据
|
|
886
|
-
&& $n_isValidArray(o.tableSelected)
|
|
887
|
-
) {
|
|
888
|
-
let newQuery = {}
|
|
889
|
-
|
|
890
|
-
// 如果是单选
|
|
891
|
-
if ($n_get(o.powerBtn.data, 'show') === 'single') {
|
|
892
|
-
// 取表格选中第一条数据
|
|
893
|
-
newQuery = o.tableSelected[0]
|
|
894
|
-
|
|
895
|
-
// 否则是多选
|
|
896
|
-
} else {
|
|
897
|
-
// 合并表格选中的每一条数据
|
|
898
|
-
for (const item of o.tableSelected) {
|
|
899
|
-
$n_forIn(item, function(value, key) {
|
|
900
|
-
if ($n_has(newQuery, key)) {
|
|
901
|
-
newQuery[key].push(value)
|
|
902
|
-
} else {
|
|
903
|
-
newQuery[key] = [value]
|
|
904
|
-
}
|
|
905
|
-
})
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
const resTable = parseQuery(newQuery, o.powerBtn.data.requestQuery.list)
|
|
910
|
-
if ($n_isValidObject(resTable)) {
|
|
911
|
-
Object.assign(query, resTable)
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
// 如果有自定义参数
|
|
916
|
-
if (
|
|
917
|
-
$n_has(o.powerBtn.data, 'query')
|
|
918
|
-
&& $n_isValidObject(o.powerBtn.data.query)
|
|
919
|
-
) {
|
|
920
|
-
Object.assign(query, o.powerBtn.data.query)
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
return $n_cloneDeep($n_numberDeep(query))
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
/**
|
|
927
|
-
* 格式化参数
|
|
928
|
-
*/
|
|
929
|
-
function formatQuery(query, isJoinArr) {
|
|
930
|
-
|
|
931
|
-
const newQuery = {}
|
|
932
|
-
|
|
933
|
-
// 格式化参数
|
|
934
|
-
$n_forIn(query, function(value, key) {
|
|
935
|
-
|
|
936
|
-
// 如果是数字
|
|
937
|
-
if ($n_isNumeric(value)) {
|
|
938
|
-
newQuery[key] = $n_isNumber(value) ? value : Number(value)
|
|
939
|
-
|
|
940
|
-
// 如果是字符串
|
|
941
|
-
} else if ($n_isValidString(value)) {
|
|
942
|
-
newQuery[key] = $n_trimString(value)
|
|
943
|
-
|
|
944
|
-
// 如果是数组
|
|
945
|
-
} else if ($n_isValidArray(value)) {
|
|
946
|
-
|
|
947
|
-
const arr = []
|
|
948
|
-
for (const val of value) {
|
|
949
|
-
|
|
950
|
-
// 如果为有效值
|
|
951
|
-
if ($n_isRequired(val)) {
|
|
952
|
-
|
|
953
|
-
// 如果是数字
|
|
954
|
-
if ($n_isNumeric(val)) {
|
|
955
|
-
arr.push($n_isNumber(val) ? val : Number(val))
|
|
956
|
-
|
|
957
|
-
// 如果是字符串
|
|
958
|
-
} else if ($n_isValidString(val)) {
|
|
959
|
-
arr.push($n_trimString(val))
|
|
960
|
-
|
|
961
|
-
// 否则为数组或对象
|
|
962
|
-
} else {
|
|
963
|
-
arr.push(val)
|
|
964
|
-
}
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
if (arr.length) {
|
|
968
|
-
newQuery[key] = isJoinArr ? $n_join(arr, ',') : arr
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
})
|
|
972
|
-
|
|
973
|
-
return newQuery
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
/**
|
|
977
|
-
* 角色请求
|
|
978
|
-
*/
|
|
979
|
-
async function request(options) {
|
|
980
|
-
|
|
981
|
-
// 参数
|
|
982
|
-
const o = Object.assign({
|
|
983
|
-
// 权限按钮数据
|
|
984
|
-
powerBtn: {},
|
|
985
|
-
// 表格选中数据
|
|
986
|
-
tableSelected: [],
|
|
987
|
-
// 检查是否正在上传文件
|
|
988
|
-
checkUploading: null,
|
|
989
|
-
// 加载中
|
|
990
|
-
loading: null,
|
|
991
|
-
// 上传网络外链
|
|
992
|
-
uploadNet: null,
|
|
993
|
-
// 请求上传网络外链
|
|
994
|
-
requestUploadNet: null,
|
|
995
|
-
// 请求前执行
|
|
996
|
-
requestBefore: null,
|
|
997
|
-
// 请求成功执行
|
|
998
|
-
requestSuccess: null,
|
|
999
|
-
// 请求失败执行
|
|
1000
|
-
requestFail: null,
|
|
1001
|
-
// 请求后执行
|
|
1002
|
-
requestAfter: null,
|
|
1003
|
-
}, options)
|
|
1004
|
-
|
|
1005
|
-
const {
|
|
1006
|
-
// 权限路由参数
|
|
1007
|
-
$route,
|
|
1008
|
-
// 当前路由参数
|
|
1009
|
-
$currentRoute,
|
|
1010
|
-
} = options
|
|
1011
|
-
|
|
1012
|
-
o.query = $route.query
|
|
1013
|
-
|
|
1014
|
-
// 判断类型
|
|
1015
|
-
if (! $n_get(o.powerBtn, 'data.type')) {
|
|
1016
|
-
|
|
1017
|
-
// 【调试模式】
|
|
1018
|
-
// --------------------------------------------------
|
|
1019
|
-
// #ifdef IS_DEBUG
|
|
1020
|
-
console.log('没有定义数据类型')
|
|
1021
|
-
// #endif
|
|
1022
|
-
// --------------------------------------------------
|
|
1023
|
-
|
|
1024
|
-
return
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
// 克隆按钮
|
|
1028
|
-
o.powerBtn = $n_cloneDeep(o.powerBtn)
|
|
1029
|
-
|
|
1030
|
-
// 是否为跳转页面
|
|
1031
|
-
let isToPage = false
|
|
1032
|
-
|
|
1033
|
-
// 判断 url
|
|
1034
|
-
o.powerBtn.data.url = $n_toLower($n_trimString(o.powerBtn.data.url))
|
|
1035
|
-
if (! o.powerBtn.data.url) {
|
|
1036
|
-
|
|
1037
|
-
if (
|
|
1038
|
-
// 如果没有跳转页面地址
|
|
1039
|
-
! $n_has(o.powerBtn.data, 'toPage')
|
|
1040
|
-
// 或跳转页面地址为空
|
|
1041
|
-
|| ! $n_isValidString(o.powerBtn.data.toPage)
|
|
1042
|
-
) {
|
|
1043
|
-
// 【调试模式】
|
|
1044
|
-
// --------------------------------------------------
|
|
1045
|
-
// #ifdef IS_DEBUG
|
|
1046
|
-
console.log('没有定义 url')
|
|
1047
|
-
// #endif
|
|
1048
|
-
// --------------------------------------------------
|
|
1049
|
-
|
|
1050
|
-
return
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
// 用跳转页面地址替换 toPage
|
|
1054
|
-
o.powerBtn.data = Object.assign({}, o.powerBtn.data, {
|
|
1055
|
-
url: o.powerBtn.data.toPage,
|
|
1056
|
-
})
|
|
1057
|
-
|
|
1058
|
-
// 设为跳转页面
|
|
1059
|
-
isToPage = true
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
// 获取请求参数
|
|
1063
|
-
let query = getRequestQuery(o)
|
|
1064
|
-
|
|
1065
|
-
// 如果是打开新窗口
|
|
1066
|
-
// --------------------------------------------------
|
|
1067
|
-
if (o.powerBtn.data.type === dicts.POWER_DATA_TYPE__OPEN) {
|
|
1068
|
-
|
|
1069
|
-
query = formatQuery(query, true)
|
|
1070
|
-
|
|
1071
|
-
// 如果按钮有标题
|
|
1072
|
-
const pageTitle = $n_trimString(o.powerBtn.title)
|
|
1073
|
-
if (pageTitle) {
|
|
1074
|
-
query.n_page_title = pageTitle
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
// 如果不是禁止添加来源页面参数
|
|
1078
|
-
if ($n_get(o.powerBtn.data, 'noFromPageQuery') !== true) {
|
|
1079
|
-
|
|
1080
|
-
// 来源页面是当前路由的完整路径
|
|
1081
|
-
query.n_from_page = getFromPageFullUrl($currentRoute)
|
|
1082
|
-
|
|
1083
|
-
// 如果是跳转页面
|
|
1084
|
-
if (isToPage) {
|
|
1085
|
-
query.n_to_page = 1
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
|
-
// 请求前执行
|
|
1090
|
-
const resBefore = await $n_runAsync(o.requestBefore)({
|
|
1091
|
-
options: o,
|
|
1092
|
-
requestData: query,
|
|
1093
|
-
next: nextBefore,
|
|
1094
|
-
})
|
|
1095
|
-
if (resBefore !== void 0) {
|
|
1096
|
-
if (resBefore === false) {
|
|
1097
|
-
return
|
|
1098
|
-
}
|
|
1099
|
-
query = resBefore
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
function nextBefore() {
|
|
1103
|
-
$n_router.push({
|
|
1104
|
-
path: o.powerBtn.data.url,
|
|
1105
|
-
query,
|
|
1106
|
-
})
|
|
1107
|
-
}
|
|
1108
|
-
nextBefore()
|
|
1109
|
-
return
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
// 请求数据
|
|
1113
|
-
let requestData = {}
|
|
1114
|
-
// 请求之前数据
|
|
1115
|
-
let _formDataClone = null
|
|
1116
|
-
|
|
1117
|
-
// 如果是提交表单
|
|
1118
|
-
// --------------------------------------------------
|
|
1119
|
-
const isForm = o.powerBtn.data.type === dicts.POWER_DATA_TYPE__FORM
|
|
1120
|
-
if (isForm) {
|
|
1121
|
-
|
|
1122
|
-
// 获取表单注入
|
|
1123
|
-
o.$form = $n_has(options, '$form') ? options.$form : inject(NFormKey)
|
|
1124
|
-
if (! o.$form) {
|
|
1125
|
-
throw new Error('没有创建表单实例')
|
|
1126
|
-
}
|
|
1127
|
-
|
|
1128
|
-
// 如果验证表单
|
|
1129
|
-
if ($n_get(o.powerBtn.data, 'validate') !== false) {
|
|
1130
|
-
|
|
1131
|
-
if (! o.$form.formRef) {
|
|
1132
|
-
throw new Error('没有绑定 fromRef')
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
// 验证表单
|
|
1136
|
-
if (! await o.$form.formRef.value.validate()) {
|
|
1137
|
-
return
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
// 验证表单数据
|
|
1142
|
-
if (! $n_isValidObject(o.$form.formData.value)) {
|
|
1143
|
-
throw new Error('没有获取到表单数据')
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
// 如果是请求数据
|
|
1147
|
-
// --------------------------------------------------
|
|
1148
|
-
} else {
|
|
1149
|
-
// 获取表格注入
|
|
1150
|
-
o.$table = $n_has(options, '$table') ? options.$table : inject(NTableKey)
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
if (
|
|
1154
|
-
// 如果为跳转页面
|
|
1155
|
-
$n_has($route.query, 'n_to_page')
|
|
1156
|
-
&& $route.query.n_to_page === 1
|
|
1157
|
-
// 如果有请求成功后的操作动作
|
|
1158
|
-
&& $n_has(o.powerBtn.data, 'requestSuccess.type')
|
|
1159
|
-
// 如果为关闭窗口、跳转并刷新页面
|
|
1160
|
-
&& o.powerBtn.data.requestSuccess.type === 'closePushRefresh'
|
|
1161
|
-
) {
|
|
1162
|
-
// 则改为 关闭窗口并跳转页面
|
|
1163
|
-
// 跳转的页面, 说明是从别的页面进行跳转, 则不需要刷新来源页面
|
|
1164
|
-
o.powerBtn.data.requestSuccess.type = 'closePush'
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
// 判断是否有确认框
|
|
1168
|
-
const isConfirm = $n_get(o.powerBtn.data, 'confirm')
|
|
1169
|
-
if (
|
|
1170
|
-
// 如果有确认框
|
|
1171
|
-
isConfirm
|
|
1172
|
-
// 如果有密码确认框
|
|
1173
|
-
|| $n_get(o.powerBtn.data, 'confirmPassword')
|
|
1174
|
-
) {
|
|
1175
|
-
// 如果需要先弹出确认框
|
|
1176
|
-
if (isConfirm) {
|
|
1177
|
-
|
|
1178
|
-
// 确认框
|
|
1179
|
-
$n_confirm({
|
|
1180
|
-
// 重要操作,请输入登录密码并确认后操作
|
|
1181
|
-
message: $n_isValidString(isConfirm) ? isConfirm : '确认要执行该操作吗?',
|
|
1182
|
-
})
|
|
1183
|
-
// 点击确认执行
|
|
1184
|
-
.onOk(onConfirmRequest)
|
|
1185
|
-
|
|
1186
|
-
return
|
|
1187
|
-
}
|
|
1188
|
-
}
|
|
1189
|
-
|
|
1190
|
-
// 否则执行确认请求事件
|
|
1191
|
-
await onConfirmRequest()
|
|
1192
|
-
|
|
1193
|
-
/**
|
|
1194
|
-
* 确认请求事件
|
|
1195
|
-
*/
|
|
1196
|
-
function onConfirmRequest() {
|
|
1197
|
-
|
|
1198
|
-
// 下一步
|
|
1199
|
-
function next() {
|
|
1200
|
-
|
|
1201
|
-
// 如果是表单
|
|
1202
|
-
if (isForm) {
|
|
1203
|
-
|
|
1204
|
-
// 获取请求数据
|
|
1205
|
-
requestData = $n_merge({}, formatQuery(query, false), o.$form.formData.value)
|
|
1206
|
-
|
|
1207
|
-
// 合并请求原始表单数据
|
|
1208
|
-
if ($n_isValidObject(o.$form.requestRawFormData.value)) {
|
|
1209
|
-
_formDataClone = $n_cloneDeep(o.$form.formData.value)
|
|
1210
|
-
Object.assign(requestData, {
|
|
1211
|
-
n__raw: o.$form.requestRawFormData.value
|
|
1212
|
-
})
|
|
1213
|
-
}
|
|
1214
|
-
|
|
1215
|
-
// 如果是请求数据
|
|
1216
|
-
// --------------------------------------------------
|
|
1217
|
-
} else {
|
|
1218
|
-
// 获取请求数据
|
|
1219
|
-
requestData = formatQuery(query, false)
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
|
-
// 执行请求
|
|
1223
|
-
onRequest()
|
|
1224
|
-
.finally()
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
// 如果是表单
|
|
1228
|
-
if (isForm) {
|
|
1229
|
-
|
|
1230
|
-
if (
|
|
1231
|
-
// 如果有请求上传网络外链方法
|
|
1232
|
-
$n_isFunction(o.requestUploadNet)
|
|
1233
|
-
// 如果有上传网络外链方法
|
|
1234
|
-
&& $n_isFunction(o.uploadNet)
|
|
1235
|
-
) {
|
|
1236
|
-
// 上传网络外链
|
|
1237
|
-
o.uploadNet(function(e) {
|
|
1238
|
-
o.requestUploadNet(Object.assign(e, { next }))
|
|
1239
|
-
}).finally()
|
|
1240
|
-
return
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1243
|
-
// 否则检查是否正在上传文件
|
|
1244
|
-
if ($n_isFunction(o.checkUploading) && o.checkUploading()) {
|
|
1245
|
-
// 轻提示
|
|
1246
|
-
$n_toast({
|
|
1247
|
-
message: '文件上传中,请耐心等待',
|
|
1248
|
-
})
|
|
1249
|
-
return
|
|
1250
|
-
}
|
|
1251
|
-
}
|
|
1252
|
-
|
|
1253
|
-
// 下一步
|
|
1254
|
-
next()
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
/**
|
|
1258
|
-
* 请求事件
|
|
1259
|
-
*/
|
|
1260
|
-
async function onRequest() {
|
|
1261
|
-
|
|
1262
|
-
if ($n_has(o.powerBtn.data, 'formatRequestData')) {
|
|
1263
|
-
o.powerBtn.data.formatRequestData({ requestData })
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
// 请求前执行
|
|
1267
|
-
const resBefore = await $n_runAsync(o.requestBefore)({
|
|
1268
|
-
options: o,
|
|
1269
|
-
requestData,
|
|
1270
|
-
next: nextBefore,
|
|
1271
|
-
})
|
|
1272
|
-
if (resBefore !== void 0) {
|
|
1273
|
-
if (resBefore === false) {
|
|
1274
|
-
return
|
|
1275
|
-
}
|
|
1276
|
-
requestData = resBefore
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
async function nextBefore() {
|
|
1280
|
-
|
|
1281
|
-
// 请求地址
|
|
1282
|
-
const requestUrl = o.powerBtn.data.url
|
|
1283
|
-
|
|
1284
|
-
// 请求
|
|
1285
|
-
const res = await $n_http({
|
|
1286
|
-
// 请求地址
|
|
1287
|
-
url: requestUrl,
|
|
1288
|
-
// 请求数据
|
|
1289
|
-
data: requestData,
|
|
1290
|
-
// 加载中
|
|
1291
|
-
loading: o.loading,
|
|
1292
|
-
})
|
|
1293
|
-
|
|
1294
|
-
// 返回结果数据
|
|
1295
|
-
const resultData = Object.assign({
|
|
1296
|
-
// 请求地址
|
|
1297
|
-
requestUrl,
|
|
1298
|
-
// 参数
|
|
1299
|
-
options: o,
|
|
1300
|
-
// 请求数据
|
|
1301
|
-
requestData,
|
|
1302
|
-
}, res)
|
|
1303
|
-
|
|
1304
|
-
// 请求后执行
|
|
1305
|
-
if (await $n_runAsync(o.requestAfter)(resultData) === false) {
|
|
1306
|
-
return
|
|
1307
|
-
}
|
|
1308
|
-
|
|
1309
|
-
// 如果请求成功
|
|
1310
|
-
if (res.status) {
|
|
1311
|
-
|
|
1312
|
-
// 下一步
|
|
1313
|
-
function next(isNotify = true) {
|
|
1314
|
-
|
|
1315
|
-
// 轻提示
|
|
1316
|
-
if (isNotify) {
|
|
1317
|
-
$n_toast({
|
|
1318
|
-
type: 'positive',
|
|
1319
|
-
message: '恭喜您,操作成功',
|
|
1320
|
-
})
|
|
1321
|
-
}
|
|
1322
|
-
|
|
1323
|
-
// 判断是否有请求成功后的操作动作
|
|
1324
|
-
if ($n_has(o.powerBtn.data, 'requestSuccess.type')) {
|
|
1325
|
-
switch (o.powerBtn.data.requestSuccess.type) {
|
|
1326
|
-
|
|
1327
|
-
// 关闭当前页面
|
|
1328
|
-
case 'close':
|
|
1329
|
-
// 关闭窗口并跳转页面
|
|
1330
|
-
case 'closePush':
|
|
1331
|
-
// 关闭窗口、跳转并刷新页面
|
|
1332
|
-
case 'closePushRefresh':
|
|
1333
|
-
|
|
1334
|
-
// 如果是渲染页面
|
|
1335
|
-
// 说明该页面在 <table-splitter> 组件内部被渲染, 则不需要关闭当前窗口
|
|
1336
|
-
if ($n_has($route.query, 'n_render_page') && $route.query.n_render_page === 1) {
|
|
1337
|
-
// 则无任何操作
|
|
1338
|
-
return
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
const opts = {
|
|
1342
|
-
type: 'closeCurrentTab',
|
|
1343
|
-
}
|
|
1344
|
-
|
|
1345
|
-
if (
|
|
1346
|
-
// 如果不是关闭当前页面, 则为关闭窗口并跳转页面
|
|
1347
|
-
o.powerBtn.data.requestSuccess.type !== 'close'
|
|
1348
|
-
// 如果有来源页面
|
|
1349
|
-
&& $n_has($route.query, 'n_from_page')
|
|
1350
|
-
&& $n_isValidString($route.query.n_from_page)
|
|
1351
|
-
) {
|
|
1352
|
-
Object.assign(opts, {
|
|
1353
|
-
// 跳转页面地址
|
|
1354
|
-
pushPage: decodeURIComponent($route.query.n_from_page),
|
|
1355
|
-
// 是否跳转并刷新页面
|
|
1356
|
-
isPushRefresh: o.powerBtn.data.requestSuccess.type === 'closePushRefresh',
|
|
1357
|
-
})
|
|
1358
|
-
|
|
1359
|
-
// 否则如果定义了跳转页面
|
|
1360
|
-
// else if ($n_has(o.powerBtn.data, 'requestSuccess.params') && $n_isValidString(o.powerBtn.data.requestSuccess.params)) {
|
|
1361
|
-
// pushPage = o.powerBtn.data.requestSuccess.params
|
|
1362
|
-
// }
|
|
1363
|
-
}
|
|
1364
|
-
|
|
1365
|
-
// 关闭当前标签页
|
|
1366
|
-
$n_bus.emit('main', opts)
|
|
1367
|
-
break
|
|
1368
|
-
|
|
1369
|
-
// 重置表单
|
|
1370
|
-
case 'resetForm':
|
|
1371
|
-
$n_run(o.$form?.resetForm)()
|
|
1372
|
-
break
|
|
1373
|
-
|
|
1374
|
-
// 刷新列表
|
|
1375
|
-
case 'refreshList':
|
|
1376
|
-
$n_run(o.$table?.tableRefresh)()
|
|
1377
|
-
break
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
|
|
1382
|
-
// 设置原始数据
|
|
1383
|
-
if (_formDataClone !== null) {
|
|
1384
|
-
o.$form.setRaw(_formDataClone)
|
|
1385
|
-
}
|
|
1386
|
-
|
|
1387
|
-
// 请求成功执行
|
|
1388
|
-
if (await $n_runAsync(o.requestSuccess)(Object.assign({ next }, resultData)) === false) {
|
|
1389
|
-
return
|
|
1390
|
-
}
|
|
1391
|
-
|
|
1392
|
-
// 下一步
|
|
1393
|
-
next()
|
|
1394
|
-
|
|
1395
|
-
} else {
|
|
1396
|
-
// 请求失败执行
|
|
1397
|
-
$n_run(o.requestFail)(resultData)
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
|
|
1401
|
-
nextBefore()
|
|
1402
|
-
.finally()
|
|
1403
|
-
}
|
|
1404
|
-
}
|
|
1405
|
-
|
|
1406
|
-
/**
|
|
1407
|
-
* 获取路由页面的角色权限
|
|
1408
|
-
*/
|
|
1409
|
-
function getPageData($route) {
|
|
1410
|
-
|
|
1411
|
-
if (! $route) {
|
|
1412
|
-
$route = $n_router.getRoute()
|
|
1413
|
-
}
|
|
1414
|
-
|
|
1415
|
-
const path = $n_get($route, 'path')
|
|
1416
|
-
if (! path) {
|
|
1417
|
-
return $n_fail('路由参数错误')
|
|
1418
|
-
}
|
|
1419
|
-
|
|
1420
|
-
if (! statePower.value.v) {
|
|
1421
|
-
return $n_fail('没有获取到权限数据')
|
|
1422
|
-
}
|
|
1423
|
-
|
|
1424
|
-
// 获取角色数据
|
|
1425
|
-
const { urls, btns } = $n_cloneDeep(statePower.value)
|
|
1426
|
-
if (! $n_has(urls, path)) {
|
|
1427
|
-
return $n_fail('该页面没有权限')
|
|
1428
|
-
}
|
|
1429
|
-
|
|
1430
|
-
return $n_success({
|
|
1431
|
-
page: urls[path],
|
|
1432
|
-
btns: $n_has(btns, path) ? btns[path] : [],
|
|
1433
|
-
})
|
|
1434
|
-
}
|
|
1435
|
-
|
|
1436
|
-
/**
|
|
1437
|
-
* 新窗口
|
|
1438
|
-
*/
|
|
1439
|
-
function routerPush({ path, query, pageTitle, fromPage }) {
|
|
1440
|
-
|
|
1441
|
-
if (! $n_isValidObject(query)) {
|
|
1442
|
-
query = {}
|
|
1443
|
-
}
|
|
1444
|
-
|
|
1445
|
-
// 如果有标题
|
|
1446
|
-
pageTitle = $n_trimString(pageTitle)
|
|
1447
|
-
if (pageTitle) {
|
|
1448
|
-
query.n_page_title = pageTitle
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
// 来源页面
|
|
1452
|
-
if (fromPage) {
|
|
1453
|
-
if (fromPage === true) {
|
|
1454
|
-
fromPage = $n_router.getRoute()
|
|
1455
|
-
}
|
|
1456
|
-
// 来源页面是指定路由的完整路径
|
|
1457
|
-
query.n_from_page = getFromPageFullUrl(fromPage)
|
|
1458
|
-
}
|
|
1459
|
-
|
|
1460
|
-
$n_router.push({
|
|
1461
|
-
path,
|
|
1462
|
-
query,
|
|
1463
|
-
})
|
|
1464
|
-
}
|
|
1465
|
-
|
|
1466
|
-
/**
|
|
1467
|
-
* 权限业务
|
|
1468
|
-
*/
|
|
1469
|
-
const $power = {
|
|
1470
|
-
// 创建权限实例
|
|
1471
|
-
create,
|
|
1472
|
-
// 设置权限数据
|
|
1473
|
-
setData,
|
|
1474
|
-
// 获取权限数据
|
|
1475
|
-
getData,
|
|
1476
|
-
// 获取路由页面的角色权限
|
|
1477
|
-
getPageData,
|
|
1478
|
-
// 格式化权限按钮
|
|
1479
|
-
formatBtns,
|
|
1480
|
-
// 请求
|
|
1481
|
-
request,
|
|
1482
|
-
// 新窗口
|
|
1483
|
-
routerPush,
|
|
1484
|
-
}
|
|
1485
|
-
|
|
1486
|
-
export default $power
|
|
1
|
+
import { provide, inject, ref, computed } from 'vue'
|
|
2
|
+
import { useQuasar } from 'quasar'
|
|
3
|
+
|
|
4
|
+
import $n_has from 'lodash/has'
|
|
5
|
+
import $n_get from 'lodash/get'
|
|
6
|
+
import $n_merge from 'lodash/merge'
|
|
7
|
+
import $n_filter from 'lodash/filter'
|
|
8
|
+
import $n_toLower from 'lodash/toLower'
|
|
9
|
+
import $n_isNumber from 'lodash/isNumber'
|
|
10
|
+
import $n_cloneDeep from 'lodash/cloneDeep'
|
|
11
|
+
import $n_isFunction from 'lodash/isFunction'
|
|
12
|
+
import $n_pick from 'lodash/pick'
|
|
13
|
+
import $n_omit from 'lodash/omit'
|
|
14
|
+
|
|
15
|
+
import $n_router from '@netang/utils/vue/router'
|
|
16
|
+
|
|
17
|
+
import $n_isValidArray from '@netang/utils/isValidArray'
|
|
18
|
+
import $n_isValidObject from '@netang/utils/isValidObject'
|
|
19
|
+
import $n_isValidString from '@netang/utils/isValidString'
|
|
20
|
+
import $n_isRequired from '@netang/utils/isRequired'
|
|
21
|
+
import $n_isNumeric from '@netang/utils/isNumeric'
|
|
22
|
+
import $n_forEach from '@netang/utils/forEach'
|
|
23
|
+
import $n_forIn from '@netang/utils/forIn'
|
|
24
|
+
import $n_slash from '@netang/utils/slash'
|
|
25
|
+
import $n_json from '@netang/utils/json'
|
|
26
|
+
import $n_join from '@netang/utils/join'
|
|
27
|
+
import $n_fail from '@netang/utils/fail'
|
|
28
|
+
import $n_success from '@netang/utils/success'
|
|
29
|
+
import $n_split from '@netang/utils/split'
|
|
30
|
+
import $n_trimString from '@netang/utils/trimString'
|
|
31
|
+
import $n_numberDeep from '@netang/utils/numberDeep'
|
|
32
|
+
import $n_indexOf from '@netang/utils/indexOf'
|
|
33
|
+
import $n_runAsync from '@netang/utils/runAsync'
|
|
34
|
+
import $n_run from '@netang/utils/run'
|
|
35
|
+
import $n_http from '@netang/utils/http'
|
|
36
|
+
|
|
37
|
+
import { statePower } from '../store'
|
|
38
|
+
import { NRenderKey, NPowerKey, NDialogKey, NFormKey, NTableKey } from './symbols'
|
|
39
|
+
|
|
40
|
+
import $n_getData from './getData'
|
|
41
|
+
import $n_toast from './toast'
|
|
42
|
+
import $n_confirm from './confirm'
|
|
43
|
+
import $n_bus from './bus'
|
|
44
|
+
|
|
45
|
+
import $n_config from './config'
|
|
46
|
+
|
|
47
|
+
import { configs } from './config'
|
|
48
|
+
|
|
49
|
+
const {
|
|
50
|
+
// 字典常量
|
|
51
|
+
dicts,
|
|
52
|
+
} = configs
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 获取来源页面完整地址
|
|
56
|
+
*/
|
|
57
|
+
function getFromPageFullUrl({ path, query }) {
|
|
58
|
+
|
|
59
|
+
const {
|
|
60
|
+
fullPath
|
|
61
|
+
} = $n_router.resolve({
|
|
62
|
+
path,
|
|
63
|
+
query: $n_omit(query, ['n_page_title', 'n_from_page']),
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return encodeURIComponent(fullPath)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 创建权限实例
|
|
71
|
+
*/
|
|
72
|
+
function create(options) {
|
|
73
|
+
|
|
74
|
+
// 获取参数
|
|
75
|
+
const o = Object.assign({
|
|
76
|
+
// 路由路径
|
|
77
|
+
path: '',
|
|
78
|
+
// 路由参数
|
|
79
|
+
query: {},
|
|
80
|
+
// 是否加载页面
|
|
81
|
+
pageLoading: false,
|
|
82
|
+
// 页面状态
|
|
83
|
+
pageStatus: null,
|
|
84
|
+
// 空状态描述
|
|
85
|
+
emptyDescription: '',
|
|
86
|
+
// 是否开启权限
|
|
87
|
+
power: true,
|
|
88
|
+
// 是否显示权限按钮
|
|
89
|
+
showPowerBtns: true,
|
|
90
|
+
// 是否显示工具栏权限按钮
|
|
91
|
+
showToolbarPowerBtns: true,
|
|
92
|
+
// 格式化权限按钮
|
|
93
|
+
formatPowerBtns: null,
|
|
94
|
+
// 左边侧滑菜单图标
|
|
95
|
+
leftDrawerIcon: 'format_list_bulleted',
|
|
96
|
+
// 右边侧滑菜单图标
|
|
97
|
+
rightDrawerIcon: 'search',
|
|
98
|
+
// 请求上传网络外链
|
|
99
|
+
requestUploadNet: null,
|
|
100
|
+
// 请求前执行
|
|
101
|
+
requestBefore: null,
|
|
102
|
+
// 请求成功执行
|
|
103
|
+
requestSuccess: null,
|
|
104
|
+
// 请求失败执行
|
|
105
|
+
requestFail: null,
|
|
106
|
+
// 请求后执行
|
|
107
|
+
requestAfter: null,
|
|
108
|
+
}, options)
|
|
109
|
+
|
|
110
|
+
// 获取对话框渲染注入
|
|
111
|
+
const $dialog = $n_has(options, '$dialog') ? options.$dialog : inject(NDialogKey)
|
|
112
|
+
const hasDialog = !! $dialog
|
|
113
|
+
|
|
114
|
+
// 获取渲染注入
|
|
115
|
+
const $render = $n_has(options, '$render') ? options.$render : inject(NRenderKey)
|
|
116
|
+
const hasRender = !! $render
|
|
117
|
+
|
|
118
|
+
// 如果有对话框注入
|
|
119
|
+
if (hasDialog) {
|
|
120
|
+
const {
|
|
121
|
+
dialogProps,
|
|
122
|
+
} = $dialog
|
|
123
|
+
|
|
124
|
+
// 合并权限参数
|
|
125
|
+
Object.assign(o, $n_pick(dialogProps, [ 'path', 'query' ]))
|
|
126
|
+
|
|
127
|
+
// 合并权限参数
|
|
128
|
+
if ($n_has($dialog, 'props.powerProps') && $n_isValidObject($dialog.props.powerProps)) {
|
|
129
|
+
$n_merge(o, $dialog.props.powerProps)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 如果有渲染注入
|
|
134
|
+
if (hasRender) {
|
|
135
|
+
// 如果有权限传参, 则合并参数
|
|
136
|
+
const powerProps = $n_get($render, 'props.powerProps')
|
|
137
|
+
if ($n_isValidObject(powerProps)) {
|
|
138
|
+
$n_merge(o, powerProps)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// 获取当前路由
|
|
143
|
+
const $currentRoute = $n_router.getRoute()
|
|
144
|
+
|
|
145
|
+
// 权限路由
|
|
146
|
+
let $route
|
|
147
|
+
|
|
148
|
+
// 自定义参数
|
|
149
|
+
const optionsQuery = $n_isValidObject(o.query) ? o.query : {}
|
|
150
|
+
|
|
151
|
+
// 如果没有路由
|
|
152
|
+
if (o.path === false) {
|
|
153
|
+
|
|
154
|
+
// 设为空路由
|
|
155
|
+
$route = {
|
|
156
|
+
fullPath: '',
|
|
157
|
+
path: '',
|
|
158
|
+
query: optionsQuery,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// 如果有自定义路径
|
|
162
|
+
} else if ($n_isValidString(o.path)) {
|
|
163
|
+
|
|
164
|
+
// 获取自定义路由
|
|
165
|
+
$route = $n_router.resolve({
|
|
166
|
+
path: o.path,
|
|
167
|
+
query: optionsQuery,
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
} else {
|
|
171
|
+
|
|
172
|
+
// 如果在渲染组件内 && 该渲染组件有自定义路由
|
|
173
|
+
$route = hasRender && $n_has($render, 'getRoute')
|
|
174
|
+
// 设为渲染组件的路由
|
|
175
|
+
? $render.getRoute()
|
|
176
|
+
// 否则获取当前路由
|
|
177
|
+
: $currentRoute
|
|
178
|
+
Object.assign($route.query, optionsQuery)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// quasar 对象
|
|
182
|
+
const $q = useQuasar()
|
|
183
|
+
|
|
184
|
+
// 表格已选数据
|
|
185
|
+
const tableSelected = ref([])
|
|
186
|
+
|
|
187
|
+
// 是否显示左边侧滑菜单
|
|
188
|
+
const leftDrawerModelValue = ref(null)
|
|
189
|
+
|
|
190
|
+
// 是否显示右边侧滑菜单
|
|
191
|
+
const rightDrawerModelValue = ref(null)
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* 检查是否上传中
|
|
195
|
+
*/
|
|
196
|
+
function checkUploading() {
|
|
197
|
+
for (const uploader of data.uploader) {
|
|
198
|
+
// 检查是否上传中
|
|
199
|
+
if (uploader.checkUploading()) {
|
|
200
|
+
return true
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return false
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* 上传网络外链
|
|
208
|
+
*/
|
|
209
|
+
async function uploadNet(callback) {
|
|
210
|
+
|
|
211
|
+
// 是否全部完成
|
|
212
|
+
let isFinish = false
|
|
213
|
+
|
|
214
|
+
// 回调
|
|
215
|
+
function cb() {
|
|
216
|
+
|
|
217
|
+
// 如果没有回调方法
|
|
218
|
+
if (! $n_isFunction(callback)) {
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// 是否上传中
|
|
223
|
+
const uploading = checkUploading()
|
|
224
|
+
|
|
225
|
+
// 如果全部完成
|
|
226
|
+
if (isFinish) {
|
|
227
|
+
// 则无任何操作
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// let loaded = 0
|
|
232
|
+
// let total = 0
|
|
233
|
+
// let progress = 0
|
|
234
|
+
|
|
235
|
+
if (
|
|
236
|
+
// 上传完成
|
|
237
|
+
! uploading
|
|
238
|
+
// 未完成
|
|
239
|
+
&& ! isFinish
|
|
240
|
+
) {
|
|
241
|
+
// 全部完成
|
|
242
|
+
isFinish = true
|
|
243
|
+
// 进度
|
|
244
|
+
// progress = 100
|
|
245
|
+
|
|
246
|
+
}
|
|
247
|
+
// else {
|
|
248
|
+
// for (const uploader of data.uploader) {
|
|
249
|
+
// const p = uploader.getUploadNetProgress()
|
|
250
|
+
// loaded += p.loaded
|
|
251
|
+
// total += p.total
|
|
252
|
+
// }
|
|
253
|
+
// progress = Math.round(loaded * 100 / total)
|
|
254
|
+
// }
|
|
255
|
+
|
|
256
|
+
// 回调
|
|
257
|
+
callback({
|
|
258
|
+
uploading,
|
|
259
|
+
uploader: data.uploader,
|
|
260
|
+
// loaded,
|
|
261
|
+
// total,
|
|
262
|
+
// progress,
|
|
263
|
+
})
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
for (const uploader of data.uploader) {
|
|
267
|
+
// 初始化上传网络外链列表
|
|
268
|
+
uploader.initUploadNetLists(cb)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
for (const uploader of data.uploader) {
|
|
272
|
+
// 上传网络外链文件
|
|
273
|
+
await uploader.uploadNet()
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 执行回调
|
|
277
|
+
cb()
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const _data = {
|
|
281
|
+
// 表格实例
|
|
282
|
+
$table: null,
|
|
283
|
+
// 表单实例
|
|
284
|
+
$form: null,
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// 注入数据
|
|
288
|
+
const data = {
|
|
289
|
+
// 页面加载
|
|
290
|
+
pageLoading: ref(o.pageLoading),
|
|
291
|
+
// 页面状态
|
|
292
|
+
pageStatus: ref(o.pageStatus),
|
|
293
|
+
// 空状态描述
|
|
294
|
+
emptyDescription: ref(o.emptyDescription),
|
|
295
|
+
|
|
296
|
+
// 当前路由全路径
|
|
297
|
+
routeFullPath: $route.fullPath,
|
|
298
|
+
// 当前路由路径
|
|
299
|
+
routePath: $route.path,
|
|
300
|
+
// 当前路由参数
|
|
301
|
+
routeQuery: $route.query,
|
|
302
|
+
// 获取当前路由
|
|
303
|
+
getRoute() {
|
|
304
|
+
return $route
|
|
305
|
+
},
|
|
306
|
+
// 格式化权限按钮
|
|
307
|
+
formatPowerBtns: o.formatPowerBtns,
|
|
308
|
+
|
|
309
|
+
// 左边侧滑菜单数据
|
|
310
|
+
leftDrawer: {
|
|
311
|
+
// 图标
|
|
312
|
+
icon: o.leftDrawerIcon,
|
|
313
|
+
// 是否显示
|
|
314
|
+
modelValue: leftDrawerModelValue,
|
|
315
|
+
// 是否显示切换按钮
|
|
316
|
+
showButton() {
|
|
317
|
+
return leftDrawerModelValue.value !== null
|
|
318
|
+
},
|
|
319
|
+
// 切换
|
|
320
|
+
toggle() {
|
|
321
|
+
if (leftDrawerModelValue.value !== null) {
|
|
322
|
+
leftDrawerModelValue.value = ! leftDrawerModelValue.value
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
// 右边侧滑菜单数据
|
|
327
|
+
rightDrawer: {
|
|
328
|
+
// 图标
|
|
329
|
+
icon: o.rightDrawerIcon,
|
|
330
|
+
// 是否显示
|
|
331
|
+
modelValue: rightDrawerModelValue,
|
|
332
|
+
// 是否显示切换按钮
|
|
333
|
+
showButton() {
|
|
334
|
+
return rightDrawerModelValue.value !== null
|
|
335
|
+
},
|
|
336
|
+
// 切换
|
|
337
|
+
toggle() {
|
|
338
|
+
if (rightDrawerModelValue.value !== null) {
|
|
339
|
+
rightDrawerModelValue.value = ! rightDrawerModelValue.value
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
// 表格已选数据
|
|
344
|
+
tableSelected,
|
|
345
|
+
// 上传器
|
|
346
|
+
uploader: [],
|
|
347
|
+
// 检查是否上传中
|
|
348
|
+
checkUploading,
|
|
349
|
+
// 上传网络外链
|
|
350
|
+
uploadNet,
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// 如果是权限页面
|
|
354
|
+
if (o.power) {
|
|
355
|
+
|
|
356
|
+
// 获取当前页面角色权限
|
|
357
|
+
const { status, data: res } = getPageData($route)
|
|
358
|
+
if (! status) {
|
|
359
|
+
o.pageStatus = false
|
|
360
|
+
o.emptyDescription = res.msg
|
|
361
|
+
o.power = false
|
|
362
|
+
|
|
363
|
+
} else {
|
|
364
|
+
// 当前页面权限
|
|
365
|
+
data.powerPage = res.page
|
|
366
|
+
// 当前页面权限按钮
|
|
367
|
+
data.powerBtns = ref(o.showPowerBtns ? res.btns.map(e => { e.loading = false; return e }) : [])
|
|
368
|
+
// 当前页面工具栏权限按钮
|
|
369
|
+
data.toolbarPowerBtns = computed(function() {
|
|
370
|
+
|
|
371
|
+
if (
|
|
372
|
+
// 如果显示工具栏权限按钮
|
|
373
|
+
o.showToolbarPowerBtns
|
|
374
|
+
// 有权限按钮数据
|
|
375
|
+
&& $n_isValidArray(data.powerBtns.value)
|
|
376
|
+
) {
|
|
377
|
+
const lists = []
|
|
378
|
+
|
|
379
|
+
// 格式化权限按钮列表
|
|
380
|
+
$n_forEach($n_filter(formatBtns(data.powerBtns.value), e => e.type > 2), function(item) {
|
|
381
|
+
|
|
382
|
+
if (! item.hidden) {
|
|
383
|
+
|
|
384
|
+
// 如果是单条数据显示
|
|
385
|
+
const isSingle = item.show === 'single'
|
|
386
|
+
|
|
387
|
+
// 如果是单条 || 多条显示
|
|
388
|
+
if (isSingle || item.show === 'multiple') {
|
|
389
|
+
|
|
390
|
+
// 初始为不显示
|
|
391
|
+
item.show = false
|
|
392
|
+
|
|
393
|
+
// 如果有表格选中数据
|
|
394
|
+
if ($n_isValidArray(data.tableSelected.value)) {
|
|
395
|
+
// 如果是单个显示
|
|
396
|
+
if (isSingle) {
|
|
397
|
+
item.show = data.tableSelected.value.length === 1
|
|
398
|
+
|
|
399
|
+
// 否则是多个显示
|
|
400
|
+
} else {
|
|
401
|
+
item.show = data.tableSelected.value.length >= 1
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// 如果是手机模式
|
|
407
|
+
if ($q.platform.is.mobile) {
|
|
408
|
+
item.icon = undefined
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
if (
|
|
413
|
+
// 如果有格式化权限按钮方法
|
|
414
|
+
$n_isFunction(o.formatPowerBtns)
|
|
415
|
+
&& o.formatPowerBtns(item, false, tableSelected.value) === false
|
|
416
|
+
) {
|
|
417
|
+
return
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
lists.push(item)
|
|
421
|
+
})
|
|
422
|
+
|
|
423
|
+
return lists
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
return []
|
|
427
|
+
})
|
|
428
|
+
|
|
429
|
+
// 权限按钮点击
|
|
430
|
+
data.powerBtnClick = async function (powerBtn, tableSelected) {
|
|
431
|
+
|
|
432
|
+
async function next() {
|
|
433
|
+
|
|
434
|
+
// 权限请求
|
|
435
|
+
await request({
|
|
436
|
+
// power
|
|
437
|
+
$power: data,
|
|
438
|
+
// 按钮数据
|
|
439
|
+
powerBtn,
|
|
440
|
+
// 权限路由参数
|
|
441
|
+
$route,
|
|
442
|
+
// 当前路由参数
|
|
443
|
+
$currentRoute,
|
|
444
|
+
// 表格选中数据
|
|
445
|
+
tableSelected,
|
|
446
|
+
// 表格实例
|
|
447
|
+
$table: _data.$table,
|
|
448
|
+
// 表单实例
|
|
449
|
+
$form: _data.$form,
|
|
450
|
+
// 检查是否正在上传文件
|
|
451
|
+
checkUploading,
|
|
452
|
+
// 加载中
|
|
453
|
+
loading(status) {
|
|
454
|
+
powerBtn.loading = status
|
|
455
|
+
},
|
|
456
|
+
// 上传网络外链
|
|
457
|
+
uploadNet,
|
|
458
|
+
// 请求上传网络外链
|
|
459
|
+
requestUploadNet: o.requestUploadNet,
|
|
460
|
+
// 请求前执行
|
|
461
|
+
requestBefore: o.requestBefore,
|
|
462
|
+
// 请求成功执行
|
|
463
|
+
requestSuccess: o.requestSuccess,
|
|
464
|
+
// 请求失败执行
|
|
465
|
+
requestFail: o.requestFail,
|
|
466
|
+
// 请求后执行
|
|
467
|
+
requestAfter: o.requestAfter,
|
|
468
|
+
})
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// 如果权限按钮有自定义 click 事件
|
|
472
|
+
if (
|
|
473
|
+
$n_has(powerBtn, 'click')
|
|
474
|
+
&& $n_isFunction(powerBtn.click)
|
|
475
|
+
&& await $n_runAsync(powerBtn.click)({ powerBtn, tableSelected, next }) === false
|
|
476
|
+
) {
|
|
477
|
+
return
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
await next()
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// 如果没有开启权限
|
|
486
|
+
if (! o.power) {
|
|
487
|
+
// 当前页面权限
|
|
488
|
+
data.powerPage = {}
|
|
489
|
+
// 当前页面权限按钮
|
|
490
|
+
data.powerBtns = ref([])
|
|
491
|
+
// 当前页面工具栏权限按钮
|
|
492
|
+
data.toolbarPowerBtns = ref([])
|
|
493
|
+
// 权限按钮点击
|
|
494
|
+
data.powerBtnClick = ()=>{}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// 更新数据
|
|
498
|
+
data.update = function(cb) {
|
|
499
|
+
cb(data, _data)
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// 提供可以被后代组件注入的值
|
|
503
|
+
provide(NPowerKey, data)
|
|
504
|
+
|
|
505
|
+
return data
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* 设置权限数据
|
|
510
|
+
*/
|
|
511
|
+
function setData(data) {
|
|
512
|
+
|
|
513
|
+
// 如果没有角色数据
|
|
514
|
+
if (! $n_isValidObject(data)) {
|
|
515
|
+
return
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
const {
|
|
519
|
+
rows,
|
|
520
|
+
v,
|
|
521
|
+
} = data
|
|
522
|
+
|
|
523
|
+
if (! $n_isValidArray(rows) || ! v) {
|
|
524
|
+
return
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// all id
|
|
528
|
+
const all = {}
|
|
529
|
+
// 页面
|
|
530
|
+
const urls = {}
|
|
531
|
+
// 按钮
|
|
532
|
+
const btns = {}
|
|
533
|
+
// 菜单
|
|
534
|
+
const menus = []
|
|
535
|
+
|
|
536
|
+
for (const item of rows) {
|
|
537
|
+
|
|
538
|
+
// 【格式化 start】
|
|
539
|
+
// --------------------------------------------------
|
|
540
|
+
if (item.data) {
|
|
541
|
+
item.data = $n_json.parse(item.data)
|
|
542
|
+
}
|
|
543
|
+
item.data = $n_isValidObject(item.data) ? $n_numberDeep(item.data) : {}
|
|
544
|
+
|
|
545
|
+
// 设置数据类型
|
|
546
|
+
item.data.type = item.data_type
|
|
547
|
+
delete item.data_type
|
|
548
|
+
|
|
549
|
+
// 标识
|
|
550
|
+
item.name = ''
|
|
551
|
+
|
|
552
|
+
// 如果有 url
|
|
553
|
+
if ($n_isValidString(item.url)) {
|
|
554
|
+
|
|
555
|
+
// url 首位加上反斜杠
|
|
556
|
+
item.url = $n_slash($n_toLower($n_trimString(item.url)), 'start', true)
|
|
557
|
+
if (item.url) {
|
|
558
|
+
|
|
559
|
+
item.data.url = item.url
|
|
560
|
+
|
|
561
|
+
// 截取最后一个反斜杠
|
|
562
|
+
const lastIndex = item.data.url.lastIndexOf('/')
|
|
563
|
+
if (lastIndex > -1) {
|
|
564
|
+
item.name = item.data.url.substring(lastIndex + 1)
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
} else {
|
|
568
|
+
item.url = ''
|
|
569
|
+
item.data.url = ''
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
} else {
|
|
573
|
+
item.url = ''
|
|
574
|
+
item.data.url = ''
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// 菜单
|
|
578
|
+
if (item.type === 1) {
|
|
579
|
+
menus.push(item)
|
|
580
|
+
|
|
581
|
+
// 按钮
|
|
582
|
+
} else if (item.type > 2) {
|
|
583
|
+
|
|
584
|
+
// 按钮类型
|
|
585
|
+
switch (item.type) {
|
|
586
|
+
|
|
587
|
+
// 默认按钮
|
|
588
|
+
case 11:
|
|
589
|
+
item.color = 'default'
|
|
590
|
+
break;
|
|
591
|
+
|
|
592
|
+
// 主要按钮
|
|
593
|
+
case 12:
|
|
594
|
+
item.color = 'primary'
|
|
595
|
+
break;
|
|
596
|
+
|
|
597
|
+
// 成功按钮
|
|
598
|
+
case 13:
|
|
599
|
+
item.color = 'secondary'
|
|
600
|
+
break;
|
|
601
|
+
|
|
602
|
+
// 信息按钮
|
|
603
|
+
case 14:
|
|
604
|
+
item.color = 'info'
|
|
605
|
+
break;
|
|
606
|
+
|
|
607
|
+
// 警告按钮
|
|
608
|
+
case 15:
|
|
609
|
+
item.color = 'warning'
|
|
610
|
+
break;
|
|
611
|
+
|
|
612
|
+
// 危险按钮
|
|
613
|
+
case 16:
|
|
614
|
+
item.color = 'negative'
|
|
615
|
+
break;
|
|
616
|
+
|
|
617
|
+
// 隐藏按钮
|
|
618
|
+
case 20:
|
|
619
|
+
item.hidden = true
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
// 【格式化 end】
|
|
624
|
+
// --------------------------------------------------
|
|
625
|
+
|
|
626
|
+
// url
|
|
627
|
+
if (item.url) {
|
|
628
|
+
// 添加至 all
|
|
629
|
+
all[item.id] = item
|
|
630
|
+
// 添加至页面
|
|
631
|
+
urls[item.url] = item
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
for (const item of rows) {
|
|
636
|
+
|
|
637
|
+
// 如果有跳转页面
|
|
638
|
+
if ($n_has(item.data, 'toPage')) {
|
|
639
|
+
// 设置跳转页面地址
|
|
640
|
+
item.data.toPage = $n_has(all, item.data.toPage) ? all[item.data.toPage].data.url : null
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// 如果有请求成功执行类型
|
|
644
|
+
// else if ($n_has(item.data, 'requestSuccess.type')) {
|
|
645
|
+
// // 如果请求成功执行类型是关闭窗口、跳转并刷新页面
|
|
646
|
+
// if (item.data.requestSuccess.type === 'closePushRefresh') {
|
|
647
|
+
// // 设置刷新页面地址
|
|
648
|
+
// item.data.requestSuccess.params =
|
|
649
|
+
// (
|
|
650
|
+
// // 如果有刷新页面的参数 id
|
|
651
|
+
// $n_has(item.data.requestSuccess, 'params')
|
|
652
|
+
// // 如果有页面数据
|
|
653
|
+
// && $n_has(all, item.data.requestSuccess.params)
|
|
654
|
+
// ) ? all[item.data.requestSuccess.params].data.url : null
|
|
655
|
+
// }
|
|
656
|
+
// }
|
|
657
|
+
|
|
658
|
+
if (
|
|
659
|
+
// 数据/按钮
|
|
660
|
+
item.type > 1
|
|
661
|
+
// 有父级数据
|
|
662
|
+
&& $n_has(all, item.pid)
|
|
663
|
+
) {
|
|
664
|
+
const pItem = all[item.pid]
|
|
665
|
+
if ($n_has(btns, pItem.url)) {
|
|
666
|
+
btns[pItem.url].push(item)
|
|
667
|
+
} else {
|
|
668
|
+
btns[pItem.url] = [item]
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
// 保存至权限状态中
|
|
674
|
+
statePower.value = {
|
|
675
|
+
// 角色权限版本
|
|
676
|
+
v,
|
|
677
|
+
// all id
|
|
678
|
+
all,
|
|
679
|
+
// 页面
|
|
680
|
+
urls,
|
|
681
|
+
// 按钮
|
|
682
|
+
btns,
|
|
683
|
+
// 菜单
|
|
684
|
+
menus,
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* 获取权限
|
|
690
|
+
*/
|
|
691
|
+
async function getData() {
|
|
692
|
+
|
|
693
|
+
// 如果没有权限数据
|
|
694
|
+
if (! statePower.value.v) {
|
|
695
|
+
|
|
696
|
+
// 获取权限数据
|
|
697
|
+
const res = await $n_getData($n_config('apiDataPowerName'))
|
|
698
|
+
if (res === false) {
|
|
699
|
+
statePower.value = {
|
|
700
|
+
// 权限版本
|
|
701
|
+
v: null,
|
|
702
|
+
// all id
|
|
703
|
+
all: {},
|
|
704
|
+
// 页面
|
|
705
|
+
urls: {},
|
|
706
|
+
// 按钮
|
|
707
|
+
btns: {},
|
|
708
|
+
// 菜单
|
|
709
|
+
menus: [],
|
|
710
|
+
}
|
|
711
|
+
return $n_fail()
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// 如果有权限状态数据, 则直接返回
|
|
716
|
+
if (statePower.value.v) {
|
|
717
|
+
return $n_success($n_cloneDeep(statePower.value))
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
return $n_fail()
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* 解析传参
|
|
725
|
+
*/
|
|
726
|
+
function parseQuery(data, settings) {
|
|
727
|
+
|
|
728
|
+
// 如果配置是字符串
|
|
729
|
+
if ($n_isValidString(settings)) {
|
|
730
|
+
|
|
731
|
+
// 如果返回所有传参
|
|
732
|
+
if (settings === 'all') {
|
|
733
|
+
return $n_isValidObject(data) ? data : {}
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// 将字符串放到数组中
|
|
737
|
+
settings = [settings]
|
|
738
|
+
|
|
739
|
+
// 如果配置是对象
|
|
740
|
+
} else if ($n_isValidObject(settings)) {
|
|
741
|
+
settings = [settings]
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
const query = {}
|
|
745
|
+
|
|
746
|
+
// 如果配置是数组
|
|
747
|
+
if ($n_isValidArray(settings)) {
|
|
748
|
+
|
|
749
|
+
// 别名
|
|
750
|
+
const alias = {}
|
|
751
|
+
|
|
752
|
+
for (let item of settings) {
|
|
753
|
+
// 如果是需要的字段
|
|
754
|
+
if ($n_isValidString(item)) {
|
|
755
|
+
|
|
756
|
+
// 将字段转小写
|
|
757
|
+
item = $n_toLower($n_trimString(item))
|
|
758
|
+
|
|
759
|
+
// 判断字段是否有 as 别名
|
|
760
|
+
const arr = $n_split(item, ' as ')
|
|
761
|
+
|
|
762
|
+
// 如果有别名
|
|
763
|
+
if (arr.length === 2) {
|
|
764
|
+
alias[$n_trimString(arr[0])] = $n_trimString(arr[1])
|
|
765
|
+
|
|
766
|
+
// 否则别名就是当前字段本身
|
|
767
|
+
} else {
|
|
768
|
+
alias[item] = item
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// 否则如果是自定义传参
|
|
772
|
+
} else if ($n_isValidObject(item)) {
|
|
773
|
+
Object.assign(query, item)
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
if (
|
|
778
|
+
// 如果有参数数据
|
|
779
|
+
$n_isValidObject(data)
|
|
780
|
+
// 如果有定义别名
|
|
781
|
+
&& $n_isValidObject(alias)
|
|
782
|
+
) {
|
|
783
|
+
$n_forIn(data, function(value, key) {
|
|
784
|
+
|
|
785
|
+
// 如果当前字段在别名中
|
|
786
|
+
if ($n_has(alias, key)) {
|
|
787
|
+
query[alias[key]] = value
|
|
788
|
+
}
|
|
789
|
+
})
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
return query
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/**
|
|
797
|
+
* 格式化权限按钮
|
|
798
|
+
*/
|
|
799
|
+
function formatBtns(powerBtns, filterBtns, toObject = false) {
|
|
800
|
+
|
|
801
|
+
const newLists = []
|
|
802
|
+
|
|
803
|
+
$n_forEach(powerBtns, function(item) {
|
|
804
|
+
|
|
805
|
+
item = $n_cloneDeep(item)
|
|
806
|
+
|
|
807
|
+
const {
|
|
808
|
+
name,
|
|
809
|
+
icon,
|
|
810
|
+
} = item
|
|
811
|
+
|
|
812
|
+
Object.assign(item, {
|
|
813
|
+
// 图标
|
|
814
|
+
icon: icon || undefined,
|
|
815
|
+
// 隐藏按钮
|
|
816
|
+
hidden: $n_get(item, 'hidden') === true,
|
|
817
|
+
// 显示按钮类型
|
|
818
|
+
show: $n_has(item, 'data.show') ? item.data.show : true,
|
|
819
|
+
})
|
|
820
|
+
|
|
821
|
+
// 是否固定按钮
|
|
822
|
+
item.fixed =
|
|
823
|
+
// 非隐藏按钮
|
|
824
|
+
! item.hidden
|
|
825
|
+
// 固定列
|
|
826
|
+
&& $n_get(item, 'data.fixed') === true
|
|
827
|
+
// 单个按钮
|
|
828
|
+
&& item.show === 'single'
|
|
829
|
+
// 按钮有图标
|
|
830
|
+
&& !! item.icon
|
|
831
|
+
|
|
832
|
+
// 如果是对象
|
|
833
|
+
if ($n_isValidObject(filterBtns)) {
|
|
834
|
+
if ($n_has(filterBtns, name)) {
|
|
835
|
+
newLists.push($n_merge(item, filterBtns[name]))
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// 如果是数组
|
|
839
|
+
} else if ($n_isValidArray(filterBtns)) {
|
|
840
|
+
if ($n_indexOf(filterBtns, name) > -1) {
|
|
841
|
+
newLists.push($n_merge(item, filterBtns[name]))
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
} else {
|
|
845
|
+
newLists.push(item)
|
|
846
|
+
}
|
|
847
|
+
})
|
|
848
|
+
|
|
849
|
+
// 转数组
|
|
850
|
+
if (toObject) {
|
|
851
|
+
const obj = {}
|
|
852
|
+
for (const item of newLists) {
|
|
853
|
+
obj[item.name] = item
|
|
854
|
+
}
|
|
855
|
+
return obj
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
return newLists
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/**
|
|
862
|
+
* 获取请求传参
|
|
863
|
+
*/
|
|
864
|
+
function getRequestQuery(o) {
|
|
865
|
+
|
|
866
|
+
// 传参
|
|
867
|
+
const query = {}
|
|
868
|
+
|
|
869
|
+
// 如果有请求传参的传参设置
|
|
870
|
+
if ($n_has(o.powerBtn.data, 'requestQuery.query')) {
|
|
871
|
+
const resQuery = parseQuery(o.query, o.powerBtn.data.requestQuery.query)
|
|
872
|
+
if ($n_isValidObject(resQuery)) {
|
|
873
|
+
Object.assign(query, resQuery)
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// 获取列表数据
|
|
878
|
+
if (
|
|
879
|
+
// 如果按钮参数有显示类型
|
|
880
|
+
// $n_has(o.powerBtn.data, 'show')
|
|
881
|
+
// 按钮参数的显示类型必须是单选或多选
|
|
882
|
+
// && $n_indexOf(['single', 'multiple'], o.powerBtn.data.show) > -1
|
|
883
|
+
// 如果有请求传参的列表设置
|
|
884
|
+
$n_has(o.powerBtn.data, 'requestQuery.list')
|
|
885
|
+
// 如果有表格数据
|
|
886
|
+
&& $n_isValidArray(o.tableSelected)
|
|
887
|
+
) {
|
|
888
|
+
let newQuery = {}
|
|
889
|
+
|
|
890
|
+
// 如果是单选
|
|
891
|
+
if ($n_get(o.powerBtn.data, 'show') === 'single') {
|
|
892
|
+
// 取表格选中第一条数据
|
|
893
|
+
newQuery = o.tableSelected[0]
|
|
894
|
+
|
|
895
|
+
// 否则是多选
|
|
896
|
+
} else {
|
|
897
|
+
// 合并表格选中的每一条数据
|
|
898
|
+
for (const item of o.tableSelected) {
|
|
899
|
+
$n_forIn(item, function(value, key) {
|
|
900
|
+
if ($n_has(newQuery, key)) {
|
|
901
|
+
newQuery[key].push(value)
|
|
902
|
+
} else {
|
|
903
|
+
newQuery[key] = [value]
|
|
904
|
+
}
|
|
905
|
+
})
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
const resTable = parseQuery(newQuery, o.powerBtn.data.requestQuery.list)
|
|
910
|
+
if ($n_isValidObject(resTable)) {
|
|
911
|
+
Object.assign(query, resTable)
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
// 如果有自定义参数
|
|
916
|
+
if (
|
|
917
|
+
$n_has(o.powerBtn.data, 'query')
|
|
918
|
+
&& $n_isValidObject(o.powerBtn.data.query)
|
|
919
|
+
) {
|
|
920
|
+
Object.assign(query, o.powerBtn.data.query)
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
return $n_cloneDeep($n_numberDeep(query))
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* 格式化参数
|
|
928
|
+
*/
|
|
929
|
+
function formatQuery(query, isJoinArr) {
|
|
930
|
+
|
|
931
|
+
const newQuery = {}
|
|
932
|
+
|
|
933
|
+
// 格式化参数
|
|
934
|
+
$n_forIn(query, function(value, key) {
|
|
935
|
+
|
|
936
|
+
// 如果是数字
|
|
937
|
+
if ($n_isNumeric(value)) {
|
|
938
|
+
newQuery[key] = $n_isNumber(value) ? value : Number(value)
|
|
939
|
+
|
|
940
|
+
// 如果是字符串
|
|
941
|
+
} else if ($n_isValidString(value)) {
|
|
942
|
+
newQuery[key] = $n_trimString(value)
|
|
943
|
+
|
|
944
|
+
// 如果是数组
|
|
945
|
+
} else if ($n_isValidArray(value)) {
|
|
946
|
+
|
|
947
|
+
const arr = []
|
|
948
|
+
for (const val of value) {
|
|
949
|
+
|
|
950
|
+
// 如果为有效值
|
|
951
|
+
if ($n_isRequired(val)) {
|
|
952
|
+
|
|
953
|
+
// 如果是数字
|
|
954
|
+
if ($n_isNumeric(val)) {
|
|
955
|
+
arr.push($n_isNumber(val) ? val : Number(val))
|
|
956
|
+
|
|
957
|
+
// 如果是字符串
|
|
958
|
+
} else if ($n_isValidString(val)) {
|
|
959
|
+
arr.push($n_trimString(val))
|
|
960
|
+
|
|
961
|
+
// 否则为数组或对象
|
|
962
|
+
} else {
|
|
963
|
+
arr.push(val)
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
if (arr.length) {
|
|
968
|
+
newQuery[key] = isJoinArr ? $n_join(arr, ',') : arr
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
})
|
|
972
|
+
|
|
973
|
+
return newQuery
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* 角色请求
|
|
978
|
+
*/
|
|
979
|
+
async function request(options) {
|
|
980
|
+
|
|
981
|
+
// 参数
|
|
982
|
+
const o = Object.assign({
|
|
983
|
+
// 权限按钮数据
|
|
984
|
+
powerBtn: {},
|
|
985
|
+
// 表格选中数据
|
|
986
|
+
tableSelected: [],
|
|
987
|
+
// 检查是否正在上传文件
|
|
988
|
+
checkUploading: null,
|
|
989
|
+
// 加载中
|
|
990
|
+
loading: null,
|
|
991
|
+
// 上传网络外链
|
|
992
|
+
uploadNet: null,
|
|
993
|
+
// 请求上传网络外链
|
|
994
|
+
requestUploadNet: null,
|
|
995
|
+
// 请求前执行
|
|
996
|
+
requestBefore: null,
|
|
997
|
+
// 请求成功执行
|
|
998
|
+
requestSuccess: null,
|
|
999
|
+
// 请求失败执行
|
|
1000
|
+
requestFail: null,
|
|
1001
|
+
// 请求后执行
|
|
1002
|
+
requestAfter: null,
|
|
1003
|
+
}, options)
|
|
1004
|
+
|
|
1005
|
+
const {
|
|
1006
|
+
// 权限路由参数
|
|
1007
|
+
$route,
|
|
1008
|
+
// 当前路由参数
|
|
1009
|
+
$currentRoute,
|
|
1010
|
+
} = options
|
|
1011
|
+
|
|
1012
|
+
o.query = $route.query
|
|
1013
|
+
|
|
1014
|
+
// 判断类型
|
|
1015
|
+
if (! $n_get(o.powerBtn, 'data.type')) {
|
|
1016
|
+
|
|
1017
|
+
// 【调试模式】
|
|
1018
|
+
// --------------------------------------------------
|
|
1019
|
+
// #ifdef IS_DEBUG
|
|
1020
|
+
console.log('没有定义数据类型')
|
|
1021
|
+
// #endif
|
|
1022
|
+
// --------------------------------------------------
|
|
1023
|
+
|
|
1024
|
+
return
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
// 克隆按钮
|
|
1028
|
+
o.powerBtn = $n_cloneDeep(o.powerBtn)
|
|
1029
|
+
|
|
1030
|
+
// 是否为跳转页面
|
|
1031
|
+
let isToPage = false
|
|
1032
|
+
|
|
1033
|
+
// 判断 url
|
|
1034
|
+
o.powerBtn.data.url = $n_toLower($n_trimString(o.powerBtn.data.url))
|
|
1035
|
+
if (! o.powerBtn.data.url) {
|
|
1036
|
+
|
|
1037
|
+
if (
|
|
1038
|
+
// 如果没有跳转页面地址
|
|
1039
|
+
! $n_has(o.powerBtn.data, 'toPage')
|
|
1040
|
+
// 或跳转页面地址为空
|
|
1041
|
+
|| ! $n_isValidString(o.powerBtn.data.toPage)
|
|
1042
|
+
) {
|
|
1043
|
+
// 【调试模式】
|
|
1044
|
+
// --------------------------------------------------
|
|
1045
|
+
// #ifdef IS_DEBUG
|
|
1046
|
+
console.log('没有定义 url')
|
|
1047
|
+
// #endif
|
|
1048
|
+
// --------------------------------------------------
|
|
1049
|
+
|
|
1050
|
+
return
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
// 用跳转页面地址替换 toPage
|
|
1054
|
+
o.powerBtn.data = Object.assign({}, o.powerBtn.data, {
|
|
1055
|
+
url: o.powerBtn.data.toPage,
|
|
1056
|
+
})
|
|
1057
|
+
|
|
1058
|
+
// 设为跳转页面
|
|
1059
|
+
isToPage = true
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// 获取请求参数
|
|
1063
|
+
let query = getRequestQuery(o)
|
|
1064
|
+
|
|
1065
|
+
// 如果是打开新窗口
|
|
1066
|
+
// --------------------------------------------------
|
|
1067
|
+
if (o.powerBtn.data.type === dicts.POWER_DATA_TYPE__OPEN) {
|
|
1068
|
+
|
|
1069
|
+
query = formatQuery(query, true)
|
|
1070
|
+
|
|
1071
|
+
// 如果按钮有标题
|
|
1072
|
+
const pageTitle = $n_trimString(o.powerBtn.title)
|
|
1073
|
+
if (pageTitle) {
|
|
1074
|
+
query.n_page_title = pageTitle
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
// 如果不是禁止添加来源页面参数
|
|
1078
|
+
if ($n_get(o.powerBtn.data, 'noFromPageQuery') !== true) {
|
|
1079
|
+
|
|
1080
|
+
// 来源页面是当前路由的完整路径
|
|
1081
|
+
query.n_from_page = getFromPageFullUrl($currentRoute)
|
|
1082
|
+
|
|
1083
|
+
// 如果是跳转页面
|
|
1084
|
+
if (isToPage) {
|
|
1085
|
+
query.n_to_page = 1
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
// 请求前执行
|
|
1090
|
+
const resBefore = await $n_runAsync(o.requestBefore)({
|
|
1091
|
+
options: o,
|
|
1092
|
+
requestData: query,
|
|
1093
|
+
next: nextBefore,
|
|
1094
|
+
})
|
|
1095
|
+
if (resBefore !== void 0) {
|
|
1096
|
+
if (resBefore === false) {
|
|
1097
|
+
return
|
|
1098
|
+
}
|
|
1099
|
+
query = resBefore
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
function nextBefore() {
|
|
1103
|
+
$n_router.push({
|
|
1104
|
+
path: o.powerBtn.data.url,
|
|
1105
|
+
query,
|
|
1106
|
+
})
|
|
1107
|
+
}
|
|
1108
|
+
nextBefore()
|
|
1109
|
+
return
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
// 请求数据
|
|
1113
|
+
let requestData = {}
|
|
1114
|
+
// 请求之前数据
|
|
1115
|
+
let _formDataClone = null
|
|
1116
|
+
|
|
1117
|
+
// 如果是提交表单
|
|
1118
|
+
// --------------------------------------------------
|
|
1119
|
+
const isForm = o.powerBtn.data.type === dicts.POWER_DATA_TYPE__FORM
|
|
1120
|
+
if (isForm) {
|
|
1121
|
+
|
|
1122
|
+
// 获取表单注入
|
|
1123
|
+
o.$form = $n_has(options, '$form') ? options.$form : inject(NFormKey)
|
|
1124
|
+
if (! o.$form) {
|
|
1125
|
+
throw new Error('没有创建表单实例')
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
// 如果验证表单
|
|
1129
|
+
if ($n_get(o.powerBtn.data, 'validate') !== false) {
|
|
1130
|
+
|
|
1131
|
+
if (! o.$form.formRef) {
|
|
1132
|
+
throw new Error('没有绑定 fromRef')
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
// 验证表单
|
|
1136
|
+
if (! await o.$form.formRef.value.validate()) {
|
|
1137
|
+
return
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
// 验证表单数据
|
|
1142
|
+
if (! $n_isValidObject(o.$form.formData.value)) {
|
|
1143
|
+
throw new Error('没有获取到表单数据')
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
// 如果是请求数据
|
|
1147
|
+
// --------------------------------------------------
|
|
1148
|
+
} else {
|
|
1149
|
+
// 获取表格注入
|
|
1150
|
+
o.$table = $n_has(options, '$table') ? options.$table : inject(NTableKey)
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
if (
|
|
1154
|
+
// 如果为跳转页面
|
|
1155
|
+
$n_has($route.query, 'n_to_page')
|
|
1156
|
+
&& $route.query.n_to_page === 1
|
|
1157
|
+
// 如果有请求成功后的操作动作
|
|
1158
|
+
&& $n_has(o.powerBtn.data, 'requestSuccess.type')
|
|
1159
|
+
// 如果为关闭窗口、跳转并刷新页面
|
|
1160
|
+
&& o.powerBtn.data.requestSuccess.type === 'closePushRefresh'
|
|
1161
|
+
) {
|
|
1162
|
+
// 则改为 关闭窗口并跳转页面
|
|
1163
|
+
// 跳转的页面, 说明是从别的页面进行跳转, 则不需要刷新来源页面
|
|
1164
|
+
o.powerBtn.data.requestSuccess.type = 'closePush'
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
// 判断是否有确认框
|
|
1168
|
+
const isConfirm = $n_get(o.powerBtn.data, 'confirm')
|
|
1169
|
+
if (
|
|
1170
|
+
// 如果有确认框
|
|
1171
|
+
isConfirm
|
|
1172
|
+
// 如果有密码确认框
|
|
1173
|
+
|| $n_get(o.powerBtn.data, 'confirmPassword')
|
|
1174
|
+
) {
|
|
1175
|
+
// 如果需要先弹出确认框
|
|
1176
|
+
if (isConfirm) {
|
|
1177
|
+
|
|
1178
|
+
// 确认框
|
|
1179
|
+
$n_confirm({
|
|
1180
|
+
// 重要操作,请输入登录密码并确认后操作
|
|
1181
|
+
message: $n_isValidString(isConfirm) ? isConfirm : '确认要执行该操作吗?',
|
|
1182
|
+
})
|
|
1183
|
+
// 点击确认执行
|
|
1184
|
+
.onOk(onConfirmRequest)
|
|
1185
|
+
|
|
1186
|
+
return
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
// 否则执行确认请求事件
|
|
1191
|
+
await onConfirmRequest()
|
|
1192
|
+
|
|
1193
|
+
/**
|
|
1194
|
+
* 确认请求事件
|
|
1195
|
+
*/
|
|
1196
|
+
function onConfirmRequest() {
|
|
1197
|
+
|
|
1198
|
+
// 下一步
|
|
1199
|
+
function next() {
|
|
1200
|
+
|
|
1201
|
+
// 如果是表单
|
|
1202
|
+
if (isForm) {
|
|
1203
|
+
|
|
1204
|
+
// 获取请求数据
|
|
1205
|
+
requestData = $n_merge({}, formatQuery(query, false), o.$form.formData.value)
|
|
1206
|
+
|
|
1207
|
+
// 合并请求原始表单数据
|
|
1208
|
+
if ($n_isValidObject(o.$form.requestRawFormData.value)) {
|
|
1209
|
+
_formDataClone = $n_cloneDeep(o.$form.formData.value)
|
|
1210
|
+
Object.assign(requestData, {
|
|
1211
|
+
n__raw: o.$form.requestRawFormData.value
|
|
1212
|
+
})
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
// 如果是请求数据
|
|
1216
|
+
// --------------------------------------------------
|
|
1217
|
+
} else {
|
|
1218
|
+
// 获取请求数据
|
|
1219
|
+
requestData = formatQuery(query, false)
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
// 执行请求
|
|
1223
|
+
onRequest()
|
|
1224
|
+
.finally()
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
// 如果是表单
|
|
1228
|
+
if (isForm) {
|
|
1229
|
+
|
|
1230
|
+
if (
|
|
1231
|
+
// 如果有请求上传网络外链方法
|
|
1232
|
+
$n_isFunction(o.requestUploadNet)
|
|
1233
|
+
// 如果有上传网络外链方法
|
|
1234
|
+
&& $n_isFunction(o.uploadNet)
|
|
1235
|
+
) {
|
|
1236
|
+
// 上传网络外链
|
|
1237
|
+
o.uploadNet(function(e) {
|
|
1238
|
+
o.requestUploadNet(Object.assign(e, { next }))
|
|
1239
|
+
}).finally()
|
|
1240
|
+
return
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
// 否则检查是否正在上传文件
|
|
1244
|
+
if ($n_isFunction(o.checkUploading) && o.checkUploading()) {
|
|
1245
|
+
// 轻提示
|
|
1246
|
+
$n_toast({
|
|
1247
|
+
message: '文件上传中,请耐心等待',
|
|
1248
|
+
})
|
|
1249
|
+
return
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
// 下一步
|
|
1254
|
+
next()
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
/**
|
|
1258
|
+
* 请求事件
|
|
1259
|
+
*/
|
|
1260
|
+
async function onRequest() {
|
|
1261
|
+
|
|
1262
|
+
if ($n_has(o.powerBtn.data, 'formatRequestData')) {
|
|
1263
|
+
o.powerBtn.data.formatRequestData({ requestData })
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
// 请求前执行
|
|
1267
|
+
const resBefore = await $n_runAsync(o.requestBefore)({
|
|
1268
|
+
options: o,
|
|
1269
|
+
requestData,
|
|
1270
|
+
next: nextBefore,
|
|
1271
|
+
})
|
|
1272
|
+
if (resBefore !== void 0) {
|
|
1273
|
+
if (resBefore === false) {
|
|
1274
|
+
return
|
|
1275
|
+
}
|
|
1276
|
+
requestData = resBefore
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
async function nextBefore() {
|
|
1280
|
+
|
|
1281
|
+
// 请求地址
|
|
1282
|
+
const requestUrl = o.powerBtn.data.url
|
|
1283
|
+
|
|
1284
|
+
// 请求
|
|
1285
|
+
const res = await $n_http({
|
|
1286
|
+
// 请求地址
|
|
1287
|
+
url: requestUrl,
|
|
1288
|
+
// 请求数据
|
|
1289
|
+
data: requestData,
|
|
1290
|
+
// 加载中
|
|
1291
|
+
loading: o.loading,
|
|
1292
|
+
})
|
|
1293
|
+
|
|
1294
|
+
// 返回结果数据
|
|
1295
|
+
const resultData = Object.assign({
|
|
1296
|
+
// 请求地址
|
|
1297
|
+
requestUrl,
|
|
1298
|
+
// 参数
|
|
1299
|
+
options: o,
|
|
1300
|
+
// 请求数据
|
|
1301
|
+
requestData,
|
|
1302
|
+
}, res)
|
|
1303
|
+
|
|
1304
|
+
// 请求后执行
|
|
1305
|
+
if (await $n_runAsync(o.requestAfter)(resultData) === false) {
|
|
1306
|
+
return
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
// 如果请求成功
|
|
1310
|
+
if (res.status) {
|
|
1311
|
+
|
|
1312
|
+
// 下一步
|
|
1313
|
+
function next(isNotify = true) {
|
|
1314
|
+
|
|
1315
|
+
// 轻提示
|
|
1316
|
+
if (isNotify) {
|
|
1317
|
+
$n_toast({
|
|
1318
|
+
type: 'positive',
|
|
1319
|
+
message: '恭喜您,操作成功',
|
|
1320
|
+
})
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
// 判断是否有请求成功后的操作动作
|
|
1324
|
+
if ($n_has(o.powerBtn.data, 'requestSuccess.type')) {
|
|
1325
|
+
switch (o.powerBtn.data.requestSuccess.type) {
|
|
1326
|
+
|
|
1327
|
+
// 关闭当前页面
|
|
1328
|
+
case 'close':
|
|
1329
|
+
// 关闭窗口并跳转页面
|
|
1330
|
+
case 'closePush':
|
|
1331
|
+
// 关闭窗口、跳转并刷新页面
|
|
1332
|
+
case 'closePushRefresh':
|
|
1333
|
+
|
|
1334
|
+
// 如果是渲染页面
|
|
1335
|
+
// 说明该页面在 <table-splitter> 组件内部被渲染, 则不需要关闭当前窗口
|
|
1336
|
+
if ($n_has($route.query, 'n_render_page') && $route.query.n_render_page === 1) {
|
|
1337
|
+
// 则无任何操作
|
|
1338
|
+
return
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
const opts = {
|
|
1342
|
+
type: 'closeCurrentTab',
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
if (
|
|
1346
|
+
// 如果不是关闭当前页面, 则为关闭窗口并跳转页面
|
|
1347
|
+
o.powerBtn.data.requestSuccess.type !== 'close'
|
|
1348
|
+
// 如果有来源页面
|
|
1349
|
+
&& $n_has($route.query, 'n_from_page')
|
|
1350
|
+
&& $n_isValidString($route.query.n_from_page)
|
|
1351
|
+
) {
|
|
1352
|
+
Object.assign(opts, {
|
|
1353
|
+
// 跳转页面地址
|
|
1354
|
+
pushPage: decodeURIComponent($route.query.n_from_page),
|
|
1355
|
+
// 是否跳转并刷新页面
|
|
1356
|
+
isPushRefresh: o.powerBtn.data.requestSuccess.type === 'closePushRefresh',
|
|
1357
|
+
})
|
|
1358
|
+
|
|
1359
|
+
// 否则如果定义了跳转页面
|
|
1360
|
+
// else if ($n_has(o.powerBtn.data, 'requestSuccess.params') && $n_isValidString(o.powerBtn.data.requestSuccess.params)) {
|
|
1361
|
+
// pushPage = o.powerBtn.data.requestSuccess.params
|
|
1362
|
+
// }
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
// 关闭当前标签页
|
|
1366
|
+
$n_bus.emit('main', opts)
|
|
1367
|
+
break
|
|
1368
|
+
|
|
1369
|
+
// 重置表单
|
|
1370
|
+
case 'resetForm':
|
|
1371
|
+
$n_run(o.$form?.resetForm)()
|
|
1372
|
+
break
|
|
1373
|
+
|
|
1374
|
+
// 刷新列表
|
|
1375
|
+
case 'refreshList':
|
|
1376
|
+
$n_run(o.$table?.tableRefresh)()
|
|
1377
|
+
break
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
// 设置原始数据
|
|
1383
|
+
if (_formDataClone !== null) {
|
|
1384
|
+
o.$form.setRaw(_formDataClone)
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
// 请求成功执行
|
|
1388
|
+
if (await $n_runAsync(o.requestSuccess)(Object.assign({ next }, resultData)) === false) {
|
|
1389
|
+
return
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
// 下一步
|
|
1393
|
+
next()
|
|
1394
|
+
|
|
1395
|
+
} else {
|
|
1396
|
+
// 请求失败执行
|
|
1397
|
+
$n_run(o.requestFail)(resultData)
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
nextBefore()
|
|
1402
|
+
.finally()
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
/**
|
|
1407
|
+
* 获取路由页面的角色权限
|
|
1408
|
+
*/
|
|
1409
|
+
function getPageData($route) {
|
|
1410
|
+
|
|
1411
|
+
if (! $route) {
|
|
1412
|
+
$route = $n_router.getRoute()
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
const path = $n_get($route, 'path')
|
|
1416
|
+
if (! path) {
|
|
1417
|
+
return $n_fail('路由参数错误')
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
if (! statePower.value.v) {
|
|
1421
|
+
return $n_fail('没有获取到权限数据')
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
// 获取角色数据
|
|
1425
|
+
const { urls, btns } = $n_cloneDeep(statePower.value)
|
|
1426
|
+
if (! $n_has(urls, path)) {
|
|
1427
|
+
return $n_fail('该页面没有权限')
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
return $n_success({
|
|
1431
|
+
page: urls[path],
|
|
1432
|
+
btns: $n_has(btns, path) ? btns[path] : [],
|
|
1433
|
+
})
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
/**
|
|
1437
|
+
* 新窗口
|
|
1438
|
+
*/
|
|
1439
|
+
function routerPush({ path, query, pageTitle, fromPage }) {
|
|
1440
|
+
|
|
1441
|
+
if (! $n_isValidObject(query)) {
|
|
1442
|
+
query = {}
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
// 如果有标题
|
|
1446
|
+
pageTitle = $n_trimString(pageTitle)
|
|
1447
|
+
if (pageTitle) {
|
|
1448
|
+
query.n_page_title = pageTitle
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
// 来源页面
|
|
1452
|
+
if (fromPage) {
|
|
1453
|
+
if (fromPage === true) {
|
|
1454
|
+
fromPage = $n_router.getRoute()
|
|
1455
|
+
}
|
|
1456
|
+
// 来源页面是指定路由的完整路径
|
|
1457
|
+
query.n_from_page = getFromPageFullUrl(fromPage)
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
$n_router.push({
|
|
1461
|
+
path,
|
|
1462
|
+
query,
|
|
1463
|
+
})
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* 权限业务
|
|
1468
|
+
*/
|
|
1469
|
+
const $power = {
|
|
1470
|
+
// 创建权限实例
|
|
1471
|
+
create,
|
|
1472
|
+
// 设置权限数据
|
|
1473
|
+
setData,
|
|
1474
|
+
// 获取权限数据
|
|
1475
|
+
getData,
|
|
1476
|
+
// 获取路由页面的角色权限
|
|
1477
|
+
getPageData,
|
|
1478
|
+
// 格式化权限按钮
|
|
1479
|
+
formatBtns,
|
|
1480
|
+
// 请求
|
|
1481
|
+
request,
|
|
1482
|
+
// 新窗口
|
|
1483
|
+
routerPush,
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
export default $power
|