Mifos小额信贷管理系统平台软件架构文档.docx
- 文档编号:4177395
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:11
- 大小:91.69KB
Mifos小额信贷管理系统平台软件架构文档.docx
《Mifos小额信贷管理系统平台软件架构文档.docx》由会员分享,可在线阅读,更多相关《Mifos小额信贷管理系统平台软件架构文档.docx(11页珍藏版)》请在冰点文库上搜索。
Mifos小额信贷管理系统平台软件架构文档
Mifos小额信贷管理系统平台软件架构文档
Mifos平台软件架构文档
1.概要
本文抓住了主要架构决策平台。
文档的目的是为平台的总体结构提供一个向导;它适合在一个管理信息系统解决方案的整体背景及其内部贡献者可以更有效地了解他们正在考虑可以变化,这些变化的影响。
这个报告的目标受众是系统集成商(谁将使用文档来了解平台的结构及其设计原理)和平台贡献者将使用文档来推断未来的变化和谁会随着系统的发展更新文档。
2.简介
2.1.理念
Mifos是一个出于希望创建和部署技术,允许小额信贷行业的规模的想法。
我们的目标是:
●产生一个黄金标准管理信息系统适合小额信贷业务
●作为小额信贷的基础平台
●开源的,拥有和由成员组织在社区
●使潜在的生态系统提供商周边的小额信贷机构
2.2.历史
●2006:
项目始于Grameen基金会
●2011年底:
Grameen基金会把全部责任移交给开源社区。
●2012:
MifosX平台开始。
之前的项目成员以开源社区小额信贷(COSM/OpenMF)的名义聚在一起
●2013年:
COSM/OpenMF正式更名Mifos倡议和接收美国税法条款501c3。
2.3.项目相关
项目URL
下载
下载统计Downloadstats
●
●金融体系集成到一个ATM/POS/卡服务网络,客户可以使用
●金融体系可能与移动支付运营商集成和支持移动货币服务客户(现在/未来小额信贷)。
●一个金融体系可能使用的第三方代理销售其他银行/金融体系的产品/服务
如上面的图表所示,各利益相关者利用业务应用程序执行特定客户或金融体系相关操作。
这些业务应用程序中包含的功能可以以任何方式捆绑打包。
在图中,几个应用程序可以组合成一个应用程序或任何一块代表一个应用程序可以根据需要进一步分解。
该平台是管理信息系统的核心引擎。
它隐藏了很多存在的复杂的金融体系中的管理信息系统所需的业务和技术领域背后的一个相对简单的API。
这个API,使应用程序开发人员按金融体系他们需要的那样进行创新和开发一般或定制的应用程序。
3.功能概览
作为平台的所有功能都通过一个API,该API文档是最好的地方来查看该平台是做什么的详细分解。
看到网上API文档。
https:
//demo.openmf.org/api-docs/apiLive.htm
通过更高的级别上我们看到的功能分为以下几类:
●基础构件
¡规范
¡扩展数据表
¡报表
●用户管理
¡用户
¡角色
¡权限
●机构模型
¡机构
¡职员
¡货币
●产品配置
¡手续费
¡贷款产品
¡存款产品
●客户资料
¡了解你的客户
●投资组合管理
¡贷款账户
¡存款帐户
¡顾客/团体
●总帐账户管理
¡会计科目表
¡总帐
4.技术
∙Java7:
∙JAX-RS1.0:
usingJersey(1.17.x)
∙JSONusingGoogleGSON
∙SpringI/OPlatform:
http:
//spring.io/platform
oSpringFramework
oSpringSecurity
oSpringData(JPA)backedbyHibernate
∙MySQL:
4.1.主要的技术
4.1.1.RESTfulAPI
该平台通过practically-RESTfulAPI公开其所有功能,通信使用JSON。
我们使用术语practically-RESTful为了使其清楚我们不是去依从完整的REST,但仍然保持重要的基于REST的属性:
●无状态:
平台维护没有会话或基于会话的状态。
这样做的结果是轻松扩展能力水平。
●面向资源:
API是集中在一组资源通过使用HTTP的词汇和约定例如GET、PUT、POST、DELETE,HTTP状态代码。
以达到为客户端提供一个简单的和一致的API。
看到网上API文档的更多细节。
https:
//demo.openmf.org/api-docs/apiLive.htm
4.1.2.多租户技术
mifos平台开发支持多租户设计的核心。
这意味着它是易于使用的软件即服务(SaaS)的平台型产品,因为它是为本地安装。
平台使用一个方法隔离金融体系数据库/数据/模式(见单独的数据库和共享数据库,单独的模式
4.1.3.可扩展
同时每个租户将有一组核心表,表平台可以扩展以不同的方式为每个租户通过使用数据表的功能。
4.1.4.读写分离
我们分离写命令(修改数据)和查询(读取数据)。
为什么?
有很多原因选择这种方法,目前不是一个尝试全面的CQRS。
目前的主要优点是:
●状态改变命令持续提供审计的状态改变。
●用于支持maker-checker的一般方法。
●状态改变命令使用面向对象模式(因此ORM),而查询可以保持为数据模式。
4.1.5.四眼原则
也称为四眼原则。
使应用程序能够支持maker-checker风格工作流过程。
命令,通过验证将被持久化。
Maker-checker在细粒度级别可以启用/禁用任何状态变化的API。
4.1.6.良好的权限控制
细粒度的权限与每个API。
管理员有细粒度的控制权什么角色或用户访问权。
5.代码打包
意图是使平台代码以垂直切分的方式(而不是层)打包。
源代码在这里mifosng-provider/src/main/java/org/mifosplatform
org.mifosplatform.
∙accounting
∙useradministration
∙infrastructure
∙portfolio
ocharge
oclient
ofund
oloanaccount
∙accounting
在每一个垂直部分是一些常见的包装结构:
org.mifosplatform.useradministration.
∙api-XXXApiResource.java-RESTapi实现文件
∙handler-XXXCommandHandler.java-具体处理程序调用
∙service-包含读+写服务功能区
∙domain-OO概念功能区域
∙data-数据区域的概念
∙serialization-为功能区域转换APIJSON
6.设计概览
注意:
通过实现平台的代码来处理命令处理程序同时支持maker-checker和授权检查目前有点复杂的,一个领域类针对性进行清理,让新平台的开发人员更容易入门。
同时以下内容用于解释其工作原理。
考虑上图所示的例子为用户资源。
1.查询:
GET/用户
2.HTTPSAPI:
retrieveAll方法org.mifosplatform.useradministration.api.UsersApiResource调用
3.UsersApiResource.retrieveAll:
检查用户访问该资源的权限数据
4.UsersApiResource.retrieveAll:
使用'readservice'来获取所有用户数据('readservice'执行简单的SQL使用JDBC查询数据库)
5.UsersApiResource.retrieveAll:
返回的数据转换成JSON响应
命令:
POST/users(注:
数据在请求body中)
HTTPSAPI:
create方法在org.mifosplatform.useradministration.api.UsersApiResource中被调用
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
publicStringcreate(finalStringapiRequestBodyAsJson){
finalCommandWrappercommandRequest=newCommandWrapperBuilder()//
.createUser()//
.withJson(apiRequestBodyAsJson)//
.build();
finalCommandProcessingResultresult=mandsSourceWritePlatformService.logCommandSource(commandRequest);
returnthis.toApiJsonSerializer.serialize(result);
}
描述:
创建一个CommandWrapper对象表示这个createuser命令和JSON请求主体。
交给PortfolioCommandSourceWritePlatformService.logCommandSource进行处理。
@Override
publicCommandProcessingResultlogCommandSource(finalCommandWrapperwrapper){
booleanisApprovedByChecker=false;
//checkifisupdateofownaccountdetails
if(wrapper.isUpdateOfOwnUserDetails(this.context.authenticatedUser().getId())){
//thenallowthisoperationtoproceed.
//makercheckerdoesntmeananythinghere.
isApprovedByChecker=true;//settotrueincasepermissionshave
//beenmaker-checkerenabledby
//accident.
}else{
//ifnotuserchangingtheirowndetails-checkuserhas
//permissiontoperformspecifictask.
this.context.authenticatedUser().validateHasPermissionTo(wrapper.getTaskPermissionName());
}
validateIsUpdateAllowed();
finalStringjson=wrapper.getJson();
CommandProcessingResultresult=null;
try{
finalJsonElementparsedCommand=this.fromApiJsonHelper.parse(json);
finalJsonCommandcommand=JsonCommand.from(json,parsedCommand,this.fromApiJsonHelper,wrapper.getEntityName(),
wrapper.getEntityId(),wrapper.getSubentityId(),wrapper.getGroupId(),wrapper.getClientId(),wrapper.getLoanId(),
wrapper.getSavingsId(),wrapper.getCodeId(),wrapper.getSupportedEntityType(),wrapper.getSupportedEntityId(),
wrapper.getTransactionId(),wrapper.getHref(),wrapper.getProductId());
result=this.processAndLogCommandService.processAndLogCommand(wrapper,command,isApprovedByChecker);
}catch(finalRollbackTransactionAsCommandIsNotApprovedByCheckerExceptione){
result=this.processAndLogCommandService.logCommand(e.getCommandSourceResult());
}
returnresult;
}
描述:
检查用户允许此操作。
如果好,)解析json请求的身体,b)创建一个JsonCommand对象包装命令细节,c)使用CommandProcessingService处理命令。
注意:
如果出现RollbackTransactionAsCommandIsNotApprovedByCheckerException。
最初的事务将被打掉,我们只有日志条目的命令审计表中设置其状态为“等待”。
@Transactional
@Override
publicCommandProcessingResultprocessAndLogCommand(finalCommandWrapperwrapper,finalJsonCommandcommand,finalbooleanisApprovedByChecker){
finalbooleanrollbackTransaction=this.configurationDomainService.isMakerCheckerEnabledForTask(wrapper.taskPermissionName())
&&!
isApprovedByChecker;
finalNewCommandSourceHandlerhandler=findCommandHandler(wrapper);
finalCommandProcessingResultresult=handler.processCommand(command);
finalAppUsermaker=this.context.authenticatedUser();
CommandSourcecommandSourceResult=null;
if(mandId()!
=null){
commandSourceResult=mandSourceRepository.findOne(mandId());
commandSourceResult.markAsChecked(maker,DateTime.now());
}else{
commandSourceResult=CommandSource.fullEntryFrom(wrapper,command,maker);
}
commandSourceResult.updateResourceId(result.resourceId());
commandSourceResult.updateForAudit(result.getOfficeId(),result.getGroupId(),result.getClientId(),result.getLoanId(),
result.getSavingsId(),result.getProductId());
StringchangesOnlyJson=null;
if(result.hasChanges()){
changesOnlyJson=this.toApiJsonSerializer.serializeResult(result.getChanges());
commandSourceResult.updateJsonTo(changesOnlyJson);
}
if(!
result.hasChanges()&&wrapper.isUpdateOperation()&&!
wrapper.isUpdateDatatable()){
commandSourceResult.updateJsonTo(null);
}
if(commandSourceResult.hasJson()){
mandSourceRepository.save(commandSourceResult);
}
if(rollbackTransaction){thrownewRollbackTransactionAsCommandIsNotApprovedByCheckerException(commandSourceResult);}
returnresult;
}
1.检查如果maker-checker配置支持这一行动。
如果是的,这不是一个“检查”批准的命令——回滚。
最后我们回滚为了测试如果命令将“域验证”需要提交数据库进行全面检查。
2.findCommandHandler——找到正确的Hanlder处理此命令。
3.过程命令使用处理程序(在事务作用域)。
4.CommandSource对象创建/更新日志“m_portfolio_command_source”表的所有细节。
5.在更新场景中,我们看看那里真的任何更改/更新。
如果是只存储在审计日志JSON的变化。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mifos 小额 信贷管理 系统 平台 软件 架构 文档