当前位置: 首页 > news >正文

RuoYi-Cloud微服务后端 + RuoYi-App移动端:手把手教你从零新增一个业务模块(含Nacos配置与前端联调)

RuoYi全栈开发实战:从零构建业务模块的避坑指南

在微服务架构中新增一个完整业务模块,往往涉及前后端十余个环节的协同配置。许多开发者虽然熟悉单个技术点,却在模块化开发中频繁遭遇"接口404"、"路由失效"、"跨域报错"等典型问题。本文将基于RuoYi-Cloud与RuoYi-App的实战组合,演示如何系统性地完成从数据库设计到前端联调的全流程开发,特别聚焦那些官方文档未曾明说的配置细节和排错技巧。

1. 后端模块工程化构建

1.1 模块创建与依赖管理

新建ruoyi-app模块时,建议采用继承父pom而非简单复制依赖。在pom.xml中需要特别注意以下关键配置:

<parent> <groupId>com.ruoyi</groupId> <artifactId>ruoyi</artifactId> <version>3.8.0</version> </parent> <dependencies> <!-- 必须包含的starter --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Plus配置 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> </dependencies>

常见问题排查表:

问题现象可能原因解决方案
启动报Bean冲突依赖版本不一致使用mvn dependency:tree检查冲突
无法注入Mapper未扫描到包在启动类添加@MapperScan("com.ruoyi.app.mapper")
事务失效代理模式错误确认@EnableTransactionManagement已启用

1.2 领域模型与数据持久化

实体类设计应遵循RuoYi规范,建议采用Lombok简化代码:

@Data @TableName("app_user") public class AppUser { @TableId(type = IdType.AUTO) private Long userId; @NotBlank(message = "用户名不能为空") @Size(min = 2, max = 20) private String userName; // 逻辑删除标记(需配合全局配置) @TableLogic private Integer delFlag; }

Mapper接口需要特别注意动态SQL的编写规范:

<select id="selectUserList" resultType="AppUser"> SELECT * FROM app_user <where> <if test="userName != null and userName != ''"> AND user_name LIKE concat('%', #{userName}, '%') </if> AND del_flag = '0' </where> </select>

提示:MyBatis Plus的@TableField注解可解决字段名映射问题,如@TableField("user_name")

2. Nacos配置中心实战

2.1 服务注册关键参数

bootstrap.yml中,以下配置项直接影响服务发现:

spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: dev # 多环境隔离 group: DEFAULT_GROUP ephemeral: true # 是否临时实例 metadata: version: 1.0 # 元数据可用于灰度发布

2.2 网关路由配置陷阱

网关配置ruoyi-gateway-dev.yml常见问题:

  • 路径匹配冲突:多个服务配置了相同Path前缀
  • 过滤器顺序错误StripPrefix应在认证过滤器之前
  • 负载均衡失效:服务名未正确注册到Nacos

推荐的路由配置模板:

- id: ruoyi-app uri: lb://ruoyi-app predicates: - Path=/app/v1/** filters: - StripPrefix=2 # 去除/app/v1前缀 - name: AuthFilter args: excludePaths: /app/v1/public/*

3. 前端联调深度优化

3.1 请求封装最佳实践

utils/request.js中需要统一处理:

const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 10000, headers: { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/json;charset=UTF-8' } }) // 请求拦截器 service.interceptors.request.use(config => { // 自动添加Token if (store.getters.token) { config.headers['Authorization'] = 'Bearer ' + getToken() } // 微服务网关标识 config.headers['Gateway-Type'] = 'mobile-app' return config })

3.2 跨域解决方案对比

方案适用场景优缺点
网关CORS配置生产环境安全但配置复杂
开发代理本地开发简单需重启
Nginx反向代理测试环境灵活但需运维

推荐开发环境配置:

devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true, pathRewrite: { '^/api': '' } } } }

4. 全链路调试技巧

4.1 日志追踪方案

  1. SkyWalking链路追踪
