完成编辑商品信息同步

This commit is contained in:
2026-03-14 00:16:28 +08:00
parent 91c27ecf61
commit 5914104851
4 changed files with 186 additions and 108 deletions

View File

@@ -2,7 +2,7 @@
<view class="product-edit-page">
<view class="page-header">
<view class="back-link" @click="goBack">
<text class="arrow">{"<"}</text>
<text class="arrow"><</text>
<text class="back-txt">返回</text>
</view>
<text class="header-title">编辑商品</text>
@@ -232,41 +232,76 @@ async function loadCategoryOptions() {
async function fetchProductDetail(id: string, mId: string) {
try {
const { data, error } = await supa
const res = await supa
.from('ml_products')
.select('*')
.eq('id', id)
.eq('merchant_id', mId)
.single()
.execute()
if (error) throw error
if (data) {
formData.value.id = data.id
formData.value.name = data.name || ''
formData.value.base_price = data.base_price || 0
formData.value.available_stock = data.available_stock || 0
formData.value.total_stock = data.total_stock || data.available_stock || 0
formData.value.status = data.status || 1
formData.value.main_image_url = data.main_image_url || ''
formData.value.image_urls = data.image_urls || []
formData.value.video_urls = data.video_urls || []
formData.value.tags = data.tags || []
if (data.attributes && typeof data.attributes === 'object') {
const attrs = data.attributes as Record<string, any>
formData.value.attributes.unit = attrs['unit'] || '件'
}
// Try to map category
formData.value.category_id = data.category_id as string || ''
if (formData.value.category_id) {
const cat = categoryOptions.value.find((c: CategoryOption): boolean => c.id === formData.value.category_id)
categoryName.value = cat ? cat.name : '未知分类'
if (res.error != null) {
console.error('[ProductEdit] 查询失败:', res.error)
uni.showToast({ title: '获取商品信息失败,或者无权限编辑', icon: 'none' })
return
}
// .single() 返回时 data 可能是 UTSJSONObject 或包含一条记录的数组,兼容处理
let row : UTSJSONObject | null = null
if (res.data != null) {
const raw = res.data
if (Array.isArray(raw)) {
const arr = raw as Array<UTSJSONObject>
if (arr.length > 0) row = arr[0] as UTSJSONObject
} else {
row = raw as UTSJSONObject
}
}
} catch (e) {
console.error('获取详情失败', e)
uni.showToast({ title: '获取商品信息失败,或者无权限编辑', icon: 'none' })
if (row == null) {
uni.showToast({ title: '未找到该商品', icon: 'none' })
return
}
formData.value.id = row.getString('id') ?? ''
formData.value.name = row.getString('name') ?? ''
formData.value.base_price = row.getNumber('base_price') ?? 0
formData.value.available_stock = row.getNumber('available_stock') ?? 0
formData.value.total_stock = row.getNumber('total_stock') ?? row.getNumber('available_stock') ?? 0
formData.value.status = row.getNumber('status') ?? 1
formData.value.main_image_url = row.getString('main_image_url') ?? ''
formData.value.category_id = row.getString('category_id') ?? ''
// image_urls / video_urls / tags 是 JSONB 数组,用 .get() 取原始值再强转
const imgRaw = row.get('image_urls')
if (imgRaw != null && Array.isArray(imgRaw)) {
formData.value.image_urls = imgRaw as string[]
}
const vidRaw = row.get('video_urls')
if (vidRaw != null && Array.isArray(vidRaw)) {
formData.value.video_urls = vidRaw as string[]
}
const tagsRaw = row.get('tags')
if (tagsRaw != null && Array.isArray(tagsRaw)) {
formData.value.tags = tagsRaw as string[]
}
// attributes JSONB 是对象,用 getJSON 取
const attrsRaw = row.getJSON('attributes')
if (attrsRaw != null) {
formData.value.attributes.unit = attrsRaw.getString('unit') ?? '件'
}
// 同步分类名称
if (formData.value.category_id) {
const cat = categoryOptions.value.find((c: CategoryOption): boolean => c.id === formData.value.category_id)
categoryName.value = cat ? cat.name : ''
}
console.log('[ProductEdit] 加载成功id=', formData.value.id, 'name=', formData.value.name)
} catch (e : any) {
console.error('[ProductEdit] 获取详情异常:', e)
uni.showToast({ title: '获取商品信息失败', icon: 'none' })
}
}