Python全栈项目–智能办公自动化系统
一、项目简介
智能办公自动化系统是一个面向企业、学校或团队内部的轻量级 OA 平台。它把日常办公中最常见的文档沉淀、任务协同、审批流转和统计看板整合在一个 Web 系统中,用户完成注册登录后即可管理自己的办公数据。
本项目不是单纯演示某个算法或概念,而是一个可运行的 Python 全栈项目:后端提供 RESTful API、SQLite 数据持久化、密码哈希和 JWT 鉴权;前端使用 Vue 3 + Vite 构建单页应用,完成登录态保存、鉴权请求、业务表单和列表展示。
适用场景:
- 企业内部 OA 原型
- 课程设计/毕业设计全栈项目
- FastAPI + Vue 3 前后端分离实战
- 办公自动化业务建模参考
二、技术栈
| 层级 | 技术 | 说明 |
|---|---|---|
| 后端框架 | FastAPI | 构建高性能 REST API,自动生成接口文档 |
| 数据库 | SQLite | 单文件数据库,适合教学、原型和本地部署 |
| ORM | SQLAlchemy | 定义用户、文档、任务、审批等数据模型 |
| 数据校验 | Pydantic | 请求参数和响应结构校验 |
| 鉴权 | passlib + python-jose | bcrypt 密码哈希、JWT 登录 token |
| 前端 | Vue 3 + Vite | 组件化单页应用、快速开发调试 |
| 接口通信 | Fetch API 封装 | 统一处理 token、请求和异常 |
三、系统架构
系统采用经典前后端分离架构:
浏览器 Vue 3 前端 ├─ 登录/注册页面 ├─ 文档中心 ├─ 任务协同 ├─ 审批流程 └─ 办公看板 │ Authorization: Bearer <JWT> ▼ FastAPI 后端服务 ├─ auth.py:密码哈希与 JWT 鉴权 ├─ main.py:接口路由 ├─ crud.py:业务操作 ├─ schemas.py:请求响应模型 └─ models.py:SQLAlchemy ORM 模型 │ ▼ SQLite 数据库 office_automation.db架构特点:
- 注册和登录接口开放访问;核心业务接口全部通过 JWT 保护。
- 前端登录后把 token 保存到 localStorage,请求时统一追加
Authorization请求头。 - SQLite 自动建表,降低部署门槛。
- 文档、任务、审批都绑定当前登录用户,避免越权访问。
四、功能模块
1. 用户认证模块
- 用户注册:用户名、邮箱、密码、姓名、部门
- 密码哈希:后端不保存明文密码
- 用户登录:校验账号密码并签发 JWT
- 当前用户:根据 token 获取用户信息
- 退出登录:前端清理本地 token
2. 文档中心
- 新增文档:标题、分类、内容、状态
- 文档查询:支持按标题关键字检索
- 适用办公通知、制度、会议纪要等场景
3. 任务协同
- 创建任务:标题、说明、优先级、截止日期
- 任务列表:按当前用户隔离
- 任务更新:可将任务标记为完成
- 看板统计:统计任务数量和完成数量
4. 审批流程
- 提交审批:请假、报销、采购、通用审批
- 审批列表:查看个人审批单
- 审批决策:模拟通过或驳回流程
- 看板统计:展示待处理审批数量
5. 办公看板
- 文档总数
- 任务总数
- 待处理审批数
- 已完成任务数
五、数据库/数据模型设计
项目使用 SQLite,核心表包括users、documents、tasks、approvals。
用户表 users
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| username | String | 用户名,唯一 |
| String | 邮箱,唯一 | |
| hashed_password | String | bcrypt 哈希密码 |
| full_name | String | 姓名 |
| department | String | 部门 |
| is_active | Boolean | 是否启用 |
| created_at | DateTime | 创建时间 |
文档表 documents
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| title | String | 文档标题 |
| category | String | 分类 |
| content | Text | 内容 |
| status | String | 状态 |
| owner_id | Integer | 所属用户 |
| created_at/updated_at | DateTime | 创建/更新时间 |
任务表 tasks
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| title | String | 任务标题 |
| description | Text | 说明 |
| priority | String | 优先级 |
| status | String | 状态 |
| due_date | String | 截止日期 |
| owner_id | Integer | 所属用户 |
审批表 approvals
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| title | String | 审批标题 |
| approval_type | String | 审批类型 |
| reason | Text | 申请原因 |
| status | String | pending/approved/rejected |
| comment | Text | 审批意见 |
| applicant_id | Integer | 申请人 |
六、后端接口设计
| 方法 | URL | 功能 | 是否需要登录 |
|---|---|---|---|
| GET | /api/health | 健康检查 | 否 |
| POST | /api/auth/register | 注册 | 否 |
| POST | /api/auth/login | 登录 | 否 |
| GET | /api/users/me | 当前用户 | 是 |
| GET | /api/dashboard | 看板统计 | 是 |
| POST | /api/documents | 创建文档 | 是 |
| GET | /api/documents?keyword= | 文档列表/搜索 | 是 |
| POST | /api/tasks | 创建任务 | 是 |
| GET | /api/tasks?status_filter= | 任务列表 | 是 |
| PATCH | /api/tasks/{task_id} | 更新任务 | 是 |
| POST | /api/approvals | 提交审批 | 是 |
| GET | /api/approvals | 审批列表 | 是 |
| PATCH | /api/approvals/{id}/decision | 审批决策 | 是 |
接口设计遵循三个原则:
- 认证接口独立放在
/api/auth下; - 业务资源使用复数名词,如
documents、tasks; - 业务接口通过
Depends(auth.get_current_user)获取当前用户。
七、前端页面设计
前端使用 Vue 3 + Vite,核心页面集中在App.vue中,适合教学示例快速理解。页面结构如下:
App.vue ├─ 顶部 Hero 区域:系统名称、当前用户、退出按钮 ├─ 登录/注册卡片:未登录时显示 ├─ 数据看板:登录后显示 └─ 业务标签页 ├─ 文档中心 ├─ 任务协同 └─ 审批流程前端状态处理:
user保存当前登录用户;stats保存看板统计;docs/tasks/approvals保存业务列表;api.js统一管理后端地址、token 读写和请求错误处理。
八、核心代码讲解
1. 数据库连接
backend/app/database.py负责创建 SQLite 引擎和 Session:
DATABASE_URL="sqlite:///./office_automation.db"engine=create_engine(DATABASE_URL,connect_args={"check_same_thread":False})SessionLocal=sessionmaker(autocommit=False,autoflush=False,bind=engine)Base=declarative_base()FastAPI 通过依赖注入获取数据库会话:
defget_db():db=SessionLocal()try:yielddbfinally:db.close()2. 密码哈希与 JWT
auth.py中使用 bcrypt 对密码进行哈希:
pwd_context=CryptContext(schemes=["bcrypt"],deprecated="auto")defget_password_hash(password:str)->str:returnpwd_context.hash(password)defverify_password(plain_password:str,hashed_password:str)->bool:returnpwd_context.verify(plain_password,hashed_password)登录成功后生成 JWT:
defcreate_access_token(data:dict,expires_delta:Optional[timedelta]=None)->str:to_encode=data.copy()expire=datetime.utcnow()+(expires_deltaortimedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))to_encode.update({"exp":expire})returnjwt.encode(to_encode,SECRET_KEY,algorithm=ALGORITHM)3. 受保护接口
例如创建任务接口:
@app.post("/api/tasks",response_model=schemas.TaskRead)defcreate_task(task:schemas.TaskCreate,db:Session=Depends(get_db),current_user:models.User=Depends(auth.get_current_user)):returncrud.create_task(db,current_user.id,task)只有请求头携带合法 token 时,current_user才能解析成功。
4. 前端 API 封装
frontend/src/api.js统一追加 token:
if(token)headers.Authorization=`Bearer${token}`constresponse=awaitfetch(`${API_BASE}${path}`,{...options,headers})登录后保存 token:
exportfunctionsetToken(value){token=value||''if(token)localStorage.setItem('office_token',token)elselocalStorage.removeItem('office_token')}这样 Vue 组件不需要重复处理认证细节。
九、部署与运行步骤
1. 后端运行
cdproject/backend python3-mvenv .venvsource.venv/bin/activate pipinstall-rrequirements.txt uvicorn app.main:app--reload--host0.0.0.0--port8000后端默认地址:http://localhost:8000。
可访问接口文档:
http://localhost:8000/docs2. 前端运行
cdproject/frontendnpminstallnpmrun dev默认访问:http://localhost:5173。
3. 使用流程
- 打开前端页面;
- 注册一个账号,例如
admin / admin123; - 登录进入系统;
- 新增文档、任务和审批单;
- 查看顶部数据看板变化;
- 点击退出登录,验证鉴权状态处理。
十、项目目录
project/ README.md backend/ requirements.txt app/ __init__.py main.py database.py models.py schemas.py crud.py auth.py frontend/ package.json index.html src/ main.js App.vue api.js style.css十一、项目总结
本项目完整覆盖了全栈开发的关键环节:
- 后端:FastAPI 路由、SQLite 持久化、SQLAlchemy ORM、Pydantic 数据校验;
- 安全:密码哈希、JWT 签发、受保护接口、用户数据隔离;
- 前端:Vue 3 单页应用、登录态维护、鉴权请求、业务表单和列表渲染;
- 工程化:前后端目录拆分、README 运行说明、可打包发布。
后续可以继续扩展:
- 增加角色权限,例如普通员工、部门主管、管理员;
- 引入审批流节点,让审批从“模拟决策”升级为真实多人流转;
- 增加文件上传,将文档附件保存到对象存储;
- 接入消息通知,任务和审批变更时推送提醒;
- 使用 PostgreSQL/MySQL 替换 SQLite,用于生产部署。
通过这个项目,可以比较系统地掌握 Python 全栈项目从需求分析、数据建模、接口开发、前端交互到部署运行的完整流程。
项目代码
下载链接