Open xinglie opened 3 years ago
在入口文件,如index.html
中,启动设计器的入口配置相应的接口地址
designer.setup({
getImageUrl:'./apis/images.json',
getFieldUrl:'./apis/fields.json',
getTemplateUrl:'./apis/example.json'
});
可到apis
目录自行查看相应的接口数据:https://github.com/xinglie/report-designer/tree/master/apis
/**
* 设计器支持的初始化对象
*/
interface DesignerOptions {
/**
* 站点名称,需要授权
*/
siteName?: string
/**
* 站点logo,需要授权
*/
siteLogo?: string
/**
* 主题色配置,需要授权
*/
themeBrand?: string
/**
* 主题反差色配置,需要授权
*/
themeContrast?: string
/**
* 版权信息,支持html,需要授权
*/
copyright?: string
/**
* 版本号,哪天打包的代码
*/
version?: string
/**
* 使用哪个view做为入口
*/
use?: string,
/**
* 应用根节点id
*/
rootId?: string,
/**
* 是否mini模式
*/
mini?: boolean
/**
* 拆分模式
*/
split?: boolean
/**
* 元素插件集合
*/
plugins?: string[]
/**
* 面板配置
*/
panels?: Report.OuterPanelsConfig
/**
* 工具栏控制
*/
toolbar?: Report.OuterViewConfig
/**
* 头部控制
*/
header?: Report.OuterViewConfig
/**
* 第三方地址配置
*/
providers?: Report.ProviderURLConfig
/**
* 预览页url
*/
viewerUrl?: string
/**
* 设计器自己的服务地址,打印页面使用
*/
rdsUrl?: string
/**
* 图片源接口地址
*/
getImageUrl?: string
/**
* 自定义字体接口地址
*/
getFontFaceUrl?: string
/**
* 数据源接口地址
*/
getFieldUrl?: string
/**
* 示例接口
*/
getTemplateUrl?: string
/**
* 获取示例内容接口
*/
getTemplateContentUrl?: string
/**
* 保存内容接口
*/
saveContentUrl?: string
/**
* 获取内容接口
*/
getContentUrl?: string
/**
* 图片上传接口
*/
imageUploadUrl?: string
/**
* 错误上报接口
*/
errorReportUrl?: string
/**
* 预设内容接口,进入设计器后,可通过该接口返回随机内容,填充设计区
*/
presetUrl?: string
/**
* 保存主题接口
*/
saveThemeUrl?: string
/**
* 解析绑定元素的url请求地址
*/
getBindUrl?: (bind: object) => string
/**
* 拦截所有接口请求,如果提供该配置则要在该配置内完成相应的接口请求
* @param url 请求地址
* @param options 请求配置信息
*/
io?:(url,options)=>object
/**
* 对接口响应内容做处理。该配置仅在你的接口无法返回{"data":object,"success":boolean,"message":string}这种格式时,
* 使用该配置来适配。通过该函数返回{"data":object,"success":boolean,"message":string}的数据结构
* 来让你现在的接口和设计器都无需修改代码即可配合工作
* @param response 响应数据
* @param url 哪个接口
* @returns 返回{"data":object,"success":boolean,"message":string}的结构对象
*/
response?: (response, url) => { success: boolean, data?: object, message?: string }
/**
* 对接口请求参数做处理
* @param request 请求对象
* @param url 哪个接口
* @returns 返回{ options, body, query }结构的数据
*/
request?: (request, url) => ({ options, body, query })
}
在入口文件,如index.html
中,启动设计器的入口配置相应的接口地址
designer.setup({
getImageUrl:'./apis/images.json',//图片库接口
getFieldUrl:'./apis/fields.json',//数据源接口
getTemplateUrl:'./apis/example.json',//获取模板接口
saveContentUrl:'./apis/save.json',//保存内容接口
getContentUrl:'./apis/getcontent.json',//获取内容接口
presetUrl:'.apis/content.json',//预设内容接口
});
当保存内容时,以post
的形式向saveContentUrl
提交数据,保存key
为stage
,保存的内容是JSON字符串
当需要编辑时,进入设计器页面时,需要自己处理相应的参数,并传给getContentUrl
配置的接口。可按提供的index.html
进行处理,
如果是以新建的模式进入设计器时,此时反复保存,后端是否会反复创建新的数据?
这里建议进入设计器时,始终携带一个类似id
的标识,把该标识传给getContentUrl
配置的接口。
后端根据数据库里是否有类似该id
的标识决定是否新建还是修改。
设计器保存时提交什么数据,则编辑时返回什么样的数据
以上接口配置与未配置界面上展示会不一样。
如果未配置getImageUrl
则所有与选择图片相关的均自动隐藏不展示
如果未配置getFieldUrl
则与数据绑定的相关操作自动隐藏不展示
如果未配置getTemplateUrl
则右上角模板功能自动隐藏
如果未配置saveContentUrl
则点保存的时候,展示保存内容对话框,如果配置,则直接保存,不出对话框。
可视化编辑器,designer
除了提供setup
安装,和destroy
销毁外,还提供get():Promise<string>
获取内容以及set(content:string|JSONObject)
设置内容。
您也可以不使用上述内置的接口,自己通过set
或get
方法在外部进行设置和获取设计器的内容
可视化编辑器自带的打印预览页面viewer.js
提供getHTML
等常用方法,请参考:https://github.com/xinglie/report-designer/issues/38
项目中元素与接口绑定后,会统一走数据中心模块(tmpl/provider/datacenter.ts)进行请求。
即上图中的文本、图片等会通过datacenter
拿到绑定的数据。因此可以在datacenter
中进行再次组织,比如转换接口的请求地址,向多个接口请求获取数据等(其中后文提到的getBindUrl
函数调用就是在这里进行处理的)
而report-designer
项目中所有跟接口有关的请求均会走(tmpl/designer/service.ts),您可以在该处进行统一的请求处理,比如添加统一的参数或对返回的数据结构进行预处理等。
假如进入设计器时url
带上了其它参数,如http://localhost/report-designer/index.html?id=x&from=y&source=z
有时候我们想把地址栏中的其它参数如from
继续透传给设计器中其它如数据源或图片源等接口,我们可以这样做:
因为数据源或图片源接口地址均是配置化的,我们只需要在初始化的时候,从地址栏获取参数,并透传给配置接口即可,示例如下
<script type="module">
let parsedUrl = new URL(location.href);
let from = parsedUrl.searchParams.get('from');
let postfix = from ? `?from=${from}` : '';
designer.setup({
//以下是相关配置接口,如果地址栏有from参数,拼接上即可
getImageUrl: './apis/images.json' + postfix,
getFieldUrl: './apis/fields.json' + postfix,
getTemplateUrl: './apis/example.json' + postfix,
saveContentUrl: './apis/save.json' + postfix,
getContentUrl: './apis/content.json' + postfix,
imageUploadUrl: './apis/save-image.json' + postfix,
});
</script>
打开设计器带的参数,在设计器里面调用预览页面时,参数会自动透传给预览页面(需授权),独立使用预览页面需要自己处理(无须授权)
部分元素如文本提供和数据源进行绑定,绑定对象如下。
{
//...以下是存储绑定的数据源和对应字段的对象
bind: {
tag: 'user.info',//数据源请求标识符
id: 'source1',//唯一id
fields: []//绑定了哪些字段
},
}
在打印页面,如果需要根据bind
对象来决定如何请求具体的接口地址,则可以使用配置getBindUrl
进行配置,示例如下
<script>
viewer.setup({
rdsUrl: '//localhost:9988/',
getBindUrl(bind) {
if(bind.tag=='user.info'){
return 'apis/person.json?bindId='+bind.id;
}
return 'apis/default.json?bindId='+bind.id;
},
});
</script>
getBindUrl
回调参数bind
即是元素的bind
对象,所以在绑定时,可以把url
设置为一个标识,只要在这个getBindUrl
方法中,根据bind
对象中的tag
或id
返回真实的数据请求地址即可。
这样我们就可以在设计阶段只存放绑定标识,而在打印页面通过getBindUrl
给出最终的请求地址。
当然,如果打印页面这种绑定数据的接口也需要地址栏中的参数,只需要像设计页面那样处理即可,示例如下
<script>
let parsedUrl = new URL(location.href);
let from = parsedUrl.searchParams.get('from');
let postfix = from ? `&from=${from}` : '';
viewer.setup({
rdsUrl: '//localhost:9988/',
getBindUrl(bind) {
return bind.url + '?bindId=' + bind.id + postfix;
},
});
</script>
以下配置需源码或定制授权
number 历史记录最大值,多出的历史记录会删除。
number 相同类型的历史记录间断多少毫秒后记录,比如通过键盘移动元素,并非每次移动均记录,只有松开按键超过配置的ms后才记录
boolean true 进入设计器在配置模板的情况下,是否随机显示一个示例,未授权则处于打开状态
boolean true 是否展示相关的帮助链接,未授权则处于打开状态
boolean true 保存菜单是否支持从本机保存和读取文件,未授权则处于打开状态
boolean true 保存菜单是否支持显示设计区内容,未授权则处于打开状态
boolean true 能否使用快捷键对话框和帮助链接
boolean 是否支持主题功能
boolean 是否支持标尺的辅助线功能
boolean true 使用剪切时,每次剪切、粘贴完成后,是否清除剪切板中的复制元素
number 1 默认编辑区的缩放,配置的数值为0.5-4之间(包含),且为0.5的倍数
array 设计区外围灰色区域,上、右、下、左,px单位
boolean 设计区是否自动滚动到页面中间
boolean 换示例或加载内容时,是否自动计算缩放比例
boolean 是否支持按下ctrl+鼠标滚轮缩放设计区
boolean 是否拦截设计区wheel事件
number 默认编辑区的宽度,px单位
number 默认编辑区的高度,px单位
number 最大宽度,px单位
number 最大高度,px单位
number 最小宽度,px单位
number 最小高度,px单位
number 拖动时,四边边框响应贴边滚动的尺寸,px单位
number 拖动时,自动滚动步辐,px单位
boolean true 是否启用拖动对齐功能
boolean true 拖动多个元素时,非鼠标下的元素是否启用跟随吸附对齐
number 拖动元素吸附对齐时,哪些点参与对齐
boolean 是否开启svg点对齐
boolean 是否开启svg自身点对齐
boolean false 右键粘贴时,是否强制粘贴的位置和鼠标复制时的位置一致
number 网格宽,像素单位
number 网格高,像素单位
number 网格最大宽,像素单位
number 网格最大高,像素单位
number 网格最小宽,像素单位
number 网格最小高,像素单位
number 通过按下ctrl加鼠标滚轮缩放设计区时延迟时间,越小越灵敏
number 标尺尺寸,即宽和高,px单位
boolean true 标尺上是否显示选中元素的投影
number 最大缩放值
number 最小缩放值
number 每次缩放步长
number 快速发大步长
number 较慢缩小步长
boolean 是否支持设计区快照
boolean false 保存菜单是否展示自动保存
number 自动保存时,多少时间内的保存忽略,避免频繁保存
boolean false 预览时,是否新开浏览器tab页展示打印页面
number 使用键盘每次移动的距离,px单位
number 按下shift时,每次移动的距离,px单位
number 使用键盘旋转角度,每次旋转多少
number 按下shift时,每次旋转角度
number 拖动时,距离其它元素的吸附线小于该值时,则进行吸附,px单位
number 拖动旋转时,在多少倍数附近进行吸附
number 拖动旋转,在倍数角度附近多少时,自动调整到倍数的角度上
boolean true 是否支持只读元素,如果对性能有要求且不需要只读元素,则可以关闭该项
boolean true 面板是否支持贴边隐藏
number 元素粘贴,同位置时偏移量,防止重叠在一起,px单位
number 元素对齐时最小尺寸,比如宽度小于配置项时,则只进行左侧对齐
number 元素双击间隔毫秒时间
boolean false 属性面板是否对属性进行分组展示
boolean true 组件树面板是否展示icon
number 小于多少像素时元素自动展示icon
boolean 设计元素普通状态下是否展示边框线
number svg修改点最小比率
number svg修改点最大比率
number svg修改点步长
number svg修改点按下shift的步长
number svg修改点小数位
array 字体设置项集合
string 默认字体
array 边框设置项集合
string 设计器默认使用的单位
boolean 是否支持转换成其它单位
假设您现在使用的接口返回如下的格式
{
"data":"array | object",
"info": {
"ok": true,
"message":""
}
}
可使用前面提到的response
在初始化时,做如下适配
designer.setup({
//...其它初始化配置项
response(response, url) {
console.log('current url', url, 'current response', response);
return {
success: response.info.ok,
message: response.info.message,
data: response.data
};
}
});
接口统一格式
项目中所有用到的接口均按以下统一格式返回
全部数据源接口
该接口返回后端都有哪些数据接口可供使用,可查看当前项目中使用的一份写死的格式:https://github.com/xinglie/report-designer/blob/master/apis/fields.json
说明一下data中的格式
如上述示例中的”地区测试“数据源,需要配合相应的”地区测试“这个数据接口来看:https://github.com/xinglie/report-designer/blob/master/apis/area.json
其中最关键的是”fields“这个对象,该对象需要列出 https://github.com/xinglie/report-designer/blob/master/apis/area.json 接口中可供使用的字段集合,这是绑定数据源的关键。
点击这里查看如何通过
tag
或id
在打印或预览时转换成真实的url元素绑定数据源
元素在绑定时,内部会记录相应的接口地址或标识以及绑定的字段,在展示或打印时,由展示或打印页面根据元素绑定的接口,把数据设置到绑定信息上,而元素仅根据绑定的字段key把相应的数据取出来展示
自动分页
根据可设计元素的不同,需要绑定的数据源是数组还是对象也不同。比如“数据”元素分组下的列表格、数据表格等要求数组。文本、图片等要求返回单个对象,即使返回数组也只会使用第一个。
更多规则
以上是个人根据以往的经验总结的格式,非必须按照执行的最终格式。包括元素绑定数据源时,到底使用对象还是数组,并非最终定论,可根据具体需求调整。