会员积分体系设计

  1. 前言
  2. 需求场景分析
    1. 其它

前言

积分体系是对用户行为的一种反馈,本质是用户忠诚度计划的一部分。能够一定层面上解决用户的 “促活、留存”问题。当然,最重要的还是看公司有多少资源投入。下面讲下如何设计一个比较基础的通用会员积分体系。

需求场景分析

  1. 是否对所有用户(新用户和老用户)?
  2. 积分的使用。可否当现金?兑换商品?
  3. 荣誉徽章制度?
  4. 如何获得积分?


我们可以设计出以下基础表。

  1. 用户积分账户(不考虑在原有的用户增加字段,而设计新表。是因为这是一个比较独立的系统。后期可能会加一些其他需求)
  2. 积分记录表(记录用户积分变动流水)
  3. 用户签到表
  4. 奖品(商品)表
  5. 兑换(购买)订单表
  6. 任务表
  7. 完成任务记录表

用户积分表,上一篇的用户钱包表有做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

×

喜欢就点赞,疼爱就打赏