首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 WorkBuddy 从零搭建地铁培训管理系统:Flask + SQLite + openpyxl 实战教程

用 WorkBuddy 从零搭建地铁培训管理系统:Flask + SQLite + openpyxl 实战教程

原创
作者头像
用户12597793
修改2026-07-02 15:35:43
修改2026-07-02 15:35:43
50
举报

用 WorkBuddy 从零搭建地铁培训管理系统:Flask + SQLite + openpyxl 实战教程


一、写在前面

我是工程师,平时除了做机电系统的网络技术维护,还要管理培训台账。以前这些全靠 Excel 表格传来传去,版本混乱、查找困难、统计全靠手动。

一直想做一个轻量化的管理系统来兜住这些数据,但日常工作太忙,前端后端都得自己来,迟迟没动工。直到我试了 WorkBuddy,发现可以用它来辅助编码、调试、排查问题,效率直接提了一大截。

前后大概花了两周的碎片时间,在 WorkBuddy 的辅助下完成了这个基于 Flask 的培训管理系统,目前已经稳定跑了快一个月。这篇文章把我的完整开发过程和踩坑记录分享出来,希望对想做内部工具的同行有帮助。


二、需求梳理(用 WorkBuddy 帮我把需求理清楚)

一开始我的需求其实挺模糊的,只知道"上岗证"。我把大概想法跟 WorkBuddy 说了一下,它帮我梳理出几个核心模块:

2.1 核心功能模块

模块

功能

员工档案

员工基本信息管理,增删改查

上岗证管理

持证信息增删改查,支持多选删除

技能鉴定

技能等级记录与管理

施工负责人台账

分内部/委外/外单位三种类型管理

Excel 导入导出

支持批量导入导出数据,方便和线下表格对接

随机试卷生成

基于题库(接触网800题)自动生成试卷

2.2 技术选型决策

我一开始也纠结过要不要用 Django 或者直接上前后端分离,但 WorkBuddy 帮我分析了一下:

  • 轻量级内部工具 → Flask 就够用,学习成本低、启动快
  • 数据量不大 → SQLite 零配置,不需要额外装数据库
  • 需要和 Excel 打交道 → openpyxl 成熟稳定,读写 xlsx 没问题
  • 公司没外网服务器 → 本地跑 .bat 脚本 最省事

这个选型思路我采纳了,后面做下来确实够用。


三、开发环境搭建

3.1 安装依赖

bash

代码语言:javascript
复制
pip install flask
pip install flask-sqlalchemy
pip install openpyxl

项目结构如下:

代码语言:javascript
复制
training_system/
├── app.py              # 主程序入口
├── models.py           # 数据库模型
├── routes/             # 路由模块
│   ├── employee.py     # 员工档案
│   ├── certificate.py  # 上岗证
│   ├── skill.py        # 技能鉴定
│   └── contractor.py   # 施工负责人
├── templates/          # HTML 模板
├── static/             # CSS/JS
├── data/               # 数据库文件
└── run.bat             # 启动脚本

3.2 启动脚本(run.bat)

因为公司电脑不能装乱七八糟的服务,直接写一个 .bat 脚本来启动:

代码语言:javascript
复制
@echo off
cd /d %~dp0
C:\Python312\python.exe app.py
pause

双击就能跑,简单粗暴。


四、核心功能开发(WorkBuddy 辅助编码的过程)

4.1 上岗证管理模块

这是最核心的功能。我需要做一个页面来管理员工的上岗证信息,包括持证类型、编号、有效期、发证单位等。

关键代码片段:

代码语言:javascript
复制
# models.py - 上岗证模型
class Certificate(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey('employee.id'))
    cert_type = db.Column(db.String(50))  # 上岗证类型
    cert_no = db.Column(db.String(100))   # 证书编号
    issue_date = db.Column(db.Date)       # 发证日期
    expire_date = db.Column(db.Date)      # 到期日期
    issue_unit = db.Column(db.String(100)) # 发证单位

踩坑点:一开始 expire_date 我用的 String 类型,workbuddy 提醒我日期字段最好用 Date 类型,方便后续做到期提醒和查询。

4.2 多选删除功能

用户反馈说一个个删太慢,要求加多选删除。WorkBuddy 给了我一个方案——用 JS 收集选中的 checkbox,拼成 IDs 传给后端:

代码语言:javascript
复制
// 前端 JS - 多选删除
function deleteSelected() {
    var ids = [];
    $('input[name="selected_ids"]:checked').each(function() {
        ids.push($(this).val());
    });
    if (ids.length === 0) return;
    if (!confirm('确认删除选中的 ' + ids.length + ' 条记录?')) return;
    
    $.post('/certificate/delete_multi', {ids: ids.join(',')}, function(res) {
        if (res.success) location.reload();
    });
}
代码语言:javascript
复制
# 后端 - 批量删除
@app.route('/certificate/delete_multi', methods=['POST'])
def delete_multi():
    ids = request.form.get('ids', '')
    if ids:
        id_list = [int(x) for x in ids.split(',') if x.strip()]
        Certificate.query.filter(Certificate.id.in_(id_list)).delete()
        db.session.commit()
    return jsonify({'success': True})

4.3 Excel 导入导出

这是和线下流程对接的关键功能。以前台账都在 Excel 里,要是全部手工录入就疯了。

导出功能(openpyxl):

代码语言:javascript
复制
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment

def export_certificates():
    wb = Workbook()
    ws = wb.active
    ws.title = "上岗证信息"
    
    # 表头
    headers = ['姓名', '上岗证类型', '证书编号', '发证日期', '到期日期', '发证单位']
    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.font = Font(bold=True)
        cell.alignment = Alignment(horizontal='center')
    
    # 数据行
    for row, cert in enumerate(Certificate.query.all(), 2):
        ws.cell(row=row, column=1, value=cert.employee.name)
        ws.cell(row=row, column=2, value=cert.cert_type)
        ws.cell(row=row, column=3, value=cert.cert_no)
        # ...
    
    wb.save('上岗证导出.xlsx')

导入功能: 读取 xlsx 逐行写入数据库,同时做重复校验,避免重复导入。

4.4 施工负责人台账

根据实际业务,施工负责人要分内部委外外单位三种类型,需要额外的类型筛选和搜索功能。

WorkBuddy 建议我用一个 type 字段来区分三种类型,然后前端用下拉菜单筛选,后端用 filter_by 查询,代码非常简洁:

代码语言:javascript
复制
@app.route('/contractor')
def contractor_list():
    ctype = request.args.get('type', '')  # internal/outsource/external
    search = request.args.get('search', '')
    query = Contractor.query
    if ctype:
        query = query.filter_by(contractor_type=ctype)
    if search:
        query = query.filter(Contractor.name.contains(search))
    contractors = query.all()
    return render_template('contractor.html', contractors=contractors)

4.5 随机试卷生成系统 v2.0

这是另一个独立模块,基于 800 题的题库,支持多 xlsx 题库切换。

踩坑记录:中文路径在 openpyxl 下读取会报编码问题。WorkBuddy 帮我定位到问题出在 os.path.exists() 的文件路径编码上,最后用 Path 对象处理中文路径解决了。

代码语言:javascript
复制
from pathlib import Path

# 用 Path 处理中文路径,避免编码问题
file_path = Path('题库/接触网题库.xlsx')
if file_path.exists():
    wb = openpyxl.load_workbook(str(file_path))

五、部署与穿透(环境受限下的解决方案)

5.1 公司网络限制

深圳那边的办公网络只能插网线,没有公网 IP,而且公司防火墙封了 SSH 隧道。

5.2 用 LocalTunnel 绕过限制

WorkBuddy 帮我查到了 LocalTunnel 这个方案,一条命令搞定:

代码语言:javascript
复制
npx localtunnel --port 5000

它会生成一个临时公网 URL(如 https://xxxx.loca.lt),外网就能访问了。虽然不稳定但做演示和临时访问够用。

5.3 整到启动脚本里

代码语言:javascript
复制
@echo off
cd /d %~dp0
start "Flask" "C:\Python312\python.exe" app.py
timeout /t 5
start "LT" cmd /c "npx localtunnel --port 5000"

六、踩坑记录汇总

做这个项目遇到不少坑,列出来供大家参考:

原因

解决

Flask 中文乱码

数据库编码没设 utf-8

models.py 加 __tablename__ 和 mysql_charset,SQLite 连接加 ?charset=utf-8

openpyxl 读中文路径文件报错

系统编码与 Python 编码不一致

改用 pathlib.Path 处理路径

多选删除不小心把全表删了

SQL 没加 where 条件

加 id_list 过滤,先测试再上线

PDF 页脚时间显示完整日期时间

submit_time 字段格式问题

统一调整为仅显示日期格式 date()

LocalTunnel 频繁断连

免费版限制

配合 .bat 定时重连

公司防火墙拦截

SSH 端口被封

改用 HTTP 隧道(LocalTunnel)


七、效果展示

系统上线后,部门的培训台账管理效率提升了很多:

  • ✅ 上岗证到期提醒,不再遗漏续期
  • ✅ Excel 一键导入导出,和线下表格无缝对接
  • ✅ 多选删除 + 搜索查询,日常维护省时省力
  • ✅ 随机试卷自动生成,培训考试不用手动出题

八、总结与心得

这次用 WorkBuddy 辅助开发,最大的感受是:

  1. 开发效率确实高——很多细节 WorkBuddy 能直接给你代码,不用到处查资料
  2. 踩坑能少走弯路——遇到问题直接问,比去搜论坛快多了
  3. 适合做内部工具——对我来说,Flask + SQLite 这种轻量方案比什么微服务架构实用得多

当然 WorkBuddy 也不是万能——复杂的业务逻辑还是得自己理清楚,代码质量也得自己把关。但作为一个AI辅助编码工具,它确实帮我省了大量时间。

如果你是做内部系统开发的,强烈推荐试试这个组合:Flask + SQLite + openpyxl + WorkBuddy,低成本、高效率。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用 WorkBuddy 从零搭建地铁培训管理系统:Flask + SQLite + openpyxl 实战教程
    • 一、写在前面
    • 二、需求梳理(用 WorkBuddy 帮我把需求理清楚)
      • 2.1 核心功能模块
      • 2.2 技术选型决策
    • 三、开发环境搭建
      • 3.1 安装依赖
      • 3.2 启动脚本(run.bat)
    • 四、核心功能开发(WorkBuddy 辅助编码的过程)
      • 4.1 上岗证管理模块
      • 4.2 多选删除功能
      • 4.3 Excel 导入导出
      • 4.4 施工负责人台账
      • 4.5 随机试卷生成系统 v2.0
    • 五、部署与穿透(环境受限下的解决方案)
      • 5.1 公司网络限制
      • 5.2 用 LocalTunnel 绕过限制
      • 5.3 整到启动脚本里
    • 六、踩坑记录汇总
    • 七、效果展示
    • 八、总结与心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档