成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

三個(gè)月可更改用戶昵稱兩次

singerye / 2168人閱讀

摘要:需求背景為了表述的更清晰,我這里就簡(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

相關(guān)文章

  • #中秋活動(dòng)#JGKVM:VPS買一送二,購(gòu)買一個(gè)月可贈(zèng)送兩個(gè)月,提供6折優(yōu)惠碼

    摘要:怎么樣,好不好,剛剛發(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,可...

    bitkylin 評(píng)論0 收藏0
  • 基于react+react-router+redux+socket.io+koa開(kāi)發(fā)一個(gè)聊天室

    摘要:最近練手開(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ā)使用了...

    NusterCache 評(píng)論0 收藏0
  • 微信小程序調(diào)研

    摘要:外鏈月最新新增提供組件可以用來(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ù) 附近的小程序 掃普通鏈接二維碼打...

    CKJOKER 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<