fix:修复bug

This commit is contained in:
2026-02-06 18:09:23 +08:00
parent f476cee76d
commit bb5a6dd100
51 changed files with 4491 additions and 2630 deletions
+138
View File
@@ -0,0 +1,138 @@
<template>
<view class="legal-page">
<view class="header">
<view class="title">User Agreement</view>
<view class="subtitle">Applicable to this service (Last updated: {{ effectiveDate }})</view>
</view>
<scroll-view class="content" scroll-y>
<view class="h1">I. Introduction</view>
<view class="p">Welcome to {{ brandName }} shared fan products and related services. This User Agreement (hereinafter referred to as "this Agreement") is entered into between you and {{ companyName }} ("we") regarding your use of {{ brandName }} mini program and shared fan rental services.</view>
<view class="p">Before using {{ brandName }}, please carefully read and fully understand all contents of this Agreement, especially the terms highlighted in bold (including but not limited to liability limitations, dispute resolution, applicable law, protection of minors, etc.). By clicking "Login/Use" or actually using the service, you are deemed to have read and agreed to be bound by this Agreement.</view>
<view class="h1">II. Account and Login</view>
<view class="p">2.1 You can log in and use this service through WeChat authorization. To complete deposit-free rental and order settlement, you agree that we conduct credit assessment and post-order settlement based on WeChat Payment Score.</view>
<view class="p">2.2 You should ensure that the information provided is true, accurate, and complete, and update it in a timely manner. Any service restrictions, order abnormalities, or losses caused by untrue information or failure to update in time shall be borne by you.</view>
<view class="p">2.3 You shall be responsible for all activities under the account, properly keep the device and account credentials, and shall not lend, rent, or otherwise provide them to others.</view>
<view class="h1">III. Rental and Usage Specifications</view>
<view class="p">3.1 Rental process: Initiate rental in {{ brandName }} mini program Pick up the fan at the device Return it at the return point according to the instructions or through "Express Return" after use.</view>
<view class="p">3.2 Usage specifications: Please use the device properly, avoid water ingress, dropping, unauthorized disassembly or modification; do not approach open flames and high-temperature environments; avoid outdoor use in rainy days; children should use under supervision.</view>
<view class="p">3.3 Prohibited behaviors: Using the device for illegal or improper purposes; affecting the normal operation of the device or system in any way; circumventing billing or return processes through abnormal means.</view>
<view class="h1">IV. Billing and Settlement (Including WeChat Payment Score)</view>
<view class="p"><text class="bold">4.1 Billing rules</text>: Subject to the real-time billing rules displayed in the mini program, which may include duration billing, capped prices, service fees, etc. Charges will be based on this after order generation.</view>
<view class="p"><text class="bold">4.2 WeChat Payment Score deposit-free</text>: If you activate and pass the credit assessment, you can enjoy deposit-free rental; if the assessment fails, pre-authorization or deposit may be required. Please refer to the page prompts for details.</view>
<view class="p">4.3 Settlement and deduction: After the order ends, we will complete the settlement based on actual usage and platform rules, and deduct through WeChat Payment Score/WeChat Pay.</view>
<view class="p">4.4 Exceptions and disputes: If you have any objection to billing or settlement, please submit it through "My-Customer Service" within 48 hours after order completion; overdue submissions may affect processing results.</view>
<view class="h1">V. Device Return and Overdue Handling</view>
<view class="p">5.1 Return method: Return at designated outlets according to mini program instructions, or send back through the "Express Return" function. Non-designated methods may lead to order abnormalities and additional fees.</view>
<view class="p">5.2 Overdue handling: If not returned within the specified time, the system will continue billing or charge overdue fees according to rules. Long-term failure to return may result in compensation handling according to the agreement.</view>
<view class="p">5.3 Acceptance and order completion: After return, the platform will conduct integrity inspection. The order can only be completed after inspection and fee settlement.</view>
<view class="h1">VI. Violation, Damage and Compensation</view>
<view class="p">6.1 Device damage and loss: If device damage or loss is caused by improper use, intentional damage, or failure to keep in accordance with specifications, you need to bear compensation liability according to the platform's published standards or actual repair/depreciation costs.</view>
<view class="p">6.2 Cleaning and parts: Additional costs caused by human contamination, missing accessories, etc., will be charged to you based on actual costs.</view>
<view class="p">6.3 Risk control: In case of suspected malicious arrears, fraud, etc., the platform may take measures such as freezing services, pursuing compensation, and protecting rights according to law.</view>
<view class="h1">VII. User Behavior Standards</view>
<view class="p">7.1 You promise to abide by laws, regulations and public order and good customs, not to publish or spread illegal or improper content, and not to interfere with or disrupt the normal operation of the platform and devices.</view>
<view class="p">7.2 You shall not conduct reverse engineering, scraping, or unauthorized automated access to this mini program.</view>
<view class="h1">VIII. Intellectual Property</view>
<view class="p">8.1 {{ companyName }} and its affiliates enjoy corresponding intellectual property rights or legal authorization for trademarks, logos, interfaces, texts, images, codes, etc. in this mini program and services.</view>
<view class="p">8.2 Without written permission, no one may use, copy, disseminate or adapt the above content in any way.</view>
<view class="h1">IX. Disclaimer and Limitation of Liability</view>
<view class="p"><text class="bold">9.1 Due to force majeure, network failures, third-party service stability and other reasons leading to service interruption or restriction, {{ companyName }} shall not be liable within the scope permitted by law, but will try to restore services.</text></view>
<view class="p">9.2 You should be responsible for your own use. Any losses caused by your violation of this Agreement or improper storage and use of equipment shall be borne by you or compensated to relevant parties.</view>
<view class="h1">X. Privacy and Personal Information Protection</view>
<view class="p">10.1 We strictly handle your personal information in accordance with the Privacy Policy, including WeChat login information, mobile phone number (obtained after your authorization), device and order information, location and outlet information, etc.</view>
<view class="p">10.2 For details, please refer to the Privacy Policy in this mini program.</view>
<view class="h1">XI. Service Changes and Termination</view>
<view class="p">11.1 We may make changes or terminate service content, functions or rules based on business adjustments, legal compliance or user experience optimization. Important changes will be notified through mini program announcements or in-app messages.</view>
<view class="p">11.2 If you do not agree with the changes, you can stop using and apply for cancellation of relevant accounts/information (subject to laws, regulations and account settlement restrictions).</view>
<view class="h1">XII. Protection of Minors</view>
<view class="p">12.1 Guardians of minors should guide them to correctly understand and abide by this Agreement. Minors should use the service under supervision and avoid using equipment in dangerous environments.</view>
<view class="h1">XIII. Notices and Contact</view>
<view class="p">13.1 Contact method: Please contact us through "Support" in the mini program, and we will handle your questions or disputes as soon as possible.</view>
<view class="h1">XIV. Applicable Law and Dispute Resolution</view>
<view class="p">14.1 The conclusion, effectiveness, performance, interpretation and dispute resolution of this Agreement shall be governed by the laws of the People's Republic of China (excluding conflict of laws rules).</view>
<view class="p">14.2 Disputes arising from this Agreement shall be resolved through friendly negotiation first; if negotiation fails, they shall be submitted to the people's court with jurisdiction in {{ disputeVenue }} for litigation settlement.</view>
<view class="h1">XV. Supplementary Provisions</view>
<view class="p">15.1 This Agreement shall take effect from {{ effectiveDate }} and remain valid for a long term, unless we publish another version update.</view>
<view class="p">15.2 If any provision of the Agreement is deemed invalid or unenforceable, it shall not affect the validity and enforcement of other provisions.</view>
</scroll-view>
<view class="footer">If you have any questions about this Agreement, please contact our customer service.</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
onMounted(() => {
uni.setNavigationBarTitle({
title: 'User Agreement'
})
})
const brandName = 'WindPower'
const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.'
const effectiveDate = '2025-10-13'
const disputeVenue = 'the location of the platform'
</script>
<style lang="scss" scoped>
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
}
.subtitle {
font-size: 24rpx;
color: #888;
}
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 16rpx 20rpx;
flex: 1;
min-height: 0;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.04);
}
.h1 { font-size: 30rpx; font-weight: 600; color: #222; margin: 18rpx 0 12rpx; }
.p { font-size: 26rpx; color: #444; line-height: 1.8; margin-bottom: 10rpx; }
.bold { font-weight: 600; color: #222; }
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+138
View File
@@ -0,0 +1,138 @@
<template>
<view class="legal-page">
<view class="header">
<view class="title">用户协议</view>
<view class="subtitle">适用于本服务最后更新{{ effectiveDate }}</view>
</view>
<scroll-view class="content" scroll-y>
<view class="h1">导言</view>
<view class="p">欢迎您使用{{ brandName }}共享风扇产品与相关服务用户协议下称"本协议"由您与{{ companyName }}"我们"就您使用{{ brandName }}小程序及租借共享风扇服务所订立</view>
<view class="p">在使用{{ brandName }}请您务必仔细阅读并充分理解本协议全部内容尤其是以加粗方式提示的条款包括但不限于责任限制争议解决适用法律未成年人保护等您点击"登录/使用"或实际使用服务即视为您已阅读并同意受本协议约束</view>
<view class="h1">账号与登录</view>
<view class="p">2.1 您可通过微信授权登录使用本服务为完成免押租借与订单结算您同意我们基于微信支付分进行信用评估及订单后结等必要处理</view>
<view class="p">2.2 您应保证提供信息真实准确完整并及时更新因您提供的信息不真实或未及时更新导致的服务受限订单异常或损失由您自行承担</view>
<view class="p">2.3 您应对账户下的全部行为负责妥善保管设备与账户凭证不得转借出租或以其他方式提供给他人使用</view>
<view class="h1">租借与使用规范</view>
<view class="p">3.1 租借流程{{ brandName }}小程序中发起租借 在设备端取用风扇 使用完毕后按指引在归还点归还或通过"快递归还"</view>
<view class="p">3.2 使用规范请合理使用设备避免进水摔落私自拆卸或改装请勿靠近明火与高温环境室外雨天请避免使用儿童应在监护下使用</view>
<view class="p">3.3 禁止行为将设备用于违法或不当用途以任何方式影响设备或系统的正常运行通过非正常手段规避计费或归还流程</view>
<view class="h1">计费与结算含微信支付分</view>
<view class="p"><text class="bold">4.1 计费规则</text>以小程序展示的实时计费规则为准可能包含时长计费封顶价服务费等订单生成后将据此计费</view>
<view class="p"><text class="bold">4.2 微信支付分免押</text>若您开通并通过信用评估可享受免押租借如评估未通过可能需预授权或押金具体以页面提示为准</view>
<view class="p">4.3 结算与扣款订单结束后我们将基于实际使用情况与平台规则完成结算并通过微信支付分/微信支付进行扣款</view>
<view class="p">4.4 异常与争议如对计费或结算有异议请在订单完成后48小时内通过"我的-客服"提交逾期可能影响处理结果</view>
<view class="h1">设备归还与逾期处理</view>
<view class="p">5.1 归还方式按照小程序指引在指定网点归还或通过"快递归还"功能寄回非指定方式可能导致订单异常与额外费用</view>
<view class="p">5.2 逾期处理未在规定时间内归还的系统将持续计费或按规则收取逾期费用长时间未归还的可能依约进行赔偿处理</view>
<view class="p">5.3 验收与结单归还后平台将进行完好性验收验收完成且费用结清后订单方可完结</view>
<view class="h1">违规损坏与赔偿</view>
<view class="p">6.1 设备损坏丢失若因不当使用故意破坏或未按规范保管导致设备损坏丢失您需按平台公示标准或实际维修/折损成本承担赔偿责任</view>
<view class="p">6.2 清洁与部件因人为污损缺失附件等造成的额外成本将据实向您收取</view>
<view class="p">6.3 风险控制如出现涉嫌恶意拖欠欺诈等平台可采取冻结服务追偿依法维权等措施</view>
<view class="h1">用户行为规范</view>
<view class="p">7.1 您承诺遵守法律法规与公序良俗不发表不传播违法违规或不当内容不干扰或破坏平台与设备的正常运行</view>
<view class="p">7.2 您不得对本小程序进行反向工程抓取或未经授权的自动化访问</view>
<view class="h1">知识产权</view>
<view class="p">8.1 {{ companyName }}及关联方对本小程序与服务中的商标标识界面文字图片代码等享有相应知识产权或合法授权</view>
<view class="p">8.2 未经书面许可任何人不得以任何方式使用复制传播或改作上述内容</view>
<view class="h1">免责声明与责任限制</view>
<view class="p"><text class="bold">9.1 由于不可抗力网络故障第三方服务稳定性等原因导致的服务中断或受限{{ companyName }}在法律允许范围内不承担责任但将尽力恢复服务</text></view>
<view class="p">9.2 您应对自身使用行为负责因您违反本协议或不当保管使用设备造成的损失由您自行承担或向相关方赔偿</view>
<view class="h1">隐私与个人信息保护</view>
<view class="p">10.1 我们严格按照隐私政策处理您的个人信息包括微信登录信息手机号经您授权后获取设备与订单信息位置与网点信息等</view>
<view class="p">10.2 详情请查阅本小程序内的隐私政策</view>
<view class="h1">十一服务变更与终止</view>
<view class="p">11.1 我们可能基于业务调整法律合规或用户体验优化对服务内容功能或规则进行变更或终止重要变更将通过小程序公告或站内消息提示</view>
<view class="p">11.2 如您不同意变更可停止使用并申请注销相关账户/信息受法律法规与账务结算限制</view>
<view class="h1">十二未成年人保护</view>
<view class="p">12.1 未成年人的监护人应指导其正确理解并遵守本协议未成年人使用服务应在监护下进行避免在危险环境中使用设备</view>
<view class="h1">十三通知与联系</view>
<view class="p">13.1 联系方式请通过小程序"我的-客服"与我们联系我们将尽快处理您的问题或争议</view>
<view class="h1">十四法律适用与争议解决</view>
<view class="p">14.1 本协议的订立生效履行解释与争议解决适用中华人民共和国法律不含冲突规范</view>
<view class="p">14.2 因本协议产生的争议优先友好协商协商不成的提交{{ disputeVenue }}有管辖权的人民法院诉讼解决</view>
<view class="h1">十五附则</view>
<view class="p">15.1 本协议自{{ effectiveDate }}起生效并长期有效除非我们另行发布版本更新</view>
<view class="p">15.2 协议条款如被认定无效或不可执行不影响其他条款的效力与执行</view>
</scroll-view>
<view class="footer">如您对本协议有任何疑问请联系我们的客服</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
onMounted(() => {
uni.setNavigationBarTitle({
title: '用户协议'
})
})
const brandName = '风电者'
const companyName = '深圳乐慕智云科技有限公司'
const effectiveDate = '2025-10-13'
const disputeVenue = '平台所在地'
</script>
<style lang="scss" scoped>
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
}
.subtitle {
font-size: 24rpx;
color: #888;
}
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 16rpx 20rpx;
flex: 1;
min-height: 0;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.04);
}
.h1 { font-size: 30rpx; font-weight: 600; color: #222; margin: 18rpx 0 12rpx; }
.p { font-size: 26rpx; color: #444; line-height: 1.8; margin-bottom: 10rpx; }
.bold { font-weight: 600; color: #222; }
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+209
View File
@@ -0,0 +1,209 @@
<template>
<!-- 加载状态 -->
<view v-if="loading" class="loading-page">
<view class="loading-content">
<view class="loading-spinner"></view>
<text>{{ $t('common.loading') }}</text>
</view>
</view>
<!-- 错误状态 -->
<view v-else-if="error" class="error-page">
<view class="error-content">
<text class="error-icon"></text>
<text class="error-message">{{ errorMessage }}</text>
<button class="retry-btn" @click="loadAgreement">{{ $t('common.retry') }}</button>
</view>
</view>
<!-- 内容显示 -->
<view v-else class="legal-page">
<view class="header">
<text class="title">{{ agreementData.title || $t('legal.agreement') }}</text>
<text v-if="agreementData.remark" class="subtitle">{{ agreementData.remark }}</text>
</view>
<scroll-view class="content" scroll-y>
<rich-text :nodes="agreementData.content"></rich-text>
</scroll-view>
<view class="footer">
<text>{{ $t('legal.footerNotice') }}</text>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useI18n } from '@/utils/i18n.js'
import { getCurrentAgreement } from '@/config/api/system.js'
const { t } = useI18n()
// 响应式数据
const loading = ref(true)
const error = ref(false)
const errorMessage = ref('')
const agreementData = ref({
title: '',
content: '',
remark: ''
})
// 加载协议内容
const loadAgreement = async () => {
loading.value = true
error.value = false
errorMessage.value = ''
try {
console.log('加载用户协议')
// 调用接口获取协议内容
const res = await getCurrentAgreement({
agreementCode: 'USER_AGREEMENT',
appPlatform: 'wechat',
appType: 'user'
})
console.log('用户协议响应:', res)
if (res && res.code === 200 && res.data) {
agreementData.value = {
title: res.data.title || t('legal.agreement'),
content: res.data.content || '',
remark: res.data.remark || ''
}
// 设置页面标题
uni.setNavigationBarTitle({
title: agreementData.value.title
})
} else {
throw new Error(res?.msg || t('common.loadFailed'))
}
} catch (err) {
console.error('加载用户协议失败:', err)
error.value = true
errorMessage.value = err.message || t('common.loadFailed')
} finally {
loading.value = false
}
}
onMounted(() => {
loadAgreement()
})
</script>
<style lang="scss" scoped>
.loading-page {
min-height: 100vh;
background: #f8f8f8;
display: flex;
align-items: center;
justify-content: center;
}
.loading-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 24rpx;
}
.loading-spinner {
width: 60rpx;
height: 60rpx;
border: 4rpx solid #f0f0f0;
border-top: 4rpx solid #07c160;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.error-page {
min-height: 100vh;
background: #f8f8f8;
display: flex;
align-items: center;
justify-content: center;
padding: 40rpx;
}
.error-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 24rpx;
.error-icon {
font-size: 80rpx;
}
.error-message {
font-size: 28rpx;
color: #666;
text-align: center;
}
.retry-btn {
margin-top: 20rpx;
padding: 20rpx 60rpx;
background: #07c160;
color: #fff;
border-radius: 8rpx;
font-size: 28rpx;
border: none;
}
}
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
display: block;
}
.subtitle {
font-size: 24rpx;
color: #888;
display: block;
}
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 20rpx;
flex: 1;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+150
View File
@@ -0,0 +1,150 @@
<template>
<view class="legal-page">
<view class="header">
<view class="title">Privacy Policy</view>
<view class="subtitle">Applicable to this service (Last updated: {{ effectiveDate }})</view>
</view>
<view class="card notice">
<view class="p">We are well aware of the importance of personal information to you and will do our best to protect your personal information security. Please carefully read and understand this Privacy Policy before using {{ brandName }} services.</view>
</view>
<scroll-view class="content" scroll-y>
<view class="h1">I. Scope of Application</view>
<view class="p">
This policy is formulated and published by {{ companyName }} and applies to {{ brandName }} mini program and its shared fan rental services. "We" in this text specifically refers to {{ companyName }}, and we will process your personal information in accordance with the principles of legality, legitimacy, and necessity.
</view>
<view class="h1">II. Information We Collect</view>
<view class="p">2.1 Account information: WeChat login identifier (such as openId/unionId), nickname and avatar (with your authorization), mobile phone number (obtained through WeChat after your authorization).</view>
<view class="p">2.2 Order and device information: rental records, usage duration, fees, return points, device status, abnormal records, etc.</view>
<view class="p">2.3 Location and outlet information: used to find nearby outlets and navigation after your authorization, and will not be obtained without authorization.</view>
<view class="p">2.4 Log information: To ensure service security and stability, we may record operation logs, network requests, and error information.</view>
<view class="h1">III. Purpose of Information Use</view>
<view class="p">3.1 Provide core functions: identity verification, deposit-free rental (WeChat Payment Score assessment), order billing and settlement, customer service and after-sales.</view>
<view class="p">3.2 Security risk control: prevent fraud, violations and risk control; ensure system and device security.</view>
<view class="p">3.3 Product optimization: statistics and analysis to improve experience (conducted after de-identification/anonymization).</view>
<view class="h1">IV. WeChat Payment Score and Payment</view>
<view class="p">4.1 To implement deposit-free rental, we will conduct necessary data interaction with WeChat Payment Score (such as credit assessment results and order settlement). Related data processing follows the rules of WeChat Pay and WeChat Payment Score.</view>
<view class="p">4.2 If you fail the assessment, pre-authorization or deposit processing may be required, subject to page prompts.</view>
<view class="h1">V. Sharing, Transfer and Public Disclosure</view>
<view class="p">5.1 We will not sell your personal information to third parties.</view>
<view class="p">5.2 When realizing necessary functions, we may share necessary information with partners (such as payment and logistics service providers), and require them to protect your information according to standards not lower than this policy.</view>
<view class="p">5.3 In case of transfer due to merger, division, reorganization or bankruptcy liquidation, we will require the new holder to continue to be bound by this policy, otherwise we will obtain your consent again.</view>
<view class="p">5.4 Only in circumstances such as laws and regulations or regulatory requirements, litigation dispute handling, protection of personal and property safety, etc., may disclosure be made in accordance with the law.</view>
<view class="h1">VI. Information Storage and Security</view>
<view class="p">6.1 Storage location: Your personal information is in principle stored within the territory of the People's Republic of China. If cross-border transmission is required, we will comply with laws and regulations and obtain your consent.</view>
<view class="p">6.2 Storage period: the shortest period necessary to achieve the purpose. After expiration, it will be deleted or anonymized, except as otherwise provided by laws and regulations.</view>
<view class="p">6.3 Security measures: We adopt measures such as encrypted transmission, access control, minimized authorization, monitoring and auditing to protect the security of your information.</view>
<view class="h1">VII. Your Rights</view>
<view class="p">7.1 Access and correction: You can access or correct some information through "My-Personal Information/Support".</view>
<view class="p">7.2 Deletion and withdrawal of consent: When meeting legal requirements and necessary conditions such as account settlement and dispute handling, you can apply for deletion or withdrawal of authorization; some functions may not be available after withdrawal.</view>
<view class="p">7.3 Account cancellation: After meeting the conditions and completing fee settlement, device return, and dispute handling, you can apply for account cancellation.</view>
<view class="h1">VIII. Protection of Minors</view>
<view class="p">8.1 Minors should use the service under supervision. We will not knowingly collect unnecessary personal information of minors.</view>
<view class="h1">IX. Policy Updates and Notifications</view>
<view class="p">9.1 We may update this policy due to function iteration and changes in laws and regulations. Important changes will be notified through mini program announcements or in-app messages. Continued use after update is deemed as your consent.</view>
<view class="h1">X. Contact Us</view>
<view class="p">10.1 You can contact us through "My-Customer Service" to exercise the aforementioned rights or raise questions about this policy.</view>
</scroll-view>
<view class="footer">If you have any questions about this policy, please contact our customer service.</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
onMounted(() => {
uni.setNavigationBarTitle({
title: 'Privacy Policy'
})
})
const brandName = 'WindPower'
const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.'
const effectiveDate = '2025-10-13'
</script>
<style lang="scss" scoped>
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
}
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
}
.subtitle {
font-size: 24rpx;
color: #888;
}
.card {
background: #fff;
border-radius: 16rpx;
padding: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.notice {
margin-bottom: 16rpx;
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 16rpx 20rpx;
flex: 1;
min-height: 0;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.h1 {
font-size: 30rpx;
font-weight: 600;
color: #222;
margin: 18rpx 0 12rpx;
}
.p {
font-size: 26rpx;
color: #444;
line-height: 1.8;
margin-bottom: 10rpx;
}
.bold {
font-weight: 600;
color: #222;
}
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+150
View File
@@ -0,0 +1,150 @@
<template>
<view class="legal-page">
<view class="header">
<view class="title">隐私政策</view>
<view class="subtitle">适用于本服务最后更新{{ effectiveDate }}</view>
</view>
<view class="card notice">
<view class="p">我们深知个人信息对您的重要性并会尽全力保护您的个人信息安全请您在使用{{ brandName }}服务前仔细阅读并理解本隐私政策</view>
</view>
<scroll-view class="content" scroll-y>
<view class="h1">适用范围</view>
<view class="p">
本政策由{{ companyName }}制定并发布适用于{{ brandName }}小程序及其提供的共享风扇租借服务"我们"在本文特指{{ companyName }}并将按照合法正当必要的原则处理您的个人信息
</view>
<view class="h1">我们收集的信息</view>
<view class="p">2.1 账号信息微信登录标识如openId/unionId昵称头像经您授权手机号经您授权后通过微信获取</view>
<view class="p">2.2 订单与设备信息租借记录使用时长费用归还点位设备状态异常记录等</view>
<view class="p">2.3 位置与网点信息在您授权后用于查找附近网点与导航不会在未授权情况下获取</view>
<view class="p">2.4 日志信息为保障服务安全与稳定我们可能记录操作日志网络请求与错误信息</view>
<view class="h1">信息使用目的</view>
<view class="p">3.1 提供核心功能身份验证免押租借微信支付分评估订单计费结算客服与售后</view>
<view class="p">3.2 安全风控防范欺诈违规与风险控制保障系统与设备安全</view>
<view class="p">3.3 产品优化统计与分析以改进体验在去标识化/匿名化后进行</view>
<view class="h1">微信支付分与支付</view>
<view class="p">4.1 为实现免押租借我们将与微信支付分进行必要的数据交互如信用评估结果订单结算相关数据处理遵循微信支付与微信支付分的规则</view>
<view class="p">4.2 如您未通过评估可能需进行预授权或押金处理以页面提示为准</view>
<view class="h1">共享转移与公开披露</view>
<view class="p">5.1 我们不会向第三方出售您的个人信息</view>
<view class="p">5.2 在实现必要功能时我们可能与合作方共享必要信息如支付与物流服务商并要求其按不低于本政策的标准保护您的信息</view>
<view class="p">5.3 因合并分立重组或破产清算导致的转移我们将要求新持有方继续受本政策约束否则将重新征得您的同意</view>
<view class="p">5.4 仅在法律法规或监管要求诉讼争议处理保护人身财产安全等情形下可能依法进行披露</view>
<view class="h1">信息存储与安全</view>
<view class="p">6.1 存储地点您的个人信息原则上存储于中华人民共和国境内如需跨境传输将遵循法律法规并征得您的同意</view>
<view class="p">6.2 存储期限为实现目的所必需的最短期限超期将删除或匿名化处理法律法规另有规定的除外</view>
<view class="p">6.3 安全措施我们采取加密传输访问控制最小化授权监控审计等措施保护您的信息安全</view>
<view class="h1">您的权利</view>
<view class="p">7.1 访问与更正您可通过"我的-个人信息/客服"访问或更正部分信息</view>
<view class="p">7.2 删除与撤回同意在符合法律与账务结算纠纷处理等必要条件时您可申请删除或撤回授权撤回后部分功能可能无法提供</view>
<view class="p">7.3 账号注销在符合条件并完成费用结清设备归还争议处理后您可申请注销账号</view>
<view class="h1">未成年人保护</view>
<view class="p">8.1 未成年人使用服务应在监护下进行我们不会在明知的情况下收集未成年人不必要的个人信息</view>
<view class="h1">政策更新与通知</view>
<view class="p">9.1 我们可能因功能迭代法律监管变化而更新本政策重要变更将通过小程序公告或站内消息提示更新后继续使用即视为您同意</view>
<view class="h1">联系我们</view>
<view class="p">10.1 您可通过"我的-客服"与我们联系以行使前述权利或就本政策提出疑问</view>
</scroll-view>
<view class="footer">如您对本政策有任何疑问请联系我们的客服</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
onMounted(() => {
uni.setNavigationBarTitle({
title: '隐私政策'
})
})
const brandName = '风电者'
const companyName = '深圳乐慕智云科技有限公司'
const effectiveDate = '2025-10-13'
</script>
<style lang="scss" scoped>
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
}
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
}
.subtitle {
font-size: 24rpx;
color: #888;
}
.card {
background: #fff;
border-radius: 16rpx;
padding: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.notice {
margin-bottom: 16rpx;
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 16rpx 20rpx;
flex: 1;
min-height: 0;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.h1 {
font-size: 30rpx;
font-weight: 600;
color: #222;
margin: 18rpx 0 12rpx;
}
.p {
font-size: 26rpx;
color: #444;
line-height: 1.8;
margin-bottom: 10rpx;
}
.bold {
font-weight: 600;
color: #222;
}
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+207
View File
@@ -0,0 +1,207 @@
<template>
<!-- 加载状态 -->
<view v-if="loading" class="loading-page">
<view class="loading-content">
<view class="loading-spinner"></view>
<text>{{ $t('common.loading') }}</text>
</view>
</view>
<!-- 错误状态 -->
<view v-else-if="error" class="error-page">
<view class="error-content">
<text class="error-icon"></text>
<text class="error-message">{{ errorMessage }}</text>
<button class="retry-btn" @click="loadAgreement">{{ $t('common.retry') }}</button>
</view>
</view>
<!-- 内容显示 -->
<view v-else class="legal-page">
<view class="header">
<text class="title">{{ agreementData.title || $t('legal.privacy') }}</text>
<text v-if="agreementData.remark" class="subtitle">{{ agreementData.remark }}</text>
</view>
<scroll-view class="content" scroll-y>
<rich-text :nodes="agreementData.content"></rich-text>
</scroll-view>
<view class="footer">
<text>{{ $t('legal.footerNoticePolicy') }}</text>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useI18n } from '@/utils/i18n.js'
import { getCurrentAgreement } from '@/config/api/system.js'
const { t } = useI18n()
// 响应式数据
const loading = ref(true)
const error = ref(false)
const errorMessage = ref('')
const agreementData = ref({
title: '',
content: '',
remark: ''
})
// 加载协议内容
const loadAgreement = async () => {
loading.value = true
error.value = false
errorMessage.value = ''
try {
console.log('加载隐私政策')
// 调用接口获取协议内容
const res = await getCurrentAgreement({
agreementCode: 'PRIVACY_POLICY',
appPlatform: 'wechat',
appType: 'user'
})
console.log('隐私政策响应:', res)
if (res && res.code === 200 && res.data) {
agreementData.value = {
title: res.data.title || t('legal.privacy'),
content: res.data.content || '',
remark: res.data.remark || ''
}
// 设置页面标题
uni.setNavigationBarTitle({
title: agreementData.value.title
})
} else {
throw new Error(res?.msg || t('common.loadFailed'))
}
} catch (err) {
console.error('加载隐私政策失败:', err)
error.value = true
errorMessage.value = err.message || t('common.loadFailed')
} finally {
loading.value = false
}
}
onMounted(() => {
loadAgreement()
})
</script>
<style lang="scss" scoped>
.loading-page {
min-height: 100vh;
background: #f8f8f8;
display: flex;
align-items: center;
justify-content: center;
}
.loading-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 24rpx;
}
.loading-spinner {
width: 60rpx;
height: 60rpx;
border: 4rpx solid #f0f0f0;
border-top: 4rpx solid #07c160;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.error-page {
min-height: 100vh;
background: #f8f8f8;
display: flex;
align-items: center;
justify-content: center;
padding: 40rpx;
}
.error-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 24rpx;
.error-icon {
font-size: 80rpx;
}
.error-message {
font-size: 28rpx;
color: #666;
text-align: center;
}
.retry-btn {
margin-top: 20rpx;
padding: 20rpx 60rpx;
background: #07c160;
color: #fff;
border-radius: 8rpx;
font-size: 28rpx;
border: none;
}
}
.legal-page {
min-height: 100vh;
background: #f8f8f8;
padding: 24rpx 24rpx 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.header {
margin-bottom: 16rpx;
.title {
font-size: 40rpx;
font-weight: 600;
color: #222;
margin-bottom: 8rpx;
display: block;
}
.subtitle {
font-size: 24rpx;
color: #888;
display: block;
}
}
.content {
background: #fff;
border-radius: 16rpx;
padding: 20rpx;
flex: 1;
box-sizing: border-box;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
}
.footer {
text-align: center;
margin-top: 16rpx;
font-size: 24rpx;
color: #888;
}
}
</style>
+135
View File
@@ -0,0 +1,135 @@
<template>
<view class="terms-page">
<view class="content">
<view class="title">{{ $t('legal.termsAndConditions') }}</view>
<view class="section">
<view class="section-title">{{ $t('legal.applicableLaw') }}</view>
<view class="section-content">
<text>{{ $t('legal.applicableLawContent') }}</text>
</view>
</view>
<view class="section">
<view class="section-title">{{ $t('legal.paymentMethods') }}</view>
<view class="section-content">
<text>{{ $t('legal.paymentMethodsContent') }}</text>
</view>
</view>
<view class="section">
<view class="section-title">{{ $t('legal.refundPolicy') }}</view>
<view class="section-content">
<text>{{ $t('legal.refundPolicyContent') }}</text>
</view>
</view>
<view class="section">
<view class="section-title">{{ $t('legal.serviceTerms') }}</view>
<view class="section-content">
<text>{{ $t('legal.serviceTermsContent') }}</text>
</view>
</view>
<view class="section">
<view class="section-title">{{ $t('legal.liabilityLimitation') }}</view>
<view class="section-content">
<text>{{ $t('legal.liabilityLimitationContent') }}</text>
</view>
</view>
<view class="section">
<view class="section-title">{{ $t('legal.disputeResolution') }}</view>
<view class="section-content">
<text>{{ $t('legal.disputeResolutionContent') }}</text>
</view>
</view>
<view class="footer">
<text class="update-time">{{ $t('legal.lastUpdate') }}: 2025-02-05</text>
<text class="notice">{{ $t('legal.footerNotice') }}</text>
</view>
</view>
</view>
</template>
<script setup>
import { onMounted } from 'vue'
import { useI18n } from '@/utils/i18n.js'
const { t } = useI18n()
onMounted(() => {
uni.setNavigationBarTitle({
title: t('legal.termsAndConditions')
})
})
</script>
<style lang="scss" scoped>
.terms-page {
min-height: 100vh;
background-color: #f6f6f6;
padding-bottom: env(safe-area-inset-bottom);
}
.content {
background-color: #ffffff;
padding: 40rpx 30rpx;
margin: 20rpx;
border-radius: 16rpx;
}
.title {
font-size: 40rpx;
font-weight: bold;
color: #333333;
text-align: center;
margin-bottom: 40rpx;
}
.section {
margin-bottom: 40rpx;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
margin-bottom: 20rpx;
padding-left: 20rpx;
border-left: 6rpx solid #07c160;
}
.section-content {
font-size: 28rpx;
color: #666666;
line-height: 1.8;
text-align: justify;
padding: 20rpx;
background-color: #f9f9f9;
border-radius: 8rpx;
}
.footer {
margin-top: 60rpx;
padding-top: 30rpx;
border-top: 1rpx solid #e5e5e5;
text-align: center;
}
.update-time {
display: block;
font-size: 24rpx;
color: #999999;
margin-bottom: 20rpx;
}
.notice {
display: block;
font-size: 26rpx;
color: #666666;
line-height: 1.6;
}
</style>