群控系统服务端开发模式-应用开发-上传配置功能开发

下面直接进入上传配置功能开发,废话不多说。

一、创建表

1、语句

复制代码
CREATE TABLE `cluster_control`.`nc_param_upload`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号',
  `upload_type` tinyint(1) UNSIGNED NOT NULL COMMENT '上传类型 1:本站 2:阿里云 3:腾讯云 4:七牛云',
  `checked_images` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '图片类型',
  `checked_videos` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '视频类型',
  `checked_filedocs` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件类型',
  `upload_number` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件大小',
  `example_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '实例名称',
  `access_key` varchar(100) NULL COMMENT 'accessKey',
  `secret_key` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'secretKey',
  `bucket_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '空间名称',
  `domain_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Bucket域名',
  `update_time` datetime(0) NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件上传配置';

2、表结构

二、路由配置

**因它是固定数据,所以只有读取与保存这两个接口。**在根目录下的route文件夹中的app.php文件中,具体如下代码:

复制代码
    //上传配置
    Route::post('upload/get_info','param.Upload/getInfo');// 获取上传配置参数数据
    Route::post('upload/save_info','param.Upload/saveInfo');// 保存上传配置参数数据

三、控制层开发

在根目录下的app文件夹下的controller文件夹中,创建文件夹并命名param,在param文件夹中接着创建上传参数控制器并命名为Upload。具体代码如下:

复制代码
<?php
/**
 * 上传参数控制管理
 * User: 龙哥·三年风水
 * Date: 2024/11/1
 * Time: 14:38
 */
namespace app\controller\param;
use app\controller\Base;
use app\model\param\Upload as UploadModel;
class Upload extends Base
{
    // 获取上传参数
    public function getInfo(){
        if($this->request->param('id') !== 1)return err('请求参数错误');//验证请求参数
        $resPUpload = UploadModel::dataFind(['id' => 1],'upload_type,checked_images,checked_videos,checked_filedocs,upload_number,example_name,access_key,secret_key,bucket_name,domain_name');
        $resPUpload['upload_max_filesize'] = (int)ini_get('upload_max_filesize');
        return succ('操作成功',$resPUpload);
    }

    // 保存上传参数
    public function saveInfo(){
        $param = $this->request->param();
        $validate = new \app\validate\param\Upload;
        if(!$validate->check($param)) return err($validate->getError());
        $checked_images = implode(',', $param['checked_images']);
        $checked_videos = implode(',', $param['checked_videos']);
        $checked_filedocs = implode(',', $param['checked_filedocs']);
        UploadModel::save([
            'upload_type' => $param['upload_type'],
            'checked_images' => $checked_images,
            'checked_videos' => $checked_videos,
            'checked_filedocs' => $checked_filedocs,
            'upload_number' => $param['upload_number'],
            'example_name' => $param['upload_type'] > 1 ? $param['example_name'] : '',
            'access_key' => $param['upload_type'] > 1 ? $param['access_key'] : '',
            'secret_key' => $param['upload_type'] > 1 ? $param['secret_key'] : '',
            'bucket_name' => $param['upload_type'] > 1 ? $param['bucket_name'] : '',
            'domain_name' => $param['upload_type'] > 1 ? $param['domain_name'] : ''
        ],[['id','=',1]]);
        return succ('操作成功', []);
    }
}

四、数据层开发

在根目录下app文件夹下model文件夹中创建文件夹并命名为param,在param文件夹中创建上传参数数据文件并命名为Upload。具体代码如下:

复制代码
<?php
/**
 * 上传参数数据管理
 * User: 龙哥·三年风水
 * Date: 2024/11/1
 * Time: 14:42
 */
namespace app\model\param;
use app\model\Tools;
use Redis\Redis;
class Upload extends Tools
{
    protected static $name = 'param_upload';
    protected static $connection = 'mysql';
    protected $pk = 'id';
    protected static $unsetField = ['update_time','create_time','status'];

    //获取单条数据
    public static function dataFind($where = [], $field='*', $unsetField=[]){
        $fieldL = 0; //预防字段少于数据库字段等情况下,加入等级进行区分。保障Redis存储最高性
        if($field == '*') {
            $res = Redis::select(config('cache.stores.redis.other_db'))->hgetall('param_upload1');
        }else{
            $res = Redis::select(config('cache.stores.redis.other_db'))->hmget('param_upload1',explode(',',$field));
        }
        foreach($res as $v){
            if(empty($v)){
                $fieldL = 1;
                break;
            }
        }
        if($fieldL === 1){
            $fields = $field;
            if($fieldL === 1)$fields = '*';
            $res = self::dataFinds(self::$name, $where, $fields, true, self::$connection);
            if(count($unsetField) > 0){//如果单独添加过滤数据,则优先并入数据
                foreach($unsetField as $v){
                    array_push(self::$unsetField,$v);
                }
            }
            if(!empty(self::$unsetField)){//主动过滤修改时间等状态
                foreach(self::$unsetField as $v){
                    if(isset($res[$v]))unset($res[$v]);
                }
            }
            //过滤好了之后存入Redis
            Redis::select(config('cache.stores.redis.other_db'))->hmset('param_upload1',$res);
        }
        if($field != '*'){//根据需要,将需要的字段过滤返回
            $data = [];
            $list = explode(',',$field);
            foreach($list as $k=>$v){
                if($fieldL === 1){
                    $data[$v] = $res[$v];
                }else{
                    $data[$v] = $res[$k];
                }
            }
            $res = $data;
        }
        return $res;
    }

    //保存数据
    public static function save($data, $where = [], $unsetField=[]){
        self::dataSaves(self::$name, $data, $where, self::$connection);
        if(count($unsetField) > 0){//如果单独添加过滤数据,则优先并入数据
            foreach($unsetField as $v){
                array_push(self::$unsetField,$v);
            }
        }
        if(!empty(self::$unsetField)){//主动过滤修改时间等状态
            foreach(self::$unsetField as $v){
                if(isset($data[$v]))unset($data[$v]);
            }
        }
        //过滤好了之后存入Redis
        Redis::select(config('cache.stores.redis.other_db'))->hmset('param_upload1',$data);
    }
}

五、验证层开发

在根目录下app文件夹下validate文件夹中创建文件夹并命名为param,在param文件夹中创建图片格式验证文件并命名为Upload。具体代码如下:

复制代码
<?php
/**
 * 上传参数验证管理
 * User: 龙哥·三年风水
 * Date: 2024/11/1
 * Time: 14:54
 */
namespace app\validate\param;
use app\validate\Tools;
class Upload extends Tools
{
    protected $rule = [
        'id' => 'require|number',
        'upload_type' => 'require|number',
        'checked_images' => 'require|array',
        'checked_videos' => 'require|array',
        'checked_filedocs' => 'require|array',
        'upload_number' => 'require|number|between:1,300',
        'example_name' => 'requireIf:upload_type,2,4|url|length:3,120',
        'access_key' => 'requireIf:upload_type,2,4|length:3,120',
        'secret_key' => 'requireIf:upload_type,2,4|length:3,120',
        'bucket_name' => 'requireIf:upload_type,2,4|length:3,120',
        'domain_name' => 'url|length:3,120'
    ];
    protected $message = [
        'id.require' => '编号必须填写',
        'id.number' => '编号必须是数字类型',
        'upload_type.require' => '上传类型必须选择',
        'upload_type.number' => '上传类型必须是数字类型',
        'checked_images.require' => '图片类型必须选择',
        'checked_images.array' => '图片类型必须是数组',
        'checked_videos.require' => '视频类型必须选择',
        'checked_videos.array' => '视频类型必须是数组',
        'checked_filedocs.require' => '文件类型必须选择',
        'checked_filedocs.array' => '文件类型必须是数组',
        'upload_number.require' => '文件上传大小必须填写',
        'upload_number.number' => '文件上传大小必须是数字',
        'upload_number.between' => '文件上传大小必须是1到300之间',
        'example_name.requireIf' => '实例名称必须填写',
        'example_name.url' => '实例名称必须是url类型',
        'example_name.length' => '实例名称必须是3到120位之间',
        'access_key.requireIf' => 'accessKey必须填写',
        'access_key.length' => 'accessKey必须是3到120位之间',
        'secret_key.requireIf' => 'secretKey必须填写',
        'secret_key.length' => 'secretKey必须是3到120位之间',
        'bucket_name.requireIf' => '空间名称必须填写',
        'bucket_name.length' => '空间名称必须是3到120位之间',
        'domain_name.url' => 'Bucket域名必须是url类型',
        'domain_name.length' => 'Bucket域名必须是3到120位之间'
    ];
}

六、提前说明

在本功能开发的同时,我发现之前开发的系统配置文件命名及存放的位置不合理,所以需要修改一下前面开发的文档。明天将开发系统配置及文件上传工厂。

相关推荐
JaguarJack1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
初次攀爬者2 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082853 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
longxiangam3 天前
Composer 私有仓库搭建
php·composer
上海云盾-高防顾问3 天前
DNS异常怎么办?快速排查+解决指南
开发语言·php
断手当码农3 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式