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

项目篇:基于TCP通信模型的外卖软件实现

一、基本成员及功能实现

本项目主要由服务器,消费者,商家,外卖员组成。基本的功能如下。

对所有人:

1、可以注册登录

2、可以修改个人信息

3、可以销户

商家:

1、注册时需要填写售卖商品信息

2、可以修改商品信息对自己的商品增删改查

消费者:

1:可以查看商家列表并进入商家列表选购商品

2:可以查看购物车自己已经选购的商品

3:确认完购物车后将商品放入订单列表等待外卖员接单

4:10分钟还未接单将发消息给消费者让其重新下单

5:选购完商品后将选购信息发送给商家

外卖员:

1:可以查看订单列表

2:可以接单并派送

3:将外卖送给消费者后自动结单

服务器:

1:支持所有身份的登录注册功能,分类储存当前用户(商家、消费者、外卖员)

2:对外卖员:储存当前订单列表、需要时打印订单至终端

3:对消费者:支持多个用户同时在线选购以及购物车系统

4:对消费者:支持计时功能到达十分钟后无人接单自动取消订单并提示消费者重新下单

5:会记录所有订单的订单编号和结单时间

6:支持商家和消费者之间的订单传输功能

二、功能展示

参考视频:效果演示-CSDN直播

三、原理实现

1、数据库结构

        本项目使用sqlite数据库,在服务器端需要有一套比较完备的数据库结构。本次项目主要创建了四个不同的数据库,分别是:商家、其他人(消费者和外卖员)、购物车、订单记录。

        对于商家数据库来说,他必须有一个merchant表单用于记录商家用户的用户名和密码。商家的用户名就是商家店铺的名称。将用户名设为主键,不允许重复。每当一个商家注册时,需要填写自己出售的商品,数据库中会自动再创建一个名为该商家的表单用于存储出售的商品信息(商品名称及商品价格)。

        对于其他人来说,要有一个username表单用于记录外卖员和消费者的用户名,防止用户名重复。再创建消费者和外卖员两个表单分别存储用户名和密码。

        对于购物车,只需要当消费者添加商品进购物车时创建,再消费者确认购物车后删除。是一个比较动态的。

        对于记录来说,他会记录订单编号、确认订单时间、结束时间、消费者用户名和外卖员用户名。在确认订单后存入除了结束时间的其他内容,并将订单编号发给外卖员客户端。当外卖员结束订单后将结束时间填入。

2、超时机制

        在消费者确认订单后,会将订单存放在服务器的链表中,链表中有消费者用户名,商家用户名,下单时间、消费者客户端的信息结构体和套接字接口。在存入链表中会设置一个闹钟alarm。在设定时间到了之后向进程发送SIGALRM信号,然后使用signal函数捕捉这种信号后去遍历订单链表,给订单的消费者发信息并将超时的订单删掉。如果订单被外卖员接走,那么也会删除该订单。这样在遍历的时候也找不到要删除的订单,以实现超时机制。

3、信息交互

        本项目的信息交互非常多,这对信息的种类分类有着很高的要求。我是用的是类似tftp协议的信息传输方式,将信息的种类封装进一个字符数组中,然后在服务器端进行解码,并实现相应功能。

最后附上本次项目的主函数源码

