MyBatis-plus 代码生成器配置
数据库配置(DataSourceConfig)
基础配置
| 属性 | 说明 | 示例 |
|---|---|---|
| url | jdbc 路径 | jdbc:mysql://127.0.0.1:3306/mybatis-plus |
| username | 数据库账号 | root |
| password | 数据库密码 | 123456 |
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").build();
可选配置
| 方法 | 说明 | 示例 |
|---|---|---|
| dbQuery(IDbQuery) | 数据库查询 | new MySqlQuery(),只在SQLQuery下生效 |
| schema(String) | 数据库 schema(部分数据库适用) | mybatis-plus |
| typeConvert(ITypeConvert) | 数据库类型转换器 | new MySqlTypeConvert(),只在SQLQuery下生效 |
| keyWordsHandler(IKeyWordsHandler) | 数据库关键字处理器 | new MySqlKeyWordsHandler() |
| typeConvertHandler(ITypeConvertHandler) | 类型转换器(默认) | 自定义实现ITypeConvertHandler,只在DefaultQuery下生效 |
| databaseQueryClass(AbstractDatabaseQuery) | 数据库查询方式 | 默认DefaultQuery.class(通用元数据), SQLQuery.class(SQL查询) |
// 使用SQL查询的方式生成代码,属于旧的代码生成方式,通用性不是好,老的代码可以继续使用,适配数据库需要完成dbQuery和typeConvert的扩展,后期不再维护这种方式
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").dbQuery(new MySqlQuery()).schema("mybatis-plus").typeConvert(new MySqlTypeConvert()).keyWordsHandler(new MySqlKeyWordsHandler()).databaseQueryClass(SQLQuery.class).build();// 使用元数据查询的方式生成代码,默认已经根据jdbcType来适配java类型,支持使用typeConvertHandler来转换需要映射的类型映射
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").schema("mybatis-plus").keyWordsHandler(new MySqlKeyWordsHandler()).build();
全局配置(GlobalConfig)
| 方法 | 说明 | 示例 |
|---|---|---|
| disableOpenDir | 禁止打开输出目录 | 默认值:true |
| outputDir(String) | 指定输出目录 | /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp |
| author(String) | 作者名 | baomidou 默认值:作者 |
| enableKotlin | 开启 kotlin 模式 | 默认值:false |
| enableSwagger | 开启 swagger 模式 | 默认值:false |
| dateType(DateType) | 时间策略 | DateType.ONLY_DATE 默认值: DateType.TIME_PACK |
| commentDate(String) | 注释日期 | 默认值: yyyy-MM-dd |
new GlobalConfig.Builder().fileOverride().outputDir("/opt/baomidou").author("baomidou").enableKotlin().enableSwagger().dateType(DateType.TIME_PACK).commentDate("yyyy-MM-dd").build();
包配置(PackageConfig)
| 方法 | 说明 | 示例 |
|---|---|---|
| parent(String) | 父包名 | 默认值:com.baomidou |
| moduleName(String) | 父包模块名 | 默认值:无 |
| entity(String) | Entity 包名 | 默认值:entity |
| service(String) | Service 包名 | 默认值:service |
| serviceImpl(String) | Service Impl 包名 | 默认值:service.impl |
| mapper(String) | Mapper 包名 | 默认值:mapper |
| xml(String) | Mapper XML 包名 | 默认值:mapper.xml |
| controller(String) | Controller 包名 | 默认值:controller |
| other(String) | 自定义文件包名 | 输出自定义文件时所用到的包名 |
| pathInfo(Map<OutputFile, String>) | 路径配置信息 | Collections.singletonMap(OutputFile.mapperXml, "D://") |
new PackageConfig.Builder().parent("com.baomidou.mybatisplus.samples.generator").moduleName("sys").entity("po").service("service").serviceImpl("service.impl").mapper("mapper").xml("mapper.xml").controller("controller").other("other").pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")).build();
模板配置(TemplateConfig)
| 方法 | 说明 | 示例 |
|---|---|---|
| disable | 禁用所有模板 | |
| disable(TemplateType...) | 禁用模板 | TemplateType.ENTITY |
| entity(String) | 设置实体模板路径(JAVA) | /templates/entity.java |
| entityKt(String) | 设置实体模板路径(kotlin) | /templates/entity.java |
| service(String) | 设置 service 模板路径 | /templates/service.java |
| serviceImpl(String) | 设置 serviceImpl 模板路径 | /templates/serviceImpl.java |
| mapper(String) | 设置 mapper 模板路径 | /templates/mapper.java |
| mapperXml(String) | 设置 mapperXml 模板路径 | /templates/mapper.xml |
| controller(String) | 设置 controller 模板路径 | /templates/controller.java |
new TemplateConfig.Builder().disable(TemplateType.ENTITY).entity("/templates/entity.java").service("/templates/service.java").serviceImpl("/templates/serviceImpl.java").mapper("/templates/mapper.java").mapperXml("/templates/mapper.xml").controller("/templates/controller.java").build();
注入配置(InjectionConfig)
| 方法 | 说明 | 示例 |
|---|---|---|
| beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>) | 输出文件之前消费者 | |
| customMap(Map<String, Object>) | 自定义配置 Map 对象 | Collections.singletonMap("test", "baomidou") |
| customFile(Map<String, String>) | 自定义配置模板文件 | Collections.singletonMap("test.txt", "/templates/test.vm") 方法 formatNameFunction 可以格式化文件,参考测试用例 H2CodeGeneratorTest.testCustomFileByList |
new InjectionConfig.Builder().beforeOutputFile((tableInfo, objectMap) -> {System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());}).customMap(Collections.singletonMap("test", "baomidou")).customFile(Collections.singletonMap("test.txt", "/templates/test.vm")).build();
策略配置(StrategyConfig)
| 方法 | 说明 | 示例 |
|---|---|---|
| enableCapitalMode | 开启大写命名 | 默认值:false |
| enableSkipView | 开启跳过视图 | 默认值:false |
| disableSqlFilter | 禁用 sql 过滤 | 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关 |
| enableSchema | 启用 schema | 默认值:false,多 schema 场景的时候打开 |
| likeTable(LikeTable) | 模糊表匹配(sql 过滤) | likeTable 与 notLikeTable 只能配置一项 |
| notLikeTable(LikeTable) | 模糊表排除(sql 过滤) | likeTable 与 notLikeTable 只能配置一项 |
| addInclude(String...) | 增加表匹配(内存过滤) | include 与 exclude 只能配置一项 ,支持正则匹配、例如 ^t_.* 所有 t_ 开头的表名 |
| addExclude(String...) | 增加表排除匹配(内存过滤) | include 与 exclude 只能配置一项 ,支持正则匹配、例如 .*st$ 所有 st 结尾的表名 |
| addTablePrefix(String...) | 增加过滤表前缀 | |
| addTableSuffix(String...) | 增加过滤表后缀 | |
| addFieldPrefix(String...) | 增加过滤字段前缀 | |
| addFieldSuffix(String...) | 增加过滤字段后缀 | |
| outputFile | 内置模板输出文件处理 | 参考测试用例 H2CodeGeneratorTest.testOutputFile |
| entityBuilder | 实体策略配置 | |
| controllerBuilder | controller 策略配置 | |
| mapperBuilder | mapper 策略配置 | |
| serviceBuilder | service 策略配置 |
new StrategyConfig.Builder().enableCapitalMode().enableSkipView().disableSqlFilter().likeTable(new LikeTable("USER")).addInclude("t_simple").addTablePrefix("t_", "c_").addFieldSuffix("_flag").build();
Entity 策略配置
| 方法 | 说明 | 示例 |
|---|---|---|
| nameConvert(INameConvert) | 名称转换实现 | |
| superClass(Class<?>) | 设置父类 | BaseEntity.class |
| superClass(String) | 设置父类 | com.baomidou.global.BaseEntity |
| disableSerialVersionUID | 禁用生成 serialVersionUID | 默认值:true |
| enableFileOverride | 覆盖已生成文件 | 默认值:false |
| enableColumnConstant | 开启生成字段常量 | 默认值:false |
| enableChainModel | 开启链式模型 | 默认值:false |
| enableLombok | 开启 lombok 模型 | 默认值:false |
| enableRemoveIsPrefix | 开启 Boolean 类型字段移除 is 前缀 | 默认值:false |
| enableTableFieldAnnotation | 开启生成实体时生成字段注解 | 默认值:false |
| enableActiveRecord | 开启 ActiveRecord 模型 | 默认值:false |
| versionColumnName(String) | 乐观锁字段名(数据库字段) | versionColumnName与versionPropertyName二选一即可 |
| versionPropertyName(String) | 乐观锁属性名(实体) | versionColumnName与versionPropertyName二选一即可 |
| logicDeleteColumnName(String) | 逻辑删除字段名(数据库字段) | logicDeleteColumnName与logicDeletePropertyName二选一即可 |
| logicDeletePropertyName(String) | 逻辑删除属性名(实体) | logicDeleteColumnName与logicDeletePropertyName二选一即可 |
| naming | 数据库表映射到实体的命名策略 | 默认下划线转驼峰命名:NamingStrategy.underline_to_camel |
| columnNaming | 数据库表字段映射到实体的命名策略 | 默认为 null,未指定按照 naming 执行 |
| addSuperEntityColumns(String...) | 添加父类公共字段 | |
| addIgnoreColumns(String...) | 添加忽略字段 | |
| addTableFills(IFill...) | 添加表字段填充 | |
| addTableFills(List<IFill>) | 添加表字段填充 | |
| idType(IdType) | 全局主键类型 | |
| convertFileName(ConverterFileName) | 转换文件名称 | |
| formatFileName(String) | 格式化文件名称 |
new StrategyConfig.Builder().entityBuilder().superClass(BaseEntity.class).disableSerialVersionUID().enableChainModel().enableLombok().enableRemoveIsPrefix().enableTableFieldAnnotation().enableActiveRecord().versionColumnName("version")//.versionPropertyName("version") .logicDeleteColumnName("deleted")//.logicDeletePropertyName("deleteFlag").naming(NamingStrategy.no_change).columnNaming(NamingStrategy.underline_to_camel).addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time").addIgnoreColumns("age").addTableFills(new Column("create_time", FieldFill.INSERT)).addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)).idType(IdType.AUTO).formatFileName("%sEntity").build();
Controller 策略配置
| 方法 | 说明 | 示例 |
|---|---|---|
| superClass(Class<?>) | 设置父类 | BaseController.class |
| superClass(String) | 设置父类 | com.baomidou.global.BaseController |
| enableFileOverride | 覆盖已生成文件 | 默认值:false |
| enableHyphenStyle | 开启驼峰转连字符 | 默认值:false |
| enableRestStyle | 开启生成@RestController 控制器 | 默认值:false |
| convertFileName(ConverterFileName) | 转换文件名称 | |
| formatFileName(String) | 格式化文件名称 |
new StrategyConfig.Builder().controllerBuilder().superClass(BaseController.class).enableHyphenStyle().enableRestStyle().formatFileName("%sAction").build();
Service 策略配置
| 方法 | 说明 | 示例 |
|---|---|---|
| superServiceClass(Class<?>) | 设置 service 接口父类 | BaseService.class |
| superServiceClass(String) | 设置 service 接口父类 | com.baomidou.global.BaseService |
| superServiceImplClass(Class<?>) | 设置 service 实现类父类 | BaseServiceImpl.class |
| superServiceImplClass(String) | 设置 service 实现类父类 | com.baomidou.global.BaseServiceImpl |
| enableFileOverride | 覆盖已生成文件 | 默认值:false |
| convertServiceFileName(ConverterFileName) | 转换 service 接口文件名称 | |
| convertServiceImplFileName(ConverterFileName) | 转换 service 实现类文件名称 | |
| formatServiceFileName(String) | 格式化 service 接口文件名称 | |
| formatServiceImplFileName(String) | 格式化 service 实现类文件名称 |
new StrategyConfig.Builder().serviceBuilder().superServiceClass(BaseService.class).superServiceImplClass(BaseServiceImpl.class).formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp").build();
Mapper 策略配置
| 方法 | 说明 | 示例 |
|---|---|---|
| superClass(Class<?>) | 设置父类 | BaseMapper.class |
| superClass(String) | 设置父类 | com.baomidou.global.BaseMapper |
| enableFileOverride | 覆盖已生成文件 | 默认值:false |
| enableMapperAnnotation | 开启 @Mapper 注解 | 默认值:false |
| enableBaseResultMap | 启用 BaseResultMap 生成 | 默认值:false |
| enableBaseColumnList | 启用 BaseColumnList | 默认值:false |
| cache(Class<? extends Cache>) | 设置缓存实现类 | MyMapperCache.class |
| convertMapperFileName(ConverterFileName) | 转换 mapper 类文件名称 | |
| convertXmlFileName(ConverterFileName) | 转换 xml 文件名称 | |
| formatMapperFileName(String) | 格式化 mapper 文件名称 | |
| formatXmlFileName(String) | 格式化 xml 实现类文件名称 |
new StrategyConfig.Builder().mapperBuilder().superClass(BaseMapper.class).enableMapperAnnotation().enableBaseResultMap().enableBaseColumnList().cache(MyMapperCache.class).formatMapperFileName("%sDao").formatXmlFileName("%sXml").build();
自定义模版支持(DTO\VO等)配置
Freemarker模版支持(DTO\VO等)配置
/*** 代码生成器支持自定义[DTO\VO等]模版*/
public final class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {@Overrideprotected void outputCustomFile(@NotNull Map<String, String> customFile, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {String entityName = tableInfo.getEntityName();String otherPath = this.getPathInfo(OutputFile.other);customFile.forEach((key, value) -> {String fileName = String.format(otherPath + File.separator + entityName + "%s", key);this.outputFile(new File(fileName), objectMap, value);});}
}
使用方式样例(其他细节参数请查看文档)
entityDTO.java.ftl 可参考源码内entity.java.ftl文件
FastAutoGenerator.create(url, username, password).globalConfig(builder -> {builder.author("abc") // 设置作者.enableSwagger() // 开启 swagger 模式.fileOverride() // 覆盖已生成文件.disableOpenDir() //禁止打开输出目录.outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录}).packageConfig(builder -> {builder.parent("com.baomidou.mybatisplus.samples") // 设置父包名.moduleName("test") // 设置父包模块名.entity("model.entity") //设置entity包名.other("model.dto") // 设置dto包名.pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径}).injectionConfig(consumer -> {Map<String, String> customFile = new HashMap<>();// DTOcustomFile.put("DTO.java", "/templates/entityDTO.java.ftl");consumer.customFile(customFile);});
相关文章:
MyBatis-plus 代码生成器配置
数据库配置(DataSourceConfig) 基础配置 属性说明示例urljdbc 路径jdbc:mysql://127.0.0.1:3306/mybatis-plususername数据库账号rootpassword数据库密码123456 new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","…...
框架设计的核心要素
我们的框架应该给用户提供哪些构建产物?产物的模块格式如何?当用户没有以预期的方式使用框架时,是否应该打印合适的警告信息从而提供更好的开发体验,让用户快速定位问题?开发版本的构建和生产版本的构建有何区别&#…...
LeetCode - 26. 删除有序数组中的重复项 (C语言,快慢指针,配图)
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一:快慢指针 在数组中,快慢指针就是两个整数下标,定义 fast 和 slow 这里我们从下标1开始(下标0的数据就1个,没有重复项)&…...
C#不安全代码
在C#中,“不安全代码”(unsafe code)通常指的是那些直接操作内存地址的代码。它允许开发者使用指针等低级别的数据结构,这些在通常的安全代码(safe code)中是不允许的。C# 的不安全代码提供了一种方式&…...
《C++避坑神器·二十二》VS能正常运行程序,但运行exe程序无响应解决办法
原因是某个文件只是放在了项目路径下,没有放在exe路径下,比如Json文件原来只放在了mlx项目下,导致VS可以运行,但运行exe无响应或报错如下: 两种方式修改: 1、把Json文件拷贝一份放到exe路径下 2、利用生成…...
lua调用C/C++的函数,十分钟快速掌握
系列文章目录 lua调用C\C动态库函数 系列文章目录摘要环境使用步骤你需要有个lua环境引入库码代码lua代码 摘要 在现代软件开发中,Lua作为一种轻量级脚本语言,在游戏开发、嵌入式系统等领域广泛应用。Lua与C/C的高度集成使得开发者能够借助其灵活性和高…...
自定义GPT已经出现,并将影响人工智能的一切,做好被挑战的准备了吗?
原创 | 文 BFT机器人 OpenAI凭借最新突破:定制GPT站在创新的最前沿。预示着个性化数字协助的新时代到来,ChatGPT以前所未有的精度来满足个人需求和专业需求。 从本质上讲,自定义GPT是之前的ChatGPT的高度专业化版本或代理,但自定…...
vue中一个页面引入多个相同组件重复请求的问题?
⚠️!!!此内容需要了解一下内容!!! 1、会使用promise??? 2、 promise跟 async 的区别??? async 会终止后面的执行,后续…...
Uniapp连接iBeacon设备——实现无线定位与互动体验(实现篇)
export default { data() { return { iBeaconDevices: [], // 存储搜索到的iBeacon设备 deviceId: [], data: [], url: getApp().globalData.url, innerAudioContext: n…...
【ceph】ceph集群删除pool报错: “EPERM: pool deletion is disabled“
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
【微信小程序】使用npm包
1、小程序对npm的支持与限制2、Vant Weapp通过 npm 安装修改 app.json修改 project.config.json构建 npm 包 3、使用4、定制全局主题样式5、API Promise化 1、小程序对npm的支持与限制 目前,小程序中已经支持使用npm安装第三方包, 从而来提高小程序的开发…...
【开发记录篇】第二篇:SQL创建分区表
实现分区表注意事项 分区字段必须在主键中存在 使用时间分区时,字段类型不支持 timestamp,需改为 datetime 年分区示例 下表中使用 insert_time 时间进行分区 CREATE TABLE t_log (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 日志ID,inse…...
vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
背景:vue项目 使用this.$router.push进行路由跳转时,可以通过query或params参数传递和接收参数。 通过query参数传递参数: // 传递参数 this.$router.push({path: /target,query: {id: 1,name: John} }); // 接收参数 this.$route.query.id …...
rk3588 usb网络共享连接
出门在外总会遇到傻 X 地方 没有能连接公网的 网口给香橙派连网 而我的香橙派5plus 没有wifi模块。。。话不多说 在手机上看一眼手机的mac地址, 在rk3588 上执行以下命令: sudo ifconfig usb0 down sudo ifconfig usb0 hw ether 58:F2:FC:5D:D4:7A //该m…...
shell 拒绝恶意连接脚本 centos7.x拒绝恶意连接脚本
1. crontab -l 脚本频率: */2 * * * * /bin/bash /home/shell/deny.sh 2. 脚本: rm -rf /home/shell/ip_list cat /var/log/secure | grep "Failed password for" | awk {print$(NF-3)} | sort | uniq -c > /home/shell/ip_list #cat /va…...
【系统架构设计】计算机公共基础知识: 2 计算机系统基础知识
目录 一 计算机系统组成 二 操作系统 三 文件系统 四 系统性能 一 计算机系统组成...
什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?
什么是代理模式? 代理(Proxy)是一种结构型设计模式,其目的是通过引入一个代理对象来控制对另一个对象的访问。代理对象充当目标对象的接口,这样客户端就可以通过代理对象间接地访问目标对象,从而在访问过程…...
国内领先的五大API接口供应商
API(Application Programming Interface)接口,现在很多应用系统中常用的开放接口,对接相应的系统、软件功能,简化专业化的程序开发。作者用过的国内比较稳定的API接口供应商有如下几家,大家可以参考选择&am…...
第十九章 Java绘图
一,Java绘图类 19.1.1Graphics类 Graphics类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。 可实现直线,矩形,多边形,椭圆,圆弧等形状和文本,图片的绘制制作。 …...
【C++面向对象】13. 接口 / 抽象类*
文章目录 【 1. 抽象类 】1.1 抽象类的定义1.2 抽象类的应用条件1.3 实例 【 2. 设计策略 】 接口描述了类的行为和功能,而不需要完成类的特定实现。C 接口是使用 抽象类(abstract base class,也称为ABC) 来实现的。 【 1. 抽象类…...
在线PPT工具哪个最方便快捷?6款主流工具实测,新手也能快速出片
作为AI博主,日常要产出AI工具实测、智能创作干货、高效办公教程,对在线PPT工具的核心需求远超基础编辑——全端适配、AI生成专业、安全合规、资源充足,无需复杂操作,既能依托AI快速生成高质量内容,又能兼顾多场景使用与…...
数据仓库核心建模:星型模型与雪花模型全面对比与实战选择
数据仓库核心建模:星型模型与雪花模型全面对比与实战选择一、引言二、定义:什么是星型模型?什么是雪花模型?2.1 星型模型:定义2.2 雪花模型:定义三、结构流程图:直观对比两种模型3.1 星型模型流…...
代码重构的艺术:在业务狂奔中如何优雅地还技术债
业务压力下的质量困局在快节奏的软件开发世界中,业务需求如同永不停歇的浪潮,推动着团队高速前行。为了抢占市场先机、快速响应变化,“先上线,再优化”几乎成了许多项目的默认模式。然而,这种模式背后,是以…...
新手入门服务器:用快马生成你的第一个xshell等效连接程序
作为一个刚接触服务器运维的新手,第一次使用xshell这类工具时,面对各种专业术语和复杂操作确实容易一头雾水。最近我发现用InsCode(快马)平台生成学习项目特别适合入门,今天就分享一下如何通过可运行的代码实例来理解SSH连接的核心概念。 理解…...
告别手动调参:Neural MHE如何让无人机在风扰中‘稳如老狗’
Neural MHE:无人机抗风扰控制的智能调参革命 四旋翼无人机在物流配送、农业喷洒、电力巡检等场景的应用日益广泛,但突发的风场扰动始终是飞控系统面临的严峻挑战。传统移动视界估计(MHE)虽能有效处理状态估计问题,却困在手动调参的泥潭中——…...
卡尔曼滤波调参实战:如何用MATLAB让MPU6050的加速度数据更‘听话’?
卡尔曼滤波调参实战:如何用MATLAB让MPU6050的加速度数据更‘听话’? 当你在MATLAB中第一次看到MPU6050的原始加速度数据时,那些疯狂跳动的曲线可能会让你怀疑人生。别担心,这不是传感器坏了,而是现实世界本就充满噪声…...
小红书自动评论的‘伪需求’与真风险:聊聊RPA工具养号背后的封号逻辑与合规玩法
小红书自动化评论的合规边界:效率与账号安全的博弈术 凌晨三点,某MCN机构运营负责人李然被连续不断的手机提示音惊醒——团队管理的12个小红书达人账号同时收到平台封禁通知,而这一切都源于他们三天前部署的那套"高效互动系统"。这…...
别再只盯着数据了!用Arduino+GP2Y1014AU传感器,手把手教你做个能“看见”空气的PM2.5监测仪
用Arduino打造智能PM2.5监测仪:从硬件连接到可视化交互 在空气质量日益受到关注的今天,拥有一个实时监测PM2.5浓度的设备不仅能提升生活品质,还能为健康保驾护航。不同于市面上千篇一律的商用监测仪,自己动手打造一个兼具实用性和…...
Splunk Enterprise 9.4.10 (macOS, Linux, Windows) - 机器数据管理和分析
Splunk Enterprise 9.4.10 (macOS, Linux, Windows) - 机器数据管理和分析 安全信息和事件管理 (SIEM)、全面的日志管理和分析平台 请访问原文链接:https://sysin.org/blog/splunk-9/ 查看最新版。原创作品,转载请保留出处。 作者主页:sys…...
霜儿-汉服-造相Z-Turbo作品集:看看AI能生成多美的汉服少女图
霜儿-汉服-造相Z-Turbo作品集:看看AI能生成多美的汉服少女图 1. 惊艳开篇:AI汉服艺术的魅力 当传统汉服遇上现代AI技术,会碰撞出怎样的火花?霜儿-汉服-造相Z-Turbo给出了令人惊叹的答案。这个基于Xinference部署的文生图模型服务…...
