tag 标签: 23章

相关资源
  • 所需E币: 0
    时间: 2024-2-26 10:46
    大小: 2.97KB
    上传者: 开心就很好了
    一、Spark3.0.0运行环境安装Spark常见部署模式:Local模式:在本地部署单个Spark服务所谓的Local模式,就是不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等。在IDEA中运行代码的环境称之为开发环境,和Local模式还是有区别的。Standalone模式:Spark自带的任务调度模式。(国内常用)YARN模式:Spark使用Hadoop的YARN组件进行资源与任务调度。(国内常用)Windows模式:为了方便在学习测试spark程序,Spark提供了可以在windows系统下启动本地集群的方式,这样,在不使用虚拟机或服务器的情况下,也能满足Spark的基本使用。Mesos&K8S模式:(了解)。Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,在Twitter得到广泛使用,管理着Twitter超过30,0000台服务器上的应用部署,但是在国内,依然使用着传统的Hadoop大数据框架,所以国内使用Mesos框架的并不多,但是原理都差不多。容器化部署是目前业界很流行的一项技术,基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是Kubernetes(k8s),而Spark也在最近的版本中支持了k8s部署模式。1、配置javajdk1.8环境变量配置路径:电脑→属性→高级系统设置→环境变量path中加入:%JAVA_HOME%/bin。注:jdk版本不宜过高。2、配置scala2.12.0下载scala安装包,选择对应版本,这里我选择的是scala2.12.0版本。3、配置scala环境环境变量配置路径:此电脑→属性→高级系统设置→环境变量path中加入:%SCALA_HOME%/bin。验证配置cmd验证配置:scala-version4、配置Hadoop3.1.0Hadoop下载从Apache官网下载Hadoop,官网下载速度较慢,也可使用国内镜像下载。Hadoop环境变量配置,配置步骤同Scala配置。注意:需要把%HADOOP_HOME%\bin与%HADOOP_HOME%\sbin一同加入path中。5、配置Spark3.0.3Spark下载Spark环境配置,配置步骤同scala配置。注意:需要把%SPARK_HOME%\bin与%SPARK_HOME%\sbin一同加入path中。配置验证cmd命令:spark-shellSpark配置成功。二、spark实战Spark是用于大规模数据处理的统一分析引擎,也可以说是目前用于可伸缩计算的最广泛的引擎,成千上万的公司包括财富500强中的80%都在使用。Spark生态系统集成了丰富的数据科学、机器学习、SQL分析和BI、存储和基础设施等框架,并将这个生态使用可以扩展到数千台机器大规模数据使用。Spark提供了Java、Scala、Python和R的高级api,以及支持通用执行图的优化引擎。Spark支持一系列丰富的高级工具,包括用于SQL和结构化数据处理的SparkSQL,用于pandas工作负载的Spark上的pandasAPI,用于机器学习的MLlib,用于图形处理的GraphX,以及用于增量计算和流处理的StructuredStreaming。Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式,Spark的Standalone模式体现了经典的master-slave模式。#拷贝一个部署spark-standalone目录cp-rspark-3.3.0-bin-hadoop3spark-standalone#进入目录cdspark-standalone/cdconf#准备workers配置文件mvworkers.templateworkers#修改workers内容为viworkershadoop1hadoop2hadoop3#准备spark-env.sh配置文件mvspark-env.sh.templatespark-env.sh#spark-env.sh添加如下内容vispark-env.sexportJAVA_HOME=/home/commons/jdk8SPARK_MASTER_HOST=hadoop1SPARK_MASTER_PORT=7077#分发到其他两台上scp-r/home/commons/spark-standalonehadoop2:/home/commons/scp-r/home/commons/spark-standalonehadoop3:/home/commons/#进入根目录下sbin执行目录和启动cdsbin/./start-all.sh由于spark-shell停止掉后,集群监控页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。#先停止前面启动的集群./stop-all.sh#准备spark-defaults.confcd../confmvspark-defaults.conf.templatespark-defaults.conf#修改spark-defaults.confvimspark-defaults.confspark.eventLog.enabled     truespark.eventLog.dir       hdfs://myns:8020/sparkhis#需要启动Hadoop集群,HDFS上的目录需要提前存在hadoopfs-mkdir/sparkhis#修改spark-env.sh文件,添加如下配置:vispark-env.shexportSPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://myns:8020/sparkhis-Dspark.history.retainedApplications=30"#参数1含义:WEBUI访问的端口号为18080#参数2含义:指定历史服务器日志存储路径(读)#参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。由于hadoop是HA模式因此配置为hdfs-site.xml下的dfs.nameservices的value值  <property>    <name>dfs.nameservices</name>    <value>myns</value><!--core-site.xml的fs.defaultFS使用该属性值-->  </property>#分发配置到另外两台上scpspark-defaults.confspark-env.shhadoop2:/home/commons/spark-standalone/conf/scpspark-defaults.confspark-env.shhadoop3:/home/commons/spark-standalone/conf/#启动集群./start-all.sh#启动历史服务./start-history-server.sh
  • 所需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-6-16 10:14
    大小: 2.78KB
    上传者: 开心就很好了
    分享课程——《新版Springboot3.0打造能落地的高并发仿12306售票系统》,23章完整版,2023年6月完结,提供源码和配word文档下载第1章课程介绍与学习指南第2章12306这个系统架构到底有多牛?第3章最新版的SpringBoot3&JDK9~17新特性详解第4章新版SpringCloudAlibaba与Springbooot搭建后端架构第5章使用Vue3+VueCLI实现系统前端模块的搭建第6章实现JWT单点登录功能第7章12306系统会员基础功能的实现第8章自制前后端代码生成器提高开发效率第9章利用代码生成器快速实现火车基础数据的维护第10章使用调度框架quartz,为12306系统增加定时调度功能第11章通过火车基础数据生成每日火车数据第12章基本的车票预定功能开发第13章集成注册中心与配置中心组件Nacos(动态修改线上的配置)第14章高性能余票查询的实现(前端缓存&本地缓存&分布式缓存)第15章集成分布式事务组件Seata(解决分布式系统中的数据一致性问题)第16章高并发抢票时,利用各种锁解决车票超卖问题(JDK锁&分布式锁&看门狗设计&红锁)第17章高并发抢票时,使用Sentinal组件进行请求限流降级(过滤90%的无效请求)第18章高并发抢票时,防止机器人刷票的令牌大闸,可减轻服务器的压力(防刷+限流)第19章利用流行的MQ组件对请求做削峰处理,解决吞吐量问题(实现最短时间内给用户反馈)第20章压力测试-高并发优化前后的性能对比(单机性能提升25倍左右)第21章企业级项目上云(阿里云部署)第22章项目优化第23章课程总结源码+word文档《新版Springboot3.0打造能落地的高并发仿12306售票系统》课程以极佳的案例场景,手把手带你学会落地高并发整体解决方案——>从0到1落地整体项目架构三端分离,易于分配不同资源微服务组件,保证服务的高可用功能拆分,实现服务间低耦合、高内聚提升系统性能,保障服务高性能响应——>学会高并发高性能场景解决方案学会对并发请求做削峰处理,解决吞吐量问题,掌握使用限流、令牌大闸、发放令牌、分布式锁、分布式缓存等十几种技术解决多种高并发问题——>综合提升高并发技术实战能力高并发秒杀技术应用落地,集成第三方组件做多场景问题处理,掌握新版Springboot及SpringCloudAlibaba的综合运用等大型分布式架构设计,从0到1手把手带你落地整体项目架构——>千万级、业务复杂度极高项目架构拆解,提升各种高并发、高性能架构设计能力使用三端分离,会员端、控台端、服务端,便于开发和维护,同时将界面与功能逻辑分开,易于分配不同的资源。使用微服务生态组件:注册中心、配置中心、网关、限流降级、分布式事务、服务调用,保障服务高可用。将系统功能拆分成多个微服务应用,实现服务间低耦合,服务内功能高内聚。使用Redis、MQ等中间件,提升系统性能,保障服务高性能响应。自制代码生成器,一分钟完成单表增删改查(含界面)功能,极大的提高开发效率。正常项目中,跑批的核心功能,都应该在batch模块里执行,也就是说得在batch模块里,重新生成一遍train相关表的持久层,正常项目就应该这样做,让业务模块和跑批完全隔离开,不至于因为跑批性能差而影响了业务的开展。本项目因为是演示项目,就不花这个时间做重复生成持久层了,直接调用business接口,刚好可以学习微服务的服务间调用组件feign(openfeign)Feign是Netflix公司开发的一个声明式的REST调用客户端,SpringCloud的早期,就是将各种第三方组件,整合到SpringBoot项目里,形成了SpringCloud,现在慢慢的把第三方组件替换成自研的组件,比如gateway组件OpenFeign是在Feign的基础上,增加SpringMVC注解,让代码写起来像在写Controller使用spring.application.name可以给各应用起一个名字,方便应用之间互相认识,在注册中心、配置中心、路由、服务调用、限流等微服务组件中,都会用到。//seat可选,当无选座时,seat为空[{ passengerId:123, passengerType:"1", seatTypeCode:"1", passengerName:"张三", passengerIdCard:"12323132132", seat:"C1"},{ passengerId:123, passengerType:"1", seatTypeCode:"1", passengerName:"李四", passengerIdCard:"12323132132", seat:"D2"}]//0:不支持选座;1:选一等座;2:选二等座constchooseSeatType=ref(0);//选择的座位//{//  A1:false,C1:true,D1:false,F1:false,//  A2:false,C2:false,D2:true,F2:false//}constchooseSeatObj=ref({});
  • 所需E币: 1
    时间: 2020-12-30 15:34
    大小: 938KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电知识也是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2020-9-7 17:46
    大小: 1.44MB
    上传者: stanleylo2001
    第23章MySQL及其工具下载安装