摘要:需求背景為了表述的更清晰,我這里就簡化了需求,如下每三個月這里按一個月天來算也就是天可更改用戶昵稱兩次,如果三個月內沒有用完兩次,則下一個三個月擁有的更改次數重置,還是兩次。
前言
在實際的項目需求中,我相信很多人都能遇到如標題所說的問題,比如:一個月可修改昵稱一次,或者一年可修改昵稱三次;
我下面的方法也比較簡單,是在與朋友的討論中得到的。
為了表述的更清晰,我這里就簡化了需求,如下:
每三個月(這里按一個月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 IlluminateHttpRequest * @return IlluminateHttpResponse */ 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天,這里不做討論,可相應處理時間即可。
主要還是記錄該種處理方法,也一定有比這種更好的方法!
道路阻且長,仍需不斷前行!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30176.html
摘要:怎么樣,好不好,剛剛發布了商家的中秋優惠,本次商家放了一個別出心裁的優惠,購買一個月贈送兩個月,你現在購買一個月的,可直接使用到年底,另外原來的折優惠碼同樣可以使用,商家目前提供中國香港美國洛杉磯等地區的,線路方面推薦等多種直連優化線路,同JGKVM怎么樣,JGKVM好不好,JGKVM剛剛發布了商家的中秋優惠,本次商家放了一個別出心裁的優惠,購買一個月贈送兩個月,你現在購買一個月的VPS,可...
摘要:最近練手開發了一個項目,是一個聊天室應用。由于我們的項目是一個單頁面應用,因此只需要統一打包出一個和一個。而就是基于實現的一套基于事件訂閱與發布的通信庫。比如說,某一個端口了,而如果端口訂閱了,那么在端,對應的回調函數就會被執行。 最近練手開發了一個項目,是一個聊天室應用。項目雖不大,但是使用到了react, react-router, redux, socket.io,后端開發使用了...
閱讀 1653·2021-11-23 09:51
閱讀 2677·2021-11-22 09:34
閱讀 1316·2021-10-14 09:43
閱讀 3661·2021-09-08 09:36
閱讀 3206·2019-08-30 12:57
閱讀 2025·2019-08-30 12:44
閱讀 2516·2019-08-29 17:15
閱讀 3014·2019-08-29 16:08