This commit is contained in:
hero920103 committed 2026-11-03 11:13:59 +08:00
1 parent 012f8edf8b
commit 36ff960fbd
33 files changed
+1644 -344

No files matched your search

+65 -4
View File
@@ -64,6 +64,12 @@
<FaIcon name="chevron-right" color="#94a3b8" :size="12" />
<view class="alt-line" />
</view>
<!-- 返回门户:不登录也能先用免登录功能 -->
<view class="back-portal" @tap="goPortal">
<FaIcon name="chevron-left" color="#94a3b8" :size="12" />
<text class="back-portal-text">返回门户,先使用免登录功能</text>
</view>
</block>
<!-- ============ 账号密码登录(独立视图) ============ -->
@@ -133,6 +139,12 @@
<view class="back-row">
<text class="tip-text">没有账号?请联系企业管理员开通</text>
</view>
<!-- 返回门户:不登录也能先用免登录功能 -->
<view class="back-portal" @tap="goPortal">
<FaIcon name="chevron-left" color="#94a3b8" :size="12" />
<text class="back-portal-text">返回门户,先使用免登录功能</text>
</view>
</block>
<!-- ============ 选择企业(一人多企业) ============ -->
@@ -221,6 +233,8 @@ import {
getToken
} from '@/utils/auth.js'
import { showGeetest4 } from '@/utils/geetest.js'
import { getGuestToken, clearGuestToken } from '@/utils/guest.js'
import { guestMerge } from '@/api/guest.js'
import FaIcon from '@/components/FaIcon.vue'
/** 运行端检测:h5 / apk(app-plus) / mp-weixin,决定登录方式优先级 */
@@ -286,10 +300,10 @@ const brandPadTop = computed(() => {
return `${statusBarHeight.value + uni.upx2px(88)}px`
})
/** 是否存在可返回的上级视图(账号密码视图仅在小程序端可退回主视图) */
/** 是否显示可返回的上级箭头(账号视图无论能否退回主视图都可见:退不了就回门户) */
const canGoBack = computed(() => {
if (step.value === 'tenant') return true
if (step.value === 'account') return showMiniLogin.value
if (step.value === 'account') return true
return false
})
@@ -308,13 +322,30 @@ function goMain() {
errorMsg.value = ''
}
/** 顶部导航返回 */
/** 顶部导航返回:登录内部层级优先逐级退;无可退上级时返回门户(免登录页) */
function onNavBack() {
if (step.value === 'tenant') {
backToAccount()
return
}
goMain()
if (step.value === 'account' && showMiniLogin.value) {
goMain()
return
}
// 无登录内部上级 → 返回门户,继续用免登录功能
goPortal()
}
/**
* 返回门户首页(nav)。
* 多数从 nav 点「需登录」模块进来,直接 navigateBack 回上一页(保留游客宫格);
* 若是被 401 兑回登录页等无栈场景,回落到 reLaunch nav 以游客态重载。
*/
function goPortal() {
if (submitting.value) return
const pages = (typeof getCurrentPages === 'function' && getCurrentPages()) || []
if (pages.length > 1) uni.navigateBack()
else uni.reLaunch({ url: '/pages/nav/nav' })
}
onMounted(async () => {
@@ -508,6 +539,17 @@ async function finishLogin(tokens, tenantList, tid, fallbackAccount = '') {
// 微信端:登录成功后静默绑定 openid,认证中/无手机号能力时一键登录靠它认人
await silentBindMiniapp()
// 游客数据转正:持游客令牌(手机号授权)时静默并入账号;
// 失败不阻断跳转(令牌保留,下次登录自动重试;令牌失效则由 401 自动清理)
if (getGuestToken()) {
try {
await guestMerge()
clearGuestToken()
} catch (e) {
console.warn('[login] guest merge failed:', e)
}
}
uni.hideLoading()
uni.showToast({ title: '登录成功', icon: 'success' })
setTimeout(() => {
@@ -1082,6 +1124,25 @@ function goForget() {
margin-top: 32rpx;
}
/* 返回门户:不登录也能先浏览免登录模块 */
.back-portal {
display: flex;
align-items: center;
justify-content: center;
gap: 6rpx;
margin-top: 28rpx;
padding: 8rpx 0;
}
.back-portal:active {
opacity: 0.6;
}
.back-portal-text {
font-size: 24rpx;
color: $color-text-muted;
}
.link {
font-size: 26rpx;
color: $color-primary;