Рубрики
Uncategorized

Псевдонимы пользователей могут быть изменены дважды за три месяца

Автор оригинала: David Wong.

Предисловие

В фактическом спросе на проект я полагаю, что многие люди столкнутся с проблемами, упомянутыми в названии, такими как: один месяц может изменить ник, или три раза в год может изменить ник; Мой следующий метод также относительно прост, который получается в обсуждении с друзьями.

Предыстория спроса

Чтобы было понятнее, я упростил требования здесь следующим образом:

User nicknames can be changed twice every three months (30 days per month, that is 90 days). If they are not used up twice in three months, the number of changes they have in the next three months will be reset.
Two more times.

Мертвая работа

Создание таблицы пользовательских данных пользователи (Здесь перечислены только поля, необходимые для этой статьи):

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  ` username `varchar (255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT'Add Time',
  ` create_time `timestamp NULL DEFAULT NULL COMMENT'add time',
  ` username_update_num`int(10) unsigned NOT NULL DEFAULT'0'COMMENT'Number of User Nickname Modifications',
  PRIMARY KEY (`id`),
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci COMMENT='user master table';

Я использую платформу laravel, которая использует встроенное промежуточное программное обеспечение для фильтрации HTTP-запросов приложений.

Конкретный код

Сначала ознакомьтесь с кодом промежуточного программного обеспечения, вы можете следить за комментариями. Эта статья не посвящена реализации промежуточного программного обеспечения. Для получения дополнительной информации, пожалуйста, нажмите на промежуточное программное обеспечение.

public function handle($request, Closure $next)
    {   
        /**
         * The problem to be solved is that nicknames can be changed twice every three months (90 days).
         * Here's the solution logic
         */
        // Get the user information
        $user = User::where('id', session('uid'))->first();

        // User registration time, create_time uses the timestamp type, so you need to convert it for easy calculation.
        $create_time = strtotime($user->create_time);

        /**
         * Calculations have gone through 90 days since the registration date, that is, several rounds.
         * Current time minus registration time divided by 90 days of seconds = n rounds
         * The resulting value n has very few integers, such as: 1.2; 
         * At this point, it needs to be processed in one way, because as long as it is more than 90 days, even one second more, it needs to enter the next round.
         */
        $n = ceil( round( (time() - $create_time) / (90 * 24 * 3600), 2) );

        /**
         * The data table username_update_num+1 can be modified twice every 90 days.
         * The total number of modifications: How many modifications have been made by users since the registration date?
         * The number of modifications per round: users have two modification opportunities every 90 days
         * The total number of modifications/the number of modifications per round = the number of modifications to the first round; expressed in $a
         */ 
        $a = $user->username_update_num / 2;

        // What's written here is >=, in fact, $a can't be greater than $n.
        if($a >= $n){
            Return response () - > JSON (['code'=> 0,'message'=>'user nickname can only be modified twice in three months, your number of times has run out','data'=>']);
        }else{
            // Number of times that have not been used up in the previous ($n - 1) wheel
            if( ($n - $a) > 1){
                // Change the database manually and fill in the number of modifications. That is to say, before default, every round used up two chances.
                $user->update(['username_update_num' => (($n - 1) * 2)]);
            }
        }
        
        /**
         * Here is the judgement of the required parameters, which has nothing to do with the above logic.
         */
        if(empty($request->post('username'))){
            Return ['code'=> 0,'message'=>'user nickname cannot be empty','data'=>'];
        }
        if($request->post('username') === $user->username){
            Return ['code'=> 0,'message'=>'the modified nickname can't match the original nickname','data'=>'];
        }
        
        return $next($request);
    }

Содержание вышеупомянутого промежуточного программного обеспечения было написано, что может привести к путанице. Не волнуйся, потому что это еще не закончено. Это просто содержимое промежуточного программного обеспечения. Это делается для перехвата пользователей, у которых нет возможности изменить свои псевдонимы, и для работы с пользователями, которые не использовали это количество раз. Пожалуйста, посмотрите на контроллер ниже. Пользовательский контроллер. php Содержимое:

Содержание вышеупомянутого промежуточного программного обеспечения было написано, что может привести к путанице. Не волнуйся, потому что это еще не закончено. Это просто содержимое промежуточного программного обеспечения. Это делается для перехвата пользователей, у которых нет возможности изменить свои псевдонимы, и для работы с пользователями, которые не использовали это количество раз. Пожалуйста, посмотрите на контроллер ниже. || Пользовательский контроллер. || php || Содержимое:

/**
     * User nickname modification (two modifications in three months)
     * 
     * @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'=>'failed to change user nickname','data'=>'];
        }

        Return ['code'=> 1,'message'=>'Successful change of user nickname','data'=>'];
    }

Как упоминалось выше UserController.php Контроллер, потому что в промежуточном программном обеспечении было определено, соответствует ли пользователь условию изменения псевдонима, поэтому запросы на ввод контроллера поступают всем пользователям, которые изменяют количество псевдонимов, просто измените псевдоним напрямую и измените количество раз + 1.

резюме

Метод, описанный в этой статье, подходит для одного и того же типа требований, и соответствующие параметры могут быть изменены в соответствии с требованиями. Деталей не так много, например: на самом деле количество дней в месяце не обязательно составляет 30 дней, здесь нет обсуждения, но соответствующее время обработки может быть.

В основном записывайте метод обработки, должен быть лучший способ, чем этот!

Дорога перекрыта и длинная, а нам все равно нужно двигаться дальше!