Commit 2d6d34d3 by ningjihai

项目管理

parent 922f75be
...@@ -137,12 +137,12 @@ ...@@ -137,12 +137,12 @@
<div class="schema-header"> <div class="schema-header">
<div class="section-title">SCHEMA</div> <div class="section-title">SCHEMA</div>
<div class="schema-select-all"> <div class="schema-select-all">
<el-checkbox <!-- <el-checkbox
v-model="selectAllSchemas" v-model="selectAllSchemas"
@change="handleSelectAllSchemas" @change="handleSelectAllSchemas"
> >
全选 全选
</el-checkbox> </el-checkbox> -->
<span class="schema-count">{{ selectedSchemas.length }}/{{ allSchemasCompute.length }}</span> <span class="schema-count">{{ selectedSchemas.length }}/{{ allSchemasCompute.length }}</span>
</div> </div>
</div> </div>
...@@ -185,7 +185,7 @@ ...@@ -185,7 +185,7 @@
</div> </div>
<el-scrollbar height="150px"> <el-scrollbar height="150px">
<el-checkbox-group v-model="selectedDomains"> <el-checkbox-group v-model="selectedDomains" @change="handlechangeSelectDomains">
<div <div
v-for="domain in group.list" v-for="domain in group.list"
:key="domain.id" :key="domain.id"
...@@ -303,37 +303,31 @@ const dialogVisible = computed({ ...@@ -303,37 +303,31 @@ const dialogVisible = computed({
// 初始化标志 // 初始化标志
const initialized = ref(false) const initialized = ref(false)
// 监听对话框显示状态变化 // 监听对话框显示状态变化
watch(dialogVisible, (newVal) => { watch(dialogVisible, (newVal) => {
if (newVal && !initialized.value) { if (newVal && !initialized.value) {
// 对话框打开且未初始化时执行
console.log('初始化对话框数据')
initDialog() initDialog()
} else if (!newVal) { } else if (!newVal) {
console.log('重置对话框数据')
// 对话框关闭时重置初始化标志
initialized.value = false initialized.value = false
} }
}, { deep: true }) }, { deep: true })
// 当对话框显示时执行的函数 // 当对话框显示时执行的函数
const initDialog = () => { const initDialog = () => {
console.log('对话框已打开,执行初始化操作')
querySelectOrDic() querySelectOrDic()
initialized.value = true initialized.value = true
} }
const querySelectOrDic = () => { const querySelectOrDic = () => {
selectProDataSource({ selectProDataSource({
systemstyle: 1 systemstyle: 1
}).then(res=>{ }).then(res => {
console.log('selectProDataSourceRes',res) sourceTypeList.value = res.data
sourceTypeList.value = res.data dbFilter.value.type = res.data.length > 0 ? res.data[res.data.length - 1].text : ''
dbFilter.value.type = res.data.length > 0 ? res.data[res.data.length - 1].text : '' })
})
} }
const reset = () => { const reset = () => {
sourceTypeList.value = [] sourceTypeList.value = []
formData.value = {} formData.value = {}
...@@ -342,7 +336,6 @@ const reset = () => { ...@@ -342,7 +336,6 @@ const reset = () => {
dbFilter.value.keyword = '' dbFilter.value.keyword = ''
allDatabases.value = [] allDatabases.value = []
selectedDbs.value = [] selectedDbs.value = []
} }
const sourceTypeList = ref([]) const sourceTypeList = ref([])
...@@ -377,67 +370,23 @@ const dbFilter = ref({ ...@@ -377,67 +370,23 @@ const dbFilter = ref({
keyword: '' keyword: ''
}) })
const allDatabases = ref([ const allDatabases = ref([])
// { id: 1, name: '若依配测系统', ip: '172.19.1.166', username: 'root', type: 'mysql' },
// { id: 2, name: '测试数据库1', ip: '192.168.1.100', username: 'admin', type: 'mysql' },
// { id: 3, name: '生产数据库', ip: '10.0.0.1', username: 'dba', type: 'oracle' },
// { id: 4, name: '开发数据库', ip: '172.16.1.50', username: 'dev', type: 'mysql' },
// { id: 5, name: '备份数据库', ip: '172.16.1.51', username: 'backup', type: 'sqlserver' }
])
const selectedDbs = ref([]) const selectedDbs = ref([])
const selectAll = ref(false) const selectAll = ref(false)
// 第三步:Schema选择相关 // 第三步:Schema选择相关
const selectedDataSource = ref(null) const selectedDataSource = ref(null)
const allSchemas = ref([ const allSchemas = ref([])
// 'information_schema',
// 'mysql',
// 'performance_schema',
// 'ry',
// 'sys'
])
const selectedSchemas = ref([]) const selectedSchemas = ref([])
const selectAllSchemas = ref(false) const selectAllSchemas = ref(false)
// 第四步:数据域选择相关 // 第四步:数据域选择相关
const domainGroups = ref([ const domainGroups = ref([])
// {
// name: '混合数据域',
// selectedAll: false,
// domains: [
// { id: 'domain1', name: '566546', desc: '' },
// { id: 'domain2', name: '通用规则', desc: '' },
// { id: 'domain3', name: '解密数据', desc: '' },
// { id: 'domain4', name: '混合证件号', desc: '按混合证件号字段查询' }
// ]
// },
// {
// name: '智能数据域',
// selectedAll: false,
// domains: [
// { id: 'domain5', name: '智能推荐', desc: '' },
// { id: 'domain6', name: '电子邮件', desc: '按邮箱字段查找' },
// { id: 'domain7', name: '社保卡号', desc: '' }
// ]
// },
// {
// name: '测试数据域',
// selectedAll: false,
// domains: [
// { id: 'domain8', name: '发现规则1', desc: '' },
// { id: 'domain9', name: '营业执照', desc: '按营业执照字段查询' },
// { id: 'domain10', name: '邮政编码', desc: '邮政编码字段查找' }
// ]
// }
])
const selectedDomains = ref([]) const selectedDomains = ref([])
// 计算属性 // 计算属性
const filteredDatabases = computed(() => { const filteredDatabases = computed(() => {
return allDatabases.value.filter(db => { return allDatabases.value.filter(db => {
// const typeMatch = db.type === dbFilter.value.type
const keywordMatch = db.sysname.includes(dbFilter.value.keyword) const keywordMatch = db.sysname.includes(dbFilter.value.keyword)
return keywordMatch return keywordMatch
}) })
...@@ -454,7 +403,6 @@ const selectedDomainDetails = computed(() => { ...@@ -454,7 +403,6 @@ const selectedDomainDetails = computed(() => {
// 方法 // 方法
const handleSelectAll = (val) => { const handleSelectAll = (val) => {
console.log('selectedDbs',selectedDbs)
if (val) { if (val) {
selectedDbs.value = filteredDatabases.value.map(db => db.tid) selectedDbs.value = filteredDatabases.value.map(db => db.tid)
} else { } else {
...@@ -466,67 +414,38 @@ const handleClearSelected = () => { ...@@ -466,67 +414,38 @@ const handleClearSelected = () => {
selectedDbs.value = [] selectedDbs.value = []
selectAll.value = false selectAll.value = false
} }
const allSchemasCompute = computed(() => { const allSchemasCompute = computed(() => {
return allSchemas.value[allSchemasIndex.value] return allSchemas.value[allSchemasIndex.value]
}) })
const allSchemasIndex = ref(0) const allSchemasIndex = ref(0)
const selectDataSource = (dbId,index) => { const selectDataSource = (dbId, index) => {
selectedDataSource.value = dbId selectedDataSource.value = dbId
allSchemasIndex.value = index allSchemasIndex.value = index
console.log('allSchemasCompute.value',allSchemasCompute.value)
selectedSchemas.value = [] selectedSchemas.value = []
console.log('已经选择的表',schemalist.value)
allSchemasCompute.value.forEach(element => { allSchemasCompute.value.forEach(element => {
if(schemalist.value.find(item => item.schemaname === element.value && (item.osdsid ==selectedDbDetails.value[allSchemasIndex.value].tid))){ if(schemalist.value.find(item => item.schemaname === element.value && (item.osdsid == selectedDbDetails.value[allSchemasIndex.value].tid))){
selectedSchemas.value.push(element.value) selectedSchemas.value.push(element.value)
} }
})
});
}
const handleSelectAllSchemas = (val) => {
console.log('selectedSchemas.value',selectedSchemas.value)
// return
if (val) {
let list = []
allSchemasCompute.value.forEach(element => {
list.push(element.value)
});
selectedSchemas.value = list
} else {
selectedSchemas.value = []
}
} }
const schemalist = ref([]) const schemalist = ref([])
const schemaChange = () =>{ const schemaChange = () => {
console.log('allSchemasIndex.value',allSchemasIndex.value)
console.log('selectedSchemas.value ',selectedSchemas.value)
console.log('selectedDbDetails.value',selectedDbDetails.value)
// schemalist.value = []
selectedSchemas.value.forEach(element => { selectedSchemas.value.forEach(element => {
console.log('element',element)
let data = { let data = {
schemaname: element, schemaname: element,
dbtype:selectedDbDetails.value[allSchemasIndex.value].dbtype, dbtype: selectedDbDetails.value[allSchemasIndex.value].dbtype,
osdsid:selectedDbDetails.value[allSchemasIndex.value].tid, osdsid: selectedDbDetails.value[allSchemasIndex.value].tid,
} }
schemalist.value.push(data) schemalist.value.push(data)
}); })
} }
const toggleGroupSelection = (group, selected) => { const toggleGroupSelection = (group, selected) => {
const groupDomainIds = group.list.map(d => d.id) const groupDomainIds = group.list.map(d => d.id)
...@@ -561,37 +480,31 @@ const loginUser = { ...@@ -561,37 +480,31 @@ const loginUser = {
const handleNextStep = async () => { const handleNextStep = async () => {
if (activeStep.value === 1) { if (activeStep.value === 1) {
try { try {
// 调用第一步的验证接口
const response = await validateStep1() const response = await validateStep1()
if (response.flag === true) { if (response.flag === true) {
checkDatasystem().then(res=>{ checkDatasystem().then(res => {
if (res.flag === true){ if (res.flag === true) {
activeStep.value++ activeStep.value++
if(activeStep.value === 2) {
if(activeStep.value === 2){
queryByEditSort({ queryByEditSort({
projectId: formData.value.id || '', projectId: formData.value.id || '',
dbtype: dbFilter.value.type, dbtype: dbFilter.value.type,
loginUser:loginUser, loginUser: loginUser,
flag:1 flag: 1
}).then(res=>{ }).then(res => {
allDatabases.value = res.data allDatabases.value = res.data
}) })
} }
}else{ } else {
ElMessage.error(res.msg) ElMessage.error(res.msg)
} }
}).catch(err=>{ }).catch(err => {
ElMessage.error(err.msg) ElMessage.error(err.msg)
}) })
} else { } else {
// 验证失败,显示错误信息
ElMessage.error(response.msg || '第一步验证失败') ElMessage.error(response.msg || '第一步验证失败')
return // 停止继续执行 return
} }
} catch (error) { } catch (error) {
console.error('第一步验证接口调用失败:', error) console.error('第一步验证接口调用失败:', error)
...@@ -599,68 +512,41 @@ const handleNextStep = async () => { ...@@ -599,68 +512,41 @@ const handleNextStep = async () => {
return return
} }
} else if (activeStep.value < 4) { } else if (activeStep.value < 4) {
if(activeStep.value === 3) {
// selectedDbDetails
}
// 其他步骤直接前进
activeStep.value++ activeStep.value++
if (activeStep.value === 4) {
// 在第四步加载数据域和规则
getAllDataAreaAndRule().then(res=>{ getAllDataAreaAndRule().then(res => {
console.log(res) domainGroups.value = res.data
domainGroups.value = res.data // 如果是编辑模式,需要处理已选择的规则
}) if (props.mode === 'edit' && formData.value.id) {
processAreaAndRuleListForEdit()
}
})
}
} else { } else {
console.log('selectedDomainDetails',selectedDomainDetails.value)
// 最后一步提交数据 // 最后一步提交数据
formData.value.databases = selectedDbDetails.value formData.value.databases = selectedDbDetails.value
formData.value.schemas = schemalist.value formData.value.schemas = schemalist.value
formData.value.domains = selectedDomainDetails.value.map(item=>(({ formData.value.domains = selectedDomainDetails.value.map(item => ({
dataarea_id:item.dataarea_id, dataarea_id: item.dataarea_id,
rule_id:item.id rule_id: item.id
}))) }))
emit('submit', formData.value) emit('submit', formData.value)
setTimeout(() => { setTimeout(() => {
reset() reset()
dialogVisible.value = false dialogVisible.value = false
}, 300); }, 300)
} }
} }
// 第一步验证接口函数 // 第一步验证接口函数
const validateStep1 = async () => { const validateStep1 = async () => {
// 这里调用实际的API接口
// 示例:return await api.validateStep1(formData)
return await checkDatasystemName({ return await checkDatasystemName({
name: formData.value.name, name: formData.value.name,
id: formData.value.id id: formData.value.id
}) })
// 模拟API调用
// return new Promise((resolve) => {
// setTimeout(() => {
// // 模拟成功响应
// resolve({
// flag: true,
// msg: '验证成功'
// })
// // 模拟失败响应
// // resolve({
// // flag: false,
// // msg: '数据库连接失败,请检查连接信息'
// // })
// }, 1000)
// })
}
// 取消
const handleCancel = () => {
dialogVisible.value = false
} }
// 关闭前处理 // 关闭前处理
...@@ -681,48 +567,32 @@ watch(selectedDbs, (newVal) => { ...@@ -681,48 +567,32 @@ watch(selectedDbs, (newVal) => {
selectAll.value = newVal.length > 0 && newVal.length === allDatabases.value.length selectAll.value = newVal.length > 0 && newVal.length === allDatabases.value.length
}) })
watch(selectedDomains, (newVal) => { watch(selectedDomains, (newVal) => {
if(domainGroups.value.length>0){ if(domainGroups.value.length > 0) {
console.log('domainGroups',domainGroups.value) domainGroups.value.forEach(group => {
domainGroups.value.forEach(group => { const groupDomainIds = group.list.map(d => d.id)
const groupDomainIds = group.list.map(d => d.id) group.selectedAll = groupDomainIds.every(id => newVal.includes(id))
group.selectedAll = groupDomainIds.every(id => newVal.includes(id)) })
})
} }
}, { deep: true }) }, { deep: true })
// 初始化时自动选择第一个数据源 // 初始化时自动选择第一个数据源
watch(selectedDbDetails,async (newVal,oldVal) => { watch(selectedDbDetails, async (newVal, oldVal) => {
if(newVal.length > 0) {
if(newVal.length > 0){ if(JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
await fetchAllSchemas(newVal)
if(JSON.stringify(newVal) !== JSON.stringify(oldVal)){
await fetchAllSchemas(newVal)
} }
if(!selectedDataSource.value) {
if(!selectedDataSource.value){
selectedDataSource.value = newVal[0].tid selectedDataSource.value = newVal[0].tid
} }
} }
}, { immediate: true }) }, { immediate: true })
const fetchAllSchemas = async (databases) => { const fetchAllSchemas = async (databases) => {
try { try {
// 清空之前的数据
allSchemas.value = [] allSchemas.value = []
// 使用Promise.all保证顺序但并行请求(如需严格顺序请使用for循环)
const results = await Promise.all( const results = await Promise.all(
databases.map(db => databases.map(db =>
queryShemas({ queryShemas({
...@@ -739,159 +609,127 @@ const fetchAllSchemas = async (databases) => { ...@@ -739,159 +609,127 @@ const fetchAllSchemas = async (databases) => {
) )
) )
// 处理结果
const successResults = results.filter(r => !r.error) const successResults = results.filter(r => !r.error)
const errorResults = results.filter(r => r.error)
// 合并成功的数据
successResults.forEach(res => { successResults.forEach(res => {
if (res.data && Array.isArray(res.data)) { if (res.data && Array.isArray(res.data)) {
allSchemas.value.push(res.data) allSchemas.value.push(res.data)
} }
}) })
// 显示结果信息 console.log('allSchemas', allSchemas.value)
if (successResults.length > 0) {
console.log(`成功获取 ${successResults.length} 个数据库的Schema数据`)
}
if (errorResults.length > 0) {
console.log(`${errorResults.length} 个数据库的Schema获取失败`)
}
console.log('allSchemas',allSchemas.value)
} catch (error) { } catch (error) {
console.error('获取Schema数据过程中出错:', error) console.error('获取Schema数据过程中出错:', error)
ElMessage.error('获取Schema数据过程中出错') ElMessage.error('获取Schema数据过程中出错')
} finally {
// isLoading.value = false
} }
} }
// 处理数据域和规则数据(编辑模式专用)
// 处理数据域和规则数据 const processAreaAndRuleListForEdit = () => {
const processAreaAndRuleList = (areaAndRuleList) => { // 这里需要根据实际情况获取项目详情中的 areaAndRuleList
// 假设我们已经有了 areaAndRuleList 数据
const areaAndRuleList = [
{
"id": "2c9381a198cab6e40198e05cba5803bc",
"dataarea_id": "40287481777f245501777f27e6fe0000",
"rule_id": "402874817780b607017780b823be0004"
}
]
if (!areaAndRuleList || !Array.isArray(areaAndRuleList)) { if (!areaAndRuleList || !Array.isArray(areaAndRuleList)) {
console.warn('areaAndRuleList为空或不是数组', areaAndRuleList) console.warn('areaAndRuleList为空或不是数组')
selectedDomains.value = [] // 确保设置为空数组而不是null或undefined selectedDomains.value = []
return return
} }
// 获取所有数据域分组信息 console.log('接口返回的areaAndRuleList:', areaAndRuleList)
getAllDataAreaAndRule().then(res => {
if (!res.data || !Array.isArray(res.data)) { // 处理已选择的规则
console.error('获取的数据域分组无效', res.data) const selectedRuleIds = []
return
} // 遍历所有数据域分组和规则,找到匹配的规则
domainGroups.value.forEach(group => {
console.log('所有数据域分组:', res.data) group.list.forEach(rule => {
console.log('接口返回的areaAndRuleList:', areaAndRuleList) // 检查这个规则是否在已选择的列表中
const isSelected = areaAndRuleList.some(item =>
// 处理已选择的数据域 item && item.dataarea_id === group.dataarea_id && item.rule_id === rule.id
const selectedDomainIds = [] )
// 将接口返回的数据映射到 domainGroups
domainGroups.value = res.data.map(group => {
// 处理组内的每个规则
const processedList = (group.list || []).map(domain => {
// 检查这个规则是否在已选择的列表中
const isSelected = areaAndRuleList.some(item =>
item && item.dataarea_id === group.dataarea_id && item.rule_id === domain.id
)
if (isSelected && domain.id) {
selectedDomainIds.push(domain.id)
}
return {
...domain,
dataarea_id: group.dataarea_id // 添加数据域ID引用
}
})
// 检查是否全选
const groupDomainIds = processedList.map(d => d.id).filter(Boolean)
const selectedInGroup = selectedDomainIds.filter(id => groupDomainIds.includes(id))
group.selectedAll = selectedInGroup.length === groupDomainIds.length && groupDomainIds.length > 0
return { if (isSelected && rule.id) {
...group, selectedRuleIds.push(rule.id)
list: processedList
} }
}) })
// 设置已选择的数据域 // 检查是否全选
selectedDomains.value = selectedDomainIds.filter(Boolean) // 过滤掉可能的空值 const groupRuleIds = group.list.map(rule => rule.id).filter(Boolean)
console.log('已选择的数据域ID:', selectedDomains.value) const selectedInGroup = selectedRuleIds.filter(id => groupRuleIds.includes(id))
group.selectedAll = selectedInGroup.length === groupRuleIds.length && groupRuleIds.length > 0
// 如果没有选择任何数据域,显示警告
if (selectedDomains.value.length === 0) {
console.warn('没有找到任何已选择的数据域,请检查数据映射逻辑')
}
}).catch(error => {
console.error('获取数据域分组失败:', error)
ElMessage.error('获取数据域分组失败')
}) })
// 设置已选择的规则
selectedDomains.value = selectedRuleIds.filter(Boolean)
console.log('已选择的规则ID:', selectedDomains.value)
if (selectedDomains.value.length === 0) {
console.warn('没有找到任何已选择的规则')
}
} }
// 处理Schema数据 // 处理Schema数据
const processSchemaList = (schemaList) => { const processSchemaList = (schemaList) => {
if (!schemaList || !Array.isArray(schemaList)) return if (!schemaList || !Array.isArray(schemaList)) return
// 获取所有数据源的Schema信息
fetchAllSchemas(selectedDbDetails.value).then(() => { fetchAllSchemas(selectedDbDetails.value).then(() => {
// 设置已选择的Schema
selectedSchemas.value = schemaList.map(item => item.schemaname) selectedSchemas.value = schemaList.map(item => item.schemaname)
// 构建schemalist用于表单提交
schemalist.value = schemaList.map(item => ({ schemalist.value = schemaList.map(item => ({
schemaname: item.schemaname, schemaname: item.schemaname,
dbtype: item.dbtype, dbtype: item.dbtype,
osdsid: item.osdsid osdsid: item.osdsid
})) }))
console.log('已选择的Schema:', selectedSchemas.value)
console.log('用于提交的schemalist:', schemalist.value)
}) })
} }
const handlechangeSelectDomains = (val)=>{
console.log('selectedDomains.value',selectedDomains.value)
}
// 监听传入的项目数据变化 // 监听传入的项目数据变化
watch(() => props.projectData, (newVal) => { watch(() => props.projectData, (newVal) => {
if (props.mode === 'edit') { if (props.mode === 'edit') {
formData.value = { ...newVal } formData.value = { ...newVal }
getDataProjectDetail({projectId:newVal.id}).then(res => { getDataProjectDetail({projectId: newVal.id}).then(res => {
if(res.flag) {
if(res.flag){ let data = res.data
let data = res.data if(!data) return
if(!data) return
formData.value.name = data.project.project
formData.value.name = data.project.project formData.value.remark = data.project.note
formData.value.remark = data.project.note selectedDbs.value = data.dataSourceIdList.map(item => item.systemsource_id)
selectedDbs.value = data.dataSourceIdList.map(item => item.systemsource_id) selectedDomains.value = data.areaAndRuleList.map(item=> item.rule_id)
// selectedSchemas.value = data.schemalist.map(item =>item.schemaname) console.log('selectedDomains.value',selectedDomains.value)
// selectedDomains.value = data.areaAndRuleList.map(item =>item.id) // 处理Schema数据
// console.log('selectedSchemas',selectedSchemas.value) // processSchemaList(data.schemalist)
// 处理Schema数据
processSchemaList(data.schemalist) // 处理数据域和规则数据 - 关键修复
// let list = data.areaAndRuleList if (data.areaAndRuleList && data.areaAndRuleList.length > 0) {
processAreaAndRuleList(data.areaAndRuleList) // 保存areaAndRuleList供后续使用
}else{
ElMessage.error(res.msg)
} // 在第四步加载时处理规则选择
if (activeStep.value === 4) {
}).catch(err =>{ // processAreaAndRuleListForEdit()
ElMessage.error(res.msg) formData.value.areaAndRuleList = data.areaAndRuleList
}) }
}
// 初始化选中状态 } else {
// selectedDbs.value = newVal.databases.map(db => db.id) ElMessage.error(res.msg)
// selectedSchemas.value = [...newVal.schemas] }
// selectedDomains.value = newVal.domains.map(domain => domain.id) }).catch(err => {
ElMessage.error(err.msg)
})
} }
}, { immediate: true, deep: true }) }, { immediate: true, deep: true })
</script> </script>
<style scoped> <style scoped>
.dialog-content { .dialog-content {
display: flex; display: flex;
......
...@@ -344,7 +344,7 @@ const handleSubmit = (formData) => { ...@@ -344,7 +344,7 @@ const handleSubmit = (formData) => {
loginUser:loginUser, loginUser:loginUser,
project:{ project:{
createtime:currentProject.value.createtime, createtime:currentProject.value.createTime,
createuser:currentProject.value.createuser, createuser:currentProject.value.createuser,
edition_id: '', edition_id: '',
note: formData.remark, note: formData.remark,
...@@ -368,7 +368,7 @@ const handleSubmit = (formData) => { ...@@ -368,7 +368,7 @@ const handleSubmit = (formData) => {
updateDataProject(newProject).then(res=>{ updateDataProject(newProject).then(res=>{
console.log(res) console.log(res)
if(res.flag){ if(res.flag){
ElMessage.success('新增项目成功') ElMessage.success('编辑项目成功')
handleQuery() handleQuery()
} }
}) })
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论