当前位置: 首页 > 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;高效地分发…...

64_《智能体微服务架构企业级实战教程》授权与认证之授权认证集成测试

前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...

Obsidian PDF++:如何在Obsidian中实现PDF与笔记的无缝双向链接?

Obsidian PDF&#xff1a;如何在Obsidian中实现PDF与笔记的无缝双向链接&#xff1f; 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_…...

PentestGPT实战部署指南:AI驱动的渗透测试工作流落地

1. 这不是另一个“AI安全”的概念玩具&#xff0c;而是一套能真正跑起来的渗透测试辅助工作流“PentestGPT”这个名字刚在GitHub上出现时&#xff0c;我第一反应是点开又关掉——过去三年里&#xff0c;我见过太多打着“AI渗透”旗号的项目&#xff1a;有的只是把ChatGPT API封…...

rk35xx 通过recovery升级问题

Firefly 的 recovery 库是一个核心组件&#xff0c;它构建了一个独立的微型 Linux 系统&#xff0c;专门用于在设备主系统之外执行高可靠性的固件升级。简单来说&#xff0c;它的工作流程是&#xff1a;主系统通过命令触发&#xff0c;将升级指令写入特定分区并重启&#xff1b…...

OpenCore Legacy Patcher完全指南:3步让旧款Mac焕发新生的终极方案

OpenCore Legacy Patcher完全指南&#xff1a;3步让旧款Mac焕发新生的终极方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否拥有一台性能尚可但已被…...

集成Taotoken为OpenClaw工作流提供持久化模型支持

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 集成Taotoken为OpenClaw工作流提供持久化模型支持 在构建基于OpenClaw的自动化Agent工作流时&#xff0c;一个稳定且可灵活切换的模…...

Hermes Agent工具如何自定义接入Taotoken提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent工具如何自定义接入Taotoken提供商 Hermes Agent 是一款功能强大的AI智能体开发框架&#xff0c;它支持通过自定义提供…...

Windows 11终极优化指南:Win11Debloat一键清理系统提升51%性能

Windows 11终极优化指南&#xff1a;Win11Debloat一键清理系统提升51%性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

2026 最新版网络安全全岗位详解,入行择业一看就懂

全网最全&#xff01;网络安全全岗位解析&#xff08;2026版&#xff09; 摘要&#xff1a;随着数字化转型加速&#xff0c;网络安全已成为企业、政务、互联网大厂的核心刚需&#xff0c;人才缺口持续扩大&#xff0c;2026年国内网络安全人才缺口已突破327万&#xff0c;全球缺…...

解决WSL中RViz全屏闪烁和字体缩小情况

针对WSL中&#xff0c;ROS2-humble打开RViz2全屏后&#xff0c;地图闪烁的情况&#xff1a;我从网上找&#xff0c;问了ai&#xff0c;试了很多种方法&#xff0c;终于找到一种适合我的方法&#xff0c;有相同情况的朋友可以试一试&#xff0c;但是不保证你的问题和解决方法与我…...