SpringBoot实战——个人博客项目
目录
一、项目简介
二、项目整体架构
数据库模块
后端模块
前端模块
三、项目具体展示
四、项目的具体实现
1、一些准备工作
🍎数据库、数据表的创建
🍎设置数据库和MyBatis的配置
🍎将前端项目引入到当前项目中
2、登录注册模块
🍑实体类的创建
🍑前端后端交互
🍑后端流程
🍑 登录功能的实现和注册大同小异
3、统一功能的处理
🍎统一异常处理
🍎统一数据格式返回
🍎统一用户的登录验证(用户登录拦截器)
🍎过程中遇到的bug
4、博客列表页面的实现(更新中...)
5、博客详情页面的实现
6、博客的修改和删除功能
7、博客列表分页功能的实现
8、随机加盐的实现
一、项目简介
项目名称:个人博客系统
主要操作的对象是:文章和用户,用户可在该系统上发表自己的博客,查看自己或别人已经发表的文章
需要用到两张表:userinfo(用户表)、articleinfo(文章表)
需要实现的功能:
登录+注册
博客的分页列表功能
新增发表博客
修改、删除自己的博客
项目技术栈
SSM(SpringBoot + SpringMVC + MyBatis)
MySQL
jQuery
项目亮点
手动对用户密码实现随机加盐
统一异常处理、拦截器
用户登录持久化(session内存)
分页功能
二、项目整体架构
数据库模块
两张表:用户表 + 文章表
后端模块
控制层(controller包)——》控制器
服务层(service包)——》服务类
持久层--数据访问层(java目录下mapper类 + resources目录下的mapper.xml)——》mapper
实体层(model包)——》实体类
工具层(config包+util包)——》统一异常处理、统一返回、随机加盐
前端模块
前端设计到7个页面
login.html登录页
reg.html注册页
blog_list.html总的博客列表页——》用到了blog_l
myblog_list.html个人博客列表页
blog_content.html博客详情页
blog_edit.html博客编辑页
blog_update.html博客修改页
三、项目具体展示
项目公网地址:登陆页面
登录页面、注册页面
总的博客列表页面
博客详情页
个人博客主页
博客修改页面
博客编辑页面
项目源码:java_spring: SpringMVC、SpringBoot、MyBatis学习 - Gitee.com
四、项目的具体实现
1、一些准备工作
首先我们新建一个springboot项目,项目具体的创建流程我这里就不在赘述。
详见:SpringBoot项目的创建
接下来我们就要数据库引入该项目。
🍎数据库、数据表的创建
用户表的创建
文章表的创建
🍎设置数据库和MyBatis的配置
🍑配置数据库的连接信息
这里的很多内容是固定的
# 数据库连接配置
Spring:datasource:url: jdbc:mysql://localhost:3306/你要连接的数据库名?characterEncoding=utf8&useSSL=falseusername: 用户名password: 自己的密码driver-class-name: com.mysql.cj.jdbc.Driver #只要你数据库用的是mysql这个是固定的
🍑配置MyBatis XML存放位置和命名规则
此时我们已经在通过maven将MySQL Driver和MyBatis Framework这两个包导入了进来,此时启动项目,项目依然能够正常运行,说明我们数据库连接是正常的。
🍎将前端项目引入到当前项目中
下面的前端的静态资源复制到我们resource/static目录下面:
springboot项目-个人博客系统静态页面https://download.csdn.net/download/weixin_61061381/87459276
2、登录注册模块
🍑实体类的创建
登录和注册不就是对用户表进行操作吗?这个我们首先创建用户表对应的实体类
首先根据我们数据库的表,在我们的程序中创建想对应的实体类——我们的MyBatis是ORM框架,我们的程序对象与关系数据库数据之间有响应的映射关系
- 一个数据库中的数据表对应我们程序中的一个实体类
- 数据表中的一行数据对应该实体类的一个实例化对象
- 该数据表中的各个属性对应该实体类的成员变量(属性)
对了,还记我们springboot的扫描路径吗?
只有在启动类的同级目录下,springboot才会对该目录下的类进行扫描,配合类注解存到spring容器中。
接下来我们就尝试给我们的用户表插入一条数据。
如上图所示:我们从前端的login.html中获取到数据后,经过控制层——》服务层——》数据持久层,最后才作用到我们的数据库上。
废话不多说,让我们跟着流程来走一遍吧!
controller层
上图描述的是,我们通过url直接调用了我们控制层的sayHi()方法,并且把我们sayHi()方法返回的的结果展现在了浏览器上。
🍎但是现在我们有前端了,我们前端提交数据(调用我们的后端controller层的登录方法),然后把结果返回给前端不就行了吗(用户是登录失败了,还是成功了,交由我们的前端来处理)
🍑前端后端交互
首先用户在前端页面输入了用户信息
然后前端紧接着就把用户输入的信息传递给后端(提交到后端指定的接口上,比如登录提交的就是/user/reg
后端接收到用户信息,存到数据库中,并返回注册的结果(成功了?还是失败了?)
前端接受到后端返回的结果后做进一步的处理
🍑后端流程
还是先来看这张图
下面是根据上图流程构建的目录
controller层代码
package com.example.demo.controller;import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
/*** 而Spring Boot框架项目接口返回 JSON格式的数据比较简单:* 在 Controller 类中使用@RestController注解即可返回 JSON格式的数据。*/
@RestController
@RequestMapping("/user")
public class UserController {// 属性注入service服务层的userService类@Autowiredpublic UserService userService;@RequestMapping("/reg")public HashMap<String, Object> reg(String username, String password1, String password2) {HashMap<String, Object> result = new HashMap<>();if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password1) || !StringUtils.hasLength(password2)) {result.put("status", -1);result.put("msg", "参数输入错误");result.put("data", "");return result;}else {if (!password1.equals(password2)) {result.put("status", -1);result.put("msg", "前后密码不一致");result.put("data", "");return result;}else {UserInfo userInfo = new UserInfo();userInfo.setUsername(username);userInfo.setPassword(password1);int ret = userService.reg(userInfo);if (ret != 1) {result.put("status", -1);result.put("msg", "数据库添加出错");result.put("data", "");return result;}else {result.put("status", 200);result.put("msg", "注册成功");result.put("data", ret);return result;}}}}
}
在controller层中调用了service服务层的reg方法
service服务层又调用了持久层中的mapper接口
mapper接口的实现:UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"><insert id="reg">insert into userinfo(username, password) values(#{userinfo.username}, #{userinfo.password});</insert>
</mapper>
到此,关于注册整个前后端的流程就走完了,下面我们来验证一下
但是当我们重复注册张三这个用户名
这个异常我们前端是不知道的,我们不知道发生了什么,是注册成功了?还是失败了?
在后端我们应该统一对异常进行处理,并把具体的异常情况告诉前端
这就是我们下面要说的统一处理功能的实现
关于前后端参数的传递,详见:SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交)_是小鱼儿哈的博客-CSDN博客
关于MyBatis实现数据库的增删改查,详见:第一个MyBatis程序_是小鱼儿哈的博客-CSDN博客
关于spring更简单的存取用户对象,详见:
spring更简单的对象存取
🍑 登录功能的实现和注册大同小异
后端流程
前后端交互的流程
下面我们通过浏览器验证一下我们的登录功能
一点补充
通过controller层的代码,可以看到我们返回给前端的好像是hashmap,这样肯定是不行的。
这个时候就用到了我们的@RestController注解了
*@RestController是@Controller和@ResponseBody两者的结合,使用这个注解后该controller的所有方法都会返回json格式的数据* 因为@ResponseBody的作用就是把返回的对象转换为json格式,并把json数据写入response的body中,前台收到response时就可以获取其body中的json数据了。 * 如果在整个controller类上方添加@RestController,其作用就相当于把该controller下的所有方法都加上@ResponseBody,使每个方法直接返回response对象
3、统一功能的处理
上面我们说了,当程序出现了异常获取其他情况,我们不统一处理(把结果告诉前端)我们其实是不知道发生了什么的。
🍎统一异常处理
所以我们需要单独在工具层中(我们的common包下面,建一个统一异常处理的类)
🍎统一数据格式返回
一般在web项目中,我们前后端都是通过json这种数据格式来交换数据格式——》我们后端需要给前端返回json格式的数据。
总之,我们前后端用户交互的数据个数一般是统一的,不会出现你一个接口用一种数据格式,而那个接口又换了,这样就会有很多问题,不利于开发。
统一数据的优点
- 方便前端程序员更好的接受和解析后端数据接口返回的数据。
- 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回的。
- 有利于项目统一数据的维护和修改。
- 有利于后端技术部门的统一规范的标准制定,不会出现稀奇古怪的返回内容。
统一数据格式的返回有两种实现方式,返回一个公共对象或者重写。
这里我们采用第二种重写(不过他的灵活性有待提升)
具体的我们可以使用@ControllerAdvice+ResponseBodyAdvice的方式实现,具体实现代码如下:
但是正如我们上面所说的,通过重写来进行统一数据格式的返回,他的灵活性的确有待提高。你看我们上面只是处理了成功的情况,但要是失败的情况呢?——》并且即使失败,也是分好几种情况呢!!!
我们不如再创建一个工具类,用来自定义返回hashmap数据(再通过@ResponseBody转成json格式)
那么对应的我们的统一数据格式返回类就发生了变化
package com.example.demo.common;import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.HashMap;/*** 统一数据格式返回(灵活性有待提高)* 通过统一数据格式的返回,不管我们控制层的方法返回了什么类型的数据* 通过重写末尾都能把他转成hashmap格式的数据,然后又通过@ResponseBody注解,将java对象转成了json对象。*/
@ControllerAdvice
@ResponseBody
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true; // 这个值为true的时候,才会对返回的数据进行重写}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 在有了我们自定义数据返回后,我们的这个统一数据格式返回类就像是一个托地的。// 因为controller层可以直接调用AjaxResult,来返回hashmap(通过@ResponseBody转成json)// 但如果controller没有调用AjaxResult,直接返回了if (body instanceof HashMap) {return body; // 此时已经是hashmap格式了}if (body instanceof Integer){ // 当controller层中的方法直接返回int类型时候int num = (int) body;if (num <= 0) {// 应对int类型错误返回(查询文章列表,新增和删除博客可能会用到)——》也可能用不到,如果新增或查询失败,我直接就在controller就返回了(通过调用AjaxResult)// 新增、删除或查询失败(非得在controller返回int值,再通过这里返回json对象的话,不灵活(出错信息显示的不具体// 所以说这里我们只是以防万一,我们还是选择再controller层直接返回json对象,这样更信息具体,更有怎针对性)return AjaxResult.fail("抱歉,本次操作失败,请稍后再试!"); // 这里无法区分是新增失败还是删除失败// 这里我们本来返回的是一个hashmap格式的对象,但加了@ResponseBody,把我们的java对象转成的了json格式}}if (body == null) { // (比如查询操作,直接返回查询到的UserInfo对象,然后直接返回该对象)// 这里我们本来返回的是一个hashmap格式的对象,但加了@ResponseBody,把我们的java对象转成的了json格式return AjaxResult.fail("抱歉,查询失败!"); // 这时对查询当前用户的特判}// 这里我们本来返回的是一个hashmap格式的对象,但加了@ResponseBody,把我们的java对象转成的了json格式return AjaxResult.success("操作成功", body);// 前端是通过result中的status值来判断操作是否成功的,这个类用来处理操作成功的情况(为操作成功的情况兜底)// 但这可能存在问题,如果操作失败,并且在controller层没有调用AjaxResult中的fail方法(而是直接返回,通过这个类来返回统一的数据格式,就会出现问题——》在这个类我们都是按成功的处理的)// 解决方案,在该类中提前判断body(判断操作失败的情况)--->我们约定如果操作失败就返回负数(在controller层调用AjaxResult的情况)}
}
那么与之对应的我们在controller层的类也就发生了改变
package com.example.demo.controller;import com.example.demo.common.AjaxResult;
import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
/*** 而Spring Boot框架项目接口返回 JSON格式的数据比较简单:* 在 Controller 类中使用@RestController注解即可返回 JSON格式的数据。* @RestController是@Controller和@ResponseBody两者的结合,使用这个注解后该controller的所有方法都会返回json格式的数据,* 因为@ResponseBody的作用就是把返回的对象转换为json格式,并把json数据写入response的body中,前台收到response时就可以获取其body中的json数据了。* 如果在整个controller类上方添加@RestController,其作用就相当于把该controller下的所有方法都加上@ResponseBody,使每个方法直接返回response对象。*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredpublic UserService userService;@RequestMapping("/reg")public Object reg(String username, String password1, String password2) {HashMap<String, Object> result = new HashMap<>();if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password1) || !StringUtils.hasLength(password2)) {return AjaxResult.fail("你输入的参数有误,请重新输入!");}else {if (!password1.equals(password2)) {return AjaxResult.fail("前后密码不一致,请重新输入!");}else {UserInfo userInfo = new UserInfo();userInfo.setUsername(username);userInfo.setPassword(password1);int ret = userService.reg(userInfo);if (ret != 1) {return AjaxResult.fail("数据库添加用户失败,请稍后再试!");}else {return AjaxResult.success("恭喜,注册成功!", ret);}}}}@RequestMapping("/login")public Object login(String username, String password) {HashMap<String, Object> result = new HashMap<>();if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {return AjaxResult.fail("你输入的参数有误,请重新输入!");}else {// 需要在数据库中查询当前登录的用户是否存在UserInfo userInfo = userService.selectByUsername(username);if (userInfo == null || !password.equals(userInfo.getPassword())) {return AjaxResult.fail("你当前的用户名或密码错误,请重新输入!");}else {return AjaxResult.success("恭喜,登录成功!", "");}}}
}
🍎统一用户的登录验证(用户登录拦截器)
spring拦截器
对于以上问题Spring中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤:
1、创建自定义拦截器,实现 HandlerInterceptor 接口的perHandle(执行具体方法之前的预处理)方法。
2、将自定义拦截器加入 WebMvcConfiger的 addInterceptors方法中。
创建用户登录拦截器
将该自定义拦截器放到系统的配置文件中
(将自定义拦截器加入 WebMvcConfiger的 addInterceptors方法中)
用浏览器测试一下是否真的拦截了
可以看到因为我们没有放行login.html,登录页面直接显示不出来了。
我们改下拦截规则
然后你发现,咦,怎么还是不行。
当然不行呀,你虽然运行了login.html通行,但是login.html还用到了css/js/image图片呢!这些东西你还没放行呢!!!
🍎过程中遇到的bug
一开始,当我把自定义的用户登录拦截器放到了系统配置文件,我欢欢喜喜的启动项目,结果——
加上类注解后问题就解决了。
关于统一功能的处理,详见:SpringBoot统一功能处理_是小鱼儿哈的博客-CSDN博客
4、博客列表页面的实现(更新中...)
5、博客详情页面的实现
6、博客的修改和删除功能
7、博客列表分页功能的实现
8、随机加盐的实现
相关文章:
![](https://img-blog.csdnimg.cn/11cc9714dc7f43b4864d3495fd5823c6.png)
SpringBoot实战——个人博客项目
目录 一、项目简介 二、项目整体架构 数据库模块 后端模块 前端模块 三、项目具体展示 四、项目的具体实现 1、一些准备工作 🍎数据库、数据表的创建 🍎设置数据库和MyBatis的配置 🍎将前端项目引入到当前项目中 2、登录注册模块 &…...
![](https://img-blog.csdnimg.cn/4ca79dc93b774435af6bedf66a7b7b0c.png)
浅谈Spring中事务管理器
由于事务部分代码在设计上整体比较简单,我自己觉得它在设计上没有什么特别让我眼前一亮的东西,所以下文更多的是侧重执行流程,能理解事务管理器等一众概念以及相关的变量含义,真正遇到Bug会调试,知道在什么地方打断点就…...
![](https://img-blog.csdnimg.cn/d1481332314d490e8895e410b0456b86.png)
Python练习系统
用python给自己做个练习系统刷题吧! #免费源码在文末公众号哈# 选择题 def xuanze():global flag2if flag21:def insert():numvar1.get()questionvar2.get()choicevar3.get()answervar4.get()with open(d:\\练习系统\\练习三3.1.pickle,rb) as file:lst1pickle.lo…...
![](https://img-blog.csdnimg.cn/c9f379d2622f4d0884323026dae256bf.png)
Transformer学习笔记1
Transformer学习笔记1 翻译中,每个词翻译时更看重哪个原词? ## 注意力机制的一般性原理 典型的注意力机制 hard one-hot形式,但是太过专一 soft 都分布,但是太过泛滥 local attention 自注意力机制:self-atte…...
![](https://img-blog.csdnimg.cn/7526463afb1343beb3c0eb5bbca5ffb0.webp)
软件测试简历个人技能和项目经验怎么写?(附项目资料)
目录 前言 个人技能 项目实战经验 项目名称:苏州银行项目(webapp) 项目描述: 项目名称:中国平安项目(webapp) 项目描述: 项目名称:苏宁易购项目(webapp&a…...
![](https://img-blog.csdnimg.cn/57305991ed814108be8c34fee6f7221d.png)
C语言运算符优先级和结合性一览表
所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁。 运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符()和逗号运算符 简单记就是:! > 算术运…...
![](https://www.ngui.cc/images/no-images.jpg)
Java8介绍
Java 8 Java 8 把函数式编程里的一些思想融入到 Java 的语法中,让我们可以用更少的时间写出高效的代码。 Java 8的优势: 代码行更少Lambda表达式Stream API便于并行减少空指针JVM优化兼容老版本 Lambda Lambda表达式是一段可以传递的代码࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
Java 基准测试
Java 基准测试maven依赖简单使用执行多个函数BenchmarkMode(Mode.AverageTime) 运行模式OutputTimeUnit(TimeUnit.NANOSECONDS) 报告结果时间单位Warmup(iterations 5,time 1,timeUnit TimeUnit.SECONDS) 预热参数Measurement(iterations 5,time 1,timeUnit TimeUnit.SEC…...
![](https://www.ngui.cc/images/no-images.jpg)
普通护照出国免签及落地签国家和地区
1.互免签协议的国家(双向免签) 序号 协议国 限制条件 生效日期 1 阿联酋 停留不超过30天 2018.01.16 2 巴巴多斯 停留不超过30天 2017.06.01 3 巴哈马 停留不超过30天 2014.02.12 4 白俄罗斯 停留不超过30天 2018.8.10 5 波黑 停留不超…...
![](https://img-blog.csdnimg.cn/a688e2fa3ff542e48fd8b2e08bda2641.png)
20230219 质心和重心的区别和性质
质心:(无需重力场的前提)所有质点的位置关于它们的质量的加权平均数。 重心:(需要重力场的前提)重力对系统中每个质点关于重心的力矩之和为零。 质心: xˉ∑i1nmixi∑i1nmi,yˉ∑i1nmiyi∑i1nmi…...
![](https://img-blog.csdnimg.cn/img_convert/d263f63b04406f9d30e443a45b4a2cd0.png)
maven多环境配置
maven多环境配置 参考网址: https://mp.weixin.qq.com/s/-e74bd2wW_RLx7i4YF5M2w https://mp.weixin.qq.com/s/3p53kBHqys58QdMme6lR4A 项目地址 https://gitee.com/shao_ming314/maven-profile-dir 项目说明 该项目基于目录进行多环境配置 , 具体的配置文件在 src/resource…...
![](https://img-blog.csdnimg.cn/img_convert/fc47ca9de303a14ae7236e77d12fab9d.png)
设计模式之中介模式与解释器模式详解和应用
目录1 中介模式详解1.1 中介模式的定义1.1.1 中介者模式在生活场景中应用1.1.2 中介者模式的使用场景1.2 中介模式的通用实现1.2.1 类图设计1.2.2 代码实现1.3 中介模式应用案例之聊天室1.3.1 类图设计1.3.2 代码实现1.4 中介者模式在源码中应用1.4.1 jdk中Timer类1.5 中介者模…...
![](https://www.ngui.cc/images/no-images.jpg)
2023年全国最新交安安全员精选真题及答案1
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题: 1.对施工组织设计中的安全技术措施或者专项施工方案是否…...
![](https://www.ngui.cc/images/no-images.jpg)
chrome插件开发备忘录
文章目录前言要点通信方式注意事项参考前言 第一次接触到插件开发,起因是我用了十多年的一键上传需要升级了。之前的版本来自于有道云,是通过在书签栏加一个书签,然后将上传功能注入到当前页面的方式来实现的。一直也用得挺好,挺…...
![](https://img-blog.csdnimg.cn/570729ab6b7149d5ba7de76a9a1777d7.png)
实例1:控制树莓派板载LED灯闪烁
实例1:控制树莓派板载LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派。通过对树莓派板载LED灯的状态读写控制,熟悉树莓派本身的操作及Linux中文件的读写。掌握常见函数time.sleep(…...
![](https://www.ngui.cc/images/no-images.jpg)
华为OD机试题 - 最大排列(JavaScript)
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...
![](https://img-blog.csdnimg.cn/1f5f143393a147efb465ce0c98bc90b5.jpeg)
手动创建 vue2 ssr 开发环境
本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦,因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说,很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…...
![](https://www.ngui.cc/images/no-images.jpg)
RHCE-操作系统刻录工具
Windows 1.准备材料。 一个可用的windows操作系统(下载的时候用迅雷比较快) MSDN, 我告诉你 - 做一个安静的工具站 大于等于8G的U盘 想要安装的系统光盘镜像 U盘烧录工具(软碟通) UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 …...
![](https://img-blog.csdnimg.cn/a79c496c9a8346bdabbfc3b16f57681f.png)
PHP面向对象01:面向对象基础
PHP面向对象01:面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...
![](https://img-blog.csdnimg.cn/img_convert/3be3ed4db6f14fc458bf9c633213748a.png)
《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url。URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL的索引、视图
什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放,但不能独立存在,必须属于某个表 由数据库自动维护,表被删除时,该表上的索引自动被…...
![](https://img-blog.csdnimg.cn/ababa629e028422aa72584ae6146c78a.png)
【JavaWeb】网络层协议——IP协议
目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本:就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度:单位是4字节。于TCP首部长度完全一致,也是可变的&…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python学习笔记】41.Python3 多线程
前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理…...
![](https://img-blog.csdnimg.cn/img_convert/3ebfc82605c06357dff744b8548bcd00.png)
Windows 版本ffmpeg编译概述
在使用ffmpeg过程当中,ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可,Android需要交叉编译,在windows就比较麻烦,庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库(http://ffmpeg.org/download.html#b…...
![](https://img-blog.csdnimg.cn/d09e7ef7680f4bd8a19d93c5446ed267.png)
NETCore下CI/CD之自动化测试 (详解篇)
NETCore下CI/CD之自动化测试 (详解篇) 目录:导读 前言 安装JDK 安装 Tomcat 首先,我们需要指定 Tomcat.PID 进程文件,进入 /usr/local/tomcat/bin,编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...
![](https://www.ngui.cc/images/no-images.jpg)
Hoeffding不等式剪枝方法
在基于物品的协通过滤算法中,当用户历史行为数据有很多时,对计算会有很大挑战,对此可以使用剪枝对数据进行化简来达到减少计算量。 不是每个物品对都需要进行增量计算。对于两个物品的相似度,每次更新都能够得到一个新的相…...
![](https://www.ngui.cc/images/no-images.jpg)
【算法】数组中的重复数字问题
数组中的重复数据 数组中重复的数字 错误的集合 以第三题,错误的集合为例 对于这样的问题,有很简单的解决方式,先遍历一次数组,用一个哈希表记录每个数字出现的次数,然后遍历一次 [1…N],看看那个元素重…...
![](https://img-blog.csdnimg.cn/c4e978b23a6d448b9e89f3d7ee98e3da.png)
数值方法笔记2:解决非线性方程
1. 不动点定理及其条件验证2. 收敛阶、收敛检测与收敛加速2.1 如何估计不动点迭代的收敛阶xk1g(xk){x}_{{k}1}{g}\left({x}_{{k}}\right)xk1g(xk)2.2 给定精度的情况下,如何预测不动点迭代需要迭代的次数2.3 如何加快收敛的速度2.4 停止不定点迭代的条件2.5 不动…...
![](https://img-blog.csdnimg.cn/d9b2416074914b189e5b6caeb7894632.png)
基于SpringBoot的在线文档管理系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...
![](https://img-blog.csdnimg.cn/img_convert/2aea4fad9951cd4ab03e267334bb3994.png)
软件体系结构(期末复习)
文章目录软件体系结构软件体系结构概论软件体系结构建模软件体系结构风格统一建模语言基于体系结构的软件开发软件体系结构 软件体系结构概论 软件危机是指计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的表现: 软件危机的原因: 软件工程的基本要素…...
![](https://img-blog.csdnimg.cn/img_convert/6c8b69d41abf1b5852112cbad545cf0a.png)
网络营销的网站建设/怎么策划一个营销方案
原标题:小程序日活超4亿,近10万商家开通直播,私域红利已来 !9 月 9 日晚间消息,在 2020 腾讯全球数字生态大会微信专场上,微信团队透露,截止 2020 年8 月,小程序日活超过 4 亿&#…...
![](https://img-blog.csdnimg.cn/img_convert/637c06e21c5ed56faaa121ade8e5fa13.png)
东莞微联建站/商业计划书
媒体报道的消息显示,金立前总裁卢伟冰加入小米,同时小米宣布旗下品牌红米改名为Redmi并独立运营,有分析认为卢伟冰可能将负责红米品牌,并巩固红米品牌在国际市场的竞争优势,而小米品牌则专注于高端手机市场。小米这一做…...
![](/images/no-images.jpg)
江苏建设教育/电脑系统优化软件
我会持续分享一些我发现的好网站,帮助大家提高技术。谢谢。 1.发现一个很好的网站,可以下载一些文档,对于英语差的同学来说是一个福利。 网址:http://www.open-open.com/doc/ 网站名:OPEN开源文档。 2. 推荐一个python…...
![](https://images0.cnblogs.com/i/587057/201404/190025051825721.png)
公司网站管理制度/百度学术论文查重官网入口
打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据。 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据。 关键是抓取到网页之后如何获取到想要的数据呢?然…...
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
桑拿网站横幅广告怎么做/域名注册网站查询
简介和安装 redis简介redis安装redis运行node_redis安装 连接到redis服务器redis.createClient()认证 client.auth(password, callback)单值set和get client.set(key,value,[callback])client.get(key,[callback])client.set([key,value],callback) 多值get和set client.hmset(…...
![](https://img-blog.csdnimg.cn/2022010703332214151.png)
公司网站能否申请国外免费空间/关键词搜索优化外包
请用C实现一个链表,实现链表的查找,逆置,替换,删除,添加,清空,创建。查找、替换和删除、添加里面都会用到遍历链表的操作,所以重点在于遍历, 链表的逆置和清空考虑到效率…...