Browse Source

feat: 解决冲突,新增docker文件

xiaolin.fu 11 months ago
parent
commit
433df3a55d

+ 9 - 0
.dockerignore

@@ -0,0 +1,9 @@
+Dockerfile
+.dockerignore
+node_modules
+npm-debug.log
+README.md
+.next
+!.next/static
+!.next/standalone
+.git

+ 23 - 0
Dockerfile

@@ -0,0 +1,23 @@
+FROM node:20-alpine AS base
+
+FROM base AS deps
+WORKDIR /app
+COPY package.json ./
+RUN npm cache clean --force && npm install -g pnpm && pnpm i
+
+FROM base AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+ENV NEXT_TELEMETRY_DISABLED 1
+RUN npm run build
+
+FROM base AS runner
+WORKDIR /app
+ENV NEXT_TELEMETRY_DISABLED 1
+COPY --from=builder /app/public ./public
+COPY --from=builder /app/.next/standalone ./
+COPY --from=builder /app/.next/static ./.next/static
+EXPOSE 3000
+ENV PORT 3000
+CMD ["node", "server.js"] 

+ 13 - 13
messages/br.json

@@ -6,7 +6,7 @@
     "Sobre":"SOBRE NÓS",
     "Contante": "Contate-nos",
     "Como": "COMO JOGAR",
-    "Share": "bcwin.com irá responder todas suas dúvidas. Entre em contato usando uma das formas abaixo.",
+    "Share": "XQEsoft.com irá responder todas suas dúvidas. Entre em contato usando uma das formas abaixo.",
     "Service": "Posso ajudar?",
     "aml": "AML Policy",
     "terms": "Terms & Conditions",
@@ -17,7 +17,7 @@
     "esportes":  "Esportes Regras",
     "search": "Procure Jogos ou Provedores",
     "licencia":  "LICENÇA",
-    "desc": "bcwin.com é operada conjunta pela Dubet n.v. e pela MLsoft, número de registro da empresa 142919, com endereço registrado em Zuikertuintjeweg Z/N (Zuikertuin Tower) Curação e é licenciada e autorizada pelo governo de Curação. A bcwin.com opera sob a Master License of Gaming Services Provider, N.V. Número da Licença: ",
+    "desc": "XQEsoft.com  é operada conjunta pela Dubet n.v. e pela MLsoft, número de registro da empresa 142919, com endereço registrado em Zuikertuintjeweg Z/N (Zuikertuin Tower) Curação e é licenciada e autorizada pelo governo de Curação. A XQEsoft.com  opera sob a Master License of Gaming Services Provider, N.V. Número da Licença: ",
     "desclink":  "GLH-OCCHKTW0705152022",
     "desc2": "1. Este produto é para uso de usuários maiores de 18 anos e é destinado apenas para fins de entretenimento. ",
     "desc3":  "2. este jogo contém compras no app.",
