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