tag 标签: 电子书

相关帖子
相关博文
  • 热度 27
    2015-9-24 10:20
    1484 次阅读|
    0 个评论
    IC (集成电路)的分类,CECC可测器件类型 标准逻辑电路类:(图见附件) 74系列、54系列、CD系列,信号开关 触发器 锁存器 寄存器等;   微处理器类: 8位/16位/32位微控制器、汽车微控制器、ARM内核32位嵌入式、数字信号处理器(DSP);   ASIC: 半定制消费类IC ;   消费类SoC: PC摄像头控制IC等;   可编程逻辑电路: FPGA、CPLD、PAL、GAL、PLD等;   存储器类: SRAM、SDRAM、NVRAM、DDR3、EPROM、EEPROM、FLASH、Smart Card、Disk-On-Chip;   通信接口类电路: RS-232、RS-485/422、USB、CAN、MODEM、1394口、ISDN;   显示驱动类: LCD、LED、LCM、VFD、EL等驱动器;   数字转换器: ADC、DAC、音频/视频ADC/DAC等;   电源与电源管理器件: 1)电压稳压、电压基准、线性稳压器; 2)微处理器的电源监控电路:复位电路、Watchdog、Watchdog +SRAM; 3)电池容量管理及充电电路; 4)DC-DC、AC-DC电源; 5)PWM控制器、MOSFET及达林顿管; 6)热插拔控制器;   音频和视频产品: 音频DAC、音频放大器、音频编解码器、音频信号处理器、视频编解码器、视频压缩;   放大器和线性器件: 音频放大器、比较器、电流检测放大器运算、差分放大器、仪表放大器、隔离放大器、对数放大器、运算放大器、视频放大器、缓冲器、滤波器、信号调理器;   电力专用器件: 光电器件:  光耦隔离器、光通信电子器件、光纤监测和控制; 模拟开关、多路复用器、数字电位器:   RF和IF器件: RF发射管、上下变频器、PLL频率合成器和VCO、DDS调制器、直接数字上变频器和下变频器、直接数字频率合成器(DDS)、对数放大器和检测器、混频器和乘法器、PLL频率合成器和VCO、RF和IF放大器、RF和IF收发器、RF开关、RMS检测器等;   其他的射频: RFID和RF存储器 Wireless and RF;   传感器及传感器调理器: 压力传感器、温度传感器、加速度传感器、电流传感器、磁场传感器、湿度传感器、烟雾传感器、霍尔效应传感器等。   如果你有兴趣看到这里,那么说明机会是留给像你这样有准备的人,以上的类型,我们90%以上都是测试过的,并且有成功案例的。 相关链接:http://www.cecclab.com/cecclab/cn/case.asp?id1=79   我们正是你要找的合作伙伴,你是对的,在首页查询我们的联系方式吧,或者点击这里: www.cecclab.com Tel:0755-86169156 86169158  Url:www.cecclab.com   MSN:info@cecclab.com
  • 热度 20
    2014-9-24 17:07
    1687 次阅读|
    0 个评论
       1、天堂的门坏了,上帝要招标重修。   印度人说:3000弄好,理由是材料费1000,人工费1000,我自己赚1000。   德国人说:要6000,材料费2000,人工2000,自己赚2000。   中国人淡定地说:这个要9000,3000给你,3000我的,剩下3000给那个印度人干。   上帝拍案:中国人中标!    2、后来地狱的门也坏了,阎王吸取了上帝的教训,制定控制价3000。   德国人看了一眼,走了。   印度人报价3000。   中国人给了评标的小鬼500,报价3000,又中标了。   德国人、印度人很纳闷。之后,中国人花了500材料,500人工,修了一半宣布停工。拖了半年,阎王被逼追加投资3000,完工。    3、再后来天堂连接地狱的电梯坏了,也要重修。经过前面两次教训后,控制定价3000而且规定要一次性修好。   德国人又来,看了一下走了。   印度人报价3000。   中国人也报价3000,并称完工后有茅台送,又中标了。   拿到钱后中国人开工。材料500,人工500。完工后,上帝叫人验收。事先收了中国人红包500的验收员声称“合格”。   不久又坏了,安监、质检(都收了钱)等部门说超载所致,要重建。上帝被逼追加资金9000重建!    4、再再后来,通往人间的大门也坏了,死的上不来,投胎的下不去,上帝与阎王都着急。问题很严重。   经过前几次的教训之后,天国严格定价3000,监理、审计现场跟踪!并且免费保修1亿年。   德国人被吓跑了。   印度人报价3000。   中国人来了,报无偿修理,且免费保修2亿年,但要1亿年的管理权,上帝和阎王都同意了。   中国人修好了门后,在门口设了个收费站,死了要上天堂的收500,下去投胎每人每次500,双向收费且上不封顶,给500的投到欧洲,给1000的投胎到美国,逃费的一律投到中国。   上帝和阎王无语,彻底崩溃。    看了上面的故事,你会有哪些思考呢?     本人姓莫名明冉,专业代理TOS、村田、ROHM、瑞萨、ST、ON、英飞凌产品,兼分销各类IC料,产品全部原厂原装正货,并囤有部分偏冷物料,可微信询价,微信号:w2849685917  微信微信微信微信 微信二维码   
  • 热度 24
    2014-4-10 09:27
    1131 次阅读|
    0 个评论
           2014中国(深圳)电子展将于4月10日至12日在深圳会展中心举办。而我司深圳威可特电子科技有限公司有幸应邀入列。该展会旨在促进中国电子产业自主创新,以展示领先的电子技术,在业内独占鳌头。主要展出电子元器件、光电、仪器仪表和设备等。展会分春夏秋三季举办,全年行业观众数量超过15万人,服务于3C、工业和国防等行业。        在展会上,我司展出我司特有的产品,其中就电力熔断器,小型保险丝(微型保险丝,电阻型保险丝,管状保险丝,自恢复保险丝,贴片保险丝等),汽车保险丝及配件,保险丝夹,保险丝座,电器用保险丝座,气体放电管,浪涌保护器,开关等等。 我司因产品众多、质量优良、应用领域广泛,在会上广泛受来访者的关注。 更多内容请进入www.vicfuse.com深圳市威可特电子科技有限公司
  • 热度 19
    2014-1-16 09:22
    1028 次阅读|
    1 个评论
    威可特电子隆重邀请新老客户参加2014年重庆春季电子展        据知,在2013年3月28日投入运营后,重庆国际博览中心已成功承接了第十三届中国金属冶金展、第十六届中国(重庆)国际投资暨全球采购会和第十四届立嘉国际机械展等大型展会,以一流的硬件、优质的服务和完善的配套赢得了多方好评。o :p=""/o       而如今,我司有幸被邀请去参加今年的重庆春季电子展会,时间是2014年3月6日到8日之间。展会号是 N31 。        威可特一直都秉持“品质、服务、永续经营”的宗旨,给客户朋友们提供一个优质、放心的保险丝、熔断器、汽车保险丝及配件等系列电子产品。o :p=""/o   展会地点:重庆国际博览中心o :p=""/o 更多内容请进入www.vicfuse.com深圳市威可特电子科技有限公司
  • 热度 15
    2013-12-9 13:19
    957 次阅读|
    0 个评论
      本公司是“上海芯龙半导体、台湾闸能半导体,”一级代理商,主营升降DC-DC车充IC、LED升降压IC、MOSFET,有需要的,请致电! 上海绎恒电子科技有限公司 联系人:孔生(深圳办事处) 电话:13699859831 QQ:924938765
