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;