Merge branch 'dev-v2' into pr@dev-v2_dzz

This commit is contained in:
dataeaseShu 2023-12-26 10:53:48 +08:00
commit 2693c19434
13 changed files with 202 additions and 105 deletions

View File

@ -124,10 +124,15 @@
<phase>generate-resources</phase>
<configuration>
<target>
<move todir="src/main/resources/static">
<copy todir="src/main/resources/static">
<fileset dir="../core-frontend/dist">
<include name="**"/>
</fileset>
</copy>
<move todir="src/main/resources/static/dev2-front">
<fileset dir="src/main/resources/static">
<exclude name="*.html"/>
</fileset>
</move>
</target>
</configuration>

View File

@ -87,6 +87,8 @@ public class SQLConstants {
public static final String WHERE_BETWEEN = "'%s' AND '%s'";
public static final String WHERE_CALUE_BETWEEN = "%s AND %s";
public static final String BRACKETS = "(%s)";
public static final String ROUND = "ROUND(%s,%s)";

View File

@ -64,9 +64,7 @@ public class ExtWhere2Str {
whereName = String.format(SQLConstants.DE_CAST_DATE_FORMAT, originName, StringUtils.isEmpty(field.getDateFormat()) ? SQLConstants.DEFAULT_DATE_FORMAT : field.getDateFormat(), date_format);
}
if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
String cast = String.format(SQLConstants.CAST, originName, SQLConstants.DEFAULT_INT_FORMAT);
// 此处获取标准格式的日期
whereName = String.format(SQLConstants.FROM_UNIXTIME, cast, date_format);
whereName = String.format(SQLConstants.CAST, originName, SQLConstants.DEFAULT_INT_FORMAT);
}
if (field.getDeExtractType() == 1) {
// 此处获取标准格式的日期
@ -109,7 +107,7 @@ public class ExtWhere2Str {
if (request.getDatasetTableField().getDeExtractType() == 2
|| request.getDatasetTableField().getDeExtractType() == 3
|| request.getDatasetTableField().getDeExtractType() == 4) {
whereValue = String.format(SQLConstants.WHERE_BETWEEN, value.get(0), value.get(1));
whereValue = String.format(SQLConstants.WHERE_CALUE_BETWEEN, value.get(0), value.get(1));
} else {
whereName = String.format(SQLConstants.UNIX_TIMESTAMP, whereName);
whereValue = String.format(SQLConstants.WHERE_BETWEEN, Long.parseLong(value.get(0)), Long.parseLong(value.get(1)));

View File

@ -8,7 +8,7 @@ i18n_menu.template=\u6A21\u7248
i18n_menu.application=\u5E94\u7528
i18n_menu.system=\u7CFB\u7EDF\u7BA1\u7406
i18n_menu.template-market=\u6A21\u7248\u5E02\u573A
i18n_menu.template-setting=\u6A21\u7248\u7BA1\u7406
i18n_menu.template-setting=\u6a21\u677f\u7ba1\u7406
i18n_menu.view=\u6570\u636E\u5C55\u793A
i18n_menu.data=\u6570\u636E\u51C6\u5907
i18n_menu.panel=\u4EEA\u8868\u677F

View File

@ -21,6 +21,7 @@ export function pathResolve(dir: string) {
return resolve(root, '.', dir)
}
export default {
base: '/dev2-front',
plugins: [
Vue(),
VueJsx(),

View File

@ -0,0 +1,14 @@
<svg width="126" height="125" viewBox="0 0 126 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.2978 13.9995H102.702C105.904 13.9995 108.5 16.5805 108.5 19.7642V83.9427L83.775 109.467H30.2978C27.0957 109.467 24.5 106.886 24.5 103.702V19.7642C24.5 16.5805 27.0957 13.9995 30.2978 13.9995Z" fill="#D6DAE1"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M83.7749 109.426V85.8234C83.7749 84.7622 84.6401 83.9019 85.7075 83.9019H108.5L83.7749 109.426Z" fill="#B5BEC8"/>
<rect x="76.1875" y="21.999" width="25" height="32" rx="2" fill="#F4F5F9"/>
<rect x="32.1001" y="22.0542" width="32.25" height="5" rx="1" fill="#F4F5F9"/>
<rect x="32.1001" y="31.6406" width="32.25" height="5" rx="1" fill="#F4F5F9"/>
<rect x="32.1001" y="41.6406" width="16.125" height="5" rx="1" fill="#F4F5F9"/>
<rect x="32.1001" y="68.9229" width="68.8" height="5" rx="1" fill="#F4F5F9"/>
<rect x="32.1001" y="76.3799" width="68.8" height="5" rx="1" fill="#F4F5F9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.2158 54.1396C38.7749 54.1396 29.5002 63.4602 29.5002 74.9577C29.5002 86.4552 38.7749 95.7758 50.2158 95.7758C53.0012 95.7758 55.6583 95.2233 58.0843 94.2214L68.8536 110.371L74.4055 106.63L63.7784 90.6942C68.16 86.877 70.9313 81.2426 70.9313 74.9577C70.9313 63.4602 61.6567 54.1396 50.2158 54.1396ZM50.2158 60.8555C57.9661 60.8555 64.2489 67.1694 64.2489 74.9581C64.2489 82.7467 57.9661 89.0606 50.2158 89.0606C42.4655 89.0606 36.1827 82.7467 36.1827 74.9581C36.1827 67.1694 42.4655 60.8555 50.2158 60.8555Z" fill="white"/>
<path d="M25.1083 59.9895L24.6889 60.9687L15.4748 57.0168L15.8942 56.0377L25.1083 59.9895Z" fill="#1F2329"/>
<path d="M30.1257 56.5756L29.3071 57.2573L21.3806 47.733L22.1992 47.0513L30.1257 56.5756Z" fill="#1F2329"/>
<path d="M25.2771 65.653L25.3153 66.719L12.6962 67.1485L12.658 66.0825L25.2771 65.653Z" fill="#1F2329"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -205,6 +205,10 @@ const curScale = computed(() => {
return canvasStyleData.value.scale / 100
})
const curBaseScale = computed(() => {
return dvMainStore.canvasStyleData.scale / 100
})
const pointShadowShow = computed(() => {
return (
canvasId.value === 'canvas-main' &&
@ -1314,7 +1318,7 @@ defineExpose({
:id="'component' + item.id"
:active="item.id === curComponentId"
:dv-type="dvInfo.type"
:scale="curScale"
:scale="curBaseScale"
:style="getComponentStyle(item.style)"
:prop-value="item.propValue"
:is-edit="true"

View File

@ -9,10 +9,20 @@ export const lockStore = defineStore('lock', {
actions: {
lock() {
curComponent.value.isLock = true
if (curComponent.value.component === 'Group') {
curComponent.value.propValue.forEach(component => {
component.isLock = true
})
}
},
unlock() {
curComponent.value.isLock = false
if (curComponent.value.component === 'Group') {
curComponent.value.propValue.forEach(component => {
component.isLock = false
})
}
}
}
})

View File

@ -232,7 +232,7 @@ const operation = (cmd: string, data: BusiTreeNode, nodeType: string) => {
})
} else if (cmd === 'edit') {
resourceEdit(data.id)
} else {
} else if (cmd === 'copy') {
const targetPid = findParentIdByChildIdRecursive(state.resourceTree, data.id)
const params: ResourceOrFolder = {
nodeType: nodeType as 'folder' | 'leaf',
@ -248,6 +248,8 @@ const operation = (cmd: string, data: BusiTreeNode, nodeType: string) => {
: `#/dashboard?opt=copy&pid=${params.pid}&resourceId=${data.data}`
window.open(baseUrl, '_blank')
})
} else {
resourceGroupOpt.value.optInit(nodeType, data, cmd, ['copy'].includes(cmd))
}
}

View File

@ -109,7 +109,7 @@ const handleDrop = e => {
component.style.left = e.clientX - rectInfo.x
component.id = guid()
changeComponentSizeWithScale(component)
dvMainStore.addComponent({ component: component, index: 0 })
dvMainStore.addComponent({ component: component, index: undefined })
adaptCurThemeCommonStyle(component)
snapshotStore.recordSnapshotCache('renderChart', component.id)
}

View File

@ -172,7 +172,7 @@ const editTemplate = () => {
nameCheck(nameCheckRequest).then(response => {
save(state.templateInfo).then(response => {
ElMessage.success(t('编辑成功'))
emits('refresh')
emits('refresh', { optType: 'refresh' })
emits('closeEditTemplateDialog')
})
})
@ -196,7 +196,7 @@ const importTemplate = () => {
}).then(() => {
save(state.templateInfo).then(response => {
ElMessage.success(t('覆盖成功'))
emits('refresh')
emits('refresh', { optType: 'refresh' })
emits('closeEditTemplateDialog')
})
})
@ -205,7 +205,7 @@ const importTemplate = () => {
nameCheck(nameCheckRequest).then(response => {
save(state.templateInfo).then(response => {
ElMessage.success(t('导入成功'))
emits('refresh')
emits('refresh', { optType: 'refresh' })
emits('closeEditTemplateDialog')
})
})
@ -235,7 +235,7 @@ const goFile = () => {
}
const doAddCategory = () => {
emits('addCategoryInfo')
emits('refresh', { optType: 'addCategory' })
}
onMounted(() => {

View File

@ -24,7 +24,7 @@
</el-input>
</div>
<div class="sys-setting-p">
<div class="container-sys-param">
<div class="container-sys-param" v-show="state.templateCategories.length">
<div style="width: 100%; height: 100%">
<div class="de-template">
<div class="tabs-container flex-tabs">
@ -52,11 +52,24 @@
<span>的搜索结果&nbsp;{{ currentTemplateShowListComputed.length }}&nbsp;</span>
</span>
</div>
<el-empty
v-if="!state.currentTemplateShowList.length"
:image="NoneImage"
:description="'暂无模板'"
/>
<el-row
style="height: 100%"
v-if="!state.currentTemplateShowList.length && !state.templateFilterText"
class="custom-position"
>
<Icon style="width: 125px; height: 125px" name="dv-empty" />
<span style="margin-top: 8px; font-size: 14px"> 暂无模版 </span>
</el-row>
<el-row
style="height: 100%"
v-if="!state.currentTemplateShowList.length && state.templateFilterText"
class="custom-position"
>
<Icon style="width: 125px; height: 125px" name="dv-nothing" />
<span style="margin-top: 8px; font-size: 14px"> 没有找到相关模版 </span>
</el-row>
<div v-show="state.currentTemplateId !== ''" id="template-box" class="template-box">
<de-template-item
v-for="item in currentTemplateShowListComputed"
@ -81,93 +94,113 @@
</div>
</div>
</div>
<el-dialog
:title="state.dialogTitle"
v-model="state.editTemplate"
append-to-body
class="de-dialog-form"
width="420px"
>
<el-form
ref="templateEditFormRef"
label-position="top"
class="de-form-item"
:model="state.templateEditForm"
:rules="state.templateEditFormRules"
>
<el-form-item :label="state.dialogTitleLabel" prop="name">
<el-input :placeholder="'请输入分类名称'" v-model="state.templateEditForm.name" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button secondary @click="close()">{{ t('commons.cancel') }}</el-button>
<el-button type="primary" @click="saveTemplateEdit(state.templateEditForm)"
>{{ t('commons.confirm') }}
</el-button>
</div>
</template>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="state.templateDialog.title"
v-model="state.templateDialog.visible"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-template-import
v-if="state.templateDialog.visible"
:pid="state.templateDialog.pid"
:template-id="state.templateDialog.templateId"
:opt-type="state.templateDialog.optType"
:template-categories="state.templateCategories"
@addCategoryInfo="showTemplateEditDialog('new', null)"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeEditTemplateDialog="closeEditTemplateDialog"
/>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="state.templateDialog.title"
v-model="state.templateDialog.visible"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-template-import
v-if="state.templateDialog.visible"
:pid="state.templateDialog.pid"
:template-id="state.templateDialog.templateId"
:opt-type="state.templateDialog.optType"
:template-categories="state.templateCategories"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeEditTemplateDialog="closeEditTemplateDialog"
/>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="'修改分类'"
v-model="state.batchOptDialogShow"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-category-change
v-if="state.batchOptDialogShow"
:template-ids="batchTemplateIds"
:template-categories="state.templateCategories"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeBatchEditTemplateDialog="closeBatchOptDialog"
></de-category-change>
</el-dialog>
</div>
</div>
<div class="container-sys-param" v-show="!state.templateCategories.length">
<el-row style="height: 100%" class="custom-position">
<Icon style="width: 125px; height: 125px" name="dv-empty" />
<span style="margin-top: 8px; font-size: 14px">
<el-button
style="float: right"
type="primary"
@click="templateImport(state.currentTemplateId)"
>
{{ t('visualization.import') }}
</el-button>
<el-button
style="float: right; margin-right: 12px"
@click="showTemplateEditDialog('new', null)"
>
添加分类
</el-button>
</span>
</el-row>
</div>
<el-dialog
:title="state.dialogTitle"
v-model="state.editTemplate"
append-to-body
class="de-dialog-form"
width="420px"
>
<el-form
ref="templateEditFormRef"
label-position="top"
class="de-form-item"
:model="state.templateEditForm"
:rules="state.templateEditFormRules"
>
<el-form-item :label="state.dialogTitleLabel" prop="name">
<el-input :placeholder="'请输入分类名称'" v-model="state.templateEditForm.name" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button secondary @click="close()">{{ t('commons.cancel') }}</el-button>
<el-button type="primary" @click="saveTemplateEdit(state.templateEditForm)"
>{{ t('commons.confirm') }}
</el-button>
</div>
</template>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="state.templateDialog.title"
v-model="state.templateDialog.visible"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-template-import
v-if="state.templateDialog.visible"
:pid="state.templateDialog.pid"
:template-id="state.templateDialog.templateId"
:opt-type="state.templateDialog.optType"
:template-categories="state.templateCategories"
@doTest="closeEditTemplateDialog"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeEditTemplateDialog="closeEditTemplateDialog"
/>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="state.templateDialog.title"
v-model="state.templateDialog.visible"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-template-import
v-if="state.templateDialog.visible"
:pid="state.templateDialog.pid"
:template-id="state.templateDialog.templateId"
:opt-type="state.templateDialog.optType"
:template-categories="state.templateCategories"
@refresh="importRefresh"
@closeEditTemplateDialog="closeEditTemplateDialog"
/>
</el-dialog>
<!--导入templateDialog-->
<el-dialog
:title="'修改分类'"
v-model="state.batchOptDialogShow"
:show-close="true"
:destroy-on-close="true"
class="de-dialog-form"
width="600px"
>
<de-category-change
v-if="state.batchOptDialogShow"
:template-ids="batchTemplateIds"
:template-categories="state.templateCategories"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeBatchEditTemplateDialog="closeBatchOptDialog"
></de-category-change>
</el-dialog>
</div>
</template>
@ -188,6 +221,7 @@ import DeTemplateList from '@/views/template/component/DeTemplateList.vue'
const { t } = useI18n()
const templateEditFormRef = ref(null)
const templateListRef = ref(null)
import NoneTemplate from '@/assets/svg/dv-empty.svg'
import NoneImage from '@/assets/none.png'
import DeTemplateImport from '@/views/template/component/DeTemplateImport.vue'
import DeTemplateItem from '@/views/template/component/DeTemplateItem.vue'
@ -351,6 +385,14 @@ const handleClick = (tab, event) => {
getTree()
}
const importRefresh = params => {
if (params.optType === 'refresh') {
showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)
} else {
showTemplateEditDialog('new', null)
}
}
const showCurrentTemplate = (pid, label) => {
state.currentTemplateId = pid
state.currentTemplateLabel = label
@ -612,4 +654,23 @@ onMounted(() => {
float: right;
width: 320px;
}
.custom-position {
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
flex-flow: row nowrap;
color: #9ea6b2;
flex-direction: column;
span {
line-height: 22px;
color: #646a73;
}
}
.ed-empty__image img {
width: 126px;
}
</style>

View File

@ -27,7 +27,7 @@ public class WhitelistUtils {
requestURI = requestURI.replaceFirst(AuthConstant.DE_API_PREFIX, "");
}
return WHITE_PATH.contains(requestURI)
|| StringUtils.endsWithAny(requestURI, ".ico", "js", ".css", "svg", "png", "jpg", "js.map")
|| StringUtils.endsWithAny(requestURI, ".ico", "js", ".css", "svg", "png", "jpg", "js.map", ".otf")
|| StringUtils.startsWithAny(requestURI, "data:image")
|| StringUtils.startsWithAny(requestURI, "/login/platformLogin/")
|| StringUtils.startsWithAny(requestURI, "/static-resource/")