Bootstrap

校车运行管理系统分析与设计

目录

一 系统规划... 4

1系统建设的背景、必要性和意义... 4

(1)  背景... 4

(2) 必要性... 4

(3) 意义... 4

2 可行性论证... 4

(1)技术可行性... 4

(2)经济可行性... 5

(3)社会可行性... 5

3 系统开发的计划... 5

(1)阶段划分及需求... 5

(2)甘特图表示开发进度... 6

二.系统分析... 8

1组织结构图... 8

2管理功能图... 9

(1)校车管理部主管功能... 9

(2)校车调度员功能... 9

(3)司机管理功能... 10

(4)维护管理功能... 10

(5)班级联络员功能... 10

3组织/业务矩阵... 11

4业务流程图... 12

5数据流程图... 13

6决策树,决策表... 13

三.系统设计... 14

1系统平台设计... 14

2软件结构设计(HIPO图)... 14

3代码设计... 15

4数据库设计... 15

5输入设计/输出设计... 16

(1)输入设计... 16

(2)输出设计... 17

6界面设计... 17

四总结... 19

1总结... 19

(1)  项目背景与目标... 19

 

(2)项目分析阶段... 19

(3)、系统设计阶段... 19

2小组分工... 20

附录一... 20

附录二... 29

系统规划

1系统建设的背景、必要性和意义

  1. 背景

随着学校规模的扩大和学生人数的增加,校车成为许多学校必不可少的设施。传统的校车管理方式依赖于人工操作,存在信息不对称、管理效率低、安全隐患大等问题。为了解决这些问题,提高校车管理的效率和安全性,引入信息化管理系统势在必行。

(2) 必要性

保障学生安全:校车的安全管理直接关系到学生的生命安全,信息化系统能够实时监控校车的运行状况,及时预警异常情况。

提高管理效率:通过系统化的管理,可以简化校车调度、路线规划、乘车记录等操作,提高工作效率。

优化资源配置:系统能够根据实际需求合理安排校车使用,避免资源浪费,降低运营成本。

响应政策要求:政府和教育部门越来越重视校车安全管理,信息化系统能够满足政策和法规要求。

(3) 意义

提升学校形象:采用现代化的管理系统,提升学校的整体形象,展示先进的管理水平。

增强家长信任:信息化系统让家长随时了解孩子的乘车情况,增强对学校的信任。

推动教育信息化:该系统的实施有助于推动教育领域的信息化进程,提高整体教育水平。

2 可行性论证

(1)技术可行性

技术成熟度:GPS定位、无线通信、云计算等技术已经非常成熟,可以支持校车管理系统的各项功能。

开发能力:学校可以与具备相关开发经验的软件公司合作,确保系统的开发质量。

系统集成:系统可以与现有的学校管理系统无缝对接,实现数据共享和综合管理。

(2)经济可行性

初期投资:系统的开发和部署需要一定的资金投入,包括硬件设备、软件开发和培训费用。

成本效益:通过提高管理效率和优化资源配置,系统可以在一定时间内收回成本,并实现长期的经济效益。

资金来源:资金可以通过学校预算、政府补贴和社会捐助等多种途径获得,确保项目顺利实施。

(3)社会可行性

社会需求:校车安全问题备受社会关注,信息化系统能够满足家长和社会对校车安全管理的期望。

政策支持:政府和教育部门大力推动校车安全管理,信息化系统符合政策导向,有望获得政策支持。

用户认可:家长和学生对现代化、透明化的管理方式普遍持支持态度,有助于系统的推广应用。

3 系统开发的计划

(1)阶段划分及需求

1需求分析阶段(1个月)

人力需求:项目经理1人,系统分析师2人

资金需求:5万元

设备需求:电脑、办公设备

2系统设计阶段(2个月)

人力需求:项目经理1人,系统架构师1人,UI设计师2人

资金需求:10万元

设备需求:设计软件、电脑

3系统开发阶段(4个月)

人力需求:项目经理1人,前端开发工程师2人,后端开发工程师2人,数据库管理员1人

资金需求:30万元

设备需求:开发工具、服务器

4系统测试阶段(1个月)

人力需求:项目经理1人,测试工程师3人

资金需求:10万元

设备需求:测试设备

5系统部署阶段(1个月)

人力需求:项目经理1人,运维工程师2人

资金需求:10万元

设备需求:服务器、网络设备

6系统培训和上线阶段(1个月)

人力需求:项目经理1人,培训师2人

资金需求:5万元

设备需求:培训设备

(2)甘特图表示开发进度

阶段 

时间

任务内容

需求分析阶段

1个月

需求调研、分析、确认

系统设计阶段

2个月

系统架构设计、UI设计

系统开发阶段

4个月

前端开发、后端开发、数据库开发

系统测试阶段

1个月

功能测试、性能测试、漏洞修复

