FastDFS总结
目录
概述
什么是分布式文件系统
核心概念
目录结构
上传机制
下载机制
Linux中搭建FastDFS
常用指令
SpringBoot整合FastDFS
FastDFS集成Nginx
概述
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。
FastDFS特性:
- 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
- 支持相同内容的文件只保存一份,节约磁盘空间
- 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
- 支持在线扩容
- 支持主从文件
什么是分布式文件系统
单机时代
初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如:resources\static\file、resources\static\img等。
注意:
优点:便利,使用方便。
缺点:文件越多存放越混乱。
独立文件服务器
随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,
流程:
项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过Ngnix或者Apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。
分布式文件系统
业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
优点:
- 扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
- 高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
- 弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点:系统复杂度稍高,需要更多服务器
核心概念
FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。
tracker
跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。
Storage
存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。
Client
客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Group
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
流程:
Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。
目录结构
上传机制
首先客户端请求tracker服务,获取到可使用的storage服务器的ip地址和端口,然后将文件上传到storage服务器,storage服务器接收到请求后生产文件,并且将文件内容保存到磁盘当中并返回file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕
内部机制如下
1、选择Tracker server
当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。
2、选择Storage server
当选定Group后,Tracker会在Group内选择一个Storage Server给客户端
3、选择Storage path
当分配好Storage Server后,客户端将向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。
注意:
剩余存储空间最多的优先。
4、生成Fileid
选定存储目录之后,Storage会为文件生一个Fileid,由Storage Server Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
下载机制
客户端向tracker发送请求,tracker返回可用的storage服务器ip和端口,客户端将file_id发送给storage服务器,storage服务器将文件返回给客户端
内部机制如下
- client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
- tracker返回一台可用的storage
- client直接和storage通讯完成文件下载
Linux中搭建FastDFS
1、下载所需要的插件和tar包
下载安装gcc安装方式为yum安装(需网络):yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget下载安装FastDFSwget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz下载安装FastDFS依赖wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz
2、解压缩两个tar包
tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V6.06.tar.gz-C /usr/local
3、编译并安装(注意需要先编译安装依赖包,在编译安装FastDFS)
编译并安装libfastcommoncd /usr/local/libfastcommon-1.0.43/./make.sh && ./make.sh install编译并安装FastDFS
cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install
4、进入/etc/fdfs中修改配置文件的名字,fdfs只识别后缀为conf的文件为配置文件
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
5、创建tracker服务,修改tracker.conf配置文件
创建tracker目录
mkdir -p /data/fastdfs/tracker
修改配置文件
vim /etc/fdfs/tracker.conf
disabled=false #启用配置文件
port=22122 #设置 tracker 的端口号
base_path=/data/fastdfs/tracker #设置 tracker 的数据文件和日志目录(需预先创建)
http.server_port=8888 #设置 http 端口号http.server_port=8888 #指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口启动tracker服务
/etc/init.d/fdfs_trackerd start
检查tracker服务
netstat -lntup | grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 10757/fdfs_trackerd
6、创建storage服务,修改storage.conf文件
创建storage目录
mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage
修改配置文件
vim /etc/fdfs/storage.conf
disabled=false #启用配置文件
group_name=group1 #组名,根据实际情况修改
port=23000 #设置 storage 的端口号
base_path=/data/fastdfs/base #设置 storage 的日志目录(需预先创建)
store_path_count=1 #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage #存储路径
tracker_server=172.31.16.121:22122 #tracker 服务器的 IP 地址和端口号
http.server_port=8888 #设置storage上启动的http服务的端口号,如安装的nginx的端口号启动storage服务
/etc/init.d/fdfs_storaged start
查看storage服务
netstat -lntup |grep fdfs
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 10892/fdfs_storaged
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 10757/fdfs_trackerd
7、需改client配置文件
vim /etc/fdfs/client.conf
connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client # 日志路径
tracker_server=192.168.66.100:22122 # 追踪服务器的IP,有多个服务器可以另一行
创建日志目录
mkdir -p /data/fastdfs/client查看启动的服务
ps -ef | grep fdfsroot 13080 1 0 03:12 ? 00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
root 13223 1 0 03:14 ? 00:00:00 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
root 13233 7419 0 03:14 pts/0 00:00:00 grep --color=auto fdfs
常用指令
1、上传指令
指令参数
fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
参数含义:
- <config_file> :客户端配置文件路径
- <local_filename> :本地文件路径
- [storage_ip:port] :(可选参数)
- [store_path_index] :(可选参数)
指令使用
[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf 上传的文件路径
注意:
上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名
2、下载指令
指令参数
fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>]
参数含义:
- <config_file> :配置文件路径
- <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
- [local_filename] :文件下载地址
- <download_offset> :(可选参数)文件下载开始时间
- <download_bytes> :(可选参数)文件下载的字节数
指令使用
[root@tracker fdfs]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm /root/java/xxx.rpm
3、查看文件信息指令
指令参数
fdfs_file_info <config_file> <file_id>
参数含义:
- <config_file> :配置文件路径
- <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
指令使用
[root@tracker fdfs]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm
4、删除指令
指令参数
fdfs_delete_file <config_file> <file_id>
参数含义:
- <config_file> :配置文件路径
- <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
指令使用
[root@tracker fdfs]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm
注意:
删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用
SpringBoot整合FastDFS
1、引入fastdfs的依赖并且在yml文件中配置fdfs
<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version></dependency>
fdfs:so-timeout: 1501connect-timeout: 601thumb-image:width: 150height: 150tracker-list:- 192.168.138.102:22122server:port: 8080
2、编写控制器
package com.itbaizhan.fastdfs_blog.controller;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;@Controller
public class FdfsController {//fastdfs的客户端操作对象@Autowiredprivate FastFileStorageClient fastFileStorageClient;//通过该路径跳转到上传页面@RequestMapping("/index")public String index(){return "index";}//处理上传业务@RequestMapping("/upload")public String upload(MultipartFile file){try {String fileName = file.getOriginalFilename();String suffix = fileName.substring(fileName.lastIndexOf(".")+1);/*** 参数一:文件输入流* 参数二:文件大小* 参数三:文件后缀名* 参数四:元对象*/StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), suffix, null);System.out.println(storePath.getFullPath());//输出文件的唯一标识}catch (Exception ex){ex.printStackTrace();}//成功之后跳转到成功页return "ok";}}
3、编写index.html,通过wangEditor实现文件上传
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body><div id="div1"><p>欢迎使用<b>wangEditor</b>富文本编辑器</p></div><!--引入js--><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/wangeditor@4.7.15/dist/wangEditor.js"></script><script type="text/javascript">var E = window.wangEditor;const editor=new E('#div1')//设置文件上传的参数名称editor.config.uploadFileName='file'//配置server接口地址editor.config.uploadImgServer='/upload'//2Meditor.config.uploadImgMaxSize=2*1024*1024editor.config.uploadImgAccept=['jpg','jpeg','png','gif','bmp','webp']//一次最多上传5个图片editor.config.uploadImgMaxLength=5editor.create()</script>
</body>
</html>
4、编写成功页
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>完成页</title>
</head>
<body>上传图片成功,点击<a href="/index">返回</a>
</body>
</html>
5、启动控制器,访问路径http://localhost:8080/index跳转到文件上传页面,因为我们没有返回成功的状态码所以不管我们是否成功都无法跳转到成功页面,但是其实是已经上传成功了,大家如果想要做的更加完整可以返回一个成功的状态码,具体前往wangEditor的官网查看
但是我们可以通过控制器的输出获取到文件的唯一标识,然后在虚拟机中获取文件的信息:
FastDFS集成Nginx
Nginx服务器是一个高性能的web服务器与反向代理服务器。
FastDFS集成Nginx的2个原因
1、为分布式文件系统提供Http服务支持
通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。
注意:
src 属性值图像文件的 URL。也就是引用该图像的文件的的绝对路径或相对路径。
2、解决复制延迟问题
由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完成时,访问请求到达改节点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据,若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。
下载Fastdfs的Nginx模块包
cd /usr/localwget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gztar -zxvf V1.22.tar.gz
安装Nginx依赖文件
yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release
下载Nginx软件包
wget https://nginx.org/download/nginx-1.19.2.tar.gztar -zxvf nginx-1.19.2.tar.gzcd nginx-1.19.2/
配置Nginx服务器
#建立Makefile文件,检查Linux系统环境以及相关的关键属性。./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/#编译项目,主要将gcc源代码编译成可执行的目标文件make#根据上一步骤编译完成的数据安装到预定的目录中。make install
注意:
- –add-module:为nginx添加一个fastdfs-nginx-module模块,值为该模块在当前系统的路径
- –prefix:指定nginx安装位置
将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下
cp /usr/local/fastdfs-6.06/conf/mime.types /etc/fdfs/cp /usr/local/fastdfs-6.06/conf/http.conf /etc/fdfs/
配置Nginx的fastdfs模块,并编辑文件
#拷贝文件[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/[root@localhost fdfs] vim mod_fastdfs.conf#保存日志目录base_path=/data/fastdfs/storage #tracker 服务器的 IP 地址以及端口号tracker_server=192.168.66.100:22122#文件url中是否有group 名url_have_group_name = true #存储路径store_path0=/data/fastdfs/storage group_count = 1 #设置组的个数#然后在末尾添加分组信息,目前只有一个分组,就只写一个[group1]group_name=group1storage_server_port=23000store_path_count=1store_path0=/data/fastdfs/storage
配置Nginx
server{listen 80;server_name localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module; //使用FastDFS集成Nginx的模块}# 根目录下返回403location= / {return 403;}# log fileaccess_log logs/img_access.log access;}
启动Ningx服务
# 进入sbin目录[root@tracker nginx]# cd sbin/# 启动服务 -c:指定配置文件[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
查看服务启动情况
[root@tracker sbin]# ps -ef | grep nginx
启动追踪服务与存储节点服务
[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start
上传图片测试
将图片上传至linux系统后,使用指令上传至分布式文件系统
[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/xxxxx.pnggroup1/M00/00/00/wKhyj1wrIUWAL5ASAAAfA8PiO7Y493.png
通过浏览器远程访问
http://192.168.66.100/group1/M00/00/00/wKhyj1wrIfqAD3NFAAn1fNRE8_M976.png
相关文章:

FastDFS总结
目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件ÿ…...

【职场新人备忘录】新人职场生存指南:快速适应、持续成长和个人提升
新人职场生存指南:快速适应、持续成长和个人提升 引言 职场对于新人来说充满了新的挑战和机遇。作为一名新人,如何在职场中快速适应、获得成长和提升自己是至关重要的技能。本备忘录旨在为职场新人提供实用的职场tips,帮助他们在职场中取得…...

SpringCloud Alibaba详解
目录 微服务架构概念 服务治理 服务调用 服务网关 服务容错 链路追踪 SpringcloudAlibaba组件 Nacos 负载均衡 Ribbon Fegin Sentinel 高并发测试 容错方案 Sentinel入门 Feign整合Sentinel 微服务架构概念 服务治理 服务治理就是进行服务的自动化管理…...

Golang每日一练(leetDay0065) 位1的个数、词频统计
目录 191. 位1的个数 Nnumber of 1-bits 🌟 192. 统计词频 Word Frequency 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…...

前端技术搭建井字游戏(内含源码)
The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了飞机大战游戏,今天还是继续按照我们原定的节奏来带领大家完成一个井字游戏游戏,功能也比较简单简单&#x…...

视频截取gif方法分享,利用gif制作工具在线制作动图
表情包作为聊天社交中调节氛围的工具,而动态的gif表情包更是深受大众的喜爱。那么,这种gif动态图片要怎么制作呢?其实,很简单不需要下载软件,小白也能轻松操作的。 一、什么工具能够制作gif动画呢? 使用G…...

VRRP高级特性——管理VRRP
目录 管理VRRP备份组与业务VRRP备份组 管理VRRP备份组的两种实现方式 配置管理备份组 当在设备上配置了多个VRRP备份组时,为了减少设备间交互大量的VRRP协议报文,可以将其中一个VRRP备份组配置为管理VRRP备份组(mVRRP)…...

FreeRTOS内核:详解Task各状态(GPT4帮写)
FreeRTOS内核:详解Task各状态(GPT4帮写) 1. 背景2. Task顶层状态区分3. 运行状态(Running)4. 非运行状态4.1 阻塞态(Blocked):4.2 挂起态(Suspended)4.3 就绪…...

基于粒子群优化算法的最佳方式优化无线传感器节点的位置(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 此代码优化了由于电池耗尽而产生覆盖空洞后 WSN 节点的位置。如果活动通信中的任何节点死亡,则通过PSO优化再次定位…...

第一章 Andorid系统移植与驱动开发概述 - 读书笔记
Android驱动月考1 第一章 Andorid系统移植与驱动开发概述 - 读书笔记 1.Android系统的架构: (1)Linux内核,Android是基于Linux内核的操作系统,并且开源,所以Android与Ubuntu等操作系统的差别很小&#x…...

vi编辑器的三种模式及其对应模式下常用指令
vi是Linux系统的第一个全屏幕交互式编辑工具,在嵌入式的 学习中是一个不可或缺的强大的文本编辑工具。 一、三种模式 命令模式 如何进入命令模式:按esc键 复制:yy nyy(n:行数) 删除(剪切): dd ndd 粘贴:p 撤销&…...

webpack: 5 报错,错误
webpack-报错:Uncaught ReferenceError: $ is not defined (webpack) webpack打包jquery的插件(EasyLazyLoad)时,报错 方法一: //多个js文件用到jquery,用这种方法 在jquery.min.js的做最后写上下面的代码…...

MyBatis的缓存
文章目录 一、MyBatis的一级缓存二、MyBatis的二级缓存三、MyBatis缓存查询的顺序 一、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从…...

c语言-位段
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。 **在结构体…...

Servlet3.0 新特性全解
Servlet3.0新特性全解 tomcat 7以上的版本都支持Servlet 3.0 Servlet 3.0 新增特性 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;支持Web模块;Servlet异步处理;文件上传AP…...

PAT A1045 Favorite Color Stripe
1045 Favorite Color Stripe 分数 30 作者 CHEN, Yue 单位 浙江大学 Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the rem…...

真实业务场景使用-门面模式(外观)设计模式
1.前言 最近接到要修改的业务功能,这个业务增删改查很多功能都需要校验时间,比如: 1.失效时间不能超过自己父表的失效时间, 2.失效时间不能是当前时间 3.失效时间不能早于生效时间 类似这样的不同的判断还有很多,…...

基于多动作深度强化学习的柔性车间调度研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

出口亚马逊平衡车CE/UKCA认证注意事项
平衡车UKC认证 CE认证 认证项目:BS EN/EN71-1-2-3 UKCA认证标志与CE认证标志有什么不同? UKCA标记过程基本上遵循与CE标记相同的规则和规定。大多数制造商仍然可以根据测试结果和其他技术文档自行声明他们的产品,但在特定情况下,他们需要从第…...

云原生环境下的安全实践:保护应用程序和数据的关键策略
文章目录 云原生环境下的安全实践:保护应用程序和数据的关键策略一.安全措施和实践1. 身份和访问管理:2. 容器安全:3. 网络安全:4. 日志和监控:5. 持续集成和持续交付(CI/CD)安全:6.…...

vue 改变数据后,数据变化页面不刷新
文章目录 导文文章重点方法一:使用this.$forceUpdate()强制刷新方法二:Vue.set(object, key, value)方法三:this.$nextTick方法四:$set方法 导文 在vue项目中,会遇到修改完数据,但是视图却没有更新的情况 v…...

【Qt编程之Widgets模块】-006:QSortFilterProxyModel代理的使用方法
QSortFilterProxyModel是model的代理,不能单独使用,真正的数据需要另外的一个model提供,它的工鞥呢是对被代理的model(source model)进行排序和过滤。所谓过滤:也就是说按着你输入的内容进行数据的筛选,因为器过滤功能…...

上林赋 汉 司马相如
亡是公听然而笑曰:“楚则失矣,而齐亦未为得也。夫使诸侯纳贡者,非为财币,所以述职也。封疆画界者,非为守御,所以禁淫也。今齐列为东藩,而外私肃慎,捐国逾限,越海而田&…...

7.对象模型
对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。 若某个信号与多…...

机器学习——基本概念
如何选择合适的模型评估指标?AUC、精准度、召回率、F1值都是什么?如何计算?有什么优缺点? 选择合适的模型评估指标需要结合具体的问题场景,根据不同的需求来选择不同的指标。以下是几个常用的评估指标: AUC…...

Qt---感觉挺重要的部分
目录 一、讲述Qt信号槽机制与优势与不足 二、Qt信号和槽的本质是什么 三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别 四、描述QT的TCP通讯流程 服务端:(QTcpServer) 客户端:(QTcpSocket…...

springboot+vue家乡特色推荐系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...

在Shell脚本中通过ssh从脚本运行函数
文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f,这两个命令有什么区别declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办&a…...

简单学习一下 MyBatis 动态SQL使用及原理
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是其中一个非常重要的功能,可以让我们根据不同的条件动态…...

WhatsApp如何让客户参与变得更简单?
WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要,你可能已经把它们纳入你的社交媒体战略。 是的,WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天,它也适用于商业。 在发展WhatsApp业务时,小企业主得到了最优…...