ruoyi-cloud起步、新增模块和定制

一、环境准备

官网:doc.ruoyi.vip/ruoyi-cloud...

  1. MySQL 8版本(windows安装教程:blog.csdn.net/Floating_wi...
  2. nacos 2.0.4
  3. redis(版本在3以上)

二、项目的运行

数据库配置

项目代码下载完成后,找到代码目录下面的SQL脚本:

创建数据库ry-cloud,并导入ry_20240629.sql(必须),以及quartz.sql(定时任务相关,可选)。

之后,创建数据库ry-config,导入ry-config.sql

nacos配置(windows环境)

本地部署使用单机模式就可以了。

前往conf/application.properties,添加mysql数据源配置:

ini 复制代码
## 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.0=root
db.password.0=123456

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

修改bin/startup.cmd,修改启动模式为单机模式:

rem就是注释的意思

ini 复制代码
rem set MODE="cluster"
set MODE="standalone"

然后执行startup.cmd就可以了。

三、nacos配置中心的修改

修改下面配置文件中的数据库、redis连接信息:

  1. 网关(ruoyi-gateway-dev.yml):redis
  2. 权限(ruoyi-auth-dev.yml):redis
  3. 系统(ruoyi-stytem-dev.yml):mysql、redis
  4. 定时任务(ruoyi-job-dev.yml):mysql、redis
  5. 代码生成(ruoyi-gen-dev.yml):mysql、redis

四、启动

如果你使用的是idea,找到View -> Tool Windows -> Services,将其添加到窗口。

然后点击Add service -> Run Configuration... ->下拉找到SpringBoot,点击,所有的微服务就添加进去了。

必须启动的服务如下:

  1. 网关(ruoyi-gateway
  2. 权限(ruoyi-auth
  3. 系统(ruoyi-system

其他都是可选的。

五、如何自增模块

在第二步,我们已经有了两个数据库,分别是:

  1. ry-cloud
  2. ry-config
  3. ry-seata

这三个库是系统运行所必须的。比如现在我们想要添加一个接口业务模块,名为ruoyi-interface

5.1 后端代码新增模块

【1】新增模块

ruoyi-modules下新建一个模块,名为ruoyi-interface,此时ruoyi-modules的modules标签应该新增了一个module,如下例:

xml 复制代码
<modules>
  <module>ruoyi-interface </module>
</modules>

【2】maven配置

在新建的ruoyi-interface下新增pom.xml,带注释的是需要修改的:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-modules</artifactId>
        <version>3.6.5</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <!-- 修改模块名称 -->
    <artifactId>ruoyi-modules-interface</artifactId>

    <!-- 修改模块描述 -->
    <description>
        ruoyi-interface接口模块
    </description>

    <dependencies>

        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!-- SpringBoot Actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- Mysql Connector -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

        <!-- RuoYi Common DataSource -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-datasource</artifactId>
        </dependency>

        <!-- RuoYi Common DataScope -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-datascope</artifactId>
        </dependency>

        <!-- RuoYi Common Log -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-log</artifactId>
        </dependency>

        <!-- RuoYi Common Swagger -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

【3】resources资源配置

src/main目录下创建java和resources目录,resources目录的文件可以先复制其他模块的,比如ruoyi-system,结构应该是这样:

diff 复制代码
resources
- mapper.interface    改为mapper.模块名
- banner.txt	    直接复制即可
- bootstrap.yml       
- logback.xml
bootstrap.yml 复制代码
# Tomcat
server:
  ## 端口号改为独特的
  port: 9205

# Spring
spring: 
  application:
    ## 应用名称
    name: ruoyi-interface
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
logback.xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
  <!-- 日志存放路径 -->
  <property name="log.path" value="logs/ruoyi-interface" />
  <!-- 日志输出格式 -->
  <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

  <!-- 控制台输出 -->
  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
  </appender>

  <!-- 系统日志输出 -->
  <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/info.log</file>
    <!-- 循环政策:基于时间创建日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件名格式 -->
      <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
      <!-- 日志最大的历史 60天 -->
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 过滤的级别 -->
      <level>INFO</level>
      <!-- 匹配时的操作:接收(记录) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配时的操作:拒绝(不记录) -->
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>

  <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/error.log</file>
    <!-- 循环政策:基于时间创建日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件名格式 -->
      <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
      <!-- 日志最大的历史 60天 -->
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 过滤的级别 -->
      <level>ERROR</level>
      <!-- 匹配时的操作:接收(记录) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配时的操作:拒绝(不记录) -->
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>

  <!-- 系统模块日志级别控制  -->
  <logger name="com.ruoyi" level="info" />
  <!-- Spring日志级别控制  -->
  <logger name="org.springframework" level="warn" />

  <root level="info">
    <appender-ref ref="console" />
  </root>

  <!--系统操作日志-->
  <root level="info">
    <appender-ref ref="file_info" />
    <appender-ref ref="file_error" />
  </root>
</configuration>

【4】java部分配置

不考虑数据库,我们只添加一个启动类,以及一个简单的控制器,示例如下:

diff 复制代码
com.ruoyi.interface
- controller
---- TestController
- RuoYiInterfaceApplication
swift 复制代码
package com.ruoyi.interface;

import com.ruoyi.common.security.annotation.EnableCustomConfig;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 接口模块
 *
 * @author yharim
 */
@EnableCustomConfig
@EnableRyFeignClients
@SpringBootApplication
public class RuoYiInterfaceApplication {
    public static void main(String[] args)
    {
        SpringApplication.run(RuoYiInterfaceApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  接口模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                           " .-------.       ____     __        \n" +
                           " |  _ _   \      \   \   /  /    \n" +
                           " | ( ' )  |       \  _. /  '       \n" +
                           " |(_ o _) /        _( )_ .'         \n" +
                           " | (_,_).' __  ___(_ o _)'          \n" +
                           " |  |\ \  |  ||   |(_,_)'         \n" +
                           " |  | \ `'   /|   `-'  /           \n" +
                           " |  |  \    /  \      /           \n" +
                           " ''-'   `'-'    `-..-'              ");
    }
}
less 复制代码
/**
 * 测试接口不需要授权
 *
 * @author yharim
 */
@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping()
    public AjaxResult test() {
        return AjaxResult.success("hello, world,无需权限需在网关配置");
    }
}

5.2 nacos配置中心

需在nacos的配置中心新建配置文件,该例应当创建ruoyi-interface-dev.yml,内容如下(带##的依然是需要重点关注的):

yaml 复制代码
# spring配置
spring:
  redis:
    host: localhost
    port: 6379
    password: 
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: ruoyi
        loginPassword: 123456
    dynamic:
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        maxWait: 60000
        connectTimeout: 30000
        socketTimeout: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,slf4j
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      datasource:
          ## 主库数据源
          master:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
            username: root
            password: 123456
          # 从库数据源
          # slave:
            # username: 
            # password: 
            # url: 
            # driver-class-name: 

# mybatis配置
mybatis:
    ## 搜索指定包别名
    typeAliasesPackage: com.ruoyi.erpinterface
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath:mapper/**/*.xml

# springdoc配置
springdoc:
  gatewayUrl: http://localhost:8080/${spring.application.name}
  api-docs:
    # 是否开启接口文档
    enabled: true
  info:
    ## 标题
    title: '接口模块接口文档'
    # 描述
    description: '接口接口描述'
    ## 作者信息
    contact:
      name: RuoYi
      url: https://ruoyi.vip

此时,就可以启动服务了。比如想要调用之前的测试接口,可以通过http://localhost:9204/test来调用。

5.3 网关配置

修改nacos配置中心中的ruoyi-gateway-dev.yml,在对应位置添加网关信息:

ini 复制代码
        # 工程
        - id: ruoyi-interface
          uri: lb://ruoyi-interface
          predicates:
            - Path=/interface/**
          filters:
            - StripPrefix=1

5.4 前端配置

  1. 在菜单里添加菜单(如果需要),以及目录(也即功能点)
  2. 在前端项目的views里创建对应的index.vue文件
  3. 接口调用时,需要配置为网关拼路径的形式,上例在前端的调用路径应该是/interface/test

六、如何批量修改项目名包名

这里推荐一个python窗口程序,非常好用:gitee.com/woaiziyuan/...

直接执行会报错:某个路径下的配置文件找不到。同名配置文件可在项目中找到,将这个文件复制到不存在的路径,再次运行就可以了。

大部分的名字都会得到修改,但是还会有一些遗漏,可以依次把每一个微服务启动,排查一下。

七、如何将接口加入白名单

比如现在有服务interface下所有接口,都不需要token直接就可以访问,可以在nacos的网关配置进行配置:

yaml 复制代码
# 安全配置
security:
  ......
  # 不校验白名单
  ignore:
    whites:
      ......
      - /interface/**
相关推荐
追逐时光者37 分钟前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_38 分钟前
敏捷开发流程-精简版
前端·后端
苏打水com1 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧2 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧2 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧2 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧3 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧3 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng4 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6014 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring