mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 19:37:33 +08:00
update: 公告支持html
This commit is contained in:
@@ -20,7 +20,7 @@
|
|||||||
<div class="flex items-center justify-between mb-2">
|
<div class="flex items-center justify-between mb-2">
|
||||||
<div class="flex items-center space-x-3">
|
<div class="flex items-center space-x-3">
|
||||||
<h4 class="text-sm font-medium text-gray-900 dark:text-gray-100">公告 {{ index + 1 }}</h4>
|
<h4 class="text-sm font-medium text-gray-900 dark:text-gray-100">公告 {{ index + 1 }}</h4>
|
||||||
<n-switch v-model:value="announcement.enabled" size="small" />
|
<n-switch :value="announcement.enabled" @update:value="handleEnabledChange(index, $event)" size="small" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center space-x-1">
|
<div class="flex items-center space-x-1">
|
||||||
<n-button text @click="moveAnnouncementUp(index)" :disabled="index === 0" size="small">
|
<n-button text @click="moveAnnouncementUp(index)" :disabled="index === 0" size="small">
|
||||||
@@ -43,7 +43,8 @@
|
|||||||
|
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<n-input
|
<n-input
|
||||||
v-model:value="announcement.content"
|
:value="announcement.content"
|
||||||
|
@update:value="handleContentChange(index, $event)"
|
||||||
placeholder="公告内容,支持HTML标签"
|
placeholder="公告内容,支持HTML标签"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
:rows="2"
|
:rows="2"
|
||||||
@@ -89,20 +90,65 @@ const enableAnnouncements = computed({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log(props.modelValue)
|
|
||||||
|
|
||||||
// 更新数据
|
// 更新数据
|
||||||
const updateValue = (newValue: ConfigData) => {
|
const updateValue = (newValue: ConfigData) => {
|
||||||
emit('update:modelValue', newValue)
|
emit('update:modelValue', newValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 监听单个公告内容变化
|
||||||
|
const handleContentChange = (index: number, content: string) => {
|
||||||
|
const newAnnouncements = [...props.modelValue.announcements]
|
||||||
|
newAnnouncements[index] = { ...newAnnouncements[index], content }
|
||||||
|
emit('update:modelValue', {
|
||||||
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
|
announcements: newAnnouncements
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监听单个公告启用状态变化
|
||||||
|
const handleEnabledChange = (index: number, enabled: boolean) => {
|
||||||
|
const newAnnouncements = [...props.modelValue.announcements]
|
||||||
|
newAnnouncements[index] = { ...newAnnouncements[index], enabled }
|
||||||
|
emit('update:modelValue', {
|
||||||
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
|
announcements: newAnnouncements
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算属性用于公告内容双向绑定
|
||||||
|
const announcementContent = (index: number) => computed({
|
||||||
|
get: () => props.modelValue.announcements[index]?.content || '',
|
||||||
|
set: (value: string) => {
|
||||||
|
const newAnnouncements = [...props.modelValue.announcements]
|
||||||
|
newAnnouncements[index] = { ...newAnnouncements[index], content: value }
|
||||||
|
updateValue({
|
||||||
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
|
announcements: newAnnouncements
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 计算属性用于公告启用状态双向绑定
|
||||||
|
const announcementEnabled = (index: number) => computed({
|
||||||
|
get: () => props.modelValue.announcements[index]?.enabled || false,
|
||||||
|
set: (value: boolean) => {
|
||||||
|
const newAnnouncements = [...props.modelValue.announcements]
|
||||||
|
newAnnouncements[index] = { ...newAnnouncements[index], enabled: value }
|
||||||
|
updateValue({
|
||||||
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
|
announcements: newAnnouncements
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// 添加公告
|
// 添加公告
|
||||||
const addAnnouncement = () => {
|
const addAnnouncement = () => {
|
||||||
const newAnnouncements = [...props.modelValue.announcements, {
|
const newAnnouncements = [...props.modelValue.announcements, {
|
||||||
content: '',
|
content: '',
|
||||||
enabled: true
|
enabled: true
|
||||||
}]
|
}]
|
||||||
updateValue({
|
emit('update:modelValue', {
|
||||||
enable_announcements: props.modelValue.enable_announcements,
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
announcements: newAnnouncements
|
announcements: newAnnouncements
|
||||||
})
|
})
|
||||||
@@ -112,7 +158,7 @@ const addAnnouncement = () => {
|
|||||||
const removeAnnouncement = (index: number) => {
|
const removeAnnouncement = (index: number) => {
|
||||||
const currentAnnouncements = Array.isArray(props.modelValue.announcements) ? props.modelValue.announcements : []
|
const currentAnnouncements = Array.isArray(props.modelValue.announcements) ? props.modelValue.announcements : []
|
||||||
const newAnnouncements = currentAnnouncements.filter((_, i) => i !== index)
|
const newAnnouncements = currentAnnouncements.filter((_, i) => i !== index)
|
||||||
updateValue({
|
emit('update:modelValue', {
|
||||||
enable_announcements: props.modelValue.enable_announcements,
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
announcements: newAnnouncements
|
announcements: newAnnouncements
|
||||||
})
|
})
|
||||||
@@ -126,7 +172,7 @@ const moveAnnouncementUp = (index: number) => {
|
|||||||
const temp = newAnnouncements[index]
|
const temp = newAnnouncements[index]
|
||||||
newAnnouncements[index] = newAnnouncements[index - 1]
|
newAnnouncements[index] = newAnnouncements[index - 1]
|
||||||
newAnnouncements[index - 1] = temp
|
newAnnouncements[index - 1] = temp
|
||||||
updateValue({
|
emit('update:modelValue', {
|
||||||
enable_announcements: props.modelValue.enable_announcements,
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
announcements: newAnnouncements
|
announcements: newAnnouncements
|
||||||
})
|
})
|
||||||
@@ -141,7 +187,7 @@ const moveAnnouncementDown = (index: number) => {
|
|||||||
const temp = newAnnouncements[index]
|
const temp = newAnnouncements[index]
|
||||||
newAnnouncements[index] = newAnnouncements[index + 1]
|
newAnnouncements[index] = newAnnouncements[index + 1]
|
||||||
newAnnouncements[index + 1] = temp
|
newAnnouncements[index + 1] = temp
|
||||||
updateValue({
|
emit('update:modelValue', {
|
||||||
enable_announcements: props.modelValue.enable_announcements,
|
enable_announcements: props.modelValue.enable_announcements,
|
||||||
announcements: newAnnouncements
|
announcements: newAnnouncements
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<i class="fas fa-bullhorn text-blue-600 dark:text-blue-400 text-sm flex-shrink-0"></i>
|
<i class="fas fa-bullhorn text-blue-600 dark:text-blue-400 text-sm flex-shrink-0"></i>
|
||||||
<div class="announcement-content overflow-hidden">
|
<div class="announcement-content overflow-hidden">
|
||||||
<div class="announcement-item active">
|
<div class="announcement-item active">
|
||||||
<span class="text-sm text-gray-700 dark:text-gray-300 truncate">{{ validAnnouncements[currentIndex].content }}</span>
|
<span class="text-sm text-gray-700 dark:text-gray-300 truncate" v-html="validAnnouncements[currentIndex].content"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -318,6 +318,15 @@ const {
|
|||||||
saveConfig: saveConfigWithDetection
|
saveConfig: saveConfigWithDetection
|
||||||
} = useConfigChangeDetection<SiteConfigForm>({
|
} = useConfigChangeDetection<SiteConfigForm>({
|
||||||
debug: true,
|
debug: true,
|
||||||
|
// 自定义比较函数,处理数组深层比较
|
||||||
|
customCompare: (key: string, currentValue: any, originalValue: any) => {
|
||||||
|
// 对于数组类型,使用JSON字符串比较
|
||||||
|
if (Array.isArray(currentValue) && Array.isArray(originalValue)) {
|
||||||
|
return JSON.stringify(currentValue) !== JSON.stringify(originalValue)
|
||||||
|
}
|
||||||
|
// 其他类型使用默认比较
|
||||||
|
return currentValue !== originalValue
|
||||||
|
},
|
||||||
// 字段映射:前端字段名 -> 后端字段名
|
// 字段映射:前端字段名 -> 后端字段名
|
||||||
fieldMapping: {
|
fieldMapping: {
|
||||||
site_title: 'site_title',
|
site_title: 'site_title',
|
||||||
@@ -470,37 +479,68 @@ const openLogoSelector = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const clearLogo = () => {
|
const clearLogo = () => {
|
||||||
configForm.value.site_logo = ''
|
configForm.value = {
|
||||||
|
...configForm.value,
|
||||||
|
site_logo: ''
|
||||||
|
}
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 子组件更新处理方法
|
// 子组件更新处理方法
|
||||||
const handleAnnouncementUpdate = (newValue: any) => {
|
const handleAnnouncementUpdate = (newValue: any) => {
|
||||||
configForm.value.enable_announcements = newValue.enable_announcements
|
// 直接更新整个表单
|
||||||
configForm.value.announcements = newValue.announcements
|
configForm.value = {
|
||||||
|
...configForm.value,
|
||||||
|
enable_announcements: newValue.enable_announcements,
|
||||||
|
announcements: newValue.announcements
|
||||||
|
}
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleFloatButtonsUpdate = (newValue: any) => {
|
const handleFloatButtonsUpdate = (newValue: any) => {
|
||||||
configForm.value.enable_float_buttons = newValue.enable_float_buttons
|
configForm.value = {
|
||||||
configForm.value.wechat_search_image = newValue.wechat_search_image
|
...configForm.value,
|
||||||
configForm.value.telegram_qr_image = newValue.telegram_qr_image
|
enable_float_buttons: newValue.enable_float_buttons,
|
||||||
|
wechat_search_image: newValue.wechat_search_image,
|
||||||
|
telegram_qr_image: newValue.telegram_qr_image
|
||||||
|
}
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logo选择处理
|
// Logo选择处理
|
||||||
const handleLogoSelect = (file: any) => {
|
const handleLogoSelect = (file: any) => {
|
||||||
configForm.value.site_logo = file.access_url
|
configForm.value = {
|
||||||
|
...configForm.value,
|
||||||
|
site_logo: file.access_url
|
||||||
|
}
|
||||||
showLogoSelector.value = false
|
showLogoSelector.value = false
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 微信图片选择处理
|
// 微信图片选择处理
|
||||||
const handleWechatImageSelect = (file: any) => {
|
const handleWechatImageSelect = (file: any) => {
|
||||||
configForm.value.wechat_search_image = file.access_url
|
configForm.value = {
|
||||||
|
...configForm.value,
|
||||||
|
wechat_search_image: file.access_url
|
||||||
|
}
|
||||||
showWechatSelector.value = false
|
showWechatSelector.value = false
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Telegram图片选择处理
|
// Telegram图片选择处理
|
||||||
const handleTelegramImageSelect = (file: any) => {
|
const handleTelegramImageSelect = (file: any) => {
|
||||||
configForm.value.telegram_qr_image = file.access_url
|
configForm.value = {
|
||||||
|
...configForm.value,
|
||||||
|
telegram_qr_image: file.access_url
|
||||||
|
}
|
||||||
showTelegramSelector.value = false
|
showTelegramSelector.value = false
|
||||||
|
// 强制触发更新
|
||||||
|
updateCurrentConfig({ ...configForm.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 页面加载时获取配置
|
// 页面加载时获取配置
|
||||||
|
|||||||
Reference in New Issue
Block a user