tag 标签: linux

相关帖子
相关博文
  • 2025-3-20 11:53
    127 次阅读|
    0 个评论
    近日,保定飞凌嵌入式技术有限公司(以下简称“飞凌嵌入式”)携手瑞芯微电子股份有限公司(以下简称“瑞芯微”)正式加入2025年全国大学生嵌入式芯片与系统设计竞赛(以下简称“嵌入式大赛”),并在应用赛道中设立专属赛题。 本次嵌入式大赛,双方选用基于瑞芯微RK3588芯片设计的ELF 2开发板作为参赛平台,旨在通过此次合作,促进产教融合,共同推动嵌入式系统创新人才的培养。 全国大学生嵌入式芯片与系统设计竞赛是一项A类电子设计竞赛,同时也是被教育部列入白名单的赛事,由中国电子学会主办,是学生保研、求职的公认加分项。嵌入式大赛参赛对象包括(但不限于)国内外高校电子电气类相关专业(电子、信息、计算机、自动化、电气、仪科等)全日制在校研究生、本科生、高职高专生。 飞凌嵌入式 作为国内专注嵌入式核心控制系统研发、设计和生产的高新技术企业,同时也是国家级专精特新重点“小巨人”企业,此次携手瑞芯微加入嵌入式大赛,将充分发挥其在嵌入式领域的深厚积累,为参赛的高校师生提供全面的技术支持和培训服务,助力参赛选手在竞赛中取得优异成绩。 瑞芯微 专注于集成电路设计与研发,目前已发展为领先的物联网(IoT)及人工智能物联网(AIoT)处理器芯片企业,其研发团队在处理器和数模混合芯片设计、多媒体处理、影像算法、系统软件开发等方面,均积累了深厚的经验和技术资源。选用瑞芯微芯片作为参赛平台,不仅能够充分激发参赛学生的创新能力,还提供了一个与嵌入式前沿技术深度接轨,解决实际市场问题的契机。 期望通过此次合作,促进高校资源与产业资源之间的深度融合,共同构建一个既注重理论基础又强调实践操作的嵌入式教育生态系统。
  • 2025-3-12 10:46
    1 次阅读|
    0 个评论
    2025年3月11日,备受瞩目的Embedded World 2025国际嵌入式展在德国纽伦堡会展中心隆重开幕,数千家来自全球各地的科技企业汇聚于此,展示嵌入式技术的最新成果,探讨行业趋势,推动国际技术合作‌。 飞凌嵌入式作为国内专业的嵌入式核心控制系统研发、设计和生产的企业,在本次展会隆重亮相,展位号3-360,这也是飞凌嵌入式连续第3年参加Embedded World,坚持为全球产业上下游合作伙伴和客户展示和推广来自中国的嵌入式主控产品、动态方案和应用案例。 本次展会,飞凌嵌入式带来了基于NXP、TI、瑞芯微、全志等国内外知名芯片公司的最新平台及主流平台打造的嵌入式主控产品,包括嵌入式核心板、开发板、工控机和显控一体机等。 除了产品的静态展示外,飞凌嵌入式还带来了多个应用于不同领域的热门行业解决方案。 AI疲劳驾驶监测方案,可以精准识别驾驶员的疲劳状态以提高驾驶安全性;多核异构展示方案,充分利用M核和A核的协同工作进行实时采样、分析和显示;LVGL显示+快速启动方案,则提供了一种低资源消耗的可定制化图形界面方案;机械臂方案,实现了AI高效识别和实时精确控制的充分融合;AI物体识别方案,则是利用稳定的平台来实现高效模型推理和即时的预览与展示。 这些方案聚焦人工智能、智慧交通、工业物联网等多个领域,通过形象的动态演示,给来自全球各地的电子行业伙伴和观众带来了更加全面、更加多维的体验。 为期3天的Embedded World 2025正在进行中,3月12和3月13日还将有更多行业前沿应用和技术干货等着大家,欢迎朋友们的持续关注, 飞凌嵌入式会在德国纽伦堡会展中心3-360展位等待着大家,欢迎广大客户朋友和行业伙伴的莅临。
  • 热度 1
    2025-3-5 10:38
    116 次阅读|
    0 个评论
    以全志T536工业级处理器为引擎,驱动国产化创新,为千行百业提供降本增效新选择——飞凌嵌入式FET536-C核心板重磅发布! FET536-C全国产核心板 FET536-C核心板基于全志发布的T536工业级处理器开发设计。主频1.6GHz,集成四核Cortex-A55、64位玄铁E907 RISC-V MCU,提供高效的计算能力;支持2TOPSNPU、安全启动、国密算法IP、全通路ECC、AMP、Linux-RT等,还具备广泛的连接接口:USB、SDIO、UART、SPI、CAN-FD、Ethernet、ADC、LocalBus等一应俱全。 除性价比超高的处理器外,核心板整板均采用工业级国产元器件,是集中器、FTU、DTU、充电桩、交通、机器人、工业控制等关键领域实现国产化降本的优质之选。 全志新一代高性能芯片 汇集了性能更高的应用内核、独立的RISC-V MCU,支持2TOPS NPU、安全启动、国密算法IP、全通路ECC、AMP、Linux-RT、LocalBus等可加速边缘的机器学习应用。 接口资源丰富 AMP多核异构 集成四核Cortex-A55、64位玄铁E907 RISC-VMCU,支持Linux RT+FreeRTOS+裸代码,以同时满足高效能与实时性控制的需求。 NPU:2TOPS算力 内置了算力高达2TOPS的神经处理单元(NPU)为边缘计算应用提供了强大的支持。 引脚全部引出 满足各个领域不同产品的不同功能需求。 支持并行总线LocalBus 支持并行总线LocalBus,数据读写速率高16bit@100M or 32bit@50M,方便ARM和FPGA通讯。 安全特性 ISP 大幅提升图像质量 集成ISP技术,支持8M@30fps、WDR、3DNR等技术,可以提供清晰、准确的图像数据。 持续更新的用户资料 应用场景 FET536-C核心板物料100%国产化,核心板功能全面,可应用在集中器、DTU、充电桩、交通、机器人、工业控制等多个行业,以其高性能、多接口、工业级等综合优势,加之飞凌具备竞争力的价格优势及完备的售后技术支持,助力您的产品快速上市,走在行业前沿。 开发板接口图 参数
  • 热度 1
    2025-2-26 18:43
    209 次阅读|
    0 个评论
    本文介绍Linux系统主板/开发板(适用Debian10/11、lubuntu系统),安装中文环境和中文输入法。 触觉智能EVB3588开发板 演示,搭载了瑞芯微RK3588芯片,八核处理器,6T高算力NPU;音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。 配置中文环境 命令如下: sudo apt- get install locales #安装locales软件包 sudo dpkg-reconfigure locales #配置 locales软件包 reboot 选项示例: 选中后,确定进行安装 安装中文输入法 输入命令安装,命令如下: #安装对应软件包 sudo apt install fcitx fcitx-tools fcitx-libpinyin fcitx-frontend-all sudo apt install fcitx-ui-classic fcitx-config-gtk sudo apt install fcitx-frontend-gtk2 fcitx-frontend-gtk3 sudo apt install fcitx-frontend-qt4 fcitx-frontend-qt5 sudo apt-get install im-config #安装im-config #输入im-config命令进行配置,Debian11不需要进行配置 im-config 注:Ctrl+空格进行输入法切换 1、前2步直接点击确认 2、选择fcitx点确认 3、再点击确认并重启设备即可完成安装 产品介绍 触觉智能EVB3588开发板 是一款采用瑞芯微全新旗舰SoC芯片RK3588设计的评估主板,集成了四核Cortex-A76和四核Cortex-A55 CPU,G610 MP4 GPU,以及6 TOPs算力的NPU。内置多种功能强大的嵌入式硬件引擎,支持8K视频编解码。应用可覆盖边缘计算、人工智能、工业HMI、工业网关、智慧医疗、自助终端、智能零售、能源电力等行业,具有以下优势: 支持开源鸿蒙OpenHarmony与麒麟 KylinOS国产系统,以及Android/Linux; 瑞芯微RK3588高性能SoC,集成四核A76 和四核A55处理器,Mali-G610 四核GPU; 支持48M ISP,多摄像头输入; 6T AI高算力NPU,三核架构; 支持HDMI2.1输出,最高8K@60FPS; 支持HDMI2.0输入,最高4K@60FPS; 2×独立千兆以太网口,支持WAN+LAN 双IP,支持5G/4G/WiFi/蓝牙无线通信; 板载4×USB3.0,2×全功能Type-C
  • 热度 2
    2025-2-26 18:30
    166 次阅读|
    0 个评论
    本文介绍瑞芯微RK3588主板/开发板Linux系统(Ubuntu20.04/22.04),安装中文环境和中文输入法。 触觉智能EVB3588开发板 演示,搭载了瑞芯微RK3588芯片,八核处理器,6T高算力NPU;音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。 配置中文环境 配置前需更新安装列表,否则安装中文时容易遇到报错,命令如下: sudo apt-get update 报错示例: 1、先点击settings 2、点击Manage Installed languages 3、再点击Install,安装语言 4、输入密码 5、点击Install/Remove Languages.. 注:如果遇到以下报错,输入下面的命令即可 报错解决命令: sudo apt-get update sudo apt-get install aptitude sudo aptitude reinstall dbus reboot 6、选择Chinese(simplified),点击Apply,已经安装的点击Cancel 7、选择Regional Formats,然后选择汉语再点击Apply System-Wide 8、然后重启 9、点击settings后,再点击Language 10、选择汉语再点击select 11、再次重启 12、更改名称或者保留旧名称 至此中文环境就安装好了 注:如果遇到在桌面打不开系统终端,可在串口或者ssh输入下面的命令即可: ln -srf /home/industio/桌面/ /home/industio/Desktop 安装中文输入法 Ubuntu22.04通过设置-键盘-输入源-汉语-中文(智能拼音)即可安装中文输入法。 Ubuntu20.04通过设置-地区语言-输入源-汉语-中文(智能拼音)即可安装中文输入法。 例如: 教程到这里完成,下期为大家带来Debian10/11、Lubuntu系统安装中文环境和中文输入法教程。 产品介绍 触觉智能EVB3588开发板 是一款采用瑞芯微全新旗舰SoC芯片RK3588设计的评估主板,集成了四核Cortex-A76和四核Cortex-A55 CPU,G610 MP4 GPU,以及6 TOPs算力的NPU。内置多种功能强大的嵌入式硬件引擎,支持8K视频编解码。应用可覆盖边缘计算、人工智能、工业HMI、工业网关、智慧医疗、自助终端、智能零售、能源电力等行业,具有以下优势: 支持开源鸿蒙OpenHarmony与麒麟 KylinOS国产系统,以及Android/Linux; 瑞芯微RK3588高性能SoC,集成四核A76 和四核A55处理器,Mali-G610 四核GPU; 支持48M ISP,多摄像头输入; 6T AI高算力NPU,三核架构; 支持HDMI2.1输出,最高8K@60FPS; 支持HDMI2.0输入,最高4K@60FPS; 2×独立千兆以太网口,支持WAN+LAN 双IP,支持5G/4G/WiFi/蓝牙无线通信; 板载4×USB3.0,2×全功能Type-C
相关资源
  • 所需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多点电容触摸屏实验_笔记