最新要闻
- 天天快讯:缩减5G基站招标规模 大幅减少5G投资?中移动回应:外界误读
- 天天关注:又一个满血14GB/s!PCIe 5.0 SSD用上巨型风扇 太过分了
- 抗原检测盒优惠了!50人份到手19.9元
- 白玉兰奖入围名单揭晓 网友:正午阳光赢麻了
- 抛弃反人类半幅方向盘 特斯拉Cybertruck电动皮卡实车图:今年必交付 当前热门
- 武磊:客场也能感受球迷的热爱和支持 超越一切对立_天天最资讯
- 手机性价比被吐槽 HTC对元宇宙是真爱:不认同降温说、非常乐观
- Redmi性能王者!K60 Ultra工业设计图曝光 前沿资讯
- 《王者荣耀》体验服爆料:中单法师狂喜 斩杀史诗级优化
- 全球热消息:导航出错驶入紧急停车带 驶出时被撞 科普:紧急停车带该怎么用
- 全球视点!内存连续三个季度暴跌 三大厂疯狂减产!想涨价?没门儿
- 海贼王:“七武海”原型揭秘!居然来自30年前游戏《浪漫沙加2》
- 举报比亚迪排放不达标!长城汽车晒业绩:1-4月同比增长99.1% 买它还是比亚迪?_每日精选
- 焦点播报:16核R9 7945HX加持!联想公布新版拯救者R9000P参数
- 世界百事通!法拉第未来官宣:FF 91第一阶段交付5月31日开始 车主先培训
- 环球视讯!促进跨区域产业链、供应链、创新链、资金链、人才链深度融合,一大批长三角G60科创走廊跨区域合作重点项目签约
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天热头条丨Spring Boot + URule 规则引擎,可视化配置太爽了!
作者:知了一笑来源:juejin.cn/post/7210194936276680759
一、背景
前段时间,在做项目重构的时候,遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决,但是当时也不清楚怎么回事,就想玩点别的。于是乎,就去调研了规则引擎。
当然,市面上有很多成熟的规则引擎,功能很多,性能很好。但是,就是想玩点不一样的(大家做技术选型别这样,这个是反面教材)。最终一款URule的规则引擎吸引了我,主要还是采用浏览器可直接配置,不需要过多安装,可视化规则也做的不错。经过一系列调研,后面就把它接入了项目中,顺便记录下调研的结果。
(资料图片仅供参考)
二、介绍
规则引擎其实是一种组件,它可以嵌入到程序当中。将程序复杂的判断规则从业务代码中剥离出来,使得程序只需要关心自己的业务,而不需要去进行复杂的逻辑判断;简单的理解是规则接受一组输入的数据,通过预定好的规则配置,再输出一组结果。
当然,市面上有很多成熟的规则引擎,如:Drools、Aviator、EasyRules等等。但是URule,它可以运行在Windows、Linux、Unix等各种类型的操作系统之上,采用纯浏览器的编辑模式,不需要安装工具,直接在浏览器上编辑规则和测试规则。
当然这款规则引擎有开源和pro版本的区别,至于pro版是啥,懂的都懂,下面放个表格,了解下具体的区别
特性 | PRO版 | 开源版 |
---|---|---|
向导式决策集 | 有 | 有 |
脚本式决策集 | 有 | 有 |
决策树 | 有 | 有 |
决策流 | 有 | 有 |
决策表 | 有 | 有 |
交叉决策表 | 有 | 无 |
复杂评分卡 | 有 | 无 |
文件名、项目名重构 | 有 | 无 |
参数名、变量常量名重构 | 有 | 无 |
Excel决策表导入 | 有 | 无 |
规则集模版保存与加载 | 有 | 无 |
中文项目名和文件名支持 | 有 | 无 |
服务器推送知识包到客户端功能的支持 | 有 | 无 |
知识包优化与压缩的支持 | 有 | 无 |
客户端服务器模式下大知识包的推拉支持 | 有 | 无 |
规则集中执行组的支持 | 有 | 无 |
规则流中所有节点向导式条件与动作配置的支持 | 有 | 无 |
循环规则多循环单元支持 | 有 | 无 |
循环规则中无条件执行的支持 | 有 | 无 |
导入项目自动重命名功能 | 有 | 无 |
规则树构建优化 | 有 | 无 |
对象查找索引支持 | 有 | 无 |
规则树中短路计算的支持 | 有 | 无 |
规则条件冗余计算缓存支持 | 有 | 无 |
基于方案的批量场景测试功能 | 有 | 无 |
知识包调用监控 | 有 | 无 |
更为完善的文件读写权限控制 | 有 | 无 |
知识包版本控制 | 有 | 无 |
SpringBean及Java类的热部署 | 有 | 无 |
技术支持 | 有 | 无 |
三、安装使用
实际使用时,有四种使用URule Pro的方式,分别是嵌入式模式、本地模式、分布式计算模式以及独立服务模式。
但是我们这里不考虑URule Pro,咱自己整个开源版,在开源版集成springboot的基础上做一个二次开发,搜了一圈,其实就有解决方案。
大致的项目模块如下:
Spring Boot 基础就不介绍了,推荐看这个实战项目:
https://github.com/javastacks/spring-boot-best-practice
自己创建个空数据库,只需要在edas-rule-server服务中修改下数据库的配置,然后启动服务即可。第一次启动完成,数据库中会创建表。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/urule-data?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=falsespring.datasource.username=rootspring.datasource.password=mysql
上面说过,它是纯用浏览器进行编辑,配置规则的,只需要打开浏览器,输入地址:http://localhost:8090/urule/frame,看到这个界面,就说明启动成功了。
四、基础概念
3.1整体介绍
先说下URule它的构成部分,主要是两部分:1、设计器部分 2、规则执行引擎。设计器部分主要是库文件和规则文件构成。下面看下整体的结构图
3.2库文件
如上图介绍的,库文件有4种,包括变量库,参数库,常量库和动作库。其实类似于Java开发的系统中的实体对象,枚举,常量以及方法。
上面说过,规则都是可视化配置的。在配置规则的过程中,就需要引入各种已经定义好的库文件,再结合业务需求,从而配置出符合业务场景的业务规则,所以哪里都有库文件的身影。
3.2.1变量库文件
在业务开发中,我们会创建很多Getter和Setter的Java类,比如PO、VO、BO、DTO、POJO等等,其实这些类new对象后主要起到的作用就是数据的载体,用来传输数据。
在URule中,变量库就是用来映射这些对象,然后可以在规则中使用,最终完成业务和规则的互动。最后上一张图,用来创建变量库
对了,上面废话了这么多可视化配置,这才是第一次展示配置界面,惭愧惭愧。
上图一目了然,在“库”这个菜单底下右键,然后点击添加变量库即可,最后定义自己喜欢的变量库名,当然名字只支持中文或者英文,其他字符不可用。
创建完变量库后,就可以对变量库进行编辑,可以认为就是给POJO添加属性
也不弯弯绕绕讲什么术语,就个人理解。图左边是创建类,其中名称是它的别名,配置规则用它代替这个类。图右边是类的属性,我这里随便写了几个,估计看了懂得都懂。
最后在业务系统中创建对应的类,注意全限定名和配置变量库的类路径一致。
package com.cicada;import com.bstek.urule.model.Label;import lombok.Data;/** * @author 往事如风 * @version 1.0 * @date 2023/3/3 15:38 * @description */@Datapublic class Stu { @Label("姓名") private String name; @Label("年龄") private int age; @Label("班级") private String classes;}
最后说下这个@Label
注解,这个是由URule提供的注解,主要是描述字段的属性,跟变量库的标题一栏一致就行。听官方介绍可以通过这个注解,实现POJO属性和变量库属性映射。就是POJO写好,然后对应规则的变量库就不需要重新写,可以直接生成。反正就有这个功能,这里就直接一笔带过了。
3.2.2常量库文件
说到常量库,这个就可以认为是我们Java系统中的常量,枚举。比如性别,要定义枚举吧;比如对接的机构,也可以定义一个枚举吧。
当然,类似于变量库,常量库也可以实现和系统中的枚举相互映射,这样做的好处可以避免我们手动输入,防止输入错误。创建常量库也比较简单,直接在“库”这个菜单下右键,“添加常量库”。
创建好常量库文件后,也会出现如下页面:
3.2.3参数库文件
参数库,就是URule规则中的临时变量,变量的类型和数量不固定。可以认为类似于Map,实际上存储参数库的也就是个Map。
同样的套路,直接在“库”这个菜单下右键,“添加参数库”。
可以看到,参数库已经少了左边分类这一项,直接添加参数,选择类型就是干,相对简单了很多。“名称”这列我这里用了英文,就是Map中的key,而“标题”这列就是在配置规则时候显示用的,中文看着比较直观。
当然还需要注意的点是,定义的名称要保证唯一,因为Map中的key是唯一的,不然就会存在覆盖的情况。
3.2.4动作库文件
动作库可以对配置在spring中的bean方法进行映射,然后可以在规则中直接调用这批方法。惯用套路,还是在“库”菜单下右键,点击“添加动作库”。
然后我在系统中添加了一个类Action
,然后在类上标记@Component
注解,将该类交给spring的bean容器管理。该类中添加一些方法,在方法上标记@ExposeAction
注解,该注解是URule定义的,说明被标记的方法都会被动作库读取到。
package com.bstek.urule.cicada;import com.bstek.urule.action.ActionId;import com.bstek.urule.model.ExposeAction;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;/** * @author 往事如风 * @version 1.0 * @date 2023/3/10 13:59 * @description */@Component("action")public class Action { @ActionId("Hello") public String hello(){ return "hello"; } @ExposeAction(value="方法1") public boolean evalTest(String username){ if(username==null){ return false; }else if(username.equals("张三")){ return true; } return false; } @ExposeAction(value="测试Int") public int testInt(int a,int b){ return a+b; } @ExposeAction(value="打印内容") public void printContent(String username, Date birthday){ SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if(birthday!=null){ System.out.println(username+"今年已经"+sd.format(birthday)+"岁了!"); }else{ System.out.println("Hello "+username+""); } } @ExposeAction(value="打印Stu") public void printUser(Stu m){ System.out.println("Hello "+m.getName()+", is age:"+m.getAge()); }}
最后在动作库页面上添加bean,“Bean Id”一列输入对应的spring bean的名称,这里输入action。然后点击操作列中的小手按钮,就会弹出刚在Action
类中标记了ExposeAction
注解的方法。选择一个指定的方法添加进来,最后看到方法对应的参数也会被自动加载进去。
最后,变量库、参数库、动作库、常量库这些库文件定义好后,各种规则文件配置的时候就可以导入他们。但是一旦这些库文件被某个规则文件使用,就不要随意修改库文件了。
3.3规则集
说到规则集,顾名思义,就是配置规则了。前面定义的库文件就需要导入到规则集中去配置使用。它是使用频率最高的一个业务规则实现方式。
规则集说的是规则的集合,由三个部分规则组成:如果、那么、否则。
在规则集的定义的方式上,URule由向导式和脚本式两种;
- 向导式规则集:就是在页面上通过鼠标点点点,高度的可视化配置,不是开发都能懂,这也是这个规则引擎的亮点所在。
- 脚本式规则集:听名字就知道了,这玩意要写脚本的。拉高配置门槛,需要懂点编码的人来编写。
3.3.1向导式规则集
还是一样,首先新建。这次是在“决策集”菜单上右键,点击“添加向导式决策集”,这样就创建好一个规则集了。
在配置规则前,可以先导入前面定义好的库文件。我这里导入变量库文件,页面上点击“变量库”,然后选择指定的变量库文件即可。如图所示;
最后,可以愉快的配置规则了,向导式没什么好讲的,都是可视化界面,点点点即可。下面是我配置的一个简单的规则集;
可以看到由三部分组成:如果、那么、否则;
- 如果:配置规则的条件;
- 那么:配置满足条件后执行的动作,一般配置变量赋值比较多
- 否则:配置不满足条件执行的动作
最后,附上添加完规则后,通过代码去执行规则;
package com.cicada;import cn.hutool.core.bean.BeanUtil;import com.Result;import com.bstek.urule.Utils;import com.bstek.urule.runtime.KnowledgePackage;import com.bstek.urule.runtime.KnowledgeSession;import com.bstek.urule.runtime.KnowledgeSessionFactory;import com.bstek.urule.runtime.service.KnowledgeService;import com.cicada.req.StuReq;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.IOException;/** * @author 往事如风 * @version 1.0 * @date 2023/3/10 16:47 * @description */@RestController@RequestMapping("/rule")public class RuleDataController { @PostMapping("/stu") public Result rule(@RequestBody StuReq stuReq) throws IOException { KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID); KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("xxx/xxx"); KnowledgeSession knowledgeSession = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage); Stu stu = BeanUtil.copyProperties(stuReq, Stu.class); knowledgeSession.insert(stu); knowledgeSession.fireRules(); return Result.success(stu.getTeacher()); }}
请求接口,最终参数符合配置的条件,返回“那么”中配置的输出结果。
3.3.2脚本式规则集
脚本式的规则集,各种原理都是和向导式一模一样,无非就是拉高门槛,用写脚本的方式去实现配置的规则。这里不做过多的介绍了。
3.4决策表
再聊下决策表,其实它就是规则集的另一种展示形式,比较相对规则集,我更喜欢用决策表去配置规则,应为它呈现的更加直观,更便于理解。但是本质和规则集没啥区别。
也不展开过多的赘述,这里我就放一张配置过的决策表;
3.5其他
当然,还有其他的概念和功能,这里也不一一介绍了,因为上面说的已经是最常用的了,想了解的可以自行去了解。其他功能包括:交叉决策表、评分卡、复杂评分卡、决策树、规则流;当然,其中有些是Pro版的功能。
四、运用场景
最近在开发一期大版本的需求,其中就有个场景,具体如下;参与购买订单的用户都会有自己的一个职级,也可以说是角色。每个用户都会有三个职位:普通用户、会员、精英会员。
然后,每个月初都会对用户进行一次晋升处理,普通用户达到要求,就会晋升为会员,会员达到要求就会晋升为精英会员。
当然,普通用户晋升会员,会员晋升精英会员,都会有不同的规则;
- 普通用户->会员:3个月内帮注册人数达到3人;3个月内自己和底下团队的人,下单金额超过1万;个人的订单继续率超过80%。
- 会员->精英会员:3个月内帮注册人数达到6人;3个月内自己和底下团队的人,下单金额超过5万;个人的订单继续率超过90%。
- 不能跨级晋升,普通用户最多只能到会员,达到会员了才能晋升到精英会员。
当然,这只是做过简化的一部分需求,我做过稍许的改动,真实的需求场景并没有这么简单。
下面,我对这个需求做一个规则的配置,这里用一个决策表进行配置;在配置规则前,我添加一个变量库文件和常量库;
最后,添加一个决策表,并进行规则配置;
可以看到,表格一共五列,其中前四列是规则,最后一列是满足规则后输出的信息。这样看着就很清晰,即使并不是技术人员,也可以轻松看懂其中的规则。
五、总结
规则引擎对于我们的系统而言可用可不用,它可以锦上添花,帮助我们剥离出业务中需要进行大量判断的场景。但是,这种规则的剥离,需要我们开发人员对需求进行理解,在理解的基础上进行抽象概念的具化。这,也是整个编程的必经之路。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
天天热头条丨Spring Boot + URule 规则引擎,可视化配置太爽了!
作者:知了一笑 来源:juejin cn post 7210194936276680759 一、背景前段时间,在做项目重构的时候,遇到
来源: 天天热头条丨Spring Boot + URule 规则引擎,可视化配置太爽了!
亚马逊平台API接口是什么?-全球头条
2 分钟,搞懂 SLO 最佳实践
全网最全Kubernetes(k8s)知识点,看着一篇就够了-当前热讯
【财经分析】推动“1到100”的跨越式发展 长三角崛起生物医药产业“新基建”高地
天天快讯:缩减5G基站招标规模 大幅减少5G投资?中移动回应:外界误读
天天关注:又一个满血14GB/s!PCIe 5.0 SSD用上巨型风扇 太过分了
抗原检测盒优惠了!50人份到手19.9元
白玉兰奖入围名单揭晓 网友:正午阳光赢麻了
抛弃反人类半幅方向盘 特斯拉Cybertruck电动皮卡实车图:今年必交付 当前热门
环球要闻:渗透测试之Payload
7个工程应用中数据库性能优化经验分享
焦点热议:Prometheus笔记-告警规则配置
北京市2023年新增地方政府债务限额1117亿元
收评:沪指午后反弹涨0.35% AI赛道股发力 新能源行业低迷_天天信息
武磊:客场也能感受球迷的热爱和支持 超越一切对立_天天最资讯
手机性价比被吐槽 HTC对元宇宙是真爱:不认同降温说、非常乐观
Redmi性能王者!K60 Ultra工业设计图曝光 前沿资讯
《王者荣耀》体验服爆料:中单法师狂喜 斩杀史诗级优化
全球热消息:导航出错驶入紧急停车带 驶出时被撞 科普:紧急停车带该怎么用
全球视点!内存连续三个季度暴跌 三大厂疯狂减产!想涨价?没门儿
快报:做数据分析的常用方法有哪些?
尚硅谷Hadoop的WordCount案例实操练习出现的bug-环球新视野
JS 里如何实现异步?
如何在上架App之前设置证书并上传应用|全球今头条
海贼王:“七武海”原型揭秘!居然来自30年前游戏《浪漫沙加2》
举报比亚迪排放不达标!长城汽车晒业绩:1-4月同比增长99.1% 买它还是比亚迪?_每日精选
焦点播报:16核R9 7945HX加持!联想公布新版拯救者R9000P参数
世界百事通!法拉第未来官宣:FF 91第一阶段交付5月31日开始 车主先培训
环球视讯!促进跨区域产业链、供应链、创新链、资金链、人才链深度融合,一大批长三角G60科创走廊跨区域合作重点项目签约
广州市花都区秀全中学:720分以上学生可以考虑秀中清北班-世界微头条
易基因:MeRIP-seq等揭示m6A reader YTHDF1在结直肠癌PD-1免疫治疗中的作用|Gut 全球实时
手把手教你在昇腾平台上搭建PyTorch训练环境_天天新要闻
今日上映!《小美人鱼》豆瓣评论:难以接受黑人鱼、强凑CP、毁童年-焦点热门
即时:宝德暴芯x86处理器现身GeekBench 5:坐实就是Intel i3-10105
知名演员罗京民去世 曾饰演许三多的爹:张译等人发文悼念 焦点速递
ST浩源:截至2023年5月20日,公司股东14658户,谢谢对公司的关注!|天天最新
每个.NET开发都应该知道的10个.NET库
关于AWS中VPC下的IGW-internet gateway的创建与说明
升级天玑8200处理器:vivo S17 Pro现身Geekbench
曝小米13 Ultra欧洲售价超1.1万元:比iPhone 14 Pro、华为P60 Pro都贵_世界今日讯
全球球精选!破首发仅7499元!华硕天选4游戏本配锐龙9与RTX4060:高性价比真香
热点!散了吧!特斯拉车顶维权女车主败诉:刹车失灵观点站不住脚 没任何证据证明
《变形金刚7:超能勇士崛起》超燃特辑出炉:保时捷964街头飞车_热资讯
Netty实战(三)
上市公司实控人离婚140亿归女方,盘点彤程新材投资版图
千元神机!荣耀X50首发骁龙6 Gen1:一亿像素加持
育碧再次背离玩家!《刺客信条:幻景》PC端Steam独不占_世界百事通
一眼假的诈骗短信是骗子智商不够吗?官方:这是极高效率筛选受害者
京东618大促攻略:iPhone 14 Pro系列直降1800元 多会员年卡探底|环球视点
百度文心大模型3.5版要来了!李彦宏:大模型将改变世界 环球热门
屹通新材:5月25日融资买入167.73万元,融资融券余额3877.74万元
统信UOS系统开发笔记(一):国产统信UOS系统搭建开发环境之虚拟机安装
揭秘百度IM消息中台的全量用户消息推送技术改造实践
Python工具箱系列(三十三)
海内外直播源码加密技术保障您的隐私安全 焦点快播
Windows下使用docker部署.Net Core 全球今热点
一天斩获3个冠军!全国花游冠军赛北京队“开门红”-快看点
DXO拍照全球第一!华为P60 Pro新增12GB+256GB版本 6488元
单价6.5亿 想坐吗?国产大飞机C919商业首航来了:5月28日、上海至北京_微头条
神操作 小汽车撞倒闯红灯三轮车后居然直接走了 无责变有责
糟糕!下一轮国内油价调整“由跌转涨”:当前上调75元/吨 今日快讯
牌面!福特CEO称特斯拉不是最大竞争对手 比亚迪才是 环球新消息
环球视讯!UE/虚幻 蓝图实现通过http获取数据(以高德地图API为例)&Json格式数据的读取
标准化考场时间同步系统(网络时钟系统)规划建设应用 每日快播
Java设计模式-策略模式|环球快资讯
焦点要闻:美联储加息预期升温 美元兑日元汇率再度站上140
计算机时代变了 NVIDIA黄仁勋:CPU用得越来越少 GPU才是关键|世界实时
【世界快播报】自研火箭发射8颗卫星 韩国表态已成航天强国:仅中美等7国做到
当前快报:跟比亚迪海豚争场子 五菱云朵8月上市:10万级大五座纯电新宠
焦点观察:优派推出新款27寸4K Mini LED显示器:支持96W反向充 2999元
山东一高速现天价救援费:20公里被收11000元 结局大快人心 观天下
世界热点!Fastjson 很快,但不适合我....
每日观点:干瘦肉炒什么配菜好吃?
一季度垃圾短信投诉5万件 官方揭秘:主要是这10家公司发的
18888元求票 五月天黄牛票涨回去了?29名黄牛被查处|当前简讯
你吃过没?商家回应淄博烧烤降温:再不降温我们也受不了|新消息
世界消息!成都一轿车冲进店铺撞坏16个骨灰盒 现场损坏严重:网友称是大众
遥遥领先!华为分布式存储斩获IO500榜全球第一:Intel看不见尾灯
裘皮是什么皮_裘皮的介绍 天天资讯
触达债务上限日期或在两周后 美债收益率延续上行_环球微头条
国际金融市场早知道:5月26日|焦点热讯
刘强东14年为宿迁投入超200亿!宿迁第一高楼启用 未来3年在当地新招上万人
世界热点评!《英雄联盟手游》今日更新:无限火力升级归来 英雄可达25级
刷新世界纪录!中国吊起142米、3068吨“巨无霸”大塔
选择商品的发布类目方式有_选择一款正确发布的商品
今日要闻!学系统集成项目管理工程师(中项)系列27_10大管理47过程、输入输出工具和技术(2版教材)
今天国内上映!《小美人鱼》来了 口碑解禁观众爱看小黑美人鱼
新概念英语语法词汇练习第一册_关于新概念英语语法词汇练习第一册简介 热点在线
调优圣经:零基础精通Jmeter分布式压测,10Wqps+超高并发 世界快资讯
直接用中文写提示词的Stable Diffusion扩展:sd-prompt-translator发布
上海高架斗气车主或涉嫌什么罪名?专家解读多种可能
天天热门:史上最大涨幅!康宁:所有玻璃基板提价20%
天天头条:让友商恨得牙痒痒的比亚迪宋Pro DM-i冠军版:到底怎么样?
视焦点讯!马斯克吹了三年的锂电之光4680:竟然还不如普通电池!
袋鼠贵为澳大利亚国宝 却每年被合法猎杀几百万只:为啥? 全球即时看
当前快播:宠物经济板块5月25日跌0.66%,狮头股份领跌,主力资金净流出7407.47万元
鼻中隔糜烂用什么药最好_鼻中隔糜烂
当前消息!新仙剑奇侠传之挥剑问情林月如怎么获得 林月如获取方法介绍
药智网数据库 高校(药智网数据库)