Commit 6a0b895bba10d3bb532be30ecd3ac8c06741cabc

Authored by qianbao
1 parent cb49f9fc

1、添加动态图片组件 线性添加是否从0开始功能

src/views/bigscreenDesigner/designer/components/dynamicAddPicAdress.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-button
  4 + type="primary"
  5 + size="small"
  6 + icon="el-icon-plus"
  7 + plain
  8 + @click="handleAddClick"
  9 + >新增</el-button
  10 + >
  11 + <el-table :data="formData" style="width: 100%">
  12 + <el-table-column prop="name" label="名称" width="130" />
  13 + <el-table-column prop="key" label="判断值" width="70" />
  14 + <el-table-column label="操作" width="100">
  15 + <template slot-scope="scope">
  16 + <div class="button-group">
  17 + <el-button
  18 + @click="handleEditorClick(scope.$index, scope.row)"
  19 + type="text"
  20 + size="small"
  21 + >编辑</el-button
  22 + >
  23 + <el-button
  24 + type="text"
  25 + size="small"
  26 + @click="handleDeleteClick(scope.$index, scope.row)"
  27 + >删除</el-button
  28 + >
  29 + </div>
  30 + </template>
  31 + </el-table-column>
  32 + </el-table>
  33 +
  34 + <el-dialog
  35 + title="新增"
  36 + :visible.sync="dialogVisible"
  37 + width="30%"
  38 + :before-close="handleClose"
  39 + >
  40 + <el-form :model="rowFormData" label-width="70px">
  41 + <el-form-item label="名称:">
  42 + <el-input
  43 + v-model.trim="rowFormData['name']"
  44 + placeholder="请输入名称"
  45 + size="mini"
  46 + >
  47 + </el-input>
  48 + </el-form-item>
  49 + <el-form-item label="判断值:" label-width="70px">
  50 + <el-input
  51 + v-model.trim="rowFormData['key']"
  52 + placeholder="请输入判断值"
  53 + size="mini"
  54 + >
  55 + </el-input>
  56 + </el-form-item>
  57 + <el-form-item label="图片地址:">
  58 + <el-input
  59 + v-model.trim="rowFormData['value']"
  60 + placeholder="请输入已上传的图片地址"
  61 + size="mini"
  62 + >
  63 + </el-input>
  64 + </el-form-item>
  65 + </el-form>
  66 + <span slot="footer" class="dialog-footer">
  67 + <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
  68 + <el-button size="mini" type="primary" @click="handleSaveClick"
  69 + >确 定</el-button
  70 + >
  71 + </span>
  72 + </el-dialog>
  73 + </div>
  74 +</template>
  75 +<script>
  76 +export default {
  77 + model: {
  78 + prop: "formData",
  79 + event: "input"
  80 + },
  81 + props: {
  82 + formData: Array
  83 + },
  84 + data() {
  85 + return {
  86 + dialogVisible: false,
  87 + rowFormData: {
  88 + name: "",
  89 + key: "",
  90 + value:""
  91 + },
  92 + flag: true, // true 新增, false 编辑
  93 + indexEditor: -1, // 编辑第几个数据
  94 + tableData: []
  95 + };
  96 + },
  97 + methods: {
  98 + // 新增
  99 + handleAddClick() {
  100 + this.rowFormData = {};
  101 + this.flag = true;
  102 + this.dialogVisible = true;
  103 + },
  104 + // 编辑
  105 + handleEditorClick(index, row) {
  106 + this.flag = false;
  107 + this.rowFormData = this.deepClone(row);
  108 + this.indexEditor = index;
  109 + this.dialogVisible = true;
  110 + },
  111 + // 关闭
  112 + handleClose() {
  113 + this.dialogVisible = false;
  114 + },
  115 + // 保存
  116 + handleSaveClick() {
  117 + if (this.flag) {
  118 + // 新增
  119 + this.formData.push(this.rowFormData);
  120 + this.dialogVisible = false;
  121 + } else {
  122 + // 编辑
  123 + this.formData[this.indexEditor] = this.rowFormData;
  124 + this.$set(this.formData, this.indexEditor, this.rowFormData);
  125 + this.dialogVisible = false;
  126 + }
  127 + this.$emit("input", this.formData);
  128 + this.$emit("change", this.formData);
  129 + },
  130 + // 删除
  131 + handleDeleteClick(index) {
  132 + this.formData.splice(index, 1);
  133 + this.$emit("input", this.formData);
  134 + this.$emit("change", this.formData);
  135 + }
  136 + }
  137 +};
  138 +</script>
  139 +<style lang="scss" scoped>
  140 +/deep/::-webkit-scrollbar-track-piece {
  141 + background-color: transparent;
  142 +}
  143 +/deep/ .el-table__body-wrapper::-webkit-scrollbar {
  144 + width: 0; // 横向滚动条
  145 + height: 8px; // 纵向滚动条 必写
  146 +}
  147 +// 滚动条的滑块
  148 +/deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb {
  149 + border-radius: 5px;
  150 + background-color: rgba(144, 146, 152, 0.3);
  151 +}
  152 +/deep/.el-table,
  153 +/deep/.el-table__expanded-cell,
  154 +/deep/.el-table th,
  155 +/deep/.el-table tr {
  156 + background-color: transparent !important;
  157 + color: #859094 !important;
  158 + font-size: 12px !important;
  159 +}
  160 +/deep/.el-table td,
  161 +/deep/.el-table th.is-leaf {
  162 + border-bottom: none;
  163 + line-height: 26px;
  164 +}
  165 +/deep/.el-table tbody tr:hover {
  166 + background-color: #263445 !important;
  167 +}
  168 +/deep/.el-table tbody tr:hover > td {
  169 + background-color: #263445 !important;
  170 +}
  171 +/deep/.el-table::before {
  172 + height: 0;
  173 +}
  174 +.button-group .el-button {
  175 + padding: 0;
  176 +}
  177 +</style>
