连续签到,YII框架,带日历,带7天数据

本文档展示了PHP编写的签到控制器`ClassSignController`的代码,详细解释了签到流程,包括判断签到状态、翻牌功能、连续签到奖励等逻辑。控制器处理了每日签到、七天签到展示和日历签到数据,并涉及积分管理和配置获取。代码涵盖了签到功能的关键实现,有助于理解签到系统的内部工作原理。
摘要由CSDN通过智能技术生成
<?php

/**
 * Class SignController 签到控制器 
 * Date 2022/8/23
 * Time 3:08 下午
 */
class SignController extends BaseSystemController
{
    /**
     * @var SignIn
     */
    protected $signInModel;

    public function beforeAction($action)
    {
        self::isRequired(['eid'], true);

        // 签到配置
        $this->signInModel = new SignIn($this->eid, $this->uid);
        $this->signInModel->getSignInConfig();

        return parent::beforeAction($action);
    }

    /**
     * Application actionIndex 签到
     * Author C
     * @throws CException
     * @Created on 2021/6/25 15:56
     *  1. 先判断是否开启了签到,如开启了,再判断是否开启了翻牌,如果未开启,直接增加后台设置的积分
     *  2. 开启了翻牌,判断谢谢参与是否开启,如未开启,则是6个积分随机抽取,一个最高分,一个最低分,其他4个随机
     *  3. 如开启了谢谢参与,一个最高,一个最低,一个谢谢参与,其他3个随机
     */
    public function actionIndex()
    {
        $json = $this->json;
        $signInConfig = $this->signInModel->signInConfig;

        // 连续签到天数
        $continuousSignDays = $this->signInModel->getContinuousSignDays();

        // 开启签到
        if (!isset($signInConfig['signStatus']) || $signInConfig['signStatus'] == SignIn::SIGN_STATUS_OPEN) {
            $action = '每日签到';
            $signScore = $signInConfig['sign'];

            // H5、PC、APP(版本大于 4.1.8)
            if (in_array($json['platform'], ['h5', 'wechat', 'pcweb'], true) || (in_array($json['platform'], ['androidphone', 'iosphone']) && version_compare($json['version'], '4.1.8', '>'))) {
                // 翻牌获得积分
                if ((!isset($signInConfig['signStatus']) || (!empty($signInConfig['flop']) && isset($signInConfig['flop']) == SignIn::FLOP_OPEN)) && isset($json['addScore'])) {
                    $signScore = $json['addScore'];
                    $action = '每日签到翻牌获得' . Score::getIntegralCustom($json['eid']);
                }
            }

            // 添加积分
            $this->signInModel->addScore(SignIn::SCORE_NAME_SIGN, SignIn::SCORE_TYPE_SIGN, $signScore, $action, strtotime(date('Y-m-d 00:00:00', time())));
            // 查询是否连续签到并执行添加相应积分
            $continuationScore = $this->signInModel->continuationSign();
            // 指定用户积分总和
            $userScore = $this->signInModel->pointsOfTheSpecifiedUser();

            $result['data'] = [
                'score' => $userScore,
                'addScore' => $signScore,  // 翻牌/签到获得的积分
                'totalNum' => strval($continuousSignDays),
                // 'isSign' => ArrayHelper::getValue($array, 'open') == 1 ? 'Y' : 'N',
                'continuityScore' => $continuationScore > 0 ? $continuationScore : '',
            ];

            self::echoJson($result);
        }

        $row['data'] = array(
            'signStatus' => strval(SignIn::SIGN_STATUS_CLOSE),
            'msg' => '签到未开启'
        );

        self::echoJson($row);
    }

