群控系统服务端开发模式-应用开发-邮箱配置功能开发
邮箱配置主要是将管理员数据做归属。具体见下图:

一、创建表
1、语句
CREATE TABLE `cluster_control`.`nc_param_mail` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号',`title` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '邮箱服务标题',`username` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '发件人邮箱',`smtp_address` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '邮箱服务地址',`smtp_port` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '邮箱服务端口',`smtp_password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '邮箱服务授权码',`smtp_lifespan` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '有效期',`smtp_protocol` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '邮箱服务协议',`status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 1:启用 0:禁用',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE INDEX `m_t`(`title`) USING BTREE,
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '邮箱配置表';
2、表结构

二、邮箱配置路由管理
在根目录下route文件夹中app.php文件中,添加邮箱配置功能路由,代码如下:
// 邮箱配置操作Route::get('mail/get_list','param.Mail/getList');// 获取邮箱配置列表Route::post('mail/get_all','param.Mail/getAll');// 获取所有邮箱配置数据Route::post('mail/get_info','param.Mail/getInfo');// 获取单个邮箱配置数据Route::post('mail/save_info','param.Mail/saveInfo');// 保存邮箱配置数据Route::post('mail/status_info','param.Mail/statusInfo');// 启禁用邮箱配置数据Route::post('mail/delete_info','param.Mail/deleteInfo');// 删除邮箱配置数据
三、邮箱配置控制管理
在根目录下的app文件夹下的controller文件夹中,创建文件夹并命名param,在param文件夹中接着创建邮箱配置控制器并命名为Mail。具体代码如下:
<?php
/*** 邮箱配置控制管理* User: 龙哥·三年风水* Date: 2024/11/28* Time: 11:10*/
namespace app\controller\param;
use app\controller\Base;
use app\model\param\Mail as MailModel;
class Mail extends Base
{// 分页数据public function getList(){$param = $this->request->param();$where = [];if (!empty($param['id'])) $where[] = ['id', '=', $param['id']];if (!empty($param['title'])) $where[] = ['title', 'LIKE', $param['title'] . '%'];if (!empty($param['username'])) $where[] = ['username', 'LIKE', $param['username'] . '%'];$resList = MailModel::getRedisList($where , [$param['currentPage'], $param['currentSize']]);$list = [];foreach ($resList['info'] as $k => $v) {$list[$k] = MailModel::dataFind(['id' => $v],'id,title,username,smtp_address,smtp_port,smtp_lifespan,smtp_protocol,status,create_time,update_time',true);}$res['list'] = $list;$res['meat'] = $resList['page'];return succ('操作成功',$res);}// 所有数据public function getAll(){$list = MailModel::getAll(['status' => 1],'id,title','create_time DESC');return succ('操作成功',$list);}// 单个数据public function getInfo(){$id = $this->request->param('id', 0);if(empty($id))return err('主键参数必须上传');$data = MailModel::dataFind(['id' => $id], 'id,title,username,smtp_address,smtp_port,smtp_password,smtp_lifespan,smtp_protocol,status',true);return succ('操作成功',$data);}// 保存数据public function saveInfo(){$this->checkRoleMenu('ParamMailIndexSave');//验证权限$param = $this->request->param();//接收参数$validate = new \app\validate\param\Mail;if (!$validate->check($param)) return err($validate->getError());//验证参数$data['title'] = $param['title'];$data['username'] = $param['username'];$data['smtp_address'] = $param['smtp_address'];$data['smtp_port'] = $param['smtp_port'];$data['smtp_password'] = $param['smtp_password'];$data['smtp_lifespan'] = $param['smtp_lifespan'];$data['smtp_protocol'] = $param['smtp_protocol'];$data['update_time'] = date('Y-m-d H:i:s', time());if (empty($param['id'])){$data['status'] = 1;$data['create_time'] = date('Y-m-d H:i:s', time());}MailModel::redisSave($data, $param['id']);return succ('操作成功', []);}// 启禁用数据public function statusInfo(){$this->checkRoleMenu('ParamMailIndexSave');//验证权限$param = $this->request->param();if (!is_array($param['id']) || count($param['id']) === 0) return err('唯一编号必须是数组且至少需要一个');if (!in_array($param['status'],[0,1])) return err('状态必须选择一种');MailModel::mysqlSave(['status' =>$param['status']], [['id','in',$param['id']]]);return succ('操作成功', []);}// 删除数据public function deleteInfo(){$this->checkRoleMenu('ParamMailIndexDelete');//验证权限$id = $this->request->param('id',0);if (!is_array($id) || count($id) === 0) return err('请上传参数');MailModel::dataDetele($id);return succ('操作成功', []);}
}
四、邮箱配置数据管理
在根目录下app文件夹下model文件夹中创建文件夹并命名为param,在param文件夹中创建邮箱配置数据文件并命名为Mail。具体代码如下:
<?php
/*** 邮箱配置数据管理* User: 龙哥·三年风水* Date: 2024/11/28* Time: 11:11*/
namespace app\model\param;
use app\model\Tools;
class Mail extends Tools
{protected static $name = 'param_mail';protected static $connection = 'mysql';protected $pk = 'id';protected static $unsetField = ['update_time','create_time'];//获取分页数据public static function getRedisList($where = [], $limit = []){return self::dataRedisLists(self::$name, $where, $limit, self::$connection);}//获取所有数据public static function getAll($where = [], $field = '*', $order = ''){return self::dataAlls(self::$name, $where, $field, $order, [], self::$connection);}//获取单条数据public static function dataFind($where = [], $field, $findType = true){return self::dataFinds(self::$name, $where, $field, $findType, self::$connection);}//保存数据-Redis版本public static function redisSave($data, $pk = ''){return self::dataRedisSaves(self::$name, $data, $pk, self::$connection);}//保存数据-MySQL版本public static function mysqlSave($data, $where = []){return self::dataSaves(self::$name, $data, $where, self::$connection);}//删除数据public static function dataDetele($pk = ''){self::dataRedisDeteles(self::$name, $pk, self::$connection); // TODO: Change the autogenerated stub}
}
五、邮箱配置验证管理
在根目录下app文件夹下validate文件夹中创建文件夹并命名为param,在param文件夹中创建邮箱配置验证文件并命名为Mail。具体代码如下:
<?php
/*** 邮箱配置验证管理* User: 龙哥·三年风水* Date: 2024/11/28* Time: 11:39*/
namespace app\validate\param;
use app\validate\Tools;
use app\model\param\Mail as MailModel;
class Mail extends Tools
{protected $rule = ['id' => 'require|number','title' => 'require|length:2,20|unique:param_mail','username' => 'require|length:8,250|email','smtp_address' => 'require|length:10,250|checkSmtp','smtp_port' => 'require|number|checkSmtp','smtp_password' => 'require|length:10,50','smtp_lifespan' => 'require|number','smtp_protocol' => 'require|length:2,5'];protected $message = ['id.require' => '编号必须填写','id.number' => '编号必须是数字类型','title.require' => '标题必须填写','title.length' => '标题必须是2到20位','title.unique' => '标题必须唯一','username.require' => '发件人邮箱必须填写','username.length' => '发件人邮箱必须是8到250位','username.email' => '发件人邮箱必须是邮箱格式','smtp_address.require' => '地址必须填写','smtp_address.length' => '地址必须是2到250位','smtp_port.require' => '端口号必须填写','smtp_port.number' => '端口号必须是数字类型','smtp_password.require' => '授权码必须填写','smtp_password.length' => '授权码必须是10到50位','smtp_lifespan.require' => '有效期必须填写','smtp_lifespan.number' => '有效期必须是数字类型','smtp_protocol.require' => '协议必须填写','smtp_protocol.length' => '协议必须是2到5位'];protected function checkSmtp($value, $rule, $data, $field){$where[] = ['smtp_address','=',$data['smtp_address']];$where[] = ['smtp_port','=',$data['smtp_port']];if($data['id'] > 0)$where[] = ['id','<>',$data['id']];$id = MailModel::dataFind($where,'id',false);if(empty($id))return true;return "邮件服务已存在";}
}相关文章:
群控系统服务端开发模式-应用开发-邮箱配置功能开发
邮箱配置主要是将管理员数据做归属。具体见下图: 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_mail (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,title varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
android studio引用so库
在工程中编译好的so库文件将在原始编译工程对应目录下:build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示,包含生成的四个版本,每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...
2024年信号处理与神经网络应用(SPNNA 2024)
会议官网:www.spnna.org 会议时间:2024年12月13-15日 会议地点:中国武汉...
wxWidgets-ImageView
wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...
第1章-JVM和Java体系架构
虚拟机 虚拟机概念 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box,VMware就属…...
windows 服务器角色
windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息,防止未授权使用。AD RMS 将建立用户标识,并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
C#中判断两个 List<T> 的内容是否相等
ET实现游戏中邮件系统逻辑思路(服务端)_游戏邮件系统设计-CSDN博客 场景:今天遇到一个BUG,在服务器重启的时候(体验服),玩家之前接收的邮件又重新接收了一次,但是两封邮件的ID是不同…...
Linux环境下配置neo4j图数据库
1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装(jdk1.8不够用) 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…...
Windows 11 搭建 Docker 桌面版详细教程
在当今的软件开发与部署领域,Docker 已成为一项极为重要的容器化技术。它能够让开发者轻松地打包应用及其依赖项,实现跨环境的一致性运行,大大提高了开发效率与部署的便捷性。本教程将详细介绍在 Windows 11 操作系统上搭建 Docker 桌面版的具…...
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks) 前言一、什么是钩子?二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…...
dns 服务器简单介绍
dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里…...
Neo4j图形数据库-Cypher中常用指令
一、创建与修改 1.1 create 创建图数据库中的节点、关系等元素: CREATE (:Person {name: "Alice", age: 30}) CREATE (p1:Person {name: "Bob"})-[r:KNOWS]->(p2:Person {name: "Charlie"})批量创建元素 CREATE (n1:Node),(n2…...
linux安全管理-防火墙配置
1. 开启系统防火墙 1、检查内容 检查操作系统是否开启防火墙; 2、配置要求 操作系统开启防火墙; 3、配置方法 systemctl status firewalld ##查看系统防火墙运行状态 systemctl start firewalld ##启动防火墙 systemctl restart firewalld ##重启防火墙…...
什么是BIOS
BIOS(Basic Input/Output System,基本输入输出系统)是计算机启动过程中的一个关键组件,主要负责硬件的初始化和系统的引导。以下是关于 BIOS 的一些详细信息: 1. 基本功能 硬件初始化:当计算机启动时&…...
c++视频图像处理
打开视频或摄像头 打开指定视频 /*VideoCapture(const String &filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference:读取数据时设置的属性*/ VideoCapture video; //定义一个空的视频对象 video.open("H:/BaiduNetdiskDownlo…...
音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域
注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 当TS Header中的adaptation_field_control属性的值为10或11 时,TS Header包含adaptation field(适配域): 根据《T-RE…...
基于stm32单片机的教室节能系统设计
功能描述 0. STM32F103C8T6单片机为控制核心 1. OLED液晶显示当前年 月 日 时 分 秒 星期 2. 按键可以设置定时时间 3. 按键可以设置用电开关的开启和关闭时间,实现设备的节能 4. 通过红外遥控可以打开关闭空调设备(通过继电器开关闭合模拟&#x…...
mini主机通过内网穿透做成服务器
文章目录 简介1.ubuntu 的ssh server 安装2.ubuntu 的docker 安装3.ubuntu的curl的安装4.ubuntu的frp客户端安装5.ubuntu的docker compose安装6.声明 简介 主要目的 本地设备做成服务器,实现ssh远程登录以及内网穿透设备总成本1千多元(其实部分设备可以…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...
