多租户前端修改提交

This commit is contained in:
yaoyn
2024-07-19 17:47:11 +08:00
parent d85c09bd83
commit 8034e9b090
23 changed files with 958 additions and 43 deletions

View File

@ -6,6 +6,7 @@ import appSearch from './src/search/AppSearch.vue';
import appLocalePicker from './src/AppLocalePicker.vue';
import appDarkModeToggle from './src/AppDarkModeToggle.vue';
import userPostChange from './src/UserPostChange.vue';
import userTenantChange from './src/UserTenantChange.vue';
export { useAppProviderContext } from './src/useAppContext';
export const AppLogo = withInstall(appLogo);
@ -14,3 +15,4 @@ export const AppSearch = withInstall(appSearch);
export const AppLocalePicker = withInstall(appLocalePicker);
export const AppDarkModeToggle = withInstall(appDarkModeToggle);
export const UserPostChange = withInstall(userPostChange);
export const UserTenantChange = withInstall(userTenantChange);

View File

@ -0,0 +1,116 @@
<template>
<Tooltip placement="bottom" :mouseEnterDelay="0.5">
<Dropdown v-if="formInfo.tenants.length>1"
placement="bottom"
:trigger="['click']"
:dropMenuList="formInfo.tenants"
:selectedKeys="selectedKeys"
@menu-event="handleMenuEvent"
overlayClassName="app-locale-picker-overlay"
>
<span class="cursor-pointer flex items-center" style="margin-left: 10px;">
<Icon icon="ant-design:apartment-outlined" size="18" style="color:#222222"/>
<span style="color: rgba(0, 0, 0, 0.85);margin-left: 5px;">{{formInfo.tenantName}}</span>
</span>
</Dropdown>
<span v-else class="flex items-center" style="margin-left: 10px;">
<Icon icon="ant-design:apartment-outlined" size="18" style="color:#222222"/>
<span style="color: rgba(0, 0, 0, 0.85);margin-left: 5px;">{{formInfo.tenantName}}</span>
</span>
</Tooltip>
</template>
<script lang="ts" setup>
import type { DropMenu } from '/@/components/Dropdown';
import { ref, watchEffect, watch, h } from 'vue';
import { Dropdown } from '/@/components/Dropdown';
import { Icon } from '/@/components/Icon';
import { storeToRefs } from 'pinia';
import { Tooltip } from 'ant-design-vue';
import { useUserStore } from '/@/store/modules/user';
import { changeTenant } from '/@/api/system/tenant';
import { useI18n } from '/@/hooks/web/useI18n';
import {useMessage} from "/@/hooks/web/useMessage";
import {useTabs} from "/@/hooks/web/useTabs";
import {router} from "/@/router";
import {setupRouterGuard} from "/@/router/guard";
import {usePermissionStore} from "/@/store/modules/permission";
import {useMenuSetting} from "/@/hooks/setting/useMenuSetting";
import {useAppInject} from "/@/hooks/web/useAppInject";
import {useAppStore} from "/@/store/modules/app";
const userStore = useUserStore();
const { t } = useI18n();
const { userInfo } = storeToRefs(userStore);
const { closeAll } = useTabs(router);
const permissionStore = usePermissionStore();
const { getShowTopMenu } = useMenuSetting();
const { getIsMobile } = useAppInject();
const appStore = useAppStore();
const formInfo: any = ref({
tenants: [],
tenantId: '',
tenantCode: '',
tenantName: '',
});
getDropMenuList();
watch(
() => userInfo.value,
(val) => {
if (val) getDropMenuList();
},
);
const selectedKeys = ref<string[]>([]);
watchEffect(() => {
selectedKeys.value = [formInfo.value.tenantCode];
});
function getDropMenuList() {
if (userInfo.value?.tenants) {
formInfo.value = userInfo.value;
formInfo.value.tenants.forEach((o) => {
o.text = o.name;
o.event = o.code;
});
}
}
async function toggleLocale(lang: string) {
appStore.setPageLoadingAction(true);
let res = await changeTenant(lang);
await userStore.afterLoginAction(true);
closeAll();
await setupRouterGuard(router);
await permissionStore.changeSubsystem(getShowTopMenu.value, getIsMobile.value);
if(permissionStore.getSubSysList.length>0){
permissionStore.setSubSystem(permissionStore.getSubSysList[0].id);
}else{
permissionStore.setSubSystem("");
}
//appStore.setPageLoadingAction(false);
//location.reload();
}
function handleMenuEvent(menu: DropMenu) {
if (formInfo.value.tenantCode === menu.event) {
return;
}
const { createConfirm } = useMessage();
createConfirm({
iconType: 'warning',
title: () => h('span', t('温馨提醒')),
content: () => h('span', t('是否确认切换租户?未保存的数据可能会丢失!')),
onOk: async () => {
toggleLocale(menu.event as string);
},
okText: () => t('确认'),
cancelText: () => t('取消'),
});
}
</script>
<style lang="less">
.app-locale-picker-overlay {
.ant-dropdown-menu-item {
min-width: 160px;
}
}
</style>

