feat: 逻辑调整

This commit is contained in:
rd
2025-09-11 16:08:28 +08:00
parent 7e6e086098
commit b5abdb0887
9 changed files with 279 additions and 153 deletions

View File

@ -44,7 +44,7 @@ export const fetchBindPhone = (params = {}) => {
};
// 根据id获取企业信息
export const fetchEnterpriseInfo = (id: number) => {
export const fetchEnterpriseInfo = (id: number | string) => {
return Http.get(`/v1/enterprises/${id}`);
};

View File

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
<g clip-path="url(#clip0_214_27738)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M7.52856 0.834838C7.77656 0.705717 8.07585 0.725097 8.30493 0.885375L12.0549 3.51037C12.2554 3.65073 12.375 3.88017 12.375 4.12488V8.61389L14.6858 10.2648C14.8828 10.4056 15 10.6327 15 10.8749V15.7499H16.5C16.9142 15.7499 17.25 16.0857 17.25 16.4999C17.2499 16.914 16.9142 17.2499 16.5 17.2499H1.5C1.08583 17.2499 0.750066 16.914 0.75 16.4999C0.75 16.0857 1.08579 15.7499 1.5 15.7499H3.375V7.49988C3.375 7.25517 3.49461 7.02572 3.69507 6.88537L7.125 4.48376V1.49988L7.13232 1.39661C7.16541 1.15837 7.31155 0.947913 7.52856 0.834838ZM4.875 7.89026V15.7499H7.125V6.31482L4.875 7.89026ZM8.625 15.7499H13.5V11.2601L11.1892 9.60998C10.9922 9.46923 10.875 9.24203 10.875 8.99988V4.51526L8.625 2.93982V15.7499Z"
fill="currentColor"/>
</g>
<defs>
<clipPath id="clip0_214_27738">
<rect width="18" height="18" rx="3.6" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

View File

@ -1,13 +1,22 @@
<template>
<div class="right-wrap">
<!-- 任务中心 -->
<div class="relative p-6px rounded-30px flex items-center justify-center task-icon" @click="setUnread" v-if="hasOpenEnterprise">
<div
class="relative p-6px rounded-30px flex items-center justify-center task-icon"
@click="setUnread"
v-if="hasOpenEnterprise"
>
<SvgIcon name="svg-taskCenter" size="20" class="color-#737478" @click="openDownloadCenter" />
<div class="w-6px h-6px rounded-50% bg-#F64B31 absolute top-6px right-6px" v-if="hasUnreadInfo"></div>
</div>
<!-- 灵机空间入口 -->
<div class="agent-entry mx-16px" :class="isAgentRoute ? 'agent' : ''" @click="handleAgentClick" v-if="hasOpenEnterprise"></div>
<div
class="agent-entry mx-16px"
:class="isAgentRoute ? 'agent' : ''"
@click="handleAgentClick"
v-if="hasOpenEnterprise"
></div>
<!-- 头像设置 -->
<Dropdown trigger="click" overlayClassName="layout-avatar-dropdown">
@ -23,7 +32,7 @@
<icon-right size="12" />
</div>
</MenuItem>
<MenuItem v-if="hasOpenEnterprise">
<MenuItem v-if="enterprises.length > 0">
<SubMenu value="option-1" position="lt" trigger="hover" popupClassName="enterprises-dsubmenu">
<template #title>
<div class="flex justify-between w-100% h-full items-center">
@ -34,11 +43,11 @@
<icon-right size="12" />
</div>
</template>
<div v-for="(item, index) in enterprises" :key="index">
<MenuItem
v-for="(item, index) in enterprises"
:key="index"
class="rounded-8px hover:bg-#F2F3F5"
@click="onEnterpriseItemClick(item)"
v-if="!primary_enterprise || item.id !== primary_enterprise.id"
>
<div
class="flex items-center w-100% justify-between"
@ -48,6 +57,54 @@
<icon-check v-if="enterpriseInfo?.id === item.id" size="16" />
</div>
</MenuItem>
<template v-else>
<template v-if="item.audit_status === 1">
<div class="w-full h-1px bg-#E6E6E8 mb-8px" v-if="enterprises.length > 0"></div>
<MenuItem class="rounded-8px hover:bg-#F2F3F5 h-36px !mb-0" @click="onCreate(item)">
<div class="flex items-center">
<SvgIcon size="16.5" name="svg-organization" class="color-#737478 mr-8px" />
<span class="color-#211F24 mr-4px">创建企业账号</span>
<div class="px-8px h-20px rounded-2px bg-#FFF7E5 flex items-center">
<span class="color-#FFAE00 !text-12px !lh-20px font-400">申请中</span>
</div>
</div>
</MenuItem>
</template>
<div v-else>
<MenuItem class="rounded-8px hover:bg-#F2F3F5" @click="onEnterpriseItemClick(item)">
<div class="flex justify-between items-center overflow-hidden">
<div
class="flex items-center w-100% flex-1 overflow-hidden"
:class="enterpriseInfo?.id === item.id ? '!color-#6D4CFE' : ''"
>
<TextoverTips :context="item.name" />
<img :src="icon4" width="12" height="12" class="ml-4px" />
</div>
<div
class="px-8px h-20px rounded-2px flex items-center flex-shrink-0 ml-4px"
:class="_map.get(item.subscribe_status)?.bg"
v-if="[2, 3].includes(item.subscribe_status)"
>
<span class="!text-12px !lh-20px font-400" :class="_map.get(item.subscribe_status)?.color">{{
_map.get(item.subscribe_status)?.label
}}</span>
</div>
</div>
</MenuItem>
</div>
</template>
</div>
<template v-if="!primary_enterprise">
<div class="w-full h-1px bg-#E6E6E8 mb-8px" v-if="enterprises?.length > 0"></div>
<MenuItem class="rounded-8px hover:bg-#F2F3F5 h-36px !mb-0" @click="onCreate(null)">
<div class="flex items-center">
<SvgIcon size="16.5" name="svg-organization" class="color-#737478 mr-8px" />
<span class="color-#211F24 mr-4px">创建企业账号</span>
</div>
</MenuItem>
</template>
</SubMenu>
</MenuItem>
<MenuItem>
@ -70,8 +127,7 @@
<script setup>
import { Dropdown, Menu, MenuItem, SubMenu } from 'ant-design-vue';
import { useRouter } from "vue-router";
// import router from '@/router';
import { useRouter } from 'vue-router'; // import router from '@/router';
import { useEnterpriseStore } from '@/stores/modules/enterprise';
import { useSidebarStore } from '@/stores/modules/side-bar';
import { useUserStore } from '@/stores';
@ -83,6 +139,8 @@ import DownloadCenterModal from '../task-center-modal';
import icon1 from '@/assets/option.svg';
import icon2 from '@/assets/exit.svg';
import icon3 from '@/assets/change.svg';
import icon4 from './img/admin.png';
import TextoverTips from '@/components/text-over-tips/index.vue';
const props = defineProps({
isAgentRoute: {
@ -91,18 +149,23 @@ const props = defineProps({
},
});
const _map = new Map([
[2, { label: '试用中', bg: 'bg-#F0EDFF', color: 'color-#6D4CFE' }],
[3, { label: '已到期', bg: 'bg-#F2F3F5', color: 'color-#55585F' }],
]);
const enterpriseStore = useEnterpriseStore();
const userStore = useUserStore();
const sideBarStore = useSidebarStore();
const route = useRoute();
const router = useRouter();
const hasUnreadInfo = computed(() => sideBarStore.unreadInfo.length);
const hasOpenEnterprise = computed(() => enterpriseStore.isOpenEnterprise);
const exitAccountModalRef = ref(null);
const downloadCenterModalRef = ref(null);
const hasUnreadInfo = computed(() => sideBarStore.unreadInfo.length);
const hasOpenEnterprise = computed(() => enterpriseStore.isOpenEnterprise);
const primary_enterprise = computed(() => userStore.userInfo?.primary_enterprise);
const enterprises = computed(() => {
return userStore.userInfo?.enterprises ?? [];
});
@ -131,6 +194,12 @@ const setUnread = () => {
const handleAgentClick = () => {
props.isAgentRoute ? handleUserHome() : router.push({ name: 'AgentIndex' });
};
const onCreate = (item) => {
if (item && item.id === primary_enterprise.value.id) {
enterpriseStore.setEnterpriseInfo(item);
}
router.push({ name: 'Trial' });
};
</script>
<style scoped lang="scss">
@ -144,32 +213,45 @@ const handleAgentClick = () => {
border: 1px solid var(--BG-300, #e6e6e8);
background: var(--BG-white, #fff);
padding: 12px 0px;
.ant-dropdown-menu-item {
padding: 0 12px;
margin-bottom: 4px;
margin-bottom: 8px;
font-family: $font-family-regular;
color: var(--Text-1, #211f24);
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 22px;
.ant-dropdown-menu-title-content {
display: flex;
height: 40px;
height: 32px;
width: 100%;
padding: 10px 24px;
align-items: center;
.ant-dropdown-menu-submenu {
width: 100%;
.ant-dropdown-menu-submenu-title {
padding: 0;
&:hover {
background: none;
}
.ant-dropdown-menu-title-content {
padding: 0 !important;
}
}
.ant-dropdown-menu-submenu-arrow {
display: none;
}
}
}
.menu-item-text {
color: var(--Text-2, #3c4043);
font-family: $font-family-regular;
@ -178,11 +260,14 @@ const handleAgentClick = () => {
font-weight: 400;
line-height: 22px;
}
.ant-dropdown-menu-title-content {
border-radius: 8px !important;
}
&:not(.ant-dropdown-menu-item):hover {
background-color: transparent;
.ant-dropdown-menu-title-content {
background: var(--BG-200, #f2f3f5);
}
@ -190,21 +275,28 @@ const handleAgentClick = () => {
}
}
}
.layout-avatar-dropdown,
.enterprises-dsubmenu {
width: 200px;
.ant-dropdown-menu {
padding: 12px 4px;
padding: 8px 4px;
margin: 0;
.ant-dropdown-menu-item {
padding: 0 !important;
.ant-dropdown-menu-title-content {
padding: 0 12px !important;
}
}
}
.ant-dropdown-option-suffix {
display: none;
}
// .enterprises-doption {
// .ant-dropdown-menu-title-content {
// padding: 0 !important;

View File

@ -1,8 +1,8 @@
import router from '@/router';
import { defineStore } from 'pinia';
import { fetchProfileInfo } from '@/api/all/login';
// import { useSidebarStore } from '@/stores/modules/side-bar';
import { glsWithCatch, slsWithCatch, rlsWithCatch } from '@/utils/stroage';
import { glsWithCatch, rlsWithCatch, slsWithCatch } from '@/utils/stroage';
import { useEnterpriseStore } from '@/stores/modules/enterprise';
interface UserInfo {
id: number;
@ -12,6 +12,7 @@ interface UserInfo {
mobile: string;
primary_enterprise: any; // 主企业信息
[key: string]: any;
// 添加其他用户属性...
}
@ -69,9 +70,18 @@ export const useUserStore = defineStore('user', {
// 获取用户信息
async getUserInfo() {
const enterpriseStore = useEnterpriseStore();
const { code, data } = await fetchProfileInfo();
if (code === 200) {
this.setUserInfo(data);
const { primary_enterprise } = data;
if (!enterpriseStore.enterpriseInfo && !isEmpty(primary_enterprise)) {
console.log('setEnterpriseInfo');
enterpriseStore.setEnterpriseInfo(primary_enterprise);
}
}
},
// clearUserAllowAccessRoutes() {

View File

@ -18,7 +18,6 @@ export function goUserLogin(query?: any) {
// 首页
export function handleUserHome(params?: any) {
const enterpriseStore = useEnterpriseStore();
console.log(enterpriseStore.enterpriseInfo);
// 已开通
if (enterpriseStore.isOpenEnterprise) {
router.push({ name: 'Home', params });
@ -31,7 +30,7 @@ export const getUserEnterpriseInfo = async () => {
const enterpriseStore = useEnterpriseStore();
// const sidebarStore = useSidebarStore();
// const userStore = useUserStore();
console.log('getUserEnterpriseInfo');
await enterpriseStore.getEnterpriseInfo(); // 初始化企业信息
// sidebarStore.getUserNavbarMenuList(); // 初始化navbar菜单
// userStore.getUserAllowAccessRoutes(); // 初始化允许访问的路由
@ -45,12 +44,12 @@ export async function initApp() {
await userStore.getUserInfo(); // 初始化用户信息
if (!enterpriseStore.isOpenEnterprise) return;
await getUserEnterpriseInfo(); // 初始化企业信息、navbar菜单、允许访问的路由
// await chatStore.getAgentInfo(); // 初始化智能体信息
if (enterpriseStore.isOpenEnterprise) {
await getUserEnterpriseInfo(); // 初始化企业信息
await chatStore.getAgentInfo(); // 初始化智能体信息
sidebarStore.startUnreadInfoPolling(); // 初始化未读信息
}
}
// 登录处理

View File

@ -118,10 +118,12 @@ const { TabPane } = Tabs;
const setPageType = inject('setPageType');
const formRef = ref();
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const enterpriseStore = useEnterpriseStore();
const formRef = ref();
const countdown = ref(0);
let timer = ref();
const isLogin = ref(true);
@ -276,6 +278,8 @@ const getProfileInfo = async () => {
// 多个企业时候需要弹窗让用户选择企业
selectAccountModalRef.value.open();
}
} else {
router.push({ name: 'Trial' });
}
}
};

View File

@ -112,10 +112,12 @@ const { TabPane } = Tabs;
const setPageType = inject('setPageType');
const pageType = inject('pageType');
const formRef = ref();
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const enterpriseStore = useEnterpriseStore();
const formRef = ref();
const countdown = ref(0);
let timer = ref();
const isLogin = ref(true);
@ -299,6 +301,8 @@ const getProfileInfo = async () => {
} else {
selectAccountModalRef.value.open();
}
} else {
router.push({ name: 'Trial' });
}
}
};

View File

@ -233,7 +233,12 @@ const handleSubmit = async () => {
.then(async () => {
const { code } = await postCreateEnterprises(formData.value);
if (code === 200) {
userStore.getUserInfo();
await userStore.getUserInfo();
const { primary_enterprise } = userStore.userInfo;
if (primary_enterprise) {
enterpriseStore.setEnterpriseInfo(primary_enterprise);
}
}
})
.finally(() => {