tasks[任务表]idnamekeydescnumtyperewardstatuscreated_atupdated_at1每日分享视频share:video每日分享视频任务描述10day102019-01-01 11:11:112019-01-01 11:11:11
task_logs[任务日志表]iduser_idtask_idprogressrewardcreated_atupdated_at111222019-01-01 11:11:112019-01-01 11:11:11
任务表 字段描述:
id 主键ID
name 任务名称
key 任务触发的唯一标示 针对不通的业务进行触发,比如签到 key 为 sign:in 比如分享视频key为share:video
num 任务可完成次数
type 任务类型 once 比如一次任务也就是任务只能完成一次那么比如填写邀请码 day-每日任务 每天可完成的 比如签到 每日分享
reward 完成任务每次奖励数值
status 任务状态 开启或者关闭 比如1-关闭 0-默认开启
任务日志表 字段描述:
id 主键id
user_id 用户id
task_id 任务id
progress 完成进度 针对不通任务进行累加 比如每日观看视频 根据时间纬度查询出当日用户是否完成过该任务 如存在记录在该记录做更新操作
reward 已获取的奖励 如每日任务该字段累加记录
任务如何触发
如签到任务你可以单独出一个签到接口或者聚合一个接口包含比如:分享视频 观看视频都在次接口触发
如果需要在某个业务中触发那么需要单独处理 比如填写邀请码后需要触发一个填写邀请码任务
大致思路你你可以封装的一个公用方法 如果任务触发 如下是伪码:function executeTask(key, user) {
$task = selct * from tasks where key ....
// 任务不存在或被关闭
if (!$task || $task->status) {
return;
}
// 每日任务
if ($task->type == 'day') {
$log = 根据task_id user date 查询日志记录
// 一次性
} else {
$log = 根据task_id user_id 查询日志记录
}
// 任务是否完成
if ($log->progress >= $task->num) {
return;
}
记录日志|增加奖励操作....
}
调用
executeTask('share:video', 1)
金币建立一个用户钱包数据表
wallets:
id user_id balance .......
balance-金额余额
消费明细
wallet_logs:
id user_id amount type action extend......
amount-金额
type-流水类型比如是签到获取还是点赞获取
action-收支状态:收入/支出
extend-扩展字段使用josn