更新北京时间
This commit is contained in:
@@ -70,9 +70,12 @@
|
|||||||
|
|
||||||
<!-- 翻译开关 -->
|
<!-- 翻译开关 -->
|
||||||
<div class="flex items-center gap-3">
|
<div class="flex items-center gap-3">
|
||||||
<label class="flex items-center gap-2 cursor-pointer">
|
<label class="flex items-center gap-2 cursor-pointer"
|
||||||
<input type="checkbox" v-model="needTranslate" class="w-4 h-4" />
|
:class="{ 'opacity-50': inputMode === 'individual' }">
|
||||||
<span class="text-sm text-gray-700">启用翻译</span>
|
<input type="checkbox" v-model="needTranslate" class="w-4 h-4"
|
||||||
|
:disabled="inputMode === 'individual'" />
|
||||||
|
<span class="text-sm text-gray-700">{{ inputMode === 'individual' ? '单个编辑模式下翻译不可用' : '启用翻译'
|
||||||
|
}}</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -212,9 +215,20 @@ const emit = defineEmits(['close', 'confirm'])
|
|||||||
const STORAGE_KEY = 'greeting_dialog_data'
|
const STORAGE_KEY = 'greeting_dialog_data'
|
||||||
const REGION_LIST = getRegions()
|
const REGION_LIST = getRegions()
|
||||||
|
|
||||||
|
// 为不同模式分别存储内容
|
||||||
const sentences = ref([''])
|
const sentences = ref([''])
|
||||||
const bulkText = ref('')
|
const bulkText = ref('')
|
||||||
const inputMode = ref('bulk') // 'bulk' 或 'individual'
|
const inputMode = ref('bulk') // 'bulk' 或 'individual'
|
||||||
|
// 为两个模式分别存储内容
|
||||||
|
const modeData = ref({
|
||||||
|
bulk: {
|
||||||
|
sentences: [''],
|
||||||
|
bulkText: ''
|
||||||
|
},
|
||||||
|
individual: {
|
||||||
|
sentences: ['']
|
||||||
|
}
|
||||||
|
})
|
||||||
const selectedRegions = ref([])
|
const selectedRegions = ref([])
|
||||||
const translations = ref({})
|
const translations = ref({})
|
||||||
const activeTab = ref('')
|
const activeTab = ref('')
|
||||||
@@ -286,18 +300,48 @@ watch(selectedLanguages, (newLangs) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 当模式切换时,保存当前模式的内容并加载新模式的内容
|
||||||
|
watch(inputMode, (newMode, oldMode) => {
|
||||||
|
// 保存旧模式的内容
|
||||||
|
if (oldMode) {
|
||||||
|
if (oldMode === 'bulk') {
|
||||||
|
modeData.value.bulk.sentences = [...sentences.value]
|
||||||
|
modeData.value.bulk.bulkText = bulkText.value
|
||||||
|
} else if (oldMode === 'individual') {
|
||||||
|
modeData.value.individual.sentences = [...sentences.value]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载新模式的内容
|
||||||
|
if (newMode === 'bulk') {
|
||||||
|
sentences.value = [...modeData.value.bulk.sentences]
|
||||||
|
bulkText.value = modeData.value.bulk.bulkText
|
||||||
|
} else if (newMode === 'individual') {
|
||||||
|
sentences.value = [...modeData.value.individual.sentences]
|
||||||
|
needTranslate.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
function loadFromStorage() {
|
function loadFromStorage() {
|
||||||
const saved = localStorage.getItem(STORAGE_KEY)
|
const saved = localStorage.getItem(STORAGE_KEY)
|
||||||
if (saved) {
|
if (saved) {
|
||||||
try {
|
try {
|
||||||
const data = JSON.parse(saved)
|
const data = JSON.parse(saved)
|
||||||
if (data.sentences?.length) sentences.value = data.sentences
|
if (data.modeData) modeData.value = data.modeData
|
||||||
if (data.selectedRegions?.length) selectedRegions.value = data.selectedRegions
|
if (data.selectedRegions?.length) selectedRegions.value = data.selectedRegions
|
||||||
if (data.translations) translations.value = data.translations
|
if (data.translations) translations.value = data.translations
|
||||||
if (typeof data.needTranslate === 'boolean') needTranslate.value = data.needTranslate
|
if (typeof data.needTranslate === 'boolean') needTranslate.value = data.needTranslate
|
||||||
if (data.activeTab) activeTab.value = data.activeTab
|
if (data.activeTab) activeTab.value = data.activeTab
|
||||||
if (data.inputMode) inputMode.value = data.inputMode
|
if (data.inputMode) inputMode.value = data.inputMode
|
||||||
|
|
||||||
|
// 加载当前模式的内容
|
||||||
|
if (inputMode.value === 'bulk') {
|
||||||
|
sentences.value = [...modeData.value.bulk.sentences]
|
||||||
|
bulkText.value = modeData.value.bulk.bulkText
|
||||||
|
} else if (inputMode.value === 'individual') {
|
||||||
|
sentences.value = [...modeData.value.individual.sentences]
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('加载本地数据失败:', e)
|
console.error('加载本地数据失败:', e)
|
||||||
}
|
}
|
||||||
@@ -305,8 +349,16 @@ function loadFromStorage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function saveToStorage() {
|
function saveToStorage() {
|
||||||
|
// 保存当前模式的内容到 modeData
|
||||||
|
if (inputMode.value === 'bulk') {
|
||||||
|
modeData.value.bulk.sentences = [...sentences.value]
|
||||||
|
modeData.value.bulk.bulkText = bulkText.value
|
||||||
|
} else if (inputMode.value === 'individual') {
|
||||||
|
modeData.value.individual.sentences = [...sentences.value]
|
||||||
|
}
|
||||||
|
|
||||||
localStorage.setItem(STORAGE_KEY, JSON.stringify({
|
localStorage.setItem(STORAGE_KEY, JSON.stringify({
|
||||||
sentences: sentences.value,
|
modeData: modeData.value,
|
||||||
selectedRegions: selectedRegions.value,
|
selectedRegions: selectedRegions.value,
|
||||||
translations: translations.value,
|
translations: translations.value,
|
||||||
needTranslate: needTranslate.value,
|
needTranslate: needTranslate.value,
|
||||||
|
|||||||
@@ -11,3 +11,19 @@ export function TimestamptolocalTime(date) {
|
|||||||
|
|
||||||
return `${year}/${month}/${day} ${hours}:${minutes}`
|
return `${year}/${month}/${day} ${hours}:${minutes}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 时间戳转换为北京时间,格式为 YYYY/MM/DD hh:mm
|
||||||
|
export function TimestampttoBeijingTime(date) {
|
||||||
|
if (!date || isNaN(date)) return ''
|
||||||
|
|
||||||
|
const d = new Date(date)
|
||||||
|
// 北京时间是 UTC+8
|
||||||
|
const beijingTime = new Date(d.getTime() + 8 * 60 * 60 * 1000)
|
||||||
|
const year = beijingTime.getUTCFullYear()
|
||||||
|
const month = String(beijingTime.getUTCMonth() + 1).padStart(2, '0')
|
||||||
|
const day = String(beijingTime.getUTCDate()).padStart(2, '0')
|
||||||
|
const hours = String(beijingTime.getUTCHours()).padStart(2, '0')
|
||||||
|
const minutes = String(beijingTime.getUTCMinutes()).padStart(2, '0')
|
||||||
|
|
||||||
|
return `${year}/${month}/${day} ${hours}:${minutes}`
|
||||||
|
}
|
||||||
|
|||||||
@@ -14,21 +14,9 @@
|
|||||||
|
|
||||||
<!-- 国家和性别选择 -->
|
<!-- 国家和性别选择 -->
|
||||||
<div class="select-box">
|
<div class="select-box">
|
||||||
<el-select-v2
|
<el-select-v2 v-model="countryValue" :options="countryOptions" placeholder="国家" filterable clearable
|
||||||
v-model="countryValue"
|
class="filter-select" />
|
||||||
:options="countryOptions"
|
<el-select-v2 v-model="genderValue" :options="genderOptions" placeholder="性别" clearable class="filter-select" />
|
||||||
placeholder="国家"
|
|
||||||
filterable
|
|
||||||
clearable
|
|
||||||
class="filter-select"
|
|
||||||
/>
|
|
||||||
<el-select-v2
|
|
||||||
v-model="genderValue"
|
|
||||||
:options="genderOptions"
|
|
||||||
placeholder="性别"
|
|
||||||
clearable
|
|
||||||
class="filter-select"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 金币数量 -->
|
<!-- 金币数量 -->
|
||||||
@@ -46,15 +34,8 @@
|
|||||||
<!-- 时间选择 (仅PK大厅模式) -->
|
<!-- 时间选择 (仅PK大厅模式) -->
|
||||||
<div class="time-box" :class="{ 'is-hidden': !isHallMode }">
|
<div class="time-box" :class="{ 'is-hidden': !isHallMode }">
|
||||||
|
|
||||||
<el-date-picker
|
<el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" start-placeholder="最小PK时间"
|
||||||
v-model="timeRange"
|
end-placeholder="最大PK时间" format="YYYY/MM/DD HH:mm" value-format="x" />
|
||||||
type="datetimerange"
|
|
||||||
range-separator="至"
|
|
||||||
start-placeholder="最小PK时间"
|
|
||||||
end-placeholder="最大PK时间"
|
|
||||||
format="YYYY/MM/DD HH:mm"
|
|
||||||
value-format="x"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 搜索和重置按钮 -->
|
<!-- 搜索和重置按钮 -->
|
||||||
@@ -74,19 +55,10 @@
|
|||||||
<div class="content-area">
|
<div class="content-area">
|
||||||
<!-- 列表面板 -->
|
<!-- 列表面板 -->
|
||||||
<div class="list-panel">
|
<div class="list-panel">
|
||||||
<div
|
<div v-infinite-scroll="loadMore" :infinite-scroll-distance="100" :infinite-scroll-disabled="loading || noMore"
|
||||||
v-infinite-scroll="loadMore"
|
class="pk-list">
|
||||||
:infinite-scroll-distance="100"
|
<div v-for="(item, index) in pkList" :key="index" class="pk-card" :class="{ selected: selectedItem === item }"
|
||||||
:infinite-scroll-disabled="loading || noMore"
|
@click="handleItemClick(item)">
|
||||||
class="pk-list"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-for="(item, index) in pkList"
|
|
||||||
:key="index"
|
|
||||||
class="pk-card"
|
|
||||||
:class="{ selected: selectedItem === item }"
|
|
||||||
@click="handleItemClick(item)"
|
|
||||||
>
|
|
||||||
<!-- 头像 -->
|
<!-- 头像 -->
|
||||||
<div class="pk-avatar">
|
<div class="pk-avatar">
|
||||||
<img :src="item.anchorIcon" alt="" />
|
<img :src="item.anchorIcon" alt="" />
|
||||||
@@ -101,12 +73,14 @@
|
|||||||
<span class="pk-country">{{ item.country }}</span>
|
<span class="pk-country">{{ item.country }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- 时间 -->
|
<!-- 时间 -->
|
||||||
<div class="pk-time">PK时间(本地时间): {{ formatTime(item.pkTime * 1000) }}</div>
|
<div class="pk-time">PK时间(本地时间): {{ formatTime(item.pkTime * 1000) }} · 北京时间: {{
|
||||||
|
TimestampttoBeijingTime(item.pkTime * 1000) }}</div>
|
||||||
<!-- PK信息 -->
|
<!-- PK信息 -->
|
||||||
<div class="pk-stats">
|
<div class="pk-stats">
|
||||||
<img class="stat-icon" src="https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/gold.png" alt="" />
|
<img class="stat-icon" src="https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/gold.png" alt="" />
|
||||||
<span>金币: {{ item.coin }}K</span>
|
<span>金币: {{ item.coin }}K</span>
|
||||||
<img class="stat-icon session-icon" src="https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/session.png" alt="" />
|
<img class="stat-icon session-icon"
|
||||||
|
src="https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/session.png" alt="" />
|
||||||
<span>场次: {{ item.pkNumber }}场</span>
|
<span>场次: {{ item.pkNumber }}场</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- 备注 -->
|
<!-- 备注 -->
|
||||||
@@ -125,13 +99,10 @@
|
|||||||
<span class="chat-header-label">聊天</span>
|
<span class="chat-header-label">聊天</span>
|
||||||
<span v-if="chatUserInfo.nickName" class="chat-header-name">· {{ chatUserInfo.nickName }}</span>
|
<span v-if="chatUserInfo.nickName" class="chat-header-name">· {{ chatUserInfo.nickName }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-messages" ref="chatMessagesRef" :style="{ visibility: isScrollReady ? 'visible' : 'hidden' }">
|
<div class="chat-messages" ref="chatMessagesRef"
|
||||||
<div
|
:style="{ visibility: isScrollReady ? 'visible' : 'hidden' }">
|
||||||
v-for="(msg, index) in messagesList"
|
<div v-for="(msg, index) in messagesList" :key="index" class="message-item"
|
||||||
:key="index"
|
:class="{ mine: msg.senderId == currentUser.id, 'pk-message': msg.type === 'pk' }">
|
||||||
class="message-item"
|
|
||||||
:class="{ mine: msg.senderId == currentUser.id, 'pk-message': msg.type === 'pk' }"
|
|
||||||
>
|
|
||||||
<div class="message-triangle" v-if="msg.type === 'text'"></div>
|
<div class="message-triangle" v-if="msg.type === 'text'"></div>
|
||||||
<div class="message-content">
|
<div class="message-content">
|
||||||
<div v-if="msg.type === 'text'" class="text-message">{{ msg.payload.text }}</div>
|
<div v-if="msg.type === 'text'" class="text-message">{{ msg.payload.text }}</div>
|
||||||
@@ -155,11 +126,7 @@
|
|||||||
<div class="send-btn" @click="sendMessage">发送</div>
|
<div class="send-btn" @click="sendMessage">发送</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-box">
|
<div class="input-box">
|
||||||
<textarea
|
<textarea v-model="inputText" placeholder="输入消息..." @keydown.enter.prevent="sendMessage"></textarea>
|
||||||
v-model="inputText"
|
|
||||||
placeholder="输入消息..."
|
|
||||||
@keydown.enter.prevent="sendMessage"
|
|
||||||
></textarea>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -170,13 +137,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 隐藏的文件输入 -->
|
<!-- 隐藏的文件输入 -->
|
||||||
<input
|
<input ref="fileInputRef" type="file" accept="image/*" style="display: none" @change="handleFileSelect" />
|
||||||
ref="fileInputRef"
|
|
||||||
type="file"
|
|
||||||
accept="image/*"
|
|
||||||
style="display: none"
|
|
||||||
@change="handleFileSelect"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- PK邀请弹窗 -->
|
<!-- PK邀请弹窗 -->
|
||||||
<el-dialog v-model="inviteDialogVisible" title="选择主播发起PK邀请" width="500" align-center>
|
<el-dialog v-model="inviteDialogVisible" title="选择主播发起PK邀请" width="500" align-center>
|
||||||
@@ -185,13 +146,8 @@
|
|||||||
暂无可用主播,请先在"我的"页面添加主播
|
暂无可用主播,请先在"我的"页面添加主播
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="anchor-list">
|
<div v-else class="anchor-list">
|
||||||
<div
|
<div v-for="anchor in myAnchorList" :key="anchor.id" class="anchor-item"
|
||||||
v-for="anchor in myAnchorList"
|
:class="{ selected: selectedAnchor?.id === anchor.id }" @click="selectedAnchor = anchor">
|
||||||
:key="anchor.id"
|
|
||||||
class="anchor-item"
|
|
||||||
:class="{ selected: selectedAnchor?.id === anchor.id }"
|
|
||||||
@click="selectedAnchor = anchor"
|
|
||||||
>
|
|
||||||
<img class="anchor-avatar" :src="anchor.anchorIcon" alt="" />
|
<img class="anchor-avatar" :src="anchor.anchorIcon" alt="" />
|
||||||
<div class="anchor-info">
|
<div class="anchor-info">
|
||||||
<div class="anchor-name">{{ anchor.anchorId }}</div>
|
<div class="anchor-name">{{ anchor.anchorId }}</div>
|
||||||
@@ -201,7 +157,8 @@
|
|||||||
</span>
|
</span>
|
||||||
<span class="anchor-coin">{{ anchor.coin }}K</span>
|
<span class="anchor-coin">{{ anchor.coin }}K</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="anchor-time">PK时间: {{ formatTime(anchor.pkTime * 1000) }}</div>
|
<div class="anchor-time">PK时间(本地时间): {{ formatTime(anchor.pkTime * 1000) }} · 北京时间: {{
|
||||||
|
TimestampttoBeijingTime(anchor.pkTime * 1000) }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -222,7 +179,7 @@
|
|||||||
import { ref, onMounted, onUnmounted, onActivated, nextTick } from 'vue'
|
import { ref, onMounted, onUnmounted, onActivated, nextTick } from 'vue'
|
||||||
import { getPkList, getUserInfo, getAnchorListById, createPkRecord } from '@/api/pk-mini'
|
import { getPkList, getUserInfo, getAnchorListById, createPkRecord } from '@/api/pk-mini'
|
||||||
import { getCountryNamesArray } from '@/utils/pk-mini/countryUtil'
|
import { getCountryNamesArray } from '@/utils/pk-mini/countryUtil'
|
||||||
import { TimestamptolocalTime } from '@/utils/pk-mini/timeConversion'
|
import { TimestamptolocalTime, TimestampttoBeijingTime } from '@/utils/pk-mini/timeConversion'
|
||||||
import { getMainUserData } from '@/utils/pk-mini/storage'
|
import { getMainUserData } from '@/utils/pk-mini/storage'
|
||||||
import { isGoEasyEnabled } from '@/config/pk-mini'
|
import { isGoEasyEnabled } from '@/config/pk-mini'
|
||||||
import {
|
import {
|
||||||
@@ -741,7 +698,8 @@ onUnmounted(() => {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-btn, .reset-btn {
|
.search-btn,
|
||||||
|
.reset-btn {
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
@@ -765,7 +723,8 @@ onUnmounted(() => {
|
|||||||
color: #2563eb; // blue-600
|
color: #2563eb; // blue-600
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-btn:hover, .reset-btn:hover {
|
.search-btn:hover,
|
||||||
|
.reset-btn:hover {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user