首先我们进行一个数据库的创建、需要准备的字段如下:
id(主键ID)
签到人(用户的user-id)
积分(签到所获得积分)
额外积分(签到累计天数的积分)
连签天数(用来记录签到的天数)
一周内签到次数(用来判断本周是否签到已满)
创建时间(时间戳)
随后进行签到代码的编写:
// 判断今天是否已签到
$model = 实例化模型;
// 进行数据的查询根据时间用户ID来查询数据
$today_sign_exist = $model->where('user_id', $this->auth->id)->whereTime('createtime', 'today')->find();
//判断是否已经签到
if ($today_sign_exist) {
$this->error('今日已签到');
}
$init_sign_score = \app\common\model\Config::getdatas('init_sign_score');
$add_sign_score = \app\common\mode\Config::getdatas('add_sign_score');
$per_sign_day = \app\common\model\Config::getdatas('per_sign_day');
$extra_score_rp = \app\common\model\Config::getdatas('extra_score_rp');
$exist = $model->where('user_id', $this->auth->id)->whereTime('createtime', 'yesterday')->find();
$sign_day = 0;
$sign_week_day = 0;
if ($exist) {
$sign_week_day = $exist['sign_week_day'];
$sign_day = $exist['sign_day'];
}
$saveData['score'] = $init_sign_score + ($add_sign_score * $sign_week_day);
$saveData['user_id'] = $this->auth->id;
$saveData['sign_day'] = $sign_day + 1;
$saveData['sign_week_day'] = $sign_week_day + 1;
$saveData['extra_score'] = 0;
// 获取额外积分
if ($saveData['sign_week_day'] % $per_sign_day == 0) {
// 概率获取数据
$saveData['extra_score'] = draw_prize($extra_score_rp);
}
// 启动事务
Db::startTrans();
// 添加签到数据
$res = $model->save($saveData);
if (!$res) {
goto err;
}
// 添加积分记录
User::score($saveData['score'], $this->auth->id, '签到获得积分');
if ($saveData['extra_score']) {
User::score($saveData['extra_score'], $this->auth->id, '签到获得额外积分');
}
Db::commit();
$this->success('签到成功');
err:
Db::rollback();
$this->error('签到失败');
}