Commit db113db393fc1710d5e36fc003fa4d16aa47c519

Authored by qianbao
1 parent 237fd13d

122121

config/dev.env.js
@@ -5,7 +5,7 @@ const prodEnv = require('./prod.env') @@ -5,7 +5,7 @@ const prodEnv = require('./prod.env')
5 const isDev = false; 5 const isDev = false;
6 //开发API地址 6 //开发API地址
7 // const devAdrress='"http://weberp.xlyprint.cn/xlyReport"'; 7 // const devAdrress='"http://weberp.xlyprint.cn/xlyReport"';
8 -const devAdrress='"http://172.16.114.9:8085/xlyReport"'; 8 +const devAdrress='"http://weberp.xlyprint.cn:8888/xlyReport"';
9 //正式打包API地址 9 //正式打包API地址
10 const ipAdrress='"http://"+location.host+"/xlyReport"'; 10 const ipAdrress='"http://"+location.host+"/xlyReport"';
11 11
src/mixins/queryform.js
@@ -122,8 +122,8 @@ export default { @@ -122,8 +122,8 @@ export default {
122 return this.barOrLineChartFn(params.chartProperties, data); 122 return this.barOrLineChartFn(params.chartProperties, data);
123 }else if (chartType == "widget-barlinechart" ) { 123 }else if (chartType == "widget-barlinechart" ) {
124 return this.barLineChartFn(params.chartProperties, data); 124 return this.barLineChartFn(params.chartProperties, data);
125 - } else if ( chartType == "widget-barchart") {  
126 - return this.barOrLineChartFn(params.chartProperties, data); 125 + // } else if ( chartType == "widget-barchart") {
  126 + // return this.barOrLineChartFn(params.chartProperties, data);
127 } else if ( 127 } else if (
128 chartType == "widget-piechart" || 128 chartType == "widget-piechart" ||
129 chartType == "widget-funnel" 129 chartType == "widget-funnel"
@@ -132,7 +132,8 @@ export default { @@ -132,7 +132,8 @@ export default {
132 } else if (chartType == "widget-text") { 132 } else if (chartType == "widget-text") {
133 return this.widgettext(params.chartProperties, data) 133 return this.widgettext(params.chartProperties, data)
134 } else if (chartType == "widget-stackchart") { 134 } else if (chartType == "widget-stackchart") {
135 - return this.stackChartFn(params.chartProperties, data) 135 + return this.stackChartFn(params.chartProperties, data);
  136 + // return this.stackChartFn(params.chartProperties, data)
136 } else if (chartType == "widget-coord") { 137 } else if (chartType == "widget-coord") {
137 return this.coordChartFn(params.chartProperties, data) 138 return this.coordChartFn(params.chartProperties, data)
138 } else if (chartType == "widget-linemap") { 139 } else if (chartType == "widget-linemap") {
@@ -236,70 +237,12 @@ export default { @@ -236,70 +237,12 @@ export default {
236 } 237 }
237 ananysicData["xAxis"] = xAxisList; 238 ananysicData["xAxis"] = xAxisList;
238 ananysicData["series"] = series; 239 ananysicData["series"] = series;
239 - // console.log("11111",ananysicData); 240 +
240 return ananysicData; 241 return ananysicData;
241 }, 242 },
242 //堆叠图 243 //堆叠图
243 - stackChartFn(chartProperties, val) {  
244 - const ananysicData = {};  
245 - // const series = [];  
246 - // //全部字段字典值  
247 - // const types = Object.values(chartProperties)  
248 - // //x轴字段、y轴字段名  
249 - // const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]  
250 - // const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]  
251 - // const dataField = Object.keys(chartProperties)[types.indexOf('bar')]  
252 - // //x轴数值去重,y轴去重  
253 - // const xAxisList = this.setUnique(data.map(item => item[xAxisField]))  
254 - // const yAxisList = this.setUnique(data.map(item => item[yAxisField]))  
255 - // const dataFieldList = this.setUnique(data.map(item => item[dataField]))  
256 - // const dataGroup = this.setGroupByNew(data, xAxisList,'axis');  
257 - // console.log("1111",types,dataGroup);  
258 - // for (const key in chartProperties) {  
259 - // if (chartProperties[key] !== 'yAxis' && !chartProperties[key].startsWith('xAxis')) {  
260 - // Object.keys(dataGroup).forEach(item => {  
261 - // const data = new Array(xAxisList.length).fill(0)  
262 - // dataGroup[item].forEach(res => {  
263 - // data[xAxisList.indexOf(res[xAxisField])] = res[key]  
264 - // })  
265 - // series.push({  
266 - // name: yAxisList[item],  
267 - // type: chartProperties[key],  
268 - // data: data,  
269 - // })  
270 - // })  
271 - // }  
272 - // }  
273 - const series = [];  
274 - let xAxisList = [];  
275 - let yAxisList = [];  
276 - for (const i in val) {  
277 - xAxisList[i] = val[i].axis;  
278 - yAxisList[i] = val[i].name;  
279 - }  
280 - xAxisList = this.setUnique(xAxisList);  
281 - yAxisList = this.setUnique(yAxisList);  
282 - for (const i in yAxisList) {  
283 - const data = new Array(xAxisList.length).fill(0);  
284 - for (const j in xAxisList) {  
285 - for (const k in val) {  
286 - if (val[k].name == yAxisList[i]) {  
287 - if (val[k].axis == xAxisList[j]) {  
288 - data[j] = val[k].data;  
289 - }  
290 - }  
291 - }  
292 - }  
293 - series.push({  
294 - name: yAxisList[i],  
295 - type: 'bar',  
296 - data: data,  
297 - });  
298 - }  
299 -  
300 - ananysicData["xAxis"] = xAxisList;  
301 - ananysicData["series"] = series;  
302 - return ananysicData; 244 + stackChartFn(chartProperties, data) {
  245 + return data;
303 }, 246 },
304 // 饼图、漏斗图 247 // 饼图、漏斗图
305 piechartFn(chartProperties, data) { 248 piechartFn(chartProperties, data) {
src/views/bigscreenDesigner/designer/widget/bar/widgetBarStackChart.vue
@@ -288,7 +288,7 @@ export default { @@ -288,7 +288,7 @@ export default {
288 }, 288 },
289 //静态数据 289 //静态数据
290 staticDataFn(val) { 290 staticDataFn(val) {
291 - console.log("staticDataFn",val); 291 + // console.log("staticDataFn",val);
292 const optionsSetup = this.optionsSetup; 292 const optionsSetup = this.optionsSetup;
293 //颜色 293 //颜色
294 const customColor = optionsSetup.customColor; 294 const customColor = optionsSetup.customColor;
@@ -388,63 +388,9 @@ export default { @@ -388,63 +388,9 @@ export default {
388 getEchartData(val, optionsSetup) { 388 getEchartData(val, optionsSetup) {
389 const data = this.queryEchartsData(val); 389 const data = this.queryEchartsData(val);
390 data.then(res => { 390 data.then(res => {
391 - this.renderingFn(optionsSetup, res); 391 + this.staticDataFn(res)
392 }); 392 });
393 }, 393 },
394 - renderingFn(optionsSetup, val) {  
395 - //颜色  
396 - const customColor = optionsSetup.customColor;  
397 - const arrColor = [];  
398 - for (let i = 0; i < customColor.length; i++) {  
399 - arrColor.push(customColor[i].color);  
400 - }  
401 - // x轴  
402 - if (optionsSetup.verticalShow) {  
403 - this.options.xAxis.data = [];  
404 - this.options.yAxis.data = val.xAxis;  
405 - this.options.xAxis.type = "value";  
406 - this.options.yAxis.type = "category";  
407 - } else {  
408 - this.options.xAxis.data = val.xAxis;  
409 - this.options.yAxis.data = [];  
410 - this.options.xAxis.type = "category";  
411 - this.options.yAxis.type = "value";  
412 - }  
413 - const series = [];  
414 - let legendName = [];  
415 - legendName = this.setUnique(legendName);  
416 - for (const i in val.series) {  
417 - if (val.series[i].type == "bar") {  
418 - series.push({  
419 - name: val.series[i].name,  
420 - type: "bar",  
421 - data: val.series[i].data,  
422 - barGap: "0%",  
423 - stack: this.getStackStyle(),  
424 - barWidth: optionsSetup.maxWidth,  
425 - label: {  
426 - show: optionsSetup.isShow,  
427 - position: "top",  
428 - distance: 10,  
429 - fontSize: optionsSetup.fontSize,  
430 - color: optionsSetup.subTextColor,  
431 - fontWeight: optionsSetup.fontWeight,  
432 - },  
433 - //颜色,圆角属性  
434 - itemStyle: {  
435 - normal: {  
436 - color: arrColor[i],  
437 - barBorderRadius: optionsSetup.radius,  
438 - }  
439 - }  
440 - })  
441 - }  
442 - legendName.push(val.series[i].name);  
443 - }  
444 - this.options.series = series;  
445 - this.options.legend['data'] = legendName;  
446 - this.setOptionsLegendName(legendName);  
447 - }  
448 } 394 }
449 }; 395 };
450 </script> 396 </script>
src/views/bigscreenDesigner/designer/widget/barline/widgetBarLineStackChart.vue
@@ -487,92 +487,7 @@ export default { @@ -487,92 +487,7 @@ export default {
487 }); 487 });
488 }, 488 },
489 renderingFn(optionsSetup, val) { 489 renderingFn(optionsSetup, val) {
490 - //颜色  
491 - const customColor = optionsSetup.customColor;  
492 - const arrColor = [];  
493 - if(customColor){  
494 - for (let i = 0; i < customColor.length; i++) {  
495 - arrColor.push(customColor[i].color);  
496 - }  
497 - }  
498 - this.options.xAxis.data = val.xAxis;  
499 - this.options.yAxis.data = [];  
500 - this.options.xAxis.type = "category";  
501 - this.options.yAxis.type = "value";  
502 - const series = [];  
503 - let legendName = [];  
504 - for (const i in val.series) {  
505 - legendName.push(val.series[i].name);  
506 - }  
507 - legendName = this.setUnique(legendName);  
508 - for (let i = 0; i < legendName.length; i++) {  
509 - const bar = this.getDynamicSeriesData(legendName[i], val.series, "bar");  
510 - series.push({  
511 - name: legendName[i],  
512 - type: 'bar',  
513 - data: bar,  
514 - barGap: '0%',  
515 - barWidth: optionsSetup.maxWidth,  
516 - label: {  
517 - show: optionsSetup.isShowBar,  
518 - position: 'top',  
519 - distance: optionsSetup.distanceBar,  
520 - fontSize: optionsSetup.fontSizeBar,  
521 - color: optionsSetup.subTextColorBar,  
522 - fontWeight: optionsSetup.fontWeightBar,  
523 - },  
524 - //颜色,圆角属性  
525 - itemStyle: {  
526 - normal: {  
527 - color: arrColor[i],  
528 - barBorderRadius: optionsSetup.radius,  
529 - }  
530 - }  
531 - })  
532 - }  
533 - for (let i = 0; i < legendName.length; i++) {  
534 - const line = this.getDynamicSeriesData(legendName[i], val.series, "line");  
535 - series.push({  
536 - name: legendName[i],  
537 - type: "line",  
538 - data: line,  
539 - yAxisIndex: 1,  
540 - symbol: optionsSetup.symbol,  
541 - showSymbol: optionsSetup.markPoint,  
542 - symbolSize: optionsSetup.pointSize,  
543 - smooth: optionsSetup.smoothCurve,  
544 - itemStyle: {  
545 - normal: {  
546 - color: arrColor[i],  
547 - }  
548 - },  
549 - // 线条  
550 - lineStyle: {  
551 - color: arrColor[i],  
552 - width: optionsSetup.lineWidth,  
553 - },  
554 - label: {  
555 - show: optionsSetup.isShowLine,  
556 - position: 'top',  
557 - distance: optionsSetup.distanceLine,  
558 - fontSize: optionsSetup.fontSizeLine,  
559 - color: optionsSetup.subTextColorLine,  
560 - fontWeight: optionsSetup.fontWeightLine,  
561 - },  
562 - })  
563 - }  
564 - this.options.series = series;  
565 - this.options.legend['data'] = legendName;  
566 - this.setOptionsLegendName(legendName);  
567 - },  
568 - getDynamicSeriesData(legend, series, type) {  
569 - let data = [];  
570 - for (const i in series) {  
571 - if (series[i].name == legend && series[i].type == type) {  
572 - data = series[i].data;  
573 - }  
574 - }  
575 - return data 490 + this.staticDataFn(val);
576 }, 491 },
577 } 492 }
578 }; 493 };
src/views/bigscreenDesigner/designer/widget/div/widgetHtmlSlider.vue
1 <template> 1 <template>
2 - <div :style="style" v-if="isRouterAlive">  
3 - <el-carousel arrow="always" height="100%" class="carousel" :direction="carouselStyle.direction"  
4 - :indicator-position="carouselStyle.indicatorPosition" :interval="carouselStyle.interval"  
5 - :type="carouselStyle.type" :key="carouselKey">  
6 - <el-carousel-item v-for="(url, index) in urlData" :key="index">  
7 - <iframe class="carousel-img" :src="url" alt="" /> 2 + <div class="fullscreen-carousel" :style="style">
  3 + <!-- 进度指示器 -->
  4 + <div class="progress-indicator" :style="{width: progressWidth}"></div>
  5 +
  6 + <!-- 控制按钮 -->
  7 +<!-- <div class="controls">-->
  8 +<!-- <button class="control-btn" @click="prevSlide">-->
  9 +<!-- <i class="el-icon-arrow-left"></i>-->
  10 +<!-- </button>-->
  11 +<!-- <button class="control-btn" @click="nextSlide">-->
  12 +<!-- <i class="fas el-icon-arrow-right"></i>-->
  13 +<!-- </button>-->
  14 +<!-- </div>-->
  15 +
  16 + <el-carousel
  17 + :direction="carouselStyle.direction"
  18 + :indicator-position="carouselStyle.indicatorPosition"
  19 + :type="carouselStyle.type"
  20 +
  21 + :interval="intervalTime"
  22 + :autoplay="autoPlay"
  23 + :loop="true"
  24 + @change="handleSlideChange"
  25 + ref="carousel">
  26 + <el-carousel-item v-for="(slide, index) in slides" :key="index">
  27 + <div class="slide">
  28 + <div class="content-container">
  29 + <!-- 当前和下一个幻灯片预加载 -->
  30 + <template v-if="index === currentSlide || index === nextSlideIndex">
  31 + <!-- 尝试使用object标签作为备用方案 -->
  32 + <object v-if="slide.useObject"
  33 + :data="slide.url"
  34 + type="text/html"
  35 + @load="onContentLoad(index)"
  36 + @error="onContentError(index)"
  37 + :class="{loaded: !slide.loading && !slide.error}">
  38 + <div class="fallback-content">
  39 + <i class="fas fa-exclamation-triangle"></i>
  40 + <h4>内容加载失败</h4>
  41 + <p>无法加载报表内容,请检查网络连接</p>
  42 + </div>
  43 + </object>
  44 +
  45 + <!-- 主要使用iframe -->
  46 + <iframe v-else
  47 + :src="slide.url"
  48 + frameborder="0"
  49 + allowfullscreen
  50 + @load="onContentLoad(index)"
  51 + @error="onContentError(index)"
  52 + referrerpolicy="no-referrer"
  53 + :class="{loaded: !slide.loading && !slide.error}"
  54 + ></iframe>
  55 + </template>
  56 +
  57 + <div class="loading" v-if="slide.loading">
  58 + <div class="spinner"></div>
  59 + <p>报表加载中...</p>
  60 + </div>
  61 +
  62 + <div class="error" v-if="slide.error && !slide.loading">
  63 + <i class="fas fa-exclamation-triangle"></i>
  64 + <p>报表加载失败</p>
  65 + </div>
  66 + </div>
  67 + </div>
