摘要:前言之前我寫(xiě)過(guò)一篇如何少寫(xiě)爛代碼感覺(jué)很多新人對(duì)此不太理解。今天以打卡功能為例去講解其中的奧秘。那篇文章講過(guò)代碼開(kāi)發(fā)的過(guò)程中分幾種類(lèi)型。增刪改的需求查的需求經(jīng)過(guò)多次實(shí)際開(kāi)發(fā)驗(yàn)證后,發(fā)現(xiàn)完全是多次一舉。所以在這里更正下,取消。
前言
之前我寫(xiě)過(guò)一篇如何少寫(xiě)PHP "爛"代碼 https://segmentfault.com/a/11...
感覺(jué)很多新人對(duì)此不太理解。今天以打卡功能為例,去講解其中的奧秘。那篇文章講過(guò)代碼開(kāi)發(fā)的過(guò)程中分幾種類(lèi)型。
Route -> Controller -> Service -> Action查的需求
Route -> Controller -> Service -> Repository
經(jīng)過(guò)多次實(shí)際開(kāi)發(fā)驗(yàn)證后,發(fā)現(xiàn)Repository完全是多次一舉。所以在這里更正下,取消Repository。
Route -> Controller -> Service打卡系統(tǒng)邏輯架構(gòu)圖
需求是這樣的,用戶(hù)每天打卡獲得積分,積分計(jì)入用戶(hù)賬戶(hù),并且需記錄用戶(hù)積分的獲取及消費(fèi)情況。如圖所示,請(qǐng)求到控制器后,通過(guò)控制器去調(diào)用服務(wù),服務(wù)又調(diào)用創(chuàng)建用戶(hù)打卡模塊完成打開(kāi),在用戶(hù)打卡過(guò)程中對(duì)用戶(hù)賬戶(hù)積分進(jìn)行變更及記錄用戶(hù)積分獲取記錄。
數(shù)據(jù)表結(jié)構(gòu) 打卡數(shù)據(jù)表CREATE TABLE `member_attendance` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT "用戶(hù)編碼", `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;用戶(hù)錢(qián)包表
CREATE TABLE `wallet` ( `user_id` bigint(20) NOT NULL COMMENT "用戶(hù)標(biāo)示", `balance` decimal(12,2) NOT NULL COMMENT "錢(qián)包余額", `integral` decimal(12,2) NOT NULL DEFAULT "0", `add_time` int(11) NOT NULL COMMENT "添加時(shí)間", `update_time` int(11) NOT NULL COMMENT "更改時(shí)間", UNIQUE KEY `wallet_user_id_unique` (`user_id`), KEY `wallet_user_id_index` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;用戶(hù)積分交易記錄表
CREATE TABLE `member_integral_detail` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT "用戶(hù)編碼", `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "來(lái)源或消費(fèi)", `integral` decimal(12,2) NOT NULL DEFAULT "0.00" COMMENT "積分?jǐn)?shù)", `type` tinyint(4) NOT NULL DEFAULT "0" COMMENT "類(lèi)型 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;具體業(yè)務(wù)實(shí)現(xiàn) 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方法,寫(xiě)在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 (); } }
上述代碼繼承了更新用戶(hù)積分的動(dòng)作,在每次打卡成功后,我們調(diào)用父類(lèi)方法直接更新用戶(hù)積分。
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); } } }致謝
感謝你看到這里,希望本篇文章可以幫到你。有什么問(wèn)題可在下方評(píng)論區(qū)留言。謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29246.html
摘要:前言以往寫(xiě)過(guò)倆篇文章積德篇如何少寫(xiě)爛代碼舉槍消滅爛代碼的實(shí)戰(zhàn)案例感覺(jué)文章中對(duì)的操作沒(méi)有一個(gè)規(guī)范性的調(diào)用及編寫(xiě)。可以選擇不聲明方法。 showImg(https://segmentfault.com/img/bVbfwa7?w=1076&h=690); 前言 以往寫(xiě)過(guò)倆篇文章[積德篇] 如何少寫(xiě)PHP 爛代碼 https://segmentfault.com/a/11...舉槍消滅爛代碼...
摘要:但還是不如人意,如果把所有的業(yè)務(wù)及全部寫(xiě)在中,那只不過(guò)是將的臃腫轉(zhuǎn)移到了那就沒(méi)有什么存在意義了。所以我們需要繼續(xù)分割,將對(duì)數(shù)據(jù)庫(kù)的操作獨(dú)立出來(lái),因?yàn)榈牟僮骰臼且回灢蛔兊?,而操作根?jù)業(yè)務(wù)的復(fù)雜度則變的多姿多彩。 showImg(https://segmentfault.com/img/bVbchg0?w=700&h=267); 寫(xiě)給初生牛犢不怕虎的童鞋們,大佬可隨意摘看本章基于PHP ...
小編寫(xiě)這篇文章的一個(gè)主要目的,主要是給大家介紹的內(nèi)容是使用matplotlib去進(jìn)行繪制并排柱狀圖,那么,一個(gè)具體的操作實(shí)例是什么呢?下面就給大家詳細(xì)解答下?! ∫?、概念說(shuō)明 柱狀圖(bar chart),從相同的橫坐標(biāo)出發(fā),以不同的數(shù)值大小來(lái)設(shè)定柱子的高度,進(jìn)而表示無(wú)序或有序的定性數(shù)據(jù)間某個(gè)定量指標(biāo)的大小關(guān)系。 示意圖如下: (1)在無(wú)序的橫坐標(biāo)情景下,我們常常根據(jù)數(shù)值大小降序排布。 ...
摘要:軟件實(shí)現(xiàn)的是偽隨機(jī)數(shù)。有限狀態(tài)機(jī)不能產(chǎn)生真正的隨機(jī)數(shù)的。復(fù)聯(lián)中,滅霸打了指響之后,復(fù)仇者聯(lián)盟中存活和死亡的名單其實(shí)并不是隨機(jī)的。可見(jiàn),滅霸的指響抹除過(guò)程并不是隨機(jī)的。綜上,滅霸的指響抹除過(guò)程不符合隨機(jī)性不可預(yù)測(cè)性以及不可復(fù)現(xiàn)性。showImg(https://user-gold-cdn.xitu.io/2019/5/7/16a91fc63239db4d);周末,陪女朋友去電影院看了《復(fù)仇者聯(lián)...
摘要:雖然有了十全的計(jì)劃,但如何高效率去記住上面那么多東西是一個(gè)大問(wèn)題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無(wú)準(zhǔn)備就去面試的后果,一開(kāi)始心態(tài)真的爆炸,但是又不服氣,一想到每次回來(lái)后家人朋友問(wèn)我面試結(jié)果的期待臉,越覺(jué)得必須付出的行動(dòng)來(lái)證明自己了。 面經(jīng)傳送門(mén):一個(gè)1年工作經(jīng)驗(yàn)的PHP程序員是如何被面試官虐的? 下面是我花費(fèi)兩個(gè)星期做的準(zhǔn)備,主要分三部分: 有計(jì)劃——計(jì)劃好...
閱讀 820·2021-11-24 09:38
閱讀 1028·2021-11-11 11:01
閱讀 3282·2021-10-19 13:22
閱讀 1565·2021-09-22 15:23
閱讀 2865·2021-09-08 09:35
閱讀 2800·2019-08-29 11:31
閱讀 2155·2019-08-26 11:47
閱讀 1596·2019-08-26 11:44