SpringBoot-项⽬1-⽤户(注册,登录,修改密码,修改个⼈资料,上传头像)1. 项⽬分析
在设计⼀款软件时,在编写代码之前,应该先分析这个项⽬中需要处理哪些类型的数据!例如,本项⽬中需要处理的数据种类有:收藏,购物车,⽤户,收货地址,订单,商品,商品类别。
当确定了需要处理的数据的种类之后,就应该确定这些数据的处理先后顺序:⽤户 > 收货地址 > 商品类别 > 商品 > 收藏 > 购物车 > 订单。
在具体开发某个数据的管理功能之前,还应该分析该数据需要开发哪些管理功能,以⽤户数据为例,需要开发的有:修改密码,上传头像,修改资料,登录,注册。
分析出功能之后,也需要确定这些功能的开发顺序,⼀般先开发简单的,也依据增、查、删、改的顺序,则以上功能的开发顺序应该是:注册 > 登录 > 修改密码 > 修改资料 > 上传头像。
在开发某个数据的任何功能之前,还应该先创建这种数据对应的数据表,然后,创建对应的实体类,再开发某个功能!
在开发某个功能时,还应该遵循顺序:持久层(数据库编程) > 业务层 > 控制器层 > 前端页⾯。
2. ⽤户-创建数据表
先创建数据库:
CREATE DATABASE db_store;
USE db_store;
然后,在数据库中创建数据表:
CREATE TABLE t_user (
uid INT AUTO_INCREMENT COMMENT '⽤户id',
username VARCHAR(20) UNIQUE NOT NULL COMMENT '⽤户名',
password CHAR(32) NOT NULL COMMENT '密码',
salt CHAR(36) COMMENT '盐值',
gender INT(1) COMMENT '性别:0-⼥,1-男',
phone VARCHAR(20) COMMENT '⼿机号码',
email VARCHAR(50) COMMENT '电⼦邮箱',
avatar VARCHAR(100) COMMENT '头像',
is_delete INT(1) COMMENT '是否删除:0-否,1-是',
created_user VARCHAR(20) COMMENT '创建⼈',
created_time DATETIME COMMENT '创建时间',
modified_user VARCHAR(20) COMMENT '最后修改⼈',
modified_time DATETIME COMMENT '最后修改时间',
PRIMARY KEY (uid)
) DEFAULT CHARSET=utf8mb4;
完成后,可以通过desc t_user;和show create table t_user;进⾏查看。
3. ⽤户-创建实体类
在src/main/java下,在现有的cn.demo.store包中,创建⼦级entity包,⽤于存放实体类,先在entity包中创建所有实体类的基类:
* 实体类的基类
*/
abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = -3122958702938259476L;
private String createdUser;
private Date createdTime;
private String modifiedUser;
private Date modifiedTime;
// ⾃⾏添加SET/GET⽅法,toString()
}
并在entity包中创建User类,继承⾃以上基类:
/**
* ⽤户数据的实体类
*/
public class User extends BaseEntity {
private static final long serialVersionUID = -3302907460554699349L;
private Integer uid;
private String username;
private String password;
private String salt;
private Integer gender;
private String phone;
private String email;
private String avatar;
private Integer isDelete;
// ⾃⾏添加SET/GET⽅法,基于uid的equals()和hashCode()⽅法,toString()⽅法
}
4. ⽤户-注册-持久层
持久层:持久化保存数据的层。
刚创建好的SpringBoot项⽬,由于添加了数据库相关的依赖,在没有配置数据库连接信息之前,将⽆法启动!所以,应该先在application.properties中添加配置:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/db_store?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mappers/*.xml
然后,在cn.demo.store包中,创建mapper⼦级包,⽤于存放使⽤MyBatis编程时的接⼝⽂件,并在mapper包中创建UserMapper接⼝,在接⼝中添加抽象⽅法:
* 处理⽤户数据的持久层接⼝
*/
public interface UserMapper {
/**
* 插⼊⽤户数据
* @param user ⽤户数据
* @return 受影响的⾏数
*/
Integer insert(User user);
/**
* 根据⽤户名查询⽤户数据
* @param username ⽤户名
* @return 匹配的⽤户数据,如果没有匹配的数据,则返回null
*/
User findByUsername(String username);
}
然后,需要在启动类的声明之前补充@MapperScan注解,以配置接⼝⽂件的位置:
@SpringBootApplication
@MapperScan("cn.demo.store.mapper")
public class StoreApplication {
public static void main(String[] args) {
SpringApplication.run(StoreApplication.class, args);
}
springboot框架的作用}
在src/main/resources下创建mappers⽂件夹,该⽂件夹的名称应该与复制的配置信息中保持⼀致!并在该⽂件夹中创建l⽂件,以配置2个抽象⽅法的SQL映射:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/ibatis-3-mapper.dtd">
<mapper namespace="cn.demo.store.mapper.UserMapper">
<resultMap type="cn.ity.User" id="UserEntityMap">
<id column="uid" property="uid"/>
<result column="is_delete" property="isDelete"/>
<result column="created_user" property="createdUser"/>
<result column="created_time" property="createdTime"/>
<result column="modified_user" property="modifiedUser"/>
<result column="modified_time" property="modifiedTime"/>
</resultMap>
<!-- 插⼊⽤户数据 -->
<!-- Integer insert(User user); -->
<insert id="insert" useGeneratedKeys="true" keyProperty="uid">
INSERT INTO t_user (
username, password, salt, gender,
phone, email, avatar, is_delete,
created_user, created_time, modified_user, modified_time
) VALUES (
#{username}, #{password}, #{salt}, #{gender},
#{phone}, #{email}, #{avatar}, #{isDelete},
#{createdUser}, #{createdTime}, #{modifiedUser}, #{modifiedTime}
)
</insert>
<!-- 根据⽤户名查询⽤户数据 -->
<!-- User findByUsername(String username) -->
<select id="findByUsername" resultMap="UserEntityMap">
SELECT * FROM t_user WHERE username=#{username}
</select>
</mapper>
在src/test/java中的cn.demo.store包中创建⼦级的mapper包,并在mapper包中创建UserMapperTests测试类,并在测试类的声明之前添加@RunWith(SpringRunner.class)和@SpringBootTest注解:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTests {
}
如果使⽤的是SpringBoot 2.2.x系列的版本,只需要添加1个注解即可,具体使⽤什么样的注解,请参考默认就存在那个单元测试类。
然后,在单元测试类中编写并执⾏单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTests {
@Autowired
private UserMapper mapper;
@Test
public void insert() {
User user = new User();
user.setUsername("project");
user.setPassword("1234");
user.setSalt("salt");
user.setGender(0);
user.setPhone("138********");
user.setEmail("project@163");
user.setAvatar("avatar");
user.setIsDelete(0);
user.setCreatedUser("系统管理员");
user.setCreatedTime(new Date());
user.setModifiedUser("超级管理员");
user.setModifiedTime(new Date());
Integer rows = mapper.insert(user);
}
@Test
public void findByUsername() {
String username = "project";
User result = mapper.findByUsername(username);
}
}
5. ⽤户-注册-业务层
业务,在普通⽤户眼⾥就是“1个功能”,例如“注册”就是⼀个业务,在开发⼈员看来,它可能是由多个数据操作所组成的,例如“注册”就⾄少由“查询⽤户名对应的⽤户数据”和“插⼊⽤户数据”这2个数据操作组成,多个数据操作组成1个业务,在组织过程中,可能涉及⼀些相关的检查,及数据安全、数据完整性的保障,所以,业务层的代码主要是组织业务流程,设计业务逻辑,以保障数据的完整性和安全性。
在开发领域中,数据安全指的是:数据是由开发⼈员所设定的规则⽽产⽣或发⽣变化的!
在业务层的开发中,应该先创建业务层的接⼝,因为,在实际项⽬开发中,强烈推荐“使⽤接⼝编程”的效果!
所以,先在cn.demo.store包中创建service⼦包,并在service包中创建UserService业务接⼝,并在接⼝中声明“注册”这个业务的抽象⽅法:
/**
* 处理⽤户数据的业务接⼝
*/
public interface UserService {
/**
* ⽤户注册
* @param user 客户端提交的⽤户数据
*/
void reg(User user);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。