🚧 add user center and account setting page

This commit is contained in:
2025-02-28 01:33:18 +08:00
parent 41fdc58c4e
commit 1c3ee31c0b
22 changed files with 288 additions and 49 deletions

4
components.d.ts vendored
View File

@@ -15,6 +15,10 @@ declare module 'vue' {
ACard: typeof import('ant-design-vue/es')['Card'] ACard: typeof import('ant-design-vue/es')['Card']
ACascader: typeof import('ant-design-vue/es')['Cascader'] ACascader: typeof import('ant-design-vue/es')['Cascader']
AccountSetting: typeof import('./src/views/User/AccountSetting/AccountSetting.vue')['default'] AccountSetting: typeof import('./src/views/User/AccountSetting/AccountSetting.vue')['default']
AccountSettingHome: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/AccountSettingHome.vue')['default']
AccountSettingInfo: typeof import('./src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue')['default']
AccountSettingSidebar: typeof import('./src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue')['default']
AccountSettingStorage: typeof import('./src/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue')['default']
ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
ADivider: typeof import('ant-design-vue/es')['Divider'] ADivider: typeof import('ant-design-vue/es')['Divider']

View File

@@ -132,11 +132,12 @@ export const albumListApi = (type: number, sort: boolean) => {
* @param provider * @param provider
* @param bucket * @param bucket
*/ */
export const queryAlbumDetailListApi = (id: number, provider: string, bucket: string) => { export const queryAlbumDetailListApi = (id: number, provider: string, bucket: string,type:number) => {
return service.Post('/api/auth/storage/album/detail/list', { return service.Post('/api/auth/storage/album/detail/list', {
id: id, id: id,
provider: provider, provider: provider,
bucket: bucket, bucket: bucket,
type:type,
}, { }, {
cacheFor: { cacheFor: {
expire: 60 * 60 * 24 * 7, expire: 60 * 60 * 24 * 7,

View File

@@ -0,0 +1 @@
<svg t="1740663490419" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6329" width="200" height="200"><path d="M512 64l387.98 224v448L512 960 124.02 736V288z" fill="#C3D2FB" p-id="6330"></path><path d="M512 220.8l252.19 145.6v291.2L512 803.2 259.81 657.6V366.4z" fill="#386BF3" p-id="6331"></path><path d="M512 377.6l116.39 67.2v134.4L512 646.4l-116.39-67.2V444.8z" fill="#3D4265" p-id="6332"></path></svg>

After

Width:  |  Height:  |  Size: 451 B

View File

@@ -1,7 +1,7 @@
<template> <template>
<header class="header-main"> <header class="header-main">
<div class="header-container"> <div class="header-container">
<Logo/> <Logo :logo-color="props.logoColor"/>
<Search/> <Search/>
<Menu/> <Menu/>
</div> </div>
@@ -11,6 +11,13 @@
import Logo from "@/layout/default/Header/Logo.vue"; import Logo from "@/layout/default/Header/Logo.vue";
import Search from "@/layout/default/Header/Search.vue"; import Search from "@/layout/default/Header/Search.vue";
import Menu from "@/layout/default/Header/Menu.vue"; import Menu from "@/layout/default/Header/Menu.vue";
const props = defineProps({
logoColor: {
type: String,
default: "black",
},
});
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.header-main { .header-main {

View File

@@ -75,7 +75,7 @@
<AAvatar :size="50" shape="square" :src="logo"/> <AAvatar :size="50" shape="square" :src="logo"/>
</ACard> </ACard>
</APopover> </APopover>
<span class="header-logo-text" @click="router.push('/')">S.Album</span> <span class="header-logo-text" :style="{color:props.logoColor}" @click="router.push('/')">S.Album</span>
</AFlex> </AFlex>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -96,6 +96,14 @@ const router = useRouter();
const {t} = useI18n(); const {t} = useI18n();
const cardShadow = ref('none'); const cardShadow = ref('none');
const props = defineProps({
logoColor: {
type: String,
default: 'black'
}
});
/** /**
* 监听卡片聚焦事件 * 监听卡片聚焦事件
*/ */

View File

@@ -22,13 +22,13 @@
</div> </div>
<!-- 社区按钮 --> <!-- 社区按钮 -->
<div class="button-wrapper"> <!-- <div class="button-wrapper">-->
<AButton type="text" shape="circle" size="large" class="header-menu-item-btn"> <!-- <AButton type="text" shape="circle" size="large" class="header-menu-item-btn">-->
<template #icon> <!-- <template #icon>-->
<AAvatar size="default" shape="circle" :src="community"/> <!-- <AAvatar size="default" shape="circle" :src="community"/>-->
</template> <!-- </template>-->
</AButton> <!-- </AButton>-->
</div> <!-- </div>-->
<!-- 上传按钮 --> <!-- 上传按钮 -->
<div class="button-wrapper"> <div class="button-wrapper">
<AButton type="text" shape="circle" size="large" class="header-menu-item-btn" <AButton type="text" shape="circle" size="large" class="header-menu-item-btn"
@@ -54,19 +54,19 @@
</AButton> </AButton>
<template #overlay> <template #overlay>
<AMenu> <AMenu>
<AMenuItem key="reply"> <AMenuItem key="reply" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="atme"/> <AAvatar size="small" shape="circle" :src="atme"/>
</template> </template>
<span style="font-weight: bold">回复我的</span> <span style="font-weight: bold">回复我的</span>
</AMenuItem> </AMenuItem>
<AMenuItem key="like"> <AMenuItem key="like" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="like"/> <AAvatar size="small" shape="circle" :src="like"/>
</template> </template>
<span style="font-weight: bold">收到的赞</span> <span style="font-weight: bold">收到的赞</span>
</AMenuItem> </AMenuItem>
<AMenuItem key="message"> <AMenuItem key="message" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="systemMessage"/> <AAvatar size="small" shape="circle" :src="systemMessage"/>
</template> </template>
@@ -112,19 +112,19 @@
<ADivider/> <ADivider/>
<div class="avatar-content-menu"> <div class="avatar-content-menu">
<AMenu> <AMenu>
<AMenuItem key="1" @click="router.push('/main/user/center/home')"> <AMenuItem key="1" @click="router.push('/main/user/center/home')" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="personalCenter"/> <AAvatar size="small" shape="circle" :src="personalCenter"/>
</template> </template>
<span class="avatar-content-menu-item">个人中心</span> <span class="avatar-content-menu-item">个人中心</span>
</AMenuItem> </AMenuItem>
<AMenuItem key="2" @click="router.push('/main/user/setting')"> <AMenuItem key="2" @click="router.push('/main/user/setting')" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="accountSetting"/> <AAvatar size="small" shape="circle" :src="accountSetting"/>
</template> </template>
<span class="avatar-content-menu-item">账号设置</span> <span class="avatar-content-menu-item">账号设置</span>
</AMenuItem> </AMenuItem>
<AMenuItem key="3"> <AMenuItem key="3" :style="menuCSSStyle">
<template #icon> <template #icon>
<AAvatar size="small" shape="circle" :src="logout"/> <AAvatar size="small" shape="circle" :src="logout"/>
</template> </template>
@@ -142,7 +142,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import community from "@/assets/svgs/community.svg";
import upload from "@/assets/svgs/upload.svg"; import upload from "@/assets/svgs/upload.svg";
import notice from "@/assets/svgs/notice.svg"; import notice from "@/assets/svgs/notice.svg";
import atme from "@/assets/svgs/atme.svg"; import atme from "@/assets/svgs/atme.svg";
@@ -173,6 +172,11 @@ async function getUserConfigList() {
} }
} }
const menuCSSStyle: any = reactive({
display: 'flex',
alignItems: 'center',
});
onMounted(() => { onMounted(() => {
getUserConfigList(); getUserConfigList();
@@ -210,6 +214,7 @@ onMounted(() => {
border-radius: 50%; border-radius: 50%;
overflow: hidden; overflow: hidden;
transition: box-shadow 0.3s ease, transform 0.3s ease; transition: box-shadow 0.3s ease, transform 0.3s ease;
border: 1px solid rgb(255, 255, 255);
} }
.button-wrapper:hover { .button-wrapper:hover {
@@ -255,6 +260,7 @@ onMounted(() => {
border-radius: 50%; border-radius: 50%;
overflow: hidden; overflow: hidden;
transition: box-shadow 0.3s ease, transform 0.3s ease; transition: box-shadow 0.3s ease, transform 0.3s ease;
border: 1px solid rgb(255, 255, 255);
} }
.avatar-wrapper:hover { .avatar-wrapper:hover {
@@ -277,10 +283,10 @@ onMounted(() => {
box-shadow: 0 0 10px rgba(112, 112, 114, 0.82); box-shadow: 0 0 10px rgba(112, 112, 114, 0.82);
} }
.card-avatar:hover { //.card-avatar:hover {
box-shadow: 0 0 10px rgba(77, 167, 255, 0.89); // box-shadow: 0 0 10px rgba(77, 167, 255, 0.89);
transform: scale(1.1); // transform: scale(1.1);
} //}
.avatar-content-header-info { .avatar-content-header-info {
width: 68%; width: 68%;

View File

@@ -1,7 +1,7 @@
export default [ export default [
{ {
path: '/main/photo/share', path: '/main/photo/share',
name: 'share', name: 'quick-share',
component: () => import('@/views/Share/ImageShare/ImageShare.vue'), component: () => import('@/views/Share/ImageShare/ImageShare.vue'),
meta: { meta: {
requiresAuth: true, requiresAuth: true,

View File

@@ -4,6 +4,10 @@ import UserCenterInfo from "@/views/User/PersonalCenter/components/UserCenterInf
import UserCenterAnalysis from "@/views/User/PersonalCenter/components/UserCenterAnalysis/UserCenterAnalysis.vue"; import UserCenterAnalysis from "@/views/User/PersonalCenter/components/UserCenterAnalysis/UserCenterAnalysis.vue";
import UserCenterShare from "@/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue"; import UserCenterShare from "@/views/User/PersonalCenter/components/UserCenterShare/UserCenterShare.vue";
import UserCenterSetting from "@/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue"; import UserCenterSetting from "@/views/User/PersonalCenter/components/UserCenterSetting/UserCenterSetting.vue";
import AccountSettingHome from "@/views/User/AccountSetting/components/AccountSettingHome/AccountSettingHome.vue";
import AccountSettingInfo from "@/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue";
import AccountSettingStorage from "@/views/User/AccountSetting/components/AccountSettingStorage/AccountSettingStorage.vue";
export default [ export default [
{ {
@@ -18,7 +22,7 @@ export default [
children: [ children: [
{ {
path: '/main/user/center/home', path: '/main/user/center/home',
name: 'home', name: 'userCenterHome',
component: UserCenterHome, component: UserCenterHome,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -27,7 +31,7 @@ export default [
}, },
{ {
path: '/main/user/center/dynamic', path: '/main/user/center/dynamic',
name: 'dynamic', name: 'UserCenterDynamic',
component: UserCenterDynamic, component: UserCenterDynamic,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -36,7 +40,7 @@ export default [
}, },
{ {
path: '/main/user/center/info', path: '/main/user/center/info',
name: 'info', name: 'UserCenterInfo',
component: UserCenterInfo, component: UserCenterInfo,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -45,7 +49,7 @@ export default [
}, },
{ {
path: '/main/user/center/analysis', path: '/main/user/center/analysis',
name: 'analysis', name: 'UserCenterAnalysis',
component: UserCenterAnalysis, component: UserCenterAnalysis,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -54,7 +58,7 @@ export default [
}, },
{ {
path: '/main/user/center/share', path: '/main/user/center/share',
name: 'share', name: 'UserCenterShare',
component: UserCenterShare, component: UserCenterShare,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -63,7 +67,7 @@ export default [
}, },
{ {
path: '/main/user/center/setting', path: '/main/user/center/setting',
name: 'setting', name: 'UserCenterSetting',
component: UserCenterSetting, component: UserCenterSetting,
meta: { meta: {
requiresAuth: true, requiresAuth: true,
@@ -75,10 +79,40 @@ export default [
{ {
path: '/main/user/setting', path: '/main/user/setting',
name: 'userSetting', name: 'userSetting',
redirect: '/main/user/setting/home',
component: () => import('@/views/User/AccountSetting/AccountSetting.vue'), component: () => import('@/views/User/AccountSetting/AccountSetting.vue'),
meta: { meta: {
requiresAuth: true, requiresAuth: true,
title: '账户设置' title: '账户设置'
} },
children: [
{
path: '/main/user/setting/home',
name: 'AccountSettingHome',
component: AccountSettingHome,
meta: {
requiresAuth: true,
title: '主页'
},
},
{
path: '/main/user/setting/info',
name: 'AccountSettingInfo',
component: AccountSettingInfo,
meta: {
requiresAuth: true,
title: '个人信息'
},
},
{
path: '/main/user/setting/storage',
name: 'AccountSettingStorage',
component: AccountSettingStorage,
meta: {
requiresAuth: true,
title: '存储管理'
},
}
],
} }
]; ];

View File

@@ -7,6 +7,7 @@ import {useUpscaleStore} from "@/store/modules/upscaleStore.ts";
import {useMenuStore} from "@/store/modules/menuStore.ts"; import {useMenuStore} from "@/store/modules/menuStore.ts";
import {useUploadStore} from "@/store/modules/uploadStore.ts"; import {useUploadStore} from "@/store/modules/uploadStore.ts";
import {useImageStore} from "@/store/modules/imageStore.ts"; import {useImageStore} from "@/store/modules/imageStore.ts";
import {useShareStore} from "@/store/modules/shareStore.ts";
export default function useStore() { export default function useStore() {
return { return {
@@ -19,5 +20,6 @@ export default function useStore() {
menu: useMenuStore(), menu: useMenuStore(),
upload: useUploadStore(), upload: useUploadStore(),
image: useImageStore(), image: useImageStore(),
share: useShareStore(),
}; };
} }

View File

@@ -4,9 +4,12 @@ export const useMenuStore = defineStore(
const currentMenu = ref<string>('photo/all'); const currentMenu = ref<string>('photo/all');
const userCenterMenu = ref<string>('home'); const userCenterMenu = ref<string>('home');
const accountSettingMenu = ref<string>('home');
return { return {
currentMenu, currentMenu,
userCenterMenu, userCenterMenu,
accountSettingMenu
}; };
}, },
{ {
@@ -15,7 +18,7 @@ export const useMenuStore = defineStore(
persist: true, persist: true,
storage: localStorage, storage: localStorage,
key: 'menu', key: 'menu',
includePaths: ['currentMenu', 'userCenterMenu'] includePaths: ['currentMenu', 'userCenterMenu', 'accountSettingMenu']
} }
} }
); );

View File

@@ -0,0 +1,30 @@
export const useShareStore = defineStore(
'share',
() => {
const sharePassword = reactive<Record<string, string>>({});
// 获取密码保持相同API
const getPassword = (key: string): string | undefined => {
return sharePassword[key];
};
// 添加密码保持相同API
const addPassword = (key: string, password: string) => {
sharePassword[key] = password;
};
return {
sharePassword,
getPassword,
addPassword
};
},
{
// 开启数据持久化
persistedState: {
persist: true,
storage: localStorage,
key: 'share',
includePaths: ['sharePassword']
}
}
);

View File

@@ -4,7 +4,7 @@
<div class="phoalbum-item" <div class="phoalbum-item"
v-for="(album, index) in imageStore.albumList" v-for="(album, index) in imageStore.albumList"
:key="album.id" :key="album.id"
@click.prevent="handleClick(album.id,album.name)" @click.prevent="handleClick(album.id,album.name,album.type)"
@mouseover="isHovered = index" @mouseover="isHovered = index"
@mouseleave="isHovered = null"> @mouseleave="isHovered = null">
<PhotoStack :src="album.cover_image ?`data:image/png;base64,`+album.cover_image: ``" <PhotoStack :src="album.cover_image ?`data:image/png;base64,`+album.cover_image: ``"
@@ -80,10 +80,11 @@ const albumRenameValue = ref<string>("");
* 点击相册跳转到详情页 * 点击相册跳转到详情页
* @param id * @param id
* @param albumName * @param albumName
* @param type
*/ */
function handleClick(id: number, albumName: string) { function handleClick(id: number, albumName: string, type: number) {
router.push({ router.push({
path: route.path + `/${id}`, query: {name: albumName} path: route.path + `/${id}`, query: {name: albumName, type: type}
}); });
} }

View File

@@ -86,7 +86,7 @@ const upload = useStore().upload;
async function getImageList(id: number) { async function getImageList(id: number) {
imageStore.imageListLoading = true; imageStore.imageListLoading = true;
const res: any = await queryAlbumDetailListApi(id, upload.storageSelected?.[0], upload.storageSelected?.[1]); const res: any = await queryAlbumDetailListApi(id, upload.storageSelected?.[0], upload.storageSelected?.[1], parseInt(route.query.type as string));
if (res && res.code === 200) { if (res && res.code === 200) {
imageList.value = res.data.records; imageList.value = res.data.records;
} }

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="main-page"> <div class="main-page">
<div class="main-header"> <div class="main-header">
<Header/> <Header :logo-color="`black`"/>
</div> </div>
<div class="main-content"> <div class="main-content">
<Sidebar/> <Sidebar/>

View File

@@ -364,8 +364,6 @@ async function customUploader() {
expire_date: expire_date.value, expire_date: expire_date.value,
access_limit: access_limit.value, access_limit: access_limit.value,
access_password: access_password.value, access_password: access_password.value,
provider: upload.storageSelected?.[0],
bucket: upload.storageSelected?.[1],
images: images, images: images,
}; };
watch( watch(

View File

@@ -10,8 +10,10 @@
<div class="share-content-header"> <div class="share-content-header">
<AButton type="link" size="large" class="share-content-header-button">图片列表</AButton> <AButton type="link" size="large" class="share-content-header-button">图片列表</AButton>
</div> </div>
<div class="share-content-verify" v-if="imageList && imageList.length <= 0"> <div class="share-content-verify"
<AInputPassword size="large" placeholder="请输入访问密码" style="width: 20%" @pressEnter="getShareImages"/> v-if="imageList && imageList.length <= 0 && !shareStore.getPassword(route.params.id as string)">
<AInputPassword size="large" placeholder="请输入访问密码" style="width: 20%"
@pressEnter="(e)=>getShareImages(e.target.value)"/>
<p style="font-size: 12px;color: #999;">回车后可查看图片列表</p> <p style="font-size: 12px;color: #999;">回车后可查看图片列表</p>
</div> </div>
<ImageWaterfallList :image-list="imageList"/> <ImageWaterfallList :image-list="imageList"/>
@@ -33,22 +35,34 @@ const imageList = ref<any[]>([]);
const route = useRoute(); const route = useRoute();
const imageStore = useStore().image; const imageStore = useStore().image;
const shareStore = useStore().share;
/** /**
* 获取分享图片列表 * 获取分享图片列表
* @param e * @param password
*/ */
async function getShareImages(e) { async function getShareImages(password: string) {
imageStore.imageListLoading = true; imageStore.imageListLoading = true;
const invite_code = route.params.id; const invite_code = route.params.id;
const code = Array.isArray(invite_code) ? invite_code[0] : invite_code; const code = Array.isArray(invite_code) ? invite_code[0] : invite_code;
const res: any = await queryShareImageApi(code, e.target.value); const res: any = await queryShareImageApi(code, password);
if (res && res.code === 200) { if (res && res.code === 200) {
imageList.value = res.data.records; imageList.value = res.data.records;
shareStore.addPassword(code, password);
} }
imageStore.imageListLoading = false; imageStore.imageListLoading = false;
} }
onMounted(() => {
const invite_code = route.params.id;
const code = Array.isArray(invite_code) ? invite_code[0] : invite_code;
const password = shareStore.getPassword(code);
if (password) {
getShareImages(password);
}
});
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -1,11 +1,38 @@
<script setup lang="ts">
</script>
<template> <template>
<div class="account-setting">
<div class="personal-center-header">
<Header :logo-color="'black'"/>
</div>
<div class="account-setting-container">
<AccountSettingSidebar/>
<div class="account-setting-view">
<router-view/>
</div>
</div>
</div>
</template> </template>
<script setup lang="ts">
import Header from "@/layout/default/Header/Header.vue";
import AccountSettingSidebar
from "@/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue";
</script>
<style scoped lang="scss"> <style scoped lang="scss">
.account-setting {
background-color: #eaeef6;
.account-setting-container {
display: flex;
flex-direction: row;
width: 100%;
height: calc(100vh - 70px);
.account-setting-view {
width: calc(100vw - 230px);
height: calc(100vh - 100px);
max-height: calc(100vh - 100px);
padding: 15px;
overflow: auto;
}
}
}
</style> </style>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
666
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,70 @@
<template>
<div class="account-setting-sidebar">
<AMenu
:selectedKeys="[menuStore.accountSettingMenu]"
:selectable="true"
:multiple="false"
mode="vertical"
:inlineIndent="24"
:inlineCollapsed="false"
@select="handleClick"
style="margin-top: 10px"
>
<AMenuItem title="首页" key="home" :style="menuCSSStyle">
<template #icon>
<AAvatar shape="square" size="small" :src="home"/>
</template>
<span class="ant-menu-item-title">首页</span>
</AMenuItem>
<AMenuItem title="我的信息" key="info" :style="menuCSSStyle">
<template #icon>
<AAvatar shape="square" size="small" :src="peopleAlbum"/>
</template>
<span class="ant-menu-item-title">我的信息</span>
</AMenuItem>
<AMenuItem title="存储管理" key="storage" :style="menuCSSStyle">
<template #icon>
<AAvatar shape="square" size="small" :src="storage"/>
</template>
<span class="ant-menu-item-title">存储管理</span>
</AMenuItem>
</AMenu>
</div>
</template>
<script setup lang="ts">
import useStore from "@/store";
import home from "@/assets/svgs/home.svg";
import peopleAlbum from "@/assets/svgs/people-album.svg";
import storage from "@/assets/svgs/storage.svg";
const menuStore = useStore().menu;
const menuCSSStyle: any = reactive({
display: 'flex',
alignItems: 'center',
});
const router = useRouter();
function handleClick({key}) {
menuStore.accountSettingMenu = key;
router.push(`/main/user/setting/${key}`);
}
</script>
<style scoped lang="scss">
.account-setting-sidebar {
width: 220px;
height: calc(100vh - 70px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
overflow-y: auto;
overflow-x: hidden;
background-color: #fff;
.ant-menu-item-title {
font-size: 15px;
margin-left: 10px;
font-weight: bold;
}
}
</style>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped lang="scss">
</style>

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="personal-center"> <div class="personal-center">
<div class="personal-center-header"> <div class="personal-center-header">
<Header style="background: transparent;box-shadow: none;backdrop-filter: none;"/> <Header :logo-color="'#fff'" style="background: transparent;box-shadow: none;backdrop-filter: none;"/>
<div class="personal-center-header-info"> <div class="personal-center-header-info">
<div class="personal-center-header-info-container"> <div class="personal-center-header-info-container">
<div class="personal-center-header-info-container-avatar"> <div class="personal-center-header-info-container-avatar">