01 用户模块
2019-08-04 本文已影响13人
阳光的小mi
1.前言
本项目中,用户新增是通过用户自己注册得来的,因此本章节将注册/登录
放到用户模块来讲。
本模块功能包括:
- 注册/登录
- 收货地址
2. 功能分析
拿到需求,首先是看产品原型,了解清楚需求,想好了,再去做表设计,最后才动手写代码。
2.1 注册/登录
2.1.1 需求分析
根据课程中的介绍及效果页面,我们可以了解到,该功能的需求归纳为以下几点:
- 用户注册需提供:用户名、邮箱、密码、确认密码;
- 注册时,需验证邮箱;
- 注册完成后,邮箱和密码将作为登录的账号和密码使用;
附功能效果图如下:
注册-效果图 登录-效果图 忘记密码-效果图
2.1.2 表设计
在表设计之前要先想好功能的实现逻辑。
- 实现逻辑
课程中采用的是laravel
自带的用户认证功能实现注册登录验证和自带的verified
中间件 实现邮件验证的功能。其中,验证邮箱的实现逻辑是,用一个字段保存用户是否已经通过验证,通过中间件拦截请求跳转到验证页面。 - 表设计
我们在思考程序该实现时,通常把表结构也想了个大概,用哪些字段,这些字段有什么用处,把这些搞清楚之后,表设计就很简单了。
在用户表中,需要保存邮箱、密码用作登录校验;需要一个字段标识该用户邮箱是否通过验证;邮箱作为用户验证的唯一标识,设置为唯一键。
另外,还有其他一些看起来不重要但实际很需要的字段,例如注册时间,我们在做表设计时尽量要考虑长远一点,有一些字段我们在前期需求中没有用到,但很可能以后运营会需要用到,比如用户的注册时间,等项目运营起来有一定用户量以后,需要做运营分析,想要知道一段时间内用户的增长情况,在这种情况下,你可以怼PM没有事先说明,但锅还是你背。
具体的表结构如下:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增id
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 用户名
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 邮件
`email_verified_at` timestamp NULL DEFAULT NULL, # 邮件验证时间
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 密码,用于用户身份验证
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, # 登录成功后系统分配给用户的token,用于免密登录(记住密码)
`created_at` timestamp NULL DEFAULT NULL, # 创建时间,用户的注册时间
`updated_at` timestamp NULL DEFAULT NULL, # 更新时间
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.1.3 代码借鉴
注册登录用的laravel自带的auth,操作简单,可以了解一下其内部实现方式laravel Auth原理浅析。
2.2 收货地址
2.2.1 需求分析
收货地址是属于用户的一种属性,在购买商品选择收货地址时会用到。具体需求归纳如下:
- 为了保证商品的顺利送达,收件人的信息应尽可能详尽,包括收件人姓名、联系方式和详细地址;
- 考虑到用户习惯,常用的收件地址变动少,将收获地址按上次使用时间排序(X宝是设置了默认收获地址);
2.2.2 表设计
- 实现逻辑
收获地址的功能很简单,就是增删改查。显示的时候按照最近使用时间排个序就好了。 - 表设计
根据前面的需求分析,可知,用户收获地址这张表也很简单,只需要保存收件人信息,关联用户id就好了。在表设计方面,收获地址中的省-市-区,方便配合前端做三级联动,当然你也可以合并成一个字段保存,省市区中间用一个字符隔开,用的时候再分割;用了一个last_used_at
字段保存该地址的最近使用时间;另外,用户ID这里是做了联级删除的外键关联的。
具体表结构如下:
CREATE TABLE `user_addresses` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, # 自增ID
`user_id` int(10) unsigned NOT NULL, # 所属用户id
`province` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 收货地址-省
`city` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 收货地址-市
`district` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 收货地址-区
`address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 收获地址-具体地址
`zip` int(10) unsigned NOT NULL, # 邮编
`contact_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 联系人姓名
`contact_phone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 联系人电话
`last_used_at` datetime DEFAULT NULL, # 最后一次使用时间
`created_at` timestamp NULL DEFAULT NULL, # 创建时间
`updated_at` timestamp NULL DEFAULT NULL, # 更新时间
PRIMARY KEY (`id`),
KEY `user_addresses_user_id_foreign` (`user_id`),
CONSTRAINT `user_addresses_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.2.3 代码借鉴
这一节的需求和实现都比较简单,但是有一些比较好的编码习惯可以学习,例如:
- 用授权策略来做权限控制;
- 新建专门的 Request 类做校验;