mooho-base-admin-plus 0.1.64 → 0.1.68

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 (39) hide show
  1. package/dist/mooho-base-admin-plus.min.esm.js +2332 -1680
  2. package/dist/mooho-base-admin-plus.min.js +57 -69
  3. package/dist/setting.js +27 -1
  4. package/dist/style.css +1 -1
  5. package/package.json +2 -2
  6. package/public/setting.js +27 -1
  7. package/src/components/input/dialog-select.vue +9 -8
  8. package/src/components/input/item-select.vue +1 -0
  9. package/src/components/richEditor/index.vue +2 -2
  10. package/src/components/upload/upload-attachment.vue +7 -7
  11. package/src/components/upload/upload-image.vue +17 -11
  12. package/src/components/view/filter-edit.vue +2 -2
  13. package/src/components/view/form-setting-layout.vue +11 -6
  14. package/src/components/view/view-form.vue +2 -1
  15. package/src/components/view/view-table.vue +58 -67
  16. package/src/i18n/locale/en-US.js +1 -1
  17. package/src/i18n/locale/lang.js +1 -1
  18. package/src/i18n/locale/zh-CN.js +1 -1
  19. package/src/layouts/basic-layout/mixins/click-item.js +21 -21
  20. package/src/layouts/basic-layout/mixins/sider-menu-badge.js +13 -13
  21. package/src/layouts/basic-layout/mixins/translate-title.js +11 -11
  22. package/src/layouts/basic-layout/water-mark/index.vue +29 -29
  23. package/src/libs/lodop/index.js +3 -1
  24. package/src/libs/random_str.js +10 -10
  25. package/src/libs/request/index.js +4 -1
  26. package/src/libs/water-mark.js +44 -44
  27. package/src/pages/template/processPage.vue +7 -1
  28. package/src/plugins/log/index.js +25 -0
  29. package/src/setting.js +13 -2
  30. package/src/store/modules/admin/modules/page.js +28 -25
  31. package/src/styles/common.less +47 -47
  32. package/src/styles/css/login.css +1 -1
  33. package/src/styles/default/index.less +6 -6
  34. package/src/styles/font/iconfont.css +47 -47
  35. package/src/styles/font/iconfont.json +65 -65
  36. package/src/styles/layout/basic-layout/layout.less +527 -527
  37. package/src/styles/layout/basic-layout/menu.less +274 -274
  38. package/src/styles/layout/index.less +2 -2
  39. package/src/styles/setting.less +6 -6
@@ -1,13 +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
- };
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
+ };
@@ -1,11 +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
- };
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
+ };
@@ -1,29 +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>
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>
@@ -1,5 +1,7 @@
1
1
  /* eslint-disable no-empty */
2
2
  /* eslint-disable no-undef */
3
+ import Setting from '../../setting';
4
+
3
5
  var CreatedOKLodop7766 = null;
4
6
 
5
7
  //= ===判断是否需要安装CLodop云打印服务器:====
@@ -118,7 +120,7 @@ const getLodop = (oOBJECT, oEMBED) => {
118
120
  return LODOP;
119
121
  }
120
122
  //= ==如下空白位置适合调用统一功能(如注册语句、语言选择等):===
121
- LODOP.SET_LICENSES('上海汽车信息产业投资有限公司', '1A1683BD13ED8A56138F8BF8328862FF', '', '');
123
+ LODOP.SET_LICENSES(Setting.lodop.name, Setting.lodop.key, '', '');
122
124
 
123
125
  //= ==========================================================
124
126
  return LODOP;
@@ -1,10 +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
- }
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
+ }
@@ -107,7 +107,10 @@ service.interceptors.response.use(
107
107
  },
