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

SpringBoot+网易邮箱登录注册

文章目录

  • SpringBoot+网易邮箱登录注册
    • pom.xml
    • application.yml
    • sql
    • UserEmail.java
    • UserEmailMapper.java
    • UserEmailMapper.xml
    • EmailService.java
    • UserEmailService.java
    • UserEmailServiceImpl.java
    • UserEmailController.java
    • register1.html

编写前参考

SpringBoot+网易邮箱登录注册

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 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.7.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sin</groupId><artifactId>RedisMailMessage</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>RedisMailMessage</name><description>RedisMailMessage</description><properties><java.version>17</java.version></properties><dependencies><!--邮箱业务:用于操作邮件功能的--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--对SpringBoot应用的监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringBoot框架的启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--SpringBoot框架的测试库--><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-starter-thymeleaf</artifactId></dependency><!-- Java提供的工具库 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency></dependencies><build><plugins><!--SpringBoot应用打包为可执行的jar文件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--单元测试的插件配置为逃过运行测试--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build></project>

application.yml

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/demousername: rootpassword: 123456redis:# 地址host: 192.168.226.137# 端口port: 6379# 密码password: 123456# 超时时间 5000毫秒timeout: 5000jedis:# 连接池pool:# 连接池最小空闲连接min-idle: 0# 连接池的最大空闲连接max-idle: 8# 连接池最大阻塞等待时间(使用负数表示没有限制)max-wait: -1# 连接池最大连接数(使用负数表示没有限制)max-active: 8mail:# 配置SMTP服务器地址host: smtp.126.com# 配置端口号465或者25port: 25# 发送者邮箱(根据自己邮箱填写)username: sin8023@126.com#  配置密码,注意是开启POP3/SMTP的授权密码(根据自己的授权密码填写)password: RVJJ****NTPUEHOproperties:mail:smtp:auth: trueenable: truessl:# 设为true时 端口号设为 465 设为false时 端口号设为25enable: falsesocketFactoryClass: javax.net.ssl.SSLSocketFactory#表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误debug: true# 邮箱编码格式default-encoding: UTF-8
#  thymeleaf:
#    prefix: classpath:/templates/
#    suffix: .html
#    mode: HTML
#    encoding: utf-8
#    servlet.content-type: text/html
#    check-template-location: true  #检查模板路径是否存在
#    cache: false# mybatis配置
mybatis:# 获取配置文件的地址mapper-locations: classpath:/mapper/*.xml# 获取实体类的地址type-aliases-package: com.sin.pojoconfiguration:# 开启驼峰命名map-underscore-to-camel-case: truelogging:level:org.mybatis: debug

sql

create table user_email
(id       int auto_increment primary key comment '主键id',name     varchar(20) character set utf8mb4 not null comment '用户名',password varchar(20) character set utf8mb4 not null comment '密码',email    varchar(20) character set utf8mb4 not null comment '邮箱',code_status int default 0 comment '邮箱验证状态 1 = 未注册 ,1 = 已经注册 其余数字为无效标识符'
)charset = utf8mb4;insert into user_email(name,password,email,code_status) select email,'aaa' from user where email='123@qq.com';insert into user_email(name,password,email,code_status) value ('admin','123456','123@qq.com',1);select * from user_email where name = 'admin' and password = '123456' and code_status = 1;

UserEmail.java

package com.sin.pojo;public class UserEmail {private long id;private String name;private String password;private String email;private int codeStatus;public UserEmail() {}public UserEmail(String name, String password, String email) {this.name = name;this.password = password;this.email = email;}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 getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public int getCode_status() {return codeStatus;}public void setCode_status(int codeStatus) {this.codeStatus = codeStatus;}@Overridepublic String toString() {return "UserEmail{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +", codeStatus='" + codeStatus + '\'' +'}';}
}

UserEmailMapper.java

