Преглед изворни кода

feat: mobile202207活动页

cuiyalong пре 3 година
родитељ
комит
d6a98ad4d3

+ 343 - 0
src/jfw/modules/app/src/web/templates/frontRouter/activity/sess/task-202207.html

@@ -0,0 +1,343 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+
+<head>
+  <!-- <title>投标人专属免费计划</title> -->
+    <title></title>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/task-common.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/task-202207.css?v={{Msg "seo" "version"}}' />
+    <!--E-当前页面的css资源-->
+    <style>
+        .j-container.app > .j-main {
+            margin-top: -21.34vw;
+        }
+        /* @font-face {
+            font-family:"YouSheBiaoTiHei";
+            font-display: swap;
+            src:url('/big-member/image/new_big_index/font/YouSheBiaoTiHei-2.ttf');
+        } */
+        @font-face {
+            font-family:"YouSheBiaoTiHei";
+            font-display: swap;
+            src:url('/jyapp/fonts/YouSheBiaoTiHei-2.ttf');
+        }
+    </style>
+    <script>
+        try {
+            window.JyObj.hiddenBottom('0')
+        } catch (e) {
+            console.log('error: app not function')
+        }
+    </script>
+</head>
+
+<body>
+    <div class="j-container app">
+        {{include "/big-member/header.html"}}
+        <div class="j-main" id="main-app" v-cloak>
+            <div class="activity-rules-button" id="activity-rules-button" v-show="false" @click="dialogShow('rule', true)">规则</div>
+            <div class="header-banner">
+                <img class="header-banner-img" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/header-banner.png" alt="">
+            </div>
+            <div class="content-container">
+                <!-- 预热 -->
+                <section class="section no-select section-yure" v-show="yureSectionShow">
+                    <div class="section-header">
+                        <div class="section-header-button">
+                            <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/title-yure@2x.png" alt="">
+                        </div>
+                    </div>
+                    <div class="section-content">
+                        <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/content-yure@2x.png" alt="">
+                        <div class="content-info">
+                            <div class="c-info-text" v-html="yureInfo.tipText"></div>
+                            <button
+                                class="c-info-button section-button button-small"
+                                @click="receiveYuReCoupon"
+                                :disabled="yureInfo.buttonDisabled"
+                                v-show="yureButtonShow"
+                                v-text="yureInfo.buttonText"></button>
+                        </div>
+                    </div>
+                </section>
+                <!-- 更多活动即将开启 -->
+                <div class="section no-select section-more-activities" v-show="yureSectionShow">
+                    <div class="section-header">
+                        <div class="header-text">
+                            <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/more-fuli-text@2x.png" alt="">
+                        </div>
+                    </div>
+                </div>
+                <!-- 福利一 -->
+                <div class="section no-select section-fuli1">
+                    <div class="section-header">
+                        <div class="section-header-button">
+                            <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/title-fuli1@2x.png" alt="">
+                        </div>
+                    </div>
+                    <div class="section-content coupon-list">
+                        <div
+                            v-for="item in couponList"
+                            :key="item.id"
+                            class="coupon-item">
+                            <div class="coupon-title">满<span v-text="item.Full"></span>可用</div>
+                            <div class="coupon-value"><span class="num" v-text="item.Reduce">50</span>元</div>
+                            <button class="section-button button-small" @click="receiveActiveCoupon([item])" v-text="receiveActiveButtonText(item)"></button>
+                            <div class="coupon-text" v-text="item.tipText"></div>
+                        </div>
+                    </div>
+                    <div class="section-footer">
+                        <button class="section-button button-middle" :disabled="couponList.length === 0" @click="receiveActiveCoupon(couponList)">一键领取</button>
+                    </div>
+                </div>
+                <!-- 福利二 -->
+                <div class="section no-select section-fuli2 progress-section">
+                    <div class="section-header">
+                        <div class="section-header-button">
+                            <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/title-fuli2@2x.png" alt="">
+                        </div>
+                    </div>
+                    <div class="section-content mission-list" ref="missions">
+                        <img src="/common-module/active/2022.7/gift-box.png" alt="" class="mission-list-img">
+                        <div
+                            class="mission-list-item floating"
+                            :class="{ complete: item.complete, hide: item.hide, [item.id]: true, [item.className]: true }"
+                            v-for="item in missionsList"
+                            :id="'bubble-' + item.id"
+                            :style="{ left: item.x + 'rem', top: item.y + 'rem' }"
+                            @click="onClickReceive('mission', item)"
+                            :key="item.id">
+                            <div class="m-list-item-bg">
+                                <span class="num"><span class="num-add">+</span>${ item.num }</span>
+                                <span class="text" v-text="item.unit"></span>
+                                <span class="button" :id="'bubble-button--' + item.id">${ item.complete ? '点击领取' : '去完成' }</span>
+                            </div>
+                            <div class="m-list-item-text" v-text="item.name"></div>
+                        </div>
+                    </div>
+                    <div class="section-footer">
+                        <div class="progress-bar-container">
+                            <div class="progress-bar">
+                                <div
+                                    class="anchor"
+                                    v-for="a in progressAnchorList"
+                                    :key="a.rate"
+                                    :style="{ left: a.rate + '%' }"
+                                    :class="a.className">
+                                    <div class="anchor-text">${ a.anchorText }</div>
+                                    <div class="point-img" v-if="a.pointImg">
+                                        <img :src="progress.pointImgMap[a.pointImg]" alt="">
+                                    </div>
+                                    <div class="anchor-tip-text" v-show="a.tipText && false">
+                                        <p>免费领</p>
+                                        <p v-text="a.tipText"></p>
+                                    </div>
+                                </div>
+                                <div class="progress-bar-content" :style="{ width: rate + '%' }">
+                                    <div class="blink-point"></div>
+                                    <div class="blink-point-text anchor-text" v-show="blinkTextShow">${progress.current}剑鱼币</div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="progress-action-list">
+                            <button
+                                class="progress-action-button"
+                                :class="{ pointer: a.className === 'wait' }"
+                                :disabled="a.className === 'received'"
+                                v-for="(a, index) in progressAnchorList"
+                                v-if="a.tipText"
+                                :id="'progress-reward--' + a.id"
+                                @click="onClickReceive('schedule', a)"
+                                :key="index">${a.className === 'received' ? '已' : '免费'}领${a.tipText}</button>
+                        </div>
+                    </div>
+                </div>
+                <!-- 福利三 -->
+                <div class="section section-fuli3">
+                    <div class="section-header">
+                        <div class="section-header-button">
+                            <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/title-fuli3@2x.png" alt="">
+                        </div>
+                    </div>
+                    <div class="section-content entniche-card-list">
+                        <div class="entniche-card-item shangji"></div>
+                        <div class="entniche-card-item zhuanjia"></div>
+                    </div>
+                    <div class="section-footer">
+                        <div class="button-group">
+                            <button class="section-button learn-more" @click="toMemberPage">了解更多</button>
+                            <button class="section-button button-middle" @click="receiveFuli3">立即体验</button>
+                        </div>
+                        <div class="text">
+                            <p>满足企业多人使用 多场景赋能业务增长</p>
+                            <p>详情请致电咨询:400-108-6670</p>
+                        </div>
+                    </div>
+                </div>
+                <!-- 顶部悬浮 -->
+                <div class="fixed-top top-timeline" v-show="false">
+                    <div class="timeline-list">
+                        <div class="timeline-item yure" data-s-class="section-yure" v-show="activeState === 'waiting' || activeState === 'yureing'">
+                            <div class="t-left">预热福利</div>
+                            <div class="t-right">
+                                <div class="t-r-bottom">
+                                    <div class="t-r-b-l2">7.25-7.31</div>
+                                    <div class="t-r-b-r2">未开始</div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="timeline-item fuli1" data-s-class="section-fuli1">
+                            <div class="t-left">福利一</div>
+                            <div class="t-right">
+                                <div class="t-r-bottom" v-if="activeState === 'waiting' || activeState === 'yureing'">
+                                    <div class="t-r-b-l">距开始</div>
+                                    <div class="t-r-b-r" v-text="lastTimeText"></div>
+                                </div>
+                                <div class="t-r-bottom" v-else>
+                                    <div class="t-r-b-l2">8.1-8.14</div>
+                                    <div class="t-r-b-r2" v-text="activeState === 'ended' ? '已结束' : '进行中'"></div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="timeline-item fuli2" data-s-class="section-fuli2">
+                            <div class="t-left">福利二</div>
+                            <div class="t-right">
+                                <div class="t-r-bottom" v-if="activeState === 'waiting' || activeState === 'yureing'">
+                                    <div class="t-r-b-l">距开始</div>
+                                    <div class="t-r-b-r" v-text="lastTimeText"></div>
+                                </div>
+                                <div class="t-r-bottom" v-else>
+                                    <div class="t-r-b-l2">8.1-8.14</div>
+                                    <div class="t-r-b-r2" v-text="activeState === 'ended' ? '已结束' : '进行中'"></div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="timeline-item fuli3" data-s-class="section-fuli3">
+                            <div class="t-left">福利三</div>
+                            <div class="t-right">
+                                <div class="t-r-bottom" v-if="activeState === 'waiting' || activeState === 'yureing'">
+                                    <div class="t-r-b-l">距开始</div>
+                                    <div class="t-r-b-r" v-text="lastTimeText"></div>
+                                </div>
+                                <div class="t-r-bottom" v-else>
+                                    <div class="t-r-b-l2">8.1-8.14</div>
+                                    <div class="t-r-b-r2" v-text="activeState === 'ended' ? '已结束' : '进行中'"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 右侧悬浮 -->
+                <div class="fixed-right">
+                    <button class="fixed-action-button" @click="dialogShow('rule', true)">活动<br />规则</button>
+                    <button class="fixed-action-button" @click="dialog.myReward = true">我的<br />奖励</button>
+                </div>
+            </div>
+            <!-- 我的奖励 -->
+            <van-popup
+                v-model="dialog.myReward"
+                closeable
+                position="bottom"
+                class="reward-section"
+                round
+                get-container="body"
+                :style="{ maxHeight: '60%' }">
+                <section class="reward-card-container j-container no-select">
+                    <div class="r-header text-gradient-red"><div class="text-gradient-red">我的奖励</div></div>
+                    <div class="reward-card j-main section-card">
+                        <div class="reward-list" :class="{ empty: rewardList.length === 0 }">
+                            <div
+                                class="reward-list-item"
+                                v-for="item in rewardList"
+                                @click="onClickListItem(item)"
+                                :key="item.id">
+                                <span class="r-l-i-l j-icon-bg" :class="'icon-bg-' + item.icon"></span>
+                                <div class="r-l-i-c">
+                                    <div class="r-l-i-c-t">
+                                        <span class="reward-text" v-text="item.rewardText"></span>
+                                        <div class="receive-from" v-text="item.receiveFrom"></div>
+                                    </div>
+                                    <div class="receive-time" v-text="item.receiveTime"></div>
+                                </div>
+                                <div class="r-l-i-action">
+                                    <van-icon name="arrow"></van-icon>
+                                </div>
+                            </div>
+                            <div class="reward-empty" v-if="rewardList.length === 0">暂未获得奖励,快去完成任务吧</div>
+                        </div>
+                    </div>
+                </section>
+            </van-popup>
+            <!--S-弹窗-->
+            <van-popup id="active-tip-modal" v-model="dialog.show" :data-modal-type="dialog.type" :close-on-click-overlay="dialog.type !== 'over'">
+              <div v-show="dialog.type === 'rule'" class="modal-dialog active-tip--rule" :class="{max: getScreenMax}">
+                <h5 class="text-gradient-red">活动规则</h5>
+                <div class="rule-content">
+                  <div
+                    class="rule-item"
+                    v-for="(item, index) in rulesList"
+                    :key="index">
+                    <div class="rule-index">${ index + 1 }.</div>
+                    <div class="rule-text">${ item.text }</div>
+                  </div>
+                </div>
+                <button @click="dialogShow('rule', false)" id="dialog-button--rule">我知道了</button>
+                <img class="bg-image" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/dialog-bg-big@2x.png?v={{Msg "seo" "version"}}' alt="扫一扫">
+              </div>
+              <div v-show="dialog.type === 'over'" class="modal-dialog active-tip--over">
+                <div class="close-dialog-icon" @click="dialog.show = false" id="dialog-icon--over" v-if="!forbidClose">
+                  <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.5.20/close.png?v={{Msg "seo" "version"}}' alt="x">
+                </div>
+                <h4>活动结束提醒</h4>
+                <img width="148" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.5.20/empty.png?v={{Msg "seo" "version"}}' alt="活动已结束">
+                <p>
+                  对不起,该活动已结束
+                  <br>
+                  可前往参加“邀请领好礼活动
+                </p>
+                <button @click="onClickReceive('', { id: 'invite' })" id="dialog-button--over">立即前往</button>
+              </div>
+              <div v-show="dialog.type === 'success'" class="modal-dialog active-tip--success">
+                <h5 class="text-gradient-red">领取成功</h5>
+                <p>
+                  恭喜成功领取<i style="font-weight: bold">${dialog.giftMonth}个月</i>超级订阅
+                  <br>
+                  <span>可在“我的奖励”中查看</span>
+                </p>
+                <button @click="dialogShow('success', false)" id="dialog-button--success">我知道了</button>
+                <img class="bg-image" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/dialog-bg@2x.png?v={{Msg "seo" "version"}}' alt="领取成功">
+              </div>
+            </van-popup>
+            <!--E-弹窗-->
+        </div>
+    </div>
+
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js> </script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js> </script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js> </script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/moment/2.29.1/min/moment.min.js></script>
+    {{include "/big-member/commonjs.html"}}
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+    <script>
+        $(function () {
+            var header = $('.j-header.jy-app-header')
+            header.addClass('transparent-header')
+                .find('.header-left .j-icon')
+                .removeClass('icon-back')
+                .addClass('icon-back-white')
+            header.find('.header-right')
+                .html('')
+        })
+    </script>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/active/2022.7/task-202207.js?v={{Msg "seo" "version"}}'></script>
+    {{include "/common/baiducc.html"}}
+</body>
+
+</html>

