@lambo-design/shared 1.0.0-beta.36 → 1.0.0-beta.360

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.
Files changed (259) hide show
  1. package/config/config.js +20 -3
  2. package/config/index.js +7 -2
  3. package/config/locale.js +61 -0
  4. package/config/themes/atrovirens/atrovirens.css +590 -0
  5. package/config/themes/atrovirens/atrovirens.css.map +1 -0
  6. package/config/themes/atrovirens/atrovirens.less +681 -0
  7. package/config/themes/atrovirens/var.css +29 -0
  8. package/config/themes/atrovirens/var.css.map +1 -0
  9. package/config/themes/atrovirens/var.less +689 -0
  10. package/config/themes/blue/blue.css +590 -0
  11. package/config/themes/blue/blue.css.map +1 -0
  12. package/config/themes/blue/blue.less +684 -0
  13. package/config/themes/blue/var.less +692 -0
  14. package/config/themes/blue-208/blue-208.css +590 -0
  15. package/config/themes/blue-208/blue-208.css.map +1 -0
  16. package/config/themes/blue-208/blue-208.less +685 -0
  17. package/config/themes/blue-208/var.less +691 -0
  18. package/config/themes/blue-digital/blue-digital.css +590 -0
  19. package/config/themes/blue-digital/blue-digital.css.map +1 -0
  20. package/config/themes/blue-digital/blue-digital.less +684 -0
  21. package/config/themes/blue-digital/var.less +692 -0
  22. package/config/themes/blue-leaf/blue-leaf.css +590 -0
  23. package/config/themes/blue-leaf/blue-leaf.css.map +1 -0
  24. package/config/themes/blue-leaf/blue-leaf.less +685 -0
  25. package/config/themes/blue-leaf/var.less +691 -0
  26. package/config/themes/blue-white/blue-white.css +590 -0
  27. package/config/themes/blue-white/blue-white.css.map +1 -0
  28. package/config/themes/blue-white/blue-white.less +685 -0
  29. package/config/themes/blue-white/var.less +691 -0
  30. package/config/themes/blue-white-big/blue-white-big.css +590 -0
  31. package/config/themes/blue-white-big/blue-white-big.css.map +1 -0
  32. package/config/themes/blue-white-big/blue-white-big.less +685 -0
  33. package/config/themes/blue-white-big/var.less +691 -0
  34. package/config/themes/blue-white-tight/blue-white-tight.css +591 -0
  35. package/config/themes/blue-white-tight/blue-white-tight.css.map +1 -0
  36. package/config/themes/blue-white-tight/blue-white-tight.less +685 -0
  37. package/config/themes/blue-white-tight/var.less +693 -0
  38. package/config/themes/canglan/canglan.css +590 -0
  39. package/config/themes/canglan/canglan.css.map +1 -0
  40. package/config/themes/canglan/canglan.less +682 -0
  41. package/config/themes/canglan/var.less +693 -0
  42. package/config/themes/cuiwei/cuiwei.css +590 -0
  43. package/config/themes/cuiwei/cuiwei.css.map +1 -0
  44. package/config/themes/cuiwei/cuiwei.less +682 -0
  45. package/config/themes/cuiwei/var.less +691 -0
  46. package/config/themes/danqing/danqing.css +590 -0
  47. package/config/themes/danqing/danqing.css.map +1 -0
  48. package/config/themes/danqing/danqing.less +682 -0
  49. package/config/themes/danqing/danqing.wxss +576 -0
  50. package/config/themes/danqing/var.less +696 -0
  51. package/config/themes/deep/deep.css +590 -0
  52. package/config/themes/deep/deep.css.map +1 -0
  53. package/config/themes/deep/deep.less +682 -0
  54. package/config/themes/deep/var.less +694 -0
  55. package/config/themes/default/default.css +404 -57
  56. package/config/themes/default/default.css.map +1 -1
  57. package/config/themes/default/default.less +381 -16
  58. package/config/themes/default/var.less +390 -11
  59. package/config/themes/eap/eap.css +590 -0
  60. package/config/themes/eap/eap.css.map +1 -0
  61. package/config/themes/eap/eap.less +685 -0
  62. package/config/themes/eap/var.less +693 -0
  63. package/config/themes/gold/gold.css +590 -0
  64. package/config/themes/gold/gold.css.map +1 -0
  65. package/config/themes/gold/gold.less +685 -0
  66. package/config/themes/gold/var.css +0 -0
  67. package/config/themes/gold/var.css.map +0 -0
  68. package/config/themes/gold/var.less +386 -5
  69. package/config/themes/index.js +32 -4
  70. package/config/themes/lime/lime.css +590 -0
  71. package/config/themes/lime/lime.css.map +1 -0
  72. package/config/themes/lime/lime.less +685 -0
  73. package/config/themes/lime/var.less +385 -5
  74. package/config/themes/orange/orange.css +354 -7
  75. package/config/themes/orange/orange.css.map +1 -1
  76. package/config/themes/orange/orange.less +366 -0
  77. package/config/themes/orange/var.less +386 -5
  78. package/config/themes/red/red.css +354 -7
  79. package/config/themes/red/red.css.map +1 -1
  80. package/config/themes/red/red.less +366 -0
  81. package/config/themes/red/var.less +386 -5
  82. package/config/themes/sichuan/sichuan.css +590 -0
  83. package/config/themes/sichuan/sichuan.css.map +1 -0
  84. package/config/themes/sichuan/sichuan.less +685 -0
  85. package/config/themes/sichuan/var.less +691 -0
  86. package/config/themes/theme-atrovirens.js +572 -0
  87. package/config/themes/theme-b208.js +572 -0
  88. package/config/themes/theme-bd.js +572 -0
  89. package/config/themes/theme-bl.js +572 -0
  90. package/config/themes/theme-blue.js +572 -0
  91. package/config/themes/theme-bw.js +572 -0
  92. package/config/themes/theme-bwb.js +572 -0
  93. package/config/themes/theme-bwt.js +573 -0
  94. package/config/themes/theme-canglan.js +574 -0
  95. package/config/themes/theme-cuiwei.js +574 -0
  96. package/config/themes/theme-danqing.js +575 -0
  97. package/config/themes/theme-deep.js +572 -0
  98. package/config/themes/theme-default.js +379 -60
  99. package/config/themes/theme-eap.js +572 -0
  100. package/config/themes/theme-gold.js +327 -8
  101. package/config/themes/theme-lime.js +327 -8
  102. package/config/themes/theme-orange.js +561 -29
  103. package/config/themes/theme-red.js +564 -33
  104. package/config/themes/theme-sichuan.js +572 -0
  105. package/config/themes/theme-white.js +572 -0
  106. package/config/themes/white/var.less +692 -0
  107. package/config/themes/white/white.css +590 -0
  108. package/config/themes/white/white.css.map +1 -0
  109. package/config/themes/white/white.less +685 -0
  110. package/directives/module/print.js +1 -0
  111. package/directives/module/vue-print-nb/README.md +63 -0
  112. package/directives/module/vue-print-nb/print.js +94 -0
  113. package/directives/module/vue-print-nb/printarea.js +532 -0
  114. package/index.js +7 -1
  115. package/nstyles/common.less +197 -0
  116. package/nstyles/components/404.less +46 -0
  117. package/nstyles/components/button.less +34 -0
  118. package/nstyles/components/date-picker.less +41 -0
  119. package/nstyles/components/drawer.less +20 -0
  120. package/nstyles/components/dropdown.less +18 -0
  121. package/nstyles/components/excel-flow.less +72 -0
  122. package/nstyles/components/form.less +314 -0
  123. package/nstyles/components/index.less +23 -0
  124. package/nstyles/components/layout/collect.less +10 -0
  125. package/nstyles/components/layout/detail-view.less +107 -0
  126. package/nstyles/components/layout/full-screen.less +7 -0
  127. package/nstyles/components/layout/index.less +7 -0
  128. package/nstyles/components/layout/other-menu.less +142 -0
  129. package/nstyles/components/layout/page-view.less +101 -0
  130. package/nstyles/components/layout/sider-trigger.less +41 -0
  131. package/nstyles/components/layout/tags-nav.less +113 -0
  132. package/nstyles/components/modal.less +90 -0
  133. package/nstyles/components/n-button.less +131 -0
  134. package/nstyles/components/n-image-preview.less +131 -0
  135. package/nstyles/components/n-model/index.less +19 -0
  136. package/nstyles/components/n-model/report-index.less +43 -0
  137. package/nstyles/components/n-panel.less +41 -0
  138. package/nstyles/components/n-picker.less +37 -0
  139. package/nstyles/components/n-sign.less +17 -0
  140. package/nstyles/components/n-tooltip.less +10 -0
  141. package/nstyles/components/panel.less +31 -0
  142. package/nstyles/components/select.less +3 -0
  143. package/nstyles/components/sign.less +27 -0
  144. package/nstyles/components/table.less +523 -0
  145. package/nstyles/components/tree.less +166 -0
  146. package/nstyles/components/upload.less +174 -0
  147. package/nstyles/index.css +2676 -0
  148. package/nstyles/index.css.map +1 -0
  149. package/nstyles/index.less +5 -0
  150. package/nstyles/reset.less +73 -0
  151. package/nstyles/third/ag.less +226 -0
  152. package/nstyles/third/icons/sort-desc.svg +1 -0
  153. package/nstyles/third/icons/sort-up.svg +1 -0
  154. package/nstyles/third/icons/sorting.svg +1 -0
  155. package/nstyles/third/index.less +11 -0
  156. package/nstyles/third/view-design.less +402 -0
  157. package/nstyles/variables/base.less +143 -0
  158. package/nstyles/variables/index.less +4 -0
  159. package/nstyles/variables/theme/default/button.less +7 -0
  160. package/nstyles/variables/theme/default/common.less +60 -0
  161. package/nstyles/variables/theme/default/index.less +7 -0
  162. package/nstyles/variables/theme/default/layout.less +40 -0
  163. package/nstyles/variables/theme/default/table.less +37 -0
  164. package/nstyles/variables/theme/default/tag.less +3 -0
  165. package/nstyles/variables/theme/default/upload.less +3 -0
  166. package/nstyles/variables/theme/index.less +13 -0
  167. package/nstyles/variables/theme/lsv/button.less +7 -0
  168. package/nstyles/variables/theme/lsv/common.less +39 -0
  169. package/nstyles/variables/theme/lsv/index.less +5 -0
  170. package/nstyles/variables/theme/lsv/layout.less +21 -0
  171. package/nstyles/variables/theme/lsv/table.less +20 -0
  172. package/nstyles/variables/theme/lsv/tag.less +3 -0
  173. package/nstyles/variables/theme/small/button.less +7 -0
  174. package/nstyles/variables/theme/small/common.less +41 -0
  175. package/nstyles/variables/theme/small/index.less +5 -0
  176. package/nstyles/variables/theme/small/layout.less +21 -0
  177. package/nstyles/variables/theme/small/table.less +17 -0
  178. package/nstyles/variables/theme/small/tag.less +3 -0
  179. package/package.json +28 -7
  180. package/plugin/index.js +12 -0
  181. package/plugin/module/date-format.js +30 -0
  182. package/plugin/module/loading.js +26 -0
  183. package/plugin/module/warn-handler.js +11 -0
  184. package/styles/image/indicator-card-header.png +0 -0
  185. package/styles/image/inspur.png +0 -0
  186. package/styles/image/lan_navigator.png +0 -0
  187. package/styles/image/layout-header-bg-canglan.png +0 -0
  188. package/styles/image/layout-header-bg-cuiwei.png +0 -0
  189. package/styles/image/lv_navigator.png +0 -0
  190. package/utils/ajax/abort-controller.js +70 -0
  191. package/utils/ajax/cancel-reason.js +25 -0
  192. package/utils/ajax/cancel-token.js +83 -0
  193. package/utils/ajax/content-type.js +30 -0
  194. package/utils/ajax/headers.js +11 -0
  195. package/utils/ajax/interceptors.js +45 -10
  196. package/utils/ajax/sseFetchUtil.js +118 -0
  197. package/utils/ajax/throttle.js +49 -0
  198. package/utils/assist.js +155 -27
  199. package/utils/base64.js +126 -0
  200. package/utils/blob.js +47 -0
  201. package/utils/context-menu.js +264 -0
  202. package/utils/crypto/aes.js +23 -0
  203. package/utils/crypto/index.js +10 -0
  204. package/utils/crypto/rsa.js +23 -0
  205. package/utils/date.js +334 -305
  206. package/utils/dict/built-in-dict.js +20 -0
  207. package/utils/dict/index.js +191 -0
  208. package/utils/event.js +72 -0
  209. package/utils/excel.js +504 -290
  210. package/utils/file.js +19 -0
  211. package/utils/form/validate.js +29 -0
  212. package/utils/getChild.js +87 -0
  213. package/utils/half-year.js +68 -0
  214. package/utils/index.js +37 -0
  215. package/utils/json.js +44 -0
  216. package/utils/locale/en-US.js +179 -0
  217. package/utils/locale/zh-CN.js +183 -0
  218. package/utils/lodop.js +5 -0
  219. package/utils/menu/generatorDynamicRouter.js +301 -0
  220. package/utils/menu/index.js +426 -15
  221. package/utils/mime_type.js +67 -0
  222. package/utils/modelerUtil.js +4 -1
  223. package/utils/n/api.js +42 -0
  224. package/utils/n/date.js +57 -0
  225. package/utils/n/index.js +10 -0
  226. package/utils/n/is-type.js +176 -0
  227. package/utils/n/number.js +144 -0
  228. package/utils/n/permission-cache.js +11 -0
  229. package/utils/n/reuqest/axiosN.js +17 -0
  230. package/utils/n/reuqest/content-type.js +19 -0
  231. package/utils/n/reuqest/interceptors.js +95 -0
  232. package/utils/n/reuqest/url-params.js +12 -0
  233. package/utils/n/storage.js +51 -0
  234. package/utils/n/token.js +51 -0
  235. package/utils/n/user-cache.js +11 -0
  236. package/utils/n/user.js +34 -0
  237. package/utils/n/uuid.js +16 -0
  238. package/utils/n-generator-routers.js +208 -0
  239. package/utils/n-router.js +205 -0
  240. package/utils/n-theme.js +30 -0
  241. package/utils/number.js +72 -15
  242. package/utils/oss.js +57 -0
  243. package/utils/platform.js +951 -31
  244. package/utils/quarter.js +58 -0
  245. package/utils/storage.js +198 -0
  246. package/utils/style.js +24 -0
  247. package/utils/theme.js +98 -3
  248. package/utils/transfer-queue.js +7 -0
  249. package/utils/transform.js +205 -0
  250. package/utils/type.js +102 -0
  251. package/utils/util.js +795 -0
  252. package/utils/vForm.js +349 -0
  253. package/utils/validator.js +181 -0
  254. package/config/themes/gold/default.css +0 -243
  255. package/config/themes/gold/default.css.map +0 -1
  256. package/config/themes/gold/default.less +0 -320
  257. package/config/themes/lime/default.css +0 -243
  258. package/config/themes/lime/default.css.map +0 -1
  259. package/config/themes/lime/default.less +0 -320
