mooho-base-admin-plus 2.5.33 → 2.5.35
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/history.md +2 -0
- package/package/mooho-base-admin-plus.min.esm.js +7161 -8066
- package/package/mooho-base-admin-plus.min.js +60 -72
- package/package.json +1 -1
- package/src/components/view/modal-form.vue +5 -2
- package/src/components/view/view-form.vue +1 -1
- package/src/i18n/locale/en-US.js +1 -1
- package/src/i18n/locale/lang.js +1 -1
- package/src/i18n/locale/zh-CN.js +1 -1
- package/src/layouts/basic-layout/mixins/click-item.js +21 -21
- package/src/layouts/basic-layout/mixins/sider-menu-badge.js +13 -13
- package/src/layouts/basic-layout/water-mark/index.vue +29 -29
- package/src/libs/random_str.js +10 -10
- package/src/libs/water-mark.js +44 -44
- package/src/plugins/log/index.js +25 -0
- package/src/store/modules/admin/modules/account.js +7 -4
- package/src/store/modules/admin/modules/menu.js +4 -0
- package/src/store/modules/admin/modules/page.js +7 -2
- package/src/styles/common.less +47 -47
- package/src/styles/default/index.less +6 -6
- package/src/styles/font/iconfont.css +47 -47
- package/src/styles/font/iconfont.json +65 -65
- package/src/styles/layout/basic-layout/layout.less +527 -527
- package/src/styles/layout/basic-layout/menu.less +274 -274
- package/src/styles/layout/index.less +2 -2
- package/src/styles/setting.less +6 -6
package/package.json
CHANGED
|
@@ -340,15 +340,18 @@
|
|
|
340
340
|
// forceUpdate() {
|
|
341
341
|
// //this.$refs.form.$forceUpdate();
|
|
342
342
|
// },
|
|
343
|
-
onChange(sender, oldValue, newValue, selected) {
|
|
343
|
+
onChange(sender, oldValue, newValue, selected, tableRow, tableSender, tableSelected) {
|
|
344
344
|
/**
|
|
345
345
|
* 数据变化事件
|
|
346
346
|
* @property {object} sender 触发的列对象
|
|
347
347
|
* @property {object} oldValue 原数据
|
|
348
348
|
* @property {object} newValue 新数据
|
|
349
349
|
* @property {object} selected 选中对象(弹出选择框等有效)
|
|
350
|
+
* @property {object} tableRow 表格行
|
|
351
|
+
* @property {object} tableSender 表格中的控件
|
|
352
|
+
* @property {object} tableSelected 表格中的选中项目
|
|
350
353
|
*/
|
|
351
|
-
this.$emit('on-change', sender, oldValue, newValue, selected);
|
|
354
|
+
this.$emit('on-change', sender, oldValue, newValue, selected, tableRow, tableSender, tableSelected);
|
|
352
355
|
},
|
|
353
356
|
/**
|
|
354
357
|
* 设置表格字段内容
|
|
@@ -1377,7 +1377,7 @@
|
|
|
1377
1377
|
* @property {object} selected 选中对象(弹出选择框等有效)
|
|
1378
1378
|
* @property {object} tableRow 表格行
|
|
1379
1379
|
* @property {object} tableSender 表格中的控件
|
|
1380
|
-
* @property {object} tableSelected
|
|
1380
|
+
* @property {object} tableSelected 表格中的选中项目
|
|
1381
1381
|
*/
|
|
1382
1382
|
this.$emit('on-change', sender, null, null, this.$refs['table_' + sender.code][0].data, tableRow, tableSender, tableSelected);
|
|
1383
1383
|
} else if (sender != null) {
|
package/src/i18n/locale/en-US.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./lang.js";const t={i:{locale:"en-US",select:{placeholder:"Select",noMatch:"No matching data",loading:"Loading"},table:{noDataText:"No Data",noFilteredDataText:"No filter data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},datepicker:{selectDate:"Select date",selectTime:"Select time",startTime:"Start Time",endTime:"End Time",clear:"Clear",ok:"OK",datePanelLabel:"[mmmm] [yyyy]",month:"Month",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",year:"Year",weekStartDay:"0",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},months:{m1:"Jan",m2:"Feb",m3:"Mar",m4:"Apr",m5:"May",m6:"Jun",m7:"Jul",m8:"Aug",m9:"Sep",m10:"Oct",m11:"Nov",m12:"Dec"}},transfer:{titles:{source:"Source",target:"Target"},filterPlaceholder:"Search here",notFoundText:"Not Found"},modal:{okText:"OK",cancelText:"Cancel"},poptip:{okText:"OK",cancelText:"Cancel"},page:{prev:"Previous Page",next:"Next Page",total:"Total",item:"item",items:"items",prev5:"Previous 5 Pages",next5:"Next 5 Pages",page:"/page",goto:"Goto",p:""},rate:{star:"Star",stars:"Stars"},time:{before:" ago",after:" after",just:"just now",seconds:" seconds",minutes:" minutes",hours:" hours",days:" days"},tree:{emptyText:"No Data"}}};e(t);export{t as default};
|
|
1
|
+
import{s as e}from"./lang.js";const t={i:{locale:"en-US",select:{placeholder:"Select",noMatch:"No matching data",loading:"Loading"},table:{noDataText:"No Data",noFilteredDataText:"No filter data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},datepicker:{selectDate:"Select date",selectTime:"Select time",startTime:"Start Time",endTime:"End Time",clear:"Clear",ok:"OK",datePanelLabel:"[mmmm] [yyyy]",month:"Month",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",year:"Year",weekStartDay:"0",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},months:{m1:"Jan",m2:"Feb",m3:"Mar",m4:"Apr",m5:"May",m6:"Jun",m7:"Jul",m8:"Aug",m9:"Sep",m10:"Oct",m11:"Nov",m12:"Dec"}},transfer:{titles:{source:"Source",target:"Target"},filterPlaceholder:"Search here",notFoundText:"Not Found"},modal:{okText:"OK",cancelText:"Cancel"},poptip:{okText:"OK",cancelText:"Cancel"},page:{prev:"Previous Page",next:"Next Page",total:"Total",item:"item",items:"items",prev5:"Previous 5 Pages",next5:"Next 5 Pages",page:"/page",goto:"Goto",p:""},rate:{star:"Star",stars:"Stars"},time:{before:" ago",after:" after",just:"just now",seconds:" seconds",minutes:" minutes",hours:" hours",days:" days"},tree:{emptyText:"No Data"}}};e(t);export{t as default};
|
package/src/i18n/locale/lang.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=typeof window!="undefined";function n(i){e&&typeof window.viewuiplus!="undefined"&&("langs"in viewuiplus||(viewuiplus.langs={}),viewuiplus.langs[i.i.locale]=i)}export{n as s};
|
|
1
|
+
const e=typeof window!="undefined";function n(i){e&&typeof window.viewuiplus!="undefined"&&("langs"in viewuiplus||(viewuiplus.langs={}),viewuiplus.langs[i.i.locale]=i)}export{n as s};
|
package/src/i18n/locale/zh-CN.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./lang.js";const t={i:{locale:"zh-CN",select:{placeholder:"\u8BF7\u9009\u62E9",noMatch:"\u65E0\u5339\u914D\u6570\u636E",loading:"\u52A0\u8F7D\u4E2D"},table:{noDataText:"\u6682\u65E0\u6570\u636E",noFilteredDataText:"\u6682\u65E0\u7B5B\u9009\u7ED3\u679C",confirmFilter:"\u7B5B\u9009",resetFilter:"\u91CD\u7F6E",clearFilter:"\u5168\u90E8",sumText:"\u5408\u8BA1"},datepicker:{selectDate:"\u9009\u62E9\u65E5\u671F",selectTime:"\u9009\u62E9\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",clear:"\u6E05\u7A7A",ok:"\u786E\u5B9A",datePanelLabel:"[yyyy\u5E74] [m\u6708]",month:"\u6708",month1:"1 \u6708",month2:"2 \u6708",month3:"3 \u6708",month4:"4 \u6708",month5:"5 \u6708",month6:"6 \u6708",month7:"7 \u6708",month8:"8 \u6708",month9:"9 \u6708",month10:"10 \u6708",month11:"11 \u6708",month12:"12 \u6708",year:"\u5E74",weekStartDay:"0",weeks:{sun:"\u65E5",mon:"\u4E00",tue:"\u4E8C",wed:"\u4E09",thu:"\u56DB",fri:"\u4E94",sat:"\u516D"},months:{m1:"1\u6708",m2:"2\u6708",m3:"3\u6708",m4:"4\u6708",m5:"5\u6708",m6:"6\u6708",m7:"7\u6708",m8:"8\u6708",m9:"9\u6708",m10:"10\u6708",m11:"11\u6708",m12:"12\u6708"}},transfer:{titles:{source:"\u6E90\u5217\u8868",target:"\u76EE\u7684\u5217\u8868"},filterPlaceholder:"\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",notFoundText:"\u5217\u8868\u4E3A\u7A7A"},modal:{okText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},poptip:{okText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},page:{prev:"\u4E0A\u4E00\u9875",next:"\u4E0B\u4E00\u9875",total:"\u5171",item:"\u6761",items:"\u6761",prev5:"\u5411\u524D 5 \u9875",next5:"\u5411\u540E 5 \u9875",page:"\u6761/\u9875",goto:"\u8DF3\u81F3",p:"\u9875"},rate:{star:"\u661F",stars:"\u661F"},time:{before:"\u524D",after:"\u540E",just:"\u521A\u521A",seconds:"\u79D2",minutes:"\u5206\u949F",hours:"\u5C0F\u65F6",days:"\u5929"},tree:{emptyText:"\u6682\u65E0\u6570\u636E"}}};e(t);export{t as default};
|
|
1
|
+
import{s as e}from"./lang.js";const t={i:{locale:"zh-CN",select:{placeholder:"\u8BF7\u9009\u62E9",noMatch:"\u65E0\u5339\u914D\u6570\u636E",loading:"\u52A0\u8F7D\u4E2D"},table:{noDataText:"\u6682\u65E0\u6570\u636E",noFilteredDataText:"\u6682\u65E0\u7B5B\u9009\u7ED3\u679C",confirmFilter:"\u7B5B\u9009",resetFilter:"\u91CD\u7F6E",clearFilter:"\u5168\u90E8",sumText:"\u5408\u8BA1"},datepicker:{selectDate:"\u9009\u62E9\u65E5\u671F",selectTime:"\u9009\u62E9\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",clear:"\u6E05\u7A7A",ok:"\u786E\u5B9A",datePanelLabel:"[yyyy\u5E74] [m\u6708]",month:"\u6708",month1:"1 \u6708",month2:"2 \u6708",month3:"3 \u6708",month4:"4 \u6708",month5:"5 \u6708",month6:"6 \u6708",month7:"7 \u6708",month8:"8 \u6708",month9:"9 \u6708",month10:"10 \u6708",month11:"11 \u6708",month12:"12 \u6708",year:"\u5E74",weekStartDay:"0",weeks:{sun:"\u65E5",mon:"\u4E00",tue:"\u4E8C",wed:"\u4E09",thu:"\u56DB",fri:"\u4E94",sat:"\u516D"},months:{m1:"1\u6708",m2:"2\u6708",m3:"3\u6708",m4:"4\u6708",m5:"5\u6708",m6:"6\u6708",m7:"7\u6708",m8:"8\u6708",m9:"9\u6708",m10:"10\u6708",m11:"11\u6708",m12:"12\u6708"}},transfer:{titles:{source:"\u6E90\u5217\u8868",target:"\u76EE\u7684\u5217\u8868"},filterPlaceholder:"\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",notFoundText:"\u5217\u8868\u4E3A\u7A7A"},modal:{okText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},poptip:{okText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},page:{prev:"\u4E0A\u4E00\u9875",next:"\u4E0B\u4E00\u9875",total:"\u5171",item:"\u6761",items:"\u6761",prev5:"\u5411\u524D 5 \u9875",next5:"\u5411\u540E 5 \u9875",page:"\u6761/\u9875",goto:"\u8DF3\u81F3",p:"\u9875"},rate:{star:"\u661F",stars:"\u661F"},time:{before:"\u524D",after:"\u540E",just:"\u521A\u521A",seconds:"\u79D2",minutes:"\u5206\u949F",hours:"\u5C0F\u65F6",days:"\u5929"},tree:{emptyText:"\u6682\u65E0\u6570\u636E"}}};e(t);export{t as default};
|
|
@@ -1,21 +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
|
-
};
|
|
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
|
+
};
|
|
@@ -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,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>
|
package/src/libs/random_str.js
CHANGED
|
@@ -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
|
+
}
|
package/src/libs/water-mark.js
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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
|
+
};
|
|
@@ -5,6 +5,7 @@ import util from '../../../../libs/util';
|
|
|
5
5
|
import router from '../../../../router';
|
|
6
6
|
import userApi from '../../../../api/user';
|
|
7
7
|
import swal from 'sweetalert2';
|
|
8
|
+
import Setting from '../../../../setting';
|
|
8
9
|
|
|
9
10
|
export default {
|
|
10
11
|
namespaced: true,
|
|
@@ -17,7 +18,7 @@ export default {
|
|
|
17
18
|
*/
|
|
18
19
|
async login({ dispatch }, { username = '', password = '' } = {}) {
|
|
19
20
|
const res = await userApi.login({ account: username, password });
|
|
20
|
-
dispatch('admin/account/saveLoginData', res, { root: true });
|
|
21
|
+
await dispatch('admin/account/saveLoginData', res, { root: true });
|
|
21
22
|
},
|
|
22
23
|
/**
|
|
23
24
|
* @description 保存登录信息
|
|
@@ -38,10 +39,12 @@ export default {
|
|
|
38
39
|
// 设置 vuex 用户信息
|
|
39
40
|
await dispatch('admin/user/set', user, { root: true });
|
|
40
41
|
await dispatch('admin/user/setData', data, { root: true });
|
|
41
|
-
|
|
42
|
-
await dispatch('load');
|
|
42
|
+
|
|
43
43
|
// 获取动态菜单
|
|
44
44
|
await dispatch('admin/menu/getMenuList', true, { root: true });
|
|
45
|
+
|
|
46
|
+
// 用户登录后从持久化数据加载一系列的设置
|
|
47
|
+
await dispatch('load', { loadOpenedTabs: Setting.page.loadOpenedTabs });
|
|
45
48
|
},
|
|
46
49
|
/**
|
|
47
50
|
* @description 退出登录
|
|
@@ -93,7 +96,7 @@ export default {
|
|
|
93
96
|
// 加载用户登录信息
|
|
94
97
|
await dispatch('admin/user/load', null, { root: true });
|
|
95
98
|
// 持久化数据加载上次退出时的多页列表
|
|
96
|
-
|
|
99
|
+
await dispatch('admin/page/openedLoad', { loadOpenedTabs }, { root: true });
|
|
97
100
|
}
|
|
98
101
|
}
|
|
99
102
|
};
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
import { cloneDeep, get } from 'lodash';
|
|
5
5
|
import router from '../../../../router';
|
|
6
6
|
import Setting from '../../../../setting';
|
|
7
|
-
import menuSider from '../../../../menu/sider';
|
|
8
7
|
import { getAllSiderMenu, includeArray } from '../../../../libs/system';
|
|
9
8
|
|
|
10
9
|
// 判定是否需要缓存
|
|
@@ -68,14 +67,20 @@ export default {
|
|
|
68
67
|
.filter((opened, index) => valid[index] === 1)
|
|
69
68
|
// 对 menu 鉴权过滤
|
|
70
69
|
.filter(opened => {
|
|
70
|
+
let menuSider = rootState.admin.menu.menuSider;
|
|
71
|
+
|
|
71
72
|
const allSiderMenu = getAllSiderMenu(menuSider);
|
|
73
|
+
|
|
72
74
|
const find = allSiderMenu.find(item => item.path === opened.fullPath);
|
|
73
75
|
|
|
74
76
|
let state = true;
|
|
75
|
-
if (find
|
|
77
|
+
if (!find) {
|
|
78
|
+
state = false;
|
|
79
|
+
} else if (find && find.auth) {
|
|
76
80
|
const userInfo = rootState.admin.user.info;
|
|
77
81
|
// @权限
|
|
78
82
|
const access = cloneDeep(userInfo.access);
|
|
83
|
+
|
|
79
84
|
// 给 access 强制加一个 hidden 的权限,否则菜单隐藏后,Tabs 页签会不显示该页签
|
|
80
85
|
access.push('hidden');
|
|
81
86
|
// 如果用户当前的权限,不是该 menu 对应的 权限,则过滤这个 Tab
|
package/src/styles/common.less
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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
|
+
|