ai-agent-m/src/packages/pages/user_set/user_set.vue
2025-03-14 18:22:17 +08:00

215 lines
6.9 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>
<page-meta :page-style="$theme.pageStyle">
<!-- #ifndef H5 -->
<navigation-bar :front-color="$theme.navColor" :background-color="$theme.navBgColor" />
<!-- #endif -->
</page-meta>
<view class="user-set">
<navigator :url="`/packages/pages/user_data/user_data`">
<view class="item flex bg-white mt-[20rpx]">
<u-avatar :src="userInfo.avatar" shape="square" :size="100"></u-avatar>
<view class="ml-[20rpx] flex flex-1 justify-between items-center">
<view>
<view class="mb-[15rpx] text-xl font-medium">{{ userInfo.nickname }}</view>
<view class="text-content text-xs">账号{{ userInfo.username }}</view>
</view>
<u-icon name="arrow-right" color="#666"></u-icon>
</view>
</view>
</navigator>
<view class="item bg-white mt-[20rpx] btn-border flex flex-1 justify-between" @click="handlePwd">
<view class="">登录密码</view>
<u-icon name="arrow-right" color="#666"></u-icon>
</view>
<!-- #ifdef MP-WEIXIN || H5 -->
<!-- <view v-if="isWeixin" class="item bg-white flex flex-1 justify-between" @click="bindWechatLock">
<view class="">绑定微信</view>
<view class="flex justify-between">
<view class="text-muted mr-[20rpx]">
{{ userInfo.isBindWechat ? '已绑定' : '未绑定' }}
</view>
<u-icon v-if="userInfo.isBindWechat == 0" name="arrow-right" color="#666"></u-icon>
</view>
</view> -->
<!-- #endif -->
<!-- <navigator :url="`/packages/pages/agreement/agreement?type=${AgreementEnum.PRIVACY}`">
<view class="item bg-white mt-[20rpx] btn-border flex flex-1 justify-between">
<view class="">隐私政策</view>
<u-icon name="arrow-right" color="#666"></u-icon>
</view>
</navigator>
<navigator :url="`/packages/pages/agreement/agreement?type=${AgreementEnum.SERVICE}`">
<view class="item bg-white btn-border flex flex-1 justify-between">
<view class="">服务协议</view>
<u-icon name="arrow-right" color="#666"></u-icon>
</view>
</navigator>
<navigator url="/packages/pages/as_us/as_us">
<view class="item bg-white flex flex-1 justify-between">
<view class="">关于我们</view>
<view class="flex justify-between">
<view class="text-muted mr-[20rpx]">
{{ appStore.config.version }}
</view>
<u-icon name="arrow-right" color="#666"></u-icon>
</view>
</view>
</navigator> -->
<!-- 注销账号 -->
<view v-if="userInfo?.isCancelled == 1"
class="text-nr flex justify-between mt-[10rpx] px-[30rpx] bg-white h-[100rpx] items-center"
@click="handlecancel">
<view class="label">注销账号</view>
<u-icon name="arrow-right" size="22" color="#666"></u-icon>
</view>
<view class="mt-[60rpx] mx-[26rpx]">
<u-button type="primary" shape="circle" @click="logoutHandle"> 退出登录 </u-button>
</view>
<u-action-sheet :list="list" v-model="show" @click="handleClick"
:safe-area-inset-bottom="true"></u-action-sheet>
<!-- #ifdef H5 -->
<!-- 悬浮菜单 -->
<floating-menu></floating-menu>
<!-- #endif -->
</view>
</template>
<script setup lang="ts">
import { mnpAuthBind, oaAuthBind } from '@/api/user'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { ref, computed } from 'vue'
import { useAppStore } from '@/stores/app'
import { useUserStore } from '@/stores/user'
import { AgreementEnum } from '@/enums/agreementEnums'
import { isWeixinClient, getClient } from '@/utils/client'
import { ClientEnum } from '@/enums/appEnums'
import { useLockFn } from '@/hooks/useLockFn'
import router from '@/router'
import cache from '@/utils/cache'
// #ifdef H5
import wechatOa, { UrlScene } from '@/utils/wechat'
// #endif
const appStore = useAppStore()
const userStore = useUserStore()
const userInfo = computed(() => userStore.userInfo)
const list = ref([
{
text: '修改密码'
},
{
text: '忘记密码'
}
])
const isWeixin = ref(true)
// #ifdef H5
isWeixin.value = isWeixinClient()
// #endif
const show = ref(false)
// 修改/忘记密码
const handleClick = (index: number) => {
switch (index) {
case 0:
router.navigateTo('/packages/pages/change_password/change_password')
break
case 1:
router.navigateTo('/packages/pages/forget_pwd/forget_pwd')
break
}
}
const handlePwd = () => {
if (!userInfo.value.hasPwd)
return router.navigateTo('/packages/pages/change_password/change_password?type=set')
show.value = true
}
//注销账号
const handlecancel = () => {
router.navigateTo('/packages/pages/cancelaccount/cancelaccount')
}
// 退出登录
const logoutHandle = () => {
uni.showModal({
content: '是否退出登录?',
confirmColor: '#4173FF',
success: ({ cancel }) => {
if (cancel) return
userStore.logout()
router.reLaunch('/pages/login/login')
}
})
}
const bindWechat = async () => {
if (userInfo.value.isBindWechat) return
uni.showLoading({
title: '请稍后...'
})
try {
if (getClient() == ClientEnum.MP_WEIXIN) {
const { code }: any = await uni.login({
provider: 'weixin'
})
await mnpAuthBind({
code: code
})
} else if (getClient() == ClientEnum.OA_WEIXIN) {
wechatOa.getUrl(UrlScene.BIND_WX)
}
await userStore.getUser()
uni.hideLoading()
} catch (error: any) {
uni.$u.toast(error)
} finally {
uni.hideLoading()
}
}
const { lockFn: bindWechatLock } = useLockFn(bindWechat)
onShow(() => {
userStore.getUser()
})
onLoad(async () => {
// #ifdef H5
const { code, scene } = wechatOa.getAuthData()
if (code.length && scene === UrlScene.BIND_WX) {
uni.showLoading({
title: '请稍后...'
})
cache.set('code', code)
//用于清空code
try {
await oaAuthBind({ code })
await userStore.getUser()
uni.hideLoading()
} catch (error: any) {
uni.hideLoading()
} finally {
wechatOa.setAuthData()
}
}
// #endif
})
</script>
<style lang="scss" scoped>
.user-set {
.item {
padding: 30rpx;
}
.btn-border {
border-bottom: 2rpx solid #f8f8f8;
}
}
</style>