Files
jurong_circle_frontdesk/src/views/Register.vue
2025-09-23 11:45:33 +08:00

1450 lines
64 KiB
Vue
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.

<template>
<div class="register-page">
<div class="register-container">
<div class="register-card">
<div class="register-header">
<h2>用户注册</h2>
<p>创建你的账号开始使用炬融圈</p>
</div>
<el-form
ref="registerFormRef"
:model="registerForm"
:rules="registerRules"
class="register-form"
@submit.prevent="handleRegister"
>
<el-form-item prop="phone">
<el-input
v-model="registerForm.phone"
placeholder="请输入手机号"
size="large"
:prefix-icon="Message"
clearable
/>
</el-form-item>
<el-form-item prop="smsCode">
<div class="sms-code-group">
<el-input
v-model="registerForm.smsCode"
placeholder="请输入短信验证码"
size="large"
:prefix-icon="ChatDotRound"
clearable
class="sms-input"
/>
<el-button
type="primary"
size="large"
:disabled="!canSendSMS || smsCountdown > 0"
:loading="sendingSMS"
@click="sendSMSCode"
class="sms-button"
>
{{ smsCountdown > 0 ? `${smsCountdown}s后重发` : '发送验证码' }}
</el-button>
</div>
</el-form-item>
<el-form-item prop="region">
<el-cascader
v-model="registerForm.region"
:options="regionOptions"
placeholder="请选择省市区"
size="large"
style="width: 100%"
:props="{ expandTrigger: 'hover', value: 'code' }"
:show-all-levels="true"
:collapse-tags="true"
:max-collapse-tags="1"
:teleported="false"
popper-class="mobile-cascader-popper"
@change="handleRegionChange"
>
<template #prefix>
<el-icon><Location /></el-icon>
</template>
</el-cascader>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="registerForm.password"
type="password"
placeholder="请输入密码"
size="large"
:prefix-icon="Lock"
show-password
clearable
/>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input
v-model="registerForm.confirmPassword"
type="password"
placeholder="请确认密码"
size="large"
:prefix-icon="Lock"
show-password
clearable
/>
</el-form-item>
<el-form-item prop="captcha">
<Captcha
ref="captchaRef"
v-model="registerForm.captcha"
placeholder="请输入验证码"
size="large"
/>
</el-form-item>
<el-form-item prop="agreement">
<el-checkbox
v-model="registerForm.agreement"
@click.prevent="showAgreementDialog"
:disabled="true"
>
<span @click="showAgreementDialog" class="agreement-text">
我已阅读并同意炬融圈用户协议<br>
融豆使用协议积分使用协议<br>
会员权益协议用户隐私协议
</span>
</el-checkbox>
<div class="agreement-hint">
<el-icon><InfoFilled /></el-icon>
<span>请点击查看协议和政策</span>
</div>
</el-form-item>
<el-form-item>
<el-button
type="primary"
size="large"
class="register-button"
:loading="userStore.loading"
@click="handleRegister"
>
{{ userStore.loading ? '注册中...' : '立即注册' }}
</el-button>
</el-form-item>
</el-form>
<div class="register-footer">
<p>
已有账号
<el-link type="primary" @click="$router.push('/mylogin')">
立即登录
</el-link>
</p>
</div>
</div>
</div>
<!-- 背景装饰 -->
<div class="background-decoration">
<div class="decoration-shape shape-1"></div>
<div class="decoration-shape shape-2"></div>
<div class="decoration-shape shape-3"></div>
<div class="decoration-shape shape-4"></div>
</div>
<el-drawer
direction="btt"
v-model="showAgreementDialogVisible"
size="90%"
show_close
title="协议和政策"
>
<div class="agreement-content">
<!-- 自定义导航栏 -->
<div class="custom-nav-bar">
<div
v-for="tab in agreementTabs"
:key="tab.name"
:class="['nav-item', { active: activeTab === tab.name }]"
@click="handleTabClick(tab.name)"
>
<span class="tab-label">{{ tab.label }}</span>
<el-icon v-if="tab.viewed" class="check-icon"><Check /></el-icon>
</div>
</div>
<!-- 协议内容区域 -->
<div class="agreement-tabs-content">
<div v-show="activeTab === 'user-text'" class="user-text-content" ref="userContent">
<h3>炬融圈用户协议</h3>
<p>欢迎您使用炬融圈以下简称"本网站"提供的服务本用户协议以下简称"协议"是您与本网站运营方以下简称"运营方"之间关于使用本网站服务所订立的具有法律效力的契约您在访问浏览注册或使用本网站任何服务前应仔细阅读并充分理解本协议全部条款一旦您开始使用本网站服务即视为您已自愿接受本协议所有内容的约束</p>
<p>用户权利与义务</p>
<p>您有权在符合本协议约定的前提下合法使用本网站提供的信息查询功能操作内容互动等服务运营方不得无故限制或剥夺您的合法使用权利</p>
<p>您在注册或使用本网站服务时应提供真实准确完整的个人信息如手机号邮箱等若信息发生变更需及时更新如因您提供虚假信息导致账号异常服务无法使用或产生法律风险均由您自行承担责任</p>
<p>您需遵守国家法律法规及本协议约定不得利用本网站从事任何违法违规活动包括但不限于传播违法色情暴力低俗等不良内容窃取泄露本网站或其他用户的信息攻击破坏本网站的系统或功能利用本网站进行诈骗传销等行为</p>
<p>您应妥善保管自己的账号如用户名手机号及密码对账号下的所有操作行为负责若发现账号被盗用异常登录等情况需立即通知运营方运营方将协助您进行核查与处理但因您自身保管不当导致的损失运营方不承担责任</p>
<p>您因充值享有账号对应的虚拟权益包括融豆与积分其中融豆可用于平台消费项目投标及商户流通未缴纳融豆服务费前不可出售或转让融豆平台可调整获取方式使用规则及兑换比例并公告用户有关融豆的权利与义务约定详见融豆使用协议积分由获取融豆按1:1生成积分可用于兑换商品或抵扣消费积分不可兑换现金仅限平台指定场景使用平台可设定积分有效期并调整抵扣规则有关积分的权利与义务约定详见融豆使用协议</p>
<p>您有权支付399元后成为终身会员享受平台板块访问融豆获取资格及专属活动会员权益仅限您本人使用不可转让出租或共享运营商可根据运营需要调整会员服务内容和开放范围并通过本网站相关页面向您公告有关会员的权利与义务约定详见融豆使用协议</p>
<p>网站权利与义务</p>
<p>运营方有权根据业务需求在合理范围内调整本网站的服务内容功能模块或界面设计但重大调整需提前通过本网站公告站内信等方式通知用户</p>
<p>运营方应按照本协议约定及相关法律法规保护您的个人信息安全具体信息保护规则详见本网站用户隐私协议该政策为本协议的重要组成部分与本协议具有同等法律效力</p>
<p>运营方有权对您使用本网站服务的行为进行监督与审核若发现您违反本协议或法律法规可根据情节严重程度采取警告限制账号功能冻结账号终止服务等措施并保留追究您法律责任的权利</p>
<p>运营方将尽力保障本网站的稳定运行但因不可抗力如自然灾害政策调整第三方服务故障如网络运营商问题或技术维护等原因导致网站暂时无法使用的运营方应及时通知用户并尽快恢复服务不承担由此造成的直接或间接损失</p>
<p>内容规范</p>
<p>您在本网站发布上传传播的内容包括但不限于文字图片视频评论等需符合国家法律法规及公序良俗不得侵犯他人的知识产权名誉权隐私权等合法权益若因您的内容引发侵权纠纷或法律责任均由您自行承担与运营方无关</p>
<p>本网站上的所有官方内容如网站介绍服务说明原创文章等的知识产权归运营方所有未经运营方书面许可您不得擅自复制转载传播或用于商业用途</p>
<p>运营方对用户发布的内容仅进行一般性审核不保证内容的真实性准确性或完整性不对用户因依赖此类内容而产生的损失负责若用户举报或运营方发现违规内容有权立即删除该内容并对相关账号进行处理</p>
<p>知识产权</p>
<p>本网站的软件系统界面设计商标logo文字内容图片素材等所有知识产权均归运营方或相关权利人所有中华人民共和国著作权法商标法等法律法规保护</p>
<p>您在本网站发布的原创内容知识产权归您所有但您同意授予运营方免费非独占可转授权的权利允许运营方在本网站及关联平台上展示传播该内容用于服务优化或合理推广如需用于商业合作运营方需另行获得您的书面许可</p>
<p>免责声明</p>
<p>本网站仅提供信息展示与服务对接不对第三方提供的产品服务或信息的真实性合法性负责您与第三方之间的交易或互动产生的纠纷由您与第三方自行解决运营方不承担连带责任</p>
<p>因技术漏洞网络攻击不可抗力等非运营方可控因素导致本网站服务中断数据丢失或您的权益受损运营方在采取合理补救措施后不承担由此产生的直接或间接损失</p>
<p>您明确知晓网络服务存在不确定性风险自愿承担使用本网站服务过程中的所有风险包括但不限于因信息误差账号安全内容合规等产生的风险</p>
<p>协议的变更与终止</p>
<p>运营方有权根据法律法规更新或业务调整对本协议内容进行修改修改后的协议将通过本网站首页公告或站内信等方式通知您公告发布后7日内无异议的视为您接受变更若您不同意变更可停止使用本网站服务</p>
<p>若您出现以下情形运营方有权单方面终止本协议停止为您提供服务且不承担任何责任</p>
<p>1. 严重违反本协议约定或法律法规经运营方警告后仍不改正</p>
<p>2. 账号长期超过12个月未使用且无有效联系方式</p>
<p>3. 您的账号被司法机关认定为用于违法活动</p>
<p>4. 法律法规或监管要求强制运营方终止服务</p>
<p>本协议终止后您应立即停止使用本网站服务运营方将根据法律法规要求保留您的相关信息但不再为您提供信息查询功能使用等服务</p>
<p>争议解决</p>
<p>若您与运营方就本协议的履行或解释产生争议应首先通过友好协商解决</p>
<p>协商不成的任何一方均有权向运营方所在地有管辖权的人民法院提起诉讼</p>
<p>本协议的成立生效履行解释及争议解决均适用中华人民共和国法律不包括冲突法规则</p>
<p>特别提示您确认已完整阅读理解并接受本协议全部条款包括用户隐私协议及本网站发布的其他规则若您对本协议有任何疑问可通过本网站联系我们板块与运营方沟通</p>
<p>运营方名称</p>
<p>联系地址</p>
<p>联系电话</p>
<p>生效日期</p>
</div>
<div v-show="activeTab === 'bean-text'" class="bean-text-content" ref="beanContent">
<h3>融豆使用协议</h3>
<p>欢迎您使用炬融圈以下简称"本平台"提供的融豆服务融豆使用协议以下简称"本协议"是您以下简称"用户"与本平台运营方以下简称"运营方"之间关于使用融豆服务所订立的专项协议炬融圈用户协议的重要组成部分您在使用融豆服务前应仔细阅读并充分理解本协议全部条款一旦您开始使用融豆服务即视为您已阅读并同意接受本协议及炬融圈用户协议所有内容的约束</p>
<p>定义</p>
<p>融豆指由平台发行的一种虚拟权益凭证可在平台指定的消费投标及商户流通场景中使用融豆的官方出售价格为1元人民币兑换1融豆</p>
<p>平台商户指经平台认证并授权允许在其经营场景中接受融豆进行支付结算或抵扣的商户</p>
<p>消费板块指平台为用户提供的各类业务场景的总称包括但不限于商品购买服务消费数字产品购买及项目投标等</p>
<p>融豆的获取与性质</p>
<p>用户可通过官方充值渠道以人民币购买融豆基础兑换比例为1元人民币兑换1融豆平台有权不定期推出优惠促销活动如折扣赠送等以调整的实际售价向用户出售融豆具体活动规则以平台官方公告为准</p>
<p>您明确知晓并同意融豆是平台内部的虚拟权益凭证不可直接兑换为法定货币不具备现金属性</p>
<p>融豆仅存在于用户在本平台的账户内其使用转让和流通严格限制在本平台生态系统之内严禁任何用户之间或用户与第三方之间在本平台之外进行融豆的私下转让交易赠与或任何形式的兑付该行为严重违反本协议平台有权对相关账户进行严厉处罚</p>
<p>融豆用途与范围</p>
<p>平台消费使用</p>
<p>融豆可在本平台所有开放的消费板块中使用包括但不限于购买实体商品支付服务费用如教育医疗生活服务等购买数字产品如课程订阅软件功能解锁会员权益等用户在使用融豆支付时可按照平台公布的规则抵扣相应比例的现金从而降低实际现金支出</p>
<p>项目投标使用</p>
<p>用户可将融豆用于平台发布的特定项目投标作为投标保证金或部分项目费用的抵扣中小企业用户使用融豆参与投标有助于降低投标的现金门槛平台通过融豆结算体系可建立更清晰的内部信用与参与记录</p>
<p>商户流通</p>
<p>融豆仅限于在平台认证的商户体系内流通用户或商户若希望进行融豆的转让或交易必须首先向平台支付年度服务费方可获得相应权限融豆仅可用于经平台认可的支付抵扣或结算行为在未按规定支付服务费之前用户不得以任何形式出售转让或赠予融豆</p>
<p>融豆服务费</p>
<p>平台为维护融豆体系的稳定运行提供风控管理及保障融豆价值有权向申请接入融豆支付体系的商户按年度收取技术服务费</p>
<p>商户支付服务费接入融豆体系后可增加来自平台用户的流量与交易机会提高客户黏性获得与平台更深度的合作价值</p>
<p>使用限制</p>
<p>您不得将融豆用于任何非法交易洗钱套现赌博等违反中华人民共和国法律法规及公序良俗的用途</p>
<p>您明确知晓并同意融豆是平台内部的虚拟权益凭证不可直接兑换为法定货币不具备现金属性</p>
<p>严禁任何用户离开本平台生态系统进行融豆的私下转让交易或兑付该行为被视为严重违规</p>
<p>如运营方发现您通过作弊利用系统漏洞参与欺诈活动使用非官方渠道充值或进行私下交易等违反本协议的方式违规获取或处置融豆运营方有权在不事先通知的情况下扣除或清零您账号内的全部融豆并保留暂停终止向您提供服务的权利及追究您相应法律责任的权利</p>
<p>平台权利与免责声明</p>
<p>运营方有权根据业务发展法律法规要求或市场变化单方面调整融豆的获取方式包括出售价格和优惠活动使用规则兑换比例及适用场景并将通过网站公告站内信等合理方式通知用户调整公告发布后若您继续使用融豆服务即视为接受变更后的规则</p>
<p>平台提供的融豆商品或服务以当时的状态为准如遇缺货停产或不可抗力因素平台可提供等值替代或取消兑换用户/商户不得要求额外赔偿</p>
<p>融豆为虚拟权益凭证不具备现金属性不受人民币管理条例及相关金融监管政策约束</p>
<p>因不可抗力如自然灾害政策调控网络攻击第三方服务故障如支付渠道问题电信运营商网络中断或必要的系统维护升级导致融豆功能暂时无法使用或数据异常的运营方将尽快恢复服务不承担由此给您造成的任何直接或间接损失</p>
<p>协议效力</p>
<p>本协议是炬融圈用户协议的补充协议与其具有同等法律效力本协议未约定事项均以炬融圈用户协议及相关平台规则为准</p>
<p>若本协议与炬融圈用户协议存在冲突应以本协议约定为准</p>
<p>争议解决</p>
<p>若您与运营方就本协议的履行或解释产生争议应首先通过友好协商解决</p>
<p>协商不成的任何一方均有权向运营方所在地有管辖权的人民法院提起诉讼</p>
<p>本协议的成立生效履行解释及争议解决均适用中华人民共和国法律不包括冲突法规则</p>
<p>特别提示您确认已完整阅读理解并接受本协议全部条款您在使用融豆服务过程中产生的任何疑问可通过本网站官方公布的联系方式与运营方沟通</p>
<p>运营方名称</p>
<p>联系地址</p>
<p>联系电话</p>
<p>生效日期</p>
</div>
<div v-show="activeTab === 'points-text'" class="points-text-content">
<h3>积分使用协议</h3>
<p>欢迎您使用[炬融圈]以下简称"本平台"提供的积分服务积分使用协议以下简称"本协议"是您以下简称"用户"与本平台运营方以下简称"运营方"之间关于使用积分服务所订立的专项协议炬融圈用户协议的重要组成部分您在使用积分服务前应仔细阅读并充分理解本协议全部条款您对积分的任何获取使用等行为即视为您已阅读并同意接受本协议及上述协议所有内容的约束</p>
<p>定义</p>
<p>融豆指由平台发行的一种虚拟权益凭证可用于平台内消费投标及其他指定用途</p>
<p>积分指用户在获取融豆的同时平台按照1:1比例生成的虚拟积分可用于兑换抵扣等平台指定场景</p>
<p>积分商城指平台专门为积分兑换设置的线上渠道用户可在商城中使用积分兑换商品或服务</p>
<p>积分获取</p>
<p>用户通过购买活动奖励项目投标或其他合法途径获得融豆时平台将同步生成与融豆数量相等的积分比例为1:1</p>
<p>积分仅记录在用户的个人账户内不可转让出售赠与或提现</p>
<p>平台保留根据运营需要调整积分获取规则包括但不限于获取比例获取方式等的权利并通过公告或通知方式予以公布</p>
<p>积分使用</p>
<p>积分兑换</p>
<p>1. 用户可在积分商城使用积分兑换实物商品虚拟权益优惠券或服务等</p>
<p>2. 积分商城内商品的种类数量库存情况以平台实时发布为准平台保留调整或下架商品的权利</p>
<p>3. 积分兑换一经确认不支持退还或撤销</p>
<p>积分抵扣</p>
<p>1. 用户在部分消费场景中可使用积分抵扣部分商品或服务价格</p>
<p>2. 折算标准为1 融豆 = 10,000 积分具体抵扣比例与上限以平台实际规则为准</p>
<p>3. 平台有权根据业务需要对抵扣规则进行调整并通过公告形式通知用户</p>
<p>使用限制</p>
<p>1. 积分不可直接兑换现金或作为现金存储使用</p>
<p>2. 积分仅限于平台指定的使用场景不得用于违反法律法规的交易或行为</p>
<p>积分有效期</p>
<p>积分自生成之日起默认长期有效平台有权基于运营管理需要设定有效期并提前公告例如平台可能设定积分自获得之日起至当年12月30日有效或自获得之日起N年内有效等具体以公告为准</p>
<p>超过有效期未使用的积分将自动作废用户不得要求补偿或赔偿</p>
<p>积分清零与扣除</p>
<p>如因系统故障作弊刷单虚假交易或其他不正当手段获取积分平台有权随时清零或扣除相关积分并保留追究法律责任的权利</p>
<p>用户账户被注销冻结或因违规被封禁的其剩余积分将全部作废</p>
<p>平台权利与免责</p>
<p>平台有权根据实际运营需求对积分的获取方式使用规则兑换比例及适用范围进行调整并通过平台公告或通知的方式告知用户公告或通知一经发布即视为有效通知</p>
<p>平台所提供的积分商品或服务以当时所示状态现状为准不保证商品或服务的适销性适用性或持续供应如遇缺货停产政策调整或不可抗力因素平台有权提供等值替代品或直接取消订单用户不得要求额外赔偿</p>
<p>积分为平台发行的虚拟权益不具备现金属性不得折算为人民币或其他任何法定货币不受人民币管理条例及相关金融监管政策的保障</p>
<p>平台对因网络故障系统维护不可抗力或第三方原因导致的积分获取兑换抵扣失败或延迟不承担赔偿责任但将尽力协助用户解决相关问题</p>
<p>用户义务</p>
<p>用户应合法合规使用积分不得利用积分从事违法活动或损害他人利益</p>
<p>用户应妥善保管账户信息因个人原因造成的积分损失如账户被盗由用户自行承担</p>
<p>用户在使用积分过程中须遵守本协议及平台其他相关规则</p>
<p>协议效力</p>
<p>本协议是炬融圈用户协议的补充协议与其具有同等法律效力本协议未约定事项均以炬融圈用户协议及相关平台规则为准</p>
<p>若本协议与炬融圈用户协议存在冲突应以本协议约定为准</p>
<p>争议解决</p>
<p>若您与运营方就本协议的履行或解释产生争议应首先通过友好协商解决</p>
<p>协商不成的任何一方均有权向运营方所在地有管辖权的人民法院提起诉讼</p>
<p>本协议的成立生效履行解释及争议解决均适用中华人民共和国法律不包括冲突法规则</p>
<p>特别提示您确认已完整阅读理解并接受本协议全部条款您在使用积分服务过程中产生的任何疑问可通过本网站官方公布的联系方式与运营方沟通</p>
<p>运营方名称</p>
<p>联系地址</p>
<p>联系电话</p>
<p>生效日期</p>
</div>
<div v-show="activeTab === 'vip-text'" class="vip-text-content">
<h3>会员权益协议</h3>
<p>欢迎您使用[炬融圈]以下简称"本平台"提供的会员服务会员权益协议以下简称"本协议"是您以下简称"会员""用户"与本平台运营方以下简称"运营方"之间关于使用会员服务所订立的专项协议炬融圈用户协议融豆使用协议的重要组成部分您在使用会员服务前应仔细阅读并充分理解本协议全部条款您购买或使用会员服务的任何行为即视为您已阅读并同意接受本协议及上述协议所有内容的约束</p>
<p>会员资格与费用</p>
<p>会员资格获取用户支付人民币399元后即可成为平台终身会员获得终身有效的会员资格</p>
<p>资格限制会员资格与初始购买账号绑定一经确认不得转让转售赠与继承或要求退款</p>
<p>费用调整平台有权根据市场与运营实际情况在未来调整新用户购买会员服务的费用标准此等调整对已缴费会员的既有权益不产生任何影响</p>
<p>会员权益</p>
<p>作为平台会员您可专享以下权益统称"会员权益"</p>
<p>板块访问权限</p>
<p>会员可无限制查看和使用平台现有及未来新增的所有业务板块包括但不限于</p>
<p>1. 项目投标板块发布参与及管理投标项目</p>
<p>2. 积分商城板块使用积分兑换专属商品或享受会员价</p>
<p>3. 直播平台观看专属直播内容与主播互动</p>
<p>4. 其他经平台不时开放或指定的功能板块</p>
<p>融豆获取与使用资格</p>
<p>1. 会员享有通过平台规定方式如充值参与活动等获取并持有融豆的专属资格</p>
<p>2. 会员可在平台内使用融豆进行消费参与项目投标或在其他指定场景中使用</p>
<p>3. 在未按平台规则支付融豆年度服务费之前会员仅享有融豆的使用权不得将融豆出售转让或用于任何平台禁止的交易融豆的具体使用规则以融豆使用协议为准</p>
<p>专属优惠与特权</p>
<p>1. 会员在商城购买特定商品或服务时可享受专属折扣价或会员价</p>
<p>2. 平台将不定期为会员提供专属优惠券红包限时特权等具体以平台实际发放为准</p>
<p>专属活动与服务</p>
<p>1. 平台可根据运营需要不定期为会员提供额外的专属活动新品试用优先购买权或客户服务如专属客服通道具体以平台实际公布为准</p>
<p>2. 平台可能提供会员等级成长体系根据会员活跃度或消费行为提供更多增值权益</p>
<p>使用限制</p>
<p>身份绑定会员权益仅限本人使用与会员账号严格绑定不得以任何形式出租出借共享或转让给任何第三方</p>
<p>行为规范会员不得利用会员身份从事任何违法违规扰乱平台秩序或损害平台及其他用户利益的行为</p>
<p>违规处理如会员违反本协议或平台其他规则平台有权根据情节严重程度采取包括但不限于警告暂停部分或全部会员权益冻结账号终止会员资格且不退还任何已缴纳费用等措施并保留追究法律责任的权利</p>
<p>平台权利与免责声明</p>
<p>权益调整平台有权根据实际运营情况法律法规要求或为提升服务质量对会员权益的具体内容形式开放范围及有效期等进行合理调整包括增加减少或变更并通过平台公告站内信等合理方式告知会员该等调整对公告发布前已产生的权益产生影响时平台将提供合理解决方案</p>
<p>服务状态平台提供的会员服务及相关权益以"现状""可提供"的状态为准平台将尽力维护服务的稳定性但不保证所有服务功能优惠或合作品牌永久不变持续供应或不中断</p>
<p>免责情形因不可抗力如自然灾害政策管制网络故障系统维护技术故障第三方服务中断或运营商原因如银行支付平台故障导致会员权益无法正常享用或延迟的平台不承担赔偿责任但将采取合理措施尽力协助解决或恢复</p>
<p>最终解释权平台保留在法律允许的范围内对本协议及会员权益的具体实施细则进行单方面解释的权利</p>
<p>协议效力</p>
<p>本协议是炬融圈用户协议融豆使用协议的补充协议与其具有同等法律效力本协议未约定事项均以炬融圈用户协议融豆使用协议及相关平台规则为准</p>
<p>若本协议与炬融圈用户协议融豆使用协议存在冲突应以本协议约定为准</p>
<p>争议解决</p>
<p>若您与运营方就本协议的履行或解释产生争议应首先通过友好协商解决</p>
<p>协商不成的任何一方均有权向运营方所在地有管辖权的人民法院提起诉讼</p>
<p>本协议的成立生效履行解释及争议解决均适用中华人民共和国法律不包括冲突法规则</p>
<p>特别提示您确认已完整阅读理解并接受本协议全部条款您在使用会员服务过程中产生的任何疑问可通过本网站官方公布的联系方式与运营方沟通</p>
<p>运营方名称</p>
<p>联系地址</p>
<p>联系电话</p>
<p>生效日期</p>
</div>
<div v-show="activeTab === 'privacy-text'" class="privacy-text-content">
<h3>用户隐私协议</h3>
<p>欢迎您使用炬融圈平台服务用户隐私协议以下简称"本协议"由炬融圈平台运营方以下简称"运营方""我们")与注册并使用平台服务的用户以下简称"用户""您")共同订立本协议旨在明确说明运营方在您注册使用融豆积分会员服务及其他相关功能过程中收集使用存储和保护您个人信息的方式及您所享有的权利请您在使用平台服务前仔细阅读并充分理解本协议全部内容您注册登录或使用平台服务的行为即视为您已阅读理解并同意接受本协议所有条款的约束</p>
<p>信息收集范围</p>
<p>为向您提供平台服务我们可能会收集以下类型的个人信息</p>
<p>注册信息您在注册账户时提供的姓名手机号邮箱地址身份证号账户名密码及其他身份认证信息</p>
<p>1. 账户及服务信息您的融豆余额积分数量会员状态交易记录项目投标信息订单详情及支付记录</p>
<p>2. 使用行为信息您使用平台服务时产生的访问记录浏览历史点击流操作日志设备标识信息如IP地址大致位置信息等</p>
<p>3. 第三方信息当您选择使用第三方账号如微信登录或使用第三方支付服务时在您授权的前提下我们从第三方处获得的与您相关的信息</p>
<p>信息使用目的</p>
<p>我们收集和使用您的信息主要基于以下目的</p>
<p>为您创建维护并管理用户账户提供并保障融豆积分会员等核心服务的正常运行</p>
<p>1. 支持融豆的充值消费流转以及积分的获取兑换抵扣等功能确保交易与投标流程的安全稳定</p>
<p>优化平台的产品性能服务内容及界面设计提升您的用户体验</p>
<p>2. 进行风险控制安全监测用于防范发现调查欺诈危害安全违规或非法行为</p>
<p>3. 向您发送与服务相关的通知告警活动信息及会员权益资讯或在获得您同意后提供个性化推荐</p>
<p>4. 履行适用的法律法规配合政府部门司法机关的监管或执法要求</p>
<p>信息共享转让与披露</p>
<p>我们高度重视您的个人信息安全承诺不会将您的个人信息出售给任何第三方</p>
<p>仅在以下必要情形下我们可能会共享转让或披露您的个人信息</p>
<p>1. 获得您的明确同意或授权</p>
<p>2. 为完成融豆支付积分兑换或会员权益兑现与经平台认证的商户进行必要共享</p>
<p>3. 应法律法规司法行政机关监管机构的强制性要求而进行披露</p>
<p>4. 为维护运营方用户及社会公共利益免受损害而必要披露</p>
<p>5. 随着我们业务的持续发展我们及我们的关联方有可能进行合并收购资产转让或类似的交易您的个人信息有可能作为此类交易的一部分而被转移 我们将要求新的持有您个人信息的公司组织继续受本协议的约束否则我们将要求该公司组织重新征求您的授权同意</p>
<p>与我们共享信息的第三方将被要求严格遵守保密义务并仅能为提供上述目的之服务而使用您的信息</p>
<p>信息存储与保护</p>
<p>我们将采取符合行业标准的合理技术措施和管理流程保护您的个人信息免遭泄露丢失篡改或未经授权的访问</p>
<p>您的账户信息和密码属于敏感信息请您务必妥善保管因您个人原因导致上述信息泄露或丢失而造成的损失运营方不承担责任</p>
<p>我们可能会根据业务需要在中华人民共和国境内或境外的服务器上存储您的信息无论在何处存储我们都将确保其受到与本协议所述标准相当的保护并严格遵守数据出境的相关法律法规</p>
<p>用户权利</p>
<p>您有权通过平台提供的功能查询访问更新及更正您的个人信息</p>
<p>您可以联系我们请求删除您的个人信息或限制对其的处理但请您理解删除必要信息可能导致您无法继续使用部分或全部平台服务包括融豆积分及会员权益的管理与使用</p>
<p>您可以选择不提供某些个人信息但这同样可能导致我们无法为您提供相应的服务</p>
<p>儿童用户保护</p>
<p>平台主要面向成年人若您是未满18周岁的未成年人请在您的父母或其他监护人的指导下仔细阅读本协议并在征得您的父母或其他监护人同意后使用我们的服务</p>
<p>我们不会故意收集未满18周岁未成年人的个人信息如果我们发现自己在未获得可证实的监护人同意的情况下收集了未成年人的个人信息将会立即设法删除相关数据或进行匿名化处理</p>
<p>安全与免责</p>
<p>我们将尽力为您的信息提供安全保护但对于因不可抗力计算机病毒黑客攻击网络通道故障及其他非运营方可控的第三方原因导致的信息泄露丢失或被篡改运营方不承担赔偿责任但我们将协助您降低相关风险</p>
<p>您应妥善保管自己的账户密码及手机验证码等身份要素所有通过您的账户和密码进行的操作均视为您本人的行为由此导致的任何风险和责任由您自行承担</p>
<p>停止运营免责如运营方终止服务或运营我们将根据适用法律法规的要求及时停止继续收集您个人信息的活动并通过网站公告推送通知等一种或多种方式进行告知在终止服务或运营后我们会对您的个人信息进行删除或匿名化处理但法律法规或监管部门另有规定的除外对于因运营方停止运营导致的任何直接或间接损失运营方不承担赔偿责任</p>
<p>协议的变更与通知</p>
<p>为了给您提供更好的服务本协议可能会不时更新我们会通过在平台网站发布更新版本推送系统通知或其他合适的方式提醒您相关内容的更新也请您定期访问平台以便及时了解最新的隐私政策</p>
<p>变更后的协议将在公布后7日生效若您在本协议内容修订后继续使用平台服务即表示您已充分阅读理解并接受修订后的协议如果您不同意变更后的内容您有权停止使用平台服务</p>
<p>协议效力</p>
<p>本协议是炬融圈用户协议的重要组成部分与其具有同等法律效力</p>
<p>本协议未尽事宜按照前述相关协议及平台现有规则执行</p>
<p>争议解决</p>
<p>若您与运营方就本协议的履行或解释产生争议应首先通过友好协商解决</p>
<p>协商不成的任何一方均有权向运营方所在地有管辖权的人民法院提起诉讼</p>
<p>本协议的成立生效履行解释及争议解决均适用中华人民共和国法律不包括冲突法规则</p>
<p>特别提示您确认已完整阅读理解并接受本协议全部条款您在使用积分服务过程中产生的任何疑问可通过本网站官方公布的联系方式与运营方沟通</p>
<p>运营方名称</p>
<p>联系地址</p>
<p>联系电话</p>
<p>生效日期</p>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<div class="read-status">
</div>
<div class="dialog-buttons">
<el-button @click="closeAgreementDialog">取消</el-button>
<el-button type="primary" @click="confirmAgreement" :disabled="!(userViewed && beanViewed && pointsViewed && vipViewed && privacyViewed)">确认已阅读</el-button>
</div>
</div>
</template>
</el-drawer>
</div>
</template>
<script setup>
import { ref, reactive, computed, onMounted } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { useUserStore } from '@/stores/user';
import { ElMessage, ElMessageBox } from 'element-plus';
import {
User,
Lock,
Message,
Edit,
ChatDotRound,
CreditCard,
Location,
InfoFilled,
Check,
} from '@element-plus/icons-vue';
import Captcha from '@/components/Captcha.vue';
import api from '@/utils/api'
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
// 表单引用
const registerFormRef = ref();
const captchaRef = ref();
// 表单数据
const registerForm = reactive({
username: '',
phone: '',
region: [],
province: '',
city: '',
district: '',
district_id: '',
password: '',
confirmPassword: '',
captcha: '',
smsCode: '',
agreement: false,
});
// 协议查看状态
const userViewed = ref(false);
const beanViewed = ref(false);
const pointsViewed = ref(false);
const vipViewed = ref(false);
const privacyViewed = ref(false);
// 协议弹窗相关状态
const showAgreementDialogVisible = ref(false);
const activeTab = ref('user-text');
const userContent = ref();
const beanContent = ref();
// 协议标签页数据
const agreementTabs = ref([
{ name: 'user-text', label: '炬融圈用户协议', viewed: false },
{ name: 'bean-text', label: '融豆使用协议', viewed: false },
{ name: 'points-text', label: '积分使用协议', viewed: false },
{ name: 'vip-text', label: '会员权益协议', viewed: false },
{ name: 'privacy-text', label: '用户隐私协议', viewed: false }
]);
// 短信验证码相关状态
const sendingSMS = ref(false);
const smsCountdown = ref(0);
const canSendSMS = computed(() => {
const phoneRegex = /^1[3-9]\d{9}$/;
return phoneRegex.test(registerForm.phone);
});
// 地区数据
const regions = ref([]);
const regionOptions = ref([]);
const cities = computed(() => {
const citySet = new Set();
regions.value.forEach((region) => {
if (region.city_name) {
citySet.add(region.city_name);
}
});
return Array.from(citySet).sort();
});
const filteredDistricts = computed(() => {
if (!registerForm.city) return [];
return regions.value.filter(
(region) => region.city_name === registerForm.city
);
});
// 自定义验证函数
const validateUsername = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入用户名'));
} else if (value.length < 3) {
callback(new Error('用户名至少3个字符'));
} else if (value.length > 20) {
callback(new Error('用户名不能超过20个字符'));
} else if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(value)) {
callback(new Error('用户名只能包含字母、数字、下划线和中文'));
} else {
callback();
}
};
const validatePassword = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入密码'));
} else if (value.length < 6) {
callback(new Error('密码至少6个字符'));
} else if (value.length > 20) {
callback(new Error('密码不能超过20个字符'));
} else if (!/(?=.*[a-zA-Z])(?=.*\d)/.test(value)) {
callback(new Error('密码必须包含字母和数字'));
} else {
// 如果确认密码已输入,重新验证确认密码
if (registerForm.confirmPassword) {
registerFormRef.value?.validateField('confirmPassword');
}
callback();
}
};
const validateConfirmPassword = (rule, value, callback) => {
if (!value) {
callback(new Error('请确认密码'));
} else if (value !== registerForm.password) {
callback(new Error('两次输入的密码不一致'));
} else {
callback();
}
};
const validateAgreement = (rule, value, callback) => {
if (!value) {
callback(new Error('请阅读并同意协议和政策'));
} else {
callback();
}
};
// 表单验证规则
const registerRules = {
username: [{ validator: validateUsername, trigger: 'blur' }],
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{
pattern: /^1[3-9]\d{9}$/,
message: '请输入正确的手机号',
trigger: 'blur',
},
],
smsCode: [
{ required: true, message: '请输入短信验证码', trigger: 'blur' },
{ pattern: /^\d{6}$/, message: '短信验证码为6位数字', trigger: 'blur' },
],
region: [{ required: true, message: '请选择省市区', trigger: 'change' }],
password: [{ validator: validatePassword, trigger: 'blur' }],
confirmPassword: [{ validator: validateConfirmPassword, trigger: 'blur' }],
captcha: [
{ required: true, message: '请输入验证码', trigger: 'blur' },
{ min: 4, max: 4, message: '验证码长度为4位', trigger: 'blur' },
],
agreement: [{ validator: validateAgreement, trigger: 'change' }],
};
// 发送短信验证码
const sendSMSCode = async () => {
if (!canSendSMS.value || sendingSMS.value || smsCountdown.value > 0) {
return;
}
try {
sendingSMS.value = true;
const response = await fetch('/api/sms/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
phone: registerForm.phone,
}),
});
const result = await response.json();
if (result.success) {
ElMessage.success('验证码发送成功,请查收短信');
// 开始倒计时
startCountdown();
} else {
ElMessage.error(result.message || '发送失败,请重试');
}
} catch (error) {
console.error('发送短信验证码失败:', error);
ElMessage.error('发送失败,请检查网络连接');
} finally {
sendingSMS.value = false;
}
};
// 开始倒计时
const startCountdown = () => {
smsCountdown.value = 60;
const timer = setInterval(() => {
smsCountdown.value--;
if (smsCountdown.value <= 0) {
clearInterval(timer);
}
}, 1000);
};
// 加载省市区级联数据
const loadRegionOptions = async () => {
const provincesResponse = await api.get('/regions/provinces');
regionOptions.value = provincesResponse.data.data || [];
};
// 处理级联选择器变化
const handleRegionChange = (value) => {
if (value && value.length === 3) {
registerForm.province = value[0];
registerForm.city = value[1];
registerForm.district = value[2];
registerForm.district_id = value[2];
}
};
/**
* 城市变化处理
*/
const onCityChange = () => {
// 清空区域选择
registerForm.district_id = '';
};
// 处理注册
const handleRegister = async () => {
if (!registerFormRef.value || !captchaRef.value) return;
try {
// 先验证表单
const valid = await registerFormRef.value.validate();
if (!valid) return;
// 获取验证码信息
const captchaInfo = captchaRef.value.getCaptchaInfo();
// 提交注册请求(包含验证码信息)
const registerData = {
username: registerForm.phone,
phone: registerForm.phone,
city: registerForm.city,
district_id: registerForm.district_id,
password: registerForm.password,
smsCode: registerForm.smsCode,
captchaId: captchaInfo.captchaId,
captchaText: captchaInfo.captchaText,
province: registerForm.province,
inviter: registerForm.inviter,
};
console.log(registerData,'registerData');
console.log(registerForm,'registerForm')
const result = await userStore.register(registerData);
if (result.success) {
// 检查是否需要支付
if (result.needPayment) {
ElMessage.success('用户信息创建成功,请完成支付以激活账户');
// 跳转到支付页面
router.push({
path: '/payment',
});
} else {
ElMessage.success('注册成功!请登录');
router.push('/mylogin');
}
}
} catch (error) {
console.error('注册失败:', error);
// 注册失败后刷新验证码
if (captchaRef.value) {
await captchaRef.value.refreshCaptcha();
}
registerForm.captcha = '';
}
};
// 显示协议弹窗
const showAgreementDialog = () => {
showAgreementDialogVisible.value = true;
activeTab.value = 'user-text';
// 弹窗打开时默认用户协议已读
userViewed.value = true;
// 标记第一个标签页为已读
agreementTabs.value[0].viewed = true;
};
// 关闭协议弹窗
const closeAgreementDialog = () => {
showAgreementDialogVisible.value = false;
};
// 确认已阅读协议
const confirmAgreement = () => {
if (userViewed.value && beanViewed.value && pointsViewed.value && vipViewed.value && privacyViewed.value) {
registerForm.agreement = true;
showAgreementDialogVisible.value = false;
ElMessage.success('已确认阅读协议和政策');
} else {
ElMessage.warning('请先查看协议和政策');
}
};
// 处理选项卡切换
const handleTabClick = (tabName) => {
activeTab.value = tabName;
// 标记对应协议为已读
const tab = agreementTabs.value.find(t => t.name === tabName);
if (tab) {
tab.viewed = true;
}
// 更新原有的viewed状态
if (tabName === 'user-text') {
userViewed.value = true;
} else if (tabName === 'bean-text') {
beanViewed.value = true;
} else if (tabName === 'points-text') {
pointsViewed.value = true;
} else if (tabName === 'vip-text') {
vipViewed.value = true;
} else if (tabName === 'privacy-text') {
privacyViewed.value = true;
}
};
// 图片上传成功处理
const handleUploadSuccess = (response, field) => {
ElMessage.success('图片上传成功');
};
// 图片上传失败处理
const handleUploadError = (error) => {
ElMessage.error('图片上传失败,请重试');
};
const invite = async () => {
const inviter = route.query.inviter;
console.log('邀请人ID:', inviter);
if (inviter) {
registerForm.inviter = inviter;
}
}
// 组件挂载时的处理
onMounted(() => {
// 如果已经登录,直接跳转
if (userStore.isAuthenticated) {
const redirectPath = route.query.redirect || '/';
router.push(redirectPath);
}
// 加载省市区级联数据
loadRegionOptions();
invite();
});
</script>
<style lang="scss" scoped>
.register-page {
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.register-container {
width: 100%;
max-width: 450px;
padding: 20px;
position: relative;
z-index: 10;
}
.register-card {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 16px;
padding: 40px 30px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.register-header {
text-align: center;
margin-bottom: 30px;
}
.register-header h2 {
color: #303133;
margin-bottom: 8px;
font-weight: 600;
}
.register-header p {
color: #909399;
font-size: 14px;
}
.register-form {
margin-bottom: 20px;
}
.register-button {
width: 100%;
height: 44px;
font-size: 16px;
font-weight: 600;
}
.register-footer {
text-align: center;
margin-bottom: 20px;
}
.register-footer p {
color: #606266;
font-size: 14px;
}
.document-upload-section {
margin: 20px 0;
}
.document-upload-section .el-divider {
margin: 20px 0;
}
.document-upload-section .el-form-item {
margin-bottom: 20px;
}
.document-upload-section .el-form-item .el-form-item__label {
font-weight: 500;
color: #606266;
}
.feature-item {
display: flex;
align-items: center;
gap: 8px;
color: #606266;
font-size: 14px;
}
.feature-item .el-icon {
color: #409eff;
font-size: 16px;
}
.upload-preview {
margin-top: 10px;
}
.upload-preview img {
width: 100px;
height: 100px;
object-fit: cover;
border-radius: 8px;
border: 1px solid #dcdfe6;
}
.upload-demo {
margin-bottom: 10px;
}
.background-decoration {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.decoration-shape {
position: absolute;
background: rgba(255, 255, 255, 0.1);
animation: float 8s ease-in-out infinite;
}
.shape-1 {
width: 100px;
height: 100px;
border-radius: 50%;
top: 15%;
left: 15%;
animation-delay: 0s;
}
.shape-2 {
width: 80px;
height: 80px;
border-radius: 20px;
top: 70%;
right: 20%;
animation-delay: 2s;
}
.shape-3 {
width: 60px;
height: 60px;
border-radius: 50%;
bottom: 25%;
left: 25%;
animation-delay: 4s;
}
.shape-4 {
width: 120px;
height: 40px;
border-radius: 20px;
top: 40%;
right: 10%;
animation-delay: 6s;
}
@keyframes float {
0%,
100% {
transform: translateY(0px) rotate(0deg);
opacity: 0.7;
}
50% {
transform: translateY(-15px) rotate(180deg);
opacity: 1;
}
}
/* 响应式设计 */
@media (max-width: 480px) {
.register-container {
padding: 15px;
}
.register-card {
padding: 30px 20px;
}
.features-list {
gap: 8px;
}
}
/* Element Plus 组件样式覆盖 */
:deep(.el-input__wrapper) {
border-radius: 8px;
}
:deep(.el-button) {
border-radius: 8px;
}
:deep(.el-divider__text) {
background-color: rgba(255, 255, 255, 0.95);
color: #909399;
}
:deep(.el-checkbox__label) {
font-size: 14px;
color: #606266;
}
/* 输入框聚焦效果 */
:deep(.el-input__wrapper:hover),
:deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409eff inset;
}
/* 加载状态样式 */
.register-button.is-loading {
pointer-events: none;
}
/* 动画效果 */
.register-card {
animation: slideInUp 0.6s ease-out;
}
@keyframes slideInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 错误状态样式 */
:deep(.el-form-item.is-error .el-input__wrapper) {
box-shadow: 0 0 0 1px #f56c6c inset;
}
/* 成功状态样式 */
:deep(.el-form-item.is-success .el-input__wrapper) {
box-shadow: 0 0 0 1px #67c23a inset;
}
/* 协议对话框样式 */
:deep(.agreement-dialog),
:deep(.privacy-dialog) {
.el-message-box__content {
max-height: 400px;
overflow-y: auto;
}
}
/* 密码强度指示器 */
.password-strength {
margin-top: 5px;
font-size: 12px;
}
.strength-weak {
color: #f56c6c;
}
.strength-medium {
color: #e6a23c;
}
.strength-strong {
color: #67c23a;
}
/* 短信验证码样式 */
.sms-code-group {
display: flex;
gap: 12px;
align-items: center;
}
.sms-input {
flex: 1;
}
.sms-button {
flex-shrink: 0;
min-width: 120px;
height: 40px;
}
.sms-button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* 协议相关样式 */
.agreement-hint {
display: flex;
align-items: center;
gap: 6px;
margin-top: 8px;
font-size: 12px;
color: #e6a23c;
}
.agreement-hint .el-icon {
font-size: 14px;
}
.agreement-text {
color: #409eff;
cursor: pointer;
text-decoration: underline;
}
.agreement-text:hover {
color: #66b1ff;
}
/* 协议弹窗样式 */
:deep(.agreement-dialog) {
.el-dialog__body {
padding: 20px;
max-height: 60vh;
overflow: hidden;
}
}
.agreement-content {
height: 100%;
}
/* 自定义导航栏样式 */
.custom-nav-bar {
display: flex;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: thin;
scrollbar-color: #c1c1c1 #f1f1f1;
flex-wrap: nowrap;
-webkit-overflow-scrolling: touch;
overscroll-behavior-x: contain;
border-bottom: 1px solid #e4e7ed;
background: #fff;
padding: 0 10px;
}
.custom-nav-bar::-webkit-scrollbar {
height: 6px;
}
.custom-nav-bar::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.custom-nav-bar::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
.custom-nav-bar::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
.nav-item {
flex: none;
min-width: 120px;
white-space: nowrap;
padding: 12px 16px;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.3s ease;
font-size: 14px;
color: #606266;
text-align: center;
position: relative;
}
.nav-item:hover {
color: #409eff;
}
.nav-item.active {
color: #409eff;
border-bottom-color: #409eff;
font-weight: 500;
}
.nav-item .check-icon {
margin-left: 5px;
color: #67c23a;
}
/* 导航栏滑动容器 */
:deep(.el-tabs__nav-wrap) {
overflow-x: auto !important;
overflow-y: hidden !important;
scrollbar-width: thin;
scrollbar-color: #c1c1c1 #f1f1f1;
flex-wrap: nowrap !important;
/* 启用触摸滚动 */
-webkit-overflow-scrolling: touch;
/* 确保可以拖动滚动 */
overscroll-behavior-x: contain;
}
:deep(.el-tabs__nav-wrap::-webkit-scrollbar) {
height: 6px !important;
}
:deep(.el-tabs__nav-wrap::-webkit-scrollbar-track) {
background: #f1f1f1 !important;
border-radius: 3px !important;
}
:deep(.el-tabs__nav-wrap::-webkit-scrollbar-thumb) {
background: #c1c1c1 !important;
border-radius: 3px !important;
}
:deep(.el-tabs__nav-wrap::-webkit-scrollbar-thumb:hover) {
background: #a8a8a8 !important;
}
:deep(.el-tabs__nav) {
display: flex !important;
width: max-content !important;
min-width: 100% !important;
flex-wrap: nowrap !important;
}
:deep(.el-tabs__item) {
flex: none !important;
min-width: 120px !important;
white-space: nowrap !important;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
padding: 0 16px;
margin: 0 4px;
border-radius: 6px;
transition: all 0.3s ease;
}
/* 确保协议弹窗内的标签页可以正常滚动 */
:deep(.el-drawer .el-tabs__nav-wrap) {
overflow-x: auto !important;
overflow-y: hidden !important;
}
:deep(.agreement-dialog .el-tabs__item:hover) {
background-color: #f5f7fa;
}
:deep(.agreement-dialog .el-tabs__item.is-active) {
background-color: #409eff;
color: white;
}
.tab-label {
margin-right: 4px;
font-size: 13px;
font-weight: 500;
}
/* 统一所有协议内容样式 */
.user-text-content,
.bean-text-content,
.points-text-content,
.vip-text-content,
.privacy-text-content {
max-height: 600px;
overflow-y: auto;
padding: 20px;
line-height: 1.6;
font-size: 14px;
color: #606266;
border: 1px solid #e4e7ed;
border-radius: 8px;
background-color: #fafafa;
}
.user-text-content h3,
.bean-text-content h3,
.points-text-content h3,
.vip-text-content h3,
.privacy-text-content h3 {
color: #303133;
margin-bottom: 16px;
font-size: 18px;
font-weight: 600;
}
.user-text-content p,
.bean-text-content p,
.points-text-content p,
.vip-text-content p,
.privacy-text-content p {
margin-bottom: 12px;
}
.user-text-content strong,
.bean-text-content strong,
.points-text-content strong,
.vip-text-content strong,
.privacy-text-content strong {
color: #409eff;
font-weight: 600;
}
.dialog-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 20px;
}
.check-icon {
color: #67c23a;
font-size: 16px;
}
/* 滚动条样式 */
.user-text-content::-webkit-scrollbar,
.bean-text-content::-webkit-scrollbar {
width: 6px;
}
.user-text-content::-webkit-scrollbar-track,
.bean-text-content::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.user-text-content::-webkit-scrollbar-thumb,
.bean-text-content::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
.user-text-content::-webkit-scrollbar-thumb:hover,
.bean-text-content::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
:deep(.el-link.viewed:hover) {
color: #529b2e !important;
}
/* 移动端级联选择器样式优化 */
:deep(.mobile-cascader-popper) {
max-width: calc(100vw - 20px) !important;
left: 10px !important;
right: 10px !important;
transform: none !important;
margin: 0 !important;
}
:deep(.mobile-cascader-popper .el-cascader-panel) {
max-width: 100% !important;
overflow-x: hidden !important;
display: flex !important;
gap: 0 !important;
padding: 0 !important;
}
:deep(.mobile-cascader-popper .el-cascader-menu) {
min-width: 33.33% !important;
max-width: 33.33% !important;
width: 33.33% !important;
flex-shrink: 0 !important;
flex-grow: 0 !important;
overflow-x: hidden !important;
border-right: 1px solid #e4e7ed;
margin: 0 !important;
}
:deep(.mobile-cascader-popper .el-cascader-menu:last-child) {
border-right: none !important;
}
:deep(.mobile-cascader-popper .el-cascader-menu__item) {
padding: 6px 3px !important;
line-height: 1.1 !important;
font-size: 12px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
margin: 0 !important;
box-sizing: border-box !important;
}
@media (max-width: 480px) {
:deep(.mobile-cascader-popper) {
max-width: calc(100vw - 16px) !important;
left: 8px !important;
right: 8px !important;
}
:deep(.mobile-cascader-popper .el-cascader-menu__item) {
padding: 5px 2px !important;
font-size: 11px !important;
}
}
@media (max-width: 360px) {
:deep(.mobile-cascader-popper) {
max-width: calc(100vw - 12px) !important;
left: 6px !important;
right: 6px !important;
}
:deep(.mobile-cascader-popper .el-cascader-menu__item) {
padding: 4px 1px !important;
font-size: 10px !important;
line-height: 1.0 !important;
}
}
@media (max-width: 320px) {
:deep(.mobile-cascader-popper .el-cascader-menu__item) {
padding: 3px 1px !important;
font-size: 9px !important;
}
}
</style>