會員積分體系設計

Euan發表於2020-03-31

前言

積分體系是對使用者行為的一種反饋,本質是使用者忠誠度計劃的一部分。能夠一定層面上解決使用者的 “促活、留存”問題。當然,最重要的還是看公司有多少資源投入。下面講下如何設計一個比較基礎的通用會員積分體系。

需求場景分析

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 協議》,轉載必須註明作者和本文連結

相關文章