请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
zchzch(uid:93017)
职业资格认证:FCA-FineBI | FCA-FineReport
树形结构,js实现选中效果
背景: 项目中,由A页面跳转到帆软报表页面,A页面有查询条件,需要在帆软报表页面实现自动赋值,其中包括树形结构的选中效果(包括多选,根节点的选中等)。 咨询了帆软技术给出的回复是不支持,不能实现,需要自己去实现,在论坛发帖了,给出的回复也是需要自己去实现这个需求或者用其他的控件(Ztree)。 由于帆软在初始化页面后,树形结构的数据我们可以自己获取到,有了数据,一切都是由你自己去掌控。 在研究了一段时间后,实现了一个简单的选中效果。 实现效果图: 请求链接: http://localhost:8075/WebReport/ReportServlet?reportlet=WorkBook3008.cpt&&cityids=1 86381 http://localhost:8075/WebReport/ReportServlet?reportlet=WorkBook3008.cpt&&cityids=11,13 86383 http://localhost:8075/WebReport/ReportServlet?reportlet=WorkBook3008.cpt&&cityids=111,154,162 86384 注意事项: 由于当前页面只有一个树形结构,如果存在多个的情况,代码还需要去获取对应的树形的前缀id 树形结构图: 86385 由于树形结构的id,父id 都是固定,不可能在一颗树形结构有多个相同的id 在传入参数的时候,只需要传入你当前的id就可以选中,比如1 代表总部,11 代表人力资源,111 代表部长 如果要选中所有的,直接传入参数1 ok了,如果需要选中人力资源传入11 就ok了 不需要像以前把当前id的父类id一起发送过去。 具体实现代码 :在参数初始化后: 86388 setTimeout(function(){ _g().parameterEl.name_widgets.CITYID._setItems(); var kvMap ={}; //获取属性结构的初始数据 var data = _g().parameterEl.name_widgets.CITYID.options.data.getData(); function getData(data){ for(var index=0;index0){ $("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-plus').click(); } if($("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-end-plus').length>0){ $("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-end-plus').click() ; } kvMap={id:currentData.data.id,text:currentData.data.text}; if(currentData.childrenNodes.length>0){ //递归查找 getData(currentData.childrenNodes); } //触发-选项的click事件 if($("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-minus').length>0){ $("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-minus').click() } if($("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-end-minus').length>0){ $("#"+tmpid+'_'+currentData.data.id).find('.fr-tree-elbow-end-minus').click(); } } } getData(data); $("li").css({display:'block'}); //对传入的参数(树形结构中的其中一个节点或者多个节点,以逗号分割)进行点击事件 if(cityid!=null && cityid!=''){ var cityids = cityid.split(','); for(var i=0;i
session 存储的内容未实现序列化接口 在redis作为sessioni存储时bug
在进行sping boot集成时候,session的管理帆软是运用的内置的,由于本系统是通过redis来管理session的,redis会有序列化和反序列化的操作,所以保存在session中的信息必须要实现系列和接口,在我项目实施过程中,发现对单元格添加超链接的地方会有一次session信息的获取,但是这个类没有实现序列化接口,导致系统有误。 具体代码如下:需要序列化的类 NoCheckHyperLinkSessionAttribute CompareUserNameAndHyperlink protected PrivilegeVote isHyperLinkNoCheck(HttpServletRequest paramHttpServletRequest, FSAuthentication paramFSAuthentication) { String str1 = NetworkHelper.getHTTPRequestParameter(paramHttpServletRequest, "reportlet"); if (str1 == null) str1 = NetworkHelper.getHTTPRequestParameter(paramHttpServletRequest, "formlet"); HttpSession localHttpSession = paramHttpServletRequest.getSession(true); //从session中获取超链接的验证信息 NoCheckHyperLinkSessionAttribute 类和其内部类CompareUserNameAndHyperlink 都未实现Serializable接口,忘在后续的版本中检查session存储所涉及到的对象是否都实现了序列化接口 NoCheckHyperLinkSessionAttribute localNoCheckHyperLinkSessionAttribute = (NoCheckHyperLinkSessionAttribute)localHttpSession.getAttribute("fr_nocheck_hyperlinkinfo"); if ((localNoCheckHyperLinkSessionAttribute != null) && (localNoCheckHyperLinkSessionAttribute.isOneOfTheHyperlinks(str1))) { String str2 = (String)localHttpSession.getAttribute("fr_username"); String str3 = NetworkHelper.getHTTPRequestParameter(paramHttpServletRequest, "op"); long l = localNoCheckHyperLinkSessionAttribute.checkAlive(str2, str3, str1); if (l > 0L) { if (System.currentTimeMillis() - l <= getTimeout()) return PrivilegeVoteImpls.SUCCESS; return PrivilegeVoteImpls.MP_AUTH_TIMEOUT; } } if (paramFSAuthentication != null) return PrivilegeVoteImpls.MP_ROLE_ERROR; return PrivilegeVoteImpls.MP_AUTH_ERROR; }
所有下拉框 默认选中第一个
背景: 由于下拉框的选项很多,有很多需求是类似默认选中下拉框的第一个值或者以下拉框第一个值作为查询条件, 在论坛看到多是通过sql去给控件绑定值: 缺点: 1 需要多查询数据库 2 不通用,如果对于有很多下拉框的选项那是需要些很多sql的 so 我们需要能够通过js去实现默认的点击效果和选中效果,简化用户的操作。 解决方案: 在我上一篇 所有控件 绑定点击事件显示下拉 时间 树形 多选框等 的基础上进行扩展: http://bbs.fanruan.com/thread-96375-1-1.html 在参数初始化完成之前,页面是不会进行查询操作的,所以我们需要在这个阶段进行绑定,在这个阶段所有的参数控件默认已经初始化完成,默认值已经存在了 下拉框的初始化是异步加载的,需要我们在点击的时候(只有第一次)才会去加载数据,为了完成初始化数据,需要我们自己在参数加载完成后的事件中添加一个主动触发的事件, 主动触发事件后,所有下拉框的数据已经加载完毕了,这时候我们就可以触发下拉框的默认的第一个选项的点击事件。 注意:如果是通过js默认选中的第一个那么下拉框的值是不会作为查询条件的(自动查询,这里的自动查询是指如下设置的,后期会提供具体的解决这类问题的方案,敬请期待!) 78420 所以请注意使用场景,如果要支持自动查询(指通过脚本去主动触发的查询_g().parameterCommit();)这里的参数是支持的 部分js代码说明如下: $.each(this.options.form.name_widgets,function(i,item){ if (item.options.type !=='label' && (item.options.type==='combo')) { //设置点击事件 var self = item; self.options.name4Empty = "全部选择" ;//下拉框替换默认的 不选 self._createVieList(false); //不显示加载选项,如果不设置为false在进入页面的时候会看到有一个加载的框,自己可以尝试。 setTimeout(function(){ //默认选中第一个,触发 self.$view.find("div").eq(0).click(); },0) $('input',item.element).click(function(){ if(self.$view.css('display')=='none'){ self.onTriggerClick(); } }); } }); //自动查询,替换默认的自动查询 setTimeout(function(){ _g().parameterCommit(); },50); 效果图: 78423 具体参照:附件cpt文件。 另:论坛中有一个需求描述的是一个数据集,需要分两个柱形图显示,在cpt中有具体的解决方案 只要能把数据梳理清楚,凡是业务方面认为能行的,基本上都可以实现。 柱状图分页显示问题 http://bbs.fanruan.com/thread-96410-1-1.html 路漫漫其修远兮,吾将上下而求索! 编辑于 2017-9-19 10:19
所有控件 绑定点击事件显示下拉 时间 树形 多选框等
背景: 由于项目中有很多的下拉控件,日期控件,树形控件,多选控件等,在论坛中发现解决方案都是对每一个控件进行单独的事件绑定,如果存在太多这样的控件 每次都设置的话会导致很多重复的工作,so 我们需要一次对所有这样的控件进行一次绑定即可: 实现原理: 在表单初始化完成后,进行参数绑定事件 eg: 78295 事件如下: 78296 由于本项目的集成是用ifream集成,因此调用的是父窗口的函数 window.parent.initParam(this); 如果不用ifream 可以自定义js文件,然后引入到当前的报表页面: 推荐:把js引入到当前的报表页面,原因:可能当前的报表以后会被其他的报表引用,这样就会出现找不到window.parent.initParam 函数的形式 initParam 函数如下: //自定义初始化控件后点击文本框会弹出对应的显示框 function initParam(obj){ $.each(obj.options.form.name_widgets,function(i,item){ //如果是标签控件不做处理,如果是时间类型,下拉类型,多选框,树形结构就设置点击当前的文本框事件 if (item.options.type !=='label' && (item.options.type==='combo' || item.options.type==='datetime' || item.options.type === 'tagcombocheckbox'|| item.options.type === 'treecombobox')) { //设置点击事件 var self = item; self.options.name4Empty = "全部选择" ;//下拉框替换默认的 不选 $('input',item.element).click(function(){ if(self.$view.css('display')=='none'){ self.onTriggerClick(); } }); } }); } 对于表单页面还需要设置body加载完成后的事件,因为body中也可能有下拉框等这样的控件 表单页面的组成部分: 78297 选中后选择事件 78298 然后把上面的js放进去即可。 最后效果: 78299 编辑于 2017-9-15 16:54 编辑于 2017-9-15 16:55
表单控件 根据条件查询
控件中的自动查询还可以通过设置数据集的过滤来实现, 根据数据集过滤来实现,参数变化的时候,每次查询的结果集都是所有的,然后在页面进行过滤,如果数据量比较大,会消耗性能,解决方案:在查询条件中(sql 查询条件)也添加上这个需要过滤的条件,同时添加数据集过滤条件,这样就可以实现文本框输入结束后的自动查询,查询的数据是根据自己的条件去过滤数据集 77820 自定义实现方式: 点击查询按钮,能够根据body中的查询条件,动态刷新报表页面的显示: 77809 控件中下拉框可以实现自动查询的功能,但文本框的点击事件不生效(如果不设置数据集过滤),因此输入文本框的内容后,点击查询按钮根据参数去查询数据,查询的数据是基于当前控件的参数去查询的,数据量是自己库中对应的数据 下面实现的主要是自定义的查询功能实现,不涉及到数据集的过滤(会重新查询一次数据库,根据当前的条件) 实现效果: 给button 添加一个点击事件: 77810 对应的js代码如下: var form = this.options.form; form.getWidgetByName('report0').gotoPage(1,form.collectionValue(),true); //其中report0 代表需要刷新的报表页面(具体名称根据当前的设计页面来决定) 77811 编辑于 2017-9-12 15:22 编辑于 2017-9-12 15:23 编辑于 2017-9-12 15:31 编辑于 2017-9-12 15:38
下拉框不选放在第一位
给下拉控件添加初始化后事件: 77438 77720 执行后的效果如下: 77437 注意事项: 由于需要修改重写帆软内部的定义的方法,存在一定的风险(帆软后期的版本如果升级去掉了对应的函数,或者修改了函数方法名等都会导致js有问题) 附: 帆软版本: 77439 编辑于 2017-9-8 16:36 编辑于 2017-9-11 17:52 编辑于 2017-9-11 17:54
个人成就
内容被浏览65,803
加入社区7年95天
返回顶部