操作手册 简约删减版原创
# 先免责
站窗前 回头望,确实也是用了许久的框架 当然了 这里肯定只是指
若依框架
,不得不说,这群大佬们就是强,为了方便自己,就搞出来了这么好的东西,我呢,就想着自己把用到的地方,一些框架中有趣的地方,都记录一下,也是希望脑子不行的时候,再来瞅瞅
然后吧,这次下刀的版本是
Cloud版
,我感觉除了启动,调用服务不一样外,其他的代码,工具,用法应该都差不多,就有点小难,spring-cloud
算是系统的学习过几次,可惜学过没有任何实际的应用,就很烦,每次遇到都像重开,所以就极大可能这篇文章有的地方他就不对
,但是不对又怎样,我是自己看,自己坑自己
,也坑不到外面
# 何为若依-微服务版
用大佬自己的话说RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud & Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源
还配有架构图,我也看不很透彻,你们看看吧 RuoYi-Cloud-Processon (opens new window) (opens new window)分享地址
这里呢,还有官方的网址,演示,源码包括文档说明
# 步入正题
# Nacos
/(ㄒoㄒ)/~~ 本来开开心心去下载代码,导入依赖,启动,突然发现没有一个模块能启动,才想到我好像根本就没有微服务的注册中心,若依这个框架呢 使用的是Nacos,那就先说下这个Nacos的安装 使用 至于其他的 我也不知道
# 什么是Nacos
官方是这样说的
- Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
- Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
- Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
就是传说中的注册中心吧
官网还贴了图 一样我看不懂 你们看吧
# 下载
官方文档: https://nacos.io/zh-cn/docs/quick-start.html (opens new window)
下载地址: https://github.com/alibaba/nacos/releases (opens new window)
下载的话 需要注意下自己
SpringCloud
的版本 存在兼容问题 默认下载2.x.x
我感觉就可以如果要在
Windows
安装下载zip
就行 解压即安装还有就是这是个
github
地址 如果你没有梯子
超级慢 你可以先尝试下 不行的话可以在这里下载(后期贴链接)看看哪个快
下载完成之后 解压就好
# Nacos持久化
就是和数据库有个互动,注意:在不配置Nacos持久化到Mysql时,默认 Nacos 内置了一个嵌入式数据库derby,将一些数据保存到了内置的数据库上,多台 Nacos 就会出现多个内置数据库
首先新建数据库
nacos_config
这个可以随便改 只要你自己知道就行这里之所以叫这个,是因为
nacos-mysql.sql
文件中就是这么写的 顺便一提 在若依中,提供了数据库 而且我们要使用那个数据库 这里新建数据库 就是希望在使用之前 先确保我们的nacos连接数据库是可以的然后导入数据库 sql文件在下载的
\nacos\conf\nacos-mysql.sql
回到解压目录,找到
\nacos\conf\application.properties
文件 进行修改检索
Config Module Related Configurations
放开配置的注释 同时修改自己的数据库url 名称 密码等参数#*************** Config Module Related Configurations ***************# ## If use MySQL as datasource: spring.datasource.platform=mysql ## Count of DB: db.num=1 ## Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=root
1
2
3
4
5
6
7
8
9
10
11
12
# 启动Nacos
这里我们再回到
nacos\bin
目录我们这里是单机模式 但是默认是集群 所以先修改参数
找到
startup.cmd
启动按钮 右键进行编辑 或 使用记事本打开检索
set MODE
或set MODE="cluster"
将其修改为set MODE="standalone"
然后双击
startup.cmd
注意啊 这是Windows的启动方式同目录下的
shutdown.cmd
就是关闭的方式
启动完成之后,访问 http://localhost:8848/nacos/ (opens new window) 登录账户密码 默认都是 nacos
看到以下画面 那就只能恭喜你了
# 回到若依
简单的操作就不解释了,克隆代码(git clone https://gitee.com/y_project/RuoYi-Cloud.git)到本地,简单说明下代码结构,就是分模块的,分离版本的也是这样,不过也有的公司会选择整合到一起,只是普通前后分离版本的
这里间隔将近一周的时间 断了思路可能有点和上面脱节 别疑惑
# 准备工作
目录结构
com.ruoyi ├── ruoyi-ui // 前端框架 [80] ├── ruoyi-gateway // 网关模块 [8080] ├── ruoyi-auth // 认证中心 [9200] ├── ruoyi-api // 接口模块 │ └── ruoyi-api-system // 系统接口 ├── ruoyi-common // 通用模块 │ └── ruoyi-common-core // 核心模块 │ └── ruoyi-common-datascope // 权限范围 │ └── ruoyi-common-datasource // 多数据源 │ └── ruoyi-common-log // 日志记录 │ └── ruoyi-common-redis // 缓存服务 │ └── ruoyi-common-security // 安全模块 │ └── ruoyi-common-swagger // 系统接口 ├── ruoyi-modules // 业务模块 │ └── ruoyi-system // 系统模块 [9201] │ └── ruoyi-gen // 代码生成 [9202] │ └── ruoyi-job // 定时任务 [9203] │ └── ruoyi-file // 文件服务 [9300] ├── ruoyi-visual // 图形化管理模块 │ └── ruoyi-visual-monitor // 监控中心 [9100] ├──pom.xml // 公共依赖 ├──sql // 数据库资源 可以快捷的创建数据库 ---------------------------------------------------------------------------------------- 以下为前端依赖 ruoyi-ui 目录下 ├── build // 构建相关 ├── bin // 执行脚本 ├── public // 公共文件 │ ├── favicon.ico // favicon图标 │ └── index.html // html模板 ├── src // 源代码 │ ├── api // 所有请求 │ ├── assets // 主题 字体等静态资源 │ ├── components // 全局公用组件 │ ├── directive // 全局指令 │ ├── layout // 布局 │ ├── router // 路由 │ ├── store // 全局 store管理 │ ├── utils // 全局公用方法 │ ├── views // view │ ├── App.vue // 入口页面 │ ├── main.js // 入口 加载组件 初始化等 │ ├── permission.js // 权限管理 │ └── settings.js // 系统配置 ├── .editorconfig // 编码格式 ├── .env.development // 开发环境配置 ├── .env.production // 生产环境配置 ├── .env.staging // 测试环境配置 ├── .eslintignore // 忽略语法检查 ├── .eslintrc.js // eslint 配置项 ├── .gitignore // git 忽略项 ├── babel.config.js // babel.config.js ├── package.json // package.json └── vue.config.js // vue.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54大概目录结构就是这样 不需要怎么了解 用到哪里看哪里就好了
创建数据库
这里我们使用
Navicat
新建数据库
ry-cloud
然后在此数据库下执行sql
目录下的ry_20210908.sql
和quartz.sql
这两个sql文件 系统运行时的一些基础数据导入的方式截不动 文字描述就是 点击
要导入的数据库
右键选择运行sql文件
选择文件 点击执行就好了新建数据库
ry-config
在此数据库下执行ry_config_20211118.sql
nacos进行数据持久化到Mysql数据库的数据库 和我们之前创建的意义一样 只是不同的库同上
启动Nacos 顺便启动 Redis
如果刚才测试完Nacos还没有关闭的话 我们可以先关闭Nacos 需要进行修改配置 重新启动 找到
\nacos\conf\application.properties
文件 进行修改检索
Config Module Related Configurations
放开配置的注释 同时修改自己的数据库名称为ry-config
进行启动 重新访问 http://localhost:8848/nacos/ (opens new window) 登录账户密码 默认都是
nacos
这次应该存在一些数据我们需要从上到下 进行编辑 将当中涉及到数据库 和 redis 的地方 (
非所有配置都涉及redis 或 数据库
) 都修改为我们的账户密码 修改方式 直接在配置内容里面就行修改就好 修改完成后点击最下面的发布最后如果你的Redis需要手动开启的话 启动他
# 后端启动
打开我们的代码工具 这里使用IDEA进行演示
ruoyi-gateway ->
RuoYiGatewayApplication
ruoyi-auth ->
RuoYiAuthApplication
ruoyi-modules -> ruoyi-system ->
RuoYiSystemApplication
具体作用参考我们的目录结构 当然如果我们需要用到其他的功能的话 继续启动相应的模块就好
当这个三个启动类都没有报错的话 那恭喜你 后端启动成功 我们也可以在Nacos上面看到他们了 可以暂时的转战前端了
# 前端启动
前端也很简单 我们进入到 ruoyi-ui
目录中 执行 npm install
命令进行依赖下载
打开 package.json
文件 我们找到 vue-cli-service serve
命令对应的快捷 此处我们执行 npm run dev
就可启动
启动成功之后 访问 http://localhost:81/ (opens new window) 用户名 admin
密码 admin123
# 快捷工具
说真的 还是不太清楚该怎么整理 咨询了下其他大佬 有一些以前经常用到的工具?代码?功能
# 代码生成
好东西啊 好东西啊
顾名思义 自动帮助我们生成一些CRUD代码 还有前端画面 当然如果被二次封装之后 会有偏差 这里以若依的官方为准
首先我们可以在 系统工具
-> 代码生成
找到我们要进行使用的界面
报错了 因为这里是微服务版本 代码生成的服务被拆分出去 我们没有启动 所以报错服务未找到
我们找到 启动类 RuoYiGenApplication
方法同上 启动 注意:这个模块在Nacos中有配置 ruoyi-gen-dev.yml
数据库 记得比对是否是自己的url 账户 密码
# spring配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ry-cloud
username: root
password: root
2
3
4
5
6
7
启动成功之后我们再次刷新访问 就可以看到下面这个界面了
# 按钮解析
- 生成: 根据我们选择的要进行操作的数据表进行代码的生成 CRUD + Vue + Js接口的调用 + 菜单侧边栏
- 导入: 当我们创建的新数据表 在当前页面是无法查看的 所以就需要我们选择需要进行生成的表 导入到当前页面 进行后续的操作
- 修改: 对我们要生成的代码 部分设置进行修改 类型生成路径 查询条件的修改等等
- 删除: 字面意思 就是删除这条数据 注意不会删除已经生成的代码 也不会删除当前表
# 流程
创建数据库 我们这里以一个学生信息的CRUD做演示
CREATE TABLE xd_student( id VARCHAR(64) primary key, -- ID 主键 stu_name VARCHAR(64) not null, -- stu_name 学生名称 不能为空 age INTEGER DEFAULT 18, -- age 年龄 默认 18 岁 email VARCHAR(64) -- 邮箱 )COMMENT='学生信息';
1
2
3
4
5
6点击导入 检索
xd_student
表 选中后点击确认后 我们就可以看到当前表已被添加到数据中预览
可以根据我们设置的代码生成规范 查看生成后的代码情况 此处只是一个预览功能 并未生成实际的代码
编辑
可以理解为代码构造器设置 代码的生成规格就是根据当前的设置进行生成的
- 基本信息 手动修改表名 实体类名称 作者等信息 表名称主要是在我们sql文件中有体现
- 字段信息 表中所有的字段 插入编辑 分别对应新增和修改时表单的显示字段 列表特指表格数据
- 生成信息 生成代码方式此处我们可以进行选择 zip包 和 直接写入到本地 生成业务名 就是我们在controller中的
url
名称
同步
当表结构发生变化时 可以使用同步功能来替换当前的数据
生成代码
配置完成后 就会根据我们设置的配置进行代码生成 如果我们在生成信息中配置生成代码方式为zip压缩包 则会给我们下载下zip包 然后就可以手动将代码copy到我们的系统中(
后端需要重启服务
) 其中分为三部分后端代码 (main)
前端画面 + Js接口(vue)
侧边栏sql 文件
sql文件需要我们手动导入到数据库中 之后我们就可以在侧边栏中看到当前菜单了
# 路由 权限
# 工具类
# 模块创建
右键
new Module
因为我这里使用的IDEA版本为2022,有出入但内容相差不大
创建成功之后 我们就可以去
cv
了 首先去ruoyi-system的pom
中 去复制dependencies中的依赖
和插件 build
还有就是这个启动类 同样创建包 内容复制就好 记得把启动类的名称修改一下
代码的复制就结束了 我们再看下配置文件的复制
banner.txt
没什么太大的意义 可以不复制 他的作用只是在启动的时候 进行展示里面的内容 通常用于显示端口 和 服务的名称 但是这些东西本来就是我们定义的 还需要他提醒嘛 必然不用bootstrap
直接使用ruoyi-system
的配置文件 修改应用名称 端口号logback.xml
日志打印配置 拿来吧你
最后 来到我们的
nacos控制台
- 克隆我们的
ruoyi-system-dev.yml
配置 到新的配置 新配置名称 在上面中文件中的spring.application.name
格式统一- 修改新配置文件中的redis DB这些信息
- 修改mybaits包扫描的路径
# mybatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.student
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/**/*.xml
2
3
4
5
6
这里我们需要再次转战到 网关的配置 中
ruoyi-gateway-dev.yml
文件中 仿造其他的模块 将我们自己的模块添加进去
# 学生模块
- id: ruoyi-student
uri: lb://ruoyi-student
predicates:
- Path=/student/**
filters:
- StripPrefix=1
2
3
4
5
6
7
启动我们的新模块
# 插播一个Feign调用
最近入手了联通的项目 拾起了这个东西 发现也是全还回去了 而且还遇到一些很
稀奇古怪
的调用
我们呢就通过一个新的项目 来调用
Student
模块的GetList
作为敲门砖
# File new Project
一个小小的测试模块 创建了半天 基本上全死在了依赖上面 不是不匹配 就说导不进来 如果你不清楚 需要什么包的话 直接无脑复制吧
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflex-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
ok 依赖导入完毕之后 我们再创建一个Controller 一个Feign接口就好了
本次模拟使用无参调用 返回值也不进行封装了 万事万物皆对象嘛
FeignController
提供给我们使用 通过访问StudentFeign
的这个接口来获得ruoyi-student
的接口数据
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/feign")
public class FeignController {
// 注入我们的Feign调用接口
@Autowired
private FeignService feignService;
@GetMapping("list")
public Object getList() {
return feignService.getList();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@FeignClient("服务名称")
当然如果是第三方接口 我们也可以通过设置url进行调用 不过本次都是在同一个注册中心上面 只需要服务名就可以
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("ruoyi-student")
public interface FeignService {
// 此处需要填写的是ruoyi-student上面的接口路径
@GetMapping("/student/getList")
Object getList();
}
2
3
4
5
6
7
8
9
10
# Feign第一次无参调用
首先我们看一下正常调用
ruoyi-student
模块的getList
获得的数据http://127.0.0.1:9205/student/getList
接下来 我们通过调用
StudentFeign
项目暴露出的接口 来比较数据http://127.0.0.1:9209/feign/list
可以 我们能看到 简直一模一样 这就代表我们最简单的一个小小的Feign调用就这么通了 🎉🎉🎉
# 总是那么多的稀奇古怪
正常的GET,POST就不过多赘述了 该拼接拼接该用对象就用对象 说几个一直半会没反应过来的
# GET + 对象参数
某天 我遇到这个接口 Get请求接收一个对象 此时我还没意识到什么不一样的地方 自然写下了一样的调用 你要对象 好我给你对象 get请求 发送
// 接口提供
@GetMapping("/getStudent")
public TableDataInfo getStudent(XdStudent student)
{
return getDataTable(xdStudentService.selectXdStudentList(student));
}
// 内部调用暴露
@PostMapping("/getStudent")
public Object getStudent(@RequestBody XdStudent student) {
return feignService.getStudent(student.getId());
}
// Feign调用 与接口提供同步
@GetMapping("/student/getStudent")
Object getStudent(XdStudent student);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
??? 发生了什么 这时候 才反应过来 总感觉哪里怪怪的 如果不能修改接口提供的前提下 那我们就开始手动拼接吧
// 改造后的Feign调用
@GetMapping("/student/getStudent?id={id}")
Object getStudent(@PathVariable String id);
2
3