-
钓鱼
-
-
-
开始钓鱼
-
返回
-
-
-
{{ resultMessage }}
-
下次可钓鱼时间:{{ nextPullTime }}
-
+
diff --git a/src/pages/login/Login.vue b/src/pages/login/Login.vue
index e566165..55bc0f3 100644
--- a/src/pages/login/Login.vue
+++ b/src/pages/login/Login.vue
@@ -37,6 +37,13 @@
+
+
+
+
+
+
+
@@ -102,10 +109,10 @@ async function handleLogin () {
localStorage.setItem('token', res.token)
router.push('/')
} else {
- ElMessage.error('登录失败,未返回token')
+ ElMessage.error('登录失败,未返回token 🔑')
}
} catch (err) {
- ElMessage.error('登录失败,请检查网络或重试')
+ //ElMessage.error('登录失败,请检查网络或重试')
console.error('登录错误:', err)
}
} else {
@@ -120,15 +127,17 @@ async function handleRegister () {
try {
const res = await register({
Name: form.value.Name,
+ Email: form.value.Email,
Password: form.value.Password
})
if (res) {
- ElMessage.success('注册成功')
+ ElMessage.success('注册成功 😀😀')
+ toggleForm() // 注册成功后切换到登录表单
} else {
- ElMessage.error('注册失败')
+ ElMessage.error('注册失败 😢😢')
}
} catch (err) {
- ElMessage.error('注册失败,请检查网络或重试')
+ ElMessage.error('注册失败,请检查网络或重试 📶')
console.error('注册失败:', err)
}
} else {
@@ -139,6 +148,11 @@ async function handleRegister () {
function toggleForm () {
isLogin.value = !isLogin.value // 切换登录和注册表单
+ form.value = {
+ Name: '',
+ Password: ''
+ }
+ formRef.value?.resetFields() // 重置表单验证状态
}
@@ -147,44 +161,119 @@ function toggleForm () {
display: flex;
justify-content: center;
align-items: center;
- height: 100vh;
- background-color: #f5f5f5;
+ min-height: 100vh;
+ background: linear-gradient(135deg, #0d47a1 0%, #1565c0 100%);
+ padding: 20px;
}
.login-card {
- width: 500px;
- padding: 20px;
- background-color: #ffffff;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ width: 100%;
+ max-width: 500px;
+ padding: 30px;
+ background-color: rgba(255, 255, 255, 0.92);
+ border-radius: 20px;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.25), 0 0 15px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(20px);
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.login-card:hover {
+ transform: translateY(-8px);
+ box-shadow: 0 15px 50px rgba(0, 0, 0, 0.18), 0 0 15px rgba(0, 0, 0, 0.08);
}
.title {
text-align: center;
- margin-bottom: 30px;
- font-size: 2rem;
- color: #409eff;
- font-weight: bold;
+ margin-bottom: 40px;
+ font-size: 2.8rem;
+ background: linear-gradient(45deg, #0d47a1, #1976d2);
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ font-weight: 800;
+ letter-spacing: 3px;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.15);
}
.el-input {
width: 100%;
}
+.el-input :deep(.el-input__wrapper) {
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
+ border-radius: 12px;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ padding: 8px 15px;
+}
+
+.el-input :deep(.el-input__wrapper:hover) {
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
+}
+
.el-button {
width: 100%;
+ height: 48px;
+ border-radius: 12px;
+ font-size: 17px;
+ font-weight: 600;
+ letter-spacing: 1.2px;
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.el-button:not(.el-button--text) {
+ background: linear-gradient(45deg, #0d47a1, #1976d2);
+ border: none;
+ box-shadow: 0 4px 15px rgba(13, 71, 161, 0.4);
+}
+
+.el-button:not(.el-button--text):hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 25px rgba(30, 136, 229, 0.5);
}
.toggle-link {
- margin-top: 15px;
+ margin-top: 35px;
text-align: center;
+ padding: 20px 16px 0;
+ border-top: 1px solid rgba(235, 238, 245, 0.8);
+ transition: all 0.3s ease;
}
.toggle-link span {
- margin-right: 5px;
+ margin-right: 8px;
+ color: #606266;
+ font-size: 15px;
}
-.toggle-link el-button {
+.toggle-link .el-button {
padding: 0;
- font-size: 14px;
+ font-size: 16px;
+ font-weight: 600;
+ background: none;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ margin-left: 4px;
+ height: auto;
+}
+
+.toggle-link .el-button:hover {
+ color: #1e88e5;
+ transform: scale(1.08);
+ text-shadow: 0 0 10px rgba(30, 136, 229, 0.3);
+}
+
+.el-form-item {
+ margin-bottom: 28px;
+}
+
+@media (max-width: 576px) {
+ .login-card {
+ padding: 25px;
+ }
+
+ .title {
+ font-size: 2.2rem;
+ margin-bottom: 35px;
+ }
}
diff --git a/src/pages/ranking/Ranking.vue b/src/pages/ranking/Ranking.vue
index b4c80cb..57fdb85 100644
--- a/src/pages/ranking/Ranking.vue
+++ b/src/pages/ranking/Ranking.vue
@@ -8,81 +8,90 @@
* @FilePath: \go_fish_web\src\pages\ranking\Ranking.vue
-->
-
-
🏆 钓鱼排行榜
+
+
🏆 钓鱼排行榜
-
-
- 🎣 我的钓鱼成绩
-
-
得分:{{ myScore?.score }}
-
描述:{{ myScore?.description }}
-
-
+
+
+ 🎣 我的钓鱼成绩
+
+
得分:{{ myScore?.score || "暂无得分" }}
+
描述:{{ myScore?.description || "暂无描述" }}
+
+
-
-
-
-
-
-
-
-
- {{ row.maxFishName }} - {{ row.maxWeight }}
-
-
-
+
+
+
+
+ {{ $index + 1 }}
+
+
+
+
+
+
+
+ {{ row.maxFishName }} - {{ row.maxWeight }}
+
+
+
-
-
+
+
diff --git a/src/pages/shop/Shop.vue b/src/pages/shop/Shop.vue
index 8967c0f..aefea32 100644
--- a/src/pages/shop/Shop.vue
+++ b/src/pages/shop/Shop.vue
@@ -37,7 +37,7 @@ const fetchData = async () => {
points.value = pointsRes.points
items.value = pointsRes.items
} catch (err) {
- ElMessage.error('加载数据失败,请重试')
+ ElMessage.error('加载数据失败,请重试 🛍️')
}
}
@@ -52,16 +52,16 @@ const buyItem = async (good) => {
if (count) {
try {
- const res = await await buy({ EquipmentId: good.id, Quantity: 1 })
+ const res = await await buy({ EquipmentId: good.id, Quantity: count })
if (res) {
- good.myQuantity += 1
- points.value -= good.points
- ElMessage.success("购买成功")
+ good.myQuantity += count
+ points.value -= count
+ ElMessage.success("购买成功 😎")
} else {
- ElMessage.error(res.message)
+ ElMessage.error(res.message + ' 😞')
}
} catch (err) {
- ElMessage.error('购买失败,请稍后再试')
+ ElMessage.error('购买失败,请稍后再试 👿')
}
}
}
diff --git a/src/utils/request.js b/src/utils/request.js
index 7c79616..a38ca93 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -7,58 +7,106 @@
* @LastEditTime: 2025-04-12 14:17:15
* @FilePath: \go_fish_web\src\utils\request.js
*/
-import axios from 'axios'
-import { ElMessage } from 'element-plus'
-import router from '@/router'
+import axios from "axios";
+import { ElMessage } from "element-plus";
+import router from "@/router";
-let isRefreshing = false
+let isRefreshing = false;
+let requestQueue = [];
// 创建 axios 实例
+// 清理登录状态的函数
+export function clearLoginState() {
+ localStorage.removeItem("token");
+ localStorage.removeItem("fishingLogs");
+}
+
const request = axios.create({
- baseURL: 'http://49.235.165.171:31001',
+ baseURL: "http://49.235.165.171:31001",
timeout: 5000,
-})
+});
// 设置默认 Content-Type
-request.defaults.headers['Content-Type'] = 'application/json'
+request.defaults.headers["Content-Type"] = "application/json";
// 请求拦截器:添加 token
request.interceptors.request.use(
(config) => {
- const token = localStorage.getItem('token')
+ const token = localStorage.getItem("token");
if (token) {
- config.headers.Authorization = `Bearer ${token}`
+ config.headers.Authorization = `Bearer ${token}`;
+ // 登录成功后重试队列中的请求
+ if (requestQueue.length > 0) {
+ requestQueue.forEach(({ resolve, config }) => {
+ resolve(request(config));
+ });
+ requestQueue = [];
+ }
}
- return config
+ return config;
},
(error) => Promise.reject(error)
-)
+);
// 响应拦截器
request.interceptors.response.use(
(response) => response.data,
(error) => {
- const status = error.response?.status
+ console.dir(error);
+ const status = error.response?.status;
+ const config = error.config;
- if (status === 401) {
+ if (status === 400) {
+ // 处理400错误,解析并显示具体的验证错误信息
+ const errorData = error.response?.data;
+ if (errorData?.errors) {
+ // 收集所有错误信息
+ const errorMessages = [];
+ Object.entries(errorData.errors).forEach(([field, messages]) => {
+ if (Array.isArray(messages)) {
+ messages.forEach((msg) => errorMessages.push(msg));
+ }
+ });
+ // 显示合并后的错误信息
+ if (errorMessages.length > 0) {
+ ElMessage.error(errorMessages.join("\n"));
+ } else {
+ ElMessage.error("请求参数验证失败");
+ }
+ } else {
+ // 如果没有详细的错误信息,显示通用错误消息
+ ElMessage.error(errorData?.title || "请求参数错误");
+ }
+ return Promise.reject(error);
+ } else if (status === 401) {
// 避免重复处理 401
if (!isRefreshing) {
- isRefreshing = true
- ElMessage.warning('登录已过期,请重新登录')
- localStorage.removeItem('token')
- router.push('/login')
+ isRefreshing = true;
+ ElMessage.warning("登录已过期,请重新登录");
+ clearLoginState();
+ // 清空请求队列
+ requestQueue = [];
+ router.push("/login");
// 重置标志位,避免死锁
setTimeout(() => {
- isRefreshing = false
- }, 3000) // 避免多次跳转,给 3 秒冷却时间
+ isRefreshing = false;
+ }, 3000); // 避免多次跳转,给 3 秒冷却时间
}
+
+ // 将请求加入队列
+ return new Promise((resolve) => {
+ requestQueue.push({
+ resolve,
+ config,
+ });
+ });
} else {
- ElMessage.error(error.response?.data?.message || '请求失败,请稍后再试')
+ ElMessage.error(error.response?.data?.message || "请求失败,请稍后再试");
}
- return Promise.reject(error)
+ return Promise.reject(error);
}
-)
+);
-export default request
+export default request;