基于 docker-compose.yml文件(包含 ​​emqx​​(MQTT服务)、​​backend​​(后端服务)、​​mysql​​(数据库))的详细运行、调试、增改删操作说明,结合流程图示意(使用PlantUML语法)。

一、开发环境准备

1. 安装基础工具
  • ​Docker​​:官网下载

  • ​Docker Compose​​:官网安装

  • ​代码编辑器​​:VS Code/WebStorm(推荐安装Docker插件)

  • ​数据库可视化工具​​:MySQL Workbench/Navicat/DBeaver(用于数据库操作)

  • ​后端调试工具​​:Node.js调试插件(如VS Code的JavaScript Debug Terminal

2. 代码目录结构
项目根目录/
├── backend/               # 后端代码
│   ├── app/               # 业务代码
│   ├── start-system.bat   # 启动脚本(Windows)
│   └── Dockerfile         # 后端Docker构建文件
├── docker-compose.yml     # 服务编排文件
├── .env                   # 环境变量配置(示例)
└── README.md              # 说明文档

二、服务运行流程

1. 启动服务(按依赖顺序)
# 1. 拉取/构建镜像(首次运行)
docker-compose up -d --build# 2. 查看服务状态
docker-compose ps# 3. 验证健康检查(backend依赖emqx和mysql健康)
docker-compose logs backend | grep "服务依赖状态"
2. 服务依赖逻辑
  • ​emqx​​:独立运行,提供MQTT通信(无健康依赖)

  • ​mysql​​:需初始化数据库(通过环境变量MYSQL_DATABASE创建库)

  • ​backend​​:依赖emqxmysql服务​​健康​​后启动(通过depends_on条件控制)

三、开发调试指南

1. 后端服务(Backend)
▶ 运行与调试
  • ​本地开发​​(非Docker环境,需配置.env):

    # Windows(使用start-system.bat)
    ./start-system.bat# Linux/macOS(需修改脚本权限)
    chmod +x start-system.bat
    ./start-system.bat

  • ​Docker内调试​​:

    1. 进入容器:

      docker exec -it backend_container_name bash

    2. 使用IDE远程调试(VS Code配置launch.json):

      {"type": "node","request": "attach","name": "Attach to Backend","address": "localhost","port": 9229,"localRoot": "${workspaceFolder}/backend","remoteRoot": "/app"
      }

▶ 代码修改
  • ​热更新​​:修改代码后重启容器(需配置Dockerfile的VOLUME挂载):

    docker-compose restart backend

  • ​依赖安装​​:在backend/Dockerfile中添加npm install步骤。

2. 数据库服务(MySQL)
▶ 连接与操作
  • ​命令行连接​​:

    mysql -h localhost -P ${MYSQL_PORT} -u ${MYSQL_USER} -p${MYSQL_PASSWORD}

  • ​数据操作示例​​:

    -- 创建表
    CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255));-- 增删改查
    INSERT INTO users VALUES (1, 'test');
    DELETE FROM users WHERE id=1;
    UPDATE users SET name='new' WHERE id=1;
    SELECT * FROM users;

▶ 数据库迁移
  • 使用工具如Sequelize/Knex编写迁移脚本(推荐在backend中集成ORM):

    // 示例:Sequelize迁移文件
    module.exports = {up: async (queryInterface, Sequelize) => {await queryInterface.createTable('users', { /* 表结构 */ });},down: async (queryInterface, Sequelize) => {await queryInterface.dropTable('users');}
    };

3. MQTT服务(EMQX)
▶ 功能验证
  • ​连接测试​​:使用MQTT客户端工具(如MQTTX)连接emqx:1883,验证发布/订阅功能。

  • ​日志查看​​:

    docker-compose logs emqx | grep "连接状态"

四、增改删操作分类说明

1. ​​前端代码增改删​​(假设前端代码在backend/app中)

操作类型

步骤

​新增接口​

1. 编写API路由(如/api/users
2. 修改docker-compose.ymlbackendports暴露端口
3. 重启服务

​修改逻辑​

1. 直接编辑代码文件
2. 使用IDE断点调试
3. 保存后重启容器

​删除功能​

1. 移除对应代码文件
2. 更新依赖引用
3. 重新构建镜像

2. ​​后端代码增改删​

操作类型

步骤

​新增模块​

1. 在backend/app中创建目录/文件
2. 更新package.json依赖
3. 运行npm install

​修改业务逻辑​

1. 编辑.js/.ts文件
2. 使用console.log或调试工具追踪变量
3. 重新构建镜像:
bash<br> docker-compose build backend<br> docker-compose up -d backend<br>

​删除冗余代码​

1. 确认无依赖后删除文件
2. 执行垃圾回收(Docker层面):
bash<br> docker system prune -a<br>

3. ​​数据库增改删​

操作类型

步骤

​新增表/字段​

1. 编写ORM迁移脚本
2. 执行迁移命令(如npx sequelize-cli db:migrate

​修改数据​

1. 通过SQL语句或ORM模型操作
2. 使用事务保证一致性:
sql<br> START TRANSACTION;<br> UPDATE users SET name='new' WHERE id=1;<br> COMMIT;<br>

​删除数据​

1. 先备份重要数据
2. 执行软删除(标记删除)或物理删除
3. 优化表空间:
sql<br> OPTIMIZE TABLE users;<br>

五、流程图示意(PlantUML)

@startuml
' 环境准备阶段
actor User
participant "Docker/Docker Compose" as DC
participant "IDE" as IDE
participant "MySQL Workbench" as MySQLTool' 运行服务流程
User -> DC: 执行 `docker-compose up -d --build`
DC --> IDE: 查看服务日志
DC --> MySQLTool: 连接数据库初始化' 开发调试流程
alt 后端调试User -> IDE: 编辑 backend 代码IDE --> DC: 重启 backend 容器DC --> IDE: 查看健康检查状态(emqx/mysql 是否健康)
else 数据库调试User -> MySQLTool: 执行 SQL 脚本MySQLTool --> DC: 验证数据变更
end' 增改删操作流程
User -> IDE: 前端代码修改
IDE --> DC: 重新构建前端资源(若有)
User -> IDE: 后端代码修改
IDE --> DC: 重启 backend 服务
User -> MySQLTool: 数据库表/数据操作
MySQLTool --> DC: 验证接口响应' 部署更新流程
User -> DC: 执行 `docker-compose down`
User -> DC: 打包新镜像
User -> DC: 执行 `docker-compose up -d`
DC --> User: 验证全链路功能@enduml

六、注意事项

  1. ​环境变量管理​​:通过.env文件配置敏感信息(如数据库密码),避免硬编码。

  2. ​健康检查机制​​:backend服务依赖emqxmysql的健康状态,修改依赖服务后需等待健康检查通过。

  3. ​数据备份​​:定期备份mysql数据(可通过Docker卷挂载到宿主机):

    docker run --rm -v mysqldata:/var/lib/mysql -v $(pwd)/backup:/backup ubuntu tar -cvf /backup/mysql_backup.tar /var/lib/mysql

通过以上步骤,可系统化地管理前后端及数据库的开发、调试和数据操作,结合Docker容器化部署实现环境一致性和快速迭代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93214.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93214.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93214.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 CSS3 从入门到精通:构建现代Web的艺术与科学

本文将带你系统地学习掌握现代Web前端的基础与核心&#xff0c;最终能够独立构建语义清晰、布局灵活、交互丰富的专业级网站。 第一章&#xff1a;夯实基础 - HTML5语义化与结构艺术 1.1 告别<div>混沌&#xff1a;语义化标签的力量 <header><h1>网站标题…

C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解

文章目录 前言 核心原理 三大生命周期 核心接口与类 基础使用示例 关键特性详解 1、构造函数注入 2、作用域管理 3、服务解析方法 4、延迟加载 常见问题解决 问题1:循环依赖 问题2:多实现选择 性能优化技巧 扩展方法示例 前言 微软的依赖注入框架是 .NET Core/5+ 的核心组件…

【车联网kafka】Kafka核心架构与实战经验(第四篇)

一、社团扛把子不为人知的秘密 香港社团里&#xff0c;Kafka 是整个组织的名号&#xff0c;ZooKeeper 就是说一不二的长老团&#xff0c;各个片区的 “话事人” 就是 broker&#xff0c;而能统领所有片区的 “扛把子”&#xff0c;就是 Kafka 里的控制器。​ 1.1 选举的秘密 每…

Scala重点(基础、面向对象、高阶函数、集合、模式匹配)

1. 基础语法1.1. 注释和java一样我是单行注释 /* 我是多行注释 我是多行注释 */ /** * 我是文档注释 * 我是文档注释 */1.2. 语句语句可以不以分号结尾一条语句独占一行 println("Hello World!")多条语句在一行 println("Hello World!"); println("He…

明远智睿T113-i核心板:工业设备制造领域的革新利器

在工业设备制造这片充满挑战与机遇的领域&#xff0c;技术革新如同一股汹涌浪潮&#xff0c;不断重塑着市场竞争的格局。随着技术持续进步&#xff0c;市场竞争愈发激烈&#xff0c;制造商们面临着如何在保证产品卓越性能的同时&#xff0c;有效控制成本这一关键难题。在此背景…

122-基于Flask的校园霸凌数据可视化分析系统

校园霸凌数据可视化分析系统 - 基于Flask的全栈数据分析平台 本文详细介绍了一个基于Flask框架开发的校园霸凌数据可视化分析系统&#xff0c;从技术架构到功能实现&#xff0c;为数据分析项目开发提供参考。 &#x1f4cb; 目录 项目概述技术架构核心功能代码结构技术栈详解核…

Docker 网络设置方式详解

Docker 网络是容器通信的核心基础&#xff0c;它允许容器之间、容器与主机之间以及容器与外部网络之间进行数据交互。Docker 提供了多种网络驱动类型&#xff0c;适用于不同场景&#xff0c;下面详细介绍 Docker 网络的设置方式。一、Docker 网络的基本概念 Docker 网络通过驱动…

export default和export function的作用及export的含义

在 JavaScript 中&#xff0c;export 是一个关键字&#xff0c;用于将模块中的变量、函数、类等导出&#xff0c;以便其他模块可以导入和使用。export default 和 export&#xff08;非默认导出&#xff09;是两种不同的导出方式&#xff0c;它们在使用场景和语义上有明显的区别…

免费 ollama 可用地址共享 内含免费 deepseek,gpt,bge,llama,Qwen,embed 大模型等

ollama 共享 介绍 集ollama地址的批量添加&#xff0c;批量校验&#xff0c;批量获取 &#xff0c;api接口调用于一体 演示地址&#xff1a;ollama格式化工具 开源地址&#xff1a;https://gitee.com/web/ollama-share 使用说明 index.php 通过提交table 批量提交ollama地…

Android Audio实战——获取活跃音频类型(十五)

在 Android Audio 开发中,很多场景需要获取当前正在播放的音频类型,而在音频管理器 AudioManager 中并没有发现类似的接口,这一篇文章就来看一下实现获取活跃音频类型的方式。 一、音频类型获取 对于获取当前活跃音频流类型,在《硬按键调节音量》中是通过 getActiveStream…

Verilog功能模块--SPI主机和从机(02)--SPI主机设计思路与代码解析

前言 上一篇文章介绍了SPI的四种工作模式及其时序特性&#xff0c;相信各位同学已经掌握了SPI通信的核心原理。 本文用纯Verilog设计了功能完整的4线SPI主机&#xff0c;并详细说明了模块编码思路和使用注意事项&#xff0c;最后分享了源码。 一、模块功能 本Verilog功能模块—…

Decoder模型 向量模长表示什么

Decoder模型 向量模长表示什么 词和其他词的关系的强弱和关联程度;生僻词模长小 从实验结果来看,Qwen2-7B-Instruct的向量模长规律与之前的预期(“模长与语义丰富度、确定性正相关”)完全相反,这反映了Decoder-only模型(尤其是指令微调模型)的表征特性与Encoder-only模…

STL容器及其算法

C 标准库容器详解&#xff1a;特性、用法与场景选型容器是 C 标准库&#xff08;STL&#xff09;的核心组件&#xff0c;用于存储和管理数据。不同容器因底层实现不同&#xff0c;在性能、功能和适用场景上差异显著。本文系统梳理vector、list、set、map等常用容器&#xff0c;…

MySQL ZIP安装教程:从解压到启动

金金金上线&#xff01; 话不多&#xff0c;只讲你能听懂的前端知识 前言 我这里不能下载安装程序的mysql&#xff0c;由于电脑安全限制&#xff0c;安装时会弹出需要管理员账号密码权限&#xff0c;此路行不通&#xff0c;所以琢磨着免安装版本怎么个流程&#xff0c;好&#…

p2p打洞

p2p网络穿透库,它的C++版本目前只支持linux,不支持win,它最新版本的穿透用的tcp,老版本支持tcp/udp: https://libp2p.io/ P2P-udp的穿透教程: https://edu.51cto.com/lesson/731596.html 目前打洞机制最好的库是webrtc,其次是libnice,它是轻量级的专门打洞的库。 libni…

『“无恙心宽”,梗痛不常』——爱上古中医(12)(健康生活是coder抒写优质代码的前提条件——《黄帝内经》伴读学习纪要)

养心护心气血通&#xff0c;无痛无梗全身松。 笔记模板由python脚本于2025-08-10 15:54:46创建&#xff0c;本篇笔记适合至少通晓一门语言&#xff0c;熟悉基本编程范式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅…

Spark 运行流程核心组件(一)作业提交

1、Job启动流程1、Client触发 SparkContext 初始化 2、SparkContext 向 Master 注册应用 3、Master 调度 Worker 启动 Executor 4、Worker 进程启动 Executor 5、DAGScheduler 将作业分解为 Stage&#xff1a; 6、TaskScheduler 分配 Task 到 Executor 2、核心组件组件职责Spar…

MySQL 临时表与复制表

一、MySQL 临时表临时表是会话级别的临时数据载体&#xff0c;其设计初衷是为了满足短期数据处理需求&#xff0c;以下从技术细节展开说明。&#xff08;一&#xff09;核心特性拓展1.生命周期与会话绑定会话结束的判定&#xff1a;包括正常断开连接&#xff08;exit/quit&…

从配置到调试:WinCC与S7-1200/200SMT无线Modbus TCP通讯方案

测试设备与参数l 西门子PLC型号&#xff1a;S7-1200 1台l 西门子PLC型号&#xff1a;S7-200Smart 1台l 上位机&#xff1a;WinCC7.4 1台l 无线通讯终端——DTD418MB 3块l 主从关系&#xff1a;1主2从l 通讯接口&#xff1a;RJ45接口l 供电&#xff1a;12-24VDCl 通讯协议&a…

Android沉浸式全屏显示与隐藏导航栏的实现

1. 总体流程以下是实现沉浸式全屏显示和隐藏导航栏的流程&#xff1a;步骤描述步骤1创建一个新的Android项目步骤2在布局文件中定义需要展示的界面步骤3在Activity中设置沉浸式全屏显示步骤4处理系统UI的显示与隐藏步骤5运行应用并测试效果2. 详细步骤步骤1&#xff1a;创建一个…