wechat-article / components /selector /AccountSelectorForAlbum.vue
asemxin2000's picture
Deploy wechat-article-exporter to Space
6e41657 verified
Raw
History Blame Contribute Delete
2.75 kB
<template>
<USelectMenu
v-model="selected"
size="md"
color="gray"
searchable
searchable-placeholder="筛选公众号..."
clear-search-on-close
:options="sortedAccountInfos"
option-attribute="nickname"
placeholder="请选择公众号"
>
<template #label>
<UAvatar v-if="selected" :src="IMAGE_PROXY + selected.round_head_img" size="2xs" />
<span v-if="selected" class="max-w-30 line-clamp-1">{{ selected.nickname }}</span>
<span v-if="selected" class="shrink-0">({{ selected.albums!.length }}个合集)</span>
</template>
<template #option="{ option: account }">
<UAvatar :src="IMAGE_PROXY + account.round_head_img" size="sm" />
<div>
<p class="text-[16px]">{{ account.nickname }}</p>
<p class="text-gray-500 text-sm">合集数: {{ account.albums.length }}</p>
</div>
</template>
<template #option-empty="{ query }">
未找到匹配「{{ query }}」的公众号<br />请先在「<NuxtLink
to="/dashboard/account"
class="text-blue-500 hover:underline"
>公众号管理</NuxtLink
>」中添加
</template>
<template #empty>
暂无公众号,请先在「<NuxtLink to="/dashboard/account" class="text-blue-500 hover:underline">公众号管理</NuxtLink
>」中添加
</template>
</USelectMenu>
</template>
<script setup lang="ts">
import { IMAGE_PROXY } from '~/config';
import { getArticleCache } from '~/store/v2/article';
import { getAllInfo, type MpAccount } from '~/store/v2/info';
import type { AppMsgAlbumInfo } from '~/types/types';
interface AccountInfo extends MpAccount {
albums?: AppMsgAlbumInfo[];
}
// 已缓存的公众号信息
const cachedAccountInfos: AccountInfo[] = reactive(await getAllInfo());
cachedAccountInfos.forEach(async accountInfo => {
accountInfo.albums = await getAllAlbums(accountInfo.fakeid);
});
const sortedAccountInfos = computed(() => {
cachedAccountInfos.sort((a, b) => {
if (a.albums && b.albums) {
return a.albums.length > b.albums.length ? -1 : 1;
} else {
return 0;
}
});
return cachedAccountInfos;
});
// 获取公众号下所有的合集数据(根据已缓存的文章数据)
async function getAllAlbums(fakeid: string) {
const articles = await getArticleCache(fakeid, Math.floor(Date.now() / 1000));
const albums: AppMsgAlbumInfo[] = [];
articles
.flatMap(article => article.appmsg_album_infos)
.forEach(album => {
if (!albums.some(a => a.id === album.id)) {
albums.push(album);
}
});
return albums;
}
const selected = defineModel<AccountInfo | undefined>();
</script>