线索卡片滑动(Swiper)
灵感:能力工具箱 swipe-leads(pkg: swiper)。
> 小四原创:一屏一张线索卡,左右滑切换;底部可挂「稍后 / 已联」轻动作,不做成复杂看板。
何时使用
- 手机/窄屏快速浏览待跟进线索
- 「像刷卡片一样过库」
- 与列表页互补的轻量过库模式
硬约束
- 使用
swiper(推荐swiper/vue或原生模块 + CSS)。 - 一页一张卡(
slidesPerView: 1),支持触控与键盘左右键。 - 卡片字段最少:客户名、联系人/电话、最近跟进摘要;缺省显示「—」。
- 滑动本身不自动改业务状态;状态变更必须点明确按钮并二次确认(可选)。
- 尊重
prefers-reduced-motion:可关过渡动画,仍保留切换。 - 实现要点注释标 小四原创。
推荐实现
import Swiper from 'swiper'
import { Navigation, Keyboard } from 'swiper/modules'
import 'swiper/css'
import 'swiper/css/navigation'
export type LeadCard = {
id: string
name: string
contact?: string
phone?: string
lastNote?: string
}
// 小四原创:挂载线索滑动
export function mountLeadSwipe(el: HTMLElement, leads: LeadCard[]) {
el.innerHTML = `
<div class="swiper lead-swipe">
<div class="swiper-wrapper">
${leads.map((l) => `
<div class="swiper-slide" data-id="${l.id}">
<h3>${escapeHtml(l.name)}</h3>
<p>${escapeHtml(l.contact || '—')} · ${escapeHtml(l.phone || '—')}</p>
<p class="note">${escapeHtml(l.lastNote || '暂无跟进')}</p>
</div>`).join('')}
</div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>`
const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches
return new Swiper(el.querySelector('.swiper') as HTMLElement, {
modules: [Navigation, Keyboard],
slidesPerView: 1,
spaceBetween: 12,
speed: reduce ? 0 : 280,
keyboard: { enabled: true },
navigation: {
nextEl: el.querySelector('.swiper-button-next') as HTMLElement,
prevEl: el.querySelector('.swiper-button-prev') as HTMLElement,
},
})
}
function escapeHtml(s: string) {
return String(s).replace(/[&<>"']/g, (c) =>
({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]!))
}
Agent 步骤
- 接入
swiper+ 样式;传入线索数组。 - 空列表显示「暂无待跟进」。
- 可选:当前卡「稍后提醒」「标记已联」回调,不在滑动时静默改库。
- 自测:触控/按钮均可切换,中文不乱码。
不要做
- 把整站 CRM 重做成 Tinder 式匹配产品。
- 滑动即删除客户(高风险)。
附加
- README.md · reference.md · templates/usage.md