【基于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,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯项目基本介绍 🚦项…...

MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译
感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…...

微服务入门(go)
微服务入门(go) 和单体服务对比:里面的服务仅仅用于某个特定的业务 一、领域驱动设计(DDD) 基本概念 领域和子域 领域:有范围的界限(边界) 子域:划分的小范围 核心域…...

Baklib揭示内容中台实施最佳实践的策略与实战经验
内容概要 在当前数字化转型的浪潮中,内容中台的概念日益受到关注。它不再仅仅是一个内容管理系统,而是企业提升运营效率与灵活应对市场变化的重要支撑平台。内容中台的实施离不开最佳实践的指导,这些实践为企业在建设高效内容中台时提供了宝…...
C++11新特性之lambda表达式
1.介绍 C11引入了lambda表达式。lambda表达式提供一种简洁的方式来定义匿名函数对象,使得在需要临时定义一个函数时非常方便。 2.lambda表达式用法 lambda表达式的基本用法为: [捕获列表](参数列表)->返回类型 { 函数体 …...

洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解
一、题目链接 P10289 [GESP样题 八级] 小杨的旅游 - 洛谷 二、题目大意 n个节点之间有n - 1条边,其中k个节点是传送门,任意两个传送门之间可以 以0单位地时间相互到达。问从u到v至少需要多少时间? 三、解题思路 输入不必多讲。 cin >> …...

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI,是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手,感觉收获还蛮多的,今天来分享下开发过程中的一些经验~ 为啥要做这个…...
JWT入门
一、初识JWT:新时代的身份认证方案 在分布式系统成为主流的今天,传统的Session认证方式逐渐显露出局限性。JWT(JSON Web Token)作为现代Web开发的认证新标准,凭借其无状态、跨域友好和安全性等特性,正在成为…...

Python - Quantstats量化投资策略绩效统计包 - 详解
使用Quantstats包做量化投资绩效统计的时候因为Pandas、Quantstats版本不匹配踩了一些坑;另外,Quantstats中的绩效统计指标非常全面,因此详细记录一下BUG修复方法、使用说明以及部分指标的内涵示意。 一、Quantstats安装及版本匹配问题 可以…...

智慧园区管理系统推动企业智能运维与资源优化的全新路径分析
内容概要 在当今快速发展的商业环境中,园区管理的数字化转型显得尤为重要。在这个背景下,快鲸智慧园区管理系统应运而生,成为企业实现高效管理的最佳选择。它通过整合互联网、物联网等先进技术,以智能化的方式解决了传统管理模式…...
【数据结构-字典树】力扣14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: 输入:strs [“dog”,“racecar…...
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...

Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别
Go语言中的流程控制语句逻辑结构与其他编程语言类似,格式有些不同。Go语言的流程控制中,包括if、switch、for、range、goto等语句,没有while循环。 目录 1. if 语句 2. switch语句 3. for语句 4. range语句 5. goto语句(不常用…...

L30.【LeetCode笔记】设计链表
1.题目 707. 设计链表 - 力扣(LeetCode) 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向…...

java日志框架详解-Log4j2
一、概述 Apache Log4j 2 (Log4j – Apache Log4j 2)是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并参考了Logback中优秀的设计,同时修复了Logback架构中的一些问题。被誉为是目前最优秀的Java日志框架&#x…...
C++中vector追加vector
在C中,如果你想将一个vector追加到另一个vector的后面,可以使用std::vector的成员函数insert或者std::copy,或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法: 方法1:使用insert方…...
加一(66)
66. 加一 - 力扣(LeetCode) 解法: class Solution { public:vector<int> plusOne(vector<int>& digits) {bool plus_one true;for (int i digits.size() - 1; i > 0; --i) {if (plus_one) {int tmp digits[i] 1;if …...
远程连接-简化登录
vscode通过ssh连接远程服务器免密登录(图文)_vscode ssh-CSDN博客...
canvas的基本用法
canvas canvas元素简介 1.是个container元素<canvas width100 height100></canvas>,有开闭标签 2.有且只有width和height两个attribute,不需要写单位 canvas的基本使用 const canvasEl document.getElementById(canvas01) const ctx …...
Tailwind CSS - Tailwind CSS 引入(安装、初始化、配置、引入、构建、使用 Tailwind CSS)
一、Tailwind CSS 概述 Tailwind CSS 是一个功能优先的 CSS 框架,它提供了大量的实用类(utility classes),允许开发者通过组合这些类来快速构建用户界面 Tailwind CSS 与传统的 CSS 框架不同(例如,Bootstr…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...