123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <template>
- <div class="layout">
- <div class="layout-container">
- <!-- 左侧菜单 -->
- <left-menu
- :layerWidget="layerWidget"
- :widgetTools="widgetTools"
- :widgetIndex="widgetIndex"
- @widgetOnDragged="widgetOnDragged"
- @layerClick="layerClick"
- />
- <div
- class="layout-middle"
- :style="{
- width: middleWidth + 'px',
- height: middleHeight + 'px'
- }"
- >
- <!-- 顶部按钮 -->
- <top-bar
- :dashboard="dashboard"
- :widgets="widgets"
- @refresh="initEchartData"
- />
- <!-- 设计器 -->
- <middleScreen
- ref="middleScreen"
- :middleWidth="middleWidth"
- :middleHeight="middleHeight"
- :dashboard="dashboard"
- :widgets="widgets"
- @change="changeOptions"
- />
- </div>
- <!-- 右侧配置 -->
- <right-config
- :widgetOptions="widgetOptions"
- @widgetValueChanged="widgetValueChanged"
- />
- </div>
- </div>
- </template>
- <script>
- import { detailDashboard, importDashboard } from "@/api/bigscreen";
- import {
- swapArr,
- setDefaultValue,
- handleDefaultValue,
- getPXUnderScale,
- handleInitEchartsData,
- handleBigScreen,
- handlerLayerWidget
- } from "./util/screen";
- import { widgetTools, getToolByCode } from "./config/index.js";
- import leftMenu from "./layout/leftMenu.vue";
- import topBar from "./layout/topBar.vue";
- import middleScreen from "./layout/middleScreen.vue";
- import rightConfig from "./layout/rightConfig.vue";
- export default {
- components: {
- leftMenu,
- topBar,
- middleScreen,
- rightConfig
- },
- data() {
- return {
- // 左侧菜单
- layerWidget: [],
- widgetTools: widgetTools,
- widgetIndex: 0,
- // 顶部按钮
- // 中间大屏
- grade: false,
- // 工作台大屏画布,保存到表gaea_report_dashboard中
- dashboard: {
- id: null,
- title: "", // 大屏页面标题
- width: 1920, // 大屏设计宽度
- height: 1080, // 大屏设计高度
- backgroundColor: "", // 大屏背景色
- backgroundImage: "", // 大屏背景图片
- refreshSeconds: null // 大屏刷新时间间隔
- },
- // 右侧配置
- widthLeftForTools: 200, // 左侧工具栏宽度
- widthRightForOptions: 300, // 右侧属性配置区
- // 大屏的标记
- screenCode: "",
- // 大屏画布中的组件
- widgets: [
- {
- // type和value最终存到数据库中去,保存到gaea_report_dashboard_widget中
- type: "widget-text",
- value: {
- setup: {},
- data: {},
- position: {
- width: 100,
- height: 100,
- left: 0,
- top: 0,
- zIndex: 0
- }
- },
- // options属性是从工具栏中拿到的tools中拿到
- options: []
- }
- ], // 工作区中拖放的组件
- // 当前激活组件右侧配置属性
- widgetOptions: {
- setup: [],
- data: [],
- position: []
- }
- };
- },
- watch: {
- widgets: {
- handler(val) {
- this.layerWidget = handlerLayerWidget(val, getToolByCode);
- },
- deep: true
- }
- },
- computed: {
- // 中间设计器的宽度
- middleWidth() {
- return (
- this.bodyWidth - this.widthLeftForTools - this.widthRightForOptions
- );
- },
- // 中间设计器的高度
- middleHeight() {
- return this.bodyHeight;
- }
- },
- mounted() {
- this.widgets = [];
- window.addEventListener("mouseup", () => {
- this.grade = false;
- });
- this.initEchartData();
- },
- methods: {
- // 初始化 echrats
- async initEchartData() {
- const reportCode = this.$route.query.reportCode;
- const { code, data } = await detailDashboard(reportCode);
- if (code != 200) return;
- const processData = handleInitEchartsData(data, getToolByCode);
- const screenData = handleBigScreen(
- data.dashboard,
- getToolByCode,
- this.setOptionsOnClickScreen
- );
- this.widgets = processData;
- this.dashboard = screenData;
- this.bigscreenWidth = this.dashboard.width;
- this.bigscreenHeight = this.dashboard.height;
- },
- // 拖动一个组件放到工作区中去,在拖动结束时,放到工作区对应的坐标点上去
- widgetOnDragged(evt, widgetCode) {
- let widgetType = widgetCode;
- // 获取结束坐标和列名
- let eventX = evt.originalEvent.clientX; // 结束在屏幕的x坐标
- let eventY = evt.originalEvent.clientY; // 结束在屏幕的y坐标
- let workbenchPosition = this.getDomTopLeftById("workbench");
- let widgetTopInWorkbench = eventY - workbenchPosition.top;
- let widgetLeftInWorkbench = eventX - workbenchPosition.left;
- // 计算在缩放模式下的x y
- let x = widgetLeftInWorkbench / this.bigscreenScaleInWorkbench;
- let y = widgetTopInWorkbench / this.bigscreenScaleInWorkbench;
- // 复制一个组件
- let tool = getToolByCode(widgetType);
- let widgetJson = {
- type: widgetType,
- value: {
- setup: {},
- data: {},
- position: {
- width: 0,
- height: 0,
- left: 0,
- top: 0,
- zIndex: 0
- }
- },
- options: tool.options
- };
- // 处理默认值
- const widgetJsonValue = handleDefaultValue(widgetJson);
- // 将选中的复制组件,放到工作区中去
- this.widgets.push(this.deepClone(widgetJsonValue));
- // 激活新组件的配置属性
- this.$refs.middleScreen.setOptionsOnClickWidget(this.widgets.length - 1);
- },
- layerClick(index) {
- this.widgetIndex = index;
- this.$refs.middleScreen.widgetsClick(index);
- },
- // 将当前选中的组件,右侧属性值更新
- widgetValueChanged(key, val) {
- if (this.screenCode == "screen") {
- let newSetup = new Array();
- this.dashboard = this.deepClone(val);
- if (this.bigscreenWidth != this.dashboard.width) {
- this.bigscreenWidth = this.dashboard.width;
- }
- if (this.bigscreenHeight != this.dashboard.height) {
- this.bigscreenHeight = this.dashboard.height;
- }
- this.widgetOptions.setup.forEach(el => {
- if (el.name == "width") {
- el.value = this.bigscreenWidth;
- } else if (el.name == "height") {
- el.value = this.bigscreenHeight;
- }
- newSetup.push(el);
- });
- this.widgetOptions.setup = newSetup;
- } else {
- for (let i = 0; i < this.widgets.length; i++) {
- if (this.widgetIndex == i) {
- this.widgets[i].value[key] = this.deepClone(val);
- setDefaultValue(this.widgets[i].options[key], val);
- }
- }
- }
- },
- changeOptions(widgetOptions) {
- this.widgetOptions = widgetOptions;
- },
- datadragEnd(evt) {
- evt.preventDefault();
- this.widgets = swapArr(this.widgets, evt.oldIndex, evt.newIndex);
- }
- }
- };
- </script>
- <style lang="scss">
- @import "../../assets/styles/screenDesigner.scss";
- </style>
|