tag 标签: 16章

相关资源
  • 所需E币: 0
    时间: 2024-3-22 14:24
    大小: 1.99KB
    Spring能做什么Spring具有哪些能力呢?这点在Spring的官网上有比较详情的描述,我们可以在Spring的项目里看到Spring的生态涵盖了web开发、数据访问、安全控制、分布式、消息服务、移动开发、批处理等等SpringBoot优点SpringBoot的优点我可以在https://spring.io/projects/spring-boot这里看到,下面我把优点复制过来了如下:●Createstand-aloneSpringapplications○创建独立Spring应用●EmbedTomcat,JettyorUndertowdirectly(noneedtodeployWARfiles)○内嵌web服务器●Provideopinionated‘starter’dependenciestosimplifyyourbuildconfiguration○自动starter依赖,简化构建配置●AutomaticallyconfigureSpringand3rdpartylibrarieswheneverpossible○自动配置Spring以及第三方功能●Provideproduction-readyfeaturessuchasmetrics,healthchecks,andexternalizedconfiguration○提供生产级别的监控、健康检查及外部化配置●AbsolutelynocodegenerationandnorequirementforXMLconfiguration○无代码生成、无需编写XMLSpringBoot是整合Spring技术栈的一站式框架SpringBoot是简化Spring技术栈的快速开发脚手架在SpringBoot项目中,正常来说是不存在XML配置,这是因为SpringBoot不推荐使用XML,注意,排不支持,SpringBoot推荐开发者使用Java配置来搭建框架,SpringBoot中,大量的自动化配置都是通过Java配置来实现的,这一套实现方案,我们也可以自己做,即自己也可以使用纯Java来搭建一个SSM环境,即在项目中,不存在任何XML配置,包括web.xml。下面我们开始代码实战:创建maven工程引入依赖<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.3.4.RELEASE</version>  </parent>  <dependencies>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>  </dependencies>创建主程序/** *主程序类 *@SpringBootApplication:这是一个SpringBoot应用 */@SpringBootApplicationpublicclassMainApplication{  publicstaticvoidmain(String[]args){    SpringApplication.run(MainApplication.class,args);  }}启动类,启动就可以了packagecom.urthink.upfs.springbootdemo; importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicationpublicclassSpringBootDemoApplication{   publicstaticvoidmain(String[]args){    SpringApplication.run(SpringBootDemoApplication.class,args);  } }我们将这个依赖拷贝到我们自己的项目pom文件里,粘贴后的pom文件如下<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.atguigu</groupId>  <artifactId>boot-01-helloworld</artifactId>  <version>1.0-SNAPSHOT</version>  <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.3.4.RELEASE</version>  </parent><dependencies>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>  </dependencies></project>
  • 所需E币: 0
    时间: 2024-3-22 11:17
    大小: 2.63KB
    上传者: 开心就很好了
    SpringBoot一直是开发者比较青睐的一款轻量级框架,他不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。现在很多Java系的软件开发都是基于SpringBoot的,这就要求开发人员都要掌握基于SpringBoot的开发。由于SpringBoot体系非常庞大,导致很多人并不能完全掌握如何使用,尤其是涉及分布式相关的开发时,如何和其他框架整合更是让很多程序员无从下手。在此,我给大家整理了几个优质SpringBoot开源项目给大家参考,希望能够帮助到正在学习SpringBoot的小伙伴!小伙伴简历中不知道写什么项目的或者项目没有亮点的,我只能帮你们到这了!随着技术框架的不断更新,一些公司摒弃了原先的技术框架模式。而springboot慢慢取代了原有的ssm框架开发。为什么选择springboot呢?配置简单不需要编写太多的xml;基于spring构建,容易上手;独立运行不依赖于容器;内置服务器tomcat不需要打war包;提供maven极简配置;对于各种框架有很好的集成;为SpringCloud微服务奠定基础,使微服务构建变得简单;下面让我们使用idea一起搭建完整版的SpringBoot项目:首先,确定项目结构现在后端开发都是基于springboot的web项目,web项目一般都是使用MVC的模式,所以这里也采用类似的模式。在项目maven结构组成上,采用父子项目,也就是一个主项目下有多个子module,分为下面几个,p-admin   p-web--》负责项目启动   p-facade --》控制层,写controller   p-service--》服务层,具体的业务处理   p-dao--》持久化层,负责和数据库打交道   p-common--》公共层,util类\入参、出参等   p-api--》提供给第三方的接口大体的项目结构给出来了,下面看子项目间的依赖关系哈,  p-web依赖于p-service、p-common  p-service依赖于p-dao、p-common  p-api依赖于p-common其他的依赖第三方的库暂时不看,下面再说。接下来就可以进行实际操作创建项目了。接着,创建项目创建父项目(p-admin)这里使用maven的父子项目结构,父项目是这样创建的,在idea中file-->new-->project出现下面的界面,直接next就好一、mallmall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。二、Cloud-Platform(微服务的)Cloud-Platform是国内首个基于SpringCloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用SpringBoot2.1.2以及SpringCloud(Greenwich.RELEASE)相关核心组件,采用Nacos注册和配置中心,集成流量卫兵Sentinel,前端采用vue-element-admin组件。三、微人事微人事是一个前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发,项目加入常见的企业级应用所涉及到的技术点,例如Redis、RabbitMQ等。后端技术栈:SpringBoot、SpringSecurity、MyBatis、MySQL、Redis、RabbitMQ、SpringCache、WebSocket前端技术栈Vue、ElementUI、axios、vue-router、Vuex、WebSocket、vue-cli4四、web-flashweb-flash是一个基于SpringBoot和Vue.js的web系统,包含了基于element搭建的后台管理系统和基于vux搭建的手机端h5站点web-flash具备后台管理类系统的通用的基础功能,而且提供了基于ideaintellij的的代码生成插件,可以一键生成前后端页面。核心框架:SpringBoot数据库层:Springdatajpa数据库连接池:Druid缓存:Ehcache前端:基于Vue.js的Element(后端)和vux(手机端)工作流:activiti
  • 所需E币: 0
    时间: 2024-3-1 10:24
    大小: 3.2KB
    上传者: 开心就很好了
    深入学习小程序框架底层原理,培养双线程思维——前端高手特训从0到1带你手写一个微信小程序底层框架!无论你是一位新手,还是一位有经验的开发者,能够自研一套小程序底层框架,都是你突破技术瓶颈有效途径。我将通过本篇文章带领大家从架构设计,原理剖析,再到源码的实现,一步步地实战构建一个完整的微信小程序底层框架,让大家深度掌握小程序双线程原理,助力大家具备把握最佳机会的能力和提升获取心仪Offer的成功率,成为一个真正有实力的技术人才!! 一、首先,我们先来认识小程序,那么什么是小程序呢?小程序是一种不需要下载安装即可使用的应用,它基于某个平台(如微信)运行,用户可以通过扫描二维码或搜索关键词来打开小程序。小程序的特点包括体积小、启动速度快、使用便捷,以及能够实现“用完即走”的理念,减少了用户安装应用的数量。小程序的开发通常采用前端技术,如HTML5、CSS3和JavaScript,并通过封装和提供丰富的API接口,实现与微信生态系统的高度整合。小程序可以提供各种服务,如游戏、购物、地图、社交和学习等,同时帮助商家展示产品、推广服务以及实现线上支付等功能。二、设计思路-渲染层小程序使用的是Exparser组件模型,Exparser组件模型与WebComponents中的shadowDOM高度相似,微信为什么使用自定义组件框架,而不使用WebComponents呢?主要还是出于安全考虑,并且方便管控。既然Exparser组件框架与shadowDOM高度相似,那么我们首先来了解一下shadowDOM。shadowDOM:WebComponents的一个重要属性是封装-可以将标记结构、样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净、整洁。其中,shadowDOM接口是关键所在,它可以将一个隐藏的,独立的DOM附加到一个元素上。三、Exparser组件模型Exparser组件模型参考了shadowDOM并进行了一些修改,像事件系统就是完全复刻的,slot插槽,属性传递等都基本一致。但同时它又具有一些特点:基于shadowDOM模型:模型上与WebComponents的shadowDOM高度相似,但不依赖浏览器的原生支持,也没有其他依赖库;实现时,还针对性地增加了其他API以支持小程序组件编程;可在纯JS环境中运行:这意味着逻辑层也具有一定的组件树组织能力;高效轻量:性能表现好,在组件实例极多的环境下表现尤其优异,同时代码尺寸也较小;四、逻辑层与视图层通信在小程序中,逻辑层只有一个,但是渲染层有多个,渲染层和逻辑层之间是通过微信客户端进行桥接通信的。那具体是怎么实现的呢?其实它使用的就是WeixinJSBridge通信机制。在小程序执行的过程中,微信客户端分别向渲染层和逻辑层注入WeixinJSBridge,WeixinJSBridge主要提供了以下几个方法:invoke:调用nativeAPI;invokeCallbackHandler:Native传递invoke方法回调结果;publish:渲染层用来向逻辑业务层发送消息,也就是说要调用逻辑层的事件方法;subscribe:订阅逻辑层消息;subscribeHandler:视图层和逻辑层消息订阅转发;setCustomPublishHandler:自定义消息转发;五、微信小程序主流框架有哪些?微信小程序是一种特殊的应用程序,它使用微信平台提供的JavaScript框架来构建。目前,微信小程序主要有以下三个主流框架:1、原生框架(VanillaFramework):原生框架是微信小程序的最基础、最原始的框架,它使用原生的JavaScript、WXML和WXSS来开发小程序。2、MiniprogramFramework(小程序框架):小程序框架是由微信团队提供的官方框架,用于简化小程序的开发过程。它提供了更高层次的抽象和封装,使得开发者可以更快速地构建小程序。3、mpvue:mpvue是一个基于Vue.js的小程序开发框架。它允许开发者使用Vue.js的语法和特性来开发小程序,从而降低了学习成本和提高了开发效率。六、小程序的底层实现原理主要涉及以下几个方面:框架架构:小程序框架通常采用前端框架,如微信小程序使用的是基于JavaScript的框架。这些框架提供了一套开发和运行环境,包括对视图层、逻辑层和数据层的管理和处理。渲染机制:小程序通过渲染引擎将开发者编写的代码转化为可视化界面。渲染引擎负责解析和处理小程序的标记语言,如HTML、XML等,并将其转换为浏览器可以显示的界面。数据通信:小程序需要与服务器进行数据通信,包括获取数据、上传数据等。通常使用HTTP协议进行网络请求,通过发送和接收数据来实现与服务器的交互。安全机制:为了保障用户数据的安全和隐私,小程序实现了一系列安全机制。例如,小程序在沙箱环境中运行,限制了对系统资源的访问权限;小程序代码签名和校验机制确保代码的完整性和安全性;同时,小程序还采用了数据加密、身份验证等措施来保护用户数据的传输和存储安全。跨平台适配:小程序需要在不同的操作系统和设备上运行,因此需要进行跨平台适配。框架会处理不同平台的差异,以确保小程序在不同设备上有一致的运行效果和用户体验。总的来说,小程序底层的实现原理是基于前端技术栈和相关技术,通过框架架构、渲染机制、数据通信、安全机制等来实现小程序的功能和特性。
  • 所需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-18 10:38
    大小: 3.46KB
    上传者: 开心就很好了
    今天给大家讲讲关于SpringBoot2仿B站的一个项目,大家都知道,如今短视频成为了风口中的风口,但市场上极度缺乏视频业务开发的相关技术人才。本文将结合SpringCloud微服务架构+Springboot+JDK+Maven+VUE等技术,实现B站核心功能(视频流、弹幕流)+百万量级的高性能优化,从而帮助大家提升前端加后端技术水平,掌握架构设计思维及丰富解决方案。实现步骤使用Vue3提供的Provide/Inject组合,通过provide在App.vue中提供当前语言环境localeLanguage,代码片段如下所示://App.vue  <scriptsetuplang="ts">  importzhCnfrom'element-plus/lib/locale/lang/zh-cn'  importenfrom'element-plus/lib/locale/lang/en'  import{ref,provide}from'vue'  //显示引入provide    constlocale=ref(zhCn)  constlocaleLanguage=ref('')  functionchangeLang(language:any){   locale.value=language   localeLanguage.value=language.name  }    //提供当前语言环境localeLanguage  provide('localeLanguage',localeLanguage)    </script>然后再通过inject将其注入到home页面,将获取到的localeLanguage传入自定义的t函数中,代码片段如下所示://home/index.vue  <scriptsetuplang="ts">  import{useRoute}from'vue-router'  import{inject}from'vue' //显示引入inject  import{t}from'../../utils/internationalization'    //通过inject将localeLanguage注入,作为t函数的参数  constlocaleLanguage:string=inject('localeLanguage')||''  constroute=useRoute()  console.log(route.params)  constvalue1=''  </script>    <template>   <div>{{t(localeLanguage).home}}---{{t(localeLanguage).mine}}</div>   <el-date-pickerv-model="value1"type="date"placeholder="Pickaday"></el-date-picker>  </template>封装一个openStore(),使用indexedDB.open()方法返回一个IDBRequest对象,接着将这个对象上的三个事件分别放置进入:onsuccess、onerror、onupgradeneeded。onsuccess表示打开数据库成功的事件。onerror表示打开数据库失败的事件。onupgradeneeded是数据库升级事件,如果版本号更新,并且大于之前的版本号则进行数据库升级,该事件回调里面,会创建我们所需要的对象仓库,类似于关系型数据库中的表的概念。exportdefaultclassDB{ privatedbName:string//数据库名称 constructor(dbName:string){  this.dbName=dbName } //打开数据库 publicopenStore(storeName:string,keyPath:string,indexs?:Array<string>){  constrequest=window.indexedDB.open(this.dbName,2)  request.onsuccess=(event)=>{   console.log('数据库打开成功')   console.log(event)  }  request.onerror=(event)=>{   console.log('数据库打开失败')   console.log(event)  }  request.onupgradeneeded=(event)=>{   console.log('数据库升级成功')   const{result}:any=event.target   conststore=result.createObjectStore(storeName,{autoIncrement:true,keyPath})   if(indexs&&indexs.length>0){    indexs.map((v:string)=>{     store.createIndex(v,v,{unique:true})    })   }   store.transaction.oncomplete=(event:any)=>{    console.log('创建对象仓库成功')   }   console.log(event)  } }}Promise包装异步事务为了更好的获取indexedD事务中的返回结果,我们使用promise来包装一下上一小节indexedDB.ts中定义的几个方法:openStore、updateItem、deleteItem、getList、getItem。下面代码片段为getList() //查询所有数据 getList(storeName:string){  conststore=this.db.transaction(storeName).objectStore(storeName)  constrequest=store.getAll()  returnnewPromise((resolve,reject)=>{   request.onsuccess=(event:any)=>{    console.log('查询所有数据成功')    console.log(event.target.result)    resolve(event.target.result)   }   request.onerror=(event:any)=>{    console.log('查询所有数据失败')    console.log(event)    reject(event)   }  }) }使用@include指令来引入定义好的样式函数,该函数的三个参数可以根据传入的值来对flex布局进行自定义,默认值为:column、center、right,在footerCommon.scss中我们重新自定义了该样式函数,分别传入row、space-between、flex-start,代码片段如下://footerCommon.scss.common-footer{  border-top:1pxsolidrgb(235,235,235); .footer{  @includemain-wrapper;  @includelayout(row,space-between,flex-start);  padding:20px0;  li{   @includelayout;   h4{    font-weight:bold;   }   a{    margin-bottom:10px;    color:rgb(72,72,72);    text-decoration:none;    &:hover{     text-decoration:underline;    }   }  } }}getter类似与Vue中的computed计算属性,它的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算getters里可以处理一些array、object的查询、过滤、遍历、重构或者做一些字符拼接的操作,方便直接生成一些可以直接使用的数据。如下代码片段展示了如何在getter中进行过滤查询:exportconststore=createStore({   state:{   todos:[  //定义一个对象数组   {   id:1,   done:true   },   {   id:2,   done:false   }   ]   }   getters:{   doneTodosCount(){ //查询已完成的个数   returnstore.state.todos.filter(todo=>todo.done).length //返回值:1   }   }  })通过环境变量区分server.js中的一些代码片段,因为有些代码需要运行在开发环境,而有些代码需要运行在生产环境。本小节在server.js中一共对3个地方进行了环境区分,代码片段如下//server.jsif(!isProd){ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'index.html'),  'utf-8' ) //2.应用ViteHTML转换。这将会注入ViteHMR客户端, //  同时也会从Vite插件应用HTML转换。 //  例如:@vitejs/plugin-react-refresh中的globalpreambles template=awaitvite.transformIndexHtml(url,template) //3.加载服务器入口。vite.ssrLoadModule将自动转换 //  你的ESM源码使之可以在Node.js中运行!无需打包 //  并提供类似HMR的根据情况随时失效。 render=(awaitvite.ssrLoadModule('/src/entry-server.ts')).render}else{ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'dist/client/index.html'),  'utf-8' ) //3.加载服务器入口 render=require('./dist/server/entry-server.ts').render}
  • 所需E币: 0
    时间: 2023-11-9 15:22
    大小: 2.2KB
    直播领域发展迅速,人才需求量极大,但能完整驾驭高并发场景下直播场景的人才还不多。本课程通过六个高并发场景-用户中台服务,IM即时通讯,礼物打赏、直播PK、红包雨、直播带货秒杀,带你从0到1,循序渐进实战落地,让你对直播业务场景有更透彻的理解,对直播技术栈有更全面的掌握,对高并发解决方案有更强的设计与实战能力。课程旨在助力你提升在直播领域的职业竞争力。六大高并发场景驱动教学,轻松玩转直播业务,从容面对三高难题1、从0到1完整搞定六大高并发场景掌握用户中台系统架构设计与开发掌握高并发场景下的IM架构体系掌握礼物、钱包系统全链路代码实现掌握红包雨、直播PK、直播带货技术实现2、掌握整套通用分布式解决方案掌握分布式ID在业务中的生成和优化掌握缓存数据一致性解决方案掌握亿级数据存储方案落地掌握高性能IM系统从0到1落地方案3、全面提升高并发主流技术综合实战能力实战学习MySQL数据库分库分表、读写分离掌握分布式缓存、网关组件、配置中心技术深入理解Docker容器技术原理和使用技巧掌握SpringCloudAlibaba等技术栈原理及应用设计异常的接口定义JavapublicinterfaceQiyuBaseError{  intgetErrorCode();  StringgetErrorMsg();}将常用的异常类型实现给定义出来Javapackageorg.qiyu.live.web.starter.error;/** *@Authoridea *@Date:Createdin11:252023/8/2 *@Description */publicenumBizBaseErrorEnumimplementsQiyuBaseError{  PARAM_ERROR(100001,"参数异常"),  TOKEN_ERROR(100002,"用户token异常");  privateinterrorCode;  privateStringerrorMsg;  BizBaseErrorEnum(interrorCode,StringerrorMsg){    this.errorCode=errorCode;    this.errorMsg=errorMsg;  }  @Override  publicintgetErrorCode(){    return0;  }  @Override  publicStringgetErrorMsg(){    returnnull;  }}带你创建直播业务的数据库模块搭建创建我们的数据库:TypeScriptCREATEDATABASEqiyu_live_userCHARACTER setutf8mb3COLLATE=utf8_bin;创建一百张分表的脚本:TypeScriptDELIMITER$$    CREATE    PROCEDUREqiyu_live_user.create_t_user_100()    BEGIN         DECLAREiINT;       DECLAREtable_nameVARCHAR(30);       DECLAREtable_preVARCHAR(30);       DECLAREsql_textVARCHAR(3000);      DECLAREtable_bodyVARCHAR(2000);        SETi=0;       SETtable_name='';                SETsql_text='';       SETtable_body='( user_idbigintNOTNULLDEFAULT-1COMMENT\'用户id\', nick_namevarchar(35) DEFAULTNULLCOMMENT\'昵称\', avatarvarchar(255) DEFAULTNULLCOMMENT\'头像\', true_namevarchar(20) DEFAULTNULLCOMMENT\'真实姓名\', sextinyint(1)DEFAULTNULLCOMMENT\'性别0男,1女\', born_datedatetimeDEFAULTNULLCOMMENT\'出生时间\', work_cityint(9)DEFAULTNULLCOMMENT\'工作地\', born_cityint(9)DEFAULTNULLCOMMENT\'出生地\', create_timedatetimeDEFAULTCURRENT_TIMESTAMP, update_timedatetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, PRIMARYKEY(user_id))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb3COLLATE=utf8_bin;';      WHILEi<100DO          IFi<10THEN          SETtable_name=CONCAT('t_user_0',i);        ELSE          SETtable_name=CONCAT('t_user_',i);        ENDIF;                     SETsql_text=CONCAT('CREATETABLE',table_name,table_body);         SELECTsql_text;        SET@sql_text=sql_text;        PREPAREstmtFROM@sql_text;        EXECUTEstmt;        DEALLOCATEPREPAREstmt;         SETi=i+1;      ENDWHILE;            END$$         DELIMITER;
  • 所需E币: 0
    时间: 2023-10-9 12:14
    大小: 1.88KB
    上传者: huangyasir1990
    手写React高质量源码,迈向高阶开发教程,16章,2023最新!1、什么是React?React是用于构建用户界面的JavaScript库,起源于Facebook的内部项目,该公司对市场上所有JavaScriptMVC框架都不满意,决定自行开发一套,用于架设Instagram的网站。于2013年5月开源。2、React三大颠覆性的特点React的一切都是基于组件的,组件有着良好的封装性,组件可以让代码的复用和测试变得更加简单。各个组件都有着各自的状态,当状态变更时,便会重新渲染整个组件,组件化开发不仅仅应用于React,这也是Web的发展的趋势。组件一般会涉及以下几个部分:props属性state状态组件的生命周期无状态函数式组件state设计原则DOM操作3、对ReactJS的认识及ReactJS的优点首先,对于React,有一些认识误区,这里先总结一下:React不是一个完整的MVC框架,最多可以认为是MVC中的V(View),甚至React并不非常认可MVC开发模式;React的服务器端Render能力只能算是一个锦上添花的功能,并不是其核心出发点,事实上React官方站点几乎没有提及其在服务器端的应用;有人拿React和WebComponent相提并论,但两者并不是完全的竞争关系,你完全可以用React去开发一个真正的WebComponent;React不是一个新的模板语言,JSX只是一个表象,没有JSX的React也能工作4、如何编写React组件?下面我们展示如何创建简单的React组件:importReactfrom'react';classGreetingextendsReact.Component{ constructor(props){   super(props);   this.state={name:props.name}; } render(){   return<h1>Hello,{this.state.name}!</h1>; }}exportdefaultGreeting;5、React有什么优缺点?优点1、React速度快、性能好它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好2、跨浏览器兼容虚拟DOM的原因帮助我们解决了跨浏览器问题,它为我们提供了标准化的API3、单向数据流Flux随着React视图库的开发而被Facebook概念化,是一个用于在JavaScript应用中创建单向数据层的架构4、React兼容性好使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。缺点1.并不是一个单独完整的框架React是目标是UI组件,通常可以和其它框架组合使用,目前并不适合单独做一个完整的框架
  • 所需E币: 0
    时间: 2023-10-9 11:55
    大小: 1.5KB
    手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是多次同值、不同值setState,期望最后显示的是最后一次setState的结果,减少渲染。 constIndex=()=>{  const[name,setName]=useState('')  const[age,setAge]=useState(0)     constchange=()=>{   setName('a')   setAge(1)    //仅触发一次渲染,批处理,2次setState合并为一次渲染   //需需要立即重渲染,需要手动调用   //ReactDOM.flushSync(()=>{   //  setName('a')//立即执行渲染   //  setAge(1)//立即执行渲染   //  //不会合并处理,即没有批处理,触发2次   //});  }  console.log(1)//只打印一次  return(   <div>    <p>name:{name}</p>    <p>age:{age}</p>    <buttononClick={change}>更改</button>   </div>  ) }1.React18是什么?在我们讨论“React18有什么新功能”之前,React18是什么意思?任何18.0.0以上但不包括19.0.0的React库的稳定版本都被称为React18。React18的创建在React应用程序中引入了并发渲染。React一直在关注DOM渲染,并为开发人员提供控制和跟踪组件生命周期的工具。有了一些新功能,React18现在可以调整渲染过程,以适应客户端设备。 <!--注意:部署时,将"development.js"替换为"production.min.js"--> <scriptsrc="https://unpkg.com/react@18/umd/react.development.js"crossorigin></script> <scriptsrc="https://unpkg.com/react-dom@18/umd/react-dom.development.js"crossorigin></script> <!--加载我们的React组件--> <scriptsrc="app.js"></script></body>现在终于等到了React18,所以我打算好好看看新版本的这些特性,到底香不香
  • 所需E币: 0
    时间: 2023-8-15 13:52
    大小: 1.2KB
    SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。依托SpringCloudAlibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。很多人可能会问,有了springcloud这个微服务的框架,为什么又要使用springcloudalibaba这个框架了?最重要的原因在于springcloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,在使用过程中也存在着细小的问题;由此他的替代产品,也就是springcloudalibaba,目前正处于蓬勃发展的态式。主要功能服务限流降级:默认支持为HTTP服务的提供限流保护,也支持添加注解实现方法的自定义限流降级,且支持动态修改限流降级规则。服务注册与发现:适配SpringCloud服务注册与发现标准,默认集成了Ribbon的支持。分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 所需E币: 0
    时间: 2023-7-4 19:12
    大小: 1.82KB
    上传者: 开心就很好了
    SpringBoot+Vue3+ElementPlus打造私人分布式存储系统视频教程下载,课程已完结,一共16章全,视频+源码+笔记下载!什么是分布式存储系统?分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。数据存取与安全是数据时代的基石,个人隐私现在愈发重要,拥有属于自己的高安全性存储系统迫在眉睫。《SpringBoot+Vue3+ElementPlus打造私人分布式存储系统》课程将带你从项目设计、实现、优化、压力与并发安全测试、部署上线全流程打造业务俱全的网盘系统,并解决数据存储安全问题。助力你实现复杂业务与全栈技术双重提升,大大提升毕设通过率,求职面试通过率,升职加薪成功率。手把手带你从0到1全流程打造商业级分布式数据存储系统掌握网盘类项目全流程落地能力网盘项目功能设计→前后端开发→各种中间件集成→压力与并发安全测试→部署上线→运维与服务提升前后端主流技术综合实战能力VUE3.0+Element-Plus技术搭建前端SpringEvent和RocketMQ异步解耦Caffeine、Redis等缓存技术解决高并发Redis和ZooKeeper搭建分布式锁方案具备处理复杂业务问题的能力文件秒传大文件并发分片上传分布式场景生成全局唯一ID分布式、高并发场景保证数据一致性分布式存储技术与集中式存储技术的区别分布式存储技术与集中式存储技术两者的主要区别有三处:第一是数据存储量。集中式存储技术将信息数据存储在一个数据库中,数据存储量相当有限,不能满足高级别数据存储的需求。而分布式存储技术是将数据存储在零散的网络空间中,可以存储海量的数据,能满足多种级别的数据存储需求。第二是防御性。集中式存储技术的防御性低,这是因为信息数据全部集中存储在服务器中,一旦服务器感染网络病毒或是遭受黑客攻击,全部数据将会损坏或丢失,整个网络都会随之瘫痪,可能产生很严重的后果。而分布式存储技术的防御性较高,每一个节点都可以被看作一个中心,这样即使一个节点遭受攻击或数据篡改,其他中心也能够保证整体网络的正常运行,部分数据的损坏不影响其他数据的使用,有效保证了信息安全。第三是并发性能。集中式存储技术的并发性能低,不能同时读写信息数据,在查询大量数据时速度非常慢。而分布式存储技术的并发性能好,能够同时对海量数据进行读写操作。
  • 所需E币: 0
    时间: 2023-7-4 17:58
    大小: 867B
    上传者: 蝴蝶结欧恩
    分享课程——SpringBoot+Vue3+ElementPlus打造私人分布式存储系统,已完结16章,附源码+笔记。数据存取与安全是数据时代的基石,个人隐私现在愈发重要,拥有属于自己的高安全性存储系统迫在眉睫。本课程将带你从项目设计、实现、优化、压力与并发安全测试、部署上线全流程打造业务俱全的网盘系统,并解决数据存储安全问题。助力你实现复杂业务与全栈技术双重提升,大大提升毕设通过率,求职面试通过率,升职加薪成功率。手把手带你从0到1全流程打造商业级分布式数据存储系统一站式获得业务复杂,功能完备,拓展性强的极具竞争优势的项目经验一次掌握100+Web全栈开发技能点,一课收获3年的技术积累
  • 所需E币: 0
    时间: 2023-3-8 10:39
    大小: 1.28KB
    上传者: 开心就很好了
    《Nacos核心原理解读+高性能微服务系统实战》从系统层面深入分析Nacos的设计及实现原理,并结合SpringBoot、SpringCloud、Vue等技术实战开发微服务项目,让你更深入地理解Nacos,在实战中掌握Nacos核心技术与应用。课程一共16章,2023年完结新课,提供源码+PDF课件下载!基于Nacos,SpringBoot+Vue开发微服务项目,在实战中掌握其运用。掌握高性能微服务治理框架Nacos,提升微服务架构设计与开发能力。大厂背书、简单易用的框架,满足超高性能、超大容量、高可用的实际微服务场景需求。理论层面吃透Nacos了解Nacos设计原则学习Nacos各模块功能特性通过源码解读透视实现原理实战层面无障碍运用Nacos掌握Nacos在实战项目中的运用掌握SpringBoot、SpringCloud等基础框架亲自上手开发微服务系统提高微服务构建效率深度理解微服务治理核心技能掌握Nacos的对接更高效地开发复杂微服务项目课程大纲:Nacos基础特性Nacos架构Nacos特性--服务注册Nacos特性--服务发现Nacos特性--发布与获取配置NacosSpring关键特性Nacos与SpringNacos整合SpringBoot流程Nacos整合SpringCloud流程如何从Eureka过度到NacosNacos核心特性实现原理Nacos-Naming模块概览Nacos-服务注册源码实现原理深度剖析Nacos-服务发现源码实现原理深度剖析Nacos-Config模块概览Nacos-配置管理源码实现流程梳理Nacos内核初探Nacos一致性协议Nacos寻址机制原理解析Nacos元数据解析详解Nacos高可用设计热插拔的Nacos插件Nacos鉴权插件之账号权限体系设计Nacos鉴权插件之认证机制设计自定义Nacos插件扩展Nacos与云原生在Docker中部署Nacos服务网格ServiceMesh体系认知提升Nacos元数据解析架构演进--Nacos如何完美整合ServiceMesh体系?
  • 所需E币: 0
    时间: 2021-3-20 17:39
    大小: 6.66MB
    上传者: Argent
    这些都是各大名校的电路分析专业课之最大法宝,把这些题目悉心研究几遍,定会考出高分。无论对于即将考研的你,还是即将走向电子工程师岗位的你,都会获益匪浅。希望大家利用好这些历年真题,对于你今后的电子电路设计有所帮助。
  • 所需E币: 1
    时间: 2020-12-30 15:30
    大小: 321.71KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电知识也是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2020-12-27 22:43
    大小: 14.28KB
    上传者: stanleylo2001
    MATLAB培训资料_第16章偏微分方程的数值解法
  • 所需E币: 0
    时间: 2020-9-17 22:08
    大小: 125.56KB
    上传者: kaidi2003
    典型题解——第16章 二端口网络
  • 所需E币: 0
    时间: 2020-9-16 18:29
    大小: 4.5MB
    上传者: kaidi2003
    要点、考点与例题——第16章二端口网络
  • 所需E币: 0
    时间: 2020-9-16 18:34
    大小: 324.34KB
    上传者: kaidi2003
    同步习题与详解——第16章 二端口网络
  • 所需E币: 0
    时间: 2020-9-16 20:33
    大小: 360.7KB
    上传者: kaidi2003
    同步习题与详解——第16章 二端口网络
  • 所需E币: 0
    时间: 2020-9-11 21:53
    大小: 2.08MB
    上传者: kaidi2003
    同步习题与详解——第16章 二端口网络.pdf