diff --git a/pages.json b/pages.json
index 4f19b71..c66adbd 100644
--- a/pages.json
+++ b/pages.json
@@ -1530,8 +1530,13 @@
{
"path": "card/share",
"style": {
- "navigationBarTitleText": "名片分享",
- "navigationStyle": "custom"
+ // #ifdef MP-HARMONY
+ // 鸿蒙元服务的 web-view 是原生全屏组件, 只能自绘头部(见 share.vue)
+ "navigationStyle": "custom",
+ // #endif
+ // 微信小程序必须用原生导航栏: web-view 会自动排在导航栏下方,
+ // 若用 custom + cover-view 自绘头部, 头部会浮在 web-view 上遮住名片顶部
+ "navigationBarTitleText": "名片分享"
}
},
{
diff --git a/pages_tool/card/admin/contacts.vue b/pages_tool/card/admin/contacts.vue
index 12314cf..0c51afb 100644
--- a/pages_tool/card/admin/contacts.vue
+++ b/pages_tool/card/admin/contacts.vue
@@ -27,7 +27,7 @@
-
+
{{ item.name }}
{{ item.source_text }}
@@ -42,9 +42,9 @@
已归档
- 编辑
- 转为潜在客户
- 删除
+ 编辑
+ 转为潜在客户
+ 删除
@@ -116,7 +116,27 @@ export default {
},
goSelf() {},
// 编辑页共用 contact-edit; from=admin 时保存后回本页(见 contact-edit.vue#backToList)
- goEdit(id) {
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。
+ * 兼容: 无参(新建) / 事件对象(data-index) / 直接 id。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number' || typeof payload === 'string') return null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.list[i]) return this.list[i];
+ }
+ return payload.id ? payload : null;
+ },
+ goEdit(payload) {
+ let id = payload;
+ if (payload && payload.currentTarget) {
+ const i = Number(payload.currentTarget.dataset.index);
+ const item = this.list[i];
+ id = item ? item.id : '';
+ }
const url = id
? '/pages_tool/card/contact-edit?from=admin&id=' + id
: '/pages_tool/card/contact-edit?from=admin';
@@ -163,7 +183,9 @@ export default {
}
});
},
- convertToLead(item) {
+ convertToLead(payload) {
+ const item = this.resolveItem(payload);
+ if (!item) return;
uni.showModal({
title: '转为潜在客户',
content: '将「' + (item.name || '') + '」转入潜在客户跟进?人脉记录会保留。',
@@ -192,7 +214,9 @@ export default {
}
});
},
- delContact(item) {
+ delContact(payload) {
+ const item = this.resolveItem(payload);
+ if (!item) return;
// 真删不可恢复, 二次确认
uni.showModal({
title: '删除人脉',
diff --git a/pages_tool/card/admin/leads.vue b/pages_tool/card/admin/leads.vue
index 0e9ed02..96d6900 100644
--- a/pages_tool/card/admin/leads.vue
+++ b/pages_tool/card/admin/leads.vue
@@ -39,7 +39,7 @@
复制微信
- 更新状态
+ 更新状态
@@ -143,7 +143,33 @@ export default {
}
});
},
- changeStatus(item, index) {
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。
+ * 兼容: 事件对象(data-index) / 数字索引 / 行对象本身。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number') return this.list[payload] || null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.list[i]) return this.list[i];
+ }
+ return payload.id ? payload : null;
+ },
+ changeStatus(payload) {
+ let item, index;
+ if (payload && payload.currentTarget) {
+ index = Number(payload.currentTarget.dataset.index);
+ item = this.list[index];
+ } else if (typeof payload === 'number') {
+ index = payload;
+ item = this.list[index];
+ } else {
+ item = payload;
+ index = this.list.indexOf(item);
+ }
+ if (!item) return;
uni.showActionSheet({
itemList: LEAD_STATUS.map(s => s.label),
success: res => {
diff --git a/pages_tool/card/admin/manage.vue b/pages_tool/card/admin/manage.vue
index 9c0a66d..4ef1c4c 100644
--- a/pages_tool/card/admin/manage.vue
+++ b/pages_tool/card/admin/manage.vue
@@ -25,8 +25,8 @@
-
+
{{ avatarText(item.name) }}
@@ -41,8 +41,8 @@
{{ sourceLabel(item) }}
- 编辑
- 详情
+ 编辑
+ 详情
@@ -159,14 +159,30 @@ export default {
},
/* ---------- 导航 ---------- */
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象(如 goDetail(item))会丢参,
+ * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number') return this.list[payload] || null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.list[i]) return this.list[i];
+ }
+ return payload.card_id ? payload : null;
+ },
// 名片路由参数一律 card_id(字符串), encodeURIComponent 幂等
- goDetail(item) {
+ goDetail(payload) {
+ const item = this.resolveItem(payload);
if (!item || !item.card_id) return;
uni.navigateTo({
url: '/pages_tool/card/detail?card_id=' + encodeURIComponent(item.card_id)
});
},
- goEdit(item) {
+ goEdit(payload) {
+ const item = this.resolveItem(payload);
if (!item || !item.card_id) return;
uni.navigateTo({
url: '/pages_tool/card/edit?card_id=' + encodeURIComponent(item.card_id)
diff --git a/pages_tool/card/contacts.vue b/pages_tool/card/contacts.vue
index 53923c2..6ce953c 100644
--- a/pages_tool/card/contacts.vue
+++ b/pages_tool/card/contacts.vue
@@ -41,9 +41,9 @@
已归档
- 编辑
- 转为潜在客户
- 删除
+ 编辑
+ 转为潜在客户
+ 删除
@@ -102,7 +102,28 @@ export default {
goLeads() {
this.$util.redirectTo('/pages_tool/card/leads');
},
- goEdit(id) {
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象(如 convertToLead(item))会丢参,
+ * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。
+ * 兼容: 无参(新建) / 事件对象(data-index) / 直接 id。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number') return this.list[payload] || null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.list[i]) return this.list[i];
+ }
+ return payload.id ? payload : null;
+ },
+ goEdit(payload) {
+ let id = payload;
+ if (payload && payload.currentTarget) {
+ const i = Number(payload.currentTarget.dataset.index);
+ const item = this.list[i];
+ id = item ? item.id : '';
+ }
const url = id ? '/pages_tool/card/contact-edit?id=' + id : '/pages_tool/card/contact-edit';
this.$util.redirectTo(url);
},
@@ -150,7 +171,9 @@ export default {
}
});
},
- convertToLead(item) {
+ convertToLead(payload) {
+ const item = this.resolveItem(payload);
+ if (!item) return;
uni.showModal({
title: '转为潜在客户',
content: '将「' + (item.name || '') + '」转入潜在客户跟进?人脉记录会保留。',
@@ -178,7 +201,9 @@ export default {
}
});
},
- delContact(item) {
+ delContact(payload) {
+ const item = this.resolveItem(payload);
+ if (!item) return;
uni.showModal({
title: '删除人脉',
content: '删除后不可恢复,确定删除「' + (item.name || '') + '」?',
diff --git a/pages_tool/card/exchange.vue b/pages_tool/card/exchange.vue
index 9063a4d..b4a61a4 100644
--- a/pages_tool/card/exchange.vue
+++ b/pages_tool/card/exchange.vue
@@ -10,9 +10,9 @@
-
+
-
+
{{ item.name.charAt(0) }}
@@ -26,7 +26,7 @@
{{ item.company }}
- 同意
+ 同意
已同意
@@ -110,8 +110,23 @@ export default {
}
});
},
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象(viewCard(item))会丢参,
+ * 统一改为 :data-index + 不传参, 这里从 dataset 取索引回表。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number') return this.shownList[payload] || null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.shownList[i]) return this.shownList[i];
+ }
+ return payload.id ? payload : null;
+ },
// 点对方名片 → 跳转对方名片详情(用 from_card_id 字符串)
- viewCard(item) {
+ viewCard(payload) {
+ const item = this.resolveItem(payload);
if (!item || !item.from_card_id) return;
uni.navigateTo({
url: '/pages_tool/card/detail?card_id=' + encodeURIComponent(item.from_card_id)
@@ -154,7 +169,9 @@ export default {
return '';
// #endif
},
- onAgree(item) {
+ onAgree(payload) {
+ const item = this.resolveItem(payload);
+ if (!item) return;
this.$cardApi.exchangeAgree({
data: { id: item.id },
success: res => {
diff --git a/pages_tool/card/leads.vue b/pages_tool/card/leads.vue
index f88b8e3..8d3fee6 100644
--- a/pages_tool/card/leads.vue
+++ b/pages_tool/card/leads.vue
@@ -19,7 +19,7 @@
-
+
{{ item.name || '未留姓名' }}
{{ item.status_text || '新客户' }}
@@ -36,7 +36,7 @@
复制微信
- 更新状态
+ 更新状态
@@ -127,7 +127,33 @@ export default {
}
});
},
- changeStatus(item, index) {
+ /**
+ * 取事件对应的行数据。小程序端 v-for 内联传对象会丢参, 统一 :data-index + 不传参。
+ * 兼容: 事件对象(data-index) / 数字索引 / 行对象本身。
+ */
+ resolveItem(payload) {
+ if (payload == null) return null;
+ if (typeof payload === 'number') return this.list[payload] || null;
+ const ds = payload.currentTarget && payload.currentTarget.dataset;
+ if (ds) {
+ const i = Number(ds.index);
+ if (!isNaN(i) && this.list[i]) return this.list[i];
+ }
+ return payload.id ? payload : null;
+ },
+ changeStatus(payload) {
+ let item, index;
+ if (payload && payload.currentTarget) {
+ index = Number(payload.currentTarget.dataset.index);
+ item = this.list[index];
+ } else if (typeof payload === 'number') {
+ index = payload;
+ item = this.list[index];
+ } else {
+ item = payload;
+ index = this.list.indexOf(item);
+ }
+ if (!item) return;
uni.showActionSheet({
itemList: STATUS_MAP.map(s => s.label),
success: res => {
@@ -173,13 +199,14 @@ export default {
// 点整条客户卡片 → 打开对方名片
// 与交换名片(exchange.vue)同款写法: detail 接收 card_id(卡片编号字符串);
// 本人名下的卡 → 正常详情页; 非本人名下 → detail 兜底跳公开名片页(后端返回的 wap_url)
- viewCard(item) {
+ viewCard(payload) {
+ const item = this.resolveItem(payload);
const cardId = this.cardIdOf(item);
if (!cardId) {
// 后端 lead/lists 目前只下发 card_name(展示名), 没有名片编号 → 无法跳转。
// 这里把该行真实字段打到控制台, 便于确认后端是否用了别的字段名(如 relation_id)
console.warn('[card/leads] 该行缺少名片编号(card_id/from_card_id/source_card_id), 无法打开对方名片; 可用字段:',
- item ? Object.keys(item) : item, item);
+ item ? Object.keys(item) : 'event', item);
uni.showToast({ title: '该客户未关联名片,无法查看', icon: 'none' });
return;
}
diff --git a/pages_tool/card/share.vue b/pages_tool/card/share.vue
index 742640a..da78def 100644
--- a/pages_tool/card/share.vue
+++ b/pages_tool/card/share.vue
@@ -1,7 +1,7 @@
-
-
+
+