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

Java开发:Spring Boot 实战教程

序言

随着技术的快速发展和数字化转型的深入推进,软件开发领域迎来了前所未有的变革。在众多开发框架中,Spring Boot凭借其“约定大于配置”的核心理念和快速开发的能力,迅速崭露头角,成为当今企业级应用开发的首选框架之一。

《Spring Boot实战教程》旨在为广大开发者提供一本系统、全面且实用的学习指南。本教程不仅深入解析了Spring Boot的核心特性和最佳实践,还通过大量的实战案例,帮助读者快速掌握Spring Boot的应用开发技巧,从而能够高效、稳定地构建出符合业务需求的Web应用。

1、为何选择Spring Boot?

在众多的开发框架中,Spring Boot以其独特的优势赢得了开发者的青睐。首先,Spring Boot简化了Spring应用的初始搭建和开发过程,通过提供大量的默认配置和自动化配置,使开发者能够快速地启动和运行应用。其次,Spring Boot支持各种主流的开发工具和平台,如Maven、Gradle、IntelliJ IDEA等,方便开发者根据自己的习惯和需求选择最适合的开发环境。最后,Spring Boot拥有庞大的社区支持和丰富的生态系统,开发者可以轻松找到所需的库和插件,实现各种复杂的功能需求。

2、本教程的特点

系统全面:本教程从Spring Boot的基础知识讲起,逐步深入到高级特性和实战应用,涵盖了Spring Boot的各个方面。
实战导向:通过大量的实战案例和示例代码,帮助读者更好地理解和掌握Spring Boot的应用开发技巧。
图文并茂:教程中穿插了大量的图表和示意图,使内容更加生动直观,易于理解。
深入浅出:对于复杂的概念和技术,本教程采用深入浅出、循序渐进的讲解方式,使读者能够轻松掌握。

3、本教程的内容结构

本教程共分为以下几个部分:

基础篇:介绍Spring Boot的基本概念、发展历程和核心特性,以及如何搭建一个基础的Spring Boot项目。
进阶篇:深入解析Spring Boot的高级特性和最佳实践,包括数据访问、Web开发、安全控制、性能优化等方面。
实战篇:通过多个实战案例,展示如何使用Spring Boot构建符合业务需求的Web应用,包括电商网站、企业门户、社交应用等。
高级篇:介绍Spring Boot与微服务架构、云计算、容器化等技术的结合应用,以及如何进行Spring Boot应用的测试和部署。

4、结语

《Spring Boot实战教程》不仅是一本学习指南,更是一本实战手册。通过本教程的学习,你将能够全面掌握Spring Boot的应用开发技巧,并能够在实际项目中灵活运用这些技巧,构建出高效、稳定且符合业务需求的Web应用。让我们一起踏上Spring Boot的实战之旅吧!

一、创建Springboot项目

  1. 创建Maven工程
  2. 导入spring-boot-stater-web起步依赖
  3. 编写Controller
  4. 提供启动类

二、手动创建SpringBoot工程

在这里插入图片描述

在这里插入图片描述

三、编写配置文件application.properties

删除application.properties配置文件,新建application.yml或application.yaml配置文件【两者区别请自行查询】
在这里插入图片描述
在这里插入图片描述

四、编写Controller

在这里插入图片描述

启动项目后在控制台会显示配置的端口

在这里插入图片描述

可以根据需要将pom文件中的jdk17改为jdk8【注意mybatis等三方依赖库的版本也需要降低】

在这里插入图片描述

五、提供启动类

在这里插入图片描述

六、启动服务,在浏览器调用http://localhost:8080/hello

页面返回Hello World~表示调用成功,项目搭建正常

------------接下来就可以进行业务相关接口开发了------------

七、执行sql语句【在navicat、idea或者dos窗口执行sql语句】

