新增: Bing 壁纸多市场获取/2000张历史/第三方图源/dislike/重下/方向修复

This commit is contained in:
lxy
2026-10-01 01:02:41 +08:00
parent bbbc32142d
commit 2036c9c89a
8 changed files with 431 additions and 68 deletions
@@ -91,11 +91,25 @@
<button class="btn-sm" @click="onBingPrev">&#9664;</button>
<button class="btn-sm" @click="onBingNext">&#9654;</button>
<button class="btn-sm" @click="onBingFav">{{ bing.fav ? '★' : '☆' }}</button>
<button class="btn-sm" @click="onBingDislike">👎</button>
</div>
</div>
<div class="flex justify-between items-center px-3.5 py-2 border-t border-[var(--card-divider)]">
<div><div class="text-xs font-medium text-[var(--text-muted)]">定时切换</div><div class="text-[10px] text-[var(--text-weak)] mt-px">每小时自动切换壁纸</div></div>
<ToggleSwitch v-model="s.bingAutoRefresh" />
</div>
<!-- 市场选择 -->
<div class="px-3.5 py-2 border-t border-[var(--card-divider)]">
<div class="flex justify-between items-center cursor-pointer select-none" @click="showMarkets = !showMarkets">
<div class="text-xs font-medium text-[var(--text-muted)]">壁纸来源地区</div>
<span class="text-[10px] text-[var(--text-weak)]">{{ showMarkets ? '收起' : '展开' }} {{ selectedMarkets.length }}/{{ allMarkets.length }}</span>
</div>
<div v-if="showMarkets" class="flex flex-wrap gap-2 mt-2">
<label v-for="m in allMarkets" :key="m.code" class="flex items-center gap-1.5 text-xs text-[var(--text)] cursor-pointer">
<input type="checkbox" :checked="selectedMarkets.includes(m.code)" @change="toggleMarket(m.code)" class="accent-[var(--accent)]">
{{ m.label }}
</label>
</div>
</div>
<!-- 收藏列表 -->
<div v-if="bingFavs.length" class="px-3.5 py-2 border-t border-[var(--card-divider)]">
@@ -185,9 +199,12 @@ const audioColors = [
]
// Bing
const bing = ref<BingState>({ date: '', title: '', copyright: '', url: '', fav: false, idx: 0, total: 0 })
const bing = ref<BingState>({ date: '', title: '', copyright: '', url: '', fav: false, idx: 0, total: 0, hidden: false, market: '' })
const bingThumb = ref('')
const bingFavs = ref<{ idx: number; thumb: string }[]>([])
const showMarkets = ref(false)
const allMarkets = ref<{ code: string; label: string }[]>([])
const selectedMarkets = ref<string[]>([])
async function loadBingInfo() {
const raw = await go.getBingInfo()
@@ -199,23 +216,53 @@ async function loadBingInfo() {
}
}
async function onBingPrev() { bing.value = JSON.parse(await go.bingPrev()) }
async function loadBingMarkets() {
const raw = await go.getBingMarkets()
const codes = JSON.parse(raw) as string[]
selectedMarkets.value = codes
allMarkets.value = [
{ code: 'zh-CN', label: '中国' },
{ code: 'en-US', label: '美国' },
{ code: 'ja-JP', label: '日本' },
{ code: 'de-DE', label: '德国' },
{ code: 'fr-FR', label: '法国' },
{ code: 'en-GB', label: '英国' },
{ code: 'ko-KR', label: '韩国' },
{ code: 'ru-RU', label: '俄罗斯' },
{ code: 'pt-BR', label: '巴西' },
{ code: 'es-ES', label: '西班牙' },
]
}
function toggleMarket(code: string) {
const idx = selectedMarkets.value.indexOf(code)
if (idx >= 0) {
selectedMarkets.value.splice(idx, 1)
} else {
selectedMarkets.value.push(code)
}
go.saveBingMarkets(JSON.stringify(selectedMarkets.value))
}
// 左 ◄ = 上一张(更旧), 右 ► = 下一张(更新)
async function onBingNext() { bing.value = JSON.parse(await go.bingNext()) }
async function onBingPrev() { bing.value = JSON.parse(await go.bingPrev()) }
async function onBingFav() { bing.value = JSON.parse(await go.bingToggleFavorite()); await loadBingFavs() }
async function onBingSetByIdx(idx: number) { bing.value = JSON.parse(await go.bingSetByIdx(idx)) }
async function onBingDislike() { bing.value = JSON.parse(await go.bingToggleDislike()) }
async function loadBingFavs() {
const raw = await go.getBingFavorites()
const list = JSON.parse(raw) as string[]
const list = JSON.parse(raw) as { date: string; copyright: string; filename: string; idx: number }[]
bingFavs.value = await Promise.all(list.map(async f => ({
idx: parseInt(f.match(/(\d+)/)?.[1] || '0', 10),
thumb: await go.bingThumbDataURI(f)
idx: f.idx,
thumb: await go.bingThumbDataURI(f.filename)
})))
}
watch(() => props.s.bingAutoRefresh, v => go.saveBingAutoRefresh(v))
watch(() => props.s.wallpaperType, t => {
if (t === 'bing') { loadBingInfo(); loadBingFavs() }
if (t === 'bing') { loadBingInfo(); loadBingFavs(); loadBingMarkets() }
}, { immediate: true })
async function onPickImage() {
@@ -17,6 +17,9 @@ export const go = {
getBingFavorites: (): Promise<string> => w.getBingFavorites(),
bingSetByIdx: (idx: number): Promise<string> => w.bingSetByIdx(idx),
bingThumbDataURI: (filename: string): Promise<string> => w.bingThumbDataURI(filename),
bingToggleDislike: (): Promise<string> => w.bingToggleDislike(),
getBingMarkets: (): Promise<string> => w.getBingMarkets(),
saveBingMarkets: (markets: string) => w.saveBingMarkets(markets),
pickSolidColor: (): Promise<string> => w.pickSolidColor(),
pickGradientColor: (): Promise<string> => w.pickGradientColor(),
addSavedColor: (c1: string, c2: string, gradient: boolean) => w.addSavedColor(c1, c2, gradient),
+3
View File
@@ -1,5 +1,6 @@
export interface WeatherData {
current: string
city: string
hourly: HourlyItem[]
daily: DailyItem[]
}
@@ -95,4 +96,6 @@ export interface BingState {
fav: boolean
idx: number
total: number
hidden: boolean
market?: string
}