1.前言
本項(xiàng)目中,用戶新增是通過用戶自己注冊得來的,因此本章節(jié)將注冊/登錄放到用戶模塊來講。
本模塊功能包括:
- 注冊/登錄
- 收貨地址
2. 功能分析
拿到需求,首先是看產(chǎn)品原型,了解清楚需求,想好了,再去做表設(shè)計(jì),最后才動(dòng)手寫代碼。
2.1 注冊/登錄
2.1.1 需求分析
根據(jù)課程中的介紹及效果頁面,我們可以了解到,該功能的需求歸納為以下幾點(diǎn):
- 用戶注冊需提供:用戶名、郵箱、密碼、確認(rèn)密碼;
- 注冊時(shí),需驗(yàn)證郵箱;
- 注冊完成后,郵箱和密碼將作為登錄的賬號和密碼使用;
附功能效果圖如下:

注冊-效果圖

登錄-效果圖

忘記密碼-效果圖
2.1.2 表設(shè)計(jì)
在表設(shè)計(jì)之前要先想好功能的實(shí)現(xiàn)邏輯。
- 實(shí)現(xiàn)邏輯
課程中采用的是laravel自帶的用戶認(rèn)證功能實(shí)現(xiàn)注冊登錄驗(yàn)證和自帶的verified中間件 實(shí)現(xiàn)郵件驗(yàn)證的功能。其中,驗(yàn)證郵箱的實(shí)現(xiàn)邏輯是,用一個(gè)字段保存用戶是否已經(jīng)通過驗(yàn)證,通過中間件攔截請求跳轉(zhuǎn)到驗(yàn)證頁面。 - 表設(shè)計(jì)
我們在思考程序該實(shí)現(xiàn)時(shí),通常把表結(jié)構(gòu)也想了個(gè)大概,用哪些字段,這些字段有什么用處,把這些搞清楚之后,表設(shè)計(jì)就很簡單了。
在用戶表中,需要保存郵箱、密碼用作登錄校驗(yàn);需要一個(gè)字段標(biāo)識(shí)該用戶郵箱是否通過驗(yàn)證;郵箱作為用戶驗(yàn)證的唯一標(biāo)識(shí),設(shè)置為唯一鍵。
另外,還有其他一些看起來不重要但實(shí)際很需要的字段,例如注冊時(shí)間,我們在做表設(shè)計(jì)時(shí)盡量要考慮長遠(yuǎn)一點(diǎn),有一些字段我們在前期需求中沒有用到,但很可能以后運(yùn)營會(huì)需要用到,比如用戶的注冊時(shí)間,等項(xiàng)目運(yùn)營起來有一定用戶量以后,需要做運(yùn)營分析,想要知道一段時(shí)間內(nèi)用戶的增長情況,在這種情況下,你可以懟PM沒有事先說明,但鍋還是你背。
具體的表結(jié)構(gòu)如下:
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, # 郵件驗(yàn)證時(shí)間
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 密碼,用于用戶身份驗(yàn)證
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, # 登錄成功后系統(tǒng)分配給用戶的token,用于免密登錄(記住密碼)
`created_at` timestamp NULL DEFAULT NULL, # 創(chuàng)建時(shí)間,用戶的注冊時(shí)間
`updated_at` timestamp NULL DEFAULT NULL, # 更新時(shí)間
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.1.3 代碼借鑒
注冊登錄用的laravel自帶的auth,操作簡單,可以了解一下其內(nèi)部實(shí)現(xiàn)方式laravel Auth原理淺析。
2.2 收貨地址
2.2.1 需求分析
收貨地址是屬于用戶的一種屬性,在購買商品選擇收貨地址時(shí)會(huì)用到。具體需求歸納如下:
- 為了保證商品的順利送達(dá),收件人的信息應(yīng)盡可能詳盡,包括收件人姓名、聯(lián)系方式和詳細(xì)地址;
- 考慮到用戶習(xí)慣,常用的收件地址變動(dòng)少,將收獲地址按上次使用時(shí)間排序(X寶是設(shè)置了默認(rèn)收獲地址);

收貨地址-效果圖
2.2.2 表設(shè)計(jì)
- 實(shí)現(xiàn)邏輯
收獲地址的功能很簡單,就是增刪改查。顯示的時(shí)候按照最近使用時(shí)間排個(gè)序就好了。 - 表設(shè)計(jì)
根據(jù)前面的需求分析,可知,用戶收獲地址這張表也很簡單,只需要保存收件人信息,關(guān)聯(lián)用戶id就好了。在表設(shè)計(jì)方面,收獲地址中的省-市-區(qū),方便配合前端做三級聯(lián)動(dòng),當(dāng)然你也可以合并成一個(gè)字段保存,省市區(qū)中間用一個(gè)字符隔開,用的時(shí)候再分割;用了一個(gè)last_used_at字段保存該地址的最近使用時(shí)間;另外,用戶ID這里是做了聯(lián)級刪除的外鍵關(guān)聯(lián)的。
具體表結(jié)構(gòu)如下:
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, # 收貨地址-區(qū)
`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, # 聯(lián)系人姓名
`contact_phone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, # 聯(lián)系人電話
`last_used_at` datetime DEFAULT NULL, # 最后一次使用時(shí)間
`created_at` timestamp NULL DEFAULT NULL, # 創(chuàng)建時(shí)間
`updated_at` timestamp NULL DEFAULT NULL, # 更新時(shí)間
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 代碼借鑒
這一節(jié)的需求和實(shí)現(xiàn)都比較簡單,但是有一些比較好的編碼習(xí)慣可以學(xué)習(xí),例如:
- 用授權(quán)策略來做權(quán)限控制;
- 新建專門的 Request 類做校驗(yàn);