当前位置: 首页 > news >正文

做恶搞网站软件有哪些/seo到底是做什么的

做恶搞网站软件有哪些,seo到底是做什么的,黄石本土做网站的公司,关键不一定前期回顾 springboot项目常见的配置文件类型有哪些?哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解? value restful风格 RESTful 风格与传统的 HTTP 请求方式相比,更加简洁,安全,能隐…

前期回顾

  • springboot项目常见的配置文件类型有哪些?哪种类型的优先级最高

yml properties yaml

  • 读取配置文件里的数据用什么注解?

@value

restful风格

RESTful 风格与传统的 HTTP 请求方式相比,更加简洁,安全,能隐藏资源的访问行为,无法从访问地址得知对资源是何种操作
image.png
可见很多 RESTful 风格的访问地址都是一样的,只用行为动作区分了不同的访问,对外隐藏了真实的操作。此外,资源描述部分一般用复数,如 books,当然这种操作是只是一种约定,不是规范,但大多数人都这样做。

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic String addUser(@RequestBody UserInfo userInfo){System.out.println("新增用户信息:"+userInfo);return "新增用户成功";}@DeleteMapping("/{id}")public String del(@PathVariable Integer id){System.out.println("删除用户ID:"+id);return "删除用户成功";}@PutMappingpublic String update(@RequestBody UserInfo userInfo){System.out.println("修改后");return "修改用户成功";}@GetMapping("/{id}")public String getUser(@PathVariable Integer id){System.out.println("用户ID:"+id);return "查询用户ID成功!";}@GetMappingpublic String getUsers(){System.out.println("查询所有的用户");return "查询所有的用户";}}

利用postman测试
image.png

{"username":"zhangsan","password":"z3","mobilephone":"15336574540"
}

静态资源访问

默认静态资源访问

Spring Boot 规定了静态资源可以放在以下 5 个目录中的任意一个下面:

classpath:/META-INF/resources/ 
classpath:/resources/ 
classpath:/static/ 
classpath:/public/ 
/

Spring Boot 项目创建完成后默认情况下提供了classpath:/static/目录,一般情况下在此放置静态资源即可
image.png

自定义静态资源

1.在application.yml配置

