APP配置平台

数据库安装

说明:这里以SQL SERVER 2008 R2安装为示例,最好在操作系统安装完成以后立刻安装数据库,安装SQL SERVER 2008R2时可能需要先安装.net3.5的环境

提示:微软各类软件下载地址:http://msdn.itellyou.cn
----------

IIS

安装

IIS版本最低要求为 6.0 ,操作系统必须安装有有.net4.0的环境 也就是说操作系统最低要求为windows server 2003

.net 4.0 安装后不重启的办法,用管理员在CMD中执行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

注:APP的后台如果配置使用时没有报错,可以不需要设置父路径选项。

添加虚拟目录

说明:用来设置APP中上传图片后,图片存放在服务器的什么地方
1.在IIS中找到APP的后台网站,找到目录"FileUpload" 然后右键单击该目录,选择"添加虚拟目录"
2.在弹出的界面中录入如图以下信息,别名必须是:Files,物理路劲填写你在APP配置平台中设置(或将要设置)的文档中心目录

3.在服务器中找到你设置的物理路径的那个文件夹,打开文件夹属性->安全 将"IIS_IUSRS"用户添加进去,并设置完全控制的权限,如下图

4.添加完成以后的效果如下图

kok体育平台下载网址构件式平台

基础知识:
SQL
HTML
CSS3
javascript
jquery

配置APP文档中心

说明:用来添加APP中文档的保存目录,也可以用来管理文档
1.服务器需要开启信息中心

2.kok体育平台下载网址构建式平台需要连接上信息中心

3.打开 文档中心->文档中心参数设置 设置好(信心中心启动)ip地址、文件服务器工作目录

4.在文档管理业务中添加文档目录

APP项目定义

说明:APP项目定义了一个APP的编号,名称,首次加载时与服务器通信配置等基本信息,对于首次启动服务建议使用1999或者2999或者3999的方式

注意:APP项目定义中,必须在细表【本地变量】中添加一个任意变量,无论使用与否。

细表说明:
1. 插件列表:预留,暂无实际功能。
2. 本地变量设置:
2.1 序号:按系统默认即可。

2.2 变量英文:在APP服务端获取变量值时需要使用到,取值方式[loc@变量英文名]

2.3 重新加载设置:用来定义页面是否需要再每次打开时刷新数据,现在直接在【APP表单设置】里面勾选返回不刷新按即可
2.4 外部样式加载信息:后期在对APP界面或者部分功能调整时,需要添加新的样式时,可以不升级APP直接在这里把样式库或者JS加载到APP

APP表单设置

说明: APP表单设置主要功能用来设置整个静态页面的样式和布局,以及对当前界面的一些属性设置。

设置图片上传目录

说明:此功能按需要设置,用来填写用户上传的文件保存目录
关联:文档中心添加目录、IIS虚拟添加虚拟目录。

表单样式

说明:APP表单设置中,主表的表单样式字段,是用来设计整个APP界面的,在里面可以写 HTML,CSS,JS
示例:
<style>
.demo{color:red}
</style>
<a class="demo" onclick="tempdemo()">这个a标签使用的是本页面的样式,点击时出发本页面的JS方法</a>
<script>
function tempdemo()
{
mylert("执行的是本页面的方法")
}
</script>
效果:

表单逻辑

说明:表单再加载页面后,需要执行服务对页面上的数据进行操作,表单逻辑引用的是APP服务设置中的内容
触发类型:
1.进入时触发:表示打开这个界面时执行的服务,一般点击按钮自动生成即可。
2.退出时触发:表示离开当前页面时执行的服务。
是否需要先登陆:表示打开页面时是否需要先判断用户已登陆。
示例:

未加载时赋值语句

说明:APP界面打开时不执行服务时需要动态修改界面,那么在这里对界面进行操作。

弹出框设置

说明:需要从后台数据库中读取数据给用户选择时,使用此功能。
注意:下面样式中所有元素的ID值都不能有.号
示例:

1.表单样式中录入的信息,点击触发选择界面的方法为:choosedlg('demochoose'),demochoose为当前元素的id
<p>下面是单选,带出2个值分别填入2个输入框</p> <input id="demochooose" type="text" placeholder="这里是演示单选弹出框设置" onclick="choosedlg('demochoose')"/> <input id="demouserno" type="text" placeholder="编号" /> </div>
2.执行数据库语句录入的信息,如果数据量比较大,那么使用分页功能
select empno,empname,rows from ( select empno,empname,ROW_NUMBER() over(order by empno) as rows from ba_employeeinfo) d where rows between ([pageindex]-1)*[pagesize]+1 AND [pageindex]*[pagesize]
  2.1如果需要过滤 那么只要在语句中使用 [val]参数即可,以下语句中的'[val]' 会被替换成用户在搜索框输入的值
select empno,empname,rows from ( select empno,empname,ROW_NUMBER() over(order by empno) as rows from ba_employeeinfo) d where empno like '%[val]%' and rows between ([pageindex]-1)*[pagesize]+1 AND [pageindex]*[pagesize]
3.显示样式[cho@?]中的?号表示SQL输出参数设置的序号
<h1>[cho@2]([cho@1])</h1>
4.SQL输出参数设置
  4.1字段类型:按数据库返回的值选择。
  4.2是否输出字:指的是否在选择界面上显示,比如要在显示样式中使用[cho@2]那么就必须把序号为2的打勾。
  4.3界面元素名称:选择值以后要返回给界面的元素的ID。
效果:
5.多选
  5.1 需要将是否多选打勾,或者设置值为1
  5.2 需要在显示样式中设置如下样式,其中 input元素 的 id 属性值 必须 与label标签的 for属性的值一直,并且每一组的值要唯一
<h3 >[cho@2]([cho@1])</h3>
<div class="fr checkbox">
<input id="[cho@1]" type="checkbox" name="empinfo" width:30px;height:30px;" /> <label class="checklabel" for="[cho@1]" ><div class="icon check seticon" style=" width:60px;height:60px;left:-17px;top:-17px;"></div></label> </div>

