🚀个人学习日志

从零搭建一个完整的管理平台,涵盖 PHP + MySQL + Layui 全栈实战

8
学习模块
4
数据库记录
4
核心页面
100%
完成度

一、项目概览与环境搭建

本项目是一个 人员管理系统,用于用户信息的采集、存储、查询和删除。技术栈如下:

PHP 8.x MySQL 5.7+ Layui 2.x 原生 HTML/CSS Apache / Nginx

目录结构

// 项目根目录
realname/
├── config/
│   └── database.php        // 数据库连接配置
├── public/                 // 入口文件目录(对外暴露)
│   ├── index.php           // 数据管理页(Layui 表格)
│   ├── login.php           // 用户登录
│   ├── register.php        // 用户注册
│   ├── study.php           // 学习笔记(当前页)
│   └── static/layui/       // Layui 静态资源
└── views/                  // 视图模板目录(不对外暴露)
    ├── index.php
    ├── login.php
    ├── register.php
    └── study.php

💡 设计思想:采用简单的 MVC 分层 —— public/ 负责逻辑处理(Controller),views/ 负责页面渲染(View),config/ 管理数据库连接(Model 层简化)。

二、数据库设计

使用 MySQL,数据库名为 realname,核心表 users 结构如下:

-- users 表结构
CREATE TABLE users (
    id         INT AUTO_INCREMENT PRIMARY KEY,
    username   VARCHAR(50)  NOT NULL  -- 用户名
    mobile     VARCHAR(20)  NOT NULL  -- 手机号
    password   VARCHAR(255) NOT NULL  -- 密码
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 注册时间
);

数据库连接

config/database.php 中使用 mysqli 扩展连接:

// config/database.php
$conn = new mysqli(
    "localhost",   // 主机
    "root",        // 用户名
    "199809",      // 密码
    "realname",    // 数据库名
    "3306"         // 端口
);
$conn->set_charset("utf8mb4");

三、PHP 后端核心逻辑

3.1 数据写入(注册)

register.php 中处理 POST 表单,将用户名、手机号、密码写入数据库:

// 接收表单数据
$username = $_POST["username"];
$mobile   = $_POST["mobile"];
$password = $_POST["password"];

// SQL 插入
$sql = "INSERT INTO users (username, mobile, password)
        VALUES ('$username', '$mobile', '$password')";

if ($conn->query($sql) === TRUE) {
    echo "注册成功!第 " . $conn->insert_id . " 条数据";
}

3.2 数据查询 + JSON 输出(index.php 接口)

这是 Layui 表格的数据源,通过 ?action=ajax 返回 JSON:

// 关键机关:检测 ajax 请求
if ($_GET['action'] == 'ajax') {

    // COUNT 查总数(Layui 分页需要)
    $count = $conn->query("SELECT COUNT(*) as total FROM users")
                  ->fetch_assoc()['total'];

    // 查全部数据
    $result = $conn->query("SELECT id, username, mobile, created_at FROM users");
    $data = [];
    while($row = $result->fetch_assoc()) { $data[] = $row; }

    // 输出 JSON,然后 exit 死掉——绝不让 HTML 污染数据
    header('Content-Type: application/json');
    echo json_encode(["code" => 0, "msg" => "ok", "count" => $count, "data" => $data]);
    exit; // 🛑 关键!执行完立刻死掉
}

3.3 数据删除(index.php 接口)

// 通过 POST 接收要删除的用户 ID
$id = intval($_POST['id']);  // intval 防 SQL 注入

$sql = "DELETE FROM users WHERE id = $id";
$conn->query($sql);

echo json_encode(["code" => 0, "msg" => "删除成功"]);
exit; // 🛑 同样立刻死掉

四、前端页面设计

4.1 登录 / 注册页(纯 HTML + CSS)

使用卡片式布局,居中表单,渐变背景。核心 CSS 模式:

/* 卡片容器 */
.login-container {
    background: #ffffff;
    border-radius: 16px;
    box-shadow: 0 10px 30px rgba(0,0,0,0.08);
    max-width: 400px;
    padding: 2.5rem;
}

/* 渐变背景 */
body {
    background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
}

/* 输入框聚焦动效 */
input:focus {
    border-color: #4f46e5;
    box-shadow: 0 0 0 4px rgba(79,70,229,0.1);
}

4.2 数据管理页(Layui 表格)

使用 Layui 的 table 模块渲染动态表格,自动处理分页、排序:

// Layui table.render —— 一行配置搞定表格
table.render({
    elem: '#user-table',
    url:  '/index.php?action=ajax',  // 数据源指向 PHP 接口
    cols: [[
        {field: 'id',         title: 'ID',   width: 80,  sort: true},
        {field: 'username',   title: '用户名', width: 180},
        {field: 'mobile',     title: '手机号', width: 200},
        {field: 'created_at', title: '注册时间', sort: true},
        {title: '操作', templet: function(d) {
            return '<button lay-event="del">删除</button>';
        }}
    ]],
    page: true  // 开启分页
});

五、Ajax 前后端交互

删除操作是一个完整的 Ajax 调用链:前端点击 → Layer 确认框 → Ajax 请求 → PHP 处理 → 返回 JSON → 刷新表格。

// 监听表格工具按钮事件
table.on('tool(user-table)', function(obj) {
    if (obj.event === 'del') {

        // ① Layer 确认弹窗
        layer.confirm('确定删除吗?', function(index) {

            // ② Ajax 发请求给后端
            $.ajax({
                type: "post",
                url:  '/index.php?action=del',
                data: { id: obj.data.id },
                dataType: "json",
                success: function(ret) {
                    if (ret.code === 0) {
                        layer.msg('删除成功');
                        table.reload('user-table'); // ③ 刷新表格
                    }
                }
            });

            layer.close(index);
        });
    }
});

六、安全注意事项

⚠ SQL 注入 ⚠ 明文密码 ⚠ XSS ✅ intval 过滤 ✅ exit 防污染

当前已做的防护

  • intval() 强制转整数,防止删除接口的 SQL 注入
  • exit 在 JSON 输出后立刻终止,防止 HTML 污染数据
  • 数据库连接使用独立配置文件,与视图分离

待改进项

  • 密码应使用 password_hash() 加密存储,当前是明文 待处理
  • 注册/登录接口应使用 预处理语句(prepared statement)防注入 待处理
  • 应增加 CSRF Token 防护和输入 XSS 过滤 待处理

七、部署上线要点

Apache 配置(.htaccess)

# 隐藏入口文件扩展名
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

# 禁止直接访问 views 目录
RewriteRule ^views/ - [F,L]

Nginx 配置

# 禁止访问 views 目录
location ~ /views/ {
    deny all;
    return 403;
}

# 只允许 public 目录被访问
root /var/www/realname/public;

上线 Checklist

  • 修改数据库密码为强密码
  • 关闭 PHP 错误显示 display_errors = Off
  • 配置 HTTPS 证书 待处理
  • 设置文件权限(config 目录 600) 待处理