【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册

🧸安清h:个人主页
🎥个人专栏:【计算机网络】【Mybatis篇】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。

目录
🎯项目基本介绍
🚦项目功能
🚦开发顺序
🚦模块的开发
🎯项目的开发环境
🎯搭建项目
🎯用户注册
🚦1.选中数据表
🚦2.创建t_user表
🚦3.创建用户实体类
✨创建BaseEntity
✨创建实体类User
🚦4.注册-持久层
✨规划需要执行的sql语句
✨设计接口和抽象方法
✨编写映射
🚦5.注册-业务层
✨5.1规划异常
🎃5.1.1RuntimeException异常
🎃5.1.2用户名被占用异常
🎃5.1.3数据插入异常
✨ 5.2设计接口和抽象方法
🚦6.注册-控制层
✨6.1创建响应
✨6.2设计请求
✨6.3处理请求
✨6.4控制层优化设计
🚦7.注册-前端页面
🎯项目基本介绍
🚦项目功能
本项目主要实现功能为:登录,注册,热销商品,用户管理(密码,个人信息,头像,收货地址),购物车(展示,增加,删除),订单模块。
🚦开发顺序
注册,登录,用户管理,购物车,商品,订单模块。
🚦模块的开发
- 持久层开发:依据前端页面的设置规划相关的SQL语句,以及进行配置。
- 业务层开发:核心功能的控制,业务的操作以及异常的处理。
- 控制层开发:接受请求,处理响应。
- 前端开发:JS,QUERY,AJAX等技术连接后台
🎯项目的开发环境
1.JDK:1.8及以上版本
2.maven:配置到idea,3.6.1版本
3.数据库:Mysql,要求5.1及以上版本
4.开发的平台:idea开发
🎯搭建项目
1.项目的名称:store,表示商城
2.结构:com.cy.store
3.资源文件:resources文件夹下(static、templates)
4.单元测试:test.com.cy.store
5.
6.点击next后,先选择以下三个jar包。
(1)WEB:Spring Web(用于前后端连接)
(2)SQL:Mybatis Framework
(3)SQL:MySQL Driver(用于mysql数据库驱动)
7.在properties文件中配置数据库的连接源信息
spring.datasource.url=jdbc:mysql://localhost:3306/store?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
8.创建一个store数据库
create database store character set utf8;
9.测试连接:
- 启动SpringBoot主类,是否有对应的Spring图形输出
在src->main->java->com.cy.store->StoreApplication,启动main方法,得到如下图形即为启动成功:
- 在单元测试类中测试数据库的连接是否可以正常加载
如果出现了以下图片中的Hikari,则代表成功。Hikari是用来管理数据库的连接对象。

