merge(main): 同步主站最新 UI 与审核优化代码并保持分销多租户隔离

This commit is contained in:
yml2213
2026-09-07 17:37:31 +08:00
51 changed files with 11152 additions and 4950 deletions
+10 -1
View File
@@ -47,7 +47,16 @@ export async function fetchAdminFileBlob(key: string) {
}
export async function fetchFileBlobByURL(fileURL: string) {
const apiPath = fileURL.startsWith('/api/') ? fileURL.slice(4) : fileURL
let apiPath = fileURL
try {
const parsed = new URL(fileURL, window.location.origin)
apiPath = parsed.pathname + parsed.search
} catch {
// keep as is
}
if (apiPath.startsWith('/api/')) {
apiPath = apiPath.slice(4)
}
const { data } = await apiClient.get<Blob>(apiPath, {
responseType: 'blob',
})
@@ -115,9 +115,27 @@ async function loadImage() {
const sourceURL = await resolveURL(props.source)
imageURL.value = sourceURL
if (props.previewSrcList?.length) {
previewURLs.value = await Promise.all(
props.previewSrcList.map(url => (url === props.source ? sourceURL : resolveURL(url)))
// 先填充公开或当前已解析的主图 URL,让预览组件立即可用
const initialPreviews = props.previewSrcList.map(url =>
url === props.source ? sourceURL : url
)
previewURLs.value = initialPreviews
// 若包含需要鉴权转 Blob 的私有 URL,在后台异步静默解析,不阻塞主图呈现
const hasAuthPreviews = props.previewSrcList.some(
url => url !== props.source && shouldFetchWithAuth(url)
)
if (hasAuthPreviews) {
Promise.all(
props.previewSrcList.map(url => (url === props.source ? sourceURL : resolveURL(url)))
)
.then(urls => {
previewURLs.value = urls
})
.catch(() => {
// 预览图静默降级,不破坏主图正常显示
})
}
}
} catch {
failed.value = true
@@ -401,3 +401,54 @@ function formatCompactNumber(value: number) {
const rounded = Math.round(value * 10) / 10
return Number.isInteger(rounded) ? `${rounded}` : rounded.toFixed(1)
}
export function isTopTierInsurance(value: string | undefined | null): boolean {
if (!value) return false
const s = String(value).trim().toLowerCase()
return (
s.includes('3*3') || s.includes('3x3') || s.includes('3×3') || s === '9格' || s.includes('9格')
)
}
/**
* 获取账号封面图(优先公开缩略图接口,其次首张截图)
*/
export function getCoinScreenshotURL(item: Listing): string {
return item.cover_url || item.screenshot_urls?.[0] || ''
}
/**
* 转换截图为缩略图 URL(优先使用 16KB 极速缩略图,秒级加载)
*/
export function getScreenshotThumbURL(url: string | undefined | null): string {
if (!url) return ''
if (url.includes('/screenshots/')) {
const separator = url.includes('?') ? '&' : '?'
return `${url}${separator}variant=thumb`
}
return url
}
/**
* 转换截图为中等图 URL(1280px,100KB左右,清晰秒开)
*/
export function getScreenshotMediumURL(url: string | undefined | null): string {
if (!url) return ''
if (url.includes('/screenshots/')) {
const separator = url.includes('?') ? '&' : '?'
return `${url}${separator}variant=medium`
}
return url
}
/**
* 转换截图为原始高清原图 URL(用于全屏放大查看细节)
*/
export function getScreenshotRawURL(url: string | undefined | null): string {
if (!url) return ''
if (url.includes('/screenshots/')) {
const separator = url.includes('?') ? '&' : '?'
return `${url}${separator}variant=raw`
}
return url
}