wangqiujuan0808 2023-12-25 23:44:47 +08:00
parent 18756324e0
commit 9d95569c3d
9 changed files with 882 additions and 3 deletions

View File

@ -130,5 +130,29 @@ const infoApi = {
delSc(params) {
return deleteRequest("/sb", params);
},
//
getRules(params) {
return getRequest('/rule', params);
},
//
addRules(params) {
return postJsonRequest('/rule', params)
},
//
editRule(params) {
return putRequest('/rule', params)
},
//
delRules(params) {
return deleteRequest('/rule', params)
},
//
startStatus(params) {
return postJsonRequest('/enable', params);
},
//
stopStatus(params) {
return postJsonRequest('/disable', params);
},
};
export default infoApi;

161
src/components/AddRule.vue Normal file
View File

@ -0,0 +1,161 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'I' ? '新增规则': '编辑规则'"
width="30%"
:before-close="closeDialog"
>
<el-form
:model="addForm"
label-width="100px"
:rules="rules"
ref="ruleFormRef"
>
<el-form-item label="规则标题:" prop="name">
<el-input
v-model="addForm.name"
placeholder="请输入规则标题"
clearable
:disabled="type === 'I' ? false: true"
/>
</el-form-item>
<el-form-item label="规则描述:" prop="description">
<el-input
v-model="addForm.description"
placeholder="请输入规则描述"
clearable
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeDialog"></el-button>
<el-button type="primary" @click="saveFormData"> </el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { onMounted, reactive, ref, toRefs, computed, nextTick } from "vue";
import infoApi from "@/api/infoApi.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { rule_info, response} from '../proto/data/pd'
export default {
props: ["formData", "dialogVisible", "type"],
emits: ["dialogClose", "dialogSuccess"],
setup(props, ctx) {
const ruleFormRef = ref(null);
const state = reactive({
addForm: {},
rules: {
name: [
{ required: true, message: "请输入规则标题", trigger: "blur" }
],
description: [
{ required: true, message: "请输入规则描述", trigger: "blur" }
]
},
});
const visible = computed(() => {
return props.dialogVisible;
});
const type = computed(() => {
return props.type;
});
onMounted(() => {
// state.addForm = props.formData;
});
const closeDialog = () => {
ctx.emit("dialogClose");
};
const importData = () => {};
const exoportData = () => {};
const saveFormData = () => {
ruleFormRef.value.validate(async (valid) => {
if (valid) {
const req_databuf = rule_info.encode(state.addForm).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = props.type === 'I' ? await infoApi.addRules(req_data) : await infoApi.editRule(req_data);
console.log(555, res)
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
//
console.log(new TextDecoder().decode(ret.data));
ElMessage.success(new TextDecoder().decode(ret.data) || "请求成功");
//
ctx.emit("dialogSuccess");
} else {
console.log(res);
}
} else {
console.log("error submit!");
}
});
};
return {
...toRefs(state),
visible,
type,
closeDialog,
importData,
exoportData,
saveFormData,
ruleFormRef
};
},
};
</script>
<style lang="scss" scoped>
.title-div {
height: 40px;
line-height: 40px;
display: flex;
> div {
width: 15%;
span {
margin-right: 10px;
}
}
}
.tree-div {
height: 780px;
display: flex;
justify-content: space-between;
.tree {
width: 20%;
border: 1px solid #f2f2f2;
height: 100%;
padding: 10px;
}
.table {
height: 100%;
width: 79%;
display: flex;
flex-direction: column;
justify-content: space-between;
.point-table {
border: 1px solid #f2f2f2;
padding: 10px;
}
.propertie-table {
padding: 10px;
border: 1px solid #f2f2f2;
}
}
.custom-tree-node {
display: flex;
justify-content: space-between;
width: 100%;
.add-icon {
padding-right: 15px;
}
}
}
</style>

View File

@ -63,6 +63,13 @@ export default {
iconName: 'Management',
children: [],
},
{
id: 2,
name: "规则引擎",
index: "/rules",
iconName: 'Management',
children: [],
},
// {
// id: 4,
// name: "",

View File

