Files
xianyan/docs/design-preview/file-transfer-design.html
Developer 72f64f9ca9 feat: 新增文件传输助手功能及相关组件
新增文件传输助手功能,包含设备发现、配对、传输等核心模块。主要变更包括:
1. 新增局域网、蓝牙、NFC等多种设备发现方式
2. 实现基于WebRTC、TCP、USB等多种传输协议
3. 添加相关权限管理及状态监控
4. 完善UI界面及交互流程
5. 更新依赖库及版本号至4.19.0

同时优化部分现有功能:
1. 聊天会话增加隐藏功能
2. 完善本地通知权限处理
3. 修复部分已知问题
2026-05-10 02:48:52 +08:00

634 lines
71 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>闲言APP — 文件传输助手设计方案</title>
<style>
:root{--primary:#6C63FF;--primary-light:#8B83FF;--accent-glow:rgba(108,99,255,0.35);--bg:#F2F2F7;--bg-card:#FFFFFF;--bg-secondary:#E5E5EA;--text:#1C1C1E;--text-secondary:#8E8E93;--text-hint:#AEAEB2;--border:rgba(60,60,67,0.08);--radius-sm:8px;--radius-md:12px;--radius-lg:16px;--shadow-sm:0 1px 2px rgba(0,0,0,0.05);--shadow-md:0 4px 6px -1px rgba(0,0,0,0.1);--safe-bottom:34px;--font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','SF Pro Text','Helvetica Neue',sans-serif;--green:#34C759;--orange:#FF9500;--red:#FF3B30;--blue:#007AFF;--teal:#5AC8FA;--pink:#FF2D55;--indigo:#5856D6}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:var(--font-family);background:#0a0a1a;display:flex;justify-content:center;align-items:flex-start;min-height:100vh;padding:20px;gap:40px;flex-wrap:wrap}
.page-header{width:100%;text-align:center;padding:20px 0 10px}
.page-header h1{font-size:28px;color:#fff;font-weight:700;letter-spacing:-0.5px}
.page-header p{font-size:14px;color:rgba(255,255,255,0.4);margin-top:6px}
.tab-bar{width:100%;display:flex;justify-content:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}
.tab-btn{padding:8px 18px;border-radius:20px;border:1px solid rgba(255,255,255,0.12);background:rgba(255,255,255,0.04);color:rgba(255,255,255,0.5);font-size:13px;cursor:pointer;transition:all 0.3s;font-family:var(--font-family)}
.tab-btn:hover{background:rgba(255,255,255,0.08);color:rgba(255,255,255,0.7);transform:translateY(-1px)}
.tab-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);box-shadow:0 4px 20px rgba(108,99,255,0.5);transform:translateY(-1px)}
.phone-frame{width:390px;height:844px;border-radius:44px;overflow:hidden;position:relative;background:var(--bg);box-shadow:0 0 0 8px #1a1a3a,0 0 0 10px #2a2a5a,0 30px 80px rgba(0,0,0,0.6);display:none;flex-direction:column;animation:phoneAppear 0.6s ease}
.phone-frame.active{display:flex;flex-direction:column}
@keyframes phoneAppear{from{opacity:0;transform:scale(0.95) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}
.phone-notch{position:absolute;top:0;left:50%;transform:translateX(-50%);width:126px;height:34px;background:#000;border-radius:0 0 20px 20px;z-index:100}
.phone-status-bar{height:54px;display:flex;align-items:flex-end;justify-content:space-between;padding:0 28px 6px;font-size:14px;font-weight:600;color:var(--text);z-index:50;flex-shrink:0}
.nav-bar{height:52px;display:flex;align-items:center;padding:0 16px;background:rgba(242,242,247,0.85);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:0.5px solid var(--border);flex-shrink:0;z-index:40}
.nav-bar .back{font-size:20px;color:var(--primary);cursor:pointer;padding:4px}
.nav-bar .title{flex:1;text-align:center;font-size:17px;font-weight:600;color:var(--text)}
.nav-bar .action{font-size:20px;color:var(--primary);cursor:pointer;padding:4px}
.scroll-area{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch}
.scroll-area::-webkit-scrollbar{display:none}
.session-list{padding:0 0 100px}
.section-header{padding:14px 18px 6px;display:flex;align-items:center;gap:6px}
.section-header .label{font-size:13px;font-weight:600;color:var(--text-secondary)}
.section-header .count{font-size:11px;color:var(--text-hint)}
.session-item{display:flex;align-items:center;padding:10px 16px;gap:12px;cursor:pointer;transition:background 0.15s;animation:slideIn 0.4s ease both}
.session-item:active{background:rgba(0,0,0,0.04)}
@keyframes slideIn{from{opacity:0;transform:translateX(12px)}to{opacity:1;transform:translateX(0)}}
.session-avatar{width:52px;height:52px;border-radius:var(--radius-lg);display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0;position:relative;box-shadow:0 2px 8px rgba(0,0,0,0.08)}
.session-avatar .online-dot{position:absolute;right:-2px;bottom:-2px;width:14px;height:14px;border-radius:50%;border:2.5px solid var(--bg-card)}
.session-info{flex:1;min-width:0}
.session-name{font-size:16px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px}
.session-name .tag{font-size:10px;font-weight:700;padding:1px 6px;border-radius:6px;color:var(--primary);background:rgba(108,99,255,0.1)}
.session-desc{font-size:14px;color:var(--text-hint);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.session-right{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
.session-time{font-size:12px;color:var(--text-hint)}
.session-arrow{font-size:12px;color:rgba(174,174,178,0.5)}
.transfer-page{padding:0 0 100px}
.search-bar{margin:8px 16px 12px;padding:10px 14px;background:var(--bg-secondary);border-radius:var(--radius-md);display:flex;align-items:center;gap:8px}
.search-bar .icon{font-size:16px;color:var(--text-hint)}
.search-bar .text{font-size:15px;color:var(--text-hint)}
.device-card{margin:4px 16px;padding:14px 16px;background:var(--bg-card);border-radius:var(--radius-lg);display:flex;align-items:center;gap:12px;box-shadow:var(--shadow-sm);cursor:pointer;transition:all 0.25s;animation:cardIn 0.5s ease both}
.device-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}
.device-card:active{transform:scale(0.98)}
@keyframes cardIn{from{opacity:0;transform:translateY(12px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}
.device-icon{width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}
.device-info{flex:1;min-width:0}
.device-name{font-size:16px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px}
.device-detail{font-size:13px;color:var(--text-hint);margin-top:2px}
.device-status{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
.status-badge{font-size:11px;font-weight:600;padding:2px 8px;border-radius:8px}
.status-online{background:rgba(52,199,89,0.12);color:var(--green)}
.status-remote{background:rgba(0,122,255,0.12);color:var(--blue)}
.status-offline{background:rgba(142,142,147,0.12);color:var(--text-hint)}
.pairing-section{margin:16px}
.pairing-title{font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:10px}
.pairing-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.pairing-item{display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 8px;background:var(--bg-card);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);cursor:pointer;transition:all 0.25s}
.pairing-item:hover{transform:translateY(-3px);box-shadow:var(--shadow-md)}
.pairing-item:active{transform:scale(0.95)}
.pairing-item .emoji{font-size:28px}
.pairing-item .label{font-size:12px;font-weight:500;color:var(--text)}
.recent-msgs-section{margin:0 0 4px;padding:0}
.recent-msg-item{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:10px;background:rgba(255,255,255,0.6);margin:4px 0;cursor:pointer;transition:all 0.2s;animation:slideUp 0.3s ease both}
.recent-msg-item:hover{background:rgba(255,255,255,0.9);transform:translateX(2px)}
.recent-msg-item .msg-icon{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0}
.recent-msg-item .msg-body{flex:1;display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text)}
.recent-msg-item .msg-type{font-size:12px}
.recent-msg-item .msg-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:140px}
.recent-msg-item .msg-status{font-size:11px;font-weight:600;flex-shrink:0}
.recent-msg-item .msg-status.done{color:var(--green)}
.recent-msg-item .msg-status.progress{color:var(--primary);animation:pulse 2s infinite}
.chat-area{flex:1;overflow-y:auto;padding:8px 14px;-webkit-overflow-scrolling:touch}
.chat-area::-webkit-scrollbar{display:none}
.time-divider{text-align:center;padding:12px 0 8px;font-size:12px;color:var(--text-hint)}
.time-divider span{background:rgba(120,120,128,0.08);padding:3px 10px;border-radius:10px;font-size:11px}
.msg-row{display:flex;margin-bottom:4px;gap:8px}
.msg-row.right{justify-content:flex-end}
.msg-row.left{justify-content:flex-start}
.msg-avatar{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0;background:var(--bg-secondary)}
.msg-content{max-width:72%}
.msg-bubble{padding:10px 14px;border-radius:18px;font-size:15px;line-height:1.45;word-break:break-word;animation:bubbleIn 0.35s ease}
@keyframes bubbleIn{from{opacity:0;transform:scale(0.85) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}
.msg-row.left .msg-bubble{background:var(--bg-card);color:var(--text);border-bottom-left-radius:6px;box-shadow:var(--shadow-sm)}
.msg-row.right .msg-bubble{background:var(--primary);color:#fff;border-bottom-right-radius:6px;box-shadow:0 2px 12px rgba(108,99,255,0.3)}
.msg-time{font-size:11px;color:var(--text-hint);margin-top:3px;padding:0 4px}
.msg-row.right .msg-time{text-align:right}
.file-bubble{padding:12px;border-radius:18px;min-width:220px;animation:bubbleIn 0.35s ease}
.msg-row.left .file-bubble{background:var(--bg-card);box-shadow:var(--shadow-sm);border-bottom-left-radius:6px}
.msg-row.right .file-bubble{background:var(--bg-card);box-shadow:0 2px 12px rgba(108,99,255,0.2);border-bottom-right-radius:6px}
.file-header{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.file-icon-box{width:44px;height:44px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}
.file-meta{flex:1;min-width:0}
.file-name{font-size:14px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.file-size{font-size:12px;color:var(--text-hint);margin-top:1px}
.file-status{font-size:12px;font-weight:600;margin-top:1px}
.file-status.sending{color:var(--primary)}
.file-status.done{color:var(--green)}
.file-status.receiving{color:var(--blue)}
.progress-track{height:6px;background:var(--bg-secondary);border-radius:3px;overflow:hidden;margin-top:8px}
.progress-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--primary),var(--primary-light));box-shadow:0 0 8px var(--accent-glow);animation:progressPulse 2s ease-in-out infinite}
@keyframes progressPulse{0%,100%{opacity:1}50%{opacity:0.8}}
.progress-info{display:flex;justify-content:space-between;margin-top:4px}
.progress-pct{font-size:11px;font-weight:600;color:var(--primary)}
.progress-speed{font-size:11px;color:var(--text-hint)}
.image-bubble{border-radius:18px;overflow:hidden;position:relative;animation:bubbleIn 0.35s ease}
.msg-row.left .image-bubble{border-bottom-left-radius:6px}
.msg-row.right .image-bubble{border-bottom-right-radius:6px}
.image-thumb{width:200px;height:150px;display:block;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%)}
.image-overlay{position:absolute;bottom:0;left:0;right:0;padding:8px 10px;background:linear-gradient(transparent,rgba(0,0,0,0.6));display:flex;justify-content:space-between;align-items:flex-end}
.image-name{font-size:11px;color:rgba(255,255,255,0.9);font-weight:500}
.image-size{font-size:10px;color:rgba(255,255,255,0.6)}
.input-bar{padding:8px 12px var(--safe-bottom);background:rgba(242,242,247,0.92);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-top:0.5px solid var(--border);display:flex;align-items:center;gap:8px;flex-shrink:0}
.input-bar .attach-btn{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:20px;background:var(--bg-secondary);cursor:pointer;flex-shrink:0;transition:all 0.2s}
.input-bar .attach-btn:hover{background:var(--primary);transform:scale(1.05)}
.input-field{flex:1;height:36px;padding:0 14px;background:var(--bg-card);border-radius:18px;border:none;font-size:15px;color:var(--text);font-family:var(--font-family);outline:none}
.input-field::placeholder{color:var(--text-hint)}
.send-btn{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:18px;background:var(--primary);color:#fff;cursor:pointer;flex-shrink:0;box-shadow:0 2px 8px rgba(108,99,255,0.4);transition:all 0.2s}
.send-btn:hover{transform:scale(1.08);box-shadow:0 4px 16px rgba(108,99,255,0.5)}
.pairing-page{padding:20px 16px 100px}
.pairing-hero{text-align:center;padding:30px 20px;margin-bottom:20px}
.pairing-hero .icon{font-size:64px;margin-bottom:12px;animation:float 3s ease-in-out infinite}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
.pairing-hero h2{font-size:22px;font-weight:700;color:var(--text)}
.pairing-hero p{font-size:14px;color:var(--text-hint);margin-top:6px;line-height:1.5}
.pairing-methods{display:flex;flex-direction:column;gap:10px}
.pairing-method{display:flex;align-items:center;gap:14px;padding:16px;background:var(--bg-card);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);cursor:pointer;transition:all 0.25s}
.pairing-method:hover{transform:translateX(4px);box-shadow:var(--shadow-md)}
.pairing-method:active{transform:scale(0.98)}
.pairing-method .icon{width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0}
.pairing-method .info{flex:1}
.pairing-method .name{font-size:16px;font-weight:600;color:var(--text)}
.pairing-method .desc{font-size:13px;color:var(--text-hint);margin-top:2px}
.pairing-method .arrow{font-size:14px;color:var(--text-hint)}
.scanning-ring{width:160px;height:160px;margin:20px auto;position:relative}
.scanning-ring .ring{position:absolute;inset:0;border-radius:50%;border:2px solid transparent;border-top-color:var(--primary);animation:spin 1.5s linear infinite}
.scanning-ring .ring:nth-child(2){inset:12px;border-top-color:var(--primary-light);animation-duration:2s;animation-direction:reverse}
.scanning-ring .ring:nth-child(3){inset:24px;border-top-color:rgba(108,99,255,0.4);animation-duration:2.5s}
@keyframes spin{to{transform:rotate(360deg)}}
.scanning-ring .center-icon{position:absolute;inset:36px;display:flex;align-items:center;justify-content:center;font-size:40px;border-radius:50%;background:rgba(108,99,255,0.08)}
.connecting-dots{display:flex;justify-content:center;gap:8px;padding:20px}
.connecting-dots .dot{width:10px;height:10px;border-radius:50%;background:var(--primary);animation:dotPulse 1.4s ease-in-out infinite}
.connecting-dots .dot:nth-child(2){animation-delay:0.2s}
.connecting-dots .dot:nth-child(3){animation-delay:0.4s}
@keyframes dotPulse{0%,80%,100%{transform:scale(0.6);opacity:0.4}40%{transform:scale(1);opacity:1}}
.settings-page{padding:0 0 100px}
.settings-group{margin:16px;background:var(--bg-card);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-sm)}
.settings-item{display:flex;align-items:center;padding:14px 16px;gap:12px;border-bottom:0.5px solid var(--border);cursor:pointer;transition:background 0.15s}
.settings-item:last-child{border-bottom:none}
.settings-item:active{background:rgba(0,0,0,0.03)}
.settings-item .icon{font-size:22px;width:30px;text-align:center}
.settings-item .label{flex:1;font-size:15px;color:var(--text)}
.settings-item .value{font-size:14px;color:var(--text-hint)}
.settings-item .toggle{width:51px;height:31px;border-radius:16px;position:relative;background:var(--bg-secondary);cursor:pointer;transition:background 0.3s}
.settings-item .toggle.on{background:var(--green)}
.settings-item .toggle .knob{position:absolute;top:2px;left:2px;width:27px;height:27px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,0.15);transition:transform 0.3s}
.settings-item .toggle.on .knob{transform:translateX(20px)}
.arch-layer{background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);border-radius:16px;padding:16px;margin-bottom:12px;animation:fadeUp 0.5s ease both}
@keyframes fadeUp{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}
.arch-layer-title{font-size:14px;font-weight:700;color:rgba(255,255,255,0.7);margin-bottom:12px;display:flex;align-items:center;gap:8px}
.arch-modules{display:flex;flex-wrap:wrap;gap:8px}
.arch-module{padding:8px 14px;border-radius:10px;font-size:12px;font-weight:500;border:1px solid rgba(255,255,255,0.1);transition:all 0.25s}
.arch-module:hover{transform:translateY(-2px)}
.arch-module.purple{background:rgba(108,99,255,0.15);color:#a5a0ff;border-color:rgba(108,99,255,0.25)}
.arch-module.blue{background:rgba(0,122,255,0.15);color:#7ab8ff;border-color:rgba(0,122,255,0.25)}
.arch-module.green{background:rgba(52,199,89,0.15);color:#7cd89a;border-color:rgba(52,199,89,0.25)}
.arch-module.orange{background:rgba(255,149,0,0.15);color:#ffc066;border-color:rgba(255,149,0,0.25)}
.arch-module.pink{background:rgba(255,45,85,0.15);color:#ff8da6;border-color:rgba(255,45,85,0.25)}
.arch-module.teal{background:rgba(90,200,250,0.15);color:#90d8fa;border-color:rgba(90,200,250,0.25)}
.flow-diagram{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;flex-wrap:wrap}
.flow-step{padding:10px 16px;border-radius:10px;font-size:12px;font-weight:600;text-align:center;min-width:80px}
.flow-step.lan{background:rgba(52,199,89,0.15);color:#7cd89a;border:1px solid rgba(52,199,89,0.25)}
.flow-step.remote{background:rgba(0,122,255,0.15);color:#7ab8ff;border:1px solid rgba(0,122,255,0.25)}
.flow-step.fallback{background:rgba(255,149,0,0.15);color:#ffc066;border:1px solid rgba(255,149,0,0.25)}
.flow-arrow{color:rgba(255,255,255,0.3);font-size:18px}
.compat-table{width:100%;border-collapse:collapse;font-size:11px}
.compat-table th{background:rgba(255,255,255,0.06);color:rgba(255,255,255,0.5);padding:8px 4px;font-weight:600;text-align:center;border-bottom:1px solid rgba(255,255,255,0.08)}
.compat-table td{padding:8px 4px;text-align:center;color:rgba(255,255,255,0.6);border-bottom:1px solid rgba(255,255,255,0.04)}
.compat-table .yes{color:var(--green);font-weight:600}
.compat-table .no{color:rgba(255,255,255,0.2)}
.compat-table .degrade{color:var(--orange);font-size:10px}
.lib-item{display:flex;align-items:center;gap:10px;padding:10px 14px;background:rgba(255,255,255,0.04);border-radius:10px;margin-bottom:6px;border:1px solid rgba(255,255,255,0.06);animation:fadeUp 0.4s ease both}
.lib-item .emoji{font-size:18px}
.lib-item .name{font-size:13px;font-weight:600;color:rgba(255,255,255,0.7);flex:1}
.lib-item .ver{font-size:11px;color:rgba(255,255,255,0.3)}
.lib-item .badge{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px}
.lib-item .badge.new{background:rgba(255,45,85,0.15);color:#ff8da6}
.lib-item .badge.exist{background:rgba(52,199,89,0.15);color:#7cd89a}
.file-item{display:flex;align-items:center;gap:8px;padding:8px 12px;background:rgba(255,255,255,0.03);border-radius:8px;margin-bottom:4px;font-size:12px;color:rgba(255,255,255,0.5);font-family:'SF Mono',monospace;border:1px solid rgba(255,255,255,0.04)}
.file-item .check{color:var(--green);font-size:14px}
.file-item .path{flex:1}
.file-item .desc{color:rgba(255,255,255,0.25);font-size:11px}
.file-group{margin-bottom:16px}
.file-group-title{font-size:13px;font-weight:700;color:rgba(255,255,255,0.5);margin-bottom:8px;padding-left:4px}
</style>
</head>
<body>
<div class="page-header"><h1>📁 文件传输助手 — 设计方案</h1><p>闲言APP · 跨平台P2P文件传输 · 消息互发 · 多方式配对</p></div>
<div class="tab-bar">
<button class="tab-btn active" onclick="switchView('inspiration')">✨ 灵感页</button>
<button class="tab-btn" onclick="switchView('transfer')">📁 传输助手</button>
<button class="tab-btn" onclick="switchView('chat')">💬 传输对话</button>
<button class="tab-btn" onclick="switchView('pairing')">🔗 配对</button>
<button class="tab-btn" onclick="switchView('settings')">⚙️ 设置</button>
<button class="tab-btn" onclick="switchView('arch')">🏗️ 架构</button>
<button class="tab-btn" onclick="switchView('libs')">📦 依赖库</button>
<button class="tab-btn" onclick="switchView('files')">📄 文件清单</button>
</div>
<div class="phone-frame active" id="view-inspiration">
<div class="phone-notch"></div>
<div class="phone-status-bar"><span>9:41</span><span>●●●● 📶 🔋</span></div>
<div class="nav-bar"><span class="back"></span><span class="title">✨ 灵感</span><span class="action">🔧</span></div>
<div class="scroll-area"><div class="session-list">
<div class="section-header"><span class="label">📌 置顶</span><span class="count">2</span></div>
<div class="session-item" style="animation-delay:0.05s"><div class="session-avatar" style="background:rgba(108,99,255,0.1)">💬</div><div class="session-info"><div class="session-name">每日灵感</div><div class="session-desc">生活不是等待暴风雨过去…</div></div><div class="session-right"><span class="session-time">10:32</span><span class="session-arrow"></span></div></div>
<div class="session-item" style="animation-delay:0.1s;background:rgba(108,99,255,0.04);border-radius:12px;margin:2px 8px" onclick="switchView('transfer')"><div class="session-avatar" style="background:rgba(0,122,255,0.12)">📁<div class="online-dot" style="background:var(--green)"></div></div><div class="session-info"><div class="session-name">文件传输助手 <span class="tag">P2P</span></div><div class="session-desc">局域网 · 蓝牙 · NFC · 远程传输</div></div><div class="session-right"><span class="session-time" style="color:var(--primary)">刚刚</span><span class="session-arrow"></span></div></div>
<div style="padding:8px 16px"><div style="height:0.5px;background:var(--border)"></div></div>
<div class="section-header"><span class="label">💬 对话</span><span class="count">5</span></div>
<div class="session-item" style="animation-delay:0.15s"><div class="session-avatar" style="background:rgba(255,149,0,0.1)">🔍</div><div class="session-info"><div class="session-name">发现 <span class="tag" style="color:var(--red);background:rgba(255,59,48,0.1)">HOT</span></div><div class="session-desc">热门句子 · 分类浏览 · 每日推荐</div></div><div class="session-right"><span class="session-time">昨天</span><span class="session-arrow"></span></div></div>
<div class="session-item" style="animation-delay:0.2s"><div class="session-avatar" style="background:rgba(52,199,89,0.1)">👣</div><div class="session-info"><div class="session-name">足迹</div><div class="session-desc">浏览 · 点赞 · 收藏 · 稍后读</div></div><div class="session-right"><span class="session-time">3天前</span><span class="session-arrow"></span></div></div>
<div class="session-item" style="animation-delay:0.25s"><div class="session-avatar" style="background:rgba(88,86,214,0.1)">📅</div><div class="session-info"><div class="session-name">日签卡片</div><div class="session-desc">每日一句 · 样式切换 · 一键分享</div></div><div class="session-right"><span class="session-time">6小时前</span><span class="session-arrow"></span></div></div>
<div class="session-item" style="animation-delay:0.3s"><div class="session-avatar" style="background:rgba(255,45,85,0.1)">🎨</div><div class="session-info"><div class="session-name">壁纸模板</div><div class="session-desc">预设模板 · 分类浏览 · 一键应用</div></div><div class="session-right"><span class="session-time">12小时前</span><span class="session-arrow"></span></div></div>
<div class="session-item" style="animation-delay:0.35s"><div class="session-avatar" style="background:rgba(90,200,250,0.1)">📊</div><div class="session-info"><div class="session-name">阅读报告</div><div class="session-desc">周/月/年报 · 趋势图 · 热力图</div></div><div class="session-right"><span class="session-time">2小时前</span><span class="session-arrow"></span></div></div>
</div></div>
</div>
<div class="phone-frame" id="view-transfer">
<div class="phone-notch"></div>
<div class="phone-status-bar"><span>9:41</span><span>●●●● 📶 🔋</span></div>
<div class="nav-bar"><span class="back" onclick="switchView('inspiration')"></span><span class="title">📁 文件传输助手</span><span class="action" onclick="switchView('settings')">⚙️</span></div>
<div class="scroll-area"><div class="transfer-page">
<div class="offline-banner" id="offlineBanner" style="background:linear-gradient(90deg,#ff9500,#ff6b00);color:white;padding:10px 14px;border-radius:10px;margin-bottom:8px;font-size:12px;display:flex;align-items:center;gap:8px;animation:slideUp 0.3s ease"><span>📡</span><span style="flex:1">离线模式 — 局域网 · 热点 · 蓝牙 · USB 仍可使用</span><span style="cursor:pointer" onclick="document.getElementById('offlineBanner').style.display='none'"></span></div>
<div class="search-bar"><span class="icon">🔍</span><span class="text">搜索设备...</span></div>
<div class="recent-msgs-section">
<div class="section-header"><span class="label">💬 最新消息</span></div>
<div class="recent-msg-item" onclick="switchView('chat')"><span class="msg-icon" style="background:rgba(52,199,89,0.1)">📱</span><span class="msg-body"><span class="msg-type">🖼️</span><span class="msg-text">photo.jpg</span></span><span class="msg-status done"></span></div>
<div class="recent-msg-item" onclick="switchView('chat')"><span class="msg-icon" style="background:rgba(108,99,255,0.1)">💻</span><span class="msg-body"><span class="msg-type">📄</span><span class="msg-text">report.pdf</span></span><span class="msg-status progress">78%</span></div>
<div class="recent-msg-item" onclick="switchView('chat')"><span class="msg-icon" style="background:rgba(52,199,89,0.1)">📱</span><span class="msg-body"><span class="msg-type">💬</span><span class="msg-text">好的 👍</span></span><span class="msg-status"></span></div>
</div>
<div class="section-header"><span class="label">📡 发现设备</span><span class="count">3</span></div>
<div class="device-card" style="animation-delay:0.1s" onclick="switchView('chat')"><div class="device-icon" style="background:rgba(52,199,89,0.1)">📱</div><div class="device-info"><div class="device-name">小明的iPhone 🟢</div><div class="device-detail">iOS · 局域网 · 192.168.1.105</div></div><div class="device-status"><span class="status-badge status-online">在线</span></div></div>
<div class="device-card" style="animation-delay:0.2s" onclick="switchView('chat')"><div class="device-icon" style="background:rgba(108,99,255,0.1)">💻</div><div class="device-info"><div class="device-name">办公室Mac 🟢</div><div class="device-detail">macOS · 局域网 · 192.168.1.42</div></div><div class="device-status"><span class="status-badge status-online">在线</span></div></div>
<div class="device-card" style="animation-delay:0.3s" onclick="switchView('chat')"><div class="device-icon" style="background:rgba(0,122,255,0.1)">🌐</div><div class="device-info"><div class="device-name">远程设备 🔵</div><div class="device-detail">Web · WebRTC · 中继连接</div></div><div class="device-status"><span class="status-badge status-remote">远程</span></div></div>
<div class="section-header" style="margin-top:8px"><span class="label">📋 已配对设备</span><span class="count">5</span></div>
<div class="device-card" style="animation-delay:0.4s;opacity:0.7"><div class="device-icon" style="background:rgba(142,142,147,0.08)">📱</div><div class="device-info"><div class="device-name">家里的iPad ⚪</div><div class="device-detail">iOS · 上次: 2小时前</div></div><div class="device-status"><span class="status-badge status-offline">离线</span></div></div>
<div class="device-card" style="animation-delay:0.5s;opacity:0.7"><div class="device-icon" style="background:rgba(142,142,147,0.08)">🖥️</div><div class="device-info"><div class="device-name">Windows台式 ⚪</div><div class="device-detail">Windows · 上次: 昨天</div></div><div class="device-status"><span class="status-badge status-offline">离线</span></div></div>
<div class="pairing-section"><div class="pairing-title"> 配对新设备</div><div class="pairing-grid">
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">📡</span><span class="label">局域网</span></div>
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">🔵</span><span class="label">蓝牙</span></div>
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">📱</span><span class="label">NFC</span></div>
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">📷</span><span class="label">扫码</span></div>
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">🌐</span><span class="label">账户</span></div>
<div class="pairing-item" onclick="switchView('pairing')"><span class="emoji">✏️</span><span class="label">手动IP</span></div>
<div class="pairing-item" onclick="switchView('pairing')" style="border:1.5px solid var(--primary)"><span class="emoji">🔌</span><span class="label">USB</span></div>
<div class="pairing-item" onclick="switchView('pairing')" style="border:1.5px solid var(--orange)"><span class="emoji">📶</span><span class="label">热点</span></div>
</div></div>
</div></div>
</div>
<div class="phone-frame" id="view-chat">
<div class="phone-notch"></div>
<div class="phone-status-bar"><span>9:41</span><span>●●●● 📶 🔋</span></div>
<div class="nav-bar"><span class="back" onclick="switchView('transfer')"></span><span class="title">📱 小明的iPhone</span><span class="action"></span></div>
<div class="chat-area">
<div class="time-divider"><span>今天 10:28</span></div>
<div class="msg-row left"><div class="msg-avatar" style="background:rgba(52,199,89,0.1)">📱</div><div class="msg-content"><div class="msg-bubble">嗨,发你个文件</div><div class="msg-time">10:28</div></div></div>
<div class="msg-row right"><div class="msg-content"><div class="msg-bubble">好的,发过来吧 👍</div><div class="msg-time">10:28</div></div></div>
<div class="msg-row left"><div class="msg-avatar" style="background:rgba(52,199,89,0.1)">📱</div><div class="msg-content"><div class="file-bubble"><div class="file-header"><div class="file-icon-box" style="background:rgba(108,99,255,0.1)">🖼️</div><div class="file-meta"><div class="file-name">sunset_photo.jpg</div><div class="file-size">3.2 MB / 4.1 MB</div><div class="file-status receiving">接收中</div></div></div><div class="progress-track"><div class="progress-fill" style="width:78%"></div></div><div class="progress-info"><span class="progress-pct">78%</span><span class="progress-speed">1.2 MB/s</span></div></div><div class="msg-time">10:29 · LocalSend HTTP</div></div></div>
<div class="msg-row right"><div class="msg-content"><div class="image-bubble"><div class="image-thumb" style="background:linear-gradient(135deg,#f093fb 0%,#f5576c 100%)"></div><div class="image-overlay"><span class="image-name">wallpaper.png</span><span class="image-size">2.8 MB</span></div></div><div class="msg-time" style="text-align:right">10:30 · 已完成 ✅</div></div></div>
<div class="msg-row left"><div class="msg-avatar" style="background:rgba(52,199,89,0.1)">📱</div><div class="msg-content"><div class="file-bubble"><div class="file-header"><div class="file-icon-box" style="background:rgba(255,149,0,0.1)">📄</div><div class="file-meta"><div class="file-name">project_report.pdf</div><div class="file-size">1.5 MB</div><div class="file-status done">✅ 已完成</div></div></div></div><div class="msg-time">10:31 · TCP Socket</div></div></div>
<div class="msg-row right"><div class="msg-content"><div class="file-bubble"><div class="file-header"><div class="file-icon-box" style="background:rgba(255,45,85,0.1)">🎬</div><div class="file-meta"><div class="file-name">vacation_clip.mp4</div><div class="file-size">156.3 MB / 234.8 MB</div><div class="file-status sending">发送中</div></div></div><div class="progress-track"><div class="progress-fill" style="width:66%"></div></div><div class="progress-info"><span class="progress-pct">66%</span><span class="progress-speed">5.8 MB/s</span></div></div><div class="msg-time" style="text-align:right">10:32 · TCP Socket</div></div></div>
<div class="msg-row left"><div class="msg-avatar" style="background:rgba(52,199,89,0.1)">📱</div><div class="msg-content"><div class="msg-bubble">视频好大,速度还挺快 😄</div><div class="msg-time">10:33</div></div></div>
</div>
<div class="input-bar"><div class="attach-btn">📎</div><input class="input-field" placeholder="输入消息..." /><div class="send-btn"></div></div>
<div class="drop-zone-hint" style="display:none;padding:12px;text-align:center;border:2px dashed rgba(0,122,255,0.4);border-radius:12px;margin:4px 14px 8px;background:rgba(0,122,255,0.05);font-size:13px;color:rgba(0,122,255,0.8);animation:slideUp 0.3s ease">📂 拖拽文件到此处发送</div>
</div>
<div class="phone-frame" id="view-pairing">
<div class="phone-notch"></div>
<div class="phone-status-bar"><span>9:41</span><span>●●●● 📶 🔋</span></div>
<div class="nav-bar"><span class="back" onclick="switchView('transfer')"></span><span class="title">🔗 配对设备</span><span class="action"></span></div>
<div class="scroll-area"><div class="pairing-page">
<div class="pairing-hero"><div class="icon">📡</div><h2>发现附近设备</h2><p>确保两台设备在同一网络<br>或开启蓝牙/NFC后靠近</p></div>
<div class="scanning-ring"><div class="ring"></div><div class="ring"></div><div class="ring"></div><div class="center-icon">📁</div></div>
<div class="connecting-dots"><div class="dot"></div><div class="dot"></div><div class="dot"></div></div>
<div class="pairing-methods">
<div class="pairing-method"><div class="icon" style="background:rgba(52,199,89,0.1)">📡</div><div class="info"><div class="name">局域网发现</div><div class="desc">自动发现同一WiFi下的设备</div></div><span class="arrow"></span></div>
<div class="pairing-method"><div class="icon" style="background:rgba(0,122,255,0.1)">🔵</div><div class="info"><div class="name">蓝牙配对</div><div class="desc">BLE扫描附近设备并握手</div></div><span class="arrow"></span></div>
<div class="pairing-method"><div class="icon" style="background:rgba(255,149,0,0.1)">📱</div><div class="info"><div class="name">NFC触碰</div><div class="desc">两部手机背靠背触碰配对</div></div><span class="arrow"></span></div>
<div class="pairing-method"><div class="icon" style="background:rgba(108,99,255,0.1)">📷</div><div class="info"><div class="name">扫码配对</div><div class="desc">扫描对方QR码快速连接</div></div><span class="arrow"></span></div>
<div class="pairing-method"><div class="icon" style="background:rgba(88,86,214,0.1)">🌐</div><div class="info"><div class="name">账户配对</div><div class="desc">登录同账户自动发现远程设备</div></div><span class="arrow"></span></div>
<div class="pairing-method"><div class="icon" style="background:rgba(90,200,250,0.1)">✏️</div><div class="info"><div class="name">手动输入IP</div><div class="desc">输入对方IP地址和端口直连</div></div><span class="arrow"></span></div>
</div>
</div></div>
</div>
<div class="phone-frame" id="view-settings">
<div class="phone-notch"></div>
<div class="phone-status-bar"><span>9:41</span><span>●●●● 📶 🔋</span></div>
<div class="nav-bar"><span class="back" onclick="switchView('transfer')"></span><span class="title">⚙️ 传输设置</span><span class="action"></span></div>
<div class="scroll-area"><div class="settings-page">
<div class="settings-group"><div class="settings-item"><span class="icon">📛</span><span class="label">设备名称</span><span class="value">我的iPhone </span></div><div class="settings-item"><span class="icon">🔑</span><span class="label">设备指纹</span><span class="value">a3f8…c2d1 </span></div></div>
<div class="settings-group"><div class="settings-item"><span class="icon">📡</span><span class="label">局域网发现</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">🔵</span><span class="label">蓝牙配对</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">📱</span><span class="label">NFC配对</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">🔌</span><span class="label">USB有线配对</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">📶</span><span class="label">WiFi热点</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">🔒</span><span class="label">加密传输</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div></div>
<div class="settings-group"><div class="settings-item"><span class="icon">🔌</span><span class="label">LocalSend端口</span><span class="value">53317 </span></div><div class="settings-item"><span class="icon">🌐</span><span class="label">信令服务器</span><span class="value">已连接 </span></div><div class="settings-item"><span class="icon">🔄</span><span class="label">TURN中继</span><div class="toggle on" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div></div>
<div class="settings-group"><div class="settings-item"><span class="icon">📁</span><span class="label">下载目录</span><span class="value">Downloads </span></div><div class="settings-item"><span class="icon">🖼️</span><span class="label">自动保存图片到相册</span><div class="toggle" onclick="this.classList.toggle('on')"><div class="knob"></div></div></div><div class="settings-item"><span class="icon">📊</span><span class="label">大文件阈值</span><span class="value">100 MB </span></div></div>
<div class="settings-group"><div class="settings-item"><span class="icon">🗑️</span><span class="label">缓存管理</span><span class="value">60.4 MB </span></div><div class="settings-item"><span class="icon">📋</span><span class="label">传输记录</span><span class="value">128条 </span></div><div class="settings-item"><span class="icon">📂</span><span class="label">临时文件</span><span class="value">45.2 MB </span></div><div class="settings-item"><span class="icon">🖼️</span><span class="label">缩略图缓存</span><span class="value">12.8 MB </span></div></div>
<div class="settings-group"><div class="settings-item"><span class="icon">📋</span><span class="label">传输记录</span><span class="value">23 个文件 </span></div><div class="settings-item"><span class="icon">🔗</span><span class="label">已配对设备</span><span class="value">5 台 </span></div><div class="settings-item"><span class="icon">🗑️</span><span class="label">清除传输缓存</span><span class="value">128 MB </span></div></div>
</div></div>
</div>
<div class="phone-frame" id="view-arch" style="height:auto;min-height:844px;overflow-y:auto;border-radius:24px">
<div style="padding:24px 20px;background:linear-gradient(180deg,#0a0a1a 0%,#12122a 100%);min-height:844px">
<h2 style="color:#fff;font-size:20px;font-weight:700;margin-bottom:20px;text-align:center">🏗️ 系统架构</h2>
<div class="arch-layer"><div class="arch-layer-title">🎨 UI层</div><div class="arch-modules"><div class="arch-module purple">传输助手主页</div><div class="arch-module purple">配对发现页</div><div class="arch-module purple">传输对话页</div><div class="arch-module purple">传输设置页</div><div class="arch-module purple">设备卡片</div><div class="arch-module purple">传输气泡</div><div class="arch-module purple">进度条</div></div></div>
<div class="arch-layer"><div class="arch-layer-title">🚀 传输管理层</div><div class="arch-modules"><div class="arch-module blue">TransportRouter</div><div class="arch-module green">LocalSend HTTP</div><div class="arch-module green">TCP Socket</div><div class="arch-module green">WebRTC P2P</div><div class="arch-module orange">WebRTC TURN</div></div></div>
<div class="arch-layer"><div class="arch-layer-title">📡 信令与发现层</div><div class="arch-modules"><div class="arch-module teal">UDP多播</div><div class="arch-module teal">mDNS</div><div class="arch-module pink">蓝牙BLE</div><div class="arch-module pink">NFC</div><div class="arch-module blue">WebSocket信令</div><div class="arch-module blue">账户发现</div></div></div>
<div class="arch-layer"><div class="arch-layer-title">🔒 安全与持久层</div><div class="arch-modules"><div class="arch-module orange">TLS自签名</div><div class="arch-module orange">SHA256指纹</div><div class="arch-module purple">Drift数据库</div><div class="arch-module purple">配对记录</div></div></div>
<h3 style="color:rgba(255,255,255,0.6);font-size:14px;margin:24px 0 12px;text-align:center">传输路径选择</h3>
<div class="flow-diagram"><div class="flow-step lan">同一局域网</div><div class="flow-arrow"></div><div class="flow-step lan">LocalSend HTTP</div></div>
<div class="flow-diagram"><div class="flow-step lan">大文件 &gt;100MB</div><div class="flow-arrow"></div><div class="flow-step lan">TCP Socket</div></div>
<div class="flow-diagram"><div class="flow-step remote">不同网络</div><div class="flow-arrow"></div><div class="flow-step remote">WebRTC P2P</div><div class="flow-arrow"></div><div class="flow-step fallback">打洞失败</div><div class="flow-arrow"></div><div class="flow-step fallback">TURN中继</div></div>
<h3 style="color:rgba(255,255,255,0.6);font-size:14px;margin:24px 0 12px;text-align:center">平台兼容性</h3>
<table class="compat-table">
<tr><th>功能</th><th>Android</th><th>iOS</th><th>macOS</th><th>Win</th><th>Linux</th><th>Web</th></tr>
<tr><td>LocalSend HTTP</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">→WS</td></tr>
<tr><td>TCP Socket</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">→WS</td></tr>
<tr><td>WebRTC P2P</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td></tr>
<tr><td>UDP多播</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">→服务器</td></tr>
<tr><td>蓝牙BLE</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="no"></td><td class="no"></td><td class="no"></td></tr>
<tr><td>NFC</td><td class="yes"></td><td class="yes"></td><td class="no"></td><td class="no"></td><td class="no"></td><td class="no"></td></tr>
<tr><td>QR扫描</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">→手动</td></tr>
<tr><td>账户配对</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td></tr>
</table>
</div>
</div>
<div class="phone-frame" id="view-libs" style="height:auto;min-height:844px;overflow-y:auto;border-radius:24px">
<div style="padding:24px 20px;background:linear-gradient(180deg,#0a0a1a 0%,#12122a 100%);min-height:844px">
<h2 style="color:#fff;font-size:20px;font-weight:700;margin-bottom:20px;text-align:center">📦 依赖库清单</h2>
<h3 style="color:rgba(255,45,85,0.8);font-size:13px;font-weight:600;margin-bottom:10px">🆕 新增库</h3>
<div style="padding:0 0 8px">
<div class="lib-item"><span class="emoji">🖥️</span><span class="name">shelf</span><span class="ver">^1.4.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🔀</span><span class="name">shelf_router</span><span class="ver">^1.1.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🌐</span><span class="name">flutter_webrtc</span><span class="ver">^0.10.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🔌</span><span class="name">web_socket_channel</span><span class="ver">^2.4.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🔵</span><span class="name">flutter_blue_plus</span><span class="ver">^1.31.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">📱</span><span class="name">nfc_manager</span><span class="ver">^3.4.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">📷</span><span class="name">mobile_scanner</span><span class="ver">^4.0.0</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🔐</span><span class="name">encrypt</span><span class="ver">^5.0.3</span><span class="badge new">新增</span></div>
<div class="lib-item"><span class="emoji">🔗</span><span class="name">network_info_plus</span><span class="ver">^5.0.0</span><span class="badge new">新增</span></div>
</div>
<h3 style="color:rgba(52,199,89,0.8);font-size:13px;font-weight:600;margin:16px 0 10px">✅ 已有库(复用)</h3>
<div style="padding:0 0 8px">
<div class="lib-item"><span class="emoji">💾</span><span class="name">drift</span><span class="ver">^2.15.0</span><span class="badge exist">已有</span></div>
<div class="lib-item"><span class="emoji">📁</span><span class="name">path_provider</span><span class="ver">^2.1.0</span><span class="badge exist">已有</span></div>
<div class="lib-item"><span class="emoji">🌐</span><span class="name">http</span><span class="ver">^1.2.0</span><span class="badge exist">已有</span></div>
<div class="lib-item"><span class="emoji">🔄</span><span class="name">riverpod</span><span class="ver">^2.5.0</span><span class="badge exist">已有</span></div>
<div class="lib-item"><span class="emoji">🧭</span><span class="name">go_router</span><span class="ver">^14.0.0</span><span class="badge exist">已有</span></div>
<div class="lib-item"><span class="emoji">🖼️</span><span class="name">cached_network_image</span><span class="ver">^3.3.0</span><span class="badge exist">已有</span></div>
</div>
</div>
</div>
<div class="phone-frame" id="view-files" style="height:auto;min-height:844px;overflow-y:auto;border-radius:24px">
<div style="padding:24px 20px;background:linear-gradient(180deg,#0a0a1a 0%,#12122a 100%);min-height:844px">
<h2 style="color:#fff;font-size:20px;font-weight:700;margin-bottom:20px;text-align:center">📄 文件变更清单</h2>
<div class="file-group"><div class="file-group-title">🔧 修改现有文件</div>
<div class="file-item"><span class="check"></span><span class="path">pubspec.yaml</span><span class="desc">新增12个依赖库</span></div>
<div class="file-item"><span class="check"></span><span class="path">app_router.dart</span><span class="desc">添加/file-transfer路由</span></div>
<div class="file-item"><span class="check"></span><span class="path">chat_session.dart</span><span class="desc">新增transfer枚举值</span></div>
<div class="file-item"><span class="check"></span><span class="path">chat_message.dart</span><span class="desc">新增传输相关字段</span></div>
<div class="file-item"><span class="check"></span><span class="path">chat_session_provider.dart</span><span class="desc">添加文件传输助手会话</span></div>
<div class="file-item"><span class="check"></span><span class="path">app_database.dart</span><span class="desc">新增3张传输相关表</span></div>
<div class="file-item"><span class="check"></span><span class="path">inspiration_page.dart</span><span class="desc">会话列表渲染适配</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — 数据模型</div>
<div class="file-item"><span class="check"></span><span class="path">transfer_device.dart</span><span class="desc">设备模型</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_task.dart</span><span class="desc">传输任务模型</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_message.dart</span><span class="desc">传输消息模型</span></div>
<div class="file-item"><span class="check"></span><span class="path">pairing_info.dart</span><span class="desc">配对信息模型</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — Provider</div>
<div class="file-item"><span class="check"></span><span class="path">transfer_provider.dart</span><span class="desc">传输状态管理</span></div>
<div class="file-item"><span class="check"></span><span class="path">device_discovery_provider.dart</span><span class="desc">设备发现状态</span></div>
<div class="file-item"><span class="check"></span><span class="path">pairing_provider.dart</span><span class="desc">配对流程状态</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — 传输服务</div>
<div class="file-item"><span class="check"></span><span class="path">transport_router.dart</span><span class="desc">传输路径选择器</span></div>
<div class="file-item"><span class="check"></span><span class="path">localsend_service.dart</span><span class="desc">LocalSend协议实现</span></div>
<div class="file-item"><span class="check"></span><span class="path">webrtc_service.dart</span><span class="desc">WebRTC P2P传输</span></div>
<div class="file-item"><span class="check"></span><span class="path">tcp_socket_service.dart</span><span class="desc">TCP大文件传输</span></div>
<div class="file-item"><span class="check"></span><span class="path">signaling_service.dart</span><span class="desc">WebSocket信令</span></div>
<div class="file-item"><span class="check"></span><span class="path">usb_transport_service.dart</span><span class="desc">USB有线传输</span></div>
<div class="file-item"><span class="check"></span><span class="path">cache_manager_service.dart</span><span class="desc">缓存管理服务</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — 配对服务</div>
<div class="file-item"><span class="check"></span><span class="path">lan_discovery_service.dart</span><span class="desc">UDP多播局域网发现</span></div>
<div class="file-item"><span class="check"></span><span class="path">bluetooth_pairing_service.dart</span><span class="desc">蓝牙BLE配对</span></div>
<div class="file-item"><span class="check"></span><span class="path">nfc_pairing_service.dart</span><span class="desc">NFC触碰配对</span></div>
<div class="file-item"><span class="check"></span><span class="path">qr_pairing_service.dart</span><span class="desc">QR码配对</span></div>
<div class="file-item"><span class="check"></span><span class="path">account_pairing_service.dart</span><span class="desc">账户配对</span></div>
<div class="file-item"><span class="check"></span><span class="path">manual_ip_service.dart</span><span class="desc">手动IP直连</span></div>
<div class="file-item"><span class="check"></span><span class="path">usb_discovery_service.dart</span><span class="desc">USB有线配对发现</span></div>
<div class="file-item"><span class="check"></span><span class="path">hotspot_service.dart</span><span class="desc">WiFi热点创建/发现</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — UI组件</div>
<div class="file-item"><span class="check"></span><span class="path">file_transfer_page.dart</span><span class="desc">传输助手主页</span></div>
<div class="file-item"><span class="check"></span><span class="path">pairing_page.dart</span><span class="desc">配对发现页</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_chat_page.dart</span><span class="desc">传输对话页</span></div>
<div class="file-item"><span class="check"></span><span class="path">device_card.dart</span><span class="desc">设备卡片</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_bubble.dart</span><span class="desc">传输消息气泡</span></div>
<div class="file-item"><span class="check"></span><span class="path">file_preview_bubble.dart</span><span class="desc">文件预览气泡</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_progress_bar.dart</span><span class="desc">传输进度条</span></div>
<div class="file-item"><span class="check"></span><span class="path">pairing_method_selector.dart</span><span class="desc">配对方式选择器</span></div>
<div class="file-item"><span class="check"></span><span class="path">transfer_settings_page.dart</span><span class="desc">传输设置页</span></div>
<div class="file-item"><span class="check"></span><span class="path">recent_messages_section.dart</span><span class="desc">最新消息区组件</span></div>
<div class="file-item"><span class="check"></span><span class="path">drop_zone_widget.dart</span><span class="desc">桌面端拖拽区域</span></div>
<div class="file-item"><span class="check"></span><span class="path">offline_mode_banner.dart</span><span class="desc">无联网模式横幅</span></div>
<div class="file-item"><span class="check"></span><span class="path">usb_pairing_sheet.dart</span><span class="desc">USB配对面板</span></div>
<div class="file-item"><span class="check"></span><span class="path">hotspot_guide_sheet.dart</span><span class="desc">热点引导面板</span></div>
<div class="file-item"><span class="check"></span><span class="path">cache_manager_section.dart</span><span class="desc">缓存管理组件</span></div>
</div>
<div class="file-group"><div class="file-group-title">🆕 新增 — 服务器端</div>
<div class="file-item"><span class="check"></span><span class="path">server/signaling.php</span><span class="desc">WebSocket信令服务</span></div>
<div class="file-item"><span class="check"></span><span class="path">server/turn.php</span><span class="desc">TURN凭据发放</span></div>
<div class="file-item"><span class="check"></span><span class="path">server/pairing.php</span><span class="desc">账户配对管理</span></div>
<div class="file-item"><span class="check"></span><span class="path">server/devices.php</span><span class="desc">设备信息存储</span></div>
</div>
</div>
</div>
<div class="phone-frame" id="view-arch" style="height:auto;min-height:844px;overflow-y:auto;border-radius:24px">
<div style="padding:24px 20px;background:linear-gradient(180deg,#0a0a1a 0%,#12122a 100%);min-height:844px">
<h2 style="color:#fff;font-size:20px;font-weight:700;margin-bottom:20px;text-align:center">🏗️ 架构设计</h2>
<div class="arch-layer" style="animation-delay:0.1s">
<div class="arch-layer-title">🎨 UI层 — 文件传输助手</div>
<div class="arch-modules">
<span class="arch-module purple">配对发现页</span>
<span class="arch-module purple">传输对话页</span>
<span class="arch-module purple">传输设置页</span>
<span class="arch-module purple">设备卡片</span>
<span class="arch-module purple">消息气泡</span>
<span class="arch-module purple">进度条</span>
</div>
</div>
<div class="arch-layer" style="animation-delay:0.2s">
<div class="arch-layer-title">🧠 管理层 — TransferManager</div>
<div class="arch-modules">
<span class="arch-module blue">TransportRouter</span>
<span class="arch-module blue">DiscoveryManager</span>
<span class="arch-module blue">PairingManager</span>
<span class="arch-module blue">TransferProvider</span>
<span class="arch-module blue">DeviceProvider</span>
</div>
</div>
<div class="arch-layer" style="animation-delay:0.3s">
<div class="arch-layer-title">🚀 传输层 — 混合传输</div>
<div class="arch-modules">
<span class="arch-module green">LocalSend HTTP</span>
<span class="arch-module green">TCP Socket</span>
<span class="arch-module green">WebRTC P2P</span>
<span class="arch-module orange">WebRTC TURN</span>
</div>
</div>
<div class="arch-layer" style="animation-delay:0.4s">
<div class="arch-layer-title">📡 发现层 — 设备配对</div>
<div class="arch-modules">
<span class="arch-module teal">UDP多播</span>
<span class="arch-module teal">mDNS</span>
<span class="arch-module teal">蓝牙BLE</span>
<span class="arch-module teal">NFC</span>
<span class="arch-module teal">QR码</span>
<span class="arch-module teal">账户</span>
<span class="arch-module teal">手动IP</span>
</div>
</div>
<div class="arch-layer" style="animation-delay:0.5s">
<div class="arch-layer-title">🔒 安全层 — 加密认证</div>
<div class="arch-modules">
<span class="arch-module pink">TLS自签名</span>
<span class="arch-module pink">设备指纹SHA256</span>
<span class="arch-module pink">DTLS(WebRTC)</span>
<span class="arch-module pink">文件校验SHA256</span>
</div>
</div>
<div style="margin-top:20px">
<h3 style="color:rgba(255,255,255,0.6);font-size:14px;font-weight:600;margin-bottom:12px">🔄 传输路径选择</h3>
<div class="flow-diagram">
<div class="flow-step lan">同局域网?</div>
<span class="flow-arrow"></span>
<div class="flow-step lan">LocalSend HTTP</div>
<span class="flow-arrow"></span>
<div class="flow-step lan">文件&gt;100MB?</div>
<span class="flow-arrow"></span>
<div class="flow-step lan">TCP Socket</div>
</div>
<div class="flow-diagram" style="margin-top:8px">
<div class="flow-step remote">不同网络?</div>
<span class="flow-arrow"></span>
<div class="flow-step remote">WebRTC P2P</div>
<span class="flow-arrow"></span>
<div class="flow-step fallback">NAT打洞失败?</div>
<span class="flow-arrow"></span>
<div class="flow-step fallback">TURN中继</div>
</div>
<div class="flow-diagram" style="margin-top:8px">
<div class="flow-step" style="background:rgba(255,149,0,0.2);border-color:rgba(255,149,0,0.4)">🔌 USB连接?</div>
<span class="flow-arrow"></span>
<div class="flow-step" style="background:rgba(255,149,0,0.2);border-color:rgba(255,149,0,0.4)">USB网络共享</div>
<span class="flow-arrow"></span>
<div class="flow-step lan">LocalSend/TCP</div>
</div>
<div class="flow-diagram" style="margin-top:8px">
<div class="flow-step" style="background:rgba(255,149,0,0.2);border-color:rgba(255,149,0,0.4)">📶 无网络?</div>
<span class="flow-arrow"></span>
<div class="flow-step" style="background:rgba(255,149,0,0.2);border-color:rgba(255,149,0,0.4)">WiFi热点</div>
<span class="flow-arrow"></span>
<div class="flow-step lan">LocalSend/TCP</div>
</div>
</div>
<div style="margin-top:20px">
<h3 style="color:rgba(255,255,255,0.6);font-size:14px;font-weight:600;margin-bottom:12px">📱 平台兼容性</h3>
<table class="compat-table">
<tr><th>功能</th><th>Android</th><th>iOS</th><th>macOS</th><th>Win</th><th>Linux</th><th>Web</th></tr>
<tr><td>LocalSend</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">WS</td></tr>
<tr><td>TCP</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="no"></td></tr>
<tr><td>WebRTC</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td></tr>
<tr><td>UDP发现</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">服务器</td></tr>
<tr><td>蓝牙BLE</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="no"></td><td class="no"></td><td class="no"></td></tr>
<tr><td>NFC</td><td class="yes"></td><td class="degrade">仅读</td><td class="no"></td><td class="no"></td><td class="no"></td><td class="no"></td></tr>
<tr><td>QR扫描</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="degrade">手动</td></tr>
<tr><td>账户配对</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td></tr>
<tr><td>USB有线</td><td class="yes"></td><td class="degrade">受限</td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="no"></td></tr>
<tr><td>WiFi热点</td><td class="yes"></td><td class="degrade">手动</td><td class="degrade">手动</td><td class="yes"></td><td class="yes"></td><td class="no"></td></tr>
<tr><td>桌面拖拽</td><td class="no"></td><td class="no"></td><td class="yes"></td><td class="yes"></td><td class="yes"></td><td class="no"></td></tr>
</table>
</div>
</div>
</div>
<div class="phone-frame" id="view-libs" style="height:auto;min-height:844px;overflow-y:auto;border-radius:24px">
<div style="padding:24px 20px;background:linear-gradient(180deg,#0a0a1a 0%,#12122a 100%);min-height:844px">
<h2 style="color:#fff;font-size:20px;font-weight:700;margin-bottom:20px;text-align:center">📦 依赖库清单</h2>
<h3 style="color:rgba(255,45,85,0.8);font-size:13px;font-weight:700;margin-bottom:10px;padding-left:4px">🆕 新增依赖</h3>
<div class="lib-item" style="animation-delay:0.05s"><span class="emoji">🌐</span><span class="name">shelf</span><span class="ver">^1.4.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.1s"><span class="emoji">🛤️</span><span class="name">shelf_router</span><span class="ver">^1.1.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.15s"><span class="emoji">📡</span><span class="name">network_info_plus</span><span class="ver">^6.1.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.2s"><span class="emoji">🔗</span><span class="name">flutter_webrtc</span><span class="ver">^0.12.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.25s"><span class="emoji">🔌</span><span class="name">web_socket_channel</span><span class="ver">^3.0.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.3s"><span class="emoji">🔵</span><span class="name">flutter_blue_plus</span><span class="ver">^1.32.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.35s"><span class="emoji">📱</span><span class="name">nfc_manager</span><span class="ver">^3.5.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.4s"><span class="emoji">📎</span><span class="name">mime</span><span class="ver">^2.0.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.45s"><span class="emoji">📷</span><span class="name">mobile_scanner</span><span class="ver">^6.0.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.47s"><span class="emoji">🔌</span><span class="name">usb_serial</span><span class="ver">^1.0.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.49s"><span class="emoji">📶</span><span class="name">wifi_hotspot</span><span class="ver">^0.4.0</span><span class="badge new">新增</span></div>
<div class="lib-item" style="animation-delay:0.51s"><span class="emoji">📂</span><span class="name">desktop_drop</span><span class="ver">^0.7.1</span><span class="badge new">新增</span></div>
<h3 style="color:rgba(52,199,89,0.8);font-size:13px;font-weight:700;margin:16px 0 10px;padding-left:4px">♻️ 已有可复用</h3>
<div class="lib-item" style="animation-delay:0.5s"><span class="emoji">🌍</span><span class="name">dio</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.55s"><span class="emoji">📶</span><span class="name">connectivity_plus</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.6s"><span class="emoji"></span><span class="name">device_info_plus</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.65s"><span class="emoji">🔐</span><span class="name">permission_handler</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.7s"><span class="emoji">📂</span><span class="name">file_picker</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.75s"><span class="emoji">🖼️</span><span class="name">image_picker</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.8s"><span class="emoji">📁</span><span class="name">path_provider</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.85s"><span class="emoji">🔑</span><span class="name">uuid</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.9s"><span class="emoji">🔒</span><span class="name">crypto</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:0.95s"><span class="emoji">🗄️</span><span class="name">drift</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:1.0s"><span class="emoji">☁️</span><span class="name">supabase_flutter</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:1.05s"><span class="emoji">🏷️</span><span class="name">qr_flutter</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
<div class="lib-item" style="animation-delay:1.1s"><span class="emoji">💾</span><span class="name">flutter_secure_storage</span><span class="ver">已有</span><span class="badge exist">已有</span></div>
</div>
</div>
<script>
function switchView(view) {
document.querySelectorAll('.phone-frame').forEach(f => f.classList.remove('active'));
document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
const frame = document.getElementById('view-' + view);
if (frame) {
frame.classList.add('active');
frame.style.animation = 'none';
frame.offsetHeight;
frame.style.animation = 'phoneAppear 0.6s ease';
}
const tabs = document.querySelectorAll('.tab-btn');
const viewMap = ['inspiration','transfer','chat','pairing','settings','arch','libs','files'];
const idx = viewMap.indexOf(view);
if (idx >= 0 && tabs[idx]) tabs[idx].classList.add('active');
}
document.addEventListener('DOMContentLoaded', function() {
const progressBars = document.querySelectorAll('.progress-fill');
progressBars.forEach(bar => {
const targetWidth = bar.style.width;
bar.style.width = '0%';
setTimeout(() => { bar.style.transition = 'width 2s ease'; bar.style.width = targetWidth; }, 500);
});
});
</script>
<!-- 开发归档列表 -->
<div style="max-width:1200px;margin:40px auto;padding:0 24px;">
<h2 style="font-size:24px;font-weight:700;margin-bottom:16px;">📋 开发归档列表</h2>
<table style="width:100%;border-collapse:collapse;font-size:14px;">
<thead>
<tr style="background:var(--bg-secondary);"><th style="padding:8px;text-align:left;">模块</th><th style="padding:8px;text-align:left;">说明</th><th style="padding:8px;">状态</th></tr>
</thead>
<tbody>
<tr><td style="padding:8px;">数据模型层</td><td style="padding:8px;">枚举/设备/任务/消息模型</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">数据库层</td><td style="padding:8px;">Drift表定义+CRUD</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">LocalSend协议</td><td style="padding:8px;">UDP多播+HTTP REST</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">TCP Socket</td><td style="padding:8px;">大文件流式传输</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">WebRTC P2P</td><td style="padding:8px;">异地组网传输</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">USB有线传输</td><td style="padding:8px;">USB网络共享</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">传输路由器</td><td style="padding:8px;">自动选择最优路径</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">设备发现服务</td><td style="padding:8px;">LAN/蓝牙/NFC/QR/USB</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">配对服务</td><td style="padding:8px;">统一配对管理</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">信令服务</td><td style="padding:8px;">WebSocket信令</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">Provider状态管理</td><td style="padding:8px;">传输/发现/配对Provider</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">UI页面</td><td style="padding:8px;">主页/对话/配对/设置</td><td style="padding:8px;text-align:center;"></td></tr>
<tr><td style="padding:8px;">集成路由</td><td style="padding:8px;">灵感页面+路由注册</td><td style="padding:8px;text-align:center;"></td></tr>
</tbody>
</table>
</div>
</body>
</html>