# 信息科一体化运维系统 **Repository Path**: lanmaobaoyu/xxkSystem ## Basic Information - **Project Name**: 信息科一体化运维系统 - **Description**: Information Department Integrated O&M System - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-05-20 - **Last Updated**: 2026-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 医院信息科一体化运维管理系统 - 故障报修功能 Feature Name: 260519-fault-report-system Updated: 2026-05-19 ## Description 医院信息科一体化运维管理系统第一期实现故障报修功能,采用纯HTML+JavaScript+Python Flask+SQLite3技术栈,提供用户登录认证、故障报修提交、工单管理、统计分析以及系统管理(部门管理、用户管理、故障分类管理、用户分组管理)五大核心功能模块。系统采用模块化架构设计,CSS和JavaScript文件按功能拆分,附件按年月目录结构存储,便于后期扩展和维护。 ## Architecture ```mermaid graph TB subgraph "前端层" A[HTML Templates] B[TailwindCSS + Custom CSS Modules] C[JavaScript Modules] end subgraph "Flask 应用层" D[app.py - 主入口] E[auth/ - 认证模块] F[tickets/ - 工单模块] G[stats/ - 统计模块] H[admin/ - 管理模块] I[utils/ - 工具模块] end subgraph "数据层" J[SQLite3 Database] K[models.py - 数据模型] L[db.py - 数据库操作] end subgraph "文件存储" M[uploads/ - 附件存储] end A --> D B --> A C --> A D --> E D --> F D --> G D --> H D --> I E --> K F --> K G --> K H --> K K --> L L --> J F --> M ``` ### 项目目录结构 ```text hospital-ops/ ├── app.py # Flask 应用主入口 ├── config.py # 配置文件 ├── requirements.txt # Python 依赖 ├── database/ │ ├── db.py # 数据库连接和初始化 │ └── models.py # 数据模型定义 ├── modules/ │ ├── auth/ │ │ ├── __init__.py │ │ ├── routes.py # 认证路由 │ │ └── services.py # 认证业务逻辑 │ ├── tickets/ │ │ ├── __init__.py │ │ ├── routes.py # 工单路由 │ │ └── services.py # 工单业务逻辑 │ ├── stats/ │ │ ├── __init__.py │ │ ├── routes.py # 统计路由 │ │ └── services.py # 统计业务逻辑 │ └── admin/ │ ├── __init__.py │ ├── routes.py # 管理路由 │ └── services.py # 管理业务逻辑 ├── static/ │ ├── css/ │ │ ├── base.css # 基础框架样式 │ │ ├── layout.css # 布局框架样式 │ │ ├── components.css # 通用组件样式 │ │ ├── theme.css # 主题变量 │ │ ├── message-bubble.css # 消息气泡样式 │ │ ├── attachment.css # 附件样式 │ │ ├── code-block.css # 代码块样式 │ │ ├── typing-cursor.css # 打字光标加载动画样式 │ │ └── modules/ │ │ ├── auth.css # 登录模块样式 │ │ ├── tickets.css # 工单模块样式 │ │ ├── stats.css # 统计模块样式 │ │ └── admin.css # 管理模块样式 │ ├── js/ │ │ ├── main.js # 主入口和初始化 │ │ ├── api.js # API 请求封装 │ │ ├── utils.js # 工具函数 │ │ └── modules/ │ │ ├── auth.js # 登录模块脚本 │ │ ├── tickets.js # 工单模块脚本 │ │ ├── stats.js # 统计模块脚本 │ │ └── admin.js # 管理模块脚本 │ └── images/ # 静态图片资源 ├── templates/ │ ├── base.html # 基础模板 │ ├── auth/ │ │ ├── login.html # 登录页面 │ │ └── profile.html # 用户信息页面 │ ├── tickets/ │ │ ├── list.html # 工单列表 │ │ ├── create.html # 新建工单 │ │ └── detail.html # 工单详情 │ ├── stats/ │ │ └── dashboard.html # 统计仪表盘 │ └── admin/ │ ├── departments.html # 部门管理 │ ├── users.html # 用户管理 │ ├── categories.html # 故障分类管理 │ └── groups.html # 用户分组管理 ├── uploads/ # 附件存储目录 │ └── 2026/05/ # 按年月组织的附件 └── tests/ # 测试文件 ├── test_auth.py ├── test_tickets.py ├── test_stats.py └── test_admin.py ``` ## Components and Interfaces ### 1. 认证模块 (auth) **路由接口:** - `POST /api/auth/login` - 用户登录 - `POST /api/auth/logout` - 用户退出 - `GET /api/auth/profile` - 获取用户信息 - `PUT /api/auth/profile` - 更新用户信息 **服务接口:** - `authenticate(username, password)` - 验证用户凭据 - `create_session(user_id)` - 创建用户会话 - `destroy_session(session_id)` - 销毁用户会话 - `check_permission(user_id, permission)` - 检查用户权限 ### 2. 工单模块 (tickets) **路由接口:** - `GET /api/tickets` - 获取工单列表 - `POST /api/tickets` - 创建新工单 - `GET /api/tickets/` - 获取工单详情 - `PUT /api/tickets//status` - 更新工单状态 - `POST /api/tickets//comment` - 添加处理备注 - `POST /api/tickets//attachment` - 上传附件 - `DELETE /api/tickets//attachment/` - 删除附件 **服务接口:** - `create_ticket(data)` - 创建故障工单 - `get_tickets(filters, user_role)` - 按角色查询工单列表 - `update_status(ticket_id, status, comment)` - 更新工单状态 - `add_comment(ticket_id, user_id, comment)` - 添加备注 - `upload_attachment(ticket_id, file)` - 上传附件到服务器 - `delete_attachment(file_id)` - 删除附件文件 ### 3. 统计模块 (stats) **路由接口:** - `GET /api/stats/summary` - 获取统计摘要 - `GET /api/stats/by-category` - 按分类统计 - `GET /api/stats/by-priority` - 按优先级统计 - `GET /api/stats/by-department` - 按科室统计 - `GET /api/stats/trend` - 获取趋势数据 **服务接口:** - `get_summary(date_range)` - 计算统计摘要 - `get_distribution(group_by)` - 获取分布数据 - `get_trend(period)` - 获取趋势数据 ### 4. 管理模块 (admin) **路由接口:** - `GET /api/admin/departments` - 获取部门列表 - `POST /api/admin/departments` - 创建部门 - `PUT /api/admin/departments/` - 更新部门 - `DELETE /api/admin/departments/` - 删除部门 - `GET /api/admin/users` - 获取用户列表 - `POST /api/admin/users` - 创建用户 - `PUT /api/admin/users/` - 更新用户 - `PUT /api/admin/users//disable` - 禁用用户 - `GET /api/admin/categories` - 获取故障分类树 - `POST /api/admin/categories` - 创建分类 - `PUT /api/admin/categories/` - 更新分类 - `DELETE /api/admin/categories/` - 删除分类 - `GET /api/admin/groups` - 获取用户分组列表 - `POST /api/admin/groups` - 创建分组 - `PUT /api/admin/groups/` - 更新分组 - `DELETE /api/admin/groups/` - 删除分组 - `POST /api/admin/groups//users` - 添加用户到分组 **服务接口:** - `create_department(data)` - 创建部门 - `delete_department(dept_id)` - 删除部门(检查关联数据) - `create_user(data)` - 创建用户 - `disable_user(user_id)` - 禁用用户并终止会话 - `create_category(data)` - 创建故障分类节点 - `delete_category(category_id)` - 删除分类(检查工单关联) - `create_group(data)` - 创建用户分组 - `add_users_to_group(group_id, user_ids)` - 批量添加用户到分组 ## Data Models ### 用户表 (users) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 用户ID | | username | VARCHAR(50) | UNIQUE NOT NULL | 用户名(工号) | | password_hash | VARCHAR(128) | NOT NULL | 密码哈希 | | real_name | VARCHAR(50) | NOT NULL | 真实姓名 | | department_id | INTEGER | FOREIGN KEY REFERENCES departments(id) | 所属部门 | | role | VARCHAR(20) | NOT NULL DEFAULT 'user' | 角色:user/engineer/admin | | phone | VARCHAR(20) | | 联系电话 | | email | VARCHAR(100) | | 电子邮箱 | | is_active | BOOLEAN | DEFAULT 1 | 是否启用 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | | last_login | DATETIME | | 最后登录时间 | | login_attempts | INTEGER | DEFAULT 0 | 登录失败次数 | | locked_until | DATETIME | | 账户锁定截止时间 | ### 部门表 (departments) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 部门ID | | name | VARCHAR(100) | NOT NULL | 部门名称 | | code | VARCHAR(20) | UNIQUE NOT NULL | 部门编码 | | parent_id | INTEGER | FOREIGN KEY REFERENCES departments(id) | 上级部门 | | sort_order | INTEGER | DEFAULT 0 | 排序顺序 | | is_active | BOOLEAN | DEFAULT 1 | 是否启用 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | ### 用户分组表 (user_groups) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 分组ID | | name | VARCHAR(100) | NOT NULL | 分组名称 | | description | TEXT | | 分组描述 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | ### 用户分组成员表 (group_members) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 成员ID | | group_id | INTEGER | FOREIGN KEY REFERENCES user_groups(id) | 分组ID | | user_id | INTEGER | FOREIGN KEY REFERENCES users(id) | 用户ID | | joined_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 加入时间 | ### 故障分类表 (fault_categories) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 分类ID | | name | VARCHAR(100) | NOT NULL | 分类名称 | | code | VARCHAR(20) | UNIQUE NOT NULL | 分类编码 | | parent_id | INTEGER | FOREIGN KEY REFERENCES fault_categories(id) | 上级分类 | | sort_order | INTEGER | DEFAULT 0 | 排序顺序 | | is_active | BOOLEAN | DEFAULT 1 | 是否启用 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | ### 故障工单表 (tickets) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 工单ID | | ticket_no | VARCHAR(20) | UNIQUE NOT NULL | 工单号 (格式: YYYYMMDD-XXX) | | title | VARCHAR(200) | NOT NULL | 故障标题 | | description | TEXT | NOT NULL | 故障描述 | | category_id | INTEGER | FOREIGN KEY REFERENCES fault_categories(id) | 故障分类 | | priority | VARCHAR(10) | NOT NULL DEFAULT '中' | 优先级:紧急/高/中/低 | | status | VARCHAR(20) | NOT NULL DEFAULT '待处理' | 状态:待处理/处理中/已完成/已关闭 | | reporter_id | INTEGER | FOREIGN KEY REFERENCES users(id) | 报修人ID | | assignee_id | INTEGER | FOREIGN KEY REFERENCES users(id) | 处理人ID | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | | updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 更新时间 | | resolved_at | DATETIME | | 完成时间 | ### 工单备注表 (ticket_comments) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 备注ID | | ticket_id | INTEGER | FOREIGN KEY REFERENCES tickets(id) | 工单ID | | user_id | INTEGER | FOREIGN KEY REFERENCES users(id) | 操作人ID | | content | TEXT | NOT NULL | 备注内容 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | ### 工单附件表 (ticket_attachments) | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 附件ID | | ticket_id | INTEGER | FOREIGN KEY REFERENCES tickets(id) | 工单ID | | user_id | INTEGER | FOREIGN KEY REFERENCES users(id) | 上传人ID | | file_name | VARCHAR(255) | NOT NULL | 原始文件名 | | file_path | VARCHAR(500) | NOT NULL | 服务器存储路径 | | file_size | INTEGER | NOT NULL | 文件大小(字节) | | file_type | VARCHAR(50) | | 文件MIME类型 | | created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 上传时间 | ## Correctness Properties 1. **工单号唯一性**: 每个工单号在系统中唯一,格式为 `YYYYMMDD-XXX` 2. **状态流转约束**: 工单状态只能按 `待处理 → 处理中 → 已完成 → 已关闭` 顺序流转 3. **角色权限隔离**: 普通用户只能查看自己提交的工单,工程师和管理员可查看所有工单 4. **密码安全**: 密码必须使用 werkzeug 的 generate_password_hash 加密存储 5. **会话安全**: 会话超时时间为30分钟无操作 6. **输入验证**: 所有用户输入必须进行服务端验证,防止SQL注入和XSS攻击 7. **数据完整性**: 外键约束确保关联数据的完整性 8. **附件存储**: 附件按 `uploads/YYYY/MM/` 目录结构存储,文件名使用UUID避免冲突 9. **级联保护**: 删除部门、分类、用户前必须检查是否存在关联的工单数据 10. **文件类型限制**: 仅允许上传图片格式(jpg/png/gif/webp)和常见文档格式(pdf/doc/docx/xls/xlsx),单文件大小不超过10MB ## Error Handling ### 错误场景及处理策略 | 场景 | 错误码 | 用户提示 | 处理策略 | |------|--------|----------|----------| | 登录失败 | 401 | "用户名或密码错误" | 记录失败次数,超过5次锁定账户 | | 会话过期 | 401 | "登录已过期,请重新登录" | 重定向到登录页 | | 权限不足 | 403 | "您没有权限执行此操作" | 记录审计日志 | | 工单不存在 | 404 | "工单不存在" | 返回404页面 | | 输入验证失败 | 400 | "请检查输入内容" | 返回字段级错误信息 | | 数据库错误 | 500 | "系统繁忙,请稍后重试" | 记录错误日志,返回500页面 | | 并发冲突 | 409 | "工单已被其他工程师处理" | 刷新工单状态 | | 文件上传超限 | 413 | "文件大小超过10MB限制" | 拒绝上传并提示 | | 不支持的文件格式 | 415 | "不支持该文件格式" | 列出支持的文件格式 | | 关联数据保护 | 409 | "存在关联数据,无法删除" | 说明关联关系 | ### 错误页面 - `404.html` - 页面不存在 - `500.html` - 服务器内部错误 - `403.html` - 权限不足 ## Test Strategy ### 测试类型 1. **单元测试** - 认证服务:密码验证、会话管理、账户锁定 - 工单服务:创建、查询、状态更新、备注添加、附件上传 - 统计服务:数据聚合、趋势计算 - 管理服务:部门/用户/分类/分组的CRUD、关联数据保护 2. **集成测试** - 用户登录流程 - 工单创建和查询流程(含附件上传) - 状态流转流程 - 管理员操作流程 3. **前端测试** - 表单验证 - API 请求和响应 - 页面交互和权限控制 - 附件预览和下载 ### 测试覆盖目标 - 核心业务逻辑覆盖率 ≥ 80% - API 接口覆盖率 ≥ 90% - 关键路径 100% 覆盖 ### 测试工具 - Python: `pytest` + `pytest-flask` - JavaScript: 原生测试或 Jest(可选) ## References [^1]: (TailwindCSS 文档) - [https://tailwindcss.com/docs](https://tailwindcss.com/docs) [^2]: (Flask 文档) - [https://flask.palletsprojects.com/](https://flask.palletsprojects.com/) [^3]: (SQLite3 文档) - [https://www.sqlite.org/docs.html](https://www.sqlite.org/docs.html) [^4]: (Werkzeug 安全) - [https://werkzeug.palletsprojects.com/en/stable/utils/](https://werkzeug.palletsprojects.com/en/stable/utils/) ## 界面预览 ## AI技术交流群 ## 捐赠 医院信息科一体化运维管理系统 医院信息科一体化运维管理系统第一期实现故障报修功能,采用纯HTML+JavaScript+Python Flask+SQLite3技术栈,提供用户登录认证、故障报修提交、工单管理、统计分析以及系统管理(部门管理、用户管理、故障分类管理、用户分组管理)五大核心功能模块。系统采用模块化架构设计,CSS和JavaScript文件按功能拆分,附件按年月目录结构存储,便于后期扩展和维护。 如果您认为 医院信息科一体化运维管理系统 帮到了您的Ai开发工作,您可以进行捐赠 ,捐赠无门槛,哪怕是一杯可乐也好(相信这比打赏主播更有意义)。