前言
積分體系是對使用者行為的一種反饋,本質是使用者忠誠度計劃的一部分。能夠一定層面上解決使用者的 “促活、留存”問題。當然,最重要的還是看公司有多少資源投入。下面講下如何設計一個比較基礎的通用會員積分體系。
需求場景分析
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 兌換獎品',
`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 '建立時間',
`update_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;
}
}
}
以上就是關於使用者積分系統的設計了,不足的地方請評論區留言,共同探討,一起進步。
本作品採用《CC 協議》,轉載必須註明作者和本文連結