Commit 86f16d0c authored by wangzhujun's avatar wangzhujun

排行榜+开奖

parent ed94117f
This diff is collapsed.
...@@ -27,7 +27,7 @@ class App extends Component { ...@@ -27,7 +27,7 @@ class App extends Component {
const defaultPage = { const defaultPage = {
myPrize: MyPrize, // TODO 举例子 新宿台奖品页 myPrize: MyPrize, // TODO 举例子 新宿台奖品页
index: HomePage, index: HomePage,
}[skinId] || GamePage; }[skinId] || HomePage;
PageCtrl.changePage(defaultPage); PageCtrl.changePage(defaultPage);
} }
......
...@@ -3,11 +3,18 @@ ...@@ -3,11 +3,18 @@
import React from 'react'; import React from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import './posterpop.less'; import './posterpop.less';
import { makeQrcode } from "@spark/api-common";
@observer @observer
class Posterpop extends React.Component { class Posterpop extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
}
async componentDidMount() {
// https://98570-activity.m.dexfu.cn/projectx/p6534784b/index.html?appKey=2vujqg1MJ4A4vogq9e22RzTa7C8S&openBs=openbs&appID=98570
let url = location.origin + "/projectx/"+CFG.projectId+"/index.html?appKey=2vujqg1MJ4A4vogq9e22RzTa7C8S&openBs=openbs&appID="+CFG.appID;
const qrcodeSrc = await makeQrcode(url);
console.info(qrcodeSrc);
} }
render() { render() {
return ( return (
......
...@@ -30,10 +30,11 @@ ...@@ -30,10 +30,11 @@
.sparkBg("rankNoPrizePop/btn.png"); .sparkBg("rankNoPrizePop/btn.png");
} }
.lab { .lab {
width: 319px; width: 564px;
height: 43px; height: 43px;
left: 219px; left: 92px;
top: 681px; top: 681px;
text-align: center;
position: absolute; position: absolute;
font-size: 41px; font-size: 41px;
line-height: 43px; line-height: 43px;
......
...@@ -3,19 +3,29 @@ ...@@ -3,19 +3,29 @@
import React from 'react'; import React from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import './ranknoprizepop.less'; import './ranknoprizepop.less';
import { ModalCtrl } from '@/core/ctrls/ModalCtrl';
import { Button } from '@grace/ui';
type RanknoprizepopProps = {
prizeImg: string;
prizeName: string;
rank: number;
};
@observer @observer
class Ranknoprizepop extends React.Component { class Ranknoprizepop extends React.Component<RanknoprizepopProps> {
constructor(props) { constructor(props) {
super(props); super(props);
console.log(props)
}
closePop = () => {
ModalCtrl.closeModal();
} }
render() { render() {
return ( return (
<div className="ranknoprizepop modal_center"> <div className="ranknoprizepop modal_center">
<span className="bg"></span> <span className="bg"></span>
<span className="close"></span> <Button className="close" onClick={this.closePop}></Button>
<span className="btn"></span> <Button className="btn" onClick={this.closePop}></Button>
<span className="lab">最终排名为123</span> <span className="lab">最终排名为{this.props.rank}</span>
</div> </div>
); );
} }
......
...@@ -44,39 +44,50 @@ ...@@ -44,39 +44,50 @@
.sparkBg("rankPrizePop/prizelight.png"); .sparkBg("rankPrizePop/prizelight.png");
} }
.prizeimg { .prizeimg {
width: 163px; width: 245px;
height: 245px; height: 245px;
left: 150px; left: 109px;
top: 155px; top: 155px;
position: absolute; position: absolute;
.sparkBg("rankPrizePop/prizeImg.png"); // .sparkBg("rankPrizePop/prizeImg.png");
img{
width: 245px;
height: 245px;
left: 0px;
top: 0px;
position: absolute;
object-fit: contain;
}
} }
} }
.name { .name {
width: 147px; width: 504px;
height: 33px; height: 33px;
left: 309px; left: 122px;
top: 887px; top: 887px;
text-align: center;
position: absolute; position: absolute;
font-size: 35px; font-size: 35px;
line-height: 33px; line-height: 33px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
} }
.ranklab { .ranklab {
width: 273px; width: 504px;
height: 37px; height: 37px;
left: 241px; left: 122px;
top: 548px; top: 548px;
text-align: center;
position: absolute; position: absolute;
font-size: 35px; font-size: 35px;
line-height: 37px; line-height: 37px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
} }
.tips { .tips {
width: 340px; width: 504px;
height: 23px; height: 23px;
left: 209px; left: 122px;
top: 1049px; top: 1049px;
text-align: center;
position: absolute; position: absolute;
opacity: 0.6; opacity: 0.6;
font-size: 23px; font-size: 23px;
......
...@@ -3,25 +3,44 @@ ...@@ -3,25 +3,44 @@
import React from 'react'; import React from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import './rankprizepop.less'; import './rankprizepop.less';
import { PageCtrl } from '@/core/ctrls/PageCtrl';
import Prizepage from '@/pages/prizepage/prizepage';
import { ModalCtrl } from '@/core/ctrls/ModalCtrl';
import { Button } from '@grace/ui';
type RankprizepopProps = {
prizeImg: string;
prizeName: string;
rank: number;
};
@observer @observer
class Rankprizepop extends React.Component { class Rankprizepop extends React.Component<RankprizepopProps> {
constructor(props) { constructor(props) {
super(props); super(props);
} }
goPrize = () => {
ModalCtrl.closeModal();
PageCtrl.changePage(Prizepage);
}
closePop = () => {
ModalCtrl.closeModal();
}
render() { render() {
return ( return (
<div className="rankprizepop modal_center"> <div className="rankprizepop modal_center">
<span className="bg"></span> <span className="bg"></span>
<span className="close"></span>
<span className="btn"></span>
<div className="prizeitem"> <div className="prizeitem">
<span className="prizelight"></span> <span className="prizelight"></span>
<span className="prizeimg"></span> <span className="prizeimg">
<img
src={this.props.prizeImg}
alt="" />
</span>
</div> </div>
<span className="name">奖品名称</span> <span className="name">{this.props.prizeName}</span>
<span className="ranklab">最终排名为123</span> <span className="ranklab">最终排名为{this.props.rank}</span>
<span className="tips">奖品可在首页 我的奖品 中查看</span> <span className="tips">奖品可在首页 我的奖品 中查看</span>
<Button className="close" onClick={this.closePop}></Button>
<Button className="btn" onClick={this.goPrize}></Button>
</div> </div>
); );
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
bottom: 0; bottom: 0;
right: 0; right: 0;
left: 0; left: 0;
background-color: rgba(0, 0, 0, 0.8); background-color: rgba(0, 0, 0, 0.9);
z-index: 2000; z-index: 2000;
display: flex; display: flex;
align-items: center; align-items: center;
......
...@@ -233,7 +233,8 @@ ...@@ -233,7 +233,8 @@
height: 172px; height: 172px;
left: 0px; left: 0px;
top: 0px; top: 0px;
position: absolute; position: relative;
margin-bottom: 10px;
.taskbg { .taskbg {
width: 695px; width: 695px;
height: 172px; height: 172px;
...@@ -275,7 +276,7 @@ ...@@ -275,7 +276,7 @@
.sparkBg("homePage/taskfinishbtn.png"); .sparkBg("homePage/taskfinishbtn.png");
} }
.tasktit { .tasktit {
width: 149px; width: 260px;
height: 29px; height: 29px;
left: 168px; left: 168px;
top: 56px; top: 56px;
...@@ -283,9 +284,11 @@ ...@@ -283,9 +284,11 @@
font-size: 34px; font-size: 34px;
line-height: 29px; line-height: 29px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
font-weight: bold;
// .lineClamp1();
} }
.tasksub { .tasksub {
width: 121px; width: 260px;
height: 21px; height: 21px;
left: 170px; left: 170px;
top: 95px; top: 95px;
...@@ -301,6 +304,13 @@ ...@@ -301,6 +304,13 @@
top: 49px; top: 49px;
position: absolute; position: absolute;
.sparkBg("homePage/taskicon.png"); .sparkBg("homePage/taskicon.png");
img {
width: 65px;
height: 69px;
left: 0px;
top: 0px;
position: absolute;
}
} }
} }
.taskitem2 { .taskitem2 {
......
import React from 'react'; import React from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import './HomePage.less'; import './HomePage.less';
import { Button } from "@grace/ui"; import { Button, Toast } from "@grace/ui";
import { _asyncThrottle, miniGoUrl } from "@/utils/utils.ts"; import { _asyncThrottle, miniGoUrl } from "@/utils/utils.ts";
import store from "@/store/store.ts"; import store from "@/store/store.ts";
import { SvgaPlayer } from "@grace/svgaplayer"; import { SvgaPlayer } from "@grace/svgaplayer";
...@@ -15,6 +15,9 @@ import { PageCtrl } from "@/core/ctrls/PageCtrl.tsx"; ...@@ -15,6 +15,9 @@ import { PageCtrl } from "@/core/ctrls/PageCtrl.tsx";
import GamePage from "@/pages/GamePage/GamePage.tsx"; import GamePage from "@/pages/GamePage/GamePage.tsx";
import musicStore from '@/store/musicStore'; import musicStore from '@/store/musicStore';
import Drawpop from '@/components/drawpop/drawpop'; import Drawpop from '@/components/drawpop/drawpop';
import Posterpop from '@/components/posterpop/posterpop';
import API from '@/api';
import Rankpage from '../rankpage/rankpage';
@observer @observer
class HomePage extends React.Component<any, any> { class HomePage extends React.Component<any, any> {
...@@ -23,6 +26,7 @@ class HomePage extends React.Component<any, any> { ...@@ -23,6 +26,7 @@ class HomePage extends React.Component<any, any> {
componentDidMount() { componentDidMount() {
store.updateIndex(); store.updateIndex();
store.queryTask()
} }
/** 开始游戏按钮*/ /** 开始游戏按钮*/
...@@ -38,6 +42,7 @@ class HomePage extends React.Component<any, any> { ...@@ -38,6 +42,7 @@ class HomePage extends React.Component<any, any> {
/** 奖品按钮*/ /** 奖品按钮*/
clickPrize = _asyncThrottle(() => { clickPrize = _asyncThrottle(() => {
if (!store.judgeActTime(true, false)) return;
ModalCtrl.showModal(PrizePanel, { ModalCtrl.showModal(PrizePanel, {
prizeVO: {}, prizeVO: {},
}); });
...@@ -45,14 +50,45 @@ class HomePage extends React.Component<any, any> { ...@@ -45,14 +50,45 @@ class HomePage extends React.Component<any, any> {
/** 规则按钮*/ /** 规则按钮*/
clickRule = () => { clickRule = () => {
if (!store.judgeActTime(true, false)) return;
ModalCtrl.showModal(RulePanel); ModalCtrl.showModal(RulePanel);
} }
clickDraw = () => { clickDraw = () => {
if (!store.judgeActTime()) return;
ModalCtrl.showModal(Drawpop, {}); ModalCtrl.showModal(Drawpop, {});
} }
clickShop = () => { clickShop = () => {
if (!store.judgeActTime()) return;
miniGoUrl(store.frontVariable.shopUrl) miniGoUrl(store.frontVariable.shopUrl)
} }
doTask = _asyncThrottle((item: { code: string; }) => {
if (!store.judgeActTime()) return;
if (item.code == "invite") {
// 分享
ModalCtrl.showModal(Posterpop)
return;
} else if (item.code == "scan") {
miniGoUrl(store.frontVariable.scanUrl)
return;
}
})
getTaskPrize = _asyncThrottle(async (item) => {
if (!store.judgeActTime()) return;
const { success, data } = await API.sendPrize({
prizePendingCode: item.prizePendingCode,
taskId: item.id,
taskCode: item.code
})
if (success) {
Toast.show("游戏次数+" + data.options[0].sendCount)
}
})
clickRank = _asyncThrottle(() => {
if (!store.judgeActTime()) return;
PageCtrl.changePage(Rankpage);
})
render() { render() {
const { remainTimes, remainDrawTimes, rank } = store.indexData const { remainTimes, remainDrawTimes, rank } = store.indexData
...@@ -67,7 +103,7 @@ class HomePage extends React.Component<any, any> { ...@@ -67,7 +103,7 @@ class HomePage extends React.Component<any, any> {
<img src={rank?.prizeImg}></img> <img src={rank?.prizeImg}></img>
</span> </span>
</div> </div>
<div className="rankinfo"> <div className="rankinfo" onClick={this.clickRank}>
<span className="rankarr"></span> <span className="rankarr"></span>
<span className="ranklab">我的排名</span> <span className="ranklab">我的排名</span>
<span className="ranknum">{rank?.rank == -1 ? "未上榜" : rank?.rank + "名"}</span> <span className="ranknum">{rank?.rank == -1 ? "未上榜" : rank?.rank + "名"}</span>
...@@ -92,17 +128,27 @@ class HomePage extends React.Component<any, any> { ...@@ -92,17 +128,27 @@ class HomePage extends React.Component<any, any> {
</div> </div>
</Button> </Button>
<div className="tasklist"> <div className="tasklist">
<div className="taskitem"> {
<span className="taskbg"></span> store.taskList?.map((item: any, index) => {
<span className="taskscanbtn"></span> return (
<span className="taskinvitebtn"></span> <div className="taskitem" key={"task" + index}>
<span className="taskgetbtn"></span> <span className="taskbg"></span>
<span className="taskfinishbtn"></span> {
<span className="tasktit">每日登录</span> item.taskStatus == 2 ? <span className="taskfinishbtn"></span>
<span className="tasksub">游戏次数*1</span> : item.taskStatus == 1 ? <span className="taskgetbtn" onClick={() => this.getTaskPrize(item)}></span>
<span className="taskicon"></span> : item.code == "invite" ? <span className="taskinvitebtn" onClick={() => this.doTask(item)}></span>
</div> : item.code == "scan" ? <span className="taskscanbtn" onClick={() => this.doTask(item)}></span>
<span className="taskitem2"></span> : <span className="taskgetbtn"></span>
}
<span className="tasktit">{item.title}({item.completedSize}/{item.intervalLimitSize})</span>
<span className="tasksub">{item.subTitle}</span>
<span className="taskicon">
<img src={item.icon}></img>
</span>
</div>
)
})
}
</div> </div>
<span className="tasktitle"></span> <span className="tasktitle"></span>
<span className="ip"></span> <span className="ip"></span>
......
'use strict';
import React from 'react';
import { observer } from 'mobx-react';
import './rankpage.less';
@observer
class Rankpage extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="rankpage modal_center">
<span className="bg"></span>
<div className="countdown">
<span className="cdbg"></span>
<span className="day">01</span>
<span className="hour">01</span>
<span className="min">59</span>
<span className="sec">59</span>
</div>
<span className="ranktitle"></span>
<div className="list">
<div className="myinfo">
<span className="myrank">999+</span>
<span className="myname">用户昵称(我)</span>
<span className="myscore">614</span>
<span className="mybg"></span>
</div>
<div className="item">
<span className="itemrank">1</span>
<span className="itemname">用户昵称</span>
<span className="itemscore">614</span>
<span className="itembg"></span>
</div>
<span className="item2"></span>
</div>
<div className="prizeitem">
<span className="prizebg"></span>
<span className="prizelight"></span>
<span className="prizeimg"></span>
</div>
<span className="title"></span>
<span className="back"></span>
</div>
);
}
}
export default Rankpage;
...@@ -28,43 +28,47 @@ ...@@ -28,43 +28,47 @@
.sparkBg("rankPage/cdbg.png"); .sparkBg("rankPage/cdbg.png");
} }
.day { .day {
width: 45px; width: 54px;
height: 27px; height: 27px;
left: 18px; left: 10px;
top: 20px; top: 15px;
text-align: center;
position: absolute; position: absolute;
font-size: 34px; font-size: 34px;
line-height: 27px; line-height: 34px;
color: rgba(29, 238, 251, 1); color: rgba(29, 238, 251, 1);
} }
.hour { .hour {
width: 45px; width: 54px;
height: 27px; height: 36px;
left: 131px; left: 123px;
top: 20px; top: 15px;
text-align: center;
position: absolute; position: absolute;
font-size: 34px; font-size: 34px;
line-height: 27px; line-height: 34px;
color: rgba(29, 238, 251, 1); color: rgba(29, 238, 251, 1);
} }
.min { .min {
width: 46px; width: 54px;
height: 27px; height: 27px;
left: 214px; left: 206px;
top: 20px; top: 15px;
text-align: center;
position: absolute; position: absolute;
font-size: 34px; font-size: 34px;
line-height: 27px; line-height: 34px;
color: rgba(29, 238, 251, 1); color: rgba(29, 238, 251, 1);
} }
.sec { .sec {
width: 47px; width: 54px;
height: 27px; height: 27px;
left: 297px; left: 289px;
top: 20px; top: 15px;
text-align: center;
position: absolute; position: absolute;
font-size: 34px; font-size: 34px;
line-height: 27px; line-height: 34px;
color: rgba(29, 238, 251, 1); color: rgba(29, 238, 251, 1);
} }
} }
...@@ -82,6 +86,7 @@ ...@@ -82,6 +86,7 @@
left: 20px; left: 20px;
top: 925px; top: 925px;
position: absolute; position: absolute;
overflow-y: scroll;
.myinfo { .myinfo {
width: 716px; width: 716px;
height: 116px; height: 116px;
...@@ -89,33 +94,36 @@ ...@@ -89,33 +94,36 @@
top: 0px; top: 0px;
position: absolute; position: absolute;
.myrank { .myrank {
width: 94px; width: 100px;
height: 28px; height: 36px;
left: 28px; left: 25px;
top: 44px; top: 40px;
text-align: center;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 28px; line-height: 36px;
color: rgba(18, 240, 243, 1); color: rgba(18, 240, 243, 1);
} }
.myname { .myname {
width: 224px; width: 324px;
height: 35px; height: 50px;
left: 204px; left: 204px;
top: 41px; top: 41px;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 35px; line-height: 36px;
color: rgba(18, 240, 243, 1); color: rgba(18, 240, 243, 1);
.lineClamp1();
} }
.myscore { .myscore {
width: 71px; width: 71px;
height: 28px; height: 36px;
left: 632px; left: 632px;
top: 45px; top: 40px;
text-align: right;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 28px; line-height: 36px;
color: rgba(18, 240, 243, 1); color: rgba(18, 240, 243, 1);
} }
.mybg { .mybg {
...@@ -132,35 +140,39 @@ ...@@ -132,35 +140,39 @@
height: 116px; height: 116px;
left: 0px; left: 0px;
top: 127px; top: 127px;
position: absolute; position: relative;
margin-top: 6px;
.itemrank { .itemrank {
width: 26px; width: 100px;
height: 28px; height: 28px;
left: 58px; left: 25px;
top: 44px; top: 40px;
text-align: center;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 28px; line-height: 36px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
} }
.itemname { .itemname {
width: 154px; width: 324px;
height: 35px; height: 50px;
left: 204px; left: 204px;
top: 41px; top: 41px;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 35px; line-height: 36px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
.lineClamp1()
} }
.itemscore { .itemscore {
width: 71px; width: 71px;
height: 28px; height: 36px;
left: 632px; left: 632px;
top: 45px; top: 40px;
text-align: right;
position: absolute; position: absolute;
font-size: 36px; font-size: 36px;
line-height: 28px; line-height: 36px;
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
} }
.itembg { .itembg {
...@@ -181,6 +193,18 @@ ...@@ -181,6 +193,18 @@
.sparkBg("rankPage/item2.png"); .sparkBg("rankPage/item2.png");
} }
} }
.empty {
width: 750px;
height: 40px;
left: 0px;
top: 1150px;
position: absolute;
text-align: center;
font-size: 38px;
line-height: 36px;
font-weight: bold;
color: rgba(255, 255, 255, 1);
}
.prizeitem { .prizeitem {
width: 581px; width: 581px;
height: 500px; height: 500px;
...@@ -204,12 +228,20 @@ ...@@ -204,12 +228,20 @@
.sparkBg("rankPage/prizelight.png"); .sparkBg("rankPage/prizelight.png");
} }
.prizeimg { .prizeimg {
width: 142px; width: 214px;
height: 214px; height: 214px;
left: 131px; left: 95px;
top: 135px; top: 135px;
position: absolute; position: absolute;
.sparkBg("rankPage/prizeImg.png"); // .sparkBg("rankPage/prizeImg.png");
img {
width: 214px;
height: 214px;
left: 0px;
top: 0px;
position: absolute;
object-fit: contain;
}
} }
} }
.title { .title {
......
'use strict';
import React from 'react';
import { observer } from 'mobx-react';
import './rankpage.less';
import { PageCtrl } from '@/core/ctrls/PageCtrl';
import { Button } from '@grace/ui';
import API from '@/api';
import { dealTime2 } from '@/utils/utils';
// 定义 RankInfo 类型
type RankInfo = {
index: number;
score: number;
userName: string;
meFlag: boolean;
};
// 定义 MyRank 类型
type MyRank = {
index: number;
score: number;
userName: string;
};
// 定义 RankOption 类型
type RankOption = {
ranking: number;
name: string;
image: string;
};
// 定义 Rankpage 组件的 state 类型
type RankpageState = {
day: string;
hour: string;
min: string;
sec: string;
timeStamp: number;
openTime: number;
rankInfos: RankInfo[];
myRank: MyRank;
rankOptions: RankOption[];
};
@observer
class Rankpage extends React.Component<{}, RankpageState> {
constructor(props) {
super(props);
this.state = {
day: '00',
hour: '00',
min: '00',
sec: '00',
timeStamp: 0,
openTime: 0,
rankInfos: [],
myRank: {
index: 0,
score: 0,
userName: ''
},
rankOptions: [],
}
}
back() {
PageCtrl.backPage();
}
timeStamp: number = 1746688893175;
async componentDidMount() {
if (this.state.openTime > this.timeStamp) {
clearTimeout(this.timeCtn)
this.countdown()
}
this.flushRank()
}
async flushRank() {
const { success, data, timeStamp } = await API.rankInfo();
if (success) {
this.timeStamp = timeStamp
this.setState({
timeStamp,
openTime: data.openTime,
rankInfos: data.rankInfos,
myRank: data.myRank,
rankOptions: data.rankOptions,
})
if (data.openTime > timeStamp) {
clearTimeout(this.timeCtn)
this.countdown()
}
}
}
timeCtn
countdown() {
console.log("!@@@@!@@",this.state.openTime - this.timeStamp)
let res = dealTime2(this.state.openTime - this.timeStamp)
this.setState({
day: String(res.day),
hour: String(res.hour),
min: String(res.minute),
sec: String(res.second),
})
clearTimeout(this.timeCtn)
this.timeCtn = setTimeout(() => {
const { openTime } = this.state;
if (openTime > this.timeStamp) {
this.timeStamp += 1000
this.countdown()
} else {
this.flushRank()
}
}, 1000)
}
componentWillUnmount(): void {
clearTimeout(this.timeCtn)
}
render() {
const { rankInfos, myRank, rankOptions,day,hour,min,sec } = this.state;
return (
<div className="rankpage modal_center">
<span className="bg"></span>
<div className="countdown">
<span className="cdbg"></span>
<span className="day">{day}</span>
<span className="hour">{hour}</span>
<span className="min">{min}</span>
<span className="sec">{sec}</span>
</div>
<span className="ranktitle"></span>
<div className="list" style={{ height: `${(689 - (1624 - document.body.clientHeight * 750 / document.body.clientWidth) / 2) / 100}rem` }}>
<div className="myinfo">
<span className="myrank">{myRank.index > 999 ? '999+' : myRank.index}</span>
<span className="myname">{myRank.userName}(我)</span>
<span className="myscore">{myRank.score}</span>
<span className="mybg"></span>
</div>
{
rankInfos.map((item, index) => {
return (
<div className="item" key={'rank' + index}>
<span className="itemrank">{item.index}</span>
<span className="itemname">{item.userName}</span>
<span className="itemscore">{item.score}</span>
<span className="itembg"></span>
</div>
)
})
}
</div>
{
rankInfos.length == 0 && <span className='empty'>暂无数据哦</span>
}
<div className="prizeitem">
<span className="prizebg"></span>
<span className="prizelight"></span>
<span className="prizeimg">
<img src={rankOptions?.[0]?.image}></img>
</span>
</div>
<span className="title"></span>
<Button className="back" onClick={this.back}></Button>
</div>
);
}
}
export default Rankpage;
...@@ -2,6 +2,9 @@ import { makeAutoObservable, } from 'mobx'; ...@@ -2,6 +2,9 @@ import { makeAutoObservable, } from 'mobx';
import API from '../api/index'; import API from '../api/index';
import { Toast } from "@grace/ui"; import { Toast } from "@grace/ui";
import { IWxShareInfo } from "@/built-in/share/weixin/weixin.ts"; import { IWxShareInfo } from "@/built-in/share/weixin/weixin.ts";
import { ModalCtrl } from '@/core/ctrls/ModalCtrl';
import Ranknoprizepop from '@/components/ranknoprizepop/ranknoprizepop';
import Rankprizepop from '@/components/rankprizepop/rankprizepop';
class Store { class Store {
...@@ -15,6 +18,7 @@ class Store { ...@@ -15,6 +18,7 @@ class Store {
prizeInfoAuthTxt: string, prizeInfoAuthTxt: string,
shareInfo: IWxShareInfo, shareInfo: IWxShareInfo,
shopUrl?: string, shopUrl?: string,
scanUrl?: string,
} = { } = {
privacyTxt: "", privacyTxt: "",
prizeInfoAuthTxt: "", prizeInfoAuthTxt: "",
...@@ -71,6 +75,14 @@ class Store { ...@@ -71,6 +75,14 @@ class Store {
} }
this.indexData = data; this.indexData = data;
this.indexData.timeStamp = timeStamp; this.indexData.timeStamp = timeStamp;
if (data.rankPopInfo) {
if (data.rankPopInfo.sendPrize) {
ModalCtrl.showModal(Rankprizepop, { ...data.rankPopInfo })
} else {
ModalCtrl.showModal(Ranknoprizepop, { ...data.rankPopInfo })
}
}
} }
judgeActTime(brakeStart = true, brakeEnd = true) { judgeActTime(brakeStart = true, brakeEnd = true) {
...@@ -83,6 +95,13 @@ class Store { ...@@ -83,6 +95,13 @@ class Store {
} }
return true; return true;
} }
taskList: [];
async queryTask() {
const { success, data } = await API.queryTasks();
if (success) {
this.taskList = data.item;
}
}
} }
......
...@@ -47,10 +47,10 @@ export const _throttle = (fun, delay = 2000) => { ...@@ -47,10 +47,10 @@ export const _throttle = (fun, delay = 2000) => {
* @param fun * @param fun
* @param delay * @param delay
*/ */
export const _asyncThrottle = (fun, delay = 2000) => { export const _asyncThrottle = <T extends any[], R>(fun, delay = 2000) => {
let last: number; let last: number;
let canClick = true; let canClick = true;
return function () { return function (...args: T): R {
const now = Date.now(); const now = Date.now();
if (!canClick) return; if (!canClick) return;
...@@ -74,7 +74,7 @@ export const _asyncThrottle = (fun, delay = 2000) => { ...@@ -74,7 +74,7 @@ export const _asyncThrottle = (fun, delay = 2000) => {
export function useThrottle(fn, delay = 2000, dep = []) { export function useThrottle(fn, delay = 2000, dep = []) {
const {current} = useRef({fn, timer: null}); const { current } = useRef({ fn, timer: null });
useEffect(function () { useEffect(function () {
current.fn = fn; current.fn = fn;
}, [fn]); }, [fn]);
...@@ -202,6 +202,19 @@ export const dealTime = (msTime) => { ...@@ -202,6 +202,19 @@ export const dealTime = (msTime) => {
second = second > 9 ? second : "0" + second; second = second > 9 ? second : "0" + second;
return `${hour}:${minute}:${second}`; return `${hour}:${minute}:${second}`;
} }
/** 时间格式化 */
export const dealTime2 = (msTime) => {
const time = msTime / 1000;
let day: number | string = Math.floor(time / 60 / 60 / 24);
let hour: number | string = Math.floor(time / 60 / 60) % 24;
let minute: number | string = Math.floor(time / 60) % 60;
let second: number | string = Math.floor(time) % 60;
day = day > 9? day : "0" + day;
hour = hour > 9 ? hour : "0" + hour;
minute = minute > 9 ? minute : "0" + minute;
second = second > 9 ? second : "0" + second;
return { day, hour, minute, second };
}
/** /**
* 转换k * 转换k
...@@ -338,7 +351,7 @@ export const second2Date = (totalSecond) => { ...@@ -338,7 +351,7 @@ export const second2Date = (totalSecond) => {
// 格式化的键值 // 格式化的键值
const includesKey = ['month', 'day', 'hour', 'minute', 'second', 'totalHour', 'totalMinute'] const includesKey = ['month', 'day', 'hour', 'minute', 'second', 'totalHour', 'totalMinute']
// 日期对象 // 日期对象
const dateObj = {day, hour, minute, second, millisecond, totalHour, totalMinute} const dateObj = { day, hour, minute, second, millisecond, totalHour, totalMinute }
return Object.keys(dateObj).reduce((preVal, key) => { return Object.keys(dateObj).reduce((preVal, key) => {
// 值取整 // 值取整
...@@ -376,7 +389,7 @@ export const bodyScroll = (event) => { ...@@ -376,7 +389,7 @@ export const bodyScroll = (event) => {
} }
export const onCtrScroll = (flag = true) => { export const onCtrScroll = (flag = true) => {
if (flag) { // 禁止滚动 if (flag) { // 禁止滚动
document.body.addEventListener('touchmove', bodyScroll, {passive: false}); document.body.addEventListener('touchmove', bodyScroll, { passive: false });
} else { // 开启滚动 } else { // 开启滚动
document.body.removeEventListener('touchmove', bodyScroll); document.body.removeEventListener('touchmove', bodyScroll);
} }
...@@ -424,5 +437,6 @@ export function prefixInteger(num: number, length: number) { ...@@ -424,5 +437,6 @@ export function prefixInteger(num: number, length: number) {
* @return {*} * @return {*}
*/ */
export const miniGoUrl = (url) => { export const miniGoUrl = (url) => {
// @ts-ignore
wx.miniProgram.navigateTo({ url: url }); wx.miniProgram.navigateTo({ url: url });
} }
\ No newline at end of file
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 to comment