feat(community,faq): support dynamic community topics, notice, and FAQ center

这个提交包含在:
xcbyy
2026-10-10 10:04:49 +08:00
父节点 82ba59f373
当前提交 8845fbe7cb
共有 5 个文件被更改,包括 383 次插入 和 16 次删除

查看文件

@@ -669,12 +669,58 @@ async function seedInitialDataIfEmpty(conn: any): Promise<void> {
content: '1. 账号使用规范:用户注册与使用陪玩服务须符合国家法律法规,严禁利用平台从事涉黄、赌博、欺诈等违规行为。\n2. 资金与交易保障:平台提供全额担保交易,订单完成前款项由官方账户托管,核销确认后自动结算至大神钱包。\n3. 争议与售后:若遇服务不符或搭子违约,可随时提交争议仲裁由运营平台人工介入裁决。'
});
const communityTopicsVal = JSON.stringify([
{ id: 'top_1', name: '三里屯探店', hot: true, postsCount: 1280 },
{ id: 'top_2', name: '铜锅涮肉AA', hot: true, postsCount: 890 },
{ id: 'top_3', name: '工体纯K麦霸', hot: false, postsCount: 650 },
{ id: 'top_4', name: '国服上分车队', hot: true, postsCount: 2310 },
{ id: 'top_5', name: '望京跳海微醺', hot: false, postsCount: 420 },
{ id: 'top_6', name: '同城搭子招募', hot: true, postsCount: 3100 }
]);
const communityNoticeVal = JSON.stringify({
title: '友圈同城互动与公约置顶',
content: '欢迎来到同城搭子友圈!文明交友,发布真实组局诉求;平台全天候对动态与评论实施微信官方内容安全过滤,严禁广告引流及私下交易。',
tag: '置顶推荐',
showInBanner: true
});
const faqListVal = JSON.stringify([
{
id: 'faq_1',
category: '新手预约与组局',
question: '什么是4位纯数字核销码?',
answer: '为确保搭子碰面和订单真实履约,下单成功或报名组局后系统自动生成专属4位防伪数字码,到达公开活动现场后出示给陪伴师或房主签到核销。'
},
{
id: 'faq_2',
category: '新手预约与组局',
question: 'AA制拼桌与房主请客有什么区别?',
answer: '【AA制拼桌】由参与人员平摊费用,报名时支付人均分摊金额;【房主请客/项目制】由发起房主全额买单,且房主可随时追加赏金或提高出价。'
},
{
id: 'faq_3',
category: '资金与退款',
question: '如何申请退款与争议仲裁?',
answer: '在订单【待接单】或【待付款】状态可随时取消全额退款;在【服务中】或遇违约可在订单详情点击【发起争议仲裁】,由平台官方运营人工介入判定。'
},
{
id: 'faq_4',
category: '大神与收益',
question: '成为陪玩大神有什么资质要求?',
answer: '需在小程序个人中心提交实名认证与技能资质,通过平台运营团队人工审核后,即可解锁接单工作台与附近雷达扫单功能。'
}
]);
await conn.query(`
INSERT INTO platform_configs (config_key, name, value_json, description, status)
VALUES
('customer_service', '官方在线客服与服务热线', ?, '小程序端个人中心客服联系方式', 1),
('safety_notice', '安全履约须知与官方公告', ?, '小程序端官方指引与安全红线弹窗', 1),
('platform_protocol', '平台服务协议与合规规范', ?, '小程序端服务协议与隐私政策详情', 1);
`, [customerServiceVal, safetyNoticeVal, protocolVal]);
('platform_protocol', '平台服务协议与合规规范', ?, '小程序端服务协议与隐私政策详情', 1),
('community_topics', '友圈热门推荐话题库', ?, '友圈广场发帖推荐话题与热门标签', 1),
('community_notice', '友圈社区置顶头条公告', ?, '友圈广场顶部置顶横幅公告与社区公约', 1),
('faq_list', '帮助中心与常见问题FAQ', ?, '小程序端帮助中心常见问答与指引', 1);
`, [customerServiceVal, safetyNoticeVal, protocolVal, communityTopicsVal, communityNoticeVal, faqListVal]);
}
}

查看文件

@@ -80,4 +80,50 @@ describe('平台通用配置与合规管理 TDD 自动化测试', () => {
expect(merged.customer_service.hotline).toBe('400-123-4567');
expect(merged.safety_notice.title).toBe('官方公告');
});
it('6. 友圈热门话题与置顶公告配置校验 (P4)', () => {
const defaultTopics = [
{ name: '#深夜电台', count: '1.2w+', hot: true },
{ name: '#周末密室剧本杀', count: '8.5k', hot: true },
{ name: '#王者峡谷车队', count: '2.1w+', hot: false }
];
expect(defaultTopics.length).toBe(3);
expect(defaultTopics.filter(t => t.hot).length).toBe(2);
const notice = {
tag: '头条',
title: '友圈同城搭子发帖公约:严禁发布广告与不文明交友行为'
};
const secResult = secService.checkText(notice.title);
expect(secResult.pass).toBe(true);
const badNotice = {
tag: '广告',
title: '添加客服微信提供上门特殊服务'
};
const badSec = secService.checkText(badNotice.title);
expect(badSec.pass).toBe(false);
expect(badSec.code).toBe(87014);
});
it('7. 帮助中心与常见问题 FAQ 配置校验 (P5)', () => {
const faqList = [
{
question: '如何成为认证陪伴师/陪玩大神?',
answer: '进入【我的】->【入驻申请】,提交实名认证与技能资质,平台将在 24 小时内完成人工审核。',
category: '陪伴师相关'
},
{
question: '遇到订单纠纷如何申请平台仲裁?',
answer: '在【订单详情】中点击【申请仲裁退款】,客服与平台专员将在 2 小时内介入调解。',
category: '订单与退款'
}
];
expect(faqList.length).toBe(2);
expect(faqList[0].category).toBe('陪伴师相关');
const check = secService.checkText(JSON.stringify(faqList));
expect(check.pass).toBe(true);
});
});