Compare commits

...

2 Commits

Author SHA1 Message Date
qiuyuan
62c8aa3a6f Merge branch 'main' of https://gitlab.guxuan.icu/Leo_Ding/GPU_Web 2025-11-24 10:30:31 +08:00
qiuyuan
f3d8a410d1 账号页面 2025-11-24 10:30:30 +08:00

View File

@ -1,7 +1,13 @@
<!-- src/components/AccountSecurity.vue -->
<script setup lang="ts">
import { ref } from 'vue';
import { CheckCircleOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { ref, reactive } from 'vue';
import {
CheckCircleOutlined,
ExclamationCircleOutlined,
CloseOutlined,
SaveOutlined,
} from '@ant-design/icons-vue';
import { Modal, message } from 'ant-design-vue';
//
interface SecurityItem {
@ -18,7 +24,7 @@ const securityItems = ref<SecurityItem[]>([
description: '安全性高的密码可以使账号更安全。建议您定期更换密码设置一个包含字母和数字且长度超过8位的密码',
status: 'unset',
actionText: '设置',
actionHandler: () => alert('跳转到设置密码页面'),
actionHandler: () => openSetPasswordModal(),
},
{
title: '手机绑定',
@ -50,7 +56,7 @@ const securityItems = ref<SecurityItem[]>([
},
]);
//
const getStatusIcon = (status: SecurityItem['status']) => {
switch (status) {
case 'bound':
@ -76,10 +82,87 @@ const getStatusColor = (status: SecurityItem['status']) => {
};
const getActionColor = (status: SecurityItem['status']) => {
if (status === 'bound') {
return 'blue';
return 'blue'; //
};
//
const setPasswordModalVisible = ref(false);
//
const form = reactive({
phoneNumber: '+86 178****5075', //
smsCode: '',
newPassword: '',
confirmPassword: '',
});
//
const countdown = ref(0);
const isSending = ref(false);
//
const sendSmsCode = () => {
if (isSending.value) return;
isSending.value = true;
countdown.value = 60;
const timer = setInterval(() => {
countdown.value--;
if (countdown.value <= 0) {
clearInterval(timer);
isSending.value = false;
countdown.value = 0;
}
}, 1000);
message.success('验证码已发送');
};
//
const resetForm = () => {
form.smsCode = '';
form.newPassword = '';
form.confirmPassword = '';
countdown.value = 0;
isSending.value = false;
};
//
const openSetPasswordModal = () => {
resetForm();
setPasswordModalVisible.value = true;
};
//
const closeSetPasswordModal = () => {
setPasswordModalVisible.value = false;
resetForm();
};
//
const savePassword = () => {
if (!form.smsCode) {
message.error('请输入验证码');
return;
}
return 'blue'; //
if (!form.newPassword) {
message.error('请输入新密码');
return;
}
if (!form.confirmPassword) {
message.error('请确认密码');
return;
}
if (form.newPassword !== form.confirmPassword) {
message.error('两次输入的密码不一致');
return;
}
if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$/.test(form.newPassword)) {
message.error('密码必须为8~16位且包含字母和数字');
return;
}
//
message.success('密码设置成功!');
closeSetPasswordModal();
};
</script>
@ -110,6 +193,66 @@ const getActionColor = (status: SecurityItem['status']) => {
</div>
<p class="description">{{ item.description }}</p>
</div>
<!-- 设置密码弹窗 -->
<a-modal
v-model:visible="setPasswordModalVisible"
title="设置密码"
width="500px"
:footer="null"
@cancel="closeSetPasswordModal"
>
<div style="padding: 24px 0;">
<div style="margin-bottom: 24px; font-size: 16px; color: #333;">
手机号{{ form.phoneNumber }}
</div>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 8px;">
<span style="color: red;">*</span>
<label style="font-size: 14px; color: #333;">手机验证码</label>
<a-input
v-model:value="form.smsCode"
placeholder="请输入验证码"
style="flex: 1;"
/>
<a-button
type="primary"
:disabled="isSending || countdown > 0"
@click="sendSmsCode"
style="width: 120px;"
>
{{ isSending || countdown > 0 ? `${countdown}s后重发` : '发送验证码' }}
</a-button>
</div>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 8px;">
<span style="color: red;">*</span>
<label style="font-size: 14px; color: #333;">设置新密码</label>
<a-input
v-model:value="form.newPassword"
placeholder="请输入816位包含数字和字母的密码"
type="password"
style="flex: 1;"
/>
</div>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 8px;">
<span style="color: red;">*</span>
<label style="font-size: 14px; color: #3 33;">确认新密码</label>
<a-input
v-model:value="form.confirmPassword"
placeholder="请确认密码"
type="password"
style="flex: 1;"
/>
</div>
</div>
<div style="text-align: right; padding: 16px 24px;">
<a-button @click="closeSetPasswordModal" style="margin-right: 8px;">取消</a-button>
<a-button type="primary" @click="savePassword">保存</a-button>
</div>
</a-modal>
</div>
</template>