-- 创建数据库
create database big_event;-- 使用数据库
use big_event;-- 用户表
create table user (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32)  comment '密码',nickname varchar(10)  default '' comment '昵称',email varchar(128) default '' comment '邮箱',user_pic varchar(128) default '' comment '头像',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '用户表';-- 分类表
create table category(id int unsigned primary key auto_increment comment 'ID',category_name varchar(32) not null comment '分类名称',category_alias varchar(32) not null comment '分类别名',create_user int unsigned not null comment '创建人ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间',constraint fk_category_user foreign key (create_user) references user(id) -- 外键约束
);-- 文章表
create table article(id int unsigned primary key auto_increment comment 'ID',title varchar(30) not null comment '文章标题',content varchar(10000) not null comment '文章内容',cover_img varchar(128) not null  comment '文章封面',state varchar(3) default '草稿' comment '文章状态: 只能是[已发布] 或者 [草稿]',category_id int unsigned comment '文章分类ID',create_user int unsigned not null comment '创建人ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间',constraint fk_article_category foreign key (category_id) references category(id),-- 外键约束constraint fk_article_user foreign key (create_user) references user(id) -- 外键约束
)

八、整合mysql

在这里插入图片描述

九、整合mybatis

在这里插入图片描述

十、配置application.yml文件

在这里插入图片描述

十一、在包名下新建业务分类包

在这里插入图片描述

十二、通用实体类

返回结果实体类:

package com.source.bigevent2.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {private Integer code;//状态码0成功;1失败private String msg;//提示信息private T data;//响应数据public static Result success() {return new Result(0, "操作成功", null);}public static <E> Result<E> success(E data) {return new Result<>(0, "操作成功", data);}public static Result<String> error(String msg) {return new Result<>(1, msg, null);}
}

分页返回结果实体类:

package com.source.bigevent2.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;//分页返回结果对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean<T>{private Long total;//总条数private List<T> items;//当前页数据集合
}

十三、注册用户

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如果只添加正则校验参数不合格时会被校验,并抛出异常,如下:

在这里插入图片描述

这时候可以添加全局异常捕获
【参考:https://huaweicloud.csdn.net/638754d5dacf622b8df8b03d.html】,如下:

在这里插入图片描述

十四、登录认证

令牌就是一段字符串
承载业务数据, 减少后续请求查询数据库的次数
防篡改, 保证信息的合法性和有效性
JWT
JWT依赖:

在这里插入图片描述

在这里插入图片描述

JWT详细步骤:

在这里插入图片描述

在这里插入图片描述

JWT工具类:

package com.source.bigevent.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "itheima";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)).sign(Algorithm.HMAC256(KEY));}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}

