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、请求和异常 |
三、系统架构
系统采用经典前后端分离架构:
text
浏览器 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 中,适合教学示例快速理解。页面结构如下:
text
App.vue
├─ 顶部 Hero 区域:系统名称、当前用户、退出按钮
├─ 登录/注册卡片:未登录时显示
├─ 数据看板:登录后显示
└─ 业务标签页
├─ 文档中心
├─ 任务协同
└─ 审批流程
前端状态处理:
user保存当前登录用户;stats保存看板统计;docs/tasks/approvals保存业务列表;api.js统一管理后端地址、token 读写和请求错误处理。
八、核心代码讲解
1. 数据库连接
backend/app/database.py 负责创建 SQLite 引擎和 Session:
python
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 通过依赖注入获取数据库会话:
python
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
2. 密码哈希与 JWT
auth.py 中使用 bcrypt 对密码进行哈希:
python
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def get_password_hash(password: str) -> str:
return pwd_context.hash(password)
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
登录成功后生成 JWT:
python
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
3. 受保护接口
例如创建任务接口:
python
@app.post("/api/tasks", response_model=schemas.TaskRead)
def create_task(
task: schemas.TaskCreate,
db: Session = Depends(get_db),
current_user: models.User = Depends(auth.get_current_user)
):
return crud.create_task(db, current_user.id, task)
只有请求头携带合法 token 时,current_user 才能解析成功。
4. 前端 API 封装
frontend/src/api.js 统一追加 token:
javascript
if (token) headers.Authorization = `Bearer ${token}`
const response = await fetch(`${API_BASE}${path}`, { ...options, headers })
登录后保存 token:
javascript
export function setToken(value) {
token = value || ''
if (token) localStorage.setItem('office_token', token)
else localStorage.removeItem('office_token')
}
这样 Vue 组件不需要重复处理认证细节。
九、部署与运行步骤
1. 后端运行
bash
cd project/backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
后端默认地址:http://localhost:8000。
可访问接口文档:
text
http://localhost:8000/docs
2. 前端运行
bash
cd project/frontend
npm install
npm run dev
默认访问:http://localhost:5173。
3. 使用流程
- 打开前端页面;
- 注册一个账号,例如
admin / admin123; - 登录进入系统;
- 新增文档、任务和审批单;
- 查看顶部数据看板变化;
- 点击退出登录,验证鉴权状态处理。
十、项目目录
text
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 全栈项目从需求分析、数据建模、接口开发、前端交互到部署运行的完整流程。