关于springboot:Spring-cloud-微服务组件-mica-210GA-发布swagger-添加-oauth2-认证配置

一、mica(云母)mica 由如梦技术外部的 lutool(撸秃) 演变而来。lutool 诞生于 2017 年,受 jhipster 启发逐步形成一个微服务的外围集。 因 lutool 名称与性能不太合乎,故在2019年开源时将其改名为 mica(云母),寓意为云服务的基石。 二、mica 2.x外围依赖mica 基于 java 8,没有历史包袱,反对传统 Servlet 和 Reactive(webflux)。采纳 mica-auto 主动生成 spring.factories 和 spring-devtools.properties 配置,仅依赖 Spring boot、Spring cloud 全家桶,无第三方依赖。市面上鲜有的微服务外围组件。 依赖版本Spring Boot2.3.x三、更新阐明(累积更新)v2.1.0-GA - 2020-12-13✨ mica-bom 增加 mica-weixin。✨ mica-redis 增加 redis key 生效事件配置。✨ mica-swagger 增加 SwaggerCustomizer,用于自定义配置。✨ mica-swagger 增加 oauth2 认证配置。✨ mica-http 增加流上传,欠缺文档。✨ mica-core 增加 GeoUtil。✨ mica-core StringUtil 优化 format 办法参数泛型。✨ mica-core JsonUtil 增加参数化类型 getParametricType 办法。⬆️ 降级 knife4j 到 3.0.2。⬆️ 降级 druid 到 1.2.3。⬆️ 降级 spring boot 到 2.3.7.RELEASE。v2.0.9-GA - 2020-11-15✨ mica-xss 可自定义 XssCleaner 接口。✨ mica-xss 日志对立调整为 debug。✨ mica-xss 默认拦挡 /** #I24753 。✨ mica-ip2region 更新 db 文件。✨ mica-redis 优化 redis scan。✨ mica-redis 增加强制依赖 commons-pool2。✨ mica-bom 增加 druid 到 bom。✨ mica-core 欠缺 ReflectUtil。⬆️ 降级 spring cloud 到 Hoxton.SR9。⬆️ 降级 spring boot 到 2.3.6.RELEASE四、应用4.1 示例 redis key 超时事件(监听)mica: redis: key-expired-event: enable: true@Async@EventListener(RedisKeyExpiredEvent.class)public void redisKeyExpiredEvent(RedisKeyExpiredEvent<Object> event) { String redisKey = new String(event.getId()); System.out.println(redisKey);}4.2 示例 Swagger Oauth2 配置mica: swagger: oauth2: enabled: true client-id-name: client_id client-secret-name: client_secret authorize-url: token-url: 五、mica生态mica-auto (Spring boot starter 利器): https://gitee.com/596392912/mica-automica-weixin(jfinal weixin 的 spring boot starter):https://gitee.com/596392912/mica-weixinmica-mqtt(基于 t-io 实现的 mqtt组件):https://gitee.com/596392912/mica-mqttSpring cloud 微服务 http2 计划(h2c): https://gitee.com/596392912/spring-cloud-java11六、文档mica 源码 Gitee(码云):https://gitee.com/596392912/micamica 源码 Github:https://github.com/lets-mica文档地址(官网):http://wiki.dreamlu.net文档地址(语雀-可关注订阅):https://www.yuque.com/dreamlu示例我的项目:https://github.com/lets-mica/mica-example

December 14, 2020 · 1 min · jiezi

关于springboot:后台管理系统Shiro权限控制

Shiro平安框架简介Shiro概述Shiro是apache旗下一个开源平安框架(http://shiro.apache.org/),它将软件系统的平安认证相干的性能抽取进去,实现用户身份认证,权限受权、加密、会话治理等性能,组成了一个通用的平安认证框架。应用shiro就能够十分疾速的实现认证、受权等性能的开发,升高零碎老本。 用户在进行资源拜访时,要求零碎要对用户进行权限管制,其具体流程如图所示: Shiro概要架构在概念层面,Shiro 架构蕴含三个次要的理念,如图所示: 其中: Subject :主体对象,负责提交用户认证和受权信息。SecurityManager:平安管理器,负责认证,受权等业务实现。Realm:畛域对象,负责从数据层获取业务数据。Shiro具体架构Shiro框架进行权限治理时,要波及到的一些外围对象,次要包含:认证治理对象,受权治理对象,会话治理对象,缓存治理对象,加密治理对象以及Realm治理对象(畛域对象:负责解决认证和受权畛域的数据访问题)等,其具体架构如图-3所示: 其中: Subject(主体):与软件交互的一个特定的实体(用户、第三方服务等)。SecurityManager(平安管理器) :Shiro 的外围,用来协调治理组件工作。Authenticator(认证管理器):负责执行认证操作。Authorizer(受权管理器):负责受权检测。SessionManager(会话治理):负责创立并治理用户 Session 生命周期,提供一个强有力的 Session 体验。SessionDAO:代表 SessionManager 执行 Session 长久(CRUD)动作,它容许任何存储的数据挂接到 session 治理根底上。CacheManager(缓存管理器):提供创立缓存实例和治理缓存生命周期的性能。Cryptography(加密管理器):提供了加密形式的设计及治理。Realms(畛域对象):是shiro和你的应用程序平安数据之间的桥梁。Shiro框架认证拦挡实现(filter)Shiro根本环境配置增加shiro依赖应用spring整合shiro时,须要在pom.xml中增加如下依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.3</version></dependency>Shiro外围对象配置基于SpringBoot 实现的我的项目中,咱们的shiro利用根本配置如下:。 第一步:创立SpringShiroConfig类。要害代码如下: package com.cy.pj.common.config; /**@Configuration 注解形容的类为一个配置对象, * 此对象也会交给spring治理 */ @Configuration public class SpringShiroConfig {}第二步:在Shiro配置类中增加SecurityManager配置(这里肯定要应用org.apache.shiro.mgt.SecurityManager这个接口对象),要害代码如下: @Beanpublic SecurityManager securityManager() { DefaultWebSecurityManager sManager= new DefaultWebSecurityManager(); return sManager;}第三步: 在Shiro配置类中增加ShiroFilterFactoryBean对象的配置。通过此对象设置资源匿名拜访、认证拜访。要害代码如下: 其配置过程中,对象关系如下图所示: Shiro登陆页面出现服务端Controller实现业务形容及设计实现当服务端拦挡到用户申请当前,断定此申请是否曾经被认证,如果没有认证应该先跳转到登录页面。 要害代码剖析及实现.第一步:在PageController中增加一个出现登录页面的办法,要害代码如下: @RequestMapping("doLoginUI")public String doLoginUI(){ return "login";}第二步:批改SpringShiroConfig类中shiroFilterFactorybean的配置,增加登陆url的设置。要害代码见sfBean.setLoginUrl("/doLoginUI")局部。 @Beanpublic ShiroFilterFactoryBean shiroFilterFactory ( SecurityManager securityManager) { ShiroFilterFactoryBean sfBean= new ShiroFilterFactoryBean(); sfBean.setSecurityManager(securityManager); sfBean.setLoginUrl("/doLoginUI"); //定义map指定申请过滤规定(哪些资源容许匿名拜访,哪些必须认证拜访) LinkedHashMap<String,String> map= new LinkedHashMap<>(); //动态资源容许匿名拜访:"anon" map.put("/bower_components/**","anon"); map.put("/modules/**","anon"); map.put("/dist/**","anon"); map.put("/plugins/**","anon"); //除了匿名拜访的资源,其它都要认证("authc")后拜访 map.put("/**","authc"); sfBean.setFilterChainDefinitionMap(map); return sfBean;}客户端页面实现业务形容及设计实现。在/templates/pages/增加一个login.html页面,而后将我的项目部署到web服务器,并启动测试运行. ...

December 14, 2020 · 4 min · jiezi

关于springboot:已开源在githubspring-boot开发一个社区论坛博客有详细部署教程

forum-javaspring boot框架开发的社区:开发者客栈 简介forum-java 是一个开源的现代化社区平台,它实现了: 面向内容探讨的论坛;面向常识问答的社区;100% 开源;为什么要做这个我的项目?有一些企业在做开放平台畛域,就须要一个开发者社区的网站供开发者学习交换(本我的项目参考了微信开放平台、头条开发者社区、有赞云开发者社区、淘宝开放平台等社区性能为需要背景开发);PHP语言较多,Java的很少,目前spring boot开源的更是简直没有,无奈很好的接入公司外部零碎;很多社区性能过于简略,无奈满足大部分需要;界面风格老式,没有跟上时代倒退的审美;不足理论经营需要的性能,治理性能过于简略;性能列表用户端 文章分类 筛选文章 标签 查看详情 筛选文章/问答 文章 写文章 编辑 删除 评论 点赞 查看详情 问答 提问题 编辑 删除 查看详情 评论 关注 设置评论为最佳答案 筛选已解决问题 筛选未解决问题 用户 查看详情 编辑个人资料 更新登录明码 关注好友 查看粉丝 音讯 文章/问答被关注告诉 文章/问答被评论告诉 集体被关注告诉 设置音讯为已读 关注 关注的用户文章/问答 关注的问答 评论的问答 点赞的文章 评论的文章 搜寻 依据文章/问答题目/内容含糊搜寻 治理端 用户治理 禁用/启用 设置为管理员/勾销管理员 操作日志 操作类别筛选 文章治理 设置为官网 设置为置顶 设置为加精 审核通过(可见) 审核不过(不可见) 文章类别治理 审核通过(可见) 审核不过(不可见) 新增分类 问答治理 审核通过(可见) 审核不过(不可见) 标签治理 审核通过(可见) 审核不过(不可见) 新增标签 ...

December 13, 2020 · 1 min · jiezi

关于springboot:SpringBoot-DB系列Jooq批量写入采坑记录

【SpringBoot DB系列】Jooq批量写入采坑记录后面介绍了jooq的三种批量插入方式,后果最近发现这外面竟然还有一个深坑,我认为的批量插入竟然不是一次插入多条数据,而是一条一条的插入...,这就有点尬了 <!-- more --> 1. 三种插入姿态对于我的项目创立以及jooq的相干应用姿态,举荐查看之前的博文: 【DB系列】Jooq之新增记录应用姿态 上面是咱们采纳的三种批量插入方式 /** * 通过Record执行批量增加 * * 通过源码查看,这种插入方式实际上是单条单条的写入数据,和上面的一次插入多条有本质区别 * * @param list * @return */public boolean batchSave(List<PoetBO> list) { List<PoetPO> poList = list.stream().map(this::bo2po).collect(Collectors.toList()); int[] ans = dsl.batchInsert(poList).execute(); System.out.println(JSON.toJSONString(ans)); return true;}/** * 类sql写法,批量增加 * * @param list * @return */public boolean batchSave2(List<PoetBO> list) { InsertValuesStep2<PoetPO, Integer, String> step = dsl.insertInto(table).columns(table.ID, table.NAME); for (PoetBO bo : list) { step.values(bo.getId(), bo.getName()); } return step.execute() > 0;}/** * 不基于主动生成的代码,来批量增加数据 * * @param list * @return */public boolean batchSave3(List<PoetBO> list) { InsertQuery insertQuery = dsl.insertQuery(DSL.table("poet")); for (PoetBO bo : list) { insertQuery.addValue(DSL.field("id", Integer.class), bo.getId()); insertQuery.addValue(DSL.field("name", String.class), bo.getName()); insertQuery.newRecord(); } return insertQuery.execute() > 0;}请留神下面的三种批量插入方式,基本上对应的就是jooq的三种常见的用法 ...

December 13, 2020 · 2 min · jiezi

关于springboot:后台管理系统角色管理模块

1 角色治理设计说明1.1 业务设计说明本模块次要实现的是企业外部角色(岗位)的治理,能够在增加角色时,为角色分配资源拜访权限,最初将角色再调配给用户,图所示: 基于对表的设计,其数据逻辑关系的展现,如图所示: 角色表设计脚本如下: CREATE TABLE `sys_roles` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL COMMENT '角色名称', `note` varchar(500) DEFAULT NULL COMMENT '备注', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT='角色';菜单与角色的关系表脚本设计如下: CREATE TABLE `sys_role_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) DEFAULT NULL COMMENT '角色ID', `menu_id` int(11) DEFAULT NULL COMMENT 'ID', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系';用户与角色关系表设计脚本如下: ...

December 12, 2020 · 8 min · jiezi

关于springboot:京淘day15实现用户数据校验

1.实现用户数据校验1.1 创立单点登录零碎1.1.1 创立我的项目 1.1.2 增加继承/依赖/插件<parent> <artifactId>jt</artifactId> <groupId>com.jt</groupId> <version>1.0-SNAPSHOT</version> </parent> <!--增加jar包文件依赖--> <dependencies> <dependency> <groupId>com.jt</groupId> <artifactId>jt-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <!--所有业务零碎,必须增加build标签--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>` 1.1.3 实现jt-sso我的项目创立 1.1.4 实现反向代理1).批改hosts文件2). 编辑nginx.conf文件 1.1.5 测试成果展示 1.2 用户数据校验1.2.1 业务阐明阐明:当用户输出内容之后,当鼠标离焦时,应该发动Ajax申请去后端服务器JT-SSO校验数据是否存在. 如果数据存在应该提醒用户,如果数据不存在则告知用户该数据能够应用. 1.2.2 页面剖析 1.2.3 业务接口文档阐明蕴含的内容:1).业务场景,业务功能属性等…2).业务端调用的细节. web-sso3).明确申请门路 url地址4).明确申请的参数信息 几个 类型 作用5).明确返回值后果 void xxxx 属性 对象注意事项:你认为的不肯定是你认为的… 当需要不明确时 弄清业务之后在入手… 1.2.4 页面JS剖析1).定位哪些是写死的局部 http://sso.jt.com/user/check/2).检索所有的代码 搜寻须要的内容 1.2.5 编辑JT-SSO UserControllerpackage com.jt.controller;import com.fasterxml.jackson.databind.util.JSONPObject;import com.jt.service.UserService;import com.jt.vo.SysResult;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/user")public class UserController { @Autowired private UserService userService; @RequestMapping("/getMsg") public String getMsg(){ return "单点登录零碎测试实现"; } /** * JSONP * 实现用户数据校验 * url:http://sso.jt.com/user/check/{param}/{type} * 参数: /{param} 用户须要校验的数据 * /{type} 校验的字段. * 返回值: SysResult对象(true/false) */ @RequestMapping("/check/{param}/{type}") public JSONPObject checkUser(@PathVariable String param,@PathVariable Integer type,String callback){ //查询数据库获取响应信息. boolean flag = userService.checkUser(param,type); SysResult sysResult = SysResult.success(flag); return new JSONPObject(callback, sysResult); //callback(JSON构造) }}1.2.6 编辑JT-SSO UserServicepackage com.jt.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.jt.mapper.UserMapper;import com.jt.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.Map;@Servicepublic class UserServiceImpl implements UserService{ //校验type为几 private static Map<Integer,String> paramMap = new HashMap<>(); static { paramMap.put(1,"username"); paramMap.put(2,"phone"); paramMap.put(3,"email"); } @Autowired private UserMapper userMapper; /** * 依据用户传递的参数,获取数据库记录 * @param param * @param type * @return */ @Override public boolean checkUser(String param, Integer type) { String column = paramMap.get(type); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq(column,param); int count = userMapper.selectCount(queryWrapper); //return count>0?true:false; return count>0; }}1.2.7 页面成果展示 ...

December 12, 2020 · 3 min · jiezi

关于springboot:后台管理系统菜单管理模块

1 菜单治理页面设计1.1 业务设计菜单治理又称为资源管理,是系统资源对外的表现形式。本模块次要是实现对菜单进行增加、批改、查问、删除等操作。 CREATE TABLE `sys_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '资源名称', `url` varchar(200) DEFAULT NULL COMMENT '资源URL', `type` int(11) DEFAULT NULL COMMENT '类型 1:菜单 2:按钮', `sort` int(11) DEFAULT NULL COMMENT '排序', `note` varchar(100) DEFAULT NULL COMMENT '备注', `parentId` int(11) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', `permission` varchar(500) DEFAULT NULL COMMENT '受权(如:sys:user:create)', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='资源管理';菜单表与角色表是多对多的关系,在表设计时,多对多关系通常由两头表(关系表)进行保护 ...

December 12, 2020 · 8 min · jiezi

关于springboot:京淘day14京淘前台项目创建

1.京淘我的项目前后端搭建策略 2.京淘前台我的项目创立2.1 创立我的项目2.1.1 编辑项目名称 2.1.2 增加继承/依赖/插件<?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>jt-web</artifactId> <packaging>war</packaging> <parent> <artifactId>jt</artifactId> <groupId>com.jt</groupId> <version>1.0-SNAPSHOT</version> </parent> <!--增加jar包文件依赖--> <dependencies> <dependency> <groupId>com.jt</groupId> <artifactId>jt-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <!--所有业务零碎,必须增加build标签--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>2.1.3 导入课前材料阐明:将课前材料中的jt-web的src文件导入即可 2.1.4 配置工作目录 2.1.5 实现nginx域名代理编辑Nginx配置文件 # 配置前台服务器域名代理 server { listen 80; server_name www.jt.com; location / { proxy_pass http://localhost:8092; } } 2.1.6 批改hosts文件 2.1.7 对于谷歌禁用https的阐明阐明: 个别浏览器出于安全性思考,将http申请协定,主动的转化为https的协定标准.解决方案: 须要让谷歌浏览器禁用HTTPS.命令: chrome://net-internals/#hsts 2.2 开启后缀类型匹配阐明2.2.1 业务阐明阐明:当用户在拜访index.html时 会去找webapp目录下的index.html页面. 如果未来的商品信息较多,.则必然筹备多个商品的xxxx.html/.这样的工作量太大.优化: 拦挡用户的申请,转向到指定的模板页面中,之后实现数据的填充. ...

December 11, 2020 · 2 min · jiezi

关于springboot:Spring-和-SpringBoot-最核心的-3-大区别详解

作者:乐傻驴uee.me/cNDC8 概述对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我过后也是一头雾水,随着教训的积攒、我缓缓了解了这两个框架到底有什么区别,置信对于用了 SpringBoot很久的同学来说,还不是很了解 SpringBoot到底和 Spring有什么区别,看完文章中的比拟,或者你有了不同的答案和认识! 什么是Spring作为 Java开发人员,大家都 Spring都不生疏,简而言之, Spring框架为开发 Java应用程序提供了全面的基础架构反对。它蕴含一些很好的性能,如依赖注入和开箱即用的模块,如:  SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest,这些模块缩短应用程序的开发工夫,进步了利用开发的效率例如,在 JavaWeb开发的晚期阶段,咱们须要编写大量的代码来将记录插入到数据库中。然而通过应用 SpringJDBC模块的 JDBCTemplate,咱们能够将操作简化为几行代码。 什么是Spring BootSpringBoot基本上是 Spring框架的扩大,它打消了设置 Spring应用程序所需的 XML配置,为更快,更高效的开发生态系统铺平了路线。 SpringBoot中的一些特色: 1、创立独立的 Spring利用。2、嵌入式 Tomcat、 Jetty、 Undertow容器(无需部署war文件)。3、提供的 starters 简化构建配置4、尽可能主动配置 spring利用。5、提供生产指标,例如指标、强壮检查和内部化配置6、齐全没有代码生成和 XML配置要求 从配置剖析Maven依赖首先,让咱们看一下应用Spring创立Web应用程序所需的最小依赖项 <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.0.RELEASE</version></dependency>与Spring不同,Spring Boot只须要一个依赖项来启动和运行Web应用程序: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.6.RELEASE</version></dependency>在进行构建期间,所有其余依赖项将主动增加到我的项目中。 另一个很好的例子就是测试库。咱们通常应用 SpringTest, JUnit, Hamcrest和Mockito库。在 Spring我的项目中,咱们应该将所有这些库增加为依赖项。然而在 SpringBoot中,咱们只须要增加 spring-boot-starter-test依赖项来主动蕴含这些库。 Spring Boot为不同的Spring模块提供了许多依赖项。一些最罕用的是: spring-boot-starter-data-jpa`spring-boot-starter-securityspring-boot-starter-testspring-boot-starter-web`spring-boot-starter-thymeleaf 无关 starter的残缺列表,请查看Spring文档。 MVC配置让咱们来看一下 Spring和 SpringBoot创立 JSPWeb应用程序所需的配置。 Spring须要定义调度程序 servlet,映射和其余反对配置。咱们能够应用 web.xml文件或 Initializer类来实现此操作: public class MyWebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext container) {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.setConfigLocation("com.pingfangushi");container.addListener(new ContextLoaderListener(context));ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}}还须要将 @EnableWebMvc正文增加到 @Configuration类,并定义一个视图解析器来解析从控制器返回的视图: ...

December 11, 2020 · 2 min · jiezi

关于springboot:万人血书经典实战SpringBootRabbitMQ系列

前言Spring AMQP 我的项目是利用了spring的外围概念到AMQP协定音讯解决方案中。咱们提供了一个“template”作为更高级别的形象去发送和接管音讯。我也提供了音讯驱动类的反对。应用依赖注入和申明式编程能够更好的治理AMQP源代码。此我的项目中你能够看到和SpringFramework中JMS一些类似的中央。 RabbitMQ简介1.音讯队列是应用程序和应用程序之间的一种通信办法。 2.RabbitMQ : erlang语言开发、 基于AMQP协定。 3.同类产品:ActiveMQ、 ZeroMQ、 RabbitMQ、 RocketMQ、 Kafka。 4.物理模型 5.Broker 音讯队列服务过程、 Exchange音讯队列交换机,Queue 音讯队列、 Producer 音讯生产者、 Consumer 音讯消费者。 6.六种模式: 简略模式、 工作模式、 公布与订阅模式、 路由模式、通配符模式、 近程调用模式(根本不会用到)。 7.关键词:{Broker: 服务器实体、 Exchange :音讯交换机、 Queue: 音讯队列载体、Binding: 绑定 、Routing Key: 路由关键字、 VHost: 虚拟主机、Producer: 音讯生产者 、 Consumer: 音讯消费者、Channel: 音讯通道 } 8.要害概念:由Exchange、Queue、RoutingKey三个能力决定一个从Exchange到Queue的惟一的线路。 RabbitMQ五大模式实战此次是基于SpringBoot开发的RabbitMQ应用程序,利用SpringBoot的主动配置和起步依赖会让你更快更不便的构建我的项目。让咱们实战开始。 筹备阶段启动一台RabbitMQ服务器此次应用的是SpringBoot我的项目利用的pom依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</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> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency></dependencies><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build> 123456789101112131415161718192021222324252627282930313233343536373839404142434445配置application.yml文件spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guestserver: port: 8082启动类和目录构造是SpringBoot惯例设置,这里不再赘述。留神:启动类名设置为RabbitmqProducerApplication简略模式简略模式配置文件@Configurationpublic class RabbitSimpleConfig { @Bean public Queue simpleQueue(){ return new Queue("simpleQueue"); }}简略模式生产者局部@SpringBootTest(classes = RabbitmqProducerApplication.class)public class ProducerTest { @Autowired RabbitTemplate rabbitTemplate; @Test public void simpleProduct(){ for (int num = 0; num < 20; num++) { rabbitTemplate.convertAndSend("simpleQueue", "简略模式"+num); } }}简略模式消费者局部@Componentpublic class MessageListener { @RabbitListener(queues = "simpleQueue") public void simpleListener(String message){ System.out.println("简略模式监听器:"+message); } }工作模式工作模式配置文件@Bean public Queue workQueue(){ return new Queue("workQueue"); }工作模式生产者局部@Testpublic void workProduct(){ for (int num = 0; num < 20; num++) { rabbitTemplate.convertAndSend("workQueue", "工作模式"+num); }}工作模式消费者局部 @RabbitListener(queues = "workQueue") public void workListener1(String message) { System.out.println("工作模式监听器1:" + message); } @RabbitListener(queues = "workQueue") public void workListener2(String message) { System.out.println("工作模式监听器2:" + message); }公布订阅模式公布订阅模式配置文件//配置交换器@Beanpublic FanoutExchange fanoutExchange() { return new FanoutExchange("fanoutExchange");}//配置队列@Beanpublic Queue fanoutQueue1() { return new Queue("fanoutQueue1", true, false, false, null);}@Beanpublic Queue fanoutQueue2() { return new Queue("fanoutQueue2", true, false, false, null);}//配置绑定@Beanpublic Binding fanoutBinding1(FanoutExchange fanoutExchange, Queue fanoutQueue1) { return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}@Beanpublic Binding fanoutBinding2(FanoutExchange fanoutExchange, Queue fanoutQueue2) { return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}公布订阅模式生产者局部@Testpublic void FanoutProduct(){ for (int num = 0; num < 10; num++) { rabbitTemplate.convertAndSend("fanoutExchange","","公布订阅模式"+num); }}公布订阅模式消费者局部@RabbitListener(queues = "fanoutQueue1")public void fanoutListener1(String message) { System.out.println("公布订阅监听器1:" + message);}@RabbitListener(queues = "fanoutQueue2")public void fanoutListener2(String message) { System.out.println("公布订阅监听器2:" + message);}路由模式路由模式配置文件//配置交换机@Beanpublic DirectExchange directExchange() { return new DirectExchange("directExchange");}//配置队列@Beanpublic Queue directQueue1() { return new Queue("directQueue1", true, false, false, null);}@Beanpublic Queue directQueue2() { return new Queue("directQueue2", true, false, false, null);}//配置绑定@Beanpublic Binding directBinding1(Queue directQueue1, DirectExchange directExchange) { return BindingBuilder.bind(directQueue1).to(directExchange).with("one");}@Beanpublic Binding directBinding2(Queue directQueue2, DirectExchange directExchange) { return BindingBuilder.bind(directQueue2).to(directExchange).with("two");}路由模式生产者局部@Testpublic void directProduct1() { for (int num = 0; num < 5; num++) { rabbitTemplate.convertAndSend("directExchange","one", "发送到路由队列1音讯"+num); }}@Testpublic void directProduct2() { for (int num = 0; num < 5; num++) { rabbitTemplate.convertAndSend("directExchange","two", "发送到路由队列2音讯"+num); }}路由模式消费者局部@RabbitListener(queues = "directQueue1")public void fanoutListener1(String message) { System.out.println("路由模式监听器1:" + message);}@RabbitListener(queues = "directQueue2")public void fanoutListener2(String message) { System.out.println("路由模式监听器2:" + message);}通配符模式通配符模式配置文件//配置队列@Beanpublic Queue topicQueue1() { return new Queue("topicQueue1");}@Beanpublic Queue topicQueue2() { return new Queue("topicQueue2");}//配置交换器@Beanpublic TopicExchange topicExchange() { return new TopicExchange("topicExchange");}//配置绑定@Beanpublic Binding topicBinding1(Queue topicQueue1, TopicExchange topicExchange) { return BindingBuilder.bind(topicQueue1).to(topicExchange).with("topic.*");}@Beanpublic Binding topicBinding2(Queue topicQueue2, TopicExchange topicExchange) { return BindingBuilder.bind(topicQueue2).to(topicExchange).with("topic.#");}通配符模式生产者局部/* * 通配符模式测试 * */@Testpublic void topicProduct() { rabbitTemplate.convertAndSend("topicExchange","topic.one", "routkey为topic.one的音讯"); rabbitTemplate.convertAndSend("topicExchange","topic.one.two", "routkey为topic.one.two的音讯");}通配符模式消费者局部@RabbitListener(queues = "topicQueue1")public void fanoutListener1(String message) { System.out.println("通配符监听器1:" + message);}@RabbitListener(queues = "topicQueue2")public void fanoutListener2(String message) { System.out.println("通配符监听器2:" + message);}总结以上就是SpringBoot+RabbitMQ五大模式的简略应用实例,到目前为止RabbitMQ也是Sping AMQP的惟一实现。下一节将会解说RabbitMQ可视化治理界面,可视化治理界面帮忙咱们能够直观地看到RabbitMQ服务器的运行状况。如果你感觉文章对你有帮忙,欢送关注,谢谢。 ...

December 10, 2020 · 3 min · jiezi

关于springboot:京淘day13Redis分片机制和哨兵

一、Redis分片机制阐明1.一致性hash算法1.1 一致性Hash算法介绍一致性哈希算法在1997年由麻省理工学院提出,是一种非凡的哈希算法,目标是解决分布式缓存的问题。 [1] 在移除或者增加一个服务器时,可能尽可能小地扭转已存在的服务申请与解决申请服务器之间的映射关系。一致性哈希解决了简略哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动静伸缩等问题 [2] 。 1.2 一致性Hash原理阐明常识:1).对雷同的数据hash失去的后果雷同2).常见hash值 8位16进制数 2^32种可能性 1.3 平衡性阐明阐明: 平衡性是指hash的后果应该平均分配到各个节点,这样从算法上解决了负载平衡问题 .如果发现数据分布不平均,则采纳虚构节点的形式,实现数据的均衡. 如果一次均衡不能达到目标则屡次生成虚构节点.然而数据均衡没有方法做到相对的均匀. 1.4 枯燥性阐明枯燥性是指在新增或者删减节点时,不影响零碎失常运行如果新增或者删除节点,则尽可能不要扭转原有的数据结构. 1.5 分散性分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份),不用每个节点都存储所有的数据鸡蛋不要放到一个篮子里. 二、redis分片机制配置1. redis性能优化阐明: 单台redis内存容量是无限的.然而如果有海量的数据要求实现缓存存储,则应该应用多个Redis节点. 2. Redis分片机制定义 3. 配置布局阐明: 筹备3台redis服务器 别离为 6379/6380/6381 3.1 筹备3个配置文件批改各自端口号 改为6380 6381 3.2 启动redis服务器 3.3 查看redis启动状态 3.4 redis分片入门案例 4. Redis分片机制配置阐明:依据redis节点个数.拼接字符串 #配置单台redis#redis.host=192.168.126.129#redis.port=6379#配置redis分片机制redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381` 4.1 编辑RedisConfig配置类@Configuration //标识我是一个配置类 个别与@Bean注解联用@PropertySource("classpath:/properties/redis.properties")public class RedisConfig { @Value("${redis.nodes}") private String nodes; //node,node,node @Bean public ShardedJedis shardedJedis(){ List<JedisShardInfo> shards = new ArrayList<>(); String[] nodeArray = nodes.split(","); for( String node :nodeArray){ //node=host:port String host = node.split(":")[0]; int port = Integer.parseInt(node.split(":")[1]); JedisShardInfo info = new JedisShardInfo(host,port); shards.add(info); } return new ShardedJedis(shards); } }4.2 批改CacheAOP中的注入 ...

