摘要:前言之前我寫過一篇如何少寫爛代碼感覺很多新人對此不太理解。今天以打卡功能為例去講解其中的奧秘。那篇文章講過代碼開發的過程中分幾種類型。增刪改的需求查的需求經過多次實際開發驗證后,發現完全是多次一舉。所以在這里更正下,取消。
前言
之前我寫過一篇如何少寫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 (); } }
上述代碼繼承了更新用戶積分的動作,在每次打卡成功后,我們調用父類方法直接更新用戶積分。
UpdateUserWalletIntegralclass 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); } } }致謝
感謝你看到這里,希望本篇文章可以幫到你。有什么問題可在下方評論區留言。謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29246.html
摘要:前言以往寫過倆篇文章積德篇如何少寫爛代碼舉槍消滅爛代碼的實戰案例感覺文章中對的操作沒有一個規范性的調用及編寫??梢赃x擇不聲明方法。 showImg(https://segmentfault.com/img/bVbfwa7?w=1076&h=690); 前言 以往寫過倆篇文章[積德篇] 如何少寫PHP 爛代碼 https://segmentfault.com/a/11...舉槍消滅爛代碼...
摘要:但還是不如人意,如果把所有的業務及全部寫在中,那只不過是將的臃腫轉移到了那就沒有什么存在意義了。所以我們需要繼續分割,將對數據庫的操作獨立出來,因為的操作基本是一貫不變的,而操作根據業務的復雜度則變的多姿多彩。 showImg(https://segmentfault.com/img/bVbchg0?w=700&h=267); 寫給初生牛犢不怕虎的童鞋們,大佬可隨意摘看本章基于PHP ...
小編寫這篇文章的一個主要目的,主要是給大家介紹的內容是使用matplotlib去進行繪制并排柱狀圖,那么,一個具體的操作實例是什么呢?下面就給大家詳細解答下?! ∫弧⒏拍钫f明 柱狀圖(bar chart),從相同的橫坐標出發,以不同的數值大小來設定柱子的高度,進而表示無序或有序的定性數據間某個定量指標的大小關系?! ∈疽鈭D如下: (1)在無序的橫坐標情景下,我們常常根據數值大小降序排布?!?..
摘要:軟件實現的是偽隨機數。有限狀態機不能產生真正的隨機數的。復聯中,滅霸打了指響之后,復仇者聯盟中存活和死亡的名單其實并不是隨機的??梢?,滅霸的指響抹除過程并不是隨機的。綜上,滅霸的指響抹除過程不符合隨機性不可預測性以及不可復現性。showImg(https://user-gold-cdn.xitu.io/2019/5/7/16a91fc63239db4d);周末,陪女朋友去電影院看了《復仇者聯...
摘要:雖然有了十全的計劃,但如何高效率去記住上面那么多東西是一個大問題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無準備就去面試的后果,一開始心態真的爆炸,但是又不服氣,一想到每次回來后家人朋友問我面試結果的期待臉,越覺得必須付出的行動來證明自己了。 面經傳送門:一個1年工作經驗的PHP程序員是如何被面試官虐的? 下面是我花費兩個星期做的準備,主要分三部分: 有計劃——計劃好...
閱讀 801·2021-11-24 09:38
閱讀 1001·2021-11-11 11:01
閱讀 3245·2021-10-19 13:22
閱讀 1531·2021-09-22 15:23
閱讀 2835·2021-09-08 09:35
閱讀 2773·2019-08-29 11:31
閱讀 2127·2019-08-26 11:47
閱讀 1569·2019-08-26 11:44