Commit 8841058d by ningjihai

1234

parent 5aad29d1
......@@ -67,4 +67,43 @@ export function queryShemas(data) {
})
}
export function getAllDataAreaAndRule(data) {
return request({
url: '/core/tdataarea/getAllDataAreaAndRule',
method: 'post',
data: data
})
}
export function addDataProject(data) {
return request({
url: '/core/tdataproject/addDataProject',
method: 'post',
data: data
})
}
export function deleteDataProject(data) {
return request({
url: '/core/tdataproject/deleteDataProject',
method: 'post',
data: data
})
}
export function getDataProjectDetail(data) {
return request({
url: '/core/tdataproject/getDataProjectDetail',
method: 'post',
data: data
})
}
export function updateDataProject(data) {
return request({
url: '/core/tdataproject/updateDataProject',
method: 'post',
data: data
})
}
import router from './router'
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import NProgress, { settings } from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isHttp, isPathMatch } from '@/utils/validate'
......@@ -17,55 +17,63 @@ const isWhiteList = (path) => {
return whiteList.some(pattern => isPathMatch(pattern, path))
}
router.beforeEach((to, from, next) => {
router.beforeEach(async (to, from, next) => {
NProgress.start()
// if (getToken()) {
// to.meta.title && useSettingsStore().setTitle(to.meta.title)
// /* has token*/
// if (to.path === '/login') {
// next({ path: '/' })
// NProgress.done()
// } else if (isWhiteList(to.path)) {
// next()
// } else {
// if (useUserStore().roles.length === 0) {
// isRelogin.show = true
// // 判断当前用户是否已拉取完user_info信息
// useUserStore().getInfo().then(() => {
// isRelogin.show = false
// usePermissionStore().generateRoutes().then(accessRoutes => {
// // 根据roles权限生成可访问的路由表
// accessRoutes.forEach(route => {
// if (!isHttp(route.path)) {
// router.addRoute(route) // 动态添加可访问路由表
// }
// })
// next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
// })
// }).catch(err => {
// useUserStore().logOut().then(() => {
// ElMessage.error(err)
// next({ path: '/' })
// })
// })
// } else {
// next()
// }
// }
// } else {
// // 没有token
// if (isWhiteList(to.path)) {
// // 在免登录白名单,直接进入
// next()
// } else {
// next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
// NProgress.done()
// }
// }
// 获取permissionStore实例
const permissionStore = usePermissionStore()
if (sessionStorage.getItem('__token') || isWhiteList(to.path)) {
next()
console.log('next1')
try {
// 检查是否已经有路由数据,避免重复设置
if (!permissionStore.sidebarRouters || permissionStore.sidebarRouters.length === 0) {
console.log('next2')
// 从sessionStorage获取数据
const allnavListStr = sessionStorage.getItem('allnavList')
const navStatusStr = sessionStorage.getItem('navStatus')
if (allnavListStr && navStatusStr) {
console.log('next3')
try {
const allnavList = JSON.parse(allnavListStr)
const navStatus = JSON.parse(navStatusStr)
console.log('allnavList' , allnavList)
console.log('navStatus' , navStatus)
// 根据navStatus.type过滤菜单
let filterMenus = []
if (navStatus && navStatus.type) {
let type = navStatus.type === 'manage' ? '1' : '2'
filterMenus = allnavList.filter(item => item.type === type)
console.log('filterMenus' , filterMenus)
} else {
// 默认处理,如果没有type则使用全部菜单
filterMenus = allnavList
}
// 存入permissionStore
if (filterMenus && filterMenus.length > 0) {
permissionStore.setSidebarRouters(filterMenus)
}
} catch (parseError) {
console.error('解析sessionStorage数据失败:', parseError)
// 解析失败时清除无效数据
sessionStorage.removeItem('allnavList')
sessionStorage.removeItem('navStatus')
}
}
}
console.log(permissionStore.sidebarRouters)
console.log('next6',router.getRoutes())
next()
} catch (error) {
console.error('路由守卫处理失败:', error)
next()
}
} else {
next(`/login?redirect=${to.fullPath}`)
NProgress.done()
......@@ -74,4 +82,4 @@ router.beforeEach((to, from, next) => {
router.afterEach(() => {
NProgress.done()
})
})
\ No newline at end of file
......@@ -80,7 +80,7 @@
:key="db.id"
class="db-item"
>
<el-checkbox :label="db.tid">
<el-checkbox :value="db.tid">
{{ db.sysname }}
</el-checkbox>
</div>
......@@ -120,11 +120,11 @@
<el-scrollbar height="400px">
<div class="datasource-list">
<div
v-for="db in selectedDbDetails"
v-for="(db,dbindex) in selectedDbDetails"
:key="db.tid"
class="datasource-item"
:class="{ active: selectedDataSource === db.tid }"
@click="selectDataSource(db.tid)"
@click="selectDataSource(db.tid,dbindex)"
>
{{ db.sysname }}
</div>
......@@ -143,20 +143,19 @@
>
全选
</el-checkbox>
<span class="schema-count">{{ selectedSchemas.length }}/{{ allSchemas.length }}</span>
<span class="schema-count">{{ selectedSchemas.length }}/{{ allSchemasCompute.length }}</span>
</div>
</div>
<el-scrollbar height="400px">
<el-checkbox-group v-model="selectedSchemas">
<el-checkbox-group v-model="selectedSchemas" @change="schemaChange">
<div
v-for="schema in allSchemas"
v-for="schema in allSchemasCompute"
:key="schema"
class="schema-item"
>
<el-checkbox :label="schema">
{{ schema }}
</el-checkbox>
<el-checkbox :value="schema.value" :label=" schema.text" />
</div>
</el-checkbox-group>
</el-scrollbar>
......@@ -175,24 +174,24 @@
<div class="section-title">可选择数据域</div>
</div>
<div class="domain-group" v-for="group in domainGroups" :key="group.name">
<div class="domain-group" v-for="group in domainGroups" :key="group.id">
<div class="group-header">
<el-checkbox
v-model="group.selectedAll"
@change="(val) => toggleGroupSelection(group, val)"
>
{{ group.name }}
{{ group.dataarea }}
</el-checkbox>
</div>
<el-scrollbar height="300px">
<el-scrollbar height="150px">
<el-checkbox-group v-model="selectedDomains">
<div
v-for="domain in group.domains"
v-for="domain in group.list"
:key="domain.id"
class="domain-item"
>
<el-checkbox :label="domain.id">
<el-checkbox :value="domain.id">
<div class="domain-content">
<div class="domain-name">{{ domain.name }}</div>
<div v-if="domain.desc" class="domain-desc">{{ domain.desc }}</div>
......@@ -202,6 +201,7 @@
</el-checkbox-group>
</el-scrollbar>
</div>
</div>
<!-- 右侧已选择数据域 -->
......@@ -262,8 +262,9 @@ import {
checkDatasystem,
queryByEditSort,
selectProDataSource,
queryShemas
queryShemas,
getAllDataAreaAndRule,
getDataProjectDetail
} from '@/api/project'
import useAppStore from '@/store/modules/app'
......@@ -353,7 +354,7 @@ const formData = ref({
projectType: 'normal',
databases: [],
schemas: [],
domains: []
domains: [],
})
// 步骤条相关
......@@ -401,37 +402,37 @@ 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: '邮政编码字段查找' }
]
}
// {
// 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(['domain2', 'domain3', 'domain4', 'domain6', 'domain7', 'domain9', 'domain10'])
const selectedDomains = ref([])
// 计算属性
const filteredDatabases = computed(() => {
......@@ -447,12 +448,13 @@ const selectedDbDetails = computed(() => {
})
const selectedDomainDetails = computed(() => {
const allDomains = domainGroups.value.flatMap(group => group.domains)
const allDomains = domainGroups.value.flatMap(group => group.list)
return allDomains.filter(domain => selectedDomains.value.includes(domain.id))
})
// 方法
const handleSelectAll = (val) => {
console.log('selectedDbs',selectedDbs)
if (val) {
selectedDbs.value = filteredDatabases.value.map(db => db.tid)
} else {
......@@ -464,21 +466,69 @@ const handleClearSelected = () => {
selectedDbs.value = []
selectAll.value = false
}
const allSchemasCompute = computed(() => {
return allSchemas.value[allSchemasIndex.value]
})
const allSchemasIndex = ref(0)
const selectDataSource = (dbId) => {
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) {
selectedSchemas.value = [...allSchemas.value]
let list = []
allSchemasCompute.value.forEach(element => {
list.push(element.value)
});
selectedSchemas.value = list
} else {
selectedSchemas.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 = []
selectedSchemas.value.forEach(element => {
console.log('element',element)
let data = {
schemaname: element,
dbtype:selectedDbDetails.value[allSchemasIndex.value].dbtype,
osdsid:selectedDbDetails.value[allSchemasIndex.value].tid,
}
schemalist.value.push(data)
});
}
const toggleGroupSelection = (group, selected) => {
const groupDomainIds = group.domains.map(d => d.id)
const groupDomainIds = group.list.map(d => d.id)
if (selected) {
const newSelected = [...new Set([...selectedDomains.value, ...groupDomainIds])]
......@@ -554,14 +604,32 @@ const handleNextStep = async () => {
}
// 其他步骤直接前进
activeStep.value++
getAllDataAreaAndRule().then(res=>{
console.log(res)
domainGroups.value = res.data
})
} else {
console.log('selectedDomainDetails',selectedDomainDetails.value)
// 最后一步提交数据
formData.value.databases = selectedDbDetails.value
formData.value.schemas = selectedSchemas.value
formData.value.domains = selectedDomainDetails.value
formData.value.schemas = schemalist.value
formData.value.domains = selectedDomainDetails.value.map(item=>(({
dataarea_id:item.dataarea_id,
rule_id:item.id
})))
emit('submit', formData.value)
dialogVisible.value = false
setTimeout(() => {
reset()
dialogVisible.value = false
}, 300);
}
}
// 第一步验证接口函数
......@@ -613,15 +681,17 @@ watch(selectedDbs, (newVal) => {
selectAll.value = newVal.length > 0 && newVal.length === allDatabases.value.length
})
watch(selectedSchemas, (newVal) => {
selectAllSchemas.value = newVal.length === allSchemas.value.length
}, { deep: true })
watch(selectedDomains, (newVal) => {
domainGroups.value.forEach(group => {
const groupDomainIds = group.domains.map(d => d.id)
group.selectedAll = groupDomainIds.every(id => newVal.includes(id))
})
if(domainGroups.value.length>0){
console.log('domainGroups',domainGroups.value)
domainGroups.value.forEach(group => {
const groupDomainIds = group.list.map(d => d.id)
group.selectedAll = groupDomainIds.every(id => newVal.includes(id))
})
}
}, { deep: true })
// 初始化时自动选择第一个数据源
......@@ -630,6 +700,7 @@ watch(selectedDbDetails,async (newVal,oldVal) => {
if(newVal.length > 0){
if(JSON.stringify(newVal) !== JSON.stringify(oldVal)){
await fetchAllSchemas(newVal)
}
......@@ -675,7 +746,7 @@ const fetchAllSchemas = async (databases) => {
// 合并成功的数据
successResults.forEach(res => {
if (res.data && Array.isArray(res.data)) {
allSchemas.value = [...allSchemas.value, ...res.data]
allSchemas.value.push(res.data)
}
})
......@@ -687,7 +758,7 @@ const fetchAllSchemas = async (databases) => {
if (errorResults.length > 0) {
console.log(`${errorResults.length} 个数据库的Schema获取失败`)
}
console.log('allSchemas',allSchemas.value)
} catch (error) {
console.error('获取Schema数据过程中出错:', error)
ElMessage.error('获取Schema数据过程中出错')
......@@ -697,17 +768,107 @@ const fetchAllSchemas = async (databases) => {
}
const processAreaAndRuleList = (areaAndRuleList) => {
if (!areaAndRuleList || !Array.isArray(areaAndRuleList)) return
// 获取所有数据域分组信息
getAllDataAreaAndRule().then(res => {
console.log('所有数据域分组:', res.data)
// 处理已选择的数据域
const selectedDomainIds = []
// 将接口返回的数据映射到 domainGroups
domainGroups.value = res.data.map(group => {
// 处理组内的每个规则
const processedList = group.list.map(domain => {
// 检查这个规则是否在已选择的列表中
const isSelected = areaAndRuleList.some(item =>
item.dataarea_id === group.dataarea_id && item.rule_id === domain.id
)
if (isSelected) {
selectedDomainIds.push(domain.id)
}
return {
...domain,
dataarea_id: group.dataarea_id // 添加数据域ID引用
}
})
// 检查是否全选
const groupDomainIds = processedList.map(d => d.id)
const selectedInGroup = selectedDomainIds.filter(id => groupDomainIds.includes(id))
group.selectedAll = selectedInGroup.length === groupDomainIds.length && groupDomainIds.length > 0
return {
...group,
list: processedList
}
})
// 设置已选择的数据域
selectedDomains.value = selectedDomainIds
console.log('已选择的数据域ID:', selectedDomains.value)
})
}
// 处理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)
})
}
// 监听传入的项目数据变化
watch(() => props.projectData, (newVal) => {
if (props.mode === 'edit') {
formData.value = { ...newVal }
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)
// 处理Schema数据
processSchemaList(data.schemalist)
// let list = data.areaAndRuleList
processAreaAndRuleList(data.areaAndRuleList)
}else{
ElMessage.error(res.msg)
}
}).catch(err =>{
ElMessage.error(res.msg)
})
// 初始化选中状态
selectedDbs.value = newVal.databases.map(db => db.id)
selectedSchemas.value = [...newVal.schemas]
selectedDomains.value = newVal.domains.map(domain => domain.id)
// 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>
......@@ -872,8 +1033,10 @@ watch(() => props.projectData, (newVal) => {
.available-domains, .selected-domains {
flex: 1;
border: 1px solid #ebeef5;
border-radius: 4px;
border-radius: 4px;
background-color: #f8f8f8;
height: 500px;
overflow-y: auto;
}
.section-header {
......
<script setup name="ProjectManageList">
import { getCurrentInstance, reactive, ref, toRefs,onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { ElMessage,ElMessageBox } from 'element-plus'
import QueryForm from './QueryForm.vue'
import ProjectEditDialog from './ProjectEditDialog.vue'
import DownloadPluginDialog from './DownloadPluginDialog.vue'
......@@ -10,7 +10,9 @@ import {changeRoute} from '@/utils/switchRoute'
import {
selectDataProject,
checkProjectNum,
getdatascopeprojectlist
addDataProject,
deleteDataProject,
updateDataProject
} from '@/api/project'
import useAppStore from '@/store/modules/app'
......@@ -215,8 +217,39 @@ const handleEditProject = (project) => {
// 删除项目
const handleDeleteProject = (project) => {
const handleDeleteProject = (val) => {
ElMessageBox.confirm(
`确定要删除项目「${val.project}」吗?此操作不可恢复。`,
'删除确认',
{
confirmButtonText: '确认删除',
cancelButtonText: '取消',
type: 'warning',
center: true,
callback: (action) => {
if (action === 'confirm') {
// 执行删除操作
let parms = {
loginUser:loginUser,
project:val
}
deleteDataProject(parms).then(res=>{
if(res.flag){
ElMessage.success(`项目「${val.project}」已删除`);
}else{
ElMessage.info(res.msg);
}
}).catch(err=>{
ElMessage.info(res.msg);
})
} else {
ElMessage.info('已取消删除');
}
}
}
);
}
// 导入项目
......@@ -245,22 +278,66 @@ const handleSubmit = (formData) => {
if (dialogMode.value === 'add') {
// 模拟新增
const newProject = {
id: tableList.value.length + 1,
proName: formData.proName,
datasource: '待配置',
domain: '待配置',
findRule: '待配置'
loginUser:loginUser,
project:{
edition_id: '',
note: formData.remark,
project: formData.name,
projectType: "normal",
},
schemalist:formData.schemas,
areaAndRuleList:formData.domains,
dataSourceIdList:formData.databases.map(item =>(({
id:item.tid,
sysname:item.sysname,
systemstyle:1,
dbtype:item.dbtype
})))
}
tableList.value.push(newProject)
total.value++
ElMessage.success('新增项目成功')
addDataProject(newProject).then(res=>{
console.log(res)
if(res.flag){
ElMessage.success('新增项目成功')
handleQuery()
}
})
// tableList.value.push(newProject)
// total.value++
// ElMessage.success('新增项目成功')
} else {
// 模拟编辑
const index = tableList.value.findIndex(p => p.id === currentProject.value.id)
if (index !== -1) {
tableList.value[index].proName = formData.proName
ElMessage.success('编辑项目成功')
const newProject = {
loginUser:loginUser,
project:{
edition_id: '',
note: formData.remark,
project: formData.name,
id:formData.id,
projectType: "normal",
},
schemalist:formData.schemas,
areaAndRuleList:formData.domains,
dataSourceIdList:formData.databases.map(item =>(({
id:item.tid,
sysname:item.sysname,
systemstyle:1,
dbtype:item.dbtype
})))
}
console.log('newProject',newProject)
updateDataProject(newProject).then(res=>{
console.log(res)
if(res.flag){
ElMessage.success('新增项目成功')
handleQuery()
}
})
}
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论