springboot整合mybatis-puls登陆注册

目录

创建springboot项目

目录结构:

启动类

测试类

idea建表

pom文件

编写yml文件

qq邮箱设置

登陆注册代码

编写持久层(Dao)

注册代码

业务层

业务实现类

mapper

控制层

前端代码

注册页面

邮件正文: 

登录代码

控制层

业务层:

业务实现类:

前端代码

自动登录


创建springboot项目

Maven类型+

Lombok依赖+spring web依赖+MySQL driver依赖+mybatis framework依赖+java Mail Sender依赖

目录结构:
 

有些类是自己写的不用看,看一下结构就可以

启动类

@SpringBootApplication
@MapperScan("com.example.mapper")//将mapper路径下自动注册映射器接口为spring Bean
public class SpringBootDemo1Application {public static void main(String[] args) {SpringApplication.run(SpringBootDemo1Application.class,args);}
}

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBootTestApplicationTests {}

idea建表

use `数据库名`;
create table `user`(`id` int primary key auto_increment comment '主键id',`email` varchar(255) comment '用户邮箱',`password` varchar(255) comment '用户密码',`salt` varchar(255) comment '盐',`confirm_code` varchar(255) comment '确认码',`activation_time` datetime comment '激活时间',`is_valid` tinyint comment '账号状态'
)default charset=utf8 comment '用户表';

pom文件

<?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><groupId>com.example</groupId><artifactId>springBoot-Test</artifactId><version>0.0.1-SNAPSHOT</version><name>springBoot-Test</name><description>springBoot-Test</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.2.0</version><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--导入Mybatis坐标--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><!--导入mybatis-plus坐标--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!--导入数据库druid坐标--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><!--简略get,set方法--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><!--模版引擎--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加事务管理--><!-- 支持使用 Spring AOP 和 AspectJ 进行切面编程。 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- SpringBoot集成FreeMarker的依赖 :模版引擎,生成输出文本--><!--<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>--><!--thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--邮箱发送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--工具包:雪花算法:生成确认码--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.springboottest.SpringBootTestApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

编写yml文件

server:port: 8088
spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driver # 配置数据库驱动程序,用于数据库通信和执行sql语句url: jdbc:mysql://localhost:3306/表名?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 # 加数据库名username: rootpassword: mvc: # 处理springboot与swagger2冲突pathmatch:matching-strategy: ant_path_matcherfreemarker:expose-session-attributes: true # 暴露session对象的属性settings:classic_compatible: true # 配置为传统模式,控制自动处理suffix: .ftl # 指定模版文件后缀mail:protocol: smtp # 邮箱协议host: smtp.qq.com # qq邮箱,如果用网易将qq改成163port: 25username:  # 发送人邮件名(这个地方可能出错,可能是由于名字问题)password: # 授权码default-encoding: utf-8properties:mail:debug: true # 开启debug模式会打印邮件发送过程的日志mybatis-plus:# mybatis映射器XML文件位置 作用:定义sql语句和结果映射mapper-location: classpath:mapper/*.xml# 开启mybatis-plus的运行日志(建议)configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

qq邮箱设置

点击第二列的账号:开启服务,发送邮件,记下授权码 ok !

登陆注册代码

