积分与签到设计

news2025/1/10 16:14:57

积分

        在交互系统中,可以通过看视频、发评论、点赞、签到等操作获取积分,获取的积分又可以参与排行榜、兑换优惠券等,提高用户使用系统的积极性,实现引流。这些功能在很多项目中都很常见,关于功能的实现我的思路如下。

1.1 积分规则

用户在使用我们xx系统时,可以通过各种交互行为产生积分,不同类型的行为获得不等的分数,比如:

1.签到规则

        签到1天给1分

        连续7天额外奖励10分

        连续14天额外奖励20分

        连续28天额外奖励40分

        每月签到进度当月第一天重置

2.学习规则

        每学习一小节积分+10,每天获得上限50分

3.交互规则(有效交互数据参与积分规则,无效数据会被删除)

        写评价,积分+10    每日获得上限为50分

        写问答,积分+5      每日获得上限为20分

        写笔记,积分+3,每次被采集+2     每日获得上限为20分

原型图类似下图所示:

1.2 积分数据表设计

根据产品原型可以得到积分表需要记录信息有:本次得到积分值、积分方式、获取积分时间、

获取积分的人。

所以积分表里需要设计的字段有:积分记录表id、用户id、积分方式(1-课程学习,2-每日签到,3-课程问答, 4-课程笔记,5-课程评价)、积分值、创建时间。

1.3  签到

1.3.1 数据库表设计

签到最核心的包含两个要素:

  • 谁签到:用户id
  • 什么时候签的:签到日期

同时要考虑一些功能要素,比如:

  • 补签功能,所以要有补签标示
  • 按照年、月统计的功能:所以签到日期可以按照年、月、日分离保存

所以签到表里需要设计的字段有:主键id、用户id、签到日期、签到月份、签到年份、是否补签。

1.3.2 签到设计优化:Bitmap

但是,通过观察签到表的设计,会发现一条签到记录就会占用22个字节,如果每天有很多用户签到,一个月就会有大量签到记录,这样会非常浪费空间,针对这一问题我们可以采用Redis提供的bitmap(位图)这一数据结构进行优化。

我们可以使用bitmap将用户一个月的签到记录保存为一条数据存入数据库,每一个bit为对应当月的每一天,形成映射关系,用0和1分别标识是否打卡。

在Redis中,bitmap底层还是基于String类型实现的, 存储数据是以二进制(bit位)为单位进行存储的bitmap在处理大量数据统计和判断时,可以只占用非常小的一部分内存,并且计算速度非常高效

1.3.3 签到的功能实现:查询和新增

  • 查询签到:
    • 在签到日历中,把当前登录用户本月第一天到今天为止的所有签到过的日期高亮显示;今天若未打卡,则前端显示蓝色“打卡”,若已打卡,则前端显示蓝色“已打卡”。
    • 需要返回每日签到记录,0表示未签到,前端显示灰色;1表示已签到,前端高亮显示。
    • 最终返回一个由0或1组成的数组,对应从本月第1天到今天为止每一天的签到情况。
  • 新增签到:
    • 在个人中心的积分页面,用户每天都可以签到一次,签到成功则把BitMap中的与签到日期对应的bit位设置为1。
    • 为了便于统计,组装签到记录,保存到redis的bitMap,可以将每个月为每个用户生成一个独立的KEY,KEY中包含用户信息、月份信息,即sign:用户id:日期。
    • 获取连续签到的天数,计算连续签到积分,保存到积分表。

1.4 新增积分

        用户签到、学习、参与互动问答、提交学习笔记等行为都可以产生积分,并基于积分形成排行榜。积分当月有效,月底清零。

        由积分规则可知,获取积分的行为多种多样,而且每一种行为都有自己的独立业务。而这些行为产生的时候需要保存一条积分明细到数据库。

        我们显然不能要求其它业务的开发者在开发时帮我们新增一条积分记录,这样会导致原有业务与积分业务耦合。因此必须采用异步方式,将原有业务与积分业务解耦。如果有必要,甚至可以将积分业务抽离,作为独立微服务。

        所以我的实现思路是使用MQ实现服务之间的解耦:

  • 在所有可以获取积分的业务( 用户签到、学习、参与互动问答、提交学习笔记等)中发送MQ消息
  • 根据不同的积分获取方式,编写不同的消息监听器,监听保存积分的消息,让实现积分的添加
  • 添加积分:
    • 判断当前积分类型是否有上线,如果以达到上限,根据上线确定本次积分保存大小
    • 未达到上线,查询今天本类型已经获取了多少分,判断是否已经到达今日分数上线
    • 如果积分超出每日上限,不做操作,结束程序
    • 如果积分不足每日上限,并且加上本次会超过上限,只保存欠额部分

1.5 查询积分

在个人中心,用户可以查看当天各种不同类型的已获得的积分和积分上限,即需返回的数据有积分类型描述、今日已获取积分值、 积分上限。

总结

1. 设计签到功能时,为什么采用BitMap?

答:使用BitMap是以二进制0 1来表示数据的,0表示未签到,1表示已签到,这样就可以将一个人一个月份的签到记录保存到一条数据中,大大的节省了空间的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…

IEC61850遥控-增强安全选控是什么?

