diff --git a/common/js/card-api.js b/common/js/card-api.js index ff6eca3..2a191cb 100644 --- a/common/js/card-api.js +++ b/common/js/card-api.js @@ -35,6 +35,7 @@ export const CARD_API_URL = { CARD_RECOGNIZE: '/card/api/card/recognize', CARD_RETRY: '/card/api/card/retry', CARD_RECOGNIZE_BATCH: '/card/api/card/recognizeBatch', + CARD_DELETE: '/card/api/card/delete', // 删除自己的名片(软删, 2.11.91) // === 跟进完成态 2.11.3 /card/api/card/* === CARD_FOLLOW_DONE: '/card/api/card/followDone', @@ -208,6 +209,18 @@ const CardApi = { Http.sendJson(Object.assign({ url: CARD_API_URL.CARD_FAVORITE }, p || {})); }, + /** + * 删除自己的名片(软删, 2.11.91) + * 文档: CARD_DELETE_API.md(POST /card/api/card/delete,token 自动带,不传 site_id) + * 通道: 与 cardClaim/cardFollowDone 同款 sendRequest(表单编码);只需 card_id 一个字段 + * 交互: 调用前页面必须已做二次确认;成功后 toast「已删除」并刷新列表(接口不再返回该卡) + * 口径: 「卡片不存在」是故意模糊(他人/已删/不存在同一文案),前端统一按 message toast,不特殊处理 + * @param {Object} p { data: { card_id }, success, fail } + */ + cardDelete(p) { + Http.sendRequest(Object.assign({ url: CARD_API_URL.CARD_DELETE }, p || {})); + }, + /** * 识别建卡 * @param {Object} p { media_path, media_type?, source_type?, success, fail } diff --git a/pages_tool/card/list.vue b/pages_tool/card/list.vue index 0667514..f95fbf4 100644 --- a/pages_tool/card/list.vue +++ b/pages_tool/card/list.vue @@ -53,6 +53,7 @@ @tap.stop="toggleFavorite">{{ item.is_favorite == 1 ? '★' : '☆' }} 完成 + 删除 › @@ -310,6 +311,50 @@ export default { } }); }, + /** + * 删除名片(软删, 2.11.91, 与 CARD_DELETE_API.md 同步) + * 行级归属: 只能删自己名下卡; 删他人/已删/不存在统一后端报「卡片不存在」。 + * 流程: 二次确认(danger 样式) → cardDelete → 成功 toast「已删除」并刷新列表 + * (列表接口立即不再返回该卡, 刷新即移除, 无需手动 splice)。 + * 失败口径同收口规范第 3 条: 统一 toast(message), 不刷新。 + */ + deleteCard(payload) { + const item = this.resolveItem(payload); + if (!item) return; + const cardId = this.cardIdOf(item); + if (!cardId) { + uni.showToast({ title: '该名片缺少编号,无法删除', icon: 'none' }); + return; + } + const name = item.name || '未命名名片'; + uni.showModal({ + title: '删除名片', + content: '删除后名片将立即失效,分享链接也会不可访问。确定删除「' + name + '」?', + confirmText: '删除', + confirmColor: '#e54d42', + success: m => { + if (!m.confirm) return; + uni.showLoading({ title: '删除中…' }); + this.$cardApi.cardDelete({ + data: { card_id: cardId }, + success: res => { + uni.hideLoading(); + if (res.code == 0) { + uni.showToast({ title: '已删除', icon: 'success' }); + this.refresh(); + } else { + // 「卡片不存在」模糊口径: 统一按 message 提示, 不特殊处理 + this.handleApiError(res); + } + }, + fail: () => { + uni.hideLoading(); + uni.showToast({ title: '网络异常,请稍后重试', icon: 'none' }); + } + }); + } + }); + }, // 空态: 查询我的建卡申请状态(2.11.15) loadApplyStatus() { this.$cardApi.applyStatus({ @@ -801,6 +846,21 @@ export default { border-radius: 24rpx; } +/* 删除名片按钮(2.11.91): danger 红, 与完成按钮同构的小药丸 */ +.card-del-btn { + flex-shrink: 0; + margin-left: 16rpx; + padding: 8rpx 20rpx; + background-color: #fdeceb; + color: #e54d42; + font-size: 24rpx; + border-radius: 24rpx; + + &:active { + background-color: #f9d6d3; + } +} + /* 首屏加载占位(替代"先闪空态") */ .first-loading { text-align: center;