- 将 admin 相关的 store/utils 移入对应子目录(pages/admin/stores、pages/admin/utils) - 更新 manifest.json、pages.json 路由与配置 - 个人中心 ProfileMenu 移除顶部「我的会员卡 / 我的预约」快捷卡片,与 UserCard 会员卡入口合并 - 「我的预约」下移至菜单列表,紧邻「个人信息」 - 清理 profile/index.vue 中不再使用的 bookingStore / 计算属性 / 透传
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import type {
|
|
CreateStudioUploadCredentialDto,
|
|
StudioAssetType,
|
|
StudioUploadCredential,
|
|
} from '@mp-pilates/shared'
|
|
import type { useAdminStore } from '../stores/admin'
|
|
|
|
type AdminStore = ReturnType<typeof useAdminStore>
|
|
|
|
function inferContentType(fileName: string): string | undefined {
|
|
const extension = fileName.split('.').pop()?.toLowerCase()
|
|
|
|
if (extension === 'jpg' || extension === 'jpeg') {
|
|
return 'image/jpeg'
|
|
}
|
|
if (extension === 'png') {
|
|
return 'image/png'
|
|
}
|
|
if (extension === 'webp') {
|
|
return 'image/webp'
|
|
}
|
|
if (extension === 'heic') {
|
|
return 'image/heic'
|
|
}
|
|
if (extension === 'heif') {
|
|
return 'image/heif'
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
function uploadToCos(filePath: string, credential: StudioUploadCredential): Promise<void> {
|
|
return new Promise((resolve, reject) => {
|
|
uni.uploadFile({
|
|
url: credential.uploadUrl,
|
|
filePath,
|
|
name: 'file',
|
|
formData: credential.formData as unknown as Record<string, string>,
|
|
success: (result) => {
|
|
if (result.statusCode >= 200 && result.statusCode < 300) {
|
|
resolve()
|
|
return
|
|
}
|
|
|
|
const body = typeof result.data === 'string' ? result.data : JSON.stringify(result.data)
|
|
const code = body.match(/<Code>([^<]+)<\/Code>/)?.[1]
|
|
const message = body.match(/<Message>([^<]+)<\/Message>/)?.[1]
|
|
const detail = code || message ? `${code ?? 'COS'}: ${message ?? body}` : body
|
|
reject(new Error(`COS 上传失败 (${result.statusCode}) ${detail}`))
|
|
},
|
|
fail: (error) => {
|
|
reject(new Error(error.errMsg || 'COS 上传失败'))
|
|
},
|
|
})
|
|
})
|
|
}
|
|
|
|
export async function uploadStudioAsset(params: {
|
|
adminStore: AdminStore
|
|
filePath: string
|
|
fileName: string
|
|
assetType: StudioAssetType
|
|
}): Promise<string> {
|
|
const payload: CreateStudioUploadCredentialDto = {
|
|
fileName: params.fileName,
|
|
contentType: inferContentType(params.fileName),
|
|
assetType: params.assetType,
|
|
}
|
|
const credential = await params.adminStore.createStudioUploadCredential(payload)
|
|
await uploadToCos(params.filePath, credential)
|
|
return credential.fileUrl
|
|
}
|