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

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

一、创建表

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位之间'
    ];
}

六、提前说明

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

相关推荐
岁岁种桃花儿21 分钟前
Kafka从入门到上天系列第三篇:基础架构推演+基础组件图形推演
分布式·kafka
YUJIANYUE9 小时前
PHP纹路验证码
开发语言·php
MZ_ZXD00111 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
qq_124987075311 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
JMchen12312 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
Coder_Boy_14 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
袁煦丞 cpolar内网穿透实验室15 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
人间打气筒(Ada)15 小时前
GlusterFS实现KVM高可用及热迁移
分布式·虚拟化·kvm·高可用·glusterfs·热迁移
AZ996ZA15 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
xu_yule15 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式