admin模块接入数据库

This commit is contained in:
comlibmb
2026-02-13 17:29:50 +08:00
parent 56209b7a75
commit ec636dc703
58 changed files with 5586 additions and 1394 deletions

View File

@@ -1,3 +1,4 @@
import supa from '@/components/supadb/aksupainstance.uts'
import { rpcOrNull, rpcOrValue } from '@/services/analytics/rpc.uts'
export type AdminProduct = {
@@ -9,7 +10,27 @@ export type AdminProduct = {
sales: number
status: number
created_at: string
category_id: string
category_name: string
subtitle: string | null
description: string | null
product_code: string | null
unit: string | null
image_urls: string[] | null
video_urls: string[] | null
tags: string[] | null
attributes: any | null
}
export type AdminProductSku = {
id?: string
product_id?: string
sku_code: string
specifications: any
price: number
stock: number
status: number
image_url: string | null
}
export type ProductPageResult = {
@@ -50,6 +71,87 @@ export async function fetchAdminProductPage(
}
}
/**
* 获取商品详情(包含 SKU 列表)
*/
export async function fetchAdminProductDetail(productId: string): Promise<{ product: AdminProduct | null, skus: AdminProductSku[] }> {
const { data: productData, error: productError } = await supa
.from('ml_products')
.select('*, ml_categories(name)')
.eq('id', productId)
.single()
.execute()
if (productError != null) {
console.error('获取商品详情失败:', productError)
return { product: null, skus: [] }
}
const { data: skuData, error: skuError } = await supa
.from('ml_product_skus')
.select('*')
.eq('product_id', productId)
.execute()
const product = productData as any
if (product != null && product.ml_categories != null) {
product.category_name = (product.ml_categories as any).name
}
return {
product: product as AdminProduct,
skus: (skuData ?? []) as AdminProductSku[]
}
}
/**
* 保存商品(新增或更新,含 SKU 关联保存)
*/
export async function saveAdminProduct(product: Partial<AdminProduct>, skus: AdminProductSku[]): Promise<boolean> {
const session = supa.getSession()
const uid = session?.user?.getString('id')
if (uid == null) return false
// 1. 保存商品主表
const { data: savedProduct, error: productError } = await supa
.from('ml_products')
.upsert({
...product,
merchant_id: uid,
updated_at: new Date().toISOString()
})
.select()
.single()
.execute()
if (productError != null || savedProduct == null) {
console.error('保存商品主表失败:', productError)
return false
}
const savedProductId = (savedProduct as any).id as string
// 2. 保存 SKU简单策略先删除旧的再插入新的或使用 upsert
// 注意:如果涉及订单关联,不能简单的物理删除旧 SKU
const skuPayload = skus.map(s => ({
...s,
product_id: savedProductId,
updated_at: new Date().toISOString()
}))
const { error: skuError } = await supa
.from('ml_product_skus')
.upsert(skuPayload as any)
.execute()
if (skuError != null) {
console.error('保存 SKU 失败:', skuError)
return false
}
return true
}
/**
* 获取商品状态汇总统计
*/