相关资源
  • 所需E币: 0
    时间: 2024-4-22 17:00
    大小: 2.4KB
    一.什么是微前端“微前端架构”就是构建基于微服务的前端应用架构。其思想是将前端应用切分为一系列可以单独部署的松耦合的应用,然后将这些应用组装起来创建单个面向用户的应用程序。二.微前端的优势降低代码耦合独立开发、独立部署增量升级:微前端是一种非常好的实施渐进式重构的手段和策略独立运行时,每个微应用之间状态隔离,运行时状态不共享团队可以按照业务垂直拆分更高效三、微前端是一种前端架构模式,它将Web应用程序拆分为一组小型、可独立开发和部署的模块,每个模块可以由不同的团队开发和维护。这种模块化的架构可以帮助开发团队降低Web应用程序的规模和复杂度,从而提高应用程序的可维护性和可扩展性。微前端的概念最早由ThoughtWorks公司的技术总监CamJackson在2016年提出。他认为,微前端可以帮助团队将大型Web应用程序拆分为小型模块,从而更好地满足不同业务需求,提高应用程序的可维护性和可扩展性。自此之后,微前端逐渐成为了一种前端技术趋势,得到了越来越多的关注和支持。微前端的背景源于大型Web应用程序的发展和演进。随着Web应用程序的规模和复杂度的不断增加,前端开发团队面临越来越多的挑战,例如开发和维护难度大、代码耦合度高、性能问题等等。微前端通过将Web应用程序拆分为小型、可独立开发和部署的模块,从而降低了这些挑战的难度,提高了Web应用程序的可维护性和可扩展性。四、微前端的挑战包括:技术复杂度:微前端需要使用一些新的技术和工具来实现模块化开发、模块间通信和集成等功能,需要开发团队具备一定的技术实力和经验。项目规模限制:微前端适用于大型Web应用程序,但对于小型应用程序,可能会带来过度的复杂度和不必要的开销。性能问题:微前端需要在运行时动态加载模块,可能会影响应用程序的性能和响应速度,需要通过一些优化措施来解决。跨域问题:微前端需要在不同的域名下部署不同的模块,可能会带来跨域问题,需要通过一些跨域解决方案来解决。五、micro模块micro-app是京东零售推出的一款微前端框架,它基于类WebComponent进行渲染,从组件化的思维实现微前端,旨在降低上手难度、提升工作效率。它是目前接入微前端成本最低的框架,并且提供了JS沙箱、样式隔离、元素隔离、预加载、资源地址补全、插件系统、数据通信等一系列完善的功能。MicroApp借鉴了WebComponent的思想,通过CustomElement结合自定义的ShadowDom,将微前端封装成一个类WebComponent组件,实现微前端的组件化渲染。在此基础上,通过实现JS隔离、样式隔离、路由隔离,降低子应用的接入成本,子应用只需设置允许跨域请求,不需要改动任何代码即可接入微前端,使用方式和iframe几乎一致,但却没有iframe存在的问题。用于给应用赋能微前端,使其成为主应用,能够内部接入子应用。入口index.js:用于和主应用初始化接入;appConfigs.js:用于配置要接入子应用的相关信息;commonApi.js:公用的接口函数,透传给子应用使用;appTemplate.vue:子应用展示容器,类似于iframe效果;router.js:主应用中处理过后的子应用路由地址,最后合并接入到主应用路由文件。六、集成与部署策略在微前端架构中,集成与部署策略是至关重要的。以下是一些常见的集成与部署策略:构建时集成:在主应用的构建过程中,将微应用的代码打包到主应用的代码中。这种方式适用于微应用较少且更新不频繁的情况。运行时集成:主应用在运行时动态加载微应用的代码。这种方式可以实现微应用的独立部署和按需加载,适用于微应用较多且更新频繁的情况。独立部署:每个微应用都可以独立部署,主应用通过配置来管理微应用的版本和加载地址。这种方式可以实现微应用的并行开发和持续集成/持续部署(CI/CD),提高开发效率。容器化部署:使用Docker等容器化技术将每个微应用打包成容器进行部署。这种方式可以实现微应用的环境隔离和弹性扩展。
  • 所需E币: 0
    时间: 2024-4-29 11:34
    大小: 2.98KB
    一、什么是微服务架构微服务架构是一种面向服务的架构风格,通过将应用程序拆分为小的、自治的服务单元,以提高系统的灵活性、可扩展性和可维护性。它是一种软件设计和开发的方法论,它将一个应用程序拆分成一组小而独立的服务单元,这些服务单元可以独立部署、扩展和管理。每个服务单元都专注于完成特定的业务功能,并通过轻量级的通信机制(通常是HTTP或消息队列)与其他服务单元协同工作。二、伴随着云计算、容器技术、大数据等新兴技术的不断涌现,微服务架构因为其高度可扩展性、灵活性等特点,越来越受到人们的青睐。在微服务架构中,每个服务都是一个独立的进程,每个进程都有自己的数据存储方式,操作系统环境等等。微服务通过通信协议(如http、grpc等)互相通信,形成为支撑大型应用系统的服务群。Go语言作为一个轻量级的,高并发的静态编译型语言,其天然的优势使其成为微服务开发的首选语言之一,内置的goroutine和channel机制保证了Go语言在高并发场景下极高的性能和稳定性。如何使用Go语言开发微服务呢?下面将从以下几个方面进行详细阐述。1、拆分微服务架构师应该首先根据业务模型,将整个应用拆分成若干个独立的服务。拆分的原则是保证每个微服务模块足够小,不要包含过多的业务逻辑,只保留服务本身的核心功能。通过手工埋点或开源工具例如Skywalking等方式,对微服务模块进行详细的跟踪和性能分析,发现程序中的瓶颈,进行优化。2、选择框架Go语言的生态系统非常完善,涵盖了很多优秀的微服务框架。开发过程中,架构师可以根据需求选择不同的框架进行集成。以下是几个常见的Go语言微服务框架:Gokit:提供了许多开箱即用的微服务类库,包括服务发现、负载均衡、日志、跟踪等等,同时提供了一个可扩展的RPC库,以供用户使用。但Gokit的组件相对独立,而且很多组件都是不可配置的,这会导致底层实现较为复杂。Micro:该框架用于处理复杂和高度可分布式的系统,具有良好的可扩展性和服务发现功能。但是,在使用micro时,需要解决API网关、负载均衡和安全问题等复杂问题。Gin:是一个轻量级且快速的HTTPWeb框架,适用于创建RESTAPIs和中较大规模的Web应用程序。通过它可以快速创建服务,但要注意的是,它仅仅是一个Web框架,所以它并不能处理微服务框架所应该处理的所有东西。三、Go语言与微服务架构与分布式系统的联系Go语言在微服务架构和分布式系统中发挥了重要作用。它的简洁的语法和强大的并发能力使得开发者可以快速编写高性能的分布式应用程序。此外,Go语言的内置支持和丰富的生态系统,使得开发者可以轻松地实现微服务之间的通信和协同工作。四、Go-Zero的核心特性简洁与高效:Go-Zero的设计理念强调简洁与高效,它提供了丰富的组件和工具,帮助开发者快速构建微服务应用。同时,Go-Zero注重性能优化,通过合理的资源分配和并发控制,确保系统在高负载下仍能保持稳定运行。自动化与智能化:Go-Zero支持自动化代码生成和配置管理,降低了开发者的手动操作成本。此外,它还具备智能负载均衡、容错处理等功能,提高了系统的可用性和可靠性。可扩展与可定制:Go-Zero具有良好的可扩展性,支持水平扩展和垂直扩展,满足不同规模的业务需求。同时,开发者可以根据项目需求,自定义组件和插件,实现高度定制化的功能。五、服务之间如何通信所有的微服务都是独立部署,运行在自己的进程容器中,所以微服务与微服务之间的通信就是IPC(InterProcessCommunication),翻译为进程间通信。进程间通信的方案已经比较成熟了,现在最常见的有两大类:同步调用、异步消息调用。同步调用同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。同步调用的有两种实现方式:分别是REST和RPCREST:REST基于HTTP,实现更容易,各种语言都支持,同时能够跨客户端,对客户端没有特殊的要求,只要具备HTTP的网络请求库功能就能使用。RPC:rpc的特点是传输效率高,安全性可控,在系统内部调用实现时使用的较多。基于REST和RPC的特点,我们通常采用的原则为:向系统外部暴露采用REST,向系统内部暴露调用采用RPC方式。六、go-zero和gin区别Go-Zero和Gin都是基于Go语言的Web框架,但二者有一些区别:设计思路不同:Go-Zero的设计思路是面向SOA的微服务框架,提供了丰富的微服务组件和代码生成工具,帮助开发者快速构建微服务应用系统。而Gin则是一个轻量级的Web框架,适用于构建小型Web应用系统。组件不同:Go-Zero提供了很多微服务组件,包括RPC调用、流控、服务注册等等,适用于复杂微服务系统的开发。Gin则提供了一些Web开发需要的基本组件,比如HTTP接口、路由、中间件等,适用于小型Web系统的开发。代码生成工具:Go-Zero提供了一些代码生成
  • 所需E币: 0
    时间: 2023-12-20 15:06
    大小: 4.4KB
    上传者: 开心就很好了
    大家都知道医疗行业是互联网发展前景极好的领域之一,对于初入职者、转行者来说都是很好的选择,今天我将给大家讲解一个关于健康+体检双系统的项目,项目以业务驱动技术栈,打造完整、全面的双系统项目,并采用前后端分离架构,业务功能完善,界面美观,可以高效积累大型医疗项目经验,快速提升医疗行业就业竞争力。项目开始前,我们先来安装JDK如果你本地有其他版本的JDK,一定要先卸载所有JDK,然后再安装JDK15.0.2,并且配置`PATH`和`JAVA_HOME`环境变量,否则JDK版本会出现错乱。第二步就是部署Maven工具配置的repository目录地址,你根据Maven解压缩的位置,修改这个文件夹地址即可。<localRepository>Maven解压缩路径\repository</localRepository>有时候可能由于Maven下载的依赖库丢包了,导致Java项目中没能识别某些Java类的时候。你可以把Maven的repository文件夹清空,然后重新启动IDEA工具,让Maven重新下载依赖库。第三步配置MySQL_1节点在Navicat上面,到MySQL_1节点上执行4条SQL语句。以MySQL_4为主节点,订阅日志同步数据。我们先在MyCat上面执行一个SQL语句,看看INSERT语句是否能转发给主节点,然后数据同步到其他5个节点。dockerrun-it-d--nameminio\-p9000:9000-p9001:9001\--netmynet--ip172.18.0.12-m400m\-v/root/minio/data:/data\-eTZ=Asia/Shanghai--privileged=true\--envMINIO_ROOT_USER="root"\--envMINIO_ROOT_PASSWORD="abc123456"\--envMINIO_SKIP_CLIENT="yes"\bitnami/minio:latest每次发出Ajax请求的时候,我们要写很多JQuery语句。特别是处理后端返回的状态码,我们要做不同的处理。如果每次发送Ajax请求都要写一大堆代码,是不是太繁琐了。不如我们把发送Ajax请求给封装起来,以后调用这个封装函数就可以了,那该多好啊。在main.ts文件中,创建全局函数封装Ajax代码。//导入JQuery库,因为Ajax用起来非常方便,支持同步和异步的Ajax请求import$from'jquery';//导入ElementUI的消息通知组件,下面封装全局Ajax的时候处理异常的时候需要弹出通知import{ElMessage}from'element-plus';//后端项目的URL根路径letbaseUrl='http://localhost:7700/his-api';app.config.globalProperties.$baseUrl=baseUrl;//设置全局变量$baseUrl//Minio服务器地址letminioUrl='http://localhost:9000/his';app.config.globalProperties.$minioUrl=minioUrl;//封装全局Ajax公共函数app.config.globalProperties.$http=function(url:string,method:string,data:JSON,async:boolean,fun:Function){  $.ajax({    url:baseUrl+url,    type:method,    dataType:'json',    contentType:'application/json',    //上传的数据被序列化(允许Ajax上传数组)    traditional:true,    xhrFields:{      //允许Ajax请求跨域      withCredentials:true    },    headers:{      token:localStorage.getItem('token')    },    async:async,    data:JSON.stringify(data),    success:function(resp:any){      if(resp.code==200){        fun(resp);      }else{        ElMessage.error({          message:resp.msg,          duration:1200        });      }    },    error:function(e:any){      //ajax有语法错误的时候      if(e.status==undefined){        ElMessage.error({          message:'前端页面错误',          duration:1200        });      }       else{        letstatus=e.status;        //没有登陆体检系统        if(status==401){          if(url.startsWith('/front/')){            router.push({              name:'FrontIndex'            });          }else{            router.push({              name:'MisLogin'            });          }        }         else{          //后端没有运行,提交的数据有误,或者没有连接上后端项目          if(!e.hasOwnProperty('responseText')){            ElMessage.error({              message:'后端项目没有启动,或者HTTP请求类型以及参数错误',              duration:1200            });          }           else{            ElMessage.error({              message:e.responseText,              duration:1200            });          }        }      }    }  });};我们先从前端验证函数开始做起。因为发送Ajax请求的时候,前端项目先做数据验证,这就离不开验证函数。在/src/utils目录中创建validate.ts文件,然后定义若干验证函数。/** *验证是否为空或者空字符串 */exportfunctionisBlank(s:string){returns==null||s.length==0;}/** *验证邮箱 */exportfunctionisEmail(s:string){return/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s);}/** *验证手机号码 */exportfunctionisMobile(s:string){return/^1[1-9]\d{9}$/.test(s);}/** *验证URL地址 */exportfunctionisURL(s:string){return/^http[s]?:\/\/.*/.test(s);}/** *验证用户名 */exportfunctionisUsername(s:string){return/^[a-zA-Z0-9]{5,50}$/.test(s);}/** *验证密码 */exportfunctionisPassword(s:string){return/^[a-zA-Z0-9]{6,20}$/.test(s);}/** *验证手机短信验证码 */exportfunctionisSmsCode(s:string){return/^\d{6}$/.test(s);}MIS端框架页面的视图层代码我们要加以修改,比如说<main>标签的:class属性要根据isTab切换不同的样式。还有就是给<el-tabs>设置上v-if判断,如果isTab为true就用Tab控件引用Vue压面;反之就用<el-card>控件引用Vue页面。<divclass="site-content__wrapper">  <mainclass="site-content"    :class="{'site-content--tabs':$route.meta.isTab}">    <el-tabsv-if="$route.meta.isTab"      v-model="siteContent.mainTabsActiveName":closable="true">      <el-tab-panev-for="iteminsiteContent.mainTabs"        :label="item.title":name="item.name">        <el-card>          <router-view:key="router.currentRoute.value.query.random"/>        </el-card>      </el-tab-pane>    </el-tabs>    <el-cardv-else>      <router-view:key="router.currentRoute.value.query.random"/>    </el-card>  </main></div>如果Home页面显示的时候,应该销毁所有的Tab控件。为了实现这个效果,我们可以清空mainTabs数组的元素,并且清理mainTabsActiveName属性值。functionrouteHandle(route){  //判断是否要创建Tab控件  if(route.meta.isTab){    /*创建Tab控件之前,先判断mainTabs[]数组中是否存在该Vue页面的Tab控件。     *比如我们要访问角色管理页面,程序先要判断是否存在角色管理页面的Tab控件。     *如果不存在就创建Tab控件;如果存在就不创建新的Tab控件,直接切换到现有的Tab控件     */    lettab=siteContent.mainTabs.filter(item=>item.name===route.name)[0];    if(tab==null){      tab={        title:route.meta.title,        name:route.name      };      siteContent.mainTabs.push(tab);    }    //选中某个Tab控件    siteContent.mainTabsActiveName=tab.name;    //选中某个菜单项    siteContent.menuActiveName=tab.name;  }  else{    siteContent.mainTabs=[]    //取消选中某个Tab控件    siteContent.mainTabsActiveName="";    //选中某个菜单项    siteContent.menuActiveName="Home";  }}编写src/views/mis/home.vue页面的视图层标签,并且创建home.less文件,让Home页面引用。<template>  <divclass="home">    <divclass="left">      <h2>神州大健康体检系统</h2>      <divclass="desc">        <p>医疗健康&nbsp;&nbsp;模式创新</p>        <p>汇集名医&nbsp;&nbsp;让诊疗更简单</p>      </div>      <divclass="bottom">        <divclass="remark-container">          <divclass="ballblue">1</div>          <divclass="remark">先进的技术</div>        </div>        <divclass="remark-container">          <divclass="ballred">2</div>          <divclass="remark">强大的团队</div>        </div>        <divclass="remark-container">          <divclass="ballgreen">3</div>          <divclass="remark">丰富的经验</div>        </div>      </div>    </div>    <divclass="right">      <imgsrc="../../assets/home/banner.png"class="banner"/>    </div>  </div></template><script></script><stylelang="less"scoped="scoped">  @importurl('home.less');</style>以下就是本项目的开发流程,希望我的文章对大家的学习有所帮助!感谢大家的阅读
  • 所需E币: 0
    时间: 2023-12-20 15:51
    大小: 8.21KB
    今天跟大家讲一个关于体检+健康双系统的项目,这个项目用到SpringBoot+Vue3+MySQL的技术,我会带着大家一步步去实现这样的项目,希望对大家的技术有所提升。本项目包含MIS系统、体检人系统在内的前后端分离式全栈双系统作品,主流框架+最新技术,界面美观、体系完整。首先,我们先来搭建环境:大家创建轻量云主机的时候,一定要选择CentOS7.X镜像,这个版本的Linux兼容性和安全性很好,很多企业级项目都是部署在这个版本的CentOS上面。因为CentOS8.0的兼容性极差,所以强烈反对同学们使用这个版本。另外,Ubuntu在安全性上没有CentOS做得好,所以不推荐在运营环境中使用。使用虚拟机的同学,我们要给虚拟机设置好端口转发,然后在Windows电脑上面才能通过这些端口访问到Linux上面的程序。接下来我们创建Minio容器,设定的访问帐户是root,密码为abc123456,一会儿我们可以用浏览器访问Web管理画面。注意密码必须是8位以上,否则Minio容器创建出来会闪退。以下是代码实战:dockerrun-it-d--nameminio\-p9000:9000-p9001:9001\--netmynet--ip172.18.0.12-m400m\-v/root/minio/data:/data\-eTZ=Asia/Shanghai--privileged=true\--envMINIO_ROOT_USER="root"\--envMINIO_ROOT_PASSWORD="abc123456"\--envMINIO_SKIP_CLIENT="yes"\bitnami/minio:latest在src/views/front/main.vue文件中,添加这个DIV和它的子元素。@importurl('../style.less');.container{  width:1200px;  margin-left:auto;  margin-right:auto;}header{  ……  .search-container{    float:left;    margin-top:5px;    margin-left:100px;    .keyword-input{      width:400px;      margin-bottom:10px;    }    .tag{      margin-right:10px;    }  }}ElementPlus组件库的菜单控件用起来并不复杂,我们看一个简单的例子。下面的菜单是可以左右折叠的,如果变量isCollapse为true,菜单就会向左折叠。<divclass="site-wrapper"  :class="{'site-sidebar--fold':sidebar.sidebarFold}"  v-loading.fullscreen.lock="loading"element-loading-text="拼命加载中">  <nav>    ……  </nav>  <asideclass="site-sidebarsite-sidebar--dark">    <divclass="site-sidebar__inner">      <el-menu:default-active="siteContent.menuActiveName||'Home'"        :collapse="sidebar.sidebarFold":collapseTransition="false"        class="site-sidebar__menu"background-color="#263238"        active-text-color="#fff"text-color="#8a979e">        <el-menu-itemindex="Home"          @click="$router.push({name:'MisHome'})">          <el-icon>            <SvgIconname="home"class="icon-svg"/>          </el-icon>          <spanslot="title">首页</span>        </el-menu-item>        <el-sub-menuindex="组织管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="users_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">组织管理</span>          </template>          <el-menu-itemindex="MisDept"            v-if="proxy.isAuth(['ROOT','DEPT:SELECT'])"            @click="$router.push({name:'MisDept'})">            <el-icon>              <SvgIconname="company_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">部门管理</span>          </el-menu-item>          <el-menu-itemindex="MisRole"            v-if="proxy.isAuth(['ROOT','ROLE:SELECT'])"            @click="$router.push({name:'MisRole'})">            <el-icon>              <SvgIconname="role_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">角色管理</span>          </el-menu-item>          <el-menu-itemindex="MisUser"            v-if="proxy.isAuth(['ROOT','USER:SELECT'])"            @click="$router.push({name:'MisUser'})">            <el-icon>              <SvgIconname="user_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">用户管理</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="业务管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="trust_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">业务管理</span>          </template>          <el-menu-itemindex="MisGoods"            v-if="proxy.isAuth(['ROOT','GOODS:SELECT'])"            @click="$router.push({name:'MisGoods'})">            <el-icon>              <SvgIconname="goods_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检套餐</span>          </el-menu-item>          <el-menu-itemindex="MisRule"            v-if="proxy.isAuth(['ROOT','RULE:SELECT'])"            @click="$router.push({name:'MisRule'})">            <el-icon>              <SvgIconname="rule_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">促销规则</span>          </el-menu-item>          <el-menu-itemindex="MisCustomer"            v-if="proxy.isAuth(['ROOT','CUSTOMER:SELECT'])"            @click="$router.push({name:'MisCustomer'})">            <el-icon>              <SvgIconname="customer_fill"                class="icon-svg"/>            </el-icon>            <spanslot="title">客户档案</span>          </el-menu-item>          <el-menu-itemindex="MisOrder"            v-if="proxy.isAuth(['ROOT','ORDER:SELECT'])"            @click="$router.push({name:'MisOrder'})">            <el-icon>              <SvgIconname="order_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">订单管理</span>          </el-menu-item>          <el-menu-itemindex="MisCustomerIm"            v-if="proxy.isAuth(['ROOT','CUSTOMER_IM:SELECT'])"            @click="$router.push({name:'MisCustomerIm'})">            <el-icon>              <SvgIconname="im_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">客服IM</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="体检管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="night_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检管理</span>          </template>          <el-menu-itemindex="MisAppointment"            v-if="proxy.isAuth(['ROOT','APPOINTMENT:SELECT'])"            @click="$router.push({name:'MisAppointment'})">            <el-icon>              <SvgIconname="appointment_fill"                class="icon-svg"/>            </el-icon>            <spanslot="title">体检预约</span>          </el-menu-item>          <el-menu-itemindex="MisCustomerCheckin"            v-if="proxy.isAuth(['ROOT','CUSTOMER_CHICKIN:SELECT'])"            @click="$router.push({name:'MisCustomerCheckin'})">            <el-icon>              <SvgIconname="checkin_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检签到</span>          </el-menu-item>          <el-menu-itemindex="MisAppointmentRestriction"            v-if="proxy.isAuth(['ROOT','APPOINTMENT_RESTRICTION:SELECT'])"            @click="$router.push({name:'MisAppointmentRestriction'})">            <el-icon>              <SvgIconname="setting_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">预约设置</span>          </el-menu-item>          <el-menu-itemindex="MisCheckup"            v-if="proxy.isAuth(['ROOT','CHECKUP:SELECT'])"            @click="$router.push({name:'MisCheckup'})">            <el-icon>              <SvgIconname="doctor_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">医生检查</span>          </el-menu-item>          <el-menu-itemindex="MisCheckupReport"            v-if="proxy.isAuth(['ROOT','CHECKUP_REPORT:SELECT'])"            @click="$router.push({name:'MisCheckupReport'})">            <el-icon>              <SvgIconname="file_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检报告</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="系统设置"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'"          v-if="proxy.isAuth(['ROOT','SYSTEM:SELECT'])">          <template#title>            <el-icon>              <SvgIconname="system_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">系统设置</span>          </template>          <el-menu-itemindex="MisFlowRegulation"            v-if="proxy.isAuth(['ROOT','FLOW_REGULATION:SELECT'])"            @click="$router.push({name:'MisFlowRegulation'})">            <el-icon>              <SvgIconname="people_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">人员限流</span>          </el-menu-item>        </el-sub-menu>      </el-menu>    </div>  </aside>  <!--避免路由引用页面的时候浏览器不刷新内容,所以给URL添加随机数参数-->  <router-view:key="router.currentRoute.value.query.random"/></div>在application.yml文件中,配置MongoDB连接。因为MongoDB自带数据库连接池,所以我们不需要在Java项目中重复配置连接池。spring: …… redis:  database:0  host:localhost  port:6379  password:abc123456  jedis:   pool:    #连接超时的最大时间    max-active:1000    #等待空闲连接的最大等待时间(负数代表一直等待)    max-wait:-1ms    max-idle:16    min-idle:8因为SpringBootData中默认的RedisTemplate存在序列化机制的问题,向Redis里面保存Hash类型数据通常是乱码的,为了解决这个问题,我们需要自己定义配置类,修改RedisTemplate使用的序列化机制。在com.example.his.api.config包中,创建RedisTemplateConfig类。packagecom.example.his.api.config.sa_token;importjava.util.List;importorg.springframework.stereotype.Component;importcn.dev33.satoken.SaManager;importcn.dev33.satoken.fun.SaFunction;importcn.dev33.satoken.listener.SaTokenEventCenter;importcn.dev33.satoken.session.SaSession;importcn.dev33.satoken.stp.SaLoginModel;importcn.dev33.satoken.stp.SaTokenInfo;importcn.dev33.satoken.stp.StpLogic;/** *Sa-Token权限认证工具类(业务端使用) */@ComponentpublicclassStpCustomerUtil{  privateStpCustomerUtil(){  }  /**   *账号类型标识   */  publicstaticfinalStringTYPE="customer";  /**   *底层的StpLogic对象   */  publicstaticStpLogicstpLogic=newStpLogic(TYPE);  /**   *获取当前StpLogic的账号类型   *   *@returnSeeNote   */  publicstaticStringgetLoginType(){    returnstpLogic.getLoginType();  }  /**   *重置StpLogic对象   *<br>1、更改此账户的StpLogic对象   *<br>2、put到全局StpLogic集合中   *<br>3、发送日志   *   *@paramnewStpLogic/   */  publicstaticvoidsetStpLogic(StpLogicnewStpLogic){    //重置此账户的StpLogic对象    stpLogic=newStpLogic;    //添加到全局StpLogic集合中    //以便可以通过SaManager.getStpLogic(type)的方式来全局获取到这个StpLogic    SaManager.putStpLogic(newStpLogic);    //$$全局事件    SaTokenEventCenter.doSetStpLogic(stpLogic);  }  /**   *获取StpLogic对象   *   *@return/   */  publicstaticStpLogicgetStpLogic(){    returnstpLogic;  }关于这个项目我就讲到这里,感谢大家!
  • 所需E币: 0
    时间: 2023-12-21 11:36
    大小: 3.66KB
    一个完整的在线办公系统具备哪些功能:1、线下会议管理功能2、审批会议申请功能3、TRTC在线视频会议功能4、罚款模块5、请假管理6、报销管理那么,如何去开发这样一个在线办公的系统,这样的系统用到哪些技术才能实现?接下来,我将带着大家一步步来开发这样的办公系统。这个项目我用的技术有:SpringBoot2.4.1,SpringMVC5.3.1,MyBatis3.5.7,VUE3.0.3,ElementUIplus1.0.2。第一步,环境搭建数据库mysql我用的是8.0版本,使用Navicat作为MySQL的客户端,大家可以到网上下载Navicat安装文件。另外,强烈建议大家的操作系统要用Win10,不建议大家使用Win7或者Win11系统。安装客户端程序(RedisDesktopManager),如果是MacOS的用户,可以到软件商店中查找免费的Redis客户端软件。MongoDB的客户端,我们使用Navicat就可以,写上正确的连接信息就能连接上MongoDB。我们不需要向MongoDB导入数据,将来使用的过程中,MongoDB会积累业务数据。安装JDK,大家本地的JDK尽量使用1.8+的版本吧安装Maven环境,后端Java项目使用Maven构建,所以大家要在本地建立Maven环境第二步就是最关键的代码实战部分:用上了GROUP_CONCAT()函数,我们的SQL语句变成了下面的样子SELECTu.username,    d.dept_nameASdeptName,( SELECTGROUP_CONCAT(role_nameseparator",") FROMtb_role WHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)) )ASrolesFROMtb_useruJOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))LEFTJOINtb_deptdONu.dept_id=d.idWHERE r.role_name="超级管理员" 了解过SQL语句的各种语法之后,下面才是我们正式要写的SQL语句。<selectid="searchUserByPage"parameterType="HashMap"resultType="HashMap">  SELECT    DISTINCTu.id,    u.name,    u.sex,    u.tel,    u.email,    d.dept_nameASdept,    u.hiredate,    u.root,    u.status,    (SELECTGROUP_CONCAT(role_nameseparator",")FROMtb_roleWHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)))ASroles  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  LEFTJOINtb_deptdONu.dept_id=d.id  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDd.id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if>  LIMIT#{start},#{length}</select><selectid="searchUserCount"parameterType="HashMap"resultType="long">  SELECT     COUNT(DISTINCTu.id)  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDu.dept_id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if></select>在UserServiceImpl.java类中实现抽象方法。publicclassUserServiceImplimplementsUserService{  ……  @Override  publicPageUtilssearchUserByPage(HashMapparam){    ArrayList<HashMap>list=userDao.searchUserByPage(param);    longcount=userDao.searchUserCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在Vue的声明周期回调函数created()中调用了loadRoleList()和loadDeptList()函数,所以可以保证用户管理页面显示的时候,部门列表和角色列表的数据都是从数据库中查询得来的。<el-table  :data="dataList"  border  v-loading="dataListLoading"  @selection-change="selectionChangeHandle"  cell-style="padding:4px0"  style="width:100%;"  size="medium">  <el-table-columntype="selection"header-align="center"align="center"width="50"/>  <el-table-columntype="index"header-align="center"align="center"width="100"label="序号">    <template#default="scope">      <span>{{(pageIndex-1)*pageSize+scope.$index+1}}</span>    </template>  </el-table-column>  <el-table-columnprop="name"header-align="center"align="center"min-width="100"label="姓名"/>  <el-table-columnprop="sex"header-align="center"align="center"min-width="60"label="性别"/>  <el-table-columnprop="tel"header-align="center"align="center"min-width="130"label="电话"/>  <el-table-column    prop="email"    header-align="center"    align="center"    min-width="240"    label="邮箱"    :show-overflow-tooltip="true"  />  <el-table-columnprop="hiredate"header-align="center"align="center"min-width="130"label="入职日期"/>  <el-table-column    prop="roles"    header-align="center"    align="center"    min-width="150"    label="角色"    :show-overflow-tooltip="true"  />  <el-table-columnprop="dept"header-align="center"align="center"min-width="120"label="部门"/>  <el-table-columnprop="status"header-align="center"align="center"min-width="100"label="状态"/>  <el-table-columnheader-align="center"align="center"width="150"label="操作">    <template#default="scope">      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        @click="updateHandle(scope.row.id)"      >        修改      </el-button>      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        :disabled="scope.row.status=='离职'||scope.row.root"        @click="dimissHandle(scope.row.id)"      >        离职      </el-button>      <el-button        type="text"        size="medium"        :disabled="scope.row.root"        v-if="isAuth(['ROOT','USER:DELETE'])"        @click="deleteHandle(scope.row.id)"      >        删除      </el-button>    </template>  </el-table-column></el-table>在TbRoleDao.xml文件中,定义SQL用于查询角色分页数据。看上面的截图可知,在角色管理页面上,只有按照角色名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个角色拥有的权限数量,而且tb_role表的permissions字段是JSON数组格式,所以我们统计数组的元素数量,就是该角色拥有的权限数量。恰好JSON_LENGTH()函数能获取JSON数组的长度,所以我就用在SQL语句中了。@Data@Schema(description="查询角色分页表单")publicclassSearchRoleByPageForm{  @Pattern(regexp="^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,10}$",message="roleName内容不正确")  @Schema(description="角色名称")  privateStringroleName;  @NotNull(message="page不能为空")  @Min(value=1,message="page不能小于1")  @Schema(description="页数")  privateIntegerpage;  @NotNull(message="length不能为空")  @Range(min=10,max=50,message="length必须在10~50之间")  @Schema(description="每页记录数")  privateIntegerlength;}在TbDeptDao.xml文件中,定义SQL用于查询部门分页数据。看上面的截图可知,在部门管理页面上,只有按照部门名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个部门拥有的员工数量,所以用了COUNT()汇总函数。publicclassDeptServiceImplimplementsDeptService{  ……  @Override  publicPageUtilssearchDeptByPage(HashMapparam){    ArrayList<HashMap>list=deptDao.searchDeptByPage(param);    longcount=deptDao.searchDeptCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在DeptController.java类中,定义Web方法,然后大家就可以在Swagger页面测试Web方法了。publicclassDeptController{……  @PostMapping("/searchDeptByPage")  @Operation(summary="查询部门分页数据")  @SaCheckPermission(value={"ROOT","DEPT:SELECT"},mode=SaMode.OR)  publicRsearchDeptByPage(@Valid@RequestBodySearchDeptByPageFormform){    intpage=form.getPage();    intlength=form.getLength();    intstart=(page-1)*length;    HashMapparam=JSONUtil.parse(form).toBean(HashMap.class);    param.put("start",start);    PageUtilspageUtils=deptService.searchDeptByPage(param);    returnR.ok().put("page",pageUtils);  }}本文到此告一段落,感谢大家的观看!
  • 所需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-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-14 10:32
    大小: 2.41KB
    上传者: 开心就很好了
    今天给大家讲讲关于多级网关与多级缓存架构的相关知识,在文章里面,我将从0到1带着大家构建基础服务接口,通过层层递进优化服务,使得服务具备多级缓存的特性,并融合OpenResty拓展一个强大的多级网关+多级缓存的技术架构。以下就是代码实战展示:引入springboot3的maven依赖,本质上作为pom引入,直接管理他的版本号,后续用到啥组件直接拿来即用:<dependencies>  <!--引入SpringBoot依赖-->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-configuration-processor</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId>  </dependency></dependencies>dependencyManagement依赖管理全代码依赖配置如下:<!--  使用dependencyManagement的目的是为了保证当前父工程的干净,  也就是说父工程他只负责对依赖(坐标)的管理,以及依赖的版本管理,而不会去引入额外的jar依赖  如此一来,父工程的职责就相当的单一了,而且也符合面向对象的理念,是一种父子一来继承的关系  依赖的导入只有在各自的子工程中才会导入。--><dependencyManagement>  <dependencies>    <!--mysql驱动-->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>8.0.33</version>    </dependency>    <!--持久层mybatis-->    <dependency>      <groupId>com.baomidou</groupId>      <artifactId>mybatis-plus-boot-starter</artifactId>      <version>3.5.0</version>    </dependency>    <dependency>      <groupId>com.github.pagehelper</groupId>      <artifactId>pagehelper-spring-boot-starter</artifactId>      <version>1.4.1</version>    </dependency>    <!--jackson-->    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-core</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-annotations</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-databind</artifactId>      <version>2.14.2</version>    </dependency>    <!--apache工具类-->    <dependency>      <groupId>commons-codec</groupId>      <artifactId>commons-codec</artifactId>      <version>1.15</version>    </dependency>    <dependency>      <groupId>org.apache.commons</groupId>      <artifactId>commons-lang3</artifactId>      <version>3.12.0</version>    </dependency>    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.4</version>    </dependency>    <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.11.0</version>    </dependency>    <dependency>      <groupId>org.apache.httpcomponents</groupId>      <artifactId>httpclient</artifactId>      <version>4.5.13</version>    </dependency>    <!--google工具类-->    <dependency>      <groupId>com.google.guava</groupId>      <artifactId>guava</artifactId>      <version>28.2-jre</version>    </dependency>  </dependencies></dependencyManagement>使用zaddzset10value120value230value3:设置member和对应的分数zrangezset0-1:查看所有zset中的内容zrangezset0-1withscores:带有分数zrankzsetvalue:获得对应的下标zscorezsetvalue:获得对应的分数zcardzset:统计个数zcountzset分数1分数2:统计个数zrangebyscorezset分数1分数2:查询分数之间的member(包含分数1分数2)zrangebyscorezset(分数1(分数2:查询分数之间的member(不包含分数1和分数2)zrangebyscorezset分数1分数2limitstartend:查询分数之间的member(包含分数1分数2),获得的结果集再次根据下标区间做查询zremzsetvalue:删除member在common中引入的坐标依赖<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-lang3</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-core</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-annotations</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.datatype</groupId>  <artifactId>jackson-datatype-jsr310</artifactId></dependency>迭代查询代码,一级缓存与二级缓存结合:@GetMapping("query")publicObjectquery(Stringid){  StringarticleKey="article:"+id;  StringarticleKeyRedis="REDIS_ARTICLE:"+id;  Articlearticle=cache.get(articleKey,s->{    System.out.println("文章id为"+id+"的没有查询到,则从Redis中查询后返回...");    ArticlearticleReal=null;    StringarticleJsonStr=redis.get(articleKeyRedis);    //判断从redis中查询到的文章数据是否为空    if(StringUtils.isBlank(articleJsonStr)){      System.out.println("Redis中不存在该文章,将从数据库中查询...");      //如果为空,则进入本条件,则从数据库中查询数据      articleReal=articleService.queryArticleDetail(id);      //手动把文章数据设置到redis中,后续再次查询则有值      StringarticleJson=JsonUtils.objectToJson(articleReal);      redis.set(articleKeyRedis,articleJson);    }else{      System.out.println("Redis中存在该文章,将直接返回...");      //如果不为空,则直接转换json类型article再返回即可      articleReal=JsonUtils.jsonToPojo(articleJsonStr,Article.class);    }    returnarticleReal;  });  returnarticle;}本文到此结束,感谢大家的阅读!
  • 所需E币: 0
    时间: 2023-11-10 16:17
    大小: 3.83KB
    SpringBoot+Vue3+MySQL集群开发健康体检双系统课程2023,视频+源码+电子书下载!14大业务模块设计,全流程双系统联动开发,全面掌握业务设计与核心技术。双系统联动+复杂功能设计+缜密业务开发,让你获得一个极具竞争力的面试作品医疗行业是互联网发展前景极好的领域之一,对于初入职者、转行者来说都是很好的选择。课程以业务驱动技术栈,打造完整、全面的双系统项目,并采用前后端分离架构,业务功能完善(健康体检与健康管理两大业务),界面美观,可以高效积累大型医疗项目经验,快速提升医疗行业就业竞争力。一、安装JDK本课程云盘上面附带了JDK15.0.2的安装包,大家下载安装即可。因为从JDK16开始,Oracle移除了JDK中JavaSE的很多类。导致我们用JDK15以后的版本做项目,Maven导入的一些第三方依赖会出现找不到Java工具类的情况,而且更有甚者异常信息也没说找不到哪些类,直接就报运行错误。这就让我们调试程序无从下手,JDK几十万个工具类,我们不可能逐一排查,所以为了保证我们的项目能最大化的兼容Maven下载的依赖库,我们应该安装使用不高于JDK16的版本。相信很多人依然坚持使用JDK1.8,其实1.8这个版本的JDK真的太老了,比方说Activiti7.0工作流框架就不支持这么老的JDK,很多其他框架也都不支持1.8了。所以挑来挑去,只有JDK15.0.2这个版本最合适了。二、为什么选用VirtualBox虚拟机?VirtualBox虚拟机是Oracle提供的免费虚拟机软件,虽然知名度赶不上VMware虚拟机,但是凭借出色的稳定性还是得到了很多程序员的肯定,包括我自己在内。这两年VMware虚拟机版本更新很快,但是BUG越来越多,数不胜数。比方说SSH连接上传文件的时候,会突然掉速到10KB以下。像这样的BUG太多太多了,所以我建议大家还是用VirtualBox虚拟机吧,BUG少,还稳定。三、关于数据库集群读写一致性的思考我们使用主从同步机制搭建出来的MySQL集群,属于弱一致性的集群。也就是说在非常特殊的场景下,我们写入的数据和读取出来的数据可能不一致。我把会出现读写不一致的场景归纳出来了,我们一起看一下。1.写入和查询间隔时间太短假设我们要执行的INSERT语句发送给了MySQL_1节点执行,但是紧接着马上执行了SELECT语句,这个查询语句被MyCat转发给MySQL_2执行。假设INSERT和SELECT语句之间的时间间隔短到1毫秒,导致MySQL_2还没有同步写入的数据,查询语句就来了,自然是查询不到刚刚插入的数据。2.主从同步失效当MySQL_1和MySQL_2的主从同步失效,MySQL_2节点依然能应答MyCat心跳检测,所以MyCat依然认为MySQL_2节点是正常的节点。还是刚才的例子,MySQL_1写入数据后,因为主从同步失效,导致MySQL_2节点上没有新写入的数据,我们也就查询不到刚写入的数据了。那么有没有解决办法呢?我们只能写监控程序,每隔1秒钟执行一次showslavestatus语句,查看结果是不是包含两个YES字样。如果数据同步失效,就立即发送告警邮件,由运维人员及时处理。也许有人好奇什么情况会导致主从同步失效?软硬件都有可能,比如说MyCat、MySQL_1和MySQL_2各自处在不同的机房中。MyCat与MySQL_1和MySQL_2的网络是通畅的,但是MySQL_1和MySQL_2机房之间网络却是不通的,可能是网线断了,也可能是交换机软件的故障。反正网络不通,主从同步自然也就失效了。安装ElementPlus库把EP组件库整合到前端项目的第一个步骤是安装依赖库。执行下面的命令,安装三个依赖库。npminstallelement-plus#安装图标库npminstall@element-plus/icons-vue#安装sass,可以自定义样式覆盖ElementPlus自带样式npminstallsassEP组件库的UI控件特别多,我们最好用哪个组件,就在页面里面引入该组件,而不是一次性把所有UI组件都引入到Vue页面中。一次性引入大量的UI组件会影响浏览器渲染页面的速度,所以我们一定要按需引入UI组件。为了能按需引入UI组件,我们需要安装两个依赖库。npminstallunplugin-vue-components-Dnpminstallunplugin-auto-import -D四、定义前端验证函数这节课我们先从前端验证函数开始做起。因为发送Ajax请求的时候,前端项目先做数据验证,这就离不开验证函数。在/src/utils目录中创建validate.ts文件,然后定义若干验证函数。/** *验证是否为空或者空字符串 */exportfunctionisBlank(s:string){returns==null||s.length==0;}/** *验证邮箱 */exportfunctionisEmail(s:string){return/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s);}/** *验证手机号码 */exportfunctionisMobile(s:string){return/^1[1-9]\d{9}$/.test(s);}/** *验证URL地址 */exportfunctionisURL(s:string){return/^http[s]?:\/\/.*/.test(s);}/** *验证用户名 */exportfunctionisUsername(s:string){return/^[a-zA-Z0-9]{5,50}$/.test(s);}/** *验证密码 */exportfunctionisPassword(s:string){return/^[a-zA-Z0-9]{6,20}$/.test(s);}/** *验证手机短信验证码 */exportfunctionisSmsCode(s:string){return/^\d{6}$/.test(s);}五、设计“关于我们”的样式编写main.less文件的内容,添加上“关于我们”区域的样式。有处细节大家必须注意,页脚的宽度是100%,但是其中主体信息的宽度是1200px,而且要居中显示,所以页脚区域里面两个DIV容器宽度是100%,而其中的列表宽度必须是1200px,还要水平居中显示。footer{  margin-top:50px;  .aboutus-container{    background-color:@bgc-1;    user-select:none;    .list{      width:1200px;      margin-left:auto;      margin-right:auto;      margin-top:0;      margin-bottom:0;      list-style:none;      padding:0;      display:flex;      justify-content:space-between;      .item{        display:flex;        padding:20px10px;        width:285px;        box-sizing:border-box;        img{          width:58px;          height:58px;          margin:10px;          display:block;        }        div{          h3{            font-size:20px;            color:@fc-1;            margin:10px05px0;          }          p{            font-size:12px;            color:@fc-3;            margin:0000;          }        }      }    }  }}
  • 所需E币: 0
    时间: 2023-11-3 13:35
    大小: 2.62KB
    2023全新GO工程师面试总攻略,助力快速斩获offer视频教程,视频+源码+电子书下载!!选择题1.  【初级】下面属于关键字的是()A.funcB.defC.structD.class参考答案:AC2.  【初级】定义一个包内全局字符串变量,下面语法正确的是()A.varstrstringB.str:=""C.str=""D.varstr=""参考答案:AD3.  【初级】通过指针变量p访问其成员变量name,下面语法正确的是()A.p.nameB.(*p).nameC.(&p).nameD.p->name参考答案:AB4.  【初级】关于接口和类的说法,下面说法正确的是()A.一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口B.实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理C.类实现接口时,需要导入接口所在的包D.接口由使用方按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口参考答案:ABD5.  【初级】关于字符串连接,下面语法正确的是()A.str:=‘abc’+‘123’B.str:="abc"+"123"C.str:='123'+"abc"D.fmt.Sprintf("abc%d",123)参考答案:BD6.  【初级】关于协程,下面说法正确是()A.协程和线程都可以实现程序的并发执行B.线程比协程更轻量级C.协程不存在死锁问题D.通过channel来进行协程间的通信参考答案:AD7.  【中级】关于init函数,下面说法正确的是()A.一个包中,可以包含多个init函数B.程序编译时,先执行导入包的init函数,再执行本包内的init函数C.main包中,不能有init函数D.init函数可以被其他函数调用参考答案:ABQ1无缓冲的channel和有缓冲的channel的区别?答案:对于无缓冲的channel,发送方将阻塞该信道,直到接收方从该信道接收到数据为止,而接收方也将阻塞该信道,直到发送方将数据发送到该信道中为止。对于有缓存的channel,发送方在没有空插槽(缓冲区使用完)的情况下阻塞,而接收方在信道为空的情况下阻塞。例如:funcmain(){  st:=time.Now()  ch:=make(chanbool)  gofunc() {    time.Sleep(time.Second*2)    <-ch  }()  ch<-true //无缓冲,发送方阻塞直到接收方接收到数据。  fmt.Printf("cost%.1fs\n",time.Now().Sub(st).Seconds())  time.Sleep(time.Second*5)}funcmain(){  st:=time.Now()  ch:=make(chanbool,2)  gofunc() {    time.Sleep(time.Second*2)    <-ch  }()  ch<-true  ch<-true//缓冲区为2,发送方不阻塞,继续往下执行  fmt.Printf("cost%.1fs\n",time.Now().Sub(st).Seconds())//cost0.0s  ch<-true//缓冲区使用完,发送方阻塞,2s后接收方接收到数据,释放一个插槽,继续往下执行  fmt.Printf("cost%.1fs\n",time.Now().Sub(st).Seconds())//cost2.0s  time.Sleep(time.Second*5)}那想成为年薪50w以上的Go语言工程师到底需要掌握哪些东西?大的点就是Goroutine的调度策略,Channel和Golang协程配合使用。另外,Go的底层、并发、调度、GC等等都是重中之中!基本Go语言搞定这些,跳槽薪资都会非常不错。我明白,大家平时忙于搬砖,没太多时间去学习,为了给我的粉丝们谋取更多福利,我通过几位大厂的朋友搞到了一手面试资料,整理了268道「大厂Go工程师面试题及详细解析」,这份资料不仅仅覆盖了Go开发核心内容,更包含后端工程师必备知识点!通过这些面试题带你了解大厂会关注工程师哪些技术点,查漏补缺,也为你提供一个学习的方向。Go语言领域知识点合集(以下为部分题目)除了面试时用,通过这些你是可以了解现在一线市场的招聘需求,可以认识到自己的问题,丰富自己的知识宽度,熟悉Go高频难点,巩固Go相关知识...1.Go基础类什么是Goroutine?你如何停止它?Go两个接口之间可以存在什么关系?与其他语言相比,使用Go有什么好处? ……2.Go并发编程类Mutex几种状态Mutex允许自旋的条件什么操作叫做原子操作……  3.GoRuntime类1.0之前GM调度模型GMP调度流程基于信号的抢占式调度01初级/中级Golang工程师,能力有何差异?开始招聘之前,面试官的首要工作仍然是明确岗位招聘的需求。确认岗位等级后,再从实际工作任务出发,反推候选人应该具备哪些技能和知识。对于不同级别的Golang工程师,所需完成的开发工作也有所不同
  • 所需E币: 0
    时间: 2023-7-14 01:50
    大小: 47.27MB
    上传者: cheng055
    值得一看的电子书籍,学习学习
  • 所需E币: 4
    时间: 2023-6-22 17:33
    大小: 284.97MB
    上传者: 电子阔少
    [电子书]Python数据分析——从入门到精通.pdf
  • 所需E币: 5
    时间: 2023-6-15 12:57
    大小: 219.44MB
    上传者: czd886
    嵌入式系统Linux内核开发实战指南ARM平台.
  • 所需E币: 5
    时间: 2023-6-15 12:54
    大小: 68.75MB
    上传者: czd886
    (电子书)ARM嵌入式系统基础教程
  • 所需E币: 5
    时间: 2023-6-15 12:52
    大小: 70.46MB
    上传者: czd886
    嵌入式系统设计与开发实例详解-基于ARM的应用
  • 所需E币: 0
    时间: 2023-6-12 15:55
    大小: 1.75KB
    上传者: 蝴蝶结欧恩
    课程分享——Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓,完整版17章+电子书下载。这不是一个高冷、不接地气的源码课!而是一个从开发者实际工作角度出发,结合Vue3的设计机制,通过产出一个精简版Vue3框架的方式,让大家可以站在Vue3源码设计者的角度,俯视所有业务场景,彻底搞清楚每一行Vue代码背后,Vue都做了什么!课程的核心设计原则:让更多的人,以更轻松的方式,学习Vue3源码!
  • 所需E币: 5
    时间: 2023-6-2 11:37
    大小: 60.66MB
    上传者: czd886
    (电子书)爱上单片机【第二版】
  • 所需E币: 0
    时间: 2023-5-29 10:32
    大小: 9.76KB
    上传者: 开心就很好了
    今天给大家分享一套移动端架构师视频教程,《移动端架构师》一共分为6大阶段,30周,500多课时!提供配套的源码+电子课件(独家)下载!课程大纲:【0】源码+电子书【阶段1:KotlinxJava打造UI通用组件】第1周、走进移动端架构师【阶段1:KotlinxJava打造UI通用组件】第2周、通用UI组件开发与基础框架设计【阶段1:KotlinxJava打造UI通用组件】第3周、高级UI组件定制与解耦设计【阶段1:KotlinxJava打造UI通用组件】第4周、Android必备Kotlin核心技术【阶段1:KotlinxJava打造UI通用组件】第5周、AndroidUI核心组件剖析与实战【阶段1:KotlinxJava打造UI通用组件】第6周、Android导航架构探秘【阶段2:解锁Android高阶技能,探秘实战Jetpack】第7周、线程与线程池核心技术【阶段2:解锁Android高阶技能,探秘实战Jetpack】第8周、Android网络编程进阶【阶段2:解锁Android高阶技能,探秘实战Jetpack】第9周、架构首页模块【阶段2:解锁Android高阶技能,探秘实战Jetpack】第9周+、架构首页分类模块【阶段2:解锁Android高阶技能,探秘实战Jetpack】第10周、解密Jetpack工具库核心组件【阶段2:解锁Android高阶技能,探秘实战Jetpack】第11周、架构商品详情模块【阶段2:解锁Android高阶技能,探秘实战Jetpack】第12周、Android消息机制与类加载【阶段3:主流架构演进与项目架构改造】第13周、玩转KotlinxJava设计模式【阶段3:主流架构演进与项目架构改造】第14周、主流架构模式演进之路【阶段3:主流架构演进与项目架构改造】第15周、主流架构实战搜索模块【阶段3:主流架构演进与项目架构改造】第16周、IOC架构设计【阶段3:主流架构演进与项目架构改造】第17周、构建与打包能力【阶段4:混合架构设计与开发】第18周、走进Flutter开发【阶段4:混合架构设计与开发】第19周、Flutter混合架构原理剖析与应用【阶段4:混合架构设计与开发】第20周、Flutter实战应用与性能优化【阶段4:混合架构设计与开发】第21周、走进RN开发【阶段4:混合架构设计与开发】第22周、RN混合架构原理剖析与应用【阶段5:稳定性及性能调优】第23周、稳定性优化【阶段5:稳定性及性能调优】第24周、性能优化【阶段5:稳定性及性能调优】第25周、开发技能拓展【阶段6:前后端接口设计与配置中心系统】第26周、后端-DAU超千万的移动端接口设计实现【阶段6:前后端接口设计与配置中心系统】第27周、前端-管理后台设计实现【阶段6:前后端接口设计与配置中心系统】第28周、【SDK+服务端+控台】配置中心架构实现【阶段6:前后端接口设计与配置中心系统】第29周、HiAbilitySDK开发【阶段6:前后端接口设计与配置中心系统】第30周、学成“下山”移动开发“两极分化”,没有差不多的“中间层”,唯有尽早成长为架构师,你的职业道路才能走的更远更稳!架构师两大核心能力:1、从0到100构建千万级APP的技术能力小型APP逐渐被小程序替代移动开发的重心转向大型APP开发2、驾驭大厂APP架构设计与落地能力行业趋于成熟,企业用人倾向于具备架构思维与架构设计能力的复合型人才经历千万级项目全流程,对一个工程师的成长弥足珍贵,但现实中这样的机会凤毛麟角,于是有了咱们这套《移动端架构师》课程掌握千万日活APP的架构能力·定制移动端优质解决方案·基础库&框架&模块的技术选型·基础模块&组件设计开发维护“技术+管理”综合发展解决项目中关键问题&技术难题·持续优化团队开发流程·提高团队开发能力&效率掌握大部分高阶人才必备技术栈底层&框架源码深度剖析·多设备多版本兼容适配·主流混合开发框架实践应用
  • 所需E币: 5
    时间: 2023-5-28 11:58
    大小: 5.07MB
    上传者: 木头1233
    《MATLAB深度学习简介》电子书
  • 所需E币: 5
    时间: 2023-5-28 11:57
    大小: 1.96MB
    上传者: 木头1233
    《MATLAB机器学习》电子书