December 10, 2020 · 3 min · jiezi

关于springboot:如何理解-Spring-Boot技术

Spring Boot 背景剖析JAVAEE利用体系中沉重的配置、低下的开发效率、高难度的三方集成,简单的部署流程等等始终被开发人员所诟病。即便是应用Spring这样的轻量级的资源整合框架,在实现其绝对比拟多的资源整合时,仍旧须要大量的手动依赖治理,简单的XML配置(还常常没有提醒)。还有就是当初的软件生态利用也曾经造成肯定的规模,零碎架构正在从单体架构,分布式架构,逾越到微服务架构。随着整个架构体系的变动,企业对技术的要求也在变动,当初的企业更重视技术的开箱即用,更重视技术在生态圈中的深度交融,更重视轻量级的运维。由此由此spring boot诞生。 Spring Boot 要解决什么问题Spring Boot是由Pivotal团队提供的全新的Java软件开发框架(很多人当初把它了解为一个脚手架),其设计目标是用来简化Spring我的项目的初始搭建以及开发过程。该框架应用了特定的注解形式来进行配置,从而使开发人员不再须要大量的xml配置。不再须要大量的手动依赖治理。Spring Boot基于疾速构建理念,通过约定大于配置,开箱即用的形式,心愿可能在蓬勃发展的疾速利用开发畛域成为其领导者。 Spring Boot 有哪些外围的要害个性起步依赖(Starter Dependency)。主动配置(Auto Configuration)。健康检查(Actator)-监控。嵌入式服务(Tomcat,Jetty)。总结(Summary)总之,Spring Boot 框架就是要基于疾速构建理念,基于约定大于配置形式,实现技术的开箱即用,以进步开发效率。

December 10, 2020 · 1 min · jiezi

关于springboot:京淘day12AOP实现redis缓存

1. AOP实现redis缓存1.1 AOP作用利用AOP能够实现对办法(性能)的扩大.实现代码的解耦.2.2 切面组成因素切面 = 切入点表达式 + 告诉办法 1.2 切入点表达式1).bean(bean的ID) 拦挡bean的所有的办法 具体的某个类 粗粒度的.2).within(包名.类名) 扫描某个包下的某个类 com.jt.* 粗粒度的.3).execution(返回值类型 包名.类名.办法名(参数列表)) 细粒度的4).@annotation(包名.注解名) 细粒度的 1.3 告诉办法阐明: 告诉相互之间没有程序可言. 每个告诉办法都实现特定的性能,切记AOP的告诉办法与指标办法之间的程序即可.1).before 指标办法执行前2).afterReturning 指标办法执行后3).afterThrowing 指标办法执行抛出异样时执行.4).after 不论什么状况,最初都要执行的.上述四大告诉类型,个别用来记录程序的运行状态的.(监控机制)5).around 指标办法执行前后都要执行.如果要对程序的运行轨迹产生影响,则首选around. 1.4 AOP入门案例@Aspect //标识我是一个切面@Component //将对象交给spring容器治理 cacheAOPpublic class CacheAOP { //切面 = 切入点表达式 + 告诉办法 //表达式1: bean(itemCatServiceImpl) ItemCatServiceImpl类 //@Pointcut("bean(itemCatServiceImpl)") //@Pointcut("within(com.jt.service.*)") // .* 一级包下的类 ..* 所有子孙后代的包和类 //返回值类型任意, com.jt.service包下的所有类的add办法参数类型任意类型 //写参数类型时留神类型的大小写 @Pointcut("execution(* com.jt.service..*.*(..))") public void pointcut(){ } /** * * joinPoint代表连接点对象,个别实用于前四大告诉类型(除around之外的) * 客人 路人 */ @Before("pointcut()") public void before(JoinPoint joinPoint){ //1.获取指标对象 Object target = joinPoint.getTarget(); System.out.println(target); //2.获取指标对象的门路 包名.类名.办法名 String className = joinPoint.getSignature().getDeclaringTypeName(); String methodName = joinPoint.getSignature().getName(); System.out.println("指标办法的门路:"+(className+"."+methodName)); //3.获取参数类型 System.out.println(Arrays.toString(joinPoint.getArgs())); } @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint){ System.out.println("盘绕告诉执行"); Object data = null; try { data = joinPoint.proceed(); //执行指标办法 } catch (Throwable throwable) { throwable.printStackTrace(); } return data; }}1.5 业务需要须要通过自定义注解的模式动静实现缓存操作.通过注解获取其中的key.超时工夫. ...

December 10, 2020 · 2 min · jiezi

关于springboot:07SpringBootMyBatisSpring-技术整合实现商品品牌模块的CRUD操作

业务形容需要形容任何一个电商零碎中都有一个商品子系统,而与商品相关联都会有一个品牌信息管理,在以后业务零碎设计中咱们就是要对商品品牌信息的治理进行设计和实现. 业务架构剖析在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 业务根本原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 品牌列表页面 品牌编辑页面 我的项目技术架构剖析及设计在品牌治理模块实现过程,咱们采纳典型的C/S架构进行实现.客户端咱们基于浏览器进行实现,服务端采纳tomcat,数据库应用MySQL.具体应用层基于MVC分层架构进行实现. 我的项目技术栈利用剖析及选型客户端技术:html,css,javascript,bootstrap服务端技术:hikaricp,mybatis,spring,springboot,thymeleaf数据库技术:mysql,sql开发工具集:jdk1.8,maven3.6.3,idea2020.2我的项目品牌模块外围API剖析与设计基于分层架构设计思维,现对品牌API进行设计,如图所示: 数据库及表的剖析与设计设计并创立数据库如果数据库已存在,则先删除数据库,代码如下: drop database if exists dbbrand;创立新的数据库,代码如下: create database dbbrand default character set utf8;设计并创立品牌(Brand)表关上数据库,语句如下: use dbbrand;在dbbrand数据库中创立品牌表. create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;基于SQL脚本执行数据库初始化将数据库设计脚本写到brand.sql中,而后按如下步骤执行: 关上mysql自带客户端,登录mysql,指令如下: mysql -uroot -proot设置客户端编码,指令如下: set names utf8;执行sql脚本,指令如下: source d:/brand.sql脚本执行胜利当前,在客户端查问数据之前,先执行如下语句: set names gbk;我的项目环境初始化筹备操作1)JDK 1.82)Maven 3.6.33)IDEA 2020.24)MySQL 5.7+ 创立我的项目Module关上idea,而后基于设计,创立我的项目module,如图所示: 增加我的项目Module依赖MySQL 驱动<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>Srping Jdbc 提供了HikariCP连接池<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>MyBatis 资源<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>Spring Web 依赖 (内置一个tomcat服务)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖 (html模板引擎)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>我的项目Module根底配置关上我的项目Module配置文件application.properties,并增加如下内容: ...

December 9, 2020 · 4 min · jiezi

关于springboot:Spring-与自定义注解外部配置化的结合使用

Spring 与自定义注解、内部配置化的联合应用一、Java注解的简略介绍注解,也叫Annotation、标注,是 Java 5 带来的新个性。 可应用范畴类、字段、办法、参数、构造函数、包等,具体可参阅枚举类 java.lang.annotation.ElementType 生命周期(摘自 刘大飞的博客 ) RetentionPolicy.SOURCE 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃RetentionPolicy.CLASS 注解被保留到class文件,但 jvm 加载class文件时候被遗弃,这是默认的生命周期RetentionPolicy.RUNTIME 注解不仅被保留到class文件中,jvm 加载class文件之后,依然存在应用形式能够应用反射获取注解的内容,具体如何应用请本人百度,可参考这篇Java注解齐全解析,这里不是重点,不多做介绍 二、Spring的 @Import注解@Import 注解是Spring用来注入 Spring Bean 的一种形式,能够用来润饰别的注解,也能够间接在Springboot配置类上应用。 它只有一个value属性须要设置,来看一下源码 public @interface Import { Class<?>[] value();}这里的 value属性只承受三种类型的Class: 被@Configuration 润饰的配置类接口org.springframework.context.annotation.ImportBeanDefinitionRegistrar的实现类接口org.springframework.context.annotation.ImportSelector的实现类上面针对三种类型的Class别离做简略介绍,两头交叉自定义注解与内部配置的联合应用形式。 三、被@Configuration 润饰的配置类像 Springboot 中的配置类一样失常应用,须要留神的是,如果该类的包门路已在Springboot启动类上配置的扫描门路下,则不须要再从新应用@Import导入了,因为@Import的目标是注入bean,然而Springboot启动类主动扫描曾经能够注入你想通过@Import导入的bean了。 这种Class能够进行如下拓展 继承各种Aware接口, 获取对应的信息(如果不分明Aware接口在Spring当中的作用,请自行百度),如,继承EnviromentAware,能够拿到Spring的环境配置信息,进而从中拿到 @Value所须要的值,如 environment.getProperty("user.username")应用@Autowire、@Resource、@Value注入各种所需Spring 资源像一般Spring Bean 一样应用该类更多应用形式,请自行百度。 四、接口org.springframework.context.annotation.ImportBeanDefinitionRegistrar的实现类当@Import润饰自定义注解时候,通常会导入这品种。 来看一下接口定义 public interface ImportBeanDefinitionRegistrar { default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) { registerBeanDefinitions(importingClassMetadata, registry); } /** * importingClassMetadata 被@Import润饰的自定义注解的元信息,能够取得属性汇合 * registry Spring bean注册核心 **/ default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { }通过这种形式,咱们能够依据自定义注解配置的属性值来注入Spring Bean 信息。 ...

December 9, 2020 · 2 min · jiezi

关于springboot:京淘day11Redis缓存

1.系统优化策略阐明:引入缓存机制能够无效的升高用户拜访物理设施的频次,从而进步响应速度. 2.如何设计缓存1.缓存数据如何存储? 应该采纳什么样的数据结构呢? K-V key的唯一性2.缓存数据的容量大小 应该动静保护缓存数据,将不须要的数据提前删除. LRU算法/LFU算法/随机算法/TTL算法3.缓存数据保留到内存中,然而内存的特点断电即擦除. 定期将内存数据长久化(写入磁盘中)4.单台缓存服务器性能有余,所以个别须要搭建集群(实现高可用).5.应用C语言开发. 3.Redis缓存服务3.1什么是RedisRedis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它能够用作数据库、缓存和消息中间件。 它反对多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 汇合(sets), 有序汇合(sorted sets) 与范畴查问, bitmaps, hyperloglogs 和 天文空间(geospatial) 索引半径查问。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘长久化(persistence), 并通过 Redis哨兵(Sentinel)和主动 分区(Cluster)提供高可用性(high availability)。速度: 读: 11.2万/秒 写:8.6万/秒 50万/秒 3.2上传Redis1).上传redis2).解压redis服务[root@localhost src]# tar -xvf redis-5.0.4.tar.gz3).挪动文件/批改文件名称 3.3装置Redis阐明:在Redis根目录中执行如下命令1).make2). make install 3.4 批改redis配置文件批改redis根目录下的redis.conf文件1).去除IP绑定2).批改保护模式3).开启后盾启动 4.Redis服务器命令阐明: Redis服务在运行时,必须依赖于配置文件 redis.conf. 操作redis时最好在根目录中操作1).启动redis redis-server redis.conf2).进入redis客户端 redis-cli -p 6379ctrl + c 退出客户端3).敞开redis服务器 redis-cli -p 6379 shutdown办法二:阐明: 如果操作的端口号是默认端口6379 则能够省略不写.1).启动redis ...

December 8, 2020 · 4 min · jiezi

关于springboot:03基于IDEA创建SpringBoot项目并进行入门分析

SpringBoot 我的项目创立创立Module基于IDEA创立我的项目Module,模块名为04-springboot-start,组id和包名为com.cy,如图所示:填写module信息,如图所示:抉择我的项目module版本,临时不须要本人手动增加任何依赖,如图所示:填写Module名称,实现module创立,如图所示 我的项目构造剖析我的项目Module创立好当前,其代码构造剖析,如图所示: SpringBoot 我的项目启动剖析启动入口SpringBoot 工程中由SpringBootApplication注解形容的类为启动入口类,例如: package com.cy;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {//Application.class public static void main(String[] args) {//Main Thread SpringApplication.run(Application.class, args); }}启动过程概要剖析SpringBoot工程启动时其繁难初始化过程,如图所示: 在启动过程中底层做了哪些事件,大抵形容如下:1)基于配置加载类(通过ClassLoader将指定地位的类读到内存->底层通过线程调用IO从磁盘读取到内存)。2)对类进行剖析(创立字节码对象-Class类型,通过反射获取器配置信息)。3)对于指定配置(例如由spring特定注解形容)的对象存储其配置信息(借助BeanDefinition对象存储)。4)基于BeanDefinition对象中class的配置构建类的实例(Bean对象),并进行bean对象的治理(可能会存储到bean池)。 SpringBoot 疾速入门剖析业务形容在我的项目Module中定义一个类,类名为DefaultCache,而后将此类对象交给Spring创立并治理。最初通过单元测试对类的实例进行剖析。 API设计剖析基于业务形容,进行API及关系设计,如图所示: 代码编写及运行基于业务及API设计,进行代码编写,其过程如下: 第一步:定义DefaultCache类 package com.cy.pj.common.cache;import org.springframework.stereotype.Component;/** * @Component 注解形容的类,示意此类交给Spring框架治理。 */@Componentpublic class DefaultCache {}第二步:定义DefaultCacheTests单元测试类 package com.cy.pj.common.cache;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;@SpringBootTestpublic class DefaultCacheTests { /** * @Autowired 注解形容的属性由spring框架依照肯定规定为其注入值(赋值) * 赋值过程是怎么的? * 1)依赖查找?(请问查找规定是什么?) * 2)依赖注入?(须要借助什么技术?) */ @Autowired private DefaultCache defaultCache; @Test void testDefaultCache(){ System.out.println(defaultCache.toString()); //FAQ? defaultCache变量援用的对象是由谁创立的,存储 到了哪里?bean pool }}第三步:运行单元测试类进行利用剖析启动运行单元测试办法,检测其输入后果,基于后果剖析:1)SpringBoot我的项目中Bean对象的构建。2)SpringBoot我的项目中Bean对象的获取。 ...

December 7, 2020 · 1 min · jiezi

关于springboot:SpringBootSpringMyBatisVueBootStrap

基于10-springboot-goods的批改应用vue实现CRUD,并应用bootstrap进行优化 基于10-springboot-goods我的项目进行批改第一步 创立新module,名字为10-springboot-goods-vue2.第二步 增加maven依赖并进行初步配置(拷贝即可)第三步 拷贝pojo,dao,service包中的所有接口和类.第四步 拷贝动态资源到static目录(例如vue.js,axios.min.js) vue实现第一步:创立Controller package com.cy.pj.goods.controller;import com.cy.pj.goods.pojo.Goods;import com.cy.pj.goods.service.GoodsService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestControllerpublic class GoodsController{ @Autowired private GoodsService goodsService; @RequestMapping("doFindById/{id}") public Goods doFindById(@PathVariable Integer id){ return goodsService.findById(id); } @RequestMapping("doUpdateGoods") public String doUpdateGoods(@RequestBody Goods entity){ goodsService.updateGoods(entity); return "save ok"; } @RequestMapping("doSaveGoods") public String doSaveGoods(@RequestBody Goods entity){ goodsService.saveGoods(entity); return "save ok"; } @RequestMapping("doDeleteById/{id}") public String doDeleteById(@PathVariable Integer id){ goodsService.deleteById(id); return "delete ok"; } @RequestMapping("/doFindGoods") public List<Goods> doFindGoods(){ List<Goods> goodsList=goodsService.findGoods(); return goodsList; }}第二步:增加bootstrap的文件第三步:创立goods-vue-01.html文件 ...

December 5, 2020 · 2 min · jiezi

关于springboot:SpringBootMyBatisSpringThymeleaf

SpringMVC 简介背景剖析在大型软件系统设计时,业务个别会绝对简单,如果所有业务实现的代码都纠缠在一起,会呈现逻辑不清晰、可读性差,保护艰难,改变一处就牵一发而动全身等问题。为了更好解决这个问题就有了咱们当初常说的分层架构设计。 MVC是什么MVC是一种软件架构设计思维,基于MVC架构将咱们的应用软件进行分层设计和实现,例如能够分为视图层(View),管制层(Controller),模型层(Model),通过这样的分层设计让咱们程序具备更好的灵活性和可可扩展性.因为这样能够将一个简单应用程序进行简化,实现各司其职,各尽所能.比拟适宜一个大型利用的开发. SpringMVC 概述Spring MVC是MVC设计思维在Spring框架中的一种实现,基于这样的思维spring框架设计了一些相干对象,用于更好的基于MVC架构解决申请和响应,其繁难架构如图所示: 其中:1)DispatcherServlet是客户端所有申请解决的入口,负责申请转发。2)RequestMapping负责存储申请url到后端handler对象之间的映射。3)Handler 用于解决DispatcherServlet对象转发过去的申请数据。4)ViewResolver负责解决所有Handler对象响应后果中的view。 基于Spring,MyBatis,SpringBoot,Thymeleaf技术实现商品模块的增删改查操作第一步:创立springboot我的项目10-springboot-goods第二步:增加依赖第三步:配置文件初始化 #serverserver.port=1314#spring datasourcespring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=1234#spring mybatismybatis.mapper-locations=classpath:/mapper/*/*.xml#spring thymeleafspring.thymeleaf.prefix=classpath:/templates/pages/spring.thymeleaf.suffix=.htmlspring.thymeleaf.cache=false#spring logging#logging.file.path=d:/logs/logging.level.com.cy=debugmanagement.endpoints.web.exposure.include=*我的项目API架构设计其API架构设计,如图所示: 商品CRUD业务实现业务时序剖析查问所有商品信息,其业务时序剖析,如图所示:第一步:定义Goods对象,封装查问到的对象 package com.cy.pj.goods.pojo;import java.util.Date;/** * 用来封装商品 */public class Goods { private Long id;//id bigint primary key auto_increment private String name;//name varchar(100) not null private String remark;//remark text private Date createdTime;//createdTime datetime public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Date getCreatedTime() { return createdTime; } @Override public String toString() { return "Goods{" + "id=" + id + ", name='" + name + ''' + ", remark='" + remark + ''' + ", createdTime=" + createdTime + '}'; }}第二步:Dao接口办法及映射定义 ...

December 5, 2020 · 3 min · jiezi

关于springboot:form表单putdelete方式提交处理

form表单put、delete形式提交解决form表单只反对get和post的形式提交,而咱们应用restful格调必然要应用到@PUTmapping、@DELETEmapping等注解,那么在提交表单时的method=“put/delete”也要对应注解,上面来看看SpringMVC和SpringBoot的解决形式。 1、SpringMVC的解决SpringMVC通过在web.xml中配置如下过滤器HiddenHttpMethodFilter解决;而后在页面上提交一个暗藏的input来实现; 1、配置HiddenHttpMethodFilter <filter> <filter-name>HttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>2、表单解决 <form th:action="" method="post"> <!-- 发送put申请批改员工数据 1、SpringMVC中配置HiddenHttpMethodFilter; 2、页面创立一个Post表单; 3、创立一个暗藏的input项,name=_method,value就是咱们指定的申请形式; --> <input type="hidden" name="_method" value="put" /> </form>留神这里的name属性只能为_method,value为咱们想提交的形式;2、SpringBoot的解决SpringBoot曾经为咱们主动配置了HttpMethodFilter,SpringBoot2.2.0以上版本须要咱们手动开启配置; 1、开启配置 #开启hiddenmethod 过滤器spring.mvc.hiddenmethod.filter.enabled=true2、表单解决同上; 3、看看源码 Ctrl+N搜寻-WebMvcAutoConfiguration类而后Ctrl+F搜寻-hiddenmethod看看SpringBoot如何主动配置的源码如下:@Bean@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)//意为当咱们配置文件中没找到这个前缀(prefix)为spring.mvc.hiddenmethod.filter的名为enabled的属性就不开启这项配置,即默认false;@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() { return new OrderedHiddenHttpMethodFilter();}按住Ctrl并点击HiddenHttpMethodFilter.class,去看看过滤器的源码public class HiddenHttpMethodFilter extends OncePerRequestFilter { private static final List<String> ALLOWED_METHODS;//容许的办法 public static final String DEFAULT_METHOD_PARAM = "_method"; private String methodParam = "_method";//这就是name="_method",也就是从页面拿到的参数 public HiddenHttpMethodFilter() { } public void setMethodParam(String methodParam) { Assert.hasText(methodParam, "'methodParam' must not be empty"); this.methodParam = methodParam; } protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest requestToUse = request; //这里if判断request是不是post,这也是为什么form必须为post的起因 if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) { //利用request.getParameter取到hidden的input传来的value; String paramValue = request.getParameter(this.methodParam); //hasLength()判断paramValue不为空行将paramValue转为大写并赋值给method if (StringUtils.hasLength(paramValue)) { //这个method才是咱们真正想要的申请形式 String method = paramValue.toUpperCase(Locale.ENGLISH); //如果被容许的method中蕴含有咱们真正想要的申请形式 if (ALLOWED_METHODS.contains(method)) { //就应用咱们心愿的申请形式,把不是咱们传的method过滤掉了 requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method); } } } filterChain.doFilter((ServletRequest)requestToUse, response); } //这里定义了3种容许的办法DELETE、PUT、PATCH static { ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name())); } private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper { private final String method; public HttpMethodRequestWrapper(HttpServletRequest request, String method) { super(request); this.method = method; } public String getMethod() { return this.method; } }}

December 5, 2020 · 1 min · jiezi

关于springboot:SpringBoot整合MyBatis框架

整合MyBatis的初步剖析概述Mybatis是一个优良的长久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的根底上做了封装和优化,它借助灵便的SQL定制,参数及后果集的映射形式,更好的适应了以后互联网技术的倒退。Mybatis框架的简略利用架构如图所示:在当今的互联网利用中我的项目,mybatis框架通常会由spring框架进行资源整合,作为数据层技术实现数据交互操作。 初步实现第一步:创立我的项目module第二步:增加依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cy</groupId> <artifactId>08-springboot-mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>08-springboot-mybatis</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--增加jdbc依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <!--增加mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--增加mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>第三步:配置application.properties配置文件 ...

December 5, 2020 · 2 min · jiezi

关于springboot:SpringBoot整合HikariCP连接池

