tag 标签: linux

相关帖子
相关博文
  • 2024-11-29 15:49
    0 个评论
    ELF 2学习板震撼上市——飞凌嵌入式旗下教育品牌ElfBoard巨献!
    ELF 2的“AI之心”——基于瑞芯微RK3588这颗强大的AI芯片。 RK3588,以其卓越的性能和高效的AI处理能力,在行业内早已声名鹊起。ELF 2正是借助这颗“智慧之心”,拥有了四核ARM Cortex-A76与四核ARM Cortex-A55的CPU架构,主频高达2.4GHz,让AI运算如虎添翼,无论是深度学习、图像处理还是自然语言处理,都能轻松应对。 而说到 AI算力,ELF 2内置的6TOPS NPU(神经网络处理单元)绝对是它的杀手锏! 这颗强大的“智慧大脑”不仅支持TensorFlow、PyTorch等主流深度学习框架,还能以惊人的速度处理复杂的AI任务。 ELF 2的设计也是超级贴心,小巧便携,无论是实验室的深入研究,还是户外的创意实践,都能轻松携带。4×100pin的超薄板对板连接器,让插拔变得异常简单。
  • 2024-11-14 11:09
    0 个评论
    2024年11月12日,两年一届的德国慕尼黑国际电子元器件展览会(electronica 2024)盛大开幕,作为全球电子元器件及电子行业最具影响力的展会之一,electronica对推动行业创新和发展具有重要意义,今年更是汇聚了全球51个国家的3000多家厂商参展。 飞凌嵌入式作为领先的嵌入式核心控制系统研发、设计和生产的企业,在本次展会携重磅产品隆重亮相,展位号B5-118。 本次展会,飞凌嵌入式带来了基于NXP、TI、瑞芯微、全志等国内外知名芯片公司的最新平台及主流平台打造的嵌入式主控产品,包括嵌入式核心板、开发板、工控机和显控一体机等。 除了产品的静态展示外,飞凌嵌入式还带来了多个应用于不同领域的热门行业解决方案,聚焦人工智能、智慧交通、工业物联网、智慧医疗、电力与储能等领域,给来自全球各地的电子行业伙伴和观众带来了更加全面、更加多维的体验。现场更是吸引了大量的参展观众驻留,与飞凌嵌入式工作人员进行了友好互动与交流。 为期4天的electronica 2024正在进行中,还有更多行业前沿技术和干货等待着大家,欢迎朋友们的持续关注。
  • 热度 2
    2024-11-11 15:38
    159 次阅读|
    0 个评论
    本文介绍SigmaStar SSD201/SSD202D中SPI通讯的测试方法,SPI全称是Serial Peripheral Interface,串行外设接口,是一种常见的串行通信协议,它被广泛用于微控制器与各种外设之间的数据传输,SPI接口一般用于NFC、LCD显示驱动器等。本次使用触觉智能的 Purple Pi R1双网口开发板 演示,类树莓派设计,双核A7,带WiFi功能,是嵌入式新人入门学习的高性价比开发板! 准备SPI测试工具 通过以下链接下载spi_test文件 https://pan.baidu.com/s/1vZXHho0KBIeFOibzO7Cnbg提取码:1234 SPI硬件测试方法 短接SPI0_DI(MOSI)和SPI0_DO(MISO)引脚 如下图所示: SPI测试流程 将spi_test文件传入开发板根目录下,方法参考: 使用Tftpd32工具数据互传是一种什么体验?SSD201/202D开发板演示,深圳触觉智能嵌入式方案商 修改spi_test文件权限chmod 777 spi_test,并运行程序./spi_test。 打印有“SPI - LookBack Mode OK”命令出现,即SPI正常。 # tftp -r spi_test -g 电脑IP # chmod 777 spi_test # ./spi_test SPI - Open Succeed. Start Init SPI... spi mode: 0 bits per word: 8 max speed: 12000 KHz (12 MHz) ************************* ret = 0*********************** nSPI - LookBack Mode Test... nsend spi message Succeed nSPI Send : nt 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 nt 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F nSPI Receive : nt 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 nt 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F SPI - LookBack Mode OK 产品简介 触觉智能Purple Pi R1主板(型号:IDO-SBC2D06) ,搭载SSD201/SSD202D芯片,适合学生党,极客学习嵌入式开发,还可应用于智能楼宇室内机、智能家居中控、86盒家庭中控、电梯楼层显示器、IP网络广播设备和语音识别设备,
  • 热度 1
    2024-10-17 11:46
    225 次阅读|
    0 个评论
    本文介绍了Tftpd32工具的使用方法,在我们使用开发板过程中常常需要将电脑与开发板文件相互传输,在有网络(电脑和开发板要在同一个网段)的时候就可以通过Tftpd32工具进行文件传输。本次使用的是触觉智能的 Purple Pi R1双网口开发板 演示,搭载了SigmaStar SSD201/SSD202D芯片,类树莓派设计,双核A7,带WiFi功能,是嵌入式新人入门学习的高性价比开发板! 1、安装Tftpd32工具 下载安装后,打开tftpd32.exe(大家自行搜索下载)。 2、配置软件参数 查看电脑IP 在电脑输入win+r进入CMD,输入ipconfig命令查看电脑IP。 设置Tftpd32软件参数 3、在开发板上输入命令传输文件 命令如下: tftp - r 文件名 - g 电脑的IP地址 #将文件从电脑传输到开发板上tftp -l 文件名 - p 电脑的IP地址 #将文件从开发版传输到电脑上 命令讲解: -g 表示下载文件 (get) -p 表示上传文件 (put) -l 表示本地文件名 (local file) -r 表示远程主机的文件名 (remote file) 4、传输文件演示 电脑传输文件到开发板 准备一个测试文件test.txt,根据刚刚介绍的命令输入执行。 电脑文件test.txt传输到开发板。 开发板传输文件到电脑 开发板文件swapfile文件传输到电脑,根据刚刚介绍的命令输入执行。 查看电脑对应目录下有没有swapfile文件,可以看到已传输至Tftpd32文件夹。 5、产品简介 触觉智能Purple Pi R1主板(型号:IDO-SBC2D06) ,搭载SSD201/202D芯片,主要针对学生党,极客,工程师,极大降低了Linux嵌入式开发者的入门门槛,具有以下几点优势: 双核A7处理器,主频1.2GHz; 内置64MB DDR2或128MB DD3内存 ; 内置NAND Flash 128MB/256MB存储 ; 自带无线网卡-SSW101B,2×百兆以太网口; 树莓派双排针接口; 支持MIPI-4Line,最大1080P,也可配置 为RGB565 ; 活跃的开发者社区, 更多牛人在线技术支持 ;
  • 2024-10-9 18:50
    198 次阅读|
    0 个评论
    本文适用于 瑞芯微RK3562、RK3568、RK3588等各类开发板 。本教程使用到的是深圳触觉智能开发的RK3562开发板,型号EVB3562 Linux系统连接WiFi和蓝牙有两种方式,方法一是通过桌面应用连接,另一种是通过命令行连接,具体操作如下: 一、蓝牙连接方法一(桌面应用连接) 1.1 右键点击蓝牙图标 1.2 点击Devices选项 1.3 选择要连接的蓝牙设备 1.4 右键点击Connect 1.5 连接完成后,如下图所示: 二、 蓝牙连接方法二(命令行连接) 2.1启动蓝牙服务 启动蓝牙服务确保蓝牙设备可以被系统识别和使用: sudo systemctl status bluetooth #查看并启动蓝牙服务 2.2查看设备详细信息 使用hciconfig命令查看设备 hciconfig #查看设备详细信息 hciconfig hci0 up #up是打开hcis设备 打开up/关闭down/重置reset hciconfig hci0 name #name查看名称 hciconfig hci0 name ido666 #修改名称为ido666 2.3扫描周围蓝牙设备 hcitool scan #扫描设备 2.4连接蓝牙设备 bluetoothctl pair B8:8F:27:8F:3A:32 quit #退出bluetoothct 注:如果遇到Failed to pair: org.bluez.Error.AlreadyExists错误,表示已经配对过了,想要重新配对就需要先删除。 removeB8:8F:27:8F:3A:32#取消配对 pair B8:8F:27:8F:3A:32 #重新配对 quit #退出bluetoothctl 2.5 连接完成后,如下图所示: 2.6输入quit退出 三、WiFi连接方法一(桌面应用连接) 3.1 右键点击网络图标 3.2 点击要连接的WiFi 3.3 打开Onboard虚拟键盘 3.4 输入密码 3.5 连接完成后,网口图标变成WiFi图标,下图所示 四、 WiFi连接方法二(命令行连接) 4.1Ubantu、Debian系统 这里我们使用nmcli进行WiFi连接 nmclidevicewifilist#查看附近WiFi nmcli device wifi connect WiFi账号 password WiFi密码 #连接WiFi 注:如需要断开WiFi连接可输入:nmcli radio wifi off 4.2Buildroot系统 (1)查看有没有wifi_start.sh,可以通过wifi_start.sh连接WiFi cat /usr/bin/wifi_start.sh #查看wifi_start.sh /usr/bin/wifi_start.sh TP-LINK_B87A 12345678 #TP-LINK_B87A是账号,12345678是密码。根据实际WiFi输入 (1)没有wifi_start.sh的情况,通过修改wpa_supplicant.conf连接WiFi # cat /userdata/cfg/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant ap_scan=1 update_config=1 network={ ssid="TP-LINK_B87A" #WiFi账号 psk="12345678" #WiFi密码 key_mgmt=WPA-PSK } #vi /userdata/cfg/wpa_supplicant.conf #修改账号密码 #reboot #重启自动连接 注:如果没有wpa_supplicant.conf文件,,可以自己创建 vi /userdata/cfg/wpa_supplicant.conf #进入vi后按【i】编辑,完成后按【Esc】再按输入【:wq】保存退出 4.3测试网络是否可以正常上网 ping www.baidu.com #ping百度网址进行测试 网络正常的情况,如下图所示:
