feat: 优化账户切换时的页面状态一致性,增加登录回跳校验和课程阅读新逻辑
- 增加账户状态监听定时器,页面切换时自动校验账户归属,避免跨账户操作 - 新增登录回跳路径校验函数,限制仅允许指定页面回跳,防止非法跳转 - 课程页改为整篇连续阅读,底部仅一次标记已读,兼容历史记录 - 完善助手、对比页、资料填写页等多处的账户状态校验逻辑,防止错版数据提交 - 优化账户资料请求逻辑,增加版本校验,避免旧请求覆盖新数据
This commit is contained in:
@@ -3,23 +3,29 @@
|
||||
</template>
|
||||
<script setup lang="uts">
|
||||
import { requestSecurityCode } from '@/packages/account/services/account.uts'
|
||||
const props = defineProps({ modelValue: { type: String, default: '' }, purpose: { type: String, default: 'password' }, phone: { type: String, default: '' }, disabled: { type: Boolean, default: false } })
|
||||
import { getSession } from '@/services/api.uts'
|
||||
const props = defineProps({ modelValue: { type: String, default: '' }, purpose: { type: String, default: 'password' }, phone: { type: String, default: '' }, disabled: { type: Boolean, default: false }, active: { type: Boolean, default: true }, ownerToken: { type: String, default: '' } })
|
||||
const emit = defineEmits(['update:modelValue', 'error', 'sent'])
|
||||
const sending = ref(false); const countdown = ref(0)
|
||||
let timer = 0; let version = 0; let expiresAt = 0
|
||||
const reset = () => { version++; clearInterval(timer); countdown.value = 0; sending.value = false }
|
||||
const targetPhone = computed((): string => props.phone)
|
||||
watch(targetPhone, () => { reset(); emit('update:modelValue', '') })
|
||||
watch((): boolean => props.active, () => reset())
|
||||
watch((): string => props.ownerToken, () => { reset(); emit('update:modelValue', '') })
|
||||
const send = async () => {
|
||||
if (props.disabled || sending.value || countdown.value > 0) return
|
||||
if (!props.active || props.disabled || sending.value || countdown.value > 0) return
|
||||
const token = props.ownerToken
|
||||
if (token.length == 0 || getSession()?.getString('token') != token) { emit('error', '登录状态已变化,请重新进入页面'); return }
|
||||
const current = ++version; sending.value = true
|
||||
const valid = (): boolean => current == version && props.active && props.ownerToken == token && getSession()?.getString('token') == token
|
||||
try {
|
||||
await requestSecurityCode(props.purpose, props.phone)
|
||||
if (current != version) return
|
||||
if (!valid()) return
|
||||
expiresAt = Date.now() + 60000; countdown.value = 60
|
||||
timer = setInterval(() => { countdown.value = Math.max(0, Math.ceil((expiresAt - Date.now()) / 1000)); if (countdown.value == 0) clearInterval(timer) }, 1000)
|
||||
emit('sent'); uni.showToast({ title: '验证码已发送', icon: 'none' })
|
||||
} catch (error) { if (current == version) emit('error', error instanceof Error ? error.message : '发送失败,请稍后重试') }
|
||||
} catch (error) { if (valid()) emit('error', error instanceof Error ? error.message : '发送失败,请稍后重试') }
|
||||
finally { if (current == version) sending.value = false }
|
||||
}
|
||||
onUnmounted(() => reset())
|
||||
|
||||
Reference in New Issue
Block a user