一、用户管理模块设计及实现
1.1 与用户管理需求
对于任何一个管理系统,用户管理功能都是必不可少的。通常,在使用系统之前,用户需要先注册。在使用过程中,往往还存在修改需求,如修改个人联系方式、收货地址等。
在线书店管理系统中主要有两类用户——普通用户和管理员。
-
普通用户的操作包括用户注册、用户登录、用户退出和用户个人信息修改等。
-
管理员的操作包括用户登录、用户退出和用户管理(包括新增普通用户、对普通用户的信息进行编辑和删除普通用户)等。
我们将实现用户注册、用户登录和用户管理等功能。
普通用户在首次使用系统之前,需要注册,建立个人账户,此时需要提供必要的个人信息,如登录账号、密码、全名、电话、收货地址等,以便完成图书的支付和购买流程。普通用户注册流程如下图所示。
用户登录系统,输入用户名和密码后,系统会验证用户角色,因为系统需要知道此时登录的用户是管理员还是普通用户。若系统验证其为普通用户,则进入普通用户登录后的页面;若是管理员,则进入管理员管理页面;否则,系统提示用户名或密码错误的信息。用户登录流程如下图所示。
本系统有两种角色,一种是管理员,二种是普通用户。管理员可以新增和删除普通用户,并且可以对普通用户的信息进行编辑。用户管理流程如下图:
1.2 接口需求分析
针对用户管理要求,我们定义如下接口。
-
用户注册接口。
-
接口名称:/registration
-
接口参数:User类的对象
-
返回类型:若注册成功,则返回/login页面;否则,返回registration(注册)页面。
-
用户信息查询接口。
-
接口名称:/profile。利用GET方式获取用户信息。
-
接口参数:用户信息。
-
返回类型:若查询到用户信息,则返回/profile页面。
-
用户信息编辑接口。
-
接口名称:/users/edit/{userId}。
-
接口参数:User类的对象。
-
返回类型:若用户信息修改成功,则返回修改后信息的/profile页面。
-
用户添加接口。
-
接口名称:/user/add。利用POST方式添加用户信息。
-
接口参数:User类的对象。
-
返回类型:若用户添加成功,则返回/addUser页面。
-
用户删除接口
-
接口名称:/users/delete/{userId}。利用DELETE方式删除用户。
-
接口参数:userId(用户ID)。
-
返回类型:返回用户列表(showAllUsers)页面。
1.3 后端设计及编码
本节介绍用户域模型设计、Repository实现、用户服务接口实现和控制层实现。
1.编写User类
- userId:用户ID,自动生成的主键。
- userName:用户名,长度在1到50之间。
- userPassword:用户密码,最大长度为60。
- userFullname:用户全名,最大长度为50。
- userPhone:用户电话,最大长度为50。
- userAddress:用户地址,最大长度为120。
- userBankcard:用户银行卡号,最大长度为80。
该用户类还与另一个实体类Roles之间存在多对多的映射关系。每个用户可以拥有多个角色。
该类提供了构造函数、getter和setter方法,并重写了equals()和hashCode()方法
2.编写Roles实体
这是一个使用Java编写的角色实体类。根据代码可以看出,该类使用了@Data
、@Entity
和@Table
注解来标识它是一个数据实体类,并且与数据库中的"roles"表进行映射。
其中,@Id
注解表示该属性是表的主键,@Column
注解指定了映射到数据库中的列名。
该类有一个属性rolename
,它是一个字符串类型的变量,用于表示角色名称。
另外,该类实现了Serializable
接口,表示该类的对象可以被序列化。
3.Order实体
这段代码是一个简单的 Java 实体类,用于描述一个订单对象。它使用了 JPA(Java Persistence API)注解来映射到数据库表中的字段。下面是每个字段的解释:
orderid
:订单 ID,使用@Id
注解标记为主键,并使用@GeneratedValue
指定自增长策略。userId
:用户 ID,使用@NotNull
注解标记为非空字段,表示该订单必须关联到一个用户。orderdate
:订单日期,使用@NotNull
注解标记为非空字段,表示该订单必须有一个有效的日期。status
:订单状态,使用@Column
注解指定该字段在数据库表中的列名,并设置nullable=false
表示该字段不允许为空。totalprice
:订单总价,使用@Column
注解指定该字段在数据库表中的列名,并设置precision=5
和scale=1
表示该字段最多可以存储 5 位数字,其中小数部分最多为 1 位。
该实体类包含一个默认构造函数和一个带参数的构造函数,用于创建新的订单对象。该类还实现了 Serializable
接口,以便在网络传输或保存到文件系统中时可以进行序列化。
4.用户Repository接口
5.RolesRepository接口
6.OrderRepository接口
1.3 用户服务接口实现
这是一个用户服务类(UserService),用于处理与用户相关的业务逻辑。该类使用了自动装配注解@Autowired来注入依赖的三个仓库类:UserRepository、RolesRepository和OrderRepository。
该类提供了以下方法:
-
findByUserName(String userName):通过用户名查找用户。
-
registerUser(User user):注册用户。该方法创建一个新的用户对象,将传入的用户信息设置到新用户对象中,并对密码进行加密处理。然后将新用户保存到数据库中。
-
updateUser(User user):更新用户信息。该方法根据传入的用户ID查找数据库中对应的用户对象,然后更新用户的全名、地址、电话和银行卡号,并将更新后的用户保存到数据库中。
-
findAllUsers():查找所有用户信息。该方法返回数据库中所有的用户对象列表。
-
findUserById(Long userId):通过用户ID查找用户。
-
deleteUserById(Long userId):通过用户ID删除用户。
-
getUserOrderAmount(Long userId):查询用户对应的订单数量。该方法根据用户ID查找数据库中该用户的订单列表,并返回订单的数量。如果订单列表为空,则返回0。
请注意,这些方法依赖于三个仓库类(UserRepository、RolesRepository和OrderRepository),你需要确保这些仓库类已经正确地实现并配置了相应的数据库操作。
1.3.1 用户控制层实现
这段代码是一个 UserService 类,用于处理用户相关的业务逻辑。它使用了 Spring Framework 的注解来实现依赖注入,其中涉及到三个仓库类:UserRepository、RolesRepository 和 OrderRepository。
下面是每个方法的功能解释:
findByUserName(String userName)
:通过用户名查找用户。调用userRepository.findByUserName(userName)
方法来查询数据库中对应的用户信息,并返回 User 对象。registerUser(User user)
:注册用户。创建一个新的 User 对象,并设置用户名、加密后的密码、全名、电话、地址和银行卡等信息。通过rolesRepository.findById("ROLE_USER")
方法查找到 "ROLE_USER" 角色信息,并将其添加到新用户的角色集合中。最后调用userRepository.save(newUser)
方法保存用户信息,并返回新创建的 User 对象。updateUser(User user)
:更新用户信息。通过用户ID从数据库中查找到对应的用户对象,并更新其全名、地址、电话和银行卡等信息。最后调用userRepository.save(updateUser)
方法保存更新后的用户信息。findAllUsers()
:查找所有用户信息。调用userRepository.findAll()
方法返回数据库中所有用户的列表。findUserById(Long userId)
:通过用户ID查找用户。调用userRepository.findById(userId).get()
方法根据用户ID从数据库中查找对应的用户信息,并返回 User 对象。deleteUserById(Long userId)
:通过用户ID删除用户。调用userRepository.deleteById(userId)
方法根据用户ID从数据库中删除对应的用户信息。getUserOrderAmount(Long userId)
:查询用户对应的订单数量。调用orderRepository.findByUserId(userId)
方法根据用户ID从数据库中查找对应的订单信息,并返回订单数量。
这个 UserService 类封装了与用户相关的操作,通过调用 UserRepository 和 OrderRepository 实现对用户数据和订单数据的访问和操作。