前言
在實際的項目需求中,我相信很多人都能遇到如標題所說的問題,比如:一個月可修改暱稱一次,或者一年可修改暱稱三次;
我下面的方法也比較簡單,是在與朋友的討論中得到的。
需求背景
爲了表述的更清晰,我這裏就簡化了需求,如下:
每三個月(這裏按一個月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天,這裏不做討論,可相應處理時間即可。
主要還是記錄該種處理方法,也一定有比這種更好的方法!
道路阻且長,仍需不斷前行!