优化代码

This commit is contained in:
pengxiaolong
2025-08-26 22:04:33 +08:00
parent 20cb7bc0d1
commit 50f3126fc1
13 changed files with 218 additions and 61 deletions

View File

@@ -45,7 +45,8 @@
<div class="add-anchor-library">
<div class="title">
<img class="titleimg" src="@/assets/embellish.png" alt="" />
<div>发布新PK</div>
<!-- gj发布新PK -->
<div>{{ t('ReleaseANewPK') }}</div>
<img class="titleimg" src="@/assets/embellish.png" alt="" />
</div>
<div class="add-anchor-library-content">
@@ -55,12 +56,13 @@
class="input-name-input"
v-model="anchorName"
size="large"
placeholder="请输入主播名称"
:placeholder="t('PleaseEnterTheNameOfTheHost')"
@blur="handleChange()"
/>
<!-- gj请输入主播名称 -->
<div class="myanchor">
<div class="myanchor-btn" @click="myAnchorDialogVisible = true">
选择我的主播
{{ t('ChooseMyStreamer') }}
</div>
</div>
</div>
@@ -70,11 +72,12 @@
v-model="countryvalue"
filterable
:options="country"
placeholder="请选择国家"
:placeholder="t('PleaseSelectACountry')"
size="large"
style="vertical-align: middle"
class="select"
/>
<!-- gj选择国家 -->
</div>
<div class="gender">
<!-- 性别 -->
@@ -83,29 +86,33 @@
filterable
:options="genderOptions"
size="large"
placeholder="请选择性别"
:placeholder="t('PleaseSelectGender')"
style="vertical-align: middle"
class="select"
/>
<!-- gj请选择性别 -->
</div>
<div class="timeselect">
<el-date-picker
v-model="timevalue"
type="datetime"
placeholder="选择PK时间"
:placeholder="t('SelectThePKTime')"
size="large"
style="width: 100%; height: 100%"
format="YYYY/MM/DD hh:mm"
value-format="x"
/>
<!-- gj请选择PK时间 -->
</div>
<div class="Gold-sessions">
<div class="Goldcoinbox-right">
<div class="Goldcoinbox-text">金币数单位为K</div>
<div class="Goldcoinbox-text">{{ t('NumberOfGoldCoins') }}</div>
<!-- gj金币提示 -->
<el-input-number v-model="goldvalue" controls-position="right" />
</div>
<div class="Goldcoinbox-right">
<div class="Goldcoinbox-text">场次</div>
<div class="Goldcoinbox-text">{{ t('Session') }}</div>
<!-- gj场次提示 -->
<el-input-number v-model="sessionnum" controls-position="right" />
</div>
</div>
@@ -116,17 +123,20 @@
class="textarea"
style="width: 100%; height: 100%"
maxlength="50"
placeholder="请输入备注(选填)"
:placeholder="t('PleaseEnterTheRemarks')"
/>
<!-- gj备注 -->
</div>
<div class="Confirm" @click="Confirm()">确认</div>
<div class="Reset" @click="Reset()">重置</div>
<div class="Confirm" @click="Confirm()">{{ t('Confirm') }}</div>
<!-- gj确认 -->
<div class="Reset" @click="Reset()">{{ t('Reset') }}</div>
<!-- gj重置 -->
</div>
</div>
</div>
</el-drawer>
<!-- 选择我的主播弹窗 -->
<el-dialog v-model="myAnchorDialogVisible" center title="选择我的主播库主播" width="800" align-center>
<el-dialog v-model="myAnchorDialogVisible" center :title="t('SelectTheStreamersFromMyStreamerLibrary')" width="800" align-center>
<div class="myanchor-content">
<div class="myanchor-list">
<div
@@ -152,7 +162,8 @@
background: item.gender == 1 ? '#59D8DB' : '#F3876F',
}"
>
{{ item.gender == 1 ? "男" : "女" }}
{{ item.gender == 1 ? t('man') : t('woman') }}
<!-- gj男女 -->
</div>
<div class="Country">{{ item.country }}</div>
</div>
@@ -161,12 +172,14 @@
</div>
</div>
<div class="myanchor-dialog-btn">
<div class="myAnchorDialogReset" @click="myAnchorDialogVisible = false">取消</div>
<div class="myAnchorDialogConfirm" @click="myAnchorDialogConfirm()">确认</div>
<div class="myAnchorDialogReset" @click="myAnchorDialogVisible = false">{{ t('Cancel') }}</div>
<!-- gj取消 -->
<div class="myAnchorDialogConfirm" @click="myAnchorDialogConfirm()">{{ t('Confirm') }}</div>
<!-- gj确认 -->
</div>
</div>
</el-dialog>
<el-dialog v-model="settingsVisible" center title="设置" width="800" align-center>
<el-dialog v-model="settingsVisible" center :title="t('Settings')" width="800" align-center>
<div class="settings-content">
<!-- 头像设置 -->
<div class="avatar-setting">
@@ -179,55 +192,64 @@
>
<img :src="avatar" class="avatar" />
</el-upload>
<div class="Hint">点击上方头像修改头像</div>
<div class="Hint">{{ t('ClickOnTheAvatarAboveToModifyIt') }}</div>
<!-- gj点击头像修改 -->
</div>
<!-- 昵称设置 -->
<div class="nickname-setting">
<input type="text" class="nickname-input" v-model="info.nickName" @blur="handleNickNameChange"/>
<div class="Hint">点击输入修改昵称</div>
<div class="Hint">{{ t('ClickToEnterAndModifyYourNickname') }}</div>
<!-- gj点击昵称修改 -->
</div>
<div class="email-setting" @click="ResendEmail" v-if="info.mailVerification == 1 && info.email != null">
<div v-if="isResendEmail == 0">
{{info.email}}重发邮箱验证
{{t('ResendTheEmailTo')}}{{""+info.email+""}}{{t('ForVerification')}}
<!-- gj重新发送邮件 -->
</div>
<div v-if="isResendEmail == 1">
{{timeLeft}}
</div>
</div>
<!-- 邮箱设置 -->
<div class="email-setting" v-if="info.email != null" @click="emailVisiblefu">修改邮箱{{info.email}}</div>
<div class="email-setting" v-if="info.email != null" @click="emailVisiblefu">{{t('ModifyTheEmailAddress')}}{{""+info.email+""}}</div>
<!-- gj点击邮箱修改 -->
<!-- 密码设置 -->
<div class="password-setting" v-if="info.email != null" @click="passwordVisiblefn">修改密码</div>
<div class="password-setting" v-if="info.email != null" @click="passwordVisiblefn">{{ t('ChangePassword') }}</div>
<!-- gj点击密码修改 -->
</div>
</el-dialog>
<!-- 修改密码弹窗 -->
<el-dialog v-model="passwordVisible" center title="修改密码" width="600" align-center>
<el-dialog v-model="passwordVisible" center :title="t('ChangePassword')" width="600" align-center>
<!-- gj修改密码 -->
<div class="password-content">
<el-input
type="password"
v-model="password"
placeholder="请输入旧密码"
:placeholder="t('PleaseEnterTheOldPassword')"
size="large"
class="password-input"
show-password
/>
<!-- gj请输入旧密码 -->
<el-input
type="password"
v-model="newPassword"
placeholder="请输入新密码"
:placeholder="t('PleaseEnterTheNewPassword')"
size="large"
class="password-input"
show-password
/>
<!-- gj请输入新密码 -->
<el-input
type="password"
v-model="confirmPassword"
placeholder="请确认新密码"
:placeholder="t('PleaseEnterTheConfirmPassword')"
size="large"
class="password-input"
show-password
/>
<div class="password-btn" @click="changePassword()">确定</div>
<div class="password-btn" @click="changePassword()">{{ t('Confirm') }}</div>
<!-- gj确认 -->
</div>
</el-dialog>
<!-- 修改邮箱弹窗 -->
@@ -303,6 +325,11 @@ import {
import { goeasy } from "../main";
import GoEasy from "goeasy";
var im = goeasy.im;
//
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
window['$t'] = t
//
const info = ref({}); // 用户信息
const avatar = ref(null); //头像
const country = ref([]);
@@ -321,19 +348,21 @@ const sessionnum = ref(null); // 场次
const remark = ref(null); // 备注
const Avatarlist = [
{
name:'签到',
// gj签到
name:t('SignIn'),
id:1
},
{
name: '设置',
//gj设置
name: t('Settings'),
id: 2,
},
{
name: '联系客服(点击复制邮箱)',
name: t('ContactCustomerService'),
id: 3,
},
{
name: '退出登录',
name: t('Logout'),
id: 4,
}
]
@@ -346,21 +375,24 @@ const NavigationModule = [
Selectedicon:'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/SelectPKpage.png'
},
{
name: '站内信',
//gj论坛
name: t('InSiteMessage'),
id: 2,
path: '/nav/Forum',
icon: 'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Forum.png',
Selectedicon:'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Selectinsitemessagepage.png'
},
{
name: '消息',
//gj消息
name: t('message'),
id: 3,
path: '/nav/Message',
icon: 'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Message.png',
Selectedicon:'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Selectmessagepage.png'
},
{
name: '我的',
//gj我的
name: t('Mine'),
id: 4,
path: '/nav/Mine',
icon: 'https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Mine.png',
@@ -918,6 +950,7 @@ onUnmounted(() => {
font-size: 12px;
color:@Prompt-text-color;
margin-top: 5px;
text-align: center;
}
.redDot{

View File

@@ -20,6 +20,7 @@ import { ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { setLocale } from '@/i18n'
const { locale } = useI18n()
const currentLanguage = ref(locale.value)

View File

@@ -97,7 +97,8 @@
<div class="add-anchor-library">
<div class="title">
<img class="titleimg" src="@/assets/embellish.png" alt="" />
<div v-if="!modifyDialogstate">发布新PK</div>
<!-- gj发布新PK -->
<div v-if="!modifyDialogstate">{{ t('ReleaseANewPK') }}</div>
<div v-if="modifyDialogstate">修改PK信息</div>
<img class="titleimg" src="@/assets/embellish.png" alt="" />
</div>
@@ -108,12 +109,13 @@
class="input-name-input"
v-model="anchorName"
size="large"
placeholder="请输入主播名称"
:placeholder="t('PleaseEnterTheNameOfTheHost')"
@blur="handleChange()"
/>
<!-- gj请输入主播名称 -->
<div class="myanchor">
<div class="myanchor-btn" @click="myAnchorDialogVisible = true">
选择我的主播
{{ t('ChooseMyStreamer') }}
</div>
</div>
</div>
@@ -123,11 +125,12 @@
v-model="countryvalue"
filterable
:options="country"
placeholder="请选择国家"
:placeholder="t('PleaseSelectACountry')"
size="large"
style="vertical-align: middle"
class="select"
/>
<!-- gj选择国家 -->
</div>
<div class="gender">
<!-- 性别 -->
@@ -136,29 +139,33 @@
filterable
:options="genderOptions"
size="large"
placeholder="请选择性别"
:placeholder="t('PleaseSelectGender')"
style="vertical-align: middle"
class="select"
/>
<!-- gj请选择性别 -->
</div>
<div class="timeselect">
<el-date-picker
v-model="timevalue"
type="datetime"
placeholder="选择PK时间"
:placeholder="t('SelectThePKTime')"
size="large"
style="width: 100%; height: 100%"
format="YYYY/MM/DD hh:mm"
value-format="x"
/>
<!-- gj请选择PK时间 -->
</div>
<div class="Gold-sessions">
<div class="Goldcoinbox-right">
<div class="Goldcoinbox-text">金币数单位为K</div>
<div class="Goldcoinbox-text">{{ t('NumberOfGoldCoins') }}</div>
<!-- gj金币提示 -->
<el-input-number v-model="goldvalue" controls-position="right" />
</div>
<div class="Goldcoinbox-right">
<div class="Goldcoinbox-text">场次</div>
<div class="Goldcoinbox-text">{{ t('Session') }}</div>
<!-- gj场次提示 -->
<el-input-number v-model="sessionnum" controls-position="right" />
</div>
</div>
@@ -169,11 +176,14 @@
class="textarea"
style="width: 100%; height: 100%"
maxlength="50"
placeholder="请输入备注(选填)"
:placeholder="t('PleaseEnterTheRemarks')"
/>
<!-- gj备注 -->
</div>
<div class="Confirm" @click="Confirm()">确认</div>
<div class="Reset" @click="Reset()">重置</div>
<div class="Confirm" @click="Confirm()">{{ t('Confirm') }}</div>
<!-- gj确认 -->
<div class="Reset" @click="Reset()">{{ t('Reset') }}</div>
<!-- gj重置 -->
<div class="Reset" v-if="modifyDialogstate" @click="cancel()">取消</div>
</div>
</div>
@@ -300,7 +310,11 @@ import { getCountryNamesArray } from "../../utils/countryUtil";
import { ElLoading } from "element-plus";
import { ElMessage } from "element-plus";
import { setStorage, getStorage, getPromiseStorage } from "@/utils/storage.js";
//
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
window['$t'] = t
//
const country = ref([]);
country.value = getCountryNamesArray(); //国家条目
const genderOptions = [

33
src/i18n/en/Appaside.json Normal file
View File

@@ -0,0 +1,33 @@
{
"InSiteMessage": "In-site message",
"Mine": "Mine",
"SignIn": "Sign in",
"message": "message",
"Settings": "Settings",
"ContactCustomerService": "Contact customer service (click to copy the email address)",
"Logout": "Log out",
"ReleaseANewPK": "Release a new PK",
"PleaseEnterTheNameOfTheHost": "Please enter the name of the host",
"ChooseMyStreamer": "Choose mine",
"PleaseSelectACountry": "Please select a country",
"PleaseSelectGender": "Please select gender",
"SelectThePKTime": "Select the PK time",
"NumberOfGoldCoins": "The number of gold coins (in K)",
"Session": "Session",
"PleaseEnterTheRemarks": "Please enter the remarks (optional)",
"Confirm": "Confirm",
"Reset": "Reset",
"Cancel": "Cancel",
"SelectTheStreamersFromMyStreamerLibrary": "Select the streamers from my streamer library",
"man": "man",
"woman": "woman",
"ClickOnTheAvatarAboveToModifyIt": "Click on the avatar above to modify it",
"ClickToEnterAndModifyYourNickname": "Click to enter and modify your nickname",
"ResendTheEmailTo": "Resend the email to",
"ForVerification": "for verification",
"ModifyTheEmailAddress": "Modify the email address",
"ChangePassword":"Change password",
"PleaseEnterTheOldPassword": "Please enter the old password",
"PleaseEnterTheNewPassword": "Please enter the new password",
"PleaseEnterTheConfirmPassword": "Please enter the confirm password"
}

View File

@@ -1,9 +1,11 @@
import login from './login.json'
import Appaside from './Appaside.json'
const global = {
logout: 'Logout',
}
export default {
...global,
...login
...login,
...Appaside
}

View File

@@ -2,5 +2,11 @@
"login": "Login",
"Welcome_to_login": "Welcome to login",
"PleaseEnterEmailOrUsername": "Please enter email or username",
"PleaseEnterPassword": "Please enter password"
"PleaseEnterPassword": "Please enter password",
"WechatMiniProgramLogin": "Wechat Mini Program Login",
"LogInByScanningTheQRCodeWithTheWechatMini-program":"Log in by scanning the QR code with the wechat mini-program",
"DontHaveAnAccountYet":"Don't have an account yet?",
"Register":"Register",
"AlreadyHaveAnAccount":"Already have an account?",
"ForgotPassword":"Forgot password?"
}

View File

@@ -3,11 +3,12 @@
import { createI18n } from 'vue-i18n' //引入vue-i18n组件
import zh from './zh/index'
import en from './en/index'
import { setStorage , getStorage } from '@/utils/storage.js';
const i18n = createI18n({
legacy: false,
globalInjection:true,
locale: "ZH", // Default language
locale: getStorage('language') || "ZH", // Default language
fallbackLocale: "EN", // Fallback to English if translation missing
messages: {
ZH: zh,
@@ -19,7 +20,8 @@ const i18n = createI18n({
export function setLocale(lang) {
if (['ZH', 'EN'].includes(lang)) {
i18n.global.locale.value = lang
setStorage('language', lang)
}
}
export default i18n
export default i18n

33
src/i18n/zh/Appaside.json Normal file
View File

@@ -0,0 +1,33 @@
{
"InSiteMessage":"站内信",
"Mine":"我的",
"SignIn":"签到",
"message":"消息",
"Settings":"设置",
"ContactCustomerService":"联系客服(点击复制邮箱)",
"Logout":"退出登录",
"ReleaseANewPK":"发布新PK",
"PleaseEnterTheNameOfTheHost":"请输入主播名称",
"ChooseMyStreamer":"选择我的主播",
"PleaseSelectACountry":"请选择国家",
"PleaseSelectGender":"请选择性别",
"SelectThePKTime":"选择PK时间",
"NumberOfGoldCoins":"金币数单位为K",
"Session":"场次",
"PleaseEnterTheRemarks":"请输入备注(选填)",
"Confirm":"确认",
"Reset":"重置",
"Cancel":"取消",
"SelectTheStreamersFromMyStreamerLibrary":"选择我的主播库主播",
"man":"男",
"woman":"女",
"ClickOnTheAvatarAboveToModifyIt":"点击头像上方修改头像",
"ClickToEnterAndModifyYourNickname":"点击输入修改昵称",
"ResendTheEmailTo":"向",
"ForVerification":"重发邮箱验证",
"ModifyTheEmailAddress":"修改邮箱",
"ChangePassword":"修改密码",
"PleaseEnterTheOldPassword":"请输入旧密码",
"PleaseEnterTheNewPassword":"请输入新密码",
"PleaseEnterTheConfirmPassword":"请再次输入新密码"
}

View File

@@ -1,9 +1,11 @@
import login from './login.json'
import Appaside from './Appaside.json'
const global = {
logout: '退出登录',
}
export default {
...global,
...login
...login,
...Appaside
}

View File

@@ -2,5 +2,11 @@
"login": "登录",
"Welcome_to_login": "欢迎登录",
"PleaseEnterEmailOrUsername": "请输入邮箱或用户名",
"PleaseEnterPassword": "请输入密码"
"PleaseEnterPassword": "请输入密码",
"WechatMiniProgramLogin": "微信小程序登录",
"LogInByScanningTheQRCodeWithTheWechatMini-program": "使用微信小程序扫描二维码登录",
"DontHaveAnAccountYet":"还没有账号?",
"Register": "注册",
"AlreadyHaveAnAccount": "已有账号?",
"ForgotPassword": "忘记密码?"
}

View File

@@ -20,7 +20,7 @@ export function getPromiseStorage(key) {
try {
resolve(JSON.parse(data));
} catch {
reject(data);
resolve(data);
}
});
}

View File

@@ -16,6 +16,7 @@
</div>
<!-- 标题 -->
<div v-if="!refSwitch" class="container">
<!-- gj欢迎登录 -->
<div class="title">{{ t('Welcome_to_login') }}</div>
<div class="striping"></div>
<div class="input-Email">
@@ -29,6 +30,7 @@
:placeholder="t('PleaseEnterEmailOrUsername')"
@keydown.enter.native="EmailLogin"
/>
<!-- gj请输入邮箱或用户名 -->
</div>
<div class="input-Password">
<img class="Passwordimg" src="../assets/Password.png" alt="" />
@@ -42,25 +44,33 @@
:placeholder="t('PleaseEnterPassword')"
@keydown.enter.native="EmailLogin"
/>
<!-- gj请输入密码 -->
</div>
<div class="login-btn" @click="EmailLogin">{{ t('login') }}</div>
<!-- gj登录 -->
</div>
<!-- 微信登录 -->
<div v-if="refSwitch" class="container">
<div class="title">微信小程序登录</div>
<!-- gj微信登录 -->
<div class="title">{{ t('WechatMiniProgramLogin') }}</div>
<div class="striping"></div>
<img class="qrcode" :src="Qrcode.qrcode" alt="" />
<div class="qrcode-text">使用微信小程序扫描二维码登录</div>
<!-- gj通过微信小程序扫描二维码登录 -->
<div class="qrcode-text">{{ t('LogInByScanningTheQRCodeWithTheWechatMini-program') }}</div>
</div>
</div>
<div class="register" v-if="!refSwitch">
<div class="register-content">
<div class="register-text">还没有账号</div>
<div class="register-btn" @click="register">注册</div>
<!-- gj还没有账号 -->
<div class="register-text">{{ t('DontHaveAnAccountYet') }}</div>
<!-- gj注册 -->
<div class="register-btn" @click="register">{{ t('Register') }}</div>
</div>
<div class="register-content">
<div class="register-text">已有账号</div>
<div class="register-btn" @click="forgetPassword">忘记密码</div>
<!-- gj已有账号 -->
<div class="register-text">{{ t('AlreadyHaveAnAccount') }}</div>
<!-- gj忘记密码 -->
<div class="register-btn" @click="forgetPassword">{{ t('ForgotPassword') }}</div>
</div>
</div>
</div>
@@ -238,10 +248,10 @@ onUnmounted(() => {
align-items: center;
}
.register {
width: 627px;
width: 730px;
height: 40px;
display: flex;
justify-content:space-between;
justify-content:space-around;
}
.register-text {
font-size: 18px;

View File

@@ -15,14 +15,16 @@
<script setup>
import Appaside from "/src/components/Appaside.vue";
import { ref, watch, onMounted, onUnmounted } from "vue";
import { ref, watch, onMounted, onUnmounted,onBeforeMount } from "vue";
import { getOtp } from "@/api/account";
const user = ref(null); // 用户信息
import { goEasyLink } from "@/utils/goeasy.js";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import {getPromiseStorage } from "@/utils/storage.js";
import { setLocale } from '@/i18n'
const router = useRouter();
const language = ref(null); // 语言
//自动链接IM
function autoLinkIM() {
getOtp()
@@ -48,6 +50,19 @@ function autoLinkIM() {
});
}
onBeforeMount(() => {
// 语言
getPromiseStorage("language")
.then((res) => {
console.log("获取语言成功", res);
language.value = res;
setLocale(language.value);
})
.catch((err) => {
console.log("获取语言失败", err);
});
});
onMounted(() => {
getPromiseStorage("user")
.then((res) => {