在實際的項目需求中,我相信不少人都能遇到如標題所說的問題,好比:一個月可修改暱稱一次,或者一年可修改暱稱三次;
我下面的方法也比較簡單,是在與朋友的討論中獲得的。php
爲了表述的更清晰,我這裏就簡化了需求,以下:laravel
每三個月(這裏按一個月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 請求;json
先上中間件裏的代碼,可跟着註釋看。這裏不着重寫中間件的實現方式了,如需瞭解,請點擊 中間件session
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
的內容:框架
/** * 用戶暱稱修改 (三個月可修改兩次) * * @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 便可。post
這篇文章所講述的方法適合同種類型的需求,可根據需求更改相應參數。細節上的處理很少,好比:實際上每月的天數不必定是 30天,這裏不作討論,可相應處理時間便可。ui
主要仍是記錄該種處理方法,也必定有比這種更好的方法!code
道路阻且長,仍需不斷前行!中間件