import React, { useState } from 'react' import { Card, Input, Button, Space, Tag, message, Descriptions, Row, Col, Segmented, Typography, Result, Divider, } from 'antd' import { ScanOutlined, GlobalOutlined, MobileOutlined, DesktopOutlined, ShoppingOutlined, SafetyCertificateOutlined, } from '@ant-design/icons' import { api } from './api.js' const { Text, Paragraph } = Typography const screenMeta = { iptv: { label: 'IPTV 大屏', color: 'blue', icon: }, ott: { label: 'OTT/智能电视', color: 'geekblue', icon: }, app: { label: '手机 APP', color: 'green', icon: }, } function ScreenTags({ screens }) { if (!screens || screens.length === 0) return 暂不可用 return ( {screens.map((s) => ( {screenMeta[s]?.label || s} ))} ) } // ============ 跨域解析网关(C.1/C.2)============ function ResolvePanel() { const [maCode, setMaCode] = useState('') const [res, setRes] = useState(null) const [loading, setLoading] = useState(false) async function doResolve() { if (!maCode) return message.warning('请输入 MA 码(支持集级子标识 #E03)') setLoading(true) const r = await api.resolve(maCode.trim()) setLoading(false) if (r.ok) setRes(r.data.data) else { setRes(null); message.error(r.data.message || '解析失败') } } const p = res?.parsed return ( MA 跨域解析网关 · 同一码三屏统一解析}> setMaCode(e.target.value)} onPressEnter={doResolve} /> {res && (
{res.resolved ? 解析成功 : 未解析/未登记} {res.in_circulation ? 流通中 : {res.status || '不可用'}} {res.title || '-'} {res.issuer || '-'} {p?.valid ? ( 国家码 {p.country_code} 行业 {p.industry_node} 机构 {p.org_node} 类目 {p.category} {p.year} 年 序列 {p.sequence} {p.episode > 0 && 第 {p.episode} 集} ) : 结构非法} {res.message}
)}
) } // ============ 扫码验真(B.2)============ function ScanVerifyPanel() { const [maCode, setMaCode] = useState('') const [res, setRes] = useState(null) const [loading, setLoading] = useState(false) async function doScan() { if (!maCode) return message.warning('请输入/扫描 MA 码') setLoading(true) const r = await api.scanVerify(maCode.trim()) setLoading(false) if (r.ok) setRes(r.data.data) else { setRes(null); message.error(r.data.message || '验真失败') } } let status = 'info', title = '请扫码验真' if (res) { if (res.authentic && res.compliant) { status = 'success'; title = '正版内容 · 合规流通' } else if (res.authentic && !res.compliant) { status = 'warning'; title = '真码 · 但不合规(已下架/未流通)' } else { status = 'error'; title = '验真失败 · 疑似盗版/伪造' } } return ( 用户扫码验真 · 防盗版}> setMaCode(e.target.value)} onPressEnter={doScan} /> {res && ( }> {res.authentic ? '真码' : '假码/未登记'} {res.compliant ? '合规流通' : '不合规'} {res.title && 《{res.title}》} {res.message} } /> )} ) } // ============ 跨屏权益通兑(D.1)============ function RightsPanel() { const [maCode, setMaCode] = useState('') const [userHash, setUserHash] = useState('user-demo-001') const [buyScreen, setBuyScreen] = useState('iptv') const [verifyScreen, setVerifyScreen] = useState('app') const [buyRes, setBuyRes] = useState(null) const [verifyRes, setVerifyRes] = useState(null) async function doBuy() { if (!maCode) return message.warning('请输入 MA 码') const r = await api.purchase(maCode.trim(), userHash, buyScreen) if (r.ok) { setBuyRes(r.data.data); message.success(`已在「${screenMeta[buyScreen].label}」购买`) } else message.error(r.data.message || '购买失败') } async function doVerify() { if (!maCode) return message.warning('请输入 MA 码') const r = await api.verifyRights(maCode.trim(), userHash, verifyScreen) if (r.ok) setVerifyRes(r.data.data) else message.error(r.data.message || '核验失败') } const opts = Object.entries(screenMeta).map(([v, m]) => ({ label: m.label, value: v })) return ( 跨屏权益通兑 · 一次购买全屏通看}> setMaCode(e.target.value)} placeholder="已发布的 MA 码" /> setUserHash(e.target.value)} /> {buyRes && ( 已购买:{screenMeta[buyRes.screen]?.label}({new Date(buyRes.purchased_at).toLocaleString()}) )} {verifyRes && ( verifyRes.entitled ? ✓ 有权益(通兑):{verifyRes.message} : ✗ 无权益:{verifyRes.message} )} 演示:在「IPTV 大屏」购买后,切到「手机 APP」核验,应通兑通看且不重复付费(权益归一到整剧 MA 码)。 ) } export default function ScreenFusion() { return (
大小屏融合:同一 MA 码贯通 IPTV / OTT / 手机 APP,统一解析、扫码验真、一次购买全屏通看。
) }