feat(login): 删除还没有账号? 注册
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 2m19s

This commit is contained in:
sexygoat
2026-01-22 18:04:32 +08:00
parent 13bdee2899
commit 339abca4c0
9 changed files with 39 additions and 53 deletions

8
.gitignore vendored
View File

@@ -1,9 +1,17 @@
node_modules node_modules
.DS_Store .DS_Store
dist dist
docs
dist-ssr dist-ssr
*.local *.local
.cursorrules .cursorrules
.claude
# Environment files
.env
.env.development
.env.production
.env.*.local
# IDE # IDE
.idea .idea

View File

@@ -1,10 +1,6 @@
<template> <template>
<div> <div>
<el-tooltip <el-tooltip effect="dark" content="按下 ^ 键也能回到顶部哦" placement="left-start">
effect="dark"
:content="`按下 ^ 键也能回到顶部哦 ${EmojiText[200]}`"
placement="left-start"
>
<div class="back-to-top" v-show="showButton" @click="scrollToTop"> <div class="back-to-top" v-show="showButton" @click="scrollToTop">
<div class="back-to-top-btn"> <div class="back-to-top-btn">
<i class="iconfont-sys">&#xe864;</i> <i class="iconfont-sys">&#xe864;</i>
@@ -17,7 +13,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { useCommon } from '@/composables/useCommon' import { useCommon } from '@/composables/useCommon'
import EmojiText from '@/utils/ui/emojo'
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
const { scrollToTop } = useCommon() const { scrollToTop } = useCommon()

View File

@@ -23,7 +23,6 @@
import { Editor, Toolbar } from '@wangeditor/editor-for-vue' import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import EmojiText from '@/utils/ui/emojo'
import { IDomEditor } from '@wangeditor/editor' import { IDomEditor } from '@wangeditor/editor'
const modelValue = defineModel<string>({ required: true }) const modelValue = defineModel<string>({ required: true })
@@ -64,12 +63,12 @@
headers: { Authorization: accessToken }, headers: { Authorization: accessToken },
// 单个文件上传成功之后 // 单个文件上传成功之后
onSuccess() { onSuccess() {
ElMessage.success(`图片上传成功 ${EmojiText[200]}`) ElMessage.success('图片上传成功')
}, },
// 上传错误,或者触发 timeout 超时 // 上传错误,或者触发 timeout 超时
onError(file: File, err: any, res: any) { onError(file: File, err: any, res: any) {
console.log(`上传出错`, err, res) console.log(`上传出错`, err, res)
ElMessage.error(`图片上传失败 ${EmojiText[500]}`) ElMessage.error('图片上传失败')
} }
// 注意:返回格式需要按照指定格式返回,才能显示图片 // 注意:返回格式需要按照指定格式返回,才能显示图片
// 上传成功的返回格式: // 上传成功的返回格式:

View File

@@ -12,16 +12,8 @@ import { HOME_PAGE } from '@/router/routesAlias'
import AppConfig from '@/config' import AppConfig from '@/config'
import { AuthService } from '@/api/authApi' import { AuthService } from '@/api/authApi'
import { ApiStatus } from '@/utils/http/status' import { ApiStatus } from '@/utils/http/status'
import { import { MOCK_ACCOUNTS, mockLogin, mockGetUserInfo, type MockAccount } from '@/mock/auth'
MOCK_ACCOUNTS, import { saveCredentials, getRememberedCredentials } from '@/utils/auth/rememberPassword'
mockLogin,
mockGetUserInfo,
type MockAccount
} from '@/mock/auth'
import {
saveCredentials,
getRememberedCredentials
} from '@/utils/auth/rememberPassword'
import { usernameRules, passwordRules } from '@/utils/auth/loginValidation' import { usernameRules, passwordRules } from '@/utils/auth/loginValidation'
import { getRedirectPath } from '@/router/guards/permission' import { getRedirectPath } from '@/router/guards/permission'
@@ -84,9 +76,7 @@ export function useLogin() {
// 如果使用 Mock尝试匹配 Mock 账号 // 如果使用 Mock尝试匹配 Mock 账号
if (USE_MOCK) { if (USE_MOCK) {
const matchedAccount = MOCK_ACCOUNTS.find( const matchedAccount = MOCK_ACCOUNTS.find((acc) => acc.username === remembered.username)
(acc) => acc.username === remembered.username
)
if (matchedAccount) { if (matchedAccount) {
formData.account = matchedAccount.key formData.account = matchedAccount.key
} }
@@ -142,7 +132,10 @@ export function useLogin() {
} }
} catch (error: any) { } catch (error: any) {
console.error('登录失败:', error) console.error('登录失败:', error)
ElMessage.error(error.message || t('login.error.loginFailed')) // 从后端响应中提取错误消息
const errorMessage =
error.response?.data?.msg || error.message || t('login.error.loginFailed')
ElMessage.error(errorMessage)
} finally { } finally {
loading.value = false loading.value = false
} }

