Merge pull request '切换企业账号' (#9) from feature/0716_切换企业 into main

Reviewed-on: ai-team/lingji-work-fe#9
This commit is contained in:
2025-07-16 10:31:13 +00:00
3 changed files with 65 additions and 19 deletions

View File

@ -5,6 +5,7 @@ import { useEnterpriseStore } from '@/stores/modules/enterprise';
// import { handleUserLogout } from '@/utils/user'; // import { handleUserLogout } from '@/utils/user';
// import { fetchLogOut } from '@/api/all/login'; // import { fetchLogOut } from '@/api/all/login';
import { useSidebarStore } from '@/stores/modules/side-bar'; import { useSidebarStore } from '@/stores/modules/side-bar';
import { useUserStore } from '@/stores';
import { MENU_GROUP_IDS } from '@/router/constants'; import { MENU_GROUP_IDS } from '@/router/constants';
import router from '@/router'; import router from '@/router';
// import { useRoute } from 'vue-router'; // import { useRoute } from 'vue-router';
@ -13,7 +14,9 @@ import ExitAccountModal from '@/components/_base/exit-account-modal/index.vue';
// import { MENU_LIST } from './constants'; // import { MENU_LIST } from './constants';
const sidebarStore = useSidebarStore(); const sidebarStore = useSidebarStore();
// const enterpriseStore = useEnterpriseStore(); const enterpriseStore = useEnterpriseStore();
const userStore = useUserStore();
// const route = useRoute(); // const route = useRoute();
const exitAccountModalRef = ref(null); const exitAccountModalRef = ref(null);
// const selectedKey = ref([]); // const selectedKey = ref([]);
@ -24,6 +27,9 @@ const selectedKey = computed(() => {
const menuList = computed(() => { const menuList = computed(() => {
return sidebarStore.menuList; return sidebarStore.menuList;
}); });
const enterprises = computed(() => {
return userStore.userInfo?.enterprises ?? [];
});
const clickExit = async () => { const clickExit = async () => {
exitAccountModalRef.value?.open(); exitAccountModalRef.value?.open();
@ -38,6 +44,10 @@ const setServerMenu = () => {
const handleDopdownClick = (item) => { const handleDopdownClick = (item) => {
router.push({ name: item.routeName }); router.push({ name: item.routeName });
}; };
const onEnterpriseItemClick = async (item) => {
enterpriseStore.setEnterpriseInfo(item);
window.location.reload();
};
</script> </script>
<template> <template>
@ -90,7 +100,8 @@ const handleDopdownClick = (item) => {
<icon-right size="12" /> <icon-right size="12" />
</a-space> </a-space>
</a-doption> </a-doption>
<!-- <a-doption> <a-dsubmenu value="option-1" position="lt" trigger="hover" class="enterprises-dsubmenu">
<a-doption class="enterprises-doption">
<a-space class="flex justify-between w-100%"> <a-space class="flex justify-between w-100%">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/change.svg" class="w-16px h-16px mr-8px" /> <img src="@/assets/change.svg" class="w-16px h-16px mr-8px" />
@ -98,7 +109,22 @@ const handleDopdownClick = (item) => {
</div> </div>
<icon-right size="12" /> <icon-right size="12" />
</a-space> </a-space>
</a-doption> --> </a-doption>
<template #content>
<a-doption
v-for="(item, index) in enterprises"
:key="index"
class="rounded-8px hover:bg-#F2F3F5"
:class="enterpriseStore.enterpriseInfo?.id === item.id ? '!color-#6D4CFE' : ''"
@click="onEnterpriseItemClick(item)"
>
<div class="flex items-center w-100% justify-between">
<span>{{ item.name }}</span>
<icon-check v-if="enterpriseStore.enterpriseInfo?.id === item.id" size="16" />
</div>
</a-doption>
</template>
</a-dsubmenu>
<a-doption> <a-doption>
<a-space class="flex justify-between w-100%" @click="clickExit"> <a-space class="flex justify-between w-100%" @click="clickExit">
<div class="flex items-center"> <div class="flex items-center">
@ -208,7 +234,8 @@ const handleDopdownClick = (item) => {
<style lang="scss"> <style lang="scss">
.layout-menu-item-dropdown, .layout-menu-item-dropdown,
.layout-avatar-dropdown { .layout-avatar-dropdown,
.enterprises-dsubmenu {
.arco-dropdown { .arco-dropdown {
border-radius: 8px; border-radius: 8px;
border: 1px solid var(--BG-300, #e6e6e8); border: 1px solid var(--BG-300, #e6e6e8);
@ -232,17 +259,21 @@ const handleDopdownClick = (item) => {
line-height: 22px; /* 137.5% */ line-height: 22px; /* 137.5% */
} }
} }
.arco-dropdown-option-content {
border-radius: 8px !important;
}
&:not(.arco-dropdown-option-disabled):hover { &:not(.arco-dropdown-option-disabled):hover {
background-color: transparent; background-color: transparent;
.arco-dropdown-option-content { .arco-dropdown-option-content {
border-radius: 8px; // border-radius: 8px;
background: var(--BG-200, #f2f3f5); background: var(--BG-200, #f2f3f5);
} }
} }
} }
} }
} }
.layout-avatar-dropdown { .layout-avatar-dropdown,
.enterprises-dsubmenu {
width: 200px; width: 200px;
.arco-dropdown { .arco-dropdown {
padding: 12px 4px; padding: 12px 4px;
@ -253,5 +284,20 @@ const handleDopdownClick = (item) => {
} }
} }
} }
.arco-dropdown-option-suffix {
display: none;
}
.enterprises-doption {
.arco-dropdown-option-content {
padding: 0 !important;
border-radius: 8px;
}
&:not(.arco-dropdown-option-disabled):hover {
background-color: transparent;
.arco-dropdown-option-content {
background: var(--BG-200, #f2f3f5);
}
}
}
} }
</style> </style>

View File

@ -6,7 +6,7 @@
</div> </div>
<a-table <a-table
:columns="columns" :columns="columns"
:data="data" :data="dataSource"
:pagination="pagination" :pagination="pagination"
class="mt-8px h-540px" class="mt-8px h-540px"
@page-change="handlePageChange" @page-change="handlePageChange"
@ -79,7 +79,7 @@ const columns = [
slotName: 'action', slotName: 'action',
}, },
]; ];
const data = ref([]); const dataSource = ref([]);
const pagination = reactive({ const pagination = reactive({
total: 0, total: 0,
showPageSize: true, showPageSize: true,
@ -130,10 +130,10 @@ function handlePageSizeChange(pageSize: number) {
async function getSubAccount() { async function getSubAccount() {
const res = await fetchSubAccountPage(params); const res = await fetchSubAccountPage(params);
const { data, total, code } = res.data; const { data, code } = res;
if (code === 200) { if (code === 200) {
pagination.total = total; pagination.total = data.total;
data.value = data; dataSource.value = data?.data ?? [];
} }
} }
async function handleAddAccount() { async function handleAddAccount() {

View File

@ -27,7 +27,7 @@
:wrapper-col-props="{ span: 21, offset: 0 }" :wrapper-col-props="{ span: 21, offset: 0 }"
> >
<a-form-item field="head_image" label="头像"> <a-form-item field="head_image" label="头像">
<div class="flex item-center"> <div class="flex items-center">
<a-avatar :image-url="userInfoForm.file_url" :size="48" /> <a-avatar :image-url="userInfoForm.file_url" :size="48" />
<span class="upload-button" @click="triggerFileInput"> <span class="upload-button" @click="triggerFileInput">
<input <input