Files
AlgerMusicPlayer/src/renderer/store/modules/user.ts
T

151 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-03-19 22:48:28 +08:00
import { defineStore } from 'pinia';
import { ref } from 'vue';
import { logout } from '@/api/login';
import { getLikedList } from '@/api/music';
2025-10-22 21:50:20 +08:00
import { getUserAlbumSublist } from '@/api/user';
import { clearLoginStatus } from '@/utils/auth';
2025-03-19 22:48:28 +08:00
interface UserData {
userId: number;
[key: string]: any;
}
function getLocalStorageItem<T>(key: string, defaultValue: T): T {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : defaultValue;
} catch {
return defaultValue;
}
}
export const useUserStore = defineStore('user', () => {
// 状态
const user = ref<UserData | null>(getLocalStorageItem('user', null));
2025-08-07 22:57:17 +08:00
const loginType = ref<'token' | 'cookie' | 'qr' | 'uid' | null>(
getLocalStorageItem('loginType', null)
);
2025-03-19 22:48:28 +08:00
const searchValue = ref('');
const searchType = ref(1);
2025-10-22 21:50:20 +08:00
// 收藏的专辑 ID 列表
const collectedAlbumIds = ref<Set<number>>(new Set());
2025-03-19 22:48:28 +08:00
// 方法
const setUser = (userData: UserData) => {
user.value = userData;
localStorage.setItem('user', JSON.stringify(userData));
};
const setLoginType = (type: typeof loginType.value) => {
loginType.value = type;
if (type) {
localStorage.setItem('loginType', type);
} else {
localStorage.removeItem('loginType');
}
};
2025-03-19 22:48:28 +08:00
const handleLogout = async () => {
try {
await logout();
user.value = null;
loginType.value = null;
clearLoginStatus();
2025-05-14 21:18:11 +08:00
// 刷新
window.location.reload();
2025-03-19 22:48:28 +08:00
} catch (error) {
console.error('登出失败:', error);
// 即使API调用失败,也要清除本地状态
user.value = null;
loginType.value = null;
clearLoginStatus();
window.location.reload();
2025-03-19 22:48:28 +08:00
}
};
const setSearchValue = (value: string) => {
searchValue.value = value;
};
const setSearchType = (type: number) => {
searchType.value = type;
};
2025-10-22 21:50:20 +08:00
// 初始化收藏的专辑列表
const initializeCollectedAlbums = async () => {
if (!user.value || !localStorage.getItem('token')) {
collectedAlbumIds.value.clear();
return;
}
try {
const { data } = await getUserAlbumSublist({ limit: 1000, offset: 0 });
const albumIds = (data?.data || []).map((album: any) => album.id);
collectedAlbumIds.value = new Set(albumIds);
console.log(`已加载 ${albumIds.length} 个收藏专辑`);
} catch (error) {
console.error('获取收藏专辑列表失败:', error);
collectedAlbumIds.value.clear();
}
};
// 添加收藏专辑
const addCollectedAlbum = (albumId: number) => {
collectedAlbumIds.value.add(albumId);
};
// 移除收藏专辑
const removeCollectedAlbum = (albumId: number) => {
collectedAlbumIds.value.delete(albumId);
};
// 检查专辑是否已收藏
const isAlbumCollected = (albumId: number) => {
return collectedAlbumIds.value.has(albumId);
};
2025-03-19 22:48:28 +08:00
// 初始化
const initializeUser = async () => {
const savedUser = getLocalStorageItem<UserData | null>('user', null);
if (savedUser) {
user.value = savedUser;
// 如果用户已登录,获取收藏列表
if (localStorage.getItem('token')) {
try {
2025-10-22 21:50:20 +08:00
// 同时初始化收藏专辑列表
await initializeCollectedAlbums();
2025-03-19 22:48:28 +08:00
const { data } = await getLikedList(savedUser.userId);
return data?.ids || [];
} catch (error) {
console.error('获取收藏列表失败:', error);
return [];
}
}
}
return [];
};
return {
// 状态
user,
loginType,
2025-03-19 22:48:28 +08:00
searchValue,
searchType,
2025-10-22 21:50:20 +08:00
collectedAlbumIds,
2025-03-19 22:48:28 +08:00
// 方法
setUser,
setLoginType,
2025-03-19 22:48:28 +08:00
handleLogout,
setSearchValue,
setSearchType,
2025-10-22 21:50:20 +08:00
initializeUser,
initializeCollectedAlbums,
addCollectedAlbum,
removeCollectedAlbum,
isAlbumCollected
2025-03-19 22:48:28 +08:00
};
});