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注解来帮助我们实现动态刷新
文章目录 前言举例作用参考文章总结 前言 在实际开发当中我们常常会看到有些类上会加一个注解:RefreshScope,有没有对应的小伙伴去思考过这个东西,这个注解有什么作用?为什么要加?下面我们就来看看这个 RefreshScope …...
c++ opencv使用drawKeypoints、line实现特征点的连线显示
前言 图像经过算子处理后得到若干特征点,使用opencv进行渲染显示出这些特征点并且连线,更直观的对比处理前后的一些差异性 demo核心代码 //画出特征点并连线 void drawFilterLinePoints(cv::Mat& srcMat, cv::Point2f pointStart, cv::Point2f po…...
Ruoyi-cloud / 若依 SpringCloud服务器部署
1、redis 环境 服务器安装redis ,注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql(必须),quartz.sql(可选&…...
Java面试题09
1.什么是反射? 反射是Java中的一种机制,允许在运行时获取类的信息、访问对象的属性和方法,以及调用 对象的方法,使得编程更加灵活,但也需要注意性能和安全问题。 在Java中,反射(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)框架,可以在任何环境中运行。它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览…...
无人机光伏巡检代替人工,贵州电站运维升级
无人机光伏巡检如何做到降本增效?贵州省光伏电站有新招!某70MWp的光伏电站通过引入复亚智能无人机光伏巡检系统,专注于使用无人机对区域内的光伏面板进行自动巡航巡查,利用自动化巡检和故障识别技术,显著提升了光伏电站…...
【Q3——30min】
1、介绍一下数据库的三大范式 第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键&a…...
leetcode每日一题35
90. 子集 II 回溯嘛 子集啊排列组合啊棋盘啊都是回溯 回溯三部曲走起 跟78.子集比,本题给出的数组里存在重复元素了 所以在取元素时,如果同一层里取过某个元素,那么在该层就不能取重复的该元素了 如给出的数组[1,2,2] 可以在某一次递归中第一…...
第二十章——多线程
一.线程简介 线程的特点 1.进程是资源分配的最小单位,线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 二.创建线程 1.继承Thread类 1.Thread类是java.lang包中的一个类,从这个类实例化的对象代表线程,程序员启动一个新…...
【FGPA】Verilog:JK 触发器 | D 触发器 | T 触发器 | D 触发器的实现
0x00 JK 触发器 JK 触发器是 RS 触发器和 T 触发器的组合,有两个输入端 J 和 K,如果两个输入端都等于 1,则将当前值反转。 行为表 状态图 Timing Diagram Circuit JK 触发器的设计目的是防止 RS 触发器在输入 S 和 R 均等于 …...
【人工智能】人工智能的技术研究与安全问题的深入讨论
前言 人工智能(Artificial Intelligence),英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 📕作者简介&#x…...
苹果提醒事项怎么用?几个简单步骤就能学会!
苹果提醒事项可以帮助你轻松管理待办事项,让你更好地安排自己的时间和工作。但是,有些小伙伴可能对如何使用这个功能还有一些疑问。苹果提醒事项怎么用?不要担心,小编将为大家提供使用提醒事项的方法,帮助你学会如何使…...
<HarmonyOS第一课>从简单的页面开始 【课后考核】
判断题 在Column容器中的子组件默认是按照从上到下的垂直方向布局的,其主轴的方向是垂直方向,在Row容器中的组件默认是按照从左到右的水平方向布局的,其主轴的方向是水平方向。 正确(True)List容器可以沿水平方向排列,也可以沿垂…...
如何实现按需加载
如何实现按需加载 实现按需引入的步骤: ES6模块语法: 确保你的组件库使用了ES6模块语法,这是按需引入的基础。 拆分组件: 将组件库拆分成独立的模块,每个模块包含一个组件。这样,只有需要的组件才会被引入…...
Vue3-admin-template的表格合计计算
直接上代码: <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 操作,使得开发者在使用 JDBC 时能够更加便捷、简洁,同时也提供了异常处理和资源管理等功能。 导入pom 使用C3P0作为数据源 <project x…...
leetcode:用队列实现栈(后进先出)
题目描述 题目链接:225. 用队列实现栈 - 力扣(LeetCode) 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点,而队列的特点是先进先出,那么我们可以用两个队列来实现 一个队…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
ubuntu清理垃圾
windows和ubuntu 双系统,ubuntu 150GB,开发用,基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小,发现 .cache 有26GB,.local 有几个GB&am…...
python打卡day47
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import D…...
NLP学习路线图(三十四): 命名实体识别(NER)
一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…...
