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://www.mzph.cn/diannao/2008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

索引【MySQL】

文章目录 什么是索引测试表 磁盘和 MySQL 的交互了解磁盘MySQL 的工作原理Buffer Pool 理解索引引入Page 的结构页内目录&#xff08;Page Directory&#xff09;多页情况B 树和 B树聚簇索引和非聚簇索引 主键索引创建 唯一索引主要特点与主键索引的区别使用场景创建 联合索引工…

WEB攻防-ASP安全-MDB下载

MDB下载漏洞主要涉及到早期ASPAccess构架的数据库文件。当Web站点提供文件下载功能时&#xff0c;如果没有对下载请求进行充分的验证和过滤&#xff0c;或者服务器配置不当&#xff0c;就可能产生文件下载漏洞。攻击者可以利用这个漏洞&#xff0c;通过修改请求参数或尝试猜测或…

YOLOv8蒸馏 | 知识蒸馏 | 利用模型蒸馏改进YOLOv8进行无损涨点 | MimicLoss(在线蒸馏 + 离线蒸馏)

一、本文介绍 这篇文章给大家带来的是模型的蒸馏&#xff0c;利用教师模型指导学生模型从而进行模型的涨点&#xff0c;本文的内容不仅可以用于论文中&#xff0c;在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术&#xff0c;所以大家可以仔细学习一下本文的内容&#…

CTF-reverse-simpleRE(base64变表逆向)

题目链接 NSSCTF | 在线CTF平台 题目详情 [HUBUCTF 2022 新生赛]simple_RE 解题报告 下载得到的文件使用ida64分析&#xff0c;如果报错就换ida32&#xff0c;得到分析结果&#xff0c;有main函数就先看main main函数分析 main函数的逻辑看下来十分简单&#xff0c;因此关键…

Redis入门到通关之Redis数据结构-ZSet篇

文章目录 ZSet也就是SortedSet&#xff0c;其中每一个元素都需要指定一个 score 值和 member 值&#xff1a; 可以根据score值排序后member必须唯一可以根据member查询分数 因此&#xff0c;zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的哪种编…

STM32自动光控窗帘程序+Proteus仿真图 H桥L298驱动电机

目录 1、前言 2、仿真图 3、源程序 资料下载地址&#xff1a;STM32自动光控窗帘程序Proteus仿真图 H桥L298驱动电机 1、前言 基于STM32F103设计的智能光控窗帘&#xff0c;包含STM32芯片、光敏电阻、LCD1602显示屏、电机驱动控制模块等。 备注&#xff1a;通过ARM内部的…

管理 Python 项目的艺术:在 PyCharm 中使用虚拟环境(以BPnP为例)

在 PyCharm 中使用虚拟环境对于 Python 项目开发具有多方面的重要作用&#xff0c;这些作用体现在提升项目管理的效率、保障代码的可运行性以及维护项目的长期稳定性等方面。以下是使用虚拟环境的几个关键好处&#xff1a; 1. 依赖管理和隔离 虚拟环境允许每个项目拥有…

Hadoop3:大数据生态体系

一、技术层面 通过下面这张图&#xff0c;我们可以大概确定&#xff0c;在大数据行业里&#xff0c;自己的学习路线。 个人认为&#xff0c;Hadoop集群一旦搭建完工&#xff0c;基本就是个把人运维的事情 主要岗位应该是集中在数据计算层&#xff0c;尤其是实时计算&#xff…

单调栈(C/C++)

引言&#xff1a; 单调队列和单调栈都是一种数据结构&#xff0c;应用十分广泛&#xff0c;在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法&#xff0c;今天博主将自己对单调栈与单调队列的理解以及刷题的经验&#xff0c;用一篇博客分享给大家&#xff0c;希望对大家有所…

【UI】element-ui的el-dialog的遮罩层在模态框的前面bug

最近在写element ui 的时候使用dialog组件&#xff0c;偶然出现了这种情况 原因&#xff1a; 是因为遮罩层插入进了body标签下&#xff0c;z-index高于当前父元素。 解决&#xff1a;在el-dialog标签里加上:modal-append-to-body"false"就可以了。 饿了么官网文档&a…

Ardupilot OpenIPC 基于WFB-NG构架分析和数据链路思考

Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考 1. 源由2. OpenIPC安装2.1 安装2.2 配置2.2.1 天空端配置文件2.2.2 地面端配置文件 2.3 当前配置选择 3. WFB-NG安装3.1 RTL8812AU安装3.1.1 驱动安装3.1.2 定位设备 3.2 wfb-ng安装3.2.1 传输层安装3.2.2 配置…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

Jenkins CI/CD 持续集成专题二 Jenkins 相关问题汇总

一 问题一 pod [!] Unknown command: package 1.1 如果没有安装过cocoapods-packager&#xff0c;安装cocoapods-packager&#xff0c;sudo gem install cocoapods-packager 1.2 如果已经安装cocoapods-packager&#xff0c;还是出现上面的错误&#xff0c;有可能是pod的安…

防、治、管融合一体化旅居健康守护系统

随着人口老龄化趋势的加剧和人们生活水平的提高&#xff0c;养老服务需求不断增长。旅居养老作为一种新型的养老模式&#xff0c;逐渐受到广大老年人的青睐。在生命健康服务运营平台中&#xff0c;为了给老人提供全方位、个性化的生命健康服务&#xff0c;我们平台也特意开设了…

31 信号量

概念 共享内存在通信的过程中&#xff0c;没有任何保护机制。当A进程写入了一部分&#xff0c;就被B、拿走了&#xff0c;导致双方发和收的数据不完整&#xff0c;数据不一致问题 1.A和B看到同一份资源&#xff0c;共享资源&#xff0c;如果不加保护&#xff0c;会导致数据不…

PyCharm添加外部工具

QtDesigner 可视化UI设计客户端工具 路径&#xff1a;File | Settings | Tools | External Tools点号&#xff0c;给External Tools组添加一个条目&#xff0c;填写如下内容 Name&#xff1a;QtDesignerProgram&#xff1a;C:\Users\用户名\AppData\Local\Programs\Python\Py…

在誉天学习云计算HCIE,担心考试考不过?

誉天定制化课程内容覆盖了所有考试重点&#xff0c;可以系统地掌握理论与实践知识。 对于笔试&#xff0c;类似于备考驾照理论学习阶段&#xff0c;誉天为大家提供在线模拟测试系统&#xff0c;帮助大家掌握云计算笔试考点。笔试通过后&#xff0c;18个月内&#xff08;一年半…

Docker 哲学 - docker save | load | export | import 及实践

当我们说 "归档文件包含了容器的所有文件&#xff0c;但不包含容器的元数据和配置"&#xff0c;我们是指 docker export 命令导出的 tar 归档文件包含了容器的文件系统中的所有文件&#xff0c;包括应用程序、库、数据等。但是&#xff0c;这个归档文件不包含关于容器…

Python 网络与并发编程(一)

文章目录 并发编程介绍串行、并行与并发的区别进程、线程、协程的区别进程线程协程 并发编程解决方案同步和异步介绍 并发编程介绍 串行、并行与并发的区别 有任务A、B、C&#xff0c;一个CPU去执行他们&#xff0c;有几种方式 1、一个cpu按顺序执行ABC&#xff0c;这就是串行…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤&#xff0c;分别是&#xff1a; 读取配置文件&#xff0c;寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑&#xff0c;大家勉强看看&#xff0…