HikariCP连接池概述池化思维池化思维是咱们我的项目开发过程中的一种十分重要的思维,如整数池,字符串池,对象池、连接池、线程池等都是池化思维的一种利用,都是通过复用对象,以缩小因创立和开释对象所带来的资源耗费,进而来晋升零碎性能。例如Integer对象的外部池利用。 package com.cy.java.pool;public class TestInteger01 { public static void main(String[] args) { Integer n1=100;//Integer.valueOf(100) 编译时优化 Integer n2=100; Integer n3=200; Integer n4=200;//池中没有则new Integer(200) System.out.println(n1==n2);//true System.out.println(n3==n4);//false } }这就是因为Intrger对象保护了一个常量池,雷同数据不再开拓空间存储区间是-128--127。 连接池原理在零碎初始化的时候,在内存中开拓一片空间,将肯定数量的数据库连贯作为对象存储在对象池里,并对外提供数据库连贯的获取和偿还办法。用户拜访数据库时,并不是建设一个新的连贯,而是从数据库连接池中取出一个已有的闲暇连贯对象;应用结束偿还后的连贯也不会马上敞开,而是由数据库连接池对立治理回收,为下一次借用做好筹备。如果因为高并发申请导致数据库连接池中的连贯被借用结束,其余线程就会期待,直到有连贯被偿还。整个过程中,连贯并不会敞开,而是源源不断地循环应用,有借有还。数据库连接池还能够通过设置其参数来管制连接池中的初始连接数、连贯的上上限数,以及每个连贯的最大应用次数、最大闲暇工夫等,也能够通过其本身的管理机制来监督数据库连贯的数量、应用状况等。 java中的连接池Java官网,为了在应用程序中更好的利用连接池技术,定义了一套数据源标准,例如javax.sql.DataSource接口,基于这个接口,很多团队或集体创立了不同的连接池对象。而后咱们的应用程序中通过耦合与DataSource接口,便能够不便的切换不同厂商的连接池。Java我的项目中通过连接池获取连贯的一个根本过程,如下图所示: 在上图中,用户通过DataSource对象的getConnection()办法,获取一个连贯。如果池中有连贯,则间接将连贯返回给用户。如果池中没有连贯,则会调用Dirver(驱动,由数据库厂商进行实现)对象的connect办法从数据库获取,拿到连贯当前,能够将连贯在池中放一份,而后将连贯返回给调用方。连贯需求方再次须要连贯时,能够从池中获取,用完当前再还给池对象。 数据库连接池在Java数据库相干中间件产品群中,应该算是底层最根底的一类产品,作为企业应用开发必不可少的组件,有数蠢才们为咱们奉献了一个又一个的优良产品,它们有的随时代倒退,功成身退,有的则还在一直迭代,老而弥坚,更有新生代产品,或性能无敌,或性能全面。目前市场上常见的连接池有DBCP、C3P0,DRUID,HikariCP等。 SpringBoot工程下HikariCP整合测试数据初始化关上mysql控制台,而后按如下步骤执行goods.sql文件。第一步:登录mysql。 mysql –uroot –p1234第二步:设置控制台编码方式。 set names utf8;第三步:执行goods.sql文件(切记不要关上文件复制到mysql客户端运行)。 source d:/goods.sql其中goods.sql文件内容如下: drop database if exists dbgoods;create database dbgoods default character set utf8;use dbgoods;create table tb_goods( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;insert into tb_goods values (null,'java','very good',now());insert into tb_goods values (null,'mysql','RDBMS',now());insert into tb_goods values (null,'Oracle','RDBMS',now());insert into tb_goods values (null,'java','very good',now());insert into tb_goods values (null,'mysql','RDBMS',now());insert into tb_goods values (null,'Oracle','RDBMS',now());insert into tb_goods values (null,'java','very good',now());创立我的项目Module并增加相干依赖第一步:基于IDEA创立我的项目Module,如图所示: ...

December 3, 2020 · 2 min · jiezi

关于springboot:SpringBoot介绍

SpringBoot外围个性Spring boot是一个脚手架,构建于Spring框架(Framework)根底之上,基于疾速构建理念,提供了主动配置性能,可实现其开箱即用个性(创立完一个根本的我的项目当前,可零配置或者大量配置即可运行咱们的我的项目),其外围次要有如下几个方面:▪起步依赖(Starter Dependency)-我的项目创立时底层帮你关联依赖。▪主动配置(Auto Configuration)。▪健康检查(Actator)-监控。 起步依赖起步依赖实质是Mavenue我的项目对象模型(pom),定义了对其余库的传递依赖,依赖+依赖+。。。反对某项性能 <!-- 作用1: parent标签 集中定义了SpringBoot所有依赖jar包的版本信息. 由官网解决了jar包冲突性问题. 作用2: 本地仓库中没有该文件的jar包 parent示意的是一个聚合工程(定义). --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent><!--3.依赖工具API--><dependencies> <dependency> <groupId>com.jt</groupId> <artifactId>jt-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies>之前maven我的项目须要关系依赖的版本等等,当初只需关注springboot的版本,其余依赖springboot会帮咱们进行治理。 主动配置-开箱即用<dependencies> <!-- 手动依赖项 该依赖项被springBoot进行了高度的整合 springBoot帮忙大家动静的生成了配置我的项目,简化了配置的步骤 该配置称之为自动化的配置信息 spring-boot-starter springBoot自动化的启动项. 开箱即用: 只须要导入jar包简略的配置即可实现对应的性能. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>@EnableAutoConfiguration是实现主动配置的入口,该注解通过@Import注解导入了AutoConfigurationImportSelector.class,在该类中加载配置信息,而后删选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现主动配置性能。 健康检查Spring Boot 中actuator模块提供了健康检查,审计、指标收集,HTTP跟踪等性能,能够帮忙咱们更好的治理和跟踪springboot我的项目。第一步:增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>第二步:yml配置文件配置actuator选项 management.endpoints.web.exposure.include=*第三步:重启服务器,拜访webUIhttp://localhost/actuator SpringBoot的启动过程我的项目的入口类应用了@SpringBootApplication注解形容,此注解内是: ...

December 3, 2020 · 1 min · jiezi

关于springboot:Java填充word模板

前言本文次要有以下几个知识点: 占位符填充头像导出表格填充word转pdf先来看下最初的效果图: 注释模板配置先来看下咱们的模板: 首先咱们须要先在word模板外面设置占位符,这里有一个十分重要的点就是咱们是依据${占位符}来替换的,其实word文档实质上就是一个xml文件,因而咱们须要保障占位符不被切割,具体做法如下: 1.首先用解压工具关上模板 2.关上document.xml文件 3.能够看出文件并未格式化,咱们先格式化代码 4.能够看到咱们的占位符被切割了,咱们须要干掉两头多余的。 5.点击开始后间接笼罩源文件就能够了,当初能够开始写代码了。 留神要保障咱们的每个占位符不被切割,否则是无奈进行替换的 模板填充导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.2</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version></dependency>首先看下咱们两个表格的实体类(不肯定要给表格建对象,依据集体需要增加即可) // 家庭成员@Builder(toBuilder = true)@Data@AllArgsConstructor@NoArgsConstructorpublic class EpRewandpun { private String urewdate; private String urewunit; private String urewdesc;}// 奖惩状况@Builder(toBuilder = true)@Data@AllArgsConstructor@NoArgsConstructorpublic class EpPmenber { private String uconnection; private String uname; private String ubirthday; private String uworkunit; private String uploity; private String ustatus;}接着看下咱们的测试方法: ...

December 3, 2020 · 5 min · jiezi

关于springboot:京淘day08京淘项目代理及Nginx

1.反向代理1.1 反向代理概念反向代理服务器位于用户与指标服务器之间,然而对于用户而言,反向代理服务器就相当于指标服务器,即用户间接拜访反向代理服务器就能够取得指标服务器的资源。同时,用户不须要晓得指标服务器的地址,也毋庸在用户端作任何设定。反向代理服务器通常可用来作为Web减速,即应用反向代理作为Web服务器的前置机来升高网络和服务器的负载,进步拜访效率。特点:1.反向代理服务器是位于用户和指标服务器之间的.2.用户认为反向代理服务器就是实在的服务器. 用户不晓得实在的服务器到底是谁.3.反向代理服务器爱护服务端信息,称之为服务器端代理.代理存在的起因: 用户因为某种原因无奈间接拜访指标服务器,实现指定的性能. 1.2 正向代理1.2.1 正向代理介绍正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定指标(原始服务器),而后代理向原始服务器转交申请并将取得的内容返回给客户端。客户端能力应用正向代理。特点:1.代理服务器位于用户与服务器之间2.用户申请时,十分明确指标服务器到底是谁. 服务器不分明到底是谁拜访的我.认为是代理服务器间接发动的申请.3.正向代理服务器爱护了用户的信息,所以称之为客户端代理. 1.2.2 对于代理总结1.反向代理是服务器端代理. 只有用户拜访服务器,其实都是反向代理机制. 实现业务调用2.正向代理是客户端代理.次要用户上网就就应用正向代理 实现的是网络通信头 网穿工具 夜神模拟器/花生壳 2.Nginx2.1 Nginx服务器介绍 2.2 nginx介绍Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中体现较好,中国大陆应用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。特点:1.占用内存少 2M tomcat启动 200M左右2.并发能力强 5万/秒 理论2-4万/秒 2.3 Nginx装置应用1).启动Nginx nginx启动会生成2个过程项1.主过程 次要的作用是提供反向代理服务的. 在敞开主过程 内存大的2.守护过程 避免主过程意外敞开的. 先敞开守护 2.4 Nginx命令工作目录阐明:要求在nginx.exe所在的根目录中执行1.启动命令start nginx Linux ./nginx2.重名命令nginx -s reload Linux: ./nginx -s reload3.敞开命令nginx -s stop Linux: ./nginx -s stop 2.5 Nginx反向代理原理入门案例阐明: http://localhost:80 3.实现图片回显3.1 需要实现图片地址的代理,将图片地址转向到具体的磁盘门路.URL地址: http://image.jt.com/2020/12/0...本地磁盘地址: E:images/2020/12/02/7d7179100d1e423abc2546e77743947c.png 3.2 配置nginx #1.配置图片代理 server { listen 80; server_name image.jt.com; location / { root E:\images; } }3.3 编辑HOSTS文件作用:实现本地域名与IP地址的映射门路:内容: ...

December 2, 2020 · 2 min · jiezi

关于springboot:SpringBootMybatisVue-实现商品模块的crud操作

筹备工作第一步 创立新module,名字为10-springboot-goods-vue.第二步 增加maven依赖并进行初步配置(拷贝即可)第三步 拷贝pojo,dao,service包中的所有接口和类.第四步 拷贝动态资源到static目录(例如vue.js,axios.min.js) 商品查问设计及实现创立GoodsController并定义相干办法,代码如下: package com.cy.pj.goods.controller;import com.cy.pj.goods.pojo.Goods;import com.cy.pj.goods.service.GoodsService;import java.util.List;@RestControllerpublic class GoodsController { @Autowired private GoodsService goodsService; /**查问所有商品信息*/ @GetMapping("/goods/doFindGoods") public List<Goods> doFindGoods(){ return goodsService.findGoods(); }}在我的项目static目录创立goods-vue.html,并基于vue出现数据,代码如下 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <div id="app"> <h1>The Goods Page</h1> <table> <thead> <tr> <th>id</th> <th>name</th> <th>remark</th> <th>createdTime</th> </tr> </thead> <tbody> <tr v-for="g in goods"> <td>{{g.id}}</td> <td>{{g.name}}</td> <td>{{g.remark}}</td> <td>{{g.createdTime}}</td> </tr> </tbody> </table> </div> <script src="js/axios.min.js"></script> <script src="js/vue.js"></script> <script> var vm=new Vue({//vue对象时vue.js利用的入口对象 el:"#app",//vue对象要监控的区域 data:{//此对象用于同步页面数据的一个对象 goods:{} }, methods:{//同步与页面元素事件处理函数 doFindGoods:function(){ let url="goods/doFindGoods"; axios.get(url) .then(function(result){ this.vm.goods=result.data; }); } }, mounted:function(){ this.doFindGoods(); } }); </script></body></html>启动tomcat进行拜访测试,如图所示: ...

December 2, 2020 · 1 min · jiezi

关于springboot:SpringBootMyBatisSpring-技术整合实现商品模块的CRUD操作

业务形容基于Spring,MyBatis,SpringBoot,Thymeleaf技术实现商品模块的增删改查操作。 我的项目环境初始化筹备工作1. MySQL(5.7)2. JDK (1.8)3. Maven (3.6.3)4. STS(4.7.1)数据库初始化关上mysql控制台,而后按如下步骤执行goods.sql文件。第一步:登录mysql。 mysql –uroot –proot第二步:设置控制台编码方式。 set names utf8;第三步:执行goods.sql文件(切记不要关上文件复制到mysql客户端运行)。 source d:/goods.sql其中goods.sql文件内容如下: drop database if exists dbgoods;create database dbgoods default character set utf8;use dbgoods;create table tb_goods( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;insert into tb_goods values (null,'java','very good',now());insert into tb_goods values (null,'mysql','RDBMS',now());insert into tb_goods values (null,'Oracle','RDBMS',now());insert into tb_goods values (null,'java','very good',now());insert into tb_goods values (null,'mysql','RDBMS',now());insert into tb_goods values (null,'Oracle','RDBMS',now());insert into tb_goods values (null,'java','very good',now());创立我的项目并增加依赖基于STS创立第一步:基于start.spring.io 创立我的项目并设置根本信息 ...

December 2, 2020 · 3 min · jiezi

关于springboot:SpringBoot工程下Spring-MVC技术的应用

Spring MVC 简介背景剖析在大型软件系统设计时,业务个别会绝对简单,如果所有业务实现的代码都纠缠在一起,会呈现逻辑不清晰、可读性差,保护艰难,改变一处就牵一发而动全身等问题。为了更好解决这个问题就有了咱们当初常说的分层架构设计。 MVC 是什么MVC是一种软件架构设计思维,基于MVC架构将咱们的应用软件进行分层设计和实现,例如能够分为视图层(View),管制层(Controller),模型层(Model),通过这样的分层设计让咱们程序具备更好的灵活性和可可扩展性.因为这样能够将一个简单应用程序进行简化,实现各司其职,各尽所能.比拟适宜一个大型利用的开发. Spring MVC 概述Spring MVC是MVC设计思维在Spring框架中的一种实现,基于这样的思维spring框架设计了一些相干对象,用于更好的基于MVC架构解决申请和响应,其繁难架构如图所示: 其中:1)DispatcherServlet是客户端所有申请解决的入口,负责申请转发。2)RequestMapping负责存储申请url到后端handler对象之间的映射。3)Handler 用于解决DispatcherServlet对象转发过去的申请数据。4)ViewResolver负责解决所有Handler对象响应后果中的view。 Spring MVC 疾速入门筹备工作第一步:创立我的项目module,根本信息如图所示: 第二步:增加我的项目依赖(能够在module创立时,也能够创立后),代码如下: Spring Web 依赖(提供了spring mvc反对并且会嵌入一个tomcat) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖(提供了以html作为页面模板进行解析和操作的相干对象) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>第三步:启动我的项目检测控制台启动状态是否OK static 目录剖析及利用static 目录为springboot工程创立时增加了web依赖当前主动创立的目录,此目录中能够存储html、css、js、image,这些资源能够在启动服务器当前,间接在浏览器进行拜访。例如:第一步:在static目录下创立一个index.html页面,代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <h1>The First Html Page</h1></body></html>第二步:启动服务器并间接进行拜访测试,如图所示 templates 目录剖析及利用templates 目录为springboot工程创立时增加了thymeleaf依赖当前主动创立的目录,此目录中要存储一些html模板,这个模板页面不能间接通过浏览器url进行拜访,须要基于后端控制器,在办法中定义页面响应,例如: 第一步:定义TemplateController及办法,代码如下: package com.cy.pj.health.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class TemplateController { @RequestMapping("doTemplateUI") public String doTemplateUI(){ return "default"; }}第二步:在templates目录中定义模板页面default.html,代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <h1>The Default Template page</h1></body></html>其中,如果default.html要在放在templates子目录中,则还须要在配置文件中配置thymeleaf的前缀,例如: ...

December 2, 2020 · 2 min · jiezi

关于springboot:SpringBoot工程中的MyBatis框架的整合实现及原理分析

整合MyBatis的初步剖析概述Mybatis是一个优良的长久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的根底上做了封装和优化,它借助灵便的SQL定制,参数及后果集的映射形式,更好的适应了以后互联网技术的倒退。Mybatis框架的简略利用架构如图所示:在当今的互联网利用中我的项目,mybatis框架通常会由spring框架进行资源整合,作为数据层技术实现数据交互操作。 筹备工作第一步:创立我的项目module,例如: 第二步:增加依赖 mysql 驱动依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>spring jdbc 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>mybatis starter依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version></dependency> 第二步:application.properties 配置文件中增加繁难配置 连接池配置 spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=rootmybatis配置 mybatis.mapper-locations=classpath:/mapper/*/*.xml环境测试代码实现在src/test/java目录中增加测试类,对mybatis框架整合进行根本测试,代码如下: package com.cy.pj.goods.dao;import java.sql.Connection;import org.apache.ibatis.session.SqlSession;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublic class MyBatisTests { @Autowired private SqlSession sqlSession; @Test public void testGetConnection() { Connection conn=sqlSession.getConnection(); System.out.println("connection="+conn); }}在SpringBoot脚手架工程中,Spring框架会基于MyBatis框架底层配置,创立SqlSessionFactory对象,而后再通过此工厂对象创立SqlSession,最初基于Springku框架为测试类注入SqlSession对象,接下来,咱们能够通过SqlSession对象实现与数据库的会话了。 整合MyBatis业务代码实现及原理剖析业务形容基于SpringBoot脚手架工程对MyBatis框架的整合,实现对商品库中商品数据的查问业务。 API架构设计 业务时序图剖析 业务代码设计及实现第一步:定义商品模块POJO对象类型(基于此对象存储商品数据),代码如下: package com.cy.pj.goods.pojo;import java.util.Date;/**用于存储商品信息的pojo对象*/public class Goods { private Long id; private String name; private String remark; private Date createdTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Date getCreatedTime() { return createdTime; } public void setCreatedTime(Date createdTime) { this.createdTime = createdTime; }}第二步:定义商品模块长久层对象GoodsDao接口及办法映射,代码如下 ...

December 2, 2020 · 2 min · jiezi

关于springboot:京淘day07京淘项目商品详情及文件上传

1.实现商品详情展示1.1 业务阐明个别用户查问商品时,只须要展示商品相干信息即可,如果用户点击某个商品时才会展示商品详情信息,因为商品详情是大字段信息,所以检索绝对较慢,节约性能.表设计说明:1.tb_item 商品表2.tb_item_desc 商品详情表一个商品只有一个详情信息,所以item表与itemDesc一对一. 1.2 商品详情表设计 1.3 编辑ItemDescpackage com.jt.pojo;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;@TableName("tb_item_desc")@Data@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public class ItemDesc extends BasePojo{ @TableId private Long itemId; //商品ID 与item表中的数据统一. private String itemDesc; //商品详情}1.4 富文本编辑器介绍1.4.1 入门案例 1.5 重构商品新增1.5.1 业务阐明因为商品新增是将Item/ItemDesc对象一起新增,所以须要实现2张表的入库操作. 1.5.2 编辑ItemController/** * 业务需要: 实现商品新增操作 * url: http://localhost:8091/item/save * 参数: 整个表单进行提交 应用对象接管 * 返回值: 零碎返回值对象 */ @RequestMapping("/save") @Transactional public SysResult saveItem(Item item, ItemDesc itemDesc) { itemService.saveItem(item,itemDesc); return SysResult.success(); }1.5.3 编辑ItemService@Override@Transactional//开启事务管制public void saveItem(Item item, ItemDesc itemDesc) { //MP用法:如果实现主键自增,则主动的实现数据的回显!!! itemMapper.insert(item); //获取主键信息 itemDesc.setItemId(item.getId()); itemDescMapper.insert(itemDesc); }1.6 商品详情展示1.6.1 页面剖析 ...

December 2, 2020 · 3 min · jiezi

关于springboot:如何理解-Spring-Boot技术

Spring Boot 背景剖析JAVAEE利用体系中沉重的配置、低下的开发效率、高难度的三方集成,简单的部署流程等等始终被开发人员所诟病。即便是应用Spring这样的轻量级的资源整合框架,在实现其绝对比拟多的资源整合时,仍旧须要大量的手动依赖治理,简单的XML配置(还常常没有提醒)。还有就是当初的软件生态利用也曾经造成肯定的规模,零碎架构正在从单体架构,分布式架构,逾越到微服务架构。随着整个架构体系的变动,企业对技术的要求也在变动,当初的企业更重视技术的开箱即用,更重视技术在生态圈中的深度交融,更重视轻量级的运维。由此由此spring boot诞生。 Spring Boot 要解决什么问题Spring Boot是由Pivotal团队提供的全新的Java软件开发框架(很多人当初把它了解为一个脚手架),其设计目标是用来简化Spring我的项目的初始搭建以及开发过程。该框架应用了特定的注解形式来进行配置,从而使开发人员不再须要大量的xml配置。不再须要大量的手动依赖治理。Spring Boot基于疾速构建理念,通过约定大于配置,开箱即用的形式,心愿可能在蓬勃发展的疾速利用开发畛域成为其领导者。 Spring Boot 有哪些外围的要害个性起步依赖(Starter Dependency)。主动配置(Auto Configuration)。健康检查(Actator)-监控。嵌入式服务(Tomcat,Jetty)。总结(Summary)总之,Spring Boot 框架就是要基于疾速构建理念,基于约定大于配置形式,实现技术的开箱即用,以进步开发效率。

December 2, 2020 · 1 min · jiezi

关于springboot:基于idea创建springboot项目并进行入门分析

SpringBoot 我的项目创立创立Module基于IDEA创立我的项目Module,模块名为04-springboot-start,组id和包名为com.cy,如图所示:填写module信息,如图所示:抉择我的项目module版本,临时不须要本人手动增加任何依赖,如图所示:填写Module名称,实现module创立,如图所示 我的项目构造剖析我的项目Module创立好当前,其代码构造剖析,如图所示: SpringBoot 我的项目启动剖析启动入口SpringBoot 工程中由SpringBootApplication注解形容的类为启动入口类,例如: package com.cy;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {//Application.class public static void main(String[] args) {//Main Thread SpringApplication.run(Application.class, args); }} 启动过程概要剖析SpringBoot工程启动时其繁难初始化过程,如图所示: 在启动过程中底层做了哪些事件,大抵形容如下:1)基于配置加载类(通过ClassLoader将指定地位的类读到内存->底层通过线程调用IO从磁盘读取到内存)。2)对类进行剖析(创立字节码对象-Class类型,通过反射获取器配置信息)。3)对于指定配置(例如由spring特定注解形容)的对象存储其配置信息(借助BeanDefinition对象存储)。4)基于BeanDefinition对象中class的配置构建类的实例(Bean对象),并进行bean对象的治理(可能会存储到bean池)。 SpringBoot 疾速入门剖析业务形容在我的项目Module中定义一个类,类名为DefaultCache,而后将此类对象交给Spring创立并治理。最初通过单元测试对类的实例进行剖析。 API设计剖析基于业务形容,进行API及关系设计,如图所示: 代码编写及运行基于业务及API设计,进行代码编写,其过程如下: 第一步:定义DefaultCache类 package com.cy.pj.common.cache;import org.springframework.stereotype.Component;/** * @Component 注解形容的类,示意此类交给Spring框架治理。 */@Componentpublic class DefaultCache {}第二步:定义DefaultCacheTests单元测试类 package com.cy.pj.common.cache;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;@SpringBootTestpublic class DefaultCacheTests { /** * @Autowired 注解形容的属性由spring框架依照肯定规定为其注入值(赋值) * 赋值过程是怎么的? * 1)依赖查找?(请问查找规定是什么?) * 2)依赖注入?(须要借助什么技术?) */ @Autowired private DefaultCache defaultCache; @Test void testDefaultCache(){ System.out.println(defaultCache.toString()); //FAQ? defaultCache变量援用的对象是由谁创立的,存储 到了哪里?bean pool }}第三步:运行单元测试类进行利用剖析启动运行单元测试办法,检测其输入后果,基于后果剖析:1)SpringBoot我的项目中Bean对象的构建。2)SpringBoot我的项目中Bean对象的获取。 ...

December 2, 2020 · 1 min · jiezi

关于springboot:京淘day07京淘项目商品详情

1.实现商品详情展示1.1 业务阐明个别用户查问商品时,只须要展示商品相干信息即可,如果用户点击某个商品时才会展示商品详情信息,因为商品详情是大字段信息,所以检索绝对较慢,节约性能.表设计说明:1.tb_item 商品表2.tb_item_desc 商品详情表一个商品只有一个详情信息,所以item表与itemDesc一对一. 1.2 商品详情表设计 1.3 编辑ItemDescpackage com.jt.pojo;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;@TableName("tb_item_desc")@Data@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public class ItemDesc extends BasePojo{ @TableId private Long itemId; //商品ID 与item表中的数据统一. private String itemDesc; //商品详情}1.4 富文本编辑器介绍1.4.1 入门案例 1.5 重构商品新增1.5.1 业务阐明因为商品新增是将Item/ItemDesc对象一起新增,所以须要实现2张表的入库操作. 1.5.2 编辑ItemController/** * 业务需要: 实现商品新增操作 * url: http://localhost:8091/item/save * 参数: 整个表单进行提交 应用对象接管 * 返回值: 零碎返回值对象 */ @RequestMapping("/save") @Transactional public SysResult saveItem(Item item, ItemDesc itemDesc) { itemService.saveItem(item,itemDesc); return SysResult.success(); }1.5.3 编辑ItemService//新增@Override@Transactional//开启事务管制public void saveItem(Item item, ItemDesc itemDesc) { item.setStatus(1); //MP用法:如果实现主键自增,则主动的实现数据的回显!!! itemMapper.insert(item); //获取主键信息 itemDesc.setItemId(item.getId()); itemDescMapper.insert(itemDesc);}1.6 商品详情展示1.6.1 页面剖析 ...

December 2, 2020 · 3 min · jiezi

关于springboot:京淘day06京淘项目curd

1.商品CRUD操作1.1 商品新增1.1.1 页面剖析 1.1.2 用户参数 1.1.3 页面JS剖析 1.1.4 封装零碎VO对象package com.jt.vo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;@Data@Accessors(chain = true)@NoArgsConstructor@AllArgsConstructorpublic class SysResult { private Integer status; //200示意胜利 201示意失败 private String msg; //服务器给用户的提示信息 private Object data; //服务器返回给用户的数据 //封装工具API public static SysResult fail(){ return new SysResult(201, "服务器调用异样", null); } public static SysResult success(){ return new SysResult(200, "业务执行胜利!", null); } public static SysResult success(Object data){ return new SysResult(200, "业务执行胜利!", data); } public static SysResult success(String msg,Object data){ return new SysResult(200, msg, data); }}1.1.5 编辑ItemController/** * 业务需要:实现商品新增操作 * url: http://localhost:8091/item/save * 参数: 整个表单进行提交 应用对象接管 * 返回值: 零碎返回值对象 */ @RequestMapping("/save") public SysResult saveItem(Item item) { itemService.saveItem(item); return SysResult.success(); // 定义齐全局异样解决好能够省略 // try { // itemService.saveItem(item); // return SysResult.success(); // }catch (Exception e){ // e.printStackTrace(); // return SysResult.fail(); // } }1.1.6 编辑ItemService//新增@Override@Transactional//开启事务管制public void saveItem(Item item) { //定义玩主动填充性能后能够省略 //Date data=new Date(); //item.setStatus(1).setCreated(data).setUpdated(data); item.setStatus(1); itemMapper.insert(item); //int a=1/0;}2.2 参数主动填充性能2.2.1 需要阐明如果用户在入库/更新操作时,是否实现工夫的主动的填充性能.简化用户操作的步骤. ...

December 1, 2020 · 3 min · jiezi

关于springboot:SpringBoot-在IDEA中实现热部署步骤

一、开启IDEA的主动编译(动态) 具体步骤:关上顶部工具栏 File -> Settings -> Default Settings -> Build -> Compiler 而后勾选 Build project automatically 。 二、开启IDEA的主动编译(动静) 具体步骤:同时按住 Ctrl + Shift + Alt + / 而后进入Registry ,勾选主动编译并调整延时参数。 compiler.automake.allow.when.app.running -> 主动编译compile.document.save.trigger.delay -> 自动更新文件PS:网上极少有人提到compile.document.save.trigger.delay 它次要是针对动态文件如JS CSS的更新,将延迟时间缩小后,免编译间接按F5刷新页面就能看到成果! 三、开启IDEA的热部署策略(十分重要) 具体步骤:顶部菜单- >Edit Configurations->SpringBoot插件->指标我的项目->勾选热更新。 四、在我的项目增加热部署插件 具体步骤:在POM文件增加热部署插件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> 五、敞开浏览器缓存(重要) 关上谷歌浏览器,关上F12的Network选项栏,而后勾选【✅】Disable cache 。

December 1, 2020 · 1 min · jiezi

关于springboot:spring-boot-metrics使用指南

spring boot metrics是什么?针对利用监控指标裸露,spring boot有一套残缺的解决方案,并且内置了好很多的指标收集器,如tomcat、jvm、cpu、kafka、DataSource、spring mvc(短少直方图的数据)等。基于micrometer技术,简直反对所有支流的监控服务的指标数据收集,这其中就蕴含了咱们线上应用的Prometheus,这份指南旨在最疾速接入boot的metrics性能,裸露prometheus的数据监控指标服务。 micrometer地址:https://micrometer.io/ 一、引入依赖implementation ('org.springframework.boot:spring-boot-starter-actuator')implementation ('io.micrometer:micrometer-registry-prometheus:1.6.1')implementation ('io.micrometer:micrometer-core:1.6.1')actuator是spring boot中负责运维性能的包,这里次要是通过它来裸露和治理metrics接口的。其余两个依赖是为了包兼容引入的,在sprinr boot2.x中,actuator中默认引入的prometheus反对包存在兼容性问题,如果你的环境不存在兼容性问题,能够不必引入上面两个依赖。 二、配置启用通过如下的配置,来开启prometheus的端点接口服务 management.endpoints.web.exposure.include=prometheus开启服务后,会裸露/actuator/prometheus 端点接口服务。在浏览器中,输出http://localhost:8080/actuator/prometheus 。能够看到内置的指标收集器收集到的监控指标 三、独立的web服务默认状况下,/actuator/prometheus端点服务追随利用的web容器一起公布,然而当咱们的web服务面向公网须要受权认证时,能够应用如下配置启用独立的容器裸露服务 management.server.port=8081四、全局标签设置在metrics监控零碎设计中,tag用来标记辨别一组指标集。比方咱们在监控grpc时,servicename就是是监控指标的其中一个tag。有的时候为了辨别环境和利用,咱们会设置一些全局的tag: management.metrics.tags.application = ${spring.application.name}management.metrics.tags.region = bj如上配置,咱们增加了一个利用的名字和一个区域的tag。这种配置是全局的。尽管grpc的组件可能只记录了servicename,然而最终数据出现时,也会带上全局配置的tag 五、自定义指标收集spring boot所有的指标最终都是通过MeterRegistry来注册的,这个实例被spring托管,所以你能够在spring的上下文中注入这个实例,联合micrometer指标定义(点我),自定义本人的监控指标 六、推送or拉取指标目前,咱们线上是通过k8s的monitoring.coreos.com/v1 api定义指定prometheus被动拉取利用pod的监控指标信息,次要是因为之前的metrics零碎是基于prometheus client模式裸露的。在基于spring boot的metrics零碎中,被动推送数据的模式非常容易实现,这里须要prometheus-gateway反对 引入依赖 implementation("io.prometheus:simpleclient_pushgateway")启用push模式 #开启prometheus的数据推送模式management.metrics.export.prometheus.pushgateway.enabled=true#prometheus服务端地址management.metrics.export.prometheus.pushgateway.base-url=localhost:9091#推送数据的频率,默认1m(单位分钟)management.metrics.export.prometheus.pushgateway.push-rate=1m#在jvm敞开之前将数据推送进来management.metrics.export.prometheus.pushgateway.shutdown-operation=push

November 30, 2020 · 1 min · jiezi

关于springboot:Spring-Boot-240正式发布全新的配置文件加载机制不向下兼容

千里之行,始于足下。关注公众号【BAT的乌托邦】,有Spring技术栈、MyBatis、JVM、中间件等小而美的原创专栏供以收费学习。分享、成长,回绝浅尝辄止。本文已被 https://www.yourbatman.cn 收录。 ✍前言你好,我是YourBatman。 北京工夫2020-11-12,Spring Boot 2.4.0正式公布。2.4.0是第一个应用新版本计划的Spring Boot发行版本。 留神:2.4.0版本号没有.RELEASE后缀,没有.RELEASE后缀,没有.RELEASE后缀。应用的是Spring最新的版本公布规定。此规定详解请参考上篇文章:Spring扭转版本号命名规定:此举对非英语国家很敌对还记得Spring Boot 2.3.0.RELEASE版本公布时那会麽?前后相差将好半年:中转电梯:Spring Boot 2.3.0正式公布:优雅停机、配置文件地位通配符新个性一览 一般来说,次版本号的降级会有点料,依据之前的爆料此次降级据说是做了大量的更新和改良。那么老规矩,作为小白鼠的我先代你玩一玩,初体验吧。 也可参见官网的更新日志:Spring Boot 2.4.0 Release Notes✍注释除了刚公布的Spring Boot 2.4.0,Spring Boot 2.3.x/2.2.x仍旧是沉闷的保护的版本。Spring Boot遵循的是Pivotal OSS反对策略,从公布日期起反对次要版本3年(留神:是次要版本)。上面是详情: 2.3.x:反对的版本。2020.05公布,是当初的沉闷的骨干2.2.x:反对的版本。2019.10公布,是当初的沉闷的骨干2.1.x:2018.10公布,反对到2020.10月底,倡议尽快降级EOL分支: 2.0.x:2018.3公布,2019.4.3进行保护1.5.x:生命已终止的版本。2017.1公布,是最初一个1.x分支,2019.8.1进行保护 回顾2.3版本的新个性可能大部分小伙伴都还没用过2.3.x分支,没想到2.4.x就已公布。因而这里先对2.3.x版本的新个性,来波简略回顾: 优雅停机。这是2.3.x主打的新个性:在敞开时,web服务器将不再容许新的申请,并将期待实现的申请给个宽限期让它实现。这个宽限期是能够设置的:能够应用spring.lifecycle.timeout-per-shutdown-phase=xxx来配置,默认值是30s。配置文件地位反对通配符。简略的说,如果你有MySql的配置和Redis配置的话,你就能够把他们离开来搁置,这个新个性也是棒棒哒。隔离性更好目录也更加清晰了(留神:此格局只反对放在classpath内部): mysql:/config/mysql/application.propertiesredis:/config/redis/application.properties外围依赖降级。 Spring Data Neumann。备注:很显著这个还是旧的命名形式。在Spirng新的版本规定下,Spring Data最新版本为Spring Data 2020.0.0Spring Session Dragonfruit(很显著这个也还是旧的命名形式)Spring Security 5.3Spring Framework 没有降级,应用的仍旧是和Spring Boot 2.2雷同的5.2.x版本 阐明:小版本号的降级对于新个性来说个别选择性疏忽对于Bean Validation:从此版本开始,spring-boot-starter-web不会再把validation带进来,所以若应用到,你须要本人增加这个spring-boot-starter-validation依赖 一般来说倡议你手动引入,毕竟Bean Validation的应用还是很宽泛,并且真的十分十分好用做足功课后,就开始最新的Spring Boot 2.4.0之旅吧。 2.4.0次要新个性全新的配置文件解决(properties/yaml)这个扭转最为重磅,本次扭转了配置文件的加载逻辑,旨在简化和合理化内部配置的加载形式,它可能具备不向下兼容性。 Spring Boot 2.4扭转了解决application.properties和application.yml文件的形式: 若你只是简略的文件application.properties/yaml,那么降级对你是无缝的,你感触不到任何变动若你应用了比较复杂的文件,如application-profile.properties/yaml这种(或者应用了Spirng Cloud的配置核心、(带有分隔符----的)多yaml文件),那么默认是不向下兼容的,须要你显式的做出些更改因为配置文件隶属于程序的一部分,特地是咱们当初简直都会应用到配置核心。因而上面针对于老版本升级到Spring Boot 2.4.0做个简略的迁徙领导。 阐明:因配置文件加载逻辑齐全进行了重写,因而具体版本我放到了下文专文解说,有趣味可放弃关注老版本版本配置属性迁徙指南老版本:2.4.0之前的版本都叫老版本。 Spring Boot 2.4对application.poperties/yaml的解决做了更新/降级。旨在简化和合理化内部配置的加载形式。它还提供了新性能:spring.config.import反对。所以呢,对于Spring Boot 2.4.0之前的版本(老版本)若降级到2.4.0须要做些批改,领导倡议如下: 形式一:复原旧模式(不举荐)如果你还未筹备好做配置迁徙的批改,Spring Boot也帮你思考到了,提供了一键切换到旧模式的“按钮”。具体做法是:只须要在Environment里减少一个属性spring.config.use-legacy-processing = true就搞定。最简的形式就是把这个属性放在application.poperties/yaml里即可。 ...

November 30, 2020 · 2 min · jiezi

关于springboot:已解决-idea-Add-Framework-Support解决配置文件不被识别及class中bean状态等问题

问题起因:没有用Spring Intializer初始化工程,创立文件夹自定义工程配置.过后应用'Add Framework Support'申明此为maven工程. 问题发现:首先是发现configuration中Bean右面没有小叶子.起初发现配置文件无提醒. 解决: Add Framework Support 增加spring

November 30, 2020 · 1 min · jiezi

关于springboot:京淘day05京淘项目前端js

1.京淘后盾页面剖析(理解)1.1 页面构造<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title><link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" /><link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/icon.css" /><link rel="stylesheet" type="text/css" href="/css/jt.css" /><script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script><script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script><script type="text/javascript" src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script></head><body class="easyui-layout"> <div data-options="region:'west',title:'菜单',split:true" style="width:10%;"> <ul class="easyui-tree"> <li> <span>商品治理</span> <ul> <li><a onclick="addTab('商品新增','/item-add')">商品新增</a></li> <li><a onclick="addTab('商品查问','/item-list')">商品查问</a></li> <li><a onclick="addTab('商品更新','/item-update')">商品更新</a></li> </ul> </li> <li> <span>网站内容治理</span> <ul> <li>内容新增</li> <li>内容批改</li> </ul> </li> </ul> </div> <div id="tt" class="easyui-tabs" data-options="region:'center',title:'首页'"></div></body><script type="text/javascript">function addTab(title, url){ if ($('#tt').tabs('exists', title)){ $('#tt').tabs('select', title); } else { var url2 = "https://map.baidu.com/@12964432.517776728,4826375.366248961,13z"; var content = '<iframe scrolling="auto" frameborder="0" src="'+url2+'" style="width:100%;height:100%;"></iframe>'; $('#tt').tabs('add',{ title:title, content:content, closable:false }); }}</script></html>2.商品列表展示2.1 Item表剖析 2.2 JSON阐明2.2.1 什么是JSONJSON(JavaScript Object Notation) 是一种轻量级的数据交换格局。它使得人们很容易的进行浏览和编写。同时也不便了机器进行解析和生成。 JSON实质是String ...

November 30, 2020 · 4 min · jiezi

关于springboot:京淘day04京淘项目基础搭建

1.京淘我的项目架构设计 2.京淘项目表设计2.1表与表关系秘籍: 以本人为核心登程 2.1.1 一对一1.商品与形容:一对一2.形容与商品:一对一 2.1.2 一对多1.商品分类与商品:一对多2.商品与商品分类:一对一 2.1.3 多对多表设计: 角色与权限表形容:一个角色对应多个权限.一个权限对应多个角色.表的个数: 3张表 2.1.4 京淘表设计 2.2 导入数据库导入命令: source 门路:/xxx.sql; 2.2.1 装置数据库工具 2.2.2 导入数据库1).导入数据库2).抉择Sql文件 2.京淘我的项目环境搭建2.1分布式阐明2.1.1 传统我的项目中存在的问题阐明: 单体我的项目架构将所有的功能模块都写到一起,如果其中呈现了问题则间接影响整个程序的容许. 2.1.2 分布式架构(拆)1).能够依照功能模块能够将我的项目拆分为若干个子项目2).如果业务性能足够简单,则须要更加细粒度的拆分形式.拆分的意义: 应用分布式架构设计,能够无效的升高架构中的耦合性,进步程序的开发速度及运维速度. 2.1.3 分布式思维存在的问题问题1: 分布式架构中如何保障jar包文件的对立?问题2: 分布式架构中如何保障工具API的对立? 3京淘后盾我的项目创立3.1 创立父级工程3.1.1 创立目录 3.1.2 批改POM.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jt</groupId> <artifactId>jt</artifactId> <version>1.0-SNAPSHOT</version> <!--打包类型为POM 只有pom能力被其余我的项目继承--> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <!--指定JDK版本--> <java.version>1.8</java.version> <!--跳过测试类打包--> <skipTests>true</skipTests> </properties> <!--依赖的作用:依赖须要的jar包文件 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <!--spring-boot-starter-xxx springboot启动项 开箱即用: 只须要引入特定的jar包简略的配置,即能够应用该性能 --> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--反对热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--引入插件lombok 主动的set/get/构造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--增加数据库驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--springBoot整合jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--SpringBoot整合MybatisPlus mybatis和plus jar包抵触的--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!--springBoot整合JSP增加依赖 --> <!--servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--jstl依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--使jsp页面失效 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> <!--不要增加build标签 --></project>3.2 创立工具API我的项目3.2.1 创立本人工程 ...

