「若依」框架简介

一,对若依的看法

       在内网环境工作一年,想要做个自己的产品。一直在找个好框架,SSM框架较为复杂,需要整合的项目很多,技术较为古老,Spring boot解决了整合问题但是性能监控方面存在不足加上与最新的Spring Cloud以及其他云平台兼容性也存在一定的问题,更新慢想找个更好的。若依框架,基于Spring boot易于整合,可以与Java VisualVM(JVisualVM)集成提供性能监控信息,可以使用云平台提供的API和SDK直接将其直接部署到云平台上。关键是版本更新巨快,动不动就能扩展新鲜元素。

简单介绍下若依框架的优点:

  1. 基于Spring Boot:若依框架继承了Spring Boot的优点,如简洁、快速、易用等。它可以帮助开发者快速搭建应用程序,并提供了大量的常用功能和组件,如多模块支持、ORM、缓存、安全等。
  2. 强大的ORM:若依框架内置了一个强大的ORM框架,可以简化数据库操作,减少开发者的代码量。它支持多种数据库,如MySQL、Oracle、PostgreSQL等。
  3. 快速开发:若依框架提供了丰富的快速开发组件和模块,如代码生成器、模板引擎、前端框架等,可以帮助开发者快速开发出高质量的代码。
  4. 安全性:若依框架对安全性做了很好的支持,它提供了HTTPS支持、密码加密、访问控制等安全特性,可以保障应用程序的安全性。

个人觉得值得学习了解

二,简述若依框架的环境搭建

1.www.ruoyi.vip  选择ruoyi-vue 前后端分离项目 里面内容下载一下或克隆进idea,eclipse里面跑下sql表结构显示证明sql成功,以下用的是idea 2022 数据库管理工具用的是Navicat Premium 15

2.配一下redis如图出现ready to accre redis成功

#redis 配置
redis:
  database: 0
  host: 127.0.0.1
  port: 6379
  password: ''

3.改下数据库配置和redis配置后端出现如下地址栏则后端成功

4.前端的话需要搭一下vue的环境node.js npm 和pnpm 随便选用个前端软件拉起来 我用HBuilder X为例输入命令pnpm dev

看到左下角出现地址就说明项目前端成功启动了

JeecgBoot 文档中心

三,简单展示功能

若依框架是一款基于Spring Boot的企业级快速开发平台,它提供了一系列的功能和特性,包括但不限于以下几个方面(图片丢最后):

  1. 基于经典技术组合(Spring Boot、ApacheShiro、MyBatis、Thymeleaf、Bootstrap),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。
  2. 在线定时任务配置;支持集群,支持多数据源,支持分布式事务。
  3. 完全响应式布局(支持电脑、平板、手机等所有主流设备)
  4. 强大的一键生成功能(包括控制器、模型、视图、菜单等)
  5. 支持多数据源,简单配置即可实现切换。
  6. 支持按钮及数据权限,可自定义部门数据权限。
  7. 完善XSS防范及脚本过滤,彻底杜绝XSS攻击。
  8. Maven多项目依赖,模块及插件分项目,尽量松耦合,方便模块升级、增减模块。
  9. 国际化支持,服务端及客户端支持。
  10. 完善的日志记录体系简单注解即可实现,支持服务监控,数据监控,缓存监控功能。

四,简述若依的两处功能实现

后台手册 | RuoYi

1.「定时任务」实现

在实际项目开发中Web应用有一类不可缺少的,那就是定时任务。 定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券; 比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。 所以我们提供方便友好的web界面,实现动态管理任务,可以达到动态控制定时任务启动、暂停、重启、删除、添加、修改等操作,极大地方便了开发过程。目前来看工作中接触的多半是通过凌晨跑批处理(batch)实现。

/**
 * 定时任务调度测试
 * 
 * @author ruoyi
 */
@Component("ryTask")
public class RyTask
{
    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
    {
        System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
    }
 
    public void ryParams(String params)
    {
        System.out.println("执行有参方法:" + params);
    }
 
    public void ryNoParams()
    {
        System.out.println("执行无参方法");
    }
}

