Files
Jnote-nodeJs/src/stores/settings.js
dcr_xuxgc d759a9e740 init
2026-06-12 17:49:54 +08:00

264 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
})