Files
xianyan/docs/toolsapi/public/transfer.html
Developer 228095f80a chore: 完成v6.7.0版本迭代更新
本次更新涵盖多个功能模块的优化与新增:
1. 新增Wi-Fi直连配对方式与协作画布模块
2. 完成设备管理重命名API与前端适配
3. 优化日签卡片空数据保护与UI细节
4. 新增剪贴板工具与每日运势会话
5. 修复应用锁恢复、语音消息录制等已知问题
6. 完善文件传输统计与配对逻辑
7. 更新安卓权限配置与iOS隐私描述
8. 新增自动化测试脚本与文档
9. 清理旧版审计报告与测试文件
2026-05-14 05:35:18 +08:00

194 lines
9.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
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.
<!--
闲言传输 — Web双向互传页面
创建时间: 2026-05-14
更新时间: 2026-05-14
名称: transfer.html
作用: 支持取件码接收、账号登录跨网络传输、局域网传输、双向文本消息
上次更新: 提取CSS到transfer.css、JS到transfer.jsHTML仅保留结构
-->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>闲言传输 — Web传输</title>
<link rel="stylesheet" href="transfer.css">
</head>
<body>
<div class="header">
<h1>📦 闲言传输</h1>
<p>跨设备安全传输,端到端加密</p>
</div>
<div class="tab-bar">
<button class="tab-item active" onclick="switchTab('pickup')">🔑 取件码</button>
<button class="tab-item" onclick="switchTab('account')">👤 账号登录</button>
<button class="tab-item" onclick="switchTab('lan')">📡 局域网</button>
</div>
<div class="card">
<div class="tab-content active" id="tab-pickup">
<div class="input-group">
<label>取件码</label>
<input type="text" class="code-input" id="roomCode" maxlength="6" placeholder="输入6位码" autocomplete="off">
</div>
<button class="btn btn-primary" id="connectBtn" onclick="connectRoom()">连接接收</button>
<div class="status" id="pickupStatus"></div>
<div class="files-list" id="pickupFilesList"></div>
</div>
<div class="tab-content" id="tab-account">
<div id="loginForm">
<div class="input-group">
<label>用户名</label>
<input type="text" class="text-input" id="loginUsername" placeholder="请输入用户名" autocomplete="username">
</div>
<div class="input-group">
<label>密码</label>
<input type="password" class="text-input" id="loginPassword" placeholder="请输入密码" autocomplete="current-password">
</div>
<button class="btn btn-primary" id="loginBtn" onclick="loginWithAccount()">登录</button>
<div class="status" id="loginStatus"></div>
</div>
<div id="accountPanel" style="display:none">
<div class="user-info">
<div class="user-avatar" id="userAvatar"></div>
<div class="user-meta">
<div class="user-name" id="userName"></div>
<div class="user-id" id="userIdDisplay"></div>
</div>
<button class="logout-btn" onclick="logoutAccount()">退出</button>
</div>
<div class="login-status online" id="connectionStatus">
<span>🟢</span>
<span>信令服务已连接</span>
</div>
<div style="display:flex;gap:8px;margin-bottom:16px">
<button class="btn btn-secondary btn-sm" onclick="discoverDevices()" style="flex:1">🔍 发现设备</button>
</div>
<div id="deviceListContainer">
<div class="empty-state">
<div class="icon">📱</div>
<div class="text">点击"发现设备"查找同账号在线设备</div>
</div>
</div>
<div class="divider"></div>
<div id="sendFileSection" style="display:none">
<div style="font-size:15px;font-weight:600;margin-bottom:12px">📤 发送文件到 <span id="targetDeviceName"></span></div>
<div class="file-select-area" onclick="document.getElementById('accountFileInput').click()">
<div class="icon">📁</div>
<div class="text">点击选择文件或拖拽到此处</div>
<div class="hint">支持任意类型文件,小文件(≤10MB)走中转大文件走P2P</div>
</div>
<input type="file" id="accountFileInput" style="display:none" onchange="onAccountFileSelected(event)">
<div id="selectedFilePreview"></div>
<button class="btn btn-primary" id="sendFileBtn" onclick="sendSelectedFile()" style="display:none">发送文件</button>
<div class="chat-container" id="accountChatContainer">
<div class="chat-header">
<span class="emoji" id="chatDeviceEmoji">📱</span>
<span class="name" id="chatDeviceName">设备</span>
<button class="close-chat" onclick="closeChat('account')"></button>
</div>
<div class="chat-messages" id="accountChatMessages"></div>
<div class="chat-input-area">
<input type="text" class="chat-input" id="accountChatInput" placeholder="输入消息..." onkeydown="if(event.key==='Enter')sendChatMessage('account')">
<button class="chat-send-btn" onclick="sendChatMessage('account')"></button>
</div>
</div>
</div>
</div>
</div>
<div class="tab-content" id="tab-lan">
<div style="display:flex;gap:8px;margin-bottom:16px">
<button class="btn btn-secondary btn-sm" id="lanScanBtn" onclick="startLanScan()" style="flex:1">🔍 扫描局域网设备</button>
</div>
<div class="lan-scan-status idle" id="lanScanStatus">
<span>📡</span>
<span id="lanScanText">点击扫描发现同WiFi下的设备</span>
<div class="scan-progress" id="lanScanProgress" style="display:none">
<div class="scan-progress-bar" id="lanScanProgressBar" style="width:0%"></div>
</div>
</div>
<div id="lanDeviceListContainer">
<div class="empty-state">
<div class="icon">📡</div>
<div class="text">确保设备处于同一WiFi网络下<br>自动发现局域网内设备,零配置直连传输</div>
</div>
</div>
<div id="lanSendSection" style="display:none">
<div class="divider"></div>
<div style="font-size:15px;font-weight:600;margin-bottom:12px">📤 发送文件到 <span id="lanTargetName"></span></div>
<div class="file-select-area" onclick="document.getElementById('lanFileInput').click()">
<div class="icon">📁</div>
<div class="text">点击选择文件或拖拽到此处</div>
<div class="hint">局域网直连传输,速度最快</div>
</div>
<input type="file" id="lanFileInput" style="display:none" onchange="onLanFileSelected(event)">
<div id="lanSelectedFilePreview"></div>
<button class="btn btn-primary" id="lanSendFileBtn" onclick="sendLanFile()" style="display:none">发送文件</button>
<div class="chat-container" id="lanChatContainer">
<div class="chat-header">
<span class="emoji" id="lanChatDeviceEmoji">📱</span>
<span class="name" id="lanChatDeviceName">设备</span>
<button class="close-chat" onclick="closeChat('lan')"></button>
</div>
<div class="chat-messages" id="lanChatMessages"></div>
<div class="chat-input-area">
<input type="text" class="chat-input" id="lanChatInput" placeholder="输入消息..." onkeydown="if(event.key==='Enter')sendChatMessage('lan')">
<button class="chat-send-btn" onclick="sendChatMessage('lan')"></button>
</div>
</div>
</div>
</div>
</div>
<div class="transfer-overlay" id="transferOverlay">
<div class="transfer-card">
<div class="title" id="transferTitle">正在传输</div>
<div class="subtitle" id="transferSubtitle"></div>
<div class="transfer-ring">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="52" fill="none" stroke="#E5E5EA" stroke-width="8"/>
<circle cx="60" cy="60" r="52" fill="none" stroke="#007AFF" stroke-width="8"
stroke-dasharray="326.73" stroke-dashoffset="326.73" stroke-linecap="round" id="transferCircle"/>
</svg>
<div class="pct" id="transferPct">0%</div>
</div>
<div class="transfer-stats">
<div class="transfer-stat">
<div class="label">速度</div>
<div class="value" id="transferSpeed"></div>
</div>
<div class="transfer-stat">
<div class="label">已传输</div>
<div class="value" id="transferTransferred">0 B</div>
</div>
<div class="transfer-stat">
<div class="label">总大小</div>
<div class="value" id="transferTotal">0 B</div>
</div>
</div>
<button class="btn btn-danger" onclick="cancelTransfer()">取消传输</button>
</div>
</div>
<div class="footer">
闲言APP · 端到端加密 · 数据不经过服务器
</div>
<script src="transfer.js"></script>
</body>
</html>