Skip to content

Commit 2bd804d

Browse files
authored
Merge pull request #2105 from Azir-11/dev-286
优化弹窗组件相关内容、增加登录页验证码静态验证
2 parents ee04bb0 + c114a02 commit 2bd804d

File tree

3 files changed

+52
-39
lines changed

3 files changed

+52
-39
lines changed

web/src/components/errorPreview/index.vue

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<template>
22
<div
3-
class="fixed inset-0 bg-black/40 flex items-center justify-center z-[999]"
3+
class="fixed inset-0 bg-black/40 dark:bg-black/60 flex items-center justify-center z-[999]"
44
@click.self="closeModal"
55
>
6-
<div class="bg-white rounded-xl shadow-dialog w-full max-w-md mx-4 transform transition-all duration-300 ease-in-out">
6+
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-dialog dark:shadow-lg w-full max-w-md mx-4 transform transition-all duration-300 ease-in-out border border-transparent dark:border-gray-700">
77
<!-- 弹窗头部 -->
8-
<div class="p-5 border-b border-gray-100 flex justify-between items-center">
9-
<h3 class="text-lg font-semibold text-gray-800">{{ displayData.title }}</h3>
10-
<div class="text-gray-400 hover:text-gray-600 transition-colors cursor-pointer" @click="closeModal">
8+
<div class="p-5 border-b border-gray-100 dark:border-gray-700 flex justify-between items-center">
9+
<h3 class="text-lg font-semibold text-gray-800 dark:text-gray-100">{{ displayData.title }}</h3>
10+
<div class="text-gray-400 dark:text-gray-300 hover:text-gray-600 dark:hover:text-gray-200 transition-colors cursor-pointer" @click="closeModal">
1111
<close class="h-6 w-6" />
1212
</div>
1313
</div>
@@ -16,36 +16,36 @@
1616
<div class="p-6 pt-0">
1717
<!-- 错误类型 -->
1818
<div class="mb-4">
19-
<div class="text-xs font-medium text-gray-500 uppercase mb-2">错误类型</div>
19+
<div class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase mb-2">错误类型</div>
2020
<div class="flex items-center gap-2">
21-
<lock v-if="displayData.icon === 'lock'" class="text-red-500 w-5 h-5" />
22-
<warn v-if="displayData.icon === 'warn'" class="text-red-500 w-5 h-5" />
23-
<server v-if="displayData.icon === 'server'" class="text-red-500 w-5 h-5" />
24-
<span class="font-medium text-gray-800">{{ displayData.type }}</span>
21+
<lock v-if="displayData.icon === 'lock'" :class="['w-5 h-5', displayData.color]" />
22+
<warn v-if="displayData.icon === 'warn'" :class="['w-5 h-5', displayData.color]" />
23+
<server v-if="displayData.icon === 'server'" :class="['w-5 h-5', displayData.color]" />
24+
<span class="font-medium text-gray-800 dark:text-gray-100">{{ displayData.type }}</span>
2525
</div>
2626
</div>
2727

2828
<!-- 具体错误 -->
2929
<div class="mb-6">
30-
<div class="text-xs font-medium text-gray-500 uppercase mb-2">具体错误</div>
31-
<div class="bg-gray-100 rounded-lg p-3 text-sm text-gray-700 leading-relaxed">
30+
<div class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase mb-2">具体错误</div>
31+
<div class="bg-gray-100 dark:bg-gray-900/40 rounded-lg p-3 text-sm text-gray-700 dark:text-gray-200 leading-relaxed">
3232
{{ displayData.message }}
3333
</div>
3434
</div>
3535

3636
<!-- 提示信息 -->
3737
<div v-if="displayData.tips">
38-
<div class="text-xs font-medium text-gray-500 uppercase mb-2">提示</div>
38+
<div class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase mb-2">提示</div>
3939
<div class="flex items-center gap-2">
40-
<idea class="text-blue-500 w-5 h-5" />
41-
<p class="text-sm text-gray-600">{{ displayData.tips }}</p>
40+
<idea class="text-blue-500 dark:text-blue-400 w-5 h-5" />
41+
<p class="text-sm text-gray-600 dark:text-gray-300">{{ displayData.tips }}</p>
4242
</div>
4343
</div>
4444
</div>
4545

