task-95(店铺中心): 实现店铺删除确认

新增 shop-manage-delete.ts(删除确认文案 + 删除后目标页回退) 并在
shop-manage-api.ts 增加 deleteShopManage(DELETE /api/admin/shop-manages/{id})。

TDD: task-95.test.ts 8 用例先 RED 后 GREEN。
This commit is contained in:
2026-09-05 16:50:16 +08:00
parent 0a1e778ef6
commit 29641e20a7
3 changed files with 109 additions and 0 deletions
@@ -73,3 +73,8 @@ export async function fetchShopCredential(id: number, shopName: string): Promise
}
return credential
}
/** 删除店铺:DELETE /api/admin/shop-manages/{id};成功后由调用方按目标页刷新。 */
export async function deleteShopManage(id: number): Promise<void> {
await http.delete<unknown>(`${SHOP_MANAGE_ENDPOINT}/${id}`)
}
@@ -0,0 +1,38 @@
/** 店铺删除确认与刷新(任务 95):删除前确认文案与删除后目标页计算,纯逻辑。 */
import { SHOP_PAGE_DEFAULT_SIZE, type ShopSummary } from './shop-dto.ts'
function nameOrFallback(item: ShopSummary | null | undefined): string {
if (!item || typeof item !== 'object') return ''
if (typeof item.shopName === 'string' && item.shopName.trim()) {
return item.shopName.trim()
}
if (typeof item.id === 'number' && Number.isFinite(item.id) && item.id >= 1) {
return `#${Math.floor(item.id)}`
}
return ''
}
/** 确认文案用到的店铺名(为空时回退 #id)。 */
export function shopManageDeleteTargetName(item: ShopSummary | null | undefined): string {
return nameOrFallback(item)
}
/** 删除确认文案;空记录返回 null。 */
export function shopManageDeleteConfirmText(item: ShopSummary | null | undefined): string | null {
const name = nameOrFallback(item)
return name ? `确定删除店铺“${name}”吗?` : null
}
function sizeOr(size: unknown, fallback: number): number {
return typeof size === 'number' && Number.isFinite(size) && size >= 1 ? Math.floor(size) : fallback
}
/** 删除一行后应请求的目标页:若被删的是末页最后一条则回退,否则保持原页。 */
export function nextShopManagePageAfterDelete(page: unknown, pageSize: unknown, totalBefore: unknown): number {
const size = sizeOr(pageSize, SHOP_PAGE_DEFAULT_SIZE)
const before = typeof totalBefore === 'number' && Number.isFinite(totalBefore) ? Math.max(Math.floor(totalBefore), 0) : 0
const after = Math.max(before - 1, 0)
const pagesAfter = after === 0 ? 1 : Math.max(1, Math.ceil(after / size))
const requested = typeof page === 'number' && Number.isFinite(page) ? Math.floor(page) : 1
return Math.max(1, Math.min(requested, pagesAfter))
}