@@ -0,0 +1,301 @@
1
+ import config from "../../config/config"
2
+ import { deepCopy } from '../assist'
3
+ import { getUrlParams } from '../platform'
4
+
5
+ const ROUTE_PERMISSION_TYPES = new Set([1, 2, 4])
6
+
7
+ function isAppMatched(itemAppId, appIds) {
8
+ if (!appIds) {
9
+ return true
10
+ }
11
+ if (itemAppId === appIds) {
12
+ return true
13
+ }
14
+ if (Array.isArray(appIds)) {
15
+ return appIds.indexOf(itemAppId) > -1
16
+ }
17
+ if (typeof appIds === 'string') {
18
+ return appIds.indexOf(itemAppId) > -1
19
+ }
20
+ return false
21
+ }
22
+
23
+ function shouldIncludePermission(item, appIds, generateType) {
24
+ const appIdCondition = isAppMatched(item.appId, appIds)
25
+ if (generateType === 'menu') {
26
+ const hideInMenuCondition = !(Object.prototype.hasOwnProperty.call(item, 'hideInMenu') && item.hideInMenu)
27
+ return appIdCondition && hideInMenuCondition
28
+ }
29
+ if (generateType && generateType === 'router') {
30
+ return appIdCondition
31
+ }
32
+ return false
33
+ }
34
+
35
+ function buildChildrenMap(permissionList, appIds, generateType) {
36
+ const childrenMap = new Map()
37
+
38
+ permissionList.forEach((item) => {
39
+ if (!item || !ROUTE_PERMISSION_TYPES.has(item.type)) {
40
+ return
41
+ }
42
+ if (!shouldIncludePermission(item, appIds, generateType)) {
43
+ return
44
+ }
45
+
46
+ const pid = item.pid
47
+ if (!childrenMap.has(pid)) {
48
+ childrenMap.set(pid, [])
49
+ }
50
+ childrenMap.get(pid).push(item)
51
+ })
52
+
53
+ return childrenMap
54
+ }
55
+
56
+ function createCrumb(item) {
57
+ return {
58
+ icon: item.icon,
59
+ name: item.name,
60
+ title: item.label,
61
+ type: item.type
62
+ }
63
+ }
64
+
65
+ function buildMenuTree(childrenMap, parentId, crumbs, root, pageChildren) {
66
+ const siblings = childrenMap.get(parentId) || []
67
+ const menuTree = []
68
+
69
+ siblings.forEach((item) => {
70
+ if (item.type === 1 || item.type === 2) {
71
+ const node = {
72
+ meta: {
73
+ data: deepCopy(item),
74
+ appId: item.appId,
75
+ title: item.label,
76
+ icon: item.icon,
77
+ crumbs: [...crumbs],
78
+ activeName: item.name,
79
+ notCache: Boolean(item.notCache),
80
+ hideInMenu: Boolean(item.hideInMenu)
81
+ },
82
+ permissionId: item.permissionId,
83
+ type: item.type,
84
+ pid: item.pid,
85
+ component: item.name,
86
+ name: item.name,
87
+ uri: item.uri,
88
+ children: []
89
+ }
90
+
91
+ node.meta.crumbs.push(createCrumb(item))
92
+
93
+ if (item.type === 1) {
94
+ node.component = root ? 'Main' : 'parentView'
95
+ }
96
+
97
+ node.children = buildMenuTree(childrenMap, item.permissionId, node.meta.crumbs, false, pageChildren)
98
+ if (!node.children.length) {
99
+ delete node.children
100
+ }
101
+
102
+ menuTree.push(node)
103
+ return
104
+ }
105
+
106
+ if (item.type === 4) {
107
+ const child = {
108
+ meta: {
109
+ data: deepCopy(item),
110
+ appId: item.appId,
111
+ title: item.label,
112
+ hideInMenu: true,
113
+ notCache: true,
114
+ crumbs: [...crumbs],
115
+ type: item.type
116
+ },
117
+ permissionId: item.permissionId,
118
+ type: item.type,
119
+ pid: item.pid,
120
+ component: item.name,
121
+ name: item.name,
122
+ uri: item.uri
123
+ }
124
+
125
+ child.meta.crumbs.push(createCrumb(item))
126
+ pageChildren.push(child)
127
+ }
128
+ })
129
+
130
+ return menuTree
131
+ }
132
+
133
+ export function generatorMenuRouter(permissionList, appIds, generateType = 'router') {
134
+ const pageNode = {
135
+ path: '/page',
136
+ name: 'page',
137
+ meta: {
138
+ hideInMenu: true,
139
+ notCache: true
140
+ },
141
+ component: 'Main',
142
+ children: []
143
+ }
144
+
145
+ const childrenMap = buildChildrenMap(permissionList || [], appIds, generateType)
146
+ const menuData = buildMenuTree(childrenMap, '0', [], true, pageNode.children)
147
+ return { menuData, pageNode }
148
+ }
149
+
150
+ function generator(menuData, constantRouterComponents) {
151
+ for (const item of menuData) {
152
+ if (item.component && typeof item.component === 'string') {
153
+ const target = constantRouterComponents[item.component]
154
+ if (target) {
155
+ if (target.component) {
156
+ if (typeof target.component === 'string') {
157
+ try {
158
+ item.component = resolve =>
159
+ require(['@/view/' + target.component], data => {
160
+ data.default.name = item.name
161
+ resolve(data)
162
+ })
163
+ } catch (e) {
164
+ delete item.component
165
+ }
166
+ } else {
167
+ item.component = target.component
168
+ }
169
+ }
170
+ if (target.url) {
171
+ let path = target.url
172
+ let query = {}
173
+ if (path.indexOf('?') > -1) {
174
+ query = getUrlParams(path.substr(path.indexOf('?')))
175
+ item.query = query
176
+ path = path.substr(0, path.indexOf('?'))
177
+ }
178
+ item.path = path
179
+ }
180
+ if (item.uri) {
181
+ item.meta.uriParam = item.uri
182
+ }
183
+ if (target.notCache) {
184
+ item.meta.notCache = target.notCache
185
+ }
186
+ if (target.hideInMenu) {
187
+ item.meta.hideInMenu = target.hideInMenu
188
+ }
189
+ }
190
+ if (item.uri) {
191
+ if (item.uri.startsWith('/')) {
192
+ item.uri = item.uri.substr(1)
193
+ }
194
+ let uri = item.uri
195
+ if (uri.startsWith(config.routerBase + '/')) {
196
+ uri = uri.replace(config.routerBase + '/', '')
197
+ }
198
+ if (uri.startsWith('dida/')) {
199
+ item.meta.notCache = true
200
+ let path = uri
201
+ let query = {}
202
+ if (path.indexOf('?') > -1) {
203
+ query = getUrlParams(path.substr(path.indexOf('?')))
204
+ item.query = query
205
+ path = path.substr(0, path.indexOf('?'))
206
+ }
207
+ try {
208
+ item.component = resolve => {
209
+ require(['@/view/dida/dida-page'], data => {
210
+ data.default.name = item.name
211
+ resolve(data)
212
+ })
213
+ }
214
+ } catch (e) {
215
+ delete item.component
216
+ }
217
+ item.path = '/' + path
218
+ } else if (uri.startsWith('dareport/')) {
219
+ item.meta.notCache = true
220
+ let path = uri
221
+ let query = {}
222
+ if (path.indexOf('?') > -1) {
223
+ query = getUrlParams(path.substr(path.indexOf('?')))
224
+ item.query = query
225
+ path = path.substr(0, path.indexOf('?'))
226
+ }
227
+ try {
228
+ item.component = resolve => {
229
+ require(['@/view/dida/dida-page'], data => {
230
+ data.default.name = item.name
231
+ resolve(data)
232
+ })
233
+ }
234
+ } catch (e) {
235
+ delete item.component
236
+ }
237
+ item.path = '/' + path
238
+ } else {
239
+ try {
240
+ let path = item.uri
241
+ if (item.uri.startsWith(config.routerBase + '/')) {
242
+ path = path.replace(config.routerBase + '/', '')
243
+ }
244
+ let query = {}
245
+ if (path.indexOf('?') > -1) {
246
+ query = getUrlParams(path.substr(path.indexOf('?')))
247
+ path = path.substr(0, path.indexOf('?'))
248
+ }
249
+ if (target && target.component) {
250
+ // target.component already overrides uri-based component resolution.
251
+ } else {
252
+ const component = require('@/view/' + path)
253
+ if (component) {
254
+ item.component = resolve => {
255
+ require(['@/view/' + path], data => {
256
+ data.default.name = item.name
257
+ resolve(data)
258
+ })
259
+ }
260
+ } else {
261
+ delete item.component
262
+ }
263
+ }
264
+ if (target && target.url) {
265
+ // target.url already overrides uri-based path/query resolution.
266
+ } else {
267
+ item.path = '/' + path
268
+ item.query = query
269
+ }
270
+ } catch (e) {
271
+ delete item.component
272
+ }
273
+ }
274
+ }
275
+ if (item.path == null) {
276
+ item.path = ''
277
+ }
278
+ if (item.component && typeof item.component === 'string') {
279
+ delete item.component
280
+ }
281
+ if (item.children && item.children.length > 0) {
282
+ generator(item.children, constantRouterComponents)
283
+ }
284
+ }
285
+ }
286
+ return menuData
287
+ }
288
+
289
+ export function generatorDynamicRouter(permissionList, constantRouterComponents, appIds = null, generateType = 'router') {
290
+ const allMenu = generatorMenuRouter(permissionList, appIds, generateType)
291
+ const menuData = allMenu.menuData
292
+ const pageNode = allMenu.pageNode
293
+
294
+ if (menuData && pageNode && pageNode.children.length > 0) {
295
+ menuData.push(pageNode)
296
+ }
297
+
298
+ return generator(menuData, constantRouterComponents)
299
+ }
300
+
301
+ export default generatorDynamicRouter