Commit 6bc00674 by ningjihai

发现梳理新增和编辑

parent 95bbf8b2
...@@ -29,16 +29,46 @@ export function querydatasystem(data) { ...@@ -29,16 +29,46 @@ export function querydatasystem(data) {
}) })
} }
export function isRepeatName(data) {
return request({
url: '/core/tdatadiscovery/isRepeatName',
method: 'post',
data: data
})
}
export function getSchemaList(data) {
return request({
url: '/core/tdatadiscovery/getSchemaList',
method: 'post',
data: data
})
}
export function queryTable(data) {
return request({
url: '/core/tdatadiscovery/queryTable',
method: 'post',
data: data
})
}
// export function checkProjectNum(data) { export function saveDiscoverTask(data) {
// return request({ return request({
// url: '/core/tdataproject/checkProjectNum', url: '/core/tdatadiscovery/add',
// method: 'post', method: 'post',
// data: data data: data
// }) })
// } }
export function initEdit(taskid) {
return request({
url: '/core/tdatadiscovery/initEdit?taskid=' + taskid,
method: 'get'
})
}
// export function getdatascopeprojectlist(data) { // export function getdatascopeprojectlist(data) {
// return request({ // return request({
// url: '/core/datascopeproject/getdatascopeprojectlist', // url: '/core/datascopeproject/getdatascopeprojectlist',
......
...@@ -60,12 +60,12 @@ ...@@ -60,12 +60,12 @@
<div class="data-source-section"> <div class="data-source-section">
<div class="data-source-header"> <div class="data-source-header">
<span class="label">数据源:</span> <span class="label">数据源:</span>
<el-select v-model="selectedDataSource" placeholder="请选择数据源"> <el-select v-model="selectedDataSourceId" placeholder="请选择数据源" @change="handleDataSourceChange">
<el-option <el-option
v-for="source in dataSources" v-for="source in datasourcelist"
:key="source.value" :key="source.id"
:label="source.label" :label="source.sysname"
:value="source.value" :value="source.id"
/> />
</el-select> </el-select>
</div> </div>
...@@ -86,13 +86,13 @@ ...@@ -86,13 +86,13 @@
</div> </div>
<div class="list-container"> <div class="list-container">
<div <div
v-for="schema in filteredSchemaList" v-for="item in filteredSchemaList"
:key="schema.id" :key="item.value"
class="schema-item" class="schema-item"
:class="{ 'schema-selected': selectedSchema === schema.id }" :class="{ 'schema-selected': selectedSchema.value === item.value }"
@click="selectSchema(schema)" @click="selectSchema(item)"
> >
<span class="schema-name">{{ schema.name }}</span> <span class="schema-name">{{ item.text }}</span>
</div> </div>
</div> </div>
</div> </div>
...@@ -119,14 +119,14 @@ ...@@ -119,14 +119,14 @@
</div> </div>
</div> </div>
<div class="list-container"> <div class="list-container">
<el-checkbox-group v-model="selectedTables"> <el-checkbox-group v-model="selectedTables" @change="tableChange">
<div <div
v-for="table in filteredTableList" v-for="(item,index) in filteredTableList"
:key="table.id" :key="item.tablename"
class="table-item" class="table-item"
> >
<el-checkbox :label="table.id"> <el-checkbox :label="item.tablename">
<span class="table-name">{{ table.name }}</span> <span class="table-name">{{ item.tablename }}</span>
</el-checkbox> </el-checkbox>
</div> </div>
</el-checkbox-group> </el-checkbox-group>
...@@ -141,8 +141,8 @@ ...@@ -141,8 +141,8 @@
<el-form :model="ruleConfig" :rules="ruleRules" ref="step3Form" label-width="120px"> <el-form :model="ruleConfig" :rules="ruleRules" ref="step3Form" label-width="120px">
<el-form-item label="采样方式" prop="samplingMethod" required> <el-form-item label="采样方式" prop="samplingMethod" required>
<el-radio-group v-model="ruleConfig.samplingMethod"> <el-radio-group v-model="ruleConfig.samplingMethod">
<el-radio label="sequential">顺序</el-radio> <el-radio label="1">顺序</el-radio>
<el-radio label="random">随机</el-radio> <el-radio label="3">随机</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
...@@ -150,7 +150,6 @@ ...@@ -150,7 +150,6 @@
<el-input-number <el-input-number
v-model="ruleConfig.maxSamples" v-model="ruleConfig.maxSamples"
:min="1" :min="1"
:max="10000"
controls-position="right" controls-position="right"
/> />
</el-form-item> </el-form-item>
...@@ -169,13 +168,13 @@ ...@@ -169,13 +168,13 @@
<el-form-item label="敏感类型" required> <el-form-item label="敏感类型" required>
<div class="sensitive-types"> <div class="sensitive-types">
<el-tag <el-tag
v-for="type in sensitiveTypes" v-for="(item,index) in sensitiveTypes"
:key="type" :key="index"
closable closable
@close="removeSensitiveType(type)" @close="removeSensitiveType(item)"
class="sensitive-tag" class="sensitive-tag"
> >
{{ type }} {{ item.dataarea.dataarea }}
</el-tag> </el-tag>
<el-button type="primary" text @click="openSensitiveTypeDialog" class="add-sensitive-btn"> <el-button type="primary" text @click="openSensitiveTypeDialog" class="add-sensitive-btn">
+ 添加敏感类型 + 添加敏感类型
...@@ -218,7 +217,7 @@ ...@@ -218,7 +217,7 @@
<SensitiveTypeDialog <SensitiveTypeDialog
ref="sensitiveDialogRef" ref="sensitiveDialogRef"
v-model="sensitiveTypeDialogVisible" v-model="sensitiveTypeDialogVisible"
:selected-types="selectedRuleIds" :selected-types="sensitiveTypes"
@confirm="handleRuleConfirm" @confirm="handleRuleConfirm"
/> />
</div> </div>
...@@ -227,15 +226,20 @@ ...@@ -227,15 +226,20 @@
<script setup> <script setup>
import { ref, reactive, computed,onMounted } from 'vue' import { ref, reactive, computed,onMounted } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage,ElMessageBox } from 'element-plus'
import useAppStore from '@/store/modules/app' import useAppStore from '@/store/modules/app'
import SensitiveTypeDialog from './modules/SensitiveTypeDialog.vue' import SensitiveTypeDialog from './modules/SensitiveTypeDialog.vue'
import { import {
querybyprojectid, querydatasystem,
querydatasystem isRepeatName,
getSchemaList,
queryTable,
saveDiscoverTask,
initEdit,
querybyprojectid
} from '@/api/discover/index' } from '@/api/discover/index'
const appStore = useAppStore() const appStore = useAppStore()
...@@ -264,21 +268,21 @@ const loginUser = { ...@@ -264,21 +268,21 @@ const loginUser = {
} }
} }
const dialogVisible = ref(false)
const currentStep = ref(1) const currentStep = ref(1)
const isEditMode = ref(false) // const isEditMode = ref(false)
const currentEditId = ref(null) const currentEditId = ref(null)
const sensitiveTypeDialogVisible = ref(false) const sensitiveTypeDialogVisible = ref(false)
const schemaSearch = ref('') const schemaSearch = ref('')
const tableSearch = ref('') const tableSearch = ref('')
const sensitiveDialogRef = ref() const sensitiveDialogRef = ref()
const selectedRuleIds = ref(['email', 'mixed_id']) // 已选规则的ID const selectedRuleIds = ref([]) // 已选规则的ID
const selectedRules = ref([ const selectedRules = ref([
{ id: 'email', domain: '电子邮件', ruleName: '邮箱规则1', sample: '605396113@qq.com' }, // { id: 'email', domain: '电子邮件', ruleName: '邮箱规则1', sample: '605396113@qq.com' },
{ id: 'mixed_id', domain: '混合证件号', ruleName: '混合证件号规则1', sample: '310000000100116, 9131000...' } // { id: 'mixed_id', domain: '混合证件号', ruleName: '混合证件号规则1', sample: '310000000100116, 9131000...' }
]) ])
const sensitiveTypes = ref(['电子邮件', '混合证件号']) const sensitiveTypes = ref([])
// 步骤1数据 // 步骤1数据
const formData = reactive({ const formData = reactive({
taskname: '', taskname: '',
...@@ -292,46 +296,69 @@ const rules = { ...@@ -292,46 +296,69 @@ const rules = {
} }
// 步骤2数据 // 步骤2数据
const selectedDataSource = ref('system1') const selectedDataSourceId = ref('')
const dataSources = ref([ const selectedDataSource = ref({})
{ value: 'system1', label: '若依测试系统1' } const datasourcelist = ref([
// { value: 'system1', label: '若依测试系统1' }
]) ])
const handleDataSourceChange = () => {
console.log('选择的数据源id',selectedDataSourceId.value)
selectedDataSource.value = datasourcelist.value.find(item => item.id === selectedDataSourceId.value)
schemaList.value = []
getSchemaList({
dataSystemId: selectedDataSourceId.value,
dataSystemname: selectedDataSource.value.sysname,
dbType: selectedDataSource.value.dbtype,
filtername: "",
projectid: sessionStorage.getItem('projectId'),
taskname: props.listItem ? props.listItem.taskName : '',
}).then(res=>{
schemaList.value = res.data.map(item =>({
...item,
id: item.value,
name: item.text
}))
})
}
const schemaList = ref([ const schemaList = ref([
{ id: 'ry', name: 'ry' } // { id: 'ry', name: 'ry' }
]) ])
const selectedSchema = ref('ry') const selectedSchema = ref({})
const tableList = ref([ const tableList = ref([
{ id: 'gen_table', name: 'gen_table' }, // { id: 'gen_table', name: 'gen_table' },
{ id: 'gen_table_column', name: 'gen_table_column' }, // { id: 'gen_table_column', name: 'gen_table_column' },
{ id: 'sys_config', name: 'sys_config' }, // { id: 'sys_config', name: 'sys_config' },
{ id: 'sys_dept', name: 'sys_dept' }, // { id: 'sys_dept', name: 'sys_dept' },
{ id: 'sys_dict_data', name: 'sys_dict_data' }, // { id: 'sys_dict_data', name: 'sys_dict_data' },
{ id: 'sys_dict_type', name: 'sys_dict_type' }, // { id: 'sys_dict_type', name: 'sys_dict_type' },
{ id: 'sys_job', name: 'sys_job' }, // { id: 'sys_job', name: 'sys_job' },
{ id: 'sys_job_log', name: 'sys_job_log' }, // { id: 'sys_job_log', name: 'sys_job_log' },
{ id: 'sys_logininfor', name: 'sys_logininfor' }, // { id: 'sys_logininfor', name: 'sys_logininfor' },
{ id: 'sys_menu', name: 'sys_menu' }, // { id: 'sys_menu', name: 'sys_menu' },
{ id: 'sys_notice', name: 'sys_notice' }, // { id: 'sys_notice', name: 'sys_notice' },
{ id: 'sys_oper_log', name: 'sys_oper_log' }, // { id: 'sys_oper_log', name: 'sys_oper_log' },
{ id: 'sys_post', name: 'sys_post' }, // { id: 'sys_post', name: 'sys_post' },
{ id: 'sys_role', name: 'sys_role' }, // { id: 'sys_role', name: 'sys_role' },
{ id: 'sys_role_dept', name: 'sys_role_dept' }, // { id: 'sys_role_dept', name: 'sys_role_dept' },
{ id: 'sys_role_menu', name: 'sys_role_menu' }, // { id: 'sys_role_menu', name: 'sys_role_menu' },
{ id: 'sys_user', name: 'sys_user' }, // { id: 'sys_user', name: 'sys_user' },
{ id: 'sys_user_post', name: 'sys_user_post' }, // { id: 'sys_user_post', name: 'sys_user_post' },
{ id: 'sys_user_role', name: 'sys_user_role' } // { id: 'sys_user_role', name: 'sys_user_role' }
]) ])
const selectedTables = ref(tableList.value.map(table => table.id)) const selectedTables = ref([])
const selectAll = ref(true) const selectAll = ref(false)
// 步骤3数据 // 步骤3数据
const ruleConfig = reactive({ const ruleConfig = reactive({
samplingMethod: 'sequential', samplingMethod: '1',
maxSamples: 1000, maxSamples: 1000,
matchingRate: 50 matchingRate: 50,
flag: '1'
}) })
const ruleRules = { const ruleRules = {
...@@ -356,90 +383,183 @@ const dialogTitle = computed(() => { ...@@ -356,90 +383,183 @@ const dialogTitle = computed(() => {
const filteredSchemaList = computed(() => { const filteredSchemaList = computed(() => {
if (!schemaSearch.value) return schemaList.value if (!schemaSearch.value) return schemaList.value
return schemaList.value.filter(schema => return schemaList.value.filter(schema =>
schema.name.toLowerCase().includes(schemaSearch.value.toLowerCase()) schema.text.toLowerCase().includes(schemaSearch.value.toLowerCase())
) )
}) })
const filteredTableList = computed(() => { const filteredTableList = computed(() => {
if (!tableSearch.value) return tableList.value if (!tableSearch.value) return tableList.value
return tableList.value.filter(table => return tableList.value.filter(table =>
table.name.toLowerCase().includes(tableSearch.value.toLowerCase()) table.tablename.toLowerCase().includes(tableSearch.value.toLowerCase())
) )
}) })
const storageSchemas = ref([])
const tranStorageSchemas = ref('')
const tableChange = () =>{
console.log('selectedTables',selectedTables.value)
console.log(1)
// if(this.addEditTableList.length == group.length)
if(selectedTables.value.length== filteredSchemaList.value.length) {
storageSchemas.value.push(selectedDataSource.value.sysname)
}else{
storageSchemas.value.includes(selectedDataSource.value.sysname) && storageSchemas.value.splice(storageSchemas.value.findIndex(item => item == selectedDataSource.value.sysname), 1);
}
if(storageSchemas.value.length > 1) {
const tableString = storageSchemas.value.toString()
tranStorageSchemas.value = tableString.replace(',', '-')
}else {
tranStorageSchemas.value = storageSchemas.value.toString()
}
}
const discoverTaskId = ref('')
onMounted(() => { onMounted(() => {
querybyprojectid({
dataarea: "",
projectid: sessionStorage.getItem('projectId'),
rulename: ""
}).then(res =>{
})
querydatasystem({ querydatasystem({
discoverytype: 1, discoverytype: 1,
projectid: sessionStorage.getItem('projectId'), projectid: sessionStorage.getItem('projectId'),
loginUser: loginUser loginUser: loginUser
}).then(res =>{ }).then(res =>{
datasourcelist.value = res.data
const {type} = appStore.queryData
console.log('type',type)
if (type === 'edit') {
const id = JSON.parse(appStore.queryData.data).id;
discoverTaskId.value = id;
getTaskDetailRequest(id);
}
}) })
}) })
const getTaskDetailRequest = (id) => {
initEdit(id).then(response => {
const { datalist, rulelist, taskinfo } = response.data
// this.receiveStorageSchemas = taskinfo.alltableschema
// this.taskFirstForm.taskname = taskinfo.tname;
// this.taskFirstForm.remark = taskinfo.note === null ? '' : taskinfo.note;
formData.taskname = taskinfo.tname
formData.remark = taskinfo.note === null ? '' : taskinfo.note;
ruleConfig.samplingMethod = taskinfo.cyfs
ruleConfig.maxSamples= taskinfo.cys
ruleConfig.matchingRate = taskinfo.ppl
ruleConfig.flag= taskinfo.flag
selectedDataSourceId.value = taskinfo.datasystemid
selectedDataSource.value = datasourcelist.value.find(item => item.id === selectedDataSourceId.value)
schemaList.value = []
getSchemaList({
dataSystemId: selectedDataSourceId.value,
dataSystemname: selectedDataSource.value.sysname,
dbType: selectedDataSource.value.dbtype,
filtername: "",
projectid: sessionStorage.getItem('projectId'),
taskname: props.listItem ? props.listItem.taskName : '',
}).then(res=>{
schemaList.value = res.data.map(item =>({
...item,
id: item.value,
name: item.text
}))
selectedSchema.value = schemaList.value.find(item =>item.value === datalist[0].tschema)
selectSchema(selectedSchema.value)
selectedTables.value = []
datalist.forEach(item => {
selectedTables.value.push(item.tablename)
})
})
sensitiveTypes.value = []
querybyprojectid({
dataarea: "",
projectid: sessionStorage.getItem('projectId'),
rulename: ""
}).then(res =>{
// 修改openDialog方法 let rulesData = []
const openDialog = (row = null) => {
dialogVisible.value = true
currentStep.value = 1
isEditMode.value = !!row
if (row) { rulesData = res.data.map(item =>(({
// 编辑模式 ...item,
currentEditId.value = row.id status:'part',
// 填充步骤1数据 selectedRuleId: item.data.length === 0 ? '' : item.data.length === 1 ? item.data[0].ruleid : ( item.data.findIndex(x => x.defaulttype === '1').ruleid || ''),
formData.taskname = row.taskname data: item.data.map(rule => (({
formData.remark = row.remark ...rule,
value :rule.ruleid,
label: rule.name
})))
})))
// 填充步骤2数据(根据实际业务数据调整) if(rulelist.length > 0){
selectedDataSource.value = row.dataSource || 'system1' rulelist.forEach(item => {
selectedSchema.value = row.schema || 'ry' let data = rulesData.find(x =>x.data.find(y =>y.ruleid === item.ruleid))
selectedTables.value = row.tables || []
// 填充步骤3数据 if(data){
if (row.ruleConfig) { data.selectedRuleId = item.ruleid
ruleConfig.samplingMethod = row.ruleConfig.samplingMethod || 'sequential' sensitiveTypes.value.push(data)
ruleConfig.maxSamples = row.ruleConfig.maxSamples || 1000
ruleConfig.matchingRate = row.ruleConfig.matchingRate || 50
} }
})
// 设置敏感类型
sensitiveTypes.value = row.sensitiveTypes || []
} else {
// 新增模式
resetForm()
} }
console.log('父组件获取的sensitiveTypes',sensitiveTypes.value)
})
// sensitiveTypes
})
} }
const resetForm = () => { const resetForm = () => {
formData.taskname = '' formData.taskname = ''
formData.remark = '' formData.remark = ''
selectedDataSource.value = 'system1' selectedDataSource.value = {}
selectedSchema.value = 'ry' selectedSchema.value = {}
selectedTables.value = tableList.value.map(table => table.id) selectedTables.value = []
selectAll.value = true selectAll.value = true
sensitiveTypes.value = ['电子邮件', '混合证件号'] sensitiveTypes.value = []
schemaSearch.value = '' schemaSearch.value = ''
tableSearch.value = '' tableSearch.value = ''
} }
const handleClose = () => {
dialogVisible.value = false
}
const handleCancel = () => { const handleCancel = () => {
dialogVisible.value = false ElMessageBox.confirm('确定要取消吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
resetForm()
backListPage()
done()
}).catch(() => {
// 取消关闭
})
} }
const handleNextStep = async () => { const handleNextStep = async () => {
...@@ -448,8 +568,27 @@ const handleNextStep = async () => { ...@@ -448,8 +568,27 @@ const handleNextStep = async () => {
ElMessage.error('请填写发现任务名称') ElMessage.error('请填写发现任务名称')
return return
} }
isRepeatName({
projectid:sessionStorage.getItem('projectId'),
taskname:formData.taskname,
taskid:props.listItem ? props.listItem.id : ''
}).then(res=>{
if(res.data === false){
ElMessage.error('任务名称已存在')
return
}else{
currentStep.value++
}
}).catch(err=>{
console.log(err)
})
} else if (currentStep.value === 2) { } else if (currentStep.value === 2) {
if (!selectedDataSource.value) { if (!selectedDataSourceId.value) {
ElMessage.error('请选择数据源') ElMessage.error('请选择数据源')
return return
} }
...@@ -461,22 +600,39 @@ const handleNextStep = async () => { ...@@ -461,22 +600,39 @@ const handleNextStep = async () => {
ElMessage.error('请至少选择一张表') ElMessage.error('请至少选择一张表')
return return
} }
currentStep.value++
} }
currentStep.value++ // currentStep.value++
} }
const handlePrevStep = () => { const handlePrevStep = () => {
currentStep.value-- currentStep.value--
} }
const selectSchema = (schema) => { const selectSchema = (item) => {
selectedSchema.value = schema.id console.log(item)
selectedSchema.value = item
queryTable({
dataSystemId: selectedDataSourceId.value,
dataSystemname: selectedDataSource.value.sysname,
taskname: '11',
schema: item.value,
tablename: ''
}).then(res =>{
tableList.value = res.data
})
} }
const handleSelectAll = (value) => { const handleSelectAll = (value) => {
if (value) { if (value) {
selectedTables.value = tableList.value.map(table => table.id) selectedTables.value = tableList.value.map(table => table.tablename)
} else { } else {
selectedTables.value = [] selectedTables.value = []
} }
...@@ -488,16 +644,33 @@ const openSensitiveTypeDialog = () => { ...@@ -488,16 +644,33 @@ const openSensitiveTypeDialog = () => {
} }
const sensitiveTypesMap = ref([])
const handleRuleConfirm = (rules) => { const handleRuleConfirm = (rules) => {
selectedRules.value = rules console.log('rules',rules)
selectedRuleIds.value = rules.map(rule => rule.id) // sensitiveTypes.value = []
sensitiveTypes.value = rules.map(rule => rule.domain) // selectedRules.value = []
// selectedRules.value = rules
// selectedRuleIds.value = rules.map(rule => rule.id)
// `${item.tid}#|#${item.dataarea}#|#${item.ruleDefaultId}#|#${rule.regex}#|#${rule.flag}#|#${rule.discoverway}#|#${rule.defaulttype}#|#${rule.name}#|#${item.dataarea}`
// sensitiveTypes.value = [...sensitiveTypes.value, ...rules]
sensitiveTypes.value = rules
console.log('sensitiveTypes.value',sensitiveTypes.value)
// rules.forEach(item => {
// let index = item.data.findIndex(i => i.ruleid === item.selectedRuleId)
// let defaultData = item.data.find(i => i.ruleid === item.selectedRuleId)
// let str = `${defaultData.tid}#|#${item.dataarea.dataarea}#|#${item.selectedRuleId}#|#${defaultData.regex}#|#${defaultData.flag}#|#${defaultData.discoverway}#|#${defaultData.defaulttype}#|#${defaultData.name}#|#${item.dataarea.dataarea}`
// sensitiveTypesMap.value.push(str)
// });
} }
const removeRule = (ruleId) => { const removeRule = (ruleId) => {
selectedRules.value = selectedRules.value.filter(rule => rule.id !== ruleId) selectedRules.value = selectedRules.value.filter(rule => rule.id !== ruleId)
selectedRuleIds.value = selectedRuleIds.value.filter(id => id !== ruleId) // selectedRuleIds.value = selectedRuleIds.value.filter(id => id !== ruleId)
} }
const removeSensitiveType = (type) => { const removeSensitiveType = (type) => {
...@@ -510,30 +683,70 @@ const handleConfirm = () => { ...@@ -510,30 +683,70 @@ const handleConfirm = () => {
return return
} }
sensitiveTypesMap.value = []
sensitiveTypes.value.forEach(item => {
let index = item.data.findIndex(i => i.ruleid === item.selectedRuleId)
let defaultData = item.data.find(i => i.ruleid === item.selectedRuleId)
let str = `${defaultData.tid}#|#${item.dataarea.dataarea}#|#${item.selectedRuleId}#|#${defaultData.regex}#|#${defaultData.flag}#|#${defaultData.discoverway}#|#${defaultData.defaulttype}#|#${defaultData.name}#|#${item.dataarea.dataarea}`
sensitiveTypesMap.value.push(str)
});
let schematblist = {}
schematblist[`${selectedSchema.value.value}`] = selectedTables.value
const submitData = { const submitData = {
...formData, taskname: formData.taskname,
dataSource: selectedDataSource.value, remark: formData.remark,
schema: selectedSchema.value, discoverytype: '0',
tables: selectedTables.value, dataSystemId: selectedDataSourceId.value,
ruleConfig: { ...ruleConfig }, dataSystemName: selectedDataSource.value.sysname,
sensitiveTypes: [...sensitiveTypes.value] projectid: sessionStorage.getItem('projectId'),
taskid: props.listItem ? props.listItem.id : '',
cyfs: ruleConfig.samplingMethod + '',
cys: ruleConfig.maxSamples + '',
ppl: ruleConfig.matchingRate + '',
flag: ruleConfig.flag,
schematblist: schematblist,
ruleidlist: sensitiveTypesMap.value,
alltableschema: tranStorageSchemas.value
} }
// 如果是编辑模式,添加id saveDiscoverTask(submitData).then(res =>{
if (isEditMode.value) { console.log(res)
submitData.id = currentEditId.value if(res.flag){
ElMessage.success(res.msg)
backListPage()
}else{
ElMessage.info(res.msg)
} }
}).catch(err =>{
console.log(err)
})
// 如果是编辑模式,添加id
// if (isEditMode.value) {
// submitData.id = currentEditId.value
// }
console.log('提交数据:', submitData) console.log('提交数据:', submitData)
// ElMessage.success(isEditMode.value ? '发现任务更新成功' : '发现任务创建成功') // ElMessage.success(isEditMode.value ? '发现任务更新成功' : '发现任务创建成功')
dialogVisible.value = false // dialogVisible.value = false
// 触发父组件更新 // 触发父组件更新
emit('confirm', submitData, isEditMode.value) // emit('confirm', submitData, isEditMode.value)
} }
defineExpose({ defineExpose({
openDialog // openDialog
}) })
</script> </script>
...@@ -631,7 +844,7 @@ defineExpose({ ...@@ -631,7 +844,7 @@ defineExpose({
margin-bottom: 16px; margin-bottom: 16px;
.label { .label {
width: 60px; width: 65px;
font-weight: 500; font-weight: 500;
margin-right: 12px; margin-right: 12px;
color: #606266; color: #606266;
...@@ -729,6 +942,10 @@ defineExpose({ ...@@ -729,6 +942,10 @@ defineExpose({
&:hover { &:hover {
background-color: #f5f7fa; background-color: #f5f7fa;
} }
.schema-name {
font-size: 14px;
color: #000;
}
&.schema-selected { &.schema-selected {
background-color: #ffd6b3; background-color: #ffd6b3;
...@@ -780,8 +997,9 @@ defineExpose({ ...@@ -780,8 +997,9 @@ defineExpose({
.dialog-footer { .dialog-footer {
display: flex; display: flex;
justify-content: flex-end; justify-content: center;
gap: 12px; gap: 12px;
margin-top: 20px;
} }
.el-divider { .el-divider {
......
<script setup lang="ts" name="projectManageIndex"> <script setup lang="ts" name="DiscoverIndex">
import { ref } from 'vue' import { ref } from 'vue'
import list from './list.vue' import list from './list.vue'
import addEditDiscovery from './addEditDiscovery.vue' import addEditDiscovery from './addEditDiscovery.vue'
......
<script setup name="ProjectManageList"> <script setup name="DiscoverList">
import { getCurrentInstance, reactive, ref, toRefs,onMounted } from 'vue' import { getCurrentInstance, reactive, ref, toRefs,onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { useRouter } from 'vue-router' import { useRouter,useRoute } from 'vue-router'
import useAppStore from '@/store/modules/app' import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission' import usePermissionStore from '@/store/modules/permission'
import { changeRoute } from '@/utils/switchRoute' import { changeRoute } from '@/utils/switchRoute'
...@@ -17,7 +17,7 @@ import { ...@@ -17,7 +17,7 @@ import {
} from '@/api/discover/index' } from '@/api/discover/index'
const route = useRoute()
const appStore = useAppStore() const appStore = useAppStore()
const permissionStore = usePermissionStore() const permissionStore = usePermissionStore()
const router = useRouter() const router = useRouter()
...@@ -44,7 +44,7 @@ function onQuery() { ...@@ -44,7 +44,7 @@ function onQuery() {
// 搜索按钮操作 // 搜索按钮操作
function handleQuery() { function handleQuery() {
console.log('queryParams',queryParams.value) console.log('queryParams',queryParams.value)
queryParams.value.pageNum = 1 queryParams.value.pageno = 1
getList() getList()
} }
// 表格数据 // 表格数据
...@@ -114,7 +114,6 @@ function getList() { ...@@ -114,7 +114,6 @@ function getList() {
tableData.value = [] tableData.value = []
loading.value = false loading.value = false
console.log(err) console.log(err)
ElMessage.error(res.msg)
}) })
} }
...@@ -130,15 +129,39 @@ function pageProjectManage() { ...@@ -130,15 +129,39 @@ function pageProjectManage() {
* 新增发现任务 * 新增发现任务
*/ */
function handleAdd(){ function handleAdd(){
console.log('新增发现任务') console.log('新增发现任务')
// addDiscoveryDialogRef.value.openDialog() console.log(route)
appStore.setQueryData({
icon: route.meta.icon,
type: 'add'
});
emit('page', 'addEditDiscovery', { listItem: null, addEditType: 'add'}) emit('page', 'addEditDiscovery', { listItem: null, addEditType: 'add'})
} }
// 操作处理函数 // 操作处理函数
const handleEdit = (row) => { const handleEdit = (row) => {
console.log('编辑:', row) console.log('编辑:', row)
addDiscoveryDialogRef.value.openDialog(row)
ElMessage.info(`编辑任务: ${row.taskName}`)
appStore.setQueryData({
type: 'edit',
data: JSON.stringify(row),
icon: route.meta.icon,
breadPathData: [
{
path: route.path,
label: route.meta.title
},
{
label: "发现配置"
}
]
});
emit('page', 'addEditDiscovery', { listItem: row, addEditType: 'edit'})
} }
const handleDiscover = (row) => { const handleDiscover = (row) => {
...@@ -410,8 +433,8 @@ const handleAddEditConfirm = (submitData, isEditMode) =>{ ...@@ -410,8 +433,8 @@ const handleAddEditConfirm = (submitData, isEditMode) =>{
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="total"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageno"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pagesize"
@pagination="getList" @pagination="getList"
/> />
</div> </div>
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<div class="search-section"> <div class="search-section">
<el-input <el-input
v-model="searchText" v-model="searchText"
placeholder="搜索规则" placeholder="输入数据域名称进行搜索"
size="small" size="small"
prefix-icon="Search" prefix-icon="Search"
clearable clearable
...@@ -24,32 +24,33 @@ ...@@ -24,32 +24,33 @@
ref="tableRef" ref="tableRef"
:data="filteredRules" :data="filteredRules"
style="width: 100%" style="width: 100%"
:row-key="(row) => row.dataarea.id"
:header-cell-style="{ background: '#f0f7ff', color: '#606266' }" :header-cell-style="{ background: '#f0f7ff', color: '#606266' }"
:cell-style="{ padding: '8px 0' }" :cell-style="{ padding: '8px 0' }"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<!-- 选择列 -->
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- 数据域列 -->
<el-table-column prop="domain" label="数据域" width="120"> <el-table-column prop="domain" label="数据域" width="120">
<template #default="{ row }"> <template #default="{ row }">
<span class="domain-text">{{ row.domain }}</span> <span class="domain-text">{{ row.dataarea.dataarea}}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- 规则名列 -->
<el-table-column prop="ruleName" label="规则名" min-width="150"> <el-table-column prop="ruleName" label="规则名" min-width="150">
<template #default="{ row }"> <template #default="{ row }">
<el-select <el-select
v-model="row.selectedRule" v-model="row.selectedRuleId"
placeholder="请选择" placeholder="请选择"
size="small" size="small"
style="width: 100%" style="width: 100%"
:disabled="!isRowSelected(row)" :disabled="!isRowSelected(row)"
> >
<el-option <el-option
v-for="option in row.options" v-for="option in row.data"
:key="option.value" :key="option.value"
:label="option.label" :label="option.label"
:value="option.value" :value="option.value"
...@@ -58,13 +59,13 @@ ...@@ -58,13 +59,13 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 样例列 -->
<el-table-column prop="sample" label="样例" min-width="200"> <el-table-column prop="sample" label="样例" min-width="200">
<template #default="{ row }"> <template #default="{ row }">
<div class="sample-content"> <div class="sample-content">
<div class="sample-text">{{ row.sample }}</div> <div class="sample-text">{{ row.data.find(item =>item.ruleid === row.selectedRuleId).ruleexample}}</div>
<div class="sample-description" v-if="row.description"> <div class="sample-description" v-if="row.data.find(item =>item.ruleid === row.selectedRuleId) && row.data.find(item =>item.ruleid === row.selectedRuleId).remark">
{{ row.description }} {{ row.data.find(item =>item.ruleid === row.selectedRuleId).remark }}
</div> </div>
</div> </div>
</template> </template>
...@@ -85,6 +86,9 @@ ...@@ -85,6 +86,9 @@
import { ref, computed, watch, nextTick } from 'vue' import { ref, computed, watch, nextTick } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import {
querybyprojectid,
} from '@/api/discover/index'
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: Boolean, type: Boolean,
...@@ -107,165 +111,144 @@ const searchText = ref('') ...@@ -107,165 +111,144 @@ const searchText = ref('')
const tableRef = ref() const tableRef = ref()
const selectedRules = ref([]) const selectedRules = ref([])
const isSettingDefaults = ref(false)
// 规则数据(根据图片内容) // 规则数据(根据图片内容)
const rulesData = ref([ const rulesData = ref([
{ // {
id: 'mixed_data', // id: 'mixed_data',
domain: '混合数据域', // domain: '混合数据域',
options: [ // options: [
{ value: '566546', label: '566546' }, // { value: '566546', label: '566546' },
{ value: '345', label: '345' } // { value: '345', label: '345' }
], // ],
selectedRule: '566546', // selectedRule: '566546',
sample: '345', // sample: '345',
description: '按混合证件号字段查询' // description: '按混合证件号字段查询'
}, // },
{ // {
id: 'smart_data', // id: 'smart_data',
domain: '智能数据域', // domain: '智能数据域',
options: [ // options: [
{ value: 'option1', label: '请选择' }, // { value: 'option1', label: '请选择' },
{ value: 'option2', label: '智能规则1' }, // { value: 'option2', label: '智能规则1' },
{ value: 'option3', label: '智能规则2' } // { value: 'option3', label: '智能规则2' }
], // ],
selectedRule: 'option1', // selectedRule: 'option1',
sample: '', // sample: '',
description: '' // description: ''
}, // }
{
id: 'general_rule',
domain: '通用规则',
options: [
{ value: 'general1', label: '通用规则1' },
{ value: 'general2', label: '通用规则2' }
],
selectedRule: 'general1',
sample: '310000000100116, 9131000...',
description: '按混合证件号字段查询'
},
{
id: 'decrypt_data',
domain: '解密数据',
options: [
{ value: 'decrypt1', label: '解密规则1' },
{ value: 'decrypt2', label: '解密规则2' }
],
selectedRule: 'decrypt1',
sample: '',
description: ''
},
{
id: 'mixed_id',
domain: '混合证件号',
options: [
{ value: 'mixed_id1', label: '混合证件号规则1' },
{ value: 'mixed_id2', label: '混合证件号规则2' }
],
selectedRule: 'mixed_id1',
sample: '310000000100116, 9131000...',
description: '按混合证件号字段查询'
},
{
id: 'email',
domain: '电子邮件',
options: [
{ value: 'email1', label: '邮箱规则1' },
{ value: 'email2', label: '邮箱规则2' }
],
selectedRule: 'email1',
sample: '605396113@qq.com',
description: '按邮箱字段查找'
},
{
id: 'social_security',
domain: '社保卡号',
options: [
{ value: 'ss1', label: '社保规则1' },
{ value: 'ss2', label: '社保规则2' }
],
selectedRule: 'ss1',
sample: '11',
description: '按邮箱字段查找'
},
{
id: 'business_license',
domain: '营业执照',
options: [
{ value: 'bl1', label: '营业执照规则1' },
{ value: 'bl2', label: '营业执照规则2' }
],
selectedRule: 'bl1',
sample: '310000000100116, 9131000...',
description: '按营业执照字段查询'
},
{
id: 'postal_code',
domain: '邮政编码',
options: [
{ value: 'pc1', label: '邮编规则1' },
{ value: 'pc2', label: '邮编规则2' }
],
selectedRule: 'pc1',
sample: '321300, 322300, 316100',
description: '邮政编码字段查找'
},
{
id: 'chinese_address',
domain: '中文地址',
options: [
{ value: 'address1', label: '地址规则1' },
{ value: 'address2', label: '地址规则2' }
],
selectedRule: 'address1',
sample: '北京市朝阳区建国路93号万',
description: '中文地址字段查找'
}
]) ])
// 过滤后的规则列表 // 过滤后的规则列表
const filteredRules = computed(() => { const filteredRules = computed(() => {
if (!searchText.value) return rulesData.value if (!searchText.value) return rulesData.value
return rulesData.value.filter(rule => return rulesData.value.filter(item =>
rule.domain.toLowerCase().includes(searchText.value.toLowerCase()) || item.dataarea.dataarea.toLowerCase().includes(searchText.value.toLowerCase())
rule.sample.toLowerCase().includes(searchText.value.toLowerCase()) ||
rule.description.toLowerCase().includes(searchText.value.toLowerCase()) ||
rule.options.some(option =>
option.label.toLowerCase().includes(searchText.value.toLowerCase())
)
) )
}) })
// 检查行是否被选中 // 检查行是否被选中
const isRowSelected = (row) => { const isRowSelected = (row) => {
return selectedRules.value.some(selected => selected.id === row.id) return row.data.length > 0
// return selectedRules.value.some(selected => selected.id === row.id)
} }
// 处理选择变化 // 处理选择变化
const handleSelectionChange = (selection) => { const handleSelectionChange = (selection) => {
if(isSettingDefaults.value === true) return
console.log(selection)
selectedRules.value = selection selectedRules.value = selection
console.log('选择的规则:',selectedRules.value)
} }
// 初始化选中状态 // 初始化选中状态
const initSelectedRules = () => { const initSelectedRules = async () => {
console.log(123) try {
nextTick(() => { isSettingDefaults.value = true
if (tableRef.value) { rulesData.value = []
// 清除所有选择 const res = await querybyprojectid({dataarea: "",projectid: sessionStorage.getItem('projectId'),rulename: ""})
tableRef.value.clearSelection() rulesData.value = res.data.map(item =>(({
console.log('props.selectedTypes',props.selectedTypes) ...item,
// 设置初始选中 status:'part',
rulesData.value.forEach(rule => { selectedRuleId: item.data.length === 0 ? '' : item.data.length === 1 ? item.data[0].ruleid : ( item.data.findIndex(x => x.defaulttype === '1').ruleid || ''),
data: item.data.map(rule => (({
...rule,
value :rule.ruleid,
label: rule.name
})))
})))
if(props.selectedTypes.length > 0) {
nextTick(()=>{
console.log('props.selectedTypes',props.selectedTypes) console.log('props.selectedTypes',props.selectedTypes)
if (props.selectedTypes.includes(rule.id)) { console.log('rulesData.value',rulesData.value)
const row = rulesData.value.find(r => r.id === rule.id) tableRef.value.clearSelection();
if (row) { props.selectedTypes.forEach(rule => {
tableRef.value.toggleRowSelection(row, true) const targetRow = rulesData.value.find(r => r.selectedRuleId === rule.selectedRuleId);
if (targetRow) {
tableRef.value.toggleRowSelection(targetRow, true);
} }
});
selectedRules.value = [...props.selectedTypes];
});
} }
})
} finally {
isSettingDefaults.value = false;
} }
}) // nextTick(() => {
// if (tableRef.value) {
// // 清除所有选择
// tableRef.value.clearSelection()
// console.log('props.selectedTypes',props.selectedTypes)
// querybyprojectid({
// dataarea: "",
// projectid: sessionStorage.getItem('projectId'),
// rulename: ""
// }).then(res =>{
// rulesData.value = res.data.map(item =>(({
// ...item,
// status:'part',
// selectedRuleId: item.data.length === 0 ? '' : item.data.length === 1 ? item.data[0].ruleid : ( item.data.findIndex(x => x.defaulttype === '1').ruleid || ''),
// data: item.data.map(rule => (({
// ...rule,
// value :rule.ruleid,
// label: rule.name
// })))
// })))
// if(props.selectedTypes.length > 0){
// isSettingDefaults.value = true
// nextTick(()=>{
// tableRef.value.clearSelection()
// // tableRef.value.clearSelection()
// props.selectedTypes.forEach(rule => {
// tableRef.value.toggleRowSelection(rule, true)
// console.log('rule',rule)
// })
// isSettingDefaults.value = false
// selectedRules.value = [...props.selectedTypes]
// })
// // isSettingDefaults.value = false
// }
// })
} }
// })
// }
// 打开弹窗 // 打开弹窗
const openDialog = () => { const openDialog = () => {
...@@ -285,24 +268,16 @@ const handleCancel = () => { ...@@ -285,24 +268,16 @@ const handleCancel = () => {
// 确认选择 // 确认选择
const handleConfirm = () => { const handleConfirm = () => {
const validSelectedRules = selectedRules.value.filter(rule =>
rule.selectedRule && rule.selectedRule !== 'option1' // 排除"请选择"
)
if (validSelectedRules.length === 0) {
if (selectedRules.value.length === 0) {
ElMessage.warning('请至少选择一个有效规则') ElMessage.warning('请至少选择一个有效规则')
return return
} }
const result = validSelectedRules.map(rule => ({
id: rule.id,
domain: rule.domain,
ruleName: rule.selectedRule,
sample: rule.sample,
description: rule.description
}))
emit('confirm', result)
emit('confirm', selectedRules.value)
dialogVisible.value = false dialogVisible.value = false
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论