微信快捷登录

This commit is contained in:
zdz
2026-03-19 15:25:51 +08:00
parent 13b28ceec9
commit 7312702c72
3 changed files with 105 additions and 5 deletions

View File

@@ -6,6 +6,7 @@ export default defineStore('userInfo', {
id: '', id: '',
username: '', username: '',
password: '', password: '',
wxBound: false,
roleId: '', roleId: '',
realname: '', realname: '',
headPic: '' headPic: ''

View File

@@ -25,6 +25,24 @@ export function sysLogin(data: object) {
}) })
} }
// 公众号快捷登录通过OAuth code
export function wxH5QuickLogin(params: { code: string }) {
return http.request({
url: '/wx/h5/quickLogin',
method: 'get',
params
})
}
// 当前登录用户绑定微信通过OAuth code
export function sysWxBindByCode(params: { code: string }) {
return http.request({
url: '/sys/wx/bind',
method: 'post',
params
})
}
export function sysMenuNav() { export function sysMenuNav() {
return http.request({ return http.request({
url: '/sys/menu/nav', url: '/sys/menu/nav',

View File

@@ -18,6 +18,9 @@
<van-button round block type="primary" :disabled="submitFlag" native-type="submit"> <van-button round block type="primary" :disabled="submitFlag" native-type="submit">
确定 确定
</van-button> </van-button>
<van-button round block plain type="primary" class="mt-12" @click="toWxQuickLogin">
微信快捷登录
</van-button>
</div> </div>
</van-form> </van-form>
</div> </div>
@@ -34,17 +37,76 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
import { showConfirmDialog, showToast } from 'vant'
import userInfoStore from '@/stores/userInfo' import userInfoStore from '@/stores/userInfo'
const userInfo = userInfoStore() const userInfo = userInfoStore()
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const WX_APP_ID = 'wx1d52f91f259a691f'
let username = ref(userInfo.username || '') let username = ref(userInfo.username || '')
let password = ref(userInfo.password || '') let password = ref(userInfo.password || '')
let submitFlag = ref(false) let submitFlag = ref(false)
import { encrypt } from '@/utils/index' import { encrypt } from '@/utils/index'
import { sysLogin, sysUserInfo, sysMenuNav } from '@/utils/api' import { sysLogin, sysUserInfo, sysMenuNav, wxH5QuickLogin, sysWxBindByCode } from '@/utils/api'
onMounted(() => {
handleWxCallback()
})
const toWxQuickLogin = () => {
startWxOAuth('quick')
}
const startWxOAuth = (action: 'quick' | 'bind') => {
const redirectUri = encodeURIComponent(`${window.location.origin}/login?wxAction=${action}`)
window.location.href =
`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${WX_APP_ID}&redirect_uri=${redirectUri}` +
'&response_type=code&scope=snsapi_base&state=stockh5#wechat_redirect'
}
const handleWxCallback = async () => {
const code = route.query.code
const action = route.query.wxAction
if (typeof code !== 'string' || typeof action !== 'string') {
return
}
if (action === 'quick') {
await doWxQuickLogin(code)
} else if (action === 'bind') {
await doWxBind(code)
}
}
const doWxQuickLogin = async (code: string) => {
const data: any = await wxH5QuickLogin({ code })
if (data && data.code === 0 && data.token) {
userInfo.token = data.token
userInfo.wxBound = true
await getUserInfo()
await getsysMenuNav()
return
}
showToast(data?.msg || '微信快捷登录失败,请先账号登录并绑定微信')
router.replace({ name: 'login' })
}
const doWxBind = async (code: string) => {
if (!userInfo.token) {
showToast('请先账号密码登录')
router.replace({ name: 'login' })
return
}
const data: any = await sysWxBindByCode({ code })
if (data && data.code === 0) {
userInfo.wxBound = true
showToast('微信绑定成功')
} else {
showToast(data?.msg || '微信绑定失败')
}
await getsysMenuNav()
}
const onSubmit = async () => { const onSubmit = async () => {
submitFlag.value = true submitFlag.value = true
const data: any = await sysLogin( const data: any = await sysLogin(
@@ -57,10 +119,25 @@ const onSubmit = async () => {
userInfo.username = username.value userInfo.username = username.value
userInfo.password = password.value userInfo.password = password.value
userInfo.token = data.token userInfo.token = data.token
getUserInfo() userInfo.wxBound = !!data.wxBound
await getUserInfo()
if (!userInfo.wxBound) {
await showConfirmDialog({
title: '绑定微信',
message: '是否绑定微信用于下次快捷登录?',
confirmButtonText: '去绑定',
cancelButtonText: '暂不绑定'
}).then(() => {
startWxOAuth('bind')
}).catch(async () => {
await getsysMenuNav()
})
} else {
await getsysMenuNav()
}
} else { } else {
submitFlag.value = false submitFlag.value = false
showToast('账号密码错误') showToast(data?.msg || '账号密码错误')
} }
} }
@@ -70,7 +147,7 @@ const getUserInfo = async () => {
userInfo.realname = data.user.realname userInfo.realname = data.user.realname
userInfo.headPic = data.user.headPic userInfo.headPic = data.user.headPic
userInfo.roleId = data.user.roleId + '' userInfo.roleId = data.user.roleId + ''
getsysMenuNav() userInfo.wxBound = !!data.user.wxOpenid
} }
const getsysMenuNav = async () => { const getsysMenuNav = async () => {
@@ -148,6 +225,10 @@ const getsysMenuNav = async () => {
.opr-area { .opr-area {
padding: 16px 0; padding: 16px 0;
.mt-12 {
margin-top: 12px;
}
.van-button { .van-button {
height: 32px; height: 32px;
line-height: 32px; line-height: 32px;