登录返回token

    @PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {User user = userService.findByUserName(username);if (user == null) {return Result.error("用户名错误");}if (Md5Util.checkPassword(password, user.getPassword())) {Map<String, Object> claims = new HashMap<>();claims.put("userId", user.getId());claims.put("userName", username);String token = JwtUtil.genToken(claims);//使用redis对token进行进一步校验,登录成功存一份token到redis中redisTemplate.opsForValue().set("Token", token, 12, TimeUnit.HOURS);return Result.success(token);}return Result.error("密码错误");}

十五、拦截器认证Token

步骤一、使用拦截器统一验证令牌
在这里插入图片描述

步骤二、登录和注册接口需要放行

主要实现逻辑为WebConfig类【注意路径中有两个”/”】

在这里插入图片描述

十六、使用ThreadLocal进行局部变量存储

可以存储userId等,ThreadLocalUtil见附录一
在这里插入图片描述

在这里插入图片描述

十七、获取用户信息

在这里插入图片描述

通过ThreadLocal可以获取到userName、userId

在这里插入图片描述

十八、更新用户信息

在这里插入图片描述

注意:如果方法的参数是实体类,那么不能存在与之并列的其他参数,也就是说参数只能有实体类一个参数。如果是入参形式为json则必须添加@RequestBody注解,否则无法解析传参数据。
实体类参数校验:实体类成员变量上添加注解【@NotNull、@NotEmpty、@Email】、接口参数的实体参数上添加@Validated注解

在这里插入图片描述

在这里插入图片描述

十九、更新用户头像

在这里插入图片描述
参数校验,必须是url地址

在这里插入图片描述

二十、修改密码

在这里插入图片描述

在这里插入图片描述

二十一、新增文章分类

在这里插入图片描述

二十二、文章分类列表

在这里插入图片描述

二十三、更新文章分类

在这里插入图片描述

在这里插入图片描述

二十四、新增文章【自定义校验】

在这里插入图片描述

参数校验

在这里插入图片描述

自定义校验【@State】

在这里插入图片描述

package com.source.bigevent.pojo;import com.fasterxml.jackson.annotation.JsonFormat;
import com.source.bigevent.annotation.State;
import lombok.Data;
import org.hibernate.validator.constraints.URL;import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
import java.time.LocalDateTime;/*** 文章*/
@Data
public class Article {@NotNull(groups = Edit.class)private Integer id;@NotEmptyprivate String title;@NotEmptyprivate String content;@URLprivate String coverImg;@Stateprivate String state;@NotNullprivate Integer categoryId;@NotNull(groups = Add.class)private Integer createUser;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;public interface Add extends Default {}public interface Edit extends Default {}
}

二十五、文章列表【条件分页】

引入依赖pagehelper

        <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在resources文件夹下新建包名和mapper相同的目录并新建ArticelMapper.xml同名文件

在这里插入图片描述

二十六、文件上传

文件上传分两种,一种是存在服务器磁盘,另一种是存在三方云服务器上。

在这里插入图片描述

在这里插入图片描述

A、将文件存在本地磁盘

在这里插入图片描述

B、三方文件存储服务器阿里云OSS
https://blog.csdn.net/m0_72853403/article/details/134611445
https://gitcode.csdn.net/65ec53451a836825ed7988ad.html

在这里插入图片描述

二十七、登录优化【Redis】

Springboot集成redis
在这里插入图片描述

令牌主动失效机制
A、 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中【这里使用token的值做为key存入redis,避免所有用户使用同一个key来存取值】
在这里插入图片描述

B、 LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
在这里插入图片描述

C、 当用户修改密码成功后,删除redis中存储的旧令牌
在这里插入图片描述

代码编辑完成后,启动redis安装包中的redis-server.exe即可使用redis

二十八、SpringBoot项目部署

在这里插入图片描述

A、如何生成jar包?
执行package命令即可
B、如何运行jar包?
Java –jar jar包位置
C、如何停止正在运行的服务?
Dos窗口中Ctrl+C
D、Jar包部署对服务器有什么要求?
必须有jre环境
E、启动redis
启动redis安装包中的redis-server.exe才可以使用redis

二十九、属性配置方式【优先级从低到高依次为ABCD】

A、 项目中resources目录下的application.yml
在这里插入图片描述
B、 Jar包所在目录下的application.yml【Window环境下测试不生效】
在这里插入图片描述
C、 操作系统环境变量
在这里插入图片描述

D、 命令行参数
在这里插入图片描述

三十、application配置文件相关知识

application.yml / application.yaml格式如下:
在这里插入图片描述

yml配置信息书写与获取
三方依赖库技术参数信息书写【以redis为例】

在这里插入图片描述

自定义配置参数及获取:
方式一、通过@Value(“${键名}”)

在这里插入图片描述

方式二、通过@ConfigurationProperties(prefix=“前缀”)+@Value(“${键名}”)

在这里插入图片描述

三十一、驼峰命名格式导致实体类和数据库不一致

修改application.yml配置文件
参考:
https://www.cnblogs.com/ubiquitousShare/p/12507070.html
https://blog.csdn.net/weixin_45935633/article/details/104704042
在这里插入图片描述

附录一

一、JWT工具类:

package com.source.bigevent.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "itheima";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)).sign(Algorithm.HMAC256(KEY));}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}

二、ThreadLocal工具类

package com.source.bigevent.utils;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get() {return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value) {THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove() {THREAD_LOCAL.remove();}
}

