前言
积分体系是对用户行为的一种反馈,本质是用户忠诚度计划的一部分。能够一定层面上解决用户的 “促活、留存”问题。当然,最重要的还是看公司有多少资源投入。下面讲下如何设计一个比较基础的通用会员积分体系。
需求场景分析
- 是否对所有用户(新用户和老用户)?
- 积分的使用。可否当现金?兑换商品?
- 荣誉徽章制度?
- 如何获得积分?
。
。
。
我们可以设计出以下基础表。
- 用户积分账户(不考虑在原有的用户增加字段,而设计新表。是因为这是一个比较独立的系统。后期可能会加一些其他需求)
- 积分记录表(记录用户积分变动流水)
- 用户签到表
- 奖品(商品)表
- 兑换(购买)订单表
- 任务表
- 完成任务记录表
用户积分表,上一篇的用户钱包表有做sign验证,这里就不验证了。因为积分相对于金钱来说,安全要求没那么高。
CREATE TABLE `user_score` (
`user_uuid` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户id',
`level` tinyint(3) NOT NULL DEFAULT '1' COMMENT '等级',
`total_score` int(11) NOT NULL DEFAULT '0' COMMENT '总积分',
`usable_score` int(11) NOT NULL DEFAULT '0' COMMENT '可用积分',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户积分账户表'
记录积分流水信息。这里可以用一个字段的正负值来表示获得和使用积分。也可以用一个类型字段表示获得和支出
CREATE TABLE `score_record` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`user_uuid` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户id',
`source_id` int(11) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '来源id',
`source_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1 任务 2 系统赠送 3 取消订单 4 签到 5 兑换奖品 6过期',
`exprie_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否过期0 没过期 1 过期',
`remark` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注',
`symbol` varchar(3) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'in 收入 out 支出',
`score` int(11) NOT NULL DEFAULT '0' COMMENT '分值',
`expire_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `UCID` (`user_uuid`,`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='积分记录表'
前端纪录表。
CREATE TABLE `user_sign_in` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`user_uuid` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户id',
`continue_day` smallint(6) NOT NULL DEFAULT '0' COMMENT '持续签到天数',
`period_day` tinyint(3) NOT NULL DEFAULT '0' COMMENT '周期内签到天数',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `UCID` (`user_uuid`,`create_at`),
KEY `create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户签到表'
奖品表。
CREATE TABLE `prize` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`score` int(11) NOT NULL DEFAULT '0' COMMENT '所需积分',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`name` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`img_url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '图片url',
`introduction` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简介',
`content` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '内容',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0 草稿 1 发布 2 停用',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`action_user` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作人',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='奖品表'
奖品订单表。这里的状态值。可以按系统其它表中的设计。
CREATE TABLE `prize_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`user_uuid` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户id',
`prize_id` int(11) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '奖品id',
`deduct_score` int(11) NOT NULL DEFAULT '0' COMMENT '扣除积分',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0 待审核 1 经审核 2 不通过,3取消',
`audit_at` datetime DEFAULT NULL COMMENT '审核时间',
`remark` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注',
`action_user` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作人',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `user_uuid` (`user_uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='奖品兑换订单表'
获取积分的方式有很多种。所以增加了一张任务表,
CREATE TABLE `task` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`name` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简体名称',
`score` int(11) NOT NULL DEFAULT '0' COMMENT '分值',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0 草稿 1 发布 2 停用',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`is_pro` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 pro专属',
`is_once` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 一次性任务',
`link_params` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务链接参数',
`page_url` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面',
`thumb_url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '图标',
`identify` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标识符',
`remark` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注',
`action_user` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作人',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `identify` (`identify`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='任务表'
任务完成表
CREATE TABLE `task_finish` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto id',
`user_uuid` char(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户id',
`task_id` int(11) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '任务Id',
`score_uuid` int(11) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '积分记录id',
`finish_score` int(11) NOT NULL DEFAULT '0' COMMENT '完成获得积分',
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `UCID` (`user_uuid`,`create_at`),
KEY `UTCID` (`user_uuid`,`task_id`,`create_at`),
KEY `create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='完成记录表'
以上表就是基础表了。可以根据自己的业务特点增删一些字段,或增加一些其它表
其它
用户等级积分关系通常不会改变,因此这里就不放在数据库中了。直接写在php文件里
//等级与积分映射。可根据实际情况填写
public $levelScoreMap = [
'1' => 0,
'2' => 100,
'3' => 300,
'4' => 400,
'5' => 500,
'6' => 750,
'7' => 1200,
'8' => 1800,
'9' => 2500,
'10' => 3500,
'11' => 5000,
'12' => 8000,
'13' => 15000,
'14' => 20000,
'15' => 30000,
'16' => 45000,
];
//七天连续签到天数与获得积分映射。可根据实际情况填写
public $signInScoreMap = [
'1' => 5,
'2' => 5,
'3' => 5,
'4' => 15,
'5' => 5,
'6' => 5,
'7' => 30,
];
/**根据用户的积分获取用户等级
* @param $levelScoreMap
* @param $levelArray
* @param $totalScore
* @return int
*/public function getLevel($totalScore){
$levelScore = $this->levelScoreMap;
krsort($levelScore);
foreach ($levelScore as $level => $score) {
if ($totalScore >= $score) {
return $level;
}
}
}
以上就是关于用户积分系统的设计了,不足的地方请评论区留言,共同探讨,一起进步。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lzdong@foxmail.com