Merge pull request #7265 from dataease/pr@dev-v2@refactor_template-manage

Pr@dev v2@refactor template manage
This commit is contained in:
王嘉豪 2023-12-21 16:46:07 +08:00 committed by GitHub
commit 53273aebfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 356 additions and 150 deletions

View File

@ -17,4 +17,14 @@ public interface ExtVisualizationTemplateMapper{
List<TemplateManageDTO> findBaseTemplateList(); List<TemplateManageDTO> findBaseTemplateList();
Long checkCategoryMap(@Param("categoryId") String categoryId);
Long checkRepeatTemplateId(@Param("categoryId") String categoryId, @Param("templateId") String templateId);
void deleteCategoryMapByTemplate(@Param("templateName") String templateName, @Param("templateId") String templateId);
Long checkCategoryTemplateName(@Param("templateName") String templateName,@Param("categories") List<String> categories);
List<String> findTemplateCategories(@Param("templateId") String templateId);
} }

View File

@ -17,6 +17,7 @@ import io.dataease.template.dao.ext.ExtVisualizationTemplateMapper;
import io.dataease.utils.AuthUtils; import io.dataease.utils.AuthUtils;
import io.dataease.utils.BeanUtils; import io.dataease.utils.BeanUtils;
import io.dataease.visualization.server.StaticResourceServer; import io.dataease.visualization.server.StaticResourceServer;
import io.dataease.xpack.base.settings.dao.entity.BaseSetting;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -56,16 +57,16 @@ public class TemplateManageService implements TemplateManageApi {
request.setWithBlobs("N"); request.setWithBlobs("N");
List<TemplateManageDTO> templateList = extTemplateMapper.findTemplateList(request); List<TemplateManageDTO> templateList = extTemplateMapper.findTemplateList(request);
if (request.getWithChildren()) { if (request.getWithChildren()) {
getTreeChildren(templateList,request.getLeafDvType()); getTreeChildren(templateList, request.getLeafDvType());
} }
return templateList; return templateList;
} }
public void getTreeChildren(List<TemplateManageDTO> parentTemplateList,String dvType) { public void getTreeChildren(List<TemplateManageDTO> parentTemplateList, String dvType) {
Optional.ofNullable(parentTemplateList).ifPresent(parent -> parent.forEach(parentTemplate -> { Optional.ofNullable(parentTemplateList).ifPresent(parent -> parent.forEach(parentTemplate -> {
List<TemplateManageDTO> panelTemplateDTOChildren = extTemplateMapper.findTemplateList(new TemplateManageRequest(parentTemplate.getId(),dvType)); List<TemplateManageDTO> panelTemplateDTOChildren = extTemplateMapper.findTemplateList(new TemplateManageRequest(parentTemplate.getId(), dvType));
parentTemplate.setChildren(panelTemplateDTOChildren); parentTemplate.setChildren(panelTemplateDTOChildren);
getTreeChildren(panelTemplateDTOChildren,dvType); getTreeChildren(panelTemplateDTOChildren, dvType);
})); }));
} }
@ -96,17 +97,21 @@ public class TemplateManageService implements TemplateManageApi {
DEException.throwException("名称已存在"); DEException.throwException("名称已存在");
} }
VisualizationTemplateCategory templateCategory = new VisualizationTemplateCategory(); VisualizationTemplateCategory templateCategory = new VisualizationTemplateCategory();
BeanUtils.copyBean(templateCategory,request); BeanUtils.copyBean(templateCategory, request);
templateCategoryMapper.insert(templateCategory); templateCategoryMapper.insert(templateCategory);
} else {//模板插入 同名的模板进行覆盖(先删除) } else {//模板插入 同名的模板进行覆盖(先删除)
// 分类映射删除
extTemplateMapper.deleteCategoryMapByTemplate(request.getName(),null);
// 模版删除
QueryWrapper<VisualizationTemplate> wrapper = new QueryWrapper<>(); QueryWrapper<VisualizationTemplate> wrapper = new QueryWrapper<>();
wrapper.eq("name",request.getName()); wrapper.eq("name", request.getName());
templateMapper.delete(wrapper); templateMapper.delete(wrapper);
VisualizationTemplate template = new VisualizationTemplate(); VisualizationTemplate template = new VisualizationTemplate();
BeanUtils.copyBean(template,request); BeanUtils.copyBean(template, request);
templateMapper.insert(template); templateMapper.insert(template);
// 插入分类关系 // 插入分类关系
request.getCategories().forEach(categoryId ->{ request.getCategories().forEach(categoryId -> {
VisualizationTemplateCategoryMap categoryMap = new VisualizationTemplateCategoryMap(); VisualizationTemplateCategoryMap categoryMap = new VisualizationTemplateCategoryMap();
categoryMap.setId(UUID.randomUUID().toString()); categoryMap.setId(UUID.randomUUID().toString());
categoryMap.setCategoryId(categoryId); categoryMap.setCategoryId(categoryId);
@ -122,16 +127,27 @@ public class TemplateManageService implements TemplateManageApi {
DEException.throwException("名称已存在"); DEException.throwException("名称已存在");
} }
VisualizationTemplateCategory templateCategory = new VisualizationTemplateCategory(); VisualizationTemplateCategory templateCategory = new VisualizationTemplateCategory();
BeanUtils.copyBean(templateCategory,request); BeanUtils.copyBean(templateCategory, request);
templateCategoryMapper.updateById(templateCategory); templateCategoryMapper.updateById(templateCategory);
}else{ } else {
String nameCheckResult = this.nameCheck(CommonConstants.OPT_TYPE.UPDATE, request.getName(), request.getId()); String nameCheckResult = this.nameCheck(CommonConstants.OPT_TYPE.UPDATE, request.getName(), request.getId());
if (CommonConstants.CHECK_RESULT.EXIST_ALL.equals(nameCheckResult)) { if (CommonConstants.CHECK_RESULT.EXIST_ALL.equals(nameCheckResult)) {
DEException.throwException("名称已存在"); DEException.throwException("名称已存在");
} }
VisualizationTemplate template = new VisualizationTemplate(); VisualizationTemplate template = new VisualizationTemplate();
BeanUtils.copyBean(template,request); BeanUtils.copyBean(template, request);
templateMapper.updateById(template); templateMapper.updateById(template);
//更新分类
// 分类映射删除
extTemplateMapper.deleteCategoryMapByTemplate(null,request.getId());
// 插入分类关系
request.getCategories().forEach(categoryId -> {
VisualizationTemplateCategoryMap categoryMap = new VisualizationTemplateCategoryMap();
categoryMap.setId(UUID.randomUUID().toString());
categoryMap.setCategoryId(categoryId);
categoryMap.setTemplateId(request.getId());
categoryMapMapper.insert(categoryMap);
});
} }
} }
@ -141,14 +157,14 @@ public class TemplateManageService implements TemplateManageApi {
return templateManageDTO; return templateManageDTO;
} }
//名称检查 //模版名称检查
public String nameCheck(String optType, String name,String id) { public String nameCheck(String optType, String name, String id) {
QueryWrapper<VisualizationTemplate> wrapper = new QueryWrapper<>(); QueryWrapper<VisualizationTemplate> wrapper = new QueryWrapper<>();
if (CommonConstants.OPT_TYPE.INSERT.equals(optType)) { if (CommonConstants.OPT_TYPE.INSERT.equals(optType)) {
wrapper.eq("name",name); wrapper.eq("name", name);
} else if (CommonConstants.OPT_TYPE.UPDATE.equals(optType)) { } else if (CommonConstants.OPT_TYPE.UPDATE.equals(optType)) {
wrapper.eq("name",name); wrapper.eq("name", name);
wrapper.ne("id",id); wrapper.ne("id", id);
} }
List<VisualizationTemplate> templateList = templateMapper.selectList(wrapper); List<VisualizationTemplate> templateList = templateMapper.selectList(wrapper);
if (CollectionUtils.isEmpty(templateList)) { if (CollectionUtils.isEmpty(templateList)) {
@ -158,14 +174,25 @@ public class TemplateManageService implements TemplateManageApi {
} }
} }
//名称检查 //分类下模版名称检查
@Override
public String categoryTemplateNameCheck(TemplateManageRequest request) {
Long result = extTemplateMapper.checkCategoryTemplateName(request.getName(), request.getCategories());
if (result == 0) {
return CommonConstants.CHECK_RESULT.NONE;
} else {
return CommonConstants.CHECK_RESULT.EXIST_ALL;
}
}
//分类名称检查
public String categoryNameCheck(String optType, String name, String id) { public String categoryNameCheck(String optType, String name, String id) {
QueryWrapper<VisualizationTemplateCategory> wrapper = new QueryWrapper<>(); QueryWrapper<VisualizationTemplateCategory> wrapper = new QueryWrapper<>();
if (CommonConstants.OPT_TYPE.INSERT.equals(optType)) { if (CommonConstants.OPT_TYPE.INSERT.equals(optType)) {
wrapper.eq("name",name); wrapper.eq("name", name);
} else if (CommonConstants.OPT_TYPE.UPDATE.equals(optType)) { } else if (CommonConstants.OPT_TYPE.UPDATE.equals(optType)) {
wrapper.eq("name",name); wrapper.eq("name", name);
wrapper.ne("id",id); wrapper.ne("id", id);
} }
List<VisualizationTemplateCategory> templateList = templateCategoryMapper.selectList(wrapper); List<VisualizationTemplateCategory> templateList = templateCategoryMapper.selectList(wrapper);
if (CollectionUtils.isEmpty(templateList)) { if (CollectionUtils.isEmpty(templateList)) {
@ -174,31 +201,59 @@ public class TemplateManageService implements TemplateManageApi {
return CommonConstants.CHECK_RESULT.EXIST_ALL; return CommonConstants.CHECK_RESULT.EXIST_ALL;
} }
} }
@Override @Override
public String nameCheck(TemplateManageRequest request) { public String nameCheck(TemplateManageRequest request) {
return nameCheck(request.getOptType(), request.getName(), request.getId()); return nameCheck(request.getOptType(), request.getName(), request.getId());
} }
@Override @Override
public void delete(String id) { public void delete(String id, String categoryId) {
Assert.notNull(id, "id cannot be null"); Assert.notNull(id, "id cannot be null");
Assert.notNull(categoryId, "categoryId cannot be null");
QueryWrapper<VisualizationTemplateCategoryMap> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("template_id", id);
queryWrapper.eq("category_id", categoryId);
categoryMapMapper.delete(queryWrapper);
// 如何是最后一个 则实际模版需要删除
Long result = extTemplateMapper.checkRepeatTemplateId(categoryId, id);
if (result == 0) {
templateMapper.deleteById(id); templateMapper.deleteById(id);
} }
@Override
public void deleteCategory(String id) {
Assert.notNull(id, "id cannot be null");
templateCategoryMapper.deleteById(id);
} }
@Override
public String deleteCategory(String id) {
Assert.notNull(id, "id cannot be null");
// 该分类下是否有其他分类公用的模版
Long checkResult = extTemplateMapper.checkCategoryMap(id);
if (checkResult == 0) {
templateCategoryMapper.deleteById(id);
QueryWrapper<VisualizationTemplateCategoryMap> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("category_id", id);
categoryMapMapper.delete(queryWrapper);
return "success";
} else {
return "repeat";
}
}
@Override @Override
public VisualizationTemplateVO findOne(String templateId) { public VisualizationTemplateVO findOne(String templateId) {
VisualizationTemplate template = templateMapper.selectById(templateId); VisualizationTemplate template = templateMapper.selectById(templateId);
if(template != null){ if (template != null) {
VisualizationTemplateVO templateVO = new VisualizationTemplateVO(); VisualizationTemplateVO templateVO = new VisualizationTemplateVO();
BeanUtils.copyBean(templateVO,template); BeanUtils.copyBean(templateVO, template);
//查找分类
List<String> categories = extTemplateMapper.findTemplateCategories(templateId);
templateVO.setCategories(categories);
return templateVO; return templateVO;
}else{ } else {
return null; return null;
} }
} }
@Override @Override
public List<TemplateManageDTO> find(TemplateManageRequest request) { public List<TemplateManageDTO> find(TemplateManageRequest request) {
return extTemplateMapper.findTemplateList(request); return extTemplateMapper.findTemplateList(request);

View File

@ -3,24 +3,24 @@
<mapper namespace="io.dataease.template.dao.ext.ExtVisualizationTemplateMapper"> <mapper namespace="io.dataease.template.dao.ext.ExtVisualizationTemplateMapper">
<resultMap id="BaseResultMap" type="io.dataease.api.template.vo.VisualizationTemplateVO"> <resultMap id="BaseResultMap" type="io.dataease.api.template.vo.VisualizationTemplateVO">
<id column="id" jdbcType="VARCHAR" property="id" /> <id column="id" jdbcType="VARCHAR" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name" /> <result column="name" jdbcType="VARCHAR" property="name"/>
<result column="pid" jdbcType="VARCHAR" property="pid" /> <result column="pid" jdbcType="VARCHAR" property="pid"/>
<result column="level" jdbcType="INTEGER" property="level" /> <result column="level" jdbcType="INTEGER" property="level"/>
<result column="dv_type" jdbcType="VARCHAR" property="dvType" /> <result column="dv_type" jdbcType="VARCHAR" property="dvType"/>
<result column="node_type" jdbcType="VARCHAR" property="nodeType" /> <result column="node_type" jdbcType="VARCHAR" property="nodeType"/>
<result column="create_by" jdbcType="VARCHAR" property="createBy" /> <result column="create_by" jdbcType="VARCHAR" property="createBy"/>
<result column="create_time" jdbcType="BIGINT" property="createTime" /> <result column="create_time" jdbcType="BIGINT" property="createTime"/>
<result column="template_type" jdbcType="VARCHAR" property="templateType" /> <result column="template_type" jdbcType="VARCHAR" property="templateType"/>
<result column="snapshot" jdbcType="LONGVARCHAR" property="snapshot" /> <result column="snapshot" jdbcType="LONGVARCHAR" property="snapshot"/>
<result column="template_style" jdbcType="LONGVARCHAR" property="templateStyle" /> <result column="template_style" jdbcType="LONGVARCHAR" property="templateStyle"/>
<result column="template_data" jdbcType="LONGVARCHAR" property="templateData" /> <result column="template_data" jdbcType="LONGVARCHAR" property="templateData"/>
<result column="dynamic_data" jdbcType="LONGVARCHAR" property="dynamicData" /> <result column="dynamic_data" jdbcType="LONGVARCHAR" property="dynamicData"/>
</resultMap> </resultMap>
<resultMap id="BaseResultMapDTO" type="io.dataease.api.template.dto.TemplateManageDTO" <resultMap id="BaseResultMapDTO" type="io.dataease.api.template.dto.TemplateManageDTO"
extends="BaseResultMap"> extends="BaseResultMap">
<result column="recent_use_time" jdbcType="BIGINT" property="recentUseTime" /> <result column="recent_use_time" jdbcType="BIGINT" property="recentUseTime"/>
<result column="label" jdbcType="VARCHAR" property="label"/> <result column="label" jdbcType="VARCHAR" property="label"/>
<result column="childrenCount" jdbcType="VARCHAR" property="childrenCount"/> <result column="childrenCount" jdbcType="VARCHAR" property="childrenCount"/>
</resultMap> </resultMap>
@ -33,15 +33,17 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
vt.id, vt.`name`, vt.pid, vt.`level`,vt.`dv_type`, vt.node_type, vt.create_by, vt.create_time, vt.template_type, vt.snapshot vt
.
id
, vt.`name`, vt.pid, vt.`level`,vt.`dv_type`, vt.node_type, vt.create_by, vt.create_time, vt.template_type, vt.snapshot
</sql> </sql>
<sql id="Blob_Column_List"> <sql id="Blob_Column_List">
,vt.template_style, vt.template_data, vt.dynamic_data ,vt.template_style, vt.template_data, vt.dynamic_data
</sql> </sql>
<select id="findBaseTemplateList" resultMap="BaseResultMapCollectionDTO"> <select id="findBaseTemplateList" resultMap="BaseResultMapCollectionDTO">
SELECT SELECT vt.id,
vt.id,
vt.`name`, vt.`name`,
vt.pid, vt.pid,
vt.`level`, vt.`level`,
@ -53,17 +55,14 @@
vt.SNAPSHOT, vt.SNAPSHOT,
vtcm.category_id, vtcm.category_id,
cor.time as 'recent_use_time' cor.time as 'recent_use_time'
FROM FROM visualization_template vt
visualization_template vt
LEFT JOIN visualization_template_category_map vtcm ON vt.id = vtcm.template_id LEFT JOIN visualization_template_category_map vtcm ON vt.id = vtcm.template_id
left JOIN core_opt_recent cor on cor.resource_type=6 and vt.id= cor.resource_name left JOIN core_opt_recent cor on cor.resource_type = 6 and vt.id = cor.resource_name
ORDER BY ORDER BY vt.create_time DESC
vt.create_time DESC
</select> </select>
<select id="findCategories" resultMap="BaseResultMapDTO"> <select id="findCategories" resultMap="BaseResultMapDTO">
SELECT SELECT id,
id,
`name`, `name`,
`name` as lable, `name` as lable,
pid, pid,
@ -74,16 +73,15 @@
create_time, create_time,
template_type, template_type,
SNAPSHOT SNAPSHOT
FROM FROM visualization_template_category
visualization_template_category
order by visualization_template_category.create_time desc order by visualization_template_category.create_time desc
</select> </select>
<select id="findTemplateList" resultMap="BaseResultMapDTO"> <select id="findTemplateList" resultMap="BaseResultMapDTO">
SELECT SELECT
<include refid="Base_Column_List" /> <include refid="Base_Column_List"/>
<if test='withBlobs == "Y"'> <if test='withBlobs == "Y"'>
<include refid="Blob_Column_List" /> <include refid="Blob_Column_List"/>
</if> </if>
FROM FROM
visualization_template vt visualization_template vt
@ -91,4 +89,52 @@
where vtcm.category_id=#{categoryId} where vtcm.category_id=#{categoryId}
order by vt.create_time desc order by vt.create_time desc
</select> </select>
<select id="checkCategoryMap" resultType="Long">
SELECT count(1)
FROM visualization_template_category_map cm
WHERE cm.category_id = #{categoryId}
</select>
<select id="checkRepeatTemplateId" resultType="Long">
SELECT count(1)
FROM visualization_template_category_map cm
where cm.category_id != #{categoryId}
and cm.template_id =#{templateId}
</select>
<select id="checkCategoryTemplateName" resultType="Long">
SELECT
count(1)
FROM
visualization_template vt
LEFT JOIN visualization_template_category_map vtcm ON vt.id = vtcm.template_id
WHERE
vt.NAME = #{templateName}
AND vtcm.category_id IN
<foreach collection="categories" item="categoryId" index="index" open="(" close=")" separator=",">
#{categoryId}
</foreach>
</select>
<delete id="deleteCategoryMapByTemplate">
delete from visualization_template_category_map tcm where tcm.template_id in (
select id from visualization_template vt
<where>
<if test="templateName">
and vt.name = #{templateName}
</if>
<if test="templateId">
and vt.template_id = #{templateId}
</if>
</where>
)
</delete>
<select id="findTemplateCategories" resultType="String">
select category_id
from visualization_template_category_map
where template_id = #{templateId}
</select>
</mapper> </mapper>

View File

@ -7,9 +7,9 @@ export function save(data) {
loading: true loading: true
}) })
} }
export function templateDelete(id) { export function templateDelete(id, categoryId) {
return request.post({ return request.post({
url: '/templateManage/delete/' + id url: '/templateManage/delete/' + id + '/' + categoryId
}) })
} }
@ -54,3 +54,10 @@ export function nameCheck(data) {
data: data data: data
}) })
} }
export function categoryTemplateNameCheck(data) {
return request.post({
url: '/templateManage/categoryTemplateNameCheck',
data: data
})
}

