- nav_links 增加 position(header/footer,迁移 v11),后台“导航链接”拆为头部/底部两张卡片,页脚链接支持多语言、新窗口与点分隔,删除硬编码的关于我们等链接 - site_settings 增加 favicon(迁移 v12),新增 PUT/DELETE /api/site/favicon,支持 ICO/PNG/SVG 等且不裁剪,引用计数与 Logo 一致自动管理 - 文件服务识别 SVG 并允许内联,统一附加 CSP(default-src 'none'; sandbox)防止存储型 XSS;Logo 维持仅栅格 - 前端 SiteInfoForm 增加 Favicon 上传/清空/预览,App.vue 动态更新 link rel=icon,三语文案补齐 - 补充位置与 Favicon 的接口/引用计数/安全头测试,重新生成 Swagger 文档
54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
import { request } from './http'
|
|
|
|
export interface SiteInfo {
|
|
site_name: string
|
|
logo: string
|
|
favicon: string
|
|
footer: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface UpdateSitePayload {
|
|
site_name: string
|
|
logo: string
|
|
favicon: string
|
|
footer: string
|
|
}
|
|
|
|
export function getSiteInfo(): Promise<SiteInfo> {
|
|
return request<SiteInfo>('/site')
|
|
}
|
|
|
|
export function updateSiteInfo(payload: UpdateSitePayload): Promise<SiteInfo> {
|
|
return request<SiteInfo>('/site', {
|
|
method: 'PUT',
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export function uploadSiteLogo(file: File): Promise<SiteInfo> {
|
|
const form = new FormData()
|
|
form.append('file', file, file.name)
|
|
return request<SiteInfo>('/site/logo', {
|
|
method: 'PUT',
|
|
body: form,
|
|
})
|
|
}
|
|
|
|
export function deleteSiteLogo(): Promise<SiteInfo> {
|
|
return request<SiteInfo>('/site/logo', { method: 'DELETE' })
|
|
}
|
|
|
|
export function uploadSiteFavicon(file: File): Promise<SiteInfo> {
|
|
const form = new FormData()
|
|
form.append('file', file, file.name)
|
|
return request<SiteInfo>('/site/favicon', {
|
|
method: 'PUT',
|
|
body: form,
|
|
})
|
|
}
|
|
|
|
export function deleteSiteFavicon(): Promise<SiteInfo> {
|
|
return request<SiteInfo>('/site/favicon', { method: 'DELETE' })
|
|
}
|