提交 f155f3d7 authored 作者: wangjiahao's avatar wangjiahao

Merge remote-tracking branch 'origin/main' into main

...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
# DataEase - 人人可用的开源数据可视化分析工具 # DataEase - 人人可用的开源数据可视化分析工具
DataEase 是开源的数据可视化分析工具,帮助用户分析数据、改善业务。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。
- 图表展示: 支持 PC 端、移动端及大屏; - 图表展示: 支持 PC 端、移动端及大屏;
- 图表制作: 支持丰富的图表类型(基于 Apache ECharts 实现)、支持拖拉拽方式快速制作仪表板; - 图表制作: 支持丰富的图表类型(基于 Apache ECharts 实现)、支持拖拉拽方式快速制作仪表板;
......
...@@ -32,5 +32,5 @@ public abstract class DatasourceProvider { ...@@ -32,5 +32,5 @@ public abstract class DatasourceProvider {
abstract public Map<String, List> fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception; abstract public Map<String, List> fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception;
abstract public void initDataSource(DatasourceRequest datasourceRequest) throws Exception; abstract public void initDataSource(DatasourceRequest datasourceRequest, String type) throws Exception;
} }
...@@ -271,7 +271,7 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -271,7 +271,7 @@ public class JdbcProvider extends DatasourceProvider {
private Connection getConnectionFromPool(DatasourceRequest datasourceRequest) throws Exception { private Connection getConnectionFromPool(DatasourceRequest datasourceRequest) throws Exception {
ComboPooledDataSource dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId()); ComboPooledDataSource dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId());
if (dataSource == null) { if (dataSource == null) {
initDataSource(datasourceRequest); initDataSource(datasourceRequest, "add");
} }
dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId()); dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId());
Connection co = dataSource.getConnection(); Connection co = dataSource.getConnection();
...@@ -279,9 +279,28 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -279,9 +279,28 @@ public class JdbcProvider extends DatasourceProvider {
} }
@Override @Override
public void initDataSource(DatasourceRequest datasourceRequest) throws Exception { public void initDataSource(DatasourceRequest datasourceRequest, String type) throws Exception {
switch (type){
case "add":
ComboPooledDataSource dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId()); ComboPooledDataSource dataSource = jdbcConnection.get(datasourceRequest.getDatasource().getId());
if (dataSource == null) { if (dataSource == null) {
extracted(datasourceRequest);
}
break;
case "edit":
jdbcConnection.remove(datasourceRequest.getDatasource().getId());
extracted(datasourceRequest);
break;
case "delete":
jdbcConnection.remove(datasourceRequest.getDatasource().getId());
break;
default:
break;
}
}
private void extracted(DatasourceRequest datasourceRequest) throws PropertyVetoException {
ComboPooledDataSource dataSource;
dataSource = new ComboPooledDataSource(); dataSource = new ComboPooledDataSource();
setCredential(datasourceRequest, dataSource); setCredential(datasourceRequest, dataSource);
dataSource.setMaxIdleTime(30); // 最大空闲时间 dataSource.setMaxIdleTime(30); // 最大空闲时间
...@@ -301,7 +320,6 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -301,7 +320,6 @@ public class JdbcProvider extends DatasourceProvider {
dataSource.setUnreturnedConnectionTimeout(3600); dataSource.setUnreturnedConnectionTimeout(3600);
jdbcConnection.put(datasourceRequest.getDatasource().getId(), dataSource); jdbcConnection.put(datasourceRequest.getDatasource().getId(), dataSource);
} }
}
private static Connection getConnection(DatasourceRequest datasourceRequest) throws Exception { private static Connection getConnection(DatasourceRequest datasourceRequest) throws Exception {
String username = null; String username = null;
......
...@@ -55,9 +55,24 @@ public class DatasourceService { ...@@ -55,9 +55,24 @@ public class DatasourceService {
datasource.setCreateTime(currentTimeMillis); datasource.setCreateTime(currentTimeMillis);
datasource.setCreateBy(String.valueOf(AuthUtils.getUser().getUsername())); datasource.setCreateBy(String.valueOf(AuthUtils.getUser().getUsername()));
datasourceMapper.insertSelective(datasource); datasourceMapper.insertSelective(datasource);
initConnectionPool(datasource, "add");
return datasource; return datasource;
} }
private void initConnectionPool(Datasource datasource, String type) {
commonThreadPool.addTask(() -> {
try {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource);
datasourceProvider.initDataSource(datasourceRequest, type);
LogUtil.info("Succsss to init datasource connection pool: " + datasource.getName());
} catch (Exception e) {
LogUtil.error("Failed to init datasource connection pool: " + datasource.getName(), e);
}
});
}
public List<DatasourceDTO> getDatasourceList(DatasourceUnionRequest request) throws Exception { public List<DatasourceDTO> getDatasourceList(DatasourceUnionRequest request) throws Exception {
request.setSort("update_time desc"); request.setSort("update_time desc");
return extDataSourceMapper.queryUnion(request); return extDataSourceMapper.queryUnion(request);
...@@ -92,6 +107,7 @@ public class DatasourceService { ...@@ -92,6 +107,7 @@ public class DatasourceService {
datasource.setCreateTime(null); datasource.setCreateTime(null);
datasource.setUpdateTime(System.currentTimeMillis()); datasource.setUpdateTime(System.currentTimeMillis());
datasourceMapper.updateByPrimaryKeySelective(datasource); datasourceMapper.updateByPrimaryKeySelective(datasource);
initConnectionPool(datasource, "edit");
} }
public void validate(Datasource datasource) throws Exception { public void validate(Datasource datasource) throws Exception {
...@@ -148,17 +164,7 @@ public class DatasourceService { ...@@ -148,17 +164,7 @@ public class DatasourceService {
List<Datasource> datasources = datasourceMapper.selectByExampleWithBLOBs(new DatasourceExample()); List<Datasource> datasources = datasourceMapper.selectByExampleWithBLOBs(new DatasourceExample());
datasources.forEach(datasource -> { datasources.forEach(datasource -> {
try { try {
commonThreadPool.addTask(() -> { initConnectionPool(datasource, "add");
try {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource);
datasourceProvider.initDataSource(datasourceRequest);
LogUtil.info("Succsss to init datasource connection pool: " + datasource.getName());
} catch (Exception e) {
LogUtil.error("Failed to init datasource connection pool: " + datasource.getName(), e);
}
});
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
......
package io.dataease.service.dataset; package io.dataease.service.dataset;
import io.dataease.base.domain.*; import io.dataease.base.domain.DatasetTable;
import io.dataease.base.domain.DatasetTableTask;
import io.dataease.base.domain.DatasetTableTaskExample;
import io.dataease.base.domain.DatasetTableTaskLog;
import io.dataease.base.mapper.DatasetTableTaskMapper; import io.dataease.base.mapper.DatasetTableTaskMapper;
import io.dataease.commons.constants.JobStatus; import io.dataease.commons.constants.JobStatus;
import io.dataease.commons.constants.ScheduleType; import io.dataease.commons.constants.ScheduleType;
import io.dataease.controller.request.dataset.DataSetTaskRequest; import io.dataease.controller.request.dataset.DataSetTaskRequest;
import io.dataease.i18n.Translator; import io.dataease.i18n.Translator;
import io.dataease.service.ScheduleService; import io.dataease.service.ScheduleService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.quartz.CronExpression; import org.quartz.CronExpression;
...@@ -44,25 +46,29 @@ public class DataSetTableTaskService { ...@@ -44,25 +46,29 @@ public class DataSetTableTaskService {
dataSetTableService.saveIncrementalConfig(dataSetTaskRequest.getDatasetTableIncrementalConfig()); dataSetTableService.saveIncrementalConfig(dataSetTaskRequest.getDatasetTableIncrementalConfig());
// check // check
if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(),"CRON")){
if (StringUtils.isNotEmpty(datasetTableTask.getCron())) { if (StringUtils.isNotEmpty(datasetTableTask.getCron())) {
if (!CronExpression.isValidExpression(datasetTableTask.getCron())) { if (!CronExpression.isValidExpression(datasetTableTask.getCron())) {
throw new RuntimeException(Translator.get("i18n_cron_expression_error")); throw new RuntimeException(Translator.get("i18n_cron_expression_error"));
} }
} }
// check start time and end time // check start time and end time
if (ObjectUtils.isNotEmpty(datasetTableTask.getStartTime()) if (StringUtils.equalsIgnoreCase(datasetTableTask.getEnd(), "1")
&& ObjectUtils.isNotEmpty(datasetTableTask.getStartTime())
&& ObjectUtils.isNotEmpty(datasetTableTask.getEndTime()) && ObjectUtils.isNotEmpty(datasetTableTask.getEndTime())
&& datasetTableTask.getStartTime() != 0 && datasetTableTask.getStartTime() != 0
&& datasetTableTask.getEndTime() != 0 && datasetTableTask.getEndTime() != 0
&& datasetTableTask.getStartTime() > datasetTableTask.getEndTime()) { && datasetTableTask.getStartTime() > datasetTableTask.getEndTime()) {
throw new RuntimeException(Translator.get("i18n_cron_time_error")); throw new RuntimeException(Translator.get("i18n_cron_time_error"));
} }
}
if (StringUtils.isEmpty(datasetTableTask.getId())) { if (StringUtils.isEmpty(datasetTableTask.getId())) {
datasetTableTask.setId(UUID.randomUUID().toString()); datasetTableTask.setId(UUID.randomUUID().toString());
datasetTableTask.setCreateTime(System.currentTimeMillis()); datasetTableTask.setCreateTime(System.currentTimeMillis());
// SIMPLE 类型,提前占位 // SIMPLE 类型,提前占位
if (datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())) { if (datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())) {
if(datasetTableTask.getType().equalsIgnoreCase("add_scope")){ if (datasetTableTask.getType().equalsIgnoreCase("add_scope")) {
DatasetTable datasetTable = dataSetTableService.get(datasetTableTask.getTableId()); DatasetTable datasetTable = dataSetTableService.get(datasetTableTask.getTableId());
if (datasetTable.getLastUpdateTime() == 0 || datasetTable.getLastUpdateTime() == null) { if (datasetTable.getLastUpdateTime() == 0 || datasetTable.getLastUpdateTime() == null) {
throw new Exception(Translator.get("i18n_not_exec_add_sync")); throw new Exception(Translator.get("i18n_not_exec_add_sync"));
...@@ -70,7 +76,7 @@ public class DataSetTableTaskService { ...@@ -70,7 +76,7 @@ public class DataSetTableTaskService {
} }
if (extractDataService.updateSyncStatusIsNone(dataSetTableService.get(datasetTableTask.getTableId()))) { if (extractDataService.updateSyncStatusIsNone(dataSetTableService.get(datasetTableTask.getTableId()))) {
throw new Exception(Translator.get("i18n_sync_job_exists")); throw new Exception(Translator.get("i18n_sync_job_exists"));
}else { } else {
//write log //write log
DatasetTableTaskLog datasetTableTaskLog = new DatasetTableTaskLog(); DatasetTableTaskLog datasetTableTaskLog = new DatasetTableTaskLog();
datasetTableTaskLog.setTableId(datasetTableTask.getTableId()); datasetTableTaskLog.setTableId(datasetTableTask.getTableId());
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -21,26 +21,26 @@ ...@@ -21,26 +21,26 @@
<!-- </el-button>--> <!-- </el-button>-->
<!-- </el-row>--> <!-- </el-row>-->
<!-- <el-row>--> <el-row>
<!-- <el-form>--> <el-form>
<!-- <el-form-item class="form-item">--> <el-form-item class="form-item">
<!-- <el-input--> <el-input
<!-- v-model="search"--> v-model="search"
<!-- size="mini"--> size="mini"
<!-- :placeholder="$t('chart.search')"--> :placeholder="$t('chart.search')"
<!-- prefix-icon="el-icon-search"--> prefix-icon="el-icon-search"
<!-- clearable--> clearable
<!-- />--> />
<!-- </el-form-item>--> </el-form-item>
<!-- </el-form>--> </el-form>
<!-- </el-row>--> </el-row>
<el-col class="custom-tree-container"> <el-col class="custom-tree-container">
<div class="block"> <div class="block">
<el-tree <el-tree
ref="asyncTree" ref="asyncTree"
:default-expanded-keys="expandedArray" :default-expanded-keys="expandedArray"
:data="data" :data="tData"
node-key="id" node-key="id"
:expand-on-click-node="true" :expand-on-click-node="true"
:load="loadNode" :load="loadNode"
...@@ -328,6 +328,7 @@ ...@@ -328,6 +328,7 @@
<script> <script>
import { post } from '@/api/chart/chart' import { post } from '@/api/chart/chart'
import { authModel } from '@/api/system/sysAuth'
import TableSelector from '../view/TableSelector' import TableSelector from '../view/TableSelector'
import GroupMoveSelector from '../components/TreeSelector/GroupMoveSelector' import GroupMoveSelector from '../components/TreeSelector/GroupMoveSelector'
import ChartMoveSelector from '../components/TreeSelector/ChartMoveSelector' import ChartMoveSelector from '../components/TreeSelector/ChartMoveSelector'
...@@ -360,7 +361,7 @@ export default { ...@@ -360,7 +361,7 @@ export default {
search: '', search: '',
editGroup: false, editGroup: false,
editTable: false, editTable: false,
data: [], tData: [],
chartData: [], chartData: [],
currGroup: {}, currGroup: {},
expandedArray: [], expandedArray: [],
...@@ -395,7 +396,9 @@ export default { ...@@ -395,7 +396,9 @@ export default {
treeProps: { treeProps: {
label: 'name', label: 'name',
children: 'children', children: 'children',
isLeaf: 'isLeaf' isLeaf: 'isLeaf',
id: 'id',
parentId: 'pid'
}, },
dsForm: { dsForm: {
name: '', name: '',
...@@ -411,7 +414,8 @@ export default { ...@@ -411,7 +414,8 @@ export default {
tDs: {}, tDs: {},
groupMoveConfirmDisabled: true, groupMoveConfirmDisabled: true,
dsMoveConfirmDisabled: true, dsMoveConfirmDisabled: true,
moveDialogTitle: '' moveDialogTitle: '',
isTreeSearch: false
} }
}, },
computed: { computed: {
...@@ -422,11 +426,20 @@ export default { ...@@ -422,11 +426,20 @@ export default {
}, },
watch: { watch: {
search(val) { search(val) {
if (val && val !== '') { // if (val && val !== '') {
this.chartData = JSON.parse(JSON.stringify(this.tables.filter(ele => { return ele.name.includes(val) }))) // this.chartData = JSON.parse(JSON.stringify(this.tables.filter(ele => { return ele.name.includes(val) })))
} else { // } else {
this.chartData = JSON.parse(JSON.stringify(this.tables)) // this.chartData = JSON.parse(JSON.stringify(this.tables))
// }
this.$emit('switchComponent', { name: '' })
this.tData = []
this.expandedArray = []
if (this.timer) {
clearTimeout(this.timer)
} }
this.timer = setTimeout(() => {
this.getTreeData(val)
}, 500)
}, },
saveStatus() { saveStatus() {
this.refreshNodeBy(this.saveStatus.sceneId) this.refreshNodeBy(this.saveStatus.sceneId)
...@@ -617,13 +630,13 @@ export default { ...@@ -617,13 +630,13 @@ export default {
groupTree(group) { groupTree(group) {
post('/chart/group/tree', group).then(response => { post('/chart/group/tree', group).then(response => {
this.data = response.data this.tData = response.data
}) })
}, },
treeNode(group) { treeNode(group) {
post('/chart/group/treeNode', group).then(res => { post('/chart/group/treeNode', group).then(res => {
this.data = res.data this.tData = res.data
}) })
}, },
...@@ -778,7 +791,7 @@ export default { ...@@ -778,7 +791,7 @@ export default {
}, },
loadNode(node, resolve) { loadNode(node, resolve) {
// if (!this.isTreeSearch) { if (!this.isTreeSearch) {
if (node.level > 0) { if (node.level > 0) {
this.tables = [] this.tables = []
this.chartData = [] this.chartData = []
...@@ -793,10 +806,17 @@ export default { ...@@ -793,10 +806,17 @@ export default {
}) })
} }
} }
// } } else {
resolve(node.data.children)
}
}, },
refreshNodeBy(id) { refreshNodeBy(id) {
if (this.isTreeSearch) {
this.tData = []
this.expandedArray = []
this.searchTree(this.search)
} else {
if (!id || id === '0') { if (!id || id === '0') {
this.treeNode(this.groupForm) this.treeNode(this.groupForm)
} else { } else {
...@@ -804,6 +824,7 @@ export default { ...@@ -804,6 +824,7 @@ export default {
node.loaded = false node.loaded = false
node.expand() // 主动调用展开节点方法,重新查询该节点下的所有子节点 node.expand() // 主动调用展开节点方法,重新查询该节点下的所有子节点
} }
}
}, },
moveTo(data) { moveTo(data) {
...@@ -867,6 +888,68 @@ export default { ...@@ -867,6 +888,68 @@ export default {
} else { } else {
this.dsMoveConfirmDisabled = false this.dsMoveConfirmDisabled = false
} }
},
searchTree(val) {
const queryCondition = {
withExtend: 'parent',
modelType: 'chart',
name: val
}
authModel(queryCondition).then(res => {
// this.highlights(res.data)
this.tData = this.buildTree(res.data)
console.log(this.tData)
})
},
buildTree(arrs) {
const idMapping = arrs.reduce((acc, el, i) => {
acc[el[this.treeProps.id]] = i
return acc
}, {})
const roots = []
arrs.forEach(el => {
// 判断根节点 ###
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
}
// 用映射表找到父元素
const parentEl = arrs[idMapping[el[this.treeProps.parentId]]]
// 把当前元素添加到父元素的`children`数组中
parentEl.children = [...(parentEl.children || []), el]
// 设置展开节点 如果没有子节点则不进行展开
if (parentEl.children.length > 0) {
this.expandedArray.push(parentEl[this.treeProps.id])
}
})
return roots
},
// 高亮显示搜索内容
highlights(data) {
if (data && this.search && this.search.length > 0) {
const replaceReg = new RegExp(this.search, 'g')// 匹配关键字正则
const replaceString = '<span style="color: #0a7be0">' + this.search + '</span>' // 高亮替换v-html值
data.forEach(item => {
item.name = item.name.replace(replaceReg, replaceString) // 开始替换
item.label = item.label.replace(replaceReg, replaceString) // 开始替换
})
}
},
getTreeData(val) {
if (val) {
this.isTreeSearch = true
this.searchTree(val)
} else {
this.isTreeSearch = false
this.treeNode(this.groupForm)
}
} }
} }
} }
......
...@@ -21,19 +21,19 @@ ...@@ -21,19 +21,19 @@
<!-- </el-button>--> <!-- </el-button>-->
<!-- </el-row>--> <!-- </el-row>-->
<!-- <el-row>--> <el-row>
<!-- <el-form>--> <el-form>
<!-- <el-form-item class="form-item">--> <el-form-item class="form-item">
<!-- <el-input--> <el-input
<!-- v-model="search"--> v-model="search"
<!-- size="mini"--> size="mini"
<!-- :placeholder="$t('dataset.search')"--> :placeholder="$t('dataset.search')"
<!-- prefix-icon="el-icon-search"--> prefix-icon="el-icon-search"
<!-- clearable--> clearable
<!-- />--> />
<!-- </el-form-item>--> </el-form-item>
<!-- </el-form>--> </el-form>
<!-- </el-row>--> </el-row>
<el-col class="custom-tree-container"> <el-col class="custom-tree-container">
<div class="block"> <div class="block">
...@@ -435,17 +435,14 @@ export default { ...@@ -435,17 +435,14 @@ export default {
// } else { // } else {
// this.tableData = JSON.parse(JSON.stringify(this.tables)) // this.tableData = JSON.parse(JSON.stringify(this.tables))
// } // }
this.$emit('switchComponent', { name: '' })
this.tData = []
this.expandedArray = []
if (this.timer) { if (this.timer) {
clearTimeout(this.timer) clearTimeout(this.timer)
} }
this.timer = setTimeout(() => { this.timer = setTimeout(() => {
if (val) { this.getTreeData(val)
this.searchTree(val)
this.isTreeSearch = true
} else {
this.treeNode(this.groupForm)
this.isTreeSearch = false
}
}, 500) }, 500)
}, },
saveStatus() { saveStatus() {
...@@ -830,10 +827,17 @@ export default { ...@@ -830,10 +827,17 @@ export default {
}) })
} }
} }
} else {
resolve(node.data.children)
} }
}, },
refreshNodeBy(id) { refreshNodeBy(id) {
if (this.isTreeSearch) {
this.tData = []
this.expandedArray = []
this.searchTree(this.search)
} else {
if (!id || id === '0') { if (!id || id === '0') {
this.treeNode(this.groupForm) this.treeNode(this.groupForm)
} else { } else {
...@@ -841,6 +845,7 @@ export default { ...@@ -841,6 +845,7 @@ export default {
node.loaded = false node.loaded = false
node.expand() // 主动调用展开节点方法,重新查询该节点下的所有子节点 node.expand() // 主动调用展开节点方法,重新查询该节点下的所有子节点
} }
}
}, },
searchTree(val) { searchTree(val) {
...@@ -850,7 +855,9 @@ export default { ...@@ -850,7 +855,9 @@ export default {
name: val name: val
} }
authModel(queryCondition).then(res => { authModel(queryCondition).then(res => {
// this.highlights(res.data)
this.tData = this.buildTree(res.data) this.tData = this.buildTree(res.data)
console.log(this.tData)
}) })
}, },
...@@ -862,6 +869,8 @@ export default { ...@@ -862,6 +869,8 @@ export default {
const roots = [] const roots = []
arrs.forEach(el => { arrs.forEach(el => {
// 判断根节点 ### // 判断根节点 ###
el.type = el.modelInnerType
el.isLeaf = el.leaf
if (el[this.treeProps.parentId] === null || el[this.treeProps.parentId] === 0 || el[this.treeProps.parentId] === '0') { if (el[this.treeProps.parentId] === null || el[this.treeProps.parentId] === 0 || el[this.treeProps.parentId] === '0') {
roots.push(el) roots.push(el)
return return
...@@ -877,6 +886,28 @@ export default { ...@@ -877,6 +886,28 @@ export default {
} }
}) })
return roots return roots
},
// 高亮显示搜索内容
highlights(data) {
if (data && this.search && this.search.length > 0) {
const replaceReg = new RegExp(this.search, 'g')// 匹配关键字正则
const replaceString = '<span style="color: #0a7be0">' + this.search + '</span>' // 高亮替换v-html值
data.forEach(item => {
item.name = item.name.replace(replaceReg, replaceString) // 开始替换
item.label = item.label.replace(replaceReg, replaceString) // 开始替换
})
}
},
getTreeData(val) {
if (val) {
this.isTreeSearch = true
this.searchTree(val)
} else {
this.isTreeSearch = false
this.treeNode(this.groupForm)
}
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论