November 30, 2020 · 1 min · jiezi

关于springboot:京淘day03SpringBoot整合web

1.SpringBoot整合web资源1.1 创立动静web资源 1.2 我的项目构造 1.3 增加资源/jar包1).增加资源2).增加jar包文件 <!--springBoot整合JSP增加依赖 --> <!--servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--jstl依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--使jsp页面失效 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>1.4 增加YML配置文件server: port: 8090 servlet: context-path: / #我的项目根目录公布spring: datasource: url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root mvc: #引入mvn配置 view: prefix: /WEB-INF/ # /默认代表根目录 src/main/webapp suffix: .jsp# Spring整合Mybatis-plus配置mybatis-plus: type-aliases-package: com.jt.pojo mapper-locations: classpath:/mybatis/mappers/*.xml #开启驼峰映射 configuration: map-underscore-to-camel-case: true# 打印Mybatissql语句logging: level: com.jt.mapper: debug1.5 入门案例需要: 用户通过http://localhost:8090/findAll 获取全副userList汇合,并且在userList.jsp页面中进行表格数据展示 ...

November 30, 2020 · 2 min · jiezi

关于springboot:京淘day02SpringBoot高级用法

1.SpringBoot高级用法1.1对于配置文件阐明1.1.1 properties文件阐明1.语法 1. key=value 构造2.pro中的属性-值默认条件下都是String类型 不须要增加引号 1.1.2 YML文件阐明#语法 # 1. 数据结构 key: value 应用:(空格)链接 # 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server: port: 80901.2 为属性赋值1.2.1 业务需要有时须要动静的获取属性的值,如果间接写到代码中须要从新打包编译,代码的耦合性较高.是否利用配置文件的形式,动静的为属性赋值? 1.2.2 YML形式为属性赋值1).编辑YML配置文件 #语法 # 1. 数据结构 key: value 应用:(空格)链接 # 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server: port: 8090# 为Redis设定属性和属性值redis.host: 127.0.0.1redis.port: 63792).为属性赋值 package com.jt.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class RedisController { /** * 当程序启动时,会主动的加载YML配置文件,将数据保留到Spring的外部. * 之后通过${key}(spel表达式)进行数据的取值. */ @Value("${redis.host}") private String host; // = "127.0.0.1"; @Value("${redis.port}") private int port; // = 6379; @RequestMapping("/getNode") public String getNode(){ return host + ":" + port; }}1.2.3 指定配置文件为属性赋值1).定义properties文件2).编辑RedisController ...

November 30, 2020 · 4 min · jiezi

关于springboot:关于-Spring-Boot-注解你了解多少

一、注解(annotations)列表@SpringBootApplication:蕴含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它退出到程序上下文。 @Configuration 等同于spring的XML配置文件;应用Java代码能够查看类型平安。 @EnableAutoConfiguration 主动配置。 @ComponentScan 组件扫描,可主动发现和拆卸一些Bean。 @Component可配合CommandLineRunner应用,在程序启动后执行一些根底工作。 @RestController注解是@Controller和@ResponseBody的合集,示意这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST格调的控制器。 @Autowired主动导入。 @PathVariable获取参数。 @JsonBackReference解决嵌套外链问题。 @RepositoryRestResourcepublic配合spring-boot-starter-data-rest应用。 二、注解(annotations)详解 @SpringBootApplication:申明让spring boot主动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。 package com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }@ResponseBody:示意该办法的返回后果间接写入HTTP response body中,个别在异步获取数据时应用,用于构建RESTful的api。在应用@RequestMapping后,返回值通常解析为跳转门路,加上@responsebody后返回后果不会被解析为跳转门路,而是间接写入HTTP response body中。比方异步获取json数据,加上@responsebody后,会间接返回json数据。该注解个别会配合@RequestMapping一起应用。示例代码: @RequestMapping(“/test”) @ResponseBody public String test(){ return”ok”; }@Controller:用于定义控制器类,在spring 我的项目中由控制器负责将用户发来的URL申请转发到对应的服务接口(service层),个别这个注解在类中,通常办法须要配合注解@RequestMapping。示例代码: @Controller @RequestMapping(“/demoInfo”) publicclass DemoController { @Autowired private DemoInfoService demoInfoService;@RequestMapping("/hello")public String hello(Map<String,Object> map){ System.out.println("DemoController.hello()"); map.put("hello","from TemplateController.helloHtml"); //会应用hello.html或者hello.ftl模板进行渲染显示. return"/hello";}}@RestController:用于标注管制层组件(如struts中的action),@ResponseBody和@Controller的合集。示例代码: ...

November 30, 2020 · 1 min · jiezi

关于springboot:Spring-Boot-简介

Spring Boot 背景剖析JAVAEE利用体系中沉重的配置、低下的开发效率、高难度的三方集成,简单的部署流程等等始终被开发人员所诟病。即便是应用Spring这样的轻量级的资源整合框架,在实现其绝对比拟多的资源整合时,仍旧须要大量的手动依赖治理,简单的XML配置(还常常没有提醒)。还有就是当初的软件生态利用也曾经造成肯定的规模,零碎架构正在从单体架构,分布式架构,逾越到微服务架构。随着整个架构体系的变动,企业对技术的要求也在变动,当初的企业更重视技术的开箱即用,更重视技术在生态圈中的深度交融,更重视轻量级的运维。由此由此spring boot诞生。 Spring Boot 要解决什么问题Spring Boot是由Pivotal团队提供的全新的Java软件开发框架(很多人当初把它了解为一个脚手架),其设计目标是用来简化Spring我的项目的初始搭建以及开发过程。该框架应用了特定的注解形式来进行配置,从而使开发人员不再须要大量的xml配置。不再须要大量的手动依赖治理。Spring Boot基于疾速构建理念,通过约定大于配置,开箱即用的形式,心愿可能在蓬勃发展的疾速利用开发畛域成为其领导者。 Spring Boot 有哪些外围的要害个性起步依赖(Starter Dependency)。主动配置(Auto Configuration)。健康检查(Actator)-监控。嵌入式服务(Tomcat,Jetty)。Spring boot 是什么? (框架,也能够看成是框架脚手架,做了架子工要做的事件-搭建我的项目根底骨架的工作人员)Spring boot 外围劣势?(启动依赖,主动配置-开箱即用,健康检查-系统监控)Spring boot 我的项目的创立形式?( https://start.spring.io)Spring boot我的项目启动时,Bean的初始化过程是怎么的?(查找,加载,读和存储配置,创立和存储实例对象)Spring boot 我的项目启动时,Bean对象的依赖注入过程是怎么的?(标记,查找,注入)Spring 框架中的Bean对象有什么个性?(提早加载,作用域,生命周期办法)Spring 框架中单例(singleton)作用域对象特点,利用场景(频繁用)?Spring 框架中多例(prototype)作用域对象特点,利用场景(稀少用)?

November 28, 2020 · 1 min · jiezi

关于springboot:SpringBoot项目实践过程中遇到过哪些问题

SpringBoot 常见问题剖析 HikariCP 常见问题剖析 MyBatis常见问题剖析 Spring 常见问题剖析 thymeleaf 常见问题剖析 Ajax 常见问题剖析

November 27, 2020 · 1 min · jiezi

关于springboot:京淘day04京淘项目基础搭建

1.京淘我的项目架构设计 2.京淘项目表设计2.1表与表关系秘籍: 以本人为核心登程 2.1.1 一对一1.商品与形容:一对一2.形容与商品:一对一 2.1.2 一对多1.商品分类与商品:一对多2.商品与商品分类:一对一 2.1.3 多对多表设计: 角色与权限表形容:一个角色对应多个权限.一个权限对应多个角色.表的个数: 3张表 2.1.4 京淘表设计 2.2 导入数据库导入命令: source 门路:/xxx.sql; 2.2.1 装置数据库工具 2.2.2 导入数据库1).导入数据库2).抉择Sql文件 2.京淘我的项目环境搭建2.1分布式阐明2.1.1 传统我的项目中存在的问题阐明: 单体我的项目架构将所有的功能模块都写到一起,如果其中呈现了问题则间接影响整个程序的容许. 2.1.2 分布式架构(拆)1).能够依照功能模块能够将我的项目拆分为若干个子项目2).如果业务性能足够简单,则须要更加细粒度的拆分形式.拆分的意义: 应用分布式架构设计,能够无效的升高架构中的耦合性,进步程序的开发速度及运维速度. 2.1.3 分布式思维存在的问题问题1: 分布式架构中如何保障jar包文件的对立?问题2: 分布式架构中如何保障工具API的对立? 3京淘后盾我的项目创立3.1 创立父级工程3.1.1 创立目录 3.1.2 批改POM.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jt</groupId> <artifactId>jt</artifactId> <version>1.0-SNAPSHOT</version> <!--打包类型为POM 只有pom能力被其余我的项目继承--> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <!--指定JDK版本--> <java.version>1.8</java.version> <!--跳过测试类打包--> <skipTests>true</skipTests> </properties> <!--依赖的作用:依赖须要的jar包文件 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <!--spring-boot-starter-xxx springboot启动项 开箱即用: 只须要引入特定的jar包简略的配置,即能够应用该性能 --> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--反对热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--引入插件lombok 主动的set/get/构造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--增加数据库驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--springBoot整合jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--SpringBoot整合MybatisPlus mybatis和plus jar包抵触的--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!--springBoot整合JSP增加依赖 --> <!--servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--jstl依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--使jsp页面失效 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> <!--不要增加build标签 --></project>3.2 创立工具API我的项目3.2.1 创立本人工程 ...

November 27, 2020 · 1 min · jiezi

关于springboot:京淘day03SpringBoot整合web

1.SpringBoot整合web资源1.1 创立动静web资源 1.2 我的项目构造 1.3 增加资源/jar包1).增加资源2).增加jar包文件 <!--springBoot整合JSP增加依赖 --> <!--servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--jstl依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--使jsp页面失效 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>1.4 增加YML配置文件server: port: 8090 servlet: context-path: / #我的项目根目录公布spring: datasource: url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root mvc: #引入mvn配置 view: prefix: /WEB-INF/ # /默认代表根目录 src/main/webapp suffix: .jsp# Spring整合Mybatis-plus配置mybatis-plus: type-aliases-package: com.jt.pojo mapper-locations: classpath:/mybatis/mappers/*.xml #开启驼峰映射 configuration: map-underscore-to-camel-case: true# 打印Mybatissql语句logging: level: com.jt.mapper: debug1.5 入门案例需要: 用户通过http://localhost:8090/findAll 获取全副userList汇合,并且在userList.jsp页面中进行表格数据展示 ...

November 27, 2020 · 2 min · jiezi

关于springboot:13SpringBoot工程中ajax技术分析及应用

Ajax 技术简介背景剖析?在互联网高速倒退的明天,传统的WEB利用,对于高并发、高性能、高可靠性的要求已火烧眉毛。单线程形式的客户端与服务端交互方式曾经不能满足现阶段的需要.咱们须要以异步、按需加载的形式从服务端获取数据并及时刷新,来进步用户体验,于是Ajax技术诞生。 Ajax 是什么?Ajax (Asynchronous JavaScript and XML) 是一种Web利用客户端技术,能够借助客户端脚本(javascript)与服务端利用进行异步通信(能够有多个线程同时与服务器交互),并且按需获取服务端数据当前,能够进行部分刷新,进而进步数据的响应和渲染速度。 Ajax 利用场景?Ajax技术最大的劣势就是底层异步,而后部分刷新,进而进步用户体验,这种技术当初在很多我的项目中都有很好的利用,例如: 商品零碎。评估零碎。地图零碎。…..AJAX能够仅向服务器发送并取回必要的数据,并在客户端采纳JavaScript解决来自服务器的响应。这样在服务器和浏览器之间替换的数据大量缩小,服务器响应的速度就更快了。但Ajax技术也有劣势,最大劣势是不能间接进行跨域拜访。 Ajax 利用模型剖析?Ajax 疾速入门Ajax 申请响应过程剖析传统形式是web申请与响应(客户端要期待响应后果),如图所示: Ajax形式的申请与响应(要害是客户端不阻塞),如图所示: Ajax 编程步骤及模板代码剖析Ajax 编码的根本步骤?(重点是ajax技术的入口-XMLHttpRequest-XHR对象) 第一步:基于dom事件创立XHR对象第二步:在XHR对象上注册状态监听(监听客户端与服务端的通信过程)第三步:与服务端建设连贯(指定申请形式,申请url,同步还是异步)第四步:发送申请(将申请数据传递服务端) Ajax 编码过程的模板代码如下: var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ console.log(xhr.responseText) }}xhr.open("GET",url,true);xhr.send(null); SpringBoot 我的项目Ajax技术利用入门剖析第一步:创立我的项目module,如图所示: 第二步:增加Spring web依赖,代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>第三步:创立AjaxController解决客户端申请,代码如下: package com.cy.pj.ajax.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class AjaxController { @RequestMapping("/doAjaxStart") public String doAjaxStart(){ return "Response Result Of Ajax Get Request 01 "; }}第四步:在我的项目中static目录下,创立一个页面ajax-01.html,代码如下: html元素代码如下: <h1>The Ajax 01 Page</h1><fieldset> <legend>Ajax 异步Get申请</legend> <button onclick="doAjaxStart()">Ajax Get Request</button> <span id="result">Data is Loading ...</span></fieldset>javascript 脚本代码如下: ...

November 26, 2020 · 3 min · jiezi

关于springboot:07SpringBootMyBatisSpring技术整合实现商品品牌模块的CRUD操作

业务形容需要形容任何一个电商零碎中都有一个商品子系统,而与商品相关联都会有一个品牌信息管理,在以后业务零碎设计中咱们就是要对商品品牌信息的治理进行设计和实现. 业务架构剖析在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 业务根本原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 品牌列表页面 品牌编辑页面 我的项目技术架构剖析及设计在品牌治理模块实现过程,咱们采纳典型的C/S架构进行实现.客户端咱们基于浏览器进行实现,服务端采纳tomcat,数据库应用MySQL.具体应用层基于MVC分层架构进行实现. 我的项目技术栈利用剖析及选型客户端技术:html,css,javascript,bootstrap服务端技术:hikaricp,mybatis,spring,springboot,thymeleaf数据库技术:mysql,sql开发工具集:jdk1.8,maven3.6.3,idea2020.2我的项目品牌模块外围API剖析与设计基于分层架构设计思维,现对品牌API进行设计,如图所示: 数据库及表的剖析与设计设计并创立数据库如果数据库已存在,则先删除数据库,代码如下: drop database if exists dbbrand;创立新的数据库,代码如下: create database dbbrand default character set utf8;设计并创立品牌(Brand)表关上数据库,语句如下: use dbbrand;在dbbrand数据库中创立品牌表. create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;基于SQL脚本执行数据库初始化将数据库设计脚本写到brand.sql中,而后按如下步骤执行: 关上mysql自带客户端,登录mysql,指令如下: mysql -uroot -proot设置客户端编码,指令如下: set names utf8;执行sql脚本,指令如下: source d:/brand.sql脚本执行胜利当前,在客户端查问数据之前,先执行如下语句: set names gbk;我的项目环境初始化筹备操作1)JDK 1.82)Maven 3.6.33)IDEA 2020.24)MySQL 5.7+ 创立我的项目Module关上idea,而后基于设计,创立我的项目module,如图所示: 增加我的项目Module依赖MySQL 驱动<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>Srping Jdbc 提供了HikariCP连接池<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>MyBatis 资源<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>Spring Web 依赖 (内置一个tomcat服务)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖 (html模板引擎)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>我的项目Module根底配置关上我的项目Module配置文件application.properties,并增加如下内容: ...

November 26, 2020 · 4 min · jiezi

关于springboot:京淘day02

SpringBoot高级用法1.1 对于配置文件阐明1.1.1 properties文件阐明1.语法 1. key=value 构造2.pro中的属性-值默认条件下都是String类型 不须要增加引号 1.1.2 YML文件阐明#语法 # 1. 数据结构 key: value 应用:(空格)链接 # 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server: port: 80901.2 为属性赋值1.2.1 业务需要有时须要动静的获取属性的值,如果间接写到代码中需从新打包编译,代码的耦合性较高.是否利用配置文件的形式,动静的为属性赋值? 1.2.2 YML形式为属性赋值1).编辑YML配置文件 #语法 # 1. 数据结构 key: value 应用:(空格)链接 # 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server: port: 8090# 为Redis设定属性和属性值redis.host: 127.0.0.1redis.port: 63792).为属性赋值 package com.jt.controller;import org.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class RedisController { /** * 当程序启动时,会主动的加载YML配置文件,将数据保留到Spring的外部. * 之后通过${key}(spel表达式)进行数据的取值. */ @Value("${redis.host}") private String host; // = "127.0.0.1"; @Value("${redis.port}") private int port; // = 6379; @RequestMapping("/getNode") public String getNode(){ return host + ":" + port; }}1.2.3 指定配置文件为属性赋值1).定义properties文件2).编辑RedisController ...

