mooho-base-admin-plus 0.1.51 → 0.1.52
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/dist/mooho-base-admin-plus.min.esm.js +20 -25
- package/dist/mooho-base-admin-plus.min.js +3 -3
- package/dist/style.css +1 -1
- package/package.json +2 -2
- 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/index.vue +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/mixins/translate-title.js +11 -11
- 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/styles/common.less +47 -47
- package/src/styles/default/index.less +6 -6
- package/src/styles/font/demo.css +539 -539
- package/src/styles/font/demo_index.html +372 -372
- package/src/styles/font/icon-demo/demo.css +539 -539
- package/src/styles/font/icon-demo/demo_index.html +423 -423
- package/src/styles/font/icon-demo/iconfont.css +61 -61
- package/src/styles/font/icon-demo/iconfont.svg +59 -59
- package/src/styles/font/iconfont.css +47 -47
- package/src/styles/font/iconfont.json +65 -65
- package/src/styles/font/ionicons.svg +869 -869
- package/src/styles/index.less +7 -7
- 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
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mooho-base-admin-plus",
|
|
3
3
|
"description": "MOOHO basic framework for admin by Vue3",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.52",
|
|
5
5
|
"author": "jinyifan <jinyifan@mooho.com.cn>",
|
|
6
6
|
"dotnetVersion": "1.3.97",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"private": false,
|
|
9
|
-
"main": "./dist/mooho-base-admin-plus.min.
|
|
9
|
+
"main": "./dist/mooho-base-admin-plus.min.js",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"dev": "vite --open",
|
|
12
12
|
"build": "vite build",
|
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};
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<div class="i-layout-content-main">
|
|
34
34
|
<router-view #default="{ Component }">
|
|
35
35
|
<keep-alive :include="keepAlive">
|
|
36
|
-
<component :is="Component" v-if="loadRouter" />
|
|
36
|
+
<component :is="Component" :key="$route.name" v-if="loadRouter" />
|
|
37
37
|
</keep-alive>
|
|
38
38
|
</router-view>
|
|
39
39
|
</div>
|
|
@@ -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,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>
|
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
|
+
};
|
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;
|