摘要&#xff1a;遥控服务是IEC61850协议中非常重要的一项服务&#xff0c;其通常会被应用在电源开关、指示灯、档位调节等器件的操作。 遥控是一类比较特殊的操作&#xff0c;其通过远程方式操作指定的设备器件&#xff0c;在一些重要的场景中需要有严谨的机制来进行约束&…

【Uniapp-Vue3】创建自定义页面模板

大多数情况下我们都使用的是默认模板&#xff0c;但是默认模板是Vue2格式的&#xff0c;如果我们想要定义一个Vue3模板的页面就需要自定义。 一、我们先复制下面的模板代码&#xff08;可根据自身需要进行修改&#xff09;&#xff1a; <template><view class"…

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈

如何操作github&#xff0c;gitee&#xff0c;gitcode三个git平台建立镜像仓库机制&#xff0c;这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈 问题背景 由于我司最早期19年使用的是gitee&#xff0c;因此大部分仓库都在gitee有几百个库的代码&#xff0c;…

QThread多线程详解

本文结构如下 文章目录 本文结构如下 1.概述2.开始多线程之旅2.1应该把耗时代码放在哪里&#xff1f;2.2再谈moveToThread() 3.启动线程前的准备工作3.1开多少个线程比较合适&#xff1f;3.2设置栈大小 4.启动线程/退出线程4.1启动线程4.2优雅的退出线程 5.操作运行中的线程5.1…

深度学习数据集有没有规范或指导意见,数据集的建立都需要做哪些研究工作?

一、数据集的核心原则是什么&#xff1f; 数据集的目标&#xff1a;它需要回答“你要解决什么问题&#xff1f;” 在构建数据集之前&#xff0c;最重要的不是去采集数据&#xff0c;而是明确目标&#xff1a; 你的模型是要做图像分类&#xff0c;还是目标检测&#xff1f;是要…

前端for循环遍历——foreach、map使用

title: 前端不同类型的for循环遍历——foreach、map date: 2025-01-04 11:02:17 tags: javascript 前端不同类型的for循环遍历 场景&#xff1a;很多时候后端发来的数据是不能够完全契合前端的需求的&#xff0c;比如你要一个数据对象中的值&#xff0c;但是这个值却作为了ke…

MR30分布式 IO 在物流分拣线的卓越应用

在当今物流行业高速发展的时代&#xff0c;物流分拣线的高效与精准运作至关重要&#xff0c;而其中对于货物点数较多情况下的有效控制更是一大关键环节。明达技术MR30分布式 IO 系统凭借其独特的优势&#xff0c;在物流分拣线中大放异彩&#xff0c;为实现精准的点数控制提供了…

5 分布式ID

这里讲一个比较常用的分布式防重复的ID生成策略&#xff0c;雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库&#xff0c;分机房部署&#xff0c;单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

读书笔记:分布式系统原理介绍

写在前面 已经大概三个月左右没有更新博客了&#xff0c;哈哈哈哈&#xff1b; 此博客是笔者在对《分布式系统原理介绍》进行概述&#xff0c;对于整个分布式系统协议的理解基于一些量化的指标考虑了数据的分布副本协议&#xff08;中心化/去中心化&#xff09;进行了总结&…

Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py

此脚本的主要功能是可视化点云数据文件&#xff08;.pcd 文件&#xff09;&#xff0c;并通过键盘交互选择演示数据的起始帧和结束帧&#xff0c;生成片段标记文件 (clip_marks.json) 主要流程包括&#xff1a; 用户指定数据目录&#xff1a;检查目录是否存在并处理标记文件 -…

MBM指尖六维力触觉传感器:高灵敏度、低漂移,精准掌控力学世界

MBM指尖六维力触觉传感器是一种专为机器人设计的高性能传感器。它通过集成三轴力和三轴力矩的感知能力&#xff0c;能够精准捕捉复杂的力学信息。传感器采用MEMS与应变体复合测量技术&#xff0c;具备数字输出功能&#xff0c;显著降低漂移并减少安装偏移的影响。其紧凑轻便的设…

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样&#xff0c;它计算图中的最短路径。然而&#xff0c;Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面&#xff0c;Floy…

为答疑机器人扩展问题分类与路由功能

1.意图识别 2. 构建路由模块 简单的意图识别 from chatbot import llmfrom config.load_key import load_key load_key()prompt 【角色背景】 你是一个问题分类路由器&#xff0c;需要识别问题的类型。 --- 【任务要求】 问题的类型目前有&#xff1a;公司内部文档查询、内…

spring boot启动源码分析(三)之Environment准备

上一篇《spring-boot启动源码分析&#xff08;二&#xff09;之SpringApplicationRunListener》 环境介绍&#xff1a; spring boot版本&#xff1a;2.7.18 主要starter:spring-boot-starter-web 本篇开始讲启动过程中Environment环境准备&#xff0c;Environment是管理所有…

Pandas-RFM会员价值度模型

文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…

【理论】测试框架体系TDD、BDD、ATDD、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…

FreeU: Free Lunch in Diffusion U-Net 笔记

FreeU: Free Lunch in Diffusion U-Net 摘要 作者研究了 U-Net 架构对去噪过程的关键贡献&#xff0c;并发现其主干部分主要在去噪方面发挥作用&#xff0c;而其跳跃连接主要是向解码器模块引入高频特征&#xff0c;这使得网络忽略了主干部分的语义信息。基于这一发现&#…