软件研究之Ruoyi微服务版

标签: 无 分类: 未分类 创建时间:2022-05-24 03:25:26 更新时间:2023-10-20 11:23:28

1.前言

最近在调研后端管理框架,找到了若依后端管理框架,我就尝试着安装学习了。我这里主要就是修改了微服务版本,至于微服务版本和前后端分离版本,到底各自有什么优势,这个应该是见仁见智吧。

我觉得微服务一个好处就是不同的应用之间互相不影响,可以不同的数据库配置不同的应用,这个比较方便,但是部署起来比较的麻烦,像前后端分离的版本,有点像单体应用,当我要进行不同的服务创建的时候,可能就比较麻烦。关于我目前遇到的项目,数据库分为了多个数据库,但是每一个数据大部分的字段相同,偶尔有一部分的数据不兼容,并且已经是成熟的sql server数据库了,已经运行很多年了,要是让老板换技术和数据库,估计比登天还难,所以我只能选择使用微服务的方法,兼容原有的客户端应用。

参考文章:
1.【RuoYi-Vue】RuoYi-Vue新增子模块 对于前后端分离版本新建模块,和新建前端页面,写的非常的详细,还配图了,对于理解和微服务版本的区别倒是有点理解了。
2.若依前后端分离框架学习-4:创建模块 这是前后端分离版本的新建模,这个比上面的就是缺少了一些细节部分。
3.若依ruoyi前后端分离版服务器部署 这里主要是打包部署环节,部署了前端和后端。
4.若依管理系统部署并实现持续发布 这个是前后端分离版本的部署,还讲了使用gitlab的ci/cd工具实现持续集成。

1.前端部署

1.前往Gitee下载页面(https://gitee.com/y_project/RuoYi-Cloud (opens new window))下载解压到工作目录

2、导入到Eclipse,菜单 File -> Import,然后选择 Maven -> Existing Maven Projects,点击 Next> 按钮,选择工作目录,然后点击 Finish 按钮,即可成功导入。

Eclipse会自动加载Maven依赖包,初次加载会比较慢(根据自身网络情况而定)
3、创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql(必须),quartz.sql(可选)。在Dbeaver中创建数据库,右键数据库名,选择工具->执行脚本,将数据库导入进去。

4、创建数据库ry-config并导入数据脚本ry_config_2021xxxx.sql(必须)

5、配置nacos持久化,修改conf/application.properties文件,增加支持mysql数据源配置

参考文章:
1.环境部署

2.后端部署

1.数据权限

参考文章:
1.若依微服务之权限管理 这是一个还没有毕业的学生写的,我已经工作好多年了,都没有这个水平,真是自愧不如啊,白活了这么多年了。
2.若依-数据权限管理-DataScope 说明:@DataScope(deptAlias = “d”, userAlias = “u”) d:表示拼接sql是表别名 sys_dept d;u:表示拼接sql是表别名 sys_user u
3.若依管理系统RuoYi-Vue(二):权限系统设计详解 这里除了讲解了菜单权限,还有数据权限,还增加了一个空的页面,并且赋予不同用操作这个页面的权限的示例。

2.用户注册

参考文章:
1.若依框架注册功能 在前端的login页面开启了register功能

问题

(1) 拒绝连接: /127.0.0.1:9848

这个问题可能是因为使用的nacos版本不对导致的,ruoyi-cloud >= 3.0.0需要下载nacos >= 2.x.x版本。我查看了自己的nacos版本,果然只有 1.4.3 版本。

(2) 数据库中的配置更新后系统无法加载
需要重新启动nacos,才能重新从nacos加载配置

3.后端模块

1.新建模块

2.复制pom.xml文件

3.创建包及启动类

4.创建配置文件
将system的yml配置文件复制到新建模块一份,并修改该模块的端口号

5.创建nacos配置文件
登录Nacos配置中心,找到配置列表,选择ruoyi-system-dev.yml,点击克隆,并更改名称,进行克隆。

问题

(1) A circular @Import has been detected: Illegal attempt by @Configuration class ‘SwaggerAutoConfiguration’ to import class ‘SwaggerAutoConfiguration’ as ‘SwaggerAutoConfiguration’ is already present in the current import stack

我创建了一个自定义的模块,启动时出现了这个错误。

【解决】
这个问题,主要就是要在启动类上增加 @EnableCustomSwagger2 这个注解。

1
2
3
4
5
6
7
8
9
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class PhemsApplication {
public static void main(String[] args){
SpringApplication.run(PhemsApplication.class,args);
}
}

@EnableRyFeignClients 这个注解中比较有用的类,就是 RemoteLogService,通过注入这个Bean,可以实现对操作进行记录的方法

1
2
@Autowired
private RemoteLogService remoteLogService;

(2) duplicated in the reactor
在进行模块打包的时候,出现了这个问题。

【解决】
这个时候主要就是要查看父pom.xml中是否包含了多个子模块,子模块中又引入了父pom.xml。

(3) 对象名 ‘DUAL’ 无效,relation “dual” does not exist
这是在使用sql server 数据库的时候,没有DUAL这个对象,只需要修改配置文件为 druid.validationQuery= SELECT 1,去掉后面的FROM DUAL就好了。

(4) dynamic-datasource can not find primary datasource
如果是引用了ruoyi-common-datasource那么就根据ruoyi-system去配置数据源,如果没有,就按照常规的springboot去配置数据源,参考ruoyi-gen去配置数据源。不过出现这种情况一般是没有读取到nacos数据源导致的错误。

还有一点要注意的就是,如果在模块的相互依赖中存在这个ruoyi-common-datasource也不行

参考文章:
1.新建子服务启动成功后报错dynamic-datasource can not find primary datasource
2.mybatis-plus异常:dynamic-datasource can not find primary datasource 异常原因是没有设置默认数据源,在类上没有使用@DS指定数据源时,默认会加载master数据源,但是在配置中没有使用master配置

(3) can not get cluster name in registry config ‘service.vgroupMapping.default_tx_group’, please make sure registry config correct
在集成了若依管理框架之后,总是出现这个问题,我其实对这个seata不太熟的,不知道在哪里集成进来的。

4.前端页面

1.创建目录
根据需要,创建自己的一级和二级目录。

2.编写组件

3.创建菜单
创建需要的菜单,并指定组件路径

5.Excel使用

参考文章:
1.若依前后端分离版本-导出Excel配置合并行,单列行合并 这里使用配置的方式进行单元格的合并
2.动态多级表头导出 这里写了很多的方法,如何生成动态表头。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。