如何用PHP项目搭建设备管理系统?

wen PHP项目 3

本文目录导读:

如何用PHP项目搭建设备管理系统?

  1. 系统需求与功能模块
  2. 技术选型
  3. 数据库设计 (MySQL)
  4. 项目文件结构
  5. 核心代码实现 (示例)
  6. 进阶建议
  7. 部署要点

使用PHP搭建一个完整的设备管理系统,通常涉及后端API开发数据库设计前端界面展示以及核心业务逻辑,下面是一个系统化的实现指南,包含需求分析、技术选型、数据库设计、核心功能实现和代码示例。


系统需求与功能模块

一个典型的设备管理系统应包含以下核心模块:

  • 设备管理:添加、编辑、删除、查看设备信息(名称、型号、序列号、购买日期、位置、状态等)。
  • 设备类别:设备分类管理(如电脑、打印机、服务器)。
  • 借还管理:设备借出、归还、报修记录。
  • 状态跟踪:设备当前状态(闲置、使用中、维修中、报废)。
  • 用户管理:管理员、普通用户(操作员、借用人)。
  • 报表统计:设备总数、使用率、维修频率等。

技术选型

  • 后端语言:PHP 7.4+ 或 8.x(推荐使用现代框架,但为了展示原理,这里用原生写法或轻量框架如 Slim / Laravel)。
  • 数据库:MySQL 5.7+ 或 MariaDB。
  • 前端:HTML5 + CSS3 + JavaScript (可选 Bootstrap 或 Vue.js 提升体验)。
  • 开发环境:XAMPP / WAMP / Docker + PHP + MySQL。

数据库设计 (MySQL)

创建一个名为 equipment_db 的数据库,核心表设计如下:

-- 1. 设备类别表
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 设备主表
CREATE TABLE equipment (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    model VARCHAR(100),
    serial_number VARCHAR(100) UNIQUE,
    category_id INT,
    location VARCHAR(200),
    purchase_date DATE,
    status ENUM('available', 'in_use', 'maintenance', 'retired') DEFAULT 'available',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL
);
-- 3. 设备借还记录表
CREATE TABLE borrow_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    equipment_id INT NOT NULL,
    user_id INT NOT NULL,          -- 借用人ID
    borrow_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    expected_return_date DATE,
    actual_return_date DATETIME,
    notes TEXT,
    FOREIGN KEY (equipment_id) REFERENCES equipment(id) ON DELETE CASCADE
);
-- 4. 用户表 (简化版)
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL, -- 使用 password_hash()
    role ENUM('admin', 'user') DEFAULT 'user',
    full_name VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

项目文件结构

/equipment-manager/
├── config/
│   └── database.php          # 数据库连接配置
├── public/
│   └── index.php             # 入口文件 (路由)
├── includes/
│   ├── functions.php         # 公共函数
│   └── auth.php              # 登录验证
├── models/
│   ├── Equipment.php         # 设备模型
│   ├── Category.php
│   └── BorrowRecord.php
├── views/
│   ├── header.php
│   ├── footer.php
│   ├── login.php
│   ├── dashboard.php
│   ├── equipment_list.php
│   ├── equipment_add.php
│   └── borrow_form.php
└── assets/
    ├── css/
    └── js/

核心代码实现 (示例)

1 数据库连接 config/database.php

<?php
$host = 'localhost';
$dbname = 'equipment_db';
$username = 'root';
$password = '';
try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}
?>

2 添加设备 (Equipment 模型 + 表单处理)

views/equipment_add.php (前端表单片段):

<form action="add_equipment.php" method="POST">
    <label>设备名称:<input type="text" name="name" required></label><br>
    <label>型号:<input type="text" name="model"></label><br>
    <label>序列号:<input type="text" name="serial_number"></label><br>
    <label>类别:
        <select name="category_id">
            <?php
            // 从数据库查询 categories 表
            $stmt = $pdo->query("SELECT id, name FROM categories");
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                echo "<option value='{$row['id']}'>{$row['name']}</option>";
            }
            ?>
        </select>
    </label><br>
    <label>位置:<input type="text" name="location"></label><br>
    <label>购买日期:<input type="date" name="purchase_date"></label><br>
    <input type="submit" value="添加设备">
</form>

add_equipment.php (后端处理):

<?php
require_once 'config/database.php';
require_once 'includes/auth.php'; // 假设已实现登录检查
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'];
    $model = $_POST['model'] ?? '';
    $serial = $_POST['serial_number'] ?? '';
    $category_id = $_POST['category_id'] ?: null;
    $location = $_POST['location'] ?? '';
    $purchase_date = $_POST['purchase_date'] ?? null;
    $sql = "INSERT INTO equipment (name, model, serial_number, category_id, location, purchase_date) VALUES (?, ?, ?, ?, ?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$name, $model, $serial, $category_id, $location, $purchase_date]);
    header("Location: equipment_list.php?msg=设备添加成功");
    exit;
}
?>