BIN
src/web/staticres/common-module/active/2022.7/button-middle@2x.png


BIN
src/web/staticres/common-module/active/2022.7/button-small@2x.png


BIN
src/web/staticres/common-module/active/2022.7/content-yure@2x.png


BIN
src/web/staticres/common-module/active/2022.7/dialog-bg-big@2x.png


BIN
src/web/staticres/common-module/active/2022.7/entniche-shangji@2x.png


BIN
src/web/staticres/common-module/active/2022.7/entniche-zhuanjia@2x.png


BIN
src/web/staticres/common-module/active/2022.7/header-banner.png


BIN
src/web/staticres/common-module/active/2022.7/more-fuli-text@2x.png


+ 619 - 0
src/web/staticres/common-module/active/2022.7/task-202207.css

@@ -0,0 +1,619 @@
+.content-container img,
+.header-banner img,
+.point-img img {
+  display: block;
+  width: 100%;
+}
+.section:not(:first-of-type, :last-of-type) {
+  margin-bottom: .8rem;
+}
+.header-banner {
+  position: relative;
+}
+.header-strategy {
+  position: relative;
+  margin-top: -0.04rem;
+  background-color: #D10F06;
+  z-index: 1;
+}
+
+.content-container {
+  padding: .48rem 0;
+  background: linear-gradient(127deg, #FF6A63 0%, #D54841 100%);
+}
+.section {
+  padding: 0 .24rem;
+  margin-bottom: .48rem;
+}
+.section .section-header {
+  margin-bottom: .24rem;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.section .section-content {
+  position: relative;
+}
+.section .section-footer {
+  margin-top: .3rem;
+}
+
+.section .section-header-button {
+  width: 13.92rem;
+}
+
+.section-button {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: .4rem;
+  font-weight: bold;
+  color: #E8100D;
+  line-height: .46rem;
+  background-color: transparent;
+  background-repeat: no-repeat;
+  background-size: contain;
+  cursor: pointer;
+}
+.section-button:disabled {
+  color: #FF7876;
+}
+
+.section-button.button-middle {
+  width: 4.8rem;
+  height: 1.04rem;
+  background-image: url(/common-module/active/2022.7/button-middle@2x.png);
+  background-size: 100% 100%;
+}
+.section-button.button-small {
+  width: 3.36rem;
+  height: 0.96rem;
+  background-image: url(/common-module/active/2022.7/button-small@2x.png);
+  background-size: 100% 100%;
+}
+
+
+.section-yure .content-info {
+  position: absolute;
+  left: 50%;
+  bottom: .3rem;
+  transform: translateX(-50%);
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.section-yure .c-info-text {
+  display: flex;
+  align-items: center;
+  font-size: .44rem;
+  font-family: 'YouSheBiaoTiHei';
+  line-height: .52rem;
+  text-shadow: 2px 3px 0px #CF1627;
+  white-space: nowrap;
+}
+.section-yure .c-info-text .num {
+  font-size: .82rem;
+  line-height: 1rem;
+}
+
+.section-more-activities .section-header {
+  padding: 0 .18rem;
+}
+
+.section-fuli1 .coupon-list {
+  display: flex;
+  flex-wrap: wrap;
+}
+.section-fuli1 .coupon-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 3.34rem;
+  height: 3.44rem;
+  margin: .14rem 0;
+  margin-right: .28rem;
+  font-size: .32rem;
+  color: #E80E0D;
+  background-image: url(/common-module/active/2022.7/coupon-bg@2x.png);
+  background-repeat: no-repeat;
+  background-size: contain;
+  text-align: center;
+}
+.section-fuli1 .coupon-item:nth-of-type(2n) {
+  margin-right: 0;
+}
+.coupon-item .coupon-title {
+  line-height: .68rem;
+}
+.coupon-item .coupon-value .num {
+  font-size: 1.12rem;
+  line-height: 1.02rem;
+}
+.coupon-item .section-button {
+  margin-top: .32rem;
+}
+.coupon-item .button-small {
+  width: 2.36rem;
+  height: 0.76rem;
+}
+.coupon-item .coupon-text {
+  margin: .12rem;
+  font-size: .24rem;
+  color: #fff;
+  white-space: nowrap;
+}
+.section-fuli1 .section-footer {
+  margin: .8rem 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.section-fuli2 .mission-list {
+  /* background-color: pink; */
+}
+.section-fuli2 .section-header {
+  margin-bottom: 0;
+}
+.section-fuli2 .mission-list-img {
+  width: 100%;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%,-50%) scale(1.2);
+  z-index: 1;
+}
+
+.section-fuli3 .section-header {
+  margin-bottom: .24rem;
+}
+.section-fuli3 .entniche-card-list {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.section-fuli3 .entniche-card-item {
+  width: 3.36rem;
+  height: 5.61rem;
+  background-repeat: no-repeat;
+  background-size: contain;
+}
+.entniche-card-item.shangji {
+  background-image: url(/common-module/active/2022.7/entniche-shangji@2x.png);
+}
+.entniche-card-item.zhuanjia {
+  background-image: url(/common-module/active/2022.7/entniche-zhuanjia@2x.png);
+}
+.section-fuli3 .button-group {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.section-fuli3 .button-group .section-button {
+  flex: 1;
+  font-size: .32rem;
+  font-weight: bold;
+  height: 0.72rem;
+  line-height: .28rem;
+  border-radius: .5rem;
+}
+.section-fuli3 .learn-more {
+  margin-right: .3rem;
+  font-weight: normal;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: 1px solid #fff;
+  color: #fff;
+}
+
+.section-fuli3 .text {
+  margin: .64rem 0;
+  font-size: .28rem;
+  line-height: .48rem;
+  color: #fff;
+  text-align: center;
+}
+
+.fixed-top {
+  position: fixed;
+  top: 1.72rem;
+  left: 0;
+  width: 100%;
+  z-index: 2;
+}
+.fixed-right {
+  position: fixed;
+  top: 3rem;
+  right: .16rem;
+  display: flex;
+  flex-direction: column;
+  z-index: 2;
+}
+.fixed-action-button {
+  margin-bottom: .18rem;
+  padding-right: 0.14rem;
+  color: #fff;
+  width: 0.76rem;
+  height: 0.84rem;
+  font-size: .24rem;
+  line-height: .28rem;
+  background-color: transparent;
+  background-image: url(/common-module/active/2022.7/float-button-bg@2x.png);
+  background-repeat: no-repeat;
+  background-size: contain;
+}
+
+.timeline-list {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  height: 100%;
+  margin: 0 .16rem;
+  border-radius: .16rem;
+  overflow: hidden;
+}
+.timeline-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  height: 100%;
+  padding: .08rem 0;
+  font-size: .24rem;
+  color: #171826;
+  background-color: #fff;
+  cursor: pointer;
+}
+.timeline-item:not(:last-of-type) {
+  border-right: 1px solid #ececec;
+}
+.timeline-item .t-left {
+  font-size: .28rem;
+  font-weight: bold;
+  line-height: .32rem;
+}
+.timeline-item .t-r-top {
+  line-height: .32rem;
+}
+.timeline-item .t-r-bottom {
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+}
+.timeline-item .t-r-b-l,
+.timeline-item .t-r-b-l2 {
+  margin: .08rem 0;
+}
+
+/* 第一种类型 */
+.timeline-item .t-r-b-l {
+  color: #5E5B5B;
+}
+.timeline-item .t-r-b-r {
+  color: #E30101;
+}
+/* 第二种 */
+.timeline-item .t-r-bottom {
+  color: #E30101;
+}
+
+.timeline-item.active {
+  color: #fff;
+  background-color: #E30101;
+}
+/* 高亮1 */
+.timeline-item.active .t-r-b-l,
+.timeline-item.active .t-r-b-l2,
+.timeline-item.active .t-r-b-r,
+.timeline-item.active .t-r-b-r2 {
+  color: #fff;
+}
+
+
+/* 我的奖励 */
+.reward-section {
+  height: 60vh;
+}
+.reward-section .van-popup__close-icon {
+  background: #FF8411;
+  border-radius: 50%;
+  padding: .08rem;
+  color: #fff;
+  font-size: .24rem;
+}
+.reward-section .van-popup__close-icon--top-right {
+  top: .48rem;
+  right: .32rem;
+}
+.reward-section .r-header {
+  padding: .44rem .32rem .28rem;
+  height: 1.28rem;
+  font-size: .4rem;
+  line-height: .46rem;
+  background: linear-gradient(to bottom, #FFE5B3 0%, #FFEFDD 100%);
+}
+.reward-section .el-dialog {
+  border-radius: 25px;
+  background: #FFEFDD;
+}
+.reward-section .el-dialog__header {
+  padding: 28px 24px 12px;
+  text-align: center;
+}
+.reward-section .el-dialog__title {
+  color: #F01313;
+  font-size: 24px;
+  font-weight: bold;
+  line-height: 28px;
+}
+.reward-section .el-dialog__close {
+  font-size: 26px;
+  font-weight: bold;
+  color: #F01313!important;
+}
+.reward-section .el-dialog__body {
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.reward-card {
+  padding: 8px;
+  background: #FDF0E1;
+}
+.reward-list-header {
+  font-size: 20px;
+  font-weight: bold;
+  color: #1D1D1D;
+  line-height: 22px;
+}
+.reward-list {
+  padding: 6px 0;
+}
+.reward-card .j-icon {
+  width: 48px;
+  height: 48px;
+}
+.reward-card .tr {
+  display: flex;
+}
+.reward-card .td {
+  display: flex;
+  align-items: center;
+  padding: 16px;
+}
+.reward-card .tr .td:nth-of-type(1),
+.reward-card .tr .td:nth-of-type(2) {
+  flex: 4;
+}
+.reward-card .tr .td:nth-of-type(3) {
+  flex: 3;
+}
+.reward-card .tr .td:nth-of-type(4) {
+  flex: 1;
+}
+.reward-card .r-l-i-name .j-icon {
+  margin-right: 4px;
+}
+.table-line {
+  height: 5px;
+  width: 100%;
+  background: #F7A661;
+  box-shadow: inset 0px 6px 8px 1px rgba(255, 255, 255, 0.4);
+  border-radius: 20px;
+}
+.reward-action-button {
+  padding: 2px 12px;
+  color: #fff;
+  font-size: 16px;
+  line-height: 24px;
+  background: linear-gradient(176deg, #FA8920 0%, #FB4D27 65%, #DD1515 100%);
+  border-radius: 14px;
+}
+.reward-empty {
+  font-size: 16px;
+  font-weight: 400;
+  color: #AAAAAA;
+  line-height: 24px;
+  text-align: center;
+  padding-top: 78px;
+  padding-bottom: 67px;
+}
+
+.reward-list-item {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: .36rem 0;
+}
+.reward-list-item:not(:last-of-type) {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+}
+.reward-list-item .r-l-i-l {
+  width: .8rem;
+  height: .8rem;
+}
+.reward-list-item .r-l-i-c {
+  margin: 0 .16rem;
+  flex: 1;
+}
+.reward-list-item .r-l-i-c-t {
+  margin-bottom: .16rem;
+  display: flex;
+  align-items: center;
+}
+.reward-list-item .r-l-i-action {
+  font-size: .48rem;
+  color: #FFCD6A;
+}
+.reward-list-item .reward-text {
+  margin-right: .16rem;
+  font-size: .32rem;
+  color: #171826;
+  line-height: .4rem;
+}
+.reward-list-item .receive-from {
+  padding: .04rem .16rem;
+  font-size: .2rem;
+  color: #171826;
+  line-height: .32rem;
+  background: linear-gradient(135deg, #FFCC66 0%, #FFECC5 100%);
+  border-radius: .2rem 0 0 .2rem;
+  white-space: nowrap;
+}
+.reward-list-item  .receive-time {
+  font-size: .24rem;
+  color: #9B9CA3;
+  line-height: .28rem;
+}
+
+
+
+.activity-rules-button {
+  position: absolute;
+  right: 0;
+  top: 30%;
+  z-index: 9;
+  padding: .12rem .08rem;
+  writing-mode: vertical-lr;
+  background: linear-gradient(272deg, rgba(233, 138, 95, 0.5) 0%, #DB5634 100%);
+  border-radius: .12rem 0px 0px .12rem;
+  color: #fff;
+  font-size: .24rem;
+  line-height: .28rem;
+  /* border: 1px solid #FCAB11; */
+}
+.activity-rules-button::after {
+  /* content: ''; */
+  position: absolute;
+  top: -0.04rem;
+  bottom: -0.04rem;
+  left: -0.04rem;
+  right: -0.04rem;
+  background: linear-gradient(180deg, rgba(255, 216, 216, 0), rgba(255, 216, 216, 1));
+  z-index: -1;
+  border-radius: .12rem 0px 0px .12rem;
+}
+
+#active-tip-modal.van-popup {
+  background:transparent;
+}
+#active-tip-modal[data-modal-type='success'] .modal-dialog.active-tip--success,#active-tip-modal[data-modal-type='over'] .modal-dialog.active-tip--over,#active-tip-modal[data-modal-type='code'] .modal-dialog.active-tip--rule {
+  display:flex;
+}
+.active-tip--success,.active-tip--over,.active-tip--rule {
+  position:relative;
+  display:flex;
+  flex-direction:column;
+  align-items:center;
+  width:6.06rem;
+  height:8rem;
+  margin:0 auto;
+  top:calc(50% - 4rem);
+  border-radius:0.24rem;
+  overflow:hidden;
+}
+.active-tip--rule {
+  height: 11.6rem;
+}
+.active-tip--success button,.active-tip--over button,.active-tip--rule button {
+  width:4.62rem;
+  height:0.96rem;
+  font-size:0.32rem;
+  font-weight:500;
+  color:#fff;
+  border-radius:0.48rem;
+  background: linear-gradient(90deg, #FE542F 0%, #F01313 100%);
+  box-shadow: inset 0px 0px 4px 1px rgba(236,143,4,0.25);
+}
+.active-tip--success .bg-image,.active-tip--rule .bg-image {
+  position:absolute;
+  z-index:-1;
+  width:100%;
+}
+.active-tip--success p span {
+  display:inline-block;
+  margin-top:0.22rem;
+  margin-bottom:1rem;
+  font-size:0.24rem;
+  line-height:0.28rem;
+}
+.active-tip--success p {
+  font-size:0.32rem;
+  font-weight:400;
+  color:#171826;
+  line-height:0.38rem;
+  text-align:center;
+}
+.active-tip--success h5,.active-tip--rule h5 {
+  font-size:0.4rem;
+  font-weight:bold;
+  line-height:0.46rem;
+}
+.active-tip--success h5 {
+  margin-top:3rem;
+  margin-bottom:1rem;
+}
+.active-tip--rule h5 {
+  margin-top:2.5rem;
+  margin-bottom:.32rem;
+}
+.active-tip--over {
+  background-color:#fff;
+}
+.active-tip--over h4 {
+  font-size:0.4rem;
+  font-weight:bold;
+  color:#171826;
+  line-height:0.56rem;
+  margin-top:0.64rem;
+  margin-bottom:0.4rem;
+}
+.active-tip--over p {
+  margin-top:0.32rem;
+  margin-bottom:0.56rem;
+  font-size:0.28rem;
+  font-weight:500;
+  color:#5F5E64;
+  line-height:0.4rem;
+  text-align:center;
+}
+.active-tip--rule .rule-content .rule-item  + .rule-item {
+  margin-top: 0.16rem;
+}
+.active-tip--rule .rule-content .rule-item {
+  display: flex;
+  flex-direction: row;
+}
+.active-tip--rule .rule-content .rule-index {
+  padding-right: 0.04rem;
+}
+.active-tip--rule.max {
+  height: 8rem;
+}
+.active-tip--rule.max .rule-content {
+  max-height: 3.68rem;
+  overflow: auto;
+}
+.active-tip--rule .rule-content {
+  font-size:0.22rem;
+  font-weight:400;
+  color:#171826;
+  line-height: 0.28rem;
+  padding: 0 0.24rem;
+  margin-bottom: 0.3rem;
+  max-height: 5.4rem;
+  overflow-y: scroll;
+}
+
+.close-dialog-icon img {
+  width:0.32rem;
+}
+.close-dialog-icon {
+  position:absolute;
+  top:0;
+  right:0;
+  padding:0.24rem;
+  cursor:pointer;
+}

+ 961 - 0
src/web/staticres/common-module/active/2022.7/task-202207.js

@@ -0,0 +1,961 @@
+function Point (x, y) {
+  this.x = x
+  this.y = y
+}
+function Map (w, h) {
+  this.width = w
+  this.height = h
+}
+// 画布中生成随机不重叠的坐标
+// 坐标点以左上角为中心
+function RandomCoordinate (conf) {
+  conf = conf || {}
+  this.el = conf.el || '' // 画布选择器或者dom
+  this.pointSize = conf.pointSize || new Map(1, 1) // 坐标点半径(最大)
+  this.total = conf.total || 1 // 生成多少个随机不重叠坐标
+  this.pointCoordList = [] // 生成坐标点数组
+
+  this.init = function () {
+    if (!this.el) return console.warn('画布选择器必传')
+    // 获取画布宽高
+    this.map = this.getMapSize()
+    this.getPointCoordLimits()
+    this.create()
+  }
+
+  this.getMapSize = function () {
+    this.$el = $(this.el)
+    var w = this.$el.width()
+    var h = this.$el.height()
+    return new Map(w, h)
+  }
+
+  this.getPointCoordLimits = function () {
+    var xMax = this.map.width - this.pointSize.width
+    var yMax = this.map.height - this.pointSize.height
+    if (xMax <= 0) {
+      xMax = 1
+    }
+    if (yMax <= 0) {
+      yMax = 1
+    }
+    this.coordLimits = new Point(xMax, yMax)
+  }
+
+  // this.check
+  // 检查是否和已创建的有重叠
+  this.checkListOverlap = function (p) {
+    if (this.pointCoordList.length <= 0) return true
+    var pass = true // pass,所有都不重叠
+    for (var i = 0; i < this.pointCoordList.length; i++) {
+      var overlap = this.checkOverlap(p, this.pointCoordList[i])
+      if (overlap) {
+        pass = false
+        break
+      }
+    }
+    return pass
+  },
+  // point为矩形左上的碰撞检测:碰撞返回true
+  // 利用两圆相切,圆心距离小于2r表示两圆相交(r圆半径)。把矩形对角线看作圆的直径
+  // 如果两个矩形左上角的点间距离大于矩形对角线长度,则认为两矩形无碰撞(无重叠)
+  // 参考:https://segmentfault.com/a/1190000017463616
+  this.checkOverlap = function (nPoint, oPoint) {
+    // 两矩形左上角坐标距离(三角函数)
+    // https://www.qttc.net/171-javascript-get-two-points-distance.html
+    var dx = Math.abs(nPoint.x - oPoint.x)
+    var dy = Math.abs(nPoint.y - oPoint.y)
+    var distance = Math.sqrt(dx * dx + dy * dy)
+
+    // 矩形对角线长度
+    var w = this.pointSize.width
+    var h = this.pointSize.height
+    var diagonal = Math.sqrt(w * w + h * h)
+
+    return distance <= diagonal
+  }
+
+  // 创建一个坐标
+  this.createOne = function () {
+    var createTimes = 0
+    var createFailTimes = 0
+    var maxCreateFailTime = 200
+    var x,y
+    while (createFailTimes < maxCreateFailTime) {
+      createTimes++
+      x = Math.floor(Math.random() * this.coordLimits.x)
+      y = Math.floor(Math.random() * this.coordLimits.y)
+      var point = new Point(x, y)
+      var pass = this.checkListOverlap(point)
+      if (pass) {
+        this.pointCoordList.push(point)
+        break
+      } else {
+        createFailTimes++
+      }
+    }
+    if (createFailTimes >= maxCreateFailTime) {
+      console.log('随机生成坐标%s次失败,停止随机生成', maxCreateFailTime)
+    } else {
+      console.log('随机生成坐标次数:%s,\n随机生成坐标失败次数:%s\n获得坐标:', createTimes, createFailTimes, JSON.stringify(point))
+    }
+  }
+
+  this.create = function () {
+    for (var i = 0; i < this.total; i++) {
+      this.createOne()
+    }
+    this.pointCoordList = this.pointCoordList.sort(function (a, b) {
+      return a.x - b.x
+    })
+  }
+
+  this.init()
+}
+
+// 判断活动是否结束
+var initPageTime = new Date().getTime()
+var initActiveOverCheck = -1
+function activeOverCheck (endTime, callback) {
+  if (initPageTime >= endTime) {
+    return callback()
+  }
+  clearTimeout(initActiveOverCheck)
+  var reloadTime = endTime - new Date().getTime()
+  if (reloadTime <= (10 * 60 * 1000) ) {
+    initActiveOverCheck = setTimeout(function () {
+      callback && callback()
+    }, reloadTime)
+  }
+}
+
+var task = new Vue({
+  el: '#main-app',
+  delimiters: ['${', '}'],
+  data: {
+    platform: 'app',
+    conf: {
+      before: 0, // 单位: s
+      clock: '10:00:00',
+      end: 0, // 单位: s
+      now: 0, // 单位: s
+      start: 0 // 单位: s
+    },
+    activeState: '',
+    lastTimestamp: 0, // 单位: ms
+    yureConf: {
+      total: 0,
+      got: false
+    },
+    yureInfo: {
+      timerId: null,
+      tipText: '',
+      buttonText: '点击免费领',
+      buttonDisabled: false
+    },
+    couponList: [],
+    progress: {
+      min: 0,
+      max: 1500,
+      current: 0, // 当前剑鱼币
+      pointImgMap: {
+        unreceived: '/common-module/active/2022.5.20/unreceived@2x.png',
+        received: '/common-module/active/2022.5.20/received@2x.png',
+        wait: '/common-module/active/2022.5.20/received@2x.png'
+      },
+      anchorList: [
+        {
+          id: '',
+          className: 'first',
+          rate: 0, // 进度,单位%,最大为100
+          pointImg: '', // ''/unreceived/received
+          anchorText: '0剑鱼币'
+        },
+        {
+          id: '800',
+          className: 'unreceived',
+          rate: 80,
+          pointImg: 'unreceived',
+          anchorText: '800剑鱼币',
+          tipText: '1个月超级订阅'
+        },
+        {
+          id: '1500',
+          className: 'unreceived',
+          rate: 100,
+          pointImg: 'unreceived',
+          anchorText: '1500剑鱼币',
+          tipText: '1个月超级订阅'
+        }
+      ],
+    },
+    // 任务球
+    missionsList: [
+      {
+        id: 'buyvip',
+        className: '',
+        x: 0.2,
+        y: 0.94, // rem
+        num: 800,
+        unit: '剑鱼币',
+        complete: false,
+        hide: true,
+        name: '购买超级订阅' // 任务描述
+      },
+      {
+        id: 'invite',
+        className: 'delay-100',
+        x: 2.84,
+        y: 0.06,
+        num: 500,
+        unit: '剑鱼币',
+        complete: false,
+        hide: true,
+        name: '邀请领好礼'
+      },
+      {
+        id: 'share',
+        className: 'delay-300',
+        x: 4.8,
+        y: 0.82,
+        num: 200,
+        unit: '剑鱼币',
+        complete: false,
+        hide: true,
+        name: '分享活动'
+      }
+    ],
+    copyLinkText: location.href,
+    rewardList: [],
+    dialog: {
+      show: false,
+      giftMonth: 1,
+      type: 'rule',
+      myReward: false // 奖励弹窗
+    },
+    rulesList: [
+      {
+        text: '活动时间:预热期:7.25-7.31 、活动期:8.1-8.14。'
+      },
+      {
+        text: '预热福利:预热期内用户每天10点开始领取,每天限量500份,每天0点数量更新,每人仅限领取一次,数量有限,先到先得。'
+      },
+      {
+        text: '福利一:官方补贴限时抢 购买超级订阅立减:活动期间内新购、续费、升级用户均可参加,通过活动页领取优惠券后购买超级订阅可享受满减,不同额度优惠券一人仅限领取1张,优惠券仅限领取后活动期内使用,过期无效。'
+      },
+      {
+        text: '福利二:做任务 得2个月超级订阅:活动期内,用户分别完成各任务即可获得相对应的剑鱼币,达到1000剑鱼币领1个月超级订阅,达到1500剑鱼币领1个月超级订阅,领取后在原有购买时间上延长所领取奖励的时长,在订单支付期间,完成【购买超级订阅】可获得800剑鱼币,用户新购、续费、升级皆可获得剑鱼币奖励,完成【邀请领好礼】可获得500剑鱼币,完成【分享活动】可获得200剑鱼币;完成购买超级订阅、邀请领好礼、分享活动三个任务且活动页剑鱼币累计达到1000剑鱼币或1500剑鱼币即可领取超级订阅,累计可领2个月,通过其他形式获取的剑鱼币将不作为领取奖励的依据,领取后在【我的奖励】中查看。'
+      },
+      {
+        text: '福利三:大会员最高立减7999元 送6个月使用时长:活动期内商机版2.0最高立减3199元,购买赠送6个月使用时长,专家版2.0最高立减7999元,购买赠送6个月使用时长,点击【了解更多】可详细了解大会员服务内容,详情请致电咨询:400-108-6670,线下购买享优惠。'
+      },
+      {
+        text: '本次活动不支持作弊行为,涉嫌违法、违规参与活动的用户,剑鱼标讯将有权取消您的活动参与资格,并回收已获得的相关奖励,由于不可抗力因素等情况导致活动异常,剑鱼标讯将有权采取调整等措施。'
+      },
+      {
+        text: '法律许可范围内本次活动解释权归北京剑鱼信息技术有限公司所有。'
+      }
+    ]
+  },
+  computed: {
+    rate: function () {
+      var calcRate = (this.progress.current / this.progress.max) * 100
+      if (calcRate > 100) {
+        calcRate = 100
+      }
+      if (calcRate < 0) {
+        calcRate = 0
+      }
+      return calcRate
+    },
+    blinkTextShow: function () {
+      var anchorList = this.progress.anchorList
+      var rate = this.rate
+      var exist = false
+      for (var i = 0; i < anchorList.length; i++) {
+        if (rate === anchorList[i].rate) {
+          exist = true
+          break
+        }
+      }
+      return !exist
+    },
+    progressAnchorList: function () {
+      return this.progress.anchorList
+    },
+    lastTimeText: function () {
+      if (this.lastTimestamp > 0) {
+        var lastTimeConf = this.calcLastTimeDiff(this.lastTimestamp)
+        var days = lastTimeConf.days
+        var hours = lastTimeConf.hours
+        var minutes = lastTimeConf.minutes
+        var seconds = lastTimeConf.seconds
+        var hms = [this.add0(hours), this.add0(minutes), this.add0(seconds)].join(':')
+        if (days > 0) {
+          return days + '天 ' + hms
+        } else {
+          return hms
+        }
+        // return days + '天 ' + hms
+      } else {
+        return ''
+      }
+    },
+    yureSectionShow: function () {
+      return this.activeState === 'waiting' || this.activeState === 'yureing'
+    },
+    yureButtonShow: function () {
+      var lastTimeConf = this.calcLastTimeDiff(this.lastTimestamp)
+      var days = lastTimeConf.days
+      if (this.yureInfo.buttonText) {
+        return !(days < 1 && this.yureConf.total <= 0)
+      } else {
+        return false
+      }
+    },
+    forbidClose: function () {
+      return this.dialog.type === 'over'
+    },
+    getScreenMax: function () {
+      return document.body.clientHeight < 600
+    }
+  },
+  created: function () {
+    this.platform = utils.isWeiXinBrowser ? 'wx' : 'app'
+    this.ajaxActiveStatus()
+    this.ajaxProgress()
+    this.getMissionList()
+  },
+  mounted: function () {
+    // this.calcPointList()
+    this.stickyTopEvents()
+  },
+  methods: {
+    add0: function (t) {
+      return t < 10 ? ('0' + t) : t
+    },
+    dialogShow: function (type, show) {
+      this.dialog.type = type
+      this.dialog.show = show
+    },
+    ajaxActiveStatus: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/period',
+        type: 'post',
+        success: function (res) {
+          if (res.data) {
+            for (var key in _this.conf) {
+              _this.conf[key] = res.data[key]
+            }
+
+            if (Math.abs(initPageTime - res.data.now * 1000) > 5000) {
+              initPageTime = res.data.now
+            }
+            activeOverCheck(res.data.end * 1000, function () {
+              _this.dialogShow('over', true)
+            })
+            _this.initPageState()
+          }
+        },
+        complete: function () {
+          _this.getYuReCouponCount()
+          _this.getFuLi2CouponList()
+        }
+      })
+    },
+    initPageState: function () {
+      var state = this.checkActiveState()
+      var yureTextDOM = $('.timeline-item.yure .t-r-b-r')
+      if (state === 'yureing') {
+        this.startTopTimer()
+        yureTextDOM.text('进行中')
+      } else {
+        yureTextDOM.text('已结束')
+        if (state === 'activating') {
+          // 活动进行中
+        } else {
+
+        }
+      }
+    },
+    // 检查状态
+    checkActiveState: function (now) {
+      if (!now) {
+        now = Date.now()
+      }
+      var before = this.conf.before * 1000
+      var start = this.conf.start * 1000
+      var end = this.conf.end * 1000
+      var stateArr = ['waiting', 'yureing', 'activating', 'ended']
+      var state = 'waiting'
+      if (now < before) {
+        state = stateArr[0] // 预热未开始
+      } else if (before <= now && now < start) {
+        state = stateArr[1] // 预热中
+      } else if (start <= now && now < end) {
+        state = stateArr[2] // 活动进行中
+      } else {
+        state = stateArr[3] // 活动已结束
+      }
+      this.activeState = state
+      return state
+    },
+    // type=yure判断预热是否开始
+    // type=active 判断活动是否开始
+    activeNotStartToast: function (type) {
+      var state = this.checkActiveState()
+      type = type || 'active'
+      if (state === 'ended') {
+        this.$toast('活动已结束')
+      } else if (state === 'waiting') {
+        this.$toast('活动尚未开始,敬请期待')
+      } else {
+        if (type === 'yure') {
+          if (state === 'activating') {
+            // 预热已结束
+            this.$toast('预热已结束')
+          }
+        } else {
+          if (state === 'yureing') {
+            this.$toast('活动尚未开始,敬请期待')
+          }
+        }
+      }
+    },
+    startTopTimer: function () {
+      var _this = this
+      var start = this.conf.start * 1000
+      var timerId = setInterval(function () {
+        var current = Date.now()
+        if (_this.lastTimestamp < 0) {
+          clearInterval(timerId)
+        }
+        _this.lastTimestamp = start - current
+      }, 1000)
+    },
+    calcYuReText: function () {
+      var _this = this
+      var buttonText = ''
+      var tipText = ''
+      var buttonDisabled = true
+      if (this.yureInfo.timerId) {
+        clearInterval(this.yureInfo.timerId)
+      }
+      if (this.activeState === 'yureing') {
+        // 当天时间
+        var todayString = new Date().pattern('yyyy/MM/dd')
+        // 当领券开始时间
+        var yureCouponStartTime = [todayString, this.conf.clock].join(' ')
+        var yureCouponStartStamp = +new Date(yureCouponStartTime)
+        // 计算倒计时
+        var diff = yureCouponStartStamp - Date.now()
+        if (diff > 0) {
+          // 预热当天未开始抢券
+          buttonDisabled = true
+          buttonText = '今日10点开抢'
+          // 创建定时器刷新倒计时
+          this.yureInfo.timerId = setInterval(function () {
+            var d = yureCouponStartStamp - Date.now()
+            var obj = _this.calcLastTimeDiff(d)
+            if (d <= 0) {
+              clearInterval(_this.yureInfo.timerId)
+              _this.calcYuReText()
+            } else {
+              // 计算倒计时
+              tipText = [_this.add0(obj.hours), _this.add0(obj.minutes), _this.add0(obj.seconds)].join(':')
+              _this.yureInfo.tipText = tipText
+            }
+          }, 1000)
+        } else {
+          if (this.yureConf.got) {
+            // 已领取过
+            buttonDisabled = false
+            buttonText = '去查看'
+            tipText = '已领取成功'
+          } else {
+            buttonDisabled = this.yureConf.total <= 0
+            // 券是否有剩余
+            if (this.yureConf.total > 0) {
+              buttonText = '点击免费领'
+              tipText = '今日还剩<span class="num">' + this.yureConf.total + '</span>份'
+            } else {
+              // 今日券领完了
+              buttonText = '今天已抢完'
+              tipText = '今天已经抢完啦~明天再来吧'
+            }
+          }
+        }
+      } else {
+        // 预热未开始或者预热结束
+      }
+
+      this.yureInfo.buttonDisabled = buttonDisabled
+      this.yureInfo.buttonText = buttonText
+      this.yureInfo.tipText = tipText
+    },
+    calcLastTimeDiff: function (timestamp) {
+      var diff = moment.duration(Math.abs(timestamp))
+      var days = diff.days()
+      var hours = diff.hours()
+      var minutes = diff.minutes()
+      var seconds = diff.seconds()
+      return {
+        days: days,
+        hours: hours,
+        minutes: minutes,
+        seconds: seconds
+      }
+    },
+    // 预热优惠券数量查询
+    getYuReCouponCount: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/getDailyBoonDetail',
+        type: 'post',
+        success: function (res) {
+          if (res.data) {
+            _this.yureConf.got = res.data.got || false
+            _this.yureConf.total = res.data.total || 0
+            _this.calcYuReText()
+          }
+        }
+      })
+    },
+    receiveYuReCoupon: function () {
+      if (this.yureInfo.buttonDisabled) {
+
+      } else {
+        this.receiveYuReCouponAjax()
+      }
+      if (this.yureInfo.buttonDisabled) {
+        this.$toast('活动尚未开始,敬请期待')
+      } else if (this.yureInfo.buttonText === '去查看') {
+        // 领过了
+        this.toBuyVip()
+      } else {
+        // 没领过
+        this.receiveYuReCouponAjax()
+      }
+    },
+    // 领取预热优惠券
+    receiveYuReCouponAjax: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/getDailyBoonSVip',
+        type: 'post',
+        success: function (res) {
+          if (res.data) {
+            _this.getYuReCouponCount()
+            // 刷新我的奖励列表
+            _this.getMissionList()
+          }
+        }
+      })
+    },
+    receiveActiveButtonText: function (item) {
+      if (item.IsReceive) {
+        return '立即领取'
+      } else {
+        if (item.IsUser) {
+          return '去使用'
+        } else {
+          return '已使用'
+        }
+      }
+    },
+    receiveActiveCoupon: function (coupons) {
+      if (this.activeState !== 'activating') {
+        return this.activeNotStartToast()
+      }
+      if (coupons.length === 0) return
+      if (coupons.length === 1) {
+        var item = coupons[0]
+        if (!item.IsReceive && item.IsUser) {
+          this.toBuyVip()
+        }
+        return
+      }
+      var idArr = []
+      coupons.forEach(function (item) {
+        if (item.IsReceive) {
+          idArr.push(item.LotteryIdStr)
+        }
+      })
+      this.receiveActiveCouponAjax(idArr)
+    },
+    // 领取活动优惠券
+    receiveActiveCouponAjax: function (ids) {
+      if (ids.length === 0) return
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/getLottery',
+        type: 'post',
+        contentType: 'application/json',
+        data: JSON.stringify({
+          lotteryIds: ids.join(',')
+        }),
+        success: function (res) {
+          if (res.data) {
+            _this.couponList.forEach(function (item) {
+              if (ids.indexOf(item.LotteryIdStr) !== -1) {
+                item.IsReceive = false
+              }
+            })
+            // 刷新我的奖励列表
+            _this.getMissionList()
+          }
+        }
+      })
+    },
+    addTipText: function (list) {
+      var prefix = '超级订阅'
+      var priceArr = [
+        {
+          price: 38,
+          text: '/月/省'
+        },
+        {
+          price: 99,
+          text: '/季/省'
+        },
+        {
+          price: 380,
+          text: '/年/省'
+        },
+        {
+          price: 599,
+          text: '/月/全国'
+        },
+      ]
+      var arr = list.sort(function (a, b) {
+        return a.Reduce - b.Reduce
+      })
+      list.forEach(function (item) {
+        var reduce = item.Reduce
+        var full = item.Full
+        for (var i = 0; i < priceArr.length; i++) {
+          if (priceArr[i].price - full >= 0) {
+            var pay = priceArr[i].price - reduce
+            item.tipText = prefix + priceArr[i].text + ':券后' + pay + '元'
+            break
+          }
+        }
+      })
+      return arr
+    },
+    // 获取福利2优惠券列表
+    getFuLi2CouponList: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/lotteryList',
+        type: 'post',
+        success: function (res) {
+          if (res.data) {
+            _this.couponList = _this.addTipText(res.data) || []
+            // 刷新我的奖励列表
+            _this.getMissionList()
+          }
+        }
+      })
+    },
+    calcPointList: function () {
+      var dom = this.$refs.missions
+      window.points = new RandomCoordinate({
+        el: dom,
+        total: this.missionsList.length,
+        pointSize: new Map(142, 160)
+      })
+      var pointList = points.pointCoordList
+      for (var i = 0; i < this.missionsList.length; i++) {
+        this.missionsList[i].x = pointList[i].x
+        this.missionsList[i].y = pointList[i].y
+      }
+    },
+    leaveCanvas: function (item) {
+      var rootFontSize = RootNodeFontSize()
+      var dom = $('.mission-list-item.' + item.id)
+      dom.removeClass('floating')
+      var baseX = -1.2 * rootFontSize
+      var baseY = 0.6 * rootFontSize
+
+      console.log(baseX, baseY)
+
+      // 终点坐标
+      var current = {
+        x: baseX + $('.progress-bar-content').width(),
+        y: baseY + $('.mission-list').height() - $('.blink-point').height() / 2
+      }
+
+      item.x = current.x / rootFontSize
+      item.y = current.y / rootFontSize
+      this.$nextTick(function () {
+        dom.addClass('exit')
+      })
+    },
+    onClickListItem: function (item) {
+      if (item.icon === 'jy-svip') {
+        if (utils.isWeiXinBrowser) {
+          location.href = '/weixin/pay/toMyWxOrder?active=0'
+        } else {
+          location.href = '/jyapp/front/myOrder/toMyOrder?active=0'
+        }
+      } else if (item.icon === 'jy-coin') {
+        location.href = '/page_points_mobile/list'
+      } else {
+        // 跳转我的奖券
+        if (utils.isWeiXinBrowser) {
+          location.href = '/weixin/frontPage/coupon/free/myCoupon'
+        } else {
+          location.href = '/jyapp/frontPage/coupon/free/myCoupon'
+        }
+        // this.toBuyVip()
+      }
+    },
+    onClickReceive: function (type, item) {
+      if (this.activeState !== 'activating') {
+        // this.$toast('活动尚未开始,敬请期待')
+        return this.activeNotStartToast()
+      }
+      if (item.className === 'received') return
+      var status = false
+      if (type === 'schedule') {
+        if (item.className === 'wait') {
+          status = true
+        } else {
+          var text = '尚未达到领取条件,无法领取'
+          switch (item.id) {
+            // 800
+            case this.progressAnchorList[1].id: {
+              text = '尚未达到'+ this.progressAnchorList[1].id +'剑鱼币,无法领取'
+              break
+            }
+            // 1500
+            case this.progressAnchorList[2].id: {
+              text = '尚未达到'+ this.progressAnchorList[2].id +'剑鱼币,无法领取'
+              break
+            }
+          }
+          return this.$toast(text, 1500)
+        }
+      } else if (type === 'mission' && item.complete) {
+        status = true
+      }
+      if (!status) {
+        var _this = this
+        switch (item.id) {
+          case 'buyvip': {
+            this.toBuyVip()
+            break
+          }
+          case 'invite': {
+            if (utils.isWeiXinBrowser) {
+              location.href = '/weixin/frontPage/share/sess/index'
+            } else {
+              location.href = '/jyapp/frontPage/share/sess/index'
+            }
+            break
+          }
+          case 'share': {
+            // 分享----------
+            // _this.scrollTo('.copy-share-container')
+            break
+          }
+        }
+        return
+      }
+      var _this = this
+      if (type === 'mission') {
+        this.leaveCanvas(item)
+      }
+      this.ajaxReceive({ type: type, value: item.id }, function (result, msg) {
+        if (result) {
+          switch (item.id) {
+            case 'buyvip':
+            case 'invite':
+            case 'share': {
+              _this.$toast('已成功领取' + item.num + '剑鱼币', 1500)
+              break
+            }
+            case '800': {
+              _this.dialogShow('success', true)
+              break
+            }
+            case '1500': {
+              _this.dialogShow('success', true)
+              break
+            }
+          }
+          _this.ajaxActiveStatus()
+          _this.ajaxProgress()
+          _this.getMissionList()
+        } else {
+          _this.$toast(msg, 1500)
+        }
+      })
+    },
+    ajaxReceive: function (data, callback) {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/receive',
+        type: 'post',
+        contentType: 'application/json',
+        data: JSON.stringify(data),
+        success: function (res) {
+          callback(res.data, res.error_msg)
+          // 刷新我的奖励列表
+          _this.getMissionList()
+        }
+      })
+    },
+    ajaxProgress: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/membershipDay/schedule',
+        type: 'post',
+        success: function (res) {
+          if (res.error_code === 0 && res.data) {
+            _this.progress.current = res.data.nowNum
+
+            _this.missionsList[0].complete = res.data.missions.buyvip !== 0
+            _this.missionsList[1].complete = res.data.missions.invite !== 0
+            _this.missionsList[2].complete = res.data.missions.share !== 0
+
+            _this.missionsList[0].hide = res.data.missions.buyvip === -1
+            _this.missionsList[1].hide = res.data.missions.invite === -1
+            _this.missionsList[2].hide = res.data.missions.share === -1
+
+            var anchorStatus = {
+              1: 'wait',
+              0: 'unreceived',
+              '-1': 'received',
+            }
+            var imgStatus = {
+              1: 'unreceived',
+              0: 'unreceived',
+              '-1': 'received',
+            }
+
+            _this.progress.anchorList[1].className = anchorStatus[res.data.schedule['800']]
+            _this.progress.anchorList[2].className = anchorStatus[res.data.schedule['1500']]
+
+            _this.progress.anchorList[1].pointImg = imgStatus[res.data.schedule['800']]
+            _this.progress.anchorList[2].pointImg = imgStatus[res.data.schedule['1500']]
+          }
+        }
+      })
+    },
+    getMissionList: function () {
+      var _this = this
+      $.ajax({
+        url: '/jyActivity/myAward/awardlist',
+        type: 'post',
+        contentType: 'application/json',
+        data: JSON.stringify({
+          code: 'membershipDay',
+          pageSize: 10,
+          pageNum: 0
+        }),
+        success: function (res) {
+          if (res.error_code === 0 && res.data) {
+            if (res.data.list && typeof res.data.list.map === 'function') {
+              _this.rewardList = res.data.list.map(function (v) {
+                var icon = ''
+                if (v.award.indexOf('剑鱼币') > -1) {
+                  icon = 'jy-coin'
+                } else if (v.award.indexOf('订阅') > -1) {
+                  icon = 'jy-svip'
+                } else {
+                  icon = 'jy-coupon'
+                }
+                return {
+                  id: v._id,
+                  icon: icon,
+                  rewardText: v.award,
+                  receiveTime: new Date(v.date * 1000).pattern('yyyy-MM-dd HH:mm:ss'),
+                  receiveFrom: v.getway
+                }
+              })
+            }
+          }
+        }
+      })
+    },
+    receiveFuli3: function () {
+      if (this.activeState !== 'activating') {
+        return this.activeNotStartToast()
+      }
+      if (utils.isWeiXinBrowser) {
+        location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=super_membership_day'
+      } else {
+        location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=super_membership_day'
+      }
+    },
+    doCopy: function () {
+      if (this.activeState === 'activating') {
+        var _this = this
+        $.ajax({
+          url: '/jyActivity/membershipDay/doShare',
+          type: 'post',
+          success: function (res) {
+            if (res.data) {
+              _this.$toast('复制成功')
+              _this.ajaxProgress()
+            }
+          }
+        })
+      } else {
+        // this.$toast('活动尚未开始,敬请期待')
+        this.activeNotStartToast()
+      }
+      this.copyText('快来和我一起参与吧!剑鱼超级会员节,百万补贴限量抢,快速获取商机信息》\n' + this.copyLinkText)
+    },
+    copyText: function (text) {
+      const input = document.createElement('textarea') // js创建一个input输入框
+      input.value = text // 将需要复制的文本赋值到创建的input输入框中
+      document.body.appendChild(input) // 将输入框暂时创建到实例里面
+      input.select() // 选中输入框中的内容
+      document.execCommand('copy') // 执行复制操作
+      document.body.removeChild(input) // 最后删除实例中临时创建的input输入框,完成复制操作
+    },
+    scrollTo: function (className) {
+      setTimeout(function () {
+        var offsetTop = $(className)[0].offsetTop - $('.jy-app-header').outerHeight() * 2
+        $('#main-app').scrollTop(offsetTop)
+      }, 100)
+    },
+    stickyTopEvents: function () {
+      var _this = this
+      var fixedTop = $('.fixed-top.top-timeline')
+      var scrollDOM = $('#main-app')
+      var height = $('.header-banner').height() - $('.jy-app-header').outerHeight() * 2
+      var showHide = function () {
+        var scrollTop = scrollDOM.scrollTop()
+        if (scrollTop > height) {
+          fixedTop.show()
+        } else {
+          fixedTop.hide()
+        }
+      }
+      showHide()
+      scrollDOM.on('scroll', function () {
+        showHide()
+      })
+      fixedTop.on('click', '.timeline-item', function (e) {
+        $(e.currentTarget).addClass('active').siblings().removeClass('active')
+        var className = $(e.currentTarget).attr('data-s-class')
+        _this.scrollTo('.' + className)
+      })
+    },
+    toMemberPage: function () {
+      if (utils.isWeiXinBrowser) {
+        location.href = '/big/wx/page/landingPage'
+      } else {
+        location.href = '/jyapp/big/page/landingPage'
+      }
+    },
+    toBuyVip: function () {
+      location.href = '/jy_mobile/common/order/create/svip?type=buy'
+    }
+  }
+})

