feat: 游戏列表组件+基础样式
This commit is contained in:
8
components.d.ts
vendored
8
components.d.ts
vendored
@@ -22,9 +22,11 @@ declare module 'vue' {
|
|||||||
ElInput: typeof import('element-plus/es')['ElInput']
|
ElInput: typeof import('element-plus/es')['ElInput']
|
||||||
ElInputOtp: typeof import('element-plus/es')['ElInputOtp']
|
ElInputOtp: typeof import('element-plus/es')['ElInputOtp']
|
||||||
ElPopover: typeof import('element-plus/es')['ElPopover']
|
ElPopover: typeof import('element-plus/es')['ElPopover']
|
||||||
|
ElTooltip: typeof import('element-plus/es')['ElTooltip']
|
||||||
|
GameList: typeof import('./src/components/baseLayouts/GameList.vue')['default']
|
||||||
RouterLink: typeof import('vue-router')['RouterLink']
|
RouterLink: typeof import('vue-router')['RouterLink']
|
||||||
RouterView: typeof import('vue-router')['RouterView']
|
RouterView: typeof import('vue-router')['RouterView']
|
||||||
UserBar: typeof import('./src/components/User/UserBar.vue')['default']
|
UserBar: typeof import('./src/components/baseLayouts/UserBar.vue')['default']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +42,9 @@ declare global {
|
|||||||
const ElInput: typeof import('element-plus/es')['ElInput']
|
const ElInput: typeof import('element-plus/es')['ElInput']
|
||||||
const ElInputOtp: typeof import('element-plus/es')['ElInputOtp']
|
const ElInputOtp: typeof import('element-plus/es')['ElInputOtp']
|
||||||
const ElPopover: typeof import('element-plus/es')['ElPopover']
|
const ElPopover: typeof import('element-plus/es')['ElPopover']
|
||||||
|
const ElTooltip: typeof import('element-plus/es')['ElTooltip']
|
||||||
|
const GameList: typeof import('./src/components/baseLayouts/GameList.vue')['default']
|
||||||
const RouterLink: typeof import('vue-router')['RouterLink']
|
const RouterLink: typeof import('vue-router')['RouterLink']
|
||||||
const RouterView: typeof import('vue-router')['RouterView']
|
const RouterView: typeof import('vue-router')['RouterView']
|
||||||
const UserBar: typeof import('./src/components/User/UserBar.vue')['default']
|
const UserBar: typeof import('./src/components/baseLayouts/UserBar.vue')['default']
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,52 @@
|
|||||||
*::before,
|
*::before,
|
||||||
*::after {
|
*::after {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
|
||||||
|
sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #333;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul,
|
||||||
|
ol {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
cursor: pointer;
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
font: inherit;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
font: inherit;
|
||||||
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|||||||
199
src/components/baseLayouts/GameList.vue
Normal file
199
src/components/baseLayouts/GameList.vue
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
<template>
|
||||||
|
<div class="game-list">
|
||||||
|
<!-- 左侧游戏图标列表 -->
|
||||||
|
<div class="game-list__icons">
|
||||||
|
<el-tooltip
|
||||||
|
v-for="game in games"
|
||||||
|
:key="game.id"
|
||||||
|
:content="game.name"
|
||||||
|
placement="right"
|
||||||
|
:show-after="300"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="game-list__icon-item"
|
||||||
|
:class="{ 'game-list__icon-item--active': activeGameId === game.id }"
|
||||||
|
@click="selectGame(game.id)"
|
||||||
|
>
|
||||||
|
<span class="game-list__icon-emoji">{{ game.icon }}</span>
|
||||||
|
</div>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 右侧游戏详情 -->
|
||||||
|
<div class="game-list__detail">
|
||||||
|
<template v-if="activeGame">
|
||||||
|
<h3 class="game-list__detail-title">{{ activeGame.name }}</h3>
|
||||||
|
<p class="game-list__detail-desc">{{ activeGame.description }}</p>
|
||||||
|
<div class="game-list__detail-gameplay">
|
||||||
|
<h4>玩法介绍</h4>
|
||||||
|
<p>{{ activeGame.gameplay }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div v-else class="game-list__detail-empty">
|
||||||
|
<p>请选择一个游戏</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, computed } from 'vue'
|
||||||
|
|
||||||
|
/** 游戏数据接口 */
|
||||||
|
interface GameInfo {
|
||||||
|
id: string
|
||||||
|
/** 图标(emoji 或文字占位) */
|
||||||
|
icon: string
|
||||||
|
name: string
|
||||||
|
description: string
|
||||||
|
gameplay: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 游戏列表数据 */
|
||||||
|
const games: GameInfo[] = [
|
||||||
|
{
|
||||||
|
id: 'basketball',
|
||||||
|
icon: '🏀',
|
||||||
|
name: '篮球对决',
|
||||||
|
description: '实时篮球对战游戏,与全球玩家同场竞技',
|
||||||
|
gameplay: '使用方向键移动球员,空格键投篮。每场比赛5分钟,得分多者获胜。支持1v1、3v3模式。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'football',
|
||||||
|
icon: '⚽',
|
||||||
|
name: '足球竞技',
|
||||||
|
description: '热血足球比赛,组建你的梦之队',
|
||||||
|
gameplay: 'WASD控制球员移动,J键传球,K键射门。11人制比赛,配合战术赢得胜利。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'racing',
|
||||||
|
icon: '🏎️',
|
||||||
|
name: '极速赛车',
|
||||||
|
description: '极限竞速,漂移过弯超越对手',
|
||||||
|
gameplay: '方向键控制方向,Shift键加速漂移。多种赛道可选,挑战最快圈速记录。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'chess',
|
||||||
|
icon: '♟️',
|
||||||
|
name: '策略棋牌',
|
||||||
|
description: '经典棋牌合集,运筹帷幄决胜千里',
|
||||||
|
gameplay: '包含围棋、象棋、五子棋等多种棋类。支持人机对战和在线匹配两种模式。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'shooting',
|
||||||
|
icon: '🎯',
|
||||||
|
name: '射击战场',
|
||||||
|
description: '团队战术射击,配合队友夺取胜利',
|
||||||
|
gameplay: '鼠标瞄准,左键射击,R键换弹。多种武器和地图,5v5团队竞技模式。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'arena',
|
||||||
|
icon: '🏆',
|
||||||
|
name: '竞技场',
|
||||||
|
description: '综合竞技平台,参与锦标赛赢取奖励',
|
||||||
|
gameplay: '每日举办多场锦标赛,涵盖各类型游戏。积累积分提升段位,赢取丰厚奖励。'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
/** 当前选中的游戏 ID */
|
||||||
|
const activeGameId = ref<string>('basketball')
|
||||||
|
|
||||||
|
/** 当前选中的游戏对象 */
|
||||||
|
const activeGame = computed(() => games.find((g) => g.id === activeGameId.value) ?? null)
|
||||||
|
|
||||||
|
/** 选择游戏 */
|
||||||
|
function selectGame(id: string) {
|
||||||
|
activeGameId.value = id
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.game-list {
|
||||||
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===== 左侧图标列表 ===== */
|
||||||
|
.game-list__icons {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
width: 60px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
padding: 8px 4px;
|
||||||
|
overflow-y: auto;
|
||||||
|
border-right: 1px solid rgba(255, 255, 255, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__icon-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(255, 255, 255, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--active {
|
||||||
|
background-color: rgba(255, 255, 255, 0.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__icon-emoji {
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 1;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===== 右侧详情面板 ===== */
|
||||||
|
.game-list__detail {
|
||||||
|
flex: 1;
|
||||||
|
padding: 16px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__detail-title {
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__detail-desc {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__detail-gameplay {
|
||||||
|
h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.7;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-list__detail-empty {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -8,7 +8,9 @@
|
|||||||
<!-- 侧边栏 -->
|
<!-- 侧边栏 -->
|
||||||
<div class="base-layout__sidebar">
|
<div class="base-layout__sidebar">
|
||||||
<!-- 侧边栏内容 -->
|
<!-- 侧边栏内容 -->
|
||||||
<div class="base-layout__sidebar-content"></div>
|
<div class="base-layout__sidebar-content">
|
||||||
|
<GameList />
|
||||||
|
</div>
|
||||||
<!-- 侧边栏底部固定区域 -->
|
<!-- 侧边栏底部固定区域 -->
|
||||||
<div class="base-layout__sidebar-bottom">
|
<div class="base-layout__sidebar-bottom">
|
||||||
<div class="base-layout__sidebar-bottom-inner">
|
<div class="base-layout__sidebar-bottom-inner">
|
||||||
@@ -26,7 +28,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import UserBar from '@/components/User/UserBar.vue'
|
import UserBar from '@/components/baseLayouts/UserBar.vue'
|
||||||
|
import GameList from '@/components/baseLayouts/GameList.vue'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
<template>
|
|
||||||
<main>
|
|
||||||
<div>你好呀</div>
|
|
||||||
</main>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts"></script>
|
|
||||||
Reference in New Issue
Block a user