目录

  1. 第一步:环境准备与项目创建
  2. 第二步:数据库设计与配置
  3. 第三步:后台布局与模板搭建
  4. 第四步:用户认证与登录功能
  5. 第五步:构建后台核心 - CRUD 功能
  6. 第六步:整合 RBAC 权限管理 (进阶)
  7. 总结与资源推荐

第一步:环境准备与项目创建

  1. 环境要求:

    thinkphp教程后台管理模板admin
    (图片来源网络,侵删)
    • PHP 7.2.5+
    • Composer (PHP 依赖管理工具)
    • Web 服务器 (Nginx 或 Apache)
    • MySQL 5.7+
  2. 创建 ThinkPHP 项目: 打开终端,使用 Composer 创建一个新的 ThinkPHP 项目,我们选择 0 版本,它更现代,但 0 的流程也基本一致。

    # 创建一个名为 myadmin 的新项目
    composer create-project topthink/think myadmin
  3. 项目结构: 进入项目目录,你会看到类似这样的结构:

    myadmin/
    ├── app/              # 应用目录
    ├── config/           # 配置文件目录
    ├── extend/           # 扩展类库目录
    ├── public/           # Web 访问入口目录
    ├── route/            # 路由定义目录
    ├── runtime/          # 运行时目录 (日志、缓存等)
    ├── vendor/           # Composer 依赖目录
    └── ... (其他文件)

第二步:数据库设计与配置

一个后台管理系统至少需要两张核心表:管理员表权限表

  1. 创建数据库和表: 在你的 MySQL 数据库中创建一个数据库,thinkphp_admin,然后执行以下 SQL 语句:

    thinkphp教程后台管理模板admin
    (图片来源网络,侵删)

    管理员表 (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 字段用于构建无限级菜单。
  2. 配置数据库连接: 修改 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教程后台管理模板admin
(图片来源网络,侵删)
  1. 安装模板引擎: ThinkPHP 默认使用 think-templating 模板引擎,如果需要,你也可以安装其他引擎,如 Twig,这里我们使用默认的。

  2. 创建布局文件: 在 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 (底部