ruoyi-vue-pro 开发指南

一、简介

ruoyi-vue-pro 是一款基于 SpringBoot2.x 全家桶实现、Vue、Element UI 的后台管理系统模板,提供模板功能和CRUD代码生成,并且支持多租户系统、多数据源系统,可浏览器缓存、工作流、十强排行榜、代码生成等常用开发功能。

在本章节中,我们将介绍该系统的基本架构和运行环境。

二、系统架构

本系统的架构基于传统的前后端分离架构模式,采用以下技术栈:

  • 前端采用 Vue + Element + Axios + Webpack;
  • 后端采用 SpringBoot2.x + MyBatis-Plus + Shiro + Swagger-UI + Log4j2。

三、运行环境

运行该项目需要满足以下环境:

  • JDK8+
  • Maven 3.0+
  • MySQL 5.5+
  • Node.js 10+

四、项目结构

本系统的项目结构如下:

ruoyi-vue-pro/
  ├── ruoyi-admin/  后台管理模块
  ├── ruoyi-common/ 客户端、服务端公共模块
  ├── ruoyi-framework/ 框架核心模块
  ├── ruoyi-generator/ java代码自动生成模块
  ├── ruoyi-quartz/ 定时任务模块
  ├── ruoyi-system/ 后台管理业务模块
  ├── ruoyi-tools/ 系统工具模块
  └── src/  Vue前端代码

五、代码示例

1. Mybatis-Plus 更改系统默认表名确定方法

在项目中使用Mybatis-Plus的时候,默认情况下表名和实体类名必须一一对应,否则-会出现”无法找到该实体”的错误。在系统多数据源的时候,这种情况更加明显。

/**
* 代码生成前缀配置,表名以sys_开头才生成代码
*/
strategy.setTablePrefix(new String[] { "sys_" });

/**
*根据数据库表获取对应实体类
*/
@Override
public String tableToJava(String tableName) {
    if (tableName.startsWith("sys_")) {
        return upperTableName2Camel(tableName.replaceFirst("sys_", ""));
    } else if (tableName.startsWith("gen_")) {
        return upperTableName2Camel(tableName.replaceFirst("gen_", "Gen"));
    } else if (tableName.startsWith("qrtz_")) {
        return upperTableName2Camel(tableName.replaceFirst("qrtz_", "Qrtz"));
    } else {
        return upperTableName2Camel(tableName);
    }
}

2. 自定义异常处理

异常处理是Web应用开发中非常重要的一环,当系统出现异常时,我们需要有一个统一的异常处理机制。在本项目中,我们通过继承DefaultHandlerExceptionResolver,并重写它的resolveException()方法实现异常处理。

@RestControllerAdvice
public class GlobalExceptionHandler extends DefaultHandlerExceptionResolver {

    @Autowired
    private MessageSource messageSource;

    /**
    * 处理业务异常
    */
    @ExceptionHandler(BusinessException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public R businessException(BusinessException e) {
        String message = messageSource.getMessage(e.getMessage(), null, LocaleContextHolder.getLocale());
        return R.error(message);
    }

    /**
    * 处理未知异常
    */
    @Override
    protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        logger.error("系统内部异常,异常信息:", ex);

        /**
        * 对于未知异常,只返回“系统内部异常”这个提示信息
        */
        String message = messageSource.getMessage("error.internal.server", null, LocaleContextHolder.getLocale());
        return new ResponseEntity(R.error(message), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

3. 多租户系统实现

本系统支持多租户,在开发过程中每个公司可以使用一个数据库,将每个公司的相关数据存放在各自的数据库中。我们在引入Mybatis-Plus后,通过继承MybatisSqlInterceptor实现多租户的切换。

@Configuration
@MapperScan("com.ruoyi.system.mapper")
public class MybatisPlusConfig {

    @Autowired
    private RuoYiConfig ruoyiConfig;

    /**
    * 多租户方案之一:schema模式
    */
    @Bean
    public MybatisSqlInterceptor mybatisSqlInterceptor() {
        return new MybatisSqlInterceptor() {
            @Override
            public void prepare(SqlMappedStatement mappedStatement, Object parameter) {
                if (SecurityUtils.getMultiTenantId() != null) {
                    final String tenantId = SecurityUtils.getMultiTenantId();
                    if (StringUtils.isNotBlank(tenantId)) {
                        String originalSql = mappedStatement.getSql();
                        StringBuilder sqlBuilder = new StringBuilder("SET SCHEMA '")
                                .append(tenantId.toLowerCase())
                                .append("';");
                        sqlBuilder.append(originalSql);

                        setPreparedSql(originalSql);
                        setTargetSql(sqlBuilder.toString());
                    }
                }
            }
        };
    }

    /**
    * 多租户方案之二:动态表名
    */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new DynamicTableNameInnerInterceptor());
        return interceptor;
    }
}

4. Vue + Element UI 实现图标操作

Vue + Element UI 可以通过依赖 fontawesome 实现图标操作。在这里我们可以选择几种方式来实现图标的引用:

  1. 引用CDN上面的fontawesome图标库
  2.     
      
  3. 下载fontawesome文件到本地,然后引用本地文件
  4.     
      
  5. 使用vue-awesome作为插件,安装这个插件,就可以很方便地在vue中使用fontawesome图标库的各种图标了。
  6.     npm install --save @fortawesome/fontawesome-svg-core
        npm install --save @fortawesome/free-solid-svg-icons
        npm install --save @fortawesome/vue-fontawesome
      
        
          
        
    
        
          import Vue from 'vue'
          import { library } from '@fortawesome/fontawesome-svg-core'
          import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
          import { faUser } from '@fortawesome/free-solid-svg-icons'
    
          // 通过library方法引入想要使用的图标
          library.add(faUser)
    
          Vue.component('font-awesome-icon', FontAwesomeIcon)
        
      

5. Swagger-UI 自动生成API文档

Swagger-UI 可以根据我们代码中的注解自动生成 API 文档。在本项目中,我们可以通过以下配置实现:

/**
* swagger配置
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    /**
    * 注入系统基础配置
    */
    @Autowired
    private RuoYiConfig ruoyiConfig;

    @Bean
    public Docket createRestApi() {
        // 添加全局头部信息
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List parameters = new ArrayList();
        parameterBuilder.name("Authorization")
                .description("令牌")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false).build();
        parameters.add(parameterBuilder.build());

        // API文档基本信息配置
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(parameters)
                .securityContexts(Collections.singletonList(securityContext()))
                .securitySchemes(Collections.singletonList(securityScheme()));
    }

    /**
    * API文档基本信息配置
    */
    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("若依系统接口文档")
                .description("若依管理系统后台接口文档")
                .contact(new Contact(ruoyiConfig.getName(), null, null))
                .version("版本号:" + ruoyiConfig.getVersion())
                .build();
    }

    /**
    * 通过Swagger解决token问题
    */
    public SecurityScheme securityScheme() {
        return new ApiKey("Token", "token", "header");
    }

    /**
    * 通过Swagger解决token问题
    */
    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(Arrays.asList(new SecurityReference("Token", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
                .build();
    }
}

六、总结

本文主要介绍了ruoyi-vue-pro的基本架构和运行环境、项目结构、以及多个方面的代码示例。通过学习以上内容,我们可以更好地理解和使用该系统,从而提高我们的开发效率和协同工作能力。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/242720.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:51
下一篇 2024-12-12 12:51

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • Python字符转列表指南

    Python是一个极为流行的脚本语言,在数据处理、数据分析、人工智能等领域广泛应用。在很多场景下需要将字符串转换为列表,以便于操作和处理,本篇文章将从多个方面对Python字符转列…

    编程 2025-04-29
  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Python初学者指南:第一个Python程序安装步骤

    在本篇指南中,我们将通过以下方式来详细讲解第一个Python程序安装步骤: Python的安装和环境配置 在命令行中编写和运行第一个Python程序 使用IDE编写和运行第一个Py…

    编程 2025-04-29
  • FusionMaps应用指南

    FusionMaps是一款基于JavaScript和Flash的交互式地图可视化工具。它提供了一种简单易用的方式,将复杂的数据可视化为地图。本文将从基础的配置开始讲解,到如何定制和…

    编程 2025-04-29
  • Python起笔落笔全能开发指南

    Python起笔落笔是指在编写Python代码时的编写习惯。一个好的起笔落笔习惯可以提高代码的可读性、可维护性和可扩展性,本文将从多个方面进行详细阐述。 一、变量命名 变量命名是起…

    编程 2025-04-29

发表回复

登录后才能评论