iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
自我挑戰組

Laravel 讀碼源系列 第 24

美髮預約系統_users

  • 分享至 

  • xImage
  •  

現況,role 只是用來標示「這個人是誰、負責什麼職務」,方便在畫面上顯示、篩選、列印報表用,不牽涉到真正的登入攔截。適合目前只有自己一個人在後台操作、還不需要多人分權限使用的階段。

資料適合先插入 users → customers → staff → services → products → appointments → appointment_services → invoices → invoice_items → inventory_logs,因為預約、發票、庫存異動都依賴前面的主資料表。

這裡就先來介紹users的資料表

-- phpMyAdmin SQL Dump
-- version 5.2.3
-- https://www.phpmyadmin.net/
--
-- 主機: localhost:3306
-- 產生時間: 2026 年 09 月 02 日 13:30
-- 伺服器版本: 5.7.44
-- PHP 版本: 8.1.34

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- 資料庫: `laihao_Hairdressing`
--

-- --------------------------------------------------------

--
-- 資料表結構 `users`
--

CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `role` enum('admin','receptionist','stylist') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'receptionist',
  `status` enum('active','inactive') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active',
  `last_login_at` datetime DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- 傾印資料表的資料 `users`
--

INSERT INTO `users` (`id`, `name`, `email`, `password`, `role`, `status`, `last_login_at`, `created_at`, `updated_at`) VALUES
(1, '系統管理員', 'admin@beautysalon.com', '$2y$10$adminhashdemo', 'admin', 'active', '2026-04-08 08:30:00', '2026-08-22 02:52:35', '2026-08-22 02:52:35'),
(2, '櫃台小美', 'reception@beautysalon.com', '$2y$10$recepthashdemo', 'receptionist', 'active', '2026-04-08 09:00:00', '2026-08-22 02:52:35', '2026-08-22 02:52:35'),
(3, '設計師 Anna', 'anna@beautysalon.com', '$2y$10$annahashdemo', 'stylist', 'active', '2026-04-07 18:20:00', '2026-08-22 02:52:35', '2026-08-22 02:52:35'),
(4, '設計師 Kevin', 'kevin@beautysalon.com', '$2y$10$kevinhashdemo', 'stylist', 'active', '2026-04-07 19:10:00', '2026-08-22 02:52:35', '2026-08-22 02:52:35'),
(5, '店長 Mina', 'mina@beautysalon.com', '$2y$10$minahashdemo', 'admin', 'active', '2026-04-08 09:10:00', '2026-08-22 02:52:35', '2026-08-22 02:52:35'),
(7, 'tzu', 'sonia11@gmail.com', '$2y$10$ltSTxLIUVA6ToFupEpkKu.jDESsaSKtANhtjZ78a/By2.jqTRECSO', 'receptionist', 'inactive', NULL, '2026-08-26 15:02:06', '2026-08-26 15:02:06');

--
-- 已傾印資料表的索引
--

