<?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>