前言

在实际的项目需求中,我相信很多人都能遇到如标题所说的问题,比如:一个月可修改昵称一次,或者一年可修改昵称三次;
我下面的方法也比较简单,是在与朋友的讨论中得到的。

需求背景

为了表述的更清晰,我这里就简化了需求,如下:


每三个月(这里按一个月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 \Illuminate\Http\Request* @return \Illuminate\Http\Response*/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天,这里不做讨论,可相应处理时间即可。

主要还是记录该种处理方法,也一定有比这种更好的方法!

道路阻且长,仍需不断前行!

三个月可更改用户昵称两次相关推荐

  1. Python: 生成带用户昵称的头像

    Python: 生成带用户昵称的头像 需求 新建用户后,根据用户输入的昵称生成图片.(例:注册"钉钉"用户后,头像根据输入的名字生成) 开发环境 Windows 10 Python ...

  2. 8.11 更改用户ID和组ID

    8.11 更改用户ID和组ID 在UNIX系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们就需要更换自己的用户ID或组ID. 一般而言,在设计应用程序的时 ...

  3. linux mysql更改用户权限

    mysql更改用户权限 This entry was posted by admin Monday, 26 April, 2010 1."grant all on *.* to root@' ...

  4. passwd命令修改密码_Linux passwd命令–更改用户密码

    passwd命令修改密码 介绍 (Introduction) Linux passwd command changes a user's password. A user can only chang ...

  5. 微信小程序用户昵称表情字符储存的方案

    问题描述: 小程序总会整出一些幺蛾子= = 有些用户昵称中会带有一些特殊表情字符 导致在存入MYSQL时失败(不会报错!) 原因分析: 很明显这是因为数据库存不了字符表情的关系.针对这个问题百度了很多 ...

  6. linux 更改用户密码

    Linux修改密码用 passwd 命令,用root用户运行passwd ,passwd user_name可以设置或修改任何用户的密码,普通用户运行passwd只能修改它自己的密码. [root@l ...

  7. emoji昵称php,php过滤微信用户昵称emoji表情方法汇总 - 旗云号

    php过滤微信用户昵称emoji表情方法汇总 微信用户昵称带emoji表情的话,保存数据库会报错,解决办法有两种:一.修改数据库表和字段的字符集为utf8mb4:二.过滤emoji表情字符:根据自己的 ...

  8. 微信小程序更改头像昵称

    背景 前面写了一篇关于小程序头像昵称获取更改的方案,有很多小伙伴私信我发一个整体的逻辑思路! 解决思路 前面的这篇文章中我们给出了页面中获取头像昵称的代码: <view class=" ...

  9. 在 Mac 上如何更改用户全名/账户名/个人文件夹名/电脑名?

    很多人在使用 Mac 的时候都会有更改用户全名/账户名/电脑名称的需求,但又不知道如何更改.本文就教教大家如何更改这些名称. 目录 区分 用户全名 账户名称 个人文件夹名 电脑名 内容及风险程度 如何 ...

最新文章

  1. c 连接oracle的参数,[20210203]19c登录连接改变一些参数.txt
  2. ABAP:SmartForms--设计
  3. 解决datagrid单元格不能设置100%问题
  4. 【MFC】根据菜单创建工具栏
  5. Errors were encountered while processing 解决方法
  6. python用什么系统好_10分钟用python搭建一个超好用的CMDB系统
  7. qtextedit 默认文案_QTextEdit的paste
  8. k8---proxy
  9. linux笔记索引 QQFF-200305
  10. java jsch 调用shell_Java-Jsch-Shell脚本执行后退出
  11. 三维点云学习(2)中-Kd-tree (k-dimensional tree)
  12. UVA10018 Reverse and Add【回文数+水题】
  13. yolov3前向传播(三)-- 坐标转换,iou计算,权重加载,图片显示
  14. nginx源码安装及配置https自签名
  15. PDF 文字识别网站
  16. Web3还没实现,Web5乍然惊现!
  17. chrome绿色版制作方法
  18. Spark Streaming每个批次完毕后的清道夫工作分析
  19. 类型初始值设定项引发异常-C#
  20. 写在28岁,回看3年前的自己,庆幸当时入了软件测试这行

热门文章

  1. XState是一个状态管理的库
  2. mysql_real_connect阻塞_mysql_real_connect 参数注意-阿里云开发者社区
  3. xp系统打开计算机硬盘分区,XP系统下怎么进行硬盘分区啊?
  4. 用asp.net实现微博系统_微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?...
  5. tp5模板使用php函数,tp5 自定义公共函数,前台模板调用
  6. 提取过程_上海生物发酵展浅谈中药提取分离的现状
  7. java正则表达式获得html字符串中图片的url地址
  8. kafka性能高的影响因素
  9. VB APP对象属性一览表 + 灵活使用VB的APP对象
  10. Nature最新封面:机器人进军考古界,破解3亿年前生物谜团 | 附Demo