November 26, 2020 · 4 min · jiezi

关于springboot:Springboot整合mybatis的几个小点

1、包别名2、驼峰映射规定

November 25, 2020 · 1 min · jiezi

关于springboot:cgb2008京淘day02

SpringBoot高级用法1.1 对于配置文件阐明1.1.1 properties文件阐明1.语法: k-v构造 key=value2.数据类型: 默认是String数据类型 不要增加多余的""号3.字符数据类型: properties的默认的加载的编码格局为ISO-8859-1 所以增加中文是须要字符转意.4.毛病: 所有的key都必须手动的编辑 没有方法复用 所以引入了yml配置 1.1.2 YML文件阐明#语法# 1. 数据结构 key: value 应用:(空格)链接# 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server:port: 80901.2 为属性赋值1.2.1 业务需要有时须要动静的获取属性的值,如果间接写到代码中须要从新打包编译,代码的耦合性较高.是否利用配置文件的形式,动静的为属性赋值? 1.2.2 YML形式为属性赋值1).编辑YML配置文件 #语法# 1. 数据结构 key: value 应用:(空格)链接# 2. YML文件中有文件父子级构造 采纳缩进的形式实现.server:port: 8090# 为Redis设定属性和属性值redis.host: 127.0.0.1redis.port: 63792).为属性赋值 package com.jt.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class RedisController {/*** 当程序启动时,会主动的加载YML配置文件,将数据保留到Spring的外部.* 之后通过${key}(spel表达式)进行数据的取值.*/@Value("${redis.host}")private String host; // = "127.0.0.1";@Value("${redis.port}")private int port; // = 6379;@RequestMapping("/getNode")public String getNode(){return host + ":" + port;}}1.2.3 指定配置文件为属性赋值1).定义properties文件2).编辑RedisController ...

November 25, 2020 · 3 min · jiezi

关于springboot:分布式电商项目二分布式思想项目搭建

商品后盾治理 页面JS编辑 存储浮点数存在精度问题,所以价格咱们会在数据库中*100来存储,在前端来解决 function submitForm(){ //表单校验 if(!$('#itemAddForm').form('validate')){ $.messager.alert('提醒','表单还未填写实现!'); return ; } //转化价格单位,将元转化为分 //$("#price").val(); 取值 $("#price").val(100); //eval() 专门做算数计算的 1+1 "1"+1 $("#itemAddForm [name=price]").val(eval($("#itemAddForm [name=priceView]").val()) * 100); itemAddEditor.sync();//将输出的内容同步到多行文本中 $.post("/item/save",$("#itemAddForm").serialize(), function(data){ if(data.status == 200){ $.messager.alert('提醒','新增商品胜利!'); }else{ $.messager.alert("提醒","新增商品失败!"); } }); } 封装SysResult阐明:在jt-common中增加零碎返回值VO对象 对于增删改操作,没有具体返回值的状况,咱们对立返回后果,如果程序执行异样返回201状态码,胜利才返回200状态码,前端能够依据状态码管制给用户的反馈 package com.jt.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; //作用: 指定零碎返回值vo对象,与前端进行交互 @Data @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor public class SysResult { private Integer status; //200胜利 201失败 private String msg; //服务器返回的提示信息 ...

November 24, 2020 · 1 min · jiezi

关于springboot:京淘day01

京淘我的项目架构设计 京淘项目表设计2.1 表与表关系秘籍: 以本人为核心登程 2.1.1 一对一1.商品与形容:一对一2.形容与商品:一对一 2.1.2 一对多1.商品分类与商品:一对多2.商品与商品分类:一对一 2.1.3 多对多表设计: 角色与权限表形容:一个角色对应多个权限.一个权限对应多个角色.表的个数: 3张表 2.1.4 京淘表设计 2.2 导入数据库导入命令: source 门路:/xxx.sql; 2.2.1 装置数据库工具 2.2.2 导入数据库1).导入数据库2).抉择Sql文件 2.3 筹备IDEA配置环境2.3.1 筹备空文件 2.3.2 装置lombok插件 2.3.3 批改键位 2.3.3 批改鼠标缩放 2.3.4 智能提醒 2.3.5 构建我的项目 2.3.6 配置maven指定本人的maven配置 2.3.7 配置主动保留 2.3.8 批改主动提醒启动构造方法的主动提醒 3.SpringBoot高级利用3.1 创立我的项目 3.2 增加jar包 3.3 对于Maven阐明Maven阐明: Maven是一站式的项目管理工具. 能够创立我的项目/治理我的项目/我的项目打包/依赖/公布等. 3.3.1 对于Maven坐标的阐明阐明:Maven中有很多其余机构的开源的jar包文件,未来通过坐标的模式进行对立的治理. <dependency> <groupId>org.springframework.boot 公司域名倒写</groupId> <artifactId>spring-boot-starter-web 项目名称</artifactId> <version>XX 版本号</version> </dependency>jar包地位:阐明:在Maven我的项目中如果A.jar依赖B.jar ,B.jar依赖C.jar.当程序通过依赖配置引入A.jar文件之后,会主动的增加B/C的jar包文件.mavenjar包依赖的原理:1).当用户增加jar包文件时,maven工具会依据jar包门路查问jar包文件2).当maven工具加载实现jar包之后,会去解析该文件的xxx.pom文件,之后解析该文件中是否还有jar包依赖,至此实现依赖的传递性. 3.3.3 maven工具如何实现jar包平安的传递SHA-1(英语:Secure Hash Algorithm 1,中文名:平安散列算法1)是一种明码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)公布为联邦数据处理规范(FIPS)。SHA-1能够生成一个被称为音讯摘要的160位(20字节)散列值,散列值通常的出现模式为40个十六进制数。常识:1.如果数据雷同,问: hash值是否雷同? 值是雷同的.2.问 一个数据10K,一个数据1G 问 运算速度如何? 一样快(约等于)数据传递的流程: ...

November 24, 2020 · 1 min · jiezi

关于springboot:17SpringBoot项目实践过程中遇到过哪些问题

SpringBoot 常见问题剖析 HikariCP 常见问题剖析 MyBatis常见问题剖析 Spring 常见问题剖析 thymeleaf 常见问题剖析 Ajax 常见问题剖析 我的项目中客户端JS常见问题 总结(Summary)本大节次要心愿进步同学们对问题的思考,剖析以及解决问题的能力,并对问题进行总结,积淀,造成教训和习惯。

November 24, 2020 · 1 min · jiezi

关于springboot:1607动吧旅游生态系统的设计项目业务拓展

1 首页菜单动态化实现1.1 背景用户心愿在登陆当前基于权限的不同,在首页左侧出现不同的菜单,如何实现呢? 1.2 初步剖析基于登陆用户id,查问用户对应的菜单信息而后进行出现 1.3 原理利用剖析计划实现上能够基于同步或异步查问而后进行菜单数据出现。 1.4 最终解决方案用户登陆当前,基于用户登陆id查问用户对应的一级菜单,二级菜单而后存储到指定作用域,当进入零碎首页后基于thymeleaf出现用户菜单。 1.4.1 Pojo类的定义基于用户需要将查问到的一级菜单以及一级菜单对应的二级菜单查问进去,并进行封装。 package com.cy.pj.sys.pojo;@Setter@Getter@ToStringpublic class SysUserMenu implements Serializable{ private static final long serialVersionUID = -8126757329276920059L; private Integer id; private String name; private String url; private List<SysUserMenu> childs;}1.4.2 Dao接口实现在SysMenuDao中增加办法,基于菜单id获取所有菜单相干信息,代码如下 /** * 基于菜单获取菜单信息 * **@param** menuIds * **@return** */List<SysUserMenu> findMenusByIds(List<Integer> menuIds);1.4.3 Mapper元素定义在SysMenuMapper.xml文件中增加如下映射元素: <select id="findMenusByIds" resultMap="sysUserMenu"> select p.id,p.name,p.url,c.id cid,c.name cname,c.url curl from sys_menus p join sys_menus c on c.parentId=p.id <where> <foreach collection="menuIds"open="("close=")"separator="or"item="menuId"> c.id=#{menuId} </foreach> and p.parentId is null </where> </select> <resultMap type="com.cy.pj.sys.pojo.SysUserMenu" id="sysUserMenu"> <!-- 一级菜单映射 --> <id property="id" column="id"/> <result property="name" column="name"/> <result property="url" column="url"/> <!-- 二级菜单映射 --> <collection property="childs" ofType="com.cy.pj.sys.pojo.SysUserMenu"> <id property="id" column="cid"/> <result property="name" column="cname"/> <result property="url" column="curl"/> </collection> </resultMap>1.4.4 Service接口及实现在SysMenuService接口及实现类中定义如下办法,基于用户id查问用户对应的菜单信息,代码如下 ...

November 24, 2020 · 2 min · jiezi

关于springboot:如何理解-Spring-Boot技术

Spring Boot 背景剖析JAVAEE利用体系中沉重的配置、低下的开发效率、高难度的三方集成,简单的部署流程等等始终被开发人员所诟病。即便是应用Spring这样的轻量级的资源整合框架,在实现其绝对比拟多的资源整合时,仍旧须要大量的手动依赖治理,简单的XML配置(还常常没有提醒)。还有就是当初的软件生态利用也曾经造成肯定的规模,零碎架构正在从单体架构,分布式架构,逾越到微服务架构。随着整个架构体系的变动,企业对技术的要求也在变动,当初的企业更重视技术的开箱即用,更重视技术在生态圈中的深度交融,更重视轻量级的运维。由此由此spring boot诞生。 Spring Boot 要解决什么问题Spring Boot是由Pivotal团队提供的全新的Java软件开发框架(很多人当初把它了解为一个脚手架),其设计目标是用来简化Spring我的项目的初始搭建以及开发过程。该框架应用了特定的注解形式来进行配置,从而使开发人员不再须要大量的xml配置。不再须要大量的手动依赖治理。Spring Boot基于疾速构建理念,通过约定大于配置,开箱即用的形式,心愿可能在蓬勃发展的疾速利用开发畛域成为其领导者。 Spring Boot 有哪些外围的要害个性起步依赖(Starter Dependency)。主动配置(Auto Configuration)。健康检查(Actator)-监控。嵌入式服务(Tomcat,Jetty)。总结(Summary)总之,Spring Boot 框架就是要基于疾速构建理念,基于约定大于配置形式,实现技术的开箱即用,以进步开发效率。

November 23, 2020 · 1 min · jiezi

关于springboot:springboot-mybatis-配置

本文介绍mybatis、mybatis-generator配置应用。 依赖装置<!--增加mysql相干插件--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>8.0.17</version></dependency><!--增加mybatis相干插件--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version></dependency><dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version></dependency><!--增加mybatis分页插件反对 依据需要可要可不要--><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version></dependency>增加数据源&mybatis配置springboot中mybatis配置文档:http://mybatis.org/spring-boo... application.properties增加如下内容: #================== mysql数据库 =====================#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/maven-test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#================== mybatis =====================##映射文件门路mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml#指定mybatis生成包mybatis.type-aliases-package=com.chenglulu.mybatis.entity.*#指定mybatis配置文件门路mybatis.config-location=classpath:mybatis/mybatis-config.xmlmybatis配置文件mybatis-config.xml如下 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <!-- 全局的映射器启用或禁用缓存。 --> <setting name="cacheEnabled" value="true"/> <!-- 全局启用或禁用提早加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 容许或不容许多种后果集从一个独自的语句中返回 --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 应用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 容许JDBC反对生成的键 --> <setting name="useGeneratedKeys" value="false"/> <!-- 配置默认的执行器 --> <setting name="defaultExecutorType" value="SIMPLE"/> <!-- 设置超时工夫 --> <setting name="defaultStatementTimeout" value="60"/> <!-- 设置驼峰标识 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor" /> </plugins><!-- <mappers>--><!-- <package name="classpath:mybatis/mapper/*Mapper.xml"></package>--><!-- </mappers>--></configuration>mybatis-generator配置在classpath:mybatis门路下新建mybatis-generator.xml文件。 ...

November 23, 2020 · 3 min · jiezi

关于springboot:springboot-lombok-介绍

简介lombok产生就是为了省去咱们手动创立getter和setter办法等等一些根本组件代码的麻烦,它可能在编译的时候帮忙咱们生成getter和setter办法。 常见注解@Setter 注解在类或字段。注解在类时为所有字段生成setter办法,注解在字段上时只为该字段生成setter办法@Getter 应用办法同@Setter,区别在于生成的是getter办法@ToString 注解在类,增加toString办法@EqualsAndHashCode 注解在类,生成hashCode和equals办法@NoArgsConstructor 注解在类,生成无参的构造方法@RequiredArgsConstructor 注解在类,为类中须要非凡解决的字段生成构造方法,比方final和被@NonNull注解的字段@AllArgsConstructor 注解在类,生成蕴含类中所有字段的构造方法@Data 注解在类,为类的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷办法,同时为所有非final字段注解@Setter依赖装置<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version></dependency>IDEA 插件装置如果IDEA没有装置lombok插件的话是会报错的。 IDEA官网插件网址:https://plugins.jetbrains.com/。 搜寻lombok并下载。 下载之后在IDEA中增加插件,步骤如下: 关上setting,抉择plugins,抉择install plugin from disk...,而后抉择下载的lombok插件文件装置就能够了。

November 23, 2020 · 1 min · jiezi

关于springboot:springboot-log4j2-配置介绍

配置文件节点介绍根节点Configuration属性: status: 用来指定log4j自身的打印日志级别;monitorinterval: 用来指定log4j主动重新配置的检测间隔时间,单位: s, 最小5s;子节点: AppendersLoggersAppenders节点Configuration根节点的子节点。 子节点: Console: 用来定义输入到控制台的Appender;RollingFile: 用来定义超过指定大小主动删除旧的创立新的的Appender;File: 用来定义输入到指定地位的文件的Appender;Console节点用来定义输入到控制台的Appender。 属性: name: 用来指定Appender的名称;target: 可选值 SYSTEM_OUT 或 SYSTEM_ERR。个别只设置默认:SYSTEM_OUT;子节点: PatternLayout: 输入格局,默认值:%m%n;File节点用来定义输入到指定地位的文件的Appender。 属性: name: 用来指定Appender的名称;fileName: 指定输入日志的目标文件带全门路的文件名;子节点: PatternLayout: 输入格局,默认值:%m%n;ThresholdFilter: 指定输入级别;RollingFile节点用来定义超过指定大小主动删除旧的创立新的的Appender。 属性: name: 用来指定Appender的名称;fileName: 指定输入日志的目标文件带全门路的文件名;filePattern: 指定新建日志文件的名称格局;子节点: PatternLayout: 输入格局,默认值:%m%n;DefaultRolloverStrategy: 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创立新的(通过max属性);Policies: 指定滚动日志的策略,就是什么时候进行新建日志文件输入日志;Filters: 决定日志事件是否被输入。过滤条件有三个值:ACCEPT(承受), DENY(回绝) or NEUTRAL(中立);Policies节点RollingFile节点的子节点,指定滚动日志的策略。 子节点: TimeBasedTriggeringPolicy: 基于工夫的滚动策略,interval属性用来指定多久滚动一次,默认是1hour。modulate=true用来调整工夫:比方当初是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am;SizeBasedTriggeringPolicy: 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小;PatternLayout节点Console节点、File节点、RollingFile节点的子节点,指定输入格局,不设置默认为:%m%n。 属性: pattern: 指定日志格局;日期格局: %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产工夫%p : 日志输入格局%c : logger的名称%m : 日志内容, 即 logger.info("message")%n : 换行符%C : Java类名%L : 日志输入所在行数%M : 日志输入所在办法名hostName : 本地机器名hostAddress : 本地ip地址ThresholdFilter节点Filter节点的子节点,决定日志事件是否被输入。过滤条件有三个值:ACCEPT(承受), DENY(回绝) or NEUTRAL(中立)。 ...

November 23, 2020 · 1 min · jiezi

关于springboot:SpringBoot高级篇三Web项目

