摘要:需求背景為了表述的更清晰,我這里就簡化了需求,如下每三個月這里按一個月天來算也就是天可更改用戶昵稱兩次,如果三個月內(nèi)沒有用完兩次,則下一個三個月?lián)碛械母拇螖?shù)重置,還是兩次。
前言
在實際的項目需求中,我相信很多人都能遇到如標(biāo)題所說的問題,比如:一個月可修改昵稱一次,或者一年可修改昵稱三次;
我下面的方法也比較簡單,是在與朋友的討論中得到的。
為了表述的更清晰,我這里就簡化了需求,如下:
每三個月(這里按一個月30天來算, 也就是90天)可更改用戶昵稱兩次,如果三個月內(nèi)沒有用完兩次,則下一個三個月?lián)碛械母拇螖?shù)重置, 還是兩次。準(zhǔn)備工作
建立用戶數(shù)據(jù)表 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 "用戶昵稱修改次數(shù)", PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="用戶主表";
我使用的是 laravel 框架,使用其內(nèi)置中間件進行過濾應(yīng)用程序 HTTP 請求;
具體代碼先上中間件里的代碼,可跟著注釋看。這里不著重寫中間件的實現(xiàn)方式了,如需了解,請點擊 中間件
public function handle($request, Closure $next) { /** * 目前要解決的問題是: 每三個月(90天)可更改昵稱 2 次 * 下面是解決邏輯 */ // 得到該用戶信息 $user = User::where("id", session("uid"))->first(); // 用戶注冊的時間,create_time 使用的是 timestamp 類型,所以要轉(zhuǎn)換一下,方便計算 $create_time = strtotime($user->create_time); /** * 計算從注冊時間起一共過去了幾個 90天,也就是過了幾輪 * 當(dāng)前時間減去注冊時間 除以 90天的秒數(shù) = n 輪 * 得到的數(shù)值 n 很少有整數(shù),比如:1.2 ; * 此時需要進一法處理,因為只要比90天多,哪怕多一秒也要進入下一輪 */ $n = ceil( round( (time() - $create_time) / (90 * 24 * 3600), 2) ); /** * 每 90 天可修改兩次,每修改一次,數(shù)據(jù)表 username_update_num + 1 * 現(xiàn)總修改次數(shù):用戶自注冊時間起至今,共修改了多少次 * 每輪擁有修改次數(shù):每 90天用戶有兩次修改機會 * 現(xiàn)總修改次數(shù) / 每輪擁有修改次數(shù) = 現(xiàn)修改到第幾輪;用 $a 表示 */ $a = $user->username_update_num / 2; // 這里寫的是 >=,實際情況下,$a 是不可能大于 $n 的 if($a >= $n){ return response()->json(["code" => 0, "message" => "用戶昵稱三個月內(nèi)只能修改兩次,您的次數(shù)已用完", "data" => ""]); }else{ // 說明前 ($n - 1) 輪中有未用完的次數(shù) if( ($n - $a) > 1){ // 手動更改數(shù)據(jù)庫,補全修改次數(shù),也就是默認以前的每輪都把兩次機會用完 $user->update(["username_update_num" => (($n - 1) * 2)]); } } /** * 這里是判斷必傳參數(shù),與上面邏輯沒有聯(lián)系 */ if(empty($request->post("username"))){ return ["code" => 0, "message" => "用戶昵稱不能為空", "data" => ""]; } if($request->post("username") === $user->username){ return ["code" => 0, "message" => "修改后的昵稱不能與原昵稱一致", "data" => ""]; } return $next($request); }
上面中間件的內(nèi)容已經(jīng)寫完了,可能會讓人有些迷糊,先別急,因為還沒有寫完,上面只是中間件的內(nèi)容,是為了攔截已經(jīng)沒有機會修改昵稱的用戶,以及處理沒有用完次數(shù)的用戶,請接著看下面的控制器 UserController.php 的內(nèi)容:
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 控制器,因為用戶是否滿足更改昵稱條件已經(jīng)在中間件里做過判斷,所以能進來控制器的請求,均是有修改昵稱次數(shù)的用戶,只需直接更改昵稱且更改次數(shù) + 1 即可。
總結(jié)這篇文章所講述的方法適合同種類型的需求,可根據(jù)需求更改相應(yīng)參數(shù)。細節(jié)上的處理不多,比如:實際上每個月的天數(shù)不一定是 30天,這里不做討論,可相應(yīng)處理時間即可。
主要還是記錄該種處理方法,也一定有比這種更好的方法!
道路阻且長,仍需不斷前行!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/30176.html
摘要:怎么樣,好不好,剛剛發(fā)布了商家的中秋優(yōu)惠,本次商家放了一個別出心裁的優(yōu)惠,購買一個月贈送兩個月,你現(xiàn)在購買一個月的,可直接使用到年底,另外原來的折優(yōu)惠碼同樣可以使用,商家目前提供中國香港美國洛杉磯等地區(qū)的,線路方面推薦等多種直連優(yōu)化線路,同JGKVM怎么樣,JGKVM好不好,JGKVM剛剛發(fā)布了商家的中秋優(yōu)惠,本次商家放了一個別出心裁的優(yōu)惠,購買一個月贈送兩個月,你現(xiàn)在購買一個月的VPS,可...
摘要:最近練手開發(fā)了一個項目,是一個聊天室應(yīng)用。由于我們的項目是一個單頁面應(yīng)用,因此只需要統(tǒng)一打包出一個和一個。而就是基于實現(xiàn)的一套基于事件訂閱與發(fā)布的通信庫。比如說,某一個端口了,而如果端口訂閱了,那么在端,對應(yīng)的回調(diào)函數(shù)就會被執(zhí)行。 最近練手開發(fā)了一個項目,是一個聊天室應(yīng)用。項目雖不大,但是使用到了react, react-router, redux, socket.io,后端開發(fā)使用了...
摘要:外鏈月最新新增提供組件可以用來承載網(wǎng)頁容器會自動鋪滿整個小程序頁面?zhèn)€人類型和海外類型暫不支持需將訪問域名后臺添加至白名單微信授權(quán)鏈接是否可訪問需要測試公眾號關(guān)聯(lián)公眾號關(guān)聯(lián)小程序后,將可在圖文消息自定義菜單模板消息等功能中使用小程序。 小程序入口 微信發(fā)現(xiàn),小程序 公眾號主體查看小程序 好友分享,群分享 公眾號自定義菜單跳轉(zhuǎn) APP頁面跳轉(zhuǎn) 第三方服務(wù) 附近的小程序 掃普通鏈接二維碼打...
閱讀 1769·2021-11-23 09:51
閱讀 2809·2021-11-22 09:34
閱讀 1409·2021-10-14 09:43
閱讀 3735·2021-09-08 09:36
閱讀 3272·2019-08-30 12:57
閱讀 2108·2019-08-30 12:44
閱讀 2588·2019-08-29 17:15
閱讀 3079·2019-08-29 16:08