task-87(店铺中心): 实现密钥删除确认和刷新

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

TDD: task-87.test.ts 8 用例先 RED 后 GREEN。
This commit is contained in:
2026-09-05 16:41:37 +08:00
parent 9060464afd
commit bef09cb5b5
3 changed files with 110 additions and 0 deletions
@@ -50,3 +50,8 @@ export async function updateShopKey(id: number, form: ShopKeyFormValues): Promis
}
return item
}
/** 删除店铺密钥:DELETE /api/admin/shop-keys/{id};成功后由调用方按目标页刷新。 */
export async function deleteShopKey(id: number): Promise<void> {
await http.delete<unknown>(`${SHOP_KEYS_ENDPOINT}/${id}`)
}
@@ -0,0 +1,39 @@
/** 店铺密钥删除确认与刷新(任务 87):删除前确认文案与删除后目标页计算,纯逻辑。 */
import { SHOP_PAGE_DEFAULT_SIZE } from './shop-dto.ts'
import type { ShopKeyItem } from './shop-dto.ts'
function nameOrFallback(item: ShopKeyItem | null | undefined): string {
if (!item || typeof item !== 'object') return ''
if (typeof item.ziniaoAccountName === 'string' && item.ziniaoAccountName.trim()) {
return item.ziniaoAccountName.trim()
}
if (typeof item.id === 'number' && Number.isFinite(item.id) && item.id >= 1) {
return `#${Math.floor(item.id)}`
}
return ''
}
/** 确认文案用到的可读名称(账号名优先,空则回退 #id)。 */
export function shopKeyDeleteTargetName(item: ShopKeyItem | null | undefined): string {
return nameOrFallback(item)
}
/** 删除确认文案;空记录返回 null(不弹可误删的确认)。 */
export function shopKeyDeleteConfirmText(item: ShopKeyItem | null | undefined): string | null {
const name = nameOrFallback(item)
return name ? `确定删除店铺密钥“${name}”吗?` : null
}
function pageSizeOr(size: unknown, fallback: number): number {
return typeof size === 'number' && Number.isFinite(size) && size >= 1 ? Math.floor(size) : fallback
}
/** 删除一行后应请求的目标页:若被删的是末页最后一条则回退,否则保持原页。 */
export function nextShopKeyPageAfterDelete(page: unknown, pageSize: unknown, totalBefore: unknown): number {
const size = pageSizeOr(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))
}