表单样式设计(暂未使用)

APP服务端配置

说明: 主要是用来获取数据,业务逻辑判断,对界面元素进行数据绑定操作等。
要求: 一个界面如果需要多个服务来操作数据等,那么直接以1001-1、1001-2、1001-3这样的方式来添加服务编号

传入参数设置

说明:界面的第一个服务是不需要,也不能传递参数过来的,本设置用来接受doclick()方法传递进来的参数
1.序号:使用自动编号即可,也可以自定序号,但是不能重复
2.字段类型:按你传入的类型选择,一般使用普通字符即可
3.传入参数名称:格式param+序号:例如param1、param2等
4.说明:要求必须填写该参数的说明
示例:

临时变量设置

说明:当前界面操作时的临时变量,与本地变量不同,临时变量仅供当前界面使用。

1.变量名:定义好以后,在其他地方使用时需要,请使用拼音或者英文
2.字段类型:按需要选择,如果没有需要的类型,选择普通字符即可
3.说明:对该变量定义的描述,必须填写
示例:
①.赋值

②.取值:取值方式[val@变量名称]、此处为[val@position]

效果:

服务执行过程

功能说明:
①接受doclick()传递进来的参数,接受格式:[ins@param?]其中?代表[传入参数设置]中的序号
②从数据库获取值(编写SQL语句),返回结果给[服务返回JSON]调用
③调用外部接口
给临时变量赋值
⑤包含的系统参数:[billno](loadopeid('form1','20170304')中传递过来的参数),[userno](指当前登陆用户的用户编号)
⑥设置分段加载
字段说明:

服务返回JSON

说明:主要用来接受[服务执行过程]中的返回值,以及其他逻辑处理等。
常用功能:

字段说明:
1.json编号:相当于序号,不可重复,【服务执行过程】中使用多行功能时需要选用这里的编号
2.执行条件:判断当前语句是否执行,填写1=2表示不执行,可以使用[proc@?@?]来做判断
3.操作类型:按需选择,下面有介绍功能
4.元素:这里的元素指HTML元素的ID,即APP表单设置->表单样式 里面录入的HTML代码里面元素的ID
5.显示样式:按不同的类型可以写SQL语句,可以写HTML代码 不论何种情况,都可以使用 [ins@param?][proc@?@?][val@?]
6.变量:给全局变量赋值,配合7(赋值公式)使用
7.赋值公式:配合6(变量)使用,直接用sql语句返回单个值
8.业务或URL:配合类型为跳转到对应页面使用,需要9(类型)一起使用
9.类型:配合8使用

执行JS赋值语句