web我的项目创立创立一般的maven我的项目,咱们手动增加依赖 1.<!--指定我的项目打包形式--><packaging>war</packaging>2.<!--springBoot整合JSP增加依赖 --><!--servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><!--jstl依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId></dependency><!--使jsp页面失效 --><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency>定义启动类 批改启动项目录 批改YML配置 创立jsp页面的目录构造 异步形式调用AJAX原理特点: 部分刷新:异步调用(加载)调用原理阐明:1.用户将申请发给AJAX引擎进行解决.之后期待引擎返回数据.2.ajax引擎接管到用户的申请之后.,代替用户拜访后端服务器,3.后端服务器接管申请之后,执行业务解决. 并且将返回值返回.4.ajax引擎收到返回值后果之后,要在第一工夫告诉给用户. 利用回调函数将数据传给客户端.ajax调用胜利. AJAX的一些技巧遍历索引用 in 遍历一条数据用 of <script type="text/javascript"> /* 页面加载实现后执行 */ $(function(){ /* 需要:利用ajax形式动静获取user数据信息 申请网址:localhost/findAjax 知识点: 返回值类型:能够依据数据主动匹配类型,所以能够省略 1.$.get(url地址,param参数,回调函数,返回值类型) 2.$.post(.....) 3.$.getJSON(.....) */ $.get("findAjax",{id:40},function(res){ //1.能够应用js中的for循环 /* for(let index in res){} */ /* index示意索引 应用 in */ /* user 示意对象 应用 of */ for(let user of res){ let id=user.id; let name=user.name; let age=user.age; let sex=user.sex; let tr ="<tr align='center'><td>"+id+"</td><td>"+name+"</td><td>"+age+"</td><td>"+sex+"</td></tr>"; $("#tableId").append(tr); } }) })</script>

November 21, 2020 · 1 min · jiezi

关于springboot:分布式一SpringBoot配置原理

Maven工具高级用法阐明: maven中 如果 A----->B-------->C 那么在我的项目中引入A包,就能够主动的引入BC!!!如何实现的???Maven工具解析原理:1). 用户通过dependency标签依赖jar包时,maven工具会通过坐标去本地仓库中查找改jar包文件.2). maven查找jar包文件之后,解析以后jar包的POM.xml文件,引入相干依赖.原理阐明: 当通过pom.xml文件增加依赖项时,maven工具会通过坐标查找jar包文件.当加载jar包实现之后,会解析以后的POM.xml文件,如果其中还有jar包的依赖项吗,则再次解析加载jar包.最终实现jar包传递性的实现maven中jar包传输准则问题:jar包文件 如何保障在近程传输的过程中不被他人篡改???算法介绍: SHA1算法 SHA-1(英语:Secure Hash Algorithm 1,中文名:平安散列算法1)是一种明码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)公布为联邦数据处理规范(FIPS)。SHA-1能够生成一个被称为音讯摘要的160位(20字节)散列值,散列值通常的出现模式为40个十六进制数。 SpringBoot配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- Maven:Maven是一站式的项目管理工具,负责我的项目的构建/打包/测试/公布等工作。 知识点一:理解坐标的的作用 maven我的项目标识 组id/项目名称/版本号 称之为maven的坐标 1.maven中治理的jar包文件泛滥 如何无效的治理呢? 采纳坐标的模式 2.在本地的仓库中jar包地位就是坐标的地位,maven工作通过坐标查找执行的jar 知识点二:maven中的jar包文件具备依赖的传递性 例子: A.jar ~~~ B.jar ~~~ C.jar ~~~ D.jar maven。jar包的传递性如何实现? 当通过pom.xml文件增加依赖时,maven会依据坐标查找jar包文件。 当加载jar包实现之后,会解析以后的pom.xml文件,如果其中还有jar包的依赖项,则再次解析加载jar包 最终实现jar包的传递性 --> <groupId>com.jt</groupId> <artifactId>springboot_demo1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot_demo1</name> <description>Demo project for Spring Boot</description> <!-- 作用:1.parent标签 集中定义了springboot所有依赖jar包的版本信息(version),由官网解决了jar包冲突性问题 2.本地仓库中没有该文件的jar包,parent示意的是一个聚合工程(定义:大工程下蕴含许多小工程) --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!--maven我的项目的配置信息--> <properties> <!--指定了jdk版本信息--> <java.version>1.8</java.version> <!--跳过测试类运行 默认状况下程序打包会执行测试类,如果测试类有问题,则程序打包失败--> <skipTests>true</skipTests> </properties> <dependencies> <!-- 手动依赖项 该依赖项被springBoot进行了高度整合 springBoot帮忙大家动静的生成了配置我的项目,简化了配置的步骤,该配置称之为自动化的配置信息 spring-boot-starter springBoot自动化的启动项 开箱即用:只须要导入jar包简略的配置即可实现对应的性能 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--反对热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> <!--SpringBoot利用maven管理工具进行我的项目打包/公布/等操作--> <!--如果没有这个build标签,咱们打包公布时会提醒(jar中没有主清单属性)--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>对于Maven命令执行1.清空target文件2.编译我的项目3.我的项目打包操作 ...

November 21, 2020 · 3 min · jiezi

关于springboot:1606动吧旅游生态系统的设计Shiro安全框架

Shiro平安框架简介Shiro概述Shiro是apache旗下一个开源平安框架(http://shiro.apache.org/),它将软件系统的平安认证相干的性能抽取进去,实现用户身份认证,权限受权、加密、会话治理等性能,组成了一个通用的平安认证框架。应用shiro就能够十分疾速的实现认证、受权等性能的开发,升高零碎老本。用户在进行资源拜访时,要求零碎要对用户进行权限管制,其具体流程如图-1所示: Shiro概要架构在概念层面,Shiro 架构蕴含三个次要的理念,如图-2所示:其中: Subject :主体对象,负责提交用户认证和受权信息。SecurityManager:平安管理器,负责认证,受权等业务实现。Realm:畛域对象,负责从数据层获取业务数据。Shiro具体架构Shiro框架进行权限治理时,要波及到的一些外围对象,次要包含:认证治理对象,受权治理对象,会话治理对象,缓存治理对象,加密治理对象以及Realm治理对象(畛域对象:负责解决认证和受权畛域的数据访问题)等,其具体架构如图-3:其中: Subject(主体):与软件交互的一个特定的实体(用户、第三方服务等)。SecurityManager(平安管理器) :Shiro 的外围,用来协调治理组件工作。Authenticator(认证管理器):负责执行认证操作。Authorizer(受权管理器):负责受权检测。SessionManager(会话治理):负责创立并治理用户 Session 生命周期,提供一个强有力的 Session 体验。SessionDAO:代表 SessionManager 执行 Session 长久(CRUD)动作,它容许任何存储的数据挂接到 session 治理根底上。CacheManager(缓存管理器):提供创立缓存实例和治理缓存生命周期的性能。Cryptography(加密管理器):提供了加密形式的设计及治理。Realms(畛域对象):是shiro和你的应用程序平安数据之间的桥梁。Shiro框架认证拦挡实现(filter)Shiro根本环境配置增加shiro依赖实用spring整合shiro时,须要在pom.xml中增加如下依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.0</version></dependency>Shiro外围对象配置基于SpringBoot 实现的我的项目中,没有提供shiro的自动化配置,须要咱们本人配置。 第一步:创立SpringShiroConfig类。要害代码如下: package com.cy.pj.common.config;/**@Configuration 注解形容的类为一个配置对象, * 此对象也会交给spring治理 */@Configurationpublic class SpringShiroConfig {}第二步:在Shiro配置类中增加SecurityManager配置(这里肯定要使org.apache.shiro.mgt.SecurityManager这个接口对象),要害代码如下: @Beanpublic SecurityManager securityManager() { DefaultWebSecurityManager sManager=new DefaultWebSecurityManager(); return sManager;}第三步: 在Shiro配置类中增加ShiroFilterFactoryBean对象的配置。通过此对象设置资源匿名拜访、认证拜访。要害代码如下: @Beanpublic ShiroFilterFactoryBean shiroFilterFactory (SecurityManager securityManager) { ShiroFilterFactoryBean sfBean=new ShiroFilterFactoryBean(); sfBean.setSecurityManager(securityManager); //定义map指定申请过滤规定(哪些资源容许匿名拜访,哪些必须认证拜访) LinkedHashMap<String,String> map= new LinkedHashMap<>(); //动态资源容许匿名拜访:"anon" map.put("/bower_components/**","anon"); map.put("/build/**","anon"); map.put("/dist/**","anon"); map.put("/plugins/**","anon"); //除了匿名拜访的资源,其它都要认证("authc")后拜访 map.put("/**","authc"); sfBean.setFilterChainDefinitionMap(map); return sfBean; }其配置过程中,对象关系如下图-4所示: ...

November 21, 2020 · 4 min · jiezi

关于springboot:1605动吧旅游生态系统的设计用户管理设计

用户治理设计说明业务设计说明本模块次要是实现对用户信息的治理,包含用户查问,保留,更新,禁用启用等操作,其业务剖析如下图所示:图-1所示:基于对表的设计,其数据逻辑关系的展现,如图-2所示:用户表设计的脚本如下: CREATE TABLE `sys_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) DEFAULT NULL COMMENT '明码', `salt` varchar(50) DEFAULT NULL COMMENT '盐', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', `valid` tinyint(4) DEFAULT NULL COMMENT '状态', `deptId` int(11) DEFAULT NULL, `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='零碎用户';用户与角色的关系表脚本设计如下: ...

November 21, 2020 · 7 min · jiezi

关于springboot:16动吧旅游生态系统的设计角色管理设计

1 角色治理设计说明1.1 业务设计说明本模块次要实现的是企业外部角色(岗位)的治理,能够在增加角色时,为角色分配资源拜访权限,最初将角色再调配给用户,图-1 所示:基于对表的设计,其数据逻辑关系的展现,如图-2 所示:角色表设计脚本如下: CREATE TABLE `sys_roles` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL COMMENT '角色名称', `note` varchar(500) DEFAULT NULL COMMENT '备注', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT='角色';菜单与角色的关系表脚本设计如下: CREATE TABLE `sys_role_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) DEFAULT NULL COMMENT '角色 ID', `menu_id` int(11) DEFAULT NULL COMMENT 'ID', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系';用户与角色关系表设计脚本如下: ...

November 21, 2020 · 6 min · jiezi

关于springboot:在springBoot项目配置项目的访问路径的时候-servercontextpath不起作用的原因

server.context-path不起作用的起因在SpringBoot2.0.2版本之前 应用这个设置我的项目的拜访门路是应用这个参数 例如:server.context-path =/boot server.context-path =/boot然而在springBoot的版本升级到2.0.2版本之后 这个参数就不起作用了,扭转成了 server.servlet.context-path=/boot才会起作用。 server.servlet.context-path=/boot

November 21, 2020 · 1 min · jiezi

关于springboot:springboot整合log4j2日志

引入jar包springboot默认是用logback日志框架的,所以须要排除logback,不然会呈现jar依赖抵触的谬误。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 去掉springboot默认配置 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions></dependency><!-- 引入log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>

November 20, 2020 · 1 min · jiezi

关于springboot:IDEA新建springboot-maven项目

装置JDKmac 装置JDK maven配置配置settings.xml下载源: <!-- 阿里云仓 --><mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url></mirror><!-- 地方仓库1<mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url></mirror>--><!-- 地方仓库2<mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url></mirror>-->创立我的项目简略我的项目间接点击 next 进行下一步,不要勾选 Create from archetype 选项。 Name: 项目名称。Location: 我的项目存储门路。GroupId: 项目组,个别为公司域名的反写。ArtifactId: 项目组内惟一的ID,用作项目名称。Version: 版本号。 生成我的项目构造如下:

November 20, 2020 · 1 min · jiezi

关于springboot:16动吧旅游生态系统的设计菜单管理设计

业务设计说明菜单治理又称为资源管理,是系统资源对外的表现形式。本模块次要是实现对菜单进行增加、批改、查问、删除等操作。其表设计语句如下: CREATE TABLE `sys_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '资源名称', `url` varchar(200) DEFAULT NULL COMMENT '资源URL', `type` int(11) DEFAULT NULL COMMENT '类型     1:菜单   2:按钮', `sort` int(11) DEFAULT NULL COMMENT '排序', `note` varchar(100) DEFAULT NULL COMMENT '备注', `parentId` int(11) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', `permission` varchar(500) DEFAULT NULL COMMENT '受权(如:sys:user:create)', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='资源管理';菜单表与角色表是多对多的关系,在表设计时,多对多关系通常由两头表(关系表)进行保护,如图-1所示:基于角色菜单表的设计,其角色和菜单对应的关系数据要存储到关系表中,其具体存储模式,如图-2所示:菜单与角色的关系表脚本设计如下: ...

November 19, 2020 · 6 min · jiezi

关于springboot:MyBatis高级应用之逆向工程自动生成SQL语句

本文以Spring整合MyBatis环境下,介绍MyBatis逆向工程主动生成pojo,mapper,dao的Java类。MyBatis的一个次要的特点就是须要程序员本人编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官网提供了一个逆向工程,能够针对单表主动生成mybatis执行所须要的代码,个别在开发中,罕用的逆向工程形式是通过数据库的表生成代码。下图为逆向工程依赖的jar包。mybatis-generator-core-1.3.6.jar为逆向工程的外围包 mysql-connector-java-8.0.9-rc.jar为连贯数据库所需驱动 mybatis-3.4.6.jar为mybatis框架依赖的jar包,到这里就足够了,这里能够增加日志文件,因为不是必须的所以就省略了,咱们只须要下面三个包就能够应用mybatis的逆向工程了。上面看一下它依赖的配置文件。 这是配置文件的寄存地位,肯定要放在我的项目的根目录下,不要办法src下,因为一会用到File来加载这个配置文件。 <context 标签,id轻易取,目前用不到。 targetRuntime运行环境,目前2018年4月30号Mybatis最新的版本为3.4.6,所以这里写3就好,再过几年有可能会变成4。<commentGenerator>下有个 <property name="suppressAllComments" value="true" /> 标签,该标签value为true的时候不显示生成pojo外面的正文,这里生成的是英文正文,所以默认抉择为true即可。<jdbcConnection>标签须要创立connection对象根本的url,user,password,driverClass四个属性,依照图中格局配置即可。被正文掉的局部是链接oracle数据库的格局 <javaTypeResolver>标签用于将数据库中的DECIMAL和NUMERIC在pojo类中解析为java.math.BigDecimal类型,所以咱们这里写false,全副解析为Integer类型。 这里的三个标签用于指定生成的mapper,pojo,与mapper接口的包名。和指定我的项目名,有时候开发中个别都会新建一个java工程来生成,而后将生成的文件拷贝到本人的工程中,这也不麻烦,而且很平安。 最初的table标签用于对哪些表应用逆向工程。正文掉的局部用于指定数据库字段的Java类型。上面咱们看一下执行代码。 如图所示,红色框框标识出的为逆向工程配置文件的地位,因为这里应用File构造方法传入门路,所以该配置文件必须放下我的项目录下,不要放在src/上面,否则读不到,会抛出文件没找到的异样,上面咱们执行一下试试。 这是控制台log4j日志打印出的,能够看到它找到数据库中的,字段,类型,长度等信息,到这里阐明生成胜利了。 咱们刷新一下我的项目发现src/下多少mapper和pojo包,都是方才逆向工程本人生成的。接下来咱们将mapper和pojo拷贝到Spring整合MyBatis环境中测试是否执行SQL语句操作。 这里补充下上一篇Spring整合MyBatis文章中遗记提到的,咱们通过配置mybatis的mapper扫描包,可能让Spring将MapperScannerConfigurer装入容器中,MapperScannerConfigurer可能扫描包下所有子孙包中的mapper接口,为咱们创立mapper的实现类。图中红色框框局部能够代替曾经正文掉的配置。因为没有指定接口的 bean名称,所以咱们只能通过传入mapper接口的class对象获取实现类,代码如下。图中重要代码曾经用红色框框标识出,UserExample是逆向工程生成pojoUser时创立的,该类封装了一些条件。Example.createCriteria()这个办法时创立了一个条件查问对象,这里和hibernate的Criteria对象十分相似,通过andSexEqualTo("1");办法,这个办法相当于where sex = “ 1 ”这种限定条件,而后当初调用usermapper中的办法,这里调用的是cunnt办法,传入example对象,因为上一行中example对象曾经被咱们封装了where sex = “ 1 ”的限定条件,usermapper.countByExample(example);这句代码执行后拼接成的sql语句就是 select count(1) form user where sex = '1';这也就是mybatis被称为半ORM框架的起因,也有了些许面向对象的意为,但性能上还不足以与弱小的hibernate相媲美。咱们在创立限定条件对象createCriteria()时,前面的条件是能够有限减少的,该对象反对各种简单查问,性能也还是非常弱小的。 以上就是mybatis的逆向工程介绍了,不光可能本人生成sql,pojo,mapper外,也封装了对数据库面向对象的操作,。

November 18, 2020 · 1 min · jiezi

关于springboot:16动吧旅游生态系统的设计日志管理设计说明

1.1 业务设计说明本模块次要是实现对用户行为日志(例如谁在什么工夫点执行了什么操作,拜访了哪些办法,传递的什么参数,执行时长等)进行记录、查问、删除等操作。其表设计语句如下: CREATE TABLE `sys_logs` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL COMMENT '登陆用户名', `operation` varchar(50) DEFAULT NULL COMMENT '用户操作', `method` varchar(200) DEFAULT NULL COMMENT '申请办法', `params` varchar(5000) DEFAULT NULL COMMENT '申请参数', `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)', `ip` varchar(64) DEFAULT NULL COMMENT 'IP 地址', `createdTime` datetime DEFAULT NULL COMMENT '日志记录时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统日志';1.2 原型设计说明基于用户需要,实现动态页面(html/css/js),通过动态页面为用户出现根本需要实现,如图-1 所示1.3 API 设计说明日志业务后盾 API 分层架构及调用关系如图-2 所示:阐明:分层目标次要将简单问题简单化,实现各司其职,各尽所能。2日志治理列表页面出现2.1 业务时序剖析当点击首页左侧的"日志治理"菜单时,其总体时序剖析如图-3 所示:2.2 服务端实现2.2.1 Controller 实现▪ 业务形容与设计实现基于日志治理的申请业务,在 PageController 中增加 doLogUI 办法,doPageUI 办法别离用于返回日志列表页面,日志分页页面。▪ 要害代码设计与实现第一步:在 PageController 中定义返回日志列表的办法。代码如下: ...

November 18, 2020 · 9 min · jiezi

关于springboot:SpringSecurity登录优雅集成图形验证码

前言在SpringSecurity的默认登录反对组件formLogin中没有提供图形验证码的反对,目前大多数的计划都是通过新增Filter来实现。filter的形式能够实现性能,然而没有优雅的解决, 须要从新保护一套和登录相干的url,例如:loginProccessUrl,loginFailUrl,loginSuccessUrl,从软件设计角度来讲性能没有内聚。上面为大家介绍一种优雅的解决方案。 解决思路先获取验证码判断图形验证码先要获取到验证码,在UsernamePasswordAuthenticationToken(UPAT)中没有字段来存储验证码,重写UPAT老本太高。能够从details字段中动手,将验证码放在details中。 判断验证码是否正确UPAT的认证是在DaoAuthenticationProvider中实现的,如果须要判断验证码间接批改是老本比拟大的形式,能够新增AuthenticationProvider来对验证码新增验证。 输入验证码惯例超过能够通过Controller来输入,然而验证码的治理须要对立,避免各种sessionKey乱飞。 代码实现新增验证码容器:CaptchaAuthenticationDetailspublic class CaptchaAuthenticationDetails extends WebAuthenticationDetails { private final String DEFAULT_CAPTCHA_PARAMETER_NAME = "captcha"; private String captchaParameter = DEFAULT_CAPTCHA_PARAMETER_NAME;/** * 用户提交的验证码 */private String committedCaptcha;/** * 预设的验证码 */private String presetCaptcha; private final WebAuthenticationDetails webAuthenticationDetails; public CaptchaAuthenticationDetails(HttpServletRequest request) { super(request); this.committedCaptcha = request.getParameter(captchaParameter); this.webAuthenticationDetails = new WebAuthenticationDetails(request); } public boolean isCaptchaMatch() { if (this.presetCaptcha == null || this.committedCaptcha == null) { return false; } return this.presetCaptcha.equalsIgnoreCase(committedCaptcha); } getter ... setter ... }这个类次要是用于保留验证码 ...

November 18, 2020 · 2 min · jiezi

关于springboot:spring-boot-2X-升级到23以上-hibernatevalidator-没有了

起因Spring Boot 2.3 把 Validation Starter 这部分从web starters 中挪走了,如果要援用的话须要退出依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>Spring Boot 2.3 版本阐明 呵呵,代码写多了,啥都能遇见???? 参考spirngboot降级到2.3之后,hibernate-validator隐没spring boot2.3.1版本导入spring-boot-starter-web没有validation校验框架的解决办法

November 17, 2020 · 1 min · jiezi

关于springboot:权限子系统一项目搭建

我的项目简介概述动吧游览生态系统,应市场高端用户需要,公司决定开发这样的一套游览零碎,此零碎蕴含游览电商零碎(举荐子系统,广告子系统,评估子系统,商品子系统,订单子系统,…),游览分销零碎(分销商的治理),游览业务零碎(产品研发,计调服务,零碎权限管理子系统,..),,。。。 原型剖析基于用户需要,进行原型设计(基于html+css+js进行动态页面实现)。例如零碎登录页面:零碎登录胜利页面(例如starter.html)菜单展现页面阐明:原型设计好当前,会与客户进行确认,确认好当前进行签字,而后就是设计和实现. 技术架构我的项目分层架构本我的项目应用层基于MVC设计思维,进行分层架构设计,其外围目标是将简单问题简单化,实现各司其职,各尽所能.而后基于“高内聚,低耦合”的设计思维,再实现各对象之间协同,从而进步零碎的可维护性,可扩展性。其中: 1.凋谢接口层:可间接封装 Service 办法裸露成 RPC (近程过程调用)接口;也可通过 Web 封装成 http 接口;同时也可进行网关安全控制、流量管制等。2.终端显示层:负责各个端的模板渲染并显示。以后次要是 thymeleaf 渲染,JS 渲染,挪动端展现等。3.Web申请解决层:次要是对访问控制进行转发,申请参数校验,响应后果解决等4.Service 层:绝对具体的业务逻辑服务层(外围业务,扩大业务)。 5.Manager 层:通用业务解决层,它有如下特色: 1) 对第三方平台封装的层,预处理返回后果及转化异样信息; 2) 对 Service 层通用能力的下沉,如缓存计划、中间件通用解决; 3) 与 DAO 层交互,对多个 DAO 的组合复用。6.DAO 层:数据拜访层,与底层 MySQL、Oracle、Hbase 等进行数据交互。7.内部接口或第三方平台:包含其它部门RPC凋谢接口,根底平台,其它公司的 HTTP 接口阐明:对如上分层中波及到常识的点,逐渐增强。 总之:分层的目标就是将简单问题进行拆解,而后分而治,进而进步零碎的可扩展性以及可维护性。 API利用架构整体API利用架构: 技术整合环境筹备数据库初始化启动MySQL客户端并登陆,而后执行 1) set names utf8;2) source d:/jtsys.sql -- MySQL dump 10.13 Distrib 5.7.21, for Win64 (x86_64)---- Host: localhost Database: jtsys-- -------------------------------------------------------- Server version 5.7.21/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;---- Table structure for table `sys_depts`--DROP DATABASE IF EXISTS dbsys;CREATE DATABASE IF NOT EXISTS dbsys DEFAULT character SET utf8;USE dbsys;DROP TABLE IF EXISTS `sys_depts`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_depts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '资源名称', `parentId` int(11) DEFAULT NULL COMMENT '上级部门', `sort` int(11) DEFAULT NULL COMMENT '排序', `note` varchar(100) DEFAULT NULL COMMENT '备注', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='部门治理';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_depts`--LOCK TABLES `sys_depts` WRITE;/*!40000 ALTER TABLE `sys_depts` DISABLE KEYS */;INSERT INTO `sys_depts` VALUES (2,'团体教研部',NULL,1,'团体教学和研发','2018-04-19 18:59:09','2020-01-12 14:13:22','admin',NULL),(4,'课程研发部',2,22,'负责课程研发','2018-04-22 18:10:58','2020-01-12 14:13:56',NULL,NULL),(5,'团体MIS部',NULL,13,'负责团体网络环境运维','2020-01-12 14:14:26','2020-01-12 14:14:26',NULL,NULL),(6,'市场部',NULL,6,'ccc','2020-04-28 15:53:23','2020-04-28 15:54:08',NULL,NULL),(7,'MIS-1部',5,5,'111','2020-04-28 15:53:46','2020-04-28 15:53:46',NULL,NULL);/*!40000 ALTER TABLE `sys_depts` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_logs`--DROP TABLE IF EXISTS `sys_logs`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_logs` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL COMMENT '用户名', `operation` varchar(50) DEFAULT NULL COMMENT '用户操作', `method` varchar(200) DEFAULT NULL COMMENT '申请办法', `params` varchar(5000) DEFAULT NULL COMMENT '申请参数', `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)', `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=175 DEFAULT CHARSET=utf8 COMMENT='系统日志';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_logs`--LOCK TABLES `sys_logs` WRITE;/*!40000 ALTER TABLE `sys_logs` DISABLE KEYS */;INSERT INTO `sys_logs` VALUES (11,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',1,'0:0:0:0:0:0:0:1','2018-04-17 19:54:36'),(12,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',155,'0:0:0:0:0:0:0:1','2018-04-18 15:14:44'),(13,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',165,'0:0:0:0:0:0:0:1','2018-04-19 18:52:35'),(14,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',75,'0:0:0:0:0:0:0:1','2018-04-19 19:10:36'),(15,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',69,'0:0:0:0:0:0:0:1','2018-04-19 19:12:46'),(16,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',187,'0:0:0:0:0:0:0:1','2018-04-19 23:27:14'),(17,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',103,'0:0:0:0:0:0:0:1','2018-04-20 13:11:37'),(18,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',85,'0:0:0:0:0:0:0:1','2018-04-20 13:55:04'),(19,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',89,'0:0:0:0:0:0:0:1','2018-04-20 13:57:12'),(20,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',69,'0:0:0:0:0:0:0:1','2018-04-20 13:58:32'),(21,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',291,'0:0:0:0:0:0:0:1','2018-04-20 15:22:55'),(22,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',158,'0:0:0:0:0:0:0:1','2018-04-22 16:20:56'),(23,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',94,'0:0:0:0:0:0:0:1','2018-04-22 17:05:34'),(24,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',138,'0:0:0:0:0:0:0:1','2018-04-22 17:20:32'),(25,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',124,'0:0:0:0:0:0:0:1','2018-04-22 17:24:12'),(26,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',75,'0:0:0:0:0:0:0:1','2018-04-22 17:31:51'),(27,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',148,'0:0:0:0:0:0:0:1','2018-04-22 17:33:25'),(28,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',69,'0:0:0:0:0:0:0:1','2018-04-22 17:39:26'),(29,'admin','登陆操作','com.jt.sys.service.impl.SysUserServiceImpl.login()','\"admin\"',120,'0:0:0:0:0:0:0:1','2018-04-22 19:10:28'),(39,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',13,'0:0:0:0:0:0:0:1','2020-01-12 08:54:53'),(40,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',9,'0:0:0:0:0:0:0:1','2020-01-12 09:29:59'),(41,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',6,'0:0:0:0:0:0:0:1','2020-01-12 09:35:25'),(42,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"admin\",1]',5,'0:0:0:0:0:0:0:1','2020-01-12 09:35:30'),(43,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',7,'0:0:0:0:0:0:0:1','2020-01-12 09:35:44'),(44,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',5,'0:0:0:0:0:0:0:1','2020-01-12 09:35:46'),(45,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',5,'0:0:0:0:0:0:0:1','2020-01-12 09:36:07'),(46,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,0,\"admin\"]',1,'0:0:0:0:0:0:0:1','2020-01-12 09:36:19'),(47,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,1,\"admin\"]',1,'0:0:0:0:0:0:0:1','2020-01-12 09:36:55'),(48,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,0,\"admin\"]',1,'0:0:0:0:0:0:0:1','2020-01-12 09:37:05'),(49,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',25,'0:0:0:0:0:0:0:1','2020-01-12 09:42:35'),(50,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,1,\"admin\"]',2,'0:0:0:0:0:0:0:1','2020-01-12 09:42:38'),(51,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,0,\"admin\"]',4,'0:0:0:0:0:0:0:1','2020-01-12 09:43:23'),(52,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[15,0,\"admin\"]',1,'0:0:0:0:0:0:0:1','2020-01-12 09:45:04'),(53,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',25,'0:0:0:0:0:0:0:1','2020-01-12 09:53:54'),(54,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,1,\"admin\"]',2,'0:0:0:0:0:0:0:1','2020-01-12 09:53:55'),(55,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,0,\"admin\"]',1,'0:0:0:0:0:0:0:1','2020-01-12 09:54:18'),(56,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',6,'0:0:0:0:0:0:0:1','2020-01-12 09:55:00'),(57,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,1,\"admin\"]',4,'0:0:0:0:0:0:0:1','2020-01-12 09:55:01'),(58,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16,0,\"admin\"]',2,'0:0:0:0:0:0:0:1','2020-01-12 09:55:04'),(59,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'0:0:0:0:0:0:0:1','2020-01-12 09:55:23'),(60,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'0:0:0:0:0:0:0:1','2020-01-12 10:37:24'),(61,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',9,'0:0:0:0:0:0:0:1','2020-01-12 10:37:49'),(62,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',27,'0:0:0:0:0:0:0:1','2020-01-12 11:04:16'),(63,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',9,'0:0:0:0:0:0:0:1','2020-01-12 11:05:58'),(64,'admin','用户查问','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',9,'0:0:0:0:0:0:0:1','2020-01-12 11:07:22'),(68,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',30,'192.168.1.112','2020-05-07 09:46:55'),(69,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',17,'192.168.1.112','2020-05-07 09:47:10'),(70,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',17,'192.168.1.112','2020-05-07 09:47:49'),(71,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16, 1]',72,'192.168.1.112','2020-05-07 09:47:58'),(72,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',16,'192.168.1.112','2020-05-07 09:52:18'),(73,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',16,'192.168.1.112','2020-05-07 09:52:27'),(74,'admin','operation','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[16, 0]',66,'192.168.1.112','2020-05-07 09:52:34'),(75,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',16,'192.168.1.112','2020-05-07 09:57:52'),(76,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',14,'192.168.1.112','2020-05-07 09:58:01'),(77,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[17, 0]',73,'192.168.1.112','2020-05-07 09:58:06'),(78,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',19,'0:0:0:0:0:0:0:1','2020-05-07 10:02:14'),(79,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',12,'192.168.2.101','2020-05-07 10:02:55'),(81,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',20,'192.168.2.101','2020-05-07 10:29:19'),(82,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',15,'192.168.2.101','2020-05-07 10:34:32'),(83,'admin','增加用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.saveObject','[SysUser(id=19, username=liqiang, password=302b67d0710e887cf8164426cd59da28, salt=4ddeb5b4-96dc-4def-a2d7-c6c924701b76, email=lq@t.com, mobile=1111111111111, valid=1, deptId=6, createdTime=null, modifiedTime=null, createdUser=null, modifiedUser=null), [Ljava.lang.Integer;@38d5aa5d]',536,'192.168.2.101','2020-05-07 10:35:08'),(84,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[, 1]',11,'192.168.2.101','2020-05-07 10:35:11'),(85,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',23,'192.168.2.101','2020-05-07 10:38:48'),(87,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 10:39:22'),(88,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',20,'192.168.2.101','2020-05-07 10:58:43'),(89,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'192.168.2.101','2020-05-07 10:59:06'),(90,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',12,'192.168.2.101','2020-05-07 11:13:09'),(91,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'192.168.2.101','2020-05-07 11:13:26'),(92,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',15,'192.168.2.101','2020-05-07 11:14:45'),(93,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',475,'192.168.2.101','2020-05-07 11:15:13'),(94,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[20,0]',198111,'192.168.2.101','2020-05-07 11:18:37'),(95,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',35,'192.168.2.101','2020-05-07 11:51:08'),(96,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',21,'192.168.2.101','2020-05-07 11:51:09'),(97,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',23,'192.168.2.101','2020-05-07 11:51:10'),(98,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',20,'192.168.2.101','2020-05-07 11:51:11'),(99,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',14,'192.168.2.101','2020-05-07 11:51:11'),(100,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',15,'192.168.2.101','2020-05-07 11:51:12'),(101,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',17,'192.168.2.101','2020-05-07 11:59:32'),(102,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 11:59:34'),(103,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',12,'192.168.2.101','2020-05-07 11:59:35'),(104,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',18,'192.168.2.101','2020-05-07 11:59:36'),(105,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 11:59:39'),(106,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',13,'192.168.2.101','2020-05-07 14:01:25'),(107,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 14:01:34'),(108,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',17,'192.168.2.101','2020-05-07 14:03:46'),(109,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 14:04:57'),(110,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',133,'192.168.2.101','2020-05-07 14:06:50'),(111,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',17,'192.168.2.101','2020-05-07 14:06:59'),(112,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',17,'192.168.2.101','2020-05-07 14:07:47'),(113,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',26,'192.168.2.101','2020-05-07 14:07:52'),(114,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',14,'192.168.2.101','2020-05-07 14:17:59'),(115,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',14,'192.168.2.101','2020-05-07 14:21:45'),(116,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',16,'192.168.2.101','2020-05-07 14:23:40'),(117,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',13,'192.168.2.101','2020-05-07 14:32:09'),(118,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',164,'192.168.2.101','2020-05-07 15:39:35'),(119,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',16,'192.168.2.101','2020-05-07 15:39:53'),(120,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',16,'192.168.2.101','2020-05-07 15:39:54'),(121,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',18,'192.168.2.101','2020-05-07 15:39:54'),(122,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',31,'192.168.2.101','2020-05-07 15:39:55'),(123,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 15:39:55'),(124,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'192.168.2.101','2020-05-07 15:39:56'),(125,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',14,'192.168.2.101','2020-05-07 15:39:56'),(126,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',17,'192.168.2.101','2020-05-07 15:39:57'),(127,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',19,'192.168.2.101','2020-05-07 15:39:57'),(128,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'192.168.2.101','2020-05-07 15:39:58'),(129,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',204,'192.168.2.101','2020-05-07 15:46:18'),(131,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',24,'0:0:0:0:0:0:0:1','2020-05-08 15:35:44'),(132,'admin','禁用启用','com.cy.pj.sys.service.impl.SysUserServiceImpl.validById','[20,1]',6,'0:0:0:0:0:0:0:1','2020-05-08 15:36:12'),(133,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',21,'0:0:0:0:0:0:0:1','2020-05-08 17:21:26'),(134,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"admin\",1]',10,'0:0:0:0:0:0:0:1','2020-05-08 17:21:36'),(136,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"admin\",1]',12,'0:0:0:0:0:0:0:1','2020-05-09 09:51:16'),(137,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',12,'0:0:0:0:0:0:0:1','2020-05-09 10:23:55'),(162,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',28,'127.0.0.1','2020-05-11 13:03:18'),(163,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',24,'0:0:0:0:0:0:0:1','2020-05-11 14:34:10'),(164,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',20,'0:0:0:0:0:0:0:1','2020-05-11 17:50:48'),(165,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",2]',20,'0:0:0:0:0:0:0:1','2020-05-11 17:50:52'),(166,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',13,'0:0:0:0:0:0:0:1','2020-05-11 17:50:53'),(167,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",2]',23,'0:0:0:0:0:0:0:1','2020-05-11 17:50:55'),(168,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",6]',10,'0:0:0:0:0:0:0:1','2020-05-11 17:50:57'),(169,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',13,'0:0:0:0:0:0:0:1','2020-05-11 17:55:24'),(170,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',149,'0:0:0:0:0:0:0:1','2020-05-12 08:26:02'),(171,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',12,'0:0:0:0:0:0:0:1','2020-05-12 10:44:58'),(172,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',71,'0:0:0:0:0:0:0:1','2020-05-27 14:28:20'),(173,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',11,'0:0:0:0:0:0:0:1','2020-05-27 14:28:29'),(174,'admin','查问用户','com.cy.pj.sys.service.impl.SysUserServiceImpl.findPageObjects','[\"\",1]',10,'0:0:0:0:0:0:0:1','2020-05-27 14:28:36');/*!40000 ALTER TABLE `sys_logs` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_menus`--DROP TABLE IF EXISTS `sys_menus`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '资源名称', `url` varchar(200) DEFAULT NULL COMMENT '资源URL', `type` int(11) DEFAULT NULL COMMENT '类型 1:菜单 2:按钮', `sort` int(11) DEFAULT NULL COMMENT '排序', `note` varchar(100) DEFAULT NULL COMMENT '备注', `parentId` int(11) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', `permission` varchar(500) DEFAULT NULL COMMENT '受权(如:user:create)', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8 COMMENT='资源管理';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_menus`--LOCK TABLES `sys_menus` WRITE;/*!40000 ALTER TABLE `sys_menus` DISABLE KEYS */;INSERT INTO `sys_menus` VALUES (8,'系统管理','申请门路',1,8,NULL,NULL,'','2017-07-12 15:15:59','2020-01-12 14:11:15','admin',NULL),(25,'日志治理','log/log_list',1,25,NULL,8,'sys:log:view','2017-07-12 15:15:59','2020-04-28 14:55:33','admin',NULL),(45,'用户治理','user/user_list',1,45,NULL,8,'sys:user:view','2017-07-12 15:15:59','2020-01-12 14:10:10','admin',NULL),(46,'菜单治理','menu/menu_list',1,46,NULL,8,'sys:menu:view','2017-07-12 15:15:59','2020-01-12 14:10:28','admin',NULL),(47,'角色治理','role/role_list',1,47,NULL,8,'sys:role:view','2017-07-12 15:15:59','2020-01-12 14:10:48','admin',NULL),(115,'查问','menu/doFindObjects',2,1,NULL,46,'sys:menu:view','2017-07-13 16:33:41','2020-01-12 14:21:29',NULL,NULL),(116,'增加','menu/doSaveObject',2,2,NULL,46,'sys:menu:add','2017-07-13 16:34:02','2020-01-12 14:21:56',NULL,NULL),(117,'批改','menu/doUpdateObject',2,3,NULL,46,'sys:menu:update','2017-07-13 16:34:25','2020-01-12 14:22:12',NULL,NULL),(118,'删除','role/doDeleteObject',2,4,NULL,46,'sys:menu:delete','2017-07-13 16:34:46','2020-01-12 14:22:41',NULL,NULL),(119,'查问','user/doFindPageObjects',2,1,NULL,45,'sys:user:view','2017-07-13 16:35:05','2020-01-12 14:20:28',NULL,NULL),(120,'查问','role/doFindPageObjects',2,1,NULL,47,'sys:role:view','2017-07-13 16:35:26','2020-01-12 14:23:05',NULL,NULL),(126,'新增','user/doSaveObject',2,2,NULL,45,'sys:user:add','2017-07-21 11:11:34','2020-01-12 14:20:45',NULL,NULL),(127,'批改','user/doUpdateObject',2,3,NULL,45,'sys:user:update','2017-07-21 11:11:56','2020-01-12 14:21:05',NULL,NULL),(128,'增加','role/doSaveObject',2,2,NULL,47,'sys:role:add','2017-07-21 11:14:24','2020-01-12 14:23:29',NULL,NULL),(129,'批改','role/doUpdateObject',2,3,NULL,47,'sys:role:update','2017-07-21 11:14:48','2020-01-12 14:23:44',NULL,NULL),(130,'删除','role/doDeleteObject',2,4,NULL,47,'sys:role:delete','2017-07-21 11:15:09','2020-01-12 14:24:05',NULL,NULL),(131,'删除','log/doDeleteObjects',2,27,NULL,25,'sys:log:delete','2020-01-10 17:34:31','2020-01-10 17:34:31',NULL,NULL),(137,'禁用启用','user/doValidById',2,123,NULL,45,'sys:user:update','2020-01-12 09:34:58','2020-01-12 09:34:58',NULL,NULL),(143,'查问','log/doFindPageObjects',2,210,NULL,25,'sys:log:view','2020-01-12 14:20:02','2020-01-12 14:20:02',NULL,NULL),(145,'批改明码','user/pwd_edit',1,17,NULL,8,'sys_pwd_edit','2020-05-09 14:35:48','2020-05-09 14:35:48',NULL,NULL),(146,'商品治理','',1,19,NULL,NULL,'sys:goods:view','2020-05-09 14:38:32','2020-05-09 14:38:32',NULL,NULL),(147,'根底治理','goods/goodles_list',1,22,NULL,146,'sys:goods:view','2020-05-09 14:39:46','2020-05-09 14:39:46',NULL,NULL),(148,'类目治理','category/category_list',1,23,NULL,146,'goods:category:view','2020-05-09 14:40:34','2020-05-09 14:40:34',NULL,NULL);/*!40000 ALTER TABLE `sys_menus` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_role_menus`--DROP TABLE IF EXISTS `sys_role_menus`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_role_menus` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) DEFAULT NULL COMMENT '角色ID', `menu_id` int(11) DEFAULT NULL COMMENT 'ID', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1400 DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_role_menus`--LOCK TABLES `sys_role_menus` WRITE;/*!40000 ALTER TABLE `sys_role_menus` DISABLE KEYS */;INSERT INTO `sys_role_menus` VALUES (1334,NULL,8),(1335,NULL,25),(1336,NULL,131),(1337,NULL,143),(1338,NULL,45),(1339,NULL,119),(1340,NULL,126),(1341,NULL,127),(1342,NULL,137),(1349,49,8),(1350,49,47),(1351,49,120),(1352,49,128),(1353,49,129),(1354,49,130),(1361,47,8),(1362,47,25),(1363,47,131),(1364,47,143),(1365,47,45),(1366,47,119),(1367,47,126),(1368,47,127),(1369,47,137),(1370,47,46),(1371,47,115),(1372,47,116),(1373,47,117),(1374,47,118),(1375,47,47),(1376,47,120),(1377,47,128),(1378,47,129),(1379,47,130),(1380,47,145),(1381,47,146),(1382,47,147),(1383,47,148),(1391,48,8),(1392,48,25),(1393,48,143),(1394,48,47),(1395,48,120),(1396,48,128),(1397,48,129),(1398,48,130),(1399,48,145);/*!40000 ALTER TABLE `sys_role_menus` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_roles`--DROP TABLE IF EXISTS `sys_roles`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_roles` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL COMMENT '角色名称', `note` varchar(500) DEFAULT NULL COMMENT '备注', `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COMMENT='角色';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_roles`--LOCK TABLES `sys_roles` WRITE;/*!40000 ALTER TABLE `sys_roles` DISABLE KEYS */;INSERT INTO `sys_roles` VALUES (47,'超级管理员','负责零碎所有模块的治理','2020-04-29 10:59:45','2020-05-09 16:22:24',NULL,NULL),(48,'高级软件工程师','负责代码实现','2020-04-29 11:02:01','2020-05-11 11:29:26',NULL,NULL),(49,'中级软件工程师','负责需要剖析,模块设计','2020-04-29 16:05:58','2020-04-29 17:03:20',NULL,NULL);/*!40000 ALTER TABLE `sys_roles` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_user_roles`--DROP TABLE IF EXISTS `sys_user_roles`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_user_roles` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL COMMENT '用户ID', `role_id` int(11) DEFAULT NULL COMMENT '角色ID', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8 COMMENT='用户与角色对应关系';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_user_roles`--LOCK TABLES `sys_user_roles` WRITE;/*!40000 ALTER TABLE `sys_user_roles` DISABLE KEYS */;INSERT INTO `sys_user_roles` VALUES (70,18,49),(71,17,48),(72,16,47),(74,20,48),(75,1,47),(76,19,49);/*!40000 ALTER TABLE `sys_user_roles` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `sys_users`--DROP TABLE IF EXISTS `sys_users`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `sys_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) DEFAULT NULL COMMENT '明码', `salt` varchar(50) DEFAULT NULL COMMENT '盐 明码加密时前缀,使加密后的值不同', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', `valid` tinyint(4) DEFAULT NULL COMMENT '状态 0:禁用 1:失常 默认值 :1', `deptId` int(11) DEFAULT NULL, `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`)) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='零碎用户';/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `sys_users`--LOCK TABLES `sys_users` WRITE;/*!40000 ALTER TABLE `sys_users` DISABLE KEYS */;INSERT INTO `sys_users` VALUES (1,'admin','c4c33035c5d8e840616c128db9f87b25','016a0948-b581-43aa-8a5f-9bb76a80e737','admin@t.cn','13624356789',1,2,NULL,'2020-05-08 17:21:55',NULL,NULL),(2,'zhangli','bdcf69375bdb532e50279b91eb00940d','5e7cbd36-e897-4951-b42b-19809caf3caa','zhangli@t.cn','13678909876',0,3,'2017-07-18 10:01:51','2018-04-22 20:49:19',NULL,'admin'),(3,'wangke','c5dc32ec66041aeddf432b3146bd2257','5e3e1475-1ea9-4a6a-976e-b07545827139','wangke@t.cn','18678900987',1,3,'2017-07-18 11:40:53','2018-04-22 20:48:52',NULL,NULL),(4,'zhangql','+HBpqtPuj9KLBIpneR5X0A==','ed487fac-9952-45c9-acaa-21dab9c689cc','zhangql@t.cn','13678909876',1,2,'2017-07-18 12:17:30','2018-04-22 20:48:04',NULL,NULL),(5,'fanwei','1acab7425d6dfae670f26bd160518902','34fbedb2-e135-4f8d-b595-24360edc348d','fanwei@t.cn','13876545678',1,3,'2017-07-20 17:03:22','2018-04-22 20:47:49',NULL,NULL),(6,'wumei','431ebdcccf3404787a144f9ba669a8e2','8a14f46f-7a17-4dfe-85ab-08e63cb618ce','wumei@t.cn','13567898765',1,2,'2017-07-21 10:57:40','2018-04-22 20:46:49',NULL,NULL),(7,'user-003','689c673a0d8bda7ee795dd45a126ae96','3faa1d2b-a99f-4ffb-9d29-0e71563258af','t@t.com','123',1,3,'2018-01-12 23:19:58','2018-04-22 20:46:07',NULL,'admin'),(9,'user-002','e10adc3949ba59abbe56e057f20f883e',NULL,'t@t.com','123',1,3,'2018-01-12 23:20:31','2018-04-22 20:45:55',NULL,NULL),(12,'user-001','5bf6593afd106aa544000d559f0c2241','9528e727-2901-4746-8558-9010d9607da2','t@t.com','123',1,3,'2018-01-13 01:48:32','2018-04-22 20:45:37',NULL,NULL),(13,'user-c','2630d8bd50c76abf001a9daceeae97e6','30fff766-e245-4a93-9f5e-6eb2c2cec494','t@t.com','123456',1,3,'2018-01-13 02:01:56','2020-04-30 12:02:24',NULL,'admin'),(15,'user-b','2ce586af95c6431112092f653659c85f','eaedbaee-d760-40e4-b71e-ccecf01b6187','t@t.com','123456',1,3,'2018-01-13 02:02:06','2020-04-30 12:01:31',NULL,'admin'),(16,'lifa','710058cf374a38d76510d009f63bf28d','e8e35b96-bbdd-4090-81ee-b71a36141760','lf@t.com','1111111111',0,2,'2018-04-22 19:43:11','2020-05-07 09:52:33',NULL,'admin'),(17,'xiaoli','dd93e70c79e12b5c734080fb9ee91229','e0036733-1378-4ff0-a5c3-8ddc5f8e0db2','xl@t.com','11122222',0,6,'2020-01-12 10:37:47','2020-05-07 09:58:05',NULL,'admin'),(18,'wangzhen','9b12c8e94530a0d95d9e91f4d1429c4b','4d54a593-6da5-44a8-87ca-4db7d92a526c','wz@t.com','1111111111111',1,6,'2020-04-30 14:45:10','2020-05-06 11:19:35',NULL,'admin'),(19,'liqiang','302b67d0710e887cf8164426cd59da28','4ddeb5b4-96dc-4def-a2d7-c6c924701b76','lq@t.com','1111111111111',1,6,'2020-05-07 10:35:07','2020-05-11 10:48:18',NULL,NULL),(20,'guoqing','d16322520b08734174e271e263ace655','65ec8f97-ec0f-45ff-a63d-9a7f8061c6dc','gq@t.com','1111111111',1,2,'2020-05-07 10:39:19','2020-05-09 15:24:15',NULL,'admin');/*!40000 ALTER TABLE `sys_users` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2020-05-27 14:46:25阐明:如果在mysql客户端查问表中数据,能够先执行set names gbk,否则可能会呈现乱码。还有一点要记住,在拿到任何一个sql脚本文件时,不要上来就执行它,要先关上看一看,查看是否有删除库或删除表的语句,这些语句是否会对你以后数据库中的库和表有影响 ,如果有肯定要通过leader审批,能力执行删除等操作. ...

November 16, 2020 · 6 min · jiezi

关于springboot:实现Redis集群

Redis集群实现1. 为什么要搭建集群通常,为了进步网站响应速度,总是把热点数据保留在内存中而不是间接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站利用,热点数据量往往微小,几十G上百G是很失常的事儿。因为内存大小的限度,应用一台 Redis 实例显然无奈满足需要,这时就须要应用多台 Redis作为缓存数据库。然而如何保证数据存储的一致性呢,这时就须要搭建redis集群.采纳正当的机制,保障用户的失常的拜访需要.采纳redis集群,能够保证数据扩散存储,同时保证数据存储的一致性.并且在外部实现高可用的机制.实现了服务故障的主动迁徙.集群搭建打算主从划分:3台主机 3台从机共6台 端口划分7000-7005 2.集群搭建筹备集群文件夹筹备集群文件夹: Mkdir cluster在cluster文件夹中别离创立7000-7005文件夹复制配置文件将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保留 cp redis.conf cluster/7000/ 编辑配置文件正文本地绑定IP地址 启动后盾启动 3.SpringBoot整合Redis集群

November 16, 2020 · 1 min · jiezi

关于springboot:SpringBoot集成Shiro

任何一个企业级零碎,权限必不可少 早年写的对于shiro(基本上是基于SSM框架(即Spring+SpringMVC+MyBatis)文章如下(仅供参考):shiro实战系列\(一\)之入门实战Spring\(二\)之入门示例shiro实战系列\(二\)之入门实战续shiro实战系列\(三\)之架构shiro实战系列\(四\)之配置shiro实战系列\(五\)之Authentication\(身份验证\)shiro实战系列\(六\)之Authorization\(受权\)shiro实战系列\(七\)之Realmshiro实战系列\(八\)之平安管理器shiro实战系列\(九\)之Webshiro实战系列\(十\)之Subjectshiro实战系列\(十一\)之Cachingshiro实战系列\(十二\)之罕用专业术语shiro实战系列\(十三\)之单元测试shiro实战系列\(十四\)之配置shiro实战系列\(十五\)之Spring集成Shiro 下面一共十五篇文章是早年在守业公司做相干的技术调研整顿而成的,代码例子较少,偏理论性比拟强,所以本篇文章不再赘述一些理论性内容,接下来开始进入实战。 一、导入Maven依赖这里列举的是子模块pom.xml <properties> <java.version>1.8</java.version> <druid-spring-boot-starter.version>1.1.13</druid-spring-boot-starter.version></properties><dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid-spring-boot-starter.version}</version> </dependency> <!-- SpringBoot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- AOP依赖,肯定要加,否则权限拦挡验证不失效 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- Mysql Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency> <!-- Shiro 外围依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <!-- Shiro-redis插件 --> <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>3.1.0</version> </dependency> <!-- StringUtilS工具 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> <!-- json 转换工具 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency></dependencies><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins></build>父pom.xml(次要针对SpringBoot版本): ...

November 15, 2020 · 7 min · jiezi

关于springboot:内网穿透-永久免费-简单实现外网访问内网SpringBoot

本地曾经创立了SpringBoot我的项目的hello world, 在内网能够拜访,然而没有公网ip,外网如何拜访,这是个头疼的问题,明天咱们来用简略的办法解决这一问题:应用工具:网云穿 利用场景:外网拜访内网SpringBoot 1、咱们首先确保本地我的项目内网能够拜访 查看本地ip地址, 关上cmd 2、通过ipconfig查看 这里查看到我本地的是: 192.168.10.24 3、内网拜访本地SpringBoot我的项目 因为我本地SpringBoot我的项目端口号为 8080, 那我这里能够通过192.168.10.24:8080/hello拜访. (留神: 这里是我本地的, 大家依据本人的状况而定) 通过网云穿外网拜访 通过以上步骤, 咱们能够晓得本地的SpringBoot我的项目, 内网是能够拜访的. 然而外网的状况下是不能拜访, 这时候咱们就须要利用网云穿使外网能够拜访. 1、咱们首先在网云穿官网注册账号,而后支付收费隧道 2、支付隧道后,咱们跳转到控制台,配置隧道信息 查看隧道的配置信息 查看隧道的配置信息, 确保IP地址和端口号正确, 和咱们本地的绝对应, 同时确保穿透的协定是http协定. 比方我这里配置,ip地址: 192.168.10.24, 端口:8080 3、配置完隧道,咱们下载客户端,我的是windows零碎,收费下载默认就是windows版本 4、而后咱们解压,双击运行客户端 能够绑定微信扫码登录,也能够账号密码登录 5、登录后咱们启动隧道,点击“点我启动”,确保隧道配置信息都正确, 和本地SpringBoot我的项目都失常拜访之后, 在客户端启动隧道显示"以下红色框图示", 阐明曾经失常启动, 这时也留神咱们的隧道域名, 就是映射地址 6、 外网拜访 此时, 咱们就能够在外网通过该隧道的域名, 失常拜访本地的SpringBoot我的项目了, 在浏览器输出: http://xxx.xiaomy.net/hello 依据以上操作,就能够胜利实现外网拜访内网的数据和利用,配置很简略,教程比拟具体,每一步都做了具体阐明哦

November 14, 2020 · 1 min · jiezi

关于springboot:SpringBoot入门及其分析

补git流程图~~~~! 一我的项目构造目录剖析main java寄存业务代码resources寄存资源配置文件test寄存测试单元pom文件寄存我的项目的依赖和module

November 13, 2020 · 1 min · jiezi

关于springboot:15Spring中的AOP原则

AOP 概述AOP(Aspect Orient Programming)是一种设计思维,是软件设计畛域中的面向切面编程,它是面向对象编程(OOP)的一种补充和欠缺。它以通过预编译形式和运行期动静代理形式,实现在不批改源代码的状况下给程序动静对立增加额定性能的一种技术。如图-1所示: AOP 利用场景剖析?理论我的项目中通常会将零碎分为两大部分,一部分是外围业务,一部分是非核业务。在编程实现时咱们首先要实现的是外围业务的实现,非核心业务个别是通过特定形式切入到零碎中,这种特定形式个别就是借助AOP进行实现。AOP就是要基于OCP(开闭准则),在不扭转原有系统核心业务代码的根底上动静增加一些扩大性能并能够"管制"对象的执行。例如AOP利用于我的项目中的日志解决,事务处理,权限解决,缓存解决等等。如图-2所示: AOP 利用原理剖析:Spring AOP底层基于代理机制实现性能扩大: 如果指标对象(被代理对象)实现接口,则底层能够采纳JDK动静代理机制为指标对象创立代理对象(指标类和代理类会实现独特接口)。如果指标对象(被代理对象)没有实现接口,则底层能够采纳CGLIB代理机制为指标对象创立代理对象(默认创立的代理类会继承指标对象类型)。Spring AOP 原理剖析,如图-3所示:阐明:Spring boot2.x 中AOP当初默认应用的CGLIB代理,如果须要应用JDK动静代理能够在配置文件(applicatiion.properties)中进行如下配置:spring.aop.proxy-target-class=false AOP 相干术语剖析切面(aspect): 横切面对象,个别为一个具体类对象(能够借助@Aspect申明)。告诉(Advice):在切面的某个特定连接点上执行的动作(扩大性能),例如around,before,after等。连接点(joinpoint):程序执行过程中某个特定的点,个别指被拦挡到的的办法。切入点(pointcut):对多个连接点(Joinpoint)一种定义,个别能够了解为多个连接点的汇合。连接点与切入点定义如图-4所示:阐明:咱们能够简略的将机场的一个安检口了解为连接点,多个安检口为切入点,安全检查过程看成是告诉。总之,概念很艰涩难懂,多做例子,做完就会清晰。先能够按文言去了解。 Spring AOP疾速实际业务形容基于我的项目中的外围业务,增加简略的日志操作,借助SLF4J日志API输入指标办法的执行时长。(前提,不能批改指标办法代码-遵循OCP准则)基于我的项目中的外围业务,增加简略的日志操作,借助SLF4J日志API输入指标办法的执行时长。(前提,不能批改指标办法代码-遵循OCP准则) 我的项目创立及配置创立maven我的项目或在已有我的项目根底上增加AOP启动依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>阐明:基于此依赖spring能够整合AspectJ框架疾速实现AOP的根本实现。Aspect是一个面向切面的框架,他定义了AOP的一些语法,有一个专门的字节码生成器来生成恪守java标准的class文件。 扩大业务剖析及实现创立日志切面类对象将此日志切面类作为外围业务加强(一个横切面对象)类,用于输入业务执行时长,其要害代码如下:package com.cy.pj.common.aspect;@Aspect@Slf4j@Componentpublic class SysLogAspect { @Pointcut("bean(sysUserServiceImpl)") public void logPointCut() {} @Around("logPointCut()") public Object around(ProceedingJoinPoint jp) throws Throwable{ try { log.info("start:{}"+System.currentTimeMillis()); Object result=jp.proceed();//最终会调用指标办法 log.info("after:{}"+System.currentTimeMillis()); return result; }catch(Throwable e) { log.error("after:{}",e.getMessage()); throw e; } }}阐明: @Aspect 注解用于标识或者形容AOP中的切面类型,基于切面类型构建的对象用于为指标对象进行性能扩大或控制目标对象的执行。@Pointcut注解用于形容切面中的办法,并定义切面中的切入点(基于特定表达式的形式进行形容),在本案例中切入点表达式用的是bean表达式,这个表达式以bean结尾,bean括号中的内容为一个spring治理的某个bean对象的名字。@Around注解用于形容切面中办法,这样的办法会被认为是一个盘绕告诉(外围业务办法执行之前和之后要执行的一个动作),@Aournd注解外部value属性的值为一个切入点表达式或者是切入点表达式的一个援用(这个援用为一个@PointCut注解形容的办法的办法名)。ProceedingJoinPoint类为一个连接点类型,此类型的对象用于封装要执行的指标办法相干的一些信息。只能用于@Around注解形容的办法参数。业务切面测试实现启动我的项目测试或者进行单元测试,其中Spring Boot我的项目中的单元测试代码如下:@SpringBootTestpublic class AopTests { @Autowired private SysUserService userService; @Test public void testSysUserService() { PageObject<SysUserDeptVo> po= userService.findPageObjects("admin",1); System.out.println("rowCount:"+po.getRowCount()); }}对于测试类中的userService对象而言,它有可能指向JDK代理,也有可能指向CGLIB代理,具体是什么类型的代理对象,要看application.yml配置文件中的配置. ...

November 13, 2020 · 4 min · jiezi

关于springboot:springboot-自定义校验注解

当框架提供的注解不满足于理论开发需要时,须要对其进行扩大。 @Target :指定注解能够用于:字段、注解、参数。 ElementType选项阐明:CONSTRUCTOR:用于形容结构器FIELD:用于形容域LOCAL_VARIABLE:用于形容局部变量METHOD:用于形容办法PACKAGE:用于形容包PARAMETER:用于形容参数TYPE:用于形容类、接口(包含注解类型) 或enum申明@Retention :指定生命周期。 RetentionPolicy 阐明:SOURCE:在源文件中无效(源文件保留)CLASS:在class文件中无效(class保留)RUNTIME:在运行时无效(运行时保留)@Documented: 使得该注解 javadoc工具记录 @Constraint :指定验证器,实现类。~~~~ groups()和payload()是自定义效验注解必须的内容。 List接口是可选的,同一个效验注解在一个字段应用屡次,须要应用@List。 简略举例: 校验注解@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = SizeValidator.class)public @interface SizeValid { //谬误提示信息,必须存在 String message() default ""; long max(); long min() default 0; //分组,必须存在 Class<?>[] groups() default {}; //负载,必须存在 Class<? extends Payload>[] payload() default {}; //多个分组时应用 @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface List { SizeValid[] value(); }}实现类ConstraintValidator<A, T>接口: A是自定义效验注解,T是反对效验的数据类型。initialize():初始化验证器相干内容。isValid():理论验证办法。 ...

November 13, 2020 · 1 min · jiezi

关于springboot:SpringBoot整合Redis

1.增加配置文件:Redis.properties# 配置单台redis服务器redis.host=192.168.126.129 ip地址redis.port=6379 端口号设置配置类:RedisConfig 2.将对象转化为Json格局入门案例API: MAPPER.writeValueAsString(itemDesc); 3.将对象转化为Json格局格局优化4.AOP实现Redis缓存AOP实现Redis1.@cacheFind()注解实现策略: A.须要自定义注解CacheFindB.设定注解的参数 key的前缀 数据的超时的工夫C.在办法中标识注解,D.利用aop拦挡指定的注解E.应用盘绕告诉 around告诉 实现缓存业务 形式一编辑自定义注解:1.CacheFind2.在办法上标识注解3.在aop下面拦挡注解(切入点表达式)_CacheAOP形式二 优化 1.现有代码存在的问题1.如果间接将缓存业务,写到业务层,如果未来的缓存代码发生变化,则代码耦合高2.如果其余的业务也须要,必然重写编辑代码,发效率低 2.AOP概念:1.AOP--面向切面编程,通过预编译和运行期间 动静代理;升高耦合性进步程序的重用性,同时进步开发效率; 3.AOP实现的具体步骤:公式 AOP(切面)=告诉办法+切入点表达式 五种告诉办法:1.before在执行指标办法之前执行 2.after在执行指标办法之后执行 3.afterReturning在指标办法执行之后报错时执行 4.afterThrowing无论什么时候程序执行实现,都要执行的告诉 5.around ___性能最弱小的盘绕告诉 在指标办法执行前,后执行能够控制目标办法是否执行 能够控制程序执行的轨迹; 注:后面4中告诉不能控制目标放啊是否执行,个别用来记录程序的执行状态;个别利用于监控操作只用于做记录的 四种切入点表达式:bean ("bean的id")粒度:按Bean匹配(就是实例化的兑现)以后bean中的办法都会执行告诉 ___粗粒度 within ("包名.类名") ___粗粒度能够匹配多个类用通配符* execution ("返回值类型 包名.类名.办法名(参数列表)")细粒度 办法参数级别 @annotation ("包名.类名")细粒度 装置注解匹配

November 12, 2020 · 1 min · jiezi

关于springboot:Springboot-Vue-Login从零开始实现SpringbootVue登录

小Hub领读:一个残缺的Spirngboot+vue实现登录的小例子,我之前在vueblog中也搞过,哈哈,再来回顾一下! 作者:Eli Shawhttps://blog.csdn.net/xiaojin... 一、简述最近学习应用 Vue 实现前端后端拆散,在 Github 上有一个很好的开源我的项目:mall,正所谓百看不如一练,本人入手实现了一个 Springboot+Vue 的登录操作,在此记录一下踩过的坑。 文章最初补充两端的 GitHub 代码,之所以放在最初,是因为文章写的很粗疏了,入手操作一下会更有帮忙,如果有很大出入能够比对原码,找找问题。 二、开发工具VSCode IDEA Vue 的装置就不说了,有很多文章,然而 Springboot+Vue 整合的残缺文章绝对较少,所以我次要记录一下这两端整合时的内容。 (Vue 装置后就会有 npm 或 cnpm,相应的介绍也不说了,Vue 官网可查看) 一、关上 cmd 创立 Vue 我的项目,并增加 Vue 依赖的框架:1\. 创立 Vue 我的项目 (进入本人想创立的文件夹地位,我放在 D:\VSCodeWorkSpace),创立语句 vue create vue-spring-login-summed,方向键抉择创立形式,我抉择的默认 2\. 进入到创立的 Vue 我的项目目录,增加依赖框架:cd vue-spring-login-summed (进入到我的项目根目录)vue add element (增加 element,一个 element 格调的 UI 框架)npm install axios (装置 axios,用于网络申请)npm install vuex --save(装置 Vuex,用于治理状态)npm install vue-router (装置 路由,用于实现两个 Vue 页面的跳转)以上命令截图如下: ...

November 12, 2020 · 8 min · jiezi

关于springboot:SpringBoot强化篇五SpringMVCMyBatisSpring-技术整合

SpringMVC+MyBatis+Spring 技术整合业务架构剖析在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 业务根本原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 品牌列表页面 品牌编辑页面 我的项目品牌模块外围API剖析与设计基于分层架构设计思维,现对品牌API进行设计,如图所示: 数据库及表的剖析与设计设计并创立数据库如果数据库已存在,则先删除数据库,代码如下: drop database if exists dbbrand;创立新的数据库,代码如下: create database dbbrand default character set utf8;设计并创立品牌(Brand)表关上数据库,语句如下: use dbbrand;在dbbrand数据库中创立品牌表. create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;基于SQL脚本执行数据库初始化将数据库设计脚本写到brand.sql中,而后按如下步骤执行: 关上mysql自带客户端,登录mysql,指令如下: mysql -uroot -proot设置客户端编码,指令如下: set names utf8;执行sql脚本,指令如下: source d:/brand.sql脚本执行胜利当前,在客户端查问数据之前,先执行如下语句: set names gbk;我的项目环境初始化筹备操作1)JDK 1.82)Maven 3.6.33)IDEA 2020.24)MySQL 5.7+ 创立我的项目Module关上idea,而后基于设计,创立我的项目module,如图所示: 增加我的项目Module依赖MySQL 驱动<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>Srping Jdbc 提供了HikariCP连接池<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>MyBatis 资源<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>Spring Web 依赖 (内置一个tomcat服务)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖 (html模板引擎)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>我的项目Module根底配置关上我的项目Module配置文件application.properties,并增加如下内容: ...

November 11, 2020 · 4 min · jiezi

关于springboot:Spring-Boot系列之Async异步调用

写在后面的话哈喽,好久不见,你们还好吗? 明天给大家带来的是我在理论我的项目上遇到的一个问题。 流程大抵是,调用接口,而后将接口返回的数据更新一份到本地数据库,而后返回给前端。更新到本地数据库这个操作本来是用的异步。 国庆回老家,公司打电话来,前端转几秒的圈圈,而后无数据。经查,是Redis出了问题,用不了。 什么意思? 从接口申请到的数据,更新到本地数据库,这里有一个策略,先将数据放到Redis中,而后进行比照,如果不统一,再更新。Redis不可用,那么都查询数据库,就会很慢,前端申请接口个别是5s超时。 如果是异步,也就不会呈现这个问题了。 所以,咱们就先看看过后,我的代码明明是异步的,为什么没有失效呢? @Async有效先看一个例子。 Controller代码如下: @GetMapping("/invalid")public String invalidAsyncExample() { iTestAsyncService.invalidAsyncExample(); return "测试实现 " + LocalDateTime.now().toString();} Service代码如下: @Overridepublic void invalidAsyncExample() { log.info("流程-1-{}", Thread.currentThread().getId()); invalidAsyncTask(); log.info("流程-3-{}", Thread.currentThread().getId());} Async代码如下: @Asyncpublic void invalidAsyncTask() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("流程-2-{}", Thread.currentThread().getId());} 执行后果: 2020-11-11 21:14:06.784 INFO 13592 --- [nio-8080-exec-1] c.f.s.a.s.impl.TestAsyncServiceImpl     : 流程-1-1252020-11-11 21:14:08.785 INFO 13592 --- [nio-8080-exec-1] c.f.s.a.s.impl.TestAsyncServiceImpl     : 流程-2-1252020-11-11 21:14:08.785 INFO 13592 --- [nio-8080-exec-1] c.f.s.a.s.impl.TestAsyncServiceImpl     : 流程-3-125 ...

November 11, 2020 · 3 min · jiezi

关于springboot:springboot热加载

基于IDEA的热加载。 在pom.xml中增加相应的依赖 <!-- 热加载--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!--<scope>true</scope>--></dependency>在pom.xml中增加相应的插件 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork><!-- 如果没有该配置,热部署的devtools不失效 --> </configuration></plugin>设置IDEA ctrl+shit+alt+/ 快捷键并点击Registrymac快捷键 command+shit+option+/ 快捷键并点击Registry 找到如下图对应的Key并勾选 依照如上所述步骤即可开启IDEA开发spring热加载性能。

November 11, 2020 · 1 min · jiezi

关于springboot:14SpringBoot工程中ajax技术分析及应用

Ajax 技术简介背景剖析?在互联网高速倒退的明天,传统的WEB利用,对于高并发、高性能、高可靠性的要求已火烧眉毛。单线程形式的客户端与服务端交互方式曾经不能满足现阶段的需要.咱们须要以异步、按需加载的形式从服务端获取数据并及时刷新,来进步用户体验,于是Ajax技术诞生。 Ajax 是什么?Ajax (Asynchronous JavaScript and XML) 是一种Web利用客户端技术,能够借助客户端脚本(javascript)与服务端利用进行异步通信(能够有多个线程同时与服务器交互),并且按需获取服务端数据当前,能够进行部分刷新,进而进步数据的响应和渲染速度。 Ajax 利用场景?Ajax技术最大的劣势就是底层异步,而后部分刷新,进而进步用户体验,这种技术当初在很多我的项目中都有很好的利用,例如: 商品零碎。评估零碎。地图零碎。…..AJAX能够仅向服务器发送并取回必要的数据,并在客户端采纳JavaScript解决来自服务器的响应。这样在服务器和浏览器之间替换的数据大量缩小,服务器响应的速度就更快了。但Ajax技术也有劣势,最大劣势是不能间接进行跨域拜访。 Ajax 利用模型剖析?Ajax 疾速入门Ajax 申请响应过程剖析传统形式是web申请与响应(客户端要期待响应后果),如图所示: Ajax形式的申请与响应(要害是客户端不阻塞),如图所示: Ajax 编程步骤及模板代码剖析Ajax 编码的根本步骤?(重点是ajax技术的入口-XMLHttpRequest-XHR对象) 第一步:基于dom事件创立XHR对象第二步:在XHR对象上注册状态监听(监听客户端与服务端的通信过程)第三步:与服务端建设连贯(指定申请形式,申请url,同步还是异步)第四步:发送申请(将申请数据传递服务端) Ajax 编码过程的模板代码如下: var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ console.log(xhr.responseText) }}xhr.open("GET",url,true);xhr.send(null);SpringBoot 我的项目Ajax技术利用入门剖析第一步:创立我的项目module,如图所示: 第二步:增加Spring web依赖,代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>第三步:创立AjaxController解决客户端申请,代码如下: package com.cy.pj.ajax.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class AjaxController { @RequestMapping("/doAjaxStart") public String doAjaxStart(){ return "Response Result Of Ajax Get Request 01 "; }}第四步:在我的项目中static目录下,创立一个页面ajax-01.html,代码如下: html元素代码如下: <h1>The Ajax 01 Page</h1><fieldset> <legend>Ajax 异步Get申请</legend> <button onclick="doAjaxStart()">Ajax Get Request</button> <span id="result">Data is Loading ...</span></fieldset>javascript 脚本代码如下: ...

November 11, 2020 · 3 min · jiezi

关于springboot:SpringBoot-使用-Value-注解读取配置文件给静态变量赋值

1、application.properties 配置文件mail.username=xue@163.commail.password=xuemail.host=smtp.163.commail.smtp.auth=true2、给一般变量赋值,间接在变量上增加 @Value 注解import org.springframework.beans.factory.annotation.Value;public class MailConfig { @Value("${mail.username}") private String username; @Value("${mail.password}") private String password; @Value("${mail.host}") private String host;}3、给动态变量赋值,间接在动态变量上增加 @Value 注解有效 4、给动态变量赋值1、应用 set 办法import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class MailConfig { public static String username; public static String password; public static String host; @Value("${mail.username}") public void setUsername(String username) { this.username = username; } @Value("${mail.password}") public void setPassword(String password) { this.password = password; } @Value("${mail.host}") public void setHost(String host) { this.host = host; }}2、应用 @PostConstruct(举荐应用)import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Componentpublic class MailConfig { public static String USERNAME; public static String PASSWORD; public static String HOST; @Value("${mail.username}") private String username; @Value("${mail.password}") private String password; @Value("${mail.host}") private String host; @PostConstruct public void init() { USERNAME = username; PASSWORD = password; HOST = host; }}

November 10, 2020 · 1 min · jiezi

关于springboot:深入浅出springboot从入门到精通实战开发全套教程

前言之前始终有粉丝想让我出一套springboot实战开发的教程,我这边总结了很久材料和教训,在最近总算把这套教程的纲要和内容初步总结结束了,这份教程从springboot的入门到精通全副涵盖在内,上面我会为大家一一分享! springboot简介SpringBoot是由Pivotal团队在2013年开始研发、2014年4月公布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优良个性,而且还通过简化配置来进一步简化了Spring利用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本抵触,以及援用的不稳定性等问题失去了很好的解决。 SpringBoot的特色能够创立独立的Spring应用程序,并且基于其Maven或Gradle插件,能够创立可执行的JARs和WARs;内嵌Tomcat或Jetty等Servlet容器;提供主动配置的“starter”我的项目对象模型(POMS)以简化Maven配置;尽可能主动配置Spring容器;提供筹备好的个性,如指标、健康检查和内部化配置;相对没有代码生成,不须要XML配置。看完本套教程你将学会应用 Spring 纯熟开发 Web 服务;搞懂 Spring Boot 外围性能的实现原理;通过 Spring Cloud 疾速构建微服务架构;把握 Spring 个性化定制与扩大的进阶办法。看之前你须要大略的把握以下这些货色,不然学起来可能会比他人艰难一点,我大略的总结了一个图:当然这些你有这些根底只是阐明你会看的比他人快一点,没有把握也一样能看! 这份教程的内容齐全,内容涵盖spring入门到实战教程,内容比拟长,因为文章的篇幅限度上面我选取局部精彩内容展现,须要残缺的全套教程的欢送关注我的公众号:前程有光无偿获取内容介绍 第一章初识springboot 第二章springboot开发环境筹备 第三章springboot开发工具应用 第四章分层开发 Web 应用程序 第五章晌应式编程 第六章Spring Boot 进阶 第七章用ORM 操作 SQL 数据库 第八章接口架构格调—— RESTful因为文章篇幅问题,就不在这一一展现了,为大家展现一下目录: 小结springboot能够说难,也能够说容易,只有你用心把握这个技术知识点并不是什么难事,当初springboot在面试中的占比越来越重要了,没有把握这个技术或者还不纯熟的得连忙了,拿到我这份全套开发教程对本人进行一个查漏补缺,进阶晋升都是能够的!当初获取这份全套开发教程你只需关注我的公众号前程有光即可收费无偿获取!

November 10, 2020 · 1 min · jiezi

关于springboot:13SpringBoot工程中ajax技术分析及应用

Ajax 技术简介背景剖析?在互联网高速倒退的明天,传统的WEB利用,对于高并发、高性能、高可靠性的要求已火烧眉毛。单线程形式的客户端与服务端交互方式曾经不能满足现阶段的需要.咱们须要以异步、按需加载的形式从服务端获取数据并及时刷新,来进步用户体验,于是Ajax技术诞生。 Ajax 是什么?Ajax (Asynchronous JavaScript and XML) 是一种Web利用客户端技术,能够借助客户端脚本(javascript)与服务端利用进行异步通信(能够有多个线程同时与服务器交互),并且按需获取服务端数据当前,能够进行部分刷新,进而进步数据的响应和渲染速度。 Ajax 利用场景?Ajax技术最大的劣势就是底层异步,而后部分刷新,进而进步用户体验,这种技术当初在很多我的项目中都有很好的利用,例如: 商品零碎。评估零碎。地图零碎。…..AJAX能够仅向服务器发送并取回必要的数据,并在客户端采纳JavaScript解决来自服务器的响应。这样在服务器和浏览器之间替换的数据大量缩小,服务器响应的速度就更快了。但Ajax技术也有劣势,最大劣势是不能间接进行跨域拜访。 Ajax 利用模型剖析?Ajax 疾速入门Ajax 申请响应过程剖析传统形式是web申请与响应(客户端要期待响应后果),如图所示: Ajax形式的申请与响应(要害是客户端不阻塞),如图所示: Ajax 编程步骤及模板代码剖析Ajax 编码的根本步骤?(重点是ajax技术的入口-XMLHttpRequest-XHR对象) 第一步:基于dom事件创立XHR对象第二步:在XHR对象上注册状态监听(监听客户端与服务端的通信过程)第三步:与服务端建设连贯(指定申请形式,申请url,同步还是异步)第四步:发送申请(将申请数据传递服务端) Ajax 编码过程的模板代码如下: var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ console.log(xhr.responseText) }}xhr.open("GET",url,true);xhr.send(null);SpringBoot 我的项目Ajax技术利用入门剖析第一步:创立我的项目module,如图所示: 第二步:增加Spring web依赖,代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>第三步:创立AjaxController解决客户端申请,代码如下: package com.cy.pj.ajax.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class AjaxController { @RequestMapping("/doAjaxGet01") public String doAjaxGet01(){ return "Response Result Of Ajax Get Request 01 "; }}第四步:在我的项目中static目录下,创立一个页面ajax-01.html,代码如下: html元素代码如下: <h1>The Ajax 01 Page</h1><fieldset> <legend>Ajax 异步Get申请</legend> <button onclick="doAjaxGet01()">Ajax Get Request</button> <span id="result">Data is Loading ...</span></fieldset>javascript 脚本代码如下: ...

November 10, 2020 · 1 min · jiezi

关于springboot:13SpringBootMyBatisSpring-技术整合实现商品品牌模块的CRUD操作

业务形容任何一个电商零碎中都有一个商品子系统,而与商品相关联都会有一个品牌信息管理,在以后业务零碎设计中咱们就是要对商品品牌信息的治理进行设计和实现.在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 业务根本原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 品牌列表页面 品牌编辑页面 我的项目技术架构剖析及设计在品牌治理模块实现过程,咱们采纳典型的C/S架构进行实现.客户端咱们基于浏览器进行实现,服务端采纳tomcat,数据库应用MySQL.具体应用层基于MVC分层架构进行实现. 我的项目技术栈利用剖析及选型客户端技术:html,css,javascript,bootstrap服务端技术:hikaricp,mybatis,spring,springboot,thymeleaf数据库技术:mysql,sql开发工具集:jdk1.8,maven3.6.3,idea2020.2我的项目品牌模块外围API剖析与设计基于分层架构设计思维,现对品牌API进行设计,如图所示: 数据库及表的剖析与设计设计并创立数据库如果数据库已存在,则先删除数据库,代码如下: drop database if exists dbbrand;创立新的数据库,代码如下: create database dbbrand default character set utf8;设计并创立品牌(Brand)表关上数据库,语句如下: use dbbrand;在dbbrand数据库中创立品牌表. create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;基于SQL脚本执行数据库初始化将数据库设计脚本写到brand.sql中,而后按如下步骤执行: 关上mysql自带客户端,登录mysql,指令如下: mysql -uroot -proot设置客户端编码,指令如下: set names utf8;执行sql脚本,指令如下: source d:/brand.sql脚本执行胜利当前,在客户端查问数据之前,先执行如下语句: set names gbk;我的项目环境初始化筹备操作1)JDK 1.82)Maven 3.6.33)IDEA 2020.24)MySQL 5.7+ 创立我的项目Module关上idea,而后基于设计,创立我的项目module,如图所示: 增加我的项目Module依赖MySQL 驱动<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>Srping Jdbc 提供了HikariCP连接池<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>MyBatis 资源<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>Spring Web 依赖 (内置一个tomcat服务)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖 (html模板引擎)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>我的项目Module根底配置关上我的项目Module配置文件application.properties,并增加如下内容: ...

November 10, 2020 · 4 min · jiezi

关于springboot:SpringBoot-工程的健康监控实现

衰弱监控简述Spring Boot 中actuator模块提供了健康检查,审计、指标收集,HTTP跟踪等性能,能够帮忙咱们更好的治理和跟踪springboot我的项目。 衰弱监控配置实现在须要应用衰弱监控的我的项目或module中,增加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>增加完依赖当前,reload我的项目或module。 衰弱监控启动剖析启动我的项目,在浏览器中输出如下地址:(SpringBoot默认关上的监控选项无限) http://localhost/actuator其拜访后果,如图所示: 还能够在actuator列出的选中中进行点击,例如拜访health http://localhost/actuator/health其出现后果,如图所示(其中up状态示意失常): 如果心愿查看更多actuator选项,能够在spring boot中配置文件 application.properties中增加如下语句: management.endpoints.web.exposure.include=*而后,重启服务器,基于拜访http://localhost/actuator地址...) 总结(Summary)本大节次要是对springboot工程中的衰弱监控性能做了一个繁难剖析和实现,本人能够基于业务的须要,进行监控的配置和剖析.

November 9, 2020 · 1 min · jiezi

关于springboot:STS安装

STS装置STS与Eclipse的集成套件Eclipse插件装置STS

November 8, 2020 · 1 min · jiezi

关于springboot:SpringBoot简介

SpringBoot的外围个性SpringBoot是一个脚手架,构建于Spring框架根底之上,基于疾速构建理念,提供了主动配置性能,可实现其开箱即用的个性(创立完一个根本的我的项目当前,可零配置或者大量配置即可运行咱们的我的项目),其外围次要有如下几个方面: 起步依赖(Starter Dependency)-我的项目创立时底层帮你关联依赖。主动配置(Auto Configuration)健康检查(Actator)-监控SpringBoot执行原理SpringBoot我的项目在启动时,首先基于启动入口类上的注解形容,进行主动配置并扫描指定包以及子包的类进行加载,而后检测类上是否有Spring框架中指定的注解形容(例如@Component,@Controller,@Service等)。如果有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创立Bean的实例,假如此Bean指定了生命周期办法,还会调用生命周期办法。当实例创立后,Spring框架还会基于类的作用域形容,将实例存储到不同作用域的容器中,以实现Bean对象的迷信利用。

November 8, 2020 · 1 min · jiezi

关于springboot:05-Springboot-redis整合配置

Redis的益处与简介我就不介绍了,间接进行上手装置配置; 1、redis装置本文采纳docker去装置redis,如果间接本地装置也很不便,间接下载好安装包而后cmd窗口命令行启动就行。 拉取镜像 Docker pull redis:4.0启动镜像 Docker run -itd --name redis-01 -p 6379:6379 #镜像id放行端口firewall-cmd --state #查看防火墙状态 systemctl start firewalld.service #启动防火墙 firewall-cmd --zone=public --add-port=6379/tcp --permanent #放行端口 system restart firewalld.service #重启防火墙 firewall-cmd --reload #从新载入配置 firewall-cmd --list-all #查看已凋谢的端口2、Spring boot引入2.1、引入maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId></dependency>此处引入的是官网的starter,以往大家应用jedis,能够更具集体想法扭转。 2.2、根底配置spring.redis.host=192.168.1.37#Redis服务器连贯端口spring.redis.port=6379#Redis服务器连贯明码(默认为空)spring.redis.password=#连接池最大连接数(应用负值示意没有限度)spring.redis.pool.max-active=8#连接池最大阻塞等待时间(应用负值示意没有限度)spring.redis.pool.max-wait=-1#连接池中的最大闲暇连贯spring.redis.pool.max-idle=8#连接池中的最小闲暇连贯spring.redis.pool.min-idle=0#连贯超时工夫(毫秒)spring.redis.timeout=30000具体具体配置依据集体需要更改。实际上springboot有默认配置,能够间接不进行配置也能够应用。 2.3、RedisServicepackage com.ssk.shop.bll;/** * redis操作接口 */public interface IRedisBll { /** * 存储数据 */ void set(String key, String value); /** * 获取数据 */ String get(String key); /** * 设置超期工夫 */ boolean expire(String key, long expire); /** * 删除数据 */ void remove(String key); /** * 自增操作 * @param delta 自增步长 */ Long increment(String key, long delta);} ...

