1.企业aop代词是企业什么意思?
2.企业内部流程管理软件有哪些?
3.BPM系统是什么?
4.Spring事务(Transaction)管理高级篇一栈式解决开发中遇到的事务问题
5.76 张图,剖析 Spring AOP 源码,日常小白居然也能看懂,事务大神,管理请收下我的系源膝盖!
6.openGauss数据库源码解析系列文章——事务机制源码解析(一)
企业aop代词是码日闲鱼钓鱼源码什么意思?
企业AOP代词是一种面向切面编程模式,是常事一种重要的软件设计思想,应用于企业软件架构中。理软AOP代词提供了一个灵活的企业方式来修改某个类的代码,而不需要修改该类的日常源代码。这种编程方式可以更好地管理和维护公司的事务业务逻辑,通过将不同的管理功能分离出来,更容易进行模块化的系源开发和测试。
企业AOP代词的码日应用范围非常广泛,如日志记录、常事事务管理、权限控制等。AOP代词通过将这些功能分离出来,在不干扰主程序的情况下,更加方便的使用这些特性,提升了系统的可维护性和可扩展性。同时,AOP代词也能够更加灵活地控制业务流程和功能,让企业软件的设计更加合理。
总之,企业AOP代词是一种非常重要的企业软件设计思想,可以通过将代码拆分成不同的模块,提高代码的可重用性和可维护性。使用AOP代词,可以更加灵活地控制代码的执行流程和实现功能,从而为企业的软件架构提供更加完善的解决方案。
企业内部流程管理软件有哪些?
推荐致远互联专业管理软件,致远互联BPM工作流管理平台:为组织构建智能、敏捷、高效业务流程管理。协同运营平台-免费体验
1.流程管理:智能化工作流平台,为组织构建全方位流程管理,实现企业经营管理中的标准化、规范化的工作流程体系管理。支持NLP文本识别智能填单、全员流程审批下的抢派单等。
2.BPM门户:原有各系统的流程和功能被统一到BPM门户里,消灭信息孤岛,通过Portal用户不需登录多个系统就能处理日常事务,通过业务的全流程驱动实现事找人,全面提高员工工作效率和领导管理效能。
3.移动BPM:时间轴形式展示流程处理结果,方便企业用户清晰、快速地查看;移动端设计流程时可查看到全貌,帮助参与人进行宏观把控。
4.协同互联:基于组织中人、部门、岗位、角色进行流程流转及分支条件匹配,构建基于组织结构的流程体系。同时,支持新闻/公告/会议纪要/文档权限等经过流程审批后生效。
5.业务互联:BPM与致远业务定制平台无缝融合,适应各种业务应用、管理办事机制和场景。
6.流程集成:通过接口,实现与ERP等第三方系统的待办集成、消息集成、财务凭证、业务集成,网站多个主页 源码支持双向流程集成。
7.流程知识中心:多角度呈现整个组织的流程管理方式,并由单个流程管理,走向组织流程整体管理,为管理者对流程管理做顶层设计提供参考信息。
有任何的问题和不明白的地方,都可以咨询致远互联。致远互联为企业去繁就简,让客户能在协同平台上用适合企业自身的方式运行软件。利用随需定制的协同平台及云服务,支持千行百业实现高效运营并持续进行业务创新,为客户提供放心、省心、舒心的数智工作体验。
BPM系统是什么?
1、什么是流程管理流程管理,即Process Management,是一种以规范化的构造端到端的业务流程为中心,持续地提高组织业务绩效为目的的系统化方法,也会被称为BPM(Business Process Management),即业务流程管理。
业务流程管理就是做一件事情或者完成一项业务的方法和步骤,它支持跨部门的业务活动以及管理员工的建模、设计、执行和维护流程,旨在帮助企业优化日常业务流程,从而提高员工的工作效率和企业生产力。业务流程管理不仅是一种方法,它更是一种管理思想的体现,在业务流程管理过程中,不仅定义和优化了步骤和环节,而且还定义了每一个环节的负责人、时效以及预期收益。
2、为什么要进行业务流程管理
举个例子:小明已经在在财务部已经工作了五年,他对财务部门如何运作已经 “了如指掌”。通常情况下,财务部只有得到了采购主管的批准才可以向供应商开发票,小明知道哪一步该找哪个负责人,整个开票的流程是什么样子的。但是这个流程小明清楚,不代表其他人清楚,如果把这个最佳流程规范出来,是不是可以提升其他同事的工作效率呢?
另外,财务部给一家供应商开具相关的发票是很快的,但是如果对一百家供应商开发票,财务部所花费的时间可能是预期的数倍。如果这个时候有一个自动化的表单和工作流,非常轻松的用业务流程将每一个人完美的连接起来,是不是又进一步提高了整个部门的业务效率呢?
除了这个财务的流程,其实研发也有研发的流程,生产有生产的流程,销售有销售的流程,人事有人事的流程。在企业的各种工作过程中,都会包含大量的业务流程管理工作。
为什么要进行业务流程管理,从上面的例子我们不难看出,进行业务流程管理可以:
1)固化企业现有业务流程
通过流程将工作事务处理程序固化后,企业所有人员办理类似的事情时就都可以按照这样的流程去做,有助于形成标准化的处理方式,这对企业刚入职的员工或者业务不熟练的员工在处理同样的事务时也会有所帮助。
2)规范企业事务管理
当某项事务需要多个人员或者多个部门(即跨部门)共同处理时,之前固化的vsftpd 安装源码包成熟业务流程就非常清楚地明确了这个事务完成的顺序以及相关的其他协作人员在这件事情中要做具体工作内容,业务流程使事务管理更加规范化。
3)提高员工的工作效率
通过业务流程管理减少了不必要的时间消耗,既提高了个人的工作效率也提高部门的运作效率。
4)优化现有流程,更加适应企业的发展
对业务流程进行管理之后,我们可以通过观察现有流程的运行情况去发现现有流程与业务不匹配的地方,发现流程中需要完善和改进的地方。这样可以帮助我们进一步优化流程,使流程更加适应企业的发展,给企业助力!
3、好的流程具备的特点
1)管理者及普通员工乐于执行
一个好的流程必须得到管理层的和推崇和普通员工的执行,否则如果流程无法正常运转,那么再好的流程无法对企业产生正向的效益。
2)与流程相关的各个要素必须全面
具体一项事务由企业哪个岗位的人来执行,需要经过哪些相关的部门,如果该岗位上的人不在的话,有谁可以接手?这些都是与流程相关的一些要素。这些要素必须全面,否则流程在执行过程中很容易出问题或者直接中断而且无法及时解决。
3)意外情况的处理
比如公司的仓库发货时货车出现了意外,这个时候是不是要通知仓库补发货,同时告知客户重新发货后可以收货的时间,另外如果量非常大,是不是需要安排生产部门加急安排后续的生产?很多的流程都是一定的顺序执行操作的,但是实际运行的流程在每一个环节上都会出现各种各样的意外情况,对意外情况处理的流程,也是需要慎重考虑的。
4)流程要考虑到基于不同业务分类的多样化
比如,销售流程有厂家直营和代理商经营的区别;项目管理会根据重要性分为一二三级等不同类别的项目,只有分类细化才能加速流程的处理速度而且不影响完成的质量。
其实好的流程需要具备的特点很多,上面说的只是其中一部分。但是总的来看,适合企业自身业务特点的流程才是好的流程。
4、业务流程管理工具推荐
业务流程管理除了要弄清楚流程的各个概念、要求和特点之外,还需要好的工具予以支持。推荐轻流这款工具,它具有无代码搭建业务流程管理系统、支持PC移动等多终端操作、可与现有软件系统集成以及强大的报告生成和分析功能等特点,具体的使用方法可以自己去了解一下。
Spring事务(Transaction)管理高级篇一栈式解决开发中遇到的事务问题
深入理解Spring事务管理
Spring,作为Java开发中广受欢迎的框架,其事务管理功能在日常开发中起到了举足轻重的作用。然而,许多开发者对事务的原理理解不够深入,导致在遇到事务相关问题时,解决过程往往冗长且复杂。本文将带你逐步探索Spring事务管理的高级特性,揭示其原理,并针对开发中常见的事务问题提供解决方案。
在纯Spring框架下使用事务管理,首先需要添加`@EnableTransactionManagement`注解,这实际上导入了`ProxyTransactionManagementConfiguration`配置类,该类负责注入事务管理所需的增强器、属性资源以及拦截器。
当方法上使用了事务注解(如`@Transactional`),Spring将创建一个代理对象,并将其注入到Spring容器中,而非原始对象。这个代理对象是Truehd 源码 光纤 带宽基于AOP(面向切面编程)技术生成的,主要用于在方法调用前后执行事务管理操作。
以UserService为例,假设其包含一个简单的业务方法。在Spring的事务管理下,该方法的调用流程会经过一系列的注入和配置,最终在执行业务逻辑后提交或回滚事务。
在深入源码分析中,会发现事务管理的核心在于调用特定的代理方法来开启、执行、提交或回滚事务。例如,在特定的代理方法中调用`tm.getTransaction(txAttr)`开启事务,并在执行完业务逻辑后返回,使得整个方法的执行过程被封装在事务管理的上下文中。
值得注意的是,事务的传播行为决定了在方法嵌套调用时,如何管理事务。例如,使用`Propagation.REQUIRED`或`Propagation.REQUIRES_NEW`传播属性,可以控制事务的生命周期。正确理解和运用这些传播属性,有助于避免在多层调用中导致的事务回滚问题。
在开发实践中,常见的事务问题包括未正确使用代理对象、忽略特定异常处理、不当的事务嵌套等。解决这些问题的关键在于理解Spring事务管理的原理、正确配置事务注解、以及合理设计业务逻辑,避免在多层调用中出现事务不一致或回滚的情况。
总结事务管理的实践经验,有助于快速定位和解决开发中遇到的事务相关问题。深入研究Spring事务管理的细节,结合实际案例分析,能够提升开发者对事务管理的驾驭能力,从而在项目开发中更加游刃有余。
张图,剖析 Spring AOP 源码,小白居然也能看懂,大神,请收下我的膝盖!
本文将简要介绍AOP(面向切面编程)的基础知识与使用方法,并深入剖析Spring AOP源码。首先,我们需要理解AOP的基本概念。
1. **基础知识
**1.1 **什么是AOP?
**AOP全称为Aspect Oriented Programming,即面向切面编程。AOP的思想中,周边功能(如性能统计、日志记录、事务管理等)被定义为切面,核心功能与切面功能独立开发,然后将两者“编织”在一起,这就是AOP的核心。
AOP能够将与业务无关、却为业务模块共同调用的逻辑封装,减少系统重复代码,降低模块间的耦合度,有利于系统的可扩展性和可维护性。
1.2 **AOP基础概念
**解释较为官方,以下用“方言”解释:AOP包括五种通知分类。
1.3 **AOP简单示例
**创建`Louzai`类,添加`LouzaiAspect`切面,并在`applicationContext.xml`中配置。声卡输出源码解码程序入口处添加`"睡觉"`方法并添加前置和后置通知。接下来,我们将探讨Spring内部如何实现这一过程。
1.4 **Spring AOP工作流程
**为了便于理解后面的源码,我们将整体介绍源码执行流程。整个Spring AOP源码分为三块,结合示例进行讲解。
第一块是前置处理,创建`Louzai`Bean前,遍历所有切面信息并存储在缓存中。第二块是后置处理,创建`Louzai`Bean时,主要处理两件事。第三块是执行切面,通过“责任链+递归”执行切面。
2. **源码解读
**注意:Spring版本为5.2..RELEASE,否则代码可能不同!这里,我们将从原理部分开始,逐步深入源码。
2.1 **代码入口
**从`getBean()`函数开始,进入创建Bean的逻辑。
2.2 **前置处理
**主要任务是遍历切面信息并存储。
这是重点!请务必注意!获取切面信息流程结束,后续操作都从缓存`advisorsCache`获取。
2.2.1 **判断是否为切面
**执行逻辑为:判断是否包含切面信息。
2.2.2 **获取切面列表
**进入`getAdvice()`,生成切面信息。
2.3 **后置处理
**主要从缓存拿切面,与`Louzai`方法匹配,创建AOP代理对象。
进入`doCreateBean()`,执行后续逻辑。
2.3.1 **获取切面
**首先,查看如何获取`Louzai`的切面列表。
进入`buildAspectJAdvisors()`,方法用于存储切面信息至缓存`advisorsCache`。随后回到`findEligibleAdvisors()`,从缓存获取所有切面信息。
2.3.2 **创建代理对象
**有了`Louzai`的切面列表,开始创建AOP代理对象。
这是重点!请仔细阅读!这里有两种创建AOP代理对象方式,我们选择使用Cglib。
2.4 **切面执行
**通过“责任链+递归”执行切面与方法。
这部分逻辑非常复杂!接下来是“执行切面”最核心的逻辑,简述设计思路。
2.4.1 **第一次递归
**数组第一个对象执行`invoke()`,参数为`CglibMethodInvocation`。
执行完毕后,继续执行`CglibMethodInvocation`的`process()`。
2.4.2 **第二次递归
**数组第二个对象执行`invoke()`。
2.4.3 **第三次递归
**数组第三个对象执行`invoke()`。
执行完毕,退出递归,查看`invokeJoinpoint()`执行逻辑,即执行主方法。回到第三次递归入口,继续执行后续切面。
切面执行逻辑已演示,直接查看执行方法。
流程结束时,依次退出递归。
2.4.4 **设计思路
**这部分代码研究了大半天,因为这里不是纯粹的责任链模式。
纯粹的责任链模式中,对象内部有一个自身的`next`对象,执行当前对象方法后,启动`next`对象执行,直至最后一个`next`对象执行完毕,或中途因条件中断执行,责任链退出。
这里`CglibMethodInvocation`对象内部无`next`对象,通过`interceptorsAndDynamicMethodMatchers`数组控制执行顺序,依次执行数组中的对象,直至最后一个对象执行完毕,责任链退出。
这属于责任链,实现方式不同,后续会详细剖析。下面讨论类之间的关系。
主对象为`CglibMethodInvocation`,继承于`ReflectiveMethodInvocation`,`process()`的核心逻辑在`ReflectiveMethodInvocation`中。
`ReflectiveMethodInvocation`的`process()`控制整个责任链的执行。
`ReflectiveMethodInvocation`的`process()`方法中,包含一个长度为3的数组`interceptorsAndDynamicMethodMatchers`,存储了3个对象,分别为`ExposeInvocationInterceptor`、`MethodBeforeAdviceInterceptor`、`AfterReturningAdviceInterceptor`。
注意!这3个对象都继承了`MethodInterceptor`接口。
每次`invoke()`调用时,都会执行`CglibMethodInvocation`的`process()`。
是否有些困惑?别着急,我将再次帮你梳理。
对象与方法的关系:
可能有同学疑惑,`invoke()`的参数为`MethodInvocation`,没错!但`CglibMethodInvocation`也继承了`MethodInvocation`,可自行查看。
执行逻辑:
设计巧妙之处在于,纯粹的责任链模式中,`next`对象需要保证类型一致。但这里3个对象内部没有`next`成员,不能直接使用责任链模式。怎么办呢?就单独设计了`CglibMethodInvocation.process()`,通过无限递归`process()`实现责任链逻辑。
这就是我们为什么要研究源码,学习优秀的设计思路!
3. **总结
**本文首先介绍了AOP的基本概念与原理,通过示例展示了AOP的应用。之后深入剖析了Spring AOP源码,分为三部分。
本文是Spring源码解析的第三篇,感觉是难度较大的一篇。图解代码花费了6个小时,整个过程都沉浸在代码的解析中。
难度不在于抠图,而是“切面执行”的设计思路,即使流程能走通,将设计思想总结并清晰表达给读者,需要极大的耐心与理解能力。
今天的源码解析到此结束,有关Spring源码的学习,大家还想了解哪些内容,欢迎留言给楼仔。
openGauss数据库源码解析系列文章——事务机制源码解析(一)
事务是数据库操作的核心单位,必须满足原子性、一致性、隔离性、持久性(ACID)四大属性,确保数据操作的可靠性与一致性。以下是openGauss数据库中事务机制的详细解析:
### 事务整体架构与代码概览
在openGauss中,事务的实现与存储引擎紧密关联,主要集中在源代码的`gausskernel/storage/access/transam`与`gausskernel/storage/lmgr`目录下。事务系统包含关键组件:
1. **事务管理器**:事务系统的中枢,基于有限循环状态机,接收外部命令并根据当前事务状态决定下一步执行。
2. **日志管理器**:记录事务执行状态及数据变化过程,包括事务提交日志(CLOG)、事务提交序列日志(CSNLOG)与事务日志(XLOG)。
3. **线程管理机制**:通过内存区域记录所有线程的事务信息,支持跨线程事务状态查询。
4. **MVCC机制**:采用多版本并发控制(MVCC)实现读写隔离,结合事务提交的CSN序列号,确保数据读取的正确性。
5. **锁管理器**:实现写并发控制,通过锁机制保证事务执行的隔离性。
### 事务并发控制
事务并发控制机制保障并发执行下的数据库ACID属性,主要由以下部分构成:
- **事务状态机**:分上层与底层两个层次,上层状态机通过分层设计,支持灵活处理客户端事务执行语句(BEGIN/START TRANSACTION/COMMIT/ROLLBACK/END),底层状态机记录事务具体状态,包括事务的开启、执行、结束等状态变化。
#### 事务状态机分解
- **事务块状态**:支持多条查询语句的事务块,包含默认、已开始、事务开始、运行中、结束状态。
- **底层事务状态**:状态包括TRANS_DEFAULT、TRANS_START、TRANS_INPROGRESS、TRANS_COMMIT、TRANS_ABORT、TRANS_DEFAULT,分别对应事务的初始、开启、运行、提交、回滚及结束状态。
#### 事务状态转换与实例
通过状态机实例展示事务执行流程,包括BEGIN、SELECT、END语句的执行过程,以及相应的状态转换。
- **BEGIN**:开始一个事务,状态从默认转为已开始,之后根据语句执行逻辑状态转换。
- **SELECT**:查询语句执行,状态保持为已开始或运行中,事务状态不发生变化。
- **END**:结束事务,状态从运行中或已开始转换为默认状态。
#### 事务ID分配与日志
事务ID(xid)以uint单调递增序列分配,用于标识每个事务,CLOG与CSNLOG分别记录事务的提交状态与序列号,采用SLRU机制管理日志,确保资源高效利用。
### 总结
事务机制在openGauss数据库中起着核心作用,通过详细的架构设计与状态管理,确保了数据操作的ACID属性,支持高并发环境下的高效、一致的数据处理。MVCC与事务ID的合理使用,进一步提升了数据库的性能与数据一致性。未来,将深入探讨事务并发控制的MVCC可见性判断机制与进程内的多线程管理机制,敬请期待。
基于天翎低代码平台开发的OA系统
本文介绍基于天翎低代码平台的OA系统,其涵盖功能包括公文管理、考勤管理、报销管理、物资管理、人事管理等,旨在提高工作效率、辅助决策,从而优化工作环境。通过天翎平台,企业不仅能够实现本地化部署,而且能结合群晖NAS保障数据安全。通过开发OA系统,企业能够实现以下价值:
促进信息资源共享,提升工作执行效能,规范工作流程,提高沟通效率,积累有效知识。
选择天翎低代码平台开发OA系统的原因在于,相较于传统标准版OA系统,其功能虽然标准化、易于快速应用,但对个性化需求的适应性较差,且成本相对较高。传统代码开发方式则周期长、成本高、技术门槛高、开发效率低。相比之下,天翎低代码平台具备按企业实际需求进行个性化定制调整的灵活性,支持快速开发,节省时间成本,且提供私有化部署选项,无需额外部署,免维护,开箱即用。MyApps平台采用低代码开发模式,支持积木式可视化快速配置,即使非专业人士也能高效完成开发。
天翎MyApps低代码开发平台具有显著优势,包括开发过程的可视化、无需编码即可完成打包、编译及发布,以及高效率、高成本效益的特性。平台的可视化表单引擎提供丰富的组件和模板,实现快速配置应用,而自主研发的流程引擎则专为中国市场设计,符合中国人的思维方式与操作习惯。天翎平台还具备强大的集成整合能力,支持与第三方业务系统的无缝对接,确保接口集成过程安全可靠。此外,平台全面兼容国产化软硬件,支持私有化部署,提供源码交付机制,保障企业灵活使用并自主维护系统。
天翎OA办公系统的特点包括公文管理、考勤管理、报销管理、物资管理、人事管理等功能,以及提供天翎低代码开发后台,允许用户根据自身需求调整或新增功能。系统通过特定流程与日常事务紧密结合,提高办公管理与信息管理的效率,实现办公管理的规范化和信息规范化,有效降低企业运行成本。
系统具体功能如下:
公文管理:包含新建收文单、已归档收文、新建发文、已归档发文等功能,支持流程提交、查看流程状态、流程历史信息与流程图。
考勤管理:包括排班管理、请假管理、补卡管理、加班申请管理等,支持流程提交与手签。
考勤查询:提供打卡记录查询、企微考勤记录、钉钉考勤记录功能,并支持Excel导出。
移动办公:支持多端适配,可在Android、iOS操作系统下的手机和平板设备上运行,兼容钉钉、企业微信、飞信以及独立APP。
总结,基于天翎低代码平台的微鳄OA办公管理系统实现办公管理与信息管理的规范化,降低企业运行成本,免费提供开箱即用的体验。用户可利用自由调整或新增功能满足个性化需求,并通过低代码后台支持灵活调整,同时支持更多流程相关的管理系统。微鳄OA办公系统已经与群晖NAS无缝整合,确保数据安全,用户无需额外安装。
Springboot之分布式事务框架Seata实现原理源码分析
在SpringBoot环境下的分布式事务框架Seata实现原理涉及到了代理数据源、注册代理Bean以及全局事务拦截器等关键环节。下面我们将逐步解析其核心逻辑。
首先,Seata通过GlobalTransactionScanner来注册项目中所有带有@GlobalTransactional注解的方法类。该扫描器是一个实现了BeanPostProcessor接口的类,它能够在Spring容器初始化时进行后置处理,从而实现全局事务的管理。
GlobalTransactionScanner实际上是一个InstantiationAwareBeanPostProcessor,它在实例化Bean前执行postProcessBeforeInstantiation方法,在实例化后执行postProcessAfterInstantiation方法,并在属性填充时执行postProcessProperties方法。尽管GlobalTransactionScanner类本身并未覆盖这3个方法,但在父类的实现中,这些方法用于处理Bean的实例化和属性设置过程。
关键在于postProcessAfterInitialization方法中实现的wrapIfNecessary方法,该方法在GlobalTransactionScanner类中被重写。当方法执行到existsAnnotation方法判断类方法是否带有@GlobalTransactional注解时,如果存在则创建一个GlobalTransactionalInterceptor作为拦截器处理全局事务。
在创建代理数据源时,Seata通过DataSourceProxy对系统默认数据源进行代理处理。通过shouldSkip方法判断当前bean是否需要被代理,如果bean是SeataProxy的子类且不是DataSource的子类且不在excludes集合中,则进行代理,从而代理当前系统的默认数据源对象。
全局事务拦截器主要负责全局事务的发起、执行和回滚。在执行全局事务的方法被代理时,具体的执行拦截器是GlobalTransactionalInterceptor。该拦截器处理全局事务的逻辑,包括获取全局事务、开始全局事务、执行本地业务、提交本地事务、记录undo log、提交数据更新等步骤。其中,提交本地事务时会向TC(Transaction Coordinator)注册分支并提交本地事务,整个过程确保了分布式事务的一致性。
当全局事务中任何一个分支发生异常时,事务将被回滚。参与全局事务的组件在异常发生时执行特定的回滚逻辑,确保事务一致性。在Seata的实现中,异常处理机制确保了事务的回滚能够正确执行。
Seata还提供了XID(Transaction Identifier)的传递机制,通过RestTemplate和Feign客户端进行服务间的调用,确保分布式系统中各个服务能够共享和处理全局事务。RestTemplate在请求头中放置TX_XID头信息,而Feign客户端通过从调用链中获取Feign.Builder,最终通过SeataHystrixFeignBuilder.builder方法实现XID的传递。
在被调用端(通过Feign调用服务),Seata自动配置会创建数据源代理,使得事务方法执行时能够获取到连接对象,而这些连接对象已经被代理成DataSourceProxy。SeataHandlerInterceptor拦截器对所有请求进行拦截,从Header中获取TX_XID,参与者的XID绑定到上下文中,通过ConnectionProxy获取代理连接对象。在数据库操作中,XID绑定到ConnectionContext,执行SQL语句时通过StatementProxy或PreparedStatementProxy代理连接,从而完成全局事务的处理。
综上所述,Seata通过一系列复杂的逻辑和机制,实现了SpringBoot环境下的分布式事务管理,确保了分布式系统中数据的一致性和可靠性。
2024-11-30 06:36
2024-11-30 06:07
2024-11-30 06:01
2024-11-30 05:39
2024-11-30 05:34
2024-11-30 05:26
2024-11-30 05:06
2024-11-30 04:34