当前位置: 首页 > news >正文

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

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

 一、创建表

        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]);}}//过滤好了之后存入RedisRedis::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]);}}//过滤好了之后存入RedisRedis::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位之间'];
}

六、提前说明

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

相关文章:

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

下面直接进入上传配置功能开发&#xff0c;废话不多说。 一、创建表 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&#xff1a;本站 2&a…...

stm32——GPIO开发

目录 1、什么是GPIO 2、GPIO的作用 3、GPIO的基本结构 4、GPIO引脚的基本结构 5、GPIO端口模式的配置 1. 输入浮空&#xff08;Input Floating&#xff09; 2. 输入上拉&#xff08;Input Pull-Up&#xff09; 3. 输入下拉&#xff08;Input Pull-Down&#xff09; 4. …...

layui 自定义验证单选框必填

对于输入框类型必填验证&#xff0c;只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢&#xff1f;layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…...

Spring 设计模式之策略模式

Spring 设计模式之策略模式 策略模式构成部分java举例 策略模式 策略模式&#xff1a;允许定义一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;且算法的变化可以独立于使用它们的客户端。 构成部分 Context&#xff08;上下文&…...

苹果开发 IOS 证书生成步骤

前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后&#xff0c;就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心&#xff0c;创建 profiles 文件&#xff0c;并下载以上步骤即可&#xff0c;就这…...

DDR2 SDRAM(五)初始化

因为DDR2本质上只是更高级的一种SRAM&#xff0c;底层操作原理和SRAM是一样的&#xff0c;所以很多基础的东西就不再赘述了。 一、原理 在初始化之前&#xff0c;DDR2芯片需要先上电&#xff0c;芯片有多个需要提供的电压&#xff0c;其大小和顺序也有要求&#xff0c;这部分…...

Python工具箱系列(五十七)

图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的&#xff0c;图像分割作为计算机视觉的基础&#xff0c;对具有现有目标和较精确边界的图像进行分割&#xff0c;实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类&#xff0c;区别如下&#x…...

数据智能驱动金融策略优化:民锋智能分析技术的应用

在现代金融市场中&#xff0c;数据分析与智能化技术的结合为投资策略带来了全新机遇。民锋以智能分析技术为核心&#xff0c;帮助投资者在复杂的市场环境中做出高效决策。本文将深入探讨民锋智能分析技术如何驱动策略优化&#xff0c;为投资者带来更加智能化的支持。 #### 一、…...

1009:带余除法

【题目描述】 给定被除数和除数&#xff0c;求整数商及余数。此题中请使用默认的整除和取余运算&#xff0c;无需对结果进行任何特殊处理。 【输入】 一行&#xff0c;包含两个整数&#xff0c;依次为被除数和除数&#xff08;除数非零&#xff09;&#xff0c;中间用一个空格隔…...

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点&#xff0c;不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码&#xff0c;是要在jmeter中用的 keytool -import -ali…...

C++基础(11.AVL树的实现)

目录 AVL的概念&#xff1a; AVL树的实现&#xff1a; AVL树的结构&#xff1a; AVL树的插⼊&#xff1a; 平衡因⼦更新&#xff1a; 旋转&#xff1a; AVL树的其他功能: AVL树平衡检测: 测试代码*2: 源代码&#xff1a; KV结构&#xff1a; 源代码&#xff1a; AVL…...

c# 抽象方法 虚函数 使用场景

在C#中&#xff0c;抽象方法&#xff08;abstract method&#xff09;和虚函数&#xff08;virtual method&#xff09;都是用于实现多态性&#xff08;polymorphism&#xff09;的重要特性&#xff0c;但它们在使用上有一些关键的区别和各自的用途。 抽象方法&#xff08;Abs…...

大数据安全方案 验证

一、背景 文档用于记录配置 Kerberos 和 Ranger 后&#xff0c;对 HDFS、Hive 认证和鉴权的功能测试。 二、Kerberos 验证 2.1、验证功能 1&#xff0c;HDFS 认证 2.1.1、访问 HDFS Kerberos 验证前&#xff0c;访问 HDFS 失败。 Kerberos 验证后&#xff0c;访问 HDFS 成…...

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…...

php反序列化靶场随笔分析

项目地址&#xff1a;github.com/mcc0624/php_ser_Class 推荐使用docker部署&#xff1a;https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础&#xff0c;我们直接从class6开始实验 class6 访问页面&#xff0c;传一个序列化的字符串&#xff0c;php代码将其反…...

动态规划 - 编辑距离

115. 不同的子序列 困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 10^9 7 取模。 算法思想&#xff1a;利用动态规划&#xff0c;分s[i - 1] 与 t[j - 1]相等&#xff0c;s[i - 1] 与 t[j - 1] 不相等两种情况具…...

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...

C02S04-Ubuntu基本使用

一、Ubuntu初始配置 1. 使用root用户 Ubuntu系统默认只能使用普通用户&#xff0c;要想使用root用户&#xff0c;需要先设置root用户密码。 进入终端&#xff0c;配置root用户密码。按照提示输入密码。 sudo passwd root配置完成后&#xff0c;执行下面的密码&#xff0c;切换…...

C语言 | Leetcode C语言题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; struct HashTable {int key, val;UT_hash_handle hh; };int findMaxLength(int* nums, int numsSize) {int maxLength 0;struct HashTable* hashTable NULL;struct HashTable* tmp malloc(sizeof(struct HashTable));tmp->key 0, tm…...

Qml-Transition的使用

Qml-Transition的使用 Transition的概述 Transition&#xff1a;定义了当状态发生改变时应用的动画属性animations : list&#xff1a;(Transition)过渡的动画属性enabled : bool&#xff1a;状态发生变化时&#xff0c;是否使能此过渡&#xff08;Transition&#xff09;动画…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...