mooho-base-admin-plus 0.1.0

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 (283) hide show
  1. package/.env +5 -0
  2. package/.env.development +0 -0
  3. package/.env.production +0 -0
  4. package/.eslintignore +11 -0
  5. package/.eslintrc.js +47 -0
  6. package/.prettierrc +15 -0
  7. package/README.md +18 -0
  8. package/dist/favicon.ico +0 -0
  9. package/dist/mooho-base-admin-plus.min.esm.js +131746 -0
  10. package/dist/mooho-base-admin-plus.min.js +279 -0
  11. package/dist/setting.js +31 -0
  12. package/dist/static/images/app-barcode.png +0 -0
  13. package/dist/static/images/login/bg.png +0 -0
  14. package/dist/static/images/login/logo.png +0 -0
  15. package/dist/static/images/login/password-active.png +0 -0
  16. package/dist/static/images/login/password-default.png +0 -0
  17. package/dist/static/images/login/signIn-img.png +0 -0
  18. package/dist/static/images/login/user-active.png +0 -0
  19. package/dist/static/images/login/user-default.png +0 -0
  20. package/dist/static/images/logo-dark.png +0 -0
  21. package/dist/static/images/logo-small.png +0 -0
  22. package/dist/static/images/logo.png +0 -0
  23. package/dist/static/images/logo.svg +510 -0
  24. package/dist/static/images/no-image.png +0 -0
  25. package/dist/style.css +4 -0
  26. package/index.html +18 -0
  27. package/other/pda.vue +28 -0
  28. package/package.json +59 -0
  29. package/public/favicon.ico +0 -0
  30. package/public/setting.js +31 -0
  31. package/public/static/images/app-barcode.png +0 -0
  32. package/public/static/images/login/bg.png +0 -0
  33. package/public/static/images/login/logo.png +0 -0
  34. package/public/static/images/login/password-active.png +0 -0
  35. package/public/static/images/login/password-default.png +0 -0
  36. package/public/static/images/login/signIn-img.png +0 -0
  37. package/public/static/images/login/user-active.png +0 -0
  38. package/public/static/images/login/user-default.png +0 -0
  39. package/public/static/images/logo-dark.png +0 -0
  40. package/public/static/images/logo-small.png +0 -0
  41. package/public/static/images/logo.png +0 -0
  42. package/public/static/images/logo.svg +510 -0
  43. package/public/static/images/no-image.png +0 -0
  44. package/src/App.vue +60 -0
  45. package/src/api/application.js +35 -0
  46. package/src/api/customModel.js +187 -0
  47. package/src/api/customPage.js +15 -0
  48. package/src/api/customTable.js +24 -0
  49. package/src/api/dataSource.js +93 -0
  50. package/src/api/dataView.js +199 -0
  51. package/src/api/dictType.js +23 -0
  52. package/src/api/entityView.js +13 -0
  53. package/src/api/enum.js +15 -0
  54. package/src/api/filterColumn.js +16 -0
  55. package/src/api/model.js +244 -0
  56. package/src/api/movePlan.js +29 -0
  57. package/src/api/notification.js +28 -0
  58. package/src/api/openApiPermission.js +25 -0
  59. package/src/api/permission.js +51 -0
  60. package/src/api/planJob.js +15 -0
  61. package/src/api/process.js +23 -0
  62. package/src/api/processDef.js +36 -0
  63. package/src/api/processInst.js +16 -0
  64. package/src/api/rolePermission.js +17 -0
  65. package/src/api/roleProperty.js +36 -0
  66. package/src/api/shortcut.js +20 -0
  67. package/src/api/system.js +23 -0
  68. package/src/api/task.js +56 -0
  69. package/src/api/taskQueue.js +24 -0
  70. package/src/api/user.js +45 -0
  71. package/src/api/viewColumn.js +16 -0
  72. package/src/assets/svg/body.svg +17 -0
  73. package/src/assets/svg/header-theme-dark.svg +40 -0
  74. package/src/assets/svg/header-theme-primary.svg +40 -0
  75. package/src/assets/svg/header-top.svg +40 -0
  76. package/src/assets/svg/icon-happy.svg +1 -0
  77. package/src/assets/svg/icon-sad.svg +1 -0
  78. package/src/assets/svg/icon-social-bilibili.svg +1 -0
  79. package/src/assets/svg/icon-social-dingding.svg +1 -0
  80. package/src/assets/svg/icon-social-facebook.svg +1 -0
  81. package/src/assets/svg/icon-social-juejin.svg +1 -0
  82. package/src/assets/svg/icon-social-qq.svg +1 -0
  83. package/src/assets/svg/icon-social-twitter.svg +1 -0
  84. package/src/assets/svg/icon-social-wechat.svg +1 -0
  85. package/src/assets/svg/icon-social-weibo.svg +1 -0
  86. package/src/assets/svg/icon-social-zhihu.svg +1 -0
  87. package/src/assets/svg/nav-theme-dark.svg +40 -0
  88. package/src/assets/svg/nav-theme-light.svg +40 -0
  89. package/src/components/copyright/index.vue +28 -0
  90. package/src/components/home/notice-list.vue +62 -0
  91. package/src/components/home/shortcut.vue +125 -0
  92. package/src/components/input/dialog-select.vue +301 -0
  93. package/src/components/input/item-select.vue +195 -0
  94. package/src/components/link/index.vue +54 -0
  95. package/src/components/richEditor/index.vue +86 -0
  96. package/src/components/upload/file-upload.vue +84 -0
  97. package/src/components/upload/upload-attachment.vue +119 -0
  98. package/src/components/upload/upload-image.vue +212 -0
  99. package/src/components/view/column-check.vue +223 -0
  100. package/src/components/view/column-edit.vue +850 -0
  101. package/src/components/view/column-select.vue +206 -0
  102. package/src/components/view/condition-edit.vue +164 -0
  103. package/src/components/view/filter-edit.vue +633 -0
  104. package/src/components/view/filter-setting.vue +126 -0
  105. package/src/components/view/form-setting-layout.vue +375 -0
  106. package/src/components/view/form-setting.vue +247 -0
  107. package/src/components/view/group-column.vue +104 -0
  108. package/src/components/view/group-method.vue +104 -0
  109. package/src/components/view/mixin.js +72 -0
  110. package/src/components/view/modal-form-filter.vue +319 -0
  111. package/src/components/view/modal-form-sort.vue +248 -0
  112. package/src/components/view/modal-form.vue +453 -0
  113. package/src/components/view/modal-table.vue +471 -0
  114. package/src/components/view/table-filter.vue +702 -0
  115. package/src/components/view/table-setting.vue +533 -0
  116. package/src/components/view/view-chart.vue +423 -0
  117. package/src/components/view/view-form-draggable.vue +837 -0
  118. package/src/components/view/view-form.vue +1444 -0
  119. package/src/components/view/view-table.vue +2261 -0
  120. package/src/components/workflow/flow-chart.vue +846 -0
  121. package/src/directive/focus.js +10 -0
  122. package/src/directive/tabHide.js +9 -0
  123. package/src/i18n/index.js +15 -0
  124. package/src/i18n/locale/en-US.js +1 -0
  125. package/src/i18n/locale/lang.js +1 -0
  126. package/src/i18n/locale/zh-CN.js +1 -0
  127. package/src/i18n/locale.js +102 -0
  128. package/src/index.js +222 -0
  129. package/src/layouts/basic-layout/header-breadcrumb/index.vue +122 -0
  130. package/src/layouts/basic-layout/header-collapse/index.vue +44 -0
  131. package/src/layouts/basic-layout/header-fullscreen/index.vue +19 -0
  132. package/src/layouts/basic-layout/header-i18n/index.vue +45 -0
  133. package/src/layouts/basic-layout/header-log/index.vue +41 -0
  134. package/src/layouts/basic-layout/header-logo/index.vue +23 -0
  135. package/src/layouts/basic-layout/header-notice/index.vue +218 -0
  136. package/src/layouts/basic-layout/header-reload/index.vue +21 -0
  137. package/src/layouts/basic-layout/header-search/index.vue +37 -0
  138. package/src/layouts/basic-layout/header-setting/index.vue +219 -0
  139. package/src/layouts/basic-layout/header-user/index.vue +175 -0
  140. package/src/layouts/basic-layout/i18n.js +50 -0
  141. package/src/layouts/basic-layout/index.vue +280 -0
  142. package/src/layouts/basic-layout/menu-head/index.vue +120 -0
  143. package/src/layouts/basic-layout/menu-head/title.vue +48 -0
  144. package/src/layouts/basic-layout/menu-side/index.vue +113 -0
  145. package/src/layouts/basic-layout/menu-side/menu-collapse.vue +76 -0
  146. package/src/layouts/basic-layout/menu-side/menu-item.vue +31 -0
  147. package/src/layouts/basic-layout/menu-side/menu-title.vue +56 -0
  148. package/src/layouts/basic-layout/menu-side/submenu.vue +31 -0
  149. package/src/layouts/basic-layout/mixins/click-item.js +21 -0
  150. package/src/layouts/basic-layout/mixins/sider-menu-badge.js +13 -0
  151. package/src/layouts/basic-layout/mixins/translate-title.js +11 -0
  152. package/src/layouts/basic-layout/tabs/index.vue +192 -0
  153. package/src/layouts/basic-layout/water-mark/index.vue +29 -0
  154. package/src/libs/lodop/index.js +145 -0
  155. package/src/libs/random_str.js +10 -0
  156. package/src/libs/request/index.js +158 -0
  157. package/src/libs/system/index.js +234 -0
  158. package/src/libs/util.cookies.js +44 -0
  159. package/src/libs/util.db.js +13 -0
  160. package/src/libs/util.js +55 -0
  161. package/src/libs/util.log.js +88 -0
  162. package/src/libs/water-mark.js +44 -0
  163. package/src/menu/header.js +20 -0
  164. package/src/menu/modules/dashboard.js +23 -0
  165. package/src/menu/sider.js +12 -0
  166. package/src/mixins/app.js +9 -0
  167. package/src/mixins/page.js +643 -0
  168. package/src/pages/account/login.vue +101 -0
  169. package/src/pages/common/home.vue +169 -0
  170. package/src/pages/common/task-form.vue +350 -0
  171. package/src/pages/common/todo.vue +31 -0
  172. package/src/pages/system/apiLog.vue +79 -0
  173. package/src/pages/system/applicationType.vue +182 -0
  174. package/src/pages/system/customPage.vue +62 -0
  175. package/src/pages/system/customTable.vue +98 -0
  176. package/src/pages/system/dict.vue +36 -0
  177. package/src/pages/system/dictType.vue +58 -0
  178. package/src/pages/system/entityView.vue +38 -0
  179. package/src/pages/system/error/404.vue +6 -0
  180. package/src/pages/system/extendColumn.vue +99 -0
  181. package/src/pages/system/formView.vue +136 -0
  182. package/src/pages/system/log.vue +55 -0
  183. package/src/pages/system/notice.vue +26 -0
  184. package/src/pages/system/openApi.vue +26 -0
  185. package/src/pages/system/openUser.vue +66 -0
  186. package/src/pages/system/organization.vue +98 -0
  187. package/src/pages/system/organizationType.vue +26 -0
  188. package/src/pages/system/permission.vue +175 -0
  189. package/src/pages/system/planJob.vue +40 -0
  190. package/src/pages/system/printTemplate.vue +48 -0
  191. package/src/pages/system/process.vue +79 -0
  192. package/src/pages/system/processType.vue +26 -0
  193. package/src/pages/system/role.vue +395 -0
  194. package/src/pages/system/rolePropertyEdit.vue +480 -0
  195. package/src/pages/system/sequenceSetting.vue +26 -0
  196. package/src/pages/system/systemData.vue +52 -0
  197. package/src/pages/system/tableView.vue +386 -0
  198. package/src/pages/system/taskQueue.vue +48 -0
  199. package/src/pages/system/user.vue +250 -0
  200. package/src/pages/template/processPage.vue +243 -0
  201. package/src/pages/template/reportPage.vue +66 -0
  202. package/src/pages/template/viewPage.vue +139 -0
  203. package/src/plugins/auth/index.js +21 -0
  204. package/src/plugins/error/index.js +31 -0
  205. package/src/plugins/index.js +24 -0
  206. package/src/plugins/sweetalert2/index.js +20 -0
  207. package/src/router/dynamic.js +183 -0
  208. package/src/router/index.js +84 -0
  209. package/src/setting.js +202 -0
  210. package/src/store/index.js +9 -0
  211. package/src/store/modules/admin/index.js +16 -0
  212. package/src/store/modules/admin/modules/account.js +103 -0
  213. package/src/store/modules/admin/modules/cache.js +119 -0
  214. package/src/store/modules/admin/modules/dataView.js +112 -0
  215. package/src/store/modules/admin/modules/db.js +231 -0
  216. package/src/store/modules/admin/modules/i18n.js +87 -0
  217. package/src/store/modules/admin/modules/layout.js +115 -0
  218. package/src/store/modules/admin/modules/loader.js +44 -0
  219. package/src/store/modules/admin/modules/log.js +77 -0
  220. package/src/store/modules/admin/modules/menu.js +338 -0
  221. package/src/store/modules/admin/modules/page.js +466 -0
  222. package/src/store/modules/admin/modules/user.js +96 -0
  223. package/src/store/modules/admin/modules/viewPage.js +34 -0
  224. package/src/styles/common.less +47 -0
  225. package/src/styles/css/default.css +510 -0
  226. package/src/styles/css/login.css +1217 -0
  227. package/src/styles/default/index.less +6 -0
  228. package/src/styles/font/demo.css +539 -0
  229. package/src/styles/font/demo_index.html +372 -0
  230. package/src/styles/font/icon-demo/demo.css +539 -0
  231. package/src/styles/font/icon-demo/demo_index.html +423 -0
  232. package/src/styles/font/icon-demo/iconfont.css +61 -0
  233. package/src/styles/font/icon-demo/iconfont.eot +0 -0
  234. package/src/styles/font/icon-demo/iconfont.js +1 -0
  235. package/src/styles/font/icon-demo/iconfont.svg +59 -0
  236. package/src/styles/font/icon-demo/iconfont.ttf +0 -0
  237. package/src/styles/font/icon-demo/iconfont.woff +0 -0
  238. package/src/styles/font/icon-demo/iconfont.woff2 +0 -0
  239. package/src/styles/font/iconfont.css +47 -0
  240. package/src/styles/font/iconfont.js +1 -0
  241. package/src/styles/font/iconfont.json +65 -0
  242. package/src/styles/font/iconfont.ttf +0 -0
  243. package/src/styles/font/iconfont.woff +0 -0
  244. package/src/styles/font/iconfont.woff2 +0 -0
  245. package/src/styles/font/ionicons.svg +870 -0
  246. package/src/styles/font/ionicons.ttf +0 -0
  247. package/src/styles/font/ionicons.woff +0 -0
  248. package/src/styles/font/ionicons.woff2 +0 -0
  249. package/src/styles/index.less +7 -0
  250. package/src/styles/layout/basic-layout/layout.less +527 -0
  251. package/src/styles/layout/basic-layout/menu.less +274 -0
  252. package/src/styles/layout/index.less +2 -0
  253. package/src/styles/setting.less +6 -0
  254. package/styleguide.config.js +22 -0
  255. package/test/api/barcode.js +50 -0
  256. package/test/api/inbound.js +47 -0
  257. package/test/api/interfaceLog.js +15 -0
  258. package/test/api/interfaceQueue.js +15 -0
  259. package/test/api/interfaceServer.js +29 -0
  260. package/test/api/movePlan.js +50 -0
  261. package/test/api/movePlanItem.js +13 -0
  262. package/test/api/moveType.js +22 -0
  263. package/test/api/openApiPermission.js +25 -0
  264. package/test/api/outbound.js +40 -0
  265. package/test/api/permission.js +34 -0
  266. package/test/api/rolePermission.js +17 -0
  267. package/test/api/user.js +40 -0
  268. package/test/api/viewColumn.js +16 -0
  269. package/test/api/warehouse.js +13 -0
  270. package/test/api/warehouseMoveType.js +18 -0
  271. package/test/main.js +55 -0
  272. package/test/package.js +33 -0
  273. package/test/pages/home/index.vue +22 -0
  274. package/test/pages/task/test.vue +28 -0
  275. package/test/pages/test/dataViewTest.vue +28 -0
  276. package/test/pages/test/logReport.vue +25 -0
  277. package/test/pages/test/testPage.vue +38 -0
  278. package/test/router/routes.js +88 -0
  279. package/test/setting.env.js +22 -0
  280. package/test/styles/css/custom.css +0 -0
  281. package/test/styles/css/login.css +1217 -0
  282. package/vite.config.js +72 -0
  283. package/vue.config.js +20 -0
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div>
3
+ <MenuItem v-bind="$attrs" :to="menu.path" :replace="menu.replace" :target="menu.target" :name="menu.path" @click="handleClick(menu.path)">
4
+ <i-menu-side-title :menu="menu" :hide-title="hideTitle" />
5
+ <Badge class="i-layout-menu-side-badge" v-if="badgeData" v-bind="badgeData" />
6
+ </MenuItem>
7
+ </div>
8
+ </template>
9
+ <script>
10
+ import iMenuSideTitle from './menu-title';
11
+ import clickItem from '../mixins/click-item';
12
+ import siderMenuBadge from '../mixins/sider-menu-badge';
13
+
14
+ export default {
15
+ name: 'iMenuSideItem',
16
+ components: { iMenuSideTitle },
17
+ mixins: [clickItem, siderMenuBadge],
18
+ props: {
19
+ menu: {
20
+ type: Object,
21
+ default() {
22
+ return {};
23
+ }
24
+ },
25
+ hideTitle: {
26
+ type: Boolean,
27
+ default: false
28
+ }
29
+ }
30
+ };
31
+ </script>
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <span class="i-layout-menu-side-title" :class="{ 'i-layout-menu-side-title-with-collapse': collapse }">
3
+ <span class="i-layout-menu-side-title-icon" :class="{ 'i-layout-menu-side-title-icon-single': hideTitle }" v-if="withIcon">
4
+ <Icon :type="menu.icon" v-if="menu.icon" />
5
+ <Icon :custom="menu.custom" v-else-if="menu.custom" />
6
+ <img :src="menu.img" v-else-if="menu.img" />
7
+ </span>
8
+ <span
9
+ class="i-layout-menu-side-title-text"
10
+ :class="{
11
+ 'i-layout-menu-side-title-text-selected': selected,
12
+ 'i-layout-menu-side-title-text-with-subtitle': menu.subtitle,
13
+ 'i-layout-menu-side-title-text-with-icon': withIcon
14
+ }"
15
+ v-if="!hideTitle"
16
+ >
17
+ {{ tTitle(menu.title) }}
18
+ <em v-if="menu.subtitle">{{ tTitle(menu.subtitle) }}</em>
19
+ </span>
20
+ </span>
21
+ </template>
22
+ <script>
23
+ import tTitle from '../mixins/translate-title';
24
+
25
+ export default {
26
+ name: 'iMenuSideTitle',
27
+ mixins: [tTitle],
28
+ props: {
29
+ menu: {
30
+ type: Object,
31
+ default() {
32
+ return {};
33
+ }
34
+ },
35
+ hideTitle: {
36
+ type: Boolean,
37
+ default: false
38
+ },
39
+ // 用于侧边栏收起 Dropdown 当前高亮
40
+ selected: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ // 侧边栏折叠状态
45
+ collapse: {
46
+ type: Boolean,
47
+ default: false
48
+ }
49
+ },
50
+ computed: {
51
+ withIcon() {
52
+ return this.menu.icon || this.menu.custom || this.menu.img;
53
+ }
54
+ }
55
+ };
56
+ </script>
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <Submenu :name="menu.path">
3
+ <template #title>
4
+ <i-menu-side-title :menu="menu" />
5
+ <Badge class="i-layout-menu-side-badge" v-if="badgeData" v-bind="badgeData" />
6
+ </template>
7
+ <template v-for="(item, index) in menu.children" :key="index">
8
+ <i-menu-side-item v-if="item.children === undefined || !item.children.length" :menu="item" />
9
+ <i-menu-side-submenu v-else :menu="item" />
10
+ </template>
11
+ </Submenu>
12
+ </template>
13
+ <script>
14
+ import iMenuSideItem from './menu-item';
15
+ import iMenuSideTitle from './menu-title';
16
+ import siderMenuBadge from '../mixins/sider-menu-badge';
17
+
18
+ export default {
19
+ name: 'iMenuSideSubmenu',
20
+ components: { iMenuSideItem, iMenuSideTitle },
21
+ mixins: [siderMenuBadge],
22
+ props: {
23
+ menu: {
24
+ type: Object,
25
+ default() {
26
+ return {};
27
+ }
28
+ }
29
+ }
30
+ };
31
+ </script>
@@ -0,0 +1,21 @@
1
+ import { findComponentUpward } from 'view-ui-plus/src/utils/assist';
2
+ import { mapState } from 'vuex';
3
+
4
+ export default {
5
+ computed: {
6
+ ...mapState('admin/layout', ['menuSiderReload', 'menuHeaderReload'])
7
+ },
8
+ methods: {
9
+ handleClick(path, type = 'sider') {
10
+ const current = this.$route.path;
11
+ if (current === path) {
12
+ if (type === 'sider' && this.menuSiderReload) this.handleReload();
13
+ else if (type === 'header' && this.menuHeaderReload) this.handleReload();
14
+ }
15
+ },
16
+ handleReload() {
17
+ const $layout = findComponentUpward(this, 'BasicLayout');
18
+ if ($layout) $layout.handleReload();
19
+ }
20
+ }
21
+ };
@@ -0,0 +1,13 @@
1
+ import { mapState } from 'vuex';
2
+
3
+ export default {
4
+ computed: {
5
+ ...mapState('admin/menu', ['siderMenuBadge']),
6
+ badgeData() {
7
+ let data = null;
8
+ const siderMenuBadge = this.siderMenuBadge.find(item => item.path === this.menu.path);
9
+ if (siderMenuBadge) data = siderMenuBadge;
10
+ return data;
11
+ }
12
+ }
13
+ };
@@ -0,0 +1,11 @@
1
+ export default {
2
+ methods: {
3
+ tTitle(title) {
4
+ if (title && title.indexOf('$t:') === 0) {
5
+ return this.$t(title.split('$t:')[1]);
6
+ } else {
7
+ return title;
8
+ }
9
+ }
10
+ }
11
+ };
@@ -0,0 +1,192 @@
1
+ <template>
2
+ <div class="i-layout-tabs" :class="classes" :style="styles">
3
+ <div class="i-layout-tabs-main">
4
+ <Tabs
5
+ type="card"
6
+ :model-value="current"
7
+ :animated="false"
8
+ closable
9
+ :draggable="tabsOrder"
10
+ @on-click="handleClickTab"
11
+ @on-tab-remove="handleClickClose"
12
+ @on-drag-drop="handleDragDrop"
13
+ >
14
+ <TabPane v-for="(page, index) in opened" :key="index" :label="h => tabLabel(h, page)" :name="page.fullPath" :closable="page.meta && page.meta.closable" />
15
+ </Tabs>
16
+ <Dropdown class="i-layout-tabs-close" @on-click="handleClose">
17
+ <div class="i-layout-tabs-close-main">
18
+ <Icon type="ios-arrow-down" />
19
+ </div>
20
+ <template #list>
21
+ <DropdownMenu>
22
+ <DropdownItem name="left">
23
+ <Icon type="md-arrow-back" />
24
+ {{ $t('basicLayout.tabs.left') }}
25
+ </DropdownItem>
26
+ <DropdownItem name="right">
27
+ <Icon type="md-arrow-forward" />
28
+ {{ $t('basicLayout.tabs.right') }}
29
+ </DropdownItem>
30
+ <DropdownItem name="other">
31
+ <Icon type="md-close" />
32
+ {{ $t('basicLayout.tabs.other') }}
33
+ </DropdownItem>
34
+ <DropdownItem name="all">
35
+ <Icon type="md-close-circle" />
36
+ {{ $t('basicLayout.tabs.all') }}
37
+ </DropdownItem>
38
+ </DropdownMenu>
39
+ </template>
40
+ </Dropdown>
41
+ </div>
42
+ </div>
43
+ </template>
44
+ <script>
45
+ import { mapState, mapGetters, mapActions } from 'vuex';
46
+ import menuSider from '../../../menu/sider';
47
+ import tTitle from '../mixins/translate-title';
48
+
49
+ import Setting from '../../../setting';
50
+
51
+ import { getAllSiderMenu } from '../../../libs/system';
52
+
53
+ import { cloneDeep } from 'lodash';
54
+ import random from '../../../libs/random_str';
55
+
56
+ export default {
57
+ name: 'iTabs',
58
+ mixins: [tTitle],
59
+ emits: ['on-reload'],
60
+ computed: {
61
+ ...mapState('admin/page', ['opened', 'current']),
62
+ ...mapState('admin/layout', ['showTabsIcon', 'tabsFix', 'tabsReload', 'tabsOrder', 'headerFix', 'headerStick', 'isMobile', 'menuCollapse']),
63
+ ...mapGetters('admin/menu', ['hideSider']),
64
+ classes() {
65
+ return {
66
+ 'i-layout-tabs-fix': this.tabsFix
67
+ };
68
+ },
69
+ isHeaderStick() {
70
+ return this.hideSider;
71
+ },
72
+ styles() {
73
+ let style = {};
74
+ if (this.tabsFix && !this.headerFix) {
75
+ style.top = `${Setting.headerHeight - this.scrollTop}px`;
76
+ }
77
+
78
+ const menuWidth = this.isHeaderStick ? 0 : this.menuCollapse ? Setting.menuSideCollapseWidth : Setting.menuSideWidth;
79
+ if (!this.isMobile && this.tabsFix) {
80
+ style.width = `calc(100% - ${menuWidth}px)`;
81
+ style.left = `${menuWidth}px`;
82
+ }
83
+
84
+ return style;
85
+ }
86
+ },
87
+ data() {
88
+ return {
89
+ // 得到所有侧边菜单,并转为平级,查询图标用
90
+ allSiderMenu: getAllSiderMenu(menuSider),
91
+ scrollTop: 0
92
+ };
93
+ },
94
+ methods: {
95
+ ...mapActions('admin/page', ['close', 'closeLeft', 'closeRight', 'closeOther', 'closeAll', 'updateOpened']),
96
+ tabLabel(h, page) {
97
+ const title = h('span', this.tTitle(page.meta ? page.meta.title : '未命名') || '未命名');
98
+ let slot = [];
99
+
100
+ if (this.showTabsIcon) {
101
+ const fullPathWithoutQuery = page.fullPath.indexOf('?') >= 0 ? page.fullPath.split('?')[0] : page.fullPath;
102
+ const currentMenu = this.allSiderMenu.find(menu => menu.path === fullPathWithoutQuery) || {};
103
+
104
+ let icon;
105
+ if (currentMenu.icon) {
106
+ icon = h('Icon', {
107
+ type: currentMenu.icon
108
+ });
109
+ } else if (currentMenu.custom) {
110
+ icon = h('Icon', {
111
+ custom: currentMenu.custom
112
+ });
113
+ } else if (currentMenu.img) {
114
+ icon = h('img', {
115
+ src: currentMenu.img
116
+ });
117
+ }
118
+
119
+ if (icon) slot.push(icon);
120
+ slot.push(title);
121
+ } else {
122
+ slot.push(title);
123
+ }
124
+
125
+ return h(
126
+ 'div',
127
+ {
128
+ class: 'i-layout-tabs-title'
129
+ },
130
+ slot
131
+ );
132
+ },
133
+ handleClickTab(tabName) {
134
+ if (tabName === this.current) {
135
+ if (this.tabsReload) {
136
+ this.$emit('on-reload');
137
+ }
138
+ } else {
139
+ const page = this.opened.find(page => page.fullPath === tabName);
140
+ const { name, params, query } = page;
141
+
142
+ if (page) this.$router.push({ name, params, query }, () => {});
143
+ }
144
+ },
145
+ handleClickClose(tagName) {
146
+ this.close({
147
+ tagName
148
+ });
149
+ },
150
+ handleScroll() {
151
+ if (this.tabsFix && !this.headerFix) {
152
+ const scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
153
+ this.scrollTop = scrollTop > Setting.headerHeight ? Setting.headerHeight : scrollTop;
154
+ }
155
+ },
156
+ handleClose(name) {
157
+ const params = {
158
+ pageSelect: this.current
159
+ };
160
+ switch (name) {
161
+ case 'left':
162
+ this.closeLeft(params);
163
+ break;
164
+ case 'right':
165
+ this.closeRight(params);
166
+ break;
167
+ case 'other':
168
+ this.closeOther(params);
169
+ break;
170
+ case 'all':
171
+ this.closeAll();
172
+ break;
173
+ }
174
+ },
175
+ handleDragDrop(name, newName, a, b) {
176
+ let opened = cloneDeep(this.opened);
177
+ opened.splice(b, 1, ...opened.splice(a, 1, opened[b]));
178
+ this.updateOpened({ opened });
179
+ },
180
+ random() {
181
+ return random(6);
182
+ }
183
+ },
184
+ mounted() {
185
+ document.addEventListener('scroll', this.handleScroll, { passive: true });
186
+ this.handleScroll();
187
+ },
188
+ beforeUnmount() {
189
+ document.removeEventListener('scroll', this.handleScroll);
190
+ }
191
+ };
192
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <div :style="styles" v-if="waterMark.show"></div>
3
+ </template>
4
+ <script>
5
+ import { mapState } from 'vuex';
6
+ import getWaterMarkCanvas from '../../../libs/water-mark';
7
+
8
+ export default {
9
+ name: 'i-water-mark',
10
+ computed: {
11
+ ...mapState('admin/layout', ['waterMark']),
12
+ styles() {
13
+ const url = getWaterMarkCanvas(this.waterMark.text, this.waterMark.options);
14
+ return {
15
+ width: '100%',
16
+ height: '100%',
17
+ position: 'absolute',
18
+ top: '0',
19
+ left: '0',
20
+ 'z-index': '2000',
21
+ 'background-size': '320px',
22
+ 'background-repeat': 'repeat',
23
+ 'background-image': `url(${url})`,
24
+ 'pointer-events': 'none'
25
+ };
26
+ }
27
+ }
28
+ };
29
+ </script>
@@ -0,0 +1,145 @@
1
+ /* eslint-disable no-empty */
2
+ /* eslint-disable no-undef */
3
+ var CreatedOKLodop7766 = null;
4
+
5
+ //= ===判断是否需要安装CLodop云打印服务器:====
6
+ const needCLodop = () => {
7
+ try {
8
+ var ua = navigator.userAgent;
9
+ if (ua.match(/Windows\sPhone/i) != null) return true;
10
+ if (ua.match(/iPhone|iPod/i) != null) return true;
11
+ if (ua.match(/Android/i) != null) return true;
12
+ if (ua.match(/Edge\D?\d+/i) != null) return true;
13
+ if (ua.match(/QQBrowser/i) != null) return false;
14
+ var verTrident = ua.match(/Trident\D?\d+/i);
15
+ var verIE = ua.match(/MSIE\D?\d+/i);
16
+ var verOPR = ua.match(/OPR\D?\d+/i);
17
+ var verFF = ua.match(/Firefox\D?\d+/i);
18
+ var x64 = ua.match(/x64/i);
19
+ if (verTrident == null && verIE == null && x64 !== null) {
20
+ return true;
21
+ } else if (verFF !== null) {
22
+ verFF = verFF[0].match(/\d+/);
23
+ if (verFF[0] >= 42) return true;
24
+ } else if (verOPR !== null) {
25
+ verOPR = verOPR[0].match(/\d+/);
26
+ if (verOPR[0] >= 32) return true;
27
+ } else if (verTrident == null && verIE == null) {
28
+ var verChrome = ua.match(/Chrome\D?\d+/i);
29
+ if (verChrome !== null) {
30
+ verChrome = verChrome[0].match(/\d+/);
31
+ if (verChrome[0] >= 42) return true;
32
+ }
33
+ }
34
+ return false;
35
+ } catch (err) {
36
+ return true;
37
+ }
38
+ };
39
+
40
+ //= ===获取LODOP对象的主过程:====
41
+ const getLodop = (oOBJECT, oEMBED) => {
42
+ var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
43
+ var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
44
+ var strHtm64Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
45
+ var strHtm64Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
46
+ var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
47
+ var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
48
+ var strCLodopInstall =
49
+ "<br><font color='#FF00FF'>CLodop云打印服务(localhost本地)未安装启动!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>,安装后请刷新页面。</font>";
50
+ var strCLodopUpdate = "<br><font color='#FF00FF'>CLodop云打印服务需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
51
+ var LODOP;
52
+ try {
53
+ var isIE = navigator.userAgent.indexOf('MSIE') >= 0 || navigator.userAgent.indexOf('Trident') >= 0;
54
+ if (needCLodop()) {
55
+ try {
56
+ LODOP = getCLodop();
57
+ } catch (err) {}
58
+ if (!LODOP && document.readyState !== 'complete') {
59
+ alert('C-Lodop没准备好,请稍后再试!');
60
+ return;
61
+ }
62
+ if (!LODOP) {
63
+ if (isIE) document.write(strCLodopInstall);
64
+ else {
65
+ document.documentElement.innerHTML = strCLodopInstall + document.documentElement.innerHTML;
66
+ }
67
+ return;
68
+ } else {
69
+ if (CLODOP.CVERSION < '2.0.6.8') {
70
+ if (isIE) document.write(strCLodopUpdate);
71
+ else {
72
+ document.documentElement.innerHTML = strCLodopUpdate + document.documentElement.innerHTML;
73
+ }
74
+ }
75
+ if (oEMBED && oEMBED.parentNode) oEMBED.parentNode.removeChild(oEMBED);
76
+ if (oOBJECT && oOBJECT.parentNode) oOBJECT.parentNode.removeChild(oOBJECT);
77
+ }
78
+ } else {
79
+ var is64IE = isIE && navigator.userAgent.indexOf('x64') >= 0;
80
+ //= ====如果页面有Lodop就直接使用,没有则新建:==========
81
+ if (oOBJECT !== undefined || oEMBED !== undefined) {
82
+ if (isIE) LODOP = oOBJECT;
83
+ else LODOP = oEMBED;
84
+ } else if (CreatedOKLodop7766 == null) {
85
+ LODOP = document.createElement('object');
86
+ LODOP.setAttribute('width', 0);
87
+ LODOP.setAttribute('height', 0);
88
+ LODOP.setAttribute('style', 'position:absolute;left:0px;top:-100px;width:0px;height:0px;');
89
+ if (isIE) LODOP.setAttribute('classid', 'clsid:2105C259-1E0C-4534-8141-A753534CB4CA');
90
+ else LODOP.setAttribute('type', 'application/x-print-lodop');
91
+ document.documentElement.appendChild(LODOP);
92
+ CreatedOKLodop7766 = LODOP;
93
+ } else LODOP = CreatedOKLodop7766;
94
+ //= ====Lodop插件未安装时提示下载地址:==========
95
+ if (LODOP == null || typeof LODOP.VERSION === 'undefined') {
96
+ if (navigator.userAgent.indexOf('Chrome') >= 0) {
97
+ document.documentElement.innerHTML = strHtmChrome + document.documentElement.innerHTML;
98
+ }
99
+ if (navigator.userAgent.indexOf('Firefox') >= 0) {
100
+ document.documentElement.innerHTML = strHtmFireFox + document.documentElement.innerHTML;
101
+ }
102
+ if (is64IE) document.write(strHtm64Install);
103
+ else if (isIE) document.write(strHtmInstall);
104
+ else {
105
+ document.documentElement.innerHTML = strHtmInstall + document.documentElement.innerHTML;
106
+ }
107
+ return LODOP;
108
+ }
109
+ }
110
+ if (LODOP.VERSION < '6.2.0.8') {
111
+ if (needCLodop()) {
112
+ document.documentElement.innerHTML = strCLodopUpdate + document.documentElement.innerHTML;
113
+ } else if (is64IE) document.write(strHtm64Update);
114
+ else if (isIE) document.write(strHtmUpdate);
115
+ else {
116
+ document.documentElement.innerHTML = strHtmUpdate + document.documentElement.innerHTML;
117
+ }
118
+ return LODOP;
119
+ }
120
+ //= ==如下空白位置适合调用统一功能(如注册语句、语言选择等):===
121
+ LODOP.SET_LICENSES('上海汽车信息产业投资有限公司', '1A1683BD13ED8A56138F8BF8328862FF', '', '');
122
+
123
+ //= ==========================================================
124
+ return LODOP;
125
+ } catch (err) {
126
+ alert('getLodop出错:' + err);
127
+ }
128
+ };
129
+
130
+ //= ===页面引用CLodop云打印必须的JS文件:====
131
+ if (needCLodop()) {
132
+ var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;
133
+ var oscript = document.createElement('script');
134
+ oscript.src = 'http://localhost:8000/CLodopfuncs.js?priority=1';
135
+ head.insertBefore(oscript, head.firstChild);
136
+
137
+ // oscript = document.createElement("script");
138
+ // oscript.src = "http://192.168.7.153:8000/CLodopfuncs.js?priority=2";
139
+ // head.insertBefore( oscript,head.firstChild );
140
+ }
141
+
142
+ export default {
143
+ needCLodop,
144
+ getLodop
145
+ };
@@ -0,0 +1,10 @@
1
+ // 生成随机字符串
2
+ export default function (len = 32) {
3
+ const $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
4
+ const maxPos = $chars.length;
5
+ let str = '';
6
+ for (let i = 0; i < len; i++) {
7
+ str += $chars.charAt(Math.floor(Math.random() * maxPos));
8
+ }
9
+ return str;
10
+ }