<?php
/**
* 用户签到
*/
namespace app\index\controller;
use app\common\controller\Frontend;
use app\index\controller\Common as Base;
use think\Db;
use think\Session;
class ClickSign extends Frontend
{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
protected $layout = '';
public function index()
{
$user_id = 1;
$data = Db::name('web_news')->where('status',2)->order('weigh desc')->field('id,title,memo,createtime,image')->select();
$qiandao_array = Db::name('integral_setup')->field('day_checkin,three_day,seven_day,fifteen_day,twenty_five_day,thirty_day')->find(1);
//获取今日签到状态
$res_status = $this->check_day_qiandao($user_id);
//获取本月签到次数
$month_count = $this->check_month_day($user_id);
//获取今天签到能获取到的积分
$day_jifen = $this->check_continuous_qiandao($user_id,$month_count);
return $this->view->fetch('',[
'data'=>$data,
'res_status'=>$res_status,
'month_count'=>$month_count,
'day_jifen' => $day_jifen,
'qiandao_array'=>$qiandao_array
]);
}
public function info(){
$id = $_GET['id'];
$data = Db::name('web_news')->field('id,title,content,createtime,image')->find($id);
return $this->view->fetch('',[
'data'=>$data
]);
}
//用户签到
public function qiandao(){
$user_id = 1;
$this->del_qiandao($user_id);
$day_check = $this->check_day_qiandao($user_id);
if(true == $day_check){
return Rjson('202','您今天已经签到过了');
}else{
//添加今日签到数据
//检查昨天是否有签到过,如果有,则为连续签到,根据签到规则,设置相对应积分
//获取签到积分和连续签到积分
// $yestaday = $this->getLastTime(1,'before');
//验证昨天是否签到
$check_before_qiandao = $this->check_qiandao($user_id);
//为false 则昨天没有签到
//为true 昨天有签到
//获取用户签到最大和连续签到时间
$user = new \app\index\model\User();
$member_info = $user->get($user_id);
//获取签到积分
Db::startTrans();
try {
//说明昨天有签到,则获取连续签到天数
$add_day = $this->check_month_day($user_id)+1;
if($check_before_qiandao == true){
//签到成功后+1
//更新连续签到次数
$member_info->save(['continuity_day'=>$add_day],['id'=>$user_id]);
}else{
//签到成功后+1
//则连续签到时间改为1
$member_info->save(['continuity_day'=>1],['id'=>$user_id]);
}
//更新积分
//如果连续签到天数,大于最大签到次数,则更新最大签到天数
if( $add_day > intval($member_info['max_days'])){
$member_info->save(['max_days'=>$this->check_month_day($user_id)+1],['id'=>$user_id]);
return true;
}
//查询今日签到,能获取到多少积分
$jifen = $this->check_continuous_qiandao($user_id,$add_day);
//更新积分,更新日志表
Db::name('user')->where('id',$user_id)->update(['score'=>bcadd($jifen,$member_info->score)]);
//写入积分日志
self::score_log($user_id,'+'.$jifen,$member_info->score,bcadd($jifen,$member_info->score),'签到'.$add_day.'天获得积分');
$data = [
'user_id'=>$user_id,
'create_time'=>time(),
'number'=>$jifen
];
$res = $this->addSign($data);
if(!$res) return Rjson('202','签到失败!');
return Rjson('200','签到成功!');
Db::commit();
}catch (\Exception $e){
// 回滚事务
$this->error('签到失败','/index/user/index');
Db::rollback();
}
}
}
//清除掉用户两天前的登录记录,防止用户登录数据过大,同时为连续签到保存依据
public function del_qiandao($user_id){
$two_days_before = $this->getLastTime(10,'before');
Db::name('user_sign')
->where("create_time","<=",$two_days_before['star'])
->where('user_id',$user_id)
->delete();
}
//验证今天是否有签到数据
public function check_day_qiandao($user_id){
$res = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'today')->select();
if(!$res) return false;
return true;
}
//验证昨天是否有签到数据
public function check_qiandao($user_id){
$res = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'yesterday')->select();
if(!$res) return false;
return true;
}
//查询本月签到次数
public function check_month_day($user_id){
//查询本月签到次数
$month_num = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'month')->count();
return $month_num;
}
//连续签到获取积分
public function check_continuous_qiandao($user_id,$month_num){
//获取连续签到次数
//查询本月签到次数
$integral = "";
$qiandao_array = Db::name('integral_setup')->field('day_checkin,three_day,seven_day,fifteen_day,twenty_five_day,thirty_day')->find(1);
//$month_num = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'month')->count();
if($month_num == 3){
$integral = $qiandao_array['three_day'];
}else if($month_num == 7){
$integral = $qiandao_array['seven_day'];
}else if($month_num == 15){
$integral = $qiandao_array['fifteen_day'];
}else if($month_num == 25){
$integral = $qiandao_array['twenty_five_day'];
}else if($month_num == 30){
$integral = $qiandao_array['thirty_day'];
}else{
$integral = $qiandao_array['day_checkin'];
}
return $integral;
}
//添加签到表
public function addSign($data=[]){
$addRes = Db::name('user_sign')->insert($data);
return $addRes;
}
}
前端代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="__CDN__/assets/staff/css/base.css">
<link rel="stylesheet" href="__CDN__/assets/staff/css/staff_common.css">
<link rel="stylesheet" href="__CDN__/assets/staff/css/signin.css">
<link rel="stylesheet" href="__CDN__/assets/staff/layui/css/layui.css">
<link rel="stylesheet" href="__CDN__/assets/staff/css/steps.css">
<script type="text/javascript" src="__CDN__/assets/staff/js/jquery.min.js"></script>
<script type="text/javascript" src="__CDN__/assets/staff/js/steps.js"></script>
<script type="text/javascript" src="__CDN__/assets/staff/layui/layui.js"></script>
<title>签到管理</title>
</head>
<body>
<header class="header">
<span><a href="{:url('user/index')}"><img src="__CDN__/assets/staff/images/back.png" alt=""></a></span>
<span class="header_2">签到管理</span>
<span class="header_3"><a href="{:url('points_rules/index')}">如何领取及使用积分</a></span>
</header>
<div class="show-bg-block">
<div class="sigin_name">
{if condition="$res_status eq true"}
今天已签到,获得奖励+{$day_jifen}
{else}
今天还没签到,签到获得奖励
{/if}
</div>
<div class="integral-img">
<img src="__CDN__/assets/staff/images/integral.png" alt="">
积分 x {$day_jifen}
</div>
<div class="integral-button">
<div class="integral-bor">
{if condition="$res_status eq true"}
<button type="button" id="integral-btn2">已签到</button>
{else}
<button type="button" id="integral-btn">签到</button>
{/if}
</div>
</div>
<div class="reBox">
<div id="steps1"></div>
<div class="lineDansh">
<div class="proBar" id="proBar"></div>
</div>
</div>
</div>
<div class="sigin-data">
<label>签到日期</label>
<table class="layui-table">
<tbody>
<tr>
<td class="layui-table-td">2016-11-29</td>
<td class="layui-table-td">未签到</td>
</tr>
<tr>
<td class="layui-table-td">2016-11-29</td>
<td class="layui-table-td">已签到</td>
</tr>
<tr>
<td class="layui-table-td">2016-11-29</td>
<td class="layui-table-td">未签到</td>
</tr>
<tr>
<td class="layui-table-td">2016-11-29</td>
<td class="layui-table-td">未签到</td>
</tr>
</tbody>
</table>
</div>
<style>
.step-line,.step-finish-line-bg{
background: #c0c4cc;
padding-right: 24px;
}
.proBar{
height: 100%;
width: 0;
background: #fbf19a;
}
.step-line-box{
text-align: right;
}
.steps-horizontal .step{
align-items: flex-end;
}
.steps .step:last-child .step-line{
display: block;
}
.step.current .step-icon{
background: #f4de1e;
border-color: #f4de1e;
}
</style>
<script type="text/javascript" src="__CDN__/assets/staff/js/common.js"></script>
<script>
$('#integral-btn').on('click',function () {
$.ajax({
url:'click_sign/qiandao',
dataType:'json',
type:'post',
success:function (res) {
if(res.code == 200){
window.location.reload()
}else{
window.location.reload()
}
}
})
})
</script>
<script type="text/javascript">
var steps1 = steps({
el: "#steps1",
data: [
{ title: "第3天", description: '奖励'+{$qiandao_array['three_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
{ title: "第7天", description: '奖励'+{$qiandao_array['seven_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
{ title: "第15天", description: '奖励'+{$qiandao_array['fifteen_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
{ title: "第25天", description: '奖励'+{$qiandao_array['twenty_five_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
{ title: "第30天", description: '奖励'+{$qiandao_array['thirty_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
],
active: 2,
// finishLine:"#fcf299",
dataOrder: ["title", "line", "description"],
iconType: "custom",
customClass: "custom-class"
});
var day = {$month_count};
if(day<=3 && day >0){
process(day,3,0,0);
}else if(day<=7 && day >3){
process(day,7,3,1);
}else if(day<=15 && day >7){
process(day,15,7,2);
}else if(day<=25 && day >15){
process(day,25,15,3);
}else if(day<=30 && day >25){
process(day,30,25,4);
}
function process(day,max,min,num){
if(day<=max && day>min ){
day = day-min;
let len = max-min;
let percent = (day / len)*100;
for(var i=0;i<num;i++){
$(".step").eq(i).find(".proBar").css("width",'100%');
$(".step").eq(i).addClass('current');
}
$(".step").eq(num).find(".proBar").css("width",percent+'%');
if(day==len){
$(".step").eq(num).addClass('current')
}
}
}
</script>
</body>
</html>