int main(int argc, const char *argv[])
{if(signal(SIGALRM,handle)==SIG_ERR){perror("signal error:");return -1;}//打开所有的数据库sqlite3 *shangjialist=NULL;if(sqlite3_open("./shangjialist.db",&shangjialist)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(shangjialist));return -1;}sqlite3 *otherlist=NULL;if(sqlite3_open("./otherlist.db",&otherlist)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}sqlite3 *gouwuche=NULL;if(sqlite3_open("./gouwuche.db",&gouwuche)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}sqlite3 *recorder=NULL;if(sqlite3_open("./record.db",&recorder)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}//初始化所有的数据库init_sqlite(shangjialist,otherlist,recorder);int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error:");return -1;}int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockaddr error:");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error:");return -1;}if(listen(sfd,128)==-1){perror("listen error:");return -1;}struct sockaddr_in cin;socklen_t socklen=sizeof(cin);int n=2;struct pollfd pfd[1024];pfd[0].fd=0;pfd[0].events=POLLIN;pfd[1].fd=sfd;pfd[1].events=POLLIN;while(1){int res=poll(pfd,n,-1);if(res==0){printf("manba out\n");return -1;}else if(res==-1&&errno!=4){perror("poll error:");return -1;}if(pfd[1].revents==POLLIN){int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);pfd[n].fd=newfd;pfd[n].events=POLLIN;n++;printf("[%s:%d:%d]已连接\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);}if(pfd[0].revents==POLLIN){}for(int i=2;i<n;i++){if(pfd[i].revents==POLLIN){char buf[111]="";recvfrom(pfd[i].fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&socklen);short *type_point=(short*)buf;switch(ntohs(*type_point)){case 1001://消费者注册信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;char sbuf[111]="";if(new_member_other(otherlist,name_point,psd_point,"xiaofeizhe")!=0)//注册失败,用户名重复{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 1002://消费者登陆成功后发来的信息,提示服务器将所有商家名称传给消费者{get_merchant(pfd[i].fd,shangjialist);break;}case 1003://消费者请求查看商家的所有商品{char *name_point=buf+2;get_table(pfd[i].fd,shangjialist,name_point);break;}case 1004:{char *name_point=buf+2;//用户名char *good_name_point=buf+strlen(name_point)+3;//商品名称char *mer_name_point=buf+strlen(name_point)+strlen(good_name_point)+4;//商家名称add_gouwuche(pfd[i].fd,shangjialist,gouwuche,name_point,good_name_point,mer_name_point);break;}case 1005://将购物车的信息发送给消费者等待确认信息{char *name_point=buf+2;get_table(pfd[i].fd,gouwuche,name_point);break;}case 1006://消费者发来确认信息{char *name_point=buf+2;char *mer_name_point=buf+strlen(name_point)+3;head=add_dingdan(head,name_point,mer_name_point,cin,pfd[i].fd);send_msg_to_mer(gouwuche,name_point,mer_name_point);del_gouwuche(gouwuche,name_point);break;}case 1007://修改密码信息{short *ide_point=(short *)(buf+2);char *name_point=buf+4;char *psd_point=buf+strlen(name_point)+5;short identity=ntohs(*ide_point);char sbuf[111]="";if(identity==0){if(update_info(otherlist,"xiaofeizhe",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else if(identity==1){if(update_info(otherlist,"waimaiyuan",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else if(identity==2){if(update_info(shangjialist,"merchant",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 1008://销户{char sbuf[111]="";short *ide_point=(short *)(buf+2);short identity=ntohs(*ide_point);char *name_point=buf+4;if(del_user(shangjialist,otherlist,identity,name_point,pfd[i].fd)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2001://商家注册信息{char sbuf[111]="";char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;if(new_member_shangjia(shangjialist,name_point,psd_point)!=0){strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 2002://商家添加商品信息{char sbuf[111]="";char *name_point=buf+2;short *count_point=(short *)(buf+strlen(name_point)+3);char *good_name_point=buf+strlen(name_point)+5;short *price_point=(short *)(good_name_point+strlen(good_name_point)+1);if(new_good(shangjialist,name_point,count_point,good_name_point,price_point)!=0){strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s添加商品\n",name_point);break;}case 2003://商家修改商品前获取商品列表{char *name_point=buf+2;get_table(pfd[i].fd,shangjialist,name_point);break;}case 2004://商家增加商品{char sbuf[111]="";char *good_name_point=buf+2;char *price_point=buf+strlen(good_name_point)+3;char *name_point=buf+strlen(good_name_point)+strlen(price_point)+4;if(add_good(pfd[i].fd,shangjialist,good_name_point,price_point,name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2005://商家删除商品{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;if(del_good(pfd[i].fd,shangjialist,name_point,good_name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2006://商家修改商品名称{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;char *new_good_name_point=buf+strlen(name_point)+strlen(good_name_point)+4;if(update_good_name(shangjialist,name_point,good_name_point,new_good_name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2007://商家修改商品价格{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;char *new_price_point=buf+strlen(name_point)+strlen(good_name_point)+4;if(update_good_price(shangjialist,name_point,good_name_point,new_price_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2008://商家登录后将商家的信息存入链表{char *name_point=buf+2;add_sj(pfd[i].fd,cin,name_point);break;}case 3001://外卖员注册信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;char sbuf[111]="";if(new_member_other(otherlist,name_point,psd_point,"waimaiyuan")!=0)//注册失败,用户名重复{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 3002://外卖员获取当前订单{get_dingdan(pfd[i].fd);break;}case 3003://确认订单后将大部分订单记录存入数据库{char *name_point=buf+2;char *ddname_point=buf+strlen(name_point)+3;save(recorder,name_point,ddname_point,pfd[i].fd);break;}case 3004://当结束订单后修改订单结束时间{char *ddnumb_point=buf+2;save2(recorder,ddnumb_point);break;}case 4001://登录信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;login(pfd[i].fd,shangjialist,otherlist,name_point,psd_point);break;}case 4002://退出消息{pfd[i].fd=-1;	printf("[%s:%d]已下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));break;}}}}}return 0;
}

       

int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error:");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error:");return -1;}pid_t pid=fork();if(pid==0){//子进程,用于接受消息char buf[111]="";while(1){sleep(1);bzero(buf,sizeof(buf));recv(sfd,buf,sizeof(buf),0);if(strcmp(buf,"quit")==0){break;}printf("%s\n",buf);}exit(EXIT_SUCCESS);}else if(pid>0){while(1){printf("====================欢迎使用====================\n");printf("1登录\t2注册\t0退出\n");printf("请输入命令\n");int cmd;scanf("%d",&cmd);getchar();switch(cmd){case 1:{login(sfd);break;}case 2:{registe(sfd);break;}case 0:{kill(pid,SIGKILL);char buf[111]="";short *type_point=(short *)buf;*type_point=htons(4002);send(sfd,buf,sizeof(buf),0);close(sfd);wait(NULL);return 0;}default:{printf("输入有误\n");}}printf("请输入任意键清屏\n");while(getchar()!='\n');//system("clear");}}return 0;
}

