我是工程师,平时除了做机电系统的网络技术维护,还要管理培训台账。以前这些全靠 Excel 表格传来传去,版本混乱、查找困难、统计全靠手动。
一直想做一个轻量化的管理系统来兜住这些数据,但日常工作太忙,前端后端都得自己来,迟迟没动工。直到我试了 WorkBuddy,发现可以用它来辅助编码、调试、排查问题,效率直接提了一大截。
前后大概花了两周的碎片时间,在 WorkBuddy 的辅助下完成了这个基于 Flask 的培训管理系统,目前已经稳定跑了快一个月。这篇文章把我的完整开发过程和踩坑记录分享出来,希望对想做内部工具的同行有帮助。
一开始我的需求其实挺模糊的,只知道"上岗证"。我把大概想法跟 WorkBuddy 说了一下,它帮我梳理出几个核心模块:
模块 | 功能 |
|---|---|
员工档案 | 员工基本信息管理,增删改查 |
上岗证管理 | 持证信息增删改查,支持多选删除 |
技能鉴定 | 技能等级记录与管理 |
施工负责人台账 | 分内部/委外/外单位三种类型管理 |
Excel 导入导出 | 支持批量导入导出数据,方便和线下表格对接 |
随机试卷生成 | 基于题库(接触网800题)自动生成试卷 |
我一开始也纠结过要不要用 Django 或者直接上前后端分离,但 WorkBuddy 帮我分析了一下:
这个选型思路我采纳了,后面做下来确实够用。
bash
pip install flask
pip install flask-sqlalchemy
pip install openpyxl项目结构如下:
training_system/
├── app.py # 主程序入口
├── models.py # 数据库模型
├── routes/ # 路由模块
│ ├── employee.py # 员工档案
│ ├── certificate.py # 上岗证
│ ├── skill.py # 技能鉴定
│ └── contractor.py # 施工负责人
├── templates/ # HTML 模板
├── static/ # CSS/JS
├── data/ # 数据库文件
└── run.bat # 启动脚本因为公司电脑不能装乱七八糟的服务,直接写一个 .bat 脚本来启动:
@echo off
cd /d %~dp0
C:\Python312\python.exe app.py
pause双击就能跑,简单粗暴。
这是最核心的功能。我需要做一个页面来管理员工的上岗证信息,包括持证类型、编号、有效期、发证单位等。
关键代码片段:
# 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 类型,方便后续做到期提醒和查询。
用户反馈说一个个删太慢,要求加多选删除。WorkBuddy 给了我一个方案——用 JS 收集选中的 checkbox,拼成 IDs 传给后端:
// 前端 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();
});
}# 后端 - 批量删除
@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})这是和线下流程对接的关键功能。以前台账都在 Excel 里,要是全部手工录入就疯了。
导出功能(openpyxl):
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 逐行写入数据库,同时做重复校验,避免重复导入。
根据实际业务,施工负责人要分内部、委外、外单位三种类型,需要额外的类型筛选和搜索功能。
WorkBuddy 建议我用一个 type 字段来区分三种类型,然后前端用下拉菜单筛选,后端用 filter_by 查询,代码非常简洁:
@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)这是另一个独立模块,基于 800 题的题库,支持多 xlsx 题库切换。
踩坑记录:中文路径在 openpyxl 下读取会报编码问题。WorkBuddy 帮我定位到问题出在 os.path.exists() 的文件路径编码上,最后用 Path 对象处理中文路径解决了。
from pathlib import Path
# 用 Path 处理中文路径,避免编码问题
file_path = Path('题库/接触网题库.xlsx')
if file_path.exists():
wb = openpyxl.load_workbook(str(file_path))深圳那边的办公网络只能插网线,没有公网 IP,而且公司防火墙封了 SSH 隧道。
WorkBuddy 帮我查到了 LocalTunnel 这个方案,一条命令搞定:
npx localtunnel --port 5000它会生成一个临时公网 URL(如 https://xxxx.loca.lt),外网就能访问了。虽然不稳定但做演示和临时访问够用。
@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) |
系统上线后,部门的培训台账管理效率提升了很多:
这次用 WorkBuddy 辅助开发,最大的感受是:
当然 WorkBuddy 也不是万能——复杂的业务逻辑还是得自己理清楚,代码质量也得自己把关。但作为一个AI辅助编码工具,它确实帮我省了大量时间。
如果你是做内部系统开发的,强烈推荐试试这个组合:Flask + SQLite + openpyxl + WorkBuddy,低成本、高效率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。