package com.sin.mapper;import com.sin.pojo.UserEmail;
import org.apache.ibatis.annotations.Mapper;import java.util.List;/*** @createTime 2023/10/23 15:39* @createAuthor SIN* @use  数据访问层,数据访问的核心任务*/
@Mapper
public interface UserEmailMapper {/*** 添加数据* @param userEmail* @return*/int insertUserEmail(UserEmail userEmail);/*** 根据用户名进行查找数据* @param userEmail* @return*/UserEmail findUserByName(String userEmail);/*** 查询所有数据* @return*/List<UserEmail> seletctUserEmail();/*** 根据邮箱进行查询* @param email* @return*/UserEmail findAllByEmail(String email);/*** 更新数据* @param email* @return*/void updateCodeStatus(String email);/*** 根据邮箱查询数据* @param email* @return*/UserEmail findByEmail(String email);
}

UserEmailMapper.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.sin.mapper.UserEmailMapper"><!--resultMap通过将查询结果集中的列名和Java对象中的属性名进行映射,实现了结果集的自动映射。同时,它还可以解决列名和属性名不匹配的问题,支持复杂类型映射,提高了查询性能。--><resultMap id="UserMap" type="com.sin.pojo.UserEmail"><id property="id" column="id"/><result property="name" column="name"/><result property="password" column="password"/><result property="email" column="email"/><result property="codeStatus" column="code_status"/></resultMap><!-- 添加数据 --><insert id="insertUserEmail" parameterType="com.sin.pojo.UserEmail">insert into user_email(name,password,email,code_status)values (#{name},#{password},#{email},#{codeStatus})</insert><update id="updateCodeStatus"  parameterType="com.sin.pojo.UserEmail">update user_email set code_status = 2 where email = #{email};</update><!-- 根据姓名密码查询数据 --><select id="findUserByName" resultMap="UserMap">select name from user where name = #{name} and password = #{password} and code_status = 1</select><!-- 查询所有数据 --><select id="seletctUserEmail" resultMap="UserMap">select * from user_email</select><!-- code_status = 1时,表明用户已经存在但未完成注册操作 --><select id="findAllByEmail" resultMap="UserMap">select * from user_email where email = #{email} and code_status = 1</select><!-- code_status = 2时,表明用户已经完成注册操作可以进行登录操作 --><select id="findByEmail" parameterType="string"  resultMap="UserMap">select * from user_email where email = #{email} and code_status = 2</select></mapper>

EmailService.java

package com.sin.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;/*** @createTime 2023/11/21 10:18* @createAuthor SIN* @use*/@Service
public class EmailService {@Autowired(required = false)private JavaMailSender mailSender;@Value("${spring.mail.username}")private String userName;/*** 发送信息邮件* @param to 收件人* @param subject 邮箱标题* @param content 邮箱内容*/public void sendMail(String to, String subject, String content) throws MessagingException {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);//邮箱发送者helper.setFrom(userName);//收件人,可以为多个收件人,收件人之间用逗号隔开helper.setTo(to);// 邮箱标题helper.setSubject(subject);// 邮箱内容helper.setText(content, true);mailSender.send(message);}
}

UserEmailService.java

package com.sin.service;import com.sin.exception.EmailAlreadyExistsException;
import com.sin.pojo.UserEmail;import javax.mail.MessagingException;
import java.util.List;/*** @createTime 2023/11/20 17:25* @createAuthor SIN* @use*/
public interface UserEmailService {/*** 添加数据* @param userEmail* @return*/int insertUserEmail(UserEmail userEmail) throws MessagingException, EmailAlreadyExistsException;/*** 根据用户名进行查找数据* @param userEmail* @return*/UserEmail findUserByName(String userEmail);/*** 查询所有数据* @return*/List<UserEmail> seletctUserEmail();/*** 根据邮箱进行查询* @param email* @return*/UserEmail findAllByEmail(String email);/*** 发送验证码* @return*/String sendCode(String email) throws MessagingException;/*** 获取验证码* @return*/Object getCode(String email);/*** 更新数据* @param email* @return*/void updateCodeStatus(String email);/*** 根据邮箱查询数据* @return*/boolean loginUser(String email, String password);}

UserEmailServiceImpl.java