相关文章:

项目篇:基于TCP通信模型的外卖软件实现

一、基本成员及功能实现 本项目主要由服务器&#xff0c;消费者&#xff0c;商家&#xff0c;外卖员组成。基本的功能如下。 对所有人&#xff1a; 1、可以注册登录 2、可以修改个人信息 3、可以销户 商家&#xff1a; 1、注册时需要填写售卖商品信息 2、可以修改商品信…...

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…...

【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

有些团队在组建之初往往并没有配置性能测试人员&#xff0c;后来随着公司业务体量的上升&#xff0c;开始有了性能测试的需求&#xff0c;很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试&#xff0c;但这些同学也是摸着石头过河。他们会去网上寻…...

iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较&#xff1a; 存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化. 计算属性可以用于类、结构体和枚举&#xff0c;存储属性只能用于类和结构体。存储属性可…...

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …...

ASP .NET Core Api 使用过滤器

过滤器说明 过滤器与中间件很相似&#xff0c;过滤器&#xff08;Filters&#xff09;可在管道&#xff08;pipeline&#xff09;特定阶段&#xff08;particular stage&#xff09;前后执行操作。可以将过滤器视为拦截器&#xff08;interceptors&#xff09;。 过滤器级别范围…...

CodeGPT--(Visual )

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…...

1.Mybatis入门

目录 前言 1入门 1.1 入门程序实现 1.2 数据准备 ​编辑 1.3 配置Mybatis 1.4 编写SQL语句 1.5 单元测试 1.6 解决SQL警告与提示 2. JDBC介绍(了解) 2.1 介绍 2.2 代码 2.3 问题分析 2.4 技术对比 3. 数据库连接池 3.1 介绍 3.2 产品 4. lombok 4.1 介绍 4.…...

android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

一、Camera 1.1、结合SurfaceView实现预览 1.1.1、布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-au…...

live555搭建流式rtsp服务器

源代码已上传gitee 一、需求 live555源代码中的liveMediaServer是将本地文件作为源文件搭建rtsp服务器&#xff0c;我想用live555封装一个第三方库&#xff0c;接收流数据搭建Rtsp服务器&#xff1b;预想接口如下&#xff1a; class LiveRtspServer { public:/***brief构造一…...

Apache孵化器领路人与导师的职责

对于捐赠到 ASF 孵化器的项目来说&#xff0c; ASF 孵化器项目管理委员会&#xff08;IPMC&#xff09;的成员会扮演两个角色&#xff0c;一个 孵化器领路人&#xff08;Champion&#xff09;&#xff0c;另外一个是孵化器导师&#xff08;Mentor&#xff09;。 本文源自 ALC …...

【C++中STL】set/multiset容器

set/multiset容器 Set基本概念set构造和赋值set的大小和交换set的插入和删除set查找和统计 set和multiset的区别pair对组两种创建方式 set容器排序 Set基本概念 所有元素都会在插入时自动被排序。 set/multist容器属于关联式容器&#xff0c;底层结构属于二叉树。 set不允许容…...

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…...

obs-studio 源码学习 obs.h

obs.h 引用头文件介绍 c99defs.h&#xff1a;这个头文件提供了一些 C99 标准的定义和声明&#xff0c;包括一些常用的宏定义和类型定义&#xff0c;用于提高代码的可移植性和兼容性。 bmem.h&#xff1a;这个头文件提供了对内存分配和管理的功能&#xff0c;包括一些内存分配…...

C语言-指针的基本知识(上)

一、关于内存 存储器&#xff1a;存储数据器件 外存 外存又叫外部存储器&#xff0c;长期存放数据&#xff0c;掉电不丢失数据 常见的外存设备&#xff1a;硬盘、flash、rom、u盘、光盘、磁带 内存 内存又叫内部存储器&#xff0c;暂时存放数据&#xff0c;掉电数据…...

4核16G幻兽帕鲁服务器优惠价格表,阿里云和腾讯云报价

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云幻兽帕鲁服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64…...

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题

按照大家的做法&#xff0c;把自己遇到的问题及解决方案写出来&#xff08;注意&#xff1a;Error里面有些方法有时候我用可以成功&#xff0c;有时候我用也不能成功&#xff0c;写出来仅供参考&#xff0c;实在不行重头再clone&#xff0c;add&#xff0c;commit&#xff0c;p…...

一些es的基本操作

目录 给索引增加字段&#xff1a;给索引删除字段[^1]&#xff1a;创建索引&#xff1a;插入document删除document(应该是按ID) : 给索引增加字段&#xff1a; 用postMan: 给名为population_portrait_hash_seven的索引增加了一个text类型的字段。 用chrome插件Elasticvue 的Re…...

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…...

1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么?

1002. HarmonyOS 开发问题&#xff1a;鸿蒙 OS 技术特性是什么? 硬件互助&#xff0c;资源共享 分布式软总线 分布式软总线是多种终端设备的统一基座&#xff0c;为设备之间的互联互通提供了统一的分布式通信能力&#xff0c;能够快速发现并连接设备&#xff0c;高效地分发…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...