# 启动参数添加 -javaagent:/path/to/skywalking-agent.jar -Dskywalking.agent.service_name=ruoyi-app
  1. 日志关联ID
@Slf4j @RestController public class AppUserController { @GetMapping("/list") public TableDataInfo list() { log.info("查询用户列表请求到达"); MDC.put("traceId", UUID.randomUUID().toString()); // ... } }

4.2 接口文档自动化

Swagger集成配置:

@Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.ruoyi.app.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters(Collections.singletonList( new ParameterBuilder() .name("Authorization") .description("访问令牌") .modelRef(new ModelRef("string")) .parameterType("header") .required(false) .build())); }

联调阶段建议开启Knife4j增强UI:

knife4j.enable=true knife4j.production=false

在实际项目交付中,模块初始化时最容易忽略的是Nacos配置的版本控制。我们团队曾因未指定配置版本号导致测试环境读取了生产配置,后来通过建立严格的配置命名规范避免了此类问题,例如采用{应用名}-{环境}-{版本}.yml的格式管理所有配置文件。

http://www.jsqmd.com/news/847818/

相关文章:

  • 【最新v2.7.5 版本安装包】OpenClaw 2.7.5 保姆级教程,零基础无需命令一键部署不踩坑
  • 2026-05-18 闲话
  • 从TAU流程看5G网络演进:4G的“寻人”机制在5G NSA/SA下有何变化?
  • 在ZYNQ 7020上,用C++/Qt封装一个轻量级AXI-Lite Linux驱动(附完整源码)
  • 终极指南:如何在Inkscape中实现专业级光学设计与光线追踪
  • 2026在线去本地视频水印工具对比|去除视频水印怎么选?完整推荐指南
  • 突破学术文本审核壁垒!okbiye 智能风控改写助力文稿顺利通关
  • 北京空调清洗消毒公司哪家实力强 - 品牌企业推荐师(官方)
  • 【YOLO目标检测全栈实战】52 YOLO模型剪枝与量化:让模型瘦身80%还能保持精度
  • 2026照片去水印免费软件app有哪些?精选推荐与优缺点对比
  • 书成紫微动,律定凤凰驯:海棠山铁哥行天道,一书一标定人间秩序
  • 2026年武汉软件开发公司推荐:靠谱团队这样选 - 品牌企业推荐师(官方)
  • InfluxDB 数据库迁移与增量数据同步实战
  • 光学萌新看过来:用Lighttools 8.4.0配合Solidworks做光机设计,第一步安装和环境配置怎么做?
  • 打破学术检测壁垒!okbiye 全新智能风控体系,一站式化解 AIGC 溯源与文本重复双重难题
  • RabbitMQ 报错 channel already closed 是什么原因?怎么解决?
  • 数据中心电力模块的发展趋势对数据中心建设的影响
  • 数据驱动的组合体航天器姿态接管控制【附代码】
  • NotebookLM脑机接口实测报告:从EEG信号预处理到实时语义映射,7步构建可复现BCI工作流
  • 选性价比高的蒸汽发生器,要看哪些选型标准? - 品牌企业推荐师(官方)
  • MRI绕组结构设计及均匀度优化算法【附算法】
  • 告别论文风控难题!okbiye 智能 AIGC 筛查与文本柔化重塑全方位解析
  • 从“广覆盖”到“精准康复”:重庆“星星的孩子”干预新方向 - 品牌企业推荐师(官方)
  • DJI大疆官方售后网点2026年5月最新400热线与售后服务指南 - 品牌企业推荐师(官方)
  • 如何快速获取免费的EB Garamond 12字体:古典优雅的终极排版解决方案
  • 用STM32G431和塔石NB-IoT模块,5分钟搞定阿里云MQTT设备上云(附完整配置流程)
  • Claude Code + Windows 桌面消息通知配置指南
  • PWM调制器小信号模型:从采样延迟到环路稳定性设计
  • 第14章 实践项目开发——智能温控系统14.5(下)
  • 告别Pico TTS!2024年Android离线TTS引擎实测:讯飞、Google、ITRI谁的中文语音更自然?