View File

@ -1,58 +1,58 @@
<template>
<a-date-picker
:size="size"
v-model:value="modelValue"
:placeholder="placeholder"
:format="format"
:valueFormat="format"
:allowClear="allowClear"
:disabled="disabled"
:showTime="format === 'YYYY-MM-DD HH:mm:ss'"
:picker="picker"
@change="handleChange"
/>
<a-date-picker
:size="size"
v-model:value="modelValue"
:placeholder="placeholder"
:format="format"
:valueFormat="format"
:allowClear="allowClear"
:disabled="originalDisabled"
:showTime="format === 'YYYY-MM-DD HH:mm:ss'"
:picker="picker"
@change="handleChange"
/>
</template>
<script lang="ts" setup>
import dayjs from 'dayjs';
import { ref, watch, computed } from 'vue';
import dayjs, {Dayjs} from 'dayjs';
import {ref, watch, computed} from 'vue';
const props = defineProps({
const props = defineProps({
value: [dayjs, String, Object],
size: String,
placeholder: String,
format: String,
allowClear: Boolean,
disabled: Boolean,
});
const modelValue = ref<string>();
const emit = defineEmits(['update:value']);
originalDisabled: {
type: Boolean,
default: false
}
});
const modelValue = ref<Dayjs>();
const emit = defineEmits(['update:value']);
const picker = computed(() => {
const picker = computed(() => {
let time = 'date';
switch (props.format) {
case 'YYYY-MM':
time = 'month';
break;
case 'YYYY':
time = 'year';
break;
case 'YYYY-MM':
time = 'month';
break;
case 'YYYY':
time = 'year';
break;
}
return time;
});
watch(
});
watch(
() => props.value,
(val) => {
if (val && typeof val !== 'string') {
modelValue.value = val?.format(props.format);
} else {
modelValue.value = val || '';
}
modelValue.value = dayjs(val || '');
},
{
immediate: true,
immediate: true,
},
);
const handleChange = (time) => {
);
const handleChange = (time) => {
emit('update:value', time);
};
};
</script>

View File

@ -99,6 +99,7 @@ componentMap.set('CheckboxGroup', Checkbox.Group);
componentMap.set('ApiCascader', ApiCascader);
componentMap.set('Slider', Slider);
componentMap.set('Rate', Rate);
componentMap.set('DeptTree', SelectDepartment);
componentMap.set('Dept', SelectDepartmentV2);
componentMap.set('User', SelectUserV2);
componentMap.set('Info', CommonInfo);

View File

@ -124,6 +124,7 @@ export type ComponentType =
| 'Card'
| 'ChildTable'
| 'Divider'
| 'DeptTree'
| 'Dept'
| 'User'
| 'Info'

View File

@ -178,7 +178,12 @@
let id = await submit(saveRowKey);
let rowKey = getRowKey();
values[rowKey] = id;
values['_id'] = id
values['_id'] = id;
//重新查一遍
let newValues=await SystemFormRef.value.setFormDataFromId(id);
if(newValues){
values=newValues;
}
}
return values;