... ...
src/views/bigscreenDesigner/designer/components/dynamicForm.vue
... ... @@ -183,6 +183,12 @@
183 183 :chart-type="item.chartType"
184 184 @change="changed($event, item.name)"
185 185 />
  186 + <dynamic-add-pic-adress
  187 + v-if="item.type == 'dynamic-add-pic-adress' && inputShow[item.name]"
  188 + v-model="formData[item.name]"
  189 + :chart-type="item.chartType"
  190 + @change="changed($event, item.name)"
  191 + />
186 192 <dynamic-add-radar
187 193 v-if="item.type == 'dynamic-add-radar' && inputShow[item.name]"
188 194 v-model="formData[item.name]"
... ... @@ -324,6 +330,7 @@ import CustomUploadNew from &quot;./customUploadNew&quot;;
324 330 import DatasourceSelect from "./datasourceSelect";
325 331 import CustomUploadMulti from "./customUploadMulti";
326 332 import dynamicAddSvg from "./dynamicAddSvg.vue";
  333 +import dynamicAddPicAdress from "./dynamicAddPicAdress";
327 334 import { mapState } from 'vuex';
328 335 export default {
329 336 name: "DynamicForm",
... ... @@ -338,7 +345,8 @@ export default {
338 345 CustomUploadNew,
339 346 CustomUploadMulti,
340 347 DatasourceSelect,
341   - dynamicAddSvg
  348 + dynamicAddSvg,
  349 + dynamicAddPicAdress
342 350 },
343 351 model: {
344 352 prop: "value",
... ...
src/views/bigscreenDesigner/designer/tools/configure/div/widget-dt-image.js 0 → 100644
  1 +/*
  2 + * @Descripttion: 图片json
  3 + */
  4 +export const widgetDtImage = {
  5 + code: 'widget-dt-image',
  6 + type: 'html',
  7 + tabName: '图层',
  8 + label: '动态图片',
  9 + icon: 'icontupian',
  10 + options: {
  11 + // 配置
  12 + setup: [
  13 + {
  14 + type: 'el-input-text',
  15 + label: '图层名称',
  16 + name: 'layerName',
  17 + required: false,
  18 + placeholder: '',
  19 + value: '动态图片',
  20 + },
  21 + {
  22 + type: 'el-switch',
  23 + label: '开启旋转',
  24 + name: 'startRotate',
  25 + required: false,
  26 + placeholder: '',
  27 + value: false,
  28 + },
  29 + {
  30 + type: 'el-slider',
  31 + label: '旋转速度',
  32 + name: 'rotationSpeed',
  33 + required: false,
  34 + placeholder: '',
  35 + value: 70
  36 + },
  37 + {
  38 + type: 'el-slider',
  39 + label: '透明度',
  40 + name: 'transparency',
  41 + required: false,
  42 + placeholder: '',
  43 + value: 100
  44 + },
  45 + {
  46 + type: 'el-input-number',
  47 + label: '圆角',
  48 + name: 'borderRadius',
  49 + required: false,
  50 + placeholder: '',
  51 + value: '0'
  52 + },
  53 + {
  54 + type: 'custom-upload-new',
  55 + label: '参考地址',
  56 + name: 'imageAdress',
  57 + required: false,
  58 + placeholder: '',
  59 + value: '',
  60 + },
  61 + {
  62 + type: 'vue-color',
  63 + label: '背景颜色',
  64 + name: 'background',
  65 + required: false,
  66 + placeholder: '',
  67 + },
  68 + {
  69 + type: 'el-input-text',
  70 + label: '判断值',
  71 + name: 'textPic',
  72 + required: false,
  73 + placeholder: '',
  74 + value: 'block',
  75 + },
  76 + {
  77 + type: 'el-select-static',
  78 + label: '主数据源数据',
  79 + name: 'slectedDataType',
  80 + require: false,
  81 + placeholder: '',
  82 + selectOptions: [],
  83 + value: '',
  84 + },
  85 + {
  86 + type: 'dynamic-add-pic-adress',
  87 + label: '',
  88 + name: 'dynamicAddPicAdress',
  89 + required: false,
  90 + placeholder: '',
  91 + value: [
  92 + {name: '图片1', key: 'block', value: ''}
  93 + ]
  94 + },
  95 +
  96 + ],
  97 + // 数据
  98 + data: [],
  99 + // 坐标
  100 + position: [
  101 + {
  102 + type: 'el-input-number',
  103 + label: '左边距',
  104 + name: 'left',
  105 + required: false,
  106 + placeholder: '',
  107 + value: 0,
  108 + },
  109 + {
  110 + type: 'el-input-number',
  111 + label: '上边距',
  112 + name: 'top',
  113 + required: false,
  114 + placeholder: '',
  115 + value: 0,
  116 + },
  117 + {
  118 + type: 'el-input-number',
  119 + label: '宽度',
  120 + name: 'width',
  121 + required: false,
  122 + placeholder: '该容器在1920px大屏中的宽度',
  123 + value: 300,
  124 + },
  125 + {
  126 + type: 'el-input-number',
  127 + label: '高度',
  128 + name: 'height',
  129 + required: false,
  130 + placeholder: '该容器在1080px大屏中的高度',
  131 + value: 200,
  132 + },
  133 + ],
  134 + }
  135 +}
... ...
src/views/bigscreenDesigner/designer/tools/configure/lineCharts/widget-line-stack.js
... ... @@ -47,6 +47,14 @@ export const widgetLineStack = {
47 47 value: true,
48 48 },
49 49 {
  50 + type: 'el-switch',
  51 + label: '0开始',
  52 + name: 'zeroStart',
  53 + required: false,
  54 + placeholder: '',
  55 + value: false,
  56 + },
  57 + {
50 58 type: 'el-slider',
51 59 label: '点大小',
52 60 name: 'pointSize',
... ...
src/views/bigscreenDesigner/designer/tools/main.js
... ... @@ -3,6 +3,7 @@ import { widgetBorderBox } from &quot;./configure/div/widget-border-box&quot;;
3 3 import { widgetDecoration } from "./configure/div/widget-decoration";
4 4 import { widgetCapsuleChart} from "./configure/barCharts/widget-capsule-chart";
5 5 import { widgetImage } from "./configure/div/widget-image"
  6 +import { widgetDtImage } from "./configure/div/widget-dt-image"
6 7 import { widgetSliders } from "./configure/div/widget-slider"
7 8 import { widgetText } from "./configure/texts/widget-text"
8 9 import { widgetMarquee } from "./configure/texts/widget-marquee"
... ... @@ -52,6 +53,7 @@ export const widgetTool = [
52 53 widgetDecoration,
53 54 // widgetDiv,
54 55 widgetImage,
  56 + widgetDtImage,
55 57 widgetSliders,
56 58 // type=html类型的组件
57 59 widgetText,
... ...
src/views/bigscreenDesigner/designer/widget/div/widgetDtImage.vue 0 → 100644
  1 +<template>
  2 + <div class="imagebox" :style="styleColor" v-if="isRouterAlive">
  3 +<!-- <div class="bg" v-if="!imgStyle.imageAdress"></div>-->
  4 + <div v-if="imageAdressShow">
  5 + <img :class="transStyle.startRotate ? 'startImg' : ''" :style="imgStyle" :src="imageAdress" alt="" />
  6 + </div>
  7 + </div>
  8 +</template>
  9 +<script>
  10 +import {mapState} from "vuex";
  11 +export default {
  12 + name: "WidgetDtImage",
  13 + components: {},
  14 + props: {
  15 + value: Object,
  16 + ispreview: Boolean
  17 + },
  18 + data() {
  19 + return {
  20 + options: {},
  21 + optionsData: {},
  22 + optionsSetUp: {},
  23 + picData:[],
  24 + imageAdress:'',
  25 + imageAdressShow:true,
  26 + isRouterAlive:false,
  27 + flagInter: null,
  28 + };
  29 + },
  30 + computed: {
  31 + ...mapState('dataSource', ['staticData','staticRefreshTime']),
  32 + transStyle() {
  33 + return this.objToOne(this.options);
  34 + },
  35 + styleColor() {
  36 + return {
  37 + position: this.ispreview ? "absolute" : "static",
  38 + background: this.transStyle.background,
  39 + "text-align": this.transStyle.textAlign,
  40 + width: this.transStyle.width + "px",
  41 + height: this.transStyle.height + "px",
  42 + left: this.transStyle.left + "px",
  43 + top: this.transStyle.top + "px",
  44 + right: this.transStyle.right + "px",
  45 + "border-radius": this.transStyle.borderRadius + 'px'
  46 + };
  47 + },
  48 + imgStyle() {
  49 + return {
  50 + width: this.transStyle.width + "px",
  51 + height: this.transStyle.height + "px",
  52 + "border-radius": this.transStyle.borderRadius + "px",
  53 + opacity: this.transStyle.transparency / 100,
  54 + animation: this.transStyle.startRotate ? "turn " + (101 - this.transStyle.rotationSpeed) / 10 + "s linear infinite" : "none"
  55 + };
  56 + }
  57 + },
  58 + watch: {
  59 + value: {
  60 + handler(val) {
  61 + this.options = val;
  62 + this.optionsData = val.data;
  63 + this.optionsSetUp = val.setup;
  64 + this.initData();
  65 + },
  66 + deep: true
  67 + }
  68 + },
  69 + created() {
  70 + this.options = this.value;
  71 + },
  72 + mounted() {
  73 + this.options = this.value;
  74 + this.optionsData = this.value.data;
  75 + this.setPicValue();
  76 + },
  77 + methods: {
  78 + // vue hack 之强制刷新组件
  79 + reload(){
  80 + this.isRouterAlive=false;
  81 + this.$nextTick(function(){
  82 + this.isRouterAlive=true;
  83 + })
  84 + },
  85 + initData() {
  86 + this.handlerPicData();
  87 + },
  88 + handlerPicData(){
  89 + this.setPicValue();
  90 + },
  91 + //初始化设置pic值
  92 + setPicValue(){
  93 + const {slectedDataType} = this.transStyle;
  94 + if(this.isNotBlank(slectedDataType)){
  95 + const refreshTime = this.staticRefreshTime || 300000;
  96 + this.dynamicDataFn(refreshTime);
  97 + }else{
  98 + this.getEchartData();
  99 + }
  100 + },
  101 + dynamicDataFn(refreshTime) {
  102 + if (this.ispreview) {
  103 + this.flagInter = setInterval(() => {
  104 + this.getEchartData();
  105 + }, refreshTime);
  106 + } else {
  107 + this.getEchartData();
  108 + }
  109 + },
  110 + getEchartData() {
  111 + this.imageAdress=this.getShowPic();
  112 + this.imageAdressShow = this.isNotBlank(this.imageAdress);
  113 + // console.log("this.imageAdress",this.imageAdress, this.imageAdressShow)
  114 + this.reload();
  115 + },
  116 + getShowPic() {
  117 + const {textPic, slectedDataType} = this.transStyle;
  118 + const key = this.staticData[slectedDataType] || textPic;
  119 + const dataPic = this.value.setup.dynamicAddPicAdress;
  120 + // if(this.isBlank(key) || this.isBlankArray(dataPic)){
  121 + // return this.transStyle.imageAdress;
  122 + // }
  123 + for (let i = 0; i < dataPic.length; i++) {
  124 + if(dataPic[i].key==key){
  125 + /** 控制svg图片拖动,原理在于设置svg的viewbox属性,viewbox的第一个参数控制左右位置,第二个参数设置上下位置 */
  126 + /** 控制svg图片放大缩小,原理在于设置svg的viewbox属性,viewbox的第三个参数控制左右大小,第四个参数设置上下大小 */
  127 + //设置svg 自适应 添加属性 viewBox="0,0,640,480"
  128 + const pic = dataPic[i].value;
  129 + return pic;
  130 + }
  131 + }
  132 + return null;
  133 + },
  134 + }
  135 +};
  136 +</script>
  137 +
  138 +<style scoped lang="scss">
  139 +.imagebox {
  140 + width: 100%;
  141 + height: 100%;
  142 + overflow: hidden;
  143 + position: relative;
  144 +
  145 + .bg {
  146 + position: absolute;
  147 + width: 100%;
  148 + height: 100%;
  149 + top: 0;
  150 + left: 0;
  151 + background: url(data:image/png;base64,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) no-repeat;
  152 + background-size: 100% 100%;
  153 + }
  154 +}
  155 +
  156 +
  157 +.imagebox img {
  158 + width: 100%;
  159 + height: 100%;
  160 +}
  161 +
  162 +.startImg {
  163 + animation: turn 1s linear infinite;
  164 +}
  165 +</style>
... ...
src/views/bigscreenDesigner/designer/widget/line/widgetLineStackChart.vue
... ... @@ -135,6 +135,7 @@ export default {
135 135 show: optionsSetup.hideX,
136 136 // 坐标轴名称
137 137 name: optionsSetup.nameX,
  138 + boundaryGap:false,
138 139 nameTextStyle: {
139 140 color: optionsSetup.nameColorX,
140 141 fontSize: optionsSetup.nameFontSizeX
... ... @@ -369,7 +370,10 @@ export default {
369 370 xAxisList = this.setUnique(xAxisList);
370 371 yAxisList = this.setUnique(yAxisList);
371 372 for (const i in yAxisList) {
372   - const data = new Array(xAxisList.length).fill(0);
  373 + let data = [];
  374 + if(optionsSetup.zeroStart){
  375 + data = new Array(xAxisList.length).fill(0);
  376 + }
373 377 for (const j in xAxisList) {
374 378 for (const k in val) {
375 379 if (val[k].name == yAxisList[i]) {
... ... @@ -379,6 +383,7 @@ export default {
379 383 }
380 384 }
381 385 }
  386 + // console.log(data);
382 387 series.push({
383 388 name: yAxisList[i],
384 389 type: "line",
... ...
src/views/bigscreenDesigner/designer/widget/temp.vue
... ... @@ -10,6 +10,7 @@ import widgetText from &quot;./text/widgetText.vue&quot;;
10 10 import WidgetMarquee from "./text/widgetMarquee.vue";
11 11 import widgetTime from "./text/widgetTime.vue";
12 12 import widgetImage from "./div/widgetImage.vue";
  13 +import widgetDtImage from "./div/widgetDtImage";
13 14 import widgetSlider from "./div/widgetSlider.vue";
14 15 import widgetVideo from "./video/widgetVideo.vue";
15 16 import WidgetIframe from "./text/widgetIframe.vue";
... ... @@ -58,6 +59,7 @@ export default {
58 59 WidgetMarquee,
59 60 widgetTime,
60 61 widgetImage,
  62 + widgetDtImage,
61 63 widgetSlider,
62 64 widgetVideo,
63 65 WidgetIframe,
... ...
src/views/bigscreenDesigner/designer/widget/widget.vue
... ... @@ -47,6 +47,7 @@ import widgetHeatmap from &quot;./heatmap/widgetHeatmap&quot;;
47 47 import widgetRadar from "./radar/widgetRadar";
48 48 import widgetBarLineStackChart from "./barline/widgetBarLineStackChart";
49 49 import widgetImage from "./div/widgetImage.vue";
  50 +import widgetDtImage from "./div/widgetDtImage";
50 51 import widgetSlider from "./div/widgetSlider.vue";
51 52 import widgetBorderBox from "./div/widgetBorderBox.vue";
52 53 import widgetDecoration from "./div/widgetDecoration.vue";
... ... @@ -72,6 +73,7 @@ export default {
72 73 WidgetMarquee,
73 74 widgetTime,
74 75 widgetImage,
  76 + widgetDtImage,
75 77 widgetSlider,
76 78 widgetVideo,
77 79 WidgetIframe,
... ...