--
-- 資料表索引 `users`
--
ALTER TABLE `users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `users_email_unique` (`email`);

--
-- 在傾印的資料表使用自動遞增(AUTO_INCREMENT)
--

--
-- 使用資料表自動遞增(AUTO_INCREMENT) `users`
--
ALTER TABLE `users`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

解釋程式碼,跟美容系統的user資料表比較:

這段 SQL 在做什麼?

  • 標頭區段-- phpMyAdmin SQL Dump ...):只是註解,記錄匯出工具版本、主機、時間、伺服器與 PHP 版本,不影響執行。
  • 環境設定
    • SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 改變 AUTO_INCREMENT 行為。
    • START TRANSACTION; 開始交易,確保整段要嘛一起成功、要嘛一起失敗。
    • SET time_zone = "+00:00"; 設定時區。
    • 一連串 /*!40101 SET @OLD_... */ 是「條件式註解」,用來在執行前後恢復原本的 character set / collation 設定,避免匯入時影響全站設定。
  • 建表CREATE TABLE users (...)):定義欄位名稱、型別、是否可 NULL、預設值、字元集與排序規則(collation),以及引擎(InnoDB)。
  • 插入資料INSERT INTO users ...):把現有使用者寫進去,包含姓名、email、密碼雜湊、角色、狀態等。
  • 索引與主鍵ALTER TABLE ... ADD PRIMARY KEY / UNIQUE KEY):讓 id 為主鍵、email 為唯一值,避免重複帳號。
  • 自動遞增ALTER TABLE ... MODIFY id ... AUTO_INCREMENT):設定下次新增時 id 從哪個數字開始。
  • 結尾COMMIT; 與恢復字元集):提交交易並把字元集設定還原。 [

兩份 dump 的主要差異(Hairdressing vs SPA)

項目 laihao_Hairdressing laihao_SPA 意義與影響
資料庫名稱 laihao_Hairdressing laihao_SPA 兩個不同專案的 DB。
id 型別 bigint(20) UNSIGNED int(10) UNSIGNED Hairdressing 能容納更多使用者(上限更大)。
name 長度 varchar(100) varchar(50) Hairdressing 允許更長姓名。
email 長度 varchar(150) varchar(100) Hairdressing 對長 email 更寬容。
字元集/排序 utf8mb4 + utf8mb4_unicode_ci(明確指定) utf8mb4(未指定 collation) Hairdressing 明確用 Unicode 排序規則;SPA 會用伺服器/資料庫預設 collation。
remember_token 無此欄位 varchar(100) DEFAULT NULL SPA 支援 Laravel 的「記住我」功能(remember me)。
時間欄位預設 created_at / updated_attimestamp 且帶 DEFAULT CURRENT_TIMESTAMP / ON UPDATE datetime 且預設 NULL Hairdressing 會自動填/更新時間;SPA 需要應用層(例如 Laravel model)來維護。
唯一索引名稱 users_email_unique uk_users_email 只是命名習慣不同,功能相同(email 唯一)。
預設角色 DEFAULT 'receptionist' DEFAULT 'stylist' 新增使用者時的預設角色不同。
資料內容 美髮沙龍角色(設計師、櫃台、店長) 美容 SPA 角色(美容師、前台、助理) 業務情境不同。
AUTO_INCREMENT 起點 AUTO_INCREMENT=8 AUTO_INCREMENT=6 反映目前最大 id 不同。

關於 utf8mb4utf8mb4_unicode_ci

  • utf8mb4 是 MySQL 中「真正的 UTF‑8」,支援最多 4 位元組,能存表情符號與更多 Unicode 字元;舊的 utf8 只到 3 位元組。 cloud.tencent
  • utf8mb4_unicode_ci 是基於 Unicode 標準的排序規則,多語言排序更精確(例如德文 ß 會等同於 ss);_ci 代表大小寫不敏感。
  • 新專案通常建議:字元集用 utf8mb4,collation 視 MySQL 版本選 utf8mb4_unicode_ci(5.7 相容)或 utf8mb4_0900_ai_ci(8.0 預設)。

為什麼密碼要轉成 bcrypt($2y$...)?

兩份 dump 的 password 欄位都是類似 $2y$10$... 的字串,這是 bcrypt 雜湊值,不是明文密碼。

  • 安全性:bcrypt 是專為密碼設計的單向雜湊演算法,無法逆向還原成原始密碼;就算資料庫被盜,攻擊者也無法直接拿到明文密碼。
  • 可調整成本(work factor):bcrypt 的雜湊成本可以調高(例如從 10 调到 12),讓每次雜湊更花時間,從而提高暴力破解的成本;隨著硬體變強,只要提高成本即可維持安全。
  • 內建鹽值(salt):bcrypt 會在雜湊時自動產生並嵌入 salt,因此同樣密碼也會產生不同雜湊值,避免彩虹表攻擊。
  • Laravel 慣例:Laravel 的 Hash facade 預設使用 bcrypt(或 Argon2),註冊/重設密碼時應使用 Hash::make($password) 產生雜湊,登入驗證用 Hash::check($plain, $hash)。 [

如果你要從舊系統遷移使用者到 Laravel,常見做法是:先用 Hash::make() 產生一次 bcrypt 雜湊寫入 password 欄位;或保留舊雜湊,在首次登入時驗證成功後再以 Hash::make() 重新儲存為 bcrypt。

之後還有MVC的內容~明天見


上一篇
美髮預約系統_起手式
系列文
Laravel 讀碼源24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言