264 lines
7.1 KiB
JavaScript
264 lines
7.1 KiB
JavaScript
import { defineStore } from 'pinia'
|
||
import { ref } from 'vue'
|
||
import { api } from '@/services/api'
|
||
|
||
export const useSettingsStore = defineStore('settings', () => {
|
||
const bgType = ref('color')
|
||
const bgColor = ref('#f5f5f5')
|
||
const bgImage = ref('')
|
||
const bgOpacity = ref(1)
|
||
const language = ref('zh')
|
||
const favicon = ref('')
|
||
// 现在存储 {id, url} 而不是 {id, data: base64}
|
||
const uploadedImages = ref([])
|
||
const uploadedIcons = ref([])
|
||
const loading = ref(false)
|
||
let initialized = false
|
||
|
||
async function loadSettings() {
|
||
loading.value = true
|
||
try {
|
||
const data = await api.getSettings()
|
||
bgType.value = data.bgType || 'color'
|
||
bgColor.value = data.bgColor || '#f5f5f5'
|
||
bgImage.value = data.bgImage || ''
|
||
bgOpacity.value = data.bgOpacity ?? 1
|
||
language.value = data.language || 'zh'
|
||
favicon.value = data.favicon || ''
|
||
uploadedImages.value = data.uploadedImages || []
|
||
uploadedIcons.value = data.uploadedIcons || []
|
||
applyFavicon(favicon.value)
|
||
initialized = true
|
||
} catch (error) {
|
||
console.error('加载设置失败:', error)
|
||
initialized = true
|
||
// 降级到 localStorage
|
||
const saved = localStorage.getItem('site-settings')
|
||
if (saved) {
|
||
try {
|
||
const settings = JSON.parse(saved)
|
||
bgType.value = settings.bgType || 'color'
|
||
bgColor.value = settings.bgColor || '#f5f5f5'
|
||
bgImage.value = settings.bgImage || ''
|
||
bgOpacity.value = settings.bgOpacity || 1
|
||
language.value = settings.language || 'zh'
|
||
favicon.value = settings.favicon || ''
|
||
uploadedImages.value = settings.uploadedImages || []
|
||
uploadedIcons.value = settings.uploadedIcons || []
|
||
} catch {
|
||
// ignore
|
||
}
|
||
}
|
||
} finally {
|
||
loading.value = false
|
||
}
|
||
}
|
||
|
||
async function saveSettings() {
|
||
if (!initialized) {
|
||
console.warn('saveSettings 跳过:还未初始化')
|
||
return
|
||
}
|
||
try {
|
||
await api.updateSettings({
|
||
bgType: bgType.value,
|
||
bgColor: bgColor.value,
|
||
bgImage: bgImage.value,
|
||
bgOpacity: bgOpacity.value,
|
||
language: language.value,
|
||
favicon: favicon.value,
|
||
uploadedImages: uploadedImages.value,
|
||
uploadedIcons: uploadedIcons.value
|
||
})
|
||
} catch (error) {
|
||
console.warn('保存到服务器失败:', error.message)
|
||
}
|
||
}
|
||
|
||
// 上传图片到 RUSTFS,返回 {id, url}
|
||
async function uploadImageToRustfs(imageData, type = 'background') {
|
||
try {
|
||
const result = await api.uploadImage(imageData, type)
|
||
return { id: result.id, url: result.url }
|
||
} catch (error) {
|
||
console.error('图片上传失败:', error)
|
||
throw error
|
||
}
|
||
}
|
||
|
||
// 批量上传图片到 RUSTFS
|
||
async function uploadImagesToRustfs(imageDataList, type = 'background') {
|
||
try {
|
||
const images = imageDataList.map((data, index) => ({
|
||
id: `${Date.now()}-${index}`,
|
||
data
|
||
}))
|
||
const result = await api.uploadImages(images, type)
|
||
return result.images
|
||
} catch (error) {
|
||
console.error('批量图片上传失败:', error)
|
||
throw error
|
||
}
|
||
}
|
||
|
||
// 添加单张图片(上传到 RUSTFS)
|
||
async function addUploadedImage(imageData) {
|
||
const result = await uploadImageToRustfs(imageData, 'background')
|
||
uploadedImages.value.push(result)
|
||
await saveSettings()
|
||
return result.id
|
||
}
|
||
|
||
// 批量添加图片(不上传到服务器)
|
||
function addUploadedImagesBatchLocal(imageDataList) {
|
||
const baseId = Date.now()
|
||
const tempImages = imageDataList.map((imageData, index) => ({
|
||
id: `${baseId}-${index}`,
|
||
data: imageData
|
||
}))
|
||
return tempImages
|
||
}
|
||
|
||
// 批量上传图片
|
||
async function addUploadedImagesBatch(imageDataList) {
|
||
const uploaded = await uploadImagesToRustfs(imageDataList, 'background')
|
||
for (const img of uploaded) {
|
||
if (img.url) {
|
||
uploadedImages.value.push({ id: img.id, url: img.url })
|
||
}
|
||
}
|
||
await saveSettings()
|
||
}
|
||
|
||
// 设置背景图片(使用 URL)
|
||
async function setBgImage(value) {
|
||
bgImage.value = value
|
||
await saveSettings()
|
||
}
|
||
|
||
// 设置背景图片(上传 base64 后设置)
|
||
async function setBgImageFromData(imageData) {
|
||
const result = await uploadImageToRustfs(imageData, 'background')
|
||
bgImage.value = result.url
|
||
await saveSettings()
|
||
}
|
||
|
||
function setBgType(value) {
|
||
bgType.value = value
|
||
saveSettings()
|
||
}
|
||
|
||
function setBgColor(value) {
|
||
bgColor.value = value
|
||
saveSettings()
|
||
}
|
||
|
||
function setBgOpacity(value) {
|
||
bgOpacity.value = value
|
||
saveSettings()
|
||
}
|
||
|
||
function setLanguage(value) {
|
||
language.value = value
|
||
saveSettings()
|
||
}
|
||
|
||
// 设置图标(上传到 RUSTFS)
|
||
async function setFaviconFromData(imageData) {
|
||
const result = await uploadImageToRustfs(imageData, 'icon')
|
||
favicon.value = result.url
|
||
applyFavicon(result.url)
|
||
await saveSettings()
|
||
}
|
||
|
||
// 设置图标(使用已有 URL)
|
||
async function setFavicon(value) {
|
||
favicon.value = value
|
||
applyFavicon(value)
|
||
await saveSettings()
|
||
}
|
||
|
||
// 添加图标到图标库(上传到 RUSTFS)
|
||
async function addUploadedIcon(imageData) {
|
||
const result = await uploadImageToRustfs(imageData, 'icon')
|
||
uploadedIcons.value.push(result)
|
||
await saveSettings()
|
||
return result.id
|
||
}
|
||
|
||
// 批量添加图标
|
||
async function addUploadedIconsBatch(imageDataList) {
|
||
const uploaded = await uploadImagesToRustfs(imageDataList, 'icon')
|
||
for (const icon of uploaded) {
|
||
if (icon.url) {
|
||
uploadedIcons.value.push({ id: icon.id, url: icon.url })
|
||
}
|
||
}
|
||
await saveSettings()
|
||
}
|
||
|
||
function removeUploadedImage(id) {
|
||
uploadedImages.value = uploadedImages.value.filter(img => img.id !== id)
|
||
// bgImage 现在是 URL,检查是否是被删除图片的 URL
|
||
const img = uploadedImages.value.find(img => img.url === bgImage.value)
|
||
if (!img && bgImage.value) {
|
||
// 当前背景图片被删除了,重置为默认
|
||
bgImage.value = ''
|
||
}
|
||
saveSettings()
|
||
}
|
||
|
||
function removeUploadedIcon(id) {
|
||
uploadedIcons.value = uploadedIcons.value.filter(icon => icon.id !== id)
|
||
// favicon 现在是 URL,检查是否是被删除图标的 URL
|
||
const icon = uploadedIcons.value.find(icon => icon.url === favicon.value)
|
||
if (!icon && favicon.value) {
|
||
favicon.value = ''
|
||
applyFavicon('')
|
||
}
|
||
saveSettings()
|
||
}
|
||
|
||
function applyFavicon(value) {
|
||
const link = document.querySelector("link[rel='icon']")
|
||
if (link) {
|
||
if (value) {
|
||
link.href = value
|
||
} else {
|
||
link.href = '/favicon.ico'
|
||
}
|
||
}
|
||
}
|
||
|
||
return {
|
||
bgType,
|
||
bgColor,
|
||
bgImage,
|
||
bgOpacity,
|
||
language,
|
||
favicon,
|
||
uploadedImages,
|
||
uploadedIcons,
|
||
loading,
|
||
initialized,
|
||
loadSettings,
|
||
saveSettings,
|
||
setBgImage,
|
||
setBgImageFromData,
|
||
setBgType,
|
||
setBgColor,
|
||
setBgOpacity,
|
||
setLanguage,
|
||
setFavicon,
|
||
setFaviconFromData,
|
||
addUploadedImage,
|
||
addUploadedImagesBatch,
|
||
addUploadedImagesBatchLocal,
|
||
removeUploadedImage,
|
||
addUploadedIcon,
|
||
addUploadedIconsBatch,
|
||
removeUploadedIcon,
|
||
applyFavicon
|
||
}
|
||
})
|