Files
xianyan/docs/toolsapi/agreements/permission-usage.html
Developer adfa0af825 chore: 汇总2026-05-30全量更新
### 详细变更:
1.  **文档与配置**:更新AGENTS.md添加命令超时约束,升级Rive依赖至0.14.7并替换平台插件引用
2.  **UI优化**:重构AppInfo页面布局、移除图表冗余配置、锁定部分系统设置项
3.  **功能增强**:
    - 新增工具面板拖拽状态管理与介绍弹窗
    - 新增进度页面编辑/重排/清空用户进度功能
    - 新增摇一摇路由作用域拦截逻辑
4.  **体验优化**:
    - 统一外部链接跳转弹窗,添加文件打开确认逻辑
    - 修复设备卡片IP溢出、Android权限声明问题
    - 后台任务初始化增加协议校验
5.  **代码重构**:拆分工具面板配置、拖拽逻辑与动画参数,优化状态管理代码
6.  **工具脚本**:新增协议文件上传脚本
2026-05-30 05:29:50 +08:00

508 lines
19 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.
<!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 &nbsp;|&nbsp; 📧 2572560133@qq.com &nbsp;|&nbsp; 📍 云南省昆明市西山区滇池度假区碧鸡街道车家壁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 &nbsp;|&nbsp; 📧 2572560133@qq.com &nbsp;|&nbsp; 📍 云南省昆明市西山区滇池度假区碧鸡街道车家壁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 &nbsp;|&nbsp; 📧 2572560133@qq.com &nbsp;|&nbsp; 📍 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>