feat: 我的鱼篓/一键处理/出售鱼

main
LyMysterious 1 year ago
parent 8117e8ce2e
commit 9132ea1e19

@ -11,8 +11,10 @@
"dependencies": { "dependencies": {
"axios": "^1.8.4", "axios": "^1.8.4",
"element-plus": "^2.9.7", "element-plus": "^2.9.7",
"tsparticles": "^3.8.1",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-router": "^4.5.0" "vue-router": "^4.5.0",
"vue3-particles": "^2.12.0"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue": "^5.2.1",

@ -7,3 +7,24 @@ import request from '@/utils/request'
export function myFishBaskets () { export function myFishBaskets () {
return request.get('/Fishing/all-fish') return request.get('/Fishing/all-fish')
} }
/**
* 出售鱼
*/
export function sellFish (data) {
return request.post('/Trade/sell', data)
}
/**
* 处理指定鱼
*/
export function handleFishById (fishId) {
return request.post(`/Trade/handle/${fishId}`)
}
/**
* 自动处理鱼
*/
export function autoHandleFish () {
return request.post(`/Trade/auto-handle`)
}

@ -3,11 +3,11 @@ import App from './App.vue'
import router from './router' import router from './router'
import ElementPlus from 'element-plus' import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css' import 'element-plus/dist/index.css'
import Particles from "vue3-particles"
const app = createApp(App) const app = createApp(App)
app.use(router) app.use(router)
app.use(ElementPlus) app.use(ElementPlus)
app.use(Particles)
app.mount('#app') app.mount('#app')

@ -1,36 +1,50 @@
<!--
* @Descripttion:
* @version: 1.0.0
* @Author: LyMy
* @Date: 2025-04-11 16:33:21
* @LastEditors: LyMy
* @LastEditTime: 2025-04-11 18:31:55
* @FilePath: \go_fish_web\src\pages\fishbaskets\Fishbaskets.vue
-->
<template> <template>
<div class="equipments-page"> <div class="equipments-page">
<h1>🎣 我的鱼篓</h1> <h1>🎣 我的鱼篓</h1>
<el-table :data="fishList" style="width: 100%;height: calc(100vh - 240px);" border>
<el-table-column prop="name" label="鱼名" /> <!-- 处理按钮 -->
<el-table-column prop="weight" label="重量" align="right"/> <div style="text-align: right; margin-bottom: 20px;">
<el-button type="primary" @click="fetchFishList"></el-button>
<el-button type="primary" @click="handleProcessFish"></el-button>
</div>
<el-tabs v-model="activeTab" type="card">
<el-tab-pane label="所有鱼" name="all" />
<el-tab-pane label="普通鱼" name="ordinary" />
<el-tab-pane label="稀有鱼" name="rare" />
</el-tabs>
<el-table :data="filteredFish" style="width: 100%;height:(100vh-200px)" border>
<el-table-column prop="id" label="id" align="center" width="100" />
<el-table-column prop="name" label="鱼名" align="center" width="200" />
<el-table-column prop="weight" label="重量" align="right" width="150" />
<el-table-column prop="description" label="描述" /> <el-table-column prop="description" label="描述" />
<el-table-column label="是否稀有" align="center"> <el-table-column label="是否稀有" align="center" width="150">
<template #default="{ row }"> <template #default="{ row }">
<el-tag :type="row.isRare ? 'danger' : 'info'"> <el-tag :type="row.isRare ? 'danger' : 'info'">
{{ row.isRare ? '稀有' : '普通' }} {{ row.isRare ? '稀有' : '普通' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<!-- 出售按钮 -->
<el-table-column label="操作" align="center" width="180">
<template #default="{ row }">
<el-button v-if="row.isRare" type="danger" @click="handleSell(row)"></el-button>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted, computed } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { myFishBaskets } from '@/api/fishbaskets/fishbaskets' import { myFishBaskets, handleFishById, sellFish, autoHandleFish } from '@/api/fishbaskets/fishbaskets' // sellFish
import { ElMessage } from 'element-plus' import { ElMessage, ElInput, ElMessageBox } from 'element-plus'
const activeTab = ref('all')
const fishList = ref([]) const fishList = ref([])
const router = useRouter() const router = useRouter()
@ -38,15 +52,64 @@ const fetchFishList = async () => {
try { try {
const res = await myFishBaskets() const res = await myFishBaskets()
if (res) { if (res) {
fishList.value = res fishList.value = res;
ElMessage.success('鱼篓数据加载成功')
} }
} catch (err) { } catch (err) {
ElMessage.warning('请检查网络或重试') ElMessage.warning('请检查网络或重试')
} }
} }
const goHome = () => { //
router.push('/') const filteredFish = computed(() => {
switch (activeTab.value) {
case 'all':
return fishList.value;
case 'ordinary':
return fishList.value.filter(f => !f.isRare);
case 'rare':
return fishList.value.filter(f => f.isRare);
}
})
//
const handleProcessFish = async () => {
try {
const res = await autoHandleFish()
if (res) {
ElMessage.success(res)
fetchFishList()
}
} catch (err) {
console.log('====================================');
console.log(err);
console.log('====================================');
ElMessage.warning('处理失败,请稍后再试')
}
}
//
const handleSell = async (fish) => {
const { value: price } = await ElMessageBox.prompt('请输入出售价格', `出售鱼 ${fish.name}` , {
confirmButtonText: '确认',
cancelButtonText: '取消',
inputPattern: /^\d+(\.\d{1,2})?$/,
inputErrorMessage: '请输入合法的价格'
})
if (price) {
try {
const res = await sellFish({ FishBagId: fish.id, Points: price })
if (res.success) {
ElMessage.success(res.message)
fetchFishList()
} else {
ElMessage.error('出售失败 ' + res.message);
}
} catch (err) {
ElMessage.error('出售失败,请稍后再试')
}
}
} }
onMounted(() => { onMounted(() => {

@ -2,6 +2,7 @@
<div class="equipments-page"> <div class="equipments-page">
<h1>钓鱼</h1> <h1>钓鱼</h1>
<div style="margin-top: 200px;">
<el-button type="primary" @click="handleFish"></el-button> <el-button type="primary" @click="handleFish"></el-button>
<el-button @click="goHome" style="margin-left: 10px">返回</el-button> <el-button @click="goHome" style="margin-left: 10px">返回</el-button>
@ -10,6 +11,7 @@
<p v-if="nextPullTime">{{ nextPullTime }}</p> <p v-if="nextPullTime">{{ nextPullTime }}</p>
</div> </div>
</div> </div>
</div>
</template> </template>
<script setup> <script setup>
@ -38,6 +40,7 @@ const handleFish = async () => {
ElMessage.warning('什么也没钓到,下次好运 🍀') ElMessage.warning('什么也没钓到,下次好运 🍀')
} }
} else { } else {
nextPullTime.value = res.message
ElMessage.error(res.message || '钓鱼失败') ElMessage.error(res.message || '钓鱼失败')
} }
} catch (err) { } catch (err) {

@ -1,26 +1,21 @@
<!--
* @Descripttion:
* @version: 1.0.0
* @Author: LyMy
* @Date: 2025-04-11 16:51:41
* @LastEditors: LyMy
* @LastEditTime: 2025-04-11 18:21:25
* @FilePath: \go_fish_web\src\pages\main\Home.vue
-->
<template> <template>
<div class="home-page"> <div class="home-page">
<h1>欢迎来到钓鱼游戏</h1> <!-- 粒子背景 -->
<Particles id="tsparticles" :options="particlesOptions" />
<!-- 菜单栏 -->
<div class="menu"> <!-- 页面内容 -->
<ul> <div class="content">
<li @click="navigateTo('equipments')"></li> <h1 class="title">欢迎来到钓鱼大冒险</h1>
<li @click="navigateTo('fishing')">竿</li>
<li @click="navigateTo('fishbaskets')"></li> <el-card class="menu-card">
<li @click="navigateTo('shop')"></li> <el-row :gutter="20" justify="center">
<li @click="navigateTo('market')"></li> <el-col :span="8" v-for="item in menuItems" :key="item.name">
<li @click="navigateTo('ranking')"></li> <el-button type="primary" size="large" class="menu-btn" @click="navigateTo(item.route)" plain>
</ul> {{ item.label }}
</el-button>
</el-col>
</el-row>
</el-card>
</div> </div>
</div> </div>
</template> </template>
@ -30,30 +25,107 @@ import { useRouter } from 'vue-router'
const router = useRouter() const router = useRouter()
// const menuItems = [
{ label: '🎒 查看装备', route: 'equipments' },
{ label: '🎣 拉竿钓鱼', route: 'fishing' },
{ label: '🐟 查看鱼篓', route: 'fishbaskets' },
{ label: '🛒 商店售卖', route: 'shop' },
{ label: '💰 市场信息', route: 'market' },
{ label: '🏆 游戏排名', route: 'ranking' }
]
const navigateTo = (page) => { const navigateTo = (page) => {
router.push({ name: page }) router.push({ name: page })
} }
const particlesOptions = {
background: {
color: { value: "#001f3f" }
},
particles: {
number: { value: 40, density: { enable: true, area: 800 } },
color: { value: "#00d9ff" },
shape: { type: "circle" },
opacity: {
value: 0.7,
random: true,
anim: {
enable: true,
speed: 0.5,
opacity_min: 0.3,
sync: false
}
},
size: {
value: 6,
random: true,
anim: {
enable: true,
speed: 2,
size_min: 0.3,
sync: false
}
},
move: {
enable: true,
speed: 1.5,
direction: "top",
outModes: { default: "out" }
}
},
interactivity: {
events: {
onHover: { enable: true, mode: "bubble" },
resize: true
},
modes: {
bubble: {
distance: 150,
size: 12,
duration: 2,
opacity: 1,
speed: 3
}
}
},
detectRetina: true
}
</script> </script>
<style scoped> <style scoped>
.home-page { .home-page {
text-align: center; position: relative;
height: 100vh;
overflow: hidden;
}
#tsparticles {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
} }
.menu { .content {
margin-top: 20px; position: relative;
z-index: 1;
max-width: 800px;
margin: 60px auto;
text-align: center;
} }
.menu ul { .title {
list-style-type: none; font-size: 2.5rem;
padding: 0; font-weight: bold;
margin-bottom: 30px;
color: #ffffff;
} }
.menu li { .menu-card {
margin: 10px 0; background-color: rgba(255, 255, 255, 0.85);
cursor: pointer; border-radius: 12px;
font-size: 18px;
color: #007bff;
} }
.menu li:hover { .menu-btn {
text-decoration: underline; width: 100%;
margin-bottom: 15px;
font-size: 16px;
} }
</style> </style>

@ -4,36 +4,49 @@
* @Author: LyMy * @Author: LyMy
* @Date: 2025-04-11 15:56:12 * @Date: 2025-04-11 15:56:12
* @LastEditors: LyMy * @LastEditors: LyMy
* @LastEditTime: 2025-04-11 16:19:14 * @LastEditTime: 2025-04-11 20:26:22
* @FilePath: \fish_game\src\utils\request.js * @FilePath: \go_fish_web\src\utils\request.js
*/ */
import axios from 'axios' import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'
// 创建 axios 实例 // 创建 axios 实例
const request = axios.create({ const request = axios.create({
baseURL: 'http://49.235.165.171:31001', // 你的基础地址 baseURL: 'http://49.235.165.171:31001',
timeout: 5000 timeout: 5000,
}) })
// 设置默认 Content-Type
request.defaults.headers['Content-Type'] = 'application/json' request.defaults.headers['Content-Type'] = 'application/json'
// 请求拦截器 // 请求拦截器:添加 token
request.interceptors.request.use( request.interceptors.request.use(
config => { (config) => {
const token = localStorage.getItem('token') const token = localStorage.getItem('token')
if (token) { if (token) {
config.headers.Authorization = `Bearer ${token}` config.headers.Authorization = `Bearer ${token}`
} }
return config return config
}, },
error => Promise.reject(error) (error) => Promise.reject(error)
) )
// 响应拦截器 // 响应拦截器:统一处理错误
request.interceptors.response.use( request.interceptors.response.use(
response => response.data, (response) => response.data,
error => { (error) => {
console.error('接口请求错误:', error) const status = error.response?.status
if (status === 401) {
// token 失效
ElMessage.warning('登录已过期,请重新登录')
localStorage.removeItem('token')
router.push('/login')
} else {
ElMessage.error(error.response?.data?.message || '请求失败,请稍后再试')
}
return Promise.reject(error) return Promise.reject(error)
} }
) )

Loading…
Cancel
Save