【基于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,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯项目基本介绍 🚦项…...
记忆化搜索(5题)
是什么? 是一个带备忘录的递归 如何实现记忆化搜索 1.添加一个备忘录(建立一个可变参数和返回值的映射关系) 2.递归每次返回的时候把结果放到备忘录里 3.在每次进入递归的时候往备忘录里面看看。 目录 1.斐波那契数列 2.不同路径 3.最…...
强化学习笔记——4策略迭代、值迭代、TD算法
基于策略迭代的贝尔曼方程和基于值迭代的贝尔曼方程,关系还是不太理解 首先梳理一下: 通过贝尔曼方程将强化学习转化为值迭代和策略迭代两种问题 求解上述两种贝尔曼方程有三种方法:DP(有模型),MCÿ…...
nginx目录结构和配置文件
nginx目录结构 [rootlocalhost ~]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # POST 大文件暂存目录 ├── conf # Nginx所有配置文件的目录 │ ├── fastcgi.conf # fastcgi相关参…...
Spring RESTful API 设计与实现
Spring RESTful API的设计与实现极大地提升了开发效率和系统可维护性,通过遵循RESTful设计原则,使得API结构清晰、行为一致,便于扩展和维护。它在构建微服务架构中扮演着核心角色,支持松耦合的通信,同时通过标准的HTTP协议和数据格式增强了系统的互操作性。结合Spring Sec…...
【玩转全栈】--创建一个自己的vue项目
目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架,旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念,使得开发者可以通过声明式的方式轻松管理数据和…...
【Envi遥感图像处理】008:波段(批量)分离与波段合成
文章目录 一、波段分离提取1. 提取单个波段2. 批量提取单个波段二、波段合成相关阅读:【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用 一、波段分离提取 1. 提取单个波段...
数据结构-Stack和栈
1.栈 1.1什么是栈 栈是一种特殊的线性表,只允许在固定的一段进行插入和删除操作,进行插入和删除操作的一段称为栈顶,另一端称为栈底。 栈中的数据元素遵顼后进先出LIFO(Last In First Out)的原则,就像一…...
内容检索(2025.01.30)
随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 博客域名:http://my-signal.blog.cs…...
牛客周赛 Round 77
题目目录 C-小红走网格解题思路参考代码 D-隐匿社交网络解题思路参考代码 F-计树解题思路参考代码 C-小红走网格 解题思路 根据裴蜀定理:设a,b是不全为0的整数,对任意整数x,y,满足gcd(a,b&…...
c++面试:类定义为什么可以放到头文件中
这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在,还会为该实体分配存储空间&#…...
Oracle查看数据库表空间使用情况
Oracle RAC环境查看表空间使用情况 查询字段释义: NEED_ADDFILE,--是否需增加表空间文件 TABLESPACE_NAME,--表空间名称 TABLESPACE_FILE_COUNT, --表空间当前数据文件数量 NOW_FILEENABLE_BLOCKS,--表空间文件当前数据块数 NOW_FILEENABLE_BYTES_GB,--表空间文件当…...
Spring Boot 热部署实现指南
在开发 Spring Bot 项目时,热部署功能能够显著提升开发效率,让开发者无需频繁重启服务器就能看到代码修改后的效果。下面为大家详细介绍一种实现 Spring Boot 热部署的方法,同时也欢迎大家补充其他实现形式。 步骤一、开启 IDEA 自动编译功能…...
如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?
如何构建ObjC语言编译环境? 除了在线ObjC编译器,本地环境Windows/Mac/Linux均可以搭建ObjC编译环境。 Mac自然不用多说,ObjC是亲儿子。(WSL Ubuntu 22.04) Ubuntu可以安装gobjc/gnustep和gnustep-devel构建编译环境。 sudo apt-get install gobjc gnus…...
C++——类和对象(下)
1.初始化列表 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个…...
R 字符串:深入理解与高效应用
R 字符串:深入理解与高效应用 引言 在R语言中,字符串是数据处理和编程中不可或缺的一部分。无论是数据清洗、数据转换还是数据分析,字符串的处理都是基础技能。本文将深入探讨R语言中的字符串概念,包括其基本操作、常见函数以及高效应用方法。 字符串基本概念 字符串定…...
C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?
匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型的方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。 使用场景 事件处理:在处理事件时,不需要为每个事件处理程序单独定义…...
舵机型号与识别
舵机型号繁多,不同品牌和制造商有不同的命名规则。常见的舵机品牌包括 Futaba、Hitec、Tower Pro、Savox、JX Servo 等。以下是舵机型号的常见识别方法以及一些典型的型号示例: 一、舵机型号的识别方法 型号命名规则: 舵机型号通常由字母和数…...
【memgpt】letta 课程6: 多agent编排
Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块...
《DeepSeek手机版:开启AI移动新时代》
DeepSeek 手机版爆火:现象与背景 在当今数字化时代,AI 技术的发展日新月异,如同一股汹涌澎湃的浪潮,深刻地改变着我们的生活。而在这股浪潮中,DeepSeek 手机版宛如一颗璀璨的新星,迅速崛起,引发…...
列表(列表是什么)
你将学习列表是什么以及如何使用列表元素。列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素。 列表是新手可直接使用的最强大的Python功能之一,它融合了众多重要的编程概念。 列表是什么 列表 由一系列…...
C语言-运算符
1. 按位与运算符(&) 按位与运算符对两个整数的每一位执行“与”操作。只有当两个相应位都为 1 时,结果才为 1 ;否则为 0。 // 示例 int a 5; // 二进制: 0101 int b 3; // 二进制: 0011 int result a & b; …...
yolov11、yolov8部署的7种方法(yolov11、yolov8部署rknn的7种方法),一天一种部署方法,7天入门部署
由于涉及量化、部署两个领域,本博文难免有不对之处,欢迎指正。 本博客对 yolov11(yolov8)尝试了7种不同的部署方法,在最基础的模型上一步一步的去掉解码相关的操作(移到后处理种进行)࿰…...
事务03之MVCC机制
MVCC 多版本并发控制机制 文章目录 MVCC 多版本并发控制机制一:并发事务的场景1:读读场景2:写写场景3:读写 or 写读场景 二:MVCC机制综述1:MVCC日常生活的体现2:多版本并发控制 三:M…...
Autosar-Os是怎么运行的?(时间保护)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 AUTOSAR OS 的四大可定制类型凸显了时间保护(Timing Protection)…...
论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅
1.论文链接:Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要: 本章对概率图模型(PGMs)的最新进展进行了深入的回顾&…...
python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配
【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…...
视频脚本生成器(基于openai API和streamlit)
utils.py: # 所有和ai交互的代码放进utils.py里(utils 通常是 “utilities” 的缩写,意为 “实用工具” 或 “实用函数”)from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from lan…...
《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》
文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…...
【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作
1. 测试数据 mysql> select* from exam1; ----------------------------------------- | id | name | Chinese | Math | English | ----------------------------------------- | 1 | 唐三藏 | 67.0 | 98.0 | 56.0 | | 2 | 孙悟空 | 87.0 | 78.…...
AnyThingLLM本地私有知识库搭建
***************************************************** 环境准备 操作系统:Windows11 内存:32GB RAM 存储:预留 300GB 可用空间 显存: 16G 网络: 100M带宽 前置准备: 已安装ollama环境 deepseek本地大模型 ***************************…...
数仓ETL测试
提取,转换和加载有助于组织使数据在不同的数据系统中可访问,有意义且可用。ETL工具是用于提取,转换和加载数据的软件。在当今数据驱动的世界中,无论大小如何,都会从各种组织,机器和小工具中生成大量数据。 …...
leetcode——将有序数组转化为二叉搜索树(java)
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答…...
蓝桥杯模拟算法:多项式输出
P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题,我们需要分情况讨论,我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…...
新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用
在AI技术快速发展的今天,开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型,就在刚刚,凭一己之力让英伟达大跌18%,纳斯达克大跌3.7%,足足是给中国AI产…...
【张雪峰高考志愿填报】合集
【张雪峰高考志愿填报】合集 链接:https://pan.quark.cn/s/89a2d88fa807 高考结束,分数即将揭晓,志愿填报的关键时刻近在眼前!同学们,这可是人生的重要转折点,选对志愿,就像为未来铺就一条…...
【gRPC-gateway】option定义规则及HttpBody响应
HTTP Option 定义规则 在 .proto 文件中,通过 google.api.http 注解定义 HTTP 路由规则,控制请求参数映射 需要在.proto文件显式 import https://github.com/googleapis/googleapis/tree/master/google/api 一、HTTP Option 定义规则详解 1. 基础路由…...
rsync安装与使用-linux015
使用 rsync 可以非常高效地将文件或目录从一个服务器传输到另一个服务器。 能力: 支持 64 位文件、64 位 inode、64 位时间戳、64 位长整型支持套接字对、符号链接、符号链接时间、硬链接、硬链接特殊文件、硬链接符号链接支持 IPv6、访问时间(atimes&…...
一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例
论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…...
剑指 Offer II 011. 0 和 1 个数相同的子数组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20011.%200%20%E5%92%8C%201%20%E4%B8%AA%E6%95%B0%E7%9B%B8%E5%90%8C%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 011. 0 和 1 个数相同的子…...
games101-作业3
由于此次试验需要加载模型,涉及到本地环节,如果是windows系统,需要对main函数中的路径稍作改变: 这么写需要: #include "windows.h" 该段代码: #include "windows.h" int main(int ar…...
信息安全专业优秀毕业设计选题汇总:热点选题
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...
AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...
python——Django 框架
Django 框架 1、简介 Django 是用python语言写的开源web开发框架,并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能…...
SpringBoot基础概念介绍-数据源与数据库连接池
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…...
MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
介绍 在开发商品模块时,通常使用分表的方式进行查询以及关联。在通过表连接的方式进行查询。每个商品都有不同的分类,每个不同分类下面都有商品规格可以选择,每个商品分类对应商品规格都有自己的价格和库存。在实际的开发中应该给这些表进行…...
视频网站服务器为什么需要使用负载均衡?
随着视频网站等娱乐活动的逐渐增加,进行使用的用户数量也在不断上升,大量的用户会给视频网站行业带来一定的访问压力,需要处理大量的媒体资料,比如上传视频图片和数据保存发布等内容,会消耗大量的带宽资源,…...
Golang Gin系列-9:Gin 集成Swagger生成文档
文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…...
docker中运行的MySQL怎么修改密码
1,进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2,登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…...
智能汽车网络安全威胁报告
近年来随着智能汽车技术的快速发展,针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击,包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …...