STM32上C++实战:从C到C++的嵌入式开发转型指南
2026/9/22 3:00:39
摘要:很多计算机专业本科生在毕设里“选题空、技术乱、工程散”,最后跑不通、写不出、答不好。本文用一套真实可跑的“课程作业提交系统”当主线,把从选题到上线的完整链路拆给你看,帮你把“作业”做成“产品”。
一句话:缺“工程化”思维,把“能跑”当终点,而不是把“能跑、好改、好扩展”当起点。
| 场景方向 | 推荐技术组合 | 适用痛点 | 备注 |
|---|---|---|---|
| Web 管理型系统(作业提交、文档管理) | Flask + Vue3 + MySQL + Docker | 快速成型、轻量、易部署 | 适合单人 3-4 个月 |
| 数据分析/可视化 | Python(Pandas+Flask)+ React + MySQL | 重算法、轻并发 | 前端交互强,图表丰富 |
| 嵌入式/物联网 | C++ + FreeRTOS + MQTT + Node-RED | 实时性、硬件资源受限 | 需要板子,调试点多 |
| 微服务练手 | Spring Cloud + MyBatis-Plus + MySQL | 高并发、分布式 | 学习曲线陡,慎选 |
经验:本科毕设优先选“单体能拆”的架构——先跑通一条线,再拆模块,别一上来就“八股文”微服务。
学生上传作业,老师下载批改,管理员看统计,支持批量导出、截止期限、防抄袭查重(简易版)。
/api。{ "code": 0, "msg": "ok", "data": {...} }@app.errorhandler(HTTPException)统一包装,前端 axios 拦截器直接弹窗。access_token(15 min)+refresh_token(7 d)。def role_required(allowed): def decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): token = request.headers.get("Authorization","").split()[-1] payload = decode_jwt(token) # 自定义解析 if payload.get("role") not in allowed: return jsonify(code=403, msg="权限不足"), 403 return fn(*args, **kwargs) return wrapper return decorator调用示例:
@bp.route('/assignment', methods=['POST']) @role_required(["teacher"]) def create_assignment(): ...import jwt, datetime, redis, os r = redis.Redis(host='redis', port=6379, db=0, decode_responses=True) SECRET = os.getenv("JWT_SECRET", "change_me") def create_token(user_id, role): payload = { "user_id": user_id, "role": role, "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=15), "type": "access" } return jwt.encode(payload, SECRET, algorithm="HS256") def refresh_if_need(token): try: payload = jwt.decode(token, SECRET, algorithms=["HS256"]) if payload.get("type") != "refresh": return None # 距离过期 < 3 天则发新 token if datetime.datetime.fromtimestamp(payload["exp"]) - datetime.datetime.utcnow() < datetime.timedelta(days=3): return create_token(payload["user_id"], payload["role"]) except jwt.ExpiredSignatureError: return NoneFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY . . CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]version: "3.9" services: db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: homework volumes: ["./sql:/docker-entrypoint-initdb.d"] backend: build: ./backend ports: ["5000:5000"] depends_on: [db] environment: SQLALCHEMY_DATABASE_URI: mysql+pymysql://root:root@db:3306/homework frontend: image: nginx:alpine ports: ["80:80"] volumes: ["./frontend/dist:/usr/share/nginx/html"]bleach.clean()过滤标签。client_max_body_size 20m;防 DoSfeat:/fix:/docs:),配合commitlint在 CI 强制检查,回滚时一眼看懂。app.logger只到 INFO,线上加RotatingFileHandler存 DEBUG,保留 7 天,排错不用靠 print。requirements.txt由pip freeze > requirements.txt生成,别手写。package-lock.json,CI 里npm ci确保版本一致。.env,仓库只留.env.example,防泄密。mysqldump+cron每日凌晨 2 点打包到/backup,保留 30 份。tar + date +%F,定期清理。docker-compose up -d能在全新机器跑通毕设不是“写完了”就行,而是“别人能在一台新电脑五分钟跑起来”才算合格。本文的示范代码已放到 GitHub 模板仓库,你可以直接Use this template开坑,再按下面思路继续加料:
动手改一行代码,比看十篇“理论框架”更有用。祝你毕设一遍过,答辩不翻车,代码常跑,头发常绿。