后端新建定时任务处理类(Bean、Class类调用)
Bean调用:需要添加对应Bean注解@Component或@Service。调用目标字符串:ryTask.ryParams('ry')
Class类调用:添加类和方法指定包即可。调用目标字符串:com.ruoyi.quartz.task.RyTask.ryParams('ry')

前端新建定时任务信息(系统监控 -> 定时任务)
任务名称:自定义,如:定时查询任务状态
任务分组:根据字典sys_job_group配置
调用目标字符串:设置后台任务方法名称参数
执行表达式:可查询官方cron表达式介绍
执行策略:定时任务自定义执行策略
并发执行:是否需要多个任务间同时执行
状态:是否启动定时任务
备注:定时任务描述信息

3、点击执行一次,测试定时任务是否正常及调度日志是否正确记录,如正常执行表示任务配置成功。

执行策略详解:
立即执行:所有misfire的任务会马上执行
执行一次:会合并部分的misfire,正常执行下一个周期的任务
放弃执行:所有的misfire不管,执行下一个周期的任务

2.「代码生成」实现

之前接触过要实现类似的功能,当时的要求是生成前端的js,就稍微留意了一下,也是因为执行安全策略的问题不能直接往jsp里面内嵌js,当时的解决方案是把js代码做成流写到jsp内置对象里。

若依的用了代码生成器Velocity是一个基于Java的模板引擎,其提供了Context容器,在java代码里面可以往容器中存值,然后在vm文件中使用特定的语法获取,作为一个模块引擎,除了作为前后端分离的MVC展现层,Velocity还有一些其他用途,比如源代码生成。

1.源代码生成

在若依Vue系统中使用了Velocity技术实现的源代码生成。大体上,源代码生成只需三步走:

  1. 创建模板文件
  2. 准备上下文(变量值)
  3. 替换模板文件中的变量

三步走完之后源代码就生成了,看上去简单,做起来会比较麻烦,尤其是第一步创建模板文件是最复杂的,以下为index.vue模板文件部分源代码:

#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
...

可以看到,该vue模板文件中充斥着大量Velocity的if-else语法,嵌套在一起更是显得无比复杂。

总之,整体上来看,java代码的模板比较简单,vue和mybatis mapper的模板文件比较复杂。

2.数据库表结构变更

mysql数据库中有一个information_schema数据库,它是mysql的系统数据库之一,它里面存储着两个表TABLES以及COLUMNS,这两个表分别存储着所有的表信息以及所有表中的列信息,代码生成器正是以操作两张表的信息来实现。

3.对接和完成

ruoyi-vue代码生成器相关代码均位于ruoyi-generator模块中,最简单的情况,前端页面只需要导入表结构生成代码两步即可完成代码生成

实际上这两步对应着后端的两个接口:com.ruoyi.generator.controller.GenController#importTableSave 和 com.ruoyi.generator.controller.GenController#batchGenCode ,生成的代码从这俩接口开始

首先看 接口,它做了以下这些事情

  1. 从information_schema数据库的tables表中查询目标表的表明、标注释、创建时间和更新时间,但是忽略掉定时任务的表和已经生成过的表。
  2. 初始化表数据并将数据插入ruoyi数据库的gen_table表
  3. 从information_schema数据库的columns表中查询目标表的列信息,包含字段名、字段注释、字段类型、是否允许为null等详细信息
  4. 初始化列信息并将数据插入ruoyi数据库的gen_table_column表

接下来看下 接口,它做了以下这些事情 

  1. 从ruoyi数据库的gen_table、gen_table_column表查询出生成代码需要的表和列信息
  2. 初始化Velocity
  3. 准备Velocity上下文信息(变量值信息)
  4. 读取模板、渲染模板,然后将渲染后的模板内容做成

至此 代码生成就可以完成了。

以下是项目跑起来后的几张截图后续对框架理解还会补充。想深入了解的建议学下前置知识{Java基础,Spring boot,Spring Cloud常用组件,微服务架构,数据库,前端(js,vue)}

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值