405 lines
12 KiB
Vue
405 lines
12 KiB
Vue
<template>
|
||
<view class="agreement-container">
|
||
<view class="agreement-content">
|
||
<!-- 标题 -->
|
||
<view class="page-header">
|
||
<text class="header-title">用户服务协议</text>
|
||
<text class="header-subtitle" v-if="updateDate">更新日期:{{ updateDate }}</text>
|
||
</view>
|
||
|
||
<!-- 内容区域 -->
|
||
<view class="content-section">
|
||
<scroll-view scroll-y class="scroll-content">
|
||
<!-- 引言 -->
|
||
<view class="section-block">
|
||
<view class="block-title">重要提示</view>
|
||
<view class="block-content important">
|
||
欢迎您使用时光意境·AI声音克隆服务!在使用本服务前,请您务必仔细阅读并充分理解本协议。您点击"同意"按钮或实际使用本服务,即表示您已阅读并同意接受本协议的全部内容。
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 服务说明 -->
|
||
<view class="section-block">
|
||
<view class="block-title">一、服务说明</view>
|
||
<view class="block-subtitle">1.1 服务内容</view>
|
||
<view class="block-content">
|
||
时光意境提供以下AI服务:<br/>
|
||
• <text class="highlight">声音克隆</text>:基于您提供的音频样本创建专属音色<br/>
|
||
• <text class="highlight">语音合成</text>:使用已创建的音色合成语音内容<br/>
|
||
• <text class="highlight">照片复活</text>:让照片中的人物开口说话<br/>
|
||
• <text class="highlight">视频通话</text>:与AI数字人进行实时对话<br/>
|
||
• <text class="highlight">实时对话</text>:基于语音识别和AI的智能对话
|
||
</view>
|
||
|
||
<view class="block-subtitle">1.2 服务特点</view>
|
||
<view class="block-content">
|
||
• 采用先进的AI技术,提供高质量的声音克隆和合成服务<br/>
|
||
• 支持多种音频格式和场景应用<br/>
|
||
• 提供便捷的用户界面和操作流程<br/>
|
||
• 保护用户隐私和数据安全
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 账号注册 -->
|
||
<view class="section-block">
|
||
<view class="block-title">二、账号注册与使用</view>
|
||
<view class="block-subtitle">2.1 注册要求</view>
|
||
<view class="block-content">
|
||
• 您需要提供真实、准确、完整的个人信息<br/>
|
||
• 您需要使用有效的手机号码进行注册<br/>
|
||
• 您需要设置安全的密码并妥善保管<br/>
|
||
• 您应当及时更新您的个人信息
|
||
</view>
|
||
|
||
<view class="block-subtitle">2.2 账号安全</view>
|
||
<view class="block-content">
|
||
• 您对账号和密码的安全负有全部责任<br/>
|
||
• 如发现账号被盗用,应立即通知我们<br/>
|
||
• 不得将账号转让、出售或出借给他人使用<br/>
|
||
• 不得使用他人账号或冒充他人身份
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 使用规范 -->
|
||
<view class="section-block">
|
||
<view class="block-title">三、使用规范</view>
|
||
<view class="block-subtitle">3.1 禁止行为</view>
|
||
<view class="block-content">
|
||
在使用本服务时,您不得:<br/>
|
||
• 上传违法、违规、侵权或不良内容<br/>
|
||
• 克隆他人声音用于欺诈、诈骗等违法行为<br/>
|
||
• 传播虚假信息、谣言或恶意内容<br/>
|
||
• 侵犯他人知识产权、隐私权或其他合法权益<br/>
|
||
• 干扰或破坏服务的正常运行<br/>
|
||
• 进行任何形式的商业推广或广告活动
|
||
</view>
|
||
|
||
<view class="block-subtitle">3.2 内容规范</view>
|
||
<view class="block-content">
|
||
• 上传的音频、照片等内容应合法合规<br/>
|
||
• 不得包含暴力、色情、恐怖等不良信息<br/>
|
||
• 不得侵犯他人肖像权、名誉权等权利<br/>
|
||
• 应尊重社会公德和公序良俗
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 知识产权 -->
|
||
<view class="section-block">
|
||
<view class="block-title">四、知识产权</view>
|
||
<view class="block-subtitle">4.1 平台权利</view>
|
||
<view class="block-content">
|
||
本服务的所有内容(包括但不限于软件、技术、程序、网页、文字、图片、音频、视频等)的知识产权归我们所有。未经我们书面许可,任何人不得擅自使用。
|
||
</view>
|
||
|
||
<view class="block-subtitle">4.2 用户内容</view>
|
||
<view class="block-content">
|
||
• 您上传的内容,您保留其知识产权<br/>
|
||
• 您授予我们使用、存储、处理该内容的权利<br/>
|
||
• 您保证上传的内容不侵犯第三方权利<br/>
|
||
• 生成的音色和视频,您享有使用权
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 费用说明 -->
|
||
<view class="section-block">
|
||
<view class="block-title">五、费用说明</view>
|
||
<view class="block-content">
|
||
• 部分服务可能需要付费使用<br/>
|
||
• 具体收费标准以页面显示为准<br/>
|
||
• 支付成功后,费用不予退还(法律另有规定除外)<br/>
|
||
• 我们保留调整价格的权利,调整前会提前通知
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 免责声明 -->
|
||
<view class="section-block">
|
||
<view class="block-title">六、免责声明</view>
|
||
<view class="block-content">
|
||
• 因不可抗力导致的服务中断或故障,我们不承担责任<br/>
|
||
• 因用户自身原因(如操作不当、设备问题等)导致的损失,我们不承担责任<br/>
|
||
• 因第三方原因(如网络故障、黑客攻击等)导致的损失,我们不承担责任<br/>
|
||
• 用户使用本服务产生的法律责任,由用户自行承担
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 服务变更 -->
|
||
<view class="section-block">
|
||
<view class="block-title">七、服务变更与终止</view>
|
||
<view class="block-subtitle">7.1 服务变更</view>
|
||
<view class="block-content">
|
||
我们有权根据业务需要,变更、暂停或终止部分或全部服务。如有重大变更,我们会提前通知您。
|
||
</view>
|
||
|
||
<view class="block-subtitle">7.2 账号终止</view>
|
||
<view class="block-content">
|
||
以下情况下,我们有权终止您的账号:<br/>
|
||
• 您违反本协议的约定<br/>
|
||
• 您从事违法违规活动<br/>
|
||
• 您长期未使用账号(超过12个月)<br/>
|
||
• 您主动申请注销账号
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 协议修改 -->
|
||
<view class="section-block">
|
||
<view class="block-title">八、协议修改</view>
|
||
<view class="block-content">
|
||
我们有权根据法律法规变化或业务需要修改本协议。修改后的协议将在应用内公布,如您继续使用服务,即视为同意修改后的协议。
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 法律适用 -->
|
||
<view class="section-block">
|
||
<view class="block-title">九、法律适用与争议解决</view>
|
||
<view class="block-content">
|
||
• 本协议的订立、执行和解释及争议的解决均应适用中华人民共和国法律<br/>
|
||
• 如双方就本协议内容或其执行发生争议,双方应友好协商解决<br/>
|
||
• 协商不成时,任何一方均可向我们所在地人民法院提起诉讼
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 联系方式 -->
|
||
<view class="section-block">
|
||
<view class="block-title">十、联系我们</view>
|
||
<view class="block-content">
|
||
如您对本协议有任何疑问,请通过以下方式联系我们:<br/><br/>
|
||
<text class="contact-info" v-if="serviceEmail">邮箱:{{ serviceEmail }}</text><br v-if="serviceEmail"/>
|
||
<text class="contact-info" v-if="servicePhone">电话:{{ servicePhone }}</text><br v-if="servicePhone"/>
|
||
</view>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<!-- 同意按钮 -->
|
||
<view class="button-section">
|
||
<button class="agree-btn" @click="handleAgree">我已阅读并同意</button>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import { API_BASE, API_ENDPOINTS } from '@/config/api.js';
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
serviceEmail: '',
|
||
servicePhone: '',
|
||
updateDate: ''
|
||
};
|
||
},
|
||
onLoad() {
|
||
this.loadConfig();
|
||
},
|
||
methods: {
|
||
async loadConfig() {
|
||
try {
|
||
const cachedConfig = uni.getStorageSync('appConfig');
|
||
if (cachedConfig) {
|
||
if (cachedConfig.common) {
|
||
this.serviceEmail = cachedConfig.common.serviceEmail || '';
|
||
this.servicePhone = cachedConfig.common.servicePhone || '';
|
||
}
|
||
if (cachedConfig.agreement) {
|
||
this.updateDate = cachedConfig.agreement.updateDate || '';
|
||
}
|
||
}
|
||
|
||
const res = await uni.request({
|
||
url: `${API_BASE}${API_ENDPOINTS.config.getAppConfig}`,
|
||
method: 'GET',
|
||
header: {
|
||
'Content-Type': 'application/json'
|
||
// 不添加认证头,因为这是公开接口
|
||
}
|
||
});
|
||
|
||
// 兼容不同平台的返回格式:可能是 [error, res] 或直接是 res
|
||
const response = Array.isArray(res) ? res[1] : res;
|
||
if (response && response.data && response.data.success && response.data.data) {
|
||
const config = response.data.data;
|
||
uni.setStorageSync('appConfig', config);
|
||
|
||
if (config.common) {
|
||
this.serviceEmail = config.common.serviceEmail || '';
|
||
this.servicePhone = config.common.servicePhone || '';
|
||
}
|
||
if (config.agreement) {
|
||
this.updateDate = config.agreement.updateDate || '';
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.error('加载配置失败:', error);
|
||
}
|
||
},
|
||
|
||
handleAgree() {
|
||
uni.showToast({
|
||
title: '感谢您的支持',
|
||
icon: 'success'
|
||
});
|
||
setTimeout(() => {
|
||
uni.navigateBack();
|
||
}, 1500);
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.agreement-container {
|
||
min-height: 100vh;
|
||
background: #FDF8F2;
|
||
}
|
||
|
||
.agreement-content {
|
||
display: flex;
|
||
flex-direction: column;
|
||
min-height: 100vh;
|
||
padding: 30upx;
|
||
|
||
/* 小程序平台需要额外的顶部间距(导航栏 + 状态栏) */
|
||
/* #ifdef MP-WEIXIN */
|
||
padding-top: calc(30upx + 88px);
|
||
/* #endif */
|
||
|
||
/* App 平台使用安全区域(状态栏高度) */
|
||
/* #ifdef APP-PLUS */
|
||
padding-top: calc(30upx + 44px + env(safe-area-inset-top));
|
||
/* #endif */
|
||
|
||
/* H5 和其他平台使用安全区域 */
|
||
/* #ifndef MP-WEIXIN || APP-PLUS */
|
||
padding-top: calc(30upx + constant(safe-area-inset-top));
|
||
padding-top: calc(30upx + env(safe-area-inset-top));
|
||
/* #endif */
|
||
}
|
||
|
||
/* 页面标题 */
|
||
.page-header {
|
||
text-align: center;
|
||
margin-bottom: 30upx;
|
||
|
||
.header-title {
|
||
display: block;
|
||
font-size: 44upx;
|
||
font-weight: 700;
|
||
color: #333;
|
||
margin-bottom: 15upx;
|
||
}
|
||
|
||
.header-subtitle {
|
||
display: block;
|
||
font-size: 24upx;
|
||
color: #999;
|
||
}
|
||
}
|
||
|
||
/* 内容区域 */
|
||
.content-section {
|
||
flex: 1;
|
||
background: white;
|
||
border-radius: 30upx;
|
||
overflow: hidden;
|
||
box-shadow: 0 8upx 40upx rgba(0, 0, 0, 0.08);
|
||
}
|
||
|
||
.scroll-content {
|
||
height: 100%;
|
||
padding: 40upx 30upx;
|
||
}
|
||
|
||
/* 内容块 */
|
||
.section-block {
|
||
margin-bottom: 40upx;
|
||
width: 100%;
|
||
box-sizing: border-box;
|
||
|
||
&:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.block-title {
|
||
font-size: 30upx;
|
||
font-weight: 700;
|
||
color: #333;
|
||
margin-bottom: 20upx;
|
||
padding-left: 20upx;
|
||
border-left: 6upx solid #8B7355;
|
||
}
|
||
|
||
.block-subtitle {
|
||
font-size: 28upx;
|
||
font-weight: 600;
|
||
color: #555;
|
||
margin: 20upx 0 15upx;
|
||
}
|
||
|
||
.block-content {
|
||
font-size: 26upx;
|
||
color: #666;
|
||
line-height: 2;
|
||
text-align: justify;
|
||
word-wrap: break-word;
|
||
word-break: break-word;
|
||
white-space: normal;
|
||
|
||
&.important {
|
||
background: linear-gradient(135deg, #FFF9E6 0%, #FFF3D6 100%);
|
||
padding: 15upx 20upx;
|
||
border-radius: 12upx;
|
||
border-left: 4upx solid #FFB800;
|
||
color: #FF9500;
|
||
font-weight: 600;
|
||
word-wrap: break-word;
|
||
word-break: break-word;
|
||
white-space: normal;
|
||
overflow: visible;
|
||
max-width: 90%;
|
||
margin: 0 auto 0 0;
|
||
}
|
||
|
||
.highlight {
|
||
color: #8B7355;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.contact-info {
|
||
color: #8B7355;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.footer-text {
|
||
display: block;
|
||
text-align: right;
|
||
margin-top: 20upx;
|
||
color: #8B7355;
|
||
font-weight: 600;
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 按钮区域 */
|
||
.button-section {
|
||
padding: 30upx 0 0;
|
||
}
|
||
|
||
.agree-btn {
|
||
width: 100%;
|
||
padding: 32upx;
|
||
background: linear-gradient(135deg, #8B7355 0%, #6D8B8B 100%);
|
||
border-radius: 50upx;
|
||
color: white;
|
||
font-size: 32upx;
|
||
font-weight: 600;
|
||
box-shadow: 0 10upx 40upx rgba(139, 115, 85, 0.3);
|
||
border: none;
|
||
|
||
&:active {
|
||
opacity: 0.8;
|
||
transform: scale(0.98);
|
||
}
|
||
}
|
||
</style>
|