10.访问项目的静态资源是否可以正常加载。所有的静态资源复制static目录下。
注意:idea对于JS代码的兼容性较差,编写了js代码但是有时候不能够正常去加载。
- idea缓存清理
- clear-install,双击clean后再次install
- rebuild重新构建
- 重启idea和操作系统
🎯用户注册
🚦1.选中数据表
use store
🚦2.创建t_user表
CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT '用户id',username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',password CHAR(32) NOT NULL COMMENT '密码',salt CHAR(36) COMMENT '盐值',phone VARCHAR(20) COMMENT '电话号码',email VARCHAR(30) COMMENT '电子邮箱',gender INT COMMENT '性别:0-女,1-男',avatar VARCHAR(50) COMMENT '头像',is_delete INT COMMENT '是否删除:0-未删除,1-已删除',created_user VARCHAR(20) COMMENT '日志-创建人',created_time DATETIME COMMENT '日志-创建时间',modified_user VARCHAR(20) COMMENT '日志-最后修改执行人',modified_time DATETIME COMMENT '日志-最后修改时间',PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- salt盐值:在用户注册时,对其密码进行加密操作,重要
- 性别:用阿拉伯数字0和1来表示性别,原因在于前端不太好用文字来展示一个人的性别,性别是单选框,一半给一个整数好去操作和判断。
- is_delete:大部分厂商都没有实现真正的删除,只是在登录的时候做一个校验,来检测是否为0,如果不为0,就表示已经删除了。
- 四个基础字段,任何一张表都有的,将其作为整个实体类。,
created_user VARCHAR(20) COMMENT ‘创建人’,
created_time DATETIME COMMENT ‘创建时间’,
modified_user VARCHAR(20) COMMENT ‘修改人’,
modified_time DATETIME COMMENT ‘修改时间’,
🚦3.创建用户实体类
✨创建BaseEntity
实体基类,里面存放的为所有表的公共字段。
public class BaseEntity implements Serializable {private String createdUser;private Date createdTime;private String modifiedUser;private Date modifiedTime;
}//get和set方法、equals和hashCode()方法、toString方法
✨创建实体类User
public class User extends BaseEntity implements Serializable {private Integer uid;private String username;private String password;private String salt;private String phone;private String email;private Integer gender;private String avatar;private Integer isDelete;//get和set方法、equals和hashCode()方法、toString方法
}
🚦4.注册-持久层
通过Mybatis来操作数据库。在做mybatis开发的流程。
✨规划需要执行的sql语句
1.用户的注册功能相当于在做数据的插入操作。
insert into t_user(username,password) values(值列表)
2.在用户注册时首先要去查询当前的用户名是否存在,如果存在则不能进行注册。相当于是一条查询语句。
select * from t_user where username=?
✨设计接口和抽象方法
1.定义Mapper接口。在项目的目录结构下首先创建一个mapper包,在这个包下再根据不同的功能模块来创建mapper接口。创建一个UserMapper的接口。要在接口中定义这两个SQL语句的抽象方法。
public interface UserMapper {
// 插入用户的数据
// @param user 用户的数据
// @return 受影响的行数(增,删,改,都受影响的行数作为返回值,可以根据返回值来判断是否执行成功)Integer insert(User user);// 根据用户名来查询用户的数据
// @param username 用户名
// @return 如果找到对应的用户则返回这个用户的数据,如果没有找到则返回null值User findByUsername(String username);
}
2.在启动类配置mapper接口文件的位置
//MapperScan注解指定当前项目中的Mapper接口路径的位置,在项目启动时会自动加载所有的接口
@MapperScan("com.cy.store.mapper")
✨编写映射
1.定义xml映射文件,与对应的接口进行关联。所有的映射文件需要放置在resources目录下,在这个目录下创建一个mapper文件夹,然后在这个文件夹存放Mapper的映射文件。
2.创建接口对应的映射文件,遵循和接口的名称保持一致即可。创建一个UserMapper.xml的文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性:用于指定当前的映射文件和哪个接口进行映射,需要指定接口的文件路径,需要标注包的完整路径接口-->
<mapper namespace="com.cy.store.mapper.UserMapper"></mapper>
3.配置接口中的方法对应上SQL语句。需要借助标签来完成,insert/update/delete/select,对应的是SQL语句的增删改查操作。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性:用于指定当前的映射文件和哪个接口进行映射,需要指定接口的文件路径,需要标注包的完整路径接口-->
<mapper namespace="com.cy.store.mapper.UserMapper">
<!-- resultMap标签来完成映射规则的定义--><resultMap id="UserEntityMap" type="com.cy.store.entity.User">
<!-- 配合完成名称不一致的映射:column:表中的字段名称property:类中的属性名称
-->
<!-- 在定义映射规则时,主键是不可以省略的--><id column="uid" property="uid"></id><result column="is_delete" property="isDelete"></result><result column="created_user" property="createdUser"></result><result column="created_time" property="createdTime"></result><result column="modified_user" property="modifiedUser"></result><result column="modified_time" property="modifiedTime"></result></resultMap><!-- id属性:表示映射的接口中方法的名称,直接在标签的内部来编写SQL语句-->
<!-- useGeneratedKeys:开启某个字段的值递增(主键设为递增)-->
<!-- keyProperty:将表中那个字段作为主键进行递增--><insert id="insert" useGeneratedKeys="true" keyProperty="uid">insert into t_user(username,password,salt,phone,email,gender,avatar,is_delete,created_user,created_time,modified_user,modified_time)values (#{username},#{password},#{salt},#{phone},#{email},#{gender},#{avatar},#{isDelete},#{createdUser},#{createdTime},#{modifiedUser},#{modifiedTime})</insert><select id="findByUsername" resultMap="UserEntityMap">select * from t_user where username=#{username}</select>
</mapper>
4.将mapper文件的位置注册到properties对应的配置文件中,在application.properties文件中添加如下代码:
mybatis.mapper-locations=classpath:mapper/*.xml
5.单元测试:每个独立的层编写完毕后需要编写单元测试方法,来测试当前功能。在test包接口下创建一个mapper包,在这个包下创建一个持久层的测试。
//@SpringBootTest标注当前的类是一个测试类,不会随同项目一块打包
@SpringBootTest
public class UserMapperTests {@Autowiredprivate UserMapper userMapper;
// 单元测试方法:可以单独独立运行,不用启动整个项目,提高了代码运行效率
// 1.必须被@Test注解修饰
// 2.返回值类型必须是void
// 3.方法的参数类型不指定任何类型
// 4.方法的访问修饰符必须是public@Testpublic void insert(){User user=new User();user.setUsername("tim");user.setPassword("123");Integer rows=userMapper.insert(user);System.out.println(rows);}@Testpublic void findByUsername(){User user=userMapper.findByUsername("tim");System.out.println(user);}
}
🚦5.注册-业务层
✨5.1规划异常
🎃5.1.1RuntimeException异常
作为这异常的子类,然后再去定义具体的异常类型来继承这个异常。业务层异常的基类,ServiceException异常。这个异常继承RuntimeException异常。异常机制的建立。
//业务层异常的基类
public class ServiceException extends RuntimeException{public ServiceException() {super();}public ServiceException(String message) {super(message);}public ServiceException(String message, Throwable cause) {super(message, cause);}public ServiceException(Throwable cause) {super(cause);}protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
根据业务层不同的功能来详细定义具体的异常的类型,统一的去继承ServiceException异常类。
🎃5.1.2用户名被占用异常
用户在进行注册时可能会产生用户名被占用的错误,抛出一个异常:UsernameDuplicatedException异常。
//用户名被占用的异常
public class UsernameDuplicatedException extends ServiceException{public UsernameDuplicatedException() {super();}public UsernameDuplicatedException(String message) {super(message);}public UsernameDuplicatedException(String message, Throwable cause) {super(message, cause);}public UsernameDuplicatedException(Throwable cause) {super(cause);}protected UsernameDuplicatedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
alt+insert打开快捷方式,选中前五个如图:

🎃5.1.3数据插入异常
正在执行数据插入操作的时候,服务器,数据库宕机。处于正在执行插入的过程中所产生的异常:InsertException异常。
//数据在插入过程中产生的异常
public class InsertException extends ServiceException{public InsertException() {super();}public InsertException(String message) {super(message);}public InsertException(String message, Throwable cause) {super(message, cause);}public InsertException(Throwable cause) {super(cause);}protected InsertException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
✨ 5.2设计接口和抽象方法
1.在service包下创建一个IUserService接口。
//用户模块业务层接口
public interface IUserService {void reg(User user);
}
2.创建一个实现类UserServiceImpl类,需要实现这个接口,并且实现抽象的方法。
//用户模块业务层的实现类
@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void reg(User user) {
// 通过user参数来获取传递过来的usernameString username= user.getUsername();//调用findByUsername(username)判断用户是否被注册过User result = userMapper.findByUsername(username);
// 判断结果集是否不为null,则抛出用户名被占用的异常if(result !=null){throw new UsernameDuplicatedException("用户名被占用");}
// 密码加密处理的实现:md5算法的形式
// 串+password+串------md5算法进行加密,连续加载三次
// 盐值+password+盐值------盐值就是一个随机的字符串String oldPassword = user.getPassword();
// 获取盐值(随机生成一个盐值)String salt = UUID.randomUUID().toString().toUpperCase();
// 补全数据:盐值的记录user.setSalt(salt);
// 将密码和盐值作为一个整体进行加密处理,忽略原有密码的强度,提升了数据的安全性String md5Password = getMD5Password(oldPassword,salt);
// 将加密之后的密码重新补全设置到user对象中user.setPassword(md5Password);// 补全数据:is_delete设置成0user.setIsDelete(0);
// 补全数据:四个日志字段信息user.setCreatedUser(user.getUsername());user.setModifiedUser(user.getUsername());Date date=new Date();user.setCreatedTime(date);user.setModifiedTime(date);// 执行注册业务功能的实现(rows=1)Integer rows=userMapper.insert(user);if(rows!=1){throw new InsertException("在用户注册过程中产生了未知的异常");}}
// 定义一个md5算法的加密处理private String getMD5Password(String password,String salt){
// md5加密算法方法的调用(进行三次加密)for(int i=0;i<3;i++){password=DigestUtils.md5DigestAsHex((salt+password+salt).getBytes()).toUpperCase();}
// 返回加密之后的密码return password;}
}
3.在单元测试包下创建一个UserServiceTests类,在这个类中添加单元测试的功能。
//@SpringBootTest标注当前的类是一个测试类,不会随同项目一块打包
@SpringBootTest
public class UserServiceTests {@Autowiredprivate IUserService userService;
// 单元测试方法:可以单独独立运行,不用启动整个项目,提高了代码运行效率
// 1.必须被@Test注解修饰
// 2.返回值类型必须是void
// 3.方法的参数类型不指定任何类型
// 4.方法的访问修饰符必须是public@Testpublic void reg(){try {User user=new User();user.setUsername("yuanxin01");user.setPassword("123");userService.reg(user);System.out.println("OK");} catch (ServiceException e) {
// 获取类的对象,再获取类的名称System.out.println(e.getClass().getSimpleName());
// 获取异常的具体描述信息System.out.println(e.getMessage());}}}
🚦6.注册-控制层
✨6.1创建响应
状态码、状态描述信息、数据。这部分功能封装一个类中,将这类作为方法返回值,返回给前端浏览器。
//Json格式的数据进行响应
public class JsonResult<E> implements Serializable {
// 状态码private Integer state;
// 描述信息private String message;
// 数据private E data;public JsonResult(Integer state) {this.state = state;}public JsonResult(Throwable e) {this.message = e.getMessage();}public JsonResult(Integer state, E data) {this.state = state;this.data = data;}public Integer getState() {return state;}public void setState(Integer state) {this.state = state;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public E getData() {return data;}public void setData(E data) {this.data = data;}
}
✨6.2设计请求
依据当前的业务功能模块进行请求设计。
请求路径:/users/reg
请求参数:user user
请求类型:POST
响应结果:JsonResult<void>
✨6.3处理请求
1.创建一个控制层对应的类UserController类。依赖于业务层的接口。
@RestController //@Controller+@RequestBody
@RequestMapping("users")
public class UserController {@Autowiredprivate IUserService userService;@RequestMapping("reg")// @RequestBody //表示此方法的响应结果以json格式进行数据的响应给到前端public JsonResult<Void> reg(User user){JsonResult<Void> result=new JsonResult<>();try {userService.reg(user);result.setState(200);result.setMessage("用户注册成功");} catch (UsernameDuplicatedException e) {result.setState(4000);result.setMessage("用户名被占用");}catch (InsertException e) {result.setState(5000);result.setMessage("注册时产生未知的异常");}return result;}
}
✨6.4控制层优化设计
在控制层抽离一个父类,在这个父类中统一的去处理关于异常的操作。编写一个BaseController类,统一处理异常。
//控制层类的基类
public class BaseController{
// 操作成功的状态码public static final int OK=200;
// 充当请求处理方法,这个方法的返回值就是需要传递给前端的数据
// 自动将异常对象传递给此方法的参数列表上
// 当项目中产生了异常,会被统一的拦截到此方法中,这个方法此时就充当请求处理方法,方法的返回值直接给到前端@ExceptionHandler(ServiceException.class) //用于统一处理抛出的异常public JsonResult<Void> handleException(Throwable e){JsonResult<Void> result=new JsonResult<>(e);if(e instanceof UsernameDuplicatedException){result.setState(4000);result.setMessage("用户名已经被占用");}else if(e instanceof InsertException){result.setState(5000);result.setMessage("注册时产生未知的异常");}return result;}
}
重新构建了reg()方法。
@RestController //@Controller+@RequestBody
@RequestMapping("users")
public class UserController extends BaseController{@Autowiredprivate IUserService userService;@RequestMapping("reg")public JsonResult<Void> reg(User user){userService.reg(user);return new JsonResult<>(OK);}
}
🚦7.注册-前端页面
1.在register页面中编写发送请求的方法,点击事件来完成。选中对应的按钮($("选择器")),再去添加点击的事件,$.ajax()函数发送异步请求。
2.JQuery封装了一个函数,称之为$.ajax()函数,通过对象调用ajax,可以异步加载相关的请求。ajax可以把某一部分的局部看做成一个独立的整体。依靠的是javascript提供的一个对象XHR(XmlHttpResponse),封装了这个对象。
3..ajax()使用方式。需要传递一个方法作为方法的参数使用,一对大括号称之为方法体。ajax接收多个参数,参数与参数之间要使用","分割,每一组参数之间使用“:”进行分割,参数的组成部分一个是参数的名称(不能随意定义),是参数的值,参数的值要求用字符串来表示。参数的声明顺序没有要求。语法结构:
$.ajax({url:"",type:"",data:"",dataType:"",success:function(){},error:function(){}
});
4.ajax()函数参数的含义:
| 参数 | 功能描述 |
|---|---|
| url | 标识请求的地址(url地址),不能包含参数列表部分的内容。例如:url:"localhost:8080/users/reg" |
| type | 请求类型(GET和POST请求的类型)。例如:type:"POST" |
| data | 向指定的请求url地址提交的数据。例如:data:"username=tom&pwd=123" |
| dataType | 提交的数据类型。数据的类型一般指定为json类型。dataType:"json" |
| success | 当服务器正常响应客户端时,会自动调用success参数方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上 |
| error | 当服务器未正常响应客户端时,会自动调用error参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上 |
5.js代码可以独立声明在一个js文件里或者声明在一个script标签中。
<script>//1.监听注册按钮是否被点击,如果被点击可以执行一个方法$("#btn-reg").click(function () {// 2.发送ajax()的异步请求来完成用户的注册功能$.ajax({url: "/users/reg",type: "POST",data: $("#form-reg").serialize(),dataType: "JSON",success: function (json) { if (json.state == 200) {alert("注册成功")} else {alert("注册失败")}},error: function (xhr) { alert("注册时产生未知的错误!"+xhr.status);}});});</script>
6.js代码无法正常被服务器解析执行,体现在点击页面中的按钮没有任何响应。解决方案:
- 在项目的maven下clear清理项目-install重新部署
- 在项目的file选项下-cash清理缓存
- 重新的去构建项目:build选项下-rebuild选项
- 重启idea
- 重启电脑
相关文章:
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册
🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯项目基本介绍 🚦项…...
亚远景-从SPICE到ASPICE:汽车软件开发的标准化演进
一、SPICE标准的起源与背景 SPICE,全称“Software Process Improvement and Capability dEtermination”,即“软件流程改进和能力测定”,是由国际标准化组织ISO、国际电工委员会IEC、信息技术委员会JTC1联合发起制定的ISO 15504标准。该标准旨…...
力扣1022. 从根到叶的二进制数之和(二叉树的遍历思想解决)
Problem: 1022. 从根到叶的二进制数之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 1.在先序遍历的过程中,用一个变量path记录并更新其经过的路径上的值,当遇到根节点时再将其加到结果值res上; 2.该题…...
Redis背景介绍
⭐️前言⭐️ 本文主要做Redis相关背景介绍,包括核心能力、重要特性和使用场景。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主…...
LabVIEW图像采集与应变场测量系统
开发了一种基于LabVIEW的图像采集与应变场测量系统,提供一种高精度、非接触式的测量技术,用于监测物体的全场位移和应变。系统整合了实时监控、数据记录和自动对焦等功能,适用于工程应用和科学研究。 项目背景 传统的位移和应变测量技术往往…...
html基本结构和常见元素
html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...
upload labs靶场
upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关,所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称:张嘉玮 二.解题情况 三.解题过程 题目:up load labs靶场 pass 1前后端 思路及解题:…...
自定义多功能输入对话框:基于 Qt 打造灵活交互界面
一、引言 在使用 Qt 进行应用程序开发时,我们经常需要与用户进行交互,获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具,可用于简单的输入场景,但当需求变得复杂,需要支持更多类型的输入控件࿰…...
手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...
论文阅读:Realistic Noise Synthesis with Diffusion Models
这篇文章是 2025 AAAI 的一篇工作,主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据,而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…...
JVM监控和管理工具
基础故障处理工具 jps jps(JVM Process Status Tool):Java虚拟机进程状态工具 功能 1:列出正在运行的虚拟机进程 2:显示虚拟机执行主类(main()方法所在的类) 3:显示进程ID(PID,Process Identifier) 命令格式 jps […...
【TensorFlow】T1:实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...
【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…...
动静态库的学习
动静态库中,不需要包含main函数 文件分为内存级(被打开的)文件和磁盘级文件 库 每个程序都要依赖很多基础的底层库,本质上来说库是一种可执行代码的二进制形式,可以被载入内存执行 静态库 linux .a windows .lib 动态库 linux .…...
Rapidjson 实战
Rapidjson 是一款 C 的 json 库. 支持处理 json 格式的文档. 其设计风格是头文件库, 包含头文件即可使用, 小巧轻便并且性能强悍. 本文结合样例来介绍 Rapidjson 一些常见的用法. 环境要求 有如何的几种方法可以将 Rapidjson 集成到您的项目中. Vcpkg安装: 使用 vcpkg instal…...
DeepSeek的多模态AI模型-Janus-pro,可生图,可读图
简介 Janus-Pro 是由 DeepSeek 开发的一款多模态理解与生成模型,是 Janus 模型的升级版。它能够同时处理文本和图像,既能理解图像内容,又能根据文本描述生成高质量图像。Janus-Pro 的核心目标是通过解耦视觉编码路径,解决多模态理…...
Python爬虫实战:一键采集电商数据,掌握市场动态!
电商数据分析是个香饽饽,可市面上的数据采集工具要不贵得吓人,要不就是各种广告弹窗。干脆自己动手写个爬虫,想抓啥抓啥,还能学点技术。今天咱聊聊怎么用Python写个简单的电商数据爬虫。 打好基础:搞定请求头 别看爬虫…...
最短木板长度
最短木板长度 真题目录: 点击去查看 E 卷 100分题型 题目描述 小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。 小明想让最…...
【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…...
git submodules
当代码仓库中包含 .gitmodules 文件时,这意味着该仓库使用了 Git 子模块(Git Submodules)。.gitmodules 文件记录了子模块的相关信息,如子模块的仓库地址、路径等。若要在下载代码时一并同步子模块,可以按照以下几种常…...
7 与mint库对象互转宏(macros.rs)
macros.rs代码定义了一个Rust宏mint_vec,它用于在启用mint特性时,为特定的向量类型实现与mint库中对应类型的相互转换。mint库是一个提供基本数学类型(如点、向量、矩阵等)的Rust库,旨在与多个图形和数学库兼容。这个宏…...
游戏引擎 Unity - Unity 下载与安装
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
[openwrt]openwrt slaac only模式下部分终端无法获取到IPv6 DNS
问题描述 OpenWrt 中,如果启用了 RA 单播(ra_unicast),但部分终端无法获取到 DNS 信息 问题分析 RA 单播的局限性 并非所有终端都完全支持通过单播接收 RA 消息。部分终端可能无法正确解析单播 RA 中的 RDNSS(Recursive DNS Server)选项,从而导致无法获取 DNS 信息。终…...
Java 面试真题
本题适合一到三年 Java 开发 ,以下问题都是按照原面试官提问记录 文章目录 我要进大厂系列面试题二面 我要进大厂系列面试题 全部真题,欢迎投稿你的面试经验。 本篇涉及基础较多,但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法…...
验证工具:GVIM和VIM
一、定义与关系 gVim:gVim是Vim的图形界面版本,提供了更多的图形化功能,如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便,尤其对于不习惯命令行界面的用户来说。Vim:Vim是一个在命令行界面下运行的文本编…...
理解 C 与 C++ 中的 const 常量与数组大小的关系
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯数组大小的常量要求💯C 语言中的数组大小要求💯C 中的数组大小要求💯为什么 C 中 const 变量可以作为数组大小💯进一步的…...
孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标
这篇内容将深入探讨孟加拉国的行政边界省市边界数据,该数据是以arcgis的shp格式提供的,并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统(GIS)的专业软件,它允许用户处理、分析和展示地理空间数据。在GIS领域…...
安心即美的生活方式
如果你的心是安定的,那么,外界也就安静了。就像陶渊明说的:心远地自偏。不是走到偏远无人的边荒才能得到片刻清净,不需要使用洪荒之力去挣脱生活的枷锁,这是陶渊明式的中国知识分子的雅量。如果你自己是好的男人或女人…...
APT (Advanced Package Tool) 安装与使用-linux014
APT (Advanced Package Tool) APT (Advanced Package Tool) 是一个用于管理 Debian 和 Ubuntu 系列 Linux 发行版上的软件包的工具。它简化了软件的安装、升级、配置和删除过程。APT 为用户提供了一个统一的命令行接口,使得管理和安装软件变得更加简单。 APT 主要…...
深度学习篇---深度学习中的超参数张量转换模型训练
文章目录 前言第一部分:深度学习中的超参数1. 学习率(Learning Rate)定义重要性常见设置 2. 批处理大小(Batch Size)定义重要性常见设置 3. 迭代次数(Number of Epochs)定义重要性常见设置 4. 优…...

