<?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);
}
}
连续签到,YII框架,带日历,带7天数据
于 2021-08-12 13:47:59 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)