You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
4.3 KiB

3 days ago
<template>
<view v-if="visible" class="auth-mask" @touchmove.stop.prevent="noop" @tap.stop="cancel">
<view class="auth-card" @tap.stop>
<view class="auth-glow auth-glow-a"></view>
<view class="auth-glow auth-glow-b"></view>
<view class="auth-badge">{{ badge }}</view>
<view class="auth-title">{{ title }}</view>
<view class="auth-content">{{ content }}</view>
<view class="auth-steps" v-if="steps && steps.length">
<view class="auth-step" v-for="(step, index) in steps" :key="step">
<view class="step-dot">{{ index + 1 }}</view>
<view>{{ step }}</view>
</view>
</view>
<view class="auth-actions">
<view class="auth-btn ghost" @tap="cancel">{{ cancelText }}</view>
<view class="auth-btn primary" @tap="confirm">{{ confirmText }}</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'IeAuthDialog',
data() {
return {
visible: false,
badge: 'i/e 安全认证',
title: '',
content: '',
confirmText: '继续',
cancelText: '暂不继续',
steps: [],
resolver: null
}
},
created() {
uni.$on('ie-auth-dialog:show', this.show)
},
beforeDestroy() {
uni.$off('ie-auth-dialog:show', this.show)
},
methods: {
show(options = {}) {
if (typeof options.handled === 'function') {
options.handled()
}
this.badge = options.badge || 'i/e 安全认证'
this.title = options.title || '进阶实名认证'
this.content = options.content || ''
this.confirmText = options.confirmText || '继续'
this.cancelText = options.cancelText || '暂不继续'
this.steps = options.steps || []
this.resolver = options.resolve || null
this.visible = true
},
confirm() {
this.close(true)
},
cancel() {
this.close(false)
},
close(value) {
this.visible = false
if (this.resolver) {
this.resolver(value)
}
this.resolver = null
},
noop() {}
}
}
</script>
<style lang="scss" scoped>
.auth-mask {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 99998;
display: flex;
align-items: center;
justify-content: center;
padding: 48rpx;
background: rgba(13, 18, 34, 0.48);
backdrop-filter: blur(18rpx);
}
.auth-card {
position: relative;
width: 100%;
overflow: hidden;
padding: 46rpx 38rpx 34rpx;
border-radius: 46rpx;
background: linear-gradient(180deg, rgba(255,255,255,.98), rgba(245,249,255,.96));
border: 1rpx solid rgba(255,255,255,.88);
box-shadow: 0 34rpx 90rpx rgba(28, 35, 74, .28);
}
.auth-glow {
position: absolute;
border-radius: 999rpx;
filter: blur(4rpx);
opacity: .72;
}
.auth-glow-a {
right: -80rpx;
top: -90rpx;
width: 230rpx;
height: 230rpx;
background: rgba(169,255,231,.78);
}
.auth-glow-b {
left: -70rpx;
bottom: 120rpx;
width: 190rpx;
height: 190rpx;
background: rgba(255,126,179,.22);
}
.auth-badge {
position: relative;
display: inline-flex;
padding: 10rpx 18rpx;
border-radius: 999rpx;
color: #6c55d8;
background: rgba(122,77,255,.09);
font-size: 22rpx;
font-weight: 800;
}
.auth-title {
position: relative;
margin-top: 22rpx;
color: #11162a;
font-size: 42rpx;
line-height: 54rpx;
font-weight: 900;
}
.auth-content {
position: relative;
margin-top: 16rpx;
color: rgba(17,22,42,.62);
font-size: 26rpx;
line-height: 42rpx;
}
.auth-steps {
position: relative;
margin-top: 26rpx;
padding: 22rpx;
border-radius: 28rpx;
background: rgba(241,247,255,.82);
}
.auth-step {
display: flex;
align-items: center;
gap: 16rpx;
min-height: 48rpx;
color: rgba(17,22,42,.72);
font-size: 24rpx;
font-weight: 700;
}
.step-dot {
width: 34rpx;
height: 34rpx;
line-height: 34rpx;
text-align: center;
border-radius: 50%;
color: #11162a;
background: #a9ffe7;
font-size: 20rpx;
font-weight: 900;
}
.auth-actions {
position: relative;
display: flex;
gap: 18rpx;
margin-top: 34rpx;
}
.auth-btn {
flex: 1;
height: 84rpx;
line-height: 84rpx;
text-align: center;
border-radius: 999rpx;
font-size: 27rpx;
font-weight: 900;
}
.auth-btn.ghost {
color: rgba(17,22,42,.56);
background: rgba(17,22,42,.06);
}
.auth-btn.primary {
color: #11162a;
background: linear-gradient(135deg, #a9ffe7, #ffcf7b);
box-shadow: 0 16rpx 32rpx rgba(76, 209, 184, .22);
}
</style>