package com.sin.service.impl;import com.sin.mapper.UserEmailMapper;
import com.sin.pojo.UserEmail;
import com.sin.exception.EmailAlreadyExistsException;
import com.sin.service.EmailService;
import com.sin.service.UserEmailService;
import com.sin.utils.RandomCodeUtil;
import com.sin.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import java.util.List;/*** @createTime 2023/11/20 17:25* @createAuthor SIN* @use*/
@Service
public class UserEmailServiceImpl implements UserEmailService {@Autowiredprivate UserEmailMapper userEmailMapper;@Autowiredprivate EmailService emailService;@Overridepublic int insertUserEmail(UserEmail userEmail) throws MessagingException, EmailAlreadyExistsException {// 1,查询要添加的数据如果没有数据就添加UserEmail allByEmail = this.findAllByEmail(userEmail.getEmail());if (allByEmail != null){throw new EmailAlreadyExistsException("该邮箱以注册,请登录");}else {System.out.println("数据添加成功");userEmail.setCode_status(1);emailService.sendMail(userEmail.getEmail(),"验证码","<a href=\"http://localhost:8080/update/"+userEmail.getEmail()+"\">激活请点击:</a>");return  userEmailMapper.insertUserEmail(userEmail);}}@Overridepublic UserEmail findAllByEmail(String email) {return userEmailMapper.findAllByEmail(email);}@Overridepublic String sendCode(String email) throws MessagingException {UserEmail allByEmail = this.findAllByEmail(new UserEmail().getEmail());return "";}@Overridepublic Object getCode(String email) {if (email != null){Object o = redisUtil.get(email);System.out.println(o);return o;}else {return "未填写邮箱";}}@Overridepublic void updateCodeStatus(String email) {userEmailMapper.updateCodeStatus(email);}@Overridepublic boolean loginUser(String email, String password) {UserEmail userByName = userEmailMapper.findByEmail(email);return userByName != null && userByName.getPassword().equals(password);}@Overridepublic UserEmail findUserByName(String userEmail) {return null;}@Overridepublic List<UserEmail> seletctUserEmail() {return userEmailMapper.seletctUserEmail();}}

UserEmailController.java

package com.sin.controller;import com.sin.exception.EmailAlreadyExistsException;
import com.sin.mapper.UserEmailMapper;
import com.sin.pojo.UserEmail;
import com.sin.service.UserEmailService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import javax.mail.MessagingException;/*** @createTime 2023/11/22 11:47* @createAuthor SIN* @use*/
@Controller
public class UserEmailController {@Autowiredprivate UserEmailService userEmailService;@GetMapping("/register")public String login(Model model){UserEmail userEmail = new UserEmail();model.addAttribute("userEmail",userEmail);// 设置成功消息model.addAttribute("successMessage", "邮件已发送,请注意查收");return "register1";}@PostMapping("/register")// @ModelAttribut : 将请求参数绑定到模型对象上,public String login(@ModelAttribute("userEmail") UserEmail userEmail, Model model) throws MessagingException {try{int result = userEmailService.insertUserEmail(userEmail); // 执行用户注册System.out.println(result);}catch (EmailAlreadyExistsException e){String errorMessage = e.getMessage();System.out.println(errorMessage);model.addAttribute("errorMessage",errorMessage);}return "redirect:/register";}@GetMapping("/update/{email}")@ResponseBodypublic String updateCodeStatus(@PathVariable("email") String email){userEmailService.updateCodeStatus(email);return "SUCCESS";}@PostMapping("/login")public String loginUser(@RequestParam("email") String email, @RequestParam("password") String password) {boolean isValid = userEmailService.loginUser(email, password);System.out.println(isValid);// 登录成功后返回到/dashboard页面if (isValid) {return "SUCCESS";} else {  // 登录失败返回该页面return "login";}}}

register1.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录/注册</title><style>:root {/* COLORS */--white: #e9e9e9;--gray: #333;--blue: #0367a6;--lightblue: #008997;/* RADII */--button-radius: 0.7rem;/* SIZES */--max-width: 758px;--max-height: 420px;font-size: 16px;font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;}body {align-items: center;background-color: var(--white);background: url("https://res.cloudinary.com/dbhnlktrv/image/upload/v1599997626/background_oeuhe7.jpg");/* 决定背景图像的位置是在视口内固定,或者随着包含它的区块滚动。 *//* https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-attachment */background-attachment: fixed;background-position: center;background-repeat: no-repeat;background-size: cover;display: grid;height: 100vh;place-items: center;}.form__title {font-weight: 300;margin: 0;margin-bottom: 1.25rem;}.link {color: var(--gray);font-size: 0.9rem;margin: 1.5rem 0;text-decoration: none;}.container {background-color: var(--white);border-radius: var(--button-radius);box-shadow: 0 0.9rem 1.7rem rgba(0, 0, 0, 0.25),0 0.7rem 0.7rem rgba(0, 0, 0, 0.22);height: var(--max-height);max-width: var(--max-width);overflow: hidden;position: relative;width: 100%;}.container__form {height: 100%;position: absolute;top: 0;transition: all 0.6s ease-in-out;}.container--signin {left: 0;width: 50%;z-index: 2;}.container.right-panel-active .container--signin {transform: translateX(100%);}.container--signup {left: 0;opacity: 0;width: 50%;z-index: 1;}.container.right-panel-active .container--signup {animation: show 0.6s;opacity: 1;transform: translateX(100%);z-index: 5;}.container__overlay {height: 100%;left: 50%;overflow: hidden;position: absolute;top: 0;transition: transform 0.6s ease-in-out;width: 50%;z-index: 100;}.container.right-panel-active .container__overlay {transform: translateX(-100%);}.overlay {background-color: var(--lightblue);background: url("https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.jpg");background-attachment: fixed;background-position: center;background-repeat: no-repeat;background-size: cover;height: 100%;left: -100%;position: relative;transform: translateX(0);transition: transform 0.6s ease-in-out;width: 200%;}.container.right-panel-active .overlay {transform: translateX(50%);}.overlay__panel {align-items: center;display: flex;flex-direction: column;height: 100%;justify-content: center;position: absolute;text-align: center;top: 0;transform: translateX(0);transition: transform 0.6s ease-in-out;width: 50%;}.overlay--left {transform: translateX(-20%);}.container.right-panel-active .overlay--left {transform: translateX(0);}.overlay--right {right: 0;transform: translateX(0);}.container.right-panel-active .overlay--right {transform: translateX(20%);}.btn {background-color: var(--blue);background-image: linear-gradient(90deg, var(--blue) 0%, var(--lightblue) 74%);border-radius: 20px;border: 1px solid var(--blue);color: var(--white);cursor: pointer;font-size: 0.8rem;font-weight: bold;letter-spacing: 0.1rem;padding: 0.9rem 4rem;text-transform: uppercase;transition: transform 80ms ease-in;}.form>.btn {margin-top: 1.5rem;}.btn:active {transform: scale(0.95);}.btn:focus {outline: none;}.form {background-color: var(--white);display: flex;align-items: center;justify-content: center;flex-direction: column;padding: 0 3rem;height: 100%;text-align: center;}.input {background-color: #fff;border: none;padding: 0.9rem 0.9rem;margin: 0.5rem 0;width: 100%;}@keyframes show {0%,49.99% {opacity: 0;z-index: 1;}50%,100% {opacity: 1;z-index: 5;}}.error-message{color: red;}</style>
</head><body>
<div class="container right-panel-active"><!-- 注册 --><div class="container__form container--signup"><form method="post" th:action="@{/register}" th:object="${userEmail}"  class="form" id="form1"><h2 class="form__title">注册</h2><input type="text" placeholder="用户" th:field="*{name}" class="input" /><input type="password" placeholder="密码" th:field="*{password}" class="input" /><input type="email" placeholder="邮箱" th:field="*{email}" class="input" /><div class="error-message" th:if="${errorMessage}"> <!-- 修改变量名为 "errorMessage" --><p id = "aaa" th:text="${errorMessage}"></p></div><button  class="btn" type="submit">注册</button></form></div><div class="success-message" th:if="${successMessage}"><p th:text="${successMessage}"></p></div><!-- 登录 --><div class="container__form container--signin"><form method="post" th:action="@{/login}" class="form" id="form2"><h2 class="form__title">登录</h2><input type="email" placeholder="Email" name="email" class="input" /><input type="password" placeholder="Password" name="password" class="input" /><a href="#" class="link">忘记密码了?</a><button class="btn" type="submit" >注册</button></form></div><!-- Overlay --><div class="container__overlay"><div class="overlay"><div class="overlay__panel overlay--left"><button class="btn" id="signIn">登录</button></div><div class="overlay__panel overlay--right"><button class="btn" id="signUp">注册</button></div></div></div>
</div><script>const signInBtn = document.getElementById("signIn");const signUpBtn = document.getElementById("signUp");const container = document.querySelector(".container");signInBtn.addEventListener("click", () => {container.classList.remove("right-panel-active");});signUpBtn.addEventListener("click", () => {container.classList.add("right-panel-active");});// 获取页面元素const form = document.getElementById("form1");const errorMessage = document.getElementById("errorMessage");// 提交表单时,禁用按钮并显示加载状态form.addEventListener("submit", function() {const button = form.querySelector("button[type=submit]");button.disabled = true;button.innerText = "加载中...";});// 如果页面存在错误消息,则弹出消息框if (errorMessage) {alert(errorMessage.innerText);}</script>
</body></html>

在这里插入图片描述

邮箱

在这里插入图片描述

相关文章:

SpringBoot+网易邮箱登录注册

文章目录 SpringBoot网易邮箱登录注册pom.xmlapplication.ymlsqlUserEmail.javaUserEmailMapper.javaUserEmailMapper.xmlEmailService.javaUserEmailService.javaUserEmailServiceImpl.javaUserEmailController.javaregister1.html 编写前参考 SpringBoot网易邮箱登录注册 po…...

SQL Server对象类型(7)——4.7.触发器(Trigger)

4.7. 触发器(Trigger) 4.7.1. 触发器概念 与Oracle中类似,SQL Server中,触发器是虚的、被定义的数据库代码对象,其本身并不存储数据,其通过数据库事件来自动触发预先定义的特定代码片段,以解决用户特定业务需求和完成特定任务。 4.7.2. 触发器注解 1)触发器的本质:…...

让@RefreshScope注解来帮助我们实现动态刷新

文章目录 前言举例作用参考文章总结 前言 在实际开发当中我们常常会看到有些类上会加一个注解&#xff1a;RefreshScope&#xff0c;有没有对应的小伙伴去思考过这个东西&#xff0c;这个注解有什么作用&#xff1f;为什么要加&#xff1f;下面我们就来看看这个 RefreshScope …...

c++ opencv使用drawKeypoints、line实现特征点的连线显示

前言 图像经过算子处理后得到若干特征点&#xff0c;使用opencv进行渲染显示出这些特征点并且连线&#xff0c;更直观的对比处理前后的一些差异性 demo核心代码 //画出特征点并连线 void drawFilterLinePoints(cv::Mat& srcMat, cv::Point2f pointStart, cv::Point2f po…...

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis &#xff0c;注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…...

Java面试题09

1.什么是反射&#xff1f; 反射是Java中的一种机制&#xff0c;允许在运行时获取类的信息、访问对象的属性和方法&#xff0c;以及调用 对象的方法&#xff0c;使得编程更加灵活&#xff0c;但也需要注意性能和安全问题。 在Java中&#xff0c;反射&#xff08;Reflection&…...

Linux grep命令

目录 一. 前期准备二. 配置项2.1 -e 配置项2.2 -h 配置项 三. 正则表达式3.1 {} 或查询3.2 文件路径和查询关键词中均包含正则表达式 四. zgrep 一. 前期准备 ✅TEST-2023-07-11.txt MPLE0130 Exception 123 ExecTimeMPLE0190 ExecTime123 MPLE0150 TST 1234 ExecTime454 MPL…...

RPC之GRPC:什么是GRPC、GRPC的优缺点、GRPC使用场景

简介 gRPC是一个现代的开源高性能远程过程调用(RPC)框架&#xff0c;可以在任何环境中运行。它可以高效地连接数据中心内和跨数据中心的服务&#xff0c;支持负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算的最后一英里&#xff0c;将设备、移动应用程序和浏览…...

无人机光伏巡检代替人工,贵州电站运维升级

无人机光伏巡检如何做到降本增效&#xff1f;贵州省光伏电站有新招&#xff01;某70MWp的光伏电站通过引入复亚智能无人机光伏巡检系统&#xff0c;专注于使用无人机对区域内的光伏面板进行自动巡航巡查&#xff0c;利用自动化巡检和故障识别技术&#xff0c;显著提升了光伏电站…...

【Q3——30min】

1、介绍一下数据库的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足第一范式&#xff1b;且不存在部分依赖&#xff0c;即非主属性必须完全依赖于主属性。(主属性即主键&a…...

leetcode每日一题35

90. 子集 II 回溯嘛 子集啊排列组合啊棋盘啊都是回溯 回溯三部曲走起 跟78.子集比&#xff0c;本题给出的数组里存在重复元素了 所以在取元素时&#xff0c;如果同一层里取过某个元素&#xff0c;那么在该层就不能取重复的该元素了 如给出的数组[1,2,2] 可以在某一次递归中第一…...

第二十章——多线程

一.线程简介 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 二.创建线程 1.继承Thread类 1.Thread类是java.lang包中的一个类&#xff0c;从这个类实例化的对象代表线程&#xff0c;程序员启动一个新…...

【FGPA】Verilog:JK 触发器 | D 触发器 | T 触发器 | D 触发器的实现

0x00 JK 触发器 JK 触发器是 RS 触发器和 T 触发器的组合&#xff0c;有两个输入端 J 和 K&#xff0c;如果两个输入端都等于 1&#xff0c;则将当前值反转。 行为表 状态图 Timing Diagram Circuit JK 触发器的设计目的是防止 RS 触发器在输入 S 和 R 均等于 …...

【人工智能】人工智能的技术研究与安全问题的深入讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…...

苹果提醒事项怎么用?几个简单步骤就能学会!

苹果提醒事项可以帮助你轻松管理待办事项&#xff0c;让你更好地安排自己的时间和工作。但是&#xff0c;有些小伙伴可能对如何使用这个功能还有一些疑问。苹果提醒事项怎么用&#xff1f;不要担心&#xff0c;小编将为大家提供使用提醒事项的方法&#xff0c;帮助你学会如何使…...

<HarmonyOS第一课>从简单的页面开始 【课后考核】

判断题 在Column容器中的子组件默认是按照从上到下的垂直方向布局的&#xff0c;其主轴的方向是垂直方向&#xff0c;在Row容器中的组件默认是按照从左到右的水平方向布局的&#xff0c;其主轴的方向是水平方向。 正确(True)List容器可以沿水平方向排列&#xff0c;也可以沿垂…...

如何实现按需加载

如何实现按需加载 实现按需引入的步骤&#xff1a; ES6模块语法&#xff1a; 确保你的组件库使用了ES6模块语法&#xff0c;这是按需引入的基础。 拆分组件&#xff1a; 将组件库拆分成独立的模块&#xff0c;每个模块包含一个组件。这样&#xff0c;只有需要的组件才会被引入…...

Vue3-admin-template的表格合计计算

直接上代码&#xff1a; <el-table:data"lists"style"width: 100%"max-height"500":header-cell-style"{ textAlign: center }":cell-style"{ textAlign: center }"show-summary:summary-method"getSummaries"…...

spring JdbcTemplate 快速入门

概述 Spring JDBC Template 是 Spring Framework 提供的一个简化 JDBC 操作的模板类。它封装了一些常见的 JDBC 操作&#xff0c;使得开发者在使用 JDBC 时能够更加便捷、简洁&#xff0c;同时也提供了异常处理和资源管理等功能。 导入pom 使用C3P0作为数据源 <project x…...

leetcode:用队列实现栈(后进先出)

题目描述 题目链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点&#xff0c;而队列的特点是先进先出&#xff0c;那么我们可以用两个队列来实现 一个队…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...