系统部署阶段

1个月

系统部署、上线准备

系统培训和上线阶段

1个月

用户培训、系统上线

表格 1甘特图

图表 1 甘特图

二.系统分析

1组织结构图

图表 2组织结构图

  1. 校长

最高决策者,负责全面监督校车管理部的工作,确保所有决策符合学校整体政策和目标。

(2)校车管理部主管

负责校车管理系统的整体运行,制定和实施校车管理政策,协调各部门工作,处理重大突发事件。

(3)校车调度员

负责编排校车运行时间表,监控校车实时位置,与司机和班级联络员保持沟通,必要时调整校车路线和时间。

(4)司机管理

负责司机的招聘和培训,日常管理,绩效评估,处理司机反馈和投诉。

(5)维护管理

负责校车的定期保养和维修,进行校车安全检查,维护维修记录和报告,处理校车故障。

(6)班级联络员

收集学生乘车需求,通知学生校车运行信息,反馈学生意见和建议,协助处理学生乘车问题。

2管理功能图

图表 3管理功能图

  1. 校车管理部主管功能
  1. 制定校车运行计划

   根据学校的作息时间和学生的需求,制定校车运行计划,确保校车运行高效、安全。

  1. 审核并分配校车资源

       审核校车的使用申请,合理分配校车资源,确保资源利用最大化。

  1. 监督校车运行状况

   通过监控系统实时监督校车运行状况,确保校车按照计划运行,处理突发情况。

  1. 处理突发事件

   处理校车运行中的突发事件,及时做出决策,保障学生和司机的安全。

(2)校车调度员功能

  1. 编排校车运行时间表

   根据学生的乘车需求和学校的作息时间,编排合理的校车运行时间表。

  1. 监控校车实时位置

   通过GPS等技术手段,实时监控校车位置,确保校车按计划运行。

  1. 与司机、班级联络员保持沟通

   与司机和班级联络员保持密切联系,确保信息畅通,及时处理运行中的问题。

  1. 调整校车路线和时间

   根据实际情况,灵活调整校车路线和时间,确保服务质量。

(3)司机管理功能

  1. 招聘和培训司机

   根据需求招聘合格的校车司机,并定期组织培训,提升司机的专业技能和服务意识。

  1. 司机日常管理

   对司机进行日常管理,包括考勤、行为规范、工作纪律等。

  1. 司机绩效评估

   定期对司机进行绩效评估,激励优秀司机,提升整体服务水平。

  1. 处理司机反馈和投诉

   及时处理司机的反馈和投诉,改进管理方法,优化工作环境。

(4)维护管理功能

  1. 校车定期保养和维修

   定期对校车进行保养和维修,确保校车处于良好运行状态。

  1. 校车安全检查

   定期进行校车安全检查,排除安全隐患,保障行车安全。

  1. 维修记录和报告

   维护详细的维修记录和报告,便于管理和追踪校车维护情况。

  1. 处理校车故障

   快速响应校车故障,及时进行维修,减少因故障导致的运行中断。

(5)班级联络员功能

  1. 收集学生乘车需求

   统计和收集学生的乘车需求,提供数据支持校车运行计划的制定。

  1. 通知学生校车运行信息

   及时通知学生校车的运行信息,包括时间、路线、站点等。

  1. 反馈学生意见和建议

   收集学生及家长的意见和建议,反馈给相关部门,提升服务质量。

  1. 协助处理学生乘车问题

   协助解决学生在乘车过程中遇到的问题,提供必要的帮助和支持。

3组织/业务矩阵

角色/部门

校长

主管

校车调度员

司机管理

维护管理

联络员

制定校车运行计划

X

X

审核分配校车资源

X

X

监督校车运行状况

X

X

X

处理突发事件

X

X

X

编排校车时间表

X

监控校车实时位置

X

与司机沟通

X

与班级联络员沟通

X

X

招聘和培训司机

X

司机日常管理

X

司机绩效评估

X

校车定期保养

X

校车安全检查

X

维修记录

X

处理校车故障

X

收集学生需求

X

通知校车信息

X

反馈学生意见

X

协助学生乘车问题

X

表格 2组织业务矩阵

4业务流程图 

图表 4业务流程图

调度员根据学校的学生单和车库的车辆单,规划乘车单给司机,司机通过提车单给车库提车,学校根据学生乘坐体验向主管提交反馈单,主管做出调整,提交调整单给调度员,此外,主管需提交安全单给交管部门。

5数据流程图

图表 5数据流程图

调度处理功能按照反馈处理修改的反馈台账和查询入库台账,修改调度台账。车辆分配功能查询调度台账,交行驶表给司机。车辆管理处理功能根据车间的车辆单修改购入维修台账。入库处理查询维修台账,修改入库台账,提交购入单给财务科。

6决策树,决策表