相关资源
  • 所需E币: 0
    时间: 2023-12-25 10:31
    大小: 2.57KB
    上传者: 开心就很好了
    今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。Linux提供三个「点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间转换」的接口 publicGraceJSONResultdoLogin(HttpServletRequestrequest,                  HttpServletResponseresponse,                  RegisterLoginBOregisterLoginBO,                  BindingResultresult){  //判断BindingResult是否保存错误的验证信息,如果有,则直接return  if(result.hasErrors()){    Map<String,String>errorMap=getErrors(result);    returnGraceJSONResult.errorMap(errorMap);  }  //获得前端传来的基本信息  StringsmsCode=registerLoginBO.getSmsCode();  Stringmobile=registerLoginBO.getMobile();  //0.校验验证码是否匹配  StringredisSMSCode=redis.get(MOBILE_SMSCODE+mobile);  if(StringUtils.isBlank(redisSMSCode)||!redisSMSCode.equalsIgnoreCase(smsCode)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);  }  returnGraceJSONResult.ok();}用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。privateAppUsergetUser(StringuserId){  //1.查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库  StringuserJson=redis.get(REDIS_USER_INFO+":"+userId);  AppUseruser=null;  if(StringUtils.isNotBlank(userJson)){    user=JsonUtils.jsonToPojo(userJson,AppUser.class);  }else{    user=userService.getUser(userId);    //2.由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis    //哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以    //基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注    redis.set(REDIS_USER_INFO+":"+userId,JsonUtils.objectToJson(user),1);  }  returnuser;}虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。@OverridepublicGraceJSONResultlist(StringarticleId,Integerpage,IntegerpageSize){  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=         commentPortalService.queryArticleComments(articleId,                           page,                           pageSize);  returnGraceJSONResult.ok(gridResult);}生成html的步骤分为以下几步:定义freemarker生成的html位置配置freemarker基本环境获得ftl模板获得动态数据融合ftl和动态数据,并输出到html@Value("${freemarker.html.target}")privateStringhtmlTarget;@GetMapping("/createHTML")@ResponseBodypublicStringcreateHTML(Modelmodel)throwsException{  //0.配置freemarker基本环境  Configurationcfg=newConfiguration(Configuration.getVersion());  //声明freemarker模板所需要加载的目录的位置  Stringclasspath=this.getClass().getResource("/").getPath();  cfg.setDirectoryForTemplateLoading(newFile(classpath+"templates"));//    System.out.println(htmlTarget);//    System.out.println(classpath+"templates");  //1.获得现有的模板ftl文件  Templatetemplate=cfg.getTemplate("stu.ftl","utf-8");  //2.获得动态数据  Stringstranger=;  model.addAttribute("there",stranger);  model=makeModel(model);  //3.融合动态数据和ftl,生成html  FiletempDic=newFile(htmlTarget);  if(!tempDic.exists()){    tempDic.mkdirs();  }  Writerout=newFileWriter(htmlTarget+File.separator+"10010"+".html");  template.process(model,out);  out.close();  return"ok";}
  • 所需E币: 0
    时间: 2023-12-25 11:06
    大小: 3.48KB
    LinuxSocket网络编程框架主要由3大模块组成:BSDSocketAPIsSocketAbstractionLayerVFSLayerTCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。BS和CS服务器架构(1)CS架构介绍(clientserver,客户端服务器架构)(2)BS架构介绍(broswerserver,浏览器服务器架构)TCP协议(1)建立连接需要三次握手(2)建立连接的条件:服务器listen时客户端主动发起connect(3)关闭连接需要四次握手(4)服务器或者客户端都可以主动发起关闭packagecom.example.emos.wx.controller.form;importio.swagger.annotations.ApiModel;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;@Data@ApiModelpublicclassRegisterForm{  @NotBlank(message="注册码不能为空")  @Pattern(regexp="^[0-9]{6}$",message="注册码必须是6位数字")  privateStringregisterCode;  @NotBlank(message="微信临时授权不能为空")  privateStringcode;  @NotBlank(message="昵称不能为空")  privateStringnickname;  @NotBlank(message="头像不能为空")  privateStringphoto;}在UserController.java中创建login()方法。@PostMapping("/login")@ApiOperation("登陆系统")publicRlogin(@Valid@RequestBodyLoginFormform){intid=userService.login(form.getCode());  Stringtoken=jwtUtil.createToken(id);  Set<String>permsSet=userService.searchUserPermissions(id);  saveCacheToken(token,id);  returnR.ok("登陆成功").put("token",token).put("permission",permsSet);}在CheckinServiceImpl类中,实现抽象方法……publicclassCheckinServiceImplimplementsCheckinService{……publicvoidcreateFaceModel(intuserId,Stringpath){    HttpRequestrequest=HttpUtil.createPost(createFaceModelUrl);    request.form("photo",FileUtil.file(path));    HttpResponseresponse=request.execute();    Stringbody=response.body();    if("无法识别出人脸".equals(body)||"照片中存在多张人脸".equals(body)){      thrownewEmosException(body);    }else{      TbFaceModelentity=newTbFaceModel();      entity.setUserId(userId);      entity.setFaceModel(body);      faceModelDao.insert(entity);    }  }}在CheckinServiceImpl.java类中,实现三个抽象方法。publicclassCheckinServiceImplimplementsCheckinService{……@Override  publicHashMapsearchTodayCheckin(intuserId){    HashMapmap=checkinDao.searchTodayCheckin(userId);    returnmap;  }  @Override  publiclongsearchCheckinDays(intuserId){    longdays=checkinDao.searchCheckinDays(userId);    returndays;  }  @Override  publicArrayList<HashMap>searchWeekCheckin(HashMapparam){    ArrayList<HashMap>checkinList=checkinDao.searchWeekCheckin(param);    ArrayList<String>holidaysList=holidaysDao.searchHolidaysInRange(param);    ArrayList<String>workdayList=workdayDao.searchWorkdayInRange(param);    DateTimestartDate=DateUtil.parseDate(param.get("startDate").toString());    DateTimeendDate=DateUtil.parseDate(param.get("endDate").toString());    DateRangerange=DateUtil.range(startDate,endDate,DateField.DAY_OF_MONTH);    ArrayListlist=newArrayList();    range.forEach(one->{      Stringdate=one.toString("yyyy-MM-dd");      //查看今天是不是假期或者工作日      Stringtype="工作日";      if(one.isWeekend()){        type="节假日";      }      if(holidaysList!=null&&holidaysList.contains(date)){        type="节假日";      }elseif(workdayList!=null&&workdayList.contains(date)){        type="工作日";      }      Stringstatus="";      if(type.equals("工作日")&&DateUtil.compare(one,DateUtil.date())<=0){        status="缺勤";booleanflag=false;        for(HashMap<String,String>map:checkinList){          if(map.containsValue(date)){            status=map.get("status");flag=true;            break;          }        }DateTimeendTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);Stringtoday=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){          status="";        }      }      HashMapmap=newHashMap();      map.put("date",date);      map.put("status",status);      map.put("type",type);      map.put("day",one.dayOfWeekEnum().toChinese("周"));      list.add(map);    });    returnlist;  }}在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。@SpringBootTestclassEmosWxApiApplicationTests{  @Autowired  privateMessageServicemessageService;  @Test  voidcontextLoads(){    for(inti=1;i<=100;i++){      MessageEntitymessage=newMessageEntity();      message.setUuid(IdUtil.simpleUUID());      message.setSenderId(0);      message.setSenderName("系统消息");      message.setMsg("这是第"+i+"条测试消息");      message.setSendTime(newDate());      Stringid=messageService.insertMessage(message);      MessageRefEntityref=newMessageRefEntity();      ref.setMessageId(id);      ref.setReceiverId(11);//注意:这是接收人ID      ref.setLastFlag(true);      ref.setReadFlag(false);      messageService.insertRef(ref);    }  }}在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<stdlib.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h> #defineBACKLOG5 intmain(intargc,char*argv[]){  intfd;  structsockaddr_inaddr;  charbuf[BUFSIZ]={};   if(argc<3){    fprintf(stderr,"%s<addr><port>\n",argv[0]);    exit(0);  }   /*创建套接字*/  fd=socket(AF_INET,SOCK_STREAM,0);  if(fd<0){    perror("socket");    exit(0);  }   addr.sin_family=AF_INET;  addr.sin_port=htons(atoi(argv[2]));  if(inet_aton(argv[1],&addr.sin_addr)==0){    fprintf(stderr,"Invalidaddress\n");    exit(EXIT_FAILURE);  }   /*向服务端发起连接请求*/  if(connect(fd,(structsockaddr*)&addr,sizeof(addr))==-1){    perror("connect");    exit(0);  }  while(1){    printf("Input->");    fgets(buf,BUFSIZ,stdin);    write(fd,buf,strlen(buf));  }  close(fd);  return0;}
  • 所需E币: 0
    时间: 2023-12-19 21:14
    大小: 19.01MB
    上传者: xxxml
    Linux基础知识,非常全面
  • 所需E币: 3
    时间: 2023-12-15 09:34
    大小: 10.67MB
    上传者: 二月半
    Linux命令行与shell脚本编程大全(第4版)(RichardBlum、ChristineBresnahan) 
  • 所需E币: 0
    时间: 2023-12-6 15:17
    大小: 3.8KB
    网络编程概述管道(父子进程)、消息队列(内核经营消息队列)、共享内存(创建一个空间)、信号(通过pid号通信)、信号量(对临界资源,共享内存做P、V控制)。特点:依赖于Linux内核AB两个通信基于内核。缺陷:无法多机通信(不适用与两台不同的电脑)TCP和UDP对比:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信TCP首部开销20字节;UDP的首部开销小,只有8个字节TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道传统的进程间通信借助内核提供的IPC机制进行,但是只能限于本机通信。若要跨机通信,就必须使用网络通信,这就需要用到内核提供给用户的socketAPI函数库。2.1网络字节序大端字节序:也叫高端字节序(网络字节序),是高端地址存放低位数据,低端地址存放高位数据小端字节序:也叫低端字节序,是低地址存放低位数据,高地址存放高位数据。在application.yml文件中,填入SaToken的配置信息,如下:sa-token: #HTTP请求头中哪个属性用来上传令牌 token-name:token #过期时间(秒),设置为30天 timeout:2592000 #临时有效期,设置为3天 activity-timeout:259200 #不允许相同账号同时在线,新登陆的账号会挤掉原来登陆的账号 allow-concurrent-login:false #在多人登陆相同账号的时候,是否使用相同的Token is-share:false token-style:uuid #是否读取Cookie中的令牌 isReadCookie:false #同端互斥 isConcurrent:false #SaToken缓存令牌用其他的逻辑库,避免业务数据和令牌数据共用相同的Redis逻辑库 alone-redis:  database:1  host:localhost  port:6379  password:abc123456  timeout:10s  lettuce:   pool:    #连接池最大连接数    max-active:200    #连接池最大阻塞等待时间(使用负值表示没有限制)    max-wait:10s    #连接池中的最大空闲连接    max-idle:16    #连接池中的最小空闲连接    min-idle:8Java语言允许我们自己封装异常类,我们可以自定义各种异常类,比如每种业务一个异常类,或者每个模块一个异常类。我这里不想做的那么复杂,不如我们创建一个通用的异常类,用来封装与业务有关的异常信息。在com.example.his.api.exception包中,创建HisException.java类。packagecom.example.his.api.exception;importlombok.Data;@DatapublicclassHisExceptionextendsRuntimeException{  privateStringmsg;  privateintcode=500;  publicHisException(Exceptione){    super(e);    this.msg="执行异常";  }  publicHisException(Stringmsg){    super(msg);    this.msg=msg;  }  publicHisException(Stringmsg,Throwablee){    super(msg,e);    this.msg=msg;  }  publicHisException(Stringmsg,intcode){    super(msg);    this.msg=msg;    this.code=code;  }  publicHisException(Stringmsg,intcode,Throwablee){    super(msg,e);    this.msg=msg;    this.code=code;  }}SpringBoot提供了全局处理异常的技术,只要我们给某个Java类用上@RestControllerAdvice注解,这个类就能捕获SpringBoot项目中所有的异常,然后统一处理(精简异常信息)再返回给前端项目。在com.example.his.api.config包中,创建ExceptionAdvice.java类。packagecom.example.his.api.config;importcn.dev33.satoken.exception.NotLoginException;importcn.felord.payment.PayException;importcn.hutool.json.JSONObject;importcom.example.his.api.exception.HisException;importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.http.HttpStatus;importorg.springframework.http.converter.HttpMessageNotReadableException;importorg.springframework.web.HttpRequestMethodNotSupportedException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.multipart.support.MissingServletRequestPartException;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  /*   *捕获异常,并且返回500状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringexceptionHandler(Exceptione){    JSONObjectjson=newJSONObject();    if(einstanceofHttpMessageNotReadableException){      HttpMessageNotReadableExceptionexception=(HttpMessageNotReadableException)e;      log.error("error",exception);      json.set("error","请求未提交数据或者数据有误");    }     elseif(einstanceofMissingServletRequestPartException){      MissingServletRequestPartExceptionexception=(MissingServletRequestPartException)e;      log.error("error",exception);      json.set("error","请求提交数据错误");    }     elseif(einstanceofHttpRequestMethodNotSupportedException){      HttpRequestMethodNotSupportedExceptionexception=(HttpRequestMethodNotSupportedException)e;      log.error("error",exception);      json.set("error","HTTP请求方法类型错误");    }     //Web方法参数数据类型转换异常,比如String[]数组类型的参数,你上传的数据却是String类型    elseif(einstanceofBindException){      BindExceptionexception=(BindException)e;      StringdefaultMessage=exception.getFieldError().getDefaultMessage();      log.error(defaultMessage,exception);      json.set("error",defaultMessage);    }    //没有通过后端验证产生的异常    elseif(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      json.set("error",exception.getBindingResult().getFieldError().getDefaultMessage());    }    //处理业务异常    elseif(einstanceofHisException){      log.error("执行异常",e);      HisExceptionexception=(HisException)e;      json.set("error",exception.getMsg());    }     //微信支付异常    elseif(einstanceofPayException){      PayExceptionexception=(PayException)e;      log.error("微信支付异常",exception);      json.set("error","微信支付异常");    }    //处理其余的异常    else{      log.error("执行异常",e);      json.set("error","执行异常");    }    returnjson.toString();  }  /*   *捕获异常,并且返回401状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.UNAUTHORIZED)  @ExceptionHandler(NotLoginException.class)  publicStringunLoginHandler(Exceptione){    JSONObjectjson=newJSONObject();    json.set("error",e.getMessage());    returnjson.toString();  }}因为Controller类用上@RestController注解之后,Web方法返回的对象会被自动转换成JSON对象,所以我们只需要声明一个封装类,让所有Web方法返回这个封装类的对象即可。除了公共属性之外,不同的Web方法要返回的业务数据也不尽相同,所以选择动态的结构才是最佳的方案,恰好HashMap允许我们随便添加数据,那就选择HashMap作为父类吧。在com.example.his.api.common包中,创建R.java类。packagecom.example.his.api.common;importorg.apache.http.HttpStatus;importjava.util.HashMap;importjava.util.Map;publicclassRextendsHashMap<String,Object>{  publicR(){    //默认创建的R对象中包含了公共的属性    put("code",HttpStatus.SC_OK);    put("msg","success");  }  /*   *覆盖继承的put函数,添加Key-Value数据   */  publicRput(Stringkey,Objectvalue){    super.put(key,value);    //把自己返回,用于链式调用    returnthis;  }  publicstaticRok(){    returnnewR();  }  publicstaticRok(Stringmsg){    Rr=newR();    r.put("msg",msg);    returnr;  }  publicstaticRok(Map<String,Object>map){    Rr=newR();    r.putAll(map);    returnr;  }  publicstaticRerror(intcode,Stringmsg){    Rr=newR();    r.put("code",code);    r.put("msg",msg);    returnr;  }  publicstaticRerror(Stringmsg){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,msg);  }  publicstaticRerror(){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,"未知异常,请联系管理员");  }}
  • 所需E币: 5
    时间: 2023-11-14 17:51
    大小: 21.11MB
    上传者: 浩瀚星蓝
    这是一本学习linux的经典书籍,详细介绍了shell的使用方法
  • 所需E币: 2
    时间: 2023-11-14 18:00
    大小: 85.65MB
    上传者: 浩瀚星蓝
    这本是是Linux典藏大系的其中一本,详细讲述了ARM嵌入式相关知识
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1021KB
    上传者: Argent
    第11讲Linux内核顶层Makefile分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1005.5KB
    上传者: Argent
    第10讲Linux内核源码目录分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1006KB
    上传者: Argent
    第9讲正点原子官方Linux内核编译与体验
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1014KB
    上传者: Argent
    第13讲Linux内核移植.ppt
  • 所需E币: 0
    时间: 2023-11-10 15:48
    大小: 1011KB
    上传者: Argent
    第17讲Linux内核移植(NAND版本)-补录
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1MB
    上传者: Argent
    第12讲Linux内核启动流程简介
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1011KB
    上传者: Argent
    第13讲Linux连接文件
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1018.5KB
    上传者: Argent
    第15讲LinuxC编程
  • 所需E币: 1
    时间: 2023-11-10 11:50
    大小: 30.02KB
    上传者: Argent
    第34讲LinuxPWM驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:47
    大小: 28.75KB
    上传者: Argent
    第22讲LinuxIIC驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 36.78KB
    上传者: Argent
    第23讲LinuxSPI驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:51
    大小: 27.83KB
    上传者: Argent
    第37讲LinuxADC驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 29.9KB
    上传者: Argent
    第25讲Linux多点电容触摸屏实验_笔记