feat(login): 删除还没有账号? 注册
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 2m19s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 2m19s
This commit is contained in:
8
.gitignore
vendored
8
.gitignore
vendored
@@ -1,9 +1,17 @@
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
docs
|
||||
dist-ssr
|
||||
*.local
|
||||
.cursorrules
|
||||
.claude
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
.env.development
|
||||
.env.production
|
||||
.env.*.local
|
||||
|
||||
# IDE
|
||||
.idea
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="`按下 ^ 键也能回到顶部哦 ${EmojiText[200]}`"
|
||||
placement="left-start"
|
||||
>
|
||||
<el-tooltip effect="dark" content="按下 ^ 键也能回到顶部哦" placement="left-start">
|
||||
<div class="back-to-top" v-show="showButton" @click="scrollToTop">
|
||||
<div class="back-to-top-btn">
|
||||
<i class="iconfont-sys"></i>
|
||||
@@ -17,7 +13,6 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useCommon } from '@/composables/useCommon'
|
||||
import EmojiText from '@/utils/ui/emojo'
|
||||
import { ref, watch } from 'vue'
|
||||
const { scrollToTop } = useCommon()
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import EmojiText from '@/utils/ui/emojo'
|
||||
import { IDomEditor } from '@wangeditor/editor'
|
||||
|
||||
const modelValue = defineModel<string>({ required: true })
|
||||
@@ -64,12 +63,12 @@
|
||||
headers: { Authorization: accessToken },
|
||||
// 单个文件上传成功之后
|
||||
onSuccess() {
|
||||
ElMessage.success(`图片上传成功 ${EmojiText[200]}`)
|
||||
ElMessage.success('图片上传成功')
|
||||
},
|
||||
// 上传错误,或者触发 timeout 超时
|
||||
onError(file: File, err: any, res: any) {
|
||||
console.log(`上传出错`, err, res)
|
||||
ElMessage.error(`图片上传失败 ${EmojiText[500]}`)
|
||||
ElMessage.error('图片上传失败')
|
||||
}
|
||||
// 注意:返回格式需要按照指定格式返回,才能显示图片
|
||||
// 上传成功的返回格式:
|
||||
|
||||
@@ -12,16 +12,8 @@ import { HOME_PAGE } from '@/router/routesAlias'
|
||||
import AppConfig from '@/config'
|
||||
import { AuthService } from '@/api/authApi'
|
||||
import { ApiStatus } from '@/utils/http/status'
|
||||
import {
|
||||
MOCK_ACCOUNTS,
|
||||
mockLogin,
|
||||
mockGetUserInfo,
|
||||
type MockAccount
|
||||
} from '@/mock/auth'
|
||||
import {
|
||||
saveCredentials,
|
||||
getRememberedCredentials
|
||||
} from '@/utils/auth/rememberPassword'
|
||||
import { MOCK_ACCOUNTS, mockLogin, mockGetUserInfo, type MockAccount } from '@/mock/auth'
|
||||
import { saveCredentials, getRememberedCredentials } from '@/utils/auth/rememberPassword'
|
||||
import { usernameRules, passwordRules } from '@/utils/auth/loginValidation'
|
||||
import { getRedirectPath } from '@/router/guards/permission'
|
||||
|
||||
@@ -84,9 +76,7 @@ export function useLogin() {
|
||||
|
||||
// 如果使用 Mock,尝试匹配 Mock 账号
|
||||
if (USE_MOCK) {
|
||||
const matchedAccount = MOCK_ACCOUNTS.find(
|
||||
(acc) => acc.username === remembered.username
|
||||
)
|
||||
const matchedAccount = MOCK_ACCOUNTS.find((acc) => acc.username === remembered.username)
|
||||
if (matchedAccount) {
|
||||
formData.account = matchedAccount.key
|
||||
}
|
||||
@@ -142,7 +132,10 @@ export function useLogin() {
|
||||
}
|
||||
} catch (error: any) {
|
||||
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 {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import axios, { InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse } from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import EmojiText from '../ui/emojo'
|
||||
import { ApiStatus } from './status'
|
||||
import type { RequestOptions, ErrorMessageMode } from '@/types/api'
|
||||
|
||||
@@ -46,7 +45,7 @@ axiosInstance.interceptors.request.use(
|
||||
return request // 返回修改后的配置
|
||||
},
|
||||
(error) => {
|
||||
ElMessage.error(`服务器异常! ${EmojiText[500]}`) // 显示错误消息
|
||||
ElMessage.error('服务器异常!') // 显示错误消息
|
||||
return Promise.reject(error) // 返回拒绝的 Promise
|
||||
}
|
||||
)
|
||||
@@ -116,7 +115,8 @@ axiosInstance.interceptors.response.use(
|
||||
|
||||
// 更新请求头
|
||||
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)
|
||||
@@ -190,10 +190,8 @@ function processRequestConfig(config: ExtendedRequestConfig): AxiosRequestConfig
|
||||
function handleErrorMessage(error: any, mode: ErrorMessageMode = 'message') {
|
||||
if (mode === 'none') return
|
||||
|
||||
const errorMessage = error.response?.data.msg
|
||||
const message = errorMessage
|
||||
? `${errorMessage} ${EmojiText[500]}`
|
||||
: `请求超时或服务器异常!${EmojiText[500]}`
|
||||
const errorMessage = error.response?.data?.msg
|
||||
const message = errorMessage || '请求超时或服务器异常!'
|
||||
|
||||
if (mode === 'modal') {
|
||||
// TODO: 可以使用 ElMessageBox 显示模态框
|
||||
@@ -224,10 +222,12 @@ async function request<T = any>(config: ExtendedRequestConfig): Promise<T> {
|
||||
return res.data
|
||||
} catch (e) {
|
||||
if (axios.isAxiosError(e)) {
|
||||
// 处理错误消息
|
||||
const errorMode = config.requestOptions?.errorMessageMode || 'message'
|
||||
// 只有明确指定了错误消息模式才显示错误
|
||||
const errorMode = config.requestOptions?.errorMessageMode
|
||||
if (errorMode && errorMode !== 'none') {
|
||||
handleErrorMessage(e, errorMode)
|
||||
}
|
||||
}
|
||||
return Promise.reject(e)
|
||||
}
|
||||
}
|
||||
@@ -253,7 +253,7 @@ const api = {
|
||||
|
||||
// 退出登录
|
||||
const logOut = () => {
|
||||
ElMessage.error(`登录已过期,请重新登录 ${EmojiText[500]}`)
|
||||
ElMessage.error('登录已过期,请重新登录')
|
||||
setTimeout(() => {
|
||||
useUserStore().logOut()
|
||||
}, 1000)
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
|
||||
// macos 用户 按 shift + 6 可以唤出更多表情……
|
||||
const EmojiText: { [key: string]: string } = {
|
||||
'0': 'O_O', // 空
|
||||
'200': '^_^', // 成功
|
||||
'400': 'T_T', // 错误请求
|
||||
'500': 'X_X' // 服务器内部错误,无法完成请求
|
||||
'0': '🤔', // 空 / 未知
|
||||
'200': '🎉', // 成功
|
||||
'400': '😞', // 客户端错误
|
||||
'500': '🤯' // 服务器炸了
|
||||
}
|
||||
|
||||
// const EmojiIcon = ['🟢', '🔴', '🟡 ', '🚀', '✨', '💡', '🛠️', '🔥', '🎉', '🌟', '🌈']
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 16vh" v-if="showEmpty">
|
||||
<ElEmpty :description="`未找到相关数据 ${EmojiText[0]}`" />
|
||||
<ElEmpty description="未找到相关数据" />
|
||||
</div>
|
||||
|
||||
<div style="display: flex; justify-content: center; margin-top: 20px">
|
||||
@@ -96,7 +96,6 @@
|
||||
import { router } from '@/router'
|
||||
import { useDateFormat } from '@vueuse/core'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import EmojiText from '@/utils/ui/emojo'
|
||||
import { ArticleList } from '@/mock/temp/articleList'
|
||||
import { useCommon } from '@/composables/useCommon'
|
||||
import { RoutesAlias } from '@/router/routesAlias'
|
||||
|
||||
@@ -78,7 +78,6 @@
|
||||
import { ApiStatus } from '@/utils/http/status'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import EmojiText from '@/utils/ui/emojo'
|
||||
import { PageModeEnum } from '@/enums/formEnum'
|
||||
import axios from 'axios'
|
||||
import { useCommon } from '@/composables/useCommon'
|
||||
@@ -250,7 +249,7 @@
|
||||
const res = await ArticleService.addArticle(params)
|
||||
|
||||
if (res.code === ApiStatus.success) {
|
||||
ElMessage.success(`发布成功 ${EmojiText[200]}`)
|
||||
ElMessage.success('发布成功')
|
||||
goBack()
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -269,7 +268,7 @@
|
||||
const res = await ArticleService.editArticle(articleId, params)
|
||||
|
||||
if (res.code === ApiStatus.success) {
|
||||
ElMessage.success(`修改成功 ${EmojiText[200]}`)
|
||||
ElMessage.success('修改成功')
|
||||
goBack()
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -283,11 +282,11 @@
|
||||
|
||||
const onSuccess = (response: any) => {
|
||||
cover.value = response.data.url
|
||||
ElMessage.success(`图片上传成功 ${EmojiText[200]}`)
|
||||
ElMessage.success('图片上传成功')
|
||||
}
|
||||
|
||||
const onError = () => {
|
||||
ElMessage.error(`图片上传失败 ${EmojiText[500]}`)
|
||||
ElMessage.error('图片上传失败')
|
||||
}
|
||||
|
||||
// 返回上一页
|
||||
|
||||
@@ -106,13 +106,6 @@
|
||||
{{ $t('login.btnText') }}
|
||||
</ElButton>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>
|
||||
{{ $t('login.noAccount') }}
|
||||
<RouterLink :to="RoutesAlias.Register">{{ $t('login.register') }}</RouterLink>
|
||||
</p>
|
||||
</div>
|
||||
</ElForm>
|
||||
</div>
|
||||
</div>
|
||||
@@ -134,7 +127,7 @@
|
||||
|
||||
defineOptions({ name: 'Login' })
|
||||
|
||||
const { t, locale } = useI18n()
|
||||
const { locale } = useI18n()
|
||||
const settingStore = useSettingStore()
|
||||
const userStore = useUserStore()
|
||||
const { isDark, systemThemeType } = storeToRefs(settingStore)
|
||||
|
||||
Reference in New Issue
Block a user