图表 6决策树

决策规则号

1

2

3

条件

<1h

Y

N

N

非高峰

N

N

Y

措施

调整线路

X

增加车辆

X

动态调整

X

表格 3决策表

当调度遇到高峰时,高峰堵车时间<1h时调整线路。高峰堵车时间>1h时,增加车辆和增加线路。调度没遇到高峰时,做动态调整。

三.系统设计

1系统平台设计

(1)软件设计

操作系统:Windows Server 2019

数据库:SQL Server 2019

编程语言:Python 3.12

(2)硬件设计

服务器:1台高性能服务器,配置8核CPU,32GB内存,1TB硬盘

客户端:普通办公电脑,配置4核CPU,8GB内存,256GB硬盘

(3)网络设计

局域网:千兆以太网

外网访问:通过VPN访问企业内部网络

2软件结构设计(HIPO图)

图表 7HIPO图 

3输入设计/输出设计

(1)输入设计

需要考虑用户输入的数据以及系统接收和处理这些数据的方式。对于校车运行管理系统,主要的输入内容包括调度员输入的学生单和车辆单、司机输入的提车单等。

1调度员输入学生单和车辆单

  1. 学生单

输入字段:学生ID、姓名、班级、地址、联系方式

验证规则:学生ID为唯一标识,姓名不能为空,联系方式为有效的电话号码

  1. 车辆单

输入字段:车辆ID、车型、座位数、状态(可用/不可用)

验证规则:车辆ID为唯一标识,座位数为正整数,状态只能为“可用”或“不可用”

2司机输入提车单

提车单

输入字段:司机ID、车辆ID、提车时间

验证规则:司机ID和车辆ID必须存在于系统中,提车时间为有效的日期时间格式

3主管输入反馈单和安全单

  1. 反馈单

输入字段:反馈ID、学生ID、反馈内容、状态

验证规则:反馈ID为唯一标识,学生ID必须存在于系统中,反馈内容不能为空,状态只能为“待处理”或“已处理”

  1. 安全单

输入字段:安全单ID、车辆ID、安全检查内容、检查结果

验证规则:安全单ID为唯一标识,车辆ID必须存在于系统中,检查果只能为“通过”或“未通过”

(2)输出设计

输出设计需要考虑系统生成的报表、反馈单等内容以及用户查看这些输出的方式。对于校车运行管理系统,主要的输出内容包括反馈单、调整单、行驶表、安全单等。

1反馈单

输出字段:反馈ID、学生ID、反馈内容、状态、处理结果

输出形式:反馈单报表,包含所有待处理和已处理的反馈

2 调整单

输出字段:调整单ID、原调度信息、新调度信息、调整原因

输出形式:调整单报表,包含所有调整记录

3 行驶表

输出字段:行驶表ID、司机ID、车辆ID、行驶路线、行驶时间

输出形式:行驶表报表,包含所有行驶记录

4 安全单

输出字段:安全单ID、车辆ID、安全检查内容、检查结果

输出形式:安全单报表,包含所有安全检查记录

4数据库设计

数据库
-- 创建students表
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    class_id INT,
    name NVARCHAR(50),
    guardian_phone NVARCHAR(15),
    coordinate NVARCHAR(50)
);

-- 插入students表的实例数据
INSERT INTO students (student_id, class_id, name, guardian_phone, coordinate) VALUES
(1001, 101, 'lms', '1234567890', '1,2'),
(2002, 102, 'hhr', '1234567891', '1.3'),
(3003, 101, 'ccd', '1234567892', '2,2'),
(4004, 103, 'ljj', '1234567889', '3,4'),
(5005, 103, 'ly', '1234567888', '3,5'),
(6006, 103, 'hrr', '1234567887', '4,3');

-- 创建vehicle表
CREATE TABLE vehicle (
    vehicle_id INT PRIMARY KEY,
    plate_number NVARCHAR(10),
    mileage INT,
    capacity INT
);

-- 插入vehicle表的实例数据
INSERT INTO vehicle (vehicle_id, plate_number, mileage, capacity) VALUES
(1, 'ABC123', 50, 4),
(2, 'XYZ789', 30, 6),
(3, 'LMN456', 15, 8),
(4, 'PQR321', 60, 5);

-- 创建driver表
CREATE TABLE driver (
    driver_id INT PRIMARY KEY,
    driver_phone NVARCHAR(15),
    driver_name NVARCHAR(50)
);

-- 插入driver表的实例数据
INSERT INTO driver (driver_id, driver_phone, driver_name) VALUES
(1, '1234567894', 'lmss'),
(2, '1234567895', 'ccdd'),
(3, '1234567896', 'hhrr'),
(4, '1234567897', 'ljjj');


