本文目录导读:

使用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;
}
?>
进阶建议
- 使用框架:Laravel 或 Symfony 可大幅简化路由、ORM、表单验证等,适合中大型项目。
- 安全性:所有SQL语句必须使用预处理(PDO参数绑定),防止SQL注入;密码使用
password_hash()存储;做好XSS过滤(htmlspecialchars)。 - API化:将后端转为 RESTful API(JSON交互),前端可用 Vue.js / React 构建SPA,提高体验。
- 搜索/过滤:增加按设备名称、状态、日期的搜索功能(SQL WHERE + LIKE)。
- 文件导出:支持导出Excel/PDF报表(可使用 PhpSpreadsheet 或 TCPDF)。
部署要点
- 将
config/database.php中的数据库连接信息改为生产环境参数。 - 使用
.htaccess或 Nginx 配置禁止访问includes/和config/目录。 - 开启 PHP 错误日志,关闭
display_errors。
通过以上步骤,你可以从零开始搭建一个具备基本CRUD、借还管理、状态跟踪的设备管理系统,根据实际需求,可以逐步添加更复杂的规则(如超期提醒、邮件通知、权限细分等)。