Commit f0e3ea90993549574cdd1515729ee04b80142f4d

Authored by zhangzzzz
1 parent dfda9e28

文本组件可从静态数据中获取数据;多选图片地址选择可记录选择状态;全局数据保存样式错误问题解决;

src/store/index.js
... ... @@ -7,6 +7,7 @@ import app from './modules/app'
7 7 import user from './modules/user'
8 8 import cacheView from './modules/cachaView'
9 9 import help from './modules/help'
  10 +import dataSource from './modules/dataSource'
10 11  
11 12 Vue.use(Vuex)
12 13  
... ... @@ -18,7 +19,8 @@ const store = new Vuex.Store({
18 19 app,
19 20 user,
20 21 cacheView,
21   - help
  22 + help,
  23 + dataSource
22 24 },
23 25 state: { },
24 26 plugins: [initPlugin],
... ...
src/store/modules/dataSource.js 0 → 100644
  1 +const dataSource = {
  2 + namespaced: true,
  3 + state: {
  4 + staticData: {},
  5 + dynamicData: {}
  6 + },
  7 +
  8 + mutations: {
  9 + SET_STATIC_DATA: (state, data) => {
  10 + state.staticData = data;
  11 + },
  12 + SET_DYNAMIC_DATA: (state, data) => {
  13 + state.dynamicData = data;
  14 + }
  15 + },
  16 +
  17 + actions: {}
  18 +};
  19 +
  20 +export default dataSource;
... ...
src/views/bigscreenDesigner/designer/components/customUploadMulti.vue
1 1 <template>
2 2 <div>
3   - <el-input clearable v-model.trim="uploadImgUrl" size="mini" @change="changeInput">
  3 + <el-input clearable v-model="uploadImgUrl" size="mini" @change="changeInput">
4 4 <template slot="append">
5 5 <i class="iconfont iconfolder-o" @click="dialogVisible = true"></i>
6 6 </template>
... ... @@ -58,9 +58,10 @@ export default {
58 58 uploadImgUrl: ""
59 59 };
60 60 },
61   - created() {
62   - this.uploadImgUrl = this.value;
63   - this.getFielList();
  61 + async created() {
  62 + this.uploadImgUrl = this.value.trim();
  63 + await this.getFielList();
  64 + this.getSelectedFileList();
64 65 },
65 66 methods: {
66 67 // 获取图片列表
... ... @@ -72,6 +73,14 @@ export default {
72 73 this.fileList = fileList;
73 74 }
74 75 },
  76 + // 获取已选中图片列表
  77 + getSelectedFileList() {
  78 + const urlPathList = this.uploadImgUrl.split(',');
  79 + urlPathList.forEach(url => {
  80 + const temp = this.fileList.find(item => item.urlPath === url);
  81 + temp && this.selectedFileList.push(temp);
  82 + });
  83 + },
75 84 uploadHandler() {
76 85 this.$refs.files.click();
77 86 },
... ...
src/views/bigscreenDesigner/designer/components/dynamicForm.vue
... ... @@ -111,6 +111,22 @@
111 111 />
112 112 </el-select>
113 113  
  114 + <el-select
  115 + v-if="item.type == 'el-select-static'"
  116 + size="mini"
  117 + v-model="formData[item.name]"
  118 + clearable
  119 + placeholder="请选择"
  120 + @change="val => changed(val, item.name)"
  121 + >
  122 + <el-option
  123 + v-for="(val, key) in staticData"
  124 + :key="key"
  125 + :label="key"
  126 + :value="key"
  127 + />
  128 + </el-select>
  129 +
114 130 <el-slider
115 131 v-if="item.type == 'el-slider'"
116 132 v-model="formData[item.name]"
... ... @@ -301,6 +317,7 @@ import dynamicAddRadar from &quot;./dynamicAddRadar&quot;;
301 317 import CustomUploadNew from "./customUploadNew";
302 318 import DatasourceSelect from "./datasourceSelect";
303 319 import CustomUploadMulti from "./customUploadMulti";
  320 +import { mapState } from 'vuex';
304 321 export default {
305 322 name: "DynamicForm",
306 323 components: {
... ... @@ -342,9 +359,12 @@ export default {
342 359 hintOptions: {
343 360 completeSingle: true // 当匹配只有一项的时候是否自动补全
344 361 }
345   - }
  362 + },
346 363 };
347 364 },
  365 + computed: {
  366 + ...mapState('dataSource', ['staticData']),
  367 + },
348 368 watch: {
349 369 value(newValue, oldValue) {
350 370 this.formData = newValue || {};
... ... @@ -352,7 +372,7 @@ export default {
352 372 options(val) {
353 373 this.setDefaultValue();
354 374 this.isShowData();
355   - }
  375 + },
356 376 },
357 377 created() {
358 378 this.isShowData();
... ...
src/views/bigscreenDesigner/designer/index.vue
... ... @@ -297,6 +297,7 @@ import VueRulerTool from &quot;vue-ruler-tool&quot;; // 大屏设计页面的标尺插件
297 297 import contentMenu from "./components/contentMenu";
298 298 import { getToken } from "@/utils/auth";
299 299 import { Revoke } from "@/utils/revoke"; //处理历史记录 2022-02-22
  300 +import { mapMutations } from 'vuex';
300 301  
301 302 export default {
302 303 name: "Login",
... ... @@ -331,11 +332,12 @@ export default {
331 332 height: 1080, // 大屏设计高度
332 333 backgroundColor: "", // 大屏背景色
333 334 backgroundImage: "", // 大屏背景图片
334   - master: null, // 全局数据源
335   - refreshMasterTime: 600000, // 刷新时间(毫秒)
  335 + // master: null, // 全局数据源
  336 + // refreshMasterTime: 600000, // 刷新时间(毫秒)
336 337 refreshSeconds: null, // 大屏刷新时间间隔
337 338 presetLine: [], // 辅助线
338 339 presetLineVisible: true, // 辅助线是否显示
  340 + data: [],
339 341 },
340 342 masterData:{"sName1":"测试文本1","sName2":"测试文本2"},
341 343 // 大屏的标记
... ... @@ -450,6 +452,7 @@ export default {
450 452 });
451 453 },
452 454 methods: {
  455 + ...mapMutations('dataSource', ['SET_STATIC_DATA']),
453 456 /**
454 457 * @description: 恢复
455 458 * @param {*}
... ... @@ -785,13 +788,18 @@ export default {
785 788 // 选中不同的组件 右侧都显示第一栏
786 789 this.activeName = "first";
787 790 this.widgetOptions = getToolByCode("screen")["options"];
  791 + this.SET_STATIC_DATA(this.widgetOptions.data.find(item => item.name === 'staticData').value);
788 792 },
789 793  
790 794 // 如果是点击某个组件,获取该组件的配置项
791 795 setOptionsOnClickWidget(obj) {
792 796 this.screenCode = "";
793 797 if (typeof obj == "number") {
794   - this.widgetOptions = this.deepClone(this.widgets[obj]["options"]);
  798 + this.widgetOptions = {};
  799 + // 直接赋值数据不刷新。。。
  800 + this.$nextTick(() => {
  801 + this.widgetOptions = this.deepClone(this.widgets[obj]["options"]);
  802 + });
795 803 return;
796 804 }
797 805 if (obj.index < 0 || obj.index >= this.widgets.length) {
... ... @@ -831,32 +839,43 @@ export default {
831 839 },
832 840 // 将当前选中的组件,右侧属性值更新
833 841 widgetValueChanged(key, val) {
834   - // console.log("key", key);
835   - // console.log("val", val);
836   - // console.log(this.widgetOptions);
837 842 if (this.screenCode == "screen") {
838   - let newSetup = new Array();
839   - this.dashboard = this.deepClone(val);
840   - // console.log("asd", this.dashboard);
841   - // console.log(this.widgetOptions);
842   - if (this.bigscreenWidth != this.dashboard.width) {
843   - this.bigscreenWidth = this.dashboard.width;
844   - }
845   - if (this.bigscreenHeight != this.dashboard.height) {
846   - this.bigscreenHeight = this.dashboard.height;
847   - }
848   - this.widgetOptions.setup.forEach((el) => {
849   - if (el.name == "width") {
850   - el.value = this.bigscreenWidth;
851   - } else if (el.name == "height") {
852   - el.value = this.bigscreenHeight;
853   - } else if (this.hasOwn(el.name)) {
854   - el["value"] = this.dashboard[el.name];
  843 + if (key === 'setup') {
  844 + // 全局配置更改
  845 + let newSetup = new Array();
  846 + this.dashboard = this.deepClone(val);
  847 + if (this.bigscreenWidth !== this.dashboard.width && this.dashboard.width) {
  848 + this.bigscreenWidth = this.dashboard.width;
855 849 }
856   - newSetup.push(el);
857   - });
858   - // console.log(newSetup);
859   - this.widgetOptions.setup = newSetup;
  850 + if (this.bigscreenHeight !== this.dashboard.height && this.dashboard.height) {
  851 + this.bigscreenHeight = this.dashboard.height;
  852 + }
  853 +
  854 + this.widgetOptions.setup.forEach((el) => {
  855 + if (el.name == "width") {
  856 + el.value = this.bigscreenWidth;
  857 + } else if (el.name == "height") {
  858 + el.value = this.bigscreenHeight;
  859 + } else if (Object.hasOwn(this.dashboard, el.name)) {
  860 + el["value"] = this.dashboard[el.name];
  861 + }
  862 + newSetup.push(el);
  863 + });
  864 + this.widgetOptions.setup = newSetup;
  865 + } else if (key === 'data') {
  866 + // 全局数据更改
  867 + val.staticData && this.SET_STATIC_DATA(val.staticData);
  868 + let newData = new Array();
  869 + const cloneVal = this.deepClone(val);
  870 + this.widgetOptions.data.forEach((el) => {
  871 + if (Object.hasOwn(cloneVal, el.name)) {
  872 + el["value"] = cloneVal[el.name];
  873 + }
  874 + newData.push(el);
  875 + });
  876 + this.widgetOptions.data = newData;
  877 + }
  878 +
860 879 } else {
861 880 for (let i = 0; i < this.widgets.length; i++) {
862 881 if (this.widgetIndex == i) {
... ...
src/views/bigscreenDesigner/designer/tools/configure/texts/widget-text.js
... ... @@ -32,6 +32,15 @@ export const widgetText = {
32 32 value: '文本框',
33 33 },
34 34 {
  35 + type: 'el-select-static',
  36 + label: '全局静态数据选择',
  37 + name: 'slectedDataType',
  38 + require: false,
  39 + placeholder: '',
  40 + selectOptions: [],
  41 + value: '',
  42 + },
  43 + {
35 44 type: 'el-input-number',
36 45 label: '字体字号',
37 46 name: 'fontSize',
... ... @@ -92,57 +101,57 @@ export const widgetText = {
92 101 },
93 102 ],
94 103 // 数据
95   - data: [
96   - {
97   - type: 'el-radio-group',
98   - label: '数据类型',
99   - name: 'dataType',
100   - require: false,
101   - placeholder: '',
102   - selectValue: true,
103   - selectOptions: [
104   - {
105   - code: 'staticData',
106   - name: '静态数据',
107   - },
108   - {
109   - code: 'dynamicData',
110   - name: '动态数据',
111   - },
112   - ],
113   - value: 'staticData',
114   - },
115   - {
116   - type: 'el-input-number',
117   - label: '刷新时间(毫秒)',
118   - name: 'refreshTime',
119   - relactiveDom: 'dataType',
120   - relactiveDomValue: 'dynamicData',
121   - value: 5000
122   - },
123   - {
124   - type: 'el-button',
125   - label: '静态数据',
126   - name: 'staticData',
127   - required: false,
128   - placeholder: '',
129   - relactiveDom: 'dataType',
130   - relactiveDomValue: 'staticData',
131   - value: '文本框',
132   - },
133   - {
134   - type: 'dycustComponents',
135   - label: '',
136   - name: 'dynamicData',
137   - required: false,
138   - placeholder: '',
139   - relactiveDom: 'dataType',
140   - relactiveDomValue: 'dynamicData',
141   - chartType: 'widget-text',
142   - dictKey: 'TEXT_PROPERTIES',
143   - value: '',
144   - }
145   - ],
  104 + // data: [
  105 + // {
  106 + // type: 'el-radio-group',
  107 + // label: '数据类型',
  108 + // name: 'dataType',
  109 + // require: false,
  110 + // placeholder: '',
  111 + // selectValue: true,
  112 + // selectOptions: [
  113 + // {
  114 + // code: 'staticData',
  115 + // name: '静态数据',
  116 + // },
  117 + // {
  118 + // code: 'dynamicData',
  119 + // name: '动态数据',
  120 + // },
  121 + // ],
  122 + // value: 'staticData',
  123 + // },
  124 + // {
  125 + // type: 'el-input-number',
  126 + // label: '刷新时间(毫秒)',
  127 + // name: 'refreshTime',
  128 + // relactiveDom: 'dataType',
  129 + // relactiveDomValue: 'dynamicData',
  130 + // value: 5000
  131 + // },
  132 + // {
  133 + // type: 'el-button',
  134 + // label: '静态数据',
  135 + // name: 'staticData',
  136 + // required: false,
  137 + // placeholder: '',
  138 + // relactiveDom: 'dataType',
  139 + // relactiveDomValue: 'staticData',
  140 + // value: '文本框',
  141 + // },
  142 + // {
  143 + // type: 'dycustComponents',
  144 + // label: '',
  145 + // name: 'dynamicData',
  146 + // required: false,
  147 + // placeholder: '',
  148 + // relactiveDom: 'dataType',
  149 + // relactiveDomValue: 'dynamicData',
  150 + // chartType: 'widget-text',
  151 + // dictKey: 'TEXT_PROPERTIES',
  152 + // value: '',
  153 + // }
  154 + // ],
146 155  
147 156 // 坐标
148 157 position: [
... ...
src/views/bigscreenDesigner/designer/widget/text/widgetText.vue
1 1 <template>
2   - <div class="text" :style="styleColor">{{ styleColor.text }}</div>
  2 + <div class="text" :style="styleColor">{{ showText }}</div>
3 3 </template>
4 4  
5 5 <script>
  6 +import { mapState } from 'vuex';
6 7 export default {
7 8 name: "WidgetText",
8 9 components: {},
... ... @@ -17,6 +18,7 @@ export default {
17 18 };
18 19 },
19 20 computed: {
  21 + ...mapState('dataSource', ['staticData']),
20 22 transStyle() {
21 23 return this.objToOne(this.options);
22 24 },
... ... @@ -36,6 +38,10 @@ export default {
36 38 top: this.transStyle.top + "px",
37 39 right: this.transStyle.right + "px"
38 40 };
  41 + },
  42 + showText() {
  43 + const {text, slectedDataType} = this.transStyle;
  44 + return this.staticData[slectedDataType] || text;
39 45 }
40 46 },
41 47 watch: {
... ... @@ -46,7 +52,7 @@ export default {
46 52 this.setOptionsData();
47 53 },
48 54 deep: true
49   - }
  55 + },
50 56 },
51 57 mounted() {
52 58 this.options = this.value;
... ...