-- 创建vehicle_routes表
CREATE TABLE vehicle_routes (
    route_id INT PRIMARY KEY,
    vehicle_id INT,
    student_id INT,
    driver_id INT,
    route NVARCHAR(50),
    FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (driver_id) REFERENCES driver(driver_id)
);

-- 插入vehicle_routes表的实例数据
INSERT INTO vehicle_routes (route_id, vehicle_id, student_id, driver_id, route) VALUES
(1, 1, 1001, 1, 'Route A'),
(2, 1, 2002, 1, 'Route A'),
(3, 2, 3003, 2, 'Route B'),
(4, 3, 4004, 3, 'Route C'),
(5, 4, 5005, 4, 'Route D'),
(6, 4, 6006, 4, 'Route D');

5代码设计

 

import tkinter as tk
from tkinter import messagebox, ttk
import pymssql

class SchoolBusSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("校车公司运行系统")

        self.conn = pymssql.connect(server='***', user='sa', password='*****', database='school bus2')
        self.cursor = self.conn.cursor()
        if pymssql.connect:
            print("连接成功")

        self.style = ttk.Style()
        self.style.configure("TLabel", font=("Helvetica", 12), padding=10)
        self.style.configure("TButton", font=("Helvetica", 12), padding=10)
        self.style.configure("TEntry", font=("Helvetica", 12), padding=10)
        self.style.configure("TCombobox", font=("Helvetica", 12))

        self.login_screen()

    def login_screen(self):
        self.clear_screen()
        self.root.geometry("400x300")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="用户名", bg='#f0f0f0').grid(row=0, column=0, padx=10, pady=10)
        self.username_entry = ttk.Entry(self.root)
        self.username_entry.grid(row=0, column=1, padx=10, pady=10)

        tk.Label(self.root, text="密码", bg='#f0f0f0').grid(row=1, column=0, padx=10, pady=10)
        self.password_entry = ttk.Entry(self.root, show='*')
        self.password_entry.grid(row=1, column=1, padx=10, pady=10)

        tk.Label(self.root, text="用户角色", bg='#f0f0f0').grid(row=2, column=0, padx=10, pady=10)
        self.role_var = tk.StringVar()
        self.role_combobox = ttk.Combobox(self.root, textvariable=self.role_var)
        self.role_combobox['values'] = ('管理员', '学生', '司机')
        self.role_combobox.grid(row=2, column=1, padx=10, pady=10)

        ttk.Button(self.root, text="登录", command=self.check_login).grid(row=3, column=0, columnspan=2, pady=20)

        tk.Label(self.root, text="学生用户名为学号,司机用户名为司机编号 ", fg='#ff0000').grid(row=4, column=1)

    def check_login(self):
        username = self.username_entry.get()
        password = self.password_entry.get()
        role = self.role_var.get()

        if role == '管理员' and username == "1" and password == "1":
            self.welcome_screen()
        elif role == '学生':
            self.cursor.execute("SELECT * FROM students WHERE student_id=%s AND %s='123'", (username, password))
            student = self.cursor.fetchone()
            if student:
                self.student_screen(username)
            else:
                messagebox.showerror("错误", "用户名或密码错误")
        elif role == '司机':
            self.cursor.execute("SELECT * FROM driver WHERE driver_id=%s AND %s='123'", (username, password))
            driver = self.cursor.fetchone()
            if driver:
                self.driver_screen(username)
            else:
                messagebox.showerror("错误", "用户名或密码错误")
        else:
            messagebox.showerror("错误", "用户名或密码错误")

    def welcome_screen(self):
        self.clear_screen()
        self.root.geometry("400x200")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="欢迎使用校车公司运行系统", font=("Helvetica", 16), bg='#f0f0f0').pack(pady=20)
        ttk.Button(self.root, text="进入系统", command=self.main_screen).pack()

    def student_screen(self, student_id):
        self.clear_screen()
        self.root.geometry("400x300")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="学生信息界面", font=("Helvetica", 16), bg='#f0f0f0').pack(pady=20)
        self.cursor.execute("SELECT * FROM students WHERE student_id=%s", (student_id,))
        student = self.cursor.fetchone()
        self.cursor.execute("SELECT vehicle_id FROM vehicle_routes WHERE student_id=%s", (student_id,))
        vehicle = self.cursor.fetchone()

        student_info = f"学号: {student[0]}\n班级ID: {student[1]}\n姓名: {student[2]}\n监护人电话: {student[3]}\n坐标: {student[4]}\n车辆编号: {vehicle[0] if vehicle else '无'}"
        tk.Label(self.root, text=student_info, bg='#f0f0f0').pack()
        ttk.Button(self.root, text="返回登录", command=self.login_screen).pack(pady=10)

    def driver_screen(self, driver_id):
        self.clear_screen()
        self.root.geometry("600x400")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="司机信息界面", font=("Helvetica", 16), bg='#f0f0f0').pack(pady=20)
        self.cursor.execute("SELECT * FROM driver WHERE driver_id=%s", (driver_id,))
        driver = self.cursor.fetchone()
        self.cursor.execute("SELECT vehicle_id FROM vehicle_routes WHERE driver_id=%s", (driver_id,))
        route = self.cursor.fetchone()

        driver_info = f"司机电话: {driver[0]}\n司机: {driver[1]}\n车辆编号: {route[0] if route else '无'}"
        tk.Label(self.root, text=driver_info, bg='#f0f0f0').pack()
        ttk.Button(self.root, text="返回登录", command=self.login_screen).pack(pady=10)

    def main_screen(self):
        self.clear_screen()
        self.root.geometry("800x600")
        self.root.configure(bg='#f0f0f0')

        ttk.Button(self.root, text="学生管理", command=self.student_management).grid(row=0, column=0, padx=10, pady=10)
        ttk.Button(self.root, text="车辆管理", command=self.vehicle_management).grid(row=0, column=1, padx=10, pady=10)
        ttk.Button(self.root, text="司机管理", command=self.driver_management).grid(row=0, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="行驶规划", command=self.route_planning).grid(row=0, column=3, padx=10, pady=10)

    def student_management(self):
        self.clear_screen()
        self.root.geometry("1080x600")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="学号", bg='#f0f0f0').grid(row=0, column=0, padx=10, pady=10)
        self.student_id_entry = ttk.Entry(self.root)
        self.student_id_entry.grid(row=0, column=1, padx=10, pady=10)

        tk.Label(self.root, text="班级ID", bg='#f0f0f0').grid(row=1, column=0, padx=10, pady=10)
        self.class_id_entry = ttk.Entry(self.root)
        self.class_id_entry.grid(row=1, column=1, padx=10, pady=10)

        tk.Label(self.root, text="姓名", bg='#f0f0f0').grid(row=2, column=0, padx=10, pady=10)
        self.student_name_entry = ttk.Entry(self.root)
        self.student_name_entry.grid(row=2, column=1, padx=10, pady=10)

        tk.Label(self.root, text="监护人电话", bg='#f0f0f0').grid(row=3, column=0, padx=10, pady=10)
        self.guardian_phone_entry = ttk.Entry(self.root)
        self.guardian_phone_entry.grid(row=3, column=1, padx=10, pady=10)

        tk.Label(self.root, text="坐标", bg='#f0f0f0').grid(row=4, column=0, padx=10, pady=10)
        self.coordinate_entry = ttk.Entry(self.root)
        self.coordinate_entry.grid(row=4, column=1, padx=10, pady=10)

        ttk.Button(self.root, text="增加学生", command=self.add_student).grid(row=0, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="删除学生", command=self.delete_student).grid(row=2, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="查询学生", command=self.query_student).grid(row=4, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="返回主界面", command=self.main_screen).grid(row=6, column=0, columnspan=2, pady=20)

        self.student_list = ttk.Treeview(self.root, columns=('学号', '班级ID', '姓名', '监护人电话', '坐标'), show='headings')
        self.student_list.grid(row=7, column=0, columnspan=3, padx=10, pady=10)
        for col in self.student_list['columns']:
            self.student_list.heading(col, text=col)

        self.update_student_list()

    def add_student(self):
        student_id = self.student_id_entry
        student_id = self.student_id_entry.get()
        class_id = self.class_id_entry.get()
        name = self.student_name_entry.get()
        guardian_phone = self.guardian_phone_entry.get()
        coordinate = self.coordinate_entry.get()

        if not student_id or not class_id or not name or not guardian_phone or not coordinate:
            messagebox.showerror("错误", "请填写所有字段")
            return

        self.cursor.execute("INSERT INTO students (student_id, class_id, name, guardian_phone, coordinate) VALUES (%s, %s, %s, %s, %s)",
                            (student_id, class_id, name, guardian_phone, coordinate))
        self.conn.commit()
        messagebox.showinfo("信息", "学生添加成功")
        self.update_student_list()

    def delete_student(self):
        selected_item = self.student_list.selection()
        if not selected_item:
            messagebox.showerror("错误", "请先选择一个学生")
            return
        student = self.student_list.item(selected_item, 'values')
        self.cursor.execute("DELETE FROM students WHERE student_id=%s", (student[0],))
        self.conn.commit()
        messagebox.showinfo("信息", "学生删除成功")
        self.update_student_list()

    def query_student(self):
        self.student_list.delete(*self.student_list.get_children())
        student_id = self.student_id_entry.get()

        query = "SELECT * FROM students WHERE 1=1"
        params = []
        if student_id:
            query += " AND student_id=%s"
            params.append(student_id)

        self.cursor.execute(query, tuple(params))
        for student in self.cursor.fetchall():
            self.student_list.insert('', 'end', values=student)

    def vehicle_management(self):
        self.clear_screen()
        self.root.geometry("1200x600")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="编号", bg='#f0f0f0').grid(row=0, column=0, padx=10, pady=10)
        self.vehicle_id_entry = ttk.Entry(self.root)
        self.vehicle_id_entry.grid(row=0, column=1, padx=10, pady=10)

        tk.Label(self.root, text="车牌", bg='#f0f0f0').grid(row=1, column=0, padx=10, pady=10)
        self.plate_number_entry = ttk.Entry(self.root)
        self.plate_number_entry.grid(row=1, column=1, padx=10, pady=10)

        tk.Label(self.root, text="里程", bg='#f0f0f0').grid(row=2, column=0, padx=10, pady=10)
        self.mileage_entry = ttk.Entry(self.root)
        self.mileage_entry.grid(row=2, column=1, padx=10, pady=10)

        tk.Label(self.root, text="载客量", bg='#f0f0f0').grid(row=3, column=0, padx=10, pady=10)
        self.capacity_entry = ttk.Entry(self.root)
        self.capacity_entry.grid(row=3, column=1, padx=10, pady=10)

        ttk.Button(self.root, text="增加车辆", command=self.add_vehicle).grid(row=0, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="删除车辆", command=self.delete_vehicle).grid(row=2, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="查询车辆", command=self.query_vehicle).grid(row=4, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="返回主界面", command=self.main_screen).grid(row=6, column=0, columnspan=2, pady=20)

        self.vehicle_list = ttk.Treeview(self.root, columns=('编号', '车牌', '里程', '载客量'), show='headings')
        self.vehicle_list.grid(row=7, column=0, columnspan=3, padx=10, pady=10)
        for col in self.vehicle_list['columns']:
            self.vehicle_list.heading(col, text=col)

        self.update_vehicle_list()

    def add_vehicle(self):
        vehicle_id = self.vehicle_id_entry.get()
        plate_number = self.plate_number_entry.get()
        mileage = self.mileage_entry.get()
        capacity = self.capacity_entry.get()

        if not vehicle_id or not plate_number or not mileage or not capacity:
            messagebox.showerror("错误", "请填写所有字段")
            return

        self.cursor.execute("INSERT INTO vehicle (vehicle_id, plate_number, mileage, capacity) VALUES (%s, %s, %s, %s)",
                            (vehicle_id, plate_number, mileage, capacity))
        self.conn.commit()
        messagebox.showinfo("信息", "车辆添加成功")
        self.update_vehicle_list()

    def delete_vehicle(self):
        selected_item = self.vehicle_list.selection()
        if not selected_item:
            messagebox.showerror("错误", "请先选择一辆车辆")
            return
        vehicle = self.vehicle_list.item(selected_item, 'values')
        self.cursor.execute("DELETE FROM vehicle WHERE vehicle_id=%s", (vehicle[0],))
        self.conn.commit()
        messagebox.showinfo("信息", "车辆删除成功")
        self.update_vehicle_list()

    def query_vehicle(self):
        self.vehicle_list.delete(*self.vehicle_list.get_children())
        vehicle_id = self.vehicle_id_entry.get()

        query = "SELECT * FROM vehicle WHERE 1=1"
        params = []
        if vehicle_id:
            query += " AND vehicle_id=%s"
            params.append(vehicle_id)

        self.cursor.execute(query, tuple(params))
        for vehicle in self.cursor.fetchall():
            self.vehicle_list.insert('', 'end', values=vehicle)

    def driver_management(self):
        self.clear_screen()
        self.root.geometry("1080x600")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="司机电话", bg='#f0f0f0').grid(row=0, column=0, padx=10, pady=10)
        self.driver_phone_entry = ttk.Entry(self.root)
        self.driver_phone_entry.grid(row=0, column=1, padx=10, pady=10)

        tk.Label(self.root, text="司机姓名", bg='#f0f0f0').grid(row=1, column=0, padx=10, pady=10)
        self.driver_name_entry = ttk.Entry(self.root)
        self.driver_name_entry.grid(row=1, column=1, padx=10, pady=10)

        ttk.Button(self.root, text="增加司机", command=self.add_driver).grid(row=0, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="删除司机", command=self.delete_driver).grid(row=1, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="查询司机", command=self.query_driver).grid(row=2, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="返回主界面", command=self.main_screen).grid(row=3, column=0, columnspan=2, pady=20)

        self.driver_list = ttk.Treeview(self.root, columns=('司机电话', '司机姓名'), show='headings')
        self.driver_list.grid(row=4, column=0, columnspan=3, padx=10, pady=10)
        for col in self.driver_list['columns']:
            self.driver_list.heading(col, text=col)

        self.update_driver_list()

    def add_driver(self):
        driver_phone = self.driver_phone_entry.get()
        driver_name = self.driver_name_entry.get()

        if not driver_phone or not driver_name:
            messagebox.showerror("错误", "请填写所有字段")
            return

        self.cursor.execute("INSERT INTO driver (driver_phone, driver_name) VALUES (%s, %s)",
                            (driver_phone, driver_name))
        self.conn.commit()
        messagebox.showinfo("信息", "司机添加成功")
        self.update_driver_list()

    def delete_driver(self):
        selected_item = self.driver_list.selection()
        if not selected_item:
            messagebox.showerror("错误", "请先选择一个司机")
            return
        driver = self.driver_list.item(selected_item, 'values')
        self.cursor.execute("DELETE FROM driver WHERE driver_phone=%s", (driver[0],))
        self.conn.commit()
        messagebox.showinfo("信息", "司机删除成功")
        self.update_driver_list()

    def query_driver(self):
        self.driver_list.delete(*self.driver_list.get_children())
        driver_phone = self.driver_phone_entry.get()

        query = "SELECT * FROM driver WHERE 1=1"
        params = []
        if driver_phone:
            query += " AND driver_phone=%s"
            params.append(driver_phone)

        self.cursor.execute(query, tuple(params))
        for driver in self.cursor.fetchall():
            self.driver_list.insert('', 'end', values=driver)

    def route_planning(self):
        self.clear_screen()
        self.root.geometry("1080x800")
        self.root.configure(bg='#f0f0f0')

        tk.Label(self.root, text="行驶规划界面", font=("Helvetica", 16), bg='#f0f0f0').grid(row=0, column=0, columnspan=2, pady=10)

        tk.Label(self.root, text="路线编号",font=("Helvetica", 16), bg='#f0f0f0').grid(row=1, column=0, padx=10, pady=10)
        self.route_id_entry = ttk.Entry(self.root)
        self.route_id_entry.grid(row=1, column=1, padx=10, pady=10)

        tk.Label(self.root, text="车辆编号", bg='#f0f0f0').grid(row=2, column=0, padx=10, pady=10)
        self.vehicle_id_var = tk.StringVar()
        self.vehicle_id_combobox = ttk.Combobox(self.root, textvariable=self.vehicle_id_var)
        self.vehicle_id_combobox['values'] = self.get_vehicle_ids()
        self.vehicle_id_combobox.grid(row=2, column=1, padx=10, pady=10)

        tk.Label(self.root, text="学生编号", bg='#f0f0f0').grid(row=3, column=0, padx=10, pady=10)
        self.student_id_var = tk.StringVar()
        self.student_id_combobox = ttk.Combobox(self.root, textvariable=self.student_id_var)
        self.student_id_combobox['values'] = self.get_student_ids()
        self.student_id_combobox.grid(row=3, column=1, padx=10, pady=10)

        tk.Label(self.root, text="司机编号", bg='#f0f0f0').grid(row=4, column=0, padx=10, pady=10)
        self.driver_id_var = tk.StringVar()
        self.driver_id_combobox = ttk.Combobox(self.root, textvariable=self.driver_id_var)
        self.driver_id_combobox['values'] = self.get_driver_ids()
        self.driver_id_combobox.grid(row=4, column=1, padx=10, pady=10)

        tk.Label(self.root, text="路线", bg='#f0f0f0').grid(row=5, column=0, padx=10, pady=10)
        self.route_entry = ttk.Entry(self.root)
        self.route_entry.grid(row=5, column=1, padx=10, pady=10)

        ttk.Button(self.root, text="增加路线", command=self.add_route).grid(row=6, column=0, padx=10, pady=10)
        ttk.Button(self.root, text="删除路线", command=self.delete_route).grid(row=6, column=1, padx=10, pady=10)
        ttk.Button(self.root, text="查询路线", command=self.query_route).grid(row=6, column=2, padx=10, pady=10)
        ttk.Button(self.root, text="返回主界面", command=self.main_screen).grid(row=7, column=0, columnspan=2, pady=20)

        self.route_list = ttk.Treeview(self.root, columns=('路线编号', '车辆编号', '学生编号', '司机编号', '路线'), show='headings')
        self.route_list.grid(row=8, column=0, columnspan=3, padx=10, pady=10)
        for col in self.route_list['columns']:
            self.route_list.heading(col, text=col)

        self.update_route_list()

    def get_vehicle_ids(self):
        self.cursor.execute("SELECT vehicle_id FROM vehicle")
        return [row[0] for row in self.cursor.fetchall()]

    def get_student_ids(self):
        self.cursor.execute("SELECT student_id FROM students")
        return [row[0] for row in self.cursor.fetchall()]

    def get_driver_ids(self):
        self.cursor.execute("SELECT driver_phone FROM driver")
        return [row[0] for row in self.cursor.fetchall()]

    def add_route(self):
        route_id = self.route_id_entry.get()
        vehicle_id = self.vehicle_id_var.get()
        student_id = self.student_id_var.get()
        driver_id = self.driver_id_var.get()
        route = self.route_entry.get()

        if not route_id or not vehicle_id or not student_id or not driver_id or not route:
            messagebox.showerror("错误", "请填写所有字段")
            return

        self.cursor.execute("INSERT INTO vehicle_routes (route_id, vehicle_id, student_id, driver_phone, route) VALUES (%s, %s, %s, %s, %s)",
                            (route_id, vehicle_id, student_id, driver_id, route))
        self.conn.commit()
        messagebox.showinfo("信息", "路线添加成功")
        self.update_route_list()

    def delete_route(self):
        selected_item = self.route_list.selection()
        if not selected_item:
            messagebox.showerror("错误", "请先选择一条路线")
            return
        route = self.route_list.item(selected_item, 'values')
        self.cursor.execute("DELETE FROM vehicle_routes WHERE route_id=%s", (route[0],))
        self.conn.commit()
        messagebox.showinfo("信息", "路线删除成功")
        self.update_route_list()

    def query_route(self):
        self.route_list.delete(*self.route_list.get_children())
        route_id = self.route_id_entry.get()

        query = "SELECT * FROM vehicle_routes WHERE 1=1"
        params = []
        if route_id:
            query += " AND route_id=%s"
            params.append(route_id)

        self.cursor.execute(query, tuple(params))
        for route in self.cursor.fetchall():
            self.route_list.insert('', 'end', values=route)

    def clear_screen(self):
        for widget in self.root.winfo_children():
            widget.destroy()

    def update_student_list(self):
        self.student_list.delete(*self.student_list.get_children())
        self.cursor.execute("SELECT * FROM students")
        for student in self.cursor.fetchall():
            self.student_list.insert('', 'end', values=student)

    def update_vehicle_list(self):
        self.vehicle_list.delete(*self.vehicle_list.get_children())
        self.cursor.execute("SELECT * FROM vehicle")
        for vehicle in self.cursor.fetchall():
            self.vehicle_list.insert('', 'end', values=vehicle)

    def update_driver_list(self):
        self.driver_list.delete(*self.driver_list.get_children())
        self.cursor.execute("SELECT * FROM driver")
        for driver in self.cursor.fetchall():
            self.driver_list.insert('', 'end', values=driver)

    def update_route_list(self):
        self.route_list.delete(*self.route_list.get_children())
        self.cursor.execute("SELECT * FROM vehicle_routes")
        for route in self.cursor.fetchall():
            self.route_list.insert('', 'end', values=route)

