当前位置: 首页 > 后端技术 > PHP

用户昵称三个月可以改两次

时间:2023-03-29 16:18:07 PHP

前言在实际项目需求中,相信很多人都会遇到标题中提到的问题,例如:昵称一个月可以改一次,或者昵称一年可以改一次三次;我下面的方法也比较简单,是和朋友讨论得来的。需求背景为了表达的更清楚,我这里把需求简化了,如下:每三个月(这里按一个月30天计算,也就是90天)可以修改两次用户昵称,如果不用的话三个月内如果完成两次,则未来三个月的变更次数将重新设置,还是两次。准备创建用户数据表users(这里只列出本文需要的字段):CREATETABLE`users`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`username`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'添加时间',`create_time`timestampNULLDEFAULTNULLCOMMENT'添加时间',`username_update_num`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'用户昵称修改次数',PRIMARYKEY(`id`),)ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_unicode_ciCOMMENT='用户主表';我使用的是laravel框架,使用它内置的中间件来过滤应用程序的HTTP请求;具体代码先是中间件里面的代码,大家可以关注注释。这里我们不会重点重写中间件的实现。更多信息请点击middlewarepublicfunctionhandle($request,Closure$next){/***当前要解决的问题是:每三个月(90天)昵称可以改两次*以下是解决方案logic*///获取用户信息$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){returnresponse()->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'=>'修改昵称不能与原昵称一致','数据'=>''];}返回$next($request);}上面中间件的内容已经写完了,可能会让人有点懵,不用着急,因为还没写完,上面只是中间件的内容,是为了拦截没有的用户有机会修改自己的昵称,处理次数没用完的用户,请继续看下面controllerUserController.php的内容:UserController.php/***用户昵称修改(可以修改三个月两次)**@param\Illuminate\Http\Request*@return\Illuminate\Http\Response*/publicfunctionusernameUpdate(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天,这里不再赘述,时间可以相应处理。主要是把这个处理方法记录下来,肯定有比这个更好的方法!路漫漫其修远兮,我们还要继续前行!