Merge branch 'dev' into pr@dev@sqlserver

This commit is contained in:
taojinlong
2021-08-06 12:25:22 +08:00
71 changed files with 4142 additions and 3168 deletions

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>dataease-server</artifactId>
<groupId>io.dataease</groupId>
<version>1.0.0</version>
<version>1.2.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -8,9 +8,17 @@ export const areaMapping = () => {
})
}
// export function geoJson(areaCode) {
// return request({
// url: '/api/map/resourceFull/' + areaCode,
// method: 'get',
// loading: true
// })
// }
export function geoJson(areaCode) {
return request({
url: '/api/map/resourceFull/' + areaCode,
url: '/geo/' + areaCode + '_full.json',
method: 'get',
loading: true
})

View File

@@ -0,0 +1,11 @@
import request from '@/utils/request'
export function getViewLinkageGather(requestInfo) {
return request({
url: '/linkage/getViewLinkageGather',
method: 'post',
data: requestInfo,
loading: true
})
}

View File

@@ -10,7 +10,8 @@
[classNameResizable]: resizable,
[classNameRotating]: rotating,
[classNameRotatable]: rotatable,
[classNameMouseOn]: mouseOn || active
[classNameMouseOn]: mouseOn || active,
['linkageSetting']:linkageActive
},
className
]"
@@ -19,9 +20,7 @@
@mouseenter="enter"
@mouseleave="leave"
>
<setting-menu style="right:5px;position: absolute;z-index: 2">
<i slot="icon" class="icon iconfont icon-shezhi" />
</setting-menu>
<edit-bar v-if="active||linkageSettingStatus" :active-model="'edit'" :element="element" @showViewDetails="showViewDetails" />
<div
v-for="(handlei, indexi) in actualHandles"
:key="indexi"
@@ -46,11 +45,12 @@ let eventsFor = events.mouse
import eventBus from '@/components/canvas/utils/eventBus'
import { mapState } from 'vuex'
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu'
import EditBar from '@/components/canvas/components/Editor/EditBar'
export default {
replace: true,
name: 'VueDragResizeRotate',
components: { SettingMenu },
components: { EditBar },
props: {
className: {
type: String,
@@ -311,6 +311,11 @@ export default {
changeStyle: {
require: true,
type: Object
},
// 联动设置
linkageActive: {
type: Boolean,
default: false
}
},
data: function() {
@@ -464,7 +469,8 @@ export default {
'curComponent',
'editor',
'curCanvasScale',
'canvasStyleData'
'canvasStyleData',
'linkageSettingStatus'
])
},
watch: {
@@ -1540,6 +1546,9 @@ export default {
removeEvent(document.documentElement, 'mouseup', this.handleUp)
removeEvent(document.documentElement, 'touchend touchcancel', this.deselect)
removeEvent(window, 'resize', this.checkParentSize)
},
showViewDetails() {
this.$emit('showViewDetails')
}
}
@@ -1628,26 +1637,30 @@ export default {
user-select: none;
}
.mouseOn >>> .icon-shezhi{
z-index: 2;
display:block!important;
}
.vdr > i{
right: 5px;
color: gray;
position: absolute;
.linkageSetting{
opacity: 0.5;
}
.vdr >>> i:hover {
color: red;
}
/*.mouseOn >>> .icon-shezhi{*/
/* z-index: 2;*/
/* display:block!important;*/
/*}*/
/*.vdr > i{*/
/* right: 5px;*/
/* color: gray;*/
/* position: absolute;*/
/*}*/
.vdr:hover >>> i {
z-index: 2;
display:block;
}
/*.vdr >>> i:hover {*/
/* color: red;*/
/*}*/
.vdr>>>.icon-shezhi {
display:none
}
/*.vdr:hover >>> i {*/
/* z-index: 2;*/
/* display:block;*/
/*}*/
/*.vdr>>>.icon-shezhi {*/
/* display:none*/
/*}*/
</style>

View File

@@ -6,7 +6,7 @@
@click="handleClick"
@mousedown="elementMouseDown"
>
<edit-bar v-if="config === curComponent" @showViewDetails="showViewDetails" />
<edit-bar v-if="config === curComponent" :element="config" @showViewDetails="showViewDetails" />
<de-out-widget
v-if="config.type==='custom'"
:id="'component' + config.id"
@@ -18,9 +18,9 @@
/>
<component
ref="wrapperChild"
:is="config.component"
v-else
ref="wrapperChild"
:out-style="config.style"
:style="getComponentStyleDefault(config.style)"
:prop-value="config.propValue"
@@ -112,8 +112,8 @@ export default {
e.stopPropagation()
this.$store.commit('setCurComponent', { component: this.config, index: this.index })
},
showViewDetails(){
this.$refs.wrapperChild.openChartDetailsDialog();
showViewDetails() {
this.$refs.wrapperChild.openChartDetailsDialog()
}
}
}

View File

@@ -1,17 +1,35 @@
<template>
<div class="bar-main">
<i v-if="curComponent.type==='view'" class="icon iconfont icon-fangda" @click.stop="showViewDetails" />
<i v-if="activeModel==='edit'" class="icon iconfont icon-shezhi" @click.stop="showViewDetails" />
<div v-if="linkageSettingStatus&&element!==curLinkageView&&element.type==='view'" style="margin-right: -1px;width: 18px">
<el-checkbox v-model="linkageInfo.linkageActive" />
<linkage-field v-if="linkageInfo.linkageActive" :element="element" />
<!-- <i v-if="linkageInfo.linkageActive" class="icon iconfont icon-edit" @click.stop="linkageEdit" />-->
</div>
<div v-else-if="!linkageSettingStatus">
<setting-menu v-if="activeModel==='edit'" style="float: right;height: 24px!important;">
<i slot="icon" class="icon iconfont icon-shezhi" />
</setting-menu>
<i v-if="activeModel==='edit'&&curComponent&&editFilter.includes(curComponent.type)" class="icon iconfont icon-edit" @click.stop="edit" />
<i v-if="curComponent.type==='view'" class="icon iconfont icon-fangda" @click.stop="showViewDetails" />
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
import eventBus from '@/components/canvas/utils/eventBus'
import bus from '@/utils/bus'
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu'
import LinkageField from '@/components/canvas/components/Editor/LinkageField'
export default {
components: { SettingMenu, LinkageField },
props: {
element: {
type: Object,
required: true
},
active: {
type: Boolean,
required: false,
@@ -27,23 +45,54 @@ export default {
data() {
return {
componentType: null,
linkageActiveStatus: false,
editFilter: [
'view',
'custom'
]
}
},
computed: mapState([
'menuTop',
'menuLeft',
'menuShow',
'curComponent',
'componentData',
'canvasStyleData'
]),
computed: {
linkageInfo() {
return this.targetLinkageInfo[this.element.propValue.viewId]
},
...mapState([
'menuTop',
'menuLeft',
'menuShow',
'curComponent',
'componentData',
'canvasStyleData',
'linkageSettingStatus',
'targetLinkageInfo',
'curLinkageView'
])
},
methods: {
showViewDetails() {
this.$emit('showViewDetails')
},
edit() {
// 编辑时临时保存 当前修改的画布
this.$store.dispatch('panel/setComponentDataTemp', JSON.stringify(this.componentData))
this.$store.dispatch('panel/setCanvasStyleDataTemp', JSON.stringify(this.canvasStyleData))
if (this.curComponent.type === 'view') {
this.$store.dispatch('chart/setViewId', null)
this.$store.dispatch('chart/setViewId', this.curComponent.propValue.viewId)
bus.$emit('PanelSwitchComponent', { name: 'ChartEdit', param: { 'id': this.curComponent.propValue.viewId, 'optType': 'edit' }})
}
if (this.curComponent.type === 'custom') {
bus.$emit('component-dialog-edit')
}
// 编辑样式组件
if (this.curComponent.type === 'v-text' || this.curComponent.type === 'rect-shape') {
bus.$emit('component-dialog-style')
}
},
linkageEdit() {
}
}
}

View File

@@ -0,0 +1,113 @@
<template>
<el-popover
width="300"
trigger="click"
>
<el-row>
<el-col :span="10">
<div class="ellip">联动视图</div>
</el-col>
<el-col :span="10">
<div class="ellip">{{ linkageInfo.targetViewName }}</div>
</el-col>
</el-row>
linkageInfo{{ linkageInfo }}
<el-row class="bottom">
<el-button size="mini" type="success" icon="el-icon-plus" round>追加联动依赖字段</el-button>
</el-row>
<!-- <el-button slot="reference">T</el-button>-->
<i slot="reference" class="icon iconfont icon-edit slot-class" />
</el-popover>
</template>
<script>
import { mapState } from 'vuex'
export default {
props: {
element: {
type: Object,
required: true
},
active: {
type: Boolean,
required: false,
default: false
},
// 当前模式 preview 预览 edit 编辑,
activeModel: {
type: String,
required: false,
default: 'preview'
}
},
data() {
return {
componentType: null,
linkageActiveStatus: false,
editFilter: [
'view',
'custom'
]
}
},
computed: {
linkageInfo() {
return this.targetLinkageInfo[this.element.propValue.viewId]
},
...mapState([
'menuTop',
'menuLeft',
'menuShow',
'curComponent',
'componentData',
'canvasStyleData',
'linkageSettingStatus',
'targetLinkageInfo',
'curLinkageView'
])
},
methods: {
showViewDetails() {
this.$emit('showViewDetails')
},
edit() {
},
linkageEdit() {
}
}
}
</script>
<style lang="scss" scoped>
.slot-class{
color: white;
}
.bottom {
text-align: center;
}
.ellip{
/*width: 100%;*/
margin-left: 10px;
margin-right: 10px;
overflow: hidden;/*超出部分隐藏*/
white-space: nowrap;/*不换行*/
text-overflow:ellipsis;/*超出部分文字以...显示*/
background-color: #f7f8fa;
color: #3d4d66;
font-size: 12px;
line-height: 24px;
height: 24px;
border-radius: 3px;
}
</style>

View File

@@ -153,6 +153,7 @@ export default {
this.searchCount++
}, refreshTime)
eventBus.$on('openChartDetailsDialog', this.openChartDetailsDialog)
this.$store.commit('clearLinkageSettingInfo', false)
},
beforeDestroy() {
clearInterval(this.timer)

View File

@@ -21,6 +21,7 @@
<script>
import { mapState } from 'vuex'
import bus from '@/utils/bus'
import { getViewLinkageGather } from '@/api/panel/linkage'
export default {
data() {
@@ -122,7 +123,19 @@ export default {
this.$store.commit('recordSnapshot')
},
linkageSetting() {
this.$store.commit('setLinkageSettingStatus', true)
debugger
const targetViewIds = this.componentData.filter(item => item.type === 'view' && item.propValue && item.propValue.viewId && item !== this.curComponent)
.map(item => item.propValue.viewId)
// 获取当前仪表板当前视图联动信息
const requestInfo = {
'panelId': this.$store.state.panel.panelInfo.id,
'sourceViewId': this.curComponent.propValue.viewId,
'targetViewIds': targetViewIds
}
getViewLinkageGather(requestInfo).then(rsp => {
this.$store.commit('setLinkageInfo', rsp.data)
})
}
}
}

View File

@@ -8,7 +8,7 @@
@mousedown="handleMouseDown"
>
<!-- 网格线 -->
<Grid v-if="canvasStyleData.auxiliaryMatrix" :matrix-style="matrixStyle" />
<Grid v-if="canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus" :matrix-style="matrixStyle" />
<!--页面组件列表展示-->
<de-drag
v-for="(item, index) in componentData"
@@ -29,12 +29,17 @@
:snap="true"
:snap-tolerance="2"
:change-style="customStyle"
:draggable="!linkageSettingStatus"
:resizable="!linkageSettingStatus"
:linkage-active="linkageSettingStatus&&item===curLinkageView"
@refLineParams="getRefLineParams"
@showViewDetails="showViewDetails(index)"
>
<component
:is="item.component"
v-if="item.type==='v-text'"
:id="'component' + item.id"
ref="wrapperChild"
class="component"
:style="getComponentStyleDefault(item.style)"
:prop-value="item.propValue"
@@ -69,6 +74,7 @@
:is="item.component"
v-else-if="item.type==='other'"
:id="'component' + item.id"
ref="wrapperChild"
class="component"
:style="getComponentStyle(item.style)"
:prop-value="item.propValue"
@@ -80,6 +86,7 @@
:is="item.component"
v-else
:id="'component' + item.id"
ref="wrapperChild"
class="component"
:style="getComponentStyleDefault(item.style)"
:prop-value="item.propValue"
@@ -245,7 +252,9 @@ export default {
'componentData',
'curComponent',
'canvasStyleData',
'editor'
'editor',
'linkageSettingStatus',
'curLinkageView'
])
},
watch: {
@@ -275,6 +284,7 @@ export default {
// 第一次变化 不需要 重置边界 待改进
if (this.changeIndex++ > 0) {
this.resizeParentBounds()
this.$store.state.styleChangeTimes++
}
// this.changeScale()
},
@@ -602,6 +612,9 @@ export default {
},
exportExcel() {
this.$refs['userViewDialog'].exportExcel()
},
showViewDetails(index) {
this.$refs.wrapperChild[index].openChartDetailsDialog()
}
}
}

View File

@@ -1,6 +1,17 @@
<template>
<div>
<div class="toolbar">
<!-- linkageActiveStatus:{{ linkageActiveStatus }}-->
<div v-if="linkageSettingStatus" class="toolbar">
<span style="float: right;">
<el-button size="mini" @click="saveLinkage">
{{ $t('commons.confirm') }}
</el-button>
<el-button size="mini" @click="cancelLinkage">
{{ $t('commons.cancel') }}
</el-button>
</span>
</div>
<div v-else class="toolbar">
<div class="canvas-config" style="margin-right: 10px">
<el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" name="auxiliaryMatrix" />
@@ -125,7 +136,8 @@ export default {
'curComponent',
'changeTimes',
'snapshotIndex',
'lastSaveSnapshotIndex'
'lastSaveSnapshotIndex',
'linkageSettingStatus'
]),
created() {
@@ -302,6 +314,15 @@ export default {
},
closeNotSave() {
this.close()
},
saveLinkage() {
this.cancelLinkageSettingStatus()
},
cancelLinkage() {
this.cancelLinkageSettingStatus()
},
cancelLinkageSettingStatus() {
this.$store.commit('clearLinkageSettingInfo')
}
}
}