if __name__ == "__main__":
    root = tk.Tk()
    app = SchoolBusSystem(root)
    root.mainloop()

四总结

1总结

  1. 项目背景与目标

本次项目旨在开发一个校车运行管理系统,通过Python编程语言和SQL Server数据库技术,实现对校车运行的全面管理,包括校车调度、学生信息管理、路线规划等功能。项目目标是提高校车运行效率,确保学生上下学的安全与便捷。

(2)项目分析阶段

在项目分析阶段,我们遇到了以下主要问题:

1需求不明确:初始阶段,对于校车运行管理的具体需求了解不够深入,导   致后续设计过程中多次修改。

2技术选型困难:在Python框架和SQL Server的使用上,团队内部存在不   同意见,影响了项目的进展。

解决方法

1深入调研:通过与学生、家长、校车司机等相关人员交流,明确了校车运   行管理的具体需求。

2统一技术选型:经过讨论和比较,最终确定了使用Python开发框架,以及  SQL Server作为数据库管理系统。

(3)系统设计阶段

在设计阶段,我们面临了以下挑战:

1数据库设计复杂:校车运行管理系统涉及多个实体(如学生、校车、司 机、路线等),以及它们之间的复杂关系,导致数据库设计难度较大。

2功能模块划分不清晰:在系统设计初期,对于各个功能模块的划分不够明   确,导致后续开发过程中出现混乱。

解决方法

1ER图建模:使用实体-关系图(ER图)对系统中的实体和关系进行建模,   简化了数据库设计过程。

2明确功能模块:通过多次讨论和修改,最终确定了校车调度、学生信息管   理、路线规划、安全监控等四大功能模块,并明确了它们之间的逻关系  系。

          本次校车运行管理系统的分析与设计项目,通过团队的共同努力,成功完成了系统的需求分析、设计、实现和测试工作。在项目实施过程中,我们不断遇到问题并寻求解决方案,提高了自身的技术能力和团队协作能力。未来,我们将继续关注校车运行管理的最新动态,对系统进行升级和完善,以更好地满足用户需求。同时,我们也希望将本次项目的经验和教训分享给更多的同行,共同推动校车运行管理系统的发展。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;