Commit 2d6d34d3 by ningjihai

项目管理

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