成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

舉槍消滅"爛代碼"的實(shí)戰(zhàn)案例

JiaXinYi / 704人閱讀

摘要:前言之前我寫(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ù)積分。

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);
        }
    }
}
致謝

感謝你看到這里,希望本篇文章可以幫到你。有什么問(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

相關(guān)文章

  • Laravel-Action 對(duì)代碼改造

    摘要:前言以往寫(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...舉槍消滅爛代碼...

    mj 評(píng)論0 收藏0
  • [積德篇] 如何少寫(xiě)PHP ""代碼

    摘要:但還是不如人意,如果把所有的業(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 ...

    fireflow 評(píng)論0 收藏0
  • 使用matplotlib繪制并排柱狀圖實(shí)戰(zhàn)案例

      小編寫(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ù)值大小降序排布。 ...

    89542767 評(píng)論0 收藏0
  • 漫話:如何給女朋友解釋滅霸指響并不是真隨機(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)...

    WalkerXu 評(píng)論0 收藏0
  • 如何"有計(jì)劃,高效率,優(yōu)簡(jiǎn)歷"應(yīng)對(duì)面試

    摘要:雖然有了十全的計(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ì)劃好...

    gyl_coder 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<