Commit 6bc00674 by ningjihai

发现梳理新增和编辑

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