View File

@@ -1,5 +1,5 @@
<template>
<div style="overflow: hidden">
<div style="overflow: hidden;width: 100%;height: 100%;">
<img :src="propValue">
</div>
</template>

View File

@@ -228,10 +228,12 @@ export default {
padding:0 8px;
}
.father .child {
display: none;
/*display: none;*/
visibility: hidden;
}
.father:hover .child {
display: inline;
/*display: inline;*/
visibility: visible;
}
.de-filter-tree {
>>>span.is-leaf {

View File

@@ -127,7 +127,7 @@ export default {
tokenError: 'Token error, please login again',
username_error: 'Please enter the correct ID',
password_error: 'The password can not be less than 8 digits',
login_again: 'Login again'
re_login: 'Login again'
},
commons: {
no_target_permission: 'No permission',
@@ -754,6 +754,7 @@ export default {
chart_funnel: 'Funnel',
chart_radar: 'Radar',
chart_gauge: 'Gauge',
chart_map: 'Map',
dateStyle: 'Date Style',
datePattern: 'Date Format',
y: 'Year',
@@ -822,6 +823,11 @@ export default {
drag_block_funnel_split: 'Funnel Split',
drag_block_radar_length: 'Branch Length',
drag_block_radar_label: 'Branch Label',
stack_item: 'Stack Item',
map_range: 'Map range',
select_map_range: 'Please select map range',
area: 'Area',
placeholder_field: 'Drag Field To Here',
axis_label_rotate: 'Label Rotate'
},
dataset: {
@@ -976,7 +982,19 @@ export default {
right_join: 'RIGHT JOIN',
inner_join: 'INNER JOIN',
full_join: 'FULL JOIN',
can_not_union_diff_datasource: 'Union dataset must have same data source'
can_not_union_diff_datasource: 'Union dataset must have same data source',
operator: 'Operator',
d_q_trans: 'Dimension/Quota Transform',
add_calc_field: 'Create calc field',
input_name: 'Please input name',
field_exp: 'Field Expression',
data_type: 'Data Type',
click_ref_field: 'Click Quote Field',
click_ref_function: 'Click Quote Function',
field_manage: 'Field Manage',
edit_calc_field: 'Edit calc field',
calc_field: 'Calc Field',
show_sql: 'Show SQL'
},
datasource: {
datasource: 'Data Source',
@@ -1290,5 +1308,54 @@ export default {
i18n_msg_type_dataset_sync_faild: 'Dataset synchronization failed',
i18n_msg_type_all: 'All type',
channel_inner_msg: 'On site news'
},
denumberrange: {
label: 'Number range',
split_placeholder: 'To',
please_key_min: 'Please key min value',
please_key_max: 'Please key max value',
out_of_min: 'The min value cannot be less than the min integer -2³²',
out_of_max: 'The max value cannot be more than the max integer 2³²-1',
must_int: 'Please key interger',
min_out_max: 'The min value must be less than the max value',
max_out_min: 'The max value must be more than the min value'
},
denumberselect: {
label: 'Number selector',
placeholder: 'Please select'
},
deinputsearch: {
label: 'Text search',
placeholder: 'Please key keyword'
},
detextselect: {
label: 'Text selector',
placeholder: 'Please select'
},
detextgridselect: {
label: 'Text list',
placeholder: 'Please select'
},
denumbergridselect: {
label: 'Number list',
placeholder: 'Please select'
},
dedaterange: {
label: 'Date range',
to_placeholder: 'End date',
from_placeholder: 'Start date',
split_placeholder: 'To'
},
dedate: {
label: 'Date',
placeholder: 'Please select date'
},
deyearmonth: {
label: 'Month',
placeholder: 'Please select month'
},
deyear: {
label: 'Year',
placeholder: 'Please select year'
}
}

View File

@@ -109,25 +109,25 @@ export default {
navbar: {
dashboard: '首頁',
github: '項目地址',
logOut: '退出登',
logOut: '退出登',
profile: '個人中心',
theme: '換膚',
size: '佈局大小'
},
login: {
title: '系統登',
title: '系統登',
welcome: '歡迎使用',
logIn: '登',
logIn: '登',
username: '帳號',
password: '密碼',
any: '任意字符',
thirdparty: '第三方登',
thirdparty: '第三方登',
thirdpartyTips: '本地不能模擬,請結合自己業務進行模擬!!!',
expires: '登信息過期,請重新登',
tokenError: '信息錯誤,請重新登',
expires: '登信息過期,請重新登',
tokenError: '信息錯誤,請重新登',
username_error: '請輸入正確的 ID',
password_error: '密碼不小於 8 位',
login_again: '重新登'
re_login: '重新登'
},
commons: {
no_target_permission: '沒有權限',
@@ -184,7 +184,7 @@ export default {
prompt: '提示',
operating: '操作',
input_limit: '長度在 {0} 到 {1} 個字符',
login: '登',
login: '登',
welcome: '一站式開源數據分析平臺',
username: '姓名',
password: '密碼',
@@ -256,7 +256,7 @@ export default {
remove: '移除',
remove_cancel: '移除取消',
remove_success: '移除成功',
tips: '認證信息已過期,請重新登',
tips: '認證信息已過期,請重新登',
not_performed_yet: '尚未執行',
incorrect_input: '輸入內容不正確',
delete_confirm: '請輸入以下內容,確認刪除:',
@@ -754,6 +754,7 @@ export default {
chart_funnel: '漏鬥圖',
chart_radar: '雷達圖',
chart_gauge: '儀表盤',
chart_map: '地圖',
dateStyle: '日期顯示',
datePattern: '日期格式',
y: '年',
@@ -822,6 +823,11 @@ export default {
drag_block_funnel_split: '漏鬥分層',
drag_block_radar_length: '分支長度',
drag_block_radar_label: '分支標簽',
map_range: '地圖範圍',
select_map_range: '請選擇地圖範圍',
area: '地區',
stack_item: '堆疊項',
placeholder_field: '拖動字段至此處',
axis_label_rotate: '標簽角度'
},
dataset: {
@@ -976,7 +982,19 @@ export default {
right_join: '右連接',
inner_join: '內連接',
full_join: '全連接',
can_not_union_diff_datasource: '被關聯數據集必須與當前數據集的數據源一致'
can_not_union_diff_datasource: '被關聯數據集必須與當前數據集的數據源一致',
operator: '操作',
d_q_trans: '維度/指標轉換',
add_calc_field: '新建计算字段',
input_name: '請輸入名稱',
field_exp: '字段表達式',
data_type: '數據類型',
click_ref_field: '點擊引用字段',
click_ref_function: '點擊引用函數',
field_manage: '字段管理',
edit_calc_field: '編輯計算字段',
calc_field: '計算字段',
show_sql: '顯示SQL'
},
datasource: {
datasource: '數據源',
@@ -1129,7 +1147,7 @@ export default {
lineHeight: '行高',
letterSpacing: '字間距',
textAlign: '左右對齊',
opacity: '透明度',
opacity: '透明度',
verticalAlign: '上下對齊',
text_align_left: '左對齊',
text_align_center: '左右居中',
@@ -1168,9 +1186,9 @@ export default {
},
display: {
logo: '頭部系統 Logo',
loginLogo: '登頁面頭部 Logo',
loginImage: '登頁面右側圖片',
loginTitle: '登頁面標題',
loginLogo: '登頁面頭部 Logo',
loginImage: '登頁面右側圖片',
loginTitle: '登頁面標題',
title: '系統名稱',
advice_size: '建議圖片大小'
},
@@ -1290,5 +1308,54 @@ export default {
i18n_msg_type_dataset_sync_faild: '數據集同步失敗',
i18n_msg_type_all: '全部類型',
channel_inner_msg: '站內消息'
},
denumberrange: {
label: '數值區間',
split_placeholder: '至',
please_key_min: '請輸入最小值',
please_key_max: '請輸入最大值',
out_of_min: '最小值不能小于最小整數-2³²',
out_of_max: '最大值不能大于最大整數2³²-1',
must_int: '請輸入整數',
min_out_max: '最小值必須小于最大值',
max_out_min: '最大值必須大于最小值'
},
denumberselect: {
label: '數字下拉',
placeholder: '請選擇'
},
deinputsearch: {
label: '文本搜索',
placeholder: '請輸入關鍵字'
},
detextselect: {
label: '文本下拉',
placeholder: '請選擇'
},
detextgridselect: {
label: '文本列表',
placeholder: '請選擇'
},
denumbergridselect: {
label: '數字列表',
placeholder: '請選擇'
},
dedaterange: {
label: '日期範圍',
to_placeholder: '結束日期',
from_placeholder: '開始日期',
split_placeholder: '至'
},
dedate: {
label: '日期',
placeholder: '請選擇日期'
},
deyearmonth: {
label: '年月',
placeholder: '請選擇年月'
},
deyear: {
label: '年份',
placeholder: '請選擇年份'
}
}

View File

@@ -127,7 +127,7 @@ export default {
tokenError: '登陆信息错误,请重新登录',
username_error: '请输入正确的 ID',
password_error: '密码不小于 8 位',
login_again: '重新登录'
re_login: '重新登录'
},
commons: {
no_target_permission: '没有权限',
@@ -754,6 +754,7 @@ export default {
chart_funnel: '漏斗图',
chart_radar: '雷达图',
chart_gauge: '仪表盘',
chart_map: '地图',
dateStyle: '日期显示',
datePattern: '日期格式',
y: '年',
@@ -822,6 +823,11 @@ export default {
drag_block_funnel_split: '漏斗分层',
drag_block_radar_length: '分支长度',
drag_block_radar_label: '分支标签',
map_range: '地图范围',
select_map_range: '请选择地图范围',
area: '地区',
stack_item: '堆叠项',
placeholder_field: '拖动字段至此处',
axis_label_rotate: '标签角度'
},
dataset: {
@@ -976,7 +982,19 @@ export default {
right_join: '右连接',
inner_join: '内连接',
full_join: '全连接',
can_not_union_diff_datasource: '被关联数据集必须与当前数据集的数据源一致'
can_not_union_diff_datasource: '被关联数据集必须与当前数据集的数据源一致',
operator: '操作',
d_q_trans: '维度/指标转换',
add_calc_field: '新建计算字段',
input_name: '请输入名称',
field_exp: '字段表达式',
data_type: '数据类型',
click_ref_field: '点击引用字段',
click_ref_function: '点击引用函数',
field_manage: '字段管理',
edit_calc_field: '编辑计算字段',
calc_field: '计算字段',
show_sql: '显示SQL'
},
datasource: {
datasource: '数据源',
@@ -1131,7 +1149,7 @@ export default {
lineHeight: '行高',
letterSpacing: '字间距',
textAlign: '左右对齐',
opacity: '透明度',
opacity: '透明度',
verticalAlign: '上下对齐',
text_align_left: '左对齐',
text_align_center: '左右居中',
@@ -1293,5 +1311,54 @@ export default {
i18n_msg_type_dataset_sync_faild: '数据集同步失败',
i18n_msg_type_all: '全部类型',
channel_inner_msg: '站内消息'
},
denumberrange: {
label: '数值区间',
split_placeholder: '至',
please_key_min: '请输入最小值',
please_key_max: '请输入最大值',
out_of_min: '最小值不能小于最小整数-2³²',
out_of_max: '最大值不能大于最大整数2³²-1',
must_int: '请输入整数',
min_out_max: '最小值必须小于最大值',
max_out_min: '最大值必须大于最小值'
},
denumberselect: {
label: '数字下拉',
placeholder: '请选择'
},
deinputsearch: {
label: '文本搜索',
placeholder: '请输入关键字'
},
detextselect: {
label: '文本下拉',
placeholder: '请选择'
},
detextgridselect: {
label: '文本列表',
placeholder: '请选择'
},
denumbergridselect: {
label: '数字列表',
placeholder: '请选择'
},
dedaterange: {
label: '日期范围',
to_placeholder: '结束日期',
from_placeholder: '开始日期',
split_placeholder: '至'
},
dedate: {
label: '日期',
placeholder: '请选择日期'
},
deyearmonth: {
label: '年月',
placeholder: '请选择年月'
},
deyear: {
label: '年份',
placeholder: '请选择年份'
}
}

View File

@@ -50,7 +50,11 @@ const data = {
isClickComponent: false,
canvasCommonStyleData: DEFAULT_COMMON_CANVAS_STYLE_STRING,
// 联动设置状态
linkageSettingStatus: false
linkageSettingStatus: false,
// 当前设置联动的组件
curLinkageView: null,
// 和当前组件联动的目标组件
targetLinkageInfo: []
},
mutations: {
...animation.mutations,
@@ -176,9 +180,15 @@ const data = {
}
state.componentData.splice(index, 1)
},
setLinkageSettingStatus(state, status) {
state.linkageSettingStatus = status
console.log('linkageSettingStatus:', state.linkageSettingStatus)
setLinkageInfo(state, targetLinkageInfo) {
state.linkageSettingStatus = true
state.curLinkageView = state.curComponent
state.targetLinkageInfo = targetLinkageInfo
},
clearLinkageSettingInfo(state) {
state.linkageSettingStatus = false
state.curLinkageView = null
state.targetLinkageInfo = []
}
},
modules: {

View File

@@ -16,7 +16,7 @@ const LinkTokenKey = Config.LinkTokenKey
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 20000 // request timeout
timeout: 10000 // request timeout
})
// request interceptor
@@ -52,6 +52,10 @@ service.interceptors.request.use(
}
)
// const defaultOptions = {
// confirmButtonText: i18n.t('login.re_login')
// }
const checkAuth = response => {
// 请根据实际需求修改
@@ -63,7 +67,7 @@ const checkAuth = response => {
location.reload()
})
}, {
confirmButtonText: i18n.t('login.login_again'),
confirmButtonText: i18n.t('login.re_login'),
showClose: false
})
}
@@ -75,7 +79,7 @@ const checkAuth = response => {
location.reload()
})
}, {
confirmButtonText: i18n.t('login.login_again'),
confirmButtonText: i18n.t('login.re_login'),
showClose: false
})
}

View File

@@ -113,13 +113,16 @@ export default {
}
geoJson(customAttr.areaCode).then(res => {
this.initMapChart(res.data, chart)
// this.initMapChart(res.data, chart)
this.initMapChart(res, chart)
this.$store.dispatch('map/setGeo', {
key: customAttr.areaCode,
value: res.data
value: res
// value: res.data
})
this.currentGeoJson = res.data
// this.currentGeoJson = res.data
this.currentGeoJson = res
})
return
}

View File

@@ -0,0 +1,129 @@
<template>
<span>
<el-tag v-if="!hasDataPermission('manage',param.privileges)" size="small" class="item-axis" :type="item.groupType === 'q'?'success':''">
<span style="float: left">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
<svg-icon v-if="item.deType === 5" icon-class="field_location" class="field-icon-location" />
<svg-icon v-if="item.sort === 'asc'" icon-class="sort-asc" class-name="field-icon-sort" />
<svg-icon v-if="item.sort === 'desc'" icon-class="sort-desc" class-name="field-icon-sort" />
</span>
<span class="item-span-style" :title="item.name">{{ item.name }}</span>
</el-tag>
<el-dropdown v-else trigger="click" size="mini" @command="clickItem">
<span class="el-dropdown-link">
<el-tag size="small" class="item-axis" :type="item.groupType === 'q'?'success':''">
<span style="float: left">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
<svg-icon v-if="item.deType === 5" icon-class="field_location" class="field-icon-location" />
<svg-icon v-if="item.sort === 'asc'" icon-class="sort-asc" class-name="field-icon-sort" />
<svg-icon v-if="item.sort === 'desc'" icon-class="sort-desc" class-name="field-icon-sort" />
</span>
<span class="item-span-style" :title="item.name">{{ item.name }}</span>
<i class="el-icon-arrow-down el-icon--right" style="position: absolute;top: 6px;right: 10px;" />
</el-tag>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item icon="el-icon-delete" :command="beforeClickItem('remove')">
<span>{{ $t('chart.delete') }}</span>
</el-dropdown-item>
</el-dropdown-menu>
</span>
</el-dropdown>
</span>
</template>
<script>
export default {
name: 'DrillItem',
props: {
param: {
type: Object,
required: true
},
item: {
type: Object,
required: true
},
index: {
type: Number,
required: true
}
},
data() {
return {
}
},
mounted() {
},
methods: {
clickItem(param) {
if (!param) {
return
}
switch (param.type) {
case 'remove':
this.removeItem()
break
default:
break
}
},
beforeClickItem(type) {
return {
type: type
}
},
removeItem() {
this.item.index = this.index
this.$emit('onDimensionItemRemove', this.item)
}
}
}
</script>
<style scoped>
.item-axis {
padding: 1px 6px;
margin: 0 3px 2px 3px;
text-align: left;
height: 24px;
line-height: 22px;
display: flex;
border-radius: 4px;
box-sizing: border-box;
white-space: nowrap;
width: 159px;
}
.item-axis:hover {
background-color: #fdfdfd;
cursor: pointer;
}
span {
font-size: 12px;
}
.summary-span{
margin-left: 4px;
color: #878d9f;;
}
.inner-dropdown-menu{
display: flex;
justify-content: space-between;
align-items: center;
width: 100%
}
.item-span-style{
display: inline-block;
width: 100px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
</style>

View File

@@ -6,15 +6,15 @@
id="label-content"
:style="content_class"
>
<p v-for="item in chart.data.series" :key="item.name" :style="label_content_class">
{{ item.data[0] }}
</p>
<span v-if="quotaShow" :style="label_space">
<p v-if="dimensionShow" :style="label_class">
<!-- {{ chart.data.x[0] }}-->
{{ chart.data.series[0].name }}
<p v-for="item in chart.data.series" :key="item.name" :style="label_content_class">
{{ item.data[0] }}
</p>
</span>
<p v-if="dimensionShow" :style="label_class">
<!-- {{ chart.data.x[0] }}-->
{{ chart.data.series[0].name }}
</p>
</div>
</div>
</template>

View File

@@ -115,14 +115,6 @@
</el-form>
<el-form v-show="chart.type && chart.type.includes('text')" ref="sizeFormPie" :disabled="param && !hasDataPermission('manage',param.privileges)" :model="sizeForm" label-width="100px" size="mini">
<el-form-item :label="$t('chart.dimension_show')" class="form-item">
<el-checkbox v-model="sizeForm.dimensionShow" @change="changeBarSizeCase">{{ $t('chart.show') }}</el-checkbox>
</el-form-item>
<el-form-item :label="$t('chart.dimension_font_size')" class="form-item">
<el-select v-model="sizeForm.dimensionFontSize" :placeholder="$t('chart.dimension_font_size')" @change="changeBarSizeCase">
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
</el-select>
</el-form-item>
<el-form-item :label="$t('chart.quota_show')" class="form-item">
<el-checkbox v-model="sizeForm.quotaShow" @change="changeBarSizeCase">{{ $t('chart.show') }}</el-checkbox>
</el-form-item>
@@ -131,6 +123,14 @@
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
</el-select>
</el-form-item>
<el-form-item :label="$t('chart.dimension_show')" class="form-item">
<el-checkbox v-model="sizeForm.dimensionShow" @change="changeBarSizeCase">{{ $t('chart.show') }}</el-checkbox>
</el-form-item>
<el-form-item :label="$t('chart.dimension_font_size')" class="form-item">
<el-select v-model="sizeForm.dimensionFontSize" :placeholder="$t('chart.dimension_font_size')" @change="changeBarSizeCase">
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
</el-select>
</el-form-item>
<el-form-item :label="$t('chart.space_split')" class="form-item">
<el-input-number v-model="sizeForm.spaceSplit" size="mini" @change="changeBarSizeCase" />
</el-form-item>

View File

@@ -257,13 +257,13 @@
<!--添加视图-选择数据集-->
<el-dialog
v-if="selectTableFlag"
v-dialogDrag
:title="$t('chart.add_chart')"
:visible="selectTableFlag"
:show-close="false"
width="70%"
class="dialog-css"
:destroy-on-close="true"
>
<el-row style="width: 800px;">
<el-form ref="form" :model="table" label-width="80px" size="mini" class="form-item">
@@ -746,6 +746,7 @@ export default {
view.yaxis = JSON.stringify([])
view.extStack = JSON.stringify([])
view.customFilter = JSON.stringify([])
view.drillFields = JSON.stringify([])
post('/chart/view/save', view).then(response => {
this.closeCreateChart()
this.$store.dispatch('chart/setTableId', null)
@@ -1048,10 +1049,12 @@ export default {
text-overflow: ellipsis;
}
.father .child {
display: none;
/*display: none;*/
visibility: hidden;
}
.father:hover .child {
display: inline;
/*display: inline;*/
visibility: visible;
}
.tree-style {
padding: 10px 15px;

View File

@@ -233,6 +233,29 @@
/>
</span>
</el-row>
<el-row class="padding-lr">
<span style="width: 80px;text-align: right;">
<span>钻取</span>
/
<span>{{ $t('chart.dimension') }}</span>
</span>
<draggable
v-model="view.drillFields"
:disabled="!hasDataPermission('manage',param.privileges)"
group="drag"
animation="300"
:move="onMove"
class="drag-block-style"
@add="addDrill"
>
<transition-group class="draggable-group">
<drill-item v-for="(item,index) in view.drillFields" :key="item.id" :param="param" :index="index" :item="item" @onDimensionItemChange="dillItemChange" @onDimensionItemRemove="drillItemRemove" />
</transition-group>
</draggable>
<div v-if="!view.drillFields || view.drillFields.length === 0" class="drag-placeholder-style">
<span class="drag-placeholder-style-span">{{ $t('chart.placeholder_field') }}</span>
</div>
</el-row>
<el-row v-if="view.type !=='text' && view.type !== 'gauge'" class="padding-lr">
<span style="width: 80px;text-align: right;">
<span v-if="view.type && view.type.includes('table')">{{ $t('chart.drag_block_table_data_column') }}</span>
@@ -489,13 +512,13 @@
<!--视图更换数据集-->
<el-dialog
v-if="selectTableFlag"
v-dialogDrag
:title="changeDsTitle"
:visible="selectTableFlag"
:show-close="false"
width="70%"
class="dialog-css"
:destroy-on-close="true"
>
<table-selector @getTable="getTable" />
<p style="margin-top: 10px;color:#F56C6C;font-size: 12px;">{{ $t('chart.change_ds_tip') }}</p>
@@ -507,10 +530,10 @@
<!--编辑视图使用的数据集的字段-->
<el-dialog
v-if="editDsField"
:visible="editDsField"
:show-close="false"
class="dialog-css"
:destroy-on-close="true"
:fullscreen="true"
>
<field-edit :param="table" />
@@ -532,6 +555,7 @@ import DimensionItem from '../components/drag-item/DimensionItem'
import QuotaItem from '../components/drag-item/QuotaItem'
import FilterItem from '../components/drag-item/FilterItem'
import ChartDragItem from '../components/drag-item/ChartDragItem'
import DrillItem from '../components/drag-item/DrillItem'
import ResultFilterEditor from '../components/filter/ResultFilterEditor'
import ChartComponent from '../components/ChartComponent'
import bus from '@/utils/bus'
@@ -593,7 +617,8 @@ export default {
QuotaItem,
DimensionItem,
draggable,
ChartDragItem
ChartDragItem,
DrillItem
},
props: {
param: {
@@ -613,6 +638,7 @@ export default {
xaxis: [],
yaxis: [],
extStack: [],
drillFields: [],
show: true,
type: 'bar',
title: '',
@@ -800,6 +826,7 @@ export default {
view.customStyle = JSON.stringify(view.customStyle)
view.customFilter = JSON.stringify(view.customFilter)
view.extStack = JSON.stringify(view.extStack)
view.drillFields = JSON.stringify(view.drillFields)
post('/chart/view/save', view).then(response => {
// this.get(response.data.id);
// this.getData(response.data.id)
@@ -900,6 +927,7 @@ export default {
this.view.xaxis = this.view.xaxis ? JSON.parse(this.view.xaxis) : []
this.view.yaxis = this.view.yaxis ? JSON.parse(this.view.yaxis) : []
this.view.extStack = this.view.extStack ? JSON.parse(this.view.extStack) : []
this.view.drillFields = this.view.drillFields ? JSON.parse(this.view.drillFields) : []
this.view.customAttr = this.view.customAttr ? JSON.parse(this.view.customAttr) : {}
this.view.customStyle = this.view.customStyle ? JSON.parse(this.view.customStyle) : {}
this.view.customFilter = this.view.customFilter ? JSON.parse(this.view.customFilter) : {}
@@ -932,6 +960,7 @@ export default {
this.view.xaxis = this.view.xaxis ? JSON.parse(this.view.xaxis) : []
this.view.yaxis = this.view.yaxis ? JSON.parse(this.view.yaxis) : []
this.view.extStack = this.view.extStack ? JSON.parse(this.view.extStack) : []
this.view.drillFields = this.view.drillFields ? JSON.parse(this.view.drillFields) : []
this.view.customAttr = this.view.customAttr ? JSON.parse(this.view.customAttr) : {}
this.view.customStyle = this.view.customStyle ? JSON.parse(this.view.customStyle) : {}
this.view.customFilter = this.view.customFilter ? JSON.parse(this.view.customFilter) : {}
@@ -1352,7 +1381,7 @@ export default {
return resultNode
},
addStack(e) {
this.dragCheckType(this.dimensionData, 'd')
this.dragCheckType(this.view.extStack, 'd')
if (this.view.extStack && this.view.extStack.length > 1) {
this.view.extStack = [this.view.extStack[0]]
}
@@ -1364,6 +1393,18 @@ export default {
stackItemRemove(item) {
this.view.extStack.splice(item.index, 1)
this.save(true)
},
dillItemChange(item) {
this.save(true)
},
drillItemRemove(item) {
this.view.drillFields.splice(item.index, 1)
this.save(true)
},
addDrill(e) {
this.dragCheckType(this.view.drillFields, 'd')
this.dragMoveDuplicate(this.view.drillFields, e)
this.save(true)
}
}
}

View File

@@ -68,7 +68,6 @@
<script>
import { isKettleRunning, post } from '@/api/dataset/dataset'
import { authModel } from '@/api/system/sysAuth'
import { hasDataPermission } from '@/utils/permission'
export default {
@@ -403,11 +402,14 @@ export default {
searchTree(val) {
const queryCondition = {
withExtend: 'parent',
modelType: 'dataset',
// withExtend: 'parent',
// modelType: 'dataset',
name: val
}
authModel(queryCondition).then(res => {
// authModel(queryCondition).then(res => {
// this.data = this.buildTree(res.data)
// })
post('/dataset/table/search', queryCondition).then(res => {
this.data = this.buildTree(res.data)
})
},
@@ -420,8 +422,8 @@ export default {
const roots = []
arrs.forEach(el => {
// 判断根节点 ###
el.type = el.modelInnerType
el.isLeaf = el.leaf
// el.type = el.modelInnerType
// el.isLeaf = el.leaf
if (el[this.treeProps.parentId] === null || el[this.treeProps.parentId] === 0 || el[this.treeProps.parentId] === '0') {
roots.push(el)
return

View File

@@ -315,6 +315,8 @@ export default {
if (!this.fieldForm.id) {
this.fieldForm.type = this.fieldForm.deType
this.fieldForm.deExtractType = this.fieldForm.deType
this.fieldForm.tableId = this.param.id
this.fieldForm.columnIndex = this.tableFields.dimensionList.length + this.tableFields.quotaList.length
}
post('/dataset/field/save', this.fieldForm).then(response => {
this.closeCalcField()
@@ -371,7 +373,8 @@ export default {
padding: 0 4px;
}
.field-height{
height: calc(50% - 20px);
height: calc(50% - 25px);
margin-top: 4px;
}
.drag-list {
height: calc(100% - 26px);
@@ -442,8 +445,9 @@ export default {
text-overflow: ellipsis;
}
.function-height{
height: calc(100% - 20px);
height: calc(100% - 50px);
overflow: auto;
margin-top: 4px;
}
.function-pop>>>.el-popover{
padding: 6px!important;

View File

@@ -432,10 +432,14 @@ export default {
created() {
this.timer = setInterval(() => {
this.listTaskLog(false)
}, 5000);
this.taskTimer = setInterval(() => {
this.listTask(false)
}, 5000)
},
beforeDestroy() {
clearInterval(this.timer)
clearInterval(this.taskTimer)
},
methods: {
calHeight() {

View File

@@ -989,10 +989,12 @@ export default {
text-overflow: ellipsis;
}
.father .child {
display: none;
/*display: none;*/
visibility: hidden;
}
.father:hover .child {
display: inline;
/*display: inline;*/
visibility: visible;
}
.dialog-css >>> .el-dialog__body {

View File

@@ -21,7 +21,7 @@
<de-container>
<!--左侧导航栏-->
<de-aside-container class="ms-aside-container">
<div style="width: 60px; left: 0px; top: 0px; bottom: 0px; position: absolute">
<div v-if="!linkageSettingStatus" style="width: 60px; left: 0px; top: 0px; bottom: 0px; position: absolute">
<div style="width: 60px;height: 100%;overflow: hidden auto;position: relative;margin: 0px auto; font-size: 14px">
<!-- 视图图表 start -->
<div class="button-div-class" style=" width: 24px;height: 24px;text-align: center;line-height: 1;position: relative;margin: 16px auto 0px;">
@@ -290,7 +290,8 @@ export default {
'isClickComponent',
'canvasStyleData',
'curComponentIndex',
'componentData'
'componentData',
'linkageSettingStatus'
])
},
@@ -322,6 +323,7 @@ export default {
listenGlobalKeyDown()
this.$store.commit('setCurComponent', { component: null, index: null })
this.$store.commit('clearLinkageSettingInfo', false)
},
mounted() {
// this.insertToBody()

View File

@@ -463,6 +463,7 @@ export default {
message: this.$t('panel.delete_success'),
showClose: true
})
this.clearCanvas()
this.tree(this.groupForm)
this.defaultTree()
})
@@ -470,6 +471,17 @@ export default {
})
},
clearCanvas() {
// 清空当前缓存,快照
this.$store.commit('setComponentData', [])
this.$store.commit('setCanvasStyle', DEFAULT_COMMON_CANVAS_STYLE_STRING)
this.$store.dispatch('panel/setPanelInfo', {
id: null,
name: '',
preStyle: null
})
},
close() {
this.editGroup = false
this.groupForm = {
@@ -647,10 +659,12 @@ export default {
}
.father .child {
display: none;
/*display: none;*/
visibility: hidden;
}
.father:hover .child {
display: inline;
/*display: inline;*/
visibility: visible;
}
</style>

View File

@@ -298,10 +298,12 @@ export default {
text-overflow: ellipsis;
}
.father .child {
display: none;
/*display: none;*/
visibility: hidden;
}
.father:hover .child {
display: inline;
/*display: inline;*/
visibility: visible;
}
.tree-style {
padding: 10px 15px;

View File

@@ -416,15 +416,21 @@ export default {
this.update_task = true
},
changeTaskStatus(task) {
const param = task
let param = JSON.parse(JSON.stringify(task));
param.status = task.status === 'Underway' ? 'Pending' : 'Underway'
post('/dataset/task/updateStatus', task).then(response => {
task.status = param.status
this.$message({
message: this.$t('dataset.task.change_success'),
type: 'success',
showClose: true
})
post('/dataset/task/updateStatus', param).then(response => {
if(response.success){
task.status = param.status
this.$message({
message: this.$t('dataset.task.change_success'),
type: 'success',
showClose: true
})
}else {
this.search(this.last_condition, false)
}
}).catch(() => {
this.search(this.last_condition, false)
})
},
execTask(task) {

View File

@@ -140,8 +140,8 @@ export default {
createTimer() {
if (!this.timer) {
this.timer = setInterval(() => {
this.search(this.last_condition, false)
}, 1000)
this.timerSearch(this.last_condition, false)
}, 15000)
}
},
destroyTimer() {
@@ -168,7 +168,7 @@ export default {
},
select(selection) {
},
search(condition, showLoading = true) {
timerSearch(condition, showLoading = true) {
if(!this.lastRequestComplete){
return;
}else {
@@ -188,6 +188,17 @@ export default {
this.lastRequestComplete = true;
})
},
search(condition, showLoading = true) {
this.last_condition = condition
condition = formatQuickCondition(condition, 'dataset_table_task.name')
const temp = formatCondition(condition)
const param = temp || {}
param['orders'] = formatOrders(this.orderConditions)
post('/dataset/taskLog/list/notexcel/' + this.paginationConfig.currentPage + '/' + this.paginationConfig.pageSize, param, showLoading).then(response => {
this.data = response.data.listObject
this.paginationConfig.total = response.data.itemCount
})
},
showErrorMassage(massage) {
this.show_error_massage = true
this.error_massage = massage