🚧 add user center and account setting page
This commit is contained in:
4
components.d.ts
vendored
4
components.d.ts
vendored
@@ -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']
|
||||||
|
@@ -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,
|
||||||
|
1
src/assets/svgs/storage.svg
Normal file
1
src/assets/svgs/storage.svg
Normal 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 |
@@ -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 {
|
||||||
|
@@ -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'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监听卡片聚焦事件
|
* 监听卡片聚焦事件
|
||||||
*/
|
*/
|
||||||
|
@@ -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%;
|
||||||
|
@@ -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,
|
||||||
|
@@ -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: '存储管理'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
],
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@@ -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(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -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']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
30
src/store/modules/shareStore.ts
Normal file
30
src/store/modules/shareStore.ts
Normal 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']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
@@ -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}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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/>
|
||||||
|
@@ -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(
|
||||||
|
@@ -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">
|
||||||
|
@@ -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>
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
666
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
@@ -0,0 +1,11 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
@@ -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>
|
@@ -0,0 +1,11 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
@@ -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">
|
||||||
|
Reference in New Issue
Block a user