2023-05-30 19:27:03 +08:00

169 lines
4.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<h-b-config-provider
:locale="locale"
:component-size="sizeType"
:pro-table="proTableGlobalConfig"
:form="formGlobalConfig"
>
<h-props-provider :datePicker="datePickerGlobalConfig">
<router-view />
</h-props-provider>
</h-b-config-provider>
</template>
<script lang="ts">
import { computed, defineComponent, provide, watch, h, reactive, isRef, isShallow } from 'vue';
import { useI18n, setI18nLanguage } from '@crami/locale';
import { Icon } from '@crami/ui';
import { defaultLang, langMap } from './locales';
import type { ConfigProviderProps } from 'ant-design-vue/lib/config-provider';
import { baseInfo } from '@/store/baseInfo';
// 模块联邦:远程引入的多语言设置方法
import { setLanguage, baseInfoHandle } from '@remote/icpx-platform/utils';
// import { locales } from '@remote/icpx-platform/lang';
// import { setLanguage } from '@/utils/localeUtils';
export default defineComponent({
name: 'App',
setup() {
// 多语言
const { t } = useI18n();
const i18n = useI18n();
// 设置模块联邦引入的多语言
const setGlobleLang = async (lang = defaultLang) => {
const i18n = useI18n();
// 获取远程模块的多语言
let getLangObj = await import('@remote/icpx-platform/lang');
const langObj = await getLangObj.default(langMap[lang]);
// 合并多远程模块的多语言
i18n.mergeLocaleMessage(langMap[lang], langObj.default);
};
// 基座应用的数据处理
baseInfoHandle(baseInfo);
setLanguage(baseInfo.lang);
// 多语言多时区处理
setGlobleLang(baseInfo.lang);
localStorage.setItem('TIME_ZONE', baseInfo.timeZone);
const getLocal = computed(() => {
const local = i18n.locale;
if (isRef(local) || isShallow(local)) {
return local.value;
}
return local;
});
const locale = computed(() => {
return i18n.getLocaleMessage(getLocal.value).antd as ConfigProviderProps['locale'];
});
// 多时区
const datePickerGlobalConfig = reactive({
timeZone: baseInfo.timeZone,
});
// const sizeType = computed(() => store.getters['app/sizeType']);
const sizeType = computed(() => 'default');
// 全局表格配置
const proTableGlobalConfig = reactive({
toolbar: {
showSelectionTitle: true,
settingIcon: () => h(Icon, { name: 'icp-table-setting', width: '16px', height: '16px' }),
},
stripe: true,
showHeaderLine: true,
settingShowColumn: {
valueType: 'action',
},
headerAlign: 'start', // 排序图标跟随表头文字
pagination: {
showSizeChanger: true, // 显示可改变每页数量
showQuickJumper: true, //是否可以快速跳转至某页
pageSizeOptions: ['10', '20', '50', '100'], // 每页数量选项
// showTotal: (total, range) => `第 ${range[0]}~${range[1]} 条 / 共 ${total} 条`, // 显示总数
showTotal: (total, range) =>
t('pages.table.pagination', {
total,
number1: range[0],
number2: range[1],
}), // 显示总数
},
});
// 全局form配置,仅在dev分支使用
const formGlobalConfig = reactive({
// layout: 'vertical', // horizontal vertical
// title: '查询',
// submitter: {
// actionButtonGroupPosition: 'top',
// // 是否显示展开收起按钮
// showAdvancedButton: true,
// // 如果 showAdvancedButton 为 true超过指定行数行默认折叠
// autoAdvancedLine: 1,
// // 折叠时始终保持显示的行数
// alwaysShowLines: 1,
// },
// 真对于查询全局配置
queryFormProps: {
layout: 'horizontal',
title: '',
labelCol: { style: { width: '150px' } }, //标签
// submitter: {
// showActionButtonGroup: true,
// actionButtonGroupPosition: 'bottom',
// showAdvancedButton: true,
// autoAdvancedLine: 2,
// alwaysShowLines: 1,
// },
},
});
// 监听多语言的变化
watch(
() => baseInfo.lang,
async () => {
await setGlobleLang(baseInfo.lang);
setLanguage(baseInfo.lang);
},
);
// 监听时区的变化的变化
watch(
() => baseInfo.timeZone,
() => {
datePickerGlobalConfig.timeZone = baseInfo.timeZone;
localStorage.setItem('TIME_ZONE', baseInfo.timeZone);
},
);
return {
t,
i18n,
locale,
sizeType,
proTableGlobalConfig,
formGlobalConfig,
datePickerGlobalConfig,
baseInfo,
setGlobleLang,
};
},
});
</script>
<style scoped>
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #42b883aa);
}
</style>