web:upload-path: D:/upimgs/
spring:mvc:static-path-pattern: /**web:resources:static-locations:file:${web.upload-path},classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

2.配置类的方式

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/","file:D:/upimgs/");}
}

路径映射

在 Spring Boot 的 Web 项目中,所有页面都需要通过控制器才能访问到,包括没有数据的页面。对于这种只是完成简单的跳转的没有数据的页面,可以直接配置路径映射,不再经过控制器。
1.导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2.在application.yml中添加thymeleaf的配置

spring:thymeleaf:prefix: classpath:/templates/suffix: .html

默认就是这样,所以可以省略不写
3.在项目的 resource/ templates 目录下创建 add.html 文件和 register.html 文件
4.在项目的 MyWebMvcConfig 配置类中重写 addViewControlles 方法

@Override
protected void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/add").setViewName("add");registry.addViewController("/register").setViewName("register");
}

5.运行测试,浏览器访问 http://localhost:8080/add,结果访问到了 add.html 页面, 访问 http://localhost:8080/register,结果访问到了 register.html 页面

CORS 跨域资源访问

回顾一下浏览器的同源策略
假设后端的主页 URL 是 http://sike.com/index.htmlimage.png

CORS 基础

CORS 是一个 W3C 的一种跨域资源共享技术标准,目的是为了解决前端的跨域请求问题,是英文 Cross-origin resource sharing 的缩写,全称是“跨域资源共享”,它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。

解决方案

1.@CrossOrigin 注解实现方案
直接在控制器需要跨域访问的方法上面添加@CrossOrigin 注解,并配置跨域属性,主要属性有:

  • value:表示支持的域,即哪些来源的域允许访问。
  • maxAge:表示预检信息的有效缓存时间,单位是秒
  • allowedHeaders:表示允许的请求头。

image.png

@GetMapping("/getMsg")@CrossOrigin(value = "http://localhost:8081")public String getMsg(){return "GET success";}@DeleteMapping("/delMsg")@CrossOrigin(value = "http://localhost:8081")public String delMsg(){return "delete success";}

新建一个新的web项目(换个端口启动)发起ajax跨域请求。
image.png

<script src="/jquery-1.8.3.min.js"></script><body>
<button onclick="sendAjax()">点击发送ajax请求</button>
</body><script>function sendAjax() {$.ajax({url:"http://localhost/getMsg",type:"get",success:function (result) {alert(result)}})}
</script>

image.png
2.基于过滤器的实现方案

@Configuration
public class CorsFilterConfig {@Beanpublic FilterRegistrationBean<CorsFilter> corsFilter(){FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean=new FilterRegistrationBean<>();UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration=new CorsConfiguration();corsConfiguration.addAllowedHeader("*");//允许的请求头
//        corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedOriginPattern("*");//允许的origin域名corsConfiguration.setAllowCredentials(true); //是否允许发cookiecorsConfiguration.setMaxAge(3600L);//从预检请求得到相应的最大时间,默认30分钟corsConfiguration.setAllowedMethods(Arrays.asList("GET","POST","DELETE","PUT")); //允许的请求方法source.registerCorsConfiguration("/**",corsConfiguration);//指定可以跨域的路径corsFilterFilterRegistrationBean.setFilter(new CorsFilter(source));corsFilterFilterRegistrationBean.setOrder(-1);return corsFilterFilterRegistrationBean;}
}

统一响应数据格式

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseData<T> {private String code;//响应状态码private String errorMsg;//用于封装异常信息,正常返回一般为null即可private Boolean result;//表示执行成功还是失败private T data;//封装返回数据
}

Spring Boot 异常处理

自定义错误页

如果不需要向用户展示错误的详细信息,可以把错误信息定义成静态页面,简单地输出自定义的出错啦或找不到之类的网页。 在静态文件路径下创建 error 目录并创建 4xx.html 或 5xx.html 页面,则发生 4 开头的错误状态码代表的异常时将返回 4xx.html,当发生 5 开头的错误状态码代表的异常时将返回5xx.html。还可以用更具体的错误状态码命名的文件,如 404.html,则发生 404 错误时则会直接返回,当发生 403 等错误时返回 4xx。如果最后都找到不到的话还会返回springboot 自带的默认白页。
image.png

@ControllerAdvice 全局统一异常处理

如果客户端需要比较具体的异常信息,则不能用上述简单方法,一般要用注解@ControllerAdvice 进行统一异常处理,如果返回 json 格式的数据也可以使用@RestControllerAdvice,只需要创建一个类加上这个注解就可以捕捉到异常,然后类中各个方法再用@ExceptionHandler 注解来对具体的各个异常分别进行处理

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(NullPointerException.class)public ResponseData exception(NullPointerException exception) {return new ResponseData("500", "空指针异常",false, null);}@ExceptionHandler(IndexOutOfBoundsException.class)public ResponseData exception(IndexOutOfBoundsException exception) {return new ResponseData("500", "数组越界异常", false,null);}@ExceptionHandler(Exception.class)public ResponseData exception(Exception exception) {return new ResponseData("500", exception.getMessage(),false, null);}}

测试类


@RequestMapping("/exception")
@RestController
public class ExceptionController {@GetMapping("/test1")public ResponseData test1() {UserInfo userInfo = null;userInfo.setUsername("zhangsan");return new ResponseData("200",null,true,userInfo);}@GetMapping("/test2")public ResponseData test2() {int[] arr= {1,2,3};System.out.println(arr[3]);//发生越界针异常//以下是正常业务代码 省略return new ResponseData("200",null,true,arr);}@GetMapping("/test3")public ResponseData test3() {int i=10/0; //发生算术异常//以下是正常业务代码return new ResponseData("200",null,true,i);}}

文件上传

单文件上传

Spring Boot 提供了自动配置类 MultipartAutoConfigure 可以实现文件上传,只需导入 spring-boot-starter-web 以及配置 spring.servlet.multipart.enabled=true 即可生效。
#表示是否开启文件上传支持,默认为true
spring.servlet.multipart.enabled=true
#修改文件上传临时保存路径
spring.servlet.multipart.location=C:/temp
#单个上传文件的最大限制 默认是1M
spring.servlet.multipart.max-file-size=2MB
#多个上传文件的最大限制 默认是10M
spring.servlet.multipart.max-request-size=10MB
#文件写入磁盘的阈值
spring.servlet.multipart.file-size-threshold=0B
@RestController
@RequestMapping("/upload")
public class FileUploadController {@PostMappingpublic ResponseData upload(MultipartFile file , HttpServletRequest request){if (!file.isEmpty()) {//默认是上传到项目的webapp下String realPath = request.getServletContext().getRealPath("/uploadFile");File savePath= new File(realPath);if (!savePath.exists()) {savePath.mkdirs();}String fileName= UUID.randomUUID().toString().replace("-","");String originalFilename = file.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.indexOf("."));File saveFile= new File(savePath,fileName+suffix);try {file.transferTo(saveFile);return new ResponseData("200","上传成功",true,null);} catch (IOException e) {return new ResponseData("500","上传出现异常",false,null);}}else{return new ResponseData("500","文件必传",false,null);}}
}

多文件上传

image.png

Thymeleaf 视图层技术

使用过程

1.加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2.配置thymeleaf模板视图解析器
在application. properties中可以添加关于Thymeleaf模板视图解释器的配置项,也可以不添加,使用默认值。参考代码如下:


#关闭Thymeleaf缓存,这样开发时方便测试,无须重启
spring.thymeleaf.cache=false
#设置Thymeleaf页面编码
spring.thymeleaf.encoding=utf-8
#Thymeleaf模式
spring.thymeleaf.mode=HTML5
#Thymeleaf页面的后缀
spring.thymeleaf.suffix=.html
#Thymeleaf页面的存储路径(前缀)
spring.thymeleaf.prefix=classpath:/templates/

3.页面引入命名空间

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>hello</title>
</head>
<body>
欢迎用户<span th:text="${username}">hello</span>登录
</body>
</html>

4.创建控制器

@Controller
@RequestMapping("/thymeleaf")
public class ThymeleafController {@GetMapping("/index")public String index(Model model){model.addAttribute("username","jf3q");return "hello";}
}

基础语法

1.th:text:文本的赋值与替换

<div th:text="${text1}">将被替换掉的原始值</div>

如果替换的文本中有html代码的话,浏览器不能识别

<div th:text="${text2}">不能识别文本中的HTML标签</div>

控制器中加的代码

  model.addAttribute("text2","<h1>hello world</h1>");

2.th:utext
跟th:text用法一样,不同的是如果文本中包含 HTML 标签,浏览器可以识别。

<div th:utext="${text2}">能识别文本中的HTML标签</div>

3.th:value
给有 value 属性的 HTML 标签赋值

用户名:<input type="text" th:value="${username}" /><br/>

4.th:checked
用于决定单选或复选框是否选中

性别:<input type="radio" th:checked="${gender}=='男'" /><input type="radio" th:checked="${gender}=='女'" /><br/>

5.th:selected
决定下拉选择框中的选项是否被选中

城市<select><option th:selected="${city}=='北京'">北京</option><option th:selected="${city}=='上海'">上海</option><option th:selected="${city}=='广州'">广州</option><option th:selected="${city}=='深圳'">深圳</option>
</select>

控制器中加city值

model.addAttribute("city","广州");

6.th:each
用来遍历集合

User user1=new User(1,"李白","123");
User user2=new User(2,"杜甫","123");
List<User> users=new ArrayList<>();
users.add(user1);
users.add(user2);
model.addAttribute("users",users);

用户列表如下:
<table border="1"><tr><th>编号</th><th>用户名</th><th>密码</th></tr><tr th:each="user:${users}"><td th:text="${user.id}"></td><td th:text="${user.username}"></td><td th:text="${user.password}"></td></tr>
</table>

除了遍历元素,还可于获取遍历的状态,thymeleaf 提供如下状态:

  • index:当前的遍历索引,从 0 开始
  • count:当前的遍历索引,从 1 开始
  • size:被遍历变量里的元素数量。
  • current:每次遍历的遍历变量。
  • even:当前的遍历是否为偶数次。
  • odd:当前的遍历是否为奇数次
  • first:当前是否为首次遍历。
  • last: 当前是否为最后一次遍历。

用户列表(含状态)如下:
<table border="1"><tr><th>编号</th><th>用户名</th><th>密码</th><th>索引号</th><th>是否第一个</th><th>是否最后一个</th><th>是否偶数次</th></tr><tr th:each="user,state:${users}"><td th:text="${user.id}"></td><td th:text="${user.username}"></td><td th:text="${user.password}"></td><td th:text="${state.index}"></td><td th:text="${state.first}"></td><td th:text="${state.last}"></td><td th:text="${state.even}"></td></tr>
</table>

7.th:if
选择结构,控制数据是否在页面上显示,当条件为 true 时将填充数据到闭合标签内部

<div th:if="${username}==jf3q" th:text="该用户是管理员"></div>

8.th:unless
选择结构,当条件为 false 时将填充数据到闭合标签内部

<div th:unless="${username}==jf3q" th:text="该用户是普通用户"></div>

9.th:swith 与 th:case
多重选择分支结构,

<div th:switch="${city}"><div th:case="北京">北京</div><div th:case="上海">上海</div><div th:case="广州">广州</div><div th:case="深圳">深圳</div><div th:case="">不确定</div>
</div>

10.th:attr
image.png
11.th:class 与 th:style
image.png

spel表达式

Thymeleaf 提供了 KaTeX parse error: Expected 'EOF', got '#' at position 8: {}、*{}、#̲{}、@{}四种占位符,在{}…{}
用于获取 Model 中的字符串或对象,如果是对象还可以用点运算符进一步获取对象的 属性值或方法。可以获取 Servlet 的各种内置对象,也可以获取 Thymeleaf 的内置对象,如 dates,numbers,strings,arrays,lists 等等。
2.{}
其中的
号代表一个对象,大括号里面的内容代表对象的属性,通常要结合 th:object 属性一起使用,th:object 用来获取一个对象,然后再用*{}去获取对象的各个属性值。image.png
3.#{}
用于读取取国际化 properties 文件的属性。
4.@{} image.png
image.png

Thymeleaf 表达式

 Thymeaf 除了使用 SpEL 表达式外,还有自己的表达式,在${}的大括号中使用的表达式属于 SpEL 表达式,而在 th:属性=""的双引号中应用的是 Thymeleaf 自身的表达式。

1.比较运算
可以使用的运算符包括>、>=、 、 != 、< 、<= ,其中的>和<本身是 HTML 标签的关键字,为了避免歧义,可使用别名,gt 对应>,lt 对应<,ge 对应>=,le 对应<=,not 对应!,eq 对应,neq 或 nq 对应!=。
image.png
image.png
2.三目运算
image.png
3.逻辑运算
image.png
image.png

是否登录:<span th:text="${username=='admin'&&password=='123'}"></span>

内置对象

在 Thymeleaf 中的内置对象有:

  • #ctx:上下文对象。
  • #request:获取 HttpServletRequest 对象。
  • #response:获取 HttpServletResponse 对象。
  • #session:获取 HttpSession 对象
  • #servletContext:获取 HttpServletContext 对象
  • #dates:日期格式化内置对象,具体方法可以参照 java.util.Date
  • #calendars:类似于#dates,但是 java.util.Calendar 类的方法;
  • #numbers:数字格式化;
  • #strings:字符串格式化,具体方法可以参照 java.lang.String,如 startsWith、contains 等;
  • #objects:参照 java.lang.Object
  • #bools:判断 boolean 类型的工具
  • #arrays:数组操作的工具
  • #lists:列表操作的工具,参照 java.util.List
  • #sets:Set 集合操作工具,参照 java.util.Set
  • #maps:Map 集合操作工具,参照 java.util.Map
  • #aggregates:操作数组或集合创建聚合的工具
  • #messages

测试
image.png
image.png

模板片段

系统中的很多页面有很多公共内容,例如标题栏、主菜单、侧边栏、页脚等,这些公共内容可以提取放在一个称为“模板片段”的公共页面里面,其它页面可以引用这个“模板片段”内容。

1.模板片段的定义
普通 html 标签或 标签,添加 th:fragment 属性,这样这个标签及其内部的所有内容就定义为一个模板片段。语法是 th:fragment=“模板片段名称”。
image.png
这里,表示将 block 标签定义为一个模板片段,模板片段的名称叫 loginForm,定义了模板片段的当前 HTML 文件就称为模板,模板名称就是 HTML 文档的名字(不含后缀),此处模板名称为 login。
2.引用片段
1)插入整个模板
使用 th:insert 属性插入整个模板。 语法:th:insert=“~{模板名称}” 除此之外,还可以使用 th:replace 和 th:include 插入。
image.png
2)插入模板片段
语法:th:insert=“~{模板名称::模板片断名称}” 插入模板中的其中一个指定名称的片断,模板片断名可以对应 th:fragment 定义的名称,也可以用类似 JQuery 选择器的语法选择部分片段。
image.png
3)th:insert、th:replace、th:include 的区别

  • th:insert:将公共片段整个插入到声明引入的元素中
  • th:replace:将声明引入的元素替换为公共片段
  • th:include:将被引入的片段的内容包含进这个标签中

3.模板片段传入参数
带参数的模板片段定义语法:th:fragment=“模板片段名称(参数列表)”。参数列表指可以是一个或多个参数。并且在模板片段内部需要内容不同的位置使用参数,使用方式: 参数名称,例如: < s p a n t h : t e x t = " {参数名称},例如:<span th:text=" 参数名称,例如:<spanth:text="{参数}" >。
引用语法:~{模板名称::模板片断名称(参数列表)}。这个参数列表是有实际值的。
image.png
image.png

综合实例

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private Integer id;private String name;private String gender;private Integer age;private String classname;}
 List<Student> students= new ArrayList<>();students.add(new Student(1, "张三","女",20, "计科1班"));students.add(new Student(2, "李四","男",21, "计科2班"));students.add(new Student(3, "李白","男",18, "计科3班"));model.addAttribute("students",students);return "students";
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>学生列表</title>
</head>
<body><table><tr><td>id</td><td>姓名</td><td>性别</td><td>年龄</td><td>班级</td></tr><tr th:each="s:${students}"><td th:text="${s.id}"></td><td th:text="${s.name}"></td><td><input type="radio" th:checked="${s.gender}=='男'" /><input type="radio" th:checked="${s.gender}=='女'" /></td><td th:text="${s.age}"></td><td><select ><option th:selected="${s.classname}=='计科1班'">计科1班</option><option th:selected="${s.classname}=='计科2班'">计科2班</option><option th:selected="${s.classname}=='计科3班'">计科3班</option></select></td></tr>
</table></body>
</html>

接口文档 Swagger3.0

Swagger 是一个用于生成、描述、调用和可视化 RESTful 风格的 Web 服务框架,最主 要的组件是 Swagger UI,该组件提供了一个可视化的 UI 页面展示描述文件,可以在该页面 中对相关接口进行查阅或做一些简单的接口请求。Swagger3.0 和之前版本的依赖不太一样
 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

常用注解

  • @API:用于类上,表示标识这个类是 swagger 的资源(tags,value,hidden)
  • @ApiOperation:用于方法上,表示一个 http 请求的动作(value,notes,httpMethod, hidden)
  • @ApiParam:用于方法,参数或字段说明,表示对参数的添加元数据,说明或是否 必填等(name,value,required)
  • @ApiModel:用于类上,表示对类进行说明,用于参数用实体类接收(value, description)
  • @ApiModelProperty:用于方法或字段,表示对 model 属性的说明或者数据操作更改 (value,name,dataType,required,example,hidden)
  • @ApiIgnore:用于类,方法或方法参数上,表示这个类,或者方法或者参数被忽略 (value)
  • @ApiResponses:用于方法上,方法返回对象的说明(多个 @ApiResponse)
  • @ApiResponse:用于方法上,每个参数的说明(code,message,response)
  • @ApiImplicitParams:用于方法上,包含一组参数说明(多个 @ApiImplicitParam)
  • @ApiImplicitParam :用于方法上,表示单独的请求参数(name,value,required,paramType,dataType,readOnly,allowEmptyValue,defaultValue

springboot整合swagger流程

由于spring Boot 3.0 在写稿时仍然处于快速迭代中,对 swagger3.0 的支持不太好,故这里暂时退到最近一个稳定版本 spring boot2.7.1 来讲解 Spring Boot 整合 Swagger3。
1.加依赖

 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2.Application.properties 中添加如下配置:

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

这个配置的作用是将 SpringBoot 路径匹配模式修改为 AntPathMatcher。Spring Boot 2.6.0 开始使用基于 PathPatternParser 的路径匹配,而 Springfox 版本一直没有更新还是使用 的 AntPathMatcher,如果不这样配置,将会抛出以下异常:image.png
3.创建实体类 User

@Data
@AllArgsConstructor
@ApiModel(value = "用户User类",description = "描述用户User信息")
public class UserInfo {@ApiModelProperty(value = "用户id")private Integer id;@ApiModelProperty(value = "用户名")private String username;@ApiModelProperty(value = "密码")private String password;
}

4.创建配置类 SwaggerConfig 启用 Swagger

@Configuration
@EnableOpenApi
public class SwaggerConfig {@Beanpublic Docket desertsApi(){return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.example.swagger_demo.controller"))//按包扫描,.paths(PathSelectors.any()).build().groupName("jf3q").enable(true);}private ApiInfo apiInfo(){return new ApiInfoBuilder().title("用户管理系统说明API文档")//标题.description("用户管理系统说明API文档")//描述.contact(new Contact("jfit", "https://www.jf3q.com", "12345@qq.com"))//作者信息
//                .termsOfServiceUrl("https://www.sike.com").version("1.0")//版本号.build();}
}

5.controller

@RestController
@RequestMapping("/user")
@Api(tags = "User操作接口")
public class UserInfoController {@AutowiredUserInfoService userInfoService;@GetMapping("/{id}")@ApiOperation(value = "根据id查找用户对象", notes = "根据id查找用户对象")public ResultVo<UserInfo> getUser(@ApiParam(value = "用户ID", example = "1", required = true)@PathVariable Integer id){UserInfo userInfo=  userInfoService.getUser(id);return ResultVo.success("",userInfo);}@GetMapping@ApiOperation(value = "获取所有用户对象", notes = "获取所有用户,无需参数")public ResultVo<List<UserInfo>> getList(){List<UserInfo> list=userInfoService.getList();return ResultVo.success("",list);}
}

6.访问接口文档页面
http://localhost:端口/swagger-ui/index.html
image.png
image.png
image.png
image.png

美化ui界面

Swagger 自带的 UI 界面不是很好看,可以使用流行的第三方 swagger-bootstrap-ui 进行 美化,添加如下依赖,重新启动,访问地址:http://localhost:端口/doc.html

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version>
</dependency>

image.png

生产环境关闭swagger

一般 Swagger 只在开发和测试环境中使用,不带到生产环境中去。可以通过修改配置类 SwaggerConfig 里面的代码 enable(true)为 enable(false)来快速关闭 Swagger。更好的办法是自动识别是生成环境还是开发或测试环境,自动关闭或开启

@Bean
public Docket desertsApi(Environment environment){//开发环境和测试环境
Profiles profiles=Profiles.of("dev","test");
//判断是否处在自己设定的环境当中
boolean swaggerEnabled = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.swagger_demo.controller"))//按包扫描,
.paths(PathSelectors.any())
.build()
.groupName("jf3q")
.enable(swaggerEnabled);
}

image.png

作业

1.把掌上游戏app项目改成springboot项目(mybatis部分先不用动),并集成swagger生成在线接口文档(已经就包含了本章所有内容)
2.练习thymeleaf小案例
image.png

相关文章:

Spring Boot3 Web开发技术

前期回顾 springboot项目常见的配置文件类型有哪些&#xff1f;哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解&#xff1f; value restful风格 RESTful 风格与传统的 HTTP 请求方式相比&#xff0c;更加简洁&#xff0c;安全&#xff0c;能隐…...

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…...

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图&#xff1a;最左侧的分类列是跟随甘特图滚动的&#xff0c;因为这一列如果需要自定义&#xff0c;比如表格的话可能会存在行合并的情况&#xff0c;这个时候甘特图是没有办法做的&#xff0c;然后甘特图的表头又需要做滚动时固定&#xff0c;所以设置了甘特图滚动时&…...

ElasticSearch 架构设计

介绍 ElasticSearchMySQLIndexTableDocumentRowFieldColumnMappingSchemaQuery DSLSQLaggregationsgroup by&#xff0c;avg&#xff0c;sumcardinality去重 distinctreindex数据迁移 ElasticSearch 中的一个索引由一个或多个分片组成 每个分片包含多个 segment&#xff08;分…...

HTML---定位

目录 文章目录 一.定位属性概述 二.position 基础数值 三.z-index属性 网页元素透明度 练习 一.定位属性概述 HTML中的定位属性指的是用来控制HTML元素在页面中的位置和布局的属性&#xff0c;包括position、top、bottom、left和right等。 position属性指定了元素的定位方式&a…...

JVM高频面试题(2023最新版)

JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader&#xff08;类加载器&#xff09;&#xff1a;根据给定的全限定名类名&#xff08;java.lang.object&#xff09;来装载class文件到Runtime data area&#xff08;运行时数据区&#xff09;…...

webpack学习-7.创建库

webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm&#xff0c;而且还要在项目中使用到它&#xff0c;支持各种…...

MQTT - 笔记

1 Mosquitto 官网 https://mosquitto.org/ 2 Windows环境下安装配置Mosquitto服务及入门操作介绍 Windows环境下安装配置Mosquitto服务及入门操作介绍-CSDN博客 3 开源:MQTT安装与配置使用 【C++】开源:MQTT安装与配置使用_c++ mqtt-CSDN博客 4 一文搞懂Qt-MQTT开发...

Django 安装

各位小伙伴想要博客相关资料的话&#xff0c;关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; Django 安装 在安装 Django 前&#xff0c;系统需要已经安装了 Python 的开发环境。 如果你还没有安装 Python&#xff0c;请先从 Python 官网 https://www.python…...

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。...

YCSB 测试表预分区

最近使用 YCSB 测试时&#xff0c;一直使用如下方法创建预分区&#xff1a; TABLE_NAME"usertable" REGIN_SPLITS$((510-1)) cat << EOF | sudo -u hbase hbase shell create ${TABLE_NAME}, cf, {SPLITS > (1..${REGIN_SPLITS}).map {|i| "user#{100…...

K8s 教程

一文让你全面了解K8s(Kubernetes) - 知乎 Install and Set Up kubectl on Linux | Kubernetes阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 留存一份地址...

python:改进型鳟海鞘算法(SSALEO)求解23个基本函数

一、改进型鳟海鞘算法SSALEO 改进型鳟海鞘算法&#xff08;SSALEO&#xff09;由Mohammed Qaraad等人于2022年提出。 参考文献&#xff1a;M. Qaraad, S. Amjad, N. K. Hussein, S. Mirjalili, N. B. Halima and M. A. Elhosseini, "Comparing SSALEO as a Scalable Larg…...

Hive-数据模型详解(超详细)

文章目录 一、Hive数据模型1. 概述2. 数据库和表(1) 创建数据库(2) 使用数据库(3) 创建表格(4) 查看表结构 3. 分区与桶(1) 分区(2) 桶 4. 数据加载与查询(1) 数据导入(2) 查询语句 5. 总结 一、Hive数据模型 1. 概述 Hive是基于Hadoop的数据仓库工具&#xff0c;它提供了类似…...

docker的常规使用总结

不安装docker下载镜像&#xff0c;或者下载异构镜像&#xff0c;模拟docker客户端 https://pull.7ii.win/ 1、启动docker服务 systemctl start docker 设置开机自启 systemctl enable docker 2、查看镜像 docker images --查看下载镜像架构 docker inspect 镜像名字 |…...

CSS 文字弹跳效果

鼠标移过去 会加快速度 <template><div class"bounce"><p class"text" :style"{animationDuration: animationDuration}">欢迎使用UniApp Vue3&#xff01;</p></div> </template><script> export d…...

什么是动态IP?静态IP和动态IP有什么区别?

动态IP(Dynamic IP)和静态IP(Static IP)它是指在计算机网络中分配给设备的两种不同类型的IP地址。 动态IP是指每次设备连接到网络时&#xff0c;网络服务提供商(ISP)IP地址的动态分配。当设备重新连接到网络时&#xff0c;它可能会被分配到不同的IP地址。动态IP适用于传统的家…...

Linux 与 Shell

Linux系统的四部分&#xff1a;Linux系统的核心是内核。内核主要负责四种功能&#xff1a; 系统内存管理 操作系统内核的主要功能之一&#xff1a;内存管理。&#xff08;物理内存 虚拟内存&#xff09;内核通过硬盘上称为交换空间&#xff08;swap space&#xff09;的存储区…...

大数据-Hive练习-环比增长率、同比增长率、复合增长率

目录 &#x1f959;12.1 环比增长率 1. 概述 2. 公式 3. 示例 4.练习-需求:计算各类商品的月环比增长率 &#x1f959;12.2 同比增长率 1. 概述 2. 公式 3. 示例 4. 练习-需求:计算各类商品的月同比增长率 &#x1f959;12.3 复合增长率 1. 概述 2. 公式 3. 示例…...

C++ 考前难点总结

前言 后天考c&#xff0c;但这几天得甲流了&#xff0c;特别难受&#xff01;复习c的时候复习着忘着&#xff0c;所以用csdn记录一下不熟悉的知识点&#xff0c;等后天考前再看一遍&#xff01; 函数模板 #include <iostream>// 定义一个模板类 template <class T1…...

ARM 汇编语言知识积累

博文参考&#xff1a; arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 arm平台根据栈进行backtrace的方法-腾讯云开发者社区-腾讯云 (tencent.com) 特殊功能寄存器&#xff1a; SP&#xff1a; 即 R13&#xff0c;栈指针&#xff0c;…...

k8s面试之——简述网络模型

kubernetes网络模型是kubernetes集群中管理容器网络通信的一种机制&#xff0c;用于实现pod间、pod与外部网络间的通信和互联&#xff0c;并提供了多种网络插件和配置选项来满足不同应用场景下的需求。kubernetes网络模型可以分为一下几个部分&#xff1a; 1. pod网络模型 在…...

C语言中关于if else的理解

if else我们可以理解为 if(条件1) //如果条件1成立 语句1&#xff1b; //执行语句1 else //如果条件1不成立 语句2; //执行语句2 这是一个经典的if els…...

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一&#xff1a;管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式&#xff08;GPIO_MODE_AF_PP&#xff09;&#xff01;&#xff01;&#xff01;&#xff0c;注意&#xff1a;复用开漏模式软件仿真时无波形。 步骤二&#xff1a;编译程序。 ①点击编译按钮。 …...

华纳云:怎么实现Linux主机ssh无密码登录

实现Linux主机之间的SSH无密码登录可以通过使用SSH密钥对。以下是简单的步骤&#xff1a; 步骤 1: 生成SSH密钥对 打开终端&#xff0c;并在本地计算机上执行以下命令&#xff1a; ssh-keygen -t rsa 此命令将生成一对SSH密钥(公钥和私钥)。您可以选择在生成密钥时设置密码&…...

模型树实操

很多时候&#xff0c;数据都是有层级和分类的&#xff0c;使用laravel的Dcat框架&#xff0c;可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台&#xff1b;先上例子更直观&#xff1a; 这里是Dcat的模型树使用文档&#xff0c;戳一下&#xff1b; 重点注意事项有&#x…...

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…...

c语言:计算1+2+3……+n的和|练习题

一、题目 输入一个数n&#xff0c;计算123……n的和 二、代码截图【带注释】 三、源代码【带注释】 #include int main() { int num0; printf("请输入要运算的数:"); scanf("%d",&num); sumResult(num);//相加结果函数 } //计算打印…...

Yolov5水果分类识别+pyqt交互式界面

Yolov5 Fruits Detector Yolov5 是一种先进的目标检测算法&#xff0c;可以应用于水果分类识别任务。结合 PyQT 框架&#xff0c;可以创建一个交互式界面&#xff0c;使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述 Yolov5 水果分类识别和 PyQT 交互式界面的实现…...

正式环境和sandbox中的RecordTypeId不一样应该怎么办

如果在 Salesforce 正式环境和 Sandbox 中&#xff0c;RecordTypeId 不一样&#xff0c;通常需要在代码或配置中进行适配&#xff0c;以确保代码在不同环境中的兼容性。以下是一些常见的方法&#xff1a; 使用自定义设置或自定义标签&#xff1a; 创建自定义设置或自定义标签来…...