Commit f089bd69 by kaisa

Sopweb

parents
# 应用端口
VITE_APP_PORT=8000
VITE_APP_REMARK="dev"
# 代理前缀
VITE_APP_BASE_API="/api"
# 接口地址
VITE_APP_API_URL="https://ceshi.yabolive.tv/web"
# 版本线上地址
VITE_APP_VERSION_URL="https://ceshi.yabolive.tv"
# 活动线上地址
VITE_APP_ACTIVE_URL="http://testactweb.yabolive.tv/web"
# TIPS:由于部署配置问题,此项目生产与测试公用同一个配置文件,更新生产时需要注意替换
# 应用端口
VITE_APP_PORT=8000
VITE_APP_REMARK="pro"
# 代理前缀
VITE_APP_BASE_API="https://ceshi.yabolive.tv/web"
# VITE_APP_BASE_API="https://webserver.yabolive.net"
# 接口地址
VITE_APP_API_URL="https://ceshi.yabolive.tv/web"
# VITE_APP_API_URL="https://webserver.yabolive.net"
# 版本线上地址
VITE_APP_VERSION_URL="http://ceshi.yabolive.tv"
# VITE_APP_VERSION_URL="https://events.yabolive.net"
# 活动线上地址
VITE_APP_ACTIVE_URL="http://testactweb.yabolive.tv/web"
# VITE_APP_ACTIVE_URL="https://actweb.yabolive.net"
# 应用端口
VITE_APP_PORT=8000
# 代理前缀
VITE_APP_BASE_API="https://ceshi.yabolive.tv/web"
# 接口地址
VITE_APP_API_URL="https://ceshi.yabolive.tv/web"
VITE_APP_REMARK="test"
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
{
"recommendations": ["Vue.volar"]
}
# Vue 3 + TypeScript + Vite
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no viewport-fit=cover" />
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta content="telephone=no" name="format-detection">
<meta name="wap-font-scale" content="no">
<title></title>
<script src="https://app.ixiulive.com/static/js/fsize.js"></script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
<script type="text/javascript" src="https://app.ixiulive.com/static/js/webAppComm.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "fireflyWebApp",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@vant/use": "^1.6.0",
"@vueuse/core": "^10.11.1",
"axios": "^1.7.7",
"echarts": "^5.5.1",
"html2canvas": "^1.4.1",
"jquery": "^3.7.1",
"moment": "^2.30.1",
"pinia": "^2.2.4",
"postcss-pxtorem": "^6.1.0",
"qs": "^6.13.0",
"socket.io-client": "^4.8.1",
"swiper": "^11.2.10",
"terser": "^5.39.0",
"vant": "^4.9.16",
"vconsole": "^3.15.1",
"vue": "^3.5.13",
"vue-i18n": "^11.1.1",
"vue-router": "^4.4.5",
"vue3-count-to": "^1.1.2",
"websocket": "^1.0.35",
"ws": "^8.18.0"
},
"devDependencies": {
"@commitlint/cli": "^19.5.0",
"@commitlint/config-conventional": "^19.5.0",
"@types/moment": "^2.13.0",
"@types/node": "^22.7.4",
"@types/postcss-pxtorem": "^6.1.0",
"@vitejs/plugin-vue": "^5.2.1",
"commitizen": "^4.3.1",
"cz-git": "1.9.4",
"husky": "^9.1.6",
"postcss": "^8.4.47",
"postcss-html": "^1.7.0",
"postcss-scss": "^4.0.9",
"prettier": "^3.3.3",
"sass": "^1.79.5",
"typescript": "~5.6.2",
"unplugin-auto-import": "^0.18.3",
"unplugin-vue-components": "^0.27.4",
"vite": "^6.0.5",
"vite-plugin-compression": "^0.5.1",
"vue-tsc": "^2.2.0"
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
<script setup lang="ts">
</script>
<template>
<RouterView />
</template>
<style scoped>
</style>
import request from "@/utils/request";
import type { ReturnReq } from "../types";
import { handleQueryParams } from '@/utils/common'
const queryParams = handleQueryParams()
let lang;
if (queryParams.lang == '0' || queryParams.lang == '2') {
lang = 2
} else {
lang = 1
}
// 获取用户信息
export const getUser = (data: { target: number }): Promise<ReturnReq> => {
return request({
method: "post",
url: "/data/getUser",
data: {
lang,
target: data.target
}
});
}
// 请求公共类型
export interface ReturnReq {
code: string | number;
msg: string;
result?: any;
data?: any,
view?: any;
}
// 请求必传参数
export interface NeedParams {
token: string,
uid: string,
lang: string,
vest: string,
cid: string,
os: string
}
\ No newline at end of file
/* 极速狂飙距离字体 */
@font-face {
font-family: 'leading-title';
src: url('./TT0663M_.TTF');
font-weight: normal;
font-style: normal;
}
\ No newline at end of file
/*初始化 reset*/
@charset "utf-8";
body,
div,
dl,
dt,
dd,
ul,
ol,
li,
h1,
h2,
h3,
h4,
h5,
h6,
pre,
form,
input,
button,
textarea,
select,
p,
span,
font,
em,
i,
b,
strong,
button {
margin: 0;
padding: 0;
}
body {
margin: 0;
font-family: "Microsoft YaHei", Arial, Helvetica, sans-serif, "宋体";
overflow: visible;
color: #333333;
}
html,
body {
height: 100%;
}
input,
select {
font-size: 12px;
line-height: 16px;
border: 0 none;
vertical-align: middle;
}
button {
border: 0 none;
}
.clear {
clear: both;
padding: 0px;
margin: 0px;
}
img {
border: 0;
}
a {
outline: none;
}
a:active {
star: expression(this.onFocus=this.blur());
}
a:focus {
outline: 0;
}
input,
button,
select,
textarea {
outline: none
}
ul,
li {
list-style-type: none;
_list-style: outside;
}
a {
text-decoration: none;
color: #333;
}
a:hover {
color: #ff6600;
}
/* new clearfix清除浮动 */
.clearfix:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
.clearfix {
display: block;
zoom: 1
}
* html .clearfix {
height: 1%;
zoom: 1;
}
/* IE6 */
*:first-child+html .clearfix {
zoom: 1;
}
/* IE7 */
html[xmlns] .clearfix {
display: block;
zoom: 1
}
/*清除浮动-end*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: normal
}
/*这一句是用来解决在安卓上的点击出现篮框问题*/
body {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/*下面是解决ios上去除微信点击蓝色边框 */
a:focus,
input:focus,
p:focus,
div:focus {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-modify: read-only;
}
/*清除浮动*/
.w {
width: 1200px;
margin: 0 auto;
}
button {
cursor: pointer;
outline: none;
}
input[type=number] {
-moz-appearance: textfield;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
::-webkit-scrollbar {
display: none;
}
/*版芯*/
/*多语言*/
.L-Cn,
.L-En,
.L-Cn,
.L-Ta,
.L-Jp {
display: none;
}
\ No newline at end of file
// 等级头像
.level1 {
background: url(/src/views/rank/images/avatar/1.webp) no-repeat;
background-size: contain;
}
.level2 {
background: url(/src/views/rank/images/avatar/11.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level3 {
background: url(/src/views/rank/images/avatar/21.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level4 {
background: url(/src/views/rank/images/avatar/31.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level5 {
background: url(/src/views/rank/images/avatar/41.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level6 {
background: url(/src/views/rank/images/avatar/46.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level7 {
background: url(/src/views/rank/images/avatar/51.webp) no-repeat;
background-size: contain;
background-position: center;
}
.level8 {
background: url(/src/views/rank/images/avatar/52.webp) no-repeat;
background-size: contain;
background-position: center;
}
.noData {
font-size: 0.4rem;
color: #fff;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.noData::before {
width: 1.707rem;
height: 2.28rem;
background: url(/src/views/rank/images/noData.png) no-repeat;
background-size: contain;
position: absolute;
top: -2.4rem;
left: 50%;
transform: translateX(-50%);
content: "";
}
// 灰色滤镜
.is_gray {
filter: grayscale(1);
}
\ No newline at end of file
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
min-width: 540px;
min-height: 100vh;
/* background: #12121a; */
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
width: 100%;
}
/* 在你的全局 CSS 文件中添加以下样式 */
.van-toast__text {
padding: 8px;
font-size: 0.4rem !important;
/* 调整字体大小 */
}
.van-popup {
background: rgba(0, 0, 0, 0.7) !important;
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
\ No newline at end of file
import { createI18n } from "vue-i18n";
import zhHk from "./language/zh-hk";
import zhSim from "./language/zh-sim";
import en from './language/en'
import ar from "./language/ar";
import id from "./language/id";
import ja from "./language/ja";
import th from "./language/th";
import vi from "./language/vi";
import { handleQueryParams } from '@/utils/common'
const queryParams: any = handleQueryParams()
// 默认语言
const defaultLocale = () => {
const languageMap: Record<number | string, string> = {
0: 'zhSim', // 简体中文
1: 'en', // 英语
2: 'zhHk', // 繁体中文(同 0)
3: 'th', // 泰语
4: 'ja', // 日语
5: 'id', // 印尼文
7: 'ar', // 阿语
8: 'vi' // 越南语
};
return languageMap[queryParams.lang];
}
const i18n = createI18n({
locale: defaultLocale(),
legacy: false,
messages: { zhSim, en, zhHk, ar, id, ja, th, vi }
})
export default i18n
// 阿拉伯语
export default {
/* SOP主播招募 */
recruitment: {
lang1: "مساعد مباشر",
lang2: "إذا كنتَ لاعبًا مقيدًا كمساعد مباشر، فسيحصل اللاعب على حصتك من نقاط FIRE التي حصلتَ عليها.",
lang3: "مساعد مباشر مقيد",
lang4: "أدخل المُعرِّف لتأكيد اللاعب المقيد.",
lang5: "أدخل معرف اللاعب الذي تريد ربطه",
lang6: "الخطوة التالية",
lang7: "نسبة حصة FIREs",
lang8: "تعليمات الربط",
lang9: "بعد ربط مساعدك المباشر، سيستلم مساعدك المباشر حصة من نقاط FIRE التي تجمعها. سيتم إرسال نقاط FIRE التي تجمعها من خلال الهدايا إلى مساعدك المباشر وفقًا لنسبة حصة نقاط FIRE التي حددتها.",
lang10: "تم",
lang11: "ربط مساعدك المباشر",
lang12: "تأكيد الربط؟",
lang13: "مساعدك المباشر",
lang14: "إلغاء",
lang15: "تم الربط بنجاح",
lang16: "فشل الربط",
lang17: "تم فك الارتباط بنجاح",
lang18: "فشل فك الارتباط",
lang19: "إذا كنتَ لاعبًا مقيدًا كمساعد مباشر، فسيحصل اللاعب على حصتك من نقاط FIRE التي حصلتَ عليها.",
lang20: "مساعدي المباشر",
lang21: "فك الارتباط",
lang22: "في انتظار التأكيد",
lang23: "فك ارتباط مساعدك المباشر",
lang24: "يتطلب فك الارتباط من مساعد مباشر تأكيدًا من الطرف الآخر. هل تريد فك الارتباط؟",
lang25: "مساعدك المباشر؟",
lang26: "تم رفض فك الارتباط",
lang27: "رفض فك الارتباط، فشل",
lang28: "إعدادات مساعدك المباشر",
lang29: "\u200f الحصول على FIREs\u200f",
lang30: "قام الطرف الآخر بفك ارتباطك بمساعدك المباشر؛ يتطلب تأكيدك.",
lang31: "طلب فك الارتباط",
lang32: "تم تطبيق العكس على إلغاء ربط حساب مساعدك المباشر. يرجى التأكيد.",
lang33: "رفض",
lang34: "قائمة المُذيعين الذين ربطوني كمساعد مباشر",
lang35: "لم يتم ربط أي لاعبين بعد",
lang36: "فك ارتباط مساعدك المباشر",
lang37: "هل تريد فك الارتباط؟",
lang38: "ما هي علاقتك بمساعد مباشر؟",
lang39: "لقد تم حظر المستخدم.",
lang40: "لقد فشل البحث عن المعرف الذي أدخلته.",
},
};
// 英文
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
// 印尼语
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
// 日语
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
// 泰语
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
// 越南语
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
// 繁中
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
/* 简中 */
export default {
/* SOP主播招募 */
recruitment: {
lang1: "活動規則",
lang2: "實況",
lang3: "往期",
lang4: "您已放棄今日參賽",
lang5: "放棄今日參數失敗",
lang6: "放棄參賽",
lang7: "我的排名",
lang8: "勝場",
lang9: "參賽説明",
lang10: "請晉級半決賽/決賽的主播在半決賽/決賽開始的時間保持開播狀態且未在PK中,系統將自動發起半決賽/決賽雙方主播的PK。",
lang11: "半決賽",
lang12: "5局3勝制,獲勝主播晉級決賽",
lang13: "海選No.1 VS 海選No.4",
lang14: "海選No.2 VS 海選No.3",
lang15: "決賽",
lang16: "5局3勝制,獲勝主播成為當日「熒光夜間選秀」冠軍",
lang17: "半決賽勝者",
lang18: "注:如果您滿足半決賽/決賽參與條件但無法參與,請在每天20:30之前點擊",
lang19: "放棄參賽 >",
lang20: "缺席比賽將在未來14天無法參加「熒光夜間選秀」活動",
lang21: "放棄參賽",
lang22: "放棄參賽將退出海選階段排名,次日將恢復您的參賽資格。",
lang23: "是否放棄參加今日",
lang24: "的「熒光夜間選秀」活動",
lang25: "取消",
lang26: "確認",
lang27: "勝場",
lang28: "未完賽",
lang29: "暫無往期記錄",
lang30: "參與「熒光夜間選秀」",
lang31: "主播使用FIREFLY V54.0以上版本開啟PK(包含「人氣PK」和「遊戲PK」),即可參加「熒光夜間選秀」活動。",
lang32: "海選",
lang33: "時間:每日23:00-次日20:30",
lang34: "規則:榜單記錄主播當日參與PK的最高人氣值,以當日PK場次的最高人氣值進行排名",
lang35: "晉級:截止每日20:30,海選前4名主播晉級半決賽",
lang36: "放棄參賽:如果主播無法在半決賽/決賽的指定時間開播,可以在海選時間段內選擇放棄參賽。主播放棄參賽後排名下一位的主播將頂上。",
lang37: "半決賽",
lang38: "時間:每日21:00/21:20",
lang39: "規則:系統將在指定時間自動發起半決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang40: "晉級:贏家將晉級決賽",
lang41: "放棄參賽:主播在半決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang42: "半決賽1:海選No.1 vs 海選 No.4",
lang43: "半決賽2:海選No.2 vs 海選 No.3",
lang44: "半決賽失敗方根據當日最高人氣值排名,決出No.3/No.4",
lang45: "決賽",
lang46: "時間:每日22:00",
lang47: "規則:系統將在指定時間自動發起決賽雙方主播的PK,PK規則為「人氣PK」5局3勝制。請主播在此時間內保持開播狀態。",
lang48: "晉級:贏家獲得當日「熒光夜間選秀」冠軍",
lang49: "放棄參賽:主播在決賽開始時未在開播狀態,視為放棄參賽。無法獲得名次獎勵,並在未來15天無法再次參與「熒光夜間選秀」",
lang50: "決賽勝利方為當日冠軍,失敗方為當日No.2",
lang51: "獎勵",
lang52: "玩家露水獎勵:",
lang53: "半決賽1:獲勝方的隊伍將平分",
lang54: "半決賽2:獲勝方的隊伍將平分",
lang55: "決賽:獲勝方的隊伍將平分",
lang56: "主播積分獎勵:",
lang57: "參與半決賽/決賽的主播,決出勝負之後,前4名可以獲得「直播獎勵」的積分。放棄參賽的主播將無法獲得積分獎勵。具體積分請查看",
lang58: "「直播獎勵」>",
lang59: "注意事項",
lang60: "1.活動僅限女性主播參與",
lang61: "2.被限制活動參與資格期間,所有活動數據均為無效數據,需在接觸限制後重新獲取",
lang62: "3.主播需積極與玩家互動,有違反《主播直播公約》以及破壞活動平衡的行為,平台有權取消其活動資格以及活動積分(包括但不限於掛臉直播、無質量、黑屏、掛機、直播打遊戲、看電視等)",
lang63: "4. 活動最終解釋權歸平台所有",
lang64: "海選中",
lang65: "23:00-次日20:30",
lang66: "開啓PK即可參與海選排名,榜單記錄當日PK最高任期至,排名前4名晉級半決賽",
lang67: "晋级区",
lang68: "暫無海選記錄",
lang69: "「FIREFLY」您預約了熒光夜間選秀決賽",
lang70: "每天21:00-23:00,PK贏露水獎勵",
lang71: "決賽主播未決出",
lang72: "半决赛主播未决出",
lang73: "半決賽勝者",
lang74: "海选 NO.1",
lang75: "海选 NO.2",
lang76: "海选 NO.3",
lang77: "海选 NO.4",
lang78: "订阅提醒 >",
lang79: "獲勝隊伍獎勵",
lang80: "五局三胜",
}
};
\ No newline at end of file
import { createApp } from "vue";
import { createPinia } from "pinia";
import router from "@/router";
import i18n from "./locales";
import "@/assets/styles/index.css";
import "@/assets/styles/base.css";
import App from "./App.vue";
import VConsole from "vconsole";
import Vant from "vant";
import "vant/lib/index.css"; // 引入 Vant 的全局样式
import '@/assets/fonts/fonts.css' // 引入自定义字体
// 初始化 vConsole
if (process.env.NODE_ENV === "development") {
// 只在开发环境中引入 VConsole
const vConsole = new VConsole();
}
createApp(App).use(Vant).use(router).use(i18n).use(createPinia()).mount("#app");
import type { App } from "vue";
import {
createRouter,
createWebHistory,
type RouteRecordRaw,
} from "vue-router";
export const constantRoutes: RouteRecordRaw[] = [
/* SOP主播招募 */
{
path: "/activity/recruitment",
name: "recruitment",
component: () => import("@/views/activity/recruitment/index.vue"),
meta: { title: "主播招募" },
}
];
/**
* 创建路由
*/
const router = createRouter({
history: createWebHistory(),
routes: constantRoutes,
// 刷新时,滚动条位置还原
scrollBehavior: () => ({ left: 0, top: 0 }),
});
// 全局注册 router
export function setupRouter(app: App<Element>) {
app.use(router);
}
export default router;
export { };
/**
* 全局变量
*/
declare global {
interface Window {
$firefly: any;
goShare: () => void;
openExtra: () => void;
}
}
\ No newline at end of file
/* 复制文本 */
export function copyToClipboardOld(text: string) {
// 创建一个临时textarea元素
const textarea = document.createElement("textarea");
// 将文本设置为textarea的值
textarea.value = text;
// 将textarea添加到文档中
document.body.appendChild(textarea);
// 选中textarea中的文本
textarea.select();
textarea.setSelectionRange(0, textarea.value.length); // 对于移动设备,确保选择区域
// 执行复制命令
const successful = document.execCommand("copy");
// 移除临时textarea元素
document.body.removeChild(textarea);
if (successful) {
console.log("文本已复制到剪贴板");
} else {
console.log("复制失败");
}
}
/* base64轉文件流 */
export function base64ToFile(base64: any) {
let date = new Date().getTime();
let arr = base64.split(",");
let type = arr[0].match(/:(.*?);/)[1];
let suffix = type.split("/")[1];
let fileName = `${date}.${suffix}`;
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], fileName, { type });
}
/* 防抖 */
export function debounce<T extends (...args: any[]) => void>(
func: T,
delay: number
): (...args: Parameters<T>) => void {
let timer: ReturnType<typeof setTimeout>;
return function (...args: Parameters<T>) {
// 清除之前的定时器
if (timer) {
clearTimeout(timer);
}
// 设置新的定时器
timer = setTimeout(() => {
func(...args);
}, delay);
};
}
/* 節流 */
export function throttle<T extends (...args: any[]) => void>(
func: T,
delay: number
): (...args: Parameters<T>) => void {
let lastTime = 0;
return function (...args: Parameters<T>) {
const now = Date.now();
if (now - lastTime >= delay) {
func(...args);
lastTime = now;
}
};
}
export function getQueryParams(): { [key: string]: string | string[] } {
const urlParams = new URLSearchParams(window.location.search);
const params: { [key: string]: string | string[] } = {};
urlParams.forEach((value, key) => {
if (params[key]) {
if (Array.isArray(params[key])) {
(params[key] as string[]).push(value);
} else {
params[key] = [params[key] as string, value];
}
} else {
params[key] = value;
}
});
return params;
}
export function compare(attribute: number) {
return function (obj1: any, obj2: any) {
var val1 = Number(obj1[attribute]);
var val2 = Number(obj2[attribute]);
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
};
}
export function getVipColor() {
return {
"-1": "#c23bff",
0: "#e0e0e0",
1: "#e0e0e0",
2: "#e0e0e0",
3: "#e0e0e0",
4: "#e0e0e0",
5: "#e0e0e0",
6: "#e0e0e0",
7: "#e0e0e0",
8: "#e0e0e0",
9: "#e0e0e0",
10: "#e0e0e0",
11: "#75f6f0",
12: "#75f6f0",
13: "#75f6f0",
14: "#75f6f0",
15: "#75f6f0",
16: "#75f6f0",
17: "#75f6f0",
18: "#75f6f0",
19: "#75f6f0",
20: "#75f6f0",
21: "#67cbff",
22: "#67cbff",
23: "#67cbff",
24: "#67cbff",
25: "#67cbff",
26: "#67cbff",
27: "#67cbff",
28: "#67cbff",
29: "#67cbff",
30: "#67cbff",
31: "#ff66a3",
32: "#ff66a3",
33: "#ff66a3",
34: "#ff66a3",
35: "#ff66a3",
36: "#ff66a3",
37: "#ff66a3",
38: "#ff66a3",
39: "#ff66a3",
40: "#ff66a3",
41: "#ff9e47",
42: "#ff9e47",
43: "#ff9e47",
44: "#ff9e47",
45: "#ff9e47",
46: "#ff2b2b",
47: "#ff2b2b",
48: "#ff2b2b",
49: "#ff2b2b",
50: "#ff2b2b",
51: "#df5cff",
52: "#ffdb00",
};
}
export function timeFormat(timeStamp?: number | string | Date): string {
const obj: Date = timeStamp ? new Date(timeStamp) : new Date();
const res: { [key: string]: number } = {
y: obj.getFullYear(),
m: obj.getMonth() + 1,
d: obj.getDate(),
h: obj.getHours(),
i: obj.getMinutes(),
s: obj.getSeconds()
};
const formattedRes: { [key: string]: string } = {};
for (const key in res) {
if (res.hasOwnProperty(key)) {
formattedRes[key] = (res[key] < 10) ? `0${res[key]}` : `${res[key]}`;
}
}
return `${formattedRes.y}-${formattedRes.m}-${formattedRes.d} ${formattedRes.h}:${formattedRes.i}:${formattedRes.s}`;
}
// 获取地址栏参数对象
export function handleQueryParams() {
const params = new URLSearchParams(window.location.search);
const paramsObject: Record<string, string> = {};
// 将参数转换为对象
params.forEach((value, key) => {
paramsObject[key] = value;
});
return paramsObject;
}
export const formatDate = (timestamp: number, format: string) => {
// 创建一个 Date 对象
const date = new Date(timestamp);
// 获取年份、月份和日期
const year = String(date.getFullYear());
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以加1
const day = String(date.getDate()).padStart(2, '0'); // 获取日期
const hours = String(date.getHours()).padStart(2, '0'); // 获取小时
const minutes = String(date.getMinutes()).padStart(2, '0'); // 获取分钟
const seconds = String(date.getSeconds()).padStart(2, '0'); // 获取秒
// 替换格式中的占位符
return format
.replace('yyyy', year)
.replace('MM', month)
.replace('dd', day)
.replace('HH', hours)
.replace('mm', minutes)
.replace('ss', seconds);
}
// 是否为ios
export const isIos = () => {
return /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase());
}
// src/utils/request.ts
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { showToast } from 'vant';
import { getQueryParams } from "./common";
// 创建 axios 实例
const service = axios.create({
// baseURL: import.meta.env.VITE_APP_BASE_API,
baseURL: import.meta.env.VITE_APP_API_URL,
timeout: 30000,
/* "application/json;charset=utf-8" */
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" },
});
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// console.log("配置", config)
// get请求映射params参数
const queryParams = getQueryParams();
const requestParams = {
token: queryParams.token,
uid: queryParams.uid,
lang: queryParams?.lang || 2,
cid: queryParams?.cid || "web_gw",
os: "WEB",
};
console.log(config);
if (config.params) {
let url = config.url + "?";
for (const propName of Object.keys(config.params)) {
const value = config.params[propName];
var part = encodeURIComponent(propName) + "=";
if (value !== null && typeof value !== "undefined") {
if (typeof value === "object") {
for (const key of Object.keys(value)) {
let params = propName + "[" + key + "]";
var subPart = encodeURIComponent(params) + "=";
url += subPart + encodeURIComponent(value[key]) + "&";
}
} else {
url += part + encodeURIComponent(value) + "&";
}
}
}
url = url.slice(0, -1);
config.params = { ...config.params, ...requestParams };
config.url = url;
} else if(config.data) {
config.data = { ...config.data, ...requestParams };
} else {
config.params = requestParams;
}
// console.log("config.url==========", config.url)
return config;
},
(error: any) => {
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse) => {
// console.log("response", response)
// 检查配置的响应类型是否为二进制类型('blob' 或 'arraybuffer'), 如果是,直接返回响应对象
if (
response.config.responseType === "blob" ||
response.config.responseType === "arraybuffer"
) {
return response;
}
// console.log("response", response.data.code);
const { code, msg } = response.data;
return response.data;
// if (code === 1) {
// return response.data;
// }
// showToast (msg || "請求失敗,請稍後重試");
// return Promise.reject(new Error(response.data));
},
(error: any) => {
console.log("error", error);
if (error.response && error.response.data) {
const { code, msg } = error.response.data;
showToast (msg || "請求失敗,請稍後重試");
}
return Promise.reject(error.message);
}
);
// 导出 axios 实例
export default service;
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { showToast } from 'vant';
import { handleQueryParams } from "./common";
// 创建 axios 实例
const service = axios.create({
baseURL: import.meta.env.VITE_APP_ACTIVE_URL,
timeout: 30000,
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" },
});
console.log(import.meta.env.VITE_APP_ACTIVE_URL,'import.meta.env.VITE_APP_ACTIVE_URL+');
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 配置统一请求必传参数
const queryParams = handleQueryParams();
const newParams = {
token: queryParams?.token || "debug",
uid: queryParams?.uid || 123456,
lang: queryParams?.lang || 2,
cid: queryParams?.cid || "web_gw",
vest: queryParams?.vest || 0,
os: "WEB",
};
if (config.method == 'post') {
config.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8";
config.data = { ...newParams, ...config.data };
} else {
config.params = { ...newParams, ...config.params };
}
return config;
},
(error: any) => {
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse) => {
const { code, msg } = response.data
if (code === 1) {
return response.data;
} else {
showToast(msg || "請求失敗,請稍後重試");
return response.data;
}
},
(error: any) => {
console.log("error", error);
if (error.response && error.response.data) {
const { code, msg } = error.response.data;
showToast(msg || "請求失敗,請稍後重試");
}
return Promise.reject(error.message);
}
);
// 导出 axios 实例
export default service;
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { showToast } from 'vant';
import { handleQueryParams } from "./common";
// 创建 axios 实例\
const service = axios.create({
baseURL: import.meta.env.VITE_APP_GAME_API_URL,
timeout: 30000,
headers: { "Content-Type": "application/json;charset=utf-8" },
});
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 配置统一请求必传参数
const queryParams = handleQueryParams();
const newParams = {
token: queryParams?.token || "debug",
uid: queryParams?.uid || 123456,
roomId: queryParams?.roomId || "",
lang: queryParams?.lang || 2,
cid: queryParams?.cid || "web_gw",
vest: queryParams?.vest || 0,
os: "WEB",
pkg: queryParams?.pkg || "",
appname: queryParams?.appname || "",
version: queryParams?.appversion || "",
};
if (config.method == 'post') {
config.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8";
config.data = { ...newParams, ...config.data };
} else {
config.params = { ...newParams, ...config.params };
}
return config;
},
(error: any) => {
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse) => {
const { code, msg } = response.data
if (code === 1) {
return response.data;
} else {
showToast(msg || "請求失敗,請稍後重試");
return response.data;
}
},
(error: any) => {
console.log("error", error);
if (error.response && error.response.data) {
const { code, msg } = error.response.data;
showToast(msg || "請求失敗,請稍後重試");
}
return Promise.reject(error.message);
}
);
// 导出 axios 实例
export default service;
import { usePkStore } from '@/stores/pkStore';
const pkStore = usePkStore();
function url_get_params(url_path) {
let url = url_path;
let theRequest = new Object();
if (url.indexOf("?") != -1) {
let str = url.substr(url.indexOf("?") + 1);
strs = str.split("&");
for (let i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
let wsTimer = null;
let wsReconnect = null;
let mUrlParam = url_get_params(location.href);
pkStore.setMurlParam(mUrlParam);
console.log(mUrlParam, 'mUrlParam');
let ws = null;
export function WebSocketGo() {
/* 測試: ws://47.75.50.13:5300/ws */
/* 正式: wss://firefly-cloud-websocket.yabolive.net/ws */
ws = new WebSocket(
`${import.meta.env.VITE_APP_WS_URL}?type=4&uid=` +
mUrlParam.uid +
"&token=debug" +
"&roomid=" +
mUrlParam.roomId +
"&lang=" +
mUrlParam.lang
);
console.log("建立链接");
pkStore.setWsLocation("WS建立连接中...")
ws.onopen = function () {
clearInterval(wsReconnect);
clearInterval(wsTimer);
wsTimer = setInterval(function () {
heartbeat();
}, 4500);
};
ws.onmessage = function (event) {
let msg = JSON.parse(event.data);
console.log("推流", msg);
// 存储游戏推流数据
if (msg.content) {
const parseData = JSON.parse(msg.content);
if (parseData.wsdata) {
pkStore.setGameData(JSON.parse(msg.content).wsdata);
}
}
};
ws.onclose = function (error) {
clearInterval(wsReconnect);
wsReconnect = setInterval(function () {
console.log("断了", error);
pkStore.setWsLocation("WS断开连接...")
WebSocketGo();
}, 3000);
};
function heartbeat() {
if (ws.readyState == WebSocket.OPEN) {
pkStore.setWsLocation("WS发送心跳...")
var msg = new WsMsg(1000, "ping", 0, mUrlParam.uid);
ws.send(JSON.stringify(msg));
}
}
function WsMsg(cid, content, extend, uid) {
this.time = new Date().getTime();
this.msgid = Math.random().toString(36).slice(-8);
this.cid = cid;
this.content = content;
this.extend = extend;
this.uid = uid;
}
}
export function closeWebSocket() {
if (ws) {
clearInterval(wsTimer);
clearInterval(wsReconnect);
ws.close();
ws = null;
}
}
<script setup lang="ts">
</script>
<template>
<div>
SOP主播招募
</div>
</template>
<style scoped lang="scss"></style>
\ No newline at end of file
/// <reference types="vite/client" />
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "preserve",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}
{
"compilerOptions": {
"outDir": "./dist",
"declaration": true, // 生成类型声明文件
"composite": true, // 使父项目支持项目引用
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"lib": ["esnext", "dom"],
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
},
// 严格性和类型检查相关配置
"strict": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
// 模块和兼容性相关配置
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
// 调试和兼容性相关配置
"sourceMap": true,
"useDefineForClassFields": true,
"allowJs": true,
// 类型声明相关配置
"types": ["node", "vite/client", "vant"]
},
"include": ["src/**/*.ts", "src/**/*.vue", "src/fsize.js", "src/utils/pkSocket.js"],
"exclude": ["node_modules", "dist", "vite.config.ts"],
"files": [],
"references": [
{ "path": "./tsconfig.node.json" }
]
}
{
"compilerOptions": {
"composite": true, // 启用项目引用
"declaration": true, // 生成类型声明文件
"outDir": "./dist", // 输出目录
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Bundler",
// "allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": false,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}
import vue from "@vitejs/plugin-vue";
import { type UserConfig, type ConfigEnv, loadEnv, defineConfig } from "vite";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { VantResolver } from 'unplugin-vue-components/resolvers';
import viteCompression from 'vite-plugin-compression';
import { resolve } from "path";
import postCssPxToRem from 'postcss-pxtorem'
const pathSrc = resolve(__dirname, "src");
// https://vite.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
const env = loadEnv(mode, process.cwd());
return {
resolve: {
alias: {
"@": pathSrc,
},
},
css: {
postcss: {
plugins: [
postCssPxToRem({
rootValue: 75, // 根元素字体大小
propList: ['*'], // 需要转换的属性,这里选择全部都进行转换
selectorBlackList: [], // 白名单, 过滤掉以指定名称-开头的class,不进行rem转换
})
],
},
preprocessorOptions: {
// 定义全局 SCSS 变量
// scss: {
// javascriptEnabled: true,
// api: "modern-compiler",
// additionalData: `
// @use "@/styles/variables.scss" as *;
// `,
// },
},
},
server: {
host: "0.0.0.0",
port: +env.VITE_APP_PORT,
open: true,
proxy: {
// 代理 /api 的请求
[env.VITE_APP_BASE_API]: {
changeOrigin: true,
target: env.VITE_APP_API_URL,
rewrite: (path) =>
path.replace(/^\/api/, ""),
},
[env.VITE_APP_WS_API]: {
changeOrigin: true,
target: env.VITE_APP_WS_URL,
ws: true,
},
},
},
plugins: [
vue(),
/* 自动导入配置 */
AutoImport({
// 导入 Vue 函数,如:ref, reactive, toRef 等
imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"],
resolvers: [
// 导入 Vant 组件
VantResolver()
],
eslintrc: {
enabled: false,
filepath: "./.eslintrc-auto-import.json",
globalsPropValue: true,
},
vueTemplate: true,
// 导入函数类型声明文件路径 (false:关闭自动生成)
// dts: false,
dts: "src/types/auto-imports.d.ts",
}),
Components({
resolvers: [
VantResolver()
],
// 指定自定义组件位置(默认:src/components)
dirs: ["src/components", "src/**/components"],
// 导入组件类型声明文件路径 (false:关闭自动生成)
dts: false,
// dts: "src/types/components.d.ts",
}),
viteCompression({}),
],
optimizeDeps: {
include: ["vant"], // 确保 Vant 被正确依赖
},
// 构建配置
build: {
minify: 'terser', // 启用代码压缩
sourcemap: true, // 生成 source map 文件
outDir: 'dist', // 输出目录
assetsDir: 'assets', // 资源目录
// assetsDir: 'fireflywebapp_test', // 资源目录
rollupOptions: {
input: 'index.html', // 确保输入文件是 index.html
},
},
};
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment