hg/svn使用
代码部署
1.代码下载 代码分支路径
2.编译:代码库代码和生产环境区别
3.编译:启动,项目模块之间的依赖,需要了解生产环境的区别,只有修改erl时才需要打包make。
代码备份和提交
1.养成代码备份习惯 打包解压 tar-zcf tar-zxf。
ets
erlang term storage的缩写,一个基于内存kv table,类似于汇编的编辑器,仅次于cpu
1.hg 上传下载修改删除。
2.app的页面的修改。
3.数据库和子表的操作。
ewp的基本流程
1.写一个xhtml,里面有一些样式和空的div,用来填充一些数据。
2.写一个erl,模块函数里面,定义了多个宏,先处理参数,而后请求接口,用一个函数
Response1 = ebank_utils:ebank_invoke_procedure({"ebankhost","mzh024",?INSERT_DEFAULT(ParamList)})
前面是接口后面是函数(这个应该是在adaptor.conf文件里的东西),最后是封装传过去的数据。返回一个结果response。
CsKey = ewp_channel_util:channel_adapter_cs_key(Channel, TranCode),其中channel和trancode是传过来的数据。
再获取一个cskey,这是一个html页面,把model放到view中,可以生成json数据,看如何填充到页面。
3.写一个cs,把标签执行完生产json tree,lua中init()后生产完整页面(是在xhtml文件里拼接的,所以最后写一个xhtml)。
注意:先生成处理的数据,后生成页面,最后把数据填充到里面去。这样会减少流量。有的是写死的不是动态写在xhtml中,
如果是动态生成那就要写在数据中然后才处理。
adapter的意义所在把多个入口变成一个入口多个接口,不需要了解其中的协议了,自动帮你处理好。
adapter.conf 配置
{adapter,[{name,"ebankhost"},
{host,"10.3.129.174"}, %服务器的ip地址
%% {host,"127.0.0.1"}, %这个应该是备用端口
{protocol,http}, %对应的协议 http,tcp,rpc
{port,7001}, %监听的端口
{return_type,} %返回类型,如果是xml就会自动转化成json。
{res_convertor, xml2json}]}. %返回自动转换json数据,自动帮你转换
{procedure, [{id, "ewm884"}, %id唯一标识
{data, }, %不会去发请求而是直接读文件(用来开发测试用的)
{res_convertor, xml2term}, %转换的类型
{path, "perbank/MB8884.mb"}, %传一些字段,定义字段的默认值
{gen_log, false}, %是否打印日志
{use_sample_data,false}, %和data配合,用来读假文件。
{data_sample, "public/xmlData/MB8884.xml"},(用来做假的返回数据接口)
{parameters, [{"tranCode","MB8884"}]}] %传过来的参数
}.
ewp_adapter.incoke_procedure(AdapterName,Procedureid,Params)
apapter的名字,procedure的id定位,params是参数列表。
ewp_adapter.incoke_procedure(AdapterName,Procedureid,Params,Options)
Response = ebank_utils:ebank_invoke_procedure({"ebankhost","mzh032",?INSERT_DEFAULT(ParamList)}),
Options传一些额外信息,传类似提供额外功能。
Options传的参数
res_convertor返回类型转化
connect_timeout(tcp socket) 规定超时时间
recv_timeout (tcp socket) 出问题返回时间
list 请求第三方系统,去解析报文,改变一些选项
http_options 请求维持http协议的参数
active 内核缓存,为false一直放在操作系统级别,应用收不到。为true可以感应到,发太多会出现系统处理不过来就崩了,宏攻击。操作系统会出现拒绝收取太多的东西,可以定义为once,设置成合适的选项。
options
ewp_adapter.incoke_procedure(AdapterName,Procedureid,Params,Options,Extra)
Extra额外的协议定制化另外的一些信息。
开发流程 1.上ewp平台配置一下 trancode和channelid
2.编写erl文件
3.写cs页面
4.写xhtml
5.注意目录结构
app访问流程 1.前台获取数据走对应的channel的模块的函数
2.根据需要调对应的接口返回响应
3.根据传过来的生成对应的cs模板
4.将m和v结合起来,也就是将数据填充到模板里,返回一个页面或者xhtml。
返回的状态
1.只返回数据 相当于刷新这个页面的数据
2.返回数据和页面 相当于访问一个新的页面
3.返回页面 返回一个固定写死的页面,比如说一些协议或者文本之类。
//将频道和代码传过来
'mzh021'(TranCode, Channel) ->
%% 发送请求接口参数,相当于getparam(),根据参数获取数据
AccountNo = ?param("accountNo"),
//获取对应的accountAlias
AccountAlias = ?param("accountAlias"),
//将接口和接口里东西封装到一个参数list里
ParamList = [{"accountNo",AccountNo},{"accountAlias",AccountAlias}],
%%请求接口,更改账户别名,当前的网银系统的mzh021接口(adapter.conf里面配置的),以及前面传的参数列表
Response = ebank_utils:ebank_invoke_procedure({"ebankhost","mzh021",?INSERT_DEFAULT(ParamList)}),
//根据响应到root/errorCode找对应的错误码,只有0000是ok的,其他的会返回一个错误信息,抛出一个异常,最后一起异常处理
[ErrorCode]= ?ewp_xpath("root/errorCode",Response),
case ErrorCode of
"0000" -> ok;
_ ->
[ErrorMessage]= ?ewp_xpath("root/errorMessage",Response),
throw(?COM_ERR(ErrorMessage))
end,
%% 增加接口MB1053下挂账户信息查询 mzh030
//开始出一个新的列表
ParamList2 = [],
//根据空的调对应的接口,返回响应码
AccInfoRes = ebank_utils:ebank_invoke_procedure({"ebankhost","mzh030",?INSERT_DEFAULT(ParamList2)}),
case hd(?ewp_xpath("root/errorCode", AccInfoRes)) of
"0000" -> ok;
_ -> pass
end,
//返回结果放在session里面去。
Cards_list = ?ewp_xpath("root/cd/iAccountInfo/row",AccInfoRes),
Cards_sessions = ebank_utils:get_card_session(Cards_list,[]),
CardList = {"cardList",Cards_sessions},
%% 更新session信息,根据前面的cardlist。
ebank_utils:update_user_info_session("cardList",CardList),
%% 重新获取下挂卡带金额的列表,并生成对应的页面。
NewCards2 = ebank_utils:get_cardlist_balance(),
CsKey = ewp_channel_util:channel_adapter_cs_key(Channel, TranCode),
Res = ewp_channel_util:render(CsKey, [{root,ebank_utils:get_empty()}], [{userinfo, NewCards2}]),
Res.
1.在xhtml文件中存在这样结构,前面的trancode和channelid 从哪个页面去数据来的
后面的trancode和channelid 传到后台决定用哪个web后台的文件
local tranCode = "cep001";
local channelId = "credit_enqupro";
local submit = {
channelId = "credit_enqupro",
tranCode = "cep001",
postParams = {
id= "credit_enqupro",
tranCode = "cep001"
}
};
2.不跳页面,取数据。
可以写一个回调函数,重写回调方法,实现不跳页面取数据。
3.请求接口的具体
ebank_utils:ebank_invoke_procedure({"ebankhost","mcx007",?INSERT_DEFAULT(ParamList1)})
调用这个方法,请求adaptor里面对应的ebankhost的mcx007,会出现一个虚拟数据path, "perbank/MB9104.mb"
是MB+四个数字.mb结尾的文件。
检查返回的错误数据,返回错误日志。
CsKey = ewp_channel_util:channel_adapter_cs_key(Channel, TranCode),
按唯一标示拼接获取空白页面cskey,最后放入render。channel和trancode拼接成一个cs页面名
Res = ewp_channel_util:render(CsKey, [{root,ebank_utils:get_empty()}], lists:append([[{url,Xinyongka_url}],[{certId,CertId}],[{cert_type,Cert_type}],[{phone,CustomerPhone}],[{customerName,CustomerName}],[{userinfo, NewCards}],[{userinfo1,Response}]])),
Res.返回一个结果。
4.throw(?COM_ERR("您的下挂卡列表为空!")) 抛出一个异常弹出这个话。
5.零存整取有就生成瀑布流,没有就提示没有数据。
6.流程 1.xhtml 2.erl 3.cs 4.adapter 5.先让流程走通不写数据,在写模拟数据进行操作。
7.逻辑判断 数据格式,参数判断是否金额足够。
8.常见错误 1.值去不到,页面比较 2.拼报文问题 3.写的规则
1.回调函数在xhtml,只返回数据
2.lookup_from_userinfo方法
3.开发先写通页面和后台,调用假数据或者mensia里的数据。