Files
jurong_circle_frontdesk/src/views/MyProfile.vue
2025-09-23 15:59:31 +08:00

1122 lines
51 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="personal-center">
<!-- 用户信息区域 -->
<div class="user-info-section">
<div class="user-avatar">
<el-avatar
:size="76"
:src="avatarUrl"
class="avatar-img"
>
<el-icon>
<User/>
</el-icon>
</el-avatar>
<el-button
type="primary"
size="small"
@click="showAvatarUpload = true"
class="upload-btn"
>
更换头像
</el-button>
</div>
<div class="user-actions">
<template v-if="userStore.isAuthenticated">
<span class="username">{{ userStore.user?.username || '用户' }}</span>
<div class="user-role">
<template v-if="accountInfo.distribution">
<el-tag v-if="accountInfo.user_type==='agent_directly'" type="primary">直营代理</el-tag>
<el-tag v-if="accountInfo.user_type==='directly_operated'" type="primary">直营商户</el-tag>
<el-tag v-if="accountInfo.user_type==='agent'" type="primary">代理</el-tag>
<el-tag v-if="accountInfo.user_type==='user'" type="primary">融豆商户</el-tag>
</template>
<el-tag v-else type="primary">普通用户</el-tag>
</div>
<!-- <button class="logout-btn" @click="handleLogout">退出登录</button>-->
</template>
<template v-else>
<div class="auth-buttons">
<router-link to="/mylogin">
<button class="login-btn">立即登录</button>
</router-link>
<router-link to="/register">
<button class="register-btn">注册</button>
</router-link>
</div>
</template>
</div>
</div>
<!-- 功能入口区域 -->
<div class="function-section">
<div class="function-grid">
<router-link
v-for="(item, index) in functionItems"
:key="index"
:to="item.path"
class="function-item"
custom
v-slot="{ navigate }"
>
<div @click="navigate" class="function-item-content">
<div class="function-icon">
<img :src="item.image" :alt="item.text" class="function-image">
</div>
<div class="function-text">{{ item.text }}</div>
</div>
</router-link>
</div>
</div>
<!-- 余额和记录区域 -->
<div class="balance-section">
<div class="balance-card">
<div class="balance-item">
<span class="balance-label">我的融豆</span>
<div class="balance-content">
<img src='/imgs/profile/rongdou.png' alt="融豆" class="bean-image">
<div class="balance-value">{{ Math.abs(accountInfo.balance) }}</div>
</div>
</div>
<div class="agreement-section">
<el-checkbox
v-model="accountInfo.is_distribute"
@change="handleDistributeChange"
class="distribute-checkbox"
:true-label="true"
:false-label="false"
>
自愿委托寄售
</el-checkbox>
<el-link
type="primary"
@click="showAgreement"
>
融豆委托寄售协议
</el-link>
</div>
</div>
</div>
<!-- 我的订单 -->
<div class="order-section">
<div class="section-header">
<h3>我的订单</h3>
<router-link to="/orders">
<span class="view-all">查看全部 ></span>
</router-link>
</div>
</div>
<!-- 设置选项区域 -->
<div class="settings-section">
<div class="setting-item" v-for="(item, index) in settings" :key="index">
<router-link :to="item.path" class="setting-link"> <!-- 添加 class 便于样式控制 -->
<div class="setting-content" @click="item.click"> <!-- 添加 class 便于样式控制 -->
<span class="setting-text">{{ item.text }}</span>
<span class="setting-arrow">></span>
</div>
</router-link>
</div>
</div>
<div v-if="userStore.isAuthenticated" class="option-section" style="">
<el-button @click="handleLogout" type="danger" class="option-btn" plain>退出登录</el-button>
</div>
<!-- 头像上传对话框 -->
<el-dialog
v-model="showAvatarUpload"
title="更换头像"
width="400px"
:lockScroll="false"
>
<el-upload
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload"
:http-request="uploadAvatar"
>
<img v-if="newAvatar" :src="newAvatar" class="avatar-preview"/>
<el-icon v-else class="avatar-uploader-icon">
<Plus/>
</el-icon>
</el-upload>
<template #footer>
<span class="dialog-footer">
<el-button @click="showAvatarUpload = false">取消</el-button>
<el-button type="primary" @click="confirmAvatarUpload" :disabled="!newAvatar">
确定
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import {ref, onMounted} from 'vue';
import {useUserStore} from '@/stores/user';
import {useRouter} from 'vue-router';
import {ElMessage, ElMessageBox} from 'element-plus';
import {User, Plus} from '@element-plus/icons-vue';
import api from '@/utils/api';
import {getImageUrl} from '@/config';
export default {
setup() {
const showUserText = () => {
ElMessageBox.alert(
`<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>`,
{
confirmButtonText: '同意',
dangerouslyUseHTMLString: true,
customClass: 'agreement-dialog',
center: true,
}
);
}
const showPrivacyText = () => {
ElMessageBox.alert(
`<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>`,
{
confirmButtonText: '同意',
dangerouslyUseHTMLString: true,
customClass: 'agreement-dialog',
center: true,
}
);
}
const userStore = useUserStore();
const router = useRouter();
const avatarUrl = ref('');
const newAvatar = ref('');
const uploadedAvatarData = ref(null);
const showAvatarUpload = ref(false);
const accountInfo = ref({balance: '0.00', is_distribute: false});
const isLoading = ref(false);
const settings = ref([
{text: '账号安全', path: '/editpasswordpage'},
{text: '商户资料', path: '/editdetailspage'},
{text: '分享', path: '/distribution'},
{text: '用户协议', click: showUserText},
{text: '隐私政策', click: showPrivacyText},
]);
const functionItems = ref([
{image: "/imgs/mainpage/jiaoyijilu.png", text: "购物车", path: "/cart"},
{image: "/imgs/mainpage/dingdanchaxun.png", text: "地址", path: "/address"},
{image: "/imgs/mainpage/kefuzhongxin.png", text: "收藏", path: ""}
]);
// 加载账户信息
const loadAccountInfo = async () => {
try {
console.log(userStore.user, 'userStore.user');
if (userStore.user?.id) {
const response = await api.get(`/user/profile`);
console.log(response.data);
if (response.data.success) {
accountInfo.value = {
...accountInfo.value,
...response.data.user,
balance: response.data.user?.balance || '0.00',
is_distribute: response.data.user?.is_distribute || false
};
// 存储用户角色
localStorage.setItem('role', JSON.stringify({
"distribution": accountInfo.value.distribution,
"user_type": accountInfo.value.user_type
}));
// 确保加载头像
if (response.data.user?.avatar) {
// 使用getImageUrl处理头像路径
const processedAvatarUrl = getImageUrl(response.data.user.avatar);
avatarUrl.value = processedAvatarUrl;
// 更新store中的头像
if (userStore.user) {
userStore.setUser({
...userStore.user,
avatar: processedAvatarUrl
});
}
}
}
}
} catch (error) {
console.error('加载账户信息失败:', error);
}
};
// 处理默认自动匹配状态变化
const handleDistributeChange = async (value) => {
try {
// 判断融豆状态为0提示其余正常
if (accountInfo.value.balance == 0) {
ElMessageBox.alert(
'请获取融豆后,可开通此服务', '', {confirmButtonText: '确定',}
)
accountInfo.value.is_distribute = !value;
return
}
// 检查是否为第一次勾选
const isFirstTimeCheck = localStorage.getItem('hasCheckedDistribute') !== 'true';
// 如果是第一次勾选且为开启状态,强制显示协议
if (value && isFirstTimeCheck) {
try {
await ElMessageBox.alert(
`<div style="text-align: left; line-height: 1.6;">
<h3>融豆委托寄售协议</h3>
<p>欢迎您使用炬融圈平台融豆委托寄售服务!本《融豆委托寄售协议》(以下简称"本协议")由炬融圈平台运营方(以下简称"运营方")与使用融豆委托寄售服务的用户(以下简称"用户"或"您")共同订立。请您在使用委托寄售服务前,仔细阅读并充分理解本协议全部内容。您使用融豆委托寄售服务的行为,即视为您已阅读、理解并同意接受本协议所有条款的约束。</p>
<p>一、服务定义与规则</p>
<p>(一)融豆寄售服务是指用户通过支付服务费,委托运营方将其持有的闲置融豆,通过平台交易系统寄售给其他有需求的用户的增值服务。</p>
<p>价格规则所有寄售交易严格遵循1元人民币=1融豆的固定兑换比例任何用户包括寄售方和购买方均无权修改交易价格。</p>
<p>(三)交易机制:</p>
<p>1. 自主购买:用户可随时在平台的“融豆市场”或类似板块中,直接浏览并购买正在寄售的融豆。</p>
<p>2. 智能推荐与快捷购买:</p>
<p>a. 当您(作为购买方)在平台进行消费(如购买商品)或参与项目投资时,若账户融豆余额不足,系统将自动触发提示。</p>
<p>b. 系统会根据您当前所需的融豆数量,智能匹配并推荐正在寄售相应数量融豆的寄售订单。</p>
<p>c. 您可自主选择接受推荐、购买融豆以完成原交易,或取消操作。</p>
<p>(四)委托寄售服务的有效期为一年,自用户支付服务费之日起计算。</p>
<p>二、用户权利与义务</p>
<p>(一)寄售方权利与义务:</p>
<p>1. 支付2980融豆服务费后享有为期一年的融豆委托寄售资格。</p>
<p>2. 可随时查询其寄售订单的状态及成交记录。</p>
<p>3. 可随时单方面取消委托寄售服务,取消后不再产生任何费用,已收取的费用不再退还。</p>
<p>4. 需保证其账户状态正常,用于寄售的融豆来源合法、清晰,且不存在任何权属争议。</p>
<p>5. 理解并同意,一旦其寄售的融豆被其他用户购买,该交易即告完成,不可撤销。</p>
<p>(二)购买方权利与义务:</p>
<p>1. 有权通过上述交易机制购买他人寄售的融豆。</p>
<p>2. 理解并同意,购得的融豆将立即存入其账户,交易完成后不支持退换。</p>
<p>3. 保证用于购买融豆的资金来源合法。</p>
<p>三、平台权利与义务</p>
<p>(一)运营方负责搭建和维护融豆寄售交易系统,提供信息展示、交易匹配、资金划转等服务。</p>
<p>(二)运营方有权对寄售交易进行必要的监督和管理,以确保交易按平台规则进行。</p>
<p>(三)运营方有权根据业务发展或法律法规要求,调整寄售服务的具体规则、流程或收费标准,并通过平台公告等方式提前通知用户。</p>
<p>(四)运营方将采取合理安全措施保护交易数据,但对因不可抗力、第三方攻击或系统故障导致的服务中断、交易延迟或数据错误不承担赔偿责任,但将尽力协助恢复和解决问题。</p>
<p>四、服务费用</p>
<p>用户需支付2980融豆作为委托寄售服务的年度费用该费用自支付之日起生效服务有效期为一整年。</p>
<p>服务到期后如用户希望继续享受委托寄售服务需要重新支付2980融豆进行续费服务期限自续费之日起顺延一年。</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>`,
'融豆委托寄售协议',
{
confirmButtonText: '我已了解并同意',
dangerouslyUseHTMLString: true,
customClass: 'agreement-dialog',
showCancelButton: false,
closeOnClickModal: false,
closeOnPressEscape: false
}
);
// 用户同意协议后,标记为已勾选过
localStorage.setItem('hasCheckedDistribute', 'true');
} catch (error) {
// 用户关闭协议弹窗,恢复原状态
accountInfo.value.is_distribute = false;
return;
}
}
const action = value ? '开启' : '关闭';
await ElMessageBox.confirm(
`确定要${action}默认自动匹配功能吗?`,
'确认操作',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
);
const response = await api.put(`/user/${userStore.user.id}/distribute`, {
is_distribute: value
});
if (response.data.success) {
ElMessage.success('默认自动匹配状态更新成功');
// 如果是关闭状态,不需要标记为已勾选过
if (value) {
localStorage.setItem('hasCheckedDistribute', 'true');
}
} else {
accountInfo.value.is_distribute = !value;
ElMessageBox.confirm(
'是否同意缴费',
response.data.message,
{
confirmButtonText: '同意',
cancelButtonText: '取消',
type: 'warning',
}
).then(async () => {
let response = await api.post(`/users/${userStore.user?.id}/deduct-service-fee`)
if (response.data.success) {
ElMessage.success(response.data.message);
loadAccountInfo()
}
}).catch(() => {
accountInfo.value.is_distribute = !value;
})
}
} catch (error) {
if (error === 'cancel') {
// 用户取消操作,恢复原状态
accountInfo.value.is_distribute = !value;
} else {
console.error('更新默认自动匹配状态失败:', error);
// 如果请求失败,恢复原状态
accountInfo.value.is_distribute = !value;
ElMessage.error('默认自动匹配状态更新失败');
}
}
};
// 头像上传前的验证
const beforeAvatarUpload = (file) => {
const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
ElMessage.error('头像只能是 JPG/PNG 格式!');
return false;
}
if (!isLt2M) {
ElMessage.error('头像大小不能超过 2MB!');
return false;
}
return true;
};
// 上传头像
const uploadAvatar = async (options) => {
try {
const formData = new FormData();
formData.append('file', options.file);
const response = await api.post('/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
'Authorization': `Bearer ${userStore.token}`
}
});
if (response.data.success) {
// 保存上传响应数据
uploadedAvatarData.value = response.data.data;
// 使用url作为显示地址
newAvatar.value = response.data.data.url;
ElMessage.success('头像上传成功');
} else {
ElMessage.error(response.data.message || '上传失败');
}
} catch (error) {
console.error('头像上传失败:', error);
ElMessage.error('头像上传失败');
}
}
// 确认更新头像
const confirmAvatarUpload = async () => {
try {
if (!newAvatar.value || !uploadedAvatarData.value) {
ElMessage.error('请先选择头像');
return;
}
// 使用path提交给后端
const avatarPath = uploadedAvatarData.value.path;
const response = await api.put('/user/profile', {
avatar: avatarPath
});
if (response.data.success) {
// 使用url作为显示地址
avatarUrl.value = uploadedAvatarData.value.url;
// 更新用户store中的头像信息
if (userStore.user) {
userStore.setUser({
...userStore.user,
avatar: uploadedAvatarData.value.url
});
}
showAvatarUpload.value = false;
newAvatar.value = '';
uploadedAvatarData.value = null;
ElMessage.success('头像更新成功');
} else {
ElMessage.error(response.data.message || '头像更新失败');
}
} catch (error) {
console.error('头像更新失败:', error);
if (error.response) {
ElMessage.error(error.response.data.message || '头像更新失败');
} else {
ElMessage.error('头像更新失败');
}
}
}
const handleLogout = async () => {
try {
await ElMessageBox.confirm('确定要退出登录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
lockScroll: false
});
userStore.logout();
router.push('/mylogin');
ElMessage.success('已退出登录');
} catch {
// 用户取消
}
};
// 显示协议和政策
const showAgreement = () => {
ElMessageBox.alert(
`<div style="text-align: left; line-height: 1.6;">
<h3>融豆委托寄售协议</h3>
<p>欢迎您使用炬融圈平台融豆委托寄售服务!本《融豆委托寄售协议》(以下简称"本协议")由炬融圈平台运营方(以下简称"运营方")与使用融豆委托寄售服务的用户(以下简称"用户"或"您")共同订立。请您在使用委托寄售服务前,仔细阅读并充分理解本协议全部内容。您使用融豆委托寄售服务的行为,即视为您已阅读、理解并同意接受本协议所有条款的约束。</p>
<p>一、服务定义与规则</p>
<p>(一)融豆寄售服务是指用户通过支付服务费,委托运营方将其持有的闲置融豆,通过平台交易系统寄售给其他有需求的用户的增值服务。</p>
<p>价格规则所有寄售交易严格遵循1元人民币=1融豆的固定兑换比例任何用户包括寄售方和购买方均无权修改交易价格。</p>
<p>(三)交易机制:</p>
<p>1. 自主购买:用户可随时在平台的“融豆市场”或类似板块中,直接浏览并购买正在寄售的融豆。</p>
<p>2. 智能推荐与快捷购买:</p>
<p>a. 当您(作为购买方)在平台进行消费(如购买商品)或参与项目投资时,若账户融豆余额不足,系统将自动触发提示。</p>
<p>b. 系统会根据您当前所需的融豆数量,智能匹配并推荐正在寄售相应数量融豆的寄售订单。</p>
<p>c. 您可自主选择接受推荐、购买融豆以完成原交易,或取消操作。</p>
<p>(四)委托寄售服务的有效期为一年,自用户支付服务费之日起计算。</p>
<p>二、用户权利与义务</p>
<p>(一)寄售方权利与义务:</p>
<p>1. 支付2980融豆服务费后享有为期一年的融豆委托寄售资格。</p>
<p>2. 可随时查询其寄售订单的状态及成交记录。</p>
<p>3. 可随时单方面取消委托寄售服务,取消后不再产生任何费用,已收取的费用不再退还。</p>
<p>4. 需保证其账户状态正常,用于寄售的融豆来源合法、清晰,且不存在任何权属争议。</p>
<p>5. 理解并同意,一旦其寄售的融豆被其他用户购买,该交易即告完成,不可撤销。</p>
<p>(二)购买方权利与义务:</p>
<p>1. 有权通过上述交易机制购买他人寄售的融豆。</p>
<p>2. 理解并同意,购得的融豆将立即存入其账户,交易完成后不支持退换。</p>
<p>3. 保证用于购买融豆的资金来源合法。</p>
<p>三、平台权利与义务</p>
<p>(一)运营方负责搭建和维护融豆寄售交易系统,提供信息展示、交易匹配、资金划转等服务。</p>
<p>(二)运营方有权对寄售交易进行必要的监督和管理,以确保交易按平台规则进行。</p>
<p>(三)运营方有权根据业务发展或法律法规要求,调整寄售服务的具体规则、流程或收费标准,并通过平台公告等方式提前通知用户。</p>
<p>(四)运营方将采取合理安全措施保护交易数据,但对因不可抗力、第三方攻击或系统故障导致的服务中断、交易延迟或数据错误不承担赔偿责任,但将尽力协助恢复和解决问题。</p>
<p>四、服务费用</p>
<p>用户需支付2980融豆作为委托寄售服务的年度费用该费用自支付之日起生效服务有效期为一整年。</p>
<p>服务到期后如用户希望继续享受委托寄售服务需要重新支付2980融豆进行续费服务期限自续费之日起顺延一年。</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>`,
'融豆委托寄售协议',
{
confirmButtonText: '同意',
dangerouslyUseHTMLString: true,
customClass: 'agreement-dialog',
center: true,
}
);
};
onMounted(() => {
// 初始化时从store中获取头像
if (userStore.user?.avatar) {
avatarUrl.value = userStore.user.avatar;
}
loadAccountInfo();
});
return {
avatarUrl,
newAvatar,
showAvatarUpload,
uploadedAvatarData,
accountInfo,
isLoading,
functionItems,
settings,
beforeAvatarUpload,
uploadAvatar,
confirmAvatarUpload,
handleLogout,
handleDistributeChange,
showAgreement,
userStore,
getImageUrl
};
}
};
</script>
<style lang="scss" scoped>
.personal-center {
max-width: 600px;
margin: 0 auto;
padding: 20px;
font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
background-color: #f8f8f8;
min-height: 100vh;
background: linear-gradient(to bottom, #72c9ffae, #f3f3f3);
}
/* 用户信息区域 - 修改部分 */
.user-info-section {
display: flex;
align-items: center;
padding: 20px;
background-color: transparent;
border-radius: 12px;
color: #333;
margin-bottom: 20px;
position: relative;
}
.user-avatar {
position: relative;
width: 76px;
height: 76px;
margin-right: 15px;
flex-shrink: 0;
}
.avatar-img {
width: 76px;
height: 76px;
border-radius: 50%;
object-fit: cover;
border: 3px solid rgba(0, 0, 0, 0.1);
}
.upload-btn {
position: absolute;
bottom: -30px;
left: 50%;
transform: translateX(-50%);
border-radius: 12px;
min-width: 85px; /* 设置足够的最小宽度 */
display: flex;
align-items: center;
justify-content: center;
padding: 6px 12px;
white-space: nowrap; /* 防止文字换行 */
}
/* 确保按钮文字始终居中 */
.upload-btn :deep(.el-button__content) {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
text-align: center;
letter-spacing: 0.5px; /* 微调字间距,使文字分布更均匀 */
}
/* 响应式设计 - 小屏幕适配 */
@media (max-width: 375px) {
.upload-btn {
min-width: 80px; /* 确保足够宽度容纳四个字 */
font-size: 12px;
padding: 5px 10px;
}
}
/* 针对更小的屏幕进一步调整 */
@media (max-width: 320px) {
.upload-btn {
min-width: 75px;
font-size: 11px;
padding: 4px 8px;
}
}
.user-actions {
display: flex;
align-items: center;
flex-grow: 1;
min-width: 0;
}
.username {
font-size: 16px;
font-weight: 500;
color: #333;
margin-right: auto;
padding-left: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 60%;
margin-right: 10px;
}
.auth-buttons {
display: flex;
gap: 10px;
margin-left: auto;
}
.login-btn, .register-btn {
padding: 8px 16px;
border-radius: 20px;
font-weight: 500;
font-size: 14px;
cursor: pointer;
transition: all 0.3s ease;
background-color: transparent;
border: 1px solid #6a11cb;
color: #6a11cb;
}
.register-btn {
border: 1px solid #6a11cb;
color: #6a11cb;
}
.login-btn:hover, .register-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.logout-btn {
padding: 8px 16px;
border-radius: 20px;
font-weight: 500;
font-size: 14px;
cursor: pointer;
transition: all 0.3s ease;
background-color: transparent;
border: 1px solid #ff4d4f;
color: #ff4d4f;
flex-shrink: 0;
margin-left: 10px;
}
.logout-btn:hover {
background-color: #fff2f0;
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* 功能入口区域 */
.function-section {
border-radius: 12px;
padding: 15px 0;
margin-bottom: 20px;
}
.function-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
}
.function-item-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10px 0;
cursor: pointer;
transition: all 0.2s ease;
background-color: white;
border-radius: 12px;
height: 80px;
}
.function-item-content:hover {
transform: scale(1.05);
}
.function-icon {
width: 40px;
height: 40px;
margin-bottom: 8px;
display: flex;
align-items: center;
justify-content: center;
}
.function-image {
width: 30px;
height: 30px;
object-fit: contain;
}
.function-text {
font-size: 13px;
color: #333;
}
/* 余额和记录区域 */
.balance-section {
background-color: #2f89ff;
border-radius: 12px;
padding: 15px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
color: white;
position: relative;
height: 85px;
}
.balance-card {
display: flex;
justify-content: space-between;
align-items: center;
height: 100%;
flex-wrap: nowrap;
}
.balance-item {
display: flex;
flex-direction: column;
gap: 8px;
flex: 1;
}
.balance-label {
font-size: 14px;
color: rgba(255, 255, 255, 0.9);
letter-spacing: 0.5px;
font-weight: 400;
}
.distribute-checkbox {
color: white;
}
.distribute-checkbox :deep(.el-checkbox__label) {
color: rgba(255, 255, 255, 0.9);
font-size: 12px;
}
.distribute-checkbox :deep(.el-checkbox__input.is-checked .el-checkbox__inner) {
background-color: rgba(255, 255, 255, 0.9) !important;
border-color: rgba(255, 255, 255, 0.9) !important;
}
.distribute-checkbox :deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {
border-color: #2f89ff !important;
}
.distribute-checkbox :deep(.el-checkbox__inner) {
border-color: rgba(255, 255, 255, 0.6) !important;
background-color: transparent !important;
}
.distribute-checkbox :deep(.el-checkbox__input.is-checked) {
.el-checkbox__inner {
background-color: rgba(255, 255, 255, 0.9) !important;
border-color: rgba(255, 255, 255, 0.9) !important;
}
.el-checkbox__inner::after {
border-color: #2f89ff !important;
}
}
.balance-value {
font-size: 28px;
font-weight: 600;
color: white;
letter-spacing: 0.5px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* 我的订单 */
.order-section {
background-color: white;
border-radius: 12px;
padding: 15px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.section-header h3 {
font-size: 16px;
color: #333;
margin: 0;
}
.view-all {
font-size: 13px;
color: #999;
cursor: pointer;
}
/* 设置区域 */
.settings-section {
background-color: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.setting-item {
display: block;
justify-content: space-between;
align-items: center;
padding: 0px;
border-bottom: 1px solid #f0f0f0;
cursor: pointer;
transition: background-color 0.2s ease;
}
.setting-link {
display: block; /* 转为块级元素,占满父容器宽度 */
width: 100%;
height: 100%;
padding: 15px; /* 将原有的 padding 移到这里,确保点击区域完整 */
text-decoration: none; /* 去除链接默认下划线 */
}
.setting-content {
display: flex; /* 使用 flex 布局,方便内容左右对齐 */
justify-content: space-between; /* 文字左对齐,箭头右对齐 */
align-items: center; /* 垂直居中 */
width: 100%; /* 占满父容器宽度 */
height: 100%; /* 占满父容器高度 */
}
.setting-item:last-child {
border-bottom: none;
}
.setting-item:hover {
background-color: #f9f9f9;
}
.setting-text {
font-size: 15px;
color: #333;
}
.setting-arrow {
color: #ccc;
font-size: 14px;
}
.option-section {
margin-top: 20px;
.option-btn {
width: 100%;
border-radius: 12px;
font-weight: 500;
font-size: 14px;
color: #ff4d4f;
}
.option-btn:hover {
color: white;
}
.option-btn:active {
color: white;
}
}
/* 头像上传对话框样式 */
.avatar-uploader {
text-align: center;
}
.avatar-uploader :deep(.el-upload) {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: 0.2s;
width: 178px;
height: 178px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
}
.avatar-uploader :deep(.el-upload:hover) {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
}
.avatar-preview {
width: 178px;
height: 178px;
object-fit: cover;
}
.balance-content {
display: flex;
align-items: center;
gap: 8px; /* 控制图标和数值之间的间距 */
}
.bean-image {
width: 20px;
height: 20px;
flex-shrink: 0; /* 防止图片被压缩 */
}
.balance-value {
font-size: 28px;
font-weight: 600;
color: white;
letter-spacing: 0.5px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
white-space: nowrap; /* 防止文本换行 */
}
/* 协议区域样式 */
.agreement-section {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
flex-shrink: 0;
}
/* 协议和政策链接样式 */
.agreement-section :deep(.el-link) {
color: #ffcc40 !important;
font-weight: 500;
}
.agreement-section :deep(.el-link:hover) {
color: #40ffe6 !important;
}
</style>