8 </el-carousel-item> 68 </el-carousel-item>
9 </el-carousel> 69 </el-carousel>
  70 +
  71 + <!-- 圆圈页码指示器 -->
  72 + <div class="circle-indicator">
  73 + <div
  74 + v-for="(slide, index) in slides"
  75 + :key="index"
  76 + :class="['circle', { active: currentSlide === index }]"
  77 + @click="goToSlide(index)"
  78 + >
  79 + </div>
  80 + </div>
  81 +
10 </div> 82 </div>
  83 +
11 </template> 84 </template>
12 <script> 85 <script>
13 -import Vue from 'vue'  
14 -import iframeResize from 'iframe-resizer/js/iframeResizer'  
15 -Vue.use(iframeResize) 86 +
16 export default { 87 export default {
17 name: 'WidgetHtmlSlider', 88 name: 'WidgetHtmlSlider',
18 components: {}, 89 components: {},
@@ -23,18 +94,26 @@ export default { @@ -23,18 +94,26 @@ export default {
23 data() { 94 data() {
24 return { 95 return {
25 options: {}, 96 options: {},
26 - urlData:[],  
27 optionsSetUp:{}, 97 optionsSetUp:{},
28 carouselKey: 0, // 重新渲染组件用 98 carouselKey: 0, // 重新渲染组件用
29 flagInter: null, 99 flagInter: null,
30 - isRouterAlive:true, 100 +
  101 + autoPlay: true,
  102 + intervalTime: 5000, // 5秒切换一次
  103 + currentSlide: 0,
  104 + nextSlideIndex: 1,
  105 + progressWidth: '0%',
  106 + progressInterval: null,
  107 +
  108 + slides: [{
  109 + title: "",
  110 + url: "#",
  111 + loading: true,
  112 + error: false,
  113 + useObject: false
  114 + }]
31 }; 115 };
32 }, 116 },
33 - mounted () {  
34 - // 内嵌iframe时  
35 - // this.iframeResizer({log: true,}, this.$refs.iframe);  
36 - // this.changeFrameHeight();  
37 - },  
38 computed: { 117 computed: {
39 transStyle() { 118 transStyle() {
40 const obj = this.objToOne(this.options); 119 const obj = this.objToOne(this.options);
@@ -53,10 +132,9 @@ export default { @@ -53,10 +132,9 @@ export default {
53 carouselStyle() { 132 carouselStyle() {
54 this.initData(this.transStyle); 133 this.initData(this.transStyle);
55 return { 134 return {
56 - //imageList: this.isBlank(this.transStyle.imageAdress)?[]:this.transStyle.imageAdress.split(","),  
57 direction: !this.transStyle.tabType ? this.transStyle.tabDirection : 'horizontal', 135 direction: !this.transStyle.tabType ? this.transStyle.tabDirection : 'horizontal',
58 indicatorPosition: this.transStyle.tabSelector, 136 indicatorPosition: this.transStyle.tabSelector,
59 - interval: this.transStyle.tabTime, 137 + // intervalTime: this.transStyle.tabTime,
60 type: this.transStyle.tabType 138 type: this.transStyle.tabType
61 } 139 }
62 } 140 }
@@ -64,15 +142,19 @@ export default { @@ -64,15 +142,19 @@ export default {
64 watch: { 142 watch: {
65 value: { 143 value: {
66 handler(val) { 144 handler(val) {
67 - this.options = val;  
68 - this.optionsSetUp = val.setup;  
69 - this.handlerUrlData(); 145 + if(!this.ispreview){
  146 + this.options = val;
  147 + this.optionsSetUp = val.setup;
  148 + this.handlerUrlData();
  149 + }
70 }, 150 },
71 deep: true, 151 deep: true,
72 }, 152 },
73 carouselStyle: { 153 carouselStyle: {
74 handler(newValue, oldValue) { 154 handler(newValue, oldValue) {
75 - if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) { 155 + if (JSON.stringify(newValue) !== JSON.stringify(oldValue)
  156 + && !this.ispreview
  157 + ) {
76 this.carouselKey++; 158 this.carouselKey++;
77 } 159 }
78 }, 160 },
@@ -81,28 +163,63 @@ export default { @@ -81,28 +163,63 @@ export default {
81 created() { 163 created() {
82 this.options = this.value; 164 this.options = this.value;
83 }, 165 },
  166 + mounted() {
  167 + // 初始加载第一个幻灯片
  168 + this.slides[0].loading = true;
  169 + this.startProgressBar();
  170 + // 设置超时检查
  171 + setTimeout(() => {
  172 + // console.log("12313",this.slides);
  173 + for(let index=0;index<this.slides.length;index++){
  174 + let slide = this.slides[index];
  175 + if (slide.loading && !slide.useObject) {
  176 + this.slides[index].useObject = true;
  177 + } else if (slide.loading && slide.useObject) {
  178 + this.slides[index].loading = false;
  179 + this.slides[index].error = true;
  180 + }
  181 + }
  182 + // _this.slides.forEach((slide, index) => {
  183 + // if (slide.loading && !slide.useObject) {
  184 + // this.slides[index].useObject = true;
  185 + // } else if (slide.loading && slide.useObject) {
  186 + // this.slides[index].loading = false;
  187 + // this.slides[index].error = true;
  188 + // }
  189 + // });
  190 + }, this.intervalTime);
  191 + },
  192 + beforeDestroy() {
  193 + clearInterval(this.progressInterval);
  194 + },
84 methods: { 195 methods: {
85 - reload(){  
86 - this.isRouterAlive=false;  
87 - this.$nextTick(function(){  
88 - this.isRouterAlive=true;  
89 - })  
90 - }, 196 + // reload(){
  197 + // this.isRouterAlive=false;
  198 + // this.$nextTick(function(){
  199 + // this.isRouterAlive=true;
  200 + // })
  201 + // },
91 initData(data) { 202 initData(data) {
92 let urlUp =[]; 203 let urlUp =[];
93 if(this.hasOwn(data,"urls")){ 204 if(this.hasOwn(data,"urls")){
94 urlUp = data['urls']; 205 urlUp = data['urls'];
95 } 206 }
96 - let urlData = []; 207 + let slides = [];
97 if(this.isNotBlankArray(urlUp)){ 208 if(this.isNotBlankArray(urlUp)){
98 for(let i=0;i<urlUp.length;i++){ 209 for(let i=0;i<urlUp.length;i++){
99 const url = urlUp[i].url; 210 const url = urlUp[i].url;
100 - urlData[i] = url; 211 + const slidesOne = {};
  212 + slidesOne.title="";
  213 + slidesOne.url=url;
  214 + slidesOne.loading=true;
  215 + slidesOne.error=false;
  216 + slidesOne.useObject=false;
  217 + slides.push(slidesOne);
101 } 218 }
102 } 219 }
103 - // console.log("12",urlData);  
104 - this.urlData = urlData;  
105 - this.urlData={...this.urlData}; 220 + this.slides = slides;
  221 + this.intervalTime = this.isNotBlank(this.transStyle.tabTime)? this.transStyle.tabTime:5000;
  222 + // this.slides={...this.slides};
106 }, 223 },
107 handlerUrlData(){ 224 handlerUrlData(){
108 const data = this.optionsSetUp; 225 const data = this.optionsSetUp;
@@ -112,29 +229,290 @@ export default { @@ -112,29 +229,290 @@ export default {
112 }else if(this.hasOwn(data,"dynamicHtmlSlider")){ 229 }else if(this.hasOwn(data,"dynamicHtmlSlider")){
113 urlUp = data['dynamicHtmlSlider']; 230 urlUp = data['dynamicHtmlSlider'];
114 } 231 }
115 - let urlData = []; 232 + let slides = [];
116 if(this.isNotBlankArray(urlUp)){ 233 if(this.isNotBlankArray(urlUp)){
117 for(let i=0;i<urlUp.length;i++){ 234 for(let i=0;i<urlUp.length;i++){
118 const url = urlUp[i].url; 235 const url = urlUp[i].url;
119 - urlData[i] = url; 236 + const slidesOne = {};
  237 + slidesOne.title="";
  238 + slidesOne.url=url;
  239 + slidesOne.loading=true;
  240 + slidesOne.error=false;
  241 + slidesOne.useObject=false;
  242 + slides.push(slidesOne);
120 } 243 }
121 } 244 }
122 - this.urlData = urlData;  
123 - this.urlData={...this.urlData}; 245 + this.slides = slides;
  246 + // this.slides={...this.slides};
124 }, 247 },
  248 +
  249 + goToSlide(index) {
  250 + this.$refs.carousel.setActiveItem(index);
  251 + },
  252 + prevSlide() {
  253 + this.$refs.carousel.prev();
  254 + },
  255 + nextSlide() {
  256 + this.$refs.carousel.next();
  257 + },
  258 + onContentLoad(index) {
  259 + this.slides[index].loading = false;
  260 + this.slides[index].error = false;
  261 + },
  262 + onContentError(index) {
  263 + if (!this.slides[index].useObject) {
  264 + // 尝试使用object标签作为备用
  265 + this.slides[index].useObject = true;
  266 + this.slides[index].loading = true;
  267 + this.slides[index].error = false;
  268 + } else {
  269 + this.slides[index].loading = false;
  270 + this.slides[index].error = true;
  271 + }
  272 + },
  273 + handleSlideChange(currentIndex, prevIndex) {
  274 + this.currentSlide = currentIndex;
  275 + // 计算下一个幻灯片索引(用于预加载)
  276 + this.nextSlideIndex = (currentIndex + 1) % this.slides.length;
  277 +
  278 + // 启动当前幻灯片的加载(如果尚未加载)
  279 + if (this.slides[currentIndex].loading === false &&
  280 + this.slides[currentIndex].error === false) {
  281 + // 内容已加载,无需操作
  282 + } else {
  283 + this.slides[currentIndex].loading = true;
  284 + this.slides[currentIndex].error = false;
  285 + }
  286 +
  287 + // 启动进度条
  288 + this.startProgressBar();
  289 + },
  290 + startProgressBar() {
  291 + clearInterval(this.progressInterval);
  292 + this.progressWidth = '0%';
  293 +
  294 + if (!this.autoPlay) return;
  295 +
  296 + const startTime = Date.now();
  297 + const duration = this.intervalTime;
  298 +
  299 + this.progressInterval = setInterval(() => {
  300 + const elapsed = Date.now() - startTime;
  301 + const percent = Math.min(100, (elapsed / duration) * 100);
  302 + this.progressWidth = percent + '%';
  303 +
  304 + if (percent >= 100) {
  305 + clearInterval(this.progressInterval);
  306 + }
  307 + }, this.intervalTime);
  308 + }
125 }, 309 },
126 } 310 }
127 </script> 311 </script>
  312 +<style>
  313 +* {
  314 + margin: 0;
  315 + padding: 0;
  316 + box-sizing: border-box;
  317 +}
128 318
129 -<style scoped lang="scss">  
130 -.carousel { 319 +body, html {
131 width: 100%; 320 width: 100%;
132 height: 100%; 321 height: 100%;
  322 + overflow: hidden;
  323 + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  324 + background: #000;
133 } 325 }
134 326
135 -.carousel-img { 327 +.fullscreen-carousel {
136 width: 100%; 328 width: 100%;
137 height: 100%; 329 height: 100%;
  330 + position: relative;
  331 + background: #000;
  332 +}
  333 +
  334 +.el-carousel {
  335 + width: 100%;
  336 + height: 100%;
  337 +}
  338 +
  339 +.el-carousel__container {
  340 + height: 100% !important;
  341 +}
  342 +
  343 +.slide {
  344 + width: 100%;
  345 + height: 100%;
  346 + display: flex;
  347 + justify-content: center;
  348 + align-items: center;
  349 + background: #000;
  350 +}
  351 +
  352 +.content-container {
  353 + width: 100%;
  354 + height: 100%;
  355 + position: relative;
  356 + overflow: hidden;
  357 +}
  358 +
  359 +.content-container iframe,
  360 +.content-container object {
  361 + width: 100%;
  362 + height: 100%;
  363 + border: none;
  364 + opacity: 0;
  365 + transition: opacity 0.5s ease-in-out;
  366 +}
  367 +
  368 +.content-container iframe.loaded,
  369 +.content-container object.loaded {
  370 + opacity: 1;
  371 +}
  372 +
  373 +.fallback-content {
  374 + width: 100%;
  375 + height: 100%;
  376 + display: flex;
  377 + flex-direction: column;
  378 + justify-content: center;
  379 + align-items: center;
  380 + background: linear-gradient(135deg, #2c3e50, #4ca1af);
  381 + color: white;
  382 + text-align: center;
  383 + padding: 20px;
  384 +}
  385 +
  386 +.fallback-content i {
  387 + font-size: 3rem;
  388 + margin-bottom: 20px;
  389 + color: #ffc107;
  390 +}
  391 +
  392 +.fallback-content h4 {
  393 + font-size: 1.5rem;
  394 + margin-bottom: 10px;
  395 +}
  396 +
  397 +.loading, .error {
  398 + position: absolute;
  399 + top: 0;
  400 + left: 0;
  401 + width: 100%;
  402 + height: 100%;
  403 + display: flex;
  404 + flex-direction: column;
  405 + justify-content: center;
  406 + align-items: center;
  407 + background: rgba(0, 0, 0, 0.8);
  408 + color: white;
  409 + z-index: 20;
  410 +}
  411 +
  412 +.loading i, .error i {
  413 + font-size: 2rem;
  414 + margin-bottom: 15px;
  415 +}
  416 +
  417 +/* 隐藏轮播指示器 */
  418 +.el-carousel__indicators {
  419 + display: none;
138 } 420 }
139 -</style>  
140 421
  422 +/* 加载动画 */
  423 +.spinner {
  424 + width: 40px;
  425 + height: 40px;
  426 + border: 4px solid rgba(255, 255, 255, 0.3);
  427 + border-radius: 50%;
  428 + border-top-color: #fff;
  429 + animation: spin 1s ease-in-out infinite;
  430 +}
  431 +
  432 +@keyframes spin {
  433 + to { transform: rotate(360deg); }
  434 +}
  435 +
  436 +/* 圆圈页码指示器 */
  437 +.circle-indicator {
  438 + position: fixed;
  439 + bottom: 20px;
  440 + left: 50%;
  441 + transform: translateX(-50%);
  442 + display: flex;
  443 + gap: 10px;
  444 + z-index: 100;
  445 +}
  446 +
  447 +.circle {
  448 + width: 12px;
  449 + height: 12px;
  450 + border-radius: 50%;
  451 + background: rgba(255, 255, 255, 0.4);
  452 + transition: all 0.3s ease;
  453 + cursor: pointer;
  454 +}
  455 +
  456 +.circle.active {
  457 + background: #fff;
  458 + transform: scale(1.2);
  459 + box-shadow: 0 0 5px rgba(255, 255, 255, 0.8);
  460 +}
  461 +
  462 +.circle:hover {
  463 + background: rgba(255, 255, 255, 0.7);
  464 +}
  465 +
  466 +/* 控制按钮 */
  467 +.controls {
  468 + position: fixed;
  469 + top: 50%;
  470 + transform: translateY(-50%);
  471 + width: 100%;
  472 + display: flex;
  473 + justify-content: space-between;
  474 + padding: 0 20px;
  475 + z-index: 100;
  476 + opacity: 0;
  477 + transition: opacity 0.3s ease;
  478 +}
  479 +
  480 +.fullscreen-carousel:hover .controls {
  481 + opacity: 0.7;
  482 +}
  483 +
  484 +.controls:hover {
  485 + opacity: 1;
  486 +}
  487 +//el-icon-arrow-left
  488 +.control-btn {
  489 + background: rgba(0, 0, 0, 0.5);
  490 + color: white;
  491 + border: none;
  492 + width: 50px;
  493 + height: 50px;
  494 + border-radius: 50%;
  495 + display: flex;
  496 + justify-content: center;
  497 + align-items: center;
  498 + cursor: pointer;
  499 + font-size: 1.5rem;
  500 + transition: all 0.3s ease;
  501 +}
  502 +
  503 +.control-btn:hover {
  504 + background: rgba(0, 0, 0, 0.8);
  505 + transform: scale(1.1);
  506 +}
  507 +
  508 +/* 进度指示器 */
  509 +.progress-indicator {
  510 + position: fixed;
  511 + top: 0;
  512 + left: 0;
  513 + height: 3px;
  514 + background: linear-gradient(90deg, #4ca1af, #2c3e50);
  515 + z-index: 101;
  516 + transition: width 0.3s ease;
  517 +}
  518 +</style>
src/views/bigscreenDesigner/designer/widget/table/widgetTable.vue
@@ -18,9 +18,8 @@ @@ -18,9 +18,8 @@
18 <li 18 <li
19 v-for="(item, index) in list" 19 v-for="(item, index) in list"
20 :key="index" 20 :key="index"
21 - :style="tableRowHeight()" 21 + :style="[tableLiHeight()]"
22 > 22 >
23 - <!-- class="contentStyle"-->  
24 <div 23 <div
25 v-for="(itemChild, idx) in header" 24 v-for="(itemChild, idx) in header"
26 :key="idx" 25 :key="idx"
@@ -79,7 +78,7 @@ export default { @@ -79,7 +78,7 @@ export default {
79 return { 78 return {
80 position: this.ispreview ? "absolute" : "static", 79 position: this.ispreview ? "absolute" : "static",
81 width: allStyle.width + "px", 80 width: allStyle.width + "px",
82 - height: allStyle.height + "px", 81 + // height: allStyle.height + "px",
83 left: allStyle.left + "px", 82 left: allStyle.left + "px",
84 top: allStyle.top + "px", 83 top: allStyle.top + "px",
85 background: this.optionsSetUp.tableBgColor 84 background: this.optionsSetUp.tableBgColor
@@ -213,6 +212,8 @@ export default { @@ -213,6 +212,8 @@ export default {
213 tableRowHeight() { 212 tableRowHeight() {
214 let styleJson = {}; 213 let styleJson = {};
215 const bAutoHeight = this.optionsSetUp.bAutoHeight; 214 const bAutoHeight = this.optionsSetUp.bAutoHeight;
  215 + styleJson["height"] = "auto";
  216 + // alert(bAutoHeight);
216 if(!bAutoHeight){ 217 if(!bAutoHeight){
217 if (this.optionsSetUp.rowHeight) { 218 if (this.optionsSetUp.rowHeight) {
218 styleJson["height"] = this.optionsSetUp.rowHeight + "px"; 219 styleJson["height"] = this.optionsSetUp.rowHeight + "px";
@@ -223,10 +224,14 @@ export default { @@ -223,10 +224,14 @@ export default {
223 } 224 }
224 }else{ 225 }else{
225 styleJson["height"] = "auto"; 226 styleJson["height"] = "auto";
226 - styleJson["line-height"]=this.optionsSetUp.rowHeight+ "px";  
227 } 227 }
228 return styleJson; 228 return styleJson;
229 }, 229 },
  230 + tableLiHeight(){
  231 + let styleJson = {};
  232 + styleJson["height"]=this.optionsSetUp.rowHeight+ "px"
  233 + return styleJson;
  234 + },
230 tableFiledWidth(index) { 235 tableFiledWidth(index) {
231 let styleJson = {}; 236 let styleJson = {};
232 if (this.optionsSetUp.dynamicAddTable[index].width) { 237 if (this.optionsSetUp.dynamicAddTable[index].width) {
@@ -264,8 +269,6 @@ export default { @@ -264,8 +269,6 @@ export default {
264 } 269 }
265 270
266 .txtScroll-top .infoList li { 271 .txtScroll-top .infoList li {
267 - //height: 50px;  
268 - //line-height: 50px;  
269 display: flex; 272 display: flex;
270 flex-direction: row; 273 flex-direction: row;
271 } 274 }
@@ -279,12 +282,4 @@ export default { @@ -279,12 +282,4 @@ export default {
279 overflow: hidden; 282 overflow: hidden;
280 text-overflow: ellipsis; 283 text-overflow: ellipsis;
281 } 284 }
282 -  
283 -/*.txtScroll-top .infoList li:nth-child(n) {  
284 - background: rgb(0, 59, 81);  
285 -}  
286 -  
287 -.txtScroll-top .infoList li:nth-child(2n) {  
288 - background: rgb(10, 39, 50);  
289 -}*/  
290 </style> 285 </style>