手摸手教你写任务中心-积分领取&消耗&回收

这篇具有很好参考价值的文章主要介绍了手摸手教你写任务中心-积分领取&消耗&回收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

继上一篇签到任务之后呢, 就有朋友让我写一下任务积分的领取和使用, 以及回收; 其实前面两种都不难, 就只是积分的加减而已, 真正麻烦的是回收, 有回收的话你就需要考虑到每笔积分存在多种状态的可能了;

结构设计

明细表(mysql)

记录积分的每一笔获取, 消耗的回收的记录, 并且回收会依据里面的过期时间和回收状态来处理;

Id             uint   `gorm:"column:id;primary_key;auto_increment;" json:"-"`
StreamNumber   string `gorm:"column:stream_number;type:varchar(20);COMMENT:'流水号'" json:"streamNumber"`
UserId         string `gorm:"column:user_id;type:varchar(20);index;COMMENT:'用户ID'" json:"userId"`
TaskId         string `gorm:"column:task_id;type:varchar(50);comment:'任务id'" json:"taskId"`
StreamType     int    `gorm:"column:stream_type;type:tinyint(1);comment:'明细类型 1获取2消耗3回收'" json:"streamType"`
IntegralNum    int64  `gorm:"column:integral_num;type:int(11);default:'0';comment:'积分数量'" json:"integralNum"`
IntegralSource int    `gorm:"column:integral_source;type:tinyint(1);comment:'积分来源去向'" json:"integralSource"`
OutTime        int64  `gorm:"column:out_time;type:bigint(20);comment:'过期时间';" json:"outTime"`
RecoveryState  int    `gorm:"column:recovery_state;type:tinyint(1);comment:'回收状态 1已处理2未处理'" json:"recoveryState"`
....相关业务字段

用户任务状态表(mysql)

维护用户的任务状态, 避免任务重复完成, 以及会有多阶段任务的情况

Id         uint   `gorm:"column:id;primary_key;auto_increment;" json:"id"`
UserId     string `gorm:"column:user_id;type:varchar(20);unique_index:idx_user_task;COMMENT:'用户ID'"`
TaskId     string `gorm:"column:task_id;type:varchar(50);unique_index:idx_user_task;comment:'任务id'"`
TaskState  int    `gorm:"column:task_state;type:tinyint(1);comment:'任务状态'"`
....相关业务字段

用户积分key(redis)

积分为了保证性能用redis的hash进行存储, 每个用户一个key, 维护可用积分, 可用相关的流水以及总领取积分数的状态;


IntegralInfo struct {
  Available       int64           `json:"available"`       // 可用
  AvailableStream []*IntegralItem `json:"availableStream"` // 可用流水
  Total           int64           `json:"total"`           // 总领取
}
IntegralItem struct {
  StreamId  uint   `json:"streamId"`  // 流水Id
  TaskId    string `json:"taskId"`    // 任务Id
  Available int64  `json:"available"` // 可用
  OutTime   int64  `json:"outTime"`   // 过期时间
}

领取功能

需求

  1. 任务完成领取积分;
  2. 关联用户任务状态;
  3. 添加用户积分及同步流水;
  4. 记录用户总领取数;

流程图

image.png

消耗功能

需求

  1. 允许多端多点同时进行积分使用;
  2. 实时进行抵扣, 不允许后置;
  3. 删除redis中无效的可用流水;
  4. 不影响当前的性能;

流程图

image.png

回收功能

需求

  1. 定时回收过期积分;
  2. 如果一笔领取的积分部分被消耗, 则回收剩余积分;
  3. 在回收前使用的不用回收;

流程图

image.png

结语

积分功能应该是很多APP都会做的一个功能了, 领取消耗很简单, 但是再加上回收的话就比较复杂了, 何况在不能后置使用的情况下还要保证性能, 这个就值得我们思考如何更有效的实现功能, 那么, 如果在此基础上再加上冻结, 解冻及消耗呢?文章来源地址https://www.toymoban.com/news/detail-481098.html

到了这里,关于手摸手教你写任务中心-积分领取&消耗&回收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手摸手带你 在Windows系统中安装Istio

    通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。 通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制

    2024年02月06日
    浏览(36)
  • 不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】

    首先来一波感谢: 感谢laf提供赞助,目前可以免费使用Midjourney进行开发和测试。 感谢白夜、米开朗基杨@sealos.io的耐心解答,让我对laf有了更多的使用与了解。 什么是laf?来了解下。 文末有【示例】 废话不多说,进入正题。 laf在做一个活动,可以使用快速上手Midjourney《人

    2024年02月05日
    浏览(34)
  • 手摸手2-springboot编写基础的增删改查

    创建controller层 实现 test 表中的添加、修改、删除及列表查询接口(未分页) 添加service层接口 service层实现 添加mapper层 mapper层对应的sql 添加扫描注解,对应sql文件的目录

    2024年02月10日
    浏览(32)
  • 手摸手接入Github实现Oauth2第三方登录

    最近在学习oauth2授权登录流程,oauth2简单来说就是接入第三方应用(qq、微信、github、gitee等),不用在本站登录,而是去请求第三方应用的用户信息完成登录。 下面就一起来看一下如何接入github实现第三方登录 首先,我们需要在github中添加OAuth App,登录你的github(如果还有

    2024年02月04日
    浏览(50)
  • 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了。之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog.csdn.net/sinat_26918145/article/details/79591717   现代的模型对于图生图的支持效果已经非常好了,

    2024年02月06日
    浏览(42)
  • 使用 Burp Suite 暴力破解密码 撞库攻击 从0到1手摸手教学

    一个学习的过程 增加自己网络安全知识 切勿用于违法用途 设置密码尽量使用6位以上并规避简单数字组合、加强对同一ip的频繁访问次数限制、设置人机验证减小撞库攻击的危害 本地环境 kali 2022 Burp Suite FireFox 靶机环境 一台服务器 CentOS 7 宝塔面板 一个域名(你不会没有吧)

    2024年02月09日
    浏览(29)
  • 【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

    除了借助ChatGPT通过问答的方式生成代码,也可以通过IDEA插件在写代码是直接帮助我们生成代码。 目前,IDEA插件有CodeGeeX、CodeWhisperer、Copilot。其中,CodeGeeX和CodeWhisperer是完全免费的,Copilot是收费的,每月10美元。 下面我们来了解CodeWhisperer的安装和使用,如果你还想了解其他

    2024年02月11日
    浏览(33)
  • CTFshow wbe41 教你写脚本

    这道题确实难,查了很多个大佬的题解,发现这道题考察的是或运算生成字符,但是过了n篇文章发现全是直接用羽师傅的脚本,没有人说这个脚本是怎么运行的,莫名其妙就出结果,脑瓜嗡嗡,可能大佬们默认这脚本大家一看就会用吧,小白只能自己研究了,于是我研究了羽

    2023年04月17日
    浏览(25)
  • 手把手教你写go单元测试

    ​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。 ​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、

    2024年04月14日
    浏览(33)
  • 零基础手把手教你写NFT抢购软

    由于之前写过几篇文章,但是个人不是很满意,所以这次我打算把所有的知识汇总成一篇文章。可能会有很多地方写的不是很好,欢迎大家评论指出,我后续修正。 个人vx:http://wc.ljlju.cn/4ZGETK 我们在点击抢购按钮的时候,会向平台的服务器发送HTTP请求,这条HTTP请求会携带你

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包