'admin-21.04.28:新增全局改变组件大小功能、拖拽布局演示等'
This commit is contained in:
parent
fa717eb5f2
commit
b240c9d8e9
@ -101,6 +101,7 @@ cnpm run build
|
|||||||
- <a href="https://github.com/davidshimjs/qrcodejs" target="_blank">qrcodejs</a>
|
- <a href="https://github.com/davidshimjs/qrcodejs" target="_blank">qrcodejs</a>
|
||||||
- <a href="https://github.com/crabbly/Print.js" target="_blank">print-js</a>
|
- <a href="https://github.com/crabbly/Print.js" target="_blank">print-js</a>
|
||||||
- <a href="https://github.com/likaia/screen-shot" target="_blank">vue-web-screen-shot</a>
|
- <a href="https://github.com/likaia/screen-shot" target="_blank">vue-web-screen-shot</a>
|
||||||
|
- <a href="https://github.com/jbaysolutions/vue-grid-layout" target="_blank">vue-grid-layout</a>
|
||||||
|
|
||||||
#### 特别感谢
|
#### 特别感谢
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
"screenfull": "^5.1.0",
|
"screenfull": "^5.1.0",
|
||||||
"sortablejs": "^1.13.0",
|
"sortablejs": "^1.13.0",
|
||||||
"vue": "^3.0.5",
|
"vue": "^3.0.5",
|
||||||
|
"vue-grid-layout": "^3.0.0-beta1",
|
||||||
"vue-i18n": "^9.1.4",
|
"vue-i18n": "^9.1.4",
|
||||||
"vue-router": "^4.0.2",
|
"vue-router": "^4.0.2",
|
||||||
"vue-web-screen-shot": "^1.1.9",
|
"vue-web-screen-shot": "^1.1.9",
|
||||||
|
1
plugins.d.ts
vendored
Normal file
1
plugins.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
declare module 'vue-grid-layout';
|
@ -32,6 +32,7 @@ export default {
|
|||||||
funPrintJs: 'PrintJs',
|
funPrintJs: 'PrintJs',
|
||||||
funClipboard: 'Copy cut',
|
funClipboard: 'Copy cut',
|
||||||
funScreenShort: 'screenCapture',
|
funScreenShort: 'screenCapture',
|
||||||
|
funGridLayout: 'Drag layout',
|
||||||
pagesIndex: 'pages',
|
pagesIndex: 'pages',
|
||||||
pagesFiltering: 'Filtering',
|
pagesFiltering: 'Filtering',
|
||||||
pagesFilteringDetails: 'FilteringDetails',
|
pagesFilteringDetails: 'FilteringDetails',
|
||||||
@ -51,12 +52,17 @@ export default {
|
|||||||
layoutIfameView: 'IfameView',
|
layoutIfameView: 'IfameView',
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
title0: 'Component size',
|
||||||
title1: 'Language switching',
|
title1: 'Language switching',
|
||||||
title2: 'Menu search',
|
title2: 'Menu search',
|
||||||
title3: 'Layout configuration',
|
title3: 'Layout configuration',
|
||||||
title4: 'news',
|
title4: 'news',
|
||||||
title5: 'Full screen on',
|
title5: 'Full screen on',
|
||||||
title6: 'Full screen off',
|
title6: 'Full screen off',
|
||||||
|
dropdownDefault: 'default',
|
||||||
|
dropdownMedium: 'medium',
|
||||||
|
dropdownSmall: 'small',
|
||||||
|
dropdownMini: 'mini',
|
||||||
dropdown1: 'home page',
|
dropdown1: 'home page',
|
||||||
dropdown2: 'Personal Center',
|
dropdown2: 'Personal Center',
|
||||||
dropdown3: '404',
|
dropdown3: '404',
|
||||||
|
@ -32,6 +32,7 @@ export default {
|
|||||||
funPrintJs: '页面打印',
|
funPrintJs: '页面打印',
|
||||||
funClipboard: '复制剪切',
|
funClipboard: '复制剪切',
|
||||||
funScreenShort: 'web端自定义截屏',
|
funScreenShort: 'web端自定义截屏',
|
||||||
|
funGridLayout: '拖拽布局',
|
||||||
pagesIndex: '页面',
|
pagesIndex: '页面',
|
||||||
pagesFiltering: '过滤筛选组件',
|
pagesFiltering: '过滤筛选组件',
|
||||||
pagesFilteringDetails: '过滤筛选组件详情',
|
pagesFilteringDetails: '过滤筛选组件详情',
|
||||||
@ -51,12 +52,17 @@ export default {
|
|||||||
layoutIfameView: '内嵌 iframe',
|
layoutIfameView: '内嵌 iframe',
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
title0: '组件大小',
|
||||||
title1: '语言切换',
|
title1: '语言切换',
|
||||||
title2: '菜单搜索',
|
title2: '菜单搜索',
|
||||||
title3: '布局配置',
|
title3: '布局配置',
|
||||||
title4: '消息',
|
title4: '消息',
|
||||||
title5: '开全屏',
|
title5: '开全屏',
|
||||||
title6: '关全屏',
|
title6: '关全屏',
|
||||||
|
dropdownDefault: '默认',
|
||||||
|
dropdownMedium: '中等',
|
||||||
|
dropdownSmall: '小型',
|
||||||
|
dropdownMini: '超小',
|
||||||
dropdown1: '首页',
|
dropdown1: '首页',
|
||||||
dropdown2: '个人中心',
|
dropdown2: '个人中心',
|
||||||
dropdown3: '404',
|
dropdown3: '404',
|
||||||
|
@ -32,6 +32,7 @@ export default {
|
|||||||
funPrintJs: '頁面列印',
|
funPrintJs: '頁面列印',
|
||||||
funClipboard: '複製剪切',
|
funClipboard: '複製剪切',
|
||||||
funScreenShort: '自定義截圖',
|
funScreenShort: '自定義截圖',
|
||||||
|
funGridLayout: '拖拽佈局',
|
||||||
pagesIndex: '頁面',
|
pagesIndex: '頁面',
|
||||||
pagesFiltering: '過濾篩選組件',
|
pagesFiltering: '過濾篩選組件',
|
||||||
pagesFilteringDetails: '過濾篩選組件詳情',
|
pagesFilteringDetails: '過濾篩選組件詳情',
|
||||||
@ -51,12 +52,17 @@ export default {
|
|||||||
layoutIfameView: '内嵌 iframe',
|
layoutIfameView: '内嵌 iframe',
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
title0: '組件大小',
|
||||||
title1: '語言切換',
|
title1: '語言切換',
|
||||||
title2: '選單蒐索',
|
title2: '選單蒐索',
|
||||||
title3: '佈局配寘',
|
title3: '佈局配寘',
|
||||||
title4: '消息',
|
title4: '消息',
|
||||||
title5: '開全屏',
|
title5: '開全屏',
|
||||||
title6: '關全屏',
|
title6: '關全屏',
|
||||||
|
dropdownDefault: '默認',
|
||||||
|
dropdownMedium: '中等',
|
||||||
|
dropdownSmall: '小型',
|
||||||
|
dropdownMini: '超小',
|
||||||
dropdown1: '首頁',
|
dropdown1: '首頁',
|
||||||
dropdown2: '個人中心',
|
dropdown2: '個人中心',
|
||||||
dropdown3: '404',
|
dropdown3: '404',
|
||||||
|
12
src/main.ts
12
src/main.ts
@ -4,15 +4,25 @@ import router from './router';
|
|||||||
import { store, key } from './store';
|
import { store, key } from './store';
|
||||||
import { authDirective } from '/@/utils/authDirective.ts';
|
import { authDirective } from '/@/utils/authDirective.ts';
|
||||||
import { i18n } from '/@/i18n/index.ts';
|
import { i18n } from '/@/i18n/index.ts';
|
||||||
|
import { globalComponentSize } from '/@/utils/componentSize.ts';
|
||||||
|
|
||||||
import ElementPlus from 'element-plus';
|
import ElementPlus from 'element-plus';
|
||||||
import 'element-plus/lib/theme-chalk/index.css';
|
import 'element-plus/lib/theme-chalk/index.css';
|
||||||
import '/@/theme/index.scss';
|
import '/@/theme/index.scss';
|
||||||
import mitt from 'mitt';
|
import mitt from 'mitt';
|
||||||
import screenShort from 'vue-web-screen-shot';
|
import screenShort from 'vue-web-screen-shot';
|
||||||
|
import VueGridLayout from 'vue-grid-layout';
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
app.use(router).use(store, key).use(ElementPlus, { i18n: i18n.global.t }).use(i18n).use(screenShort, { enableWebRtc: false }).mount('#app');
|
app
|
||||||
|
.use(router)
|
||||||
|
.use(store, key)
|
||||||
|
.use(ElementPlus, { i18n: i18n.global.t, size: globalComponentSize })
|
||||||
|
.use(i18n)
|
||||||
|
.use(screenShort, { enableWebRtc: false })
|
||||||
|
.use(VueGridLayout)
|
||||||
|
.mount('#app');
|
||||||
|
|
||||||
app.config.globalProperties.mittBus = mitt();
|
app.config.globalProperties.mittBus = mitt();
|
||||||
|
|
||||||
authDirective(app);
|
authDirective(app);
|
||||||
|
@ -499,6 +499,21 @@ export const dynamicRoutes = [
|
|||||||
icon: 'el-icon-crop',
|
icon: 'el-icon-crop',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/fun/gridLayout',
|
||||||
|
name: 'funGridLayout',
|
||||||
|
component: () => import('/@/views/fun/gridLayout/index.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'message.router.funGridLayout',
|
||||||
|
isLink: '',
|
||||||
|
isHide: false,
|
||||||
|
isKeepAlive: true,
|
||||||
|
isAffix: false,
|
||||||
|
isIframe: false,
|
||||||
|
auth: ['admin', 'test'],
|
||||||
|
icon: 'iconfont icon-tuodong',
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,7 @@ declare interface ThemeConfigState {
|
|||||||
globalTitle: string;
|
globalTitle: string;
|
||||||
globalViceTitle: string;
|
globalViceTitle: string;
|
||||||
globalI18n: string;
|
globalI18n: string;
|
||||||
|
globalComponentSize: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +115,8 @@ const themeConfigModule: Module<ThemeConfigState, RootStateTypes> = {
|
|||||||
globalViceTitle: 'SMALL@小柒',
|
globalViceTitle: 'SMALL@小柒',
|
||||||
// 默认初始语言,可选值"<zh-cn|en|zh-tw>",默认 zh-cn
|
// 默认初始语言,可选值"<zh-cn|en|zh-tw>",默认 zh-cn
|
||||||
globalI18n: 'zh-cn',
|
globalI18n: 'zh-cn',
|
||||||
|
// 默认全局组件大小,可选值"<default|medium|small|mini>",默认 default
|
||||||
|
globalComponentSize: 'default',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
|
4
src/utils/componentSize.ts
Normal file
4
src/utils/componentSize.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { getLocal } from '/@/utils/storage.ts';
|
||||||
|
|
||||||
|
// 全局组件大小
|
||||||
|
export const globalComponentSize = getLocal('themeConfig')?.globalComponentSize;
|
@ -1,6 +1,6 @@
|
|||||||
// 字体图标 url
|
// 字体图标 url
|
||||||
const cssCdnUrlList: Array<string> = [
|
const cssCdnUrlList: Array<string> = [
|
||||||
'//at.alicdn.com/t/font_2298093_cl2h21rqdau.css',
|
'//at.alicdn.com/t/font_2298093_vcabyobusxq.css',
|
||||||
'//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css',
|
'//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css',
|
||||||
];
|
];
|
||||||
// 第三方 js url
|
// 第三方 js url
|
||||||
|
61
src/views/fun/gridLayout/index.vue
Normal file
61
src/views/fun/gridLayout/index.vue
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<template>
|
||||||
|
<div class="grid-layout-container">
|
||||||
|
<el-card shadow="hover" header="vue-grid-layout 拖拽布局演示">
|
||||||
|
<el-alert
|
||||||
|
title="感谢优秀的 `vue-grid-layout`,项目地址:https://github.com/jbaysolutions/vue-grid-layout"
|
||||||
|
type="success"
|
||||||
|
:closable="false"
|
||||||
|
class="mb15"
|
||||||
|
></el-alert>
|
||||||
|
<grid-layout
|
||||||
|
:layout.sync="layouts"
|
||||||
|
:col-num="12"
|
||||||
|
:row-height="30"
|
||||||
|
:is-draggable="true"
|
||||||
|
:is-resizable="true"
|
||||||
|
:is-mirrored="false"
|
||||||
|
:vertical-compact="true"
|
||||||
|
:margin="[10, 10]"
|
||||||
|
:use-css-transforms="true"
|
||||||
|
>
|
||||||
|
<grid-item v-for="item in layouts" :x="item.x" :y="item.y" :w="item.w" :h="item.h" :i="item.i" :key="item.i">
|
||||||
|
<div class="w100 h100 flex">
|
||||||
|
<span class="flex-margin font14">{{ item.i }}</span>
|
||||||
|
</div>
|
||||||
|
</grid-item>
|
||||||
|
</grid-layout>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { toRefs, reactive } from 'vue';
|
||||||
|
export default {
|
||||||
|
name: 'funGridLayout',
|
||||||
|
setup() {
|
||||||
|
const state = reactive({
|
||||||
|
layouts: [
|
||||||
|
{ x: 0, y: 0, w: 2, h: 2, i: '0' },
|
||||||
|
{ x: 2, y: 0, w: 2, h: 4, i: '1' },
|
||||||
|
{ x: 4, y: 0, w: 2, h: 5, i: '2' },
|
||||||
|
{ x: 6, y: 0, w: 2, h: 3, i: '3' },
|
||||||
|
{ x: 8, y: 0, w: 2, h: 3, i: '4' },
|
||||||
|
{ x: 10, y: 0, w: 2, h: 3, i: '5' },
|
||||||
|
{ x: 0, y: 5, w: 2, h: 5, i: '6' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
...toRefs(state),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.grid-layout-container {
|
||||||
|
.vue-grid-item {
|
||||||
|
background: var(--color-primary);
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,5 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-navbars-breadcrumb-user" :style="{ flex: layoutUserFlexNum }">
|
<div class="layout-navbars-breadcrumb-user" :style="{ flex: layoutUserFlexNum }">
|
||||||
|
<el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onComponentSizeChange">
|
||||||
|
<div class="layout-navbars-breadcrumb-user-icon">
|
||||||
|
<i class="iconfont icon-ziti" :title="$t('message.user.title0')"></i>
|
||||||
|
</div>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item command="default" :disabled="disabledSize === 'default'">{{ $t('message.user.dropdownDefault') }}</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="medium" :disabled="disabledSize === 'medium'">{{ $t('message.user.dropdownMedium') }}</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="small" :disabled="disabledSize === 'small'">{{ $t('message.user.dropdownSmall') }}</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="mini" :disabled="disabledSize === 'mini'">{{ $t('message.user.dropdownMini') }}</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
<el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
|
<el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
|
||||||
<div class="layout-navbars-breadcrumb-user-icon">
|
<div class="layout-navbars-breadcrumb-user-icon">
|
||||||
<i class="iconfont" :class="disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'" :title="$t('message.user.title1')"></i>
|
<i class="iconfont" :class="disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'" :title="$t('message.user.title1')"></i>
|
||||||
@ -80,7 +93,8 @@ export default {
|
|||||||
const state = reactive({
|
const state = reactive({
|
||||||
isScreenfull: false,
|
isScreenfull: false,
|
||||||
isShowUserNewsPopover: false,
|
isShowUserNewsPopover: false,
|
||||||
disabledI18n: false,
|
disabledI18n: 'zh-cn',
|
||||||
|
disabledSize: 'small',
|
||||||
});
|
});
|
||||||
// 获取用户信息 vuex
|
// 获取用户信息 vuex
|
||||||
const getUserInfos = computed(() => {
|
const getUserInfos = computed(() => {
|
||||||
@ -154,6 +168,14 @@ export default {
|
|||||||
const onSearchClick = () => {
|
const onSearchClick = () => {
|
||||||
searchRef.value.openSearch();
|
searchRef.value.openSearch();
|
||||||
};
|
};
|
||||||
|
// 组件大小改变
|
||||||
|
const onComponentSizeChange = (size: string) => {
|
||||||
|
removeLocal('themeConfig');
|
||||||
|
getThemeConfig.value.globalComponentSize = size;
|
||||||
|
setLocal('themeConfig', getThemeConfig.value);
|
||||||
|
proxy.$ELEMENT.size = size;
|
||||||
|
initComponentSize();
|
||||||
|
};
|
||||||
// 语言切换
|
// 语言切换
|
||||||
const onLanguageChange = (lang: string) => {
|
const onLanguageChange = (lang: string) => {
|
||||||
removeLocal('themeConfig');
|
removeLocal('themeConfig');
|
||||||
@ -176,9 +198,29 @@ export default {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// 初始化全局组件大小
|
||||||
|
const initComponentSize = () => {
|
||||||
|
switch (getLocal('themeConfig').globalComponentSize) {
|
||||||
|
case 'default':
|
||||||
|
state.disabledSize = 'default';
|
||||||
|
break;
|
||||||
|
case 'medium':
|
||||||
|
state.disabledSize = 'medium';
|
||||||
|
break;
|
||||||
|
case 'small':
|
||||||
|
state.disabledSize = 'small';
|
||||||
|
break;
|
||||||
|
case 'mini':
|
||||||
|
state.disabledSize = 'mini';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
// 页面加载时
|
// 页面加载时
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (getLocal('themeConfig')) initI18n();
|
if (getLocal('themeConfig')) {
|
||||||
|
initI18n();
|
||||||
|
initComponentSize();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
getUserInfos,
|
getUserInfos,
|
||||||
@ -186,6 +228,7 @@ export default {
|
|||||||
onHandleCommandClick,
|
onHandleCommandClick,
|
||||||
onScreenfullClick,
|
onScreenfullClick,
|
||||||
onSearchClick,
|
onSearchClick,
|
||||||
|
onComponentSizeChange,
|
||||||
onLanguageChange,
|
onLanguageChange,
|
||||||
searchRef,
|
searchRef,
|
||||||
layoutUserFlexNum,
|
layoutUserFlexNum,
|
||||||
|
Loading…
Reference in New Issue
Block a user