目录
- 第一步:环境准备与项目创建
- 第二步:数据库设计与配置
- 第三步:后台布局与模板搭建
- 第四步:用户认证与登录功能
- 第五步:构建后台核心 - CRUD 功能
- 第六步:整合 RBAC 权限管理 (进阶)
- 总结与资源推荐
第一步:环境准备与项目创建
-
环境要求:
(图片来源网络,侵删)- PHP 7.2.5+
- Composer (PHP 依赖管理工具)
- Web 服务器 (Nginx 或 Apache)
- MySQL 5.7+
-
创建 ThinkPHP 项目: 打开终端,使用 Composer 创建一个新的 ThinkPHP 项目,我们选择
0版本,它更现代,但0的流程也基本一致。# 创建一个名为 myadmin 的新项目 composer create-project topthink/think myadmin
-
项目结构: 进入项目目录,你会看到类似这样的结构:
myadmin/ ├── app/ # 应用目录 ├── config/ # 配置文件目录 ├── extend/ # 扩展类库目录 ├── public/ # Web 访问入口目录 ├── route/ # 路由定义目录 ├── runtime/ # 运行时目录 (日志、缓存等) ├── vendor/ # Composer 依赖目录 └── ... (其他文件)
第二步:数据库设计与配置
一个后台管理系统至少需要两张核心表:管理员表 和 权限表。
-
创建数据库和表: 在你的 MySQL 数据库中创建一个数据库,
thinkphp_admin,然后执行以下 SQL 语句:
(图片来源网络,侵删)管理员表 (
admin_users)CREATE TABLE `admin_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(255) NOT NULL COMMENT '密码 (存储加密后的哈希值)', `nickname` varchar(32) DEFAULT NULL COMMENT '昵称', `avatar` varchar(255) DEFAULT NULL COMMENT '头像', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 (1:正常, 0:禁用)', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 注意:
password字段长度要足够长,因为我们会存储password_hash()生成的哈希值。
权限表 (
admin_permissions)CREATE TABLE `admin_permissions` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL COMMENT '权限名称 (如: user.create)', `title` varchar(32) NOT NULL COMMENT '权限标题 (如: 新增用户)', `icon` varchar(32) DEFAULT NULL COMMENT '菜单图标', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 (1:显示, 0:隐藏)', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
pid字段用于构建无限级菜单。
- 注意:
-
配置数据库连接: 修改
config/database.php文件,填入你的数据库信息。// config/database.php return [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 自定义时间查询规则 'time_query_rule' => [], // 自动写入时间戳字段 'auto_timestamp' => true, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 数据库连接配置信息 'connections' => [ 'mysql' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => env('database.hostname', '127.0.0.1'), // 数据库名 'database' => env('database.database', 'thinkphp_admin'), // 用户名 'username' => env('database.username', 'root'), // 密码 'password' => env('database.password', 'root'), // 端口 'hostport' => env('database.hostport', '3306'), // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8mb4', // 数据库表前缀 'prefix' => '', // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 是否需要断线重连 'break_reconnect' => false, // 监听SQL 'trigger_sql' => env('app_debug', true), // 开启字段缓存 'fields_cache' => false, ], ], ];
第三步:后台布局与模板搭建
后台的通用布局通常包含:顶部导航栏、左侧菜单栏、主要内容区、底部页脚。

(图片来源网络,侵删)
-
安装模板引擎: ThinkPHP 默认使用
think-templating模板引擎,如果需要,你也可以安装其他引擎,如Twig,这里我们使用默认的。 -
创建布局文件: 在
app/view/目录下创建一个layout文件夹,用于存放布局模板。app/view/layout/header.html(头部)<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{block name="title"}ThinkPHP Admin{/block}</title> <!-- 引入 CSS 文件, 如 Bootstrap, Font Awesome 等 --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="/static/css/admin.css"> </head> <body> <!-- 顶部导航栏 --> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a class="navbar-brand" href="#">MyAdmin</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav ms-auto"> <!-- 用户信息下拉菜单 --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown"> {$Think.session.admin_user.nickname|default=$Think.session.admin_user.username} </a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="#">个人信息</a></li> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item" href="{:url('auth/logout')}">退出登录</a></li> </ul> </li> </ul> </div> </div> </nav>app/view/layout/footer.html(底部