编写持久层(Dao)

        

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "user") 
public class User {@TableId(value = "id",type = IdType.AUTO)private Integer id;@TableField(value = "email")private String email;@TableField(value = "password") // 密码,使用md5+盐加密private String password;@TableField(value = "salt")private String salt; // 盐@TableField(value = "confirm_code") // 确认码private String confirmCode;@TableField(value = "activation_time") // 激活失效时间private LocalDateTime activationTime;@TableField(value = "is_valid") // 账号状态private Byte isValid;}

注册代码

业务层
public interface UserService extends IService<User> {// 创建账号Map<String,Object> createAccount(User user);// 创建账号过程中,用于激活账号的确认码,没有激活不可以登录账号Map<String, Object> activation(String confirmCode);// 将用户信息录入数据库int insertUser(User user);// 通过确认码查找用户,不用担心确认码重复User selectUserByConfirmCode(String confirmCode);// 通过邮箱激活账号int updateUserByConfirmCode(String confirmCode);// 通过邮箱名查找用户(如果没有进行注册查重,那么将这个修改成List<User>有多个用户报异常)User selectUserByEmail(String email);
}
业务实现类
@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper um;@Value("${spring.mail.username}")private String mailUsername; @Resource //发送邮件,实现邮箱验证private JavaMailSender javaMailSender; @Resource // 模版引擎private TemplateEngine templateEngine;@Override@Transactional // 事务管理/** 创建账号:接收发送过来的邮件账号和密码,利用雪花算法生成确认码用于激活账号,使用MD5将密码进行加密* 设置激活时间和激活状态为未激活后添加到数据库,发送邮件领取激活码,激活账号*/public Map<String, Object> createAccount(User user) {// 检验账号是否重复// 雪花算法生成确认码String confirmCode = IdUtil.getSnowflake(1,1).nextIdStr();// 生成盐 随机数String salt = RandomUtil.randomString(6);// 加密密码:原始密码+盐String md5Pwd = SecureUtil.md5(user.getPassword()+salt);// 激活时间 有效时间LocalDateTime ldt = LocalDateTime.now().plusDays(1);user.setConfirmCode(confirmCode);user.setSalt(salt);user.setPassword(md5Pwd);user.setActivationTime(ldt);user.setIsValid((byte)0);// 新增账号int result = um.insert(user);HashMap<String, Object> hm = new HashMap<>();if(result > 0){// 发送邮件:前端会调用该路径下的方法并传递确认码参数String activationUrl = "http://localhost:8088/user/activation?confirmCode=" + confirmCode;sendMailForActivationAccount(activationUrl,user.getEmail());hm.put("code",200);hm.put("message","注册成功。请前往邮件进行账号激活");}else {hm.put("code",400);hm.put("message","注册失败");}return hm;}@Override@Transactional/*发送邮件申请激活账号:创建邮件,设置主题、发送者、接受者、发送日期、创建上下文环境(编写在        html)*/public void sendMailForActivationAccount(String activationUrl, String email) {// 创建邮件对象MimeMessage mimeMessage = javaMailSender.createMimeMessage();try {MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);// 设置邮箱主题message.setSubject("抖音账号激活");// 设置邮件发送者message.setFrom(mailUsername);// 设置邮件接受者(可以设置多个)message.setTo(email);// 设置邮件发送日期message.setSentDate(new Date());// 创建上下文环境(正文) 用thymeleafContext context = new Context();// 将url注入html中,在html中直接用// 当在页面点击链接时,会直接执行路径中方法context.setVariable("activationUrl",activationUrl);String text = templateEngine.process("activation-account.html",context);message.setText(text,true);} catch (MessagingException e) {throw new RuntimeException(e);}// 发送邮件javaMailSender.send(mimeMessage);}@Override/*在注册阶段会调用该方法实现账号激活:根据注册阶段传递过来的确认码查询用户,调取用户信息判断是否是有效激活时间,返回结果*/public Map<String, Object> activation(String confirmCode) {Map<String, Object> hm = new HashMap<>();// 根据确认码查询用户User user = um.selectUserByConfirmCode(confirmCode);// 判断激活时间是否失效:现在时间是在激活时间之后吗boolean after = LocalDateTime.now().isAfter(user.getActivationTime());if(after){hm.put("code",400);hm.put("message","激活失效,请重启注册");return hm;}// 修改状态值int result = um.updateUserByConfirmCode(confirmCode);if(result > 0){hm.put("code",200);hm.put("message","激活成功");return hm;}else {hm.put("code",400);hm.put("message","激活失效,请联系管理员");return hm;}}@Overridepublic int insertUser(User user) {return um.insert(user);}@Overridepublic User selectUserByConfirmCode(String confirmCode) {return um.selectUserByConfirmCode(confirmCode);}@Overridepublic int updateUserByConfirmCode(String confirmCode) {return um.updateUserByConfirmCode(confirmCode);}@Overridepublic User selectUserByEmail(String email) {return um.selectUserByEmail(email);}}
mapper
public interface UserMapper extends BaseMapper<User> {/** 根据确认码查询用户*/@Select("SELECT email,activation_time FROM user WHERE confirm_code = #{confirmCode} AND is_valid = 0")User selectUserByConfirmCode(@Param("confirmCode") String confirmCode);/** 根据确认码查询用户并修改状态码为1*/@Update("UPDATE user SET is_valid = 1 WHERE confirm_code = #{confirmCode}")int updateUserByConfirmCode(@Param("confirmCode") String confirmCode);/** 根据邮箱查询用户*/@Select("SELECT * FROM user WHERE email = #{email} AND is_valid = 1")User selectUserByEmail(@Param("email") String email);}
控制层
@Api("用户界面")
@RestController
@RequestMapping("user")
public class UserController {@Resourceprivate UserService us;@ApiOperation(value = "注册账号")@PostMapping("create")public Map<String,Object> createAccount(@RequestBody User user){return us.createAccount(user);}@ApiOperation(value = "激活账号")@GetMapping("activation")/*通过邮件激活相当于网页传递数据。因为路径中追加了confirmCode所以会自动传参*/public Map<String,Object> activation(String confirmCode){return us.activation(confirmCode);}}
前端代码

因为用的是thymeleaf写的所以目录结构如下(记得写在templates中)

注册页面
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!-- 引入 jQuery --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><style>body {background: url('https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.jpg') no-repeat;background-size: 100% 130%;}#login_box {width: 20%;height: 400px;background-color: #00000060;margin: auto;margin-top: 10%;text-align: center;border-radius: 10px;padding: 50px 50px;}h2 {color: #ffffff90;margin-top: 5%;}#input-box {margin-top: 5%;}span {color: #fff;}input {border: 0;width: 60%;font-size: 15px;color: #fff;background: transparent;border-bottom: 2px solid #fff;padding: 5px 10px;outline: none;margin-top: 10px;}button {margin-top: 50px;width: 60%;height: 30px;border-radius: 10px;border: 0;color: #fff;text-align: center;line-height: 30px;font-size: 15px;background-image: linear-gradient(to right, #30cfd0, #330867);}#sign_up {margin-top: 45%;margin-left: 60%;}a {color: #b94648;}</style>
</head><body>
<div id="login_box"><h2>REGISTRY</h2><div id="input_box"><input type="text" id = "email" name="email" placeholder="请输入用户名"></div><div class="input_box"><input type="password" id = "password" name="password" placeholder="请输入密码"></div><button id = "registry">注册</button><br><br><p>Come to us ? <a href="login">Login</a></p></div>
/*当id:registry发生点击行为thymeleaf会接受相应过来的数据并转换成json格式,然后调用url路径下的方法创建账号* result接收控制层返回的数据(Map)在网页提示创建成功或创建失败*/
<script type="text/javascript" charset="UTF-8">$("#registry").on("click",function (){$.ajax({url:"/user/create",type: "POST",contentType: "application/json",data: JSON.stringify({ email: $("#email").val(),password: $("#password").val()}),dataType: "json",success: function(result){alert(result.message);},error: function(result){alert("发生错误");}});});
</script>
</body>
</html>
邮件正文: 
<html>
<body>
<!--根据自己需要编写,-->
<div><p>Email 地址验证</p> <!--target:新的窗口打开超链接--><p>这封信是由<a href="https://www.douyin.com" target = "_blank">抖音</a>发送的</p><p>由于你在抖音进行了新用户注册或用户修改,如果你没有进行过此操作,请忽略这封邮件。如果你是新用户或者修改你的账号请点击下方链接:</p><p><a th:href="@{${activationUrl}}"><span th:text="${activationUrl}"></span></a>感谢你的访问,祝你生活愉快。</p></div>
</body>
</html>

登录代码

控制层

登录界面:http://localhost:8088/gameLogin/login

@Api(value = "登录页面")
@Controller
@RequestMapping("gameLogin")
public class LoginController {@Resourceprivate UserService us;@GetMapping("login") public String login(){return "login";}@GetMapping("registry")public String registry(){return "registry";}@PostMapping("loginAccount")@ResponseBodypublic Map<String,Object> loginAccount(@RequestBody User user){return us.loginAccount(user);}
}
业务层:
public interface UserService extends IService<User> {Map<String,Object> loginAccount(User user);
}
业务实现类:
@Override/** 登录账号*/public Map<String, Object> loginAccount(User user) {Map<String, Object> hm = new HashMap<>();User user1 = um.selectUserByEmail(user.getEmail());// 如果账号不存在或未激活if(user1 == null || user1.getIsValid() == (byte)0){hm.put("code",400);hm.put("message","该账户不存在或未激活");return hm;}// 进行密码比对String md5Pwd = SecureUtil.md5(user.getPassword()+user1.getSalt());if(!md5Pwd.equals(user1.getPassword())){hm.put("code",400);hm.put("message","用户名或密码错误");return hm;}hm.put("code",200);hm.put("message","登陆成功");return hm;}
前端代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!-- 引入 jQuery --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><style>body {background: url('https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.jpg') no-repeat;background-size: 100% 130%;}#login_box {width: 20%;height: 400px;background-color: #00000060;margin: auto;margin-top: 10%;text-align: center;border-radius: 10px;padding: 50px 50px;}h2 {color: #ffffff90;margin-top: 5%;}#input-box {margin-top: 5%;}span {color: #fff;}input {border: 0;width: 60%;font-size: 15px;color: #fff;background: transparent;border-bottom: 2px solid #fff;padding: 5px 10px;outline: none;margin-top: 10px;}button {margin-top: 50px;width: 60%;height: 30px;border-radius: 10px;border: 0;color: #fff;text-align: center;line-height: 30px;font-size: 15px;background-image: linear-gradient(to right, #30cfd0, #330867);}#sign_up {margin-top: 45%;margin-left: 60%;}a {color: #b94648;}</style>
</head><body>
<div id="login_box"><h2>LOGIN</h2><div id="input_box"><input type="text" id="email" name="email" placeholder="请输入用户名"></div><div class="input_box"><input type="password" id="password" name="password" placeholder="请输入密码"></div><button id = "login">登录</button><br><br><p>New to us ? <a href="registry">Registry</a></p>
</div>
<script type="text/javascript" charset="UTF-8">$("#login").on("click",function (){$.ajax({url:"/gameLogin/loginAccount",type: "POST",contentType: "application/json",data: JSON.stringify({ // 将对象转化为json格式email: $("#email").val(),password: $("#password").val()}),dataType: "json",success: function(result){alert(result.message);if(200 == result.code) {window.location.href = "https://www.douyin.com"}},error: function(result){alert("发生错误");}});});
</script>
</body>
</html>

自动登录

package com.example.utils;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringBootConfiguration;@SpringBootConfiguration
public class AutoStartLogin implements CommandLineRunner {@Overridepublic void run(String ... args) {try {Runtime.getRuntime().exec("cmd /c start http://localhost:8088/gameLogin/login");} catch (Exception ex) {ex.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979225.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端开发攻略---实现发送手机验证码60s倒计时效果(手机号验证+按钮文字自定义显示+Vue2写法+Vue3写法)

1、演示 2、说明 1、为了便于演示&#xff0c;本示例将在3秒后就再次发送。您可以根据需要自定义此时间间隔。 2、采用最少的变量以满足需求&#xff0c;以减少内存占用。 3、不仅仅局限于按钮情况&#xff0c;也可应用于不禁用按钮的情况&#xff0c;以实现更多的扩展性。 4、…

FPGA组合逻辑电路设计之译码器

在数字电路中可以根据电路功能的不同分为&#xff0c;组合逻辑电路与时序逻辑电路。组合逻辑 电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入&#xff0c;与电路原来的状态无 关。而时序逻辑从电路特征上看来&#xff0c;其特点为任意时刻的输出不仅取决于该…

安卓NetworkStatsManager使用及demo

目录 一、TrafficStats类简介二、demo示例 一、TrafficStats类简介 TrafficStats Android API 8提供了android.net.TrafficStats类。 通过此类能获取设备重启以来网络信息&#xff0c;部分函数如下所示&#xff1a; static long getMobileRxBytes() //获取通过移动数据网络…

【SpringBoot】-MyBatis详解+单表操作

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;什么是MyBatis框架&#xff1f;MyBatis框架有什么用&#xff1f;MyBatis实现查询步骤详解。MyBatis实现单表的增删查改。MyBatis模糊查询&…

TDSQL手动调整备份节点或冷备节点

一、背景描述 近期TDSQL数据库备份不稳定&#xff0c;有些set实例的备份任务未自动发起。经排查分析&#xff0c;存在多个set实例容量已经超过TB级别&#xff0c;且冷备节点都是同一台。因此&#xff0c;需要手动将当前备份节点改到其他备节点&#xff0c;开启增量备份&#x…

FLStudio怎么冻结轨道以及如何批量复制音符

FLStudio是一款功能强大的音乐制作软件&#xff0c;广泛用于音乐制作和打谱当中。我们在制作音乐时&#xff0c;经常会遇到处理大量音频轨道的情况&#xff0c;过多的音频轨道可能会导致电脑性能受限&#xff0c;从而影响工作流程。为了应对这个问题&#xff0c;FLStudio提供了…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架&#xff0c;用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式&#xff0c;并且可以轻松添加新的输出格式。 CppTest下载地址&#xff1a;下载地址1  下载地址2 下面结合实例分析下CppTest如…

小样本学习登Nature!计算效率高170倍,彻底起飞

中科院新提出的社会行为图谱SBeA登上Nature子刊&#xff01; SBeA是一个用于多动物3D姿势估计、身份识别和社会行为分类的小样本学习框架&#xff0c;能够全面量化自由群居动物的行为&#xff0c;使用较少的标记帧数&#xff08;约 400 帧&#xff09;进行多动物三维姿态估计。…

linux常用非基础命令/操作

本篇用于总结蒟蒻博主在使用linux系统的过程中会经常用到但老实记不住的一些非基础命令和操作&#xff0c;方便遗忘时查阅 一&#xff0c;关闭指定端口的进程以释放端口 每个端口都有一个守护进程&#xff0c;kill掉这个守护进程就可以释放端口 ①使用命令【netstat -anp | gre…

数据结构|树形结构|并查集

数据结构|并查集 并查集 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 有趣的并查集剧情演绎&#xff1a;【算法与数据结构】—— 并…

045、seq2seq

之——序列生成 杂谈 基于RNN实现&#xff0c;通过RNN生成器不断获取输入&#xff0c;更新隐藏状态&#xff0c;将最后生成的隐藏状态传递给解码器&#xff0c;然后自循环迭代直到输出停止。 正文 1.训练 训练时候解码器使用目标句子不断作为输入&#xff0c;就算解码错了输入…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态&#xff0c;给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

js获取某月往前推一年或半年的年月数组

前言 需求&#xff1a;需要显示某月份往前推一年或者半年的费用情况&#xff0c;显示到柱形图上&#xff0c;后台接口只返回有数据的年份&#xff0c;这就需要前端拿全部月份数组去比对并显示。 开始 上代码&#xff1a; // date:选择的月份,比如:2024-04,//n:半年或者1年,…

PTA 天梯赛 L1-010 比较大小【C++】 L1-011 A-B 【C++ vector动态数组】【Python 字符串replace函数】

L1-010 比较大小 判断顺序很重要 #include<iostream> using namespace std; int main() {int a, b, c;cin >> a >> b >> c;int temp;if (a > b) {temp a;a b;b temp;}if (a > c) {temp a;a c;c temp;}if (b > c) {temp b;b c;c te…

C++ //练习 13.17 分别编写前三题中所描述的numbered和f,验证你是否正确预测了输出结果。

C Primer&#xff08;第5版&#xff09; 练习 13.17 练习 13.17 分别编写前三题中所描述的numbered和f&#xff0c;验证你是否正确预测了输出结果。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************…

【御控物联网平台】物联网平台常见通讯协议

随着物联网&#xff08;InternetofThings&#xff0c;IoT&#xff09;的快速发展&#xff0c;越来越多的设备和传感器连接到网络&#xff0c;使得数据的传递和交互变得更加智能化和高效化。在实现这种智能化和高效化的数据交互&#xff0c;过程中&#xff0c;各种不同的通信协议…

防火墙技术基础篇:什么是防火墙

防火墙技术基础篇&#xff1a;什么是防火墙 什么是防火墙&#xff1f; 在我们开始之前&#xff0c;让我们先想象一下一个真实的场景。你的家是你的私人领地&#xff0c;你不希望任何未经许可的人进入。为了保护你的家&#xff0c;你可能会安装一些安全设备&#xff0c;比如门…

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

本文讲的全部知识点&#xff0c;都是和webpack相关的。如果你之前有疑问&#xff0c;那本文一定能帮你搞清楚。 问题来源一般是类似下面代码&#xff08;webpack.json中&#xff09;&#xff1a; "scripts": {"dev": "cross-env NODE_ENVdevelopmen…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…