代码拉取完成,页面将自动刷新
该项目起源于公司内部的需求,本人在司维护开发的项目具有大量相似的报表页面,而最近又接到三个雷同页面,该项目应运而生。
项目在电脑端,遂工具制作成了拖动完成排版的形式,方便可爱的运维小姐姐操作。
推荐使用 chrome
浏览器食用更佳。
gif 图稍大,若加载不出来请稍等片刻 (..•˘_˘•..)
在拖动页面实际拖动的就是一个拥有背景的 div
,在预览页面才会生成其对应的组件。
项目主要由两个页面构成,第一个页面主要为拖动编辑排版,第二个页面为预览编辑的页面。
echarts
百度可视化图表库element-ui
饿了么组件库ramda
函数式编程顶好的库之一jspdf
结合 html2canvas
实现 pdf 导出功能html2canvas
结合 jspdf
实现 pdf 导出功能lodash
暂且只使用了 debounce 函数mockjs
前端随机数据生成工具通识
row
)组成,每一行又由列又称组件(col
)组成row
栅格化,可以理解成 24
个块,组合可以随意,12 + 12
、16 + 8
等,但其实 8 + 8
也可,行内排序改为两侧留白或者两侧对齐即可row
间可以进行拖动更改位置,col
间可以进行拖动更改位置v-if
和 v-show
的区别,在于是否会销毁某标签,使用 v-show
可以保存组件更改使用的 API
说明
draggable: true
标识该标签内容是否可被拖动dragstart
某一可拖动组件被拖动时,该事件会触发drop
当某一可拖动组件被拖动至某一标签上时,该事件会被触发dragover
由于拖动需要阻止事件的默认事件,遂一般会配合 drop
食用行 --- 添加、修改、删除
+
,拖动某一行排序至中间的行即可remove
即可列 --- 添加、修改、删除
+
,拖动某一组件至中间的位置即可remove
即可通识
使用的 API
说明
<component is='component-title'/>
Vue
动态组件
组件集(src\components\custom-report
)
custom-report-
前缀的 vue
文件都会被自动引入到预览页面成为一个可供使用的组件default-
的组件需要手动引入
echarts
组件,在同级目录下的 mixins
中有定义其需要混入的方法element-table
组件,接受一个 table-option
来定义表格的表头和 key
内容,由于该类型页面多为展示,遂该组件没有监听事件,若需要监听多个 element-table
的事件也简单,element-table
加上 v-on="$listeners"
即可echarts
组件简单说明
echarts
在 src\prototype
中被挂载到 Vue
的实例原型上方便调用setOption
defaultOption
设置默认 option
(在该目录下的 js\chart-variable
),同时想要修改图表颜色集也可以在这里修改customOption
某些页面的图表使用默认的 option
会导致样式错位,这时候就需要增加 js\variable
变量,用于设置一些特殊的排版,比如 center: [50%, 50%]
,等reportData
,这个时候才是真实数据应该渲染的时候,建议在此处不要修改 echarts
样式相关的内容,而是只注入 data
这里会详细说一下数据格式,具体可以参阅(src\mock\modules\variable
)文件。
{
// 表格 title
title: 'drag-report',
// 表格标识 key 通常唯一
reportKey: 'first-report',
// 行数据
children: [{
// 行的水平排序方式
align: 'flex-start',
// 行高,暂时只有 250 和 100 两种
height: 250,
// 行 index 用于排序
index: 1,
// 行内组件数据
children: [{
// 组件标题
title: '评分图',
// 组件行占比
col: 24,
// 组件 key 用于查询组件
componentKey: 15,
// 推荐行占比
initCol: 24
}]
}]
}
{
// 组建默认名
label: '占位',
// 组件 key 通常唯一
componentKey: 1,
// 该组件对应的 vue 组件名称,在动态组件渲染的时候会自动加上 custom-report- 前缀
componentName: 'block-module',
// 该组件对应的接口,接口相同也没事,相同的请求不会发起两次
api: '',
// 该接口的类型
method: 'get',
// 返回的数据中,需要的那个数据的 key,若为空组件内会直接接受全量数据
// 比如返回的 responseData 为 { names: [{name: 'king'}, {name: 'kimi'}] }
// dataKey 就可以设置为 name,所对应的 vue 组件的 prop reportData 就会接受到 name 的数据
dataKey: '',
// 组件的行占比
col: 1,
// 组件的高度,暂时没用,可用于筛选
height: 250,
// 组件的预览图,用于拖动页面显示
previewImage: 'https://i.loli.net/2019/03/11/5c8663be38f28.png'
}
clickoutside
来自于 element-ui
的源码,用于判断用户是否点击某一元素。
本来的想法是一个组件对应一个接口,现在对相同接口的组件进行了优化,如果接口相同则只会调用一遍接口。
pdf
导出的样式有点丑,后面稍微改一下drag
改为 mousedown
等,进行低版本浏览器的兼容mockjs
用以模拟 ajax
请求,引入到正式项目中的时候可以减少更改sass
的存在,让我减少了不少工作量,但是不能否认的是项目中还是有许多辣鸡代码(何谓辣鸡代码,就是让我看一遍也会想拍死作者,即使是自己写的),还是需要做优化Vue
的 component
组件,所以实现起来也不是什么难事,关键点在于每个组件对外接收的 prop
要做到统一,这不仅是为了方便,任何一个框架都需要有人来维护,这也是为了减少后面接手的人的理解成本webpack
的 require.context
这个令人着迷的 API
,那还能忍?盘他,于是,就有了 src\views\previewReport\index.js
这个文件的诞生,只要组件命名规范(前缀 custom-report-
),该文件就会自动引入该组件,方便省心,比充 X 娃娃还好使pdf
导出的功能,遂查阅相关资料做了一个 pdf
导出的功能,前端实现 pdf
导出功能的思想就是通过遍历 dom
来生成 canvas
,然后又借助于 canvas
的 API
获取图片的 base64
码,最后通过 jspdf
生成 pdf
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。