### 详细变更:
1. **文档与配置**:更新AGENTS.md添加命令超时约束,升级Rive依赖至0.14.7并替换平台插件引用
2. **UI优化**:重构AppInfo页面布局、移除图表冗余配置、锁定部分系统设置项
3. **功能增强**:
- 新增工具面板拖拽状态管理与介绍弹窗
- 新增进度页面编辑/重排/清空用户进度功能
- 新增摇一摇路由作用域拦截逻辑
4. **体验优化**:
- 统一外部链接跳转弹窗,添加文件打开确认逻辑
- 修复设备卡片IP溢出、Android权限声明问题
- 后台任务初始化增加协议校验
5. **代码重构**:拆分工具面板配置、拖拽逻辑与动画参数,优化状态管理代码
6. **工具脚本**:新增协议文件上传脚本
508 lines
19 KiB
HTML
508 lines
19 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>软件权限使用说明 - 闲言APP</title>
|
||
<style>
|
||
:root {
|
||
--primary: #6C5CE7;
|
||
--primary-light: #A29BFE;
|
||
--primary-dark: #5A4BD1;
|
||
--bg: #F2F2F7;
|
||
--bg-card: #FFFFFF;
|
||
--text: #1C1C1E;
|
||
--text-secondary: #8E8E93;
|
||
--text-tertiary: #AEAEB2;
|
||
--border: #E5E5EA;
|
||
--highlight-bg: rgba(108, 92, 231, 0.08);
|
||
--shadow-sm: 0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.06);
|
||
--shadow-md: 0 4px 12px rgba(0,0,0,0.08);
|
||
--radius-sm: 8px;
|
||
--radius-md: 12px;
|
||
--radius-lg: 16px;
|
||
--radius-xl: 20px;
|
||
--font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||
}
|
||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
body {
|
||
font-family: var(--font-family);
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
line-height: 1.8;
|
||
-webkit-font-smoothing: antialiased;
|
||
}
|
||
.lang-switch {
|
||
position: fixed;
|
||
top: 16px;
|
||
right: 16px;
|
||
z-index: 100;
|
||
display: flex;
|
||
background: rgba(255,255,255,0.85);
|
||
backdrop-filter: blur(20px);
|
||
-webkit-backdrop-filter: blur(20px);
|
||
border-radius: 20px;
|
||
padding: 3px;
|
||
box-shadow: 0 2px 12px rgba(0,0,0,0.1);
|
||
border: 0.5px solid rgba(108, 92, 231, 0.15);
|
||
}
|
||
.lang-btn {
|
||
padding: 6px 14px;
|
||
border: none;
|
||
background: transparent;
|
||
color: var(--text-secondary);
|
||
font-size: 13px;
|
||
font-weight: 500;
|
||
cursor: pointer;
|
||
border-radius: 17px;
|
||
transition: all 0.25s ease;
|
||
font-family: var(--font-family);
|
||
}
|
||
.lang-btn.active {
|
||
background: var(--primary);
|
||
color: #FFF;
|
||
box-shadow: 0 2px 8px rgba(108, 92, 231, 0.3);
|
||
}
|
||
.lang-btn:hover:not(.active) {
|
||
background: rgba(108, 92, 231, 0.08);
|
||
color: var(--primary);
|
||
}
|
||
.header {
|
||
background: linear-gradient(135deg, #6C5CE7 0%, #5A4BD1 50%, #4A3DB5 100%);
|
||
padding: 48px 20px 44px;
|
||
text-align: center;
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
.header::before {
|
||
content: '';
|
||
position: absolute;
|
||
top: -50%;
|
||
left: -50%;
|
||
width: 200%;
|
||
height: 200%;
|
||
background: radial-gradient(circle at 30% 50%, rgba(255,255,255,0.1) 0%, transparent 50%);
|
||
pointer-events: none;
|
||
}
|
||
.header::after {
|
||
content: '';
|
||
position: absolute;
|
||
bottom: 0;
|
||
left: 0;
|
||
right: 0;
|
||
height: 32px;
|
||
background: var(--bg);
|
||
border-radius: var(--radius-xl) var(--radius-xl) 0 0;
|
||
}
|
||
.header-icon { font-size: 40px; margin-bottom: 10px; display: block; }
|
||
.header h1 { color: #FFF; font-size: 24px; font-weight: 700; letter-spacing: -0.3px; margin-bottom: 4px; }
|
||
.header p { color: rgba(255,255,255,0.75); font-size: 14px; }
|
||
.container { max-width: 800px; margin: 0 auto; padding: 20px 16px 40px; }
|
||
.content-card {
|
||
background: var(--bg-card);
|
||
border-radius: var(--radius-lg);
|
||
padding: 28px 24px;
|
||
margin-bottom: 20px;
|
||
box-shadow: var(--shadow-sm);
|
||
}
|
||
h1 {
|
||
font-size: 22px;
|
||
font-weight: 700;
|
||
color: var(--text);
|
||
margin: 28px 0 12px;
|
||
}
|
||
h2 {
|
||
font-size: 20px;
|
||
font-weight: 700;
|
||
color: var(--text);
|
||
margin: 32px 0 16px;
|
||
padding-bottom: 10px;
|
||
border-bottom: 2px solid var(--primary);
|
||
display: inline-block;
|
||
}
|
||
h3 {
|
||
font-size: 17px;
|
||
font-weight: 600;
|
||
color: var(--text);
|
||
margin: 24px 0 12px;
|
||
}
|
||
p {
|
||
font-size: 15px;
|
||
color: var(--text);
|
||
margin-bottom: 12px;
|
||
line-height: 1.8;
|
||
}
|
||
p.note {
|
||
background: rgba(108, 92, 231, 0.06);
|
||
border-left: 3px solid var(--primary);
|
||
padding: 12px 16px;
|
||
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
|
||
margin: 12px 0;
|
||
}
|
||
.highlight {
|
||
color: var(--primary);
|
||
font-weight: 600;
|
||
background: var(--highlight-bg);
|
||
padding: 1px 6px;
|
||
border-radius: 4px;
|
||
}
|
||
.copyright-cert {
|
||
margin: 20px 0;
|
||
text-align: center;
|
||
padding: 20px;
|
||
background: rgba(108, 92, 231, 0.04);
|
||
border-radius: var(--radius-md);
|
||
border: 1px solid rgba(108, 92, 231, 0.12);
|
||
}
|
||
.cert-image {
|
||
max-width: 100%;
|
||
max-height: 500px;
|
||
border-radius: var(--radius-sm);
|
||
box-shadow: var(--shadow-md);
|
||
}
|
||
.cert-caption {
|
||
margin-top: 12px;
|
||
font-size: 14px;
|
||
color: var(--text-secondary);
|
||
font-weight: 500;
|
||
}
|
||
ul {
|
||
list-style: none;
|
||
padding: 0;
|
||
margin: 0 0 16px;
|
||
}
|
||
li {
|
||
font-size: 15px;
|
||
color: var(--text);
|
||
padding: 6px 0 6px 20px;
|
||
position: relative;
|
||
line-height: 1.7;
|
||
}
|
||
li::before {
|
||
content: '\2022';
|
||
color: var(--primary);
|
||
font-weight: 700;
|
||
position: absolute;
|
||
left: 4px;
|
||
top: 6px;
|
||
}
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin: 16px 0;
|
||
font-size: 14px;
|
||
}
|
||
th {
|
||
background: var(--primary);
|
||
color: #FFF;
|
||
padding: 10px 12px;
|
||
text-align: left;
|
||
font-weight: 600;
|
||
font-size: 13px;
|
||
}
|
||
td {
|
||
padding: 10px 12px;
|
||
border-bottom: 0.5px solid var(--border);
|
||
line-height: 1.6;
|
||
}
|
||
tr:hover td {
|
||
background: rgba(108, 92, 231, 0.04);
|
||
}
|
||
.back-link {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
color: var(--primary);
|
||
text-decoration: none;
|
||
font-size: 15px;
|
||
font-weight: 500;
|
||
padding: 12px 0;
|
||
transition: opacity 0.2s;
|
||
}
|
||
.back-link:hover { opacity: 0.7; }
|
||
.footer {
|
||
text-align: center;
|
||
padding: 24px 20px 40px;
|
||
color: var(--text-secondary);
|
||
font-size: 13px;
|
||
line-height: 1.8;
|
||
border-top: 0.5px solid var(--border);
|
||
margin-top: 20px;
|
||
}
|
||
.footer .company { font-weight: 500; color: var(--text); margin-bottom: 4px; }
|
||
@media (max-width: 640px) {
|
||
.lang-switch { top: 10px; right: 10px; }
|
||
.lang-btn { padding: 5px 10px; font-size: 12px; }
|
||
.header { padding: 40px 16px 36px; }
|
||
.header h1 { font-size: 20px; }
|
||
.container { padding: 16px 12px 32px; }
|
||
.content-card { padding: 20px 16px; }
|
||
h2 { font-size: 18px; }
|
||
h3 { font-size: 16px; }
|
||
p, li { font-size: 14px; }
|
||
table { font-size: 12px; }
|
||
th, td { padding: 8px 6px; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="lang-switch">
|
||
<button class="lang-btn active" onclick="switchLang('zh')" id="btn-zh">中文</button>
|
||
<button class="lang-btn" onclick="switchLang('en')" id="btn-en">EN</button>
|
||
</div>
|
||
|
||
<div class="header">
|
||
<span class="header-icon">🔧</span>
|
||
<h1 id="header-title">软件权限使用说明</h1>
|
||
<p id="header-subtitle">软件所需权限及使用目的说明</p>
|
||
</div>
|
||
|
||
<div class="container">
|
||
<div class="content-card">
|
||
<div id="content-zh" class="lang-content">
|
||
<p><strong>闲言APP</strong> 软件权限使用说明</p>
|
||
<p>版本号:V6.5</p>
|
||
<p>更新日期:2026年5月20日</p>
|
||
<p>生效日期:2026年5月21日</p>
|
||
<p>为保障<strong>闲言APP</strong>各项功能的正常使用,我们可能需要向您申请以下设备权限。我们严格遵循<span class="highlight">最小必要原则</span>,仅申请实现功能所必需的权限,并明确告知每项权限的使用目的。</p>
|
||
<h2>一、相机权限</h2>
|
||
<h3>1.1 权限说明:用于拍照和扫描功能</h3>
|
||
<h3>1.2 使用场景:</h3>
|
||
<ul>
|
||
<li>拍照添加图片到笔记或文章</li>
|
||
<li>OCR文字识别扫描</li>
|
||
<li>二维码扫描登录</li>
|
||
<li>文件传输助手中的扫码配对</li>
|
||
</ul>
|
||
<h3>1.3 权限控制:您可随时在系统设置中关闭此权限,关闭后相关功能将不可用</h3>
|
||
<h2>二、相册/存储权限</h2>
|
||
<h3>2.1 权限说明:用于读取和保存图片文件</h3>
|
||
<h3>2.2 使用场景:</h3>
|
||
<ul>
|
||
<li>选择图片制作卡片或壁纸</li>
|
||
<li>保存创作的卡片到相册</li>
|
||
<li>文件传输助手中的文件收发</li>
|
||
<li>头像设置</li>
|
||
</ul>
|
||
<h3>2.3 权限控制:您可随时在系统设置中关闭此权限,关闭后相关功能将不可用</h3>
|
||
<h2>三、通知权限</h2>
|
||
<h3>3.1 权限说明:用于推送消息通知</h3>
|
||
<h3>3.2 使用场景:</h3>
|
||
<ul>
|
||
<li>每日推荐句子推送</li>
|
||
<li>签到提醒</li>
|
||
<li>系统公告</li>
|
||
<li>文件传输通知</li>
|
||
<li>互动消息通知</li>
|
||
</ul>
|
||
<h3>3.3 权限控制:您可在应用内"通知设置"中自定义通知类型,也可在系统设置中关闭通知权限</h3>
|
||
<h2>四、位置权限</h2>
|
||
<h3>4.1 权限说明:用于获取城市级别位置信息</h3>
|
||
<h3>4.2 使用场景:</h3>
|
||
<ul>
|
||
<li>天气信息获取(仅需城市级别位置)</li>
|
||
<li>节气提醒</li>
|
||
<li>文件传输助手中的局域网设备发现</li>
|
||
</ul>
|
||
<h3>4.3 权限控制:</h3>
|
||
<ul>
|
||
<li>我们仅请求<span class="highlight">粗略位置权限</span>,不请求精确位置权限</li>
|
||
<li>您可随时在系统设置中关闭此权限</li>
|
||
<li>关闭后天气功能需手动选择城市</li>
|
||
</ul>
|
||
<h2>五、蓝牙权限</h2>
|
||
<h3>5.1 权限说明:用于蓝牙设备发现和文件传输</h3>
|
||
<h3>5.2 使用场景:</h3>
|
||
<ul>
|
||
<li>文件传输助手中的蓝牙配对传输</li>
|
||
<li>近距离设备发现</li>
|
||
</ul>
|
||
<h3>5.3 权限控制:您可随时在系统设置中关闭此权限,关闭后蓝牙传输功能将不可用</h3>
|
||
<h2>六、附近设备权限</h2>
|
||
<h3>6.1 权限说明:用于局域网设备发现和通信</h3>
|
||
<h3>6.2 使用场景:</h3>
|
||
<ul>
|
||
<li>文件传输助手中的局域网设备发现</li>
|
||
<li>局域网文件传输</li>
|
||
</ul>
|
||
<h3>6.3 权限控制:您可随时在系统设置中关闭此权限,关闭后局域网传输功能将不可用</h3>
|
||
<h2>七、网络权限</h2>
|
||
<h3>7.1 权限说明:用于网络通信</h3>
|
||
<h3>7.2 使用场景:</h3>
|
||
<ul>
|
||
<li>内容加载与同步</li>
|
||
<li>AI对话功能(规划中)</li>
|
||
<li>数据云同步</li>
|
||
<li>文件传输</li>
|
||
</ul>
|
||
<h3>7.3 说明:网络权限为应用基础权限,关闭后大部分功能将不可用</h3>
|
||
<h2>八、权限管理原则</h2>
|
||
<h3>8.1 <span class="highlight">最小必要原则</span>:我们仅申请实现功能所必需的最少权限</h3>
|
||
<h3>8.2 <span class="highlight">知情同意原则</span>:申请权限时将明确告知使用目的</h3>
|
||
<h3>8.3 <span class="highlight">自主控制原则</span>:您可随时开启或关闭任何权限</h3>
|
||
<h3>8.4 <span class="highlight">安全保护原则</span>:通过权限获取的信息仅用于声明的目的</h3>
|
||
<h2>九、权限变更</h2>
|
||
<p>如我们申请新的权限,将在应用更新说明中明确告知。您可选择不更新应用以拒绝新权限。</p>
|
||
<h2>十、联系方式</h2>
|
||
<p>如您对权限使用有任何疑问,请联系:</p>
|
||
<ul>
|
||
<li>邮箱:2821981550@qq.com</li>
|
||
<li>应用内:我的 → 关于 → 软件权限</li>
|
||
<li>开发者:**弥勒市朋普镇微风暴网络科技工作室**</li>
|
||
</ul>
|
||
<h2>十一、法律适用与争议解决</h2>
|
||
<h3>11.1 本说明适用<span class="highlight">中华人民共和国法律</span>。</h3>
|
||
<h3>11.2 因本说明产生的争议,双方应友好协商解决;协商不成的,任何一方均可向我们所在地有管辖权的<span class="highlight">人民法院</span>提起诉讼。</h3>
|
||
<p>本协议中任何条款被认定为无效或不可执行的,不影响其他条款的效力。</p>
|
||
</div>
|
||
<div id="content-en" class="lang-content" style="display:none;">
|
||
<p><strong>Xianyan APP</strong> Permission Usage Description</p>
|
||
<p>Version: V6.5</p>
|
||
<p>Updated: May 20, 2026</p>
|
||
<p>Effective: May 21, 2026</p>
|
||
<h2>I. Permission List</h2>
|
||
<h3>1.1 Required Permissions</h3>
|
||
<table><thead><tr>
|
||
<th>Permission</th>
|
||
<th>Purpose</th>
|
||
<th>When Used</th>
|
||
</tr></thead><tbody>
|
||
<tr>
|
||
<td>Internet Access</td>
|
||
<td>Data sync, content loading</td>
|
||
<td>During app use</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Storage</td>
|
||
<td>Save cards, export data</td>
|
||
<td>When using card/export features</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h3>1.2 Optional Permissions</h3>
|
||
<table><thead><tr>
|
||
<th>Permission</th>
|
||
<th>Purpose</th>
|
||
<th>When Used</th>
|
||
<th>If Denied</th>
|
||
</tr></thead><tbody>
|
||
<tr>
|
||
<td>Camera</td>
|
||
<td>Scan QR codes, take photos for cards</td>
|
||
<td>When using scan/card features</td>
|
||
<td>Cannot use related features</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Photo Library</td>
|
||
<td>Select photos for cards</td>
|
||
<td>When creating cards</td>
|
||
<td>Cannot select photos</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Notifications</td>
|
||
<td>Receive push messages</td>
|
||
<td>When enabled by user</td>
|
||
<td>Cannot receive notifications</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Clipboard</td>
|
||
<td>Copy/paste content</td>
|
||
<td>When copying text</td>
|
||
<td>Cannot use copy/paste</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h3>1.3 Permissions Not Requested</h3>
|
||
<ul>
|
||
<li>Location</li>
|
||
<li>Contacts</li>
|
||
<li>Phone</li>
|
||
<li>SMS</li>
|
||
<li>Microphone</li>
|
||
<li>Calendar</li>
|
||
</ul>
|
||
<h2>II. Permission Management</h2>
|
||
<h3>2.1 You can manage app permissions in your device settings</h3>
|
||
<h3>2.2 Denying optional permissions will not affect the use of core features</h3>
|
||
<h3>2.3 We will not request permissions unrelated to app features</h3>
|
||
<h2>III. Background Activity Description</h2>
|
||
<h3>3.1 This app may perform the following activities in the background:</h3>
|
||
<ul>
|
||
<li>Data synchronization (when sync is enabled)</li>
|
||
<li>Push notification reception</li>
|
||
<li>Widget content updates</li>
|
||
</ul>
|
||
<h3>3.2 Background activities consume minimal system resources</h3>
|
||
<h2>IV. Contact Information</h2>
|
||
<ul>
|
||
<li>Email: 2821981550@qq.com</li>
|
||
<li>Mailing address: Dianchi Resort Area, Xishan District, Kunming, Yunnan Province, China (Bijie Subdistrict, Chejiabi No. 513)</li>
|
||
</ul>
|
||
<h2>V. Legal Application and Dispute Resolution</h2>
|
||
<h3>5.1 This description is governed by the laws of the People's Republic of China.</h3>
|
||
<h3>5.2 Disputes shall be resolved through friendly negotiation; if negotiation fails, either party may file a lawsuit with the People's Court having jurisdiction over our location.</h3>
|
||
<p>If any provision of this agreement is found to be invalid or unenforceable, the validity of the remaining provisions shall not be affected.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<a href="index.html" class="back-link" id="back-link">← 返回协议列表</a>
|
||
</div>
|
||
|
||
<div class="footer" id="footer">
|
||
<div class="company" id="footer-company">弥勒市朋普镇微风暴网络科技工作室</div>
|
||
<div id="footer-contact">📧 2821981550@qq.com | 📧 2572560133@qq.com | 📍 云南省昆明市西山区滇池度假区(碧鸡街道车家壁513号)</div>
|
||
<div style="margin-top: 8px;" id="footer-credit">统一社会信用代码:92532526MA6PCX153W</div>
|
||
<div style="margin-top: 4px;" id="footer-icp">滇ICP备2022000863号-18A</div>
|
||
<div style="margin-top: 4px; color: var(--text-tertiary);">© 2026 Xianyan. All rights reserved.</div>
|
||
</div>
|
||
|
||
<script>
|
||
const DATA = {
|
||
zh: {
|
||
title: '软件权限使用说明',
|
||
subtitle: '软件所需权限及使用目的说明',
|
||
backLink: '← 返回协议列表',
|
||
company: '弥勒市朋普镇微风暴网络科技工作室',
|
||
contact: '📧 2821981550@qq.com | 📧 2572560133@qq.com | 📍 云南省昆明市西山区滇池度假区(碧鸡街道车家壁513号)',
|
||
credit: '统一社会信用代码:92532526MA6PCX153W',
|
||
icp: '滇ICP备2022000863号-18A'
|
||
},
|
||
en: {
|
||
title: 'Permission Usage',
|
||
subtitle: 'App permissions and their usage purposes',
|
||
backLink: '← Back to Agreement List',
|
||
company: 'Mile City Pengpu Town Weifengbao Network Technology Studio',
|
||
contact: '📧 2821981550@qq.com | 📧 2572560133@qq.com | 📍 Dianchi Resort, Xishan District, Kunming, Yunnan, China',
|
||
credit: 'Unified Social Credit Code: 92532526MA6PCX153W',
|
||
icp: 'ICP License: 滇ICP备2022000863号-18A'
|
||
}
|
||
};
|
||
|
||
function switchLang(lang) {
|
||
document.getElementById('content-zh').style.display = lang === 'zh' ? 'block' : 'none';
|
||
document.getElementById('content-en').style.display = lang === 'en' ? 'block' : 'none';
|
||
document.getElementById('header-title').textContent = DATA[lang].title;
|
||
document.getElementById('header-subtitle').textContent = DATA[lang].subtitle;
|
||
document.getElementById('back-link').textContent = DATA[lang].backLink;
|
||
document.getElementById('footer-company').textContent = DATA[lang].company;
|
||
document.getElementById('footer-contact').innerHTML = DATA[lang].contact;
|
||
document.getElementById('footer-credit').textContent = DATA[lang].credit;
|
||
document.getElementById('footer-icp').textContent = DATA[lang].icp;
|
||
document.getElementById('btn-zh').className = 'lang-btn' + (lang === 'zh' ? ' active' : '');
|
||
document.getElementById('btn-en').className = 'lang-btn' + (lang === 'en' ? ' active' : '');
|
||
document.documentElement.lang = lang === 'zh' ? 'zh-CN' : 'en';
|
||
const url = new URL(window.location);
|
||
if (lang === 'en') {
|
||
url.searchParams.set('lang', 'en');
|
||
} else {
|
||
url.searchParams.delete('lang');
|
||
}
|
||
history.replaceState(null, '', url);
|
||
}
|
||
|
||
(function() {
|
||
const params = new URLSearchParams(window.location.search);
|
||
const lang = params.get('lang');
|
||
if (lang === 'en') switchLang('en');
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html> |