    /**
     * Application actionSevenSign 展示七天数据
     */
    public function actionSevenSign()
    {
        // 最近一次连续签到的第一天
        $continuitySignInFirstDay = $this->signInModel->getContinuitySignInFirstDay();

        // 获取6天的签到数据
        $sixSignInDaysData = $this->signInModel->getSixDaysSignInData();
        $sixSignInDaysData = array_column($sixSignInDaysData, 'timedate');

        // 签到配置
        $signInConfig = $this->signInModel->signInConfig;

        // 连续6天日期列表
        $continuityPrevSixDaysList = $this->signInModel->continuityPrevSixDaysList(date('Y-m-d'));
        // 追加一个第二天的日期
        array_push($continuityPrevSixDaysList, date("Y-m-d", strtotime("+1 day")));

        // 连续签到天数
        $continuousSignDays = $this->signInModel->getContinuousSignDays();

        $score = new Score($this->eid, $this->uid);
        $array = $score->getOptions('sign');

        $sevenDaysList = [];
        $everyContinuousScoreDateList = [];

        // 获取每个应该添加连续积分的日期(最多向后一个月)
        $this->signInModel->getEveryContinuousScoreDate($everyContinuousScoreDateList, $continuitySignInFirstDay);

        // 连续的6天日期
        foreach ($continuityPrevSixDaysList as $date) {
            // 日期在签到中, 则表示已签到
            $sevenDaysList[$date]['isSign'] = in_array($date, $sixSignInDaysData) ? 'Y' : 'N';
            $sevenDaysList[$date]['timedate'] = date('n.d', strtotime($date));
            $sevenDaysList[$date]['continuousScore'] = isset($everyContinuousScoreDateList[$date]['continuousScore']) ? $everyContinuousScoreDateList[$date]['continuousScore'] : '';
        }

        $todayData = $this->signInModel->todaySignInData(); // 当前日期签到数据

        $sevenDaysList = array_values($sevenDaysList);

        $result['data'] = [
            'dateList' => $sevenDaysList,
            'info' => [
                'totalNum' => $continuousSignDays,
                'isSign' => !empty($todayData) ? '1' : '0',
                'todayGetScore' => !empty($todayData) ? $todayData[0]['addscore'] : '',// 当前日期获得积分
                'signScore' => strval(ArrayHelper::getValue($array, 'score')), // 后台配置的每日签到获得积分
                'openSign' => (!isset($signInConfig['signStatus']) || $signInConfig['signStatus'] == SignIn::SIGN_STATUS_OPEN) ? 'Y' : 'N',
                'flop' => strval(!empty($signInConfig['flop']) && $signInConfig['flop'] == SignIn::FLOP_OPEN ? SignIn::FLOP_OPEN : SignIn::FLOP_CLOSE),
                'thanks' => strval(!empty($signInConfig['thanks']) && $signInConfig['thanks'] == SignIn::THANKS_OPEN ? SignIn::THANKS_OPEN : SignIn::THANKS_CLOSE),
                'highestScore' => !empty($signInConfig['sign']) ? strval($signInConfig['sign']) : '0',
                'lowestScore' => '1',
            ]
        ];
        self::echojson($result);
    }

    /**
     * Application: actionCalendar 日历 使用strtotime()计算周期
     */
    public function actionCalendar()
    {
        self::isRequired(['monthNum', 'yearNum'], true);

        // 最近一次连续签到的第一天
        $continuitySignInFirstDay = $this->signInModel->getContinuitySignInFirstDay();

        // 最后的30条签到记录
        if ($singInData = $this->signInModel->signInData) {
            $signInData = array_flip(array_map(function ($item) {
                return date('Y-m-d', $item);
            }, array_column($singInData, 'datetime')));
        }

        // 月历
        $calendar = $this->signInModel->createCalendar($this->json['yearNum'], $this->json['monthNum']);

        $calendarData = [];
        $everyContinuousScoreDateList = []; // 每个应该添加连续积分的日期

        // 获取每个应该添加连续积分的日期(最多向后一个月)
        $this->signInModel->getEveryContinuousScoreDate($everyContinuousScoreDateList, $continuitySignInFirstDay);

        foreach ($calendar as $key => $date) {
            $calendarData[$key]['addscore'] = '';
            // Y=已签到
            $calendarData[$key]['isSign'] = isset($signInData[$date]) ? 'Y' : 'N';
            $calendarData[$key]['datetime'] = str_replace('-', '.', $date);
            $calendarData[$key]['continuousScore'] = isset($everyContinuousScoreDateList[$date]['continuousScore']) ? $everyContinuousScoreDateList[$date]['continuousScore'] : '';
        }

        $row['data'] = array(
            'contintDay' => $calendarData,
        );
        self::echoJson($row);
    }

}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付煜晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值