3 设备列表 (分页与状态显示)

equipment_list.php

<?php
require_once 'config/database.php';
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
// 查询总数
$countStmt = $pdo->query("SELECT COUNT(*) FROM equipment");
$total = $countStmt->fetchColumn();
// 查询当前页数据
$stmt = $pdo->prepare("
    SELECT e.*, c.name AS category_name 
    FROM equipment e 
    LEFT JOIN categories c ON e.category_id = c.id 
    ORDER BY e.created_at DESC 
    LIMIT ? OFFSET ?
");
$stmt->execute([$perPage, $offset]);
$equipments = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html>
<head><title>设备列表</title></head>
<body>
    <table border="1">
        <tr>
            <th>ID</th><th>名称</th><th>型号</th><th>序列号</th><th>类别</th><th>位置</th><th>状态</th><th>操作</th>
        </tr>
        <?php foreach ($equipments as $e): ?>
        <tr>
            <td><?= htmlspecialchars($e['id']) ?></td>
            <td><?= htmlspecialchars($e['name']) ?></td>
            <td><?= htmlspecialchars($e['model']) ?></td>
            <td><?= htmlspecialchars($e['serial_number']) ?></td>
            <td><?= htmlspecialchars($e['category_name']) ?></td>
            <td><?= htmlspecialchars($e['location']) ?></td>
            <td><?= $e['status'] ?></td>
            <td>
                <a href="edit_equipment.php?id=<?= $e['id'] ?>">编辑</a>
                <a href="delete_equipment.php?id=<?= $e['id'] ?>" onclick="return confirm('确定删除?')">删除</a>
                <a href="borrow_form.php?equipment_id=<?= $e['id'] ?>">借出</a>
            </td>
        </tr>
        <?php endforeach; ?>
    </table>
    <!-- 分页代码略 -->
</body>
</html>

4 设备借出功能

borrow_form.php (借出操作):

<?php
require_once 'config/database.php';
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['equipment_id'], $_POST['user_id'])){
    $equipment_id = $_POST['equipment_id'];
    $user_id = $_POST['user_id'];
    $expected_return = $_POST['expected_return_date'] ?? null;
    // 1. 检查设备状态
    $stmt = $pdo->prepare("SELECT status FROM equipment WHERE id = ?");
    $stmt->execute([$equipment_id]);
    $equip = $stmt->fetch();
    if(!$equip || $equip['status'] !== 'available'){
        die("该设备不可借出");
    }
    // 2. 插入借出记录
    $pdo->beginTransaction();
    try {
        $stmt = $pdo->prepare("INSERT INTO borrow_records (equipment_id, user_id, expected_return_date) VALUES (?, ?, ?)");
        $stmt->execute([$equipment_id, $user_id, $expected_return]);
        // 3. 更新设备状态
        $stmt = $pdo->prepare("UPDATE equipment SET status = 'in_use' WHERE id = ?");
        $stmt->execute([$equipment_id]);
        $pdo->commit();
        header("Location: equipment_list.php?msg=借出成功");
    } catch (Exception $e) {
        $pdo->rollBack();
        die("借出失败: " . $e->getMessage());
    }
}
?>

5 简易用户登录验证 (includes/auth.php)

<?php
session_start();
function isLoggedIn() {
    return isset($_SESSION['user_id']);
}
if(!isLoggedIn()){
    header("Location: login.php");
    exit;
}
?>

进阶建议

  1. 使用框架:Laravel 或 Symfony 可大幅简化路由、ORM、表单验证等,适合中大型项目。
  2. 安全性:所有SQL语句必须使用预处理(PDO参数绑定),防止SQL注入;密码使用 password_hash() 存储;做好XSS过滤(htmlspecialchars)。
  3. API化:将后端转为 RESTful API(JSON交互),前端可用 Vue.js / React 构建SPA,提高体验。
  4. 搜索/过滤:增加按设备名称、状态、日期的搜索功能(SQL WHERE + LIKE)。
  5. 文件导出:支持导出Excel/PDF报表(可使用 PhpSpreadsheet 或 TCPDF)。

部署要点

  • config/database.php 中的数据库连接信息改为生产环境参数。
  • 使用 .htaccess 或 Nginx 配置禁止访问 includes/config/ 目录。
  • 开启 PHP 错误日志,关闭 display_errors

通过以上步骤,你可以从零开始搭建一个具备基本CRUD、借还管理、状态跟踪的设备管理系统,根据实际需求,可以逐步添加更复杂的规则(如超期提醒、邮件通知、权限细分等)。

抱歉,评论功能暂时关闭!