4646
<!-- 弹窗底部 -->
47-
<div class="py-2 px-4 border-t border-gray-100 flex justify-end">
48-
<div class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium text-sm shadow-sm cursor-pointer" @click="handleConfirm">
47+
<div class="py-2 px-4 border-t border-gray-100 dark:border-gray-700 flex justify-end">
48+
<div class="px-4 py-2 bg-blue-600 dark:bg-blue-500 text-white dark:text-gray-100 rounded-lg hover:bg-blue-700 dark:hover:bg-blue-600 transition-colors font-medium text-sm shadow-sm cursor-pointer" @click="handleConfirm">
4949
确定
5050
</div>
5151
</div>
@@ -70,28 +70,28 @@ const presetErrors = {
7070
title: '检测到接口错误',
7171
type: '服务器发生内部错误',
7272
icon: 'server',
73-
color: 'text-red-500',
73+
color: 'text-red-500 dark:text-red-400',
7474
tips: '此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存'
7575
},
7676
404: {
7777
title: '资源未找到',
7878
type: 'Not Found',
7979
icon: 'warn',
80-
color: 'text-orange-500',
80+
color: 'text-orange-500 dark:text-orange-400',
8181
tips: '此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格'
8282
},
8383
401: {
8484
title: '身份认证失败',
8585
type: '身份令牌无效',
8686
icon: 'lock',
87-
color: 'text-purple-500',
87+
color: 'text-purple-500 dark:text-purple-400',
8888
tips: '您的身份认证已过期或无效,请重新登录。'
8989
},
9090
'network': {
9191
title: '网络错误',
9292
type: 'Network Error',
9393
icon: 'fa-wifi-slash',
94-
color: 'text-gray-500',
94+
color: 'text-gray-500 dark:text-gray-400',
9595
tips: '无法连接到服务器,请检查您的网络连接。'
9696
}
9797
};
@@ -109,7 +109,7 @@ const displayData = computed(() => {
109109
title: '未知错误',
110110
type: '检测到请求错误',
111111
icon: 'fa-question-circle',
112-
color: 'text-gray-400',
112+
color: 'text-gray-400 dark:text-gray-300',
113113
message: props.errorData.message || '发生了一个未知错误。',
114114
tips: '请检查控制台获取更多信息。'
115115
};

web/src/utils/request.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ service.interceptors.request.use(
124124
)
125125

126126
function getErrorMessage(error) {
127-
return error.response?.data?.msg || '请求失败'
127+
// 优先级: 响应体中的 msg > statusText > 默认消息
128+
return error.response?.data?.msg || error.response?.statusText || '请求失败'
128129
}
129130

130131
// http response 拦截器

web/src/view/login/index.vue

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
})
139139
140140
const router = useRouter()
141+
const captchaRequiredLength = ref(6)
141142
// 验证函数
142143
const checkUsername = (rule, value, callback) => {
143144
if (value.length < 5) {
@@ -153,19 +154,36 @@
153154
callback()
154155
}
155156
}
157+
const checkCaptcha = (rule, value, callback) => {
158+
if (!loginFormData.openCaptcha) {
159+
return callback()
160+
}
161+
const sanitizedValue = (value || '').replace(/\s+/g, '')
162+
if (!sanitizedValue) {
163+
return callback(new Error('请输入验证码'))
164+
}
165+
if (!/^\d+$/.test(sanitizedValue)) {
166+
return callback(new Error('验证码须为数字'))
167+
}
168+
if (sanitizedValue.length < captchaRequiredLength.value) {
169+
return callback(
170+
new Error(`请输入至少${captchaRequiredLength.value}位数字验证码`)
171+
)
172+
}
173+
if (sanitizedValue !== value) {
174+
loginFormData.captcha = sanitizedValue
175+
}
176+
callback()
177+
}
156178
157179
// 获取验证码
158180
const loginVerify = async () => {
159181
const ele = await captcha()
160-
rules.captcha.push({
161-
max: ele.data.captchaLength,
162-
min: ele.data.captchaLength,
163-
message: `请输入${ele.data.captchaLength}位验证码`,
164-
trigger: 'blur'
165-
})
166-
picPath.value = ele.data.picPath
167-
loginFormData.captchaId = ele.data.captchaId
168-
loginFormData.openCaptcha = ele.data.openCaptcha
182+
const lengthFromServer = Number(ele.data?.captchaLength) || 0
183+
captchaRequiredLength.value = Math.max(6, lengthFromServer)
184+
picPath.value = ele.data?.picPath
185+
loginFormData.captchaId = ele.data?.captchaId
186+
loginFormData.openCaptcha = ele.data?.openCaptcha
169187
}
170188
loginVerify()
171189
@@ -182,12 +200,7 @@
182200
const rules = reactive({
183201
username: [{ validator: checkUsername, trigger: 'blur' }],
184202
password: [{ validator: checkPassword, trigger: 'blur' }],
185-
captcha: [
186-
{
187-
message: '验证码格式不正确',
188-
trigger: 'blur'
189-
}
190-
]
203+
captcha: [{ validator: checkCaptcha, trigger: 'blur' }]
191204
})
192205
193206
const userStore = useUserStore()
@@ -203,7 +216,6 @@
203216
message: '请正确填写登录信息',
204217
showClose: true
205218
})
206-
await loginVerify()
207219
return false
208220
}
209221

0 commit comments

Comments
 (0)