Ver código fonte

优化参数验证逻辑

aiden 4 meses atrás
pai
commit
6f228f2646

+ 29 - 16
app/controller/Game.php

@@ -5,6 +5,7 @@ namespace app\controller;
 
 use app\BaseController;
 use app\model\GameModel;
+use app\validate\GameValidate;
 use think\facade\Request;
 
 class Game extends BaseController
@@ -88,36 +89,48 @@ class Game extends BaseController
             return json_error([], '游戏ID不能为空');
         }
         
-        // 定义允许更新的字段
+        // 检查游戏是否存在且属于当前商户
+        $game = GameModel::getGameDetail($id, $userInfo['merchant_id']);
+        if (!$game) {
+            return json_error([], '游戏不存在');
+        }
+        
+        // 获取请求中提供的所有可更新字段
+        $requestData = Request::post();
         $allowedFields = [
             'rtp', 'rtp_type', 'free_game_status', 'bet_max_level', 'terminal_spin',
             'max_multiple_count', 'deposit_list', 'default_deposit', 'default_deposit_level', 'min_deposit',
         ];
+        $updateData = [];
         
-        // 获取请求参数
-        $params = Request::param();
-        $data = [];
-        
-        // 只获取实际传递的字段
+        // 只处理请求中存在且允许更新的字段
         foreach ($allowedFields as $field) {
-            if (isset($params[$field])) {
-                $data[$field] = $params[$field];
+            if (array_key_exists($field, $requestData)) {
+                // 转换数值类型
+                if (in_array($field, ['rtp_type', 'free_game_status', 'bet_max_level', 'terminal_spin', 'max_multiple_count', 'default_deposit_level'])) {
+                    $updateData[$field] = intval($requestData[$field]);
+                } elseif (in_array($field, ['rtp', 'default_deposit', 'min_deposit'])) {
+                    $updateData[$field] = floatval($requestData[$field]);
+                } else {
+                    $updateData[$field] = $requestData[$field];
+                }
             }
         }
         
-        // 如果没有要更新的字段
-        if (empty($data)) {
+        if (empty($updateData)) {
             return json_error([], '没有要更新的数据');
         }
-                
-        // 检查游戏是否存在且属于当前商户
-        $game = GameModel::getGameDetail($id, $userInfo['merchant_id']);
-        if (!$game) {
-            return json_error([], '游戏不存在');
+        
+        // 使用验证器进行字段验证
+        $validate = new GameValidate();
+        
+        // 只验证传入的字段
+        if (!$validate->only(array_keys($updateData))->check($updateData)) {
+            return json_error([], $validate->getError());
         }
         
         try {
-            GameModel::updateGame($id, $data, $userInfo['merchant_id']);
+            GameModel::updateGame($id, $updateData, $userInfo['merchant_id']);
             return json_success([], '更新游戏成功');
         } catch (\Exception $e) {
             return json_error([], '更新游戏失败:' . $e->getMessage());

+ 37 - 20
app/controller/User.php

@@ -260,43 +260,60 @@ class User extends BaseController
             return json_error($this->message['empty']);
         }
         
-        // 获取更新数据
-        $data = Request::only([
-            'nick_name', 'phone', 'password', 'user_role/d', 'white_list_ip'
-        ]);
+        // 获取请求中提供的所有可更新字段
+        $requestData = Request::post();
+        $allowedFields = ['nick_name', 'phone', 'password', 'user_role', 'white_list_ip'];
+        $updateData = [];
         
-        // 过滤空值
-        $data = array_filter($data, function($value, $key) {
-            return $key !== 'password' || !empty($value);
-        }, ARRAY_FILTER_USE_BOTH);
+        // 只处理请求中存在且允许更新的字段
+        foreach ($allowedFields as $field) {
+            if (array_key_exists($field, $requestData)) {
+                // 对于密码字段,空值则跳过
+                if ($field === 'password' && empty($requestData[$field])) {
+                    continue;
+                }
+                if ($field === 'user_role') {
+                    $requestData[$field] = intval($requestData[$field]);
+                }
+                $updateData[$field] = $requestData[$field];
+            }
+        }
         
-        if (empty($data)) {
+        if (empty($updateData)) {
             return json_error([], '没有要更新的数据');
         }
+                
+        // 使用验证器进行字段验证  
+        $validate = new UserValidate();        
+        // 只验证传入的字段
+        if (!$validate->only(array_keys($updateData))->check($updateData)) {
+            return json_error([], $validate->getError());
+        }
         
+        // 额外的业务逻辑验证
         // 验证角色是否存在
-        if (isset($data['user_role'])) {
-            $role = UserRoleModel::getRoleById($data['user_role'], $userInfo['merchant_id']);
+        if (isset($updateData['user_role']) && $updateData['user_role'] > 99) {
+            $role = UserRoleModel::getRoleById($updateData['user_role'], $userInfo['merchant_id']);
             if (!$role) {
                 return json_error([], '选择的角色不存在');
             }
         }
-
-        if (isset($data['white_list_ip'])) {
-            // 验证Ip白名单格式
-            $checkIpWhiteList = IpWhiteListService::validateWhiteListFormat($data['white_list_ip']);
+        
+        // 验证IP白名单格式
+        if (isset($updateData['white_list_ip'])) {
+            $checkIpWhiteList = IpWhiteListService::validateWhiteListFormat($updateData['white_list_ip']);
             if ($checkIpWhiteList[0] == false) {
-                return json_error($checkIpWhiteList[1]);
-            }            
+                return json_error([], $checkIpWhiteList[1]);
+            }
         }
         
         // 密码加密
-        if (isset($data['password'])) {
-            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
+        if (isset($updateData['password'])) {
+            $updateData['password'] = password_hash($updateData['password'], PASSWORD_DEFAULT);
         }
         
         try {
-            $user->save($data);
+            $user->save($updateData);
             return json_success([], $this->message['suc']);
         } catch (\Exception $e) {
             return json_error([], '更新失败:' . $e->getMessage());

+ 44 - 22
app/controller/UserRole.php

@@ -55,22 +55,26 @@ class UserRole extends BaseController
     {
         $userInfo = $this->request->userInfo;
         
+        // 获取请求数据
         $data = Request::only(['role_name', 'privileges']);
+        $data['merchant_id'] = $userInfo['merchant_id'];
         
-        if (empty($data['role_name'])) {
-            return json_error([], '角色名称不能为空');
-        }
-        
-        if (empty($data['privileges']) || !is_array($data['privileges'])) {
-            return json_error([], '权限配置不能为空');
+        // 使用验证器进行字段验证
+        try {
+            $validate = validate(UserRoleValidate::class);
+            if (!$validate->scene('create')->check($data)) {
+                return json_error([], $validate->getError());
+            }
+        } catch (\think\exception\ValidateException $e) {
+            return json_error([], $e->getMessage());
         }
         
+        // 额外的业务逻辑验证
+        // 检查角色名称是否已存在
         if (UserRoleModel::checkRoleExists($data['role_name'], $userInfo['merchant_id'])) {
             return json_error([], '角色名称已存在');
         }
-        
-        $data['merchant_id'] = $userInfo['merchant_id'];
-        
+                
         try {
             $role = UserRoleModel::createRole($data);
             return json_success(['id' => $role->id], '创建角色成功');
@@ -86,32 +90,50 @@ class UserRole extends BaseController
     {
         $userInfo = $this->request->userInfo;
         
-        $id = Request::param('id', 0, 'intval');
+        $id = Request::post('id', 0, 'intval');
         if (!$id) {
             return json_error([], '角色ID不能为空');
         }
         
-        $data = Request::only(['role_name', 'privileges']);
-        
-        if (empty($data['role_name'])) {
-            return json_error([], '角色名称不能为空');
+        $role = UserRoleModel::getRoleById($id, $userInfo['merchant_id']);
+        if (!$role) {
+            return json_error([], '角色不存在');
         }
         
-        if (empty($data['privileges']) || !is_array($data['privileges'])) {
-            return json_error([], '权限配置不能为空');
+        // 获取请求中提供的所有可更新字段
+        $requestData = Request::post();
+        $allowedFields = ['role_name', 'privileges'];
+        $updateData = [];
+        
+        // 只处理请求中存在且允许更新的字段
+        foreach ($allowedFields as $field) {
+            if (array_key_exists($field, $requestData)) {
+                $updateData[$field] = $requestData[$field];
+            }
         }
         
-        $role = UserRoleModel::getRoleById($id, $userInfo['merchant_id']);
-        if (!$role) {
-            return json_error([], '角色不存在');
+        if (empty($updateData)) {
+            return json_error([], '没有要更新的数据');
         }
         
-        if (UserRoleModel::checkRoleExists($data['role_name'], $userInfo['merchant_id'], $id)) {
-            return json_error([], '角色名称已存在');
+        // 使用验证器进行字段验证
+        $validate = new UserRoleValidate();
+        
+        // 只验证传入的字段
+        if (!$validate->only(array_keys($updateData))->check($updateData)) {
+            return json_error([], $validate->getError());
         }
         
+        // 额外的业务逻辑验证
+        // 检查角色名称是否重复
+        if (isset($updateData['role_name'])) {
+            if (UserRoleModel::checkRoleExists($updateData['role_name'], $userInfo['merchant_id'], $id)) {
+                return json_error([], '角色名称已存在');
+            }
+        }
+                
         try {
-            UserRoleModel::updateRole($id, $userInfo['merchant_id'], $data);
+            UserRoleModel::updateRole($id, $userInfo['merchant_id'], $updateData);
             return json_success([], '更新角色成功');
         } catch (\Exception $e) {
             return json_error([], '更新角色失败:' . $e->getMessage());

+ 57 - 0
app/validate/GameValidate.php

@@ -0,0 +1,57 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\validate;
+
+use think\Validate;
+
+/**
+ * 游戏验证器
+ */
+class GameValidate extends Validate
+{
+    /**
+     * 定义验证规则
+     */
+    protected $rule = [
+        'id' => 'require|integer|gt:0',
+        'rtp' => 'integer|between:0,100',
+        'rtp_type' => 'integer|in:0,1,2',
+        'free_game_status' => 'integer|in:0,1',
+        'bet_max_level' => 'integer|gt:0',
+        'terminal_spin' => 'integer|in:0,1',
+        'max_multiple_count' => 'integer|gt:0',
+        'deposit_list' => 'array',
+        'default_deposit' => 'float|gt:0',
+        'default_deposit_level' => 'integer|gt:0',
+        'min_deposit' => 'float|gt:0',
+    ];
+    
+    /**
+     * 定义错误信息
+     */
+    protected $message = [
+        'id.require' => '游戏ID不能为空',
+        'id.integer' => '游戏ID必须是整数',
+        'id.gt' => '游戏ID必须大于0',
+        'rtp.float' => 'RTP必须是整数',
+        'rtp.between' => 'RTP必须在0-100之间',
+        'rtp_type.integer' => 'RTP类型必须是整数',
+        'rtp_type.in' => 'RTP类型值无效',
+        'free_game_status.integer' => '免费游戏状态必须是整数',
+        'free_game_status.in' => '免费游戏状态值无效',
+        'bet_max_level.integer' => '最大下注级别必须是整数',
+        'bet_max_level.gt' => '最大下注级别必须大于0',
+        'terminal_spin.integer' => '止损止赢状态必须是整数',
+        'terminal_spin.in' => '止损止赢状态值无效',
+        'max_multiple_count.integer' => '最高倍数必须是整数',
+        'max_multiple_count.gt' => '最高倍数必须大于0',
+        'deposit_list.array' => '押注列表必须是数组',
+        'default_deposit.float' => '默认押注必须是数字',
+        'default_deposit.gt' => '默认押注必须大于0',
+        'default_deposit_level.integer' => '默认押注级别必须是整数',
+        'default_deposit_level.gt' => '默认押注级别必须大于0',
+        'min_deposit.float' => '最小押注必须是数字',
+        'min_deposit.gt' => '最小押注必须大于0',
+    ];
+}

+ 5 - 4
app/validate/UserRoleValidate.php

@@ -17,6 +17,7 @@ class UserRoleValidate extends Validate
         'role_name'  => 'require|max:50',
         'privileges' => 'require|array',
         'id'         => 'require|integer|gt:0',
+        'merchant_id' => 'require|integer|gt:0',
     ];
     
     /**
@@ -30,15 +31,15 @@ class UserRoleValidate extends Validate
         'id.require'         => '角色ID不能为空',
         'id.integer'         => '角色ID必须是整数',
         'id.gt'              => '角色ID必须大于0',
+        'merchant_id.require' => '商户ID不能为空',
+        'merchant_id.integer' => '商户ID必须是整数',
+        'merchant_id.gt'     => '商户ID必须大于0',
     ];
     
     /**
      * 定义验证场景
      */
     protected $scene = [
-        'create' => ['role_name', 'privileges'],
-        'update' => ['id', 'role_name', 'privileges'],
-        'delete' => ['id'],
-        'detail' => ['id'],
+        'create' => ['role_name', 'privileges', 'merchant_id'],
     ];
 }

+ 14 - 11
app/validate/UserValidate.php

@@ -12,33 +12,36 @@ class UserValidate extends Validate
 {
     // 定义验证规则
     protected $rule = [
-        'username' => 'require|regex:/^[A-Za-z][A-Za-z0-9]{5,19}$/', // 必须|字母开头,且只包含字母数字,长度6-20
-        'nickname' => 'require|chsDash|length:2,20', // 汉字、字母、数字和下划线_及破折号-|长度6-20
-        'password' => 'require|regex:/^[A-Za-z0-9_+@%$]{6,20}$/', // 必须,包含字母、数字及特殊字符(_+@%), 长度在6-20个字符之间
-        'user_role'     => 'integer|gt:0',
-        'merchant_id'   => 'require|integer|gt:0',
+        'user_name' => 'require|regex:/^[A-Za-z][A-Za-z0-9]{2,19}$/',
+        'nick_name' => 'require|chsDash|length:2,20',
+        'password' => 'require|regex:/^[A-Za-z0-9_+@%$]{6,20}$/',
+        'phone' => 'mobile',
+        'user_role' => 'integer|gt:0',
+        'merchant_id' => 'require|integer|gt:0',
+        'white_list_ip' => 'max:500',
     ];
 
     // 定义错误消息
     protected $message = [
         'user_name.require'  => '账号名不能为空',
-        'user_name.regex'    => '账号名只能包含字母或数字,以字母开头,长度在6到20个字符之间',
-        'user_name.unique'   => '账号名已存在',
+        'user_name.regex'    => '账号名只能包含字母或数字,以字母开头,长度在3到20个字符之间',
+        'nick_name.require'   => '昵称不能为空',
+        'nick_name.chsDash'   => '昵称只能包含汉字、字母、数字和下划线_及破折号-',
+        'nick_name.length'   => '昵称长度必须在2-20个字符之间',
         'password.require'   => '密码不能为空',
         'password.regex'    => '密码只能包含字母、数字及特殊字符(_+@%), 长度在6-20个字符之间',
-        'nickname.require'   => '昵称不能为空',
-        'nickname.chsDash'   => '昵称只能包含汉字、字母、数字和下划线_及破折号-',
+        'phone.mobile'       => '手机号格式不正确',
         'user_role.integer'  => '角色ID必须是整数',
-        'user_role.egt'      => '角色ID必须大于0',
+        'user_role.gt'       => '角色ID必须大于0',
         'merchant_id.require' => '商户ID不能为空',
         'merchant_id.integer' => '商户ID必须是整数',
         'merchant_id.gt'     => '商户ID必须大于0',
+        'white_list_ip.max'  => 'IP白名单长度不能超过500个字符',
     ];
     
     // 定义验证场景
     protected $scene = [
         'login'  => ['user_name', 'password'],
         'create' => ['user_name', 'password', 'nick_name', 'user_role', 'merchant_id'],
-        'update' => ['nick_name', 'user_role'],
     ];
 }