1. 项目背景与需求分析
西安工商学院学生请假管理系统是一个基于PHP框架开发的校园信息化应用。在高校日常管理中,学生请假流程的规范化和数字化一直是教务工作的重点难点。传统纸质请假条存在易丢失、审批周期长、数据统计困难等问题,而简单的电子表格又无法满足院系多级审批、历史记录追溯等复杂需求。
选择ThinkPHP和Laravel这两个主流PHP框架进行开发,主要基于以下考量:
- ThinkPHP以其"简单、高效"的特点,适合快速构建基础请假流程
- Laravel的优雅语法和丰富扩展包,便于实现更复杂的业务逻辑
- 两个框架都具备完善的MVC支持,能有效分离业务逻辑与展示层
- 对MySQL数据库的良好支持,满足学生数据安全存储需求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型对比与架构设计
2.1 ThinkPHP与Laravel核心特性对比
| 特性 | ThinkPHP 5.0 | Laravel 8 |
|---|---|---|
| 路由机制 | 传统MVC路由+路由注解 | RESTful路由+闭包路由 |
| ORM | 简单查询构造器 | Eloquent ORM |
| 模板引擎 | 内置模板引擎 | Blade模板引擎 |
| 扩展性 | 通过行为扩展 | 服务容器+服务提供者 |
| 学习曲线 | 较低 | 中等 |
| 适合场景 | 快速开发中小型项目 | 复杂业务逻辑系统 |
2.2 系统架构设计方案
本项目采用混合架构模式:
- 基础模块(用户管理、权限控制)使用ThinkPHP开发
- 核心业务模块(请假审批流程)采用Laravel实现
- 前后端分离:后端提供RESTful API,前端使用Vue.js
数据库设计关键表结构:
sql复制CREATE TABLE `leave_application` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` varchar(20) NOT NULL,
`leave_type` tinyint(4) NOT NULL COMMENT '1病假 2事假 3公假',
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
`reason` text NOT NULL,
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0待审核 1辅导员通过 2院系通过 3驳回',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 多级审批流程实现
请假审批涉及学生→辅导员→院系领导三级审批链,我们采用状态机模式实现:
php复制// Laravel中的审批状态机配置
class LeaveApplicationStateMachine extends StateMachine
{
public function __construct()
{
$this->addState('pending', ['to_teacher', 'rejected']);
$this->addState('teacher_approved', ['to_department', 'rejected']);
$this->addState('department_approved', ['completed', 'rejected']);
$this->addState('rejected', []);
$this->addState('completed', []);
}
}
// ThinkPHP中的审批动作处理
public function approve($id, $role) {
$leave = LeaveModel::get($id);
if($role == 'teacher' && $leave['status'] == 0) {
$leave->save(['status' => 1]);
$this->sendNotification($leave['student_id'], '辅导员已审批通过');
}
// 其他审批角色处理...
}
3.2 数据统计与可视化
使用Laravel的查询构造器实现多维统计:
php复制public function getStatistics(Request $request) {
return DB::table('leave_application')
->selectRaw('leave_type, COUNT(*) as total')
->when($request->has('department'), function($query) use ($request) {
return $query->join('students', 'students.id', '=', 'leave_application.student_id')
->where('students.department', $request->department);
})
->groupBy('leave_type')
->get();
}
4. 安全防护与性能优化
4.1 安全防护措施
- 输入验证:
php复制// Laravel表单请求验证
class StoreLeaveRequest extends FormRequest {
public function rules() {
return [
'leave_type' => 'required|integer|between:1,3',
'start_time' => 'required|date|after:now',
'end_time' => 'required|date|after:start_time',
'reason' => 'required|string|max:500'
];
}
}
- 防SQL注入:
- ThinkPHP使用参数绑定:
php复制Db::name('user')->where('id', ':id')->bind(['id'=>$id])->select();
- XSS防护:
- 前端使用vue-sanitize处理富文本
- 后端存储前进行HTML实体转码
4.2 性能优化方案
- 数据库优化:
- 为status、student_id等字段添加索引
- 大表使用分库分表策略
- 缓存策略:
php复制// 使用Redis缓存常用数据
public function getLeaveTypes() {
$key = 'leave_types';
if (Redis::exists($key)) {
return json_decode(Redis::get($key));
}
$types = LeaveType::all();
Redis::setex($key, 3600, json_encode($types));
return $types;
}
- 队列处理:
- 使用Laravel队列处理邮件通知等异步任务
5. 部署与运维实践
5.1 环境配置建议
推荐使用1Panel进行服务器管理:
- 安装PHP 7.4+环境(需启用pcntl、redis等扩展)
- 配置Nginx伪静态规则:
nginx复制# ThinkPHP
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
# Laravel
location / {
try_files $uri $uri/ /index.php?$query_string;
}
5.2 常见问题解决方案
- 中文乱码问题:
- 确保数据库连接字符集为utf8mb4
- 在config/database.php中配置:
php复制'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
- 跨框架Session共享:
- 使用Redis作为统一session存储
- 配置相同的session加密密钥
- 定时任务管理:
- 使用Laravel Task Scheduling处理定期统计
php复制// app/Console/Kernel.php
protected function schedule(Schedule $schedule) {
$schedule->call(function () {
// 每日凌晨统计请假数据
LeaveStatistic::generateDailyReport();
})->dailyAt('00:00');
}
6. 项目扩展与二次开发
6.1 微信小程序集成
- 使用EasyWeChat处理微信授权:
php复制$app = Factory::miniProgram($config);
$user = $app->auth->session($code);
- 消息模板推送:
php复制$app->subscribe_message->send([
'touser' => $openid,
'template_id' => '请假审批结果通知ID',
'data' => [
'result' => ['value' => $result],
'time' => ['value' => $time]
]
]);
6.2 大数据分析扩展
- 使用Laravel Excel处理数据导出:
php复制return Excel::download(new LeaveRecordsExport($startDate, $endDate), 'leave_records.xlsx');
- 集成ECharts实现可视化:
javascript复制// Vue组件中
this.$http.get('/api/leave/stats').then(response => {
this.chart.setOption({
series: [{
data: response.data.map(item => ({
name: item.type_name,
value: item.count
}))
}]
});
});
在项目实际运行过程中,我们发现审批流程的灵活性是关键需求。后期我们增加了动态审批路径配置功能,允许各院系自定义审批层级。这通过在leave_application表中添加approval_flow字段(存储JSON配置)实现,大幅提升了系统的适应性
