三個月可更改用戶暱稱兩次

前言

在實際的項目需求中,我相信很多人都能遇到如標題所說的問題,比如:一個月可修改暱稱一次,或者一年可修改暱稱三次;
我下面的方法也比較簡單,是在與朋友的討論中得到的。

需求背景

爲了表述的更清晰,我這裏就簡化了需求,如下:


每三個月(這裏按一個月30天來算, 也就是90天)可更改用戶暱稱兩次,如果三個月內沒有用完兩次,則下一個三個月擁有的更改次數重置,
還是兩次。

準備工作

建立用戶數據表 users (這裏只列出該文章需要的字段):

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '添加時間',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '添加時間',
  `username_update_num` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用戶暱稱修改次數',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用戶主表';

我使用的是 laravel 框架,使用其內置中間件進行過濾應用程序 HTTP 請求;

具體代碼

先上中間件裏的代碼,可跟着註釋看。這裏不着重寫中間件的實現方式了,如需瞭解,請點擊 中間件

    public function handle($request, Closure $next)
    {   
        /**
         * 目前要解決的問題是: 每三個月(90天)可更改暱稱 2 次
         * 下面是解決邏輯
         */
        // 得到該用戶信息
        $user = User::where('id', session('uid'))->first();

        // 用戶註冊的時間,create_time 使用的是 timestamp 類型,所以要轉換一下,方便計算
        $create_time = strtotime($user->create_time);

        /**
         * 計算從註冊時間起一共過去了幾個 90天,也就是過了幾輪
         * 當前時間減去註冊時間 除以 90天的秒數  =  n 輪
         * 得到的數值 n 很少有整數,比如:1.2 ; 
         * 此時需要進一法處理,因爲只要比90天多,哪怕多一秒也要進入下一輪
         */
        $n = ceil( round( (time() - $create_time) / (90 * 24 * 3600), 2) );

        /**
         * 每 90 天可修改兩次,每修改一次,數據表 username_update_num + 1
         * 現總修改次數:用戶自注冊時間起至今,共修改的多少次
         * 每輪擁有修改次數:每 90天用戶有兩次修改機會
         * 現總修改次數 / 每輪擁有修改次數 = 現修改到第幾輪;用 $a 表示
         */ 
        $a = $user->username_update_num / 2;

        // 這裏寫的是 >=,實際情況下,$a 是不可能大於 $n 的
        if($a >= $n){
            return response()->json(['code' => 0, 'message' => '用戶暱稱三個月內只能修改兩次,您的次數已用完', 'data' => '']);
        }else{
            // 說明前 ($n - 1) 輪中有未用完的次數
            if( ($n - $a) > 1){
                // 手動更改數據庫,補全修改次數,也就是默認以前的每輪都把兩次機會用完
                $user->update(['username_update_num' => (($n - 1) * 2)]);
            }
        }
        
        /**
         * 這裏是判斷必傳參數,與上面邏輯沒有聯繫
         */
        if(empty($request->post('username'))){
            return ['code' => 0, 'message' => '用戶暱稱不能爲空', 'data' => ''];
        }
        if($request->post('username') === $user->username){
            return ['code' => 0, 'message' => '修改後的暱稱不能與原暱稱一致', 'data' => ''];
        }
        
        return $next($request);
    }

上面中間件的內容已經寫完了,可能會讓人有些迷糊,先別急,因爲還沒有寫完,上面只是中間件的內容,是爲了攔截已經沒有機會修改暱稱的用戶,以及處理沒有用完次數的用戶,請接着看下面的控制器 UserController.php 的內容:

UserController.php


    /**
     * 用戶暱稱修改 (三個月可修改兩次)
     * 
     * @param \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function usernameUpdate(Request $request)
    {
        $user = User::where('id', session('uid'))->first();

        $data = [
            'username' => $request->post('username'),
            'username_update_num' => $user->username_update_num + 1,
        ];

        if( !$user->update($data) ){
            return ['code' => 0, 'message' => '更改用戶暱稱失敗', 'data' => ''];
        }

        return ['code' => 1, 'message' => '更改用戶暱稱成功', 'data' => ''];
    }

如上述 UserController.php 控制器,因爲用戶是否滿足更改暱稱條件已經在中間件裏做過判斷,所以能進來控制器的請求,均是有修改暱稱次數的用戶,只需直接更改更改暱稱且更改次數 + 1 即可。

總結

這篇文章所講述的方法適合同種類型的需求,可根據需求更改相應參數。細節上的處理不多,比如:實際上每個月的天數不一定是 30天,這裏不做討論,可相應處理時間即可。

主要還是記錄該種處理方法,也一定有比這種更好的方法!

道路阻且長,仍需不斷前行!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章