/**
* TalkingQ Platform - Privacy (PII) Page
*/
registerPage('privacy', function(container) {
container.innerHTML = `
${[
{ name: '姓名', example: '张三 → ***', enabled: true },
{ name: '手机号', example: '138****8888', enabled: true },
{ name: 'IP 地址', example: '192.168.x.x', enabled: true },
{ name: '身份证号', example: '330102****1234', enabled: true },
{ name: '家庭住址', example: '北京市朝阳区*** → [地址已脱敏]', enabled: true },
{ name: '银行卡号', example: '6222****1234', enabled: false },
].map(r => `
`).join('')}
PII 规则接口:GET /api/v1/privacy/pii-rules · PUT /api/v1/privacy/pii-rules/{id}。
脱敏事件通过 pii_detected / pii_masked 事件上报。
数据保留策略
${[
{ type: '对话记录 (Sessions)', period: '180', unit: '天' },
{ type: '设备日志 (Device Logs)', period: '90', unit: '天' },
{ type: 'Bad Case 数据', period: '365', unit: '天' },
{ type: 'OTA 升级记录', period: '365', unit: '天' },
{ type: '审计日志 (Audit Logs)', period: '730', unit: '天' },
{ type: 'PII 脱敏日志', period: '30', unit: '天' },
].map(p => `
${p.type}
${p.unit}
`).join('')}
`;
lucide.createIcons({ elements: [container] });
container.querySelectorAll('#privacyTabs .tab-item').forEach(tab => {
tab.addEventListener('click', () => {
container.querySelectorAll('#privacyTabs .tab-item').forEach(t => t.classList.remove('active'));
tab.classList.add('active');
container.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
container.querySelector(`#tab-${tab.dataset.tab}`)?.classList.add('active');
});
});
});
/**
* TalkingQ Platform - Settings Page
*/
registerPage('settings', function(container) {
container.innerHTML = `
租户基本信息
| 名称 | Key(部分) | 权限 | 创建时间 | 最后使用 | 操作 |
${[
{ name: 'Backend Service Key', key: 'tq_live_****a3f2', scope: '全部权限', created: '2026-01-01', used: '2分钟前' },
{ name: 'Analytics Read-only', key: 'tq_ro_****c8e1', scope: '只读', created: '2026-03-15', used: '今天' },
].map(k => `
| ${k.name} |
${k.key} |
${k.scope} |
${k.created} |
${k.used} |
|
`).join('')}
API Key 接口:GET /api/v1/settings/api-keys · POST /api/v1/settings/api-keys
通知配置
${[
{ label: '设备离线告警', enabled: true },
{ label: 'OTA 升级失败告警', enabled: true },
{ label: 'Bad Case 严重问题告警', enabled: true },
{ label: 'API 超时告警', enabled: false },
{ label: '每日数据报告', enabled: true },
].map(n => `
${n.label}
`).join('')}
${[
{ name: '腾讯云 ASR', icon: '🔵', status: 'connected' },
{ name: '腾讯云 TTS', icon: '🔵', status: 'connected' },
{ name: 'OpenAI', icon: '⚫', status: 'disconnected' },
{ name: '阿里云 OSS', icon: '🟠', status: 'connected' },
{ name: 'Kafka', icon: '🟡', status: 'connected' },
{ name: 'ClickHouse', icon: '🔴', status: 'disconnected' },
].map(i => `
${i.icon}
${i.name}
${i.status === 'connected' ? '已连接' : '未连接'}
`).join('')}
`;
lucide.createIcons({ elements: [container] });
container.querySelectorAll('#settingsTabs .tab-item').forEach(tab => {
tab.addEventListener('click', () => {
container.querySelectorAll('#settingsTabs .tab-item').forEach(t => t.classList.remove('active'));
tab.classList.add('active');
container.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
container.querySelector(`#stab-${tab.dataset.tab}`)?.classList.add('active');
});
});
container.querySelector('#createKeyBtn')?.addEventListener('click', () => {
createModal({
title: '创建 API Key',
content: `