Compare commits
No commits in common. 'main' and '1.0.0.1' have entirely different histories.
@ -1,11 +0,0 @@
|
||||
FROM nginx:1.25.3-alpine
|
||||
|
||||
# 从构建阶段复制构建结果到nginx目录
|
||||
ADD go_fish_web.tar.gz /usr/share/nginx/html
|
||||
|
||||
# 复制nginx配置
|
||||
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
@ -1,64 +0,0 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
stages {
|
||||
stage('📄文件信息') {
|
||||
steps {
|
||||
sh 'pwd'
|
||||
sh 'ls -al'
|
||||
echo '🚀开始推送文件到坤爷服务器'
|
||||
sh 'scp Dockerfile root@47.109.22.188:~/go_fish_web'
|
||||
sh 'scp nginx.conf root@47.109.22.188:~/go_fish_web'
|
||||
echo '✨推送完成'
|
||||
}
|
||||
}
|
||||
|
||||
stage('🛠️构建项目') {
|
||||
steps {
|
||||
withDockerContainer('node:18-alpine') {
|
||||
sh 'npm -v'
|
||||
sh 'npm config set registry https://registry.npmmirror.com'
|
||||
sh 'npm install'
|
||||
sh 'npm run build'
|
||||
sh 'ls -al'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('🎁打包制品'){
|
||||
steps {
|
||||
dir('dist') {
|
||||
sh 'ls -al'
|
||||
sh 'tar -zcvf go_fish_web.tar.gz *'
|
||||
archiveArtifacts artifacts: 'go_fish_web.tar.gz',
|
||||
allowEmptyArchive: true,
|
||||
fingerprint: true,
|
||||
onlyIfSuccessful: true
|
||||
sh 'ls -al'
|
||||
echo '🚀开始推送制品到坤爷服务器'
|
||||
sh 'scp go_fish_web.tar.gz root@47.109.22.188:~/go_fish_web'
|
||||
echo '✨推送完成'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('🏓远程部署') {
|
||||
steps {
|
||||
echo '🚀开始远程部署'
|
||||
sh 'ssh root@47.109.22.188 "docker stop go_fish_web && docker rm go_fish_web && docker rmi go_fish_web && docker build -t go_fish_web ~/go_fish_web"'
|
||||
sh 'ssh root@47.109.22.188 "docker run --restart=always --name go_fish_web -d -p 30030:80 -v /etc/localtime:/etc/localtime:ro go_fish_web"'
|
||||
sh 'ssh root@47.109.22.188 "docker ps -a"'
|
||||
echo '✨远程部署完成'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
success {
|
||||
echo 'Deployment successful!'
|
||||
}
|
||||
failure {
|
||||
echo 'Deployment failed.'
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,33 +0,0 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
# 启用gzip压缩
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
|
||||
gzip_vary on;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
|
||||
# 设置根目录
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# 启用 CORS
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
|
||||
}
|
||||
|
||||
# 处理 404 页面
|
||||
error_page 404 /index.html;
|
||||
|
||||
# 缓存静态资源
|
||||
location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg|json)$ {
|
||||
expires max;
|
||||
access_log off;
|
||||
}
|
||||
}
|
||||
@ -1,170 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="400" height="300" viewBox="0 0 400 300" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- 渐变定义 -->
|
||||
<defs>
|
||||
<linearGradient id="skyGradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#87CEEB"/>
|
||||
<stop offset="100%" style="stop-color:#4FC3F7"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="waterGradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#29B6F6" stop-opacity="0.8"/>
|
||||
<stop offset="100%" style="stop-color:#0288D1" stop-opacity="0.9"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="groundGradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#8D6E63"/>
|
||||
<stop offset="100%" style="stop-color:#5D4037"/>
|
||||
</linearGradient>
|
||||
<!-- 水波纹动画效果 -->
|
||||
<filter id="water-ripple">
|
||||
<feTurbulence type="turbulence" baseFrequency="0.01" numOctaves="3" result="turbulence">
|
||||
<animate attributeName="baseFrequency" dur="30s" values="0.01;0.015;0.01" repeatCount="indefinite"/>
|
||||
</feTurbulence>
|
||||
<feDisplacementMap in="SourceGraphic" in2="turbulence" scale="10" xChannelSelector="R" yChannelSelector="G"/>
|
||||
</filter>
|
||||
<!-- 光影效果 -->
|
||||
<filter id="soft-light">
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="2" result="blur"/>
|
||||
<feComposite in="SourceGraphic" in2="blur" operator="arithmetic" k1="1" k2="0.5" k3="0" k4="0"/>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- 天空背景 -->
|
||||
<rect x="0" y="0" width="400" height="200" fill="url(#skyGradient)"/>
|
||||
|
||||
<!-- 云朵 -->
|
||||
<g>
|
||||
<path d="M50,50 q20,-20 40,0 t40,0 t40,0 q20,20 0,40 h-120 q-20,-20 0,-40" fill="white" opacity="0.8">
|
||||
<animateTransform attributeName="transform" type="translate" from="-100,0" to="500,0" dur="60s" repeatCount="indefinite"/>
|
||||
</path>
|
||||
<path d="M80,80 q15,-15 30,0 t30,0 t30,0 q15,15 0,30 h-90 q-15,-15 0,-30" fill="white" opacity="0.6">
|
||||
<animateTransform attributeName="transform" type="translate" from="-100,0" to="500,0" dur="45s" repeatCount="indefinite"/>
|
||||
</path>
|
||||
</g>
|
||||
|
||||
<!-- 远处的树木和山丘 -->
|
||||
<g transform="translate(20,150)">
|
||||
<path d="M0,0 c-20,-40 -15,-45 0,-60 c15,15 20,20 0,60" fill="#2E7D32"/>
|
||||
<rect x="-2" y="0" width="4" height="10" fill="#5D4037"/>
|
||||
</g>
|
||||
<g transform="translate(350,140)">
|
||||
<path d="M0,0 c-25,-50 -20,-55 0,-70 c20,15 25,20 0,70" fill="#2E7D32"/>
|
||||
<rect x="-3" y="0" width="6" height="15" fill="#5D4037"/>
|
||||
</g>
|
||||
<path d="M320,160 Q360,140 400,160" fill="#8D6E63" opacity="0.6"/>
|
||||
|
||||
<!-- 河岸和石头 -->
|
||||
<path d="M0,180 Q100,170 200,180 T400,180 L400,200 L0,200 Z" fill="url(#groundGradient)"/>
|
||||
<g transform="translate(100,175)">
|
||||
<path d="M0,0 Q5,-5 10,0 Q15,-3 20,0" fill="#795548"/>
|
||||
</g>
|
||||
<g transform="translate(250,178)">
|
||||
<path d="M0,0 Q8,-8 16,0 Q24,-5 32,0" fill="#795548"/>
|
||||
</g>
|
||||
|
||||
<!-- 草丛装饰 -->
|
||||
<g transform="translate(30,170)">
|
||||
<path d="M0,0 Q5,-12 10,0 M5,0 Q10,-18 15,0 M10,0 Q15,-10 20,0" stroke="#4CAF50" stroke-width="2" fill="none"/>
|
||||
<path d="M2,-2 Q7,-8 12,-2" stroke="#81C784" stroke-width="1.5" fill="none"/>
|
||||
</g>
|
||||
<g transform="translate(150,175)">
|
||||
<path d="M0,0 Q5,-15 10,0 M5,0 Q10,-20 15,0 M10,0 Q15,-12 20,0" stroke="#4CAF50" stroke-width="2" fill="none"/>
|
||||
<path d="M3,-3 Q8,-10 13,-3" stroke="#81C784" stroke-width="1.5" fill="none"/>
|
||||
</g>
|
||||
<g transform="translate(280,172)">
|
||||
<path d="M0,0 Q5,-12 10,0 M5,0 Q10,-18 15,0 M10,0 Q15,-10 20,0" stroke="#4CAF50" stroke-width="2" fill="none"/>
|
||||
<path d="M2,-2 Q7,-8 12,-2" stroke="#81C784" stroke-width="1.5" fill="none"/>
|
||||
</g>
|
||||
|
||||
<!-- 水面 -->
|
||||
<g>
|
||||
<rect x="0" y="200" width="400" height="100" fill="url(#waterGradient)" filter="url(#water-ripple)"/>
|
||||
<!-- 水面反光效果 -->
|
||||
<path d="M50,220 Q200,210 350,220" stroke="white" stroke-width="1" fill="none" opacity="0.3">
|
||||
<animate attributeName="d" dur="5s" repeatCount="indefinite"
|
||||
values="M50,220 Q200,210 350,220;M50,220 Q200,230 350,220;M50,220 Q200,210 350,220"/>
|
||||
</path>
|
||||
<path d="M80,240 Q200,235 320,240" stroke="white" stroke-width="0.8" fill="none" opacity="0.2">
|
||||
<animate attributeName="d" dur="7s" repeatCount="indefinite"
|
||||
values="M80,240 Q200,235 320,240;M80,240 Q200,245 320,240;M80,240 Q200,235 320,240"/>
|
||||
</path>
|
||||
</g>
|
||||
|
||||
<!-- 钓鱼的人 -->
|
||||
<g transform="translate(150,160)">
|
||||
<!-- 腿 -->
|
||||
<path d="M-8,0 C-8,5 -7,10 -5,15 M8,0 C8,5 7,10 5,15" stroke="#5D4037" stroke-width="4" stroke-linecap="round"/>
|
||||
<!-- 鞋子 -->
|
||||
<path d="M-7,15 Q-5,14 -3,15 L-3,17 L-7,17 Q-8,16 -7,15 Z" fill="#3E2723"/>
|
||||
<path d="M3,15 Q5,14 7,15 L7,17 L3,17 Q2,16 3,15 Z" fill="#3E2723"/>
|
||||
<!-- 身体 -->
|
||||
<path d="M-5,-25 C-8,-20 -8,-10 -5,0 L5,0 C8,-10 8,-20 5,-25 Z" fill="#795548">
|
||||
<!-- 衣服褶皱和纹理 -->
|
||||
<path d="M-3,-20 C-1,-19 1,-19 3,-20" stroke="#6D4C41" stroke-width="0.5" fill="none"/>
|
||||
<path d="M-4,-15 C-2,-14 2,-14 4,-15" stroke="#6D4C41" stroke-width="0.5" fill="none"/>
|
||||
<path d="M-3,-10 C-1,-9 1,-9 3,-10" stroke="#6D4C41" stroke-width="0.5" fill="none"/>
|
||||
<path d="M-2,-5 C0,-4 2,-4 4,-5" stroke="#6D4C41" stroke-width="0.5" fill="none"/>
|
||||
</path>
|
||||
<!-- 头 -->
|
||||
<circle cx="0" cy="-35" r="10" fill="#FFA726"/>
|
||||
<!-- 表情 -->
|
||||
<path d="M-3,-37 Q0,-35 3,-37" stroke="#5D4037" stroke-width="0.5" fill="none">
|
||||
<animate attributeName="d" dur="4s" repeatCount="indefinite"
|
||||
values="M-3,-37 Q0,-35 3,-37;M-3,-36 Q0,-34 3,-36;M-3,-37 Q0,-35 3,-37"/>
|
||||
</path>
|
||||
<circle cx="-4" cy="-38" r="0.8" fill="#5D4037"/>
|
||||
<circle cx="4" cy="-38" r="0.8" fill="#5D4037"/>
|
||||
<!-- 帽子 -->
|
||||
<path d="M-12,-38 C-8,-45 8,-45 12,-38 L0,-45 Z" fill="#8D6E63">
|
||||
<path d="M-8,-41 L8,-41" stroke="#6D4C41" stroke-width="0.5" fill="none"/>
|
||||
</path>
|
||||
<!-- 手臂 -->
|
||||
<path d="M5,-20 Q15,-18 20,-15" stroke="#795548" stroke-width="4" stroke-linecap="round">
|
||||
<animate attributeName="d" dur="4s" repeatCount="indefinite"
|
||||
values="M5,-20 Q15,-18 20,-15;M5,-20 Q15,-17 20,-14;M5,-20 Q15,-18 20,-15"/>
|
||||
</path>
|
||||
</g>
|
||||
|
||||
<!-- 钓鱼竿 -->
|
||||
<g transform="translate(170,145)">
|
||||
<!-- 手柄 -->
|
||||
<path d="M0,0 L10,-5" stroke="#5D4037" stroke-width="3" stroke-linecap="round"/>
|
||||
<!-- 主杆 -->
|
||||
<line x1="10" y1="-5" x2="30" y2="-20" stroke="#8D6E63" stroke-width="2" stroke-linecap="round"/>
|
||||
<!-- 导环 -->
|
||||
<circle cx="15" cy="-8" r="1" fill="none" stroke="#424242" stroke-width="0.5"/>
|
||||
<circle cx="22" cy="-13" r="1" fill="none" stroke="#424242" stroke-width="0.5"/>
|
||||
<!-- 鱼线轮 -->
|
||||
<path d="M5,-3 A3,3 0 1,1 5,3" fill="#424242"/>
|
||||
<!-- 伸出部分 -->
|
||||
<line x1="30" y1="-20" x2="60" y2="40" stroke="#8D6E63" stroke-width="1.5" stroke-linecap="round">
|
||||
<animate attributeName="x2" dur="4s" repeatCount="indefinite"
|
||||
values="60;61;60"/>
|
||||
<animate attributeName="y2" dur="4s" repeatCount="indefinite"
|
||||
values="40;41;40"/>
|
||||
</line>
|
||||
<!-- 鱼线 -->
|
||||
<path d="M60,40 C60,45 60,50 60,60" stroke="#A7FFEB" stroke-width="0.5" fill="none">
|
||||
<animate attributeName="d" dur="2s" repeatCount="indefinite"
|
||||
values="M60,40 C60,45 60,50 60,60;M60,40 C61,45 61,50 61,65;M60,40 C60,45 60,50 60,60"/>
|
||||
</path>
|
||||
<!-- 浮标 -->
|
||||
<circle cx="60" cy="55" r="1.5" fill="#F44336">
|
||||
<animate attributeName="cy" dur="2s" repeatCount="indefinite"
|
||||
values="55;60;55"/>
|
||||
</circle>
|
||||
</g>
|
||||
|
||||
<!-- 水中的鱼 -->
|
||||
<g transform="translate(250,250)">
|
||||
<path d="M0,0 C2,-3 8,-3 10,0 L12,0 L10,2 C8,5 2,5 0,2 L-2,0 Z" fill="#FFB74D">
|
||||
<animateTransform attributeName="transform" type="translate" values="-50,0;50,0;-50,0" dur="10s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0.6;0.8;0.6" dur="10s" repeatCount="indefinite"/>
|
||||
</path>
|
||||
</g>
|
||||
<g transform="translate(180,270)">
|
||||
<path d="M0,0 C1,-2 4,-2 5,0 L6,0 L5,1 C4,3 1,3 0,1 L-1,0 Z" fill="#FFB74D">
|
||||
<animateTransform attributeName="transform" type="translate" values="-30,0;30,0;-30,0" dur="8s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0.4;0.6;0.4" dur="8s" repeatCount="indefinite"/>
|
||||
</path>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 8.1 KiB |
@ -1,87 +0,0 @@
|
||||
<template>
|
||||
<div class="fishing-log">
|
||||
<h2>钓鱼日志</h2>
|
||||
<el-scrollbar height="300px">
|
||||
<div v-if="logs.length > 0" class="log-list">
|
||||
<div v-for="(log, index) in logs" :key="index" class="log-item" :class="{ rare: log.isRare }">
|
||||
<div class="log-time">{{ formatTime(log.time) }}</div>
|
||||
<div class="log-content">
|
||||
<el-tag :type="log.isRare ? 'warning' : 'info'" effect="plain">
|
||||
{{ log.fishName }}
|
||||
</el-tag>
|
||||
<span class="log-weight">{{ log.weight }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-empty v-else description="暂无钓鱼记录" />
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
logs: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
})
|
||||
|
||||
const formatTime = (time) => {
|
||||
return new Date(time).toLocaleString()
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.fishing-log {
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.log-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.log-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
background: #f5f7fa;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.log-item:hover {
|
||||
transform: translateX(5px);
|
||||
background: #ecf5ff;
|
||||
}
|
||||
|
||||
.log-time {
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.log-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.log-weight {
|
||||
color: #606266;
|
||||
}
|
||||
|
||||
.rare {
|
||||
background: #fdf6ec;
|
||||
}
|
||||
|
||||
.rare:hover {
|
||||
background: #faecd8;
|
||||
}
|
||||
</style>
|
||||
@ -1,326 +1,131 @@
|
||||
<template>
|
||||
<div class="home-page">
|
||||
<!-- 粒子背景 -->
|
||||
<Particles id="tsparticles" :options="particlesOptions" />
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div class="content">
|
||||
<div class="title-container">
|
||||
<h1 class="title">欢迎来到钓鱼大冒险</h1>
|
||||
<p class="subtitle">开启你的海洋探索之旅</p>
|
||||
</div>
|
||||
|
||||
<div class="menu-grid">
|
||||
<div
|
||||
v-for="item in menuItems"
|
||||
:key="item.name"
|
||||
class="menu-item"
|
||||
@click="navigateTo(item.route)"
|
||||
>
|
||||
<div class="menu-card">
|
||||
<div class="menu-icon" v-html="item.icon"></div>
|
||||
<h3 class="menu-title">{{ item.label }}</h3>
|
||||
<p class="menu-description">{{ item.description }}</p>
|
||||
</div>
|
||||
<div class="home-page">
|
||||
<!-- 粒子背景 -->
|
||||
<Particles id="tsparticles" :options="particlesOptions" />
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div class="content">
|
||||
<h1 class="title">欢迎来到钓鱼大冒险</h1>
|
||||
|
||||
<el-card class="menu-card">
|
||||
<el-row :gutter="20" justify="center">
|
||||
<el-col :span="8" v-for="item in menuItems" :key="item.name">
|
||||
<el-button type="primary" size="large" class="menu-btn" @click="navigateTo(item.route)" plain>
|
||||
{{ item.label }}
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useRouter } from "vue-router";
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
const router = useRouter();
|
||||
const router = useRouter()
|
||||
|
||||
const menuItems = [
|
||||
{
|
||||
label: "查看装备",
|
||||
route: "equipments",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M20 7h-5V4c0-1.1-.9-2-2-2h-2C9.9 2 9 2.9 9 4v3H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zM9 12c.83 0 1.5.67 1.5 1.5S9.83 15 9 15s-1.5-.67-1.5-1.5S8.17 12 9 12zm6 6H9v-.75c0-1 2-1.5 3-1.5s3 .5 3 1.5V18z"/></svg>`,
|
||||
description: "管理你的钓鱼装备和道具",
|
||||
},
|
||||
{
|
||||
label: "拉竿钓鱼",
|
||||
route: "fishing",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M12 12.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zm0 4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm1-7.5V5.7c3.4-.4 6-3.2 6-6.7h-2c0 2.8-2.2 5-5 5S7 1.8 7 -1H5c0 3.5 2.6 6.3 6 6.7V9H9v2h6V9h-2z"/></svg>`,
|
||||
description: "开始一场精彩的钓鱼冒险",
|
||||
},
|
||||
{
|
||||
label: "查看鱼篓",
|
||||
route: "fishbaskets",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M18.5 11c.17 0 .34.01.5.03V7c0-1.1-.9-2-2-2h-1V3c0-.55-.45-1-1-1h-6c-.55 0-1 .45-1 1v2H7c-1.1 0-2 .9-2 2v4.03c.16-.02.33-.03.5-.03.83 0 1.58.34 2.12.88.54-.54 1.29-.88 2.12-.88.83 0 1.58.34 2.12.88.54-.54 1.29-.88 2.12-.88M9 4h6v1H9zm10 16H5c-.55 0-1-.45-1-1v-8.51c.42-.34.75-.77.93-1.27.18-.5.19-1.03.03-1.53-.22-.67-.74-1.19-1.41-1.41-.21-.07-.43-.11-.65-.13V7c0-.55.45-1 1-1h1v2c0 .55.45 1 1 1h8c.55 0 1-.45 1-1V6h1c.55 0 1 .45 1 1v.14c-.22.02-.44.06-.65.13-.67.22-1.19.74-1.41 1.41-.16.5-.15 1.03.03 1.53.18.5.51.93.93 1.27V19c0 .55-.45 1-1 1z"/></svg>`,
|
||||
description: "查看你的渔获和战利品",
|
||||
},
|
||||
{
|
||||
label: "道具商店",
|
||||
route: "shop",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z"/></svg>`,
|
||||
description: "购买钓鱼装备和特殊道具",
|
||||
},
|
||||
{
|
||||
label: "市场信息",
|
||||
route: "market",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z"/></svg>`,
|
||||
description: "了解最新的市场行情和价格",
|
||||
},
|
||||
{
|
||||
label: "游戏排名",
|
||||
route: "ranking",
|
||||
icon: `<svg viewBox="0 0 24 24" width="32" height="32"><path fill="currentColor" d="M19 5h-2V3H7v2H5c-1.1 0-2 .9-2 2v1c0 2.55 1.92 4.63 4.39 4.94.63 1.5 1.98 2.63 3.61 2.96V19H7v2h10v-2h-4v-3.1c1.63-.33 2.98-1.46 3.61-2.96C19.08 12.63 21 10.55 21 8V7c0-1.1-.9-2-2-2zM7 10.82C5.84 10.4 5 9.3 5 8V7h2v3.82zM19 8c0 1.3-.84 2.4-2 2.82V7h2v1z"/></svg>`,
|
||||
description: "查看玩家排行榜和成就",
|
||||
},
|
||||
];
|
||||
{ label: '🎒 查看装备', route: 'equipments' },
|
||||
{ label: '🎣 拉竿钓鱼', route: 'fishing' },
|
||||
{ label: '🐟 查看鱼篓', route: 'fishbaskets' },
|
||||
{ label: '🛒 道具商店', route: 'shop' },
|
||||
{ label: '💰 市场信息', route: 'market' },
|
||||
{ label: '🏆 游戏排名', route: 'ranking' }
|
||||
]
|
||||
|
||||
const navigateTo = (page) => {
|
||||
router.push({ name: page });
|
||||
};
|
||||
router.push({ name: page })
|
||||
}
|
||||
|
||||
const particlesOptions = {
|
||||
background: {
|
||||
color: { value: "transparent" },
|
||||
},
|
||||
particles: {
|
||||
number: { value: 50, density: { enable: true, area: 800 } },
|
||||
color: {
|
||||
value: [
|
||||
"var(--primary-color)",
|
||||
"var(--primary-dark)",
|
||||
"var(--text-primary)",
|
||||
],
|
||||
},
|
||||
shape: { type: ["circle", "star"] },
|
||||
opacity: {
|
||||
value: 0.6,
|
||||
random: true,
|
||||
anim: {
|
||||
enable: true,
|
||||
speed: 0.3,
|
||||
opacity_min: 0.2,
|
||||
sync: false,
|
||||
},
|
||||
},
|
||||
size: {
|
||||
value: 4,
|
||||
random: true,
|
||||
anim: {
|
||||
enable: true,
|
||||
speed: 1,
|
||||
size_min: 0.2,
|
||||
sync: false,
|
||||
},
|
||||
background: {
|
||||
color: { value: "#001f3f" }
|
||||
},
|
||||
move: {
|
||||
enable: true,
|
||||
speed: 1,
|
||||
direction: "none",
|
||||
random: true,
|
||||
straight: false,
|
||||
outModes: { default: "bounce" },
|
||||
attract: {
|
||||
enable: true,
|
||||
rotateX: 600,
|
||||
rotateY: 1200,
|
||||
},
|
||||
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" }
|
||||
}
|
||||
},
|
||||
links: {
|
||||
enable: true,
|
||||
distance: 150,
|
||||
color: "var(--primary-color)",
|
||||
opacity: 0.2,
|
||||
width: 1,
|
||||
interactivity: {
|
||||
events: {
|
||||
onHover: { enable: true, mode: "bubble" },
|
||||
resize: true
|
||||
},
|
||||
modes: {
|
||||
bubble: {
|
||||
distance: 150,
|
||||
size: 12,
|
||||
duration: 2,
|
||||
opacity: 1,
|
||||
speed: 3
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
interactivity: {
|
||||
events: {
|
||||
onHover: { enable: true, mode: ["grab", "bubble"] },
|
||||
onClick: { enable: true, mode: "push" },
|
||||
resize: true,
|
||||
},
|
||||
modes: {
|
||||
grab: {
|
||||
distance: 200,
|
||||
links: { opacity: 0.8 },
|
||||
},
|
||||
bubble: {
|
||||
distance: 200,
|
||||
size: 6,
|
||||
duration: 2,
|
||||
opacity: 0.8,
|
||||
speed: 3,
|
||||
},
|
||||
push: {
|
||||
quantity: 4,
|
||||
},
|
||||
},
|
||||
},
|
||||
detectRetina: true,
|
||||
};
|
||||
detectRetina: true
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.home-page {
|
||||
position: relative;
|
||||
min-height: 100vh;
|
||||
overflow: hidden;
|
||||
background: var(--bg-gradient-primary);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
height: 100vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#tsparticles {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
margin: 20px auto;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
max-width: 800px;
|
||||
margin: 60px auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title-container {
|
||||
text-align: center;
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 3rem;
|
||||
font-weight: bold;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 15px;
|
||||
text-shadow: var(--glow-primary);
|
||||
animation: glow 2s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 1.5rem;
|
||||
color: var(--text-secondary);
|
||||
margin-top: -10px;
|
||||
text-shadow: var(--glow-secondary);
|
||||
font-size: 2.5rem;
|
||||
font-weight: bold;
|
||||
margin-bottom: 30px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.menu-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
gap: 12px;
|
||||
padding: 8px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.menu-card {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
backdrop-filter: blur(15px);
|
||||
border-radius: 20px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
padding: 20px 16px;
|
||||
height: 100%;
|
||||
min-height: 150px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
transform-style: preserve-3d;
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.menu-icon {
|
||||
margin-bottom: 12px;
|
||||
color: var(--primary-color);
|
||||
transition: all 0.3s ease;
|
||||
padding: 10px;
|
||||
background: rgba(var(--primary-rgb), 0.1);
|
||||
border-radius: 50%;
|
||||
background-color: rgba(255, 255, 255, 0.85);
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.menu-title {
|
||||
font-size: 1.2rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 8px;
|
||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.menu-description {
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-secondary);
|
||||
margin: 0;
|
||||
line-height: 1.4;
|
||||
opacity: 0.9;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.menu-card:hover {
|
||||
transform: translateY(-8px);
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
border-color: var(--primary-color);
|
||||
box-shadow: 0 12px 40px rgba(var(--primary-rgb), 0.2);
|
||||
}
|
||||
|
||||
.menu-card:hover .menu-icon {
|
||||
transform: scale(1.1);
|
||||
color: var(--primary-dark);
|
||||
background: rgba(var(--primary-rgb), 0.2);
|
||||
}
|
||||
|
||||
.menu-title {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 12px;
|
||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.menu-description {
|
||||
font-size: 1rem;
|
||||
color: var(--text-secondary);
|
||||
margin: 0;
|
||||
line-height: 1.5;
|
||||
opacity: 0.9;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.menu-card:hover .menu-description {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.title {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.menu-grid {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 6px;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.menu-card {
|
||||
min-height: 140px;
|
||||
padding: 16px 10px;
|
||||
}
|
||||
|
||||
.menu-title {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.menu-description {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
.menu-btn {
|
||||
width: 100%;
|
||||
margin-bottom: 15px;
|
||||
font-size: 16px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,35 +0,0 @@
|
||||
:root {
|
||||
/* 主题色 */
|
||||
--primary-color: #00d9ff;
|
||||
--primary-light: #66b1ff;
|
||||
--primary-dark: #0088cc;
|
||||
|
||||
/* 背景色 */
|
||||
--bg-gradient-primary: linear-gradient(135deg, #001f3f 0%, #003366 100%);
|
||||
--bg-gradient-secondary: linear-gradient(45deg, #0d47a1, #1976d2);
|
||||
--bg-white: #ffffff;
|
||||
--bg-light: #f5f7fa;
|
||||
--bg-card: rgba(255, 255, 255, 0.1);
|
||||
|
||||
/* 文字颜色 */
|
||||
--text-primary: #ffffff;
|
||||
--text-secondary: rgba(255, 255, 255, 0.8);
|
||||
--text-muted: rgba(255, 255, 255, 0.7);
|
||||
--text-dark: #606266;
|
||||
|
||||
/* 边框和阴影 */
|
||||
--border-color: rgba(255, 255, 255, 0.2);
|
||||
--shadow-sm: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
--shadow-md: 0 4px 16px rgba(0, 0, 0, 0.06);
|
||||
--shadow-lg: 0 10px 40px rgba(0, 0, 0, 0.25);
|
||||
|
||||
/* 状态颜色 */
|
||||
--success-color: #67c23a;
|
||||
--warning-color: #e6a23c;
|
||||
--danger-color: #f56c6c;
|
||||
--info-color: #909399;
|
||||
|
||||
/* 特效 */
|
||||
--glow-primary: 0 0 10px rgba(0, 217, 255, 0.5);
|
||||
--glow-secondary: 0 0 5px rgba(0, 217, 255, 0.3);
|
||||
}
|
||||
Loading…
Reference in New Issue