舉槍消滅"爛代碼"的實戰案例
阿新 • • 發佈:2018-11-17
什麽 理解 新用戶 時間 ODB xtend request ons 驗證
前言
之前我寫過一篇如何少寫PHP "爛"代碼 https://segmentfault.com/a/11...
感覺很多新人對此不太理解。今天以打卡功能為例,去講解其中的奧秘。那篇文章講過代碼開發的過程中分幾種類型。
增刪改的需求
Route -> Controller -> Service -> Action
查的需求
Route -> Controller -> Service -> Repository
經過多次實際開發驗證後,發現Repository完全是多次一舉。所以在這裏更正下,取消Repository。
Route -> Controller -> Service
打卡系統邏輯架構圖
需求是這樣的,用戶每天打卡獲得積分,積分計入用戶賬戶,並且需記錄用戶積分的獲取及消費情況。如圖所示,請求到控制器後,通過控制器去調用服務,服務又調用創建用戶打卡模塊完成打開,在用戶打卡過程中對用戶賬戶積分進行變更及記錄用戶積分獲取記錄。
數據表結構
打卡數據表
CREATE TABLE `member_attendance` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `status` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '1簽到成功', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
用戶錢包表
CREATE TABLE `wallet` ( `user_id` bigint(20) NOT NULL COMMENT '用戶標示', `balance` decimal(12,2) NOT NULL COMMENT '錢包余額', `integral` decimal(12,2) NOT NULL DEFAULT '0', `add_time` int(11) NOT NULL COMMENT '添加時間', `update_time` int(11) NOT NULL COMMENT '更改時間', UNIQUE KEY `wallet_user_id_unique` (`user_id`), KEY `wallet_user_id_index` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
用戶積分交易記錄表
CREATE TABLE `member_integral_detail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`member_id` int(11) NOT NULL COMMENT '用戶編碼',
`title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '來源或消費',
`integral` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '積分數',
`type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '類型 0收入 -1支出',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
具體業務實現
Route
$api->post ('user/attendance','UserController@attendance');
MemberController
public function attendance()
{
$result = $this->userService->attendance ($this->request);
if ($result) {
return $this->response->array (Response::return (200, '打卡成功'));
}
return $this->response->array (Response::return (0, "打卡失敗或已打卡"));
}
MemberService
public function attendance($request)
{
return (new CreateUserAttendance())->execute ($request);
}
CreateUserAttendance
public function issetToday($userId)
{
$result = MemberAttendance::where ([
['member_id', '=', $userId],
])
->whereDate ('created_at', date ('Y-m-d', time ()))
->exists ();
return $result;
}
// -------------------- 上述是下方issetToday方法,寫在MemberModel中
class CreateUserAttendance
{
public function execute($data)
{
if ((new MemberAttendance())->issetToday ($data->user_id)) {
return false;
}
$models = new MemberAttendance();
$models->member_id = $data->user_id;
$models->status = (string)"1";
$result = $models->save ();
if ($result) {
(new CreateUserIntegralDetail())->execute ($data->user_id, '打卡', 10, 0);
return true;
}
return false;
}
}
CreateUserIntegralDetail
interface integralDetail
{
public function execute($userId, $title, $integral, $type);
}
class CreateUserIntegralDetail extends UpdateUserWalletIntegral implements integralDetail
{
public function execute($userId, $title, $integral, $type)
{
parent::exec ($userId, $integral, $type);
$models = new MemberIntegralDetail();
$models->member_id = $userId;
$models->title = $title;
$models->integral = $integral;
$models->type = $type;
return $models->save ();
}
}
上述代碼繼承了更新用戶積分的動作,在每次打卡成功後,我們調用父類方法直接更新用戶積分。
UpdateUserWalletIntegral
class UpdateUserWalletIntegral
{
public function exec($userId, $integral, $type)
{
if ($type == 0) {
Wallet::where (['user_id', '=', $userId])->increment ('integral', $integral);
} else {
Wallet::where (['user_id', '=', $userId])->decrement ('integral', $integral);
}
}
}
致謝
感謝你看到這裏,希望本篇文章可以幫到你。有什麽問題可在下方評論區留言。謝謝??
原文地址:https://segmentfault.com/a/1190000016012154
舉槍消滅"爛代碼"的實戰案例