亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

JiaXinYi / 741人閱讀

摘要:前言之前我寫過一篇如何少寫爛代碼感覺很多新人對此不太理解。今天以打卡功能為例去講解其中的奧秘。那篇文章講過代碼開發(fā)的過程中分幾種類型。增刪改的需求查的需求經(jīng)過多次實(shí)際開發(fā)驗(yàn)證后,發(fā)現(xiàn)完全是多次一舉。所以在這里更正下,取消。

前言

之前我寫過一篇如何少寫PHP "爛"代碼 https://segmentfault.com/a/11...
感覺很多新人對此不太理解。今天以打卡功能為例,去講解其中的奧秘。那篇文章講過代碼開發(fā)的過程中分幾種類型。

增刪改的需求
Route -> Controller -> Service -> Action
查的需求
Route -> Controller -> Service -> Repository

經(jīng)過多次實(shí)際開發(fā)驗(yàn)證后,發(fā)現(xiàn)Repository完全是多次一舉。所以在這里更正下,取消Repository。

Route -> Controller -> Service
打卡系統(tǒng)邏輯架構(gòu)圖

需求是這樣的,用戶每天打卡獲得積分,積分計(jì)入用戶賬戶,并且需記錄用戶積分的獲取及消費(fèi)情況。如圖所示,請求到控制器后,通過控制器去調(diào)用服務(wù),服務(wù)又調(diào)用創(chuàng)建用戶打卡模塊完成打開,在用戶打卡過程中對用戶賬戶積分進(jìn)行變更及記錄用戶積分獲取記錄。

數(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 "用戶編碼",
  `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 "用戶標(biāo)示",
  `balance` decimal(12,2) NOT NULL COMMENT "錢包余額",
  `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;
用戶積分交易記錄表
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 "來源或消費(fèi)",
  `integral` decimal(12,2) NOT NULL DEFAULT "0.00" COMMENT "積分?jǐn)?shù)",
  `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;
具體業(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方法,寫在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 ();
    }
}

上述代碼繼承了更新用戶積分的動作,在每次打卡成功后,我們調(diào)用父類方法直接更新用戶積分。

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

感謝你看到這里,希望本篇文章可以幫到你。有什么問題可在下方評論區(qū)留言。謝謝

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/29246.html

相關(guān)文章

  • Laravel-Action 對代碼改造

    摘要:前言以往寫過倆篇文章積德篇如何少寫爛代碼舉槍消滅爛代碼的實(shí)戰(zhàn)案例感覺文章中對的操作沒有一個規(guī)范性的調(diào)用及編寫??梢赃x擇不聲明方法。 showImg(https://segmentfault.com/img/bVbfwa7?w=1076&h=690); 前言 以往寫過倆篇文章[積德篇] 如何少寫PHP 爛代碼 https://segmentfault.com/a/11...舉槍消滅爛代碼...

    mj 評論0 收藏0
  • [積德篇] 如何少寫PHP ""代碼

    摘要:但還是不如人意,如果把所有的業(yè)務(wù)及全部寫在中,那只不過是將的臃腫轉(zhuǎn)移到了那就沒有什么存在意義了。所以我們需要繼續(xù)分割,將對數(shù)據(jù)庫的操作獨(dú)立出來,因?yàn)榈牟僮骰臼且回灢蛔兊?,而操作根?jù)業(yè)務(wù)的復(fù)雜度則變的多姿多彩。 showImg(https://segmentfault.com/img/bVbchg0?w=700&h=267); 寫給初生牛犢不怕虎的童鞋們,大佬可隨意摘看本章基于PHP ...

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

      小編寫這篇文章的一個主要目的,主要是給大家介紹的內(nèi)容是使用matplotlib去進(jìn)行繪制并排柱狀圖,那么,一個具體的操作實(shí)例是什么呢?下面就給大家詳細(xì)解答下?! ∫?、概念說明  柱狀圖(bar chart),從相同的橫坐標(biāo)出發(fā),以不同的數(shù)值大小來設(shè)定柱子的高度,進(jìn)而表示無序或有序的定性數(shù)據(jù)間某個定量指標(biāo)的大小關(guān)系?! ∈疽鈭D如下:  (1)在無序的橫坐標(biāo)情景下,我們常常根據(jù)數(shù)值大小降序排布?!?..

    89542767 評論0 收藏0
  • 漫話:如何給女朋友解釋滅霸指響并不是真隨機(jī)"消滅"半數(shù)宇宙人口

    摘要:軟件實(shí)現(xiàn)的是偽隨機(jī)數(shù)。有限狀態(tài)機(jī)不能產(chǎn)生真正的隨機(jī)數(shù)的。復(fù)聯(lián)中,滅霸打了指響之后,復(fù)仇者聯(lián)盟中存活和死亡的名單其實(shí)并不是隨機(jī)的??梢姡瑴绨缘闹疙懩ǔ^程并不是隨機(jī)的。綜上,滅霸的指響抹除過程不符合隨機(jī)性不可預(yù)測性以及不可復(fù)現(xiàn)性。showImg(https://user-gold-cdn.xitu.io/2019/5/7/16a91fc63239db4d);周末,陪女朋友去電影院看了《復(fù)仇者聯(lián)...

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

    摘要:雖然有了十全的計(jì)劃,但如何高效率去記住上面那么多東西是一個大問題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無準(zhǔn)備就去面試的后果,一開始心態(tài)真的爆炸,但是又不服氣,一想到每次回來后家人朋友問我面試結(jié)果的期待臉,越覺得必須付出的行動來證明自己了。 面經(jīng)傳送門:一個1年工作經(jīng)驗(yàn)的PHP程序員是如何被面試官虐的? 下面是我花費(fèi)兩個星期做的準(zhǔn)備,主要分三部分: 有計(jì)劃——計(jì)劃好...

    gyl_coder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<