Commit 0edeea68 by wanglizhen

发现规则模块上传

parent 8e7087c8
// 发现方式
export const discoverTypeList = [
{
label: "字段",
value: "1",
},
{
label: "数据",
value: "2",
},
]
// 发现规则类型
export const singleDiscoverRuleType = [
{
label: "正则表达式",
value: "01",
},
{
label: "自定义方法",
value: "04",
},
{
label: "字典发现",
value: "03",
},
]
// 匹配方式
export const matchingList = [
{
value: "001", label: '等于'
},
{
value: "002", label: '包含'
},
{
value: "003", label: '左匹配'
},
{
value: "004", label: '右匹配'
},
]
\ No newline at end of file
...@@ -63,4 +63,57 @@ export function getDictinaryTypes(query) { ...@@ -63,4 +63,57 @@ export function getDictinaryTypes(query) {
method: 'get', method: 'get',
params: query params: query
}) })
}
/**
* 发现规则 - 增加规则
* @param {*} data
* @returns
*/
export function addRule(data) {
return request({
url: '/core/searchregex/add',
method: 'post',
data: data
})
}
/**
* 发现规则 - 删除规则
* @param {*} data
* @returns
*/
export function delRule(data) {
return request({
url: '/core/searchregex/del',
method: 'post',
data: data
})
}
/**
* 发现规则 - 设置默认规则
* @param {*} data
* @returns
*/
export function setdefault(data) {
return request({
url: '/core/searchregex/setdefault',
method: 'post',
data: data
})
}
/**
* 发现规则 - 设置测试
* @param {*} data
* @returns
*/
export function testRegex(data) {
return request({
url: '/core/searchregex/testRegex',
method: 'post',
data: data
})
} }
\ No newline at end of file
...@@ -26,17 +26,21 @@ const mainDeletion = (item) => { ...@@ -26,17 +26,21 @@ const mainDeletion = (item) => {
} }
// 子级监听 // 子级监听
const itemClick = (item) => { const itemClick = (item1, item2) => {
emit("change",item); const data = {
parentItem: item1,
item: item2
}
emit("change",data);
} }
// 默认项 // 默认项
const defaultClick = (item) => { const defaultClick = (item) => {
emit("default",item); emit("default",item);
} }
// 子删除 // 子删除
const childDelete = (item) => { const childDelete = (item) => {
emit("childDelete",item); emit("childDelete",item);
} }
</script> </script>
...@@ -58,11 +62,11 @@ const childDelete = (item) => { ...@@ -58,11 +62,11 @@ const childDelete = (item) => {
</span> </span>
<template #content> <template #content>
<div> <div>
<div class="rule__item" v-for="(itemTwo, i) in item.list" :key="i" @click="itemClick(itemTwo)"> <div class="rule__item" v-for="(itemTwo, i) in item.list" :key="i" @click="itemClick(item,itemTwo)">
<span>{{ itemTwo.name }}</span> <span>{{ itemTwo.name }}</span>
<div class="default"></div> <div class="default" v-if="itemTwo.defaulttype === '1'"></div>
<div class="rule__item__btns"> <div class="rule__item__btns">
<el-icon color="#2c9ef7" :size="15" v-if="itemTwo.isCheck" @click.stop="defaultClick(itemTwo)" style="margin-right: 8px;" > <el-icon color="#2c9ef7" :size="15" v-if="itemTwo.isCheck && itemTwo.defaulttype !== '1'" @click.stop="defaultClick(itemTwo)" style="margin-right: 8px;" >
<circle-check /> <circle-check />
</el-icon> </el-icon>
<el-icon color="rgb(13, 215, 141)" :size="15" v-if="itemTwo.isDelete" @click.stop="childDelete(itemTwo)"> <el-icon color="rgb(13, 215, 141)" :size="15" v-if="itemTwo.isDelete" @click.stop="childDelete(itemTwo)">
......
...@@ -7,18 +7,17 @@ import AddDomain from './modules/AddDomain.vue' // 数据域表单 ...@@ -7,18 +7,17 @@ import AddDomain from './modules/AddDomain.vue' // 数据域表单
import AddRules from './modules/AddRules.vue' // 发现规则表单 import AddRules from './modules/AddRules.vue' // 发现规则表单
import ModalPop from "@/components/EditPop/ModalPop.vue" import ModalPop from "@/components/EditPop/ModalPop.vue"
import { query, getDictinaryTypes, delDataArea } from '@/api/ruleConfig/discover' import { query, delDataArea, delRule, setdefault } from '@/api/ruleConfig/discover'
const splitNum = ref(0.31) // 左右分割比例 const splitNum = ref(0.31) // 左右分割比例
const collapseList = ref([]) // 数据域数据 const collapseList = ref([]) // 数据域数据
const dictinaryTypeList = ref([]) // 字典分类数据
const data = reactive({ const data = reactive({
domainForm: { domainForm: {
}, },
rulesForm: { rulesForm: {
}, },
queryParams: { queryParams: {
areaType: "0", areaType: "0",
...@@ -66,8 +65,9 @@ const getCollapse = () => { ...@@ -66,8 +65,9 @@ const getCollapse = () => {
isDelete: true, isDelete: true,
} }
}) })
if(collapseList.value.length < 0) return if (collapseList.value.length < 0) return
domainForm.value = collapseList.value[0] domainForm.value = collapseList.value[0]
rightType.value = 'domain'
}) })
} }
...@@ -85,8 +85,13 @@ const addDomainClick = () => { ...@@ -85,8 +85,13 @@ const addDomainClick = () => {
} }
// 新增发现规则 // 新增发现规则
const collapseAdd = () => { const collapseAdd = (item) => {
console.log('新增发现规则') console.log('新增发现规则', item)
const { id, dataarea } = item
rulesForm.value = {
dataarea_id: id,
type: dataarea
}
modalPopData.title = '新增发现规则' modalPopData.title = '新增发现规则'
modalPopData.type = 'rules' modalPopData.type = 'rules'
modalPopData.show = true modalPopData.show = true
...@@ -95,6 +100,7 @@ const collapseAdd = () => { ...@@ -95,6 +100,7 @@ const collapseAdd = () => {
// 删除发现规则 // 删除发现规则
const collapseDelete = (item) => { const collapseDelete = (item) => {
console.log('删除发现规则', item) console.log('删除发现规则', item)
delData.value = item
modalData.type = 'rules' modalData.type = 'rules'
modalData.cancel = true modalData.cancel = true
modalData.icon = 'error' modalData.icon = 'error'
...@@ -132,8 +138,35 @@ const modalConfirm = () => { ...@@ -132,8 +138,35 @@ const modalConfirm = () => {
}) })
} else if (modalData.type === 'rules') { } else if (modalData.type === 'rules') {
console.log('删除发现规则确认') console.log('删除发现规则确认')
const data = {
ruleid: delData.value.ruleid,
rulename: delData.value.name,
tid: delData.value.tid
}
delRule(data).then(res => {
const { flag } = res
if (flag) {
ElMessage.success('删除成功')
getCollapse()
} else {
ElMessage.error('删除失败')
}
})
} else if (modalData.type === 'default') { } else if (modalData.type === 'default') {
console.log('设置默认项') console.log('设置默认项')
const data = {
ruleid: delData.value.ruleid,
rulename: delData.value.name,
}
setdefault(data).then(res => {
const { flag } = res
if (flag) {
ElMessage.success('设置成功')
getCollapse()
} else {
ElMessage.error('设置失败')
}
})
} }
modalData.show = false modalData.show = false
} }
...@@ -146,12 +179,20 @@ const viewClick = (item) => { ...@@ -146,12 +179,20 @@ const viewClick = (item) => {
// 规则点击监听 // 规则点击监听
const collapseChange = (item) => { const collapseChange = (item) => {
rulesForm.value = item const { id, dataarea } = item.parentItem
rulesForm.value = {
...item.item,
...{
dataarea_id: id,
type: dataarea
}
}
rightType.value = 'rules' rightType.value = 'rules'
} }
// 发现规则设置默认项 // 发现规则设置默认项
const collapseDefault = (item) => { const collapseDefault = (item) => {
delData.value = item
modalData.type = 'default' modalData.type = 'default'
modalData.cancel = false modalData.cancel = false
modalData.icon = 'error' modalData.icon = 'error'
...@@ -166,20 +207,13 @@ const AddFormConfirm = (item) => { ...@@ -166,20 +207,13 @@ const AddFormConfirm = (item) => {
getCollapse() getCollapse()
} else if (modalPopData.type === 'rules') { } else if (modalPopData.type === 'rules') {
console.log('新增发现规则确认', item) console.log('新增发现规则确认', item)
getCollapse()
} }
modalPopData.show = false modalPopData.show = false
} }
const getDictionaryTypesFunc = () => {
getDictinaryTypes({}).then(res => {
const { data } = res
dictinaryTypeList.value = data
})
}
onMounted(() => { onMounted(() => {
getCollapse() getCollapse()
getDictionaryTypesFunc()
}) })
</script> </script>
...@@ -193,8 +227,10 @@ onMounted(() => { ...@@ -193,8 +227,10 @@ onMounted(() => {
<div class="app-container__body"> <div class="app-container__body">
<Split v-model="splitNum"> <Split v-model="splitNum">
<template #left> <template #left>
<div class="demo-split-pane" style="padding: 0 0 10px 0;width: 100%;overflow: auto;height: 100%;display: flex;flex-direction: column;"> <div class="demo-split-pane"
<div class="mb20" style="padding-right: 38px;display: flex;align-items: center;justify-content: space-between;"> style="padding: 0 0 10px 0;width: 100%;overflow: auto;height: 100%;display: flex;flex-direction: column;">
<div class="mb20"
style="padding-right: 38px;display: flex;align-items: center;justify-content: space-between;">
<el-input class="mr20" v-model="queryParams.rulename" placeholder="数据域名称搜索"> <el-input class="mr20" v-model="queryParams.rulename" placeholder="数据域名称搜索">
<template #suffix> <template #suffix>
<el-icon style="vertical-align: middle;cursor: pointer;" @click="getCollapse"> <el-icon style="vertical-align: middle;cursor: pointer;" @click="getCollapse">
...@@ -237,7 +273,7 @@ onMounted(() => { ...@@ -237,7 +273,7 @@ onMounted(() => {
<template #content> <template #content>
<AddDomain type="add" @cancel="modalPopCancel" @confirm="AddFormConfirm" <AddDomain type="add" @cancel="modalPopCancel" @confirm="AddFormConfirm"
v-if="modalPopData.type === 'domain'" /> v-if="modalPopData.type === 'domain'" />
<AddRules type="add" @cancel="modalPopCancel" @confirm="AddFormConfirm" <AddRules type="add" :itemData="rulesForm" @cancel="modalPopCancel" @confirm="AddFormConfirm"
v-if="modalPopData.type === 'rules'" /> v-if="modalPopData.type === 'rules'" />
</template> </template>
</ModalPop> </ModalPop>
......
...@@ -27,7 +27,6 @@ const data = reactive({ ...@@ -27,7 +27,6 @@ const data = reactive({
}); });
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
const readOnly = ref(true); const readOnly = ref(true);
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
...@@ -91,10 +90,7 @@ const addDataAreaFun = () => { ...@@ -91,10 +90,7 @@ const addDataAreaFun = () => {
addDataArea({tCoreDataArea: tCoreDataArea}).then(res => { addDataArea({tCoreDataArea: tCoreDataArea}).then(res => {
const { flag } = res const { flag } = res
if (flag) { if (flag) {
ElMessage.success({ ElMessage.success(props.type === "add" ? "新增成功" : "修改成功");
message: props.type === 'add' ? '新增成功' : '修改成功',
type: 'success',
})
if (props.type === 'edit') { if (props.type === 'edit') {
readOnly.value = true readOnly.value = true
} }
......
<script setup lang="ts" name="AddRules"> <script setup lang="ts" name="AddRules">
import { onMounted, reactive, ref, toRefs, watch } from "vue"; import { onMounted, reactive, ref, toRefs, watch } from "vue";
import { Switch } from "view-ui-plus"; import { Switch } from "view-ui-plus";
import type { FormInstance } from "element-plus";
import { ElMessage } from "element-plus";
import { getDictinaryTypes } from "@/api/ruleConfig/discover";
import { addRule, testRegex } from "@/api/ruleConfig/discover";
import {
discoverTypeList,
singleDiscoverRuleType,
matchingList,
} from "@/api/ruleConfig/dict/discover";
const props = defineProps<{ const props = defineProps<{
modelValue: boolean; itemData?: Object;
type: string; type: string;
}>(); }>();
const emit = defineEmits(["update:modelValue", "cancel", "confirm"]); const emit = defineEmits(["cancel", "confirm"]);
const subRuleidList = ref([])
const data = reactive({ const data = reactive({
rules: {}, form: <any>{
dataarea_id: "",
id: "",
name: "",
type: "",
flag: "",
discoverway: "01",
regex: "",
icon: "",
ruleexample: "",
ruleargument: "",
rulegroupname: "",
dictionaryClass: "",
matchingway: "",
defaulttype: "0",
remark: "",
testString: ""
},
rules: {
name: [
{
required: true,
message: "请输入发现规则名称",
trigger: ["blur"],
},
],
flag: [
{
required: true,
message: "请选择发现方式",
trigger: ["change"],
},
],
dictionaryClass: [
{
required: true,
message: "请选择字典分类",
trigger: ["change"],
},
],
matchingway: [
{
required: true,
message: "请输入数据域名称",
trigger: ["change"],
},
],
ruleexample: [
{
required: true,
message: "请输入样例",
trigger: ["blur"],
},
],
},
}); });
const { rules } = toRefs(data); const { form, rules } = toRefs(data);
const readOnly = ref(true); const readOnly = ref(true);
const radio = ref(1); const dictinaryTypeList = ref([]); // 字典分类列表
const radioOptions = ref([ const formRef = ref<FormInstance>();
{ const modalData = reactive({
label: "正则表达式", show: false,
value: 1, text: "",
}, icon: "",
{ type: "",
label: "自定义方法", });
value: 2,
},
{
label: "字典发现",
value: 3,
},
]);
watch( watch(
() => props.type, () => [props.type, props.itemData],
(newVal) => { (newVal) => {
readOnly.value = props.type === "edit" ? true : false; readOnly.value = props.type === "edit" ? true : false;
if (props.itemData) {
const data = JSON.parse(JSON.stringify(props.itemData));
form.value = { ...form.value, ...data };
}
}, },
{ deep: true, immediate: true } { deep: true, immediate: true }
); );
// 取消 // 取消
const cancel = () => { const cancel = () => {
if (props.type === "edit") { if (props.type === "edit") {
...@@ -49,74 +111,179 @@ const cancel = () => { ...@@ -49,74 +111,179 @@ const cancel = () => {
}; };
const confirm = () => { const confirm = () => {
formRef.value?.validate((valid) => {
if (valid) {
addDataFun();
} else {
}
});
};
// 添加规则
const addDataFun = () => {
const searchRegex = {
searchRegex: form.value,
subRuleidList: subRuleidList.value,
};
if (props.type === "edit") { if (props.type === "edit") {
readOnly.value = true; searchRegex.searchRegex = {
...searchRegex.searchRegex,
...{ id: form.value.ruleid },
};
} }
emit("confirm"); addRule(searchRegex).then((res) => {
const { flag } = res;
if (flag) {
ElMessage.success(props.type === "add" ? "新增成功" : "修改成功");
if (props.type === "edit") {
readOnly.value = true;
} else if (props.type === "add") {
form.value = {
dataarea_id: "",
id: "",
name: "",
type: "",
flag: "",
discoverway: "01",
regex: "",
icon: "",
ruleexample: "",
ruleargument: "",
rulegroupname: "",
dictionaryClass: "",
matchingway: "",
defaulttype: "0",
remark: "",
testString: ""
};
}
emit("confirm");
}
});
};
// 字典分类
const getDictionaryTypesFunc = () => {
getDictinaryTypes({}).then((res) => {
const { data } = res;
dictinaryTypeList.value = data;
});
}; };
// 规则测试
const testRegexFun = () => {
const { dictionaryClass, discoverway, matchingway, regex, testString } = form.value;
const data = {
dictionaryClass: dictionaryClass,
discoverway: discoverway,
matchingway: matchingway,
regex: regex,
subRuleidList: subRuleidList.value,
testString: testString,
};
formRef.value?.validate((valid) => {
if (valid) {
testRegex(data).then((res) => {
const { flag, msg } = res;
if (flag) {
modalData.icon = "success";
modalData.text = "恭喜您,测试通过!";
modalData.show = true;
} else {
modalData.icon = "error";
modalData.text = msg;
modalData.show = true;
}
})
} else {
}
});
};
// 成功回调
const modalConfirm = () => {
modalData.type = "";
modalData.show = false;
};
// 关闭回调
const modalCancel = () => {
modalData.type = "";
modalData.show = false;
};
onMounted(() => {
getDictionaryTypesFunc();
});
</script> </script>
<template> <template>
<div> <div>
<el-form ref="formRef" :model="modelValue" label-width="110px" :disabled="readOnly"> <el-form ref="formRef" :model="form" :rules="rules" label-width="110px" :disabled="readOnly">
<el-form-item label="发现规则名" required> <el-form-item label="发现规则名" prop="name" required>
<el-input v-model="modelValue.name" :placeholder="!readOnly ? '请输入发现规则名' : ''"></el-input> <el-input v-model="form.name" :placeholder="!readOnly ? '请输入发现规则名' : ''"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数据域"> <el-form-item label="数据域">
<div>{{ modelValue.name }}</div> <div>{{ form.type }}</div>
</el-form-item> </el-form-item>
<el-form-item label="发现方式" required> <el-form-item label="发现方式" prop="flag" required>
<div style="width: 100%;background: #F3F5FA;"> <div style="width: 100%;background: #F3F5FA;">
<el-input v-model="modelValue.name" v-if="readOnly"></el-input> <el-select v-model="form.flag">
<el-select v-model="modelValue.name" v-if="!readOnly"> <el-option v-for="item in discoverTypeList" :key="item.value" :label="item.label" :value="item.value">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="发现规则类型"> <el-form-item label="发现规则类型">
<el-radio-group v-model="radio"> <el-radio-group v-model="form.discoverway" v-if="!readOnly">
<el-radio :label="item.value" v-for="(item,index) in radioOptions" :key="index">{{ item.label }}</el-radio> <el-radio :label="item.value"
v-for="(item,index) in form.flag !== '1' ? singleDiscoverRuleType : singleDiscoverRuleType.slice(0,1)"
:key="index">{{ item.label }}</el-radio>
</el-radio-group>
<el-radio-group v-model="form.discoverway" v-if="readOnly">
<el-radio :label="item.value"
v-for="(item,index) in singleDiscoverRuleType.filter(f => f.value=== form.discoverway)"
:key="index">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="正则表达式" required v-if="radio === 1"> <el-form-item label="正则表达式" prop="regex" required
<el-input v-model="modelValue.name" :placeholder="!readOnly ? '请输入正则表达式' : ''"></el-input> :rules="[{ required: true, message: '请输入正则表达式', trigger:'blur' }]" v-if="form.discoverway === '01'">
<el-input v-model="form.regex" :placeholder="!readOnly ? '请输入正则表达式' : ''"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="JAVA方法" required v-if="radio === 2"> <el-form-item label="JAVA方法" prop="regex" required
<el-input v-model="modelValue.name" :placeholder="!readOnly ? '请输入JAVA方法' : ''"></el-input> :rules="[{ required: true, message: '请输入JAVA方法', trigger:'blur' }]" v-if="form.discoverway === '04'">
<el-input v-model="form.regex" :placeholder="!readOnly ? '请输入JAVA方法' : ''"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="字典分类" required v-if="radio === 3"> <el-form-item label="字典分类" prop="dictionaryClass" required v-if="form.discoverway === '03'">
<div style="width: 100%;background: #F3F5FA;"> <div style="width: 100%;background: #F3F5FA;">
<el-input v-model="modelValue.name" v-if="readOnly"></el-input> <el-select v-model="form.dictionaryClass">
<el-select v-model="modelValue.name" v-if="!readOnly"> <el-option v-for="item in dictinaryTypeList" :key="item.value" :label="item.text" :value="item.value">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="匹配方式" required v-if="radio === 3"> <el-form-item label="匹配方式" prop="matchingway" required v-if="form.discoverway === '03'">
<div style="width: 100%;background: #F3F5FA;"> <div style="width: 100%;background: #F3F5FA;">
<el-input v-model="modelValue.name" v-if="readOnly"></el-input> <el-select v-model="form.matchingway">
<el-select v-model="modelValue.name" v-if="!readOnly"> <el-option v-for="item in matchingList" :key="item.value" :label="item.label" :value="item.value">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="样例" required> <el-form-item label="样例" prop="ruleexample" required>
<el-input v-model="modelValue.name" :placeholder="!readOnly ? '请输入样例' : ''"></el-input> <el-input v-model="form.ruleexample" :placeholder="!readOnly ? '请输入样例' : ''"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="测试"> <el-form-item label="测试">
<div style="width: 100%;display: flex;align-items: center;"> <div style="width: 100%;display: flex;align-items: center;">
<el-input v-model="modelValue.name" style="flex: 1;" :placeholder="!readOnly ? '请输入测试' : ''"></el-input> <el-input v-model="form.testString" style="flex: 1;" :placeholder="!readOnly ? '请输入测试' : ''"></el-input>
<el-button type="primary">测试</el-button> <el-button type="primary" @click="testRegexFun">测试</el-button>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="备注"> <el-form-item label="备注">
<el-input v-model="modelValue.name" :placeholder="!readOnly ? '请输入备注' : ''"></el-input> <el-input v-model="form.remark" :placeholder="!readOnly ? '请输入备注' : ''"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="默认规则"> <el-form-item label="默认规则">
<Switch :disabled="readOnly"> <Switch true-value="1" false-value="0" v-model="form.defaulttype" :disabled="readOnly">
<template #open> <template #open>
<span></span> <span></span>
</template> </template>
...@@ -131,6 +298,9 @@ const confirm = () => { ...@@ -131,6 +298,9 @@ const confirm = () => {
<el-button type="info" style="width: 150px;" @click="cancel" v-if="!readOnly">取消</el-button> <el-button type="info" style="width: 150px;" @click="cancel" v-if="!readOnly">取消</el-button>
<el-button type="primary" style="width: 150px;" @click="confirm" v-if="!readOnly">确认</el-button> <el-button type="primary" style="width: 150px;" @click="confirm" v-if="!readOnly">确认</el-button>
</div> </div>
<Modal v-model="modalData.show" :icon="modalData.icon" :cancel="false" :text="modalData.text"
@confirm="modalConfirm" @cancel="modalCancel" />
</div> </div>
</template> </template>
...@@ -143,4 +313,9 @@ const confirm = () => { ...@@ -143,4 +313,9 @@ const confirm = () => {
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
:deep(.el-form-item__error) {
left: auto;
right: 30px;
top: 24%;
}
</style> </style>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论