三、Md5工具类

package com.source.bigevent.utils;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class Md5Util {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合*/protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsaex) {System.err.println(Md5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");nsaex.printStackTrace();}}/*** 生成字符串的md5校验值** @param s* @return*/public static String getMD5String(String s) {return getMD5String(s.getBytes());}/*** 判断字符串的md5校验码是否与一个已知的md5码相匹配** @param password  要校验的字符串* @param md5PwdStr 已知的md5校验码* @return*/public static boolean checkPassword(String password, String md5PwdStr) {String s = getMD5String(password);return s.equals(md5PwdStr);}public static String getMD5String(byte[] bytes) {messagedigest.update(bytes);return bufferToHex(messagedigest.digest());}private static String bufferToHex(byte bytes[]) {return bufferToHex(bytes, 0, bytes.length);}private static String bufferToHex(byte bytes[], int m, int n) {StringBuffer stringbuffer = new StringBuffer(2 * n);int k = m + n;for (int l = m; l < k; l++) {appendHexPair(bytes[l], stringbuffer);}return stringbuffer.toString();}private static void appendHexPair(byte bt, StringBuffer stringbuffer) {char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>// 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换stringbuffer.append(c0);stringbuffer.append(c1);}}

相关文章:

Java开发:Spring Boot 实战教程

序言 随着技术的快速发展和数字化转型的深入推进&#xff0c;软件开发领域迎来了前所未有的变革。在众多开发框架中&#xff0c;Spring Boot凭借其“约定大于配置”的核心理念和快速开发的能力&#xff0c;迅速崭露头角&#xff0c;成为当今企业级应用开发的首选框架之一。 《…...

【Python3.11版本利用whl文件安装对应的dlib-19.24.1-cp311-cp311-win_amd64.whl库】

下载Python对应的安装包 找到自己Python版本对应的dlib whl库将网盘下载好的文件放在安装Python的Scripts路径下面接着在该路径输入cmdpip进行安装使用的是国内的源 找到自己Python版本对应的dlib whl库 python 3.11 对应 dlib-19.24.1-cp311-cp311-win_amd64.whl -i 也可以去…...

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…...

鲁教版七年级数学下册-笔记

文章目录 第七章 二元一次方程组1 二元一次方程组2 解二元一次方程组3 二元一次方程组的应用4 二元一次方程与一次函数5 三元一次方程组 第八章 平行线的有关证明1 定义与命题2 证明的必要性3 基本事实与定理4 平行线的判定定理5 平行限的性质定理6 三角形内角和定理 第九章 概…...

带你走进在线直线度测量仪 解析测量方法!

在线直线度测量仪 在线直线度测量仪可安装于生产线上&#xff0c;进行非接触式的无损检测&#xff0c;能检测米直线度尺寸&#xff0c;对截面为圆形的产品&#xff0c;进性直线度检测的帮手。 测量方法 在线直线度拟采用我公司的光电测头对矫直后的棒材直线度进行测量。测量时…...

力扣1 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…...

AndroidFlutter混合开发

为什么要有混合开发 我们知道&#xff0c;Flutter是可以做跨平台开发的&#xff0c;即一份Flutter的Dart代码&#xff0c;可以编译到多个平台上运行。这么做的好处就是&#xff0c;在不降低多少性能的情况下&#xff0c;尽最大可能的节省开发的时间成本&#xff0c;直接将开发…...

Halcon 光度立体 缺陷检测

一、概述 halcon——缺陷检测常用方法总结&#xff08;光度立体&#xff09; - 唯有自己强大 - 博客园 (cnblogs.com) 上周去了康耐视的新品发布会&#xff0c;我真的感觉压力山大&#xff0c;因为VM可以实现现在项目中的80% 的功能&#xff0c;感觉自己的不久就要失业了。同时…...

关于找暑期实习后的一些反思

日期 2024年6月3日 写在前面&#xff1a;距离研究生毕业还有9个月&#xff0c;前端时间一直在不停地投简历&#xff0c;不停地刷笔试题&#xff0c;不停地被拒绝&#xff0c;今天悬着的心终于死透了&#xff0c;心情还是比较糟糕的&#xff0c;可能唯一的安慰就是一篇小论文终于…...

Rust struct

Rust struct 1.实例化需要初始化全部成员变量2.如果需要实例化对象可变&#xff0c;加上mut则所有成员变量均可变 Rust支持通过已实例化的对象&#xff0c;赋值给未赋值的对象的成员变量 #![allow(warnings)] use std::io; use std::error::Error; use std::boxed::Box; use s…...

【UE5:CesiumForUnreal】——加载无高度地形数据

目录 1.实现目的 2.数据准备 2.1下载数据 2.2 数据切片 3.加载无地形数据 1.实现目的 在CesiumForUnreal插件中&#xff0c;我们加载地图和地形图层之后&#xff0c;默认都是加载的带有高程信息的地形数据&#xff0c;在实际的项目和开发中&#xff0c;有时候我们需要加载无…...

证件/文书类日期中文大写js/ts插件

说明 证件/文书类落款日期中文大写往往会将“零”写作“〇”&#xff0c;而数字依然使用简体“一二三”&#xff0c;而不是“壹贰叁”。 如下&#xff1a; 针对这一点&#xff0c;写了如下转换插件。 代码 function DateToUpperCase(date: Date new Date()) {const chStr …...

03JAVA基础(方法/类/封装(构造方法))

目录 1.方法 1.1 方法的定义 1.2 方法的重载 2.类和对象 3.封装 1. private关键字 2. this关键字 3. 封装 4. 构造方法 1.方法 含义: 将具有独立功能的代码块组织成一个整体,具有特殊功能的代码集 注意: 方法必须先创建才可以使用,需要手动调用执行 1.1 方法的定义 格…...

数据容器的通用操作、字符串大小比较 总结完毕!

1.数据容器的通用操作 1&#xff09;五类数据容器是否都支持while循环/for循环 五类数据容器都支持for循环遍历 列表、元组、字符串都支持while循环&#xff0c;集合、字典不支持&#xff08;无法下标索引&#xff09; 尽管遍历的形式不同&#xff0c;但都支持遍历操作 2&a…...

KAN(Kolmogorov-Arnold Network)的理解 3

系列文章目录 第一部分 KAN的理解——数学背景 第二部分 KAN的理解——网络结构 第三部分 KAN的实践——第一个例程 文章目录 系列文章目录前言KAN 的第一个例程 get started 前言 这里记录我对于KAN的探索过程&#xff0c;每次会尝试理解解释一部分问题。欢迎大家和我一起讨…...

lux和ffmpeg进行下载各大主流自媒体平台视频

1、lux下载&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取码&#xff1a;agpp 2、ffmpeg下载&#xff0c;跟lux放在同一个目录&#xff1b; 3、为lux、ffmpeg设置环境变量&#xff1b; 4、WINR&#xff0c;打开运行&#xff0…...

day25-XML

1.xml 1.1概述【理解】 1.2语法规则【应用】 1.5DTD约束【理解】 1.6schema约束【理解】 1.4xml解析【应用】 概述 xml解析就是从xml中获取到数据 常见的解析思想 DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。 会把xml文件全部加载到…...

Mixly 开启WIFI AP UDP收发数据

一、开发环境 软件&#xff1a;Mixly 2.0在线版 硬件&#xff1a;ESP32-C3&#xff08;立创实战派&#xff09; 固件&#xff1a;ESP32C3 Generic(UART) 测试工工具&#xff1a;NetAssist V5.0.1 二、实现功能 ESP32开启WIFI AP&#xff0c;打印接入点IP地址&#xff0c;允许…...

OCR图片转Excel表格:没结构化的弊端

随着OCR技术的不断发展&#xff0c;将表格图片转为excel已不再是难题&#xff0c;但是&#xff0c;目前市面上的程序还大多处于仅能将图片表格转为普通的excel格式阶段&#xff0c;而不能将其结构化&#xff0c;这样就会产生许多的弊端&#xff0c;具体弊端如下&#xff1a; &l…...

查看所用数据库的版本

通过查询 SELECT VERSION();...

U盘感染病毒,不必急于扔掉!教你如何有效清除U盘中的病毒

U盘被感染了只能扔掉吗&#xff1f;随着信息时代的飞速发展&#xff0c;U盘已成为我们日常生活中不可或缺的存储设备。然而&#xff0c;在使用U盘的过程中&#xff0c;我们有时会遇到U盘被病毒感染的情况。面对这一问题&#xff0c;许多人可能会感到恐慌&#xff0c;甚至想要直…...

新手小白也能玩转跨境电商:从零到精通的操作流程

随着全球化的浪潮愈演愈烈&#xff0c;跨境电商已成为众多创业者和企业家的瞩目焦点。然而&#xff0c;对于初涉此领域的新手来说&#xff0c;从零开始构建跨境电商业务可能会面临诸多挑战。本文将为您梳理跨境电商运营的基本操作流程&#xff0c;并指引新手小白如何迈出坚实的…...

川北医学院与爱尔眼科医院集团签署战略合作协议共谋医学发展新篇章

为深入贯彻落实党的二十大精神&#xff0c;统筹校、企、医、政多方资源&#xff0c;服务“健康中国”战略&#xff0c;推动眼健康产业发展&#xff0c;打造国家及区域级眼科医学中心&#xff0c;2024年5月31日&#xff0c;川北医学院与爱尔眼科医院集团在成都举行战略合作协议签…...

利用映射算子打印菱形

文章目录 一、利用RDD完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&#xff08;三&#xff09;完整菱形&#xff08;四&#xff09;输出任意大菱形 二、利用Java完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&…...

亚信安全正式推出5G专网安全测试服务 圆满完成核电客户5G项目落地

近日&#xff0c;亚信安全联合北京触点互动信息技术有限公司成功完成某核电客户5G专网项目&#xff0c;从终端安全&#xff0c;基站&#xff0c;核心网网元&#xff0c;切片安全以及接口安全等重点存在安全风险点进行测试&#xff0c;发现潜藏的安全隐患漏洞&#xff0c;为客户…...

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…...

大话设计模式解读01-简单工厂模式

本系列的文章&#xff0c;来介绍编程中的设计模式&#xff0c;介绍的内容主要为《大话设计模式》的读书笔记&#xff0c;并改用C语言来实现&#xff08;书中使用的是.NET中的C#&#xff09;,本篇来学习第一章&#xff0c;介绍的设计模式是——简单工厂模式。 1 面向对象编程 …...

35python数据分析numpy基础之setdiff1d求两个数组的差集

1 python数据分析numpy基础之setdiff1d求两个数组的差集 python的numpy库的setdiff1d(x,y)函数&#xff0c;表示数组x与y的差&#xff0c;即在x且不在y中的元素&#xff0c;且进行去重排序。 用法 numpy.setdiff1d(ar1, ar2, assume_uniqueFalse)描述 numpy.setdiff1d(ar1,…...

JVM 指针压缩

运用java内存对齐填充&#xff0c;对java内存进行8字节划分&#xff0c;java对象指针映射到每个划分区域上&#xff0c;使得4个字节&#xff08;32位&#xff09;表示2^32个地址&#xff0c;从而使4个字节指针映射32G内存空间。 1.为什么进行指针压缩&#xff1a; jvm从32位变…...

时序预测 | Matlab灰色-马尔科夫预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab灰色-马尔科夫预测 灰色马尔科夫预测&#xff08;Grey-Markov Prediction&#xff09;是一种用于时间序列预测的方法&#xff0c;它结合了灰色系统理论和马尔科夫链模型。灰色系统理论是一种非参数化的预测方法…...