108
108
  error => {
109
109
  if (error && error.response && error.response.status === 401) {
110
- getRouter().push('/login?redirect=' + getRouter().history._startLocation);
110
+ console.log('1', getRouter());
111
+ if (getRouter().currentRoute.value.path != '/login') {
112
+ getRouter().push('/login?redirect=' + getRouter().options.history.location);
113
+ }
111
114
  }
112
115
 
113
116
  store.commit('admin/loader/end');
@@ -1,44 +1,44 @@
1
- /**
2
- * @description 生成水印
3
- * */
4
- export default function getWaterMarkCanvas(text, options) {
5
- const canvas = document.createElement('canvas');
6
- const ctx = canvas.getContext('2d');
7
- const canvasWidth = 400;
8
- const canvasHeight = 400;
9
- canvas.width = canvasWidth;
10
- canvas.height = canvasHeight;
11
- ctx.textAlign = 'center';
12
- ctx.textBaseline = 'bottom';
13
- ctx.globalAlpha = options.globalAlpha || 0.1;
14
- ctx.font = options.font || '20px Microsoft Yahei';
15
-
16
- ctx.translate(canvasWidth / 2, canvasHeight / 2);
17
- ctx.rotate(options.rotateAngle || -0.4);
18
-
19
- ctx.translate((-canvasWidth / 2) * 1.2, (-canvasHeight / 2) * 1.2);
20
-
21
- const waterMarkText = [];
22
- const chunkWidth = options.chunkWidth || 400;
23
- const chunkHeight = options.chunkHeight || 120;
24
- const horizontalChunkCount = 0;
25
- const verticalChunkCount = 1;
26
-
27
- for (let j = 0, initY = chunkHeight / 2, indent = 0; j <= verticalChunkCount; j += 1) {
28
- indent = parseInt(j % 2);
29
-
30
- for (let i = 0, initX = chunkWidth / 2; i <= horizontalChunkCount; i += 1) {
31
- waterMarkText.push({
32
- text,
33
- x: i * chunkWidth + indent * initX,
34
- y: j * chunkHeight + initY
35
- });
36
- }
37
- }
38
-
39
- waterMarkText.forEach(item => {
40
- ctx.fillText(item.text, item.x, item.y);
41
- });
42
-
43
- return ctx.canvas.toDataURL();
44
- }
1
+ /**
2
+ * @description 生成水印
3
+ * */
4
+ export default function getWaterMarkCanvas(text, options) {
5
+ const canvas = document.createElement('canvas');
6
+ const ctx = canvas.getContext('2d');
7
+ const canvasWidth = 400;
8
+ const canvasHeight = 400;
9
+ canvas.width = canvasWidth;
10
+ canvas.height = canvasHeight;
11
+ ctx.textAlign = 'center';
12
+ ctx.textBaseline = 'bottom';
13
+ ctx.globalAlpha = options.globalAlpha || 0.1;
14
+ ctx.font = options.font || '20px Microsoft Yahei';
15
+
16
+ ctx.translate(canvasWidth / 2, canvasHeight / 2);
17
+ ctx.rotate(options.rotateAngle || -0.4);
18
+
19
+ ctx.translate((-canvasWidth / 2) * 1.2, (-canvasHeight / 2) * 1.2);
20
+
21
+ const waterMarkText = [];
22
+ const chunkWidth = options.chunkWidth || 400;
23
+ const chunkHeight = options.chunkHeight || 120;
24
+ const horizontalChunkCount = 0;
25
+ const verticalChunkCount = 1;
26
+
27
+ for (let j = 0, initY = chunkHeight / 2, indent = 0; j <= verticalChunkCount; j += 1) {
28
+ indent = parseInt(j % 2);
29
+
30
+ for (let i = 0, initX = chunkWidth / 2; i <= horizontalChunkCount; i += 1) {
31
+ waterMarkText.push({
32
+ text,
33
+ x: i * chunkWidth + indent * initX,
34
+ y: j * chunkHeight + initY
35
+ });
36
+ }
37
+ }
38
+
39
+ waterMarkText.forEach(item => {
40
+ ctx.fillText(item.text, item.x, item.y);
41
+ });
42
+
43
+ return ctx.canvas.toDataURL();
44
+ }
@@ -32,7 +32,13 @@
32
32
  <Button type="primary" custom-icon="fa fa-save" @click="save">保存</Button>
33
33
  <Button
34
34
  type="warning"
35
- v-if="$refs.form && $refs.form.data && $refs.form.data.application && $refs.form.data.application.status == 'Rejected'"
35
+ v-if="
36
+ $refs.form &&
37
+ $refs.form.data &&
38
+ $refs.form.data.application &&
39
+ $refs.form.data.applicationID &&
40
+ ($refs.form.data.application.status == 'Draft' || $refs.form.data.application.status == 'Rejected')
41
+ "
36
42
  custom-icon="fa fa-trash-alt"
37
43
  @click="cancel"
38
44
  >
@@ -0,0 +1,25 @@
1
+ import store from '../../store';
2
+ import util from '../../libs/util';
3
+
4
+ export default {
5
+ install(app) {
6
+ // 快速打印 log
7
+ app.config.globalProperties.$log = {
8
+ ...util.log,
9
+ push(data) {
10
+ if (typeof data === 'string') {
11
+ // 如果传递来的数据是字符串
12
+ // 赋值给 message 字段
13
+ // 为了方便使用
14
+ // eg: this.$log.push('foo text')
15
+ store.dispatch('admin/log/push', {
16
+ message: data
17
+ });
18
+ } else if (typeof data === 'object') {
19
+ // 如果传递来的数据是对象
20
+ store.dispatch('admin/log/push', data);
21
+ }
22
+ }
23
+ };
24
+ }
25
+ };
package/src/setting.js CHANGED
@@ -46,6 +46,15 @@ const Setting = {
46
46
  // 是否通过远程接口来获取 i81n 文件
47
47
  remote: false
48
48
  },
49
+ /**
50
+ * 打印控件
51
+ * */
52
+ lodop: {
53
+ // 名称
54
+ name: '南京摩赫信息技术有限公司',
55
+ // key
56
+ key: '58C4DF8932E17DEBE409D1E7F683CAFE'
57
+ },
49
58
  /**
50
59
  * 布局配置
51
60
  * */
@@ -77,7 +86,7 @@ const Setting = {
77
86
  // 是否固定顶栏
78
87
  headerFix: true,
79
88
  // 是否在下滑时隐藏顶栏,需开启 headerFix,如果开启了 tabsFix,Tabs 也会被隐藏
80
- headerHide: false,
89
+ headerHide: true,
81
90
  // 是否显示顶部菜单栏
82
91
  // 一般来说,侧边的菜单栏足以满足大部分业务,如需动态切换侧边栏,可开启此选项启用顶部一级菜单,此时侧边栏将作为二级菜单
83
92
  headerMenu: false,
@@ -120,7 +129,9 @@ const Setting = {
120
129
  // 是否允许点击遮罩层关闭
121
130
  maskClosable: true,
122
131
  // 是否允许拖动
123
- draggable: true
132
+ draggable: true,
133
+ // 筛选标题栏宽度
134
+ filterWidth: 125
124
135
  },
125
136
  /**
126
137
  * 多页 Tabs
@@ -181,37 +181,40 @@ export default {
181
181
  */
182
182
  open({ state, commit, dispatch }, { name, params, query, fullPath }) {
183
183
  return new Promise(async resolve => {
184
- // 已经打开的页面
185
- let opened = state.opened;
186
- // 判断此页面是否已经打开 并且记录位置
187
- let pageOpenedIndex = 0;
188
- const pageOpened = opened.find((page, index) => {
189
- const same = page.fullPath === fullPath;
190
- pageOpenedIndex = same ? index : pageOpenedIndex;
191
- return same;
192
- });
193
- if (pageOpened) {
194
- // 页面以前打开过
195
- await dispatch('openedUpdate', {
196
- index: pageOpenedIndex,
197
- params,
198
- query,
199
- fullPath
184
+ setTimeout(async () => {
185
+ // 已经打开的页面
186
+ let opened = state.opened;
187
+ // 判断此页面是否已经打开 并且记录位置
188
+ let pageOpenedIndex = 0;
189
+ const pageOpened = opened.find((page, index) => {
190
+ const same = page.fullPath === fullPath;
191
+ pageOpenedIndex = same ? index : pageOpenedIndex;
192
+ return same;
200
193
  });
201
- } else {
202
- // 页面以前没有打开过
203
- let page = state.pool.find(t => t.name === name);
204
- // 如果这里没有找到 page 代表这个路由虽然在框架内 但是不参与标签页显示
205
- if (page) {
206
- await dispatch('add', {
207
- tag: Object.assign({}, page),
194
+ if (pageOpened) {
195
+ // 页面以前打开过
196
+ await dispatch('openedUpdate', {
197
+ index: pageOpenedIndex,
208
198
  params,
209
199
  query,
210
200
  fullPath
211
201
  });
202
+ } else {
203
+ // 页面以前没有打开过
204
+ let page = state.pool.find(t => t.name === name);
205
+ // 如果这里没有找到 page 代表这个路由虽然在框架内 但是不参与标签页显示
206
+ if (page) {
207
+ await dispatch('add', {
208
+ tag: Object.assign({}, page),
209
+ params,
210
+ query,
211
+ fullPath
212
+ });
213
+ }
212
214
  }
213
- }
214
- commit('currentSet', fullPath);
215
+ commit('currentSet', fullPath);
216
+ });
217
+
215
218
  // end
216
219
  resolve();
217
220
  });
@@ -1,47 +1,47 @@
1
- #app, body, html{
2
- height: 100%;
3
- }
4
- body{
5
- background-color: @background-color-base;
6
- font-size: 14px;
7
- }
8
-
9
- // 隐藏滚动条样式
10
- .i-scrollbar-hide{
11
- &::-webkit-scrollbar{
12
- width: 0;
13
- }
14
- &::-webkit-scrollbar-track{
15
- background-color: transparent;
16
- }
17
- &::-webkit-scrollbar-thumb{
18
- background: #e8eaec;
19
- }
20
- }
21
-
22
- // 极简滚动条样式
23
- .i-scrollbar{
24
- &::-webkit-scrollbar{
25
- width: 6px;
26
- }
27
- &::-webkit-scrollbar-track{
28
- background-color: transparent;
29
- }
30
- &::-webkit-scrollbar-thumb{
31
- background: #808695;
32
- border-radius: 4px;
33
- }
34
- }
35
-
36
- // 去除 Table 的左右边框,更精简
37
- .i-table-no-border{
38
- .ivu-table th{
39
- background-color: #fff;
40
- }
41
- .ivu-table-wrapper, .ivu-table tr:last-child td{
42
- border: none;
43
- }
44
- .ivu-table:before, .ivu-table:after{
45
- display: none;
46
- }
47
- }
1
+ #app, body, html{
2
+ height: 100%;
3
+ }
4
+ body{
5
+ background-color: @background-color-base;
6
+ font-size: 14px;
7
+ }
8
+
9
+ // 隐藏滚动条样式
10
+ .i-scrollbar-hide{
11
+ &::-webkit-scrollbar{
12
+ width: 0;
13
+ }
14
+ &::-webkit-scrollbar-track{
15
+ background-color: transparent;
16
+ }
17
+ &::-webkit-scrollbar-thumb{
18
+ background: #e8eaec;
19
+ }
20
+ }
21
+
22
+ // 极简滚动条样式
23
+ .i-scrollbar{
24
+ &::-webkit-scrollbar{
25
+ width: 6px;
26
+ }
27
+ &::-webkit-scrollbar-track{
28
+ background-color: transparent;
29
+ }
30
+ &::-webkit-scrollbar-thumb{
31
+ background: #808695;
32
+ border-radius: 4px;
33
+ }
34
+ }
35
+
36
+ // 去除 Table 的左右边框,更精简
37
+ .i-table-no-border{
38
+ .ivu-table th{
39
+ background-color: #fff;
40
+ }
41
+ .ivu-table-wrapper, .ivu-table tr:last-child td{
42
+ border: none;
43
+ }
44
+ .ivu-table:before, .ivu-table:after{
45
+ display: none;
46
+ }
47
+ }
@@ -323,7 +323,7 @@ i {
323
323
 
324
324
  .g-side-tab .hd,
325
325
  .cf {
326
- *zoom: 1;
326
+ /* *zoom: 1; */
327
327
  }
328
328
 
329
329
  .g-side-tab .hd:before,
@@ -1,6 +1,6 @@
1
- // 自定义主题
2
- // 详见 https://www.iviewui.com/docs/guide/theme
3
- @import 'view-ui-plus/src/styles/index.less';
4
-
5
- @menu-dark-title: #191a23;
6
- @menu-dark-active-bg: #101117;
1
+ // 自定义主题
2
+ // 详见 https://www.iviewui.com/docs/guide/theme
3
+ @import 'view-ui-plus/src/styles/index.less';
4
+
5
+ @menu-dark-title: #191a23;
6
+ @menu-dark-active-bg: #101117;
@@ -1,47 +1,47 @@
1
- @font-face {
2
- font-family: "i-icon"; /* Project id 1125611 */
3
- src: url('iconfont.woff2?t=1651052284018') format('woff2'),
4
- url('iconfont.woff?t=1651052284018') format('woff'),
5
- url('iconfont.ttf?t=1651052284018') format('truetype');
6
- }
7
-
8
- .i-icon {
9
- font-family: "i-icon" !important;
10
- font-size: 16px;
11
- font-style: normal;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- .i-icon-i18n:before {
17
- content: "\e8e9";
18
- }
19
-
20
- .i-icon-refresh:before {
21
- content: "\e7d1";
22
- }
23
-
24
- .i-icon-record:before {
25
- content: "\e61f";
26
- }
27
-
28
- .i-icon-notification:before {
29
- content: "\e69d";
30
- }
31
-
32
- .i-icon-full-screen:before {
33
- content: "\e743";
34
- }
35
-
36
- .i-icon-exit-full-screen:before {
37
- content: "\e657";
38
- }
39
-
40
- .i-icon-menu-unfold:before {
41
- content: "\e68b";
42
- }
43
-
44
- .i-icon-menu-fold:before {
45
- content: "\e600";
46
- }
47
-
1
+ @font-face {
2
+ font-family: "i-icon"; /* Project id 1125611 */
3
+ src: url('iconfont.woff2?t=1651052284018') format('woff2'),
4
+ url('iconfont.woff?t=1651052284018') format('woff'),
5
+ url('iconfont.ttf?t=1651052284018') format('truetype');
6
+ }
7
+
8
+ .i-icon {
9
+ font-family: "i-icon" !important;
10
+ font-size: 16px;
11
+ font-style: normal;
12
+ -webkit-font-smoothing: antialiased;
13
+ -moz-osx-font-smoothing: grayscale;
14
+ }
15
+
16
+ .i-icon-i18n:before {
17
+ content: "\e8e9";
18
+ }
19
+
20
+ .i-icon-refresh:before {
21
+ content: "\e7d1";
22
+ }
23
+
24
+ .i-icon-record:before {
25
+ content: "\e61f";
26
+ }
27
+
28
+ .i-icon-notification:before {
29
+ content: "\e69d";
30
+ }
31
+
32
+ .i-icon-full-screen:before {
33
+ content: "\e743";
34
+ }
35
+
36
+ .i-icon-exit-full-screen:before {
37
+ content: "\e657";
38
+ }
39
+
40
+ .i-icon-menu-unfold:before {
41
+ content: "\e68b";
42
+ }
43
+
44
+ .i-icon-menu-fold:before {
45
+ content: "\e600";
46
+ }
47
+