成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

JiaXinYi / 742人閱讀

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

前言

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

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

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

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

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

數(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 "用戶標示",
  `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 "積分數(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ù)實現(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://m.hztianpu.com/yun/29246.html

相關(guān)文章

  • Laravel-Action 對代碼改造

    摘要:前言以往寫過倆篇文章積德篇如何少寫爛代碼舉槍消滅爛代碼的實戰(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ù)庫的操作獨立出來,因為的操作基本是一貫不變的,而操作根據(jù)業(yè)務(wù)的復(fù)雜度則變的多姿多彩。 showImg(https://segmentfault.com/img/bVbchg0?w=700&h=267); 寫給初生牛犢不怕虎的童鞋們,大佬可隨意摘看本章基于PHP ...

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

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

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

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

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

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

    gyl_coder 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<