ThinkPHP8 + HTML + Fetch (Ajax) 
环境说明
1. ThinkPHP8 项目已装好,数据库 student,表 user(沿用上面 SQL)
2. 架构:
  - 模型:app/model/User.php
  - 控制器:app/controller/User.php(接口 CRUD)
  - 前端视图:view/user/index.html(Ajax 页面)
3. 数据库配置:config/database.php 自行修改账号密码
1、数据库表 SQL(不变)
CREATE DATABASE IF NOT EXISTS student;
USE student;
CREATE TABLE IF NOT EXISTS `user` (
  id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
  name VARCHAR(50) NOT NULL COMMENT '姓名',
  age INT COMMENT '年龄',
  phone VARCHAR(20) COMMENT '手机号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2、模型 app/model/User.php
<?php
namespace app\model;

use think\Model;

class User extends Model
{
    protected $table = 'user';
    protected $autoWriteTimestamp = false;
}
3、控制器 app/controller/User.php(CRUD 接口)
<?php
namespace app\controller;

use app\model\User;
use think\Request;
use think\Response;

class User
{
    // 渲染前端页面
    public function index()
    {
        return view();
    }

    // 1、查询列表 GET /user/list
    public function list()
    {
        $list = User::order('id desc')->select();
        return json([
            'code' => 200,
            'data' => $list
        ]);
    }

    // 2、新增 POST /user/add
    public function add(Request $request)
    {
        $data = $request->post();
        $res = User::create($data);
        if ($res) {
            return json(['code' => 200, 'msg' => '新增成功']);
        }
        return json(['code' => 500, 'msg' => '新增失败']);
    }

    // 3、单条回显 GET /user/edit?id=1
    public function edit(Request $request)
    {
        $id = $request->get('id');
        $info = User::find($id);
        return json([
            'code' => 200,
            'data' => $info
        ]);
    }

    // 4、更新修改 POST /user/update
    public function update(Request $request)
    {
        $data = $request->post();
        $res = User::update($data, ['id' => $data['id']]);
        if ($res) {
            return json(['code' => 200, 'msg' => '修改成功']);
        }
        return json(['code' => 500, 'msg' => '修改失败']);
    }

    // 5、删除 GET /user/del?id=1
    public function del(Request $request)
    {
        $id = $request->get('id');
        User::destroy($id);
        return json(['code' => 200, 'msg' => '删除成功']);
    }
}
4、路由配置 route/app.php
<?php
use think\facade\Route;

// 页面
Route::get('user', 'User/index');
// 接口
Route::get('user/list', 'User/list');
Route::post('user/add', 'User/add');
Route::get('user/edit', 'User/edit');
Route::post('user/update', 'User/update');
Route::get('user/del', 'User/del');
5、前端模板 view/user/index.html(Ajax 页面,原生 fetch)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>TP8 Ajax CRUD</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h2>TP8 用户管理 Ajax增删改查</h2>
    <button class="btn btn-primary my-3" data-bs-toggle="modal" data-bs-target="#addModal">添加用户</button>

    <table class="table table-bordered">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>手机号</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody id="tableBody"></tbody>
    </table>

    <!-- 新增弹窗 -->
    <div class="modal fade" id="addModal">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header"><h5>新增用户</h5></div>
                <div class="modal-body">
                    <input class="form-control mb-2" id="addName" placeholder="姓名">
                    <input class="form-control mb-2" id="addAge" placeholder="年龄">
                    <input class="form-control mb-2" id="addPhone" placeholder="手机号">
                </div>
                <div class="modal-footer">
                    <button class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
                    <button class="btn btn-success" onclick="addData()">提交新增</button>
                </div>
            </div>
        </div>
    </div>

    <!-- 编辑弹窗 -->
    <div class="modal fade" id="editModal">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header"><h5>编辑用户</h5></div>
                <div class="modal-body">
                    <input type="hidden" id="editId">
                    <input class="form-control mb-2" id="editName" placeholder="姓名">
                    <input class="form-control mb-2" id="editAge" placeholder="年龄">
                    <input class="form-control mb-2" id="editPhone" placeholder="手机号">
                </div>
                <div class="modal-footer">
                    <button class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
                    <button class="btn btn-warning" onclick="updateData()">保存修改</button>
                </div>
            </div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        // 页面加载自动加载列表
        window.onload = getList();

        // 1、查询所有
        async function getList() {
            const res = await fetch("/user/list");
            const json = await res.json();
            const tbody = document.getElementById("tableBody");
            tbody.innerHTML = "";
            json.data.forEach(item => {
                tbody.innerHTML += `
                    <tr>
                        <td>${item.id}</td>
                        <td>${item.name}</td>
                        <td>${item.age}</td>
                        <td>${item.phone}</td>
                        <td>
                            <button class="btn btn-sm btn-warning" onclick="openEdit(${item.id})">编辑</button>
                            <button class="btn btn-sm btn-danger" onclick="del(${item.id})">删除</button>
                        </td>
                    </tr>
                `
            })
        }

        // 2、新增
        async function addData() {
            const formData = new FormData();
            formData.append("name", document.getElementById("addName").value);
            formData.append("age", document.getElementById("addAge").value);
            formData.append("phone", document.getElementById("addPhone").value);

            const res = await fetch("/user/add", {
                method: "POST",
                body: formData
            });
            const json = await res.json();
            alert(json.msg);
            bootstrap.Modal.getInstance(document.getElementById("addModal")).hide();
            // 清空输入框
            document.getElementById("addName").value = "";
            document.getElementById("addAge").value = "";
            document.getElementById("addPhone").value = "";
            getList();
        }

        // 打开编辑弹窗回显
        async function openEdit(id) {
            const res = await fetch(`/user/edit?id=${id}`);
            const json = await res.json();
            document.getElementById("editId").value = json.data.id;
            document.getElementById("editName").value = json.data.name;
            document.getElementById("editAge").value = json.data.age;
            document.getElementById("editPhone").value = json.data.phone;
            new bootstrap.Modal(document.getElementById("editModal")).show();
        }

        // 3、修改更新
        async function updateData() {
            const formData = new FormData();
            formData.append("id", document.getElementById("editId").value);
            formData.append("name", document.getElementById("editName").value);
            formData.append("age", document.getElementById("editAge").value);
            formData.append("phone", document.getElementById("editPhone").value);

            const res = await fetch("/user/update", {
                method: "POST",
                body: formData
            });
            const json = await res.json();
            alert(json.msg);
            bootstrap.Modal.getInstance(document.getElementById("editModal")).hide();
            getList();
        }

        // 4、删除
        async function del(id) {
            if (!confirm("确定删除?")) return;
            const res = await fetch(`/user/del?id=${id}`);
            const json = await res.json();
            alert(json.msg);
            getList();
        }
    </script>
</body>
</html>

更多推荐