Merge branch 'master' of github.com:gcpaas/DataRoom

main
liu.tao3 1 year ago
commit 5b3ed7e80d

@ -88,4 +88,7 @@ public class Chart {
@ApiModelProperty(notes = "边框配置")
private Map<String, Object> border;
@ApiModelProperty(notes = "计算表达式")
private String expression;
}

@ -43,6 +43,9 @@ public class ScreenDateTimePickerChart extends Chart {
@ApiModelProperty(notes = "绑定值的格式")
private String valueFormat;
@ApiModelProperty(notes = "显示的格式")
private String format;
@ApiModelProperty(notes = "下拉框")
private Map<String, Object> dropDownBox;

@ -53,6 +53,9 @@ public class ScreenTimePickerChart extends Chart {
@ApiModelProperty(notes = "绑定值的格式")
private String valueFormat;
@ApiModelProperty(notes = "显示的格式")
private String format;
}

@ -8,6 +8,7 @@
:class="['basic-component-date-picker', `date-picker-${config.code}`]"
:popper-class="'basic-component-date-picker date-picker-popper-' + config.code"
:value-format="config.customize.valueFormat"
:format="config.customize.format"
:default-value="value"
size="large"
@focus="focusEvent"

@ -21,6 +21,20 @@
</div>
<SettingTitle>基础</SettingTitle>
<div class="lc-field-body">
<el-form-item label="组件类型">
<el-select
v-model="config.customize.type"
class="bs-el-select"
popper-class="bs-el-select"
>
<el-option
v-for="(type) in displayTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
/>
</el-select>
</el-form-item>
<!-- 选择器背景颜色 -->
<el-form-item label="背景颜色">
<ColorPicker
@ -92,43 +106,80 @@
/>
</el-form-item>
</div>
<SettingTitle>时间格式</SettingTitle>
<SettingTitle>日期时间格式</SettingTitle>
<div class="lc-field-body">
<el-form-item label="显示类型">
<el-select
v-model="config.customize.type"
class="bs-el-select"
popper-class="bs-el-select"
>
<el-option
v-for="(type) in displayTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
<el-form-item label="时间显示格式化">
<div class="description">
<el-input
v-model="config.customize.format"
placeholder="例如yyyy-MM-dd HH:mm:ss"
clearable
/>
</el-select>
<el-tooltip
placement="top"
>
<span
class="el-icon-question"
style="color:#9e9e9e"
/>
<div slot="content">
yyyy表示年份例如2017<br>
M表示月份不补0例如1<br>
MM表示月份补0例如01<br>
d表示日期不补0例如2<br>
dd表示日期补0例如02<br>
小时H表示小时24小时制不补0例如3<br>
小时HH表示小时24小时制补0例如03<br>
小时h表示小时12小时制须和 A a 使用不补0例如3<br>
小时hh表示小时12小时制须和 A a 使用补0例如03<br>
分钟m表示分钟不补0例如4<br>
分钟mm表示分钟补0例如04<br>
s表示秒钟不补0例如5<br>
ss表示秒钟补0例如05<br>
AM/PMA format 可用大写例如AM<br>
am/pma format 可用小写例如am<br>
JS时间戳timestamp value-format 可用组件绑定值为number类型例如1483326245000<br>
不需要格式化字符[MM]使用方括号标识不需要格式化的字符例如MM<br>
具体的时间格式化字符和使用方式可以参考Element-UI官网的日期选择器的时间格式化部分
</div>
</el-tooltip>
</div>
</el-form-item>
<el-form-item label="时间格式化类型">
<el-select
v-model="config.customize.formatType"
class="bs-el-select"
popper-class="bs-el-select"
clearable
>
<el-option
v-for="(type) in formatTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
/>
</el-select>
<el-form-item label="时间数据类型">
<div class="description">
<el-select
v-model="config.customize.formatType"
class="bs-el-select"
popper-class="bs-el-select"
clearable
>
<el-option
v-for="(type) in formatTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
/>
</el-select>
<el-tooltip
placement="top"
>
<span
class="el-icon-question"
style="color:#9e9e9e"
/>
<div slot="content">
时间戳从1970年1月1日开始计算的秒数数据类型为数值型例如1483326245000<br>
自定义通过输入特定的格式字符串来指定时间的数据格式例如yyyy-MM-dd HH:mm:ss对应数据为 2023-10-08 09:30:00<br>
</div>
</el-tooltip>
</div>
</el-form-item>
<el-form-item
v-if="config.customize.formatType === 'custom'"
label="自定义时间格式"
label="时间数据格式"
>
<!-- year/month/date/week/ datetime/datetimerange/daterange -->
<div class="time-format-description">
<div class="description">
<el-input
v-model="config.customize.valueFormat"
placeholder="例如yyyy-MM-dd HH:mm:ss"
@ -143,14 +194,26 @@
style="color:#9e9e9e"
/>
<div slot="content">
时间格式示例<br>
yyyy表示年份<br>
MM表示月份<br>
dd表示日期<br>
HH表示小时24小时制<br>
mm表示分钟<br>
ss表示秒<br>
具体可参考Element-UI官网的日期选择器的时间格式化部分
<div slot="content">
yyyy表示年份例如2017<br>
M表示月份不补0例如1<br>
MM表示月份补0例如01<br>
d表示日期不补0例如2<br>
dd表示日期补0例如02<br>
小时H表示小时24小时制不补0例如3<br>
小时HH表示小时24小时制补0例如03<br>
小时h表示小时12小时制须和 A a 使用不补0例如3<br>
小时hh表示小时12小时制须和 A a 使用补0例如03<br>
分钟m表示分钟不补0例如4<br>
分钟mm表示分钟补0例如04<br>
s表示秒钟不补0例如5<br>
ss表示秒钟补0例如05<br>
AM/PMA format 可用大写例如AM<br>
am/pma format 可用小写例如am<br>
JS时间戳timestamp value-format 可用组件绑定值为number类型例如1483326245000<br>
不需要格式化字符[MM]使用方括号标识不需要格式化的字符例如MM<br>
具体的时间格式化字符和使用方式可以参考Element-UI官网的日期选择器的时间格式化部分
</div>
</div>
</el-tooltip>
</div>
@ -162,7 +225,6 @@
</div>
</template>
<script>
import moment from 'moment'
import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
@ -227,7 +289,7 @@ export default {
width: 97%;
padding: 16px;
}
.time-format-description{
.description{
display: flex;
align-items: center;
.el-tooltip{

@ -32,7 +32,8 @@ const customConfig = {
type: 'datetimerange',
// 时间格式化类型:时间戳timestamp自定义custom
formatType: 'custom',
// 绑定值的格式
format: 'yyyy-MM-dd HH:mm:ss',
// 时间数据格式
valueFormat: 'yyyy-MM-dd HH:mm:ss',
// 下拉框
dropDownBox: {

@ -25,7 +25,7 @@ const customConfig = {
titleStyle: {
// 标题大小
fontSize: 14,
fontSize: 18,
// 标题颜色
color: '#fff',
// 标题间距

@ -6,6 +6,7 @@
clearable
:class="['basic-component-time-picker', `time-picker-${config.code}`]"
:popper-class="'basic-component-time-picker time-picker-popper-' + config.code"
:format="config.customize.format"
:value-format="config.customize.valueFormat"
:default-value="value"
@focus="focusEvent"

@ -84,25 +84,69 @@
</div>
<SettingTitle>时间格式</SettingTitle>
<div class="lc-field-body">
<el-form-item label="时间格式化类型">
<el-select
v-model="config.customize.formatType"
class="bs-el-select"
popper-class="bs-el-select"
>
<el-option
v-for="(type) in formatTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
<el-form-item label="时间显示格式化">
<div class="description">
<el-input
v-model="config.customize.format"
placeholder="例如HH:mm:ss"
clearable
/>
</el-select>
<el-tooltip
placement="top"
>
<span
class="el-icon-question"
style="color:#9e9e9e"
/>
<div slot="content">
小时H表示小时24小时制不补0例如3<br>
小时HH表示小时24小时制补0例如03<br>
小时h表示小时12小时制须和 A a 使用不补0例如3<br>
小时hh表示小时12小时制须和 A a 使用补0例如03<br>
分钟m表示分钟不补0例如4<br>
分钟mm表示分钟补0例如04<br>
s表示秒钟不补0例如5<br>
ss表示秒钟补0例如05<br>
JS时间戳timestamp value-format 可用组件绑定值为number类型例如1483326245000<br>
不需要格式化字符[MM]使用方括号标识不需要格式化的字符例如MM<br>
具体的时间格式化字符和使用方式可以参考Element-UI官网的日期选择器的时间格式化部分
</div>
</el-tooltip>
</div>
</el-form-item>
<el-form-item label="时间数据类型">
<div class="description">
<el-select
v-model="config.customize.formatType"
class="bs-el-select"
popper-class="bs-el-select"
>
<el-option
v-for="(type) in formatTypeOptions"
:key="type.value"
:label="type.label"
:value="type.value"
/>
</el-select>
<el-tooltip
placement="top"
>
<span
class="el-icon-question"
style="color:#9e9e9e"
/>
<div slot="content">
时间戳从1970年1月1日开始计算的秒数数据类型为数值型例如1483326245000<br>
自定义通过输入特定的格式字符串来指定时间的数据格式例如HH:mm:ss对应数据为 09:30:00<br>
</div>
</el-tooltip>
</div>
</el-form-item>
<el-form-item
v-if="config.customize.formatType === 'custom'"
label="自定义时间格式"
label="时间数据格式"
>
<div class="time-format-description">
<div class="description">
<el-input
v-model="config.customize.valueFormat"
placeholder="例如HH:mm:ss"
@ -116,11 +160,17 @@
style="color:#9e9e9e"
/>
<div slot="content">
时间格式示例<br>
HH表示小时24小时制<br>
mm表示分钟<br>
ss表示秒
具体可参考Element-UI官网的日期选择器的时间格式化部分
小时H表示小时24小时制不补0例如3<br>
小时HH表示小时24小时制补0例如03<br>
小时h表示小时12小时制须和 A a 使用不补0例如3<br>
小时hh表示小时12小时制须和 A a 使用补0例如03<br>
分钟m表示分钟不补0例如4<br>
分钟mm表示分钟补0例如04<br>
s表示秒钟不补0例如5<br>
ss表示秒钟补0例如05<br>
JS时间戳timestamp value-format 可用组件绑定值为number类型例如1483326245000<br>
不需要格式化字符[MM]使用方括号标识不需要格式化的字符例如MM<br>
具体的时间格式化字符和使用方式可以参考Element-UI官网的日期选择器的时间格式化部分
</div>
</el-tooltip>
</div>
@ -184,7 +234,7 @@ export default {
width: 97%;
padding: 16px;
}
.time-format-description{
.description{
display: flex;
align-items: center;
.el-tooltip{

@ -41,6 +41,8 @@ const customConfig = {
dropDownSelectedFontColor: '#409EFF',
// 时间格式化类型:时间戳timestamp自定义custom
formatType: 'custom',
// 时间格式化
format: 'HH:mm:ss',
// 绑定值的格式
valueFormat: 'HH:mm:ss'
}

@ -438,26 +438,32 @@ export default {
pageInfo.isPreview = false
this.saveLoading = true
const node = document.querySelector('.render-theme-wrap')
const dataUrl = await toJpeg(node, { quality: 0.2 })
if (showSize(dataUrl) > 200) {
const url = dataURLtoBlob(dataUrl)
// 500KB,500,
const imgRes = await imageConversion.compressAccurately(url, {
size: 200, // 100kb
width: 1280, // 1280
height: 720 // 720
})
const base64 = await translateBlobToBase64(imgRes)
pageInfo.coverPicture = base64.result
const res = await saveScreen(pageInfo)
this.$message.success('保存成功')
return res
let dataUrl = ''
try {
dataUrl = await toJpeg(node, { quality: 0.2 })
} catch (error) {
console.info(error)
}
if (dataUrl) {
if (showSize(dataUrl) > 200) {
const url = dataURLtoBlob(dataUrl)
// 500KB,500,
const imgRes = await imageConversion.compressAccurately(url, {
size: 200, // 100kb
width: 1280, // 1280
height: 720 // 720
})
const base64 = await translateBlobToBase64(imgRes)
pageInfo.coverPicture = base64.result
} else {
pageInfo.coverPicture = dataUrl
}
} else {
pageInfo.coverPicture = dataUrl
const res = await saveScreen(pageInfo)
this.$message.success('保存成功')
return res
pageInfo.coverPicture = ''
}
const res = await saveScreen(pageInfo)
this.$message.success('保存成功')
return res
}
} catch (error) {
console.error(error)

@ -764,6 +764,19 @@ export default {
})
}
}
if (res.params) {
//
res.params.forEach(param => {
if (!this.params.find(item => item.name === param.name)) {
this.params.push({
name: param.name,
value: param.value,
type: param.type,
remark: param.remark
})
}
})
}
deleteKeys.forEach(key => {
delete this.config.dataSource.params[key]
})

@ -0,0 +1,348 @@
<template>
<div class="bs-setting-wrap">
<el-form
ref="form"
:model="config"
:rules="customRules"
label-width="120px"
label-position="left"
class="setting-body bs-el-form"
>
<SettingTitle>基础</SettingTitle>
<div class="lc-field-body">
<el-form-item
label="标题"
label-width="120px"
>
<el-input
v-model="config.title"
placeholder="请输入标题"
clearable
/>
</el-form-item>
</div>
<SettingTitle>边框</SettingTitle>
<div class="lc-field-body">
<BorderSetting
v-if="config.border"
label-width="120px"
:config="config.border"
:bigTitle='config.title'
/>
</div>
<SettingTitle>位置</SettingTitle>
<div class="lc-field-body">
<PosWhSetting
label-width="120px"
:config="config"
/>
</div>
<SettingTitle>旋转</SettingTitle>
<div class="lc-field-body">
<RotateSetting
:config="config"
/>
</div>
<template v-for="group in groupList">
<div :key="group.groupName">
<SettingTitle> {{ group.groupName | filterGroupName }}</SettingTitle>
<div class="lc-field-body">
<div
v-for="(setting, settingIndex) in group.list"
:key="settingIndex+1"
>
<el-form-item
:label="setting.type=== 'padding' ? '' : setting.label"
:label-width="setting.type=== 'padding' ? '0px' :'120px'"
>
<el-input
v-if="setting.type === 'input'"
v-model="setting.value"
:placeholder="`请输入${setting.label}`"
clearable
/>
<el-select
v-else-if="setting.type === 'select'"
v-model="setting.value"
popper-class="bs-el-select"
class="bs-el-select"
:placeholder="`请选择${setting.label}`"
:multiple="setting.multiple"
clearable
>
<el-option
v-for="(opt, optIndex) in setting.options"
:key="optIndex"
:label="opt.label"
:value="opt.value"
/>
</el-select>
<template v-else-if="setting.type === 'colorSelect'">
<color-select
v-model="setting.value"
@update="updateColorScheme"
/>
<div
style="
display: flex;
align-items: center;
flex-wrap: wrap;
"
class="color-picker-box"
>
<el-color-picker
v-for="(colorItem, colorItemIndex) in colors"
:key="colorItemIndex"
v-model="setting.value[colorItemIndex]"
popper-class="bs-el-color-picker"
show-alpha
class="start-color"
/>
<span
class="el-icon-circle-plus-outline"
style="color: #007aff; font-size: 20px"
@click="addColor"
/>
<span
v-if="colors.length"
class="el-icon-remove-outline"
style="color: #ea0b30; font-size: 20px"
@click="delColor()"
/>
</div>
</template>
<el-color-picker
v-else-if="setting.type === 'colorPicker'"
v-model="setting.value"
popper-class="bs-el-color-picker"
class="bs-el-color-picker"
show-alpha
/>
<!-- 渐变色设置 -->
<GradualSetting
v-else-if="setting.type === 'gradual'"
v-model="setting.value"
/>
<el-input-number
v-else-if="setting.type === 'inputNumber'"
v-model="setting.value"
class="bs-el-input-number"
:step="setting.step || 1"
:min="setting.min || 0"
:max="setting.max || 100000"
/>
<el-radio-group
v-else-if="setting.type === 'radio'"
v-model="setting.value"
class="bs-el-radio-group"
>
<template v-for="(opt, optIndex) in setting.options">
<el-radio-button
:key="optIndex"
:label="opt.value"
>
{{ opt.label }}
</el-radio-button>
</template>
</el-radio-group>
<el-switch
v-else-if="setting.type === 'switch'"
v-model="setting.value"
class="bs-el-switch"
:active-value="setting.active"
:inactive-value="setting.inactive"
/>
<el-slider
v-else-if="setting.type === 'slider'"
v-model="setting.value"
:min="0"
:max="1"
:step="0.01"
/>
<PaddingSetting
v-else-if="setting.type === 'padding'"
v-model="setting.value"
/>
</el-form-item>
</div>
</div>
</div>
</template>
<!-- </div> -->
</el-form>
</div>
</template>
<script>
import BorderSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderSetting.vue'
import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
import { chartSettingMixins } from 'data-room-ui/js/mixins/chartSettingMixins'
import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
// import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
import PaddingSetting from 'data-room-ui/BigScreenDesign/RightSetting/PaddingSetting/index.vue'
import GradualSetting from 'data-room-ui/BigScreenDesign/RightSetting/GradualSetting/index.vue'
import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
import RotateSetting from 'data-room-ui/BigScreenDesign/RightSetting/RotateSetting.vue'
export default {
name: 'EchartsCustomSetting',
components: {
ColorSelect,
// ColorPicker,
PaddingSetting,
GradualSetting,
PosWhSetting,
BorderSetting,
SettingTitle,
RotateSetting
},
mixins: [chartSettingMixins],
data () {
return {
groupList: []
}
},
filters: {
filterGroupName (val) {
const settingGroup = {
basic: '基础',
position: '位置',
graph: '图表',
rotate: '旋转',
grid: '网格线',
legend: '图例',
xAxis: 'X轴',
yAxis: 'Y轴',
padding: '边距',
other: '其他'
}
return settingGroup[val]
}
},
computed: {
config: {
get () {
return this.$store.state.bigScreen.activeItemConfig
},
set (val) {
this.$store.commit('bigScreen/changeActiveItemConfig', val)
}
},
appCode: {
get () {
return this.$store.state.bigScreen.pageInfo.appCode
}
},
pageCode () {
return this.$route.query.code
}
},
watch: {
groupList: {
// 12custom3xy
handler (val) {
const setList = [].concat(...val.map(item => item.list))
const newSetList = [...this.config.setting, ...setList]
let newArr = [] //
const hash = {}
newArr = newSetList.reduce(function (acc, cru, index) {
if (!hash[cru.field]) {
hash[cru.field] = { index: index }
acc.push(cru)
} else {
acc.splice(hash[cru.field].index, 1, cru)
}
return acc
}, [])
this.$store.commit('bigScreen/changeActiveItemConfig', { ...this.config, setting: newArr })
},
deep: true
}
},
mounted () {
this.init()
const groupNameList = []
this.config.setting.filter(
(item) => item.tabName === 'custom'
).forEach(item => {
if (item.tabName === 'custom' && item.groupName) {
if (!groupNameList.includes(item.groupName)) {
groupNameList.push(item.groupName)
this.groupList.push({
groupName: item.groupName,
list: [item]
})
} else {
this.groupList.find(group => group.groupName === item.groupName).list.push(item)
}
} else {
if (this.groupList.find(group => group.groupName === 'other')) {
this.groupList.find(group => group.groupName === 'other').list.push(item)
} else {
this.groupList.push({
groupName: 'other',
list: [item]
})
}
}
})
for (let i = 0; i < this.groupList.length; i++) {
if (this.groupList[i].groupName === 'other') {
const otherObject = this.groupList.splice(i, 1)[0]
this.groupList.push(otherObject)
break
}
}
},
methods: {
init () {
this.config = this.$store.state.bigScreen.activeItemConfig
}
}
}
</script>
<style lang="scss" scoped>
@import '../../assets/style/settingWrap.scss';
@import '../../assets/style/bsTheme.scss';
//
.add-filter-box {
position: relative;
.add-filter {
margin-left: 90px;
margin-bottom: 10px;
}
.add-filter-btn {
position: absolute;
top: 0;
}
}
.lc-field-body {
padding:12px 16px;
}
.el-form-item{
margin-bottom: 6px !important;
}
.lc-field-title {
position: relative;
padding-left: 12px;
line-height: 30px;
height: 30px;
margin-bottom: 12px;
&:after {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
content: '';
width: 4px;
height: 14px;
background-color: var(--bs-el-color-primary);
}
}
::v-deep .el-color-picker__trigger {
border-color: var(--bs-el-border);
}
.color-picker-box{
::v-deep .el-color-picker__trigger {
width: 27px!important;
}
}
</style>

@ -0,0 +1,74 @@
<!--
* @description: 旋转的角度
-->
<template>
<div>
<el-form-item
:label-width="labelWidth"
label="绕x轴旋转角度"
>
<el-input-number
v-model="config.rotateX"
class="bs-el-input-number"
:min="0"
:max="360"
:step="1"
/>
</el-form-item>
<el-form-item
:label-width="labelWidth"
label="绕y轴旋转角度"
>
<el-input-number
v-model="config.rotateY"
class="bs-el-input-number"
:min="0"
:max="360"
:step="1"
/>
</el-form-item> <el-form-item
:label-width="labelWidth"
label="绕z轴旋转角度"
>
<el-input-number
v-model="config.rotateZ"
class="bs-el-input-number"
:min="0"
:max="360"
:step="1"
/>
</el-form-item>
</div>
</template>
<script>
export default {
name: '',
props: {
config: {
type: Object,
default: () => ({
rotateX: 0,
rotateY: 0,
rotateZ: 0
})
},
labelWidth: {
type: String,
default: '120px'
}
},
data () {
return {
}
},
mounted () {},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>

@ -56,6 +56,7 @@ import { resolveComponentType } from 'data-room-ui/js/utils'
import DataSetting from './DataSetting.vue'
import rightSetting from 'data-room-ui/js/utils/rightSettingImport'
import CustomComponent from './G2CustomSetting.vue'
import EchartsCustomSetting from './EchartsCustomSetting.vue'
import Svgs from 'data-room-ui/Svgs/setting.vue'
import { mapState, mapMutations } from 'vuex'
// import _ from 'lodash'
@ -78,7 +79,7 @@ export default {
Svgs,
// g2Plot, 使
RemoteComponent: CustomComponent,
EchartsComponent: CustomComponent
EchartsComponent: EchartsCustomSetting
},
data () {
return {
@ -114,6 +115,9 @@ export default {
x: this.config?.x,
y: this.config?.y,
z: this.config?.z,
rotateX: this.config?.rotateX,
rotateY: this.config?.rotateY,
rotateZ: this.config?.rotateZ,
setting: cloneDeep(this.config?.setting),
customize: cloneDeep(this.config?.customize),
url: this.config?.url,

@ -339,69 +339,57 @@ export default {
}
})
},
save (pageJump = false) {
async save (pageJump = false) {
this.loading = true
let dataUrl = ''
const node = document.querySelector('.remote-preview-inner-wrap')
// node
const childrenNode = node.children[0]
toJpeg(childrenNode, { quality: 0.2 })
.then((dataUrl) => {
const that = this
if (showSize(dataUrl) > 200) {
const url = dataURLtoBlob(dataUrl)
// 500KB,500,
imageConversion
.compressAccurately(url, {
size: 200, // 100kb
width: 1280, // 1280
height: 720 // 720
})
.then((res) => {
translateBlobToBase64(res, function (e) {
this.form.coverPicture = e.result
updateBizComponent(this.form)
.then(() => {
this.$message({
message: '保存成功',
type: 'success',
duration: 800,
onClose: () => {
//
if (pageJump) {
this.pageJump()
}
}
})
})
.finally(() => {
that.loading = false
})
})
})
} else {
this.form.coverPicture = dataUrl
updateBizComponent(this.form)
.then(() => {
this.$message({
message: '保存成功',
type: 'success',
duration: 800,
onClose: () => {
//
if (pageJump) {
this.pageJump()
}
}
})
})
.finally(() => {
this.loading = false
})
try {
dataUrl = await toJpeg(childrenNode, { quality: 0.2 })
} catch (error) {
console.info(error)
}
console.log(dataUrl)
if (dataUrl) {
if (showSize(dataUrl) > 200) {
const url = dataURLtoBlob(dataUrl)
// 500KB,500,
imageConversion.compressAccurately(
url,
{
size: 200, // 100kb
width: 1280, // 1280
height: 720 // 720
}
).then((res) => {
translateBlobToBase64(res, (e) => {
this.form.coverPicture = e.result
})
})
} else {
this.form.coverPicture = dataUrl
}
} else {
this.form.coverPicture = ''
}
updateBizComponent(this.form).then(() => {
this.$message({
message: '保存成功',
type: 'success',
duration: 800,
onClose: () => {
//
if (pageJump) {
this.pageJump()
}
}
})
.catch(() => {
this.loading = false
})
this.loading = false
}).catch((error) => {
console.info(error)
this.loading = false
})
},
createdImg () {
this.loading = true
@ -421,7 +409,8 @@ export default {
})
this.loading = false
})
.catch(() => {
.catch((error) => {
console.info(error)
this.$message.warning('出现未知错误,请重试')
this.loading = false
})
@ -446,7 +435,7 @@ export default {
background: var(--bs-background-2);
overflow: hidden;
> * {
>* {
box-sizing: border-box;
}
@ -523,11 +512,13 @@ export default {
flex-direction: row;
align-items: center;
justify-content: space-between;
.code-tab-btn{
.code-tab-btn {
// width: 90px;
cursor: pointer;
text-align: center;
}
.code-tab {
font-size: 14px;
align-items: center;
@ -569,12 +560,14 @@ export default {
height: 100%;
background: var(--bs-background-1);
position: relative;
.code-tab-header{
.code-tab-header {
height: 40px;
display: flex;
flex-direction: row;
align-items: center;
background-color: var(--bs-background-2);
.code-tab {
font-size: 14px;
align-items: center;
@ -593,16 +586,61 @@ export default {
}
</style>
<style>
.cm-s-material-darker.CodeMirror,
.cm-s-material-darker .CodeMirror-gutters
{
background: var(--bs-background-1) !important;
}
.CodeMirror-scroll {
background-color: var(--bs-background-1) !important;
}
.CodeMirror-gutters {
border-right: 1px solid var(--bs-background-1) !important;
background-color: var(--bs-background-1) !important;
}
.cm-s-material-darker.CodeMirror,
.cm-s-material-darker .CodeMirror-gutters {
background: var(--bs-background-1) !important;
}
.CodeMirror-scroll {
background-color: var(--bs-background-1) !important;
}
.CodeMirror-gutters {
border-right: 1px solid var(--bs-background-1) !important;
background-color: var(--bs-background-1) !important;
}
.CodeMirror-vscrollbar {
right: 0;
top: 0;
overflow-x: hidden;
overflow-y: scroll;
margin-right: 4px;
}
/* Webkit浏览器滚动条样式 */
.CodeMirror-vscrollbar::-webkit-scrollbar {
width: 6px;
/* 滚动条宽度 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
background-color: #444851;
/* 滚动条滑块颜色 */
border-radius: 4px;
/* 滚动条滑块圆角 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb:hover {
background-color: #444851;
/* 滚动条滑块悬停时颜色 */
}
/* Firefox和新版Chrome浏览器滚动条样式 */
.CodeMirror-vscrollbar {
scrollbar-width: thin;
/* 滚动条宽度 */
scrollbar-color: #444851 #444851;
/* 滚动条颜色 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
background-color: #444851;
/* 滚动条滑块颜色 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb:hover {
background-color: #444851;
/* 滚动条滑块悬停时颜色 */
}
</style>

@ -477,7 +477,7 @@ export default {
//
toDesign (form) {
const path = this.type === 'component' ? (window.BS_CONFIG?.routers?.designUrl || '/big-screen/design') : 'big-screen-biz-component-design'
const { href: bigScreenHref } = this.type == 'bizComponent' ? this.$router.resolve({
const { href: bigScreenHref } = this.type === 'bizComponent' ? this.$router.resolve({
path,
query: {
code: form.code,
@ -490,7 +490,7 @@ export default {
}
})
//
window.open(bigScreenHref, '_blank')
window.open(bigScreenHref, '_self')
}
}
}

@ -353,7 +353,7 @@ export default {
}
})
//
window.open(href, '_blank')
window.open(href, '_self')
},
add () {
const page = {

@ -885,7 +885,7 @@ export default {
this.newParamsList = cloneDeep(paramsList)
this.codemirrorOption.mode = this.dataForm.config.requestType === 'frontend' ? 'text/javascript' : 'text/x-groovy'
// this.replaceParams(paramsList)
this.scriptExecute(true)
// this.scriptExecute(true)
})
}
},

@ -358,7 +358,7 @@
<el-table
align="center"
:data="dataPreviewList"
max-height="400"
max-height="100%"
:border="true"
class="bs-el-table bs-scrollbar"
>

@ -1166,3 +1166,49 @@ return ElasticsearchDsService.query(host, port, username, password, path, dsl);
width: 100% !important;
}
</style>
<style>
.CodeMirror-vscrollbar {
right: 0;
top: 0;
overflow-x: hidden;
overflow-y: scroll;
margin-right: 4px;
}
/* Webkit浏览器滚动条样式 */
.CodeMirror-vscrollbar::-webkit-scrollbar {
width: 6px;
/* 滚动条宽度 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
background-color: #444851;
/* 滚动条滑块颜色 */
border-radius: 4px;
/* 滚动条滑块圆角 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb:hover {
background-color: #444851;
/* 滚动条滑块悬停时颜色 */
}
/* Firefox和新版Chrome浏览器滚动条样式 */
.CodeMirror-vscrollbar {
scrollbar-width: thin;
/* 滚动条宽度 */
scrollbar-color: #444851 #444851;
/* 滚动条颜色 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
background-color: #444851;
/* 滚动条滑块颜色 */
}
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb:hover {
background-color: #444851;
/* 滚动条滑块悬停时颜色 */
}
</style>

@ -339,7 +339,7 @@ export default {
case 'com.ibm.db2.jcc.DB2Driver':
return 'jdbc:db2://localhost:5000/db_name'
case 'com.microsoft.sqlserver.jdbc.SQLServerDriver':
return 'jdbc:sqlserver://localhost:1433;databaseName=db_name'
return 'jdbc:sqlserver://localhost:1433;databaseName=db_name;encrypt=false'
case 'org.postgresql.Driver':
return 'jdbc:postgresql://localhost:13308/db_name'
case 'org.apache.hive.jdbc.HiveDriver':

@ -31,6 +31,9 @@ function getEchartsList (files) {
h: config?.option?.height || 320,
x: 0,
y: 0,
rotateX: 0,
rotateY: 0,
rotateZ: 0,
type: 'echartsComponent',
loading: false,
// 把默认右侧配置与自定义右侧配置集合

@ -71,6 +71,42 @@ export default {
this.changeStyle(this.config, true)
}
}
},
'config.rotateX': {
deep: true,
handler (val) {
const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg) rotateZ(${this.config.rotateZ}deg)`
const dom1 = document.querySelector('.bs-design-wrap')
const dom2 = document.querySelector('.render-item-wrap')
dom1.setAttribute('style', 'perspective: 500px;')
dom2.setAttribute('style', 'perspective: 500px;')
dom1.setAttribute('style', 'transform:' + rotate)
dom2.setAttribute('style', 'transform:' + rotate)
}
},
'config.rotateY': {
deep: true,
handler (val) {
const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg) rotateZ(${this.config.rotateZ}deg)`
const dom1 = document.querySelector('.bs-design-wrap')
const dom2 = document.querySelector('.render-item-wrap')
dom1.setAttribute('style', 'perspective: 500px;')
dom2.setAttribute('style', 'perspective: 500px;')
dom1.setAttribute('style', 'transform:' + rotate)
dom2.setAttribute('style', 'transform:' + rotate)
}
},
'config.rotateZ': {
deep: true,
handler (val) {
const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg) rotateZ(${this.config.rotateZ}deg)`
const dom1 = document.querySelector('.bs-design-wrap')
const dom2 = document.querySelector('.render-item-wrap')
dom1.setAttribute('style', 'perspective: 500px;')
dom2.setAttribute('style', 'perspective: 500px;')
dom1.setAttribute('style', 'transform:' + rotate)
dom2.setAttribute('style', 'transform:' + rotate)
}
}
},
mounted () {
@ -410,8 +446,8 @@ export default {
seriesStyle (config) {
const _config = CloneDeep(config)
const seriesCustom = _config.option.seriesCustom
// const ids = ['barTopColor', 'barColor', 'barBottomColor', 'shadowColor', 'shadowTopColor']
const ids = Object.keys(config.option.seriesCustom)
//
const isGroup = _config.option.series.length !== 5
//
_config.option.series.forEach(item => {

@ -127,6 +127,6 @@ export default {
border: 1px dashed var(--bs-el-color-primary);
}
.active {
border: 1px solid #c8ff00;
border: -1px solid #c8ff00;
}
</style>

Loading…
Cancel
Save