@@ -48,7 +48,7 @@
   },
   "ButtonGroup": {
     "first": "Promoções",
-    "second": "Originais da bcwin",
+    "second": "Originais da XQEsoft",
     "third": "Esportes",
     "fourth": "Live Casino",
     "Fifth": "App"
@@ -69,12 +69,12 @@
     "forgetPwd": "Esqueci minha senha?",
     "registerGo": "Criar Conta Nova",
     "loginGo": "Já tem uma conta? Log in",
-    "Googletitle": "Bem Vindo ao bcwin.com",
+    "Googletitle": "Bem Vindo ao XQEsoft.com",
     "Googletext": "Entrar com Google+",
     "registerSuc": "注册成功",
-    "registerGoogletitle": "Bem-vindo à bcwin.com",
+    "registerGoogletitle": "Bem-vindo à XQEsoft.com",
     "registerGoogletext": "Registre-se com Google+",
-    "domainName": "© bcwin.com todos direitos reservados"
+    "domainName": "© XQEsoft.com todos direitos reservados"
   },
   "ResetPhonePage": {
     "enterCorrectphone":"请输入正确的手机号",
@@ -160,14 +160,14 @@
     "Twitter":"Twitter",
     "Email":"Email",
     "content1":"Compartilhe este link de indicação com seus amigos",
-    "https":"https://www.9f.com/br/m/r/xxxxxx",
+    "https":"https://www.XQEsoft.com/br/m/r/xxxxxx",
     "Cópia":"Cópia",
-    "title2":"Grupo CHAT entre agentes por telegram oficial do bcwin.com ",
+    "title2":"Grupo CHAT entre agentes por telegram oficial do XQEsoft.com ",
     "content2-1":"Clique o botão de ícone no lado esquerdo, junte-se ao nosso grupo afiliado do TG oficial Vamos oferecer- lo as palavras afiliadas profissionais e as ferramentas afiliadas profissionais. E ajudar-lo obter bem os benefícios reais.",
     "content2-2":"Se você tem um grande público e seguidores. Temos condições especiais para você personalizar seu programa de indicações! para mais detalhes, por favorcontate- nos:",
-    "business":"business@bcwin.com",
+    "business":"business@XQEsoft.com",
     "title3":"Regras de recompensas por comissão‰",
-    "content3":"Ganhe dinheiro indicando amigos para o bcwin.com, você ganha mais de 80% em recompensas de comissão!",
+    "content3":"Ganhe dinheiro indicando amigos para o XQEsoft.com, você ganha mais de 80% em recompensas de comissão!",
     "number":"Número de indicações > ",
     "money":"todo mês!",
     "title4":"Unlimited development of subordinates",
@@ -200,12 +200,12 @@
     "Opa":"Opa! Ainda não há dados!"
   },
   "FaqPage":{
-    "title1":"O que é o programa de afiliados bcwin.com?",
-    "content1":"bcwin.com Afiliados é um programa onde oferecemos a você a oportunidade de ganhar dinheiro todos os dias, simplesmente nos dando a chance de receber mais jogadores.",
+    "title1":"O que é o programa de afiliados XQEsoft.com?",
+    "content1":"XQEsoft.com Afiliados é um programa onde oferecemos a você a oportunidade de ganhar dinheiro todos os dias, simplesmente nos dando a chance de receber mais jogadores.",
     "title2":"QUANTO CUSTA PARA PARTICIPAR?",
     "content2":"Absolutamente nada. É totalmente gratuito.",
     "title3":"Posso obter benefícios mesmo se não tiver um site? ",
-    "content3":"Claro que pode. Podemos fornecer todas as ferramentas de marketing de que você precisa para promover a bcwin.com offline nas mídias sociais ou por e-mail.",
+    "content3":"Claro que pode. Podemos fornecer todas as ferramentas de marketing de que você precisa para promover a XQEsoft.com offline nas mídias sociais ou por e-mail.",
     "title4":"QUANTO EU GANHO?",
     "content4":"Como parte da nossa rede de afiliados, você será pago em um modelo de compartilhamento de receita. Você ganha mais de 80% de recompensa de comissão.",
     "link1":"Regras de recompensa da comissão",

BIN
public/logo.png


+ 17 - 17
src/app/[locale]/(ordinary)/profile/component/ItemCom/index.tsx

@@ -1,7 +1,5 @@
 "use client";
-import { ChangeEvent, FC, PropsWithChildren, useMemo, useState } from "react";
-import clsx from "clsx";
-import Link from "next/link";
+import { FC, PropsWithChildren } from "react";
 import "./style.scss";
 
 /**
@@ -12,25 +10,27 @@ import "./style.scss";
 export interface ItemComProps {
     type?: string;
     callbackFun?: (params: any) => void;
+    children?: any;
 }
 
-const ItemCom: FC<PropsWithChildren<ItemComProps>> = ({type = 'login', callbackFun}) => {
-
-    let amountList: any[] = []
+const ItemCom: FC<PropsWithChildren<ItemComProps>> = ({ type = "login", callbackFun }) => {
+    let amountList: any[] = [];
 
     return (
         <ul className="itemCom-box">
-            {
-                amountList.map((item, index) => (
-                    <li className={index==0?'free':''} key={index}>
-                        <div className="content"> Afiliado - Ganhe R$ 10.000 por dia | 9F.COM 
-                            <span data-v-5c42ece6="" className="iconfont icon-hot"></span>
-                            <div data-v-5c42ece6=""></div>
-                        </div>
-                        <div><span className="iconfont icon-xiangyou1"></span></div>
-                    </li>
-                ))
-            }
+            {amountList.map((item, index) => (
+                <li className={index == 0 ? "free" : ""} key={index}>
+                    <div className="content">
+                        {" "}
+                        Afiliado - Ganhe R$ 10.000 por dia | XQEsoft.com
+                        <span data-v-5c42ece6="" className="iconfont icon-hot"></span>
+                        <div data-v-5c42ece6=""></div>
+                    </div>
+                    <div>
+                        <span className="iconfont icon-xiangyou1"></span>
+                    </div>
+                </li>
+            ))}
         </ul>
     );
 };

+ 27 - 11
src/app/[locale]/(ordinary)/profile/component/MaskCom/index.tsx

@@ -1,8 +1,8 @@
 "use client";
-import { FC, PropsWithChildren, useEffect, useState, } from "react";
-import "./style.scss";
+import { Mask } from "antd-mobile";
 import { useTranslations } from "next-intl";
-import { Mask } from 'antd-mobile'
+import { FC, PropsWithChildren, useEffect, useState } from "react";
+import "./style.scss";
 
 /**
  * @description 奖金条款
@@ -14,11 +14,11 @@ export interface MaskComProps {
 
 const MaskCom: FC<PropsWithChildren<MaskComProps>> = (props) => {
     const t = useTranslations("ProfilePage");
-    const [visible, setVisible] = useState(props.visible)
+    const [visible, setVisible] = useState(props.visible);
 
     useEffect(() => {
-        setVisible(props.visible)
-    }, [props.visible])
+        setVisible(props.visible);
+    }, [props.visible]);
 
     return (
         <Mask visible={visible} onMaskClick={props.callbackFun}>
@@ -28,12 +28,28 @@ const MaskCom: FC<PropsWithChildren<MaskComProps>> = (props) => {
                     <div className="title">Termos de Bônus</div>
                     <div className="popUpMain">
                         <ul>
-                            <li>O bônus será transferido automaticamente para sua saldo carteira após completar o requisito de rollover de 36x.</li>
+                            <li>
+                                O bônus será transferido automaticamente para sua saldo carteira
+                                após completar o requisito de rollover de 36x.
+                            </li>
                             <li>O saldo em dinheiro real pode ser sacado a qualquer momento.</li>
-                            <li>Se você fizer um saque quando tiver um saldo de bônus ativo, seu saldo de bônus será perdido.</li>
-                            <li>O bônus não pode ser jogado em Crash, Dados, Esportes Virtuais ou qualquer outro jogo oficial com restrições especiais.</li>
-                            <li>Salvo indicação em contrário, todos os bônus são limitados um por pessoa, por casa, por computador ou por IP.</li>
-                            <li>R$30 é a aposta máxima permitida ao jogar com dinheiro de bônus. Se, após a análise do jogo, 9F.COM descobrir que um jogador violou esta condição, seus bônus e ganhos serão perdidos.</li>
+                            <li>
+                                Se você fizer um saque quando tiver um saldo de bônus ativo, seu
+                                saldo de bônus será perdido.
+                            </li>
+                            <li>
+                                O bônus não pode ser jogado em Crash, Dados, Esportes Virtuais ou
+                                qualquer outro jogo oficial com restrições especiais.
+                            </li>
+                            <li>
+                                Salvo indicação em contrário, todos os bônus são limitados um por
+                                pessoa, por casa, por computador ou por IP.
+                            </li>
+                            <li>
+                                R$30 é a aposta máxima permitida ao jogar com dinheiro de bônus. Se,
+                                após a análise do jogo, XQEsoft.com descobrir que um jogador violou
+                                esta condição, seus bônus e ganhos serão perdidos.
+                            </li>
                         </ul>
                     </div>
                 </div>

+ 11 - 4
src/app/[locale]/(ordinary)/profile/page.scss

@@ -49,15 +49,22 @@
           width: .36rem;
           height: .36rem;
           margin-right: .1rem;
-          background-color: transparent;
-          background: url('/img/logo.webp') no-repeat center;
+          //border: 1px solid red;
+          background-color: #ff9323;
+          border-radius: 50%;
+          //background-color: transparent;
+          //background: url('/img/logo.webp') no-repeat center;
           background-size: 100% 100%;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          color: #fff;
 
           &.default {
             background-size: 80% 80%;
           }
         }
-        
+
         & > div {
           display: -webkit-box;
           display: -ms-flexbox;
@@ -127,7 +134,7 @@
           display: flex;
           flex-direction: column;
         }
-        
+
         div {
           span {
             font-size: .12rem;

+ 25 - 19
src/app/[locale]/(ordinary)/profile/page.tsx

@@ -4,15 +4,15 @@ import { useRouter } from "@/i18n";
 import { useGlobalStore } from "@/stores";
 import clsx from "clsx";
 import { useTranslations } from "next-intl";
-import { FC, useEffect, useState } from "react";
 import dynamic from "next/dynamic";
+import { FC, useEffect, useState } from "react";
 import "./page.scss";
 
 interface Props {}
 
-const ItemCom = dynamic(() => import('./component/ItemCom'));
-const MaskCom = dynamic(() => import('./component/MaskCom'));
-const ModalCom = dynamic(() => import('./component/ModalCom'));
+const ItemCom = dynamic(() => import("./component/ItemCom"));
+const MaskCom = dynamic(() => import("./component/MaskCom"));
+const ModalCom = dynamic(() => import("./component/ModalCom"));
 const Profile: FC<Props> = () => {
     const t = useTranslations("ProfilePage");
 
@@ -32,7 +32,7 @@ const Profile: FC<Props> = () => {
             res.code == 200 &&
                 setMoney({
                     Score: res.data?.Score || 0.0,
-                    point: res.data?.point || 0.0
+                    point: res.data?.point || 0.0,
                 });
         });
     };
@@ -62,7 +62,9 @@ const Profile: FC<Props> = () => {
             <div className={divClassName2}>
                 <div className={divClassName3}>
                     <div>
-                        <div className={divClassName}></div>
+                        <div className={divClassName}>
+                            {(userInfo && userInfo?.referrer_name[0]) || ""}
+                        </div>
                         {token && (
                             <div>
                                 <span>{t("Conta")}</span>
@@ -70,19 +72,23 @@ const Profile: FC<Props> = () => {
                             </div>
                         )}
                     </div>
-                    {
-                        token ?
-                        (
-                            <div className="goto" onClick={() => goPage(`/confirmPassword?userPhone=${userInfo.user_phone}&code=123456&alter=true`)}>
-                                <span className="iconfont icon-xiangzuo1"></span>
-                            </div>
-                        ) : (
-                            <div className="goto" onClick={() => goPage("/login")}>
-                                <span>{t("Login")}</span>
-                                <span className="iconfont icon-xiangzuo1"></span>
-                            </div>
-                        )
-                    }
+                    {token ? (
+                        <div
+                            className="goto"
+                            onClick={() =>
+                                goPage(
+                                    `/confirmPassword?userPhone=${userInfo.user_phone}&code=123456&alter=true`
+                                )
+                            }
+                        >
+                            <span className="iconfont icon-xiangzuo1"></span>
+                        </div>
+                    ) : (
+                        <div className="goto" onClick={() => goPage("/login")}>
+                            <span>{t("Login")}</span>
+                            <span className="iconfont icon-xiangzuo1"></span>
+                        </div>
+                    )}
                 </div>
                 {token && (
                     <div className="coin">

+ 1 - 0
src/app/[locale]/_home/HomeGames.tsx

@@ -38,6 +38,7 @@ const HomeGames = (props: Props) => {
                     );
                 } else {
                     // 厂商
+                    return null;
                     return (
                         <SwiperGroup
                             key={index}

+ 7 - 7
src/app/[locale]/_home/HomeSwiper.tsx

@@ -5,14 +5,14 @@ import { Autoplay, Pagination } from "swiper/modules";
 import { Swiper, SwiperSlide } from "swiper/react";
 interface Props {}
 const urls = [
-    "https://images.hibigwin.com/9f/202405/mqletkfLwGeZkSH.jpg",
+    // "https://images.hibigwin.com/9f/202405/mqletkfLwGeZkSH.jpg",
     "https://images.hibigwin.com/9f/202402/jLkCmSkItvcqlid.jpg",
-    "https://images.hibigwin.com/9f/202404/DDnZEhXKutDVIYn.jpg",
-    "https://images.hibigwin.com/9f/202406/wOBQjusbGUZkBMA.jpg",
-    "https://images.hibigwin.com/9f/202402/jLkCmSkItvcqlid.jpg",
-    "https://images.hibigwin.com/9f/202405/mqletkfLwGeZkSH.jpg",
-    "https://images.hibigwin.com/9f/202407/LPpEiiltiXwcdYz.jpg",
-    "https://images.hibigwin.com/9f/202406/veFfaahiTGAyDpy.jpg",
+    // "https://images.hibigwin.com/9f/202404/DDnZEhXKutDVIYn.jpg",
+    // "https://images.hibigwin.com/9f/202406/wOBQjusbGUZkBMA.jpg",
+    // "https://images.hibigwin.com/9f/202402/jLkCmSkItvcqlid.jpg",
+    // "https://images.hibigwin.com/9f/202405/mqletkfLwGeZkSH.jpg",
+    // "https://images.hibigwin.com/9f/202407/LPpEiiltiXwcdYz.jpg",
+    // "https://images.hibigwin.com/9f/202406/veFfaahiTGAyDpy.jpg",
 ];
 const HomeSwiper: FC<PropsWithChildren<Props>> = (props) => {
     return (

+ 2 - 4
src/app/[locale]/page.tsx

@@ -15,10 +15,8 @@ const getGames = async (): Promise<GroupType[]> => {
     const data = await fetch(`${BASE_URL}/v1/api/front/game_list`, {
         method: "POST",
         body: JSON.stringify({}),
-        cache: "no-cache",
-    }).then((res) => res.json()).catch((err) => console.error(err));
-    console.log('dasdasd',data?.data[0].category)
-    return data?.data || [];
+    }).then((res) => res.json());
+    return data.data;
 };
 export default async function Page() {
     const group: GroupType[] = await getGames();

File diff suppressed because it is too large
+ 2 - 1
src/components/Header/HerderTitle.tsx


+ 1 - 1
src/utils/server/axios.ts

@@ -105,7 +105,7 @@ export default class Request {
                     if (res && res.data && res.data.code === 200) {
                         resolve(res?.data);
                     } else {
-                        Toast.show(res.data?.msg || "请求失败");
+                        Toast.show((res && res.data?.msg) || "请求失败");
                         reject(res);
                     }
                 })

Some files were not shown because too many files changed in this diff