说明:此功能可以执行JS语句,并且可以获取到服务执行过程中返回的数据,可以使用传入参数的值,可以使用全局变量
示例:(代码考出来后请去掉换行)
mylert("临时变量的值为:[val@position],传进来的参数[ins@param1],[ins@param2]:
数据库返回的结果[proc@1@1],[proc@1@2];全局变量whosebusiness的值为:"+getlocal('whosebusiness'));

APP全局变量

说明:用来给APP项目定义钟的全局变量赋值
示例:查看上图

界面元素

说明:用来给界面上的元素赋值
示例:查看上图

跳转到对应页面

说明:用来给界面上的元素赋值
示例:查看上图

注意:所有常用JS方法在执行时都需要安装JS执行事件标准写,或者在APP服务设置里面选择执行JS赋值语句

页面跳转:

不带参数:loadurl('form1')

<a onclick="loadurl('form1')">点击这个按钮就会跳转到form1页面</a>

带参数: loadopeid('form1','20170202001')

示 例: loadopeid('form1','20170202001');
参数一: 'form1' 表示目标页面
参数二: '20170202001' 表示要传递过去的参数
说明:此参数传递过去后
直接再form1页面对应的服务里面使用sql语句取值:select '[billno]' as billno 其中[billno]等于20170202001

调用服务:

说明:执行某一项服务

不带参数:doclick('1002')

带参数:doclick('1002','1','2','3')

说明:执行doclick方法时,可以附带无限个数的参数,但是括号里面的第一个值"1002"必须是服务编号。并且所有参数必须以字符串的形式传递。这里只写3个参数作为示例,参数个数不限。
参数一:1002 表示执行1002服务
参数二:1 表示将值“1”以参数的形式传递给1002服务
参数二:2 表示将值“2”以参数的形式传递给1002服务
参数三:3 表示将值“3”以参数的形式传递给1002服务
示例:<a class="af-button" onclick="doclick('1002','001','201703001','0')">示例按钮</a>
技巧:<a class="af-button" onclick="doclick('1002',gets('userid'),gets('orderno'),gets('states'))">示例按钮</a> 这里的gets('xxxx')是一个方法,会去获取页面上找id='xxx'的值,你也可以自己写使用JS的其他方法返回值
扩展:如何接受传递过来的参数

提示框(弹窗):

无选择提示(警告提示):mylert('订单提交成功!')

说明:弹出一个对话框,只有一个确定按钮,并附上提示信息。
示例:<a class="af-button" onclick="mylert('订单提交成功!')">提交订单</a>
效果:点击图片放大

操作提示(选择下一步操作):doprompt

说明:该方法有5个参数,弹出提示框,让用户选择确定,或者取消。
示例:doprompt('扫码成功', '继续', '返回','doclick(\'1003\',\'001\')', '');
参数一:扫码成功 提示用户的信息
参数二:继续 继续下一步的按钮描述
参数三:返回 不进行下一步的按钮描述
参数四:doclick(\'1003\',\'001\') 用户点击继续时,执行的代码
参数五:一般为空即可,用户点击返回时关闭当前对话框,不做其他操作。
效果:点击图片放大

条码扫描:scanbarcode

说明:scanbarcode('参数')用来扫描一维码或者二维码
示例:<a class="af-button" onclick="scanbarcode('mylert(\'[val]\')')">扫码</a> 参数:mylert(\'[val]\') 是指获取到条码的结果后,需要执行的方法,其中[val]将会被替换成条码值,这里也可以写服务,将条码的值传到服务中去操作onclick="scanbarcode('doclick(\'1003\',\'[val]\')')"
注意:为什么会有\出现,在'号里面再次使用'号时,内层的'前面需要加\
效果:点击图片放大

元素赋值、取值

赋值:sets('userno', '001')

说明:用来给当前界面上指定的元素赋值
示例:<input type='text' id='userno'/><a class="af-button" onclick="sets('userno','001')">扫码</a>
参数一:userno界面上对应的元素id,示例中元素的id为userno
参数二:001需要赋予userno的值,这里也可以在服务中使用sets('userno','[proc@1@1]')
效果:

取值:gets('userno')

说明:用来获取当前界面元素的值
示例:<input type='text' id='userno'/><a class="af-button" onclick="mylert(gets('userno'))">取值</a>
参数一:userno界面上对应的元素id,示例中元素的id为userno
效果:

用户输入检查:inputcheck

说明:用来检查用户输入的数据是否符合要求,比如检查是否为手机号码
示例:<input type='text' id='phoneno' onblur="inputcheck(this, 3, 13, 13, '手机号码格式不正确', 'temp')" />
参数一:this直接填入this即可
参数二:为检查的类型0 汉字;1 email;2 IP 地址;3 手机号码;
参数三:输入内容的最小长度
参数四:输入内容的最大长度
参数五:如果输入信息不符合要求,显示的提示语
参数六:当前表单的页面id:例如:form1、form2、form3等
效果:

获取当前界面ID:getformid

说明:用来获取当前界面的ID编号。getformid()方法直接返回一个页面ID的字符串
示例:<a class="af-button" type='text' id='phoneno' onclick="var id=getformid();mylert('当前页面的id是:'+id)" >获取当前页面编号</a> 此时,id的值就等于当前打开页面的编号。
参数:无
效果:

图片上传:uploadfilesa

说明:uploadfilesa(showimgid, imgdid, funstr)从手机或者相机上传图片到指定的目录
示例:<div style="text-align:center" onclick="uploadfilesa('form76userimg','form76erpdid','doclick(\'9076-1\',\'did\')')">
<img id="form76userimg" style="max-width:80%" src="" alt="点击上传图片" />
</div>
<input type="text" id="form76erpdid" style="display:none;" />
</div>

参数一:图片上传完成后,需要显示在哪一个标签里面
参数二:图片上传完成以后,需要将上传到数据库的文件编号(did)填写到当前页面的哪一个input元素内,方便页面上获取当前图片编号操作。
参数三:图片上传完成以后,需要执行的方法,一般回去执行服务事件,调用dolick()方法,在此参数中,did这个字符串,会被替换成文档编号,例 如:D20170300000925
参数四、五:用来设置上传时分辨率的缩放,参数四为宽的像素,参数五为高的像素,2个参数必须同时存在。参数四、五可以设置相同的值,上传的图片不会变形。
参数六、七、八:用来设置上传时的水印文字,只支持左下角水印
参数六:设置水印文字大小,整数型
参数七:设置水印字体颜色,可选颜色( RED,GREEN,BLACK,BLUE,YELLOW,DKGRAY,GRAY,LTGRAY,WHITE,CYAN,MAGENTA)
参数八:水印文字内容,如果需要换行,那么使用\r\n来作为文字换行符号
注意:如果不进行像素裁剪,而是直接添加水印,那么参数四、参数五统一设置为0

注意:如果不设置参数4和参数5那么将不会进行像素缩放,但是也会压缩上传
上面示例中:doclick(\'9076-1\',\'did\')这一段在图片上传完成后,最终执行的是:doclick('9076-1','D20170300000925')
关联内容:APP文档目录设置IIS虚拟路径设置,APP表单设置图片上传目录
效果:
l.

多选图片上传:picselect

说明:picselect(fxjs)从手机或者相机上传图片到指定的目录
示例:<div style="text-align:center" onclick="picselect('doclick(\'9076-1\',\'did\')')">
参数一:图片上传完成以后,需要执行的方法,一般回去执行服务事件,调用dolick()方法,在此参数中,did这个字符串,会被替换成文档编号,例 如:D20170300000925
上面示例中:doclick(\'9076-1\',\'did\')这一段在图片上传完成后,最终执行的是:doclick('9076-1','D20170300000925')
关联内容:APP文档目录设置IIS虚拟路径设置,APP表单设置图片上传目录

录制音频上传:audiorecord

说明:audiorecord(fxjs)录制音频上传到指定的目录
示例:<div style="text-align:center" onclick="audiorecord('doclick(\'9076-1\',\'did\')')">
参数一:图片上传完成以后,需要执行的方法,一般回去执行服务事件,调用dolick()方法,在此参数中,did这个字符串,会被替换成文档编号,例 如:D20170300000925
上面示例中:doclick(\'9076-1\',\'did\')这一段在图片上传完成后,最终执行的是:doclick('9076-1','D20170300000925')
关联内容:APP文档目录设置IIS虚拟路径设置,APP表单设置图片上传目录

选择视频和录制视频上传:setselectvideo

说明:setselectvideo(fxjs)选择视频和录制视频上传到指定的目录
示例:<div style="text-align:center" onclick="setselectvideo('doclick(\'9076-1\',\'did\')')">
参数一:图片上传完成以后,需要执行的方法,一般回去执行服务事件,调用dolick()方法,在此参数中,did这个字符串,会被替换成文档编号,例 如:D20170300000925
上面示例中:doclick(\'9076-1\',\'did\')这一段在图片上传完成后,最终执行的是:doclick('9076-1','D20170300000925')
关联内容:APP文档目录设置IIS虚拟路径设置,APP表单设置图片上传目录

上拉加载:bindscroll

说明:bindscroll(serverno, tabdivid)当列表数据显示过多时,使用分段加载(用户往上滑动界面时)数据。
参数一:分段获取数据的服务编号
参数二:绑定上拉加载的div容器id
示例:bindscroll('9016','cust_zs_infolist_div');
APP表单部分:固定结构
<div id="cust_zs_infolist_div">
<ul class="list chanpin" id="cust_zs_infolist">这里面用来存放从数据库获取的数据,即服务中要每次通过id(cust_zs_infolist)动态加载该容器的内容</ul>
<div></div>
</div>
APP服务端部分
1.数据库分页语句写法
select d.custname,d.operator,rownum from ( select ROW_NUMBER() over (order by a.custname ) as rownum, a.custname,a.operator from ba_manucustinfo a ) d where d.rownum between ([pageindex]-1)*15+1 AND [pageindex]*15
order by d.rownum
2.服务端配置

(new)下拉刷新,上拉加载:fxjroll

说明:fxjroll(elid, serverno, billno, size)用来处理页面下拉刷新上拉加载
参数一:绑定刷新(加载)的元素ID
参数二:获取数据的服务编号
参数三:全局单据号billno,可在服务的SQL语句中使用[billno]的值
参数四:分页大小(每次显示多少条数据)
示例:fxjroll('wrapper','9081-1','这里是billno','20')
设置步骤:
1.需要引入的JS文件http://www.feixuns.com/appjscss/Public/extjs/fxjroll.min.js
如何引用JS参考APP项目定义
上面是加载的公司服务器的JS文件,可以将JS下载下来放在客户的IIS目录加载
2.HTML结构设置
<div id="wrapper" style="top:44px; position: absolute;bottom: 0;width: 100%;">
<div>
<ul class='list chanpin' style="color:red;" ></ul>
</div>
</div>
</div>
说明:结构必须如代码,可修改部分为:第一个div的id,第一个div style里面的top值,width值
第二个div尽量不要修改,ul元素可以随意更改,但是必须是ul 不能改成其他元素类型
3.服务端设置
数据库查询语句的分页写法和返回结果与上面的bindscroll一样
在服务返回json细表里面 必须要在元素中填写一个值,这个值可以随意填写,不一定要是界面上元素的id

4.调用方法:在APP表单设置的表单样式里面直接使用JS调用,或者在该表单对应的服务里面调用:
下图任选一种


气泡、角标:setbadge

说明:setbadge(eid, num, position, color)用来在APP内部的界面上显示角标
参数一:要将角标显示在起上面的元素的id
参数二:角标里面要显示的内容,一般为数字
参数三:要显示在该元素的哪个方位[sz:左上角,sy:右上角,xz:左下角,xy:右下角]
参数四:角标的颜色,一般为红色(red)
参数五[可选]:如果传入了第5个参数,并且值为0,那么角标将不显示
示例:setbadge('iconwdzxdiv','new','sy','red')
效果:点击图片放大

输入框必填检查:myjsrequired

说明:myjsrequired(),在用户录入数据之后,提交数据时,检查当前页面必须要填写的内容是否都有值
参数:无
返回:true\false[当所有必填项都有值时,返回true,否则返回false]
示例:<input type='text' id="userno" required="required" />
<a class="button block blue" onclick="if (myjsrequired() == true) { doclick('1009',gets(userno))}">提交</a>
注意:要检查必填的元素必须含有 required="required" 的属性,示例中的红色部分
效果:点击图片放大

图片加载等待效果:imgLoad

说明:imgLoad(formid) 当页面上的图片过多时,等待图片加载完毕以后再完全显示图片
参数一:当前界面的id 例如:form1、form2、form3等
示例:imgLoad('form1') 直接写在表单服务里面:类型执行JS赋值语句

百度定位:photo5

说明:photo5(types, funstr),用来获取当前手机所在的地理位置信息
参数一:返回值类型[types=0的时候返回地址 types=1的时候返回经纬度中间用逗号隔开 types=2 时候返回经度+逗号+纬度+逗号+地址]
参数二:定位成功以后执行的方法。如果funstr中包含了val1这个字符串,那么将被替换成所要的结果的值,比如types=0那么val1会被替换成获取到的地址
示例:<a class="button block blue" onclick="photo5(0,'doclick(\'1002-1\',\'val1\')')>获取地址</a>
示例说明:表示获取到经纬度以后,执行1002-1服务,并将获取到的地址作为第一个参数传入
其他:在定位成功以后定位信息会永久保存在localStorage中
localStorage.lat 经度;
localStorage.lon 纬度;
localStorage.address 地址;
localStorage.province 省;
localStorage.city 市;

定位微调

说明:FxOpenMap()默认打开当前定位地址地图和附近信息 可以进行微调
说明:FxOpenMapWithLatLng('114.463366','23.09824')通过传递的经纬度打开地图
参数一:经度
参数二:纬度
//FxOpenMapLatLngsuccess 选择附近信息 默认是执行的方法 使用时把doclick('1090-1',fxlatlng2,address)改为执行的服务 在使用的页面增加该JS函数 function FxOpenMapLatLngsuccess(success)
{
var a=success.LatLng
b=a.split(",")
var fxlatlng=bd_encrypt(b[1],b[0])
var fxlatlng2=fxlatlng.bd_lat+','+fxlatlng.bd_lng
//返回json数据集
// mylert(JSON.stringify(success))
var address=success.provincename+success.cityname+success.adname+success.snippet+success.title
//mylert(address) //这是高德转百度经纬度
// mylert(fxlatlng2)
doclick('1090-1',fxlatlng2,address)
}

百度地图锚点:fxbdmarkpoint

提示:如果地图上面要显示的锚点太多,那么可以先调用photo5获取当前所在城市,然后去数据库筛选当前城市需要锚点的数据
说明:fxbdmarkpoint(elid, pclassname)按经纬度在百度地图对传入的经纬度进行标注,其中我的位置锚点是可以拖动的,拖动结束后会执行fxbdmovemkgetlatlng(经度, 纬度);
参数一(elid):为需要装载地图界面的DIV的id
参数二(pclassname):参数可以传空值。input标签的class的值,界面上设置一组input标签,给他们设置同一个class值
示例:
项目定义:需要引入以下几个外部JS
http://www.feixuns.com/appjscss/Public/extjs/fxbaidumap.min.js
http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js
http://www.feixuns.com/appjscss/Public/extjs/MarkClusterer.min.js
界面部分:下图每次在加载时清空一下<div id='form82getpoint'/>的内容

<div id="form82getpoint" style="display:none;">
<!--这里面通过服务端赋值,加载N个input标签,每个标签的class值要一致-->
<input type="text" class="form82pointvalues" value="[proc@1@1]"/> </div>
<div id="allmap" style="width:100%;height:920px"></div>
<script>
//清空用来展示地图的DIV
$("#form82getpoint").html("");
//清空锚点数组
fxbdmarkarrinfo.splice(0,fxbdmarkarrinfo.length);
//设置当前地图的显示高度
var thisformheight=$("#form82").height();
$("#form82 #allmap").height(thisformheight);
//点击地图上的覆盖物时触发的事件,此方法必须自己手写
function fxbdattribute(e) {
var p = e.target;
// 其中p.id 为传入进来的单据号 ,为执行跳转传参使用
loadopeid('form83',p.id);
//如果不需要跳转页面,直接导航 那么注释掉loadopeid 执行下面的JS方法,也可以在跳转到锚点详情页面后调用下面的方法打开导航
// fxopenbaidumap(p.getPosition().lng + "," + p.getPosition().lat, p.getTitle());
}
</script>

服务端部分:
1.数据库中要返回单个字段值,字段值格式为'经度,纬度,名称,单据号'例如:112.481467,34.699836,北关村卫生室,201705161143
2.执行fxbdmarkpoint必须要放在APP锚点数据添加进入数组完毕以后

效果:

调起地图导航:FXOpenMapNav

提示:安卓和 IOS必须安装了百度地图,高德地图,腾讯地图才能调用对应导航
定位的坐标用百度定位:photo5
调用高德和腾讯地图系统会把百度坐标转成高德腾讯坐标

说明:FXOpenMapNav('114.444032','23.096015','惠州市kok体育平台下载网址软件服务有限公司')
参数一(deslatlng):目的地的经度 示例 :"114.444032"
参数二(deslatlng):目的地的纬度 示例 :"23.096015"
参数三(desname):目的地的名称 示例:"惠州市kok体育平台下载网址软件服务有限公司"
示例:<h1 onclick="FXOpenMapNav('114.444032','23.096015','惠州市kok体育平台下载网址软件服务有限公司')">导航2>

效果:

获取设备唯一号:getuuid

说明:getuuid(funstr) 获取手机的唯一设备ID
参数一:funstr获取到设备id以后需要执行的方法,这里funstr里面必须包含[val1],执行完成以后,[val1]会被替换成设备的唯一id号
示例:<a onClick="getuuid('doclick(\'9001-1\',gets(\'fuserlogin\') ,gets(\'md5fpwdlogin\'),\'[val1]\' ) ' ) ;"class="button block blue">登录</a>
示例说明:用户点击登陆按钮时,获取到设备id号,以及页面上的用户编号,密码,然后传入到9001-1服务去做数据操作

在APP中打开外部页面:opennewbrowser

说明:opennewbrowser(urlstr, pagetitle, statusbarcolor, toolbarcolor, titlecolor)
参数一【必 须】:urlstr 打开的页面的Url地址,例:http://www.feixuns.com/
参数二【非必需】:pagetitle打开页面后显示在APP头部的标题,例:kok体育平台下载网址首页
参数三【非必需】:statusbarcolor状态栏颜色
参数四【非必需】:toolbarcolor工具栏颜色
参数五【非必需】:titlecolor标题颜色
效果:点击图片放大

名片识别:cardidentification

说明:cardidentification(types, did)用来处理名片识别,在对名片拍照时,尽量保证名片充满整个取景框,保证光线充足
参数一:types填0即可
参数二:did名片拍照成功以后返回的文档编号
条件:
1.必须通过远程加载js添加名片识别的方法。如何远程加载js?
2.需要在IIS服务器的 web.config 中配置汉王名片的key(汉王地址:http://developer.hanvon.com/)
3. <add key="hanvonbcard" value="xxxx-xxx-xxxx-xxxx-xxxxx"/>中的xxxx替换为客户申请到的key
关联:如何拍照上传?
示例:
<style>
input {
color: black !important;
font-size: 14px !important;
}
<br/>` textarea {` <br/>` color: black !important;` <br/>` font-size: 14px !important;` <br/>` }` <br/>
select {
color: black !important;
font-size: 14px !important;
}
</style>
<ul class="sign" style="padding-top: 15px;">
<li style="display:none">
<input type="text" id="appcardrecimgdid" />
</li>
<li style="display:none">
<input type="text" id="appcardrecimgsrc" class="appcardrec" />
</li>
<li style="text-align: center;height: auto;" onclick="uploadfilesa('appcardrecshowid','appcardrecimgdid','doclick(\'9070-1\',\'did\')');">
<div style="text-align:center">
<!-- <img id="appcardrecshowid" src="img/11.jpg" style="max-width:50%" />-->
<img id="appcardrecshowid" style="max-width:50%" />
</div>
<div style="padding-bottom: 10px;">
<span style=" color: red;font-size: 16px;">点击拍照上传名片</span>
</div>
</li>
</ul>
<ul class="af-input-list" style="border-top:5px solid #f8f8f8">
<li>
<span class="subclass">
姓名
<i class="star">*</i>
</span>
<input type="text" value="" placeholder="请输入姓名" class="appcardrec" id="appcardrecname" required="required" />
</li>
</ul>
<ul class="af-input-list" style="border-top:5px solid #f8f8f8">
<li>
<span class="subclass">
手机
<i class="star">*</i>
</span>
<input type="text" value="" placeholder="请输入手机号码" class="appcardrec" id="appcardrecmobile" required="required" />
</li>
<li>
<span class="subclass">工作电话</span>
<input type="text" value="" placeholder="请输入工作电话" class="appcardrec" id="appcardrectel" />
</li>
<li>
<span class="subclass">工作传真</span>
<input type="text" value="" placeholder="请输入工作传真" class="appcardrec" id="appcardrecfax" />
</li>
<li>
<span class="subclass">
工作邮箱
<i class="star">*</i>
</span>
<input type="text" value="" placeholder="请输入工作邮箱" class="appcardrec" id="appcardrecemail" />
</li>
</ul>
<ul class="af-input-list" style="border-top:5px solid #f8f8f8">
<li>
<span class="subclass">
公司
<i class="star">*</i>
</span>
<textarea type="text" value="" placeholder="请输入公司名称" class="appcardrec" id="appcardreccomp" required="required"></textarea>
</li>
<li>
<span class="subclass">
部门
<i class="star">*</i>
</span>
<input type="text" value="" placeholder="请输入所在部门" class="appcardrec" id="appcardrecdept" required="required" />
</li>
</ul>
<ul class="af-input-list" style="border-top:5px solid #f8f8f8">
<li style="border-bottom:1px solid #eee">
<span class="subclass">
公司地址
<i class="star">*</i>
</span>
<textarea type="text" value="" placeholder="请输入公司地址" class="appcardrec" id="appcardrecaddr" required="required"></textarea>
</li>
</ul>
<h3 class="remark" style="padding-left:20px">
提示:带
<i style="color:red">*</i>号选项为必填项
</h3>
<div class="af-btnBox" style="border-top:5px solid #f8f8f8">
<a class="af-button" onclick=" form70subcardinfo()" class="button block blue">提交</a>
</div>
<script>
function form70subcardinfo() {
if (myjsrequired() == true) {
var form70cardimgsrc = encodeURIComponent($("#appcardrecimgsrc").val());
doclick('9070-3', $("#appcardreccomp").val(), $("#appcardrecname").val(), $("#appcardrecmobile").val(), $("#appcardrecemail").val(),$("#appcardrecaddr").val(), $("#appcardrecdept").val(), form70cardimgsrc, $("#appcardrectel").val(), $("#appcardrecfax").val())
} else {
mylert("请填写完所有*号标志的内容!")
}
}</script>
效果:点击图片放大

图片缩放

说明:用来对图片进行缩放处理
注意:需要再APP项目定义中 通过外部加载pinchzoom.js
示例:
第一步:新建一个页面比如:form65
第二步:点击图片时跳转到form65,并把要缩放的图片的did或者url地址传递到form65的服务
第三步:在form65的表单样式中录入以下代码:
<div id="viewdivimg" style="height:1920px" >
<img id="viewimg" style="width:100%"/>
</div>
<script>
//绑定图片缩放
$(function () {
$('#viewdivimg').each(function () {
new RTP.PinchZoom($(this), {});
});
})
</script>
第四步:在form65的服务中给<img id="viewimg"> 的src动态赋值 $("#viewimg").attr("src","[proc@1@1]")
其他:下载pinchzoom.js

APP推送设置

说明:用来发送消息给APP用户,可以实现用户点击推送通知后跳转到指定的页面
条件:
1.配置平台中要有相应的推送业务(业务编号:1802)
2.要推送的APP需要申请对应的极光推送KEY(如果使用智企互联,那么不需要申请)
3.需要推送的服务程序
示例:
1.找到推送程序目录下的APP推送服务.exe.config用记事本打开,配置推送服务程序:如下图

2.在APP服务端设置业务的用户登陆的服务中,当用户登陆成功后要执行以下JS注册用户ID
try{
var loginjpushuserno="用户编号";
loginjpushuserno=loginjpushuserno.toUpperCase();
var aliasuser="Fx"+loginjpushuserno;
//上面的Fx即在APP推送服务.exe.config配置中设置的PushItem设置的指,一定要一样
aliasuser=aliasuser.replace(".","_");
window.plugins.jPushPlugin.setAlias(aliasuser);
}catch(err)
{
mylert("请升级到最新版!");
}
loadurl('main')
doclick('9002')
$("#defaultNav").show()
3.打开推送程序,点击启动按钮
4.往配置平台的1802业务插入要推送的数据,需要插入的具体数据内容如下图

5.审核表单,等待推送程序推送消息

返回时提示用户是否返回:gobackprompt

说明:当用户按返回键时(包括安卓的物理返回键),弹出对话框提示用户。
示例:gobackprompt("form1","要返回吗?");或者gobackprompt("form1");
参数一:要提示是否返回的页面
参数二:非必须,可以不传,如果不传,那么将提示"确定要返回吗?"

打开海康威视监控摄像头(Android):fxhikversionopen

说明:安卓调用海康威视的摄像头,实现实时直播
注意:离开页面一定要关闭监控
示例:if(localStorage.ios==0){fxhikversionopen(ip,port,userno,password,ml,spw,sph);}
参数一:目标摄像头的IP地址
参数二:目标摄像头的服务端口号
参数三:登陆摄像头的账号
参数四:登陆摄像头的密码
参数五:使用主码流(0)还是子码流(1)解码
参数六:摄像头后台设置的视频宽
参数七:摄像头后台设置的视频高

关闭海康威视监控摄像头(Android):fxhikversionclose

说明:安卓调用海康威视的摄像头,实现实时直播
示例:if(localStorage.ios==0){fxhikversionclose()}
提示:可以写在APP表单设置表单逻辑细表,离开时触发服务中。

调用supoin(销邦)扫码枪scanbarcode2

说明:调用扫码枪进行扫码,
如果要一打开界面就能使用物理按键打开扫码枪,并获取扫码结果,那么进入页面时就要执行 该方法,并传递获取扫码结果后的操作JS字符串
注意:物理按键的扫码枪结果会调用你最后一次传递进去的JS字符串方法
参数一:扫码获取得结果之后 你要执行的JS方法,其中必须包含字符串"[val]",它将被替换成扫码枪获取的值 示例:<a onclick="scanbarcode2('alert(\'[val]\')')">扫码获取结果,并弹出显示</a>

设置开机是否自动启动智企互联setautostartapp

示例:<ul class="list chanpin" >
<li>
<span style="line-height: 40px;height: 40px;width:50%;float: left;">是否开机启动</span>
<div style="width: 50%;float: right;">
<input id="chooseautostartappflag" type="checkbox" name="chooseautostartappflag" style="display:none" class="toggle">
<label for="chooseautostartappflag" data-on="是" data-off="否" class="" onclick=" setautostartappmy()"><span class=""></span></label>
</div>
<script>
try{
//获取当前系统设置的开机启动值
setautostartapp('getflag',"if('[val]'=='on'){$('#chooseautostartappflag').attr('checked',true);}else {$('#chooseautostartappflag').attr('checked',false);}")
}catch(e)
{
console.error(e.message)
}
function setautostartappmy()
{
var val=$('#chooseautostartappflag')[0].checked;
if(val==false)
{
setautostartapp('on')
}else if(val==true)
{
setautostartapp('off')
}
}
</script>
</li></ul>

app文档上传下载查看

1.要上传文件的页面要先设置文档中心目录编号
2.执行该方法打开本地文件选择上传 该方法只有安卓
//安卓上传本地文件到服务器 ios设备不允许查看除图片视频以为的文件
示例:<li onclick="fxFileUDS()"> 文件上传 /li>
3.第一次执行下载到本地 再次执行打开查看
安卓和IOS通用
pd_document 这是文档中心表
//下载到本地查看 fxFiledownload('201802031056102313337.doc','http://feixunoa.xicp.net:10081/
appdev/FileUpload/Files/图片上传/201802031056102313337.doc','78336');
//参数1 文件名
//参数2 文件url 文档中心地址
//参数3 文件大小
function fxFiledownload(filename,fileurl,filesize){
FileUDS.downFile(filename,fileurl,filesize);
}

加载等待圈

显示加载等待圈
$.afui.showMask('正在提交,请等待');
$("#pageall #TEST").css('opacity','0.5');
$("#pageall #TEST").attr('class','panel active');
setTimeout(function(){doclick('1018-1');},300);
取消加载
$.afui.hideMask();
$("#pageall #TEST").attr('class','panel');
$("#pageall #TEST").css('opacity','1');

弹出选择

<input type="text" class="lst_item_input" placeholder="请选择" readonly="readonly" onclick="setselect(this,['商超','流通','酒行','餐饮'])"< setselect(this,['商超','流通','酒行','餐饮']) //参数1 当前input的属性
//参数2 选择的值
//获取自定义属性的值
function gettreedate(id) { var myid = document.getElementById("" + id +"") return(myid.getAttribute("data-yesno-code")); }

精臣蓝牙打印

蓝牙打印机设备 精臣B50智能便携标签打印机
http://www.jc2008.com/label/classify.html
1.jcdy-pc.exe 精臣自己的模板设计安装包
2.打印模板.wdf 测试时使用的模板
3.精臣蓝牙打印说明.docx

精臣蓝牙打印说明:点击下载

APP打印配置

由于配置iis图片相对较多,详情请看操作手册:

APP&&BS服务器打印操作手册:点击下载

APP打印程序文件包:点击下载

微信服务号推送

微信服务号推送

微信服务号推送说明:点击下载

定义查询报表

说明:用来获取管理后台中的数据,显示在APP界面中。协同平台设置->手机查询设置

主表

字段说明

1.菜单序号:在报表列表中的显示顺序
2.菜单名称:在报表列表中的显示名称
3.如果有其他字段,可以暂时忽略

列表设置

字段说明

1.序号:不重复数字
2.题头:当前报表明细的题头
3.SQL查询语句:这个只能返回一个字段值,数字或者汉字都行只要是字符串,一般用来统计数量,将会显示再题头的右侧
4.明细页sql:这里面填写具体的返回数据,可以是存储过程,有唯一个系统默认参数[@wherestr] 用来替换查询条件
5.每行列数:报表中一行显示几个字段,一般填写1到2比较合适
6.字段名宽度(%):字段名界面上显示时所占的百分比,用来控制字段名和字段值的界面占比,一般25%
7.明细每次显示条数:每次界面上显示多少条数据
示例图:

效果图:字段效果标注在效果图上

明细表设置

说明:用来设置数据返回后在界面上显示的具体设置
字段说明:
1.排序号:字段值在界面上显示的顺序
2.字段名:必须对应SQL语句返回值的字段名称,不能有错
3.字段类型:用来格式化字段在界面上的显示样式,按字段值和需求选择
4.标题:在报表显示中值对应的名称,填写中文或者英文,按需要必须填写
5.是否显示:设置该字段是否需要显示在界面上,默认(值为空时)显示
6.是否为查询条件:判断字段是在查询操作时作为条件
7.查询条件默认值:查询界面显示的默认值
8.输入框条件类型:在查询界面时,该字段输入类型是什么
9.条件输入框的值(SQL)语句:录入SQL语句返回值,用来给8使用
注:6、7、8、9要配合使用,如果有其他字段显示,请暂时忽略
示例图:

查询条件效果图:

权限设置

定义审批

HTML5常用功能

拨打电话

<a href="/appdoc_/"tel:139xxxxxxxx">一键拨打号码</a>

发送短信

<a href="/appdoc_/"sms:139xxxxxxx">一键发送短信</a>

代码编辑器使用说明

主要用来编辑APP表单设置的【表单样式】字段,APP服务端设置的【显示样式】【SQL语句】

环境部署

1.最新版本的后台文件(后台文件中包含CodeEditPlugin文件夹)
2.APP表单设置高级设置中包含C197170907092100432(调用外部程序),
   APP服务端设置高级设置中包含C197170907173342722(编辑SQL语句字段),C197170908093714373(编辑选定的显示样式)
3.电脑上安装了谷歌浏览器(Google Chrome)。
4.将Google Chrome的快捷方式复制一份,拷贝到你所使用的ERP的根目录
   如图:
   
5.找到APP服务端挂载的IIS目录,查看IIS服务器的IP地址以及APP在IIS中绑定的端口号,将其记录下来,
    拼成如下字符串http://你的IIS服务器的IP:APP后台的端口/appdev/CodeEditPlugin,示例:http://192.168.0.131:88/appdev/CodeEditPlugin
6.找到2中提到的3个高级设置,将下图的红色框框里面的部分替换上5中的内容

7.以上操作完成以后,在APP表单设置和APP服务端设置的业务界面上会出现[编辑][编辑选定的显示样式][编辑选定的SQL语句]几个按钮,
   如果没有,请自己关联高级设置或者更新脚本后恢复界面。

操作说明

1.当打开编辑器出现需要登陆时,账号密码就是APP配置平台(ERP)的账号密码
2.部署完毕之后,要使用时直接点击按钮,会打开谷歌浏览器,在编辑界面直接编辑代码即可
3.一旦通过APP配置平台打开了谷歌浏览器之后,再去点击图标打开谷歌浏览器时,可能会提示Google Chrome 未响应。是否立即重新启动?
   此时关闭你打开的所有谷歌浏览器(包括代码编辑的)然后再点击谷歌图标打开即可

注意:【编辑选定的显示样式】【编辑选定的SQL语句】这2个按钮打开的是你当前所选定的明细里面的【显示样式】或者【SQL语句】

统一设置登陆验证

重要说明:

统一设置登陆验证后 提高了安全性,如果APP中有某些页面不需要进行登陆验证(比如login页面)那么请将 APP表单设置 "需要登陆"字段设置为 未勾选状态
并将对应的服务也设置为未勾选状态

必备条件

1.APP必须更新到最新版本
2.配置平台必须更新到指定版本,判断标识:APP表单设置业务的主表 有字段 needlogin
3.APP后台必须更新到指定版本,判断标识 APP后台文件的 web.config 中 有 jwt 字段
4.数据库中必须有proc_app_userlogin_chk 存储过程,用来验证账号密码的正确性,该方法接受2个或者3个参数:(用户编号,用户密码,设备唯一号UUID),该方法必须返回2个字段
登陆成功时第一个字段必须返回数字 1

登陆验证不含手机设备ID(UUID)

一.登陆按钮统一调用fxapplogin方法。
1.fxapplogin 接受四个参数
参数一:账号密码验证成功后执行的服务,该服务可接受2个参数(用户编号,用户口令)
参数二:账号密码验证失败后执行的服务,该服务可接受2个参数(失败代码,失败原因)
参数三:页面上用户输入的账号
参数四:页面上用户输入的密码
2.示例
按钮
<a onClick=" try{ var userno=$('#fuserlogin').val();var pwd=$('#fpwdlogin').val(); fxapplogin('9001-2','9001-3',userno ,pwd)}catch(err){alert(err.message)}"
class="button block blue" style="background-color:#4292ff">登录(JWT验证)</a>

登陆验证含手机设备ID(UUID)

1.调用fxapploginwithuuid方法登陆,参数与fxapplogin 方法一致
2.示例
按钮
<a onClick=" try{ var userno=$('#fuserlogin').val();var pwd=$('#fpwdlogin').val(); fxapploginwithuuid('9001-2','9001-3',userno ,pwd)}catch(err){alert(err.message)}"
class="button block blue" style="display:block;background-color:#4292ff">登录(JWT验证附带UUID的)</a>
3.说明,调用该方法时会自动将用户手机的设备ID(UUID) 作为第3个参数传递给 proc_app_userlogin_chk 存储过程,对UUID进行操作请在存储过程中进行

平台配置中的排错

所有错误排除方法

1.所有错误排查都在谷歌浏览器核心的浏览器中进行.
2.使用www目录打开APP界面, 按F12 打开谷歌开发者工具
3.跳转导你报错的页面,查看开发者工具的Console或者是Network页签
4.找到最后一条红色的记录,双击会在新的页面中显示错误原因

界面能显示,也不报错,就是没有显示在APP表单配置中的内容

1.没有给该页面添加服务

"在位置 0 处没有任何行"的可能原因

1.在APP表单中没有建立对应的表单编号

Console界面显示500错误,或者Network打开显示"未将对象引用设置到对象的实例"

1.APP服务端的接受参数大于了页面上doclick时传递进去的参数

界面上弹出"给定关键字不在字典中。"

1.APP服务端只接受到了2个参数,但是在执行SQL语句时却有多余2个参数的[ins@param??]
2.APP服务端只接受到了2个参数,但是在执行返回JSON服务时却有多余2个参数的[ins@param??]
3.APP服务端执行SQL语句只返回了2个字段,但是在执行返回JSON服务时却有多余2字段的取值[proc@1@???]

附录

数据库中MD5加密:
@pwd 为传入的密码:例如:123456
select @pwd=substring(sys.fn_sqlvarbasetostr(HashBytes('MD5',@pwd)),3,32)
此时@pwd为123456加密后的字符串
数据库中生成新的单据号
下面代码里面的1180535是业务编号
declare @billno varchar(100)
declare @errflg varchar(100)
exec fn_pr_getNewcode 1,1180535,0,'',@billno output,@errflg output
此时@billno 就是新的单据号123123