View File

@@ -1,7 +1,6 @@
import axios, { InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse } from 'axios' import axios, { InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import EmojiText from '../ui/emojo'
import { ApiStatus } from './status' import { ApiStatus } from './status'
import type { RequestOptions, ErrorMessageMode } from '@/types/api' import type { RequestOptions, ErrorMessageMode } from '@/types/api'
@@ -46,7 +45,7 @@ axiosInstance.interceptors.request.use(
return request // 返回修改后的配置 return request // 返回修改后的配置
}, },
(error) => { (error) => {
ElMessage.error(`服务器异常! ${EmojiText[500]}`) // 显示错误消息 ElMessage.error('服务器异常!') // 显示错误消息
return Promise.reject(error) // 返回拒绝的 Promise return Promise.reject(error) // 返回拒绝的 Promise
} }
) )
@@ -116,7 +115,8 @@ axiosInstance.interceptors.response.use(
// 更新请求头 // 更新请求头
originalRequest.headers['Authorization'] = `Bearer ${data.data.access_token}` originalRequest.headers['Authorization'] = `Bearer ${data.data.access_token}`
axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${data.data.access_token}` axiosInstance.defaults.headers.common['Authorization'] =
`Bearer ${data.data.access_token}`
// 处理队列中的请求 // 处理队列中的请求
processQueue(null, data.data.access_token) processQueue(null, data.data.access_token)
@@ -190,10 +190,8 @@ function processRequestConfig(config: ExtendedRequestConfig): AxiosRequestConfig
function handleErrorMessage(error: any, mode: ErrorMessageMode = 'message') { function handleErrorMessage(error: any, mode: ErrorMessageMode = 'message') {
if (mode === 'none') return if (mode === 'none') return
const errorMessage = error.response?.data.msg const errorMessage = error.response?.data?.msg
const message = errorMessage const message = errorMessage || '请求超时或服务器异常!'
? `${errorMessage} ${EmojiText[500]}`
: `请求超时或服务器异常!${EmojiText[500]}`
if (mode === 'modal') { if (mode === 'modal') {
// TODO: 可以使用 ElMessageBox 显示模态框 // TODO: 可以使用 ElMessageBox 显示模态框
@@ -224,9 +222,11 @@ async function request<T = any>(config: ExtendedRequestConfig): Promise<T> {
return res.data return res.data
} catch (e) { } catch (e) {
if (axios.isAxiosError(e)) { if (axios.isAxiosError(e)) {
// 处理错误消息 // 只有明确指定了错误消息模式才显示错误
const errorMode = config.requestOptions?.errorMessageMode || 'message' const errorMode = config.requestOptions?.errorMessageMode
handleErrorMessage(e, errorMode) if (errorMode && errorMode !== 'none') {
handleErrorMessage(e, errorMode)
}
} }
return Promise.reject(e) return Promise.reject(e)
} }
@@ -253,7 +253,7 @@ const api = {
// 退出登录 // 退出登录
const logOut = () => { const logOut = () => {
ElMessage.error(`登录已过期,请重新登录 ${EmojiText[500]}`) ElMessage.error('登录已过期,请重新登录')
setTimeout(() => { setTimeout(() => {
useUserStore().logOut() useUserStore().logOut()
}, 1000) }, 1000)

View File

@@ -10,10 +10,10 @@
// macos 用户 按 shift + 6 可以唤出更多表情…… // macos 用户 按 shift + 6 可以唤出更多表情……
const EmojiText: { [key: string]: string } = { const EmojiText: { [key: string]: string } = {
'0': 'O_O', // 空 '0': '🤔', // 空 / 未知
'200': '^_^', // 成功 '200': '🎉', // 成功
'400': 'T_T', // 错误请求 '400': '😞', // 客户端错误
'500': 'X_X' // 服务器内部错误,无法完成请求 '500': '🤯' // 服务器炸了
} }
// const EmojiIcon = ['🟢', '🔴', '🟡 ', '🚀', '✨', '💡', '🛠️', '🔥', '🎉', '🌟', '🌈'] // const EmojiIcon = ['🟢', '🔴', '🟡 ', '🚀', '✨', '💡', '🛠️', '🔥', '🎉', '🌟', '🌈']

View File

@@ -70,7 +70,7 @@
</div> </div>
<div style="margin-top: 16vh" v-if="showEmpty"> <div style="margin-top: 16vh" v-if="showEmpty">
<ElEmpty :description="`未找到相关数据 ${EmojiText[0]}`" /> <ElEmpty description="未找到相关数据" />
</div> </div>
<div style="display: flex; justify-content: center; margin-top: 20px"> <div style="display: flex; justify-content: center; margin-top: 20px">
@@ -96,7 +96,6 @@
import { router } from '@/router' import { router } from '@/router'
import { useDateFormat } from '@vueuse/core' import { useDateFormat } from '@vueuse/core'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import EmojiText from '@/utils/ui/emojo'
import { ArticleList } from '@/mock/temp/articleList' import { ArticleList } from '@/mock/temp/articleList'
import { useCommon } from '@/composables/useCommon' import { useCommon } from '@/composables/useCommon'
import { RoutesAlias } from '@/router/routesAlias' import { RoutesAlias } from '@/router/routesAlias'

View File

@@ -78,7 +78,6 @@
import { ApiStatus } from '@/utils/http/status' import { ApiStatus } from '@/utils/http/status'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import EmojiText from '@/utils/ui/emojo'
import { PageModeEnum } from '@/enums/formEnum' import { PageModeEnum } from '@/enums/formEnum'
import axios from 'axios' import axios from 'axios'
import { useCommon } from '@/composables/useCommon' import { useCommon } from '@/composables/useCommon'
@@ -250,7 +249,7 @@
const res = await ArticleService.addArticle(params) const res = await ArticleService.addArticle(params)
if (res.code === ApiStatus.success) { if (res.code === ApiStatus.success) {
ElMessage.success(`发布成功 ${EmojiText[200]}`) ElMessage.success('发布成功')
goBack() goBack()
} }
} catch (err) { } catch (err) {
@@ -269,7 +268,7 @@
const res = await ArticleService.editArticle(articleId, params) const res = await ArticleService.editArticle(articleId, params)
if (res.code === ApiStatus.success) { if (res.code === ApiStatus.success) {
ElMessage.success(`修改成功 ${EmojiText[200]}`) ElMessage.success('修改成功')
goBack() goBack()
} }
} catch (err) { } catch (err) {
@@ -283,11 +282,11 @@
const onSuccess = (response: any) => { const onSuccess = (response: any) => {
cover.value = response.data.url cover.value = response.data.url
ElMessage.success(`图片上传成功 ${EmojiText[200]}`) ElMessage.success('图片上传成功')
} }
const onError = () => { const onError = () => {
ElMessage.error(`图片上传失败 ${EmojiText[500]}`) ElMessage.error('图片上传失败')
} }
// 返回上一页 // 返回上一页

View File

@@ -106,13 +106,6 @@
{{ $t('login.btnText') }} {{ $t('login.btnText') }}
</ElButton> </ElButton>
</div> </div>
<div class="footer">
<p>
{{ $t('login.noAccount') }}
<RouterLink :to="RoutesAlias.Register">{{ $t('login.register') }}</RouterLink>
</p>
</div>
</ElForm> </ElForm>
</div> </div>
</div> </div>
@@ -134,7 +127,7 @@
defineOptions({ name: 'Login' }) defineOptions({ name: 'Login' })
const { t, locale } = useI18n() const { locale } = useI18n()
const settingStore = useSettingStore() const settingStore = useSettingStore()
const userStore = useUserStore() const userStore = useUserStore()
const { isDark, systemThemeType } = storeToRefs(settingStore) const { isDark, systemThemeType } = storeToRefs(settingStore)