|
|
|
|
@ -1,232 +1,36 @@
|
|
|
|
|
<script setup>
|
|
|
|
|
import { ref, onMounted, computed, watch } from 'vue'
|
|
|
|
|
import { useRouter } from 'vue-router'
|
|
|
|
|
import request from '@/utils/request'
|
|
|
|
|
|
|
|
|
|
const router = useRouter()
|
|
|
|
|
|
|
|
|
|
// 模拟玩家数据 - 生成更多数据用于测试分页
|
|
|
|
|
const allPlayers = ref([
|
|
|
|
|
{
|
|
|
|
|
id: '1111122222',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 12,
|
|
|
|
|
coins: 2000,
|
|
|
|
|
registerTime: '2024-01-01 10:00:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player1',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122223',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 15,
|
|
|
|
|
coins: 3500,
|
|
|
|
|
registerTime: '2024-01-02 14:30:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player2',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122224',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 8,
|
|
|
|
|
coins: 1200,
|
|
|
|
|
registerTime: '2024-01-03 09:15:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player3',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122225',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 20,
|
|
|
|
|
coins: 5000,
|
|
|
|
|
registerTime: '2024-01-04 16:45:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player4',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122226',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 5,
|
|
|
|
|
coins: 800,
|
|
|
|
|
registerTime: '2024-01-05 11:20:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player5',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122227',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 18,
|
|
|
|
|
coins: 4200,
|
|
|
|
|
registerTime: '2024-01-06 08:30:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player6',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122228',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 10,
|
|
|
|
|
coins: 1500,
|
|
|
|
|
registerTime: '2024-01-07 13:45:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player7',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122229',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 25,
|
|
|
|
|
coins: 6800,
|
|
|
|
|
registerTime: '2024-01-08 16:20:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player8',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122230',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 7,
|
|
|
|
|
coins: 950,
|
|
|
|
|
registerTime: '2024-01-09 10:10:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player9',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122231',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 14,
|
|
|
|
|
coins: 2800,
|
|
|
|
|
registerTime: '2024-01-10 14:00:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player10',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122232',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 22,
|
|
|
|
|
coins: 5500,
|
|
|
|
|
registerTime: '2024-01-11 09:30:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player11',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122233',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 9,
|
|
|
|
|
coins: 1100,
|
|
|
|
|
registerTime: '2024-01-12 15:45:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player12',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122234',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 16,
|
|
|
|
|
coins: 3800,
|
|
|
|
|
registerTime: '2024-01-13 11:20:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player13',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122235',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 11,
|
|
|
|
|
coins: 2100,
|
|
|
|
|
registerTime: '2024-01-14 12:30:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player14',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122236',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 19,
|
|
|
|
|
coins: 4600,
|
|
|
|
|
registerTime: '2024-01-15 14:15:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player15',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122237',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 6,
|
|
|
|
|
coins: 750,
|
|
|
|
|
registerTime: '2024-01-16 09:45:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player16',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122238',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 23,
|
|
|
|
|
coins: 6200,
|
|
|
|
|
registerTime: '2024-01-17 16:00:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player17',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122239',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 13,
|
|
|
|
|
coins: 2400,
|
|
|
|
|
registerTime: '2024-01-18 10:20:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player18',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122240',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 17,
|
|
|
|
|
coins: 4100,
|
|
|
|
|
registerTime: '2024-01-19 13:50:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player19',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122241',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 4,
|
|
|
|
|
coins: 600,
|
|
|
|
|
registerTime: '2024-01-20 08:00:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player20',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122242',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 21,
|
|
|
|
|
coins: 5800,
|
|
|
|
|
registerTime: '2024-01-21 15:30:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player21',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122243',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 9,
|
|
|
|
|
coins: 1300,
|
|
|
|
|
registerTime: '2024-01-22 11:10:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player22',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122244',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 24,
|
|
|
|
|
coins: 7200,
|
|
|
|
|
registerTime: '2024-01-23 17:25:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player23',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122245',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 10,
|
|
|
|
|
coins: 1700,
|
|
|
|
|
registerTime: '2024-01-24 09:15:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player24',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122246',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 18,
|
|
|
|
|
coins: 4400,
|
|
|
|
|
registerTime: '2024-01-25 14:40:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player25',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122247',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 7,
|
|
|
|
|
coins: 900,
|
|
|
|
|
registerTime: '2024-01-26 10:55:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player26',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: '1111122248',
|
|
|
|
|
name: '玩家名',
|
|
|
|
|
level: 26,
|
|
|
|
|
coins: 8000,
|
|
|
|
|
registerTime: '2024-01-27 18:20:00',
|
|
|
|
|
avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=Player27',
|
|
|
|
|
},
|
|
|
|
|
])
|
|
|
|
|
const getPlayerList = (params) => {
|
|
|
|
|
return request({
|
|
|
|
|
url: '/player/list',
|
|
|
|
|
method: 'get',
|
|
|
|
|
params,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const fetchPlayers = async () => {
|
|
|
|
|
const res = await getPlayerList({
|
|
|
|
|
page: currentPage.value,
|
|
|
|
|
size: pageSize.value,
|
|
|
|
|
keyword: searchQuery.value || '',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
|
|
allPlayers.value = res.data.list
|
|
|
|
|
totalPlayers.value = res.data.total
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const allPlayers = ref([])
|
|
|
|
|
const searchQuery = ref('')
|
|
|
|
|
const currentPage = ref(1)
|
|
|
|
|
const pageSize = 10
|
|
|
|
|
const pageSize = ref(20)
|
|
|
|
|
const totalPlayers = ref(0)
|
|
|
|
|
|
|
|
|
|
// 计算属性:过滤玩家列表
|
|
|
|
|
const filteredPlayers = computed(() => {
|
|
|
|
|
@ -235,9 +39,8 @@ const filteredPlayers = computed(() => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const query = searchQuery.value.toLowerCase()
|
|
|
|
|
return allPlayers.value.filter(player =>
|
|
|
|
|
player.name.toLowerCase().includes(query) ||
|
|
|
|
|
player.id.toString().includes(query)
|
|
|
|
|
return allPlayers.value.filter(
|
|
|
|
|
(player) => player.name.toLowerCase().includes(query) || player.id.toString().includes(query)
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@ -250,7 +53,7 @@ const paginatedPlayers = computed(() => {
|
|
|
|
|
|
|
|
|
|
// 计算总页数
|
|
|
|
|
const totalPages = computed(() => {
|
|
|
|
|
return Math.ceil(filteredPlayers.value.length / pageSize)
|
|
|
|
|
return Math.ceil(totalPlayers.value / pageSize.value)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 查看玩家详情
|
|
|
|
|
@ -260,13 +63,15 @@ const viewPlayerDetail = (player) => {
|
|
|
|
|
|
|
|
|
|
// 搜索处理
|
|
|
|
|
const handleSearch = () => {
|
|
|
|
|
currentPage.value = 1 // 搜索时重置到第一页
|
|
|
|
|
currentPage.value = 1
|
|
|
|
|
fetchPlayers()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 分页处理
|
|
|
|
|
const goToPage = (page) => {
|
|
|
|
|
if (page >= 1 && page <= totalPages.value) {
|
|
|
|
|
currentPage.value = page
|
|
|
|
|
fetchPlayers()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -324,7 +129,7 @@ watch([filteredPlayers, totalPages], () => {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
// 初始化
|
|
|
|
|
fetchPlayers()
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
@ -340,29 +145,41 @@ onMounted(() => {
|
|
|
|
|
@input="handleSearch"
|
|
|
|
|
/>
|
|
|
|
|
<button class="search-btn" @click="handleSearch">
|
|
|
|
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
|
|
|
<path d="M7.33333 12.6667C10.2789 12.6667 12.6667 10.2789 12.6667 7.33333C12.6667 4.38781 10.2789 2 7.33333 2C4.38781 2 2 4.38781 2 7.33333C2 10.2789 4.38781 12.6667 7.33333 12.6667Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
|
|
|
<path d="M14 14L11.1 11.1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
|
|
|
<svg
|
|
|
|
|
width="16"
|
|
|
|
|
height="16"
|
|
|
|
|
viewBox="0 0 16 16"
|
|
|
|
|
fill="none"
|
|
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
|
|
>
|
|
|
|
|
<path
|
|
|
|
|
d="M7.33333 12.6667C10.2789 12.6667 12.6667 10.2789 12.6667 7.33333C12.6667 4.38781 10.2789 2 7.33333 2C4.38781 2 2 4.38781 2 7.33333C2 10.2789 4.38781 12.6667 7.33333 12.6667Z"
|
|
|
|
|
stroke="currentColor"
|
|
|
|
|
stroke-width="1.5"
|
|
|
|
|
stroke-linecap="round"
|
|
|
|
|
stroke-linejoin="round"
|
|
|
|
|
/>
|
|
|
|
|
<path
|
|
|
|
|
d="M14 14L11.1 11.1"
|
|
|
|
|
stroke="currentColor"
|
|
|
|
|
stroke-width="1.5"
|
|
|
|
|
stroke-linecap="round"
|
|
|
|
|
stroke-linejoin="round"
|
|
|
|
|
/>
|
|
|
|
|
</svg>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 玩家列表 -->
|
|
|
|
|
<div class="players-container">
|
|
|
|
|
<div
|
|
|
|
|
v-for="player in paginatedPlayers"
|
|
|
|
|
:key="player.id"
|
|
|
|
|
class="player-row"
|
|
|
|
|
>
|
|
|
|
|
<img :src="player.avatar" alt="Avatar" class="player-avatar" />
|
|
|
|
|
<div v-for="player in allPlayers" :key="player.id" class="player-row">
|
|
|
|
|
<img :src="player.avatarUrl" alt="Avatar" class="player-avatar" />
|
|
|
|
|
<div class="player-info">
|
|
|
|
|
<span class="player-name">玩家名 (Id: {{ player.id }})</span>
|
|
|
|
|
<span class="player-level">等级: {{ player.level }}</span>
|
|
|
|
|
<span class="player-coins">金币数量: {{ player.coins }}</span>
|
|
|
|
|
<span class="player-name">玩家名 (Id: {{ player.name }})</span>
|
|
|
|
|
<span class="player-level">等级: {{ player.vipLevel }}</span>
|
|
|
|
|
<span class="player-coins">金币数量: {{ player.gold }}</span>
|
|
|
|
|
</div>
|
|
|
|
|
<button class="detail-btn" @click="viewPlayerDetail(player)">
|
|
|
|
|
详情分析
|
|
|
|
|
</button>
|
|
|
|
|
<button class="detail-btn" @click="viewPlayerDetail(player)">详情分析</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
@ -374,11 +191,7 @@ onMounted(() => {
|
|
|
|
|
<!-- 分页控件 -->
|
|
|
|
|
<div v-if="totalPages > 1" class="pagination-wrapper">
|
|
|
|
|
<div class="pagination">
|
|
|
|
|
<button
|
|
|
|
|
class="page-btn"
|
|
|
|
|
:disabled="currentPage === 1"
|
|
|
|
|
@click="goToPage(currentPage - 1)"
|
|
|
|
|
>
|
|
|
|
|
<button class="page-btn" :disabled="currentPage === 1" @click="goToPage(currentPage - 1)">
|
|
|
|
|
← Previous
|
|
|
|
|
</button>
|
|
|
|
|
<div class="page-numbers">
|
|
|
|
|
@ -668,9 +481,9 @@ onMounted(() => {
|
|
|
|
|
.player-list-page {
|
|
|
|
|
padding: 2px 16px 12px 16px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.search-section {
|
|
|
|
|
margin: 0 0 8px 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
</style>
|
|
|
|
|
|