+ 314 - 0
src/web/staticres/common-module/active/2022.7/task-common.css

@@ -0,0 +1,314 @@
+.j-icon-bg {
+  display: block;
+  width: 24px;
+  height: 24px;
+  background-repeat: no-repeat;
+  background-size: contain;
+}
+.icon-bg-jy-coin {
+  background-image: url(/common-module/active/2022.5.20/jianyubi@2x.png);
+}
+.icon-bg-jy-svip {
+  background-image: url(/common-module/active/2022.5.20/chaojidingyue@2x.png);
+}
+.icon-bg-jy-coupon {
+  background-image: url(/common-module/active/2022.7/icon-coupon@2x.png);
+}
+.header-banner > img,
+.point-img > img {
+  display: block;
+  width: 100%;
+}
+
+.header-banner {
+  position: relative;
+}
+
+.floating {
+  animation: floating 1.3s ease-in-out 1.3s infinite alternate;
+  transition: left,right,top,bottom 1.3s ease;
+}
+.floating.delay-100 {
+  /* animation-delay: 0.1s; */
+}
+.floating.delay-300 {
+  /* animation-delay: 0.3s; */
+}
+
+@keyframes floating {
+  from {
+    transform: translate(0, 0);
+  }
+  to {
+    transform: translate(0, 10px);
+  }
+}
+
+.mission-list {
+  display: flex;
+  align-items: center;
+  position: absolute;
+  left: 50%;
+  bottom: -0.6rem;
+  z-index: 2;
+  width: 86%;
+  height: 5rem;
+  transform: translateX(-50%);
+}
+.mission-list-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  position: absolute;
+  left: 0;
+  top: 0;
+  transition: all 0.8s cubic-bezier(0, 0, 0.2, 1);
+  transform: scale(1);
+  z-index: 2;
+}
+.mission-list-item.exit {
+  transform: scale(0);
+}
+.mission-list-item.hide {
+  display: none!important;
+}
+
+.text-gradient-red {
+  background-image: linear-gradient(90deg, #FE542F 0%, #F01313 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+}
+
+.m-list-item-bg {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: .26rem 0;
+  width: 1.6rem;
+  height: 1.6rem;
+  background-image: url(/common-module/active/2022.5.20/bubble-2@2x.png);
+  background-repeat: no-repeat;
+  background-size: contain;
+}
+.mission-list-item.complete .text,
+.mission-list-item.complete .num {
+  opacity: 1;
+}
+.mission-list-item.complete .m-list-item-bg {
+  background-image: url(/common-module/active/2022.5.20/bubble-1@2x.png);
+}
+.m-list-item-bg .num {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: .32rem;
+  font-weight: bold;
+  color: #CF1627;
+  line-height: .4rem;
+  opacity: 0.6;
+}
+.num .num-add {
+  font-size: .24rem;
+  font-weight: 400;
+}
+.m-list-item-bg .text {
+  font-size: .2rem;
+  color: #CF1627;
+  line-height: .24rem;
+  opacity: 0.6;
+}
+.m-list-item-bg .button {
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  min-width: 0.8rem;
+  margin-top: .04rem;
+  padding: .04rem .08rem;
+  font-size: .16rem;
+  color: #fff;
+  line-height: .2rem;
+  background: linear-gradient(180deg, #F84B4B 0%, #E4192B 100%);
+  border-image: linear-gradient(180deg, rgba(255, 216, 216, 0), rgba(255, 216, 216, 1)) 1 1;
+  border-radius: .16rem;
+  cursor: pointer;
+}
+.m-list-item-bg .button::after {
+  /* content: ''; */
+  position: absolute;
+  top: -0.04rem;
+  bottom: -0.04rem;
+  left: -0.04rem;
+  right: -0.04rem;
+  background: linear-gradient(180deg, rgba(255, 216, 216, 0), rgba(255, 216, 216, 1));
+  z-index: -1;
+  border-radius: 16rem;
+}
+.m-list-item-text {
+  font-size: .2rem;
+  font-weight: 700;
+  color: #CF1627;
+}
+
+.content-container {
+  background: linear-gradient(180deg, #FF993B 0%, #D24A2A 90%);
+}
+
+.progress-bar-container {
+  padding: 1rem 0 .4rem;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.progress-bar-label {
+  margin-right: 20px;
+  font-size: 16px;
+  line-height: 20px;
+  color: #fff;
+}
+.progress-bar {
+  position: relative;
+  width: 92%;
+  height: .28rem;
+  background: #FEC285;
+  box-shadow: inset 0px 6px 8px 1px rgba(255, 255, 255, 0.4);
+  border-radius: .28rem;
+  background-color: rgba(255, 255, 255, 0.6);
+  z-index: 1;
+}
+.progress-bar-content {
+  position: relative;
+  height: 100%;
+  min-width: .36rem;
+  background: linear-gradient(270deg, #FFFFFF 20%, rgba(255, 255, 255, 0) 100%);
+  border-radius: .4rem;
+  z-index: 2;
+  transition: all 0.8s cubic-bezier(0.15, 0.85, 1, 1);
+}
+.blink-point {
+  position: absolute;
+  top: 50%;
+  right: 0;
+  transform: translate(0,-50%);
+  width: .44rem;
+  height: .44rem;
+  border-radius: 50%;
+  background-color: rgba(255, 255, 255, 0.9);
+  filter: blur(8px) drop-shadow(0 0 2px rgba(255, 255, 255, 0.8)) drop-shadow(0 0 8px rgba(255, 255, 255, 0.9)) drop-shadow(0 0 16px rgba(255, 255, 255, 1));
+  z-index: 3;
+}
+.blink-point {
+  width: 1.2rem;
+  height: 1.2rem;
+  transform: translate(40%,-50%);
+  background-color: transparent;
+  background-image: url(/common-module/active/2022.5.20/blink-point.png);
+  background-repeat: no-repeat;
+  background-size: contain;
+  filter: none;
+}
+.anchor {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  position: absolute;
+  top: -0.6rem;
+  left: 0;
+  color: #fff;
+  transform: translateX(-60%);
+  z-index: 4;
+  transition: all 1s cubic-bezier(0.15, 0.85, 1, 1);
+}
+.anchor.first {
+  transform: none;
+}
+.anchor.last .anchor-text {
+  transform: translateX(-20%);
+}
+.anchor.wait .anchor-tip-text {
+  color: #fff;
+}
+.blink-point-text {
+  position: absolute;
+  right: 0;
+  top: -0.36rem;
+  transform: translate(40%,-100%);
+}
+.anchor-text {
+  font-size: .2rem;
+  line-height: .24rem;
+  color: #fff;
+  white-space: nowrap;
+}
+.point-img {
+  margin-top: .16rem;
+  width: .72rem;
+  cursor: pointer;
+}
+.anchor-tip-text {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  font-size: 14px;
+  line-height: 16px;
+  font-weight: 700;
+  color: rgba(255, 255, 255, 0.6);
+  cursor: pointer;
+  background-size: contain;
+}
+.progress-action-list {
+  padding: 0 .24rem;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+}
+.progress-action-button {
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 45%;
+  padding: .3rem .6rem;
+  font-size: .24rem;
+  line-height: .28rem;
+  color: #fff;
+  background: linear-gradient(180deg, #F45600 7%, #F14904 100%);
+  box-shadow: inset 2px 3px 4px 1px rgba(255, 255, 255, 0.7);
+  border-radius: .5rem;
+  white-space: nowrap;
+}
+.progress-action-button[disabled] {
+  color: rgba(255, 255, 255, 0.6);
+  background: #F85630;
+  box-shadow: none;
+}
+.progress-action-button[disabled].pointer::after {
+  content: unset;
+}
+.progress-action-button.pointer::after {
+  content: '';
+  position: absolute;
+  left: 70%;
+  bottom: -0.8rem;
+  display: block;
+  width: 1.6rem;
+  height: 1.6rem;
+  background-image: url(/common-module/active/2022.5.20/pointer@2x.png);
+  background-repeat: no-repeat;
+  background-size: contain;
+  transform: translate(-50%, 0);
+  animation: pointer 1.3s ease-out 1.3s infinite alternate;
+}
+@keyframes pointer {
+  from {
+    transform: translate(-50%, 0) scale(1);
+  }
+  to {
+    transform: translate(-50%, -.1rem) scale(1.3);
+  }
+}

BIN
src/web/staticres/common-module/active/2022.7/title-fuli1@2x.png


BIN
src/web/staticres/common-module/active/2022.7/title-fuli2@2x.png


BIN
src/web/staticres/common-module/active/2022.7/title-fuli3@2x.png


BIN
src/web/staticres/common-module/active/2022.7/title-yure@2x.png


+ 1 - 1
src/web/staticres/frontRouter/pc/activity/css/task-common.css

@@ -14,7 +14,7 @@
 .icon-jy-svip {
   background-image: url(/frontRouter/pc/activity/image/chaojidingyue@2x.png);
 }
-.icon-bg-jy-coupon {
+.icon-jy-coupon {
   background-image: url(/common-module/active/2022.7/icon-coupon@2x.png);
 }
 .no-select {