Files
shoot-miniprograms/src/components/PlayerScore.vue
2025-07-28 15:05:19 +08:00

109 lines
2.2 KiB
Vue

<script setup>
defineProps({
avatar: {
type: String,
default: "",
},
name: {
type: String,
default: "",
},
scores: {
type: Array,
default: () => [],
},
});
const rowCount = new Array(6).fill(0);
</script>
<template>
<view class="container">
<image
:style="{ opacity: scores.length === 12 ? 1 : 0 }"
src="../static/checked-green.png"
mode="widthFix"
/>
<image :src="avatar || '../static/user-icon.png'" mode="widthFix" />
<text>{{ name }}</text>
<view>
<view>
<view v-for="(_, index) in rowCount" :key="index">
<text>{{ scores[index] ? `${scores[index].ring}` : "-" }}</text>
</view>
</view>
<view>
<view v-for="(_, index) in rowCount" :key="index">
<text>{{
scores[index + 6] ? `${scores[index + 6].ring}` : "-"
}}</text>
</view>
</view>
</view>
<text
>{{
scores.map((s) => s.ring).reduce((last, next) => last + next, 0)
}}</text
>
</view>
</template>
<style scoped>
.container {
width: calc(100% - 70px);
display: flex;
align-items: center;
border: 1px solid #fff3;
margin: 10px 0;
margin-left: 35px;
border-radius: 15px;
padding: 10px;
color: #fff9;
font-size: 14px;
position: relative;
}
.container > image:nth-child(1) {
position: absolute;
width: 15px;
height: 15px;
top: 30%;
left: 0;
}
.container > image:nth-child(2) {
width: 30px;
height: 30px;
min-height: 30px;
border: 1px solid #fff;
border-radius: 50%;
margin-right: 10px;
margin-left: -30px;
flex: 0 0 auto;
}
.container > text:nth-child(3) {
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 20%;
}
.container > view:nth-child(4) {
display: flex;
flex-direction: column;
}
.container > view:nth-child(4) > view {
display: flex;
padding: 5px 0;
}
.container > view:nth-child(4) > view text {
width: 34px;
text-align: center;
display: block;
}
.container > view:nth-child(4) > view:first-child {
border-bottom: 1px solid #fff3;
}
.container > text:nth-child(5) {
width: 40px;
text-align: right;
}
</style>