优化代码

This commit is contained in:
pengxiaolong
2025-08-29 13:31:08 +08:00
parent d294f62469
commit aa74346232
24 changed files with 1002 additions and 518 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -184,7 +184,7 @@
<!-- 头像设置 -->
<div class="avatar-setting">
<el-upload class="avatar-uploader"
action="http://192.168.1.174:8086/file/uploadHeadIcon"
action="https://pk.zhukeping.com/file/uploadHeadIcon"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
@@ -296,11 +296,21 @@
</div>
</el-dialog>
<el-dialog v-model="notActivated" center :title="t('Hint')" width="400" align-center>
<div class="notActivated-content">
<div class="notActivated-text">
{{ t('YourAccountHasNotBeenActivatedYetAndMayBeSubjectToRestrictionsPleaseActivateItInTime') }}
</div>
<div class="notActivated-btn" @click="Activate()">
{{ t('Activate') }}
</div>
</div>
</el-dialog>
</template>
<script setup>
import { useRouter } from 'vue-router';
import { setStorage , getStorage , getPromiseStorage,clearStorage} from '@/utils/storage.js';
import { setStorage , getStorage , getPromiseStorage,clearStorage,getPromiseSessionStorage} from '@/utils/storage.js';
import { UserStore } from '@/stores/notice'
import { ElMessage } from "element-plus";
import { ElLoading } from "element-plus";
@@ -324,7 +334,7 @@ import {
onUnmounted, // 组件销毁前执行
reactive
} from "vue";
import { getCountryNamesArray } from "../utils/countryUtil";
import { getCountryNamesArray } from "@/utils/countryUtil";
import {
goEasyGetConversations,
goEasyDisConnect,
@@ -430,6 +440,7 @@ const isSendEmail = ref(0); // 是否发送邮箱验证码
const isResendEmail = ref(0); // 是否重发邮箱验证
const timeLeft = ref(60); // 倒计时
const newEmail = ref(''); // 新邮箱
const notActivated = ref(false); // 未激活弹窗
const chatList = ref({
unreadTotal: 0,
}); // 会话列表
@@ -812,6 +823,10 @@ function setsignIn() {
}).catch((err) => {});
}
function Activate(){
router.push('/ActivateEmail')
}
//获取用户数据
function UserInfo() {
getUserInfo({
@@ -819,9 +834,11 @@ function UserInfo() {
}).then(res => {
info.value = res;
setStorage("user", res);
if (info.value.status == 2) {
router.push('/ActivateEmail')
getPromiseSessionStorage("notActivated").then(res => {
if (info.value.status == 2 && res != true) {
notActivated.value = true;
}
}).catch((err) => {});
if (info.value.mailVerification == 1 && info.value.email != null) {
ElMessage.error(t('YourEmailHasNotBeenVerifiedPleaseGoToTheSettingsToVerifyYourEmailIfItHasBeenVerifiedPleaseRefreshThePage'));
//gj邮箱未验证请前往设置验证邮箱
@@ -1519,9 +1536,48 @@ onUnmounted(() => {
.email-Verification-btn-text{
font-size: 14px;
color: #999;
text-align: center;
}
.newEmail{
margin-top: 50px;
width: 410px;
}
.notActivated-content{
width:100%;
height: 300px;
display: flex;
flex-direction: column;
align-items: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.notActivated-text{
width: 90%;
height: 200px;
font-size: 20px;
color: #03ABA8;
}
.notActivated-btn{
width: 90%;
height: 50px;
margin-top: 50px;
background: linear-gradient(0deg, #4FCACD, #5FDBDE);
border-radius: 50px;
text-align: center;
line-height: 50px;
color: #ffffff;
transition: all 0.4s ease;
}
.notActivated-btn:hover{
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
transform: scale(1.05);
opacity: 0.8;
}
.notActivated-btn:active{
background-color: #03ABA8;
color: #ffffff;
transform: scale(0.90) !important;
}
</style>

View File

@@ -1,50 +1,52 @@
<template>
<div class="language-switcher">
<button
@click="setLanguage('ZH')"
:class="{ active: currentLanguage === 'ZH' }"
>
中文
</button>
<button
@click="setLanguage('EN')"
:class="{ active: currentLanguage === 'EN' }"
>
English
</button>
<el-select-v2
v-model="currentLanguage"
:options="languageOptions"
style="vertical-align: middle"
class="select"
@change="setLanguage(currentLanguage)"
/>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { setLocale } from '@/i18n'
import { ref } from "vue";
import { useI18n } from "vue-i18n";
import { setLocale } from "@/i18n";
const { locale } = useI18n()
const currentLanguage = ref(locale.value)
const { locale } = useI18n();
const currentLanguage = ref(locale.value);
const languageOptions = [
{ label: "中文", value: "ZH" },
{ label: "English", value: "EN" },
];
function setLanguage(lang) {
setLocale(lang)
currentLanguage.value = lang
setLocale(lang);
currentLanguage.value = lang;
}
</script>
<style scoped>
.language-switcher {
width: 150px;
height: 30px;
position: fixed;
top: 20px;
right: 20px;
z-index: 1000;
}
button {
width: 80px;
height: 30px;
padding: 5px 10px;
margin: 0 5px;
cursor: pointer;
background: #f0f0f0;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
button.active {

View File

@@ -16,12 +16,14 @@
background: ArticleDetailsA.sex == 1 ? '#59D8DB' : '#F3876F',
}"
>
{{ ArticleDetailsA.sex == 1 ? "男" : "女" }}
{{ ArticleDetailsA.sex == 1 ? t("man") : t("woman")}}
<!-- gj男/ -->
</div>
<div class="Country">{{ ArticleDetailsA.country }}</div>
</div>
<div class="time">
PK时间(本地时间):{{ TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
{{t("PKTime") + TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
<!-- gjPK时间 -->
</div>
</div>
</div>
@@ -34,7 +36,8 @@
alt=""
/>
<div class="sessions-content">
金币
{{t('GoldCoin') }}
<!-- gj金币 -->
<div class="gold-num">{{ ArticleDetailsA.coin }}K</div>
</div>
</div>
@@ -45,13 +48,16 @@
alt=""
/>
<div class="sessions-content">
场次
<div class="gold-num">{{ PkIDInfodata.pkNumber }}</div>
{{ t('session') }}
<!-- gj场次 -->
<div class="gold-num">{{ PkIDInfodata.pkNumber+t('match')}}</div>
<!-- gj场 -->
</div>
</div>
</div>
<!-- -->
<div class="Remarks">备注{{ ArticleDetailsA.remark }}</div>
<div class="Remarks">{{t('Note')+ArticleDetailsA.remark }}</div>
<!-- gj备注 -->
</div>
</div>
<div class="pk-message-center">
@@ -60,19 +66,24 @@
class="messagebtn"
v-if="PkIDInfodata.pkStatus === 0 && ArticleDetailsB.senderId != info.id"
>
<div class="messagebtn-left" @click="agree()">同意</div>
<div class="messagebtn-right" @click="refuse()">拒绝</div>
<div class="messagebtn-left" @click="agree()">{{ t('agree') }}</div>
<!-- gj同意 -->
<div class="messagebtn-right" @click="refuse()">{{ t('Refuse') }}</div>
<!-- gj拒绝 -->
</div>
<div v-if="PkIDInfodata.pkStatus === 1" class="messageHint">已同意邀请</div>
<div v-if="PkIDInfodata.pkStatus === 1" class="messageHint">{{ t('HaveAgreedToTheInvitation') }}</div>
<!-- gj已同意 -->
<div v-if="PkIDInfodata.pkStatus === 2" class="messageHint">已拒绝邀请</div>
<div v-if="PkIDInfodata.pkStatus === 2" class="messageHint">{{ t('HaveRefusedTheInvitation') }}</div>
<!-- gj已拒绝 -->
<div
v-if="PkIDInfodata.pkStatus === 0 && ArticleDetailsB.senderId == info.id"
class="messageHint"
>
等待对方回应如果已经回应请刷新页面
{{ t('WaitForTheOtherPartyResponse') }}
<!-- gj等待对方响应 -->
</div>
</div>
<div class="pk-message-right">
@@ -88,11 +99,13 @@
background: ArticleDetailsB.sex == 1 ? '#59D8DB' : '#F3876F',
}"
>
{{ ArticleDetailsB.sex == 1 ? "男" : "女" }}
{{ ArticleDetailsB.sex == 1 ? t("man") : t("woman")}}
<!-- gj男/ -->
</div>
</div>
<div class="time">
PK时间(本地时间):{{ TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
{{t("PKTime") + TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
<!-- gjPK时间 -->
</div>
</div>
<div class="Avatar">
@@ -108,7 +121,8 @@
alt=""
/>
<div class="sessions-content">
金币
{{t('GoldCoin') }}
<!-- gj金币 -->
<div class="gold-num">{{ ArticleDetailsB.coin }}K</div>
</div>
</div>
@@ -119,48 +133,53 @@
alt=""
/>
<div class="sessions-content">
场次
<div class="gold-num">{{ PkIDInfodata.pkNumber }}</div>
{{ t('session') }}
<!-- gj场次 -->
<div class="gold-num">{{ PkIDInfodata.pkNumber+t('match')}}</div>
</div>
</div>
</div>
<!-- -->
<div class="Remarks">备注{{ ArticleDetailsB.remark }}</div>
<div class="Remarks">{{t('Note')+ArticleDetailsB.remark }}</div>
</div>
</div>
</div>
<!-- 同意邀请提示 -->
<el-dialog v-model="agreedialog" center title="提示" width="400" align-center>
<el-dialog v-model="agreedialog" center :title="t('Hint')" width="400" align-center>
<div class="dialog-content">
<div class="dialog-content-text">
<div>
邀请成功后的pk不可修改不可删除请谨慎操作
{{ t('AfterASuccessfulInvitationThePKCannotBeModifiedOrDeletedPleaseOperateWithCaution') }}
<!-- gj邀请成功后PK不可修改或删除请谨慎操作 -->
</div>
</div>
<!-- -->
<div class="myanchor-dialog-btn">
<div class="remindermyAnchorDialogReset" @click="agreedialog = false">取消</div>
<div class="remindermyAnchorDialogReset" @click="agreedialog = false">{{ t('Cancel') }}</div>
<!-- gj取消 -->
<div class="remindermyAnchorDialogConfirm" @click="agreedialogConfirm">
确认
{{ t('Confirm') }}
<!-- gj确认 -->
</div>
</div>
</div>
</el-dialog>
<!-- 拒绝邀请提示 -->
<el-dialog v-model="refusedialog" center title="提示" width="400" align-center>
<el-dialog v-model="refusedialog" center :title="t('Hint')" width="400" align-center>
<div class="dialog-content">
<!-- -->
<div class="dialog-content-text">
<div>
您确定要拒绝该邀请吗
{{ t('AreYouSureYouWantToDeclineThisInvitation') }}
<!-- gj确定拒绝邀请 -->
</div>
</div>
<div class="myanchor-dialog-btn">
<div class="remindermyAnchorDialogReset" @click="refusedialog = false">取消</div>
<div class="remindermyAnchorDialogReset" @click="refusedialog = false">{{ t('Cancel') }}</div>
<div class="remindermyAnchorDialogConfirm" @click="refusedialogConfirm">
确认
{{ t('Confirm') }}
</div>
</div>
@@ -185,6 +204,11 @@ import {
} from "@/utils/storage.js";
import { TimestamptolocalTime } from "@/utils/timeConversion.js";
import { ElMessage } from "element-plus";
//
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
window['$t'] = t
//
const props = defineProps({
item: {
type: Object,
@@ -206,7 +230,8 @@ function agreedialogConfirm(){
id: newValitem.value.payload.customData.id,
pkStatus: 1,
}).then(() => {
ElMessage.success("同意成功");
ElMessage.success(t('AgreeToSuccess'));
//gj同意成功
PkIDInfodata.value.pkStatus = 1;
agreedialog.value = false
}).catch((err) => {});
@@ -218,7 +243,8 @@ function refusedialogConfirm(){
id: newValitem.value.payload.customData.id,
pkStatus: 2,
}).then(() => {
ElMessage.success("拒绝成功");
ElMessage.success(t('RefuseSuccess'));
//gj拒绝成功
PkIDInfodata.value.pkStatus = 2;
refusedialog.value = false
}).catch((err) => {});
@@ -498,12 +524,12 @@ watch(refname, async (newQuestion, oldQuestion) => {
height: 20px;
}
.sessions-content {
font-size: 20px;
font-size: 16px;
color: #999;
display: flex;
}
.gold-num {
font-size: 20px;
font-size: 16px;
font-weight: bold;
color: #333;
margin-left: 5px;

View File

@@ -6,10 +6,6 @@
<div class="dialog-content">
<img class="dialog-img" :src="item.payload.url" alt="">
</div>
<div class="dialog-footer">
<el-button type="primary" @click="dialogVisible = false">关闭</el-button>
<el-button type="primary" @click="saveToDesktop">保存到本地</el-button>
</div>
</el-dialog>
</template>

View File

@@ -15,13 +15,15 @@
background: ArticleDetailsA.sex == 1 ? '#59D8DB' : '#F3876F',
}"
>
{{ ArticleDetailsA.sex == 1 ? "男" : "女" }}
{{ ArticleDetailsA.sex == 1 ? t("man") : t("woman") }}
<!-- gj男/ -->
</div>
<div class="Country">{{ ArticleDetailsA.country }}</div>
</div>
<!-- -->
<div class="time">
PK时间(本地时间):{{ TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
{{ t("PKTime") + TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
<!-- gjPK时间 -->
</div>
<!-- -->
<div class="PKinformation">
@@ -32,7 +34,8 @@
alt=""
/>
<div class="sessions-content">
金币
{{t('GoldCoin') }}
<!-- gj金币 -->
<div class="gold-num">{{ ArticleDetailsA.coin }}K</div>
</div>
</div>
@@ -43,13 +46,14 @@
alt=""
/>
<div class="sessions-content">
场次
<div class="gold-num">{{ PkIDInfodata.pkNumber }}</div>
{{ t('session') }}
<!-- gj场次 -->
<div class="gold-num">{{ PkIDInfodata.pkNumber+t('match') }}</div>
</div>
</div>
</div>
<!-- -->
<div class="Remarks">备注{{ ArticleDetailsA.remark }}</div>
<div class="Remarks">{{ t('Note')+ArticleDetailsA.remark }}</div>
</div>
<!-- vs -->
<div class="messageVS">
@@ -70,13 +74,15 @@
background: ArticleDetailsB.sex == 1 ? '#59D8DB' : '#F3876F',
}"
>
{{ ArticleDetailsB.sex == 1 ? "男" : "女" }}
{{ ArticleDetailsB.sex == 1 ? t("man") : t("woman")}}
<!-- gj男/ -->
</div>
<div class="Country">{{ ArticleDetailsB.country }}</div>
</div>
<!-- -->
<div class="time">
PK时间(本地时间):{{ TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
{{ t("PKTime") + TimestamptolocalTime(PkIDInfodata.pkTime * 1000) }}
<!-- gjPK时间 -->
</div>
<!-- -->
<div class="PKinformation">
@@ -87,7 +93,8 @@
alt=""
/>
<div class="sessions-content">
金币
{{t('GoldCoin') }}
<!-- gj金币 -->
<div class="gold-num">{{ ArticleDetailsB.coin }}K</div>
</div>
</div>
@@ -98,55 +105,70 @@
alt=""
/>
<div class="sessions-content">
场次
<div class="gold-num">{{ PkIDInfodata.pkNumber }}</div>
{{ t('session') }}
<!-- gj场次 -->
<div class="gold-num">{{ PkIDInfodata.pkNumber+t('match') }}</div>
</div>
</div>
</div>
<div class="Remarks">备注{{ ArticleDetailsB.remark }}</div>
<div class="Remarks">{{ t('Note')+ArticleDetailsB.remark }}</div>
<!-- gj备注 -->
</div>
<!-- btn -->
<div class="btn" v-if="PkIDInfodata.pkStatus === 0 && ArticleDetailsB.senderId != info.id">
<div class="messagebtn-left" @click="agree()">同意</div>
<div class="messagebtn-right" @click="refuse()">拒绝</div>
<div
class="btn"
v-if="PkIDInfodata.pkStatus === 0 && ArticleDetailsB.senderId != info.id"
>
<div class="messagebtn-left" @click="agree()">{{ t('agree') }}</div>
<!-- gj同意 -->
<div class="messagebtn-right" @click="refuse()">{{ t('Refuse') }}</div>
<!-- gj拒绝 -->
</div>
<div v-if="PkIDInfodata.pkStatus === 1" class="messageHint">已同意邀请</div>
<div v-if="PkIDInfodata.pkStatus === 2" class="messageHint">已拒绝邀请</div>
<div v-if="PkIDInfodata.pkStatus === 1" class="messageHint">{{ t('HaveAgreedToTheInvitation') }}</div>
<!-- gj已同意 -->
<div v-if="PkIDInfodata.pkStatus === 2" class="messageHint">{{ t('HaveRefusedTheInvitation') }}</div>
<!-- gj已拒绝 -->
<div
v-if="PkIDInfodata.pkStatus === 0 && ArticleDetailsB.senderId == info.id"
class="messageHint"
>
等待对方回应如果已经回应请刷新页面
{{ t('WaitForTheOtherPartyResponse') }}
<!-- gj等待对方响应 -->
</div>
</div>
<!-- 弹窗 -->
<!-- 同意邀请提示 -->
<el-dialog v-model="agreedialog" center title="提示" width="400" align-center>
<el-dialog v-model="agreedialog" center :title="t('Hint')" width="400" align-center>
<div class="dialog-content">
<div class="dialog-content-text">
<div>邀请成功后的pk不可修改不可删除请谨慎操作</div>
<div>{{ t('AfterASuccessfulInvitationThePKCannotBeModifiedOrDeletedPleaseOperateWithCaution') }}</div>
<!-- gj邀请成功后PK不可修改或删除请谨慎操作 -->
</div>
<!-- -->
<div class="myanchor-dialog-btn">
<div class="remindermyAnchorDialogReset" @click="agreedialog = false">取消</div>
<div class="remindermyAnchorDialogConfirm" @click="agreedialogConfirm">确认</div>
<div class="remindermyAnchorDialogReset" @click="agreedialog = false">{{ t('Cancel') }}</div>
<!-- gj取消 -->
<div class="remindermyAnchorDialogConfirm" @click="agreedialogConfirm"> {{ t('Confirm') }}
<!-- gj确认 --></div>
</div>
</div>
</el-dialog>
<!-- 拒绝邀请提示 -->
<el-dialog v-model="refusedialog" center title="提示" width="400" align-center>
<el-dialog v-model="refusedialog" center :title="t('Hint')" width="400" align-center>
<!-- gj提示 -->
<div class="dialog-content">
<!-- -->
<div class="dialog-content-text">
<div>您确定要拒绝该邀请吗</div>
<div> {{ t('AreYouSureYouWantToDeclineThisInvitation') }}
<!-- gj确定拒绝邀请 --></div>
</div>
<div class="myanchor-dialog-btn">
<div class="remindermyAnchorDialogReset" @click="refusedialog = false">取消</div>
<div class="remindermyAnchorDialogConfirm" @click="refusedialogConfirm">确认</div>
<div class="remindermyAnchorDialogReset" @click="refusedialog = false">{{ t('Cancel') }}</div>
<!-- gj取消 -->
<div class="remindermyAnchorDialogConfirm" @click="refusedialogConfirm"> {{ t('Confirm') }}</div>
<!-- gj确认 -->
</div>
</div>
</el-dialog>
@@ -169,6 +191,11 @@ import {
} from "@/utils/storage.js";
import { TimestamptolocalTime } from "@/utils/timeConversion.js";
import { ElMessage } from "element-plus";
//
import { useI18n } from "vue-i18n";
const { t } = useI18n();
window["$t"] = t;
//
const props = defineProps({
item: {
type: Object,
@@ -188,11 +215,14 @@ function agreedialogConfirm() {
updatePkRecordStatus({
id: newValitem.value.payload.customData.id,
pkStatus: 1,
}).then(() => {
ElMessage.success("同意成功");
PkIDInfodata.value.pkStatus = 1;
agreedialog.value = false;
}).catch((err) => {});
})
.then(() => {
ElMessage.success(t('AgreeToSuccess'));
//gj同意成功
PkIDInfodata.value.pkStatus = 1;
agreedialog.value = false;
})
.catch((err) => {});
}
//确认拒绝
@@ -200,11 +230,14 @@ function refusedialogConfirm() {
updatePkRecordStatus({
id: newValitem.value.payload.customData.id,
pkStatus: 2,
}).then(() => {
ElMessage.success("拒绝成功");
PkIDInfodata.value.pkStatus = 2;
refusedialog.value = false;
}).catch((err) => {});
})
.then(() => {
ElMessage.success(t('RefuseSuccess'));
//gj拒绝成功
PkIDInfodata.value.pkStatus = 2;
refusedialog.value = false;
})
.catch((err) => {});
}
//同意邀请
@@ -224,34 +257,42 @@ watch(
newValitem.value = newVal;
queryPkRecord({
id: newVal.payload.customData.id,
}).then((res) => {
PkIDInfodata.value = res;
console.log("PkIDInfodata", res);
}).catch((err) => {});
})
.then((res) => {
PkIDInfodata.value = res;
console.log("PkIDInfodata", res);
})
.catch((err) => {});
pkArticleDetail({
id: newVal.payload.customData.pkIdA,
userId: info.value.id,
from: 2,
}).then((res) => {
ArticleDetailsA.value = res;
console.log("ArticleDetailsA", res);
}).catch((err) => {});
})
.then((res) => {
ArticleDetailsA.value = res;
console.log("ArticleDetailsA", res);
})
.catch((err) => {});
pkArticleDetail({
id: newVal.payload.customData.pkIdB,
userId: info.value.id,
from: 2,
}).then((res) => {
ArticleDetailsB.value = res;
console.log("ArticleDetailsB", res);
}).catch((err) => {});
})
.then((res) => {
ArticleDetailsB.value = res;
console.log("ArticleDetailsB", res);
})
.catch((err) => {});
},
{ immediate: true }
);
onMounted(() => {
getPromiseStorage("user").then((res) => {
info.value = res;
}).catch((err) => {});
getPromiseStorage("user")
.then((res) => {
info.value = res;
})
.catch((err) => {});
});
onUpdated(() => {
// 组件更新后执行
@@ -370,10 +411,10 @@ watch(refname, async (newQuestion, oldQuestion) => {
display: flex;
align-items: center;
color: #999;
font-size: 16px;
font-size: 14px;
}
.gold-num {
font-size: 16px;
font-size: 14px;
font-weight: bold;
color: #000000;
margin-left: 5px;

View File

@@ -15,7 +15,8 @@
/>
<div class="voice-icon-text" v-if="!isPlaying">'{{floor(size)}}'</div>
<div class="voice-message-text" v-if="isPlaying">
播放中...
{{ t('Playing') }}
<!-- gj播放中 -->
</div>
</div>
@@ -29,7 +30,8 @@
alt=""
/>
<div class="voice-message-text" v-if="isPlaying">
播放中...
{{ t('Playing') }}
<!-- gj播放中 -->
</div>
</div>
</div>
@@ -38,6 +40,11 @@
<script setup>
import { ref, onMounted, watch } from "vue";
import { setStorage, getStorage, getPromiseStorage } from "@/utils/storage.js";
//
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
window['$t'] = t
//
const props = defineProps({
item: {
type: String,

View File

@@ -214,6 +214,7 @@ const deleteAnchor = () => {
ElMessage.success(t('DeletedSuccessfully'));
// gj删除成功
AnchorList();
cancel();
})
.catch((err) => {});
};

View File

@@ -168,6 +168,7 @@
</div>
<div class="notdata" v-if="selectedData == null">
<div class="chatNotDeta-text">{{ t('SelectRecordOnTheRightToViewDetailsImmediately') }}</div>
<!-- gj请先选择记录 -->
</div>
</el-splitter-panel>
</el-splitter>
@@ -314,6 +315,7 @@ onUnmounted(() => {
font-size: 20px;
color: #03aba8;
font-weight: bold;
text-align: center;
}
.custom-style {
width: 90%;

View File

@@ -1,3 +1,250 @@
{
"Andorra": "Andorra"
}
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "Democratic Republic of the Congo",
"CF": "Central African Republic",
"CG": "Congo",
"CH": "Switzerland",
"CI": "Côte d'Ivoire",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cabo Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czech Republic",
"DE": "Germany",
"DG": "Diego Garcia",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands (Malvinas)",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Lao People's Democratic Republic",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "French Southern Territories",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "Virgin Islands (British)",
"VI": "Virgin Islands (U.S.)",
"VN": "Vietnam",
"VU": "Vanuatu",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe"
}

View File

@@ -47,7 +47,7 @@
"PleaseEnterYourNewEmailAddress": "Please enter your new email address",
"Modify": "Modify",
"PleaseEnterTheEmailVerificationCode": "Please enter the email verification code",
"GetTheVerificationCode": "Get the verification code",
"GetTheVerificationCode": "verification code",
"Resend": "Resend",
"PleaseEnterAValidEmailAddress": "Please enter a valid email address",
"TheModificationIsSuccessfulPleaseVerifyYourEmailInTheNewEmailAddress": "The modification is successful. Please verify your email in the new email address.",
@@ -103,67 +103,80 @@
"ItHasNotBeenActivatedYetPleaseClickTheActivationLinkInYourEmailToActivateYourAccount": ". It has not been activated yet. Please click the activation link in your email to activate your account.",
"ResendTheActivationEmail": "Resend the activation email",
"TheActivationEmailHasBeenSentPleaseCheckItInTime": "The activation email has been sent. Please check it in time.",
"TheActivationEmailSendingFailedPleaseTryAgainLater":"The activation email sending failed. Please try again later.",
"TheActivationEmailSendingFailedPleaseTryAgainLater": "The activation email sending failed. Please try again later.",
"ResetThePassword": "Reset the password",
"PasswordResetSuccessful": "Password reset successful.",
"VerificationInProgressPleaseWaitAMoment":"Verification in progress. Please wait a moment.",
"VerificationSuccessfulPleaseLogIn":"Verification successful. Please log in.",
"VerificationFailed":"Verification failed.",
"VerificationInProgressPleaseWaitAMoment": "Verification in progress. Please wait a moment.",
"VerificationSuccessfulPleaseLogIn": "Verification successful. Please log in.",
"VerificationFailed": "Verification failed.",
"PKHall": "PK Hall",
"TodayPK": "Today PK",
"MinimumNumberOfGoldCoins":"Minimum number of gold coins (in K)",
"MaximumNumberOfGoldCoins":"Maximum number of gold coins (in K)",
"MinimumPKTime":"Minimum PK time",
"MaximumPKTime":"Maximum PK time",
"to":"to",
"Country":"Country",
"Gender":"Gender",
"PKTime":"PK time (local time) :",
"GoldCoin":"Gold coin :",
"session":"Session:",
"match":"Match",
"Send":"Send",
"SelectTheHostOnTheRightToChatImmediately":"Select the host on the right to chat immediately.",
"PKInvitation":"PK invitation",
"ChooseTheOpponentPKStreamer":"Choose the opponent's PK streamer",
"ChooseYourOwnPKStreamer":"Choose your own PK streamer",
"Hint":"Hint",
"AreYouSureYouWantToSendAPKInvitationMessageAfterASuccessfulInvitationThePkCannotBeModifiedOrDeletedPleasePaution":"Are you sure you want to send a PK invitation message? After a successful invitation, the pk cannot be modified or deleted. Please operate with caution!",
"PleaseSelectTheStreamerWhoWillParticipateInThePK":"Please select the streamer who will participate in the PK",
"PleaseSelectOurStreamerToParticipateInThePK":"Please select our streamer to participate in the PK",
"PleaseSelectTheOtherPartyAndYourOwnStreamer":"Please select the other party and your own streamer",
"PleaseEnterTheMaximumNumberOfGoldCoins":"Please enter the maximum number of gold coins",
"PleaseEnterTheMinimumNumberOfGoldCoins":"Please enter the minimum number of gold coins",
"TheStartTimeCannotBeLessThanTheCurrentTime":"The start time cannot be less than the current time",
"AnchorLibrary":"Anchor Library",
"PKInformation":"PK Information",
"MyPKRecord":"My PK record",
"PointsList":"Points list",
"MyPoints":"My points :",
"YouDonHaveAnyPointsRecordsYet":"You don't have any points records yet !",
"ActualNumberOfGoldCoins":"Actual number of gold coins :",
"YouDonHaveAPKRecordYet":"You don't have a PK record yet !",
"InTotal":"In total :",
"The":"The",
"THInning":"TH inning",
"SelectRecordOnTheRightToViewDetailsImmediately":"Select Record on the right to view details immediately",
"ThePKIPosted":"The PK I posted",
"ThePKIInvited":"The PK I invited",
"YoudonHaveAnyPKInformationYetHurryUpAndAddIt":"You don't have any PK information yet. Hurry up and add it!",
"ConfirmTheDeletionOfThisStreamerPKInformation":"Confirm the deletion of this streamer PK information?",
"TopPosition":"Top position",
"TopPromptOnTheHomepage":"After being pinned to the top, the user will be pinned to the top of the home page and enjoy the privilege of being pinned for a specified period of time. If the pinned duration is less than one hour, the system will calculate the points deduction as one hour. Please select the pinned duration:",
"PleaseSelectThePinnedDuration":"Please select the pinned duration",
"UnpinTheTopPrompt":"Are you sure you want to cancel the pinning? After the pinning is cancelled, the user will no longer enjoy the pinning privilege, but can still continue to participatePK challenge. If the pinned duration is less than one hour, the system will calculate the points deduction as one hour. After cancellation, the remaining points will be returned in proportion to the actual usage time. Is this operation confirmed to be carried out?",
"Unpinned":"Unpinned",
"hour":"hour",
"Expired":"Expired",
"TopPlacementSuccessful":"Top placement successful.",
"DeletedSuccessfully":"Deleted successfully.",
"YouDonHaveALiveStreamerYetHurryUpAndAddOne":"You don't have a live-streamer yet. Hurry up and add one!",
"AddMyStreamer":"Add my streamer",
"ModifyMyStreamer":"Modify my streamer",
"ConfirmTheDeletionOfThisStreamer":"Confirm the deletion of this streamer?",
"AddedSuccessfully":"Added successfully."
"MinimumNumberOfGoldCoins": "Minimum number of gold coins (in K)",
"MaximumNumberOfGoldCoins": "Maximum number of gold coins (in K)",
"MinimumPKTime": "Minimum PK time",
"MaximumPKTime": "Maximum PK time",
"to": "to",
"Country": "Country",
"Gender": "Gender",
"PKTime": "PK time (local time) :",
"GoldCoin": "Gold coin :",
"session": "Session:",
"match": "Match",
"Send": "Send",
"SelectTheHostOnTheRightToChatImmediately": "Select the host on the right to chat immediately.",
"PKInvitation": "PK invitation",
"ChooseTheOpponentPKStreamer": "Choose the opponent's PK streamer",
"ChooseYourOwnPKStreamer": "Choose your own PK streamer",
"Hint": "Hint",
"AreYouSureYouWantToSendAPKInvitationMessageAfterASuccessfulInvitationThePkCannotBeModifiedOrDeletedPleasePaution": "Are you sure you want to send a PK invitation message? After a successful invitation, the pk cannot be modified or deleted. Please operate with caution!",
"PleaseSelectTheStreamerWhoWillParticipateInThePK": "Please select the streamer who will participate in the PK",
"PleaseSelectOurStreamerToParticipateInThePK": "Please select our streamer to participate in the PK",
"PleaseSelectTheOtherPartyAndYourOwnStreamer": "Please select the other party and your own streamer",
"PleaseEnterTheMaximumNumberOfGoldCoins": "Please enter the maximum number of gold coins",
"PleaseEnterTheMinimumNumberOfGoldCoins": "Please enter the minimum number of gold coins",
"TheStartTimeCannotBeLessThanTheCurrentTime": "The start time cannot be less than the current time",
"AnchorLibrary": "Anchor Library",
"PKInformation": "PK Information",
"MyPKRecord": "My PK record",
"PointsList": "Points list",
"MyPoints": "My points :",
"YouDonHaveAnyPointsRecordsYet": "You don't have any points records yet !",
"ActualNumberOfGoldCoins": "Actual number of gold coins :",
"YouDonHaveAPKRecordYet": "You don't have a PK record yet !",
"InTotal": "In total :",
"The": "The",
"THInning": "TH inning",
"SelectRecordOnTheRightToViewDetailsImmediately": "Select Record on the right to view details immediately",
"ThePKIPosted": "The PK I posted",
"ThePKIInvited": "The PK I invited",
"YoudonHaveAnyPKInformationYetHurryUpAndAddIt": "You don't have any PK information yet. Hurry up and add it!",
"ConfirmTheDeletionOfThisStreamerPKInformation": "Confirm the deletion of this streamer PK information?",
"TopPosition": "Top position",
"TopPromptOnTheHomepage": "After being pinned to the top, the user will be pinned to the top of the home page and enjoy the privilege of being pinned for a specified period of time. If the pinned duration is less than one hour, the system will calculate the points deduction as one hour. Please select the pinned duration:",
"PleaseSelectThePinnedDuration": "Please select the pinned duration",
"UnpinTheTopPrompt": "Are you sure you want to cancel the pinning? After the pinning is cancelled, the user will no longer enjoy the pinning privilege, but can still continue to participatePK challenge. If the pinned duration is less than one hour, the system will calculate the points deduction as one hour. After cancellation, the remaining points will be returned in proportion to the actual usage time. Is this operation confirmed to be carried out?",
"Unpinned": "Unpinned",
"hour": "hour",
"Expired": "Expired",
"TopPlacementSuccessful": "Top placement successful.",
"DeletedSuccessfully": "Deleted successfully.",
"YouDonHaveALiveStreamerYetHurryUpAndAddOne": "You don't have a live-streamer yet. Hurry up and add one!",
"AddMyStreamer": "Add my streamer",
"ModifyMyStreamer": "Modify my streamer",
"ConfirmTheDeletionOfThisStreamer": "Confirm the deletion of this streamer?",
"AddedSuccessfully": "Added successfully.",
"Search": "Search",
"Playing": "Playing...",
"Note": "Note:",
"agree": "agree",
"Refuse": "Refuse",
"HaveAgreedToTheInvitation": "have agreed to the invitation.",
"HaveRefusedTheInvitation": "have refused the invitation.",
"WaitForTheOtherPartyResponse": "Wait for the other party's response.",
"AfterASuccessfulInvitationThePKCannotBeModifiedOrDeletedPleaseOperateWithCaution":"After a successful invitation, the pk cannot be modified or deleted. Please operate with caution!",
"AreYouSureYouWantToDeclineThisInvitation":"Are you sure you want to decline this invitation?",
"AgreeToSuccess":"Agree to success",
"RefuseSuccess":"Refuse success",
"YourAccountHasNotBeenActivatedYetAndMayBeSubjectToRestrictionsPleaseActivateItInTime":"Your account has not been activated yet and may be subject to restrictions. Please activate it in time!",
"Activate":"Activate"
}

View File

@@ -1,5 +1,250 @@
{
"Andorra":"安道尔"
}
"AD": "安道尔",
"AE": "阿拉伯联合酋长国",
"AF": "阿富汗",
"AG": "安提瓜和巴布达",
"AI": "安圭拉",
"AL": "阿尔巴尼亚",
"AM": "亚美尼亚",
"AO": "安哥拉",
"AQ": "南极洲",
"AR": "阿根廷",
"AS": "美属萨摩亚",
"AT": "奥地利",
"AU": "澳大利亚",
"AW": "阿鲁巴",
"AX": "奥兰群岛",
"AZ": "阿塞拜疆",
"BA": "波斯尼亚和黑塞哥维那",
"BB": "巴巴多斯",
"BD": "孟加拉国",
"BE": "比利时",
"BF": "布基纳法索",
"BG": "保加利亚",
"BH": "巴林",
"BI": "布隆迪",
"BJ": "贝宁",
"BL": "圣巴泰勒米",
"BM": "百慕大群岛",
"BN": "文莱达鲁萨兰国",
"BO": "玻利维亚",
"BQ": "博奈尔、圣尤斯特歇斯和萨巴",
"BR": "巴西",
"BS": "巴哈马",
"BT": "不丹",
"BV": "布韦岛",
"BW": "博茨瓦纳",
"BY": "白俄罗斯",
"BZ": "伯利兹",
"CA": "加拿大",
"CC": "科科斯(基林)群岛",
"CD": "刚果民主共和国",
"CF": "中非共和国",
"CG": "刚果共和国",
"CH": "瑞士",
"CI": "科特迪瓦",
"CK": "库克群岛",
"CL": "智利",
"CM": "喀麦隆",
"CN": "中国",
"CO": "哥伦比亚",
"CR": "哥斯达黎加",
"CU": "古巴",
"CV": "佛得角",
"CW": "库拉索",
"CX": "圣诞岛",
"CY": "塞浦路斯",
"CZ": "捷克共和国",
"DE": "德国",
"DG": "迪戈加西亚岛",
"DJ": "吉布提",
"DK": "丹麦",
"DM": "多米尼克",
"DO": "多米尼加共和国",
"DZ": "阿尔及利亚",
"EC": "厄瓜多尔",
"EE": "爱沙尼亚",
"EG": "埃及",
"EH": "西撒哈拉",
"ER": "厄立特里亚",
"ES": "西班牙",
"ET": "埃塞俄比亚",
"FI": "芬兰",
"FJ": "斐济",
"FK": "福克兰群岛",
"FM": "密克罗尼西亚",
"FO": "法罗群岛",
"FR": "法国",
"GA": "加蓬",
"GB": "英国",
"GD": "格林纳达",
"GE": "格鲁吉亚",
"GF": "法属圭亚那",
"GG": "根西岛",
"GH": "加纳",
"GI": "直布罗陀",
"GL": "格陵兰",
"GM": "冈比亚",
"GN": "几内亚",
"GP": "瓜德罗普",
"GQ": "赤道几内亚",
"GR": "希腊",
"GS": "南乔治亚和南桑德威奇群岛",
"GT": "危地马拉",
"GU": "关岛",
"GW": "几内亚比绍",
"GY": "圭亚那",
"HK": "中国香港特别行政区",
"HM": "赫德岛和麦克唐纳群岛",
"HN": "洪都拉斯",
"HR": "克罗地亚",
"HT": "海地",
"HU": "匈牙利",
"ID": "印度尼西亚",
"IE": "爱尔兰",
"IL": "以色列",
"IM": "马恩岛",
"IN": "印度",
"IO": "英属印度洋领地",
"IQ": "伊拉克",
"IR": "伊朗",
"IS": "冰岛",
"IT": "意大利",
"JE": "泽西岛",
"JM": "牙买加",
"JO": "约旦",
"JP": "日本",
"KE": "肯尼亚",
"KG": "吉尔吉斯斯坦",
"KH": "柬埔寨",
"KI": "基里巴斯",
"KM": "科摩罗",
"KN": "圣基茨和尼维斯",
"KP": "朝鲜",
"KR": "韩国",
"KW": "科威特",
"KY": "开曼群岛",
"KZ": "哈萨克斯坦",
"LA": "老挝",
"LB": "黎巴嫩",
"LC": "圣卢西亚",
"LI": "列支敦士登",
"LK": "斯里兰卡",
"LR": "利比里亚",
"LS": "莱索托",
"LT": "立陶宛",
"LU": "卢森堡",
"LV": "拉脱维亚",
"LY": "利比亚",
"MA": "摩洛哥",
"MC": "摩纳哥",
"MD": "摩尔多瓦",
"ME": "黑山",
"MF": "圣马丁",
"MG": "马达加斯加",
"MH": "马绍尔群岛",
"MK": "北马其顿",
"ML": "马里",
"MM": "缅甸",
"MN": "蒙古",
"MO": "中国澳门特别行政区",
"MP": "北马里亚纳群岛",
"MQ": "马提尼克",
"MR": "毛里塔尼亚",
"MS": "蒙特塞拉特",
"MT": "马耳他",
"MU": "毛里求斯",
"MV": "马尔代夫",
"MW": "马拉维",
"MX": "墨西哥",
"MY": "马来西亚",
"MZ": "莫桑比克",
"NA": "纳米比亚",
"NC": "新喀里多尼亚",
"NE": "尼日尔",
"NF": "诺福克岛",
"NG": "尼日利亚",
"NI": "尼加拉瓜",
"NL": "荷兰",
"NO": "挪威",
"NP": "尼泊尔",
"NR": "瑙鲁",
"NU": "纽埃",
"NZ": "新西兰",
"OM": "阿曼",
"PA": "巴拿马",
"PE": "秘鲁",
"PF": "法属玻利尼西亚",
"PG": "巴布亚新几内亚",
"PH": "菲律宾",
"PK": "巴基斯坦",
"PL": "波兰",
"PM": "圣皮埃尔和密克隆群岛",
"PN": "皮特凯恩群岛",
"PR": "波多黎各",
"PS": "巴勒斯坦",
"PT": "葡萄牙",
"PW": "帕劳",
"PY": "巴拉圭",
"QA": "卡塔尔",
"RE": "留尼汪",
"RO": "罗马尼亚",
"RS": "塞尔维亚",
"RU": "俄罗斯",
"RW": "卢旺达",
"SA": "沙特阿拉伯",
"SB": "索罗门群岛",
"SC": "塞舌尔",
"SD": "苏丹",
"SE": "瑞典",
"SG": "新加坡",
"SI": "斯洛文尼亚",
"SJ": "斯瓦尔巴和扬马延",
"SK": "斯洛伐克",
"SL": "塞拉利昂",
"SM": "圣马利诺",
"SN": "塞内加尔",
"SO": "索马里",
"SR": "苏里南",
"SS": "南苏丹",
"ST": "圣多美和普林西比",
"SV": "萨尔瓦多",
"SX": "荷属圣马丁",
"SY": "叙利亚",
"SZ": "斯威士兰",
"TC": "特克斯和凯科斯群岛",
"TD": "乍得",
"TF": "法属南部领地",
"TG": "多哥",
"TH": "泰国",
"TJ": "塔吉克斯坦",
"TK": "托克劳群岛",
"TL": "东帝汶",
"TM": "土库曼斯坦",
"TN": "突尼斯",
"TO": "汤加",
"TR": "土耳其",
"TT": "特立尼达和多巴哥",
"TV": "图瓦卢",
"TW": "台湾",
"TZ": "坦桑尼亚",
"UA": "乌克兰",
"UG": "乌干达",
"UM": "美国本土外小岛屿",
"US": "美国",
"UY": "乌拉圭",
"UZ": "乌兹别克斯坦",
"VA": "梵蒂冈",
"VC": "圣文森特",
"VE": "委内瑞拉",
"VG": "英属维尔京群岛",
"VI": "美属维尔京群岛",
"VN": "越南",
"VU": "瓦努阿图",
"WS": "萨摩亚",
"YE": "也门",
"YT": "马约特岛",
"ZA": "南非",
"ZM": "赞比亚",
"ZW": "津巴布韦"
}

View File

@@ -164,5 +164,19 @@
"AddMyStreamer":"添加我的主播",
"ModifyMyStreamer":"修改我的主播",
"ConfirmTheDeletionOfThisStreamer":"确认删除该主播?",
"AddedSuccessfully":"添加成功"
"AddedSuccessfully":"添加成功",
"Search":"搜索",
"Playing":"播放中...",
"Note":"备注:",
"agree":"同意",
"Refuse":"拒绝",
"HaveAgreedToTheInvitation":"已同意邀请",
"HaveRefusedTheInvitation":"已拒绝邀请",
"WaitForTheOtherPartyResponse":"等待对方回应(如果已经回应请刷新页面)",
"AfterASuccessfulInvitationThePKCannotBeModifiedOrDeletedPleaseOperateWithCaution":"邀请成功后的pk不可修改不可删除请谨慎操作",
"AreYouSureYouWantToDeclineThisInvitation":" 您确定要拒绝此邀请吗?",
"AgreeToSuccess":"同意成功",
"RefuseSuccess":"拒绝成功",
"YourAccountHasNotBeenActivatedYetAndMayBeSubjectToRestrictionsPleaseActivateItInTime":"您的账号尚未激活,可能受到限制,请及时激活。",
"Activate":"激活"
}

View File

@@ -47,7 +47,9 @@ axios.interceptors.response.use((response) => {
return Promise.reject(error)
})
// 处理headerIcon的前缀
import { translateCountryName } from './countryUtil';
// 处理headerIcon的前缀和country的翻译
function addPrefixToHeaderIcon(data) {
// 处理数组:递归处理每个元素
if (Array.isArray(data)) {
@@ -58,7 +60,7 @@ function addPrefixToHeaderIcon(data) {
// 处理对象:递归处理每个属性
if (typeof data === 'object' && data !== null) {
for (const key in data) {
if (key === 'headerIcon' ||key === 'anchorIcon' && data.hasOwnProperty(key)) {
if (key === 'headerIcon' || key === 'anchorIcon' && data.hasOwnProperty(key)) {
// 在headerIcon值前添加前缀处理各种类型anchorIconA anchorIconB anchorIcon
const value = data[key];
data[key] = "https://vv-1317974657.cos.ap-shanghai.myqcloud.com/headerIcon/" + (
@@ -66,6 +68,12 @@ function addPrefixToHeaderIcon(data) {
: value != null ? String(value)
: ""
);
} else if (key === 'country' && data.hasOwnProperty(key)) {
// 翻译country值
const value = data[key];
if (typeof value === 'string') {
data[key] = translateCountryName(value);
}
} else if (typeof data[key] === 'object' && data[key] !== null) {
// 递归处理嵌套对象或数组
addPrefixToHeaderIcon(data[key]);

View File

@@ -1,260 +1,28 @@
// country-utils.js
export const CountryCode = {
AD: "安道尔",
AE: "阿拉伯联合酋长国",
AF: "阿富汗",
AG: "安提瓜和巴布达",
AI: "安圭拉",
AL: "阿尔巴尼亚",
AM: "亚美尼亚",
AO: "安哥拉",
AQ: "南极洲",
AR: "阿根廷",
AS: "美属萨摩亚",
AT: "奥地利",
AU: "澳大利亚",
AU1: "澳大利亚",
AW: "阿鲁巴",
AX: "奥兰群岛",
AZ: "阿塞拜疆",
BA: "波斯尼亚和黑塞哥维那",
BB: "巴巴多斯",
BD: "孟加拉国",
BE: "比利时",
BF: "布基纳法索",
BG: "保加利亚",
BH: "巴林",
BI: "布隆迪",
BJ: "贝宁",
BL: "圣巴泰勒米",
BM: "百慕大群岛",
BN: "文莱达鲁萨兰国",
BO: "玻利维亚",
BQ: "博奈尔、圣尤斯特歇斯和萨巴",
BR: "巴西",
BS: "巴哈马",
BT: "不丹",
BV: "布韦岛",
BW: "博茨瓦纳",
BY: "白俄罗斯",
BZ: "伯利兹",
CA: "加拿大",
CA1: "加拿大",
CC: "科科斯(基林)群岛",
CD: "刚果民主共和国",
CF: "中非共和国",
CG: "刚果共和国",
CH: "瑞士",
CI: "科特迪瓦",
CK: "库克群岛",
CL: "智利",
CM: "喀麦隆",
CN: "中国",
CO: "哥伦比亚",
CR: "哥斯达黎加",
CU: "古巴",
CV: "佛得角",
CW: "库拉索",
CX: "圣诞岛",
CY: "塞浦路斯",
CZ: "捷克共和国",
DE: "德国",
DG: "迪戈加西亚岛",
DJ: "吉布提",
DK: "丹麦",
DM: "多米尼克",
DO: "多米尼加共和国",
DZ: "阿尔及利亚",
EC: "厄瓜多尔",
EE: "爱沙尼亚",
EG: "埃及",
EH: "西撒哈拉",
ER: "厄立特里亚",
ES: "西班牙",
ET: "埃塞俄比亚",
FI: "芬兰",
FJ: "斐济",
FK: "福克兰群岛",
FM: "密克罗尼西亚",
FO: "法罗群岛",
FR: "法国",
GA: "加蓬",
GB: "英国",
GD: "格林纳达",
GE: "格鲁吉亚",
GF: "法属圭亚那",
GG: "根西岛",
GH: "加纳",
GI: "直布罗陀",
GL: "格陵兰",
GM: "冈比亚",
GN: "几内亚",
GP: "瓜德罗普",
GQ: "赤道几内亚",
GR: "希腊",
GS: "南乔治亚和南桑德威奇群岛",
GT: "危地马拉",
GU: "关岛",
GW: "几内亚比绍",
GY: "圭亚那",
HK: "中国香港特别行政区",
HM: "赫德岛和麦克唐纳群岛",
HN: "洪都拉斯",
HR: "克罗地亚",
HT: "海地",
HU: "匈牙利",
ID: "印度尼西亚",
IE: "爱尔兰",
IL: "以色列",
IM: "马恩岛",
IN: "印度",
IO: "英属印度洋领地",
IQ: "伊拉克",
IR: "伊朗",
IS: "冰岛",
IT: "意大利",
JE: "泽西岛",
JM: "牙买加",
JO: "约旦",
JP: "日本",
JP1: "日本",
KE: "肯尼亚",
KG: "吉尔吉斯斯坦",
KH: "柬埔寨",
KI: "基里巴斯",
KM: "科摩罗",
KN: "圣基茨和尼维斯",
KP: "朝鲜",
KR: "韩国",
KR1: "韩国",
KR1_UXWAUDIT: "韩国",
KW: "科威特",
KY: "开曼群岛",
KZ: "哈萨克斯坦",
LA: "老挝",
LB: "黎巴嫩",
LC: "圣卢西亚",
LI: "列支敦士登",
LK: "斯里兰卡",
LR: "利比里亚",
LS: "莱索托",
LT: "立陶宛",
LU: "卢森堡",
LV: "拉脱维亚",
LY: "利比亚",
MA: "摩洛哥",
MC: "摩纳哥",
MD: "摩尔多瓦",
ME: "黑山",
MF: "圣马丁",
MG: "马达加斯加",
MH: "马绍尔群岛",
MK: "北马其顿",
ML: "马里",
MM: "缅甸",
MN: "蒙古",
MO: "中国澳门特别行政区",
MP: "北马里亚纳群岛",
MQ: "马提尼克",
MR: "毛里塔尼亚",
MS: "蒙特塞拉特",
MT: "马耳他",
MU: "毛里求斯",
MV: "马尔代夫",
MW: "马拉维",
MX: "墨西哥",
MY: "马来西亚",
MZ: "莫桑比克",
NA: "纳米比亚",
NC: "新喀里多尼亚",
NE: "尼日尔",
NF: "诺福克岛",
NG: "尼日利亚",
NI: "尼加拉瓜",
NL: "荷兰",
NO: "挪威",
NP: "尼泊尔",
NR: "瑙鲁",
NU: "纽埃",
NZ: "新西兰",
OM: "阿曼",
PA: "巴拿马",
PE: "秘鲁",
PF: "法属玻利尼西亚",
PG: "巴布亚新几内亚",
PH: "菲律宾",
PK: "巴基斯坦",
PL: "波兰",
PM: "圣皮埃尔和密克隆群岛",
PN: "皮特凯恩群岛",
PR: "波多黎各",
PS: "巴勒斯坦",
PT: "葡萄牙",
PW: "帕劳",
PY: "巴拉圭",
QA: "卡塔尔",
RE: "留尼汪",
RO: "罗马尼亚",
RS: "塞尔维亚",
RU: "俄罗斯",
RW: "卢旺达",
SA: "沙特阿拉伯",
SB: "索罗门群岛",
SC: "塞舌尔",
SD: "苏丹",
SE: "瑞典",
SG: "新加坡",
SI: "斯洛文尼亚",
SJ: "斯瓦尔巴和扬马延",
SK: "斯洛伐克",
SL: "塞拉利昂",
SM: "圣马利诺",
SN: "塞内加尔",
SO: "索马里",
SR: "苏里南",
SS: "南苏丹",
ST: "圣多美和普林西比",
SV: "萨尔瓦多",
SX: "荷属圣马丁",
SY: "叙利亚",
SZ: "斯威士兰",
TC: "特克斯和凯科斯群岛",
TD: "乍得",
TF: "法属南部领地",
TG: "多哥",
TH: "泰国",
TJ: "塔吉克斯坦",
TK: "托克劳群岛",
TL: "东帝汶",
TM: "土库曼斯坦",
TN: "突尼斯",
TO: "汤加",
TR: "土耳其",
TT: "特立尼达和多巴哥",
TV: "图瓦卢",
TW: "台湾",
TZ: "坦桑尼亚",
UA: "乌克兰",
UG: "乌干达",
UM: "美国本土外小岛屿",
US: "美国",
UY: "乌拉圭",
UZ: "乌兹别克斯坦",
VA: "梵蒂冈",
VC: "圣文森特",
VE: "委内瑞拉",
VG: "英属维尔京群岛",
VI: "美属维尔京群岛",
VN: "越南",
VN1: "越南",
VU: "瓦努阿图",
WS: "萨摩亚",
YE: "也门",
YT: "马约特岛",
ZA: "南非",
ZM: "赞比亚",
ZW: "津巴布韦"
};
import enCountries from '@/i18n/en/country.json';
import zhCountries from '@/i18n/zh/country.json';
// 创建中文名称到国家代码的映射
const zhNameToCode = {};
Object.entries(zhCountries).forEach(([code, zhName]) => {
zhNameToCode[zhName] = code;
});
// 获取国家名称数组value固定为中文名称label根据当前语言变化
export function getCountryNamesArray() {
return Object.entries(CountryCode).map(([code, nickname]) => ({ value: nickname, label: nickname }));
const currentLanguage = localStorage.getItem('language') || 'ZH';
return Object.entries(zhCountries).map(([code, zhName]) => ({
value: zhName,
label: currentLanguage === 'ZH' ? zhName : enCountries[code]
}));
}
// 根据中文名称获取当前语言环境的翻译
export function translateCountryName(zhName) {
const currentLanguage = localStorage.getItem('language') || 'ZH';
const code = zhNameToCode[zhName];
if (!code) return zhName; // 如果没有找到对应代码,返回原中文名称
return currentLanguage === 'ZH' ? zhName : enCountries[code];
}

View File

@@ -131,7 +131,7 @@ export function goEasySendPKMessage(data) {
let order = {
customData: customData,
link: "https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/pk.png",
text: "PK邀请消息",
text: "PK",
};
var customMessage = im.createCustomMessage({

View File

@@ -30,3 +30,19 @@ export function clearStorage(key) {
window.localStorage.removeItem(key);
}
}
//存储sessionStorage
export function setSessionStorage(key, value) {
const data = typeof value === 'object' ? JSON.stringify(value) : value;
window.sessionStorage.setItem(key, data);
}
//获取sessionStorage
export function getPromiseSessionStorage(key) {
return new Promise((resolve, reject) => {
const data = window.sessionStorage.getItem(key);
try {
resolve(JSON.parse(data));
} catch {
resolve(data);
}
});
}

View File

@@ -1,13 +1,19 @@
<template>
<div class="activate-email">
<div class="activate-email-content">
{{t('YourEmailAddressIs') + user.email + t('ItHasNotBeenActivatedYetPleaseClickTheActivationLinkInYourEmailToActivateYourAccount') }}
<!-- gj您的邮箱是{{user.email}}尚未激活请点击激活链接中的链接激活您的账户 -->
</div>
<div class="activate-email-btn" @click="sendActivateEmail">
{{ t('ResendTheActivationEmail') }}
<!-- gj重新发送激活邮件 -->
</div>
<div class="activate-email-content">
{{
t("YourEmailAddressIs") +
user.email +
t(
"ItHasNotBeenActivatedYetPleaseClickTheActivationLinkInYourEmailToActivateYourAccount"
)
}}
<!-- gj您的邮箱是{{user.email}}尚未激活请点击激活链接中的链接激活您的账户 -->
</div>
<div class="activate-email-btn" @click="sendActivateEmail">
{{ t("ResendTheActivationEmail") }}
<!-- gj重新发送激活邮件 -->
</div>
</div>
</template>
@@ -20,11 +26,12 @@ import {
onUnmounted, // 组件销毁前执行
onBeforeMount, // 组件挂载前执行
} from "vue";
import {getPromiseStorage} from '@/utils/storage.js';
import {resendEmail} from "@/api/account";
import { useRouter } from 'vue-router';
import { getPromiseStorage } from "@/utils/storage.js";
import { resendEmail } from "@/api/account";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import { setLocale } from "@/i18n";
import { setSessionStorage , getStorage } from '@/utils/storage.js';
//
import { useI18n } from "vue-i18n";
const { t } = useI18n();
@@ -32,20 +39,23 @@ const language = ref(null); // 语言
window["$t"] = t;
//
const router = useRouter();
const refname = ref('');
const refname = ref("");
function sendActivateEmail() {
resendEmail({
mailAddress:user.value.email,
type:1
}).then(res => {
ElMessage.success(t('TheActivationEmailHasBeenSentPleaseCheckItInTime'));
// gj激活邮件已发送请注意查收
router.push('/');
}).catch(err => {
ElMessage.error(t('TheActivationEmailSendingFailedPleaseTryAgainLater'));
// gj激活邮件发送失败请稍后再试
resendEmail({
mailAddress: user.value.email,
type: 1,
})
.then((res) => {
ElMessage.success(t("TheActivationEmailHasBeenSentPleaseCheckItInTime"));
// gj激活邮件已发送请注意查收
setSessionStorage("notActivated", true); // 存储用户信息
router.push('/nav'); // 返回上一页
})
.catch((err) => {
ElMessage.error(t("TheActivationEmailSendingFailedPleaseTryAgainLater"));
// gj激活邮件发送失败请稍后再试
});
}
onBeforeMount(() => {
@@ -66,10 +76,12 @@ watch(refname, async (newQuestion, oldQuestion) => {
});
const user = ref({});
onMounted(() => {
getPromiseStorage('user').then(res => {
console.log(res);
getPromiseStorage("user")
.then((res) => {
console.log(res);
user.value = res;
}).catch((err) => {});
})
.catch((err) => {});
});
onUpdated(() => {
// 组件更新后执行
@@ -80,8 +92,8 @@ onUnmounted(() => {
</script>
<style scoped>
.activate-email{
padding: 0;
.activate-email {
padding: 0;
margin: 0;
width: 100vw;
height: 100vh;
@@ -92,31 +104,31 @@ onUnmounted(() => {
justify-content: center;
align-items: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.activate-email-content{
font-size: 30px;
color: #4FCACD;
font-weight: bold;
.activate-email-content {
font-size: 30px;
color: #4fcacd;
font-weight: bold;
}
.activate-email-btn{
background-color: #4FCACD;
color: #fff;
font-size: 20px;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin-top: 50px;
.activate-email-btn {
background-color: #4fcacd;
color: #fff;
font-size: 20px;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin-top: 50px;
}
.activate-email-btn:hover{
box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.3);
transform: scale(1.08);
opacity: 0.8;
.activate-email-btn:hover {
box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.3);
transform: scale(1.08);
opacity: 0.8;
}
.activate-email-btn:active{
transition: all 0.1s ease;
transform: scale(0.95) !important;
.activate-email-btn:active {
transition: all 0.1s ease;
transform: scale(0.95) !important;
}
</style>
</style>

View File

@@ -102,12 +102,6 @@ const user = UserStore()
const info = ref({})
// 登录
function EmailLogin() {
// // 邮箱验证
// const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// if (!emailRegex.test(refEmail.value)) {
// ElMessage.error("请输入有效的邮箱地址");
// return;
// }
// 密码验证
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{6,16}$/;
if (!passwordRegex.test(refpassword.value)) {

View File

@@ -13,6 +13,7 @@ import { useRoute, useRouter } from "vue-router";
import { ref, watch, onMounted, onUpdated, onUnmounted, onBeforeMount } from "vue";
import { activeEmail } from "@/api/account";
import { setLocale } from "@/i18n";
import { setStorage , getStorage,getPromiseStorage } from '@/utils/storage.js';
//
import { useI18n } from "vue-i18n";
const { t } = useI18n();

View File

@@ -64,7 +64,7 @@
<script setup>
import { register,checkStatus,resendEmail,checkUsername} from "@/api/account"; // 导入登录接口
import { tokenStore, UserStore } from '@/stores/notice'
import { setStorage , getStorage } from '@/utils/storage.js';
import { setStorage , getStorage,getPromiseStorage } from '@/utils/storage.js';
import {
ref, // 响应式基础
watch, // 侦听器
@@ -110,13 +110,14 @@ function startCountdown() {
// 用户名失去焦点
function userNameBlur() {
if (userName.value.length < 6 || userName.value.length > 16 || userName.value == '' || userName.value == null) {
if (userName.value.length < 2 || userName.value.length > 16 || userName.value == '' || userName.value == null) {
ElMessage.error(t('TheLengthOfAUsernameCannotBeLessThan2CannotExceed16AndCannotBeEmpty'));
// gj用户名长度不能小于2不能大于16,不能为空
return;
}
checkUsername({ userName: userName.value }).then(res => {
if (res==false) {
if (res == false) {
ElMessage.error(t('TheUsernameAlreadyExists'));
// gj用户名已存在
userNamebtn.value = false
@@ -128,14 +129,9 @@ function userNameBlur() {
}
}).catch((err) => {});
}
//下一步
function nextStep() {
//用户名验证
if (userNamebtn.value == false) {
ElMessage.error(t('TheUsernameAlreadyExists'));
// gj用户名已存在
return;
}
// 邮箱验证
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
if (!emailRegex.test(Email.value)) {
@@ -153,7 +149,7 @@ function nextStep() {
}
//用户名验证
if (userName.value.length < 6 || userName.value.length > 16 || userName.value == '' || userName.value == null) {
if (userName.value.length < 2 || userName.value.length > 16 || userName.value == '' || userName.value == null) {
ElMessage.error(t('TheLengthOfAUsernameCannotBeLessThan2CannotExceed16AndCannotBeEmpty'));
// gj用户名长度不能小于2不能大于16,不能为空
return;

View File

@@ -63,6 +63,7 @@
<script setup>
import {forgetPassword} from "@/api/account"; // 导入登录接口
import { setStorage, getStorage, getPromiseStorage } from "@/utils/storage.js";
import {
ref, // 响应式基础
watch, // 侦听器

View File

@@ -62,7 +62,6 @@
@change="handleChange"
/>
</div>
<div class="Goldcoinbox-middle"></div>
<div class="Goldcoinbox-right">
<div class="Goldcoinbox-text">
{{ t("MaximumNumberOfGoldCoins") }}
@@ -105,7 +104,13 @@
? '5px 5px 5px rgba(0, 0, 0, 0.5)'
: 'none',
}"
></div>
>
<img class="search-img" src="../../assets/Search.png" alt="">
<div class="search-text">
{{ t("Search") }}
<!-- gj搜索 -->
</div>
</div>
<!-- 重置按钮 -->
<div
class="primary"
@@ -114,7 +119,15 @@
marginLeft: PKistodayorhall ? '0px' : '30px',
marginTop: PKistodayorhall ? '10px' : '0px',
}"
></div>
>
<img class="primary-img" src="../../assets/Reset.png" alt="">
<div class="primary-text">
{{ t('Reset') }}
<!-- gj重置 -->
</div>
</div>
</div>
</div>
</div>
@@ -1302,7 +1315,7 @@ function reset() {
// 计算滑块位置
const sliderPosition = computed(() => {
return PKistodayorhall.value ? "1%" : "13%";
return PKistodayorhall.value ? "0%" : "13%";
});
// 触摸事件处理
const touchStartX = ref(0);
@@ -1453,7 +1466,7 @@ onBeforeUnmount(() => {
margin-left: 50px;
}
.Goldcoinbox {
width: 330px;
width: 360px;
display: flex;
margin-top: -5px;
align-items: center;
@@ -1466,6 +1479,7 @@ onBeforeUnmount(() => {
.Goldcoinbox-right {
display: flex;
flex-direction: column;
margin-left: 10px;
}
.Goldcoinbox-text {
font-size: 10px;
@@ -1473,7 +1487,7 @@ onBeforeUnmount(() => {
}
.Goldcoinbox-middle {
border-bottom: 2px solid #b9b9b9;
width: 5px;
width: 10px;
height: 15px;
}
.timebox {
@@ -1492,17 +1506,40 @@ onBeforeUnmount(() => {
width: 80px;
height: 30px;
border-radius: 5px;
background-image: url(../../assets/Reset.png);
background-size: 100% 100%;
transition: all 0.4s ease;
border: 1px solid #03aba8;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content:space-around;
}
.primary-img{
width: 22px;
height: 20px;
}
.primary-text {
font-size: 14px;
color: #03aba8;
}
.search {
width: 80px;
height: 30px;
border-radius: 5px;
background-image: url(../../assets/Search.png);
background-size: 100% 100%;
transition: all 0.4s ease;
background-image: linear-gradient(0deg, #4FCACD, #5FDBDE);
display: flex;
align-items: center;
justify-content:space-around;
}
.search-img{
width: 20px;
height: 20px;
}
.search-text {
font-size: 14px;
color: #ffffff;
}
.search:active {
transition: all 0.1s ease;
@@ -1663,6 +1700,7 @@ onBeforeUnmount(() => {
font-size: 20px;
color: #03aba8;
font-weight: bold;
text-align: center;
}
.chat-name {
width: 100%;