<template>
|
<el-table :data="socialUsers" :show-header="false">
|
<el-table-column fixed="left" title="序号" type="seq" width="60" />
|
<el-table-column align="left" label="社交平台" width="120">
|
<template #default="{ row }">
|
<img :src="row.img" alt="" class="h-5 align-middle" />
|
<p class="mr-5">{{ row.title }}</p>
|
</template>
|
</el-table-column>
|
<el-table-column align="center" label="操作">
|
<template #default="{ row }">
|
<template v-if="row.openid">
|
已绑定
|
<XTextButton class="mr-5" title="(解绑)" type="primary" @click="unbind(row)" />
|
</template>
|
<template v-else>
|
未绑定
|
<XTextButton class="mr-5" title="(绑定)" type="primary" @click="bind(row)" />
|
</template>
|
</template>
|
</el-table-column>
|
</el-table>
|
</template>
|
<script lang="ts" setup>
|
import { SystemUserSocialTypeEnum } from '@/utils/constants'
|
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
|
import { socialAuthRedirect, socialBind, socialUnbind } from '@/api/system/user/socialUser'
|
|
defineOptions({ name: 'UserSocial' })
|
defineProps<{
|
activeName: string
|
}>()
|
const message = useMessage()
|
const socialUsers = ref<any[]>([])
|
const userInfo = ref<ProfileVO>()
|
|
const initSocial = async () => {
|
socialUsers.value = [] // 重置避免无限增长
|
const res = await getUserProfile()
|
userInfo.value = res
|
for (const i in SystemUserSocialTypeEnum) {
|
const socialUser = { ...SystemUserSocialTypeEnum[i] }
|
socialUsers.value.push(socialUser)
|
if (userInfo.value?.socialUsers) {
|
for (const j in userInfo.value.socialUsers) {
|
if (socialUser.type === userInfo.value.socialUsers[j].type) {
|
socialUser.openid = userInfo.value.socialUsers[j].openid
|
break
|
}
|
}
|
}
|
}
|
}
|
const route = useRoute()
|
const emit = defineEmits<{
|
(e: 'update:activeName', v: string): void
|
}>()
|
const bindSocial = () => {
|
// 社交绑定
|
const type = getUrlValue('type')
|
const code = route.query.code
|
const state = route.query.state
|
if (!code) {
|
return
|
}
|
socialBind(type, code, state).then(() => {
|
message.success('绑定成功')
|
emit('update:activeName', 'userSocial')
|
})
|
}
|
|
// 双层 encode 需要在回调后进行 decode
|
function getUrlValue(key: string): string {
|
const url = new URL(decodeURIComponent(location.href))
|
return url.searchParams.get(key) ?? ''
|
}
|
|
const bind = (row) => {
|
// 双层 encode 解决钉钉回调 type 参数丢失的问题
|
const redirectUri = location.origin + '/user/profile?' + encodeURIComponent(`type=${row.type}`)
|
// 进行跳转
|
socialAuthRedirect(row.type, encodeURIComponent(redirectUri)).then((res) => {
|
window.location.href = res
|
})
|
}
|
const unbind = async (row) => {
|
const res = await socialUnbind(row.type, row.openid)
|
if (res) {
|
row.openid = undefined
|
}
|
message.success('解绑成功')
|
}
|
|
onMounted(async () => {
|
await initSocial()
|
})
|
|
watch(
|
() => route,
|
() => {
|
bindSocial()
|
},
|
{
|
immediate: true
|
}
|
)
|
</script>
|