本文目录导读:

使用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、借还管理、状态跟踪的设备管理系统,根据实际需求,可以逐步添加更复杂的规则(如超期提醒、邮件通知、权限细分等)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播