November 8, 2020 · 1 min · jiezi

关于springboot:关于京淘项目问题集

1.maven我的项目创立第一行报错问题报错阐明:对于报错阐明:STS开发工具整合SpringBoot时,容易报maven插件异样的错误信息. STS中的插件版本与SpringBoot中的版本不统一导致的. 解决方案:阐明编辑POM.xml文件信息,批改实现之后须要更新我的项目. `<properties> <java.version>1.8</java.version> <!--指定插件版本 --> <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> <!--跳过测试类打包 --> <skipTests>true</skipTests> </properties>` * 1* 2* 3* 4* 5* 6* 72).更新我的项目 2.maven工具创立SpringBoot我的项目报错阐明阐明: 利用maven工具,创立SpringBoot 创立时POM.xml文件报错.报错阐明: 个别pom.xml文件报错,个别都是maven私服镜像服务器问题. 步骤1:切换本地仓库的私服地址 `<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>` * 1* 2* 3* 4* 5* 6步骤2: 强制更新maven 3.对于JDK和JRE报错问题阐明:配置环境变量,将JRE配置改为JDK配置信息. 保障JDK版本正确. 4.程序启动报 java.lang.ClassNotFoundException异样报错阐明: IDE在程序运行时无奈找到.class文件进行加载. 可能是将target目录下的文件删除,导致短少.class文件 解决方案: 让程序重写编译即可. 5 对于hosts文件批改的权限问题解决方案:1.增加管理权限 选中hosts文件之后 右键属性.形式2: 以超级管理员的形式运行Switch hosts软件形式3: 增加指定的用户权限 步骤 1.获取以后计算机的名称 PC 2.增加用户信息.注意事项: 计算机名称不要写中文. 形式4: 勾销只读属性 6.nginx拜访报错查看HOSTS文件配置失常.`# 京淘配置 #左侧写IP地址 右侧写域名 两头应用空格分隔127.0.0.1 image.jt.com127.0.0.1 manager.jt.com127.0.0.1 www.jt.com127.0.0.1 sso.jt.com` * 1* 2* 3* 4* 5* 6查看NGINX配置文件是否正确`# 配置图片服务器 server { listen 80; server_name image.jt.com; ##通过网址转向指定的目录 留神/的写法 location / { root D:/JT-SOFT/images; } }` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11重启nginx在重启之前查看是否有多余的nginx服务项,如果有则敞开.hosts文件是否失效依据申请门路 查看代码中门路的拼接是否失常.http://image.jt.com/2020/08/0...D:JT-SOFTimages/2020/08/07/cc10f60491234317adf800aeafc6af1f.png ...

