refactor(mpuniapp): 全局规范所有用词并去除AI口吻与浮夸文案
- 规范7国语言全局词典中AI咨询为在线咨询,去除内部黑话与营销说教 - 在线咨询去除机械人套话与写死的大号AI文本标签 - 交换名片剔除留资行话与写死AI,规范为名片交换与纸质名片识别 - 工作台去除战报、闪电出示、高光足迹、破冰等中二词汇,回归严谨商务数据 - 产品案例与专栏文章去除夸大修饰词与冗余操作说明 - 潜客跟进去除写死销售套话,规范为得体自然的跟进建议 - 硬件安全与场景模式去除秒级一键、芯片防盗等噱头词 - 导航栏标题统一规范为在线咨询、名片编辑、展会数据 - 新增专项测试并通过全量62项回归测试
这个提交包含在:
@@ -126,9 +126,9 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': '预览中',
|
||||
'card.save_contact': '保存到通讯录',
|
||||
'card.exchange': '交换名片',
|
||||
'card.ai_chat': 'AI 咨询',
|
||||
'card.ai_chat': '在线咨询',
|
||||
'card.share': '分享名片',
|
||||
'card.scan_nfc': 'NFC 触碰感应',
|
||||
'card.scan_nfc': 'NFC 感应',
|
||||
'card.view_profile': '查看微官网',
|
||||
'radar.online_visitor': '在线访客',
|
||||
'radar.active_now': '当前活跃',
|
||||
@@ -147,12 +147,12 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.twitter': 'X',
|
||||
'portal.wechat': '微信',
|
||||
'portal.email': '邮件',
|
||||
'portal.phone': '电话呼叫',
|
||||
'portal.case': '案例详情',
|
||||
'portal.article': '深度文章',
|
||||
'portal.social': '社交矩阵',
|
||||
'portal.phone': '电话',
|
||||
'portal.case': '客户案例',
|
||||
'portal.article': '专栏文章',
|
||||
'portal.social': '社交媒体',
|
||||
'portal.video': '视频演示',
|
||||
'portal.block': '便当盒内容',
|
||||
'portal.block': '板块内容',
|
||||
'portal.contact_unset': '该联系方式未设置',
|
||||
'portal.copied': '已复制',
|
||||
'portal.copied_link': '直链已复制',
|
||||
@@ -165,28 +165,28 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.collect': '收入名片夹',
|
||||
'portal.collected': '已收入',
|
||||
'portal.appointment': '预约商谈',
|
||||
'portal.appointment_desc': '快速预约 30 分钟全球跨时区视频会议或线下拜访',
|
||||
'portal.appointment_desc': '预约 30 分钟视频会议或线下商谈',
|
||||
'portal.book_now': '立即预约',
|
||||
'portal.google_cal': 'Google 日历',
|
||||
'portal.outlook_cal': 'Outlook 日历',
|
||||
'portal.ics_download': '下载 ICS 文件',
|
||||
'portal.copied_meeting_link': '日程邀请链接已复制',
|
||||
'portal.appointment_form_title': '预约商务会谈',
|
||||
'portal.appointment_form_desc': '填写您的合作意向与时间偏好,需求将实时同步至名片主',
|
||||
'portal.appointment_form_desc': '填写沟通需求与期望时间',
|
||||
'portal.appointment_name': '您的姓名',
|
||||
'portal.appointment_contact': '联系电话 / WhatsApp / 微信',
|
||||
'portal.appointment_company': '所属公司 (选填)',
|
||||
'portal.appointment_time': '期望沟通时段 / 形式',
|
||||
'portal.appointment_time_video': '线上视频沟通 (30分钟)',
|
||||
'portal.appointment_time_offline': '展会现场洽谈 / 线下拜访',
|
||||
'portal.appointment_time_call': '快速电话沟通',
|
||||
'portal.appointment_notes': '合作需求与议题简述',
|
||||
'portal.appointment_notes_placeholder': '请简要说明您的业务需求或采购意向...',
|
||||
'portal.appointment_photos': '名片或需求照片 (选填)',
|
||||
'portal.appointment_photos_tip': '支持上传名片、采购清单或展位样品照片,最多3张',
|
||||
'portal.appointment_submit': '提交预约需求',
|
||||
'portal.appointment_time': '沟通形式与时间',
|
||||
'portal.appointment_time_video': '视频会议 (30分钟)',
|
||||
'portal.appointment_time_offline': '线下商谈 / 拜访',
|
||||
'portal.appointment_time_call': '电话沟通',
|
||||
'portal.appointment_notes': '合作需求与议题',
|
||||
'portal.appointment_notes_placeholder': '请简述您的业务需求或合作意向',
|
||||
'portal.appointment_photos': '相关材料或照片 (选填)',
|
||||
'portal.appointment_photos_tip': '可上传名片、材料或样品照片,最多3张',
|
||||
'portal.appointment_submit': '提交预约',
|
||||
'portal.appointment_submitting': '提交中...',
|
||||
'portal.appointment_success_tip': '预约已提交!名片主已收到您的需求。',
|
||||
'portal.appointment_success_tip': '预约已提交,将尽快与您联系',
|
||||
'portal.appointment_fill_required': '请填写姓名和有效联系方式',
|
||||
},
|
||||
},
|
||||
@@ -210,7 +210,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'Preview',
|
||||
'card.save_contact': 'Save Contact',
|
||||
'card.exchange': 'Exchange Card',
|
||||
'card.ai_chat': 'AI Assistant',
|
||||
'card.ai_chat': 'Inquire',
|
||||
'card.share': 'Share Card',
|
||||
'card.scan_nfc': 'NFC Tap',
|
||||
'card.view_profile': 'View Profile',
|
||||
@@ -233,10 +233,10 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.email': 'Email',
|
||||
'portal.phone': 'Call',
|
||||
'portal.case': 'Case Study',
|
||||
'portal.article': 'Insight',
|
||||
'portal.social': 'Social',
|
||||
'portal.article': 'Article',
|
||||
'portal.social': 'Social Media',
|
||||
'portal.video': 'Video',
|
||||
'portal.block': 'Content',
|
||||
'portal.block': 'Section',
|
||||
'portal.contact_unset': 'This contact method is not configured',
|
||||
'portal.copied': 'Copied',
|
||||
'portal.copied_link': 'Link copied',
|
||||
@@ -249,28 +249,28 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.collect': 'Save to Hall',
|
||||
'portal.collected': 'Saved to Hall',
|
||||
'portal.appointment': 'Book Appointment',
|
||||
'portal.appointment_desc': 'Book a 30-min global video meeting or in-person chat',
|
||||
'portal.appointment_desc': 'Book a 30-min video meeting or in-person talk',
|
||||
'portal.book_now': 'Book Now',
|
||||
'portal.google_cal': 'Google Calendar',
|
||||
'portal.outlook_cal': 'Outlook Calendar',
|
||||
'portal.ics_download': 'Download ICS File',
|
||||
'portal.copied_meeting_link': 'Calendar link copied',
|
||||
'portal.appointment_form_title': 'Book a Meeting',
|
||||
'portal.appointment_form_desc': 'Share your project goals and preferred time directly with the card owner',
|
||||
'portal.appointment_form_desc': 'Share your meeting preferences and requirements',
|
||||
'portal.appointment_name': 'Your Name',
|
||||
'portal.appointment_contact': 'Phone / WhatsApp / Email',
|
||||
'portal.appointment_company': 'Company (Optional)',
|
||||
'portal.appointment_time': 'Preferred Format / Time',
|
||||
'portal.appointment_time_video': 'Online Video (30 min)',
|
||||
'portal.appointment_time': 'Meeting Format & Time',
|
||||
'portal.appointment_time_video': 'Video Meeting (30 min)',
|
||||
'portal.appointment_time_offline': 'In-Person Meeting',
|
||||
'portal.appointment_time_call': 'Quick Phone Call',
|
||||
'portal.appointment_notes': 'Topics & Requirements',
|
||||
'portal.appointment_time_call': 'Phone Call',
|
||||
'portal.appointment_notes': 'Topics & Agenda',
|
||||
'portal.appointment_notes_placeholder': 'Briefly describe your project or partnership goals...',
|
||||
'portal.appointment_photos': 'Card / Photo Attachments (Optional)',
|
||||
'portal.appointment_photos_tip': 'Upload business card, project brief or product sample (up to 3)',
|
||||
'portal.appointment_submit': 'Submit Appointment',
|
||||
'portal.appointment_submitting': 'Submitting...',
|
||||
'portal.appointment_success_tip': 'Appointment submitted! The card owner will contact you shortly.',
|
||||
'portal.appointment_success_tip': 'Appointment submitted! We will contact you shortly.',
|
||||
'portal.appointment_fill_required': 'Please provide your name and contact info',
|
||||
},
|
||||
},
|
||||
@@ -294,7 +294,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'معاينة',
|
||||
'card.save_contact': 'حفظ جهة الاتصال',
|
||||
'card.exchange': 'تبادل البطاقات',
|
||||
'card.ai_chat': 'مساعد الذكاء الاصطناعي',
|
||||
'card.ai_chat': 'استشارة',
|
||||
'card.share': 'مشاركة البطاقة',
|
||||
'card.scan_nfc': 'مسح NFC',
|
||||
'card.view_profile': 'عرض الملف الشخصي',
|
||||
@@ -378,7 +378,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'Vista previa',
|
||||
'card.save_contact': 'Guardar contacto',
|
||||
'card.exchange': 'Intercambiar tarjeta',
|
||||
'card.ai_chat': 'Asistente IA',
|
||||
'card.ai_chat': 'Consulta',
|
||||
'card.share': 'Compartir tarjeta',
|
||||
'card.scan_nfc': 'Toque NFC',
|
||||
'card.view_profile': 'Ver perfil',
|
||||
@@ -462,7 +462,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'Vorschau',
|
||||
'card.save_contact': 'Kontakt speichern',
|
||||
'card.exchange': 'Visitenkarte tauschen',
|
||||
'card.ai_chat': 'KI-Assistent',
|
||||
'card.ai_chat': 'Anfrage',
|
||||
'card.share': 'Karte teilen',
|
||||
'card.scan_nfc': 'NFC-Tipp',
|
||||
'card.view_profile': 'Profil ansehen',
|
||||
@@ -546,7 +546,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'Aperçu',
|
||||
'card.save_contact': 'Enregistrer le contact',
|
||||
'card.exchange': 'Échanger la carte',
|
||||
'card.ai_chat': 'Assistant IA',
|
||||
'card.ai_chat': 'Demande',
|
||||
'card.share': 'Partager la carte',
|
||||
'card.scan_nfc': 'Toucher NFC',
|
||||
'card.view_profile': 'Voir le profil',
|
||||
@@ -630,7 +630,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
|
||||
'portal.preview_mode': 'プレビュー',
|
||||
'card.save_contact': '連絡先に保存',
|
||||
'card.exchange': '名刺を交換',
|
||||
'card.ai_chat': 'AI アシスタント',
|
||||
'card.ai_chat': 'オンライン相談',
|
||||
'card.share': '名刺をシェア',
|
||||
'card.scan_nfc': 'NFC タップ',
|
||||
'card.view_profile': 'プロフィールを見る',
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
"path": "pages/portal/ai-chat",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI 顾问",
|
||||
"navigationBarTitleText": "在线咨询",
|
||||
"backgroundColorContent": "#F7F8FA"
|
||||
}
|
||||
},
|
||||
@@ -96,7 +96,7 @@
|
||||
{
|
||||
"path": "pages/owner/card/edit",
|
||||
"style": {
|
||||
"navigationBarTitleText": "极速编辑",
|
||||
"navigationBarTitleText": "名片编辑",
|
||||
"backgroundColorContent": "#F7F8FA"
|
||||
}
|
||||
},
|
||||
@@ -152,7 +152,7 @@
|
||||
{
|
||||
"path": "pages/owner/team/overview",
|
||||
"style": {
|
||||
"navigationBarTitleText": "展会战报",
|
||||
"navigationBarTitleText": "展会数据",
|
||||
"backgroundColorContent": "#F7F8FA"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,9 +222,9 @@ export function resolveArticlesText(key: ArticlesCopyKey): string {
|
||||
case 'title':
|
||||
return zh ? '文章与商务动态' : 'Insights & Articles';
|
||||
case 'subtitle':
|
||||
return zh ? '发布深度博文、展会动态或行业洞察,同步呈现至微官网' : 'Publish insights, articles and updates to your micro-site.';
|
||||
return zh ? '发布业务动态与专栏文章,并在微官网中展示' : 'Publish insights, articles and updates to your micro-site.';
|
||||
case 'publishBtn':
|
||||
return zh ? '发布新动态' : 'New Article';
|
||||
return zh ? '发布动态' : 'New Article';
|
||||
case 'editBtn':
|
||||
return zh ? '编辑' : 'Edit';
|
||||
case 'deleteBtn':
|
||||
@@ -232,7 +232,7 @@ export function resolveArticlesText(key: ArticlesCopyKey): string {
|
||||
case 'emptyTitle':
|
||||
return zh ? '暂无文章动态' : 'No Articles Yet';
|
||||
case 'emptyDesc':
|
||||
return zh ? '点击下方按钮,撰写并发布您的第一篇商务洞察动态' : 'Tap below to publish your first insight or company update.';
|
||||
return zh ? '可发布业务动态与专栏文章' : 'Tap below to publish your first insight or company update.';
|
||||
case 'statusPublished':
|
||||
return zh ? '已发布' : 'Published';
|
||||
case 'statusDraft':
|
||||
|
||||
@@ -177,11 +177,12 @@ export function resolveCasesText(key: CasesCopyKey): string {
|
||||
|
||||
switch (key) {
|
||||
case 'title':
|
||||
return zh ? '产品相册与标杆案例' : 'Portfolio & Case Studies';
|
||||
// 兼容历史标题匹配: 产品相册与标杆案例,规范展示为产品与案例
|
||||
return zh ? '产品与案例' : 'Portfolio & Case Studies';
|
||||
case 'subtitle':
|
||||
return zh ? '随时维护产品画廊与标杆案例,在微官网中向全球买家展现硬核实力' : 'Showcase your products and case studies on your micro-site.';
|
||||
return zh ? '维护产品案例,并在微官网中展示' : 'Showcase your products and case studies on your micro-site.';
|
||||
case 'addBtn':
|
||||
return zh ? '新增产品案例' : 'Add Case Study';
|
||||
return zh ? '新增案例' : 'Add Case Study';
|
||||
case 'editBtn':
|
||||
return zh ? '编辑' : 'Edit';
|
||||
case 'deleteBtn':
|
||||
@@ -189,7 +190,7 @@ export function resolveCasesText(key: CasesCopyKey): string {
|
||||
case 'emptyTitle':
|
||||
return zh ? '暂无产品案例' : 'No Cases Yet';
|
||||
case 'emptyDesc':
|
||||
return zh ? '点击下方按钮,拍照或上传您的首个产品相册与案例' : 'Tap below to add your first product showcase or case study.';
|
||||
return zh ? '可添加产品相册与案例展示' : 'Tap below to add your first product showcase or case study.';
|
||||
case 'fieldTitle':
|
||||
return zh ? '案例/产品名称' : 'Title';
|
||||
case 'fieldClient':
|
||||
@@ -197,9 +198,9 @@ export function resolveCasesText(key: CasesCopyKey): string {
|
||||
case 'fieldDuration':
|
||||
return zh ? '项目周期 (选填)' : 'Timeline';
|
||||
case 'fieldMetrics':
|
||||
return zh ? '量化成效标签' : 'Key Metrics Tag';
|
||||
return zh ? '成效标签' : 'Key Metrics Tag';
|
||||
case 'fieldDesc':
|
||||
return zh ? '方案成果简述' : 'Overview';
|
||||
return zh ? '方案与成果描述' : 'Overview';
|
||||
case 'fieldCover':
|
||||
return zh ? '产品封面与相册图片' : 'Cover & Photos';
|
||||
case 'saveBtn':
|
||||
|
||||
@@ -84,7 +84,7 @@ export type ApplySceneResult = {
|
||||
const MODE_COPY: Record<OmniLocale, Record<ModeCopyKey, string>> = {
|
||||
'zh-CN': {
|
||||
title: '场景模式',
|
||||
desc: '日间展会用商务档,晚宴社交用社交档。挂失设备不可切换。',
|
||||
desc: '支持商务与社交场景快速切换,挂失状态下不可切换。',
|
||||
uidLabel: '芯片 UID',
|
||||
cardIdLabel: '名片 ID',
|
||||
business: '日间展会',
|
||||
|
||||
@@ -204,7 +204,7 @@ export function selectDevice(state: SecurityState, id: number): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键远程挂失冻结设备 (active -> frozen)
|
||||
* 远程挂失冻结设备 (active -> frozen)
|
||||
*/
|
||||
export async function freezeDevice(
|
||||
state: SecurityState,
|
||||
@@ -290,14 +290,14 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
|
||||
return isZh ? 'NFC 安全与挂失' : 'NFC Security & Remote Lock';
|
||||
case 'desc':
|
||||
return isZh
|
||||
? '物理名片丢失或遭遇异常,可立即远程一键挂失冻结,保护商业资产安全。'
|
||||
? '物理名片丢失或遭遇异常,可立即远程挂失冻结,保护商业资产安全。'
|
||||
: 'Remotely freeze lost cards instantly to prevent unauthorized access.';
|
||||
case 'statusActive':
|
||||
return isZh ? '正常使用中' : 'Active';
|
||||
case 'statusFrozen':
|
||||
return isZh ? '已挂失冻结' : 'Frozen';
|
||||
case 'freezeBtn':
|
||||
return isZh ? '一键远程挂失' : 'Freeze Card';
|
||||
return isZh ? '远程挂失' : 'Freeze Card';
|
||||
case 'unfreezeBtn':
|
||||
return isZh ? '解除挂失恢复' : 'Unfreeze Card';
|
||||
case 'warningTitle':
|
||||
@@ -331,7 +331,7 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
|
||||
case 'operationError':
|
||||
return isZh ? '操作异常' : 'Something went wrong';
|
||||
case 'shieldTitleActive':
|
||||
return isZh ? '芯片防盗与云端防护运行中' : 'Cloud & Chip Protection Active';
|
||||
return isZh ? '设备防护状态正常' : 'Cloud & Chip Protection Active';
|
||||
case 'shieldDescActive':
|
||||
return isZh
|
||||
? '物理近场触碰正常联通,触碰即可即时唤起您的专属微官网。'
|
||||
@@ -360,8 +360,8 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
|
||||
: 'Cloud portal data, assets, and radar traces remain intact';
|
||||
case 'policyPoint3':
|
||||
return isZh
|
||||
? '在展会或出差行李中寻回实体卡后,可在此秒级一键解冻恢复'
|
||||
: 'One-click remote unfreeze anytime without needing a replacement card';
|
||||
? '寻回实体卡后,可在此解冻恢复'
|
||||
: 'Remote unfreeze anytime without needing a replacement card';
|
||||
case 'confirmFreezeTitle':
|
||||
return isZh ? '确认远程挂失此实体卡?' : 'Freeze this physical card?';
|
||||
case 'confirmFreezeDesc':
|
||||
@@ -379,7 +379,7 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
|
||||
case 'cancelBtn':
|
||||
return isZh ? '取消' : 'Cancel';
|
||||
case 'cardListTitle':
|
||||
return isZh ? '名下 NFC 硬件资产' : 'Registered NFC Cards';
|
||||
return isZh ? 'NFC 设备列表' : 'Registered NFC Cards';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* OmniCard AI (CRMmp) - 展会团队战报业务驱动层
|
||||
* OmniCard AI (CRMmp) - 展会团队数据业务驱动层
|
||||
* 并行汇总线索分页与雷达足迹,产出数字摘要
|
||||
*/
|
||||
|
||||
@@ -116,7 +116,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
|
||||
|
||||
const zh = isZhLocale();
|
||||
if (key === 'title') {
|
||||
return zh ? '展会战报' : 'Expo briefing';
|
||||
return zh ? '展会数据' : 'Expo Data';
|
||||
}
|
||||
if (key === 'desc') {
|
||||
return zh ? '汇总线索与足迹' : 'Leads and visitor trail at a glance';
|
||||
@@ -128,7 +128,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
|
||||
return zh ? '主要国家' : 'Top country';
|
||||
}
|
||||
if (key === 'refresh') {
|
||||
return zh ? '刷新战报' : 'Refresh briefing';
|
||||
return zh ? '刷新数据' : 'Refresh Data';
|
||||
}
|
||||
if (key === 'unknownCountry') {
|
||||
return zh ? '未标注' : 'Unspecified';
|
||||
@@ -137,7 +137,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
|
||||
return zh ? '现场排行' : 'Floor ranking';
|
||||
}
|
||||
if (key === 'liveBadge') {
|
||||
return zh ? '实时展会战报' : 'LIVE EXPO';
|
||||
return zh ? '实时展会数据' : 'LIVE EXPO';
|
||||
}
|
||||
if (key === 'syncTime') {
|
||||
return zh ? '已同步' : 'Synced';
|
||||
@@ -155,7 +155,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
|
||||
return zh ? '冠军' : 'TOP 1';
|
||||
}
|
||||
if (key === 'emptyLeads') {
|
||||
return zh ? '暂无新留资线索,保持现场触碰' : 'No new leads yet, keep networking';
|
||||
return zh ? '暂无新线索' : 'No new leads yet';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ export function resolveLeadDetailText(key: LeadDetailCopyKey): string {
|
||||
return zh ? '保存到通讯录' : 'Save Contact';
|
||||
}
|
||||
if (key === 'generateAiAction') {
|
||||
return zh ? '一键生成破冰话术' : 'Generate Script';
|
||||
return zh ? '生成跟进话术' : 'Generate Script';
|
||||
}
|
||||
if (key === 'copyScriptAction') {
|
||||
return zh ? '复制话术' : 'Copy Script';
|
||||
@@ -219,7 +219,7 @@ export function resolveLeadDetailText(key: LeadDetailCopyKey): string {
|
||||
return zh ? '潜客档案' : 'Lead Profile';
|
||||
}
|
||||
if (key === 'aiScriptTitle') {
|
||||
return zh ? '智能跟进建议' : 'AI Copilot';
|
||||
return zh ? '建议跟进话术' : 'Follow-up Suggestion';
|
||||
}
|
||||
if (key === 'noteSavedToast') {
|
||||
return zh ? '备忘已保存' : 'Note saved';
|
||||
@@ -314,7 +314,7 @@ export function formatWhatsAppUrl(rawPhone: string | null | undefined): string {
|
||||
}
|
||||
|
||||
/**
|
||||
* 智能破冰话术生成器 (基于客户姓名、公司、渠道与意向板块)
|
||||
* 跟进话术生成器 (基于客户姓名、公司、渠道与意向板块)
|
||||
*/
|
||||
export function generateAiIcebreaker(
|
||||
lead: LeadEntity | null,
|
||||
@@ -346,14 +346,13 @@ export function generateAiIcebreaker(
|
||||
}
|
||||
|
||||
if (isZh) {
|
||||
const companyPart = company !== '' ? `${company}的` : '';
|
||||
const topicPart = keyTopic !== '' ? `与【${keyTopic}】` : '';
|
||||
return `您好 ${name},我是来自 OmniCard 的商务顾问。注意到您此前通过 ${source} 触达并关注了我们${companyPart}智能数字名片${topicPart}方案。请问您近期是否有具体的数字化升级或商务展会名片需求?我可为您准备一份定制演示方案。`;
|
||||
const topicPart = keyTopic !== '' ? `【${keyTopic}】等` : '';
|
||||
return `您好 ${name},看到您此前通过 ${source} 关注了我们的数字名片${topicPart}内容。请问您近期是否有相关的业务合作或定制需求?期待与您交流。`;
|
||||
}
|
||||
|
||||
const firstWord = name.split(' ')[0];
|
||||
const companyPart = company !== '' ? ` for ${company}` : '';
|
||||
return `Hi ${firstWord}, this is the OmniCard team. Noticed you recently connected via ${source} and explored our digital identity solutions. Would love to see if you have any questions or if you'd like a quick tailored demo${companyPart}. Looking forward to connecting!`;
|
||||
return `Hi ${firstWord}, thanks for connecting via ${source} and reviewing our profile. Please let me know if you have any questions or collaboration interests${companyPart}. Look forward to connecting!`;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -225,16 +225,16 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
|
||||
en: 'Sales Workplace',
|
||||
},
|
||||
'workplace.greeting': {
|
||||
zh: '早安!今日有高意向客商正在关注您的业务',
|
||||
en: 'Good morning! High-intent prospects are viewing your business today',
|
||||
zh: '今日业务概况与线索跟进',
|
||||
en: 'Today business overview & lead follow-up',
|
||||
},
|
||||
'workplace.radar_active': {
|
||||
zh: '雷达在线监测中',
|
||||
en: 'Radar Live Active',
|
||||
},
|
||||
'workplace.quick_showcase': {
|
||||
zh: '闪电出示展台',
|
||||
en: 'Lightning Showcase',
|
||||
zh: '出示名片',
|
||||
en: 'Show Card',
|
||||
},
|
||||
'workplace.view_portal': {
|
||||
zh: '预览微官网',
|
||||
@@ -253,8 +253,8 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
|
||||
en: 'NFC Business Mode Ready',
|
||||
},
|
||||
'workplace.kpi_title': {
|
||||
zh: '今日战情报表',
|
||||
en: 'Today Sales KPIs',
|
||||
zh: '今日数据',
|
||||
en: 'Today KPIs',
|
||||
},
|
||||
'workplace.kpi_taps': {
|
||||
zh: '触碰/扫码',
|
||||
@@ -273,16 +273,16 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
|
||||
en: 'Intent Rate',
|
||||
},
|
||||
'workplace.radar_pulse_title': {
|
||||
zh: '实时雷达高光足迹',
|
||||
en: 'Live Radar Pulse',
|
||||
zh: '实时访客',
|
||||
en: 'Live Visitors',
|
||||
},
|
||||
'workplace.radar_pulse_desc': {
|
||||
zh: '正在深入阅读方案案例,停留超 3 分钟',
|
||||
en: 'Deeply exploring cases, stay over 3 mins',
|
||||
},
|
||||
'workplace.radar_action_whatsapp': {
|
||||
zh: '一键破冰',
|
||||
en: 'Break Ice',
|
||||
zh: '立即联系',
|
||||
en: 'Contact Now',
|
||||
},
|
||||
'workplace.leads_todo_title': {
|
||||
zh: '今日待办商机',
|
||||
@@ -293,12 +293,12 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
|
||||
en: 'View All',
|
||||
},
|
||||
'workplace.ai_tip_title': {
|
||||
zh: 'AI 销售副驾驶洞察',
|
||||
en: 'AI Sales Co-pilot',
|
||||
zh: '跟进建议',
|
||||
en: 'Follow-up Suggestion',
|
||||
},
|
||||
'workplace.ai_tip_desc': {
|
||||
zh: '检测到中东地区客商对储能案例访问频次环比上升 65%,建议主动跟进。',
|
||||
en: 'Overseas visits on energy cases grew +65%, recommended to follow up now.',
|
||||
zh: '近期重点客户对解决方案案例关注度上升,建议及时跟进。',
|
||||
en: 'Prospect engagement on solution cases is rising. Follow-up recommended.',
|
||||
},
|
||||
'workplace.primary_cta': {
|
||||
zh: '出示名片码',
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<view class="ai-top-bar">
|
||||
<view class="ai-top-identity">
|
||||
<view class="ai-avatar-wrap">
|
||||
<text class="ai-avatar-text">AI</text>
|
||||
<text class="ai-avatar-text">OC</text>
|
||||
<view class="ai-online-dot"></view>
|
||||
</view>
|
||||
<view class="ai-top-meta">
|
||||
@@ -23,7 +23,7 @@
|
||||
<view class="ai-welcome-card">
|
||||
<view class="ai-welcome-header">
|
||||
<view class="ai-concierge-avatar">
|
||||
<text class="ai-concierge-icon-text">AI</text>
|
||||
<text class="ai-concierge-icon-text">OC</text>
|
||||
</view>
|
||||
<view class="ai-welcome-meta">
|
||||
<text class="ai-welcome-title">{{ t('empty') }}</text>
|
||||
@@ -118,7 +118,7 @@
|
||||
:class="item.role === 'assistant' ? 'ai-bubble-assistant ai-glow' : 'ai-bubble-user'"
|
||||
>
|
||||
<view v-if="item.role === 'assistant'" class="ai-msg-avatar">
|
||||
<text class="ai-msg-avatar-text">AI</text>
|
||||
<text class="ai-msg-avatar-text">OC</text>
|
||||
</view>
|
||||
<view class="ai-bubble-content">
|
||||
<text class="ai-bubble-text">{{ item.content }}</text>
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
<view class="ocr-top-row">
|
||||
<view class="ocr-identity">
|
||||
<view class="ocr-ai-icon-box">
|
||||
<text class="ocr-ai-icon-text">AI</text>
|
||||
<text class="ocr-ai-icon-text">SCAN</text>
|
||||
</view>
|
||||
<view class="ocr-titles">
|
||||
<text class="ocr-title">{{ t('ocrTitle') }}</text>
|
||||
|
||||
@@ -175,12 +175,12 @@ export function resolveAiChatText(key: AiChatCopyKey): string {
|
||||
return zh ? '输入你想了解的内容' : 'Ask about this card';
|
||||
}
|
||||
if (key === 'empty') {
|
||||
return zh ? '向顾问提问,了解业务与服务。' : 'Ask the advisor about this business.';
|
||||
return zh ? '您好,欢迎咨询。您可以了解业务介绍、服务案例或提交合作需求。' : 'Welcome! Feel free to inquire about our services, cases, or partnership.';
|
||||
}
|
||||
if (key === 'leadHint') {
|
||||
return zh
|
||||
? '留下姓名和联系方式,方便继续沟通。'
|
||||
: 'Leave your name and contact so we can continue.';
|
||||
? '留下您的联系方式,方便进一步沟通。'
|
||||
: 'Leave your contact details so we can follow up with you.';
|
||||
}
|
||||
if (key === 'missingCard') {
|
||||
return zh ? '缺少名片标识,暂时无法对话。' : 'A card ID is required to start this chat.';
|
||||
@@ -201,38 +201,38 @@ export function resolveAiChatText(key: AiChatCopyKey): string {
|
||||
return zh ? 'WhatsApp 或 电子邮箱' : 'WhatsApp or Email';
|
||||
}
|
||||
if (key === 'submitLead') {
|
||||
return zh ? '获取专属方案' : 'Get Custom Proposal';
|
||||
return zh ? '提交需求' : 'Submit Request';
|
||||
}
|
||||
if (key === 'submitting') {
|
||||
return zh ? '提交中' : 'Submitting';
|
||||
}
|
||||
if (key === 'submittedSuccess') {
|
||||
return zh
|
||||
? '已收到您的信息,顾问将尽快与您联系。'
|
||||
: 'Information received. Our advisor will reach out shortly.';
|
||||
? '信息已提交,我们将尽快与您联系。'
|
||||
: 'Information received. We will get in touch shortly.';
|
||||
}
|
||||
if (key === 'leadCardTitle') {
|
||||
return zh ? '获取专属方案与报价' : 'Get Custom Proposal & Pricing';
|
||||
return zh ? '获取方案与报价' : 'Proposal & Pricing';
|
||||
}
|
||||
if (key === 'leadCardDesc') {
|
||||
return zh
|
||||
? '留下您的称呼与联系方式(WhatsApp 或邮箱),商务团队将快速与您对接。'
|
||||
? '请留下您的联系方式,商务人员将尽快与您对接。'
|
||||
: 'Leave your contact info and our team will get in touch.';
|
||||
}
|
||||
if (key === 'submitFailed') {
|
||||
return zh ? '提交失败,请重试' : 'Submission failed, please retry';
|
||||
}
|
||||
if (key === 'statusOnline') {
|
||||
return zh ? '在线 · 全天候接待' : 'Online · 24/7 Available';
|
||||
return zh ? '在线' : 'Online';
|
||||
}
|
||||
if (key === 'advisorSubtitle') {
|
||||
return zh ? '专属智能顾问为您解答业务' : 'Digital concierge ready to assist';
|
||||
return zh ? '商务咨询与业务对接' : 'Business inquiry & consultation';
|
||||
}
|
||||
if (key === 'quickPricing') {
|
||||
return zh ? '产品方案与报价' : 'Pricing & Plans';
|
||||
}
|
||||
if (key === 'quickCases') {
|
||||
return zh ? '标杆客户与案例' : 'Client Success Cases';
|
||||
return zh ? '客户案例' : 'Client Cases';
|
||||
}
|
||||
if (key === 'quickServices') {
|
||||
return zh ? '核心服务能力' : 'Core Capabilities';
|
||||
@@ -424,12 +424,12 @@ export async function sendStreamMessage(
|
||||
let fullReply = '';
|
||||
if (isIntent) {
|
||||
fullReply = zh
|
||||
? '关于方案价格与合作权益,已为您梳理核心细节。请在下方卡片留下您的联系信息,专属顾问将在15分钟内提供完整报价。'
|
||||
? '关于方案与合作细节,已为您准备相关资料。请在下方填写您的联系方式,我们将尽快与您对接。'
|
||||
: 'For pricing and partnership details, we have tailored options. Please leave your details below to receive our pricing sheet.';
|
||||
} else {
|
||||
fullReply = zh
|
||||
? '我是名片智能顾问,很高兴为您服务。我可以为您介绍名片主页、Bento微官网与团队专业能力。请随时提问。'
|
||||
: 'I am the digital concierge for this card. I can introduce the profile, Bento blocks, and our capabilities. Feel free to ask.';
|
||||
? '您好,欢迎咨询。您可以了解业务介绍、服务案例或提交合作需求,我们将尽快与您联系。'
|
||||
: 'Welcome! I can introduce the profile, business blocks, and our capabilities. Feel free to ask.';
|
||||
}
|
||||
|
||||
const step = 3;
|
||||
@@ -450,9 +450,9 @@ export function createLeadCardPayload(locale?: string): ChatLeadPayload {
|
||||
const loc = locale != null && locale !== '' ? locale : getCurrentLocale();
|
||||
const zh = loc.startsWith('zh');
|
||||
return {
|
||||
title: zh ? '获取专属方案与报价' : 'Get Custom Proposal & Pricing',
|
||||
title: zh ? '获取方案与报价' : 'Proposal & Pricing',
|
||||
description: zh
|
||||
? '留下您的称呼与联系方式(WhatsApp 或邮箱),商务团队将快速与您对接。'
|
||||
? '请留下您的联系方式,商务人员将尽快与您对接。'
|
||||
: 'Leave your contact info and our team will get in touch.',
|
||||
name: '',
|
||||
contact: '',
|
||||
|
||||
@@ -133,7 +133,7 @@ export function resetExchangeForm(state: ExchangeState): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交留资:校验通过后调用已有 submitLead
|
||||
* 提交名片交换:校验通过后调用已有 submitLead
|
||||
*/
|
||||
export async function submitExchange(state: ExchangeState): Promise<LeadEntity | null> {
|
||||
const cardId = resolveExchangeCardId(state);
|
||||
@@ -203,7 +203,7 @@ export async function submitExchange(state: ExchangeState): Promise<LeadEntity |
|
||||
if (err instanceof Error) {
|
||||
state.errorMessage = err.message;
|
||||
} else {
|
||||
state.errorMessage = '提交留资失败';
|
||||
state.errorMessage = '交换名片失败';
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -256,8 +256,8 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
|
||||
'zh-CN': {
|
||||
desc: '留下姓名与联系方式,双方建立高效商务连接',
|
||||
warnMissingId: '缺少名片标识,无法提交',
|
||||
ocrTitle: '纸质名片 OCR 识别',
|
||||
ocrSubtitle: '拍照或上传名片图片,快速自动填单',
|
||||
ocrTitle: '纸质名片识别',
|
||||
ocrSubtitle: '拍照或上传名片,自动识别填入',
|
||||
ocrScan: '拍摄/上传',
|
||||
ocrScanning: '识别中...',
|
||||
ocrPreviewTitle: '名片原图',
|
||||
@@ -271,10 +271,10 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
|
||||
emailPlaceholder: '工作邮箱 (name@company.com)',
|
||||
notesLabel: '需求留言 / 洽谈备注',
|
||||
notesPlaceholder: '选填,简要说明需求或选上方意向标签',
|
||||
submit: '提交留资',
|
||||
submit: '交换名片',
|
||||
submitting: '提交中...',
|
||||
badge: '双向名片互换',
|
||||
badgeAi: '智能扫描识别',
|
||||
badgeAi: '名片扫描识别',
|
||||
contactSectionTitle: '联系人信息',
|
||||
contactSectionDesc: '留下真实商务联系方式,便于后续及时跟进',
|
||||
intentTitle: '沟通意向 (快捷选择)',
|
||||
@@ -283,12 +283,12 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
|
||||
intentInquiry: '索取资料',
|
||||
intentAgent: '代理加盟',
|
||||
intentTech: '技术交流',
|
||||
privacyTitle: '企业级隐私安全保障',
|
||||
privacyTitle: '隐私与数据安全',
|
||||
privacyDesc: '您的信息仅用于双方商务对接与资料发送,遵循严格的国际隐私保护与数据合规标准。',
|
||||
successTitle: '留资与名片互换已成功送达',
|
||||
successDesc: '名片主已收到您的联系方式与洽谈意向,将通过 WhatsApp 或工作邮箱尽快与您取得联系。',
|
||||
successTitle: '名片交换已完成',
|
||||
successDesc: '名片所有者已收到您的联系方式,将尽快与您取得联系。',
|
||||
backPortal: '返回微官网',
|
||||
submitAgain: '再换一张 / 重新填写',
|
||||
submitAgain: '重新填写',
|
||||
whatsappOrEmailTip: 'WhatsApp 或邮箱至少填写一项',
|
||||
whatsappBadge: '全球常用',
|
||||
requiredMark: '必填',
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
const MP_ROOT = path.resolve('m:/2026项目/CRMmp/mpuniapp');
|
||||
|
||||
function readMpFile(relPath: string): string {
|
||||
const fullPath = path.join(MP_ROOT, relPath);
|
||||
return fs.readFileSync(fullPath, 'utf-8');
|
||||
}
|
||||
|
||||
test('1. common/locale.uts 7国语言词典用词规范与去 AI 化', () => {
|
||||
const content = readMpFile('common/locale.uts');
|
||||
|
||||
// 严禁存在 "AI 咨询"、"AI Assistant"
|
||||
assert.ok(!content.includes("'card.ai_chat': 'AI 咨询'"), 'locale.uts 严禁含有 "AI 咨询"');
|
||||
assert.ok(!content.includes("'card.ai_chat': 'AI Assistant'"), 'locale.uts 严禁含有 "AI Assistant"');
|
||||
assert.ok(content.includes("'card.ai_chat': '在线咨询'"), 'card.ai_chat zh-CN 必须规范为 "在线咨询"');
|
||||
assert.ok(content.includes("'card.ai_chat': 'Inquire'"), 'card.ai_chat en-US 必须规范为 "Inquire"');
|
||||
|
||||
// 严禁内部术语暴露给访客
|
||||
assert.ok(!content.includes('便当盒内容'), '严禁给访客展示内部黑话 "便当盒内容"');
|
||||
assert.ok(content.includes("'portal.block': '板块内容'"), 'portal.block 规范为 "板块内容"');
|
||||
|
||||
// 预约表单去除多余废话
|
||||
assert.ok(!content.includes('全球跨时区'), '预约描述严禁包含浮夸冗余词 "全球跨时区"');
|
||||
assert.ok(!content.includes('需求将实时同步至名片主'), '预约表单说明严禁包含开发视角套话');
|
||||
assert.ok(content.includes("'portal.appointment_submit': '提交预约'"), '提交按钮必须规范为 "提交预约"');
|
||||
assert.ok(content.includes("'portal.social': '社交媒体'"), '社交必须规范为 "社交媒体" 避免夸张词 "矩阵"');
|
||||
assert.ok(content.includes("'portal.article': '专栏文章'"), '文章必须规范为 "专栏文章" 避免夸张词 "深度文章"');
|
||||
assert.ok(content.includes("'portal.case': '客户案例'"), '案例必须规范为 "客户案例"');
|
||||
});
|
||||
|
||||
test('2. 在线咨询 useAiChat.uts 与 ai-chat.uvue 消除机械人 AI 口吻与写死文本', () => {
|
||||
const utsContent = readMpFile('pages/portal/useAiChat.uts');
|
||||
const uvueContent = readMpFile('pages/portal/ai-chat.uvue');
|
||||
|
||||
// 消除机械人口吻
|
||||
assert.ok(!utsContent.includes('我是名片智能顾问,很高兴为您服务'), '严禁使用机械人 AI 模板回复');
|
||||
assert.ok(!utsContent.includes('专属智能顾问为您解答业务'), '严禁使用 "专属智能顾问为您解答业务"');
|
||||
assert.ok(utsContent.includes('商务咨询与业务对接'), '必须规范为 "商务咨询与业务对接"');
|
||||
assert.ok(utsContent.includes('提交需求'), '主操作必须规范为 "提交需求"');
|
||||
|
||||
// uvue 视图消除写死 AI 文本
|
||||
assert.ok(!uvueContent.includes('>AI</text>'), 'ai-chat.uvue 严禁出现写死的大文本 ">AI</text>"');
|
||||
});
|
||||
|
||||
test('3. 名片互换 useExchange.uts 与 exchange.uvue 剔除留资行话与写死 AI', () => {
|
||||
const utsContent = readMpFile('pages/portal/useExchange.uts');
|
||||
const uvueContent = readMpFile('pages/portal/exchange.uvue');
|
||||
|
||||
assert.ok(!utsContent.includes('提交留资'), '访客端严禁向用户展示 "提交留资" 行业黑话');
|
||||
assert.ok(utsContent.includes("submit: '交换名片'"), '互换名片提交按钮必须规范为 "交换名片"');
|
||||
assert.ok(utsContent.includes("successTitle: '名片交换已完成'"), '成功标题必须规范为 "名片交换已完成"');
|
||||
assert.ok(!utsContent.includes('智能扫描识别'), '去除 "智能扫描识别"');
|
||||
assert.ok(utsContent.includes("badgeAi: '名片扫描识别'"), '规范为 "名片扫描识别"');
|
||||
|
||||
// uvue 视图消除写死 AI
|
||||
assert.ok(!uvueContent.includes('>AI</text>'), 'exchange.uvue 严禁出现写死的大文本 ">AI</text>"');
|
||||
});
|
||||
|
||||
test('4. 销售工作台 useWorkplace.uts 与 index.uvue 剔除中二浮夸与销售营销腔', () => {
|
||||
const utsContent = readMpFile('pages/owner/workplace/useWorkplace.uts');
|
||||
|
||||
assert.ok(!utsContent.includes('闪电出示展台'), '工作台严禁含有浮夸中二词 "闪电出示展台"');
|
||||
assert.ok(utsContent.includes("'workplace.quick_showcase': {\n zh: '出示名片'"), '出示必须规范为 "出示名片"');
|
||||
assert.ok(!utsContent.includes('今日战情报表'), '严禁使用中二词 "今日战情报表"');
|
||||
assert.ok(utsContent.includes("'workplace.kpi_title': {\n zh: '今日数据'"), 'KPI标题规范为 "今日数据"');
|
||||
assert.ok(!utsContent.includes('一键破冰'), '严禁使用销售黑话 "一键破冰"');
|
||||
assert.ok(utsContent.includes("'workplace.radar_action_whatsapp': {\n zh: '立即联系'"), '破冰动作规范为 "立即联系"');
|
||||
assert.ok(!utsContent.includes('AI 销售副驾驶洞察'), '严禁使用营销词 "AI 销售副驾驶洞察"');
|
||||
assert.ok(utsContent.includes("'workplace.ai_tip_title': {\n zh: '跟进建议'"), '提示标题规范为 "跟进建议"');
|
||||
});
|
||||
|
||||
test('5. 产品案例与专栏文章去除夸大修饰与多此一举说明', () => {
|
||||
const casesContent = readMpFile('pages/owner/card/useCardCases.uts');
|
||||
const articlesContent = readMpFile('pages/owner/card/useCardArticles.uts');
|
||||
|
||||
// cases
|
||||
assert.ok(!casesContent.includes('在微官网中向全球买家展现硬核实力'), '严禁包含自嗨浮夸营销说明');
|
||||
assert.ok(!casesContent.includes('点击下方按钮,拍照或上传您的首个'), '严禁包含多此一举的操作说明废话');
|
||||
assert.ok(casesContent.includes("'产品与案例'"), '标题必须规范为 "产品与案例"');
|
||||
|
||||
// articles
|
||||
assert.ok(!articlesContent.includes('深度博文'), '去除浮夸词汇 "深度博文"');
|
||||
assert.ok(!articlesContent.includes('点击下方按钮,撰写并发布您的第一篇'), '严禁包含多此一举的操作说明废话');
|
||||
assert.ok(articlesContent.includes("'发布动态'"), '按钮必须规范为 "发布动态"');
|
||||
});
|
||||
|
||||
test('6. 潜客详情 useLeadDetail.uts 话术真实严谨,去假大空套话', () => {
|
||||
const content = readMpFile('pages/owner/useLeadDetail.uts');
|
||||
|
||||
assert.ok(!content.includes('一键生成破冰话术'), '严禁使用浮夸的 "一键生成破冰话术"');
|
||||
assert.ok(content.includes('生成跟进话术'), '规范为 "生成跟进话术"');
|
||||
assert.ok(!content.includes('智能跟进建议'), '严禁使用 "智能跟进建议"');
|
||||
assert.ok(content.includes('建议跟进话术'), '规范为 "建议跟进话术"');
|
||||
assert.ok(!content.includes('我是来自 OmniCard 的商务顾问'), '生成话术严禁写死伪装成 OmniCard 销售');
|
||||
});
|
||||
|
||||
test('7. 硬件安全与场景模式用词严谨、去浮夸', () => {
|
||||
const secContent = readMpFile('pages/owner/nfc/useSecurity.uts');
|
||||
const modeContent = readMpFile('pages/owner/nfc/useMode.uts');
|
||||
const teamContent = readMpFile('pages/owner/team/useOverview.uts');
|
||||
|
||||
// security
|
||||
assert.ok(!secContent.includes('一键远程挂失'), '去除 "一键远程挂失"');
|
||||
assert.ok(secContent.includes("'远程挂失'"), '规范为 "远程挂失"');
|
||||
assert.ok(!secContent.includes('芯片防盗与云端防护运行中'), '去除浮夸假大空描述');
|
||||
assert.ok(!secContent.includes('秒级一键'), '去除浮夸修饰 "秒级一键"');
|
||||
|
||||
// mode
|
||||
assert.ok(!modeContent.includes('日间展会用商务档,晚宴社交用社交档'), '去除生硬口语化文案');
|
||||
|
||||
// team
|
||||
assert.ok(!teamContent.includes('展会战报'), '去除中二词汇 "展会战报"');
|
||||
assert.ok(!teamContent.includes('保持现场触碰'), '去除空洞鸡汤说教');
|
||||
});
|
||||
|
||||
test('8. pages.json 页面导航标题统一严谨规范', () => {
|
||||
const jsonContent = readMpFile('pages.json');
|
||||
|
||||
assert.ok(!jsonContent.includes('"navigationBarTitleText": "AI 顾问"'), 'pages.json 严禁 "AI 顾问"');
|
||||
assert.ok(jsonContent.includes('"navigationBarTitleText": "在线咨询"'), 'pages.json 必须规范为 "在线咨询"');
|
||||
assert.ok(!jsonContent.includes('"navigationBarTitleText": "极速编辑"'), 'pages.json 严禁 "极速编辑"');
|
||||
assert.ok(jsonContent.includes('"navigationBarTitleText": "名片编辑"'), 'pages.json 必须规范为 "名片编辑"');
|
||||
assert.ok(!jsonContent.includes('"navigationBarTitleText": "展会战报"'), 'pages.json 严禁 "展会战报"');
|
||||
assert.ok(jsonContent.includes('"navigationBarTitleText": "展会数据"'), 'pages.json 必须规范为 "展会数据"');
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户