社交软件中虚拟金币(货币),消费明细数据库设计和思路?

类似 Soul APP一样。虚拟金币,我的账单(消费明细),每日任务(每日发动态,每日给动态点个赞,可以领取金币),每日签到(可以领取金币)。这几样的数据库结构怎么设计,实现思路是怎样的?

有大佬们能帮忙解答下不,我有点迷糊。

阅读 3.6k
1 个回答

tasks[任务表]

idnamekeydescnumtyperewardstatuscreated_atupdated_at
1每日分享视频share:video每日分享视频任务描述10day102019-01-01 11:11:112019-01-01 11:11:11

task_logs[任务日志表]

iduser_idtask_idprogressrewardcreated_atupdated_at
111222019-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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