Commit 09fe7d51 authored by 徐士卿's avatar 徐士卿

merge

parent 6aed4f98
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<link rel="dns-prefetch" href="//yun.duiba.com.cn" />
<link rel="preconnect" href="//embedlog.duiba.com.cn">
<title>天天领积分</title>
<script type="text/javascript">
if (localStorage && localStorage.isWebp) {
document
.getElementsByTagName('html')[0]
.setAttribute('duiba-webp', 'true');
}
</script>
<script src="//yun.duiba.com.cn/js-libs/rem/1.1.3/rem.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
var CFG = CFG || {};
CFG.projectId = location.pathname.split('/')[2] || '1';
function getUrlParam(name) {
var search = window.location.search;
var matched = search
.slice(1)
.match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'));
return search.length ? matched && matched[2] : null;
}
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<link rel="dns-prefetch" href="//yun.duiba.com.cn" />
<link rel="preconnect" href="//embedlog.duiba.com.cn">
<title>天天领积分</title>
<script type="text/javascript">
if (localStorage && localStorage.isWebp) {
document
.getElementsByTagName('html')[0]
.setAttribute('duiba-webp', 'true');
}
</script>
<script src="//yun.duiba.com.cn/js-libs/rem/1.1.3/rem.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
var CFG = CFG || {};
CFG.projectId = location.pathname.split('/')[2] || '1';
CFG.appID = '${APPID}';
if (!getUrlParam("appID")) {
// alert("【警告】检测到活动url中没有appID参数\n缺少该参数会导致埋点、分享、app信息获取错误。")
}
</script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/App.tsx"></script>
</body>
</html>
function getUrlParam(name) {
var search = window.location.search;
var matched = search
.slice(1)
.match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'));
return search.length ? matched && matched[2] : null;
}
CFG.appID = '${APPID}';
// 新小程序会传version=hg 旧小程序不会传
CFG.version = getUrlParam('version') || sessionStorage.getItem('version');
CFG.version && sessionStorage.setItem("version", CFG.version);
CFG.isNewMiniVersion = CFG.version == 'hg';
CFG.subUrl = (CFG.isNewMiniVersion ? `/packages/activityCenter/subscibe` : `/pagesNews/subscribeMiddlePage/subscribeNews`) +
"?source=duiba&subId=1922853657613651969&activeNo=" + CFG.projectId + "&activityUrl=" + encodeURI(location.href)
if (!getUrlParam("appID")) {
// alert("【警告】检测到活动url中没有appID参数\n缺少该参数会导致埋点、分享、app信息获取错误。")
}
</script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/App.tsx"></script>
</body>
</html>
\ No newline at end of file
......@@ -17,6 +17,8 @@ export default [
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 666,
"resignQg": 666,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
},
{
"challengeId": "2",
......@@ -25,6 +27,8 @@ export default [
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 888,
"resignQg": 888,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
},
{
"challengeId": "3",
......@@ -32,7 +36,9 @@ export default [
"prizeName": "90天的任务",
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 999,
"resignQg": 999
"resignQg": 999,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
},
{
"challengeId": "4",
......@@ -40,7 +46,9 @@ export default [
"prizeName": "120天的任务",
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 999,
"resignQg": 999
"resignQg": 999,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
}
],
"hasChallengeDay": 5,
......@@ -114,8 +122,6 @@ export default [
],
"boolNeedChallengeCompletePop": false,
"boolOpenChallenge": true,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
}
}
},
......@@ -130,13 +136,39 @@ export default [
"success": true,
"message": "incididunt ipsum aliquip sint dolore",
"data": {
"jfNum": 100,
"qgNum": 400,
"jfNum": 3000,
"qgNum": 4000,
}
}
},
},
{
url: "/challenge/chooseChallenge.do",
method: 'get',
response: ({ query }) => {
return {
"code": "proident ullamco quis",
"success": true,
"message": "labore",
"data": {},
}
},
},
{
url: "/challenge/taskComplate.do",
method: 'get',
response: ({ query }) => {
return {
"code": "proident ullamco quis",
"success": true,
"message": "labore",
"data": {},
}
},
},
{
url: "/challenge/resign.do",
method: 'get',
......
export default [
{
url: '/credits/creditsCost.do',
method: 'post',
response: ({ query }) => {
return {
"code": null,
"data": "pca599ef9a7645cc9421c39e92ca9e28",
"message": null,
"success": true,
"timeStamp": 1742894067802
}
},
},
{
url: '/credits/queryStatus.do',
method: 'get',
response: ({ query }) => {
return {
"code": null, "data": 1, "message": null, "success": true, "timeStamp": 1742894067868
}
},
},
{
url: '/credits/creditsLogList.do',
method: 'post',
response: ({ query }) => {
return {
"success": true,
"code": "",
"message": "",
"data": {
"leftCredits": 123,
"list": [
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 123123,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注蓝球",
"gmtCreate": 11111
}
],
"haveMore": false
}
}
},
},
]
\ No newline at end of file
import {AESEncrypt} from "./Crypto";
import { AESEncrypt } from "./Crypto";
export default [
{
url: '/projectRule.query',
method: 'get',
response: ({query}) => {
response: ({ query }) => {
return {
"data": "<p>以下是游戏规则:手速要快,点击红包雨。。333。。。。。。。。。。。。。。。。。。。。11111111111111sadasdadadsad5555555557777777777799999999999911111111111111111111111222222222222222222222222222222222222222222222222222222222222222333333333333333333333333333333333333333333333333333333333333311111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222233333333333333333333333333333333333333333333333333333333333331111111111111111111111111111111111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333</p>",
"success": true
......@@ -14,7 +14,7 @@ export default [
{
url: '/coop_frontVariable.query',
method: 'get',
response: ({query}) => {
response: ({ query }) => {
return {
"success": true,
"message": "报错了~",
......@@ -24,20 +24,20 @@ export default [
"prizeInfoAuthTxt": "prizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxtprizeInfoAuthTxt",
"test_config_02": "111",
// 规则长图
"ruleImg":'//yun.duiba.com.cn/polaris/bg.18539c61e0103e01a339dd268558b2559ab178ba.png',
"ruleImg": '//yun.duiba.com.cn/polaris/bg.18539c61e0103e01a339dd268558b2559ab178ba.png',
shareInfo: {
"title": '守护权益对对碰',
"desc": '2025年“3·15”金融消费者权益保护教育宣传活动',
"imgUrl": 'https://yun.duiba.com.cn/polaris/shareImg.721503d9417b09af6346ae018493aec558ca31af.png'
},
shopUrl:'https://'
shopUrl: 'https://'
}
}
},
},
{
url: '/join.do',
response: ({query}) => {
response: ({ query }) => {
return {
"code": "code",
"success": true,
......@@ -51,8 +51,8 @@ export default [
},
},
{
url: '/records.query',
response: ({query}) => {
url: '/common/records.do',
response: ({ query }) => {
return {
"code": "code",
"success": true,
......@@ -70,7 +70,11 @@ export default [
"strategyId": 11,
"gmtCreate": 1565213353000,
"id": 331,
"prizeId": "g4c4c3edd"
"prizeId": "g4c4c3edd",
"type": 4,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -83,7 +87,11 @@ export default [
"strategyId": 11,
"gmtCreate": 1565213116000,
"id": 330,
"prizeId": "g0e432eeb"
"prizeId": "g0e432eeb",
"type": 4,
"moneyStatus": 10,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -96,7 +104,11 @@ export default [
"strategyId": 11,
"gmtCreate": 1565212826000,
"id": 329,
"prizeId": "g900c8442"
"prizeId": "g900c8442",
"type": 4,
"moneyStatus": 11,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -109,7 +121,11 @@ export default [
"gmtCreate": 1565205625000,
"id": 328,
"strategyId": 11,
"prizeId": "g4c7ba888"
"prizeId": "g4c7ba888",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -122,7 +138,11 @@ export default [
"strategyId": 11,
"gmtCreate": 1565203101000,
"id": 327,
"prizeId": "g900c8442"
"prizeId": "g900c8442",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -135,7 +155,11 @@ export default [
"strategyId": 11,
"gmtCreate": 1565203040000,
"id": 326,
"prizeId": "g0e432eeb"
"prizeId": "g0e432eeb",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
......@@ -160,10 +184,178 @@ export default [
"gmtCreate": 1565197080000,
"id": 324,
"strategyId": 11,
"prizeId": "g0e432eeb"
}
"prizeId": "g0e432eeb",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
],
}
},
},
{
url: '/common/moneyReissue.do',
response: ({ query }) => {
return {
"code": "code",
"success": true,
"message": "message",
"timeStamp": Date.now(),
"data": [
{
"extra": {
"name": "现金奖励——发放成功",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"strategyId": 11,
"gmtCreate": 1565213353000,
"id": 331,
"prizeId": "g4c4c3edd",
"type": 4,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "现金奖励——可以补发",
"icon": "//yun.duiba.com.cn/polaris/%E6%95%B0%E6%8D%AE%E5%86%B3%E7%AD%96%E5%B7%A5%E5%85%B7.531c2dae250ab379fd6216eb038e60bc12ab9dd6.png",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"strategyId": 11,
"gmtCreate": 1565213116000,
"id": 330,
"prizeId": "g0e432eeb",
"type": 4,
"moneyStatus": 11,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "现金奖励——发放中",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"strategyId": 11,
"gmtCreate": 1565212826000,
"id": 329,
"prizeId": "g900c8442",
"type": 4,
"moneyStatus": 11,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "优惠券-大转盘01",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"gmtCreate": 1565205625000,
"id": 328,
"strategyId": 11,
"prizeId": "g4c7ba888",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "优惠券-大转盘05",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"strategyId": 11,
"gmtCreate": 1565203101000,
"id": 327,
"prizeId": "g900c8442",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "优惠券-大转盘03",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"strategyId": 11,
"gmtCreate": 1565203040000,
"id": 326,
"prizeId": "g0e432eeb",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
{
"extra": {
"name": "优惠券-大转盘04",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"gmtCreate": 1565197386000,
"id": 325,
"prizeId": "gc1a8c03c"
},
{
"extra": {
"name": "last",
"icon": "//yun.dui88.com/images/201907/tua0um9jjp.jpg",
"refType": "coupon",
"refId": "49354",
"type": 2
},
"gmtCreate": 1565197080000,
"id": 324,
"strategyId": 11,
"prizeId": "g0e432eeb",
"type": 1,
"moneyStatus": 1,
"moneyCanReissueStartTimestamp": 1565213353000,
"moneyCanReissueEndTimestamp": 1565213353000,
},
],
}
},
},
{
url: "/customActivity/kouweiwang/prize/queryOrderNo",
method: 'get',
response: ({ query }) => {
return {
"success": true,
"message": "报错了~",
"code": null,
"data": {
"recordId": 1,
"projectId": 1,
"orderNo": 1234567890,
"activityId": 1,
"uid": 1,
},
}
}
},
]
......@@ -52,12 +52,28 @@ const API = generateAPI({
// 挑战-补签
getChallengeResign: "challenge/resign.do",
// 挑战-任务完成接口
getChallenegeComplate: "challenge/taskComplate.do",
//挑战-获取邀请码
getChallengeInviteCode: "challenge/inviteCode.do",
// 挑战-助力
getChallengeAssist: "challenge/assist.do",
// 挑战-选择挑战
getChooseChallenge: "/challenge/chooseChallenge.do",
// 扣积分
queryStatus: "credits/queryStatus.do",
creditsCost: {
uri: "credits/creditsCost.do",
method: "post"
},
// 奖品
queryOrder: "customActivity/kouweiwang/prize/queryOrderNo",
index: "main/index.do",
completeGuide: "main/completeGuide.do",
sign: "main/sign.do",
......
......@@ -9,6 +9,9 @@ import qs from "qs";
import {getUrlParam} from "@/utils/utils.ts";
interface IRes {
uid: any;
activityId: any;
orderNo: any;
success: boolean;
data: any;
msg?: string;
......
......@@ -8,6 +8,7 @@ import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import store from "../../store/store.ts";
import { toJS } from "mobx";
import API from "../../api/index.ts";
@observer
class Choice_challenge extends React.Component {
......@@ -22,9 +23,16 @@ class Choice_challenge extends React.Component {
this.setState({ activeIndex: index });
};
handlechallenge = () => {
ModalCtrl.closeModal();
handlechallenge = async (id) => {
//todo
const { success } = await API.getChooseChallenge({
challengeId: id,
});
console.log(id)
if (success) {
store.getTaskInfo();
ModalCtrl.closeModal();
}
};
// handleclose = () => {
......@@ -34,7 +42,9 @@ class Choice_challenge extends React.Component {
render() {
const { activeIndex } = this.state;
const { challengeConfigList = [] } = store?.taskInfo || {};
console.log(toJS(store?.taskInfo),111)
// console.log(toJS(store?.taskInfo), 111);
const selectedItem = challengeConfigList[activeIndex];
return (
<div className="choice_challenge modal_center">
......@@ -68,7 +78,7 @@ class Choice_challenge extends React.Component {
<span className="tip"></span>
<Button
className="challenge"
onClick={() => this.handlechallenge(activeIndex)}
onClick={() => this.handlechallenge(selectedItem?.challengeId)}
/>
<span className="ditu"></span>
</div>
......
......@@ -6,6 +6,10 @@ import "./consume_credits.less";
import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import Finish_task from "../finish_task/finish_task";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
import { pre_reduce_score } from "../../store/credits.js";
@observer
class Consume_credits extends React.Component {
......@@ -13,9 +17,26 @@ class Consume_credits extends React.Component {
super(props);
}
handleclock = () => {
ModalCtrl.closeModal();
// todo 成功了弹 finish_task
handleclock = async (n, code, title) => {
await pre_reduce_score(
{
toPlaywayId: "challenge",
toActionId: "taskComplet",
desc: "taskComplete_credits_desc",
credits: n,
},
async () => {
const { success } = await API.getChallenegeComplate({
taskCode: code,
ticket: store.ticketNum,
});
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_task, { title });
}
}
);
store.getTaskInfo()
};
handleclose = () => {
......@@ -23,14 +44,18 @@ class Consume_credits extends React.Component {
};
render() {
const { n = 0, code, title } = this.props;
return (
<div className="consume_credits modal_center">
<span className="bg"></span>
<span className="tile"></span>
<span className="tip1">消耗10000积分</span>
<span className="tip1">消耗{n}积分</span>
<span className="tip2">完成打卡</span>
<Button className="close" onClick={this.handleclose} />
<Button className="clock" onClick={this.handleclock} />
<Button
className="clock"
onClick={() => this.handleclock(n, code, title)}
/>
<span className="icon"></span>
<span className="ditu"></span>
</div>
......
......@@ -6,6 +6,9 @@ import "./consume_qg.less";
import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import Finish_task from "../finish_task/finish_task";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
@observer
class Consume_qg extends React.Component {
......@@ -13,9 +16,13 @@ class Consume_qg extends React.Component {
super(props);
}
handleclock = () => {
ModalCtrl.closeModal();
// todo 成功了弹 finish_task
handleclock = async (code, title) => {
const {success } = await API.getChallenegeComplate({ taskCode: code });
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_task, {title});
}
store.getTaskInfo();
};
handleclose = () => {
......@@ -23,7 +30,7 @@ class Consume_qg extends React.Component {
};
render() {
const { n = 0 } = this.props;
const { n = 0, code, title } = this.props;
return (
<div className="consume_qg modal_center">
<span className="bg"></span>
......@@ -31,7 +38,7 @@ class Consume_qg extends React.Component {
<span className="tip1">消耗{n}青果</span>
<span className="tip2">完成打卡</span>
<Button className="close" onClick={this.handleclose} />
<Button className="clock" onClick={this.handleclock} />
<Button className="clock" onClick={() => this.handleclock(code, title)} />
<span className="icon"></span>
<span className="ditu"></span>
</div>
......
'use strict';
import React from 'react';
import { observer } from 'mobx-react';
import './finish_resign.less';
import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
@observer
class Finish_resign extends React.Component {
constructor(props) {
super(props);
}
handleclose = () => {
ModalCtrl.closeModal();
}
handleknow = () => {
ModalCtrl.closeModal();
}
render() {
return (
<div className="finish_resign modal_center">
<span className="ditu"></span>
<span className="dongxiao"></span>
<span className="bg"></span>
<Button className="close" onClick={this.handleclose} />
<span className="title"></span>
<span className="tip">快去完成打卡任务吧!</span>
<Button className="know" onClick={this.handleknow} />
</div>
);
}
}
export default Finish_resign;
@import "../../res.less";
.finish_resign {
width: 750px;
height: 1624px;
left: 0px;
top: 0px;
position: absolute;
.ditu {
width: 684px;
height: 150px;
left: 33px;
top: 1300px;
position: absolute;
.sparkBg("finish_resign/ditu.png");
}
.dongxiao {
width: 750px;
height: 1589px;
left: 0px;
top: 0px;
position: absolute;
.sparkBg("finish_resign/dongxiao.png");
}
.bg {
width: 682px;
height: 428px;
left: 18px;
top: 563px;
position: absolute;
.sparkBg("finish_resign/bg.png");
}
.close {
width: 79px;
height: 79px;
left: 336px;
top: 1031px;
position: absolute;
.sparkBg("finish_resign/close.png");
}
.title {
width: 231px;
height: 62px;
left: 259px;
top: 672px;
position: absolute;
.sparkBg("finish_resign/title.png");
}
.tip {
width: 682px;
height: 35px;
left: 46px;
top: 781px;
text-align: center;
position: absolute;
font-size: 36px;
line-height: 35px;
color: rgba(32, 16, 3, 1);
}
.know {
width: 280px;
height: 69px;
left: 234px;
top: 869px;
position: absolute;
.sparkBg("finish_resign/know.png");
}
}
......@@ -17,18 +17,25 @@ class Finish_task extends React.Component {
ModalCtrl.closeModal();
}
handleclose = () => {
ModalCtrl.closeModal();
}
render() {
const { title } = this.props;
return (
<div className="finish_task modal_center">
<span className="dongxiao"></span>
<span className="bg"></span>
<span className="line"></span>
<span className="title">xxx任务完成</span>
<span className="title">{title}任务完成</span>
<span className="tip1">打卡任务完成啦!</span>
<span className="tip2">继续保持哦!</span>
<Button className="know" onClick={this.handleknow} />
<span className="ribbon"></span>
<span className="ditu"></span>
<Button className="close" onClick={this.handleclose} />
</div>
);
}
......
......@@ -111,4 +111,14 @@
position: absolute;
.sparkBg("finish_task/ditu.png");
}
.close {
width: 79px;
height: 79px;
left: 336px;
// top: 1205px;
top: 1040px;
position: absolute;
.sparkBg("consume_credits/close.png");
}
}
\ No newline at end of file
......@@ -3,10 +3,13 @@
import React from "react";
import { observer } from "mobx-react";
import "./renewmodule.less";
import { Button } from "@grace/ui";
import { Button, Toast } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
import { pre_reduce_score } from "../../store/credits.js";
import Finish_resign from "../finish_resign/finish_resign.jsx";
@observer
class Renewmodule extends React.Component {
constructor(props) {
......@@ -20,48 +23,85 @@ class Renewmodule extends React.Component {
this.setState({ activeChoice: choice });
};
handleUse = (activeChoice) => {
handleUse = async (activeChoice, inferQg, inferJf, resignJf) => {
if (activeChoice === "credits") {
ModalCtrl.closeModal();
// 执行积分续签逻辑 todo
} else {
ModalCtrl.closeModal();
if (!inferJf) return Toast.show("积分不足");
await pre_reduce_score(
{
toPlaywayId: "challenge",
toActionId: "resign",
desc: "tresign_credits_desc",
credits: resignJf,
},
async () => {
const { success } = await API.getChallengeResign({
costType: 2,
ticket: store.ticketNum,
});
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_resign);
}
}
);
} else {
// 执行青果续签逻辑 todo
ModalCtrl.closeModal();
if (!inferQg) return Toast.show("青果不足");
const { success } = await API.getChallengeResign({ costType: 1 });
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_resign);
}
}
store.getTaskInfo();
};
render() {
const { activeChoice } = this.state;
const { hasChallengeDay, resignJf, resignQg, jfNum, qgNum } = this.props;
// qg是否足够
const inferQg = qgNum >= resignQg;
// 积分是否足够
const inferJf = jfNum >= resignJf;
// bg1、bg3 是红色背景 bg2、bg4是白色背景
return (
<div className="renewmodule modal_center">
<span className="bg"></span>
<span className="headline"></span>
<Button className="use" onClick={() => this.handleUse(activeChoice)} />
<Button
className="use"
onClick={() =>
this.handleUse(activeChoice, inferQg, inferJf, resignJf)
}
/>
<div
className="choice_credits"
onClick={() => this.handleClick("credits")}
>
<span className={activeChoice === "credits" ? "bg1" : "bg2"}></span>
<span className="tip1">消耗积分续签</span>
<span className="credits">当前积分:999999999</span>
<span className="credits">当前积分:{jfNum}</span>
<span className="consume_credits">
消耗<span className="count1">20000</span>积分进行续签
消耗<span className="count1">{resignJf}</span>积分进行续签
</span>
</div>
<div className="choice_qg" onClick={() => this.handleClick("qg")}>
<span className={activeChoice === "qg" ? "bg3" : "bg4"}></span>
<span className="tip2">消耗青果续签</span>
<span className="qg">当前青果:999999999</span>
<span className="qg">当前青果:{qgNum}</span>
<span className="consume_qg">
消耗<span className="count2">1000</span>青果进行续签
消耗<span className="count2">{resignQg}</span>青果进行续签
</span>
</div>
<span className="title2">
4月20日 <span className="special">未打卡</span>
{hasChallengeDay + 1} <span className="special">未打卡</span>
</span>
<span className="title1">已累计打卡x</span>
<span className="title1">已累计打卡{hasChallengeDay}</span>
</div>
);
}
......
......@@ -259,7 +259,7 @@
margin-top: 60px;
width: 675px;
height: auto;
padding-bottom: 130px;
padding-bottom: 130px;
.remind {
font-size: 26px;
......@@ -271,7 +271,15 @@
height: 46px;
}
.list{
.subcribe {
position: absolute;
left: 600px;
width: 61px;
height: 27px;
.webpBg("HomePage/未订阅.png");
}
.list {
position: relative;
top: 80px;
width: 675px;
......@@ -287,12 +295,46 @@
margin-left: 15px;
margin-bottom: 30px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
.webpBg("HomePage/sampleBg.png");
justify-content: center;
align-items: center;
text-align: center;
// .webpBg("HomePage/sampleBg.png");
.day-number {
font-size: 24px;
line-height: 1.2;
position: absolute;
}
.done {
position: absolute;
width: 67px;
height: 68px;
.webpBg("HomePage/sampleBg.png");
}
.renew {
position: absolute;
width: 67px;
height: 68px;
.webpBg("HomePage/renewBg.png");
}
}
.new-style {
position: relative;
width: 67px;
height: 67px;
margin-left: 15px;
margin-bottom: 30px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
.webpBg("HomePage/prizeBg.png");
}
}
}
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import { PageCtrl } from '@/core/ctrls/PageCtrl';
import { ModalCtrl } from '@/core/ctrls/ModalCtrl';
import Consume_qg from '../../../components/consume_qg/consume_qg';
import Consume_credits from '../../../components/consume_credits/consume_credits';
import Renewmodule from '../../../components/renewmodule/renewmodule';
@observer
class Check extends React.Component<any, any> {
......@@ -34,19 +35,17 @@ class Check extends React.Component<any, any> {
}
// 按钮
handlegofinish = (type, n) => {
console.log(this.state?.baseInfo)
handlegofinish = (type, n, code, title) => {
const { jfNum = 0, qgNum = 0 } = this.state?.baseInfo || {};
if (type === "xhqg") {
if (n <= qgNum) {
ModalCtrl.showModal(Consume_qg, { n });
ModalCtrl.showModal(Consume_qg, { n, code, title });
} else {
console.log("青果不足", qgNum);
Toast.show("很抱歉,您的青果不足");
}
} else if (type === "xhjf") {
if (n <= jfNum) {
ModalCtrl.showModal(Consume_credits, { n });
ModalCtrl.showModal(Consume_credits, { n, code, title });
} else {
Toast.show("很抱歉,您的积分不足");
}
......@@ -57,20 +56,24 @@ class Check extends React.Component<any, any> {
};
handlegosign = _asyncThrottle(() => {
//todo
})
handlegosign = _asyncThrottle((hasChallengeDay, resignJf, resignQg, { jfNum = 0, qgNum = 0 } = this.state?.baseInfo || {}) => {
ModalCtrl.showModal(Renewmodule, { hasChallengeDay, resignJf, resignQg, jfNum, qgNum });
});
handlefinish = _asyncThrottle(() => {
Toast.show("该任务已完成");
})
handlesubscribe = _asyncThrottle(() => {
// if (store?.homeInfo?.subscribe) return console.log('buxing');
// @ts-ignore
wx.miniProgram.reLaunch({ url: CFG.subUrl })
})
render() {
const { boolOpenChallenge,
challengeStartTime,
challengeEndTime,
choosedChallengeId,
hasChallengeDay,
const { boolOpenChallenge = 0,
choosedChallengeId = 0,
hasChallengeDay = 0,
boolNeedResign,
challengeConfigList = [],
taskInfoList = [],
......@@ -82,11 +85,14 @@ class Check extends React.Component<any, any> {
);
// 当前挑战信息
const { challengeTotalDay,
prizeName,
prizeImg,
resignJf,
resignQg,
const {
challengeTotalDay = 0,
challengeStartTime = 0,
challengeEndTime = 0,
prizeName = '',
prizeImg = '',
resignJf = 0,
resignQg = 0,
} = currentChallenge || {};
// 进度显示
......@@ -110,7 +116,9 @@ class Check extends React.Component<any, any> {
</div>
<div className="check-color" />
<div className="actTime">活动时间{dateFormatter(challengeStartTime, "yyyy.MM.dd")}-{dateFormatter(challengeEndTime, "MM.dd")}</div>
{challengeStartTime && challengeEndTime && (
<div className="actTime">活动时间{dateFormatter(challengeStartTime, "yyyy.MM.dd")}-{dateFormatter(challengeEndTime, "MM.dd")}</div>
)}
<div className="title-line"></div>
<div className="check-title">累计打卡挑战{challengeTotalDay || 0}</div>
......@@ -139,60 +147,66 @@ class Check extends React.Component<any, any> {
const renderActionButton = (code, completedSize, intervalLimitSize) => {
// 先判断是否为续签状态
if (boolNeedResign) {
return <Button className="gosign" onClick={this.handlegosign} />
return <Button className="gosign" onClick={() => this.handlegosign(hasChallengeDay, resignJf, resignQg)} />
} else if (completedSize < intervalLimitSize) {
switch (true) {
// 消耗青果
case code.startsWith("xhqg_"): {
const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10);
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("xhqg", n)}
onClick={() => this.handlegofinish("xhqg", n, code, title)}
/>
);
}
// 消耗积分
case code.startsWith("xhjf_"): {
const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10);
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("xhjf", n)}
onClick={() => this.handlegofinish("xhjf", n, code, title)}
/>
);
}
// 邀请用户助力
case code.startsWith("yqzl"): {
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("yqzl", '')}
onClick={() => this.handlegofinish("yqzl", '', code, title)}
/>
)
}
// 邀请新用户
case code.startsWith("yqzl_new"): {
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("yqzl_new", '')}
onClick={() => this.handlegofinish("yqzl_new", '', code, title)}
/>
)
}
// 扫码
case code.startsWith("scan_"): {
const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10);
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("scan", n)}
onClick={() => this.handlegofinish("scan", n, code, title)}
/>
);
}
// 浏览
case code.startsWith("browse_"): {
return (
<Button
className="gofinish"
onClick={() => this.handlegofinish("browse", '')}
onClick={() => this.handlegofinish("browse", '', code, title)}
/>
);
}
......@@ -225,16 +239,29 @@ class Check extends React.Component<any, any> {
<div className="calendar">
<span className="remind">提醒我签到 挑战失败重新开始</span>
<Button className="subcribe" onClick={this.handlesubscribe} />
<div className="list">
{Array.from({ length: challengeTotalDay }).map((_, dayIndex) => (
<div className="sample" key={dayIndex}>
<span className="day-number">{dayIndex + 1}</span>
<div
className={`sample ${dayIndex === challengeTotalDay - 1 ? 'new-style' : ''}`}
key={dayIndex}
>
{dayIndex <= hasChallengeDay - 1 && (
<span className="done"></span>
)}
{boolNeedResign && dayIndex === hasChallengeDay && (
<Button className="renew" onClick={() => this.handlegosign(hasChallengeDay, resignJf, resignQg)} />
)}
{dayIndex !== challengeTotalDay - 1 && (
<span className="day-number">{dayIndex + 1}</span>
)}
</div>
))}
</div>
</div>
</div>;
}
}
......
......@@ -72,6 +72,39 @@
.webpBg("MyPrize/use.png");
}
.yifafang {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/已发放.png");
}
.bufa {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/补发红包.png");
}
.fafangzhong {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/发放中.png");
}
.prizeImg {
position: absolute;
left: 30px;
......
import React from 'react';
import { observer } from 'mobx-react';
import './MyPrize.less';
import { Button } from "@grace/ui";
import { dateFormatter } from "@/utils/utils.ts";
import { Button, Toast } from "@grace/ui";
import { dateFormatter, miniGoUrl } from "@/utils/utils.ts";
import API from "@/api";
import { PageCtrl } from "@/core/ctrls/PageCtrl.tsx";
......@@ -31,14 +31,58 @@ class MyPrize extends React.Component<any, any> {
PageCtrl.backPage();
}
clickItem = (item) => {
if (item.url) {
location.href = item.url
clickItem = async (item) => {
const { id, url } = item
if (url) {
location.href = url
} else {
location.href = `/aaw/projectx/takePrize?projectOrderNo=${item.id}`
if (item.extra.refType === 'virtual') {
// 商家自冲奖品类型配置 {"prizeId":"奖品ID","type":"类型(1-专项特惠2-积分商城奖品3-积分奖品)"}
// 注意:旧的奖品没有type字段 需兼容
if (item?.extra.type == 1) {
return miniGoUrl(CFG.isNewMiniVersion ? "/packages/user/exclusiveOffer?source=duiba" : "/pagesNews/user/userRed")
} else if (item?.extra.type == 3) {
return miniGoUrl('/packages/user/points?source=duiba')
}
const res = await API.queryOrder({
recordId: item.id,
projectId: CFG.projectId
});
if (res?.orderNo) {
// 线上正式用这个
wx.miniProgram.reLaunch({
url:
(CFG.isNewMiniVersion ? "/pages/index?source=duiba&orderNo=" : "/pages/index/index?orderNo=")
+ id
+ "&activityId=" + (res?.activityId) + "&uid=" + (res?.uid) + "&activityUrl=" + encodeURIComponent(location.origin + "/projectx/" + CFG.projectId + '/index.html?jumpFlag=1') + '&uid=' + res?.uid
})
} else {
Toast.show('请稍后再试~')
}
} else {
location.href = `/aaw/projectx/takePrize?projectOrderNo=${id}`
}
}
}
handleyifafang = (item) => {
Toast.show("已发放")
}
handlebufa = async (item) => {
const { success } = await API.redpacket({
prizeRecordId: item.id,
});
if (success) {
this.initList();
}
}
handlefafangzhong = (item) => {
Toast.show("正在发放中,请耐心等待")
}
render() {
const { list } = this.state;
......@@ -49,15 +93,25 @@ class MyPrize extends React.Component<any, any> {
<div className="prizeList">
{
list.length > 0 ? list.map((item, index) => {
return <div className="prizeItem" key={index}>
<img className="prizeImg" src={item.extra.icon} />
<div className="prizeName">{item.extra.name}</div>
<div className="getTime">{dateFormatter(item.gmtCreate, "yyyy.MM.dd")}</div>
<Button className="use" onClick={this.clickItem.bind(this, item)} />
</div>
return (
<div className="prizeItem" key={index}>
<img className="prizeImg" src={item.extra.icon} />
<div className="prizeName">{item.extra.name}</div>
<div className="getTime">{dateFormatter(item.gmtCreate, "yyyy.MM.dd")}</div>
{item.type === 4 ? (
<>
{item.moneyStatus === 1 && <Button className="yifafang" onClick={() => this.handleyifafang(item)} />}
{item.moneyStatus === 10 && <Button className="bufa" onClick={() => this.handlebufa(item)} />}
{item.moneyStatus === 11 && <Button className="fafangzhong" onClick={() => this.handlefafangzhong(item)} />}
</>
) : (
<Button className="use" onClick={() => this.clickItem(item)} />
)}
</div>
)
// }) : <div className="nothing"/>
}) : null
}
}) : null
}
</div>
<Button className="MyPrizeBack" onClick={this.clickBack} />
......
/**
* 预扣积分相关接口
*/
import { Toast } from "@grace/ui";
import API from '../api/index';
import { runInAction } from "mobx";
import store from "../store/store.ts";
/** 设置积分门票 */
export const setTicketNum = (ticketNum) => {
runInAction(() => {
store.ticketNum = ticketNum;
});
};
let pollNum = 0;
/** 清除次数 */
export const clearPollNum = () => {
pollNum = 0;
};
export const setPollNum = () => {
pollNum++;
};
/** 预扣积分 */
export const pre_reduce_score = async (params, sucCb, failCb) => {
// showLoading();
const { toPlaywayId, toActionId, desc, credits, scoreFrom, type } = params
// 预扣积分
const res = await API.creditsCost({
toPlaywayId,
toActionId,
desc,
credits: credits,
scoreFrom
});
if (res?.success) {
setTicketNum(res?.data);
// 轮询查积分状态
pollCheck_change(sucCb, failCb);
} else {
// hideLoading();
failCb?.();
}
};
/**
* 轮询查积分扣除状态
* 0:处理中
* 1:成功
* 2:失败
*/
export const pollCheck_change = async (sucCb, failCb) => {
// 查询扣积分状态
const res = await API.queryStatus({
ticketNum: store.ticketNum,
}).catch((e) => {
// hideLoading();
failCb?.();
});
// 处理中
if (res?.success && res?.data == 0) {
if (pollNum > 9) {
Toast.show("网络异常,扣积分失败~");
clearPollNum();
// hideLoading();
failCb?.();
return;
}
setPollNum();
// 延时1s递归
setTimeout(() => {
pollCheck_change(sucCb, failCb);
}, 1000);
}
// 成功
if (res?.success && res?.data == 1) {
sucCb?.();
clearPollNum();
// hideLoading();
}
// 失败
if (res?.success && res?.data == 2) {
Toast.show(res?.message || "网络异常,积分稍后退回");
// hideLoading();
failCb?.();
}
// 接口报错
if (!res?.success) {
// hideLoading();
failCb?.();
}
};
......@@ -21,13 +21,13 @@ class Store {
shareInfo: IWxShareInfo,
ruleImg?: string,
} = {
shareInfo: {
title: "",
desc: "",
link: "",
imgUrl: "",
},
};
shareInfo: {
title: "",
desc: "",
link: "",
imgUrl: "",
},
};
ruleInfo = '';
......
......@@ -23,6 +23,16 @@ config();
=============================================== */
declare namespace wx {
interface MiniProgram {
reLaunch(params: {
url: string;
success?: (...args: any[]) => void;
fail?: (...args: any[]) => void;
complete?: (...args: any[]) => void;
}): void;
}
const miniProgram: MiniProgram;
type ImageSizeType = "original" | "compressed";
type ImageSourceType = "album" | "camera";
type VideoSourceType = "album" | "camera";
......
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