@ -4809,6 +4809,480 @@ export const response = $root.response = (() => {
return response;
})();
export const rule = $root.rule = (() => {
/**
* Properties of a rule.
* @exports Irule
* @interface Irule
* @property {Array.<Irule_info>|null} [rule] rule rule
*/
/**
* Constructs a new rule.
* @exports rule
* @classdesc Represents a rule.
* @implements Irule
* @constructor
* @param {Irule=} [properties] Properties to set
*/
function rule(properties) {
this.rule = [];
if (properties)
for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* rule rule.
* @member {Array.<Irule_info>} rule
* @memberof rule
* @instance
*/
rule.prototype.rule = $util.emptyArray;
/**
* Creates a new rule instance using the specified properties.
* @function create
* @memberof rule
* @static
* @param {Irule=} [properties] Properties to set
* @returns {rule} rule instance
*/
rule.create = function create(properties) {
return new rule(properties);
};
/**
* Encodes the specified rule message. Does not implicitly {@link rule.verify|verify} messages.
* @function encode
* @memberof rule
* @static
* @param {Irule} message rule message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
rule.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.rule != null && message.rule.length)
for (let i = 0; i < message.rule.length; ++i)
$root.rule_info.encode(message.rule[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
return writer;
};
/**
* Encodes the specified rule message, length delimited. Does not implicitly {@link rule.verify|verify} messages.
* @function encodeDelimited
* @memberof rule
* @static
* @param {Irule} message rule message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
rule.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a rule message from the specified reader or buffer.
* @function decode
* @memberof rule
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {rule} rule
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
rule.decode = function decode(reader, length) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
let end = length === undefined ? reader.len : reader.pos + length, message = new $root.rule();
while (reader.pos < end) {
let tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (!(message.rule && message.rule.length))
message.rule = [];
message.rule.push($root.rule_info.decode(reader, reader.uint32()));
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a rule message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof rule
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {rule} rule
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
rule.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a rule message.
* @function verify
* @memberof rule
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
rule.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
if (message.rule != null && message.hasOwnProperty("rule")) {
if (!Array.isArray(message.rule))
return "rule: array expected";
for (let i = 0; i < message.rule.length; ++i) {
let error = $root.rule_info.verify(message.rule[i]);
if (error)
return "rule." + error;
}
}
return null;
};
/**
* Creates a rule message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof rule
* @static
* @param {Object.<string,*>} object Plain object
* @returns {rule} rule
*/
rule.fromObject = function fromObject(object) {
if (object instanceof $root.rule)
return object;
let message = new $root.rule();
if (object.rule) {
if (!Array.isArray(object.rule))
throw TypeError(".rule.rule: array expected");
message.rule = [];
for (let i = 0; i < object.rule.length; ++i) {
if (typeof object.rule[i] !== "object")
throw TypeError(".rule.rule: object expected");
message.rule[i] = $root.rule_info.fromObject(object.rule[i]);
}
}
return message;
};
/**
* Creates a plain object from a rule message. Also converts values to other types if specified.
* @function toObject
* @memberof rule
* @static
* @param {rule} message rule
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
rule.toObject = function toObject(message, options) {
if (!options)
options = {};
let object = {};
if (options.arrays || options.defaults)
object.rule = [];
if (message.rule && message.rule.length) {
object.rule = [];
for (let j = 0; j < message.rule.length; ++j)
object.rule[j] = $root.rule_info.toObject(message.rule[j], options);
}
return object;
};
/**
* Converts this rule to JSON.
* @function toJSON
* @memberof rule
* @instance
* @returns {Object.<string,*>} JSON object
*/
rule.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for rule
* @function getTypeUrl
* @memberof rule
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
rule.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/rule";
};
return rule;
})();
export const rule_info = $root.rule_info = (() => {
/**
* Properties of a rule_info.
* @exports Irule_info
* @interface Irule_info
* @property {string|null} [id] rule_info id
* @property {string|null} [label] rule_info label
* @property {boolean|null} [disabled] rule_info disabled
*/
/**
* Constructs a new rule_info.
* @exports rule_info
* @classdesc Represents a rule_info.
* @implements Irule_info
* @constructor
* @param {Irule_info=} [properties] Properties to set
*/
function rule_info(properties) {
if (properties)
for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* rule_info id.
* @member {string} id
* @memberof rule_info
* @instance
*/
rule_info.prototype.id = "";
/**
* rule_info label.
* @member {string} label
* @memberof rule_info
* @instance
*/
rule_info.prototype.label = "";
/**
* rule_info disabled.
* @member {boolean} disabled
* @memberof rule_info
* @instance
*/
rule_info.prototype.disabled = false;
/**
* Creates a new rule_info instance using the specified properties.
* @function create
* @memberof rule_info
* @static
* @param {Irule_info=} [properties] Properties to set
* @returns {rule_info} rule_info instance
*/
rule_info.create = function create(properties) {
return new rule_info(properties);
};
/**
* Encodes the specified rule_info message. Does not implicitly {@link rule_info.verify|verify} messages.
* @function encode
* @memberof rule_info
* @static
* @param {Irule_info} message rule_info message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
rule_info.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.id != null && Object.hasOwnProperty.call(message, "id"))
writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
if (message.label != null && Object.hasOwnProperty.call(message, "label"))
writer.uint32(/* id 2, wireType 2 =*/18).string(message.label);
if (message.disabled != null && Object.hasOwnProperty.call(message, "disabled"))
writer.uint32(/* id 3, wireType 0 =*/24).bool(message.disabled);
return writer;
};
/**
* Encodes the specified rule_info message, length delimited. Does not implicitly {@link rule_info.verify|verify} messages.
* @function encodeDelimited
* @memberof rule_info
* @static
* @param {Irule_info} message rule_info message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
rule_info.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a rule_info message from the specified reader or buffer.
* @function decode
* @memberof rule_info
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {rule_info} rule_info
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
rule_info.decode = function decode(reader, length) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
let end = length === undefined ? reader.len : reader.pos + length, message = new $root.rule_info();
while (reader.pos < end) {
let tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
message.id = reader.string();
break;
}
case 2: {
message.label = reader.string();
break;
}
case 3: {
message.disabled = reader.bool();
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a rule_info message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof rule_info
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {rule_info} rule_info
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
rule_info.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a rule_info message.
* @function verify
* @memberof rule_info
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
rule_info.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
if (message.id != null && message.hasOwnProperty("id"))
if (!$util.isString(message.id))
return "id: string expected";
if (message.label != null && message.hasOwnProperty("label"))
if (!$util.isString(message.label))
return "label: string expected";
if (message.disabled != null && message.hasOwnProperty("disabled"))
if (typeof message.disabled !== "boolean")
return "disabled: boolean expected";
return null;
};
/**
* Creates a rule_info message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof rule_info
* @static
* @param {Object.<string,*>} object Plain object
* @returns {rule_info} rule_info
*/
rule_info.fromObject = function fromObject(object) {
if (object instanceof $root.rule_info)
return object;
let message = new $root.rule_info();
if (object.id != null)
message.id = String(object.id);
if (object.label != null)
message.label = String(object.label);
if (object.disabled != null)
message.disabled = Boolean(object.disabled);
return message;
};
/**
* Creates a plain object from a rule_info message. Also converts values to other types if specified.
* @function toObject
* @memberof rule_info
* @static
* @param {rule_info} message rule_info
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
rule_info.toObject = function toObject(message, options) {
if (!options)
options = {};
let object = {};
if (options.defaults) {
object.id = "";
object.label = "";
object.disabled = false;
}
if (message.id != null && message.hasOwnProperty("id"))
object.id = message.id;
if (message.label != null && message.hasOwnProperty("label"))
object.label = message.label;
if (message.disabled != null && message.hasOwnProperty("disabled"))
object.disabled = message.disabled;
return object;
};
/**
* Converts this rule_info to JSON.
* @function toJSON
* @memberof rule_info
* @instance
* @returns {Object.<string,*>} JSON object
*/
rule_info.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for rule_info
* @function getTypeUrl
* @memberof rule_info
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
rule_info.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/rule_info";
};
return rule_info;
})();
export const sb_list = $root.sb_list = (() => {
/**

12
src/proto/rule.proto Normal file
View File

@ -0,0 +1,12 @@
syntax = "proto3";
option go_package = "data/";
message rule{
repeated rule_info rule = 1;
}
message rule_info{
string id = 1;
string label = 2;
bool disabled = 3;
}

View File

@ -46,6 +46,11 @@ const router = createRouter({
path: '/transparent',
name: 'transparent',
component: () => import('../views/Transparent.vue')
},
{
path: '/rules',
name: 'rules',
component: () => import('../views/Rules.vue')
}
]
})

View File

@ -35,5 +35,6 @@ export const pathMap = {
page: '通讯管理',
data: '实时数据',
report: '上报管理',
transparent: '透传管理'
transparent: '透传管理',
rules: '规则引擎'
}

195
src/views/Rules.vue Normal file
View File

@ -0,0 +1,195 @@
<template>
<el-card class="content-div">
<div class="all-content">
<div class="top-div">
<el-button type="primary" @click="addData"></el-button>
</div>
<el-table
:data="tableData"
height="730"
style="width: 100%"
border
stripe
:header-cell-style="{ background: '#F6F7FC' }"
>
<el-table-column type="index" label="序号" width="80" align="center" />
<el-table-column
prop="title"
label="标题"
width="200"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="description"
label="描述"
width="200"
align="center"
show-overflow-tooltip
/>
<el-table-column label="规则管理" align="center" show-overflow-tooltip>
<template #default="scope">
<el-button type="primary" @click="editData(scope.row)">
编辑
</el-button>
<el-button type="danger" @click="delData(scope.row)">
删除
</el-button>
<el-switch
v-model="scope.row.enable"
inline-prompt
active-text="启用"
inactive-text="停用"
:active-value="false"
:inactive-value="true"
active-color="#13ce66"
inactive-color="red"
@change="changeStatus(scope.row)"
/>
<el-button type="danger" @click="setData(scope.row)">
设计
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<AddRule
:type="type"
:formData="formData"
:dialogVisible="dialogVisible"
v-if="dialogVisible"
@dialogClose="dialogClose"
@dialogSuccess="dialogSuccess"
>
</AddRule>
</el-card>
</template>
<script>
import { onMounted, reactive, ref, toRefs } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import infoApi from "@/api/infoApi.js";
import { response, rule_info } from '../proto/data/pd'
import AddRule from "@/components/AddRule.vue";
export default {
name: "rules",
components: {
AddRule
},
setup() {
const state = reactive({
tableData: [],
formData: {
title: '',
description: ''
},
dialogVisible: false,
type: 'I'
});
onMounted(() => {
getTableData();
});
//
const getTableData = async () => {
const res = await infoApi.getRules();
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
//
state.tableData = rule_info.decode(ret.data);
console.log(rule_info.decode(ret.data));
} else {
console.log(res);
}
};
//
const editData = (item) => {
state.dialogVisible = true;
state.type = 'U';
state.formData = JSON.parse(JSON.stringify(item));
};
//
const delData = (item) => {
ElMessageBox.confirm("确定删除该数据?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
const req_databuf = rule_info.encode({
id: item.id,
}).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = await infoApi.delRules(req_data);
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
ElMessage.success(res.msg || "请求成功");
getTableData();
} else {
ElMessage.error(res.msg);
}
})
.catch(() => {
ElMessage.info("已取消删除");
});
};
//
const addData = () => {
state.dialogVisible = true;
//
state.formData = {
title: '',
description: ''
}
state.type = 'I';
};
//
const changeStatus = async (item) => {
const req_databuf = rule_info.encode({
id: item.id,
}).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = item.enable==='启动' ? await infoApi.startStatus(req_data) : await infoApi.stopStatus(req_data);
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
ElMessage.success(res.msg || "更新成功");
getTableData();
} else {
ElMessage.error(res.msg);
}
};
const dialogClose = () => {
state.dialogVisible = false;
};
const dialogSuccess = () => {
state.dialogVisible = false;
getTableData();
};
return {
...toRefs(state),
editData,
delData,
getTableData,
addData,
dialogSuccess,
dialogClose
};
},
};
</script>
<style lang="scss" scoped>
.all-content {
display: flex;
flex-direction: column;
}
.top-div {
display: flex;
justify-content: flex-end;
}
</style>

View File

@ -24,9 +24,9 @@ export default ({ mode }) => defineConfig({
server: {
proxy: {
'/api': {
// target: 'http://192.168.1.123:8866',
target: 'http://api.shikicc.com:58909',
// target: 'http://10.10.14.123',
target: 'https://cdcmapi.shikicc.com',
// target: 'https://cdcmapi.shikicc.com',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '/api')
}