November 7, 2020 · 2 min · jiezi

关于springboot:Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

一、过滤器和拦截器的区别 1、过滤器和拦截器触发机会不一样,过滤器是在请求进入容器后,但申请进入servlet之前进行预处理的。申请完结返回也是,是在servlet解决完后,返回给前端之前。 2、拦截器能够获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并治理的,spring的性能能够被拦截器应用,在拦截器里注入一个service,能够调用业务逻辑。而过滤器是JavaEE规范,只需依赖servlet api ,不须要依赖spring。 3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射 4、Filter是依赖于Servlet容器,属于Servlet标准的一部分,而拦截器则是独立存在的,能够在任何状况下应用。 5、Filter的执行由Servlet容器回调实现,而拦截器通常通过动静代理(反射)的形式来执行。 6、Filter的生命周期由Servlet容器治理,而拦截器则能够通过IoC容器来治理,因而能够通过注入等形式来获取其余Bean的实例,因而应用会更不便。 过滤器和拦截器十分类似,然而它们有很大的区别最简单明了的区别就是**过滤器能够批改request,而拦截器不能过滤器须要在servlet容器中实现,拦截器能够实用于javaEE,javaSE等各种环境拦截器能够调用IOC容器中的各种依赖,而过滤器不能过滤器只能在申请的前后应用,而拦截器能够具体到每个办法**区别很多,大家能够去查下 总的来说过滤器就是筛选出你要的货色,比方requeset中你要的那局部拦截器在做平安方面用的比拟多,比方终止一些流程网上有一张图片很不错,这里拷过去给大家看一下 过滤器(Filter) :能够拿到原始的http申请,然而拿不到你申请的控制器和申请控制器中的办法的信息。 拦截器(Interceptor):能够拿到你申请的控制器和办法,却拿不到申请办法的参数。 切片(Aspect): 能够拿到办法的参数,然而却拿不到http申请和响应的对象 二、过滤器两种形式: 1、应用spring boot提供的FilterRegistrationBean注册Filter 2、应用原生servlet注解定义Filter 两种形式的实质都是一样的,都是去FilterRegistrationBean注册自定义Filter 形式一: (应用spring boot提供的FilterRegistrationBean注册Filter )①、先定义Filter: package com.corwien.filter;import javax.servlet.*;import java.io.IOException;public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 解决request 或response // doFilter()办法中的servletRequest参数的类型是ServletRequest,须要转换为HttpServletRequest类型不便调用某些办法 System.out.println("filter1"); // 调用filter链中的下一个filter HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String ip = request.getRemoteAddr(); String url = request.getRequestURL().toString(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = new Date(); String date = sdf.format(d); System.out.printf("%s %s 拜访了 %s%n", date, ip, url); filterChain.doFilter(request, response); } @Override public void destroy() { }}②、注册自定义Filter ...

November 7, 2020 · 2 min · jiezi

关于springboot:SpringBootMyBatisSpring-技术整合实现商品品牌模块的CRUD操作

业务形容需要形容任何一个电商零碎中都有一个商品子系统,而与商品相关联都会有一个品牌信息管理,在以后业务零碎设计中咱们就是要对商品品牌信息的治理进行设计和实现. 业务架构剖析在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 业务根本原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 我的项目技术架构剖析及设计在品牌治理模块实现过程,咱们采纳典型的C/S架构进行实现.客户端咱们基于浏览器进行实现,服务端采纳tomcat,数据库应用MySQL.具体应用层基于MVC分层架构进行实现. 我的项目技术栈利用剖析及选型客户端技术:html,css,javascript,bootstrap服务端技术:hikaricp,mybatis,spring,springboot,thymeleaf数据库技术:mysql,sql开发工具集:jdk1.8,maven3.6.3,idea2020.2我的项目品牌模块外围API剖析与设计基于分层架构设计思维,现对品牌API进行设计,如图所示: 数据库及表的剖析与设计设计并创立数据库如果数据库已存在,则先删除数据库,代码如下: drop database if exists dbbrand;创立新的数据库,代码如下: create database dbbrand default character set utf8;设计并创立品牌(Brand)表关上数据库,语句如下: use dbbrand;在dbbrand数据库中创立品牌表. create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;基于SQL脚本执行数据库初始化将数据库设计脚本写到brand.sql中,而后按如下步骤执行: 关上mysql自带客户端,登录mysql,指令如下: mysql -uroot -proot设置客户端编码,指令如下: set names utf8;执行sql脚本,指令如下: source d:/brand.sql脚本执行胜利当前,在客户端查问数据之前,先执行如下语句: set names gbk;我的项目环境初始化筹备操作1)JDK 1.82)Maven 3.6.33)IDEA 2020.24)MySQL 5.7+ 创立我的项目Module关上idea,而后基于设计,创立我的项目module,如图所示: 增加我的项目Module依赖MySQL 驱动<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>Srping Jdbc 提供了HikariCP连接池<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>MyBatis 资源<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>Spring Web 依赖 (内置一个tomcat服务)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Thymeleaf 依赖 (html模板引擎)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>我的项目Module根底配置关上我的项目Module配置文件application.properties,并增加如下内容: ...

November 6, 2020 · 3 min · jiezi

关于springboot:SpringbootMybatisSpring实现商品模块的小案例

首先创立所须要的数据库,还所须要创立所须要的表单,而后对application.properties进行配置 server.port=80spring.datasource.url=jdbc:mysql:///dbbrand?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=rootmybatis.mapper-locations=classpath:/mapper/*/*.xmlspring.thymeleaf.prefix=classpath:/templates/spring.thymeleaf.suffix=.htmlspring.thymeleaf.cache=falselogging.level.com.cy=debug实现一个pojo对象brand素来封装从数据库传回的信息。 package com.cy.pj.brand.pojo;import java.util.Date;public class Brand { private Integer id; private String name; private String logo; private String remark; private Date createdTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLogo() { return logo; } public void setLogo(String logo) { this.logo = logo; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Date getCreatedTime() { return createdTime; } public void setCreatedTime(Date createdTime) { this.createdTime = createdTime; } @Override public String toString() { return "Brand{" + "id=" + id + ", name='" + name + ''' + ", logo='" + logo + ''' + ", remark='" + remark + ''' + ", createdTime=" + createdTime + '}'; }}创立数据逻辑对象(DAO)设计用于拜访Brand数据的数据拜访对象及办法定义一个(BrandDao) ...

November 5, 2020 · 2 min · jiezi

关于springboot:SpringBootMyBatisSpring技术整合实现商品品牌模块的CRUD操作

品牌模块整体API设计 服务端查问时序设计 @select注解嵌套sql语句://简单sql(例如嵌套了很多动静sql元素)不倡议已注解形式进行定义 //@Select("<script>select * from tb_brand <if test="name!=null and name!=''"> where name like concat ("%",#{name},"%")</if></script>")private static final Logger log=//这里的实现在springboot中默认抉择的是logback LoggerFactory.getLogger(BrandServiceImpl.class); Assertions.assertEquals(1, list.size());//断言测试(理论值和期望值不等则抛出异样) //rest格调(一种软件架构编码格调)的url定义 其语法为:a/b/{c}/d/{e},在url能够定义变量,这个变量须要应用{}括起来rest格调能够更好实现跨平台@PathVariable 注解用于润饰办法参数,目标是通知spring mvc,参数的值来自url

November 5, 2020 · 1 min · jiezi

关于springboot:SpringBootMyBatisSpring-技术整合实现商品品牌模块的CRUD操作

需要剖析任何一个电商零碎中都有一个商品子系统,而与商品相关联都会有一个品牌信息管理,在以后业务零碎设计中咱们就是要对商品品牌信息的治理进行设计和实现. 业务架构在品牌(Brand)信息管理中就是要实现对商品品牌信息的增加,批改,查问,删除等业务,如图所示: 原型设计基于品牌业务形容,对品牌模块的业务原型进行剖析和设计,如图所示: 技术架构在品牌治理模块实现过程,咱们采纳典型的C/S架构进行实现.客户端咱们基于浏览器进行实现,服务端采纳tomcat,数据库应用MySQL.具体应用层基于MVC分层架构进行实现. 技术栈选型客户端技术:html,css,javascript,bootstrap服务端技术:spring,mybatis,springboot,thymeleaf数据库技术:MySQL,SQL数据库及表设计drop database if exists dbbrand;create database dbbrand default character set utf8;use dbbrand;create table tb_brand( id bigint primary key auto_increment, name varchar(100) not null, remark text, createdTime datetime not null)engine=InnoDB;我的项目环境初始化

November 5, 2020 · 1 min · jiezi