View File

@ -49,6 +49,7 @@
:style="getPointStyle(item)" :style="getPointStyle(item)"
@mousedown="handleMouseDownOnPoint(item, $event)" @mousedown="handleMouseDownOnPoint(item, $event)"
></div> ></div>
<div class="shape-shadow" v-show="batchOptStatus" @mousedown="batchSelected"></div>
<template v-if="boardMoveActive"> <template v-if="boardMoveActive">
<div <div
v-show="!element.editing" v-show="!element.editing"
@ -517,6 +518,15 @@ const selectCurComponent = e => {
} }
} }
const batchSelected = e => {
if (dvMainStore.batchOptStatus) {
componentEditBarRef.value.batchOptCheckOut()
e.stopPropagation()
e.preventDefault()
return
}
}
const handleMouseDownOnPoint = (point, e) => { const handleMouseDownOnPoint = (point, e) => {
dashboardActive.value && emit('onStartResize', e) dashboardActive.value && emit('onStartResize', e)
dvMainStore.setInEditorStatus(true) dvMainStore.setInEditorStatus(true)
@ -833,6 +843,15 @@ onMounted(() => {
position: absolute; position: absolute;
} }
.shape-shadow {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: absolute;
background-size: 100% 100% !important;
}
.shape-inner { .shape-inner {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -23,11 +23,7 @@
/> />
</div> </div>
</el-form-item> </el-form-item>
<el-row <el-row v-show="!!state.templateInfo.snapshot" class="preview" :style="classBackground" />
v-show="!!state.importTemplateInfo.snapshot"
class="preview"
:style="classBackground"
/>
<el-form-item :label="'选择分类'" prop="categories" style="margin-top: 16px"> <el-form-item :label="'选择分类'" prop="categories" style="margin-top: 16px">
<el-select v-model="state.templateInfo.categories" multiple style="width: 100%"> <el-select v-model="state.templateInfo.categories" multiple style="width: 100%">
<el-option <el-option
@ -48,10 +44,10 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { save, nameCheck, find } from '@/api/template' import { save, nameCheck, find, findOne, categoryTemplateNameCheck } from '@/api/template'
import { computed, onMounted, reactive, ref } from 'vue' import { computed, onMounted, reactive, ref } from 'vue'
import { imgUrlTrans } from '@/utils/imgUtils' import { imgUrlTrans } from '@/utils/imgUtils'
import { ElMessage } from 'element-plus-secondary' import { ElMessage, ElMessageBox } from 'element-plus-secondary'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
const emits = defineEmits(['closeEditTemplateDialog', 'refresh']) const emits = defineEmits(['closeEditTemplateDialog', 'refresh'])
const { t } = useI18n() const { t } = useI18n()
@ -64,6 +60,15 @@ const props = defineProps({
templateCategories: { templateCategories: {
type: Array, type: Array,
required: true required: true
},
optType: {
type: String,
required: true,
default: 'insert'
},
templateId: {
type: String,
required: false
} }
}) })
@ -105,9 +110,9 @@ const state = reactive({
}) })
const classBackground = computed(() => { const classBackground = computed(() => {
if (state.importTemplateInfo.snapshot) { if (state.templateInfo.snapshot) {
return { return {
background: `url(${imgUrlTrans(state.importTemplateInfo.snapshot)}) no-repeat` background: `url(${imgUrlTrans(state.templateInfo.snapshot)}) no-repeat`
} }
} else { } else {
return {} return {}
@ -119,6 +124,7 @@ const showCurrentTemplate = pid => {
state.nameList = response.data state.nameList = response.data
}) })
} }
const cancel = () => { const cancel = () => {
emits('closeEditTemplateDialog') emits('closeEditTemplateDialog')
} }
@ -138,40 +144,63 @@ const saveTemplate = () => {
return false return false
} }
if (props.optType === 'insert') {
importTemplate()
} else {
editTemplate()
}
}
const editTemplate = () => {
const nameCheckRequest = { const nameCheckRequest = {
pid: state.templateInfo.pid, pid: state.templateInfo.pid,
name: state.templateInfo.name, name: state.templateInfo.name,
categories: state.templateInfo.categories, categories: state.templateInfo.categories,
optType: 'insert' optType: props.optType
} }
//
nameCheck(nameCheckRequest).then(response => { nameCheck(nameCheckRequest).then(response => {
if (response.data.indexOf('exist') > -1) {
ElMessage.warning(t('当前模版名称已经存在'))
// const options = {
// title: 'commons.prompt',
// content: 'system_parameter_setting.to_overwrite_them',
// type: 'primary',
// cb: () =>
// save(state.templateInfo).then(response => {
// ElMessage.success('')
// emits('refresh')
// emits('closeEditTemplateDialog')
// }),
// confirmButtonText: t('template.override')
// }
// handlerConfirm(options)
} else {
save(state.templateInfo).then(response => { save(state.templateInfo).then(response => {
ElMessage.success(t('导入成功')) ElMessage.success(t('导入成功'))
emits('refresh') emits('refresh')
emits('closeEditTemplateDialog') emits('closeEditTemplateDialog')
}) })
}
}) })
} }
const handlerConfirm = option => { const importTemplate = () => {
// do handlerConfirm const nameCheckRequest = {
pid: state.templateInfo.pid,
name: state.templateInfo.name,
categories: state.templateInfo.categories,
optType: props.optType
}
categoryTemplateNameCheck(nameCheckRequest).then(response => {
if (response.data.indexOf('exist') > -1) {
ElMessageBox.confirm('提示?', {
tip: '当前分类存在相同模版名称,是否覆盖?',
confirmButtonType: 'danger',
type: 'warning',
autofocus: false,
showClose: false
}).then(() => {
save(state.templateInfo).then(response => {
ElMessage.success(t('覆盖成功'))
emits('refresh')
emits('closeEditTemplateDialog')
})
})
} else {
//
nameCheck(nameCheckRequest).then(response => {
save(state.templateInfo).then(response => {
ElMessage.success(t('导入成功'))
emits('refresh')
emits('closeEditTemplateDialog')
})
})
}
})
} }
const handleFileChange = e => { const handleFileChange = e => {
@ -196,8 +225,15 @@ const goFile = () => {
} }
onMounted(() => { onMounted(() => {
showCurrentTemplate(props.pid) // showCurrentTemplate(props.pid)
}) })
if (props.templateId) {
findOne(props.templateId).then(rsp => {
state.templateInfo = rsp.data
console.log('test=' + JSON.stringify(state.templateInfo))
})
}
</script> </script>
<style scoped lang="less"> <style scoped lang="less">

View File

@ -5,15 +5,6 @@
</div> </div>
<div class="card-info"> <div class="card-info">
<div style="display: flex; align-items: center; width: calc(100% - 24px)"> <div style="display: flex; align-items: center; width: calc(100% - 24px)">
<el-tooltip class="item" effect="dark" :content="dvTypeName" placement="top">
<el-icon style="font-size: 18px" v-if="model.dvType === 'dashboard'">
<Icon name="dv-dashboard-spine"></Icon>
</el-icon>
<el-icon class="icon-screen-new" style="font-size: 18px" v-else>
<Icon name="icon_operation-analysis_outlined"></Icon>
</el-icon>
</el-tooltip>
<el-tooltip class="item" effect="dark" :content="model.name" placement="top"> <el-tooltip class="item" effect="dark" :content="model.name" placement="top">
<span class="de-model-text">{{ model.name }}</span> <span class="de-model-text">{{ model.name }}</span>
</el-tooltip> </el-tooltip>
@ -24,7 +15,7 @@
<template #dropdown> <template #dropdown>
<el-dropdown-menu class="de-card-dropdown"> <el-dropdown-menu class="de-card-dropdown">
<slot> <slot>
<el-dropdown-item command="rename"> <el-dropdown-item command="templateEdit">
<el-icon><EditPen /></el-icon> <el-icon><EditPen /></el-icon>
编辑 编辑
</el-dropdown-item> </el-dropdown-item>
@ -106,7 +97,7 @@ const handleCommand = key => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 4px 12px 9px 12px; padding: 4px 12px 9px 0px;
box-sizing: border-box; box-sizing: border-box;
.el-icon-more { .el-icon-more {

View File

@ -105,7 +105,7 @@ const add = () => {
} }
const categoryDelete = template => { const categoryDelete = template => {
ElMessageBox.confirm('确定删除该分类吗?', { ElMessageBox.confirm('确定删除该分类吗?', {
tip: '删除后,该分类下的所有模版也将删除。', tip: '',
confirmButtonType: 'danger', confirmButtonType: 'danger',
type: 'warning', type: 'warning',
autofocus: false, autofocus: false,

View File

@ -74,16 +74,17 @@
v-model="state.editTemplate" v-model="state.editTemplate"
append-to-body append-to-body
class="de-dialog-form" class="de-dialog-form"
width="600px" width="420px"
> >
<el-form <el-form
ref="templateEditFormRef" ref="templateEditFormRef"
label-position="top"
class="de-form-item" class="de-form-item"
:model="state.templateEditForm" :model="state.templateEditForm"
:rules="state.templateEditFormRules" :rules="state.templateEditFormRules"
> >
<el-form-item :label="state.dialogTitleLabel" prop="name"> <el-form-item :label="state.dialogTitleLabel" prop="name">
<el-input v-model="state.templateEditForm.name" /> <el-input :placeholder="'请输入分类名称'" v-model="state.templateEditForm.name" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -100,12 +101,15 @@
:title="state.templateDialog.title" :title="state.templateDialog.title"
v-model="state.templateDialog.visible" v-model="state.templateDialog.visible"
:show-close="true" :show-close="true"
:destroy-on-close="true"
class="de-dialog-form" class="de-dialog-form"
width="600px" width="600px"
> >
<de-template-import <de-template-import
v-if="state.templateDialog.visible" v-if="state.templateDialog.visible"
:pid="state.templateDialog.pid" :pid="state.templateDialog.pid"
:template-id="state.templateDialog.templateId"
:opt-type="state.templateDialog.optType"
:template-categories="state.templateCategories" :template-categories="state.templateCategories"
@refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)" @refresh="showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)"
@closeEditTemplateDialog="closeEditTemplateDialog" @closeEditTemplateDialog="closeEditTemplateDialog"
@ -121,7 +125,7 @@ import { save, templateDelete, find, findCategories, deleteCategory } from '@/ap
import elementResizeDetectorMaker from 'element-resize-detector' import elementResizeDetectorMaker from 'element-resize-detector'
import { computed, nextTick, onMounted, reactive, ref } from 'vue' import { computed, nextTick, onMounted, reactive, ref } from 'vue'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { ElMessage } from 'element-plus-secondary' import { ElMessage, ElMessageBox } from 'element-plus-secondary'
import DeTemplateList from '@/views/template/component/DeTemplateList.vue' import DeTemplateList from '@/views/template/component/DeTemplateList.vue'
const { t } = useI18n() const { t } = useI18n()
const templateEditFormRef = ref(null) const templateEditFormRef = ref(null)
@ -183,6 +187,8 @@ const state = reactive({
templateDialog: { templateDialog: {
title: t('visualization.import_template'), title: t('visualization.import_template'),
visible: false, visible: false,
templateId: null,
optType: 'insert',
pid: '', pid: '',
categories: [] categories: []
} }
@ -220,7 +226,7 @@ const nameRepeat = value => {
const handleCommand = (key, data) => { const handleCommand = (key, data) => {
switch (key) { switch (key) {
case 'rename': case 'templateEdit':
templateEdit(data) templateEdit(data)
break break
case 'delete': case 'delete':
@ -256,18 +262,37 @@ const showCurrentTemplate = (pid, label) => {
const categoryDelete = id => { const categoryDelete = id => {
if (id) { if (id) {
deleteCategory(id).then(response => { deleteCategory(id).then(response => {
if (response.data === 'success') {
ElMessage({ ElMessage({
message: t('commons.delete_success'), message: t('commons.delete_success'),
type: 'success', type: 'success',
showClose: true showClose: true
}) })
getTree() getTree()
} else {
ElMessageBox.confirm('无法删除分类?', {
tip: '请移除该分类下所有模版再进行删除分类操作',
confirmButtonText: '知道了',
confirmButtonType: 'default',
showCancelButton: false,
type: 'warning',
autofocus: false,
showClose: false
})
}
}) })
} }
} }
const templateDeleteInfo = id => { const templateDeleteInfo = id => {
if (id) { if (id) {
templateDelete(id).then(response => { ElMessageBox.confirm('确定删除该模版吗?', {
tip: '',
confirmButtonType: 'danger',
type: 'warning',
autofocus: false,
showClose: false
}).then(() => {
templateDelete(id, state.currentTemplateId).then(response => {
ElMessage({ ElMessage({
message: t('commons.delete_success'), message: t('commons.delete_success'),
type: 'success', type: 'success',
@ -275,6 +300,7 @@ const templateDeleteInfo = id => {
}) })
showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel) showCurrentTemplate(state.currentTemplateId, state.currentTemplateLabel)
}) })
})
} }
} }
@ -283,7 +309,7 @@ const showTemplateEditDialog = (type, templateInfo) => {
state.formType = type state.formType = type
if (type === 'edit') { if (type === 'edit') {
state.templateEditForm = JSON.parse(JSON.stringify(templateInfo)) state.templateEditForm = JSON.parse(JSON.stringify(templateInfo))
state.dialogTitle = state.templateEditForm['nodeType'] === 'folder' ? '编辑分类' : '编辑模板' state.dialogTitle = state.templateEditForm['nodeType'] === 'folder' ? '重命名' : '编辑模板'
state.originName = state.templateEditForm['label'] state.originName = state.templateEditForm['label']
} else { } else {
state.dialogTitle = t('visualization.add_category') state.dialogTitle = t('visualization.add_category')
@ -299,7 +325,11 @@ const showTemplateEditDialog = (type, templateInfo) => {
} }
const templateEdit = templateInfo => { const templateEdit = templateInfo => {
showTemplateEditDialog('edit', templateInfo) console.log('templateInfo' + JSON.stringify(templateInfo))
state.templateDialog.visible = true
state.templateDialog.title = '编辑模版'
state.templateDialog.optType = 'update'
state.templateDialog.templateId = templateInfo.id
} }
const categoryClick = params => { const categoryClick = params => {
@ -362,6 +392,8 @@ const closeEditTemplateDialog = () => {
const templateImport = pid => { const templateImport = pid => {
state.templateDialog.visible = true state.templateDialog.visible = true
state.templateDialog.templateId = null
state.templateDialog.optType = 'insert'
state.templateDialog.pid = pid state.templateDialog.pid = pid
} }

View File

@ -14,11 +14,11 @@ public interface TemplateManageApi {
@PostMapping("/save") @PostMapping("/save")
TemplateManageDTO save(@RequestBody TemplateManageRequest request); TemplateManageDTO save(@RequestBody TemplateManageRequest request);
@PostMapping("/delete/{id}") @PostMapping("/delete/{id}/{categoryId}")
void delete(@PathVariable String id); void delete(@PathVariable String id,@PathVariable String categoryId);
@PostMapping("/deleteCategory/{id}") @PostMapping("/deleteCategory/{id}")
void deleteCategory(@PathVariable String id); String deleteCategory(@PathVariable String id);
@GetMapping("/findOne/{templateId}") @GetMapping("/findOne/{templateId}")
VisualizationTemplateVO findOne(@PathVariable String templateId) throws Exception; VisualizationTemplateVO findOne(@PathVariable String templateId) throws Exception;
@ -32,4 +32,7 @@ public interface TemplateManageApi {
@PostMapping("/nameCheck") @PostMapping("/nameCheck")
String nameCheck(@RequestBody TemplateManageRequest request); String nameCheck(@RequestBody TemplateManageRequest request);
@PostMapping("/categoryTemplateNameCheck")
String categoryTemplateNameCheck(@RequestBody TemplateManageRequest request);
} }

View File

@ -2,6 +2,8 @@ package io.dataease.api.template.vo;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @author : WangJiaHao * @author : WangJiaHao
* @date : 2023/11/7 13:22 * @date : 2023/11/7 13:22
@ -73,4 +75,9 @@ public class VisualizationTemplateVO {
* 预存数据 * 预存数据
*/ */
private String dynamicData; private String dynamicData;
/**
* 分类
*/
private List<String> categories;
} }