背景
笔者之前已经有用若依生成器生成系统管理下的二级子目录的经验,当时的做法很简单,只需要把生成代码各部分放入原项目指定位置,即:
- 后端的controller层放入ruoyi-admin(因为原项目结构里面admin里面是controller,其他子模块里面没有)
- domain、mapper、service放入ruoyi-system下的对应包(因为它属于系统管理部分)
- xml文件放入ruoyi-system下的resources.mapper.system(因为它对应的是系统管理下的模块)
- 前端Vue的api和views放入ruoyi-ui同名包的相应位置。目录组织结构与其他组件保持一致。
- 将.sql文件导入数据库。它的作用是插入菜单项。
但是后来笔者想在后端单独新建一个模块,不想依附于ruoyi-system,前端也是设立独立的一级菜单。再在一级菜单下新建多个自己的子模块。于是就有了今天这篇文章。
接下来我将会讲讲我的相关配置。
相关配置
配置生成代码选项
- 在ry数据库中新建数据库表,也可以将别的数据库表结构复制过去
- 建议修改ruoyi-generator模块的generator.yml的相关配置
- 启动项目,找到代码生成的选项,填入生成代码的设置。
如果是想单独弄一个模块,那包名就不要用默认的system,而是自定义。
- 下载并解压生成的代码
项目模块配置
笔者从这一步中了解到了多模块开发的相关知识。
如果一个项目下有多个子模块,那么在总项目下的pom文件是这样的的:
<modules>
<module>模块1,自行替换</module>
...
<module>模块n,自行替换</module>
</modules>
<packaging>pom</packaging>
表示这个项目包含了这些模块。
而在每一个子模块中,用:
<parent>
<artifactId>此处自行替换</artifactId>
<groupId>此处自行替换</groupId>
<version>版本号</version>
</parent>
来表示它的父模块是谁。
子模块也可以用其他的子模块作为依赖。
springboot对模块的管理机制使得在子模块中,不再需要显式指定各依赖版本号。
<dependencies>和<dependencyManagement>的区别
- Artifacts specified in the
<dependencies>
section will ALWAYS be included as a dependency of the child module(s).- Artifacts specified in the
<dependencyManagement>
section, will only be included in the child module if they were also specified in the<dependencies>
section of the child module itself.
也就是说<dependencyManagement>中的依赖有可能仅仅属于父模块,不被子模块继承。
关于版本表示
文档中提到,由于.yml/.properties文件也在使用${}占位符,所以pom.xml里面的版本控制可以改用@@的表达:
Since the
application.properties
andapplication.yml
files accept Spring style placeholders (${…}
), the Maven filtering is changed to use@..@
placeholders. (You can override that by setting a Maven property calledresource.delimiter
.)
404 Not Found 错误排查
在HTTP码中,4开头的表示客户端错误,404表示客户端找不到服务端的接口。所以我们可以从接口———也就是后端的controller开始入手。
常规思路如下:
- 用接口测试工具postman、apifox等等测试一下接口(但如果是需要鉴权才能看到的页面就有些麻烦,还要先获取token)。
如果接口测试正常,说明可能是前端配置写错了,检查一下api包下的配置和router配置;如果换了种客户端也不行,说明是后端的问题,检查一下后端的controller(Java)
本项目情况分析:
- 但由于代码是由若依的代码生成器生成的,原则上代码内容应该不会有错误。所以有可能是代码包结构不匹配的问题。
- 前面说到,在想生成二级项的时候接口是没问题的,而后来生成一级项的时候,我新建了个模块并且修改pom.xml,但其余后端代码就整个复制粘贴到新模块中了,这和我当时把controller单独放入admin中的做法不同。
- 所以我尝试了一下把新功能的controller备份,再将它迁移到admin中的controller(注意,包结构要与admin中的一致,代码具体import的包也要重新修改名字)
再运行就成功了!