开源社区组织AiZuDa:PanShi、MongoPlus、QingAdmin、Easy-Security

发布时间:2026/9/26 5:06:54
开源社区组织AiZuDa:PanShi、MongoPlus、QingAdmin、Easy-Security 概述官网中文名爱组搭基于Spring Boot的开源低代码平台灵活、智能、强大的应用可视化设计与发布平台能够实现分钟级搭建表单、MIS、CRM、OA等智能化、免运维的各类企业SaaS系统与项目应用助力企业降本增效快速构建数据与应用中台实现业务智能化升级。提供安全、限流、监控、OSS 存储、机器人通知等多种可插拔组件用于快速构建企业级应用。理念是“每个人都是架构师”通过组件化方式提升开发效率。开源组织https://gitee.com/aizudaFlowLong另起一篇参考企业级无代码工作流引擎FlowLong简介、实战。Snail-Job另起一篇参考Snail-Job简介、原理、实战。PanShiJavaVueTypeScript实现、开源Gitee2.6K Star1.2K Fork稳定可靠的Web开发框架官方文档。后端技术栈前端技术栈JDK 17TypeScriptSpringBoot 3.XVue3.XMybatisPlus 3.XViteSpringDocElementPlusPostgreSQL、MySQL、Oracle…QingAdmin实战系统首页MongoPlus官网开源Gitee1.4K Star247 ForkGitHub75 Star11 Fork使用MyBatisPlus的方式优雅的操作MongoDB官方文档。特性无侵入只做增强不做改变引入它不会对现有工程产生影响如丝般顺滑损耗小启动即会自动注入基本CURD性能基本无损耗直接面向对象操作强大CRUD操作通用Service仅仅通过少量配置即可实现单表大部分CRUD操作更有强大的条件构造器满足各类使用需求支持Lambda形式调用通过Lambda表达式方便的编写各类查询条件无需再担心字段写错支持主键自动生成支持多达5种主键策略内含分布式唯一ID生成器-Sequence可自由配置完美解决主键问题支持自定义全局通用操作支持全局通用方法注入支持无实体类情况下的操作支持动态数据源支持逻辑删除、防止全集合更新和删除、自动填充、自动分页等等功能原理不出意外采用Maven多模块设计思路注解CollectionName集合名注解标识实体类对应的集合ID主键注解会指向MongoDB中_id字段IdTypeEnum主键类型可用枚举值描述OBJECT_ID生成mongoDB自带的_idASSIGN_UUID生成UUIDASSIGN_ULID生成ULID效率比UUID高ASSIGN_ID分配ID(主键类型为Number(Long和Integer)或String)(since3.3.0),使用接口IdentifierGenerator的方法nextId默认实现类为DefaultIdentifierGenerator雪花算法CollectionField字段注解属性类型必须指定默认值描述valueString否“”数据库字段名existboolean否true是否为数据库表字 段convertCollectboolean否false如果值时对象接收字段是集合可以使用此配置会将对象自动转为集合只存在这一个值fillFieldFill否FieldFill.DEFAULT自动填充策略typeHandlerClass?否Void.class类型处理器必须实现com.mongoplus.handlers.TypeHandler接口ignoreNullboolean否true忽略null属性isObjectIdboolean否false是否是ObjectIdMongoTransactional声明式事务标注到方法上表示该方法需要受到事务控制CollectionLogic逻辑删除开启全局逻辑删除情况下用于自定义该文档逻辑删除字段及忽略逻辑删除属性类型必须指定默认值描述valueString否“”默认逻辑未删除值该值可无、会自动获取全局配置delvalString否“”默认逻辑未删除值该值可无、会自动获取全局配置delTypeLogicDataType否DEFAULT逻辑删除字段值类型IgnoreTenant忽略多租户注解可标注在方法上优先级高MongoDs多数据源注解属性类型必须指定默认值描述valueString是“”数据源名称dsHandlerClass?否Void.class数据源处理类需实现com.mongoplus.handlers.DataSourceHandler接口提供通用Service CRUD封装泛型接口IService进一步封装CRUD泛型T为任意实体对象。基础拦截器接口com.mongoplus.interceptor.Interceptor所有拦截器都应实现此接口选择性的实现接口中的方法executeSave(documentList)添加拦截器方法executeRemove(filter)删除拦截器方法executeUpdate(queryBasic,updateBasic)更新拦截器方法executeQuery(queryBasic, projectionList, sortCond)查询拦截器方法executeAggregate(aggregateConditionList)管道拦截器方法executeCount(queryBasic,countOptions)统计拦截器方法executeBulkWrite(writeModelList)批量操作拦截器方法executeSave(documentList, collection)添加拦截器方法executeRemove(filter, collection)删除拦截器方法executeUpdate(queryBasic,updateBasic, collection)更新拦截器方法executeQuery(queryBasic, projectionList, sortCond, collection)查询拦截器方法executeAggregate(aggregateConditionList, collection)管道拦截器方法executeCount(queryBasic,countOptions, collection)统计拦截器方法executeBulkWrite(writeModelList, collection)批量操作拦截器方法高级拦截器com.mongoplus.interceptor.AdvancedInterceptor提供权限更高的操作且可直接返回数据类似MyBatis拦截器会根据所有注册的高级拦截器和普通拦截器形成拦截器责任链高级拦截器更靠近底层。TenantHandlerMongo-Plus提供的多租户处理器插件用于实现多租户的数据隔离可确保每个租户只能访问自己的数据实现数据的安全隔离。方法如下BsonValue getTenantId()获取租户idString getTenantIdColumn()获取租户字段默认tenant_idboolean ignoreCollection(collectionName)根据集合名判断是否忽略租户boolean ignoreDatabase(database)根据数据库名判断是否忽略租户boolean ignoreDataSource(dataSource)根据数据源名判断是否忽略租户boolean ignoreInsert(columns, tenantIdColumn)忽略插入租户字段逻辑CollectionNameHandler动态集合处理器可用于根据不同的条件查询不同的集合的场景。允许在运行时动态地改变MongoDB语句中的集合名这对于处理分表逻辑非常有用。提供方法String dynamicCollectionName(ExecuteMethodEnum,Object[],MongoNamespace)参数分别对应执行的方法枚举、参数、命名空间。实现CollectionNameHandler接口创建动态集合处理器并注册为Bean。如果查询参数中包含userName参数且userName参数值为张三则将集合名称修改为user_zhangsanComponentpublicclassCustomCollectionNameHandlerimplementsCollectionNameHandler{OverridepublicStringdynamicCollectionName(ExecuteMethodEnumexecuteMethodEnum,Object[]source,MongoNamespacenamespace){if(executeMethodEnumExecuteMethodEnum.QUERY){// 具体类型参数转换参考com.mongoplus.execute.Execute接口// 比如查询(executeQuery(Bson, BasicDBObject, BasicDBObject, ClassT, MongoCollectionDocument))// 对应的第0个参数类型为BsonBsonbson(Bson)source[0];BsonStringuserNamebson.toBsonDocument().getString(userName,newBsonString());if(userName.getValue().equals(张三)){returnuser_zhangsan;}}//条件不满足则返回原名称returnnamespace.getCollectionName();}}数据变动记录拦截器DataChangeRecorderInnerInterceptor不仅能够自动记录操作日志、添加到数据库还支持安全阈值控制如限制批量更新或插入的数量。方法列表setExceptionMessage(String)超出阈值提示信息setIgnoredColumnList(List)忽略的表setBatchUpdateLimit(Integer)批量更新条数上限setdisplayCompleteData(Boolean)是否显示完整数据开启后changedData字段数据量可能会很大enableSaveDatabase(BaseMapper)开启将记录信息保存到数据库setDatasourceName(String)数据源默认获取上下文中的数据源isMasterDatasource(Boolean)是否使用默认数据源保存数据如果设置datasourceName该配置会失效但切换数据源并不会失效推荐设置使用主数据源避免连续切库setDatabaseName(String)数据库默认获取上下文中对应的数据源的库setCollectionName(String)集合名默认为DATA_CHANGE_RECORD乐观锁是一种并发控制机制用于确保在更新记录时该记录未被其他事务修改。OptimisticLockerInterceptor插件使得在应用中实现乐观锁变得简单。实现步骤读取记录时获取当前的版本号version在更新记录时将这个版本号一同传递执行更新操作时设置version newVersion的条件为version oldVersion如果版本号不匹配则更新失败配置插件BeanpublicOptimisticLockerInterceptoroptimisticLockerInterceptor(){OptimisticLockerInterceptorinterceptornewOptimisticLockerInterceptor();// 修改失败后是否抛出异常抛出异常interceptor.setUpdateFailException(newRuntimeException(修改失败));// 未获取到乐观锁字段是否抛出异常interceptor.setVersionIsNullException(newMongoPlusException(未获取到乐观锁字段));// 设置乐观锁自增值interceptor.setAutoInc(1);// 是否开启重试interceptor.enableRetry(getRetryStrategy());returninterceptor;}/** * 获取重试策略 */RetrygetRetryStrategy(){returnRetry.builder()// 最大重试次数.maxRetryNum(10)// 首次命中回调.hitRetry(updateRetryResult-log.info(首次命中: updateRetryResult))// 修改成功回调.onSuccess(object-log.info(修改成功: object))// 修改失败回调.onFailure(object-log.info(修改失败: object))// 达到最大重试次数失败后的备用逻辑.fallback(((updateRetryResult,invocation)-{try{returninvocation.proceed();}catch(Throwablee){thrownewRuntimeException(e);}}))// 每次重试增加version值.autoVersionNum(1)// 重试是否继续执行后续拦截器默认为true// 如果后续的执行器中进行了某些操作请将该属性设置为false。比如在后续拦截器中做了修改其他表的操作在重试时则会修改多次.processIntercept(true)// 重试间隔时间.retryInterval(100L)// 开启异步重试会立即返回当前更新失败的响应并且异步的重试不受事务控制。可以通过回调配置查看最终结果.asyncRetry(true).build();}在实体类中需要在表示版本号的字段上添加Version注解importcom.mongoplus.annotation.collection.Version;publicclassUser{VersionprivateIntegerversion;}实战Maven项目引入依赖dependencyManagementdependencies!-- mongoplus-bom --dependencygroupIdcom.mongoplus/groupIdartifactIdmongo-plus-bom/artifactIdversion2.1.9/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement!-- springboot --dependencygroupIdcom.mongoplus/groupIdartifactIdmongo-plus-boot-starter/artifactId/dependency!-- solon生态 --dependencygroupIdcom.mongoplus/groupIdartifactIdmongo-plus-solon-plugin/artifactId/dependency!-- springboot4.X --dependencygroupIdcom.mongoplus/groupIdartifactIdmongo-plus-boot4-starter/artifactId!-- 需指定版本号 --version2.1.9/version/dependency在application.yml配置文件中添加MongoPlus相关配置mongo-plus:data:mongodb:host:127.0.0.1port:27017database:testusername:test# 用户名没有可不填若账号中出现,!等符号无需转码password:root#密码同上authenticationDatabase:admin# 验证数据库connectTimeoutMS:50000# 在超时之前等待连接打开的最长时间以毫秒为单位QingAdmin基于VUE 3.0、开源Gitee175 Star37 Fork简单易用轻后台管理框架技术栈Vue 3、TypeScript、Vite、Element Plus实战基于源码部署体验gitclone https://gitee.com/aizuda/qing-admin.gitcdqing-adminnpminstallEasy-Security官网开源Gitee108 Star16 Fork、纯Java实现、基于过过滤器实现的简单认证鉴权框架核心只关注如何获取用户和校验以及如何获取权限和校验提供自定义插件轻松扩展业务实现。官方文档。版本依赖关系javaspringeasy-security备注java82.7.x2.1.1已支持java173.x3.1.2已支持实战Maven项目引入如下依赖dependencygroupIdcom.aizuda/groupIdartifactIdeasy-security-boot-starter/artifactId/dependency