現況,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資料表比較:
-- 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; 與恢復字元集):提交交易並把字元集設定還原。 [| 項目 | 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_at 用 timestamp 且帶 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 不同。 |
utf8mb4 與 utf8mb4_unicode_ciutf8mb4 是 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 預設)。$2y$...)?兩份 dump 的 password 欄位都是類似 $2y$10$... 的字串,這是 bcrypt 雜湊值,不是明文密碼。
Hash facade 預設使用 bcrypt(或 Argon2),註冊/重設密碼時應使用 Hash::make($password) 產生雜湊,登入驗證用 Hash::check($plain, $hash)。 [Hash::make() 產生一次 bcrypt 雜湊寫入 password 欄位;或保留舊雜湊,在首次登入時驗證成功後再以 Hash::make() 重新儲存為 bcrypt。之後還有MVC的內容~明天見