2025-05-21 15:29:38 +08:00

522 lines
19 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container-flex">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="策略名称" prop="strategyName">
<el-input
v-model="queryParams.strategyName"
placeholder="请输入策略名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="策略类型" prop="strategyType">
<el-select v-model="queryParams.strategyType" placeholder="请选择策略类型" clearable>
<el-option
v-for="dict in dict.type.gateway_strategy_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="策略状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择策略状态" clearable>
<el-option
v-for="dict in dict.type.gateway_data_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="daterangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb14">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['gateway:strategy:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="multiple"
@click="handleStatus()"
v-hasPermi="['gateway:strategy:edit']"
>批量启用</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['gateway:strategy:remove']"
>删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['gateway:strategy:export']"
>导出</el-button>
</el-col> -->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="strategyList" @selection-change="handleSelectionChange" height="100%">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="策略名称" min-width="180" show-overflow-tooltip prop="strategyName">
<template slot-scope="scope">
<el-button @click="handleUpdate(scope.row, 'detail')" type="text">{{scope.row.strategyName}}</el-button>
</template>
</el-table-column>
<el-table-column label="策略描述" min-width="180" show-overflow-tooltip prop="description" />
<!-- <el-table-column label="请求方式" prop="requestMethod" /> -->
<el-table-column label="策略类型" min-width="120" prop="strategyType">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_strategy_type" :value="scope.row.strategyType"/>
</template>
</el-table-column>
<el-table-column label="策略状态" min-width="100" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_data_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建者" min-width="100" prop="created" />
<el-table-column label="创建时间" prop="createTime" min-width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" prop="updateTime" min-width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" fixed="right" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleStatus(scope.row)"
v-hasPermi="['gateway:strategy:edit']"
>{{scope.row.status === '0' ? '启用' : '禁用' }}</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['gateway:strategy:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['gateway:strategy:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改策略管理对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> -->
<!-- <el-form ref="form" :model="form" :rules="rules" :validate-on-rule-change="false" label-width="100px"> -->
<!-- <el-form-item label="策略类型" prop="strategyType">
<el-radio-group v-model="form.strategyType" @input="strategyTypeChange">
<el-radio
v-for="dict in dict.type.gateway_strategy_type"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="策略名称" prop="strategyName">
<el-input v-model="form.strategyName" clearable placeholder="描述性的名称,用于识别和管理该策略" />
</el-form-item>
<el-form-item label="策略描述" prop="description">
<el-input v-model="form.description" placeholder="请输入策略描述" />
</el-form-item> -->
<!-- 认证策略 -->
<!-- <template v-if="form.strategyType === 'AUTHENTICATION'"> -->
<!-- 认证方式 -->
<!-- 认证配置 针对选定的认证方式需要相应的配置信息如秘钥证书令牌有效期等 -->
<!-- 生效范围 -->
<!-- </template> -->
<!-- 认证策略 -->
<!-- 鉴权策略 -->
<!-- <template v-if="form.strategyType === 'PERMISSION'"> -->
<!-- 角色授权 指定用户或角色是否具有访问接口或资源的权限-->
<!-- 角色列表 指定哪些角色拥有访问接口或资源的权限-->
<!-- 用户ID 标识请求中的用户身份信息-->
<!-- IP地址 允许访问接口或资源的IP地址范围限制请求来源-->
<!-- <el-form-item label="请求方法" prop="requestMethod">
<el-radio-group v-model="form.requestMethod">
<el-radio
v-for="dict in dict.type.http_request_method"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item> -->
<!-- 请求路径 允许访问的接口路径或URL -->
<!-- 访问频率限制 设置允许用户或角色在一定时间内访问接口的次数限制 -->
<!-- 访问时间限制 允许用户或者角色访问接口的时间段 -->
<!-- 访问来源 访问接口的来源 -->
<!-- 有限期 -->
<!-- 授权范围 指定用户或角色 -->
<!-- </template> -->
<!-- 鉴权策略 -->
<!-- 限流策略 -->
<!-- <template v-if="form.strategyType == 'CURRENT_LIMITING'"> -->
<!-- <el-form-item label="限流算法" prop="currentLimitingAlgorithm">
<el-input v-model="form.currentLimitingAlgorithm" placeholder="选择具体的限流算法,如令牌桶算法、楼桶算法、计数器算法等" />
</el-form-item>
<el-form-item label="限流阈值" prop="currentLimitingThreshold">
<el-input v-model="form.currentLimitingThreshold" placeholder="设置限流的预制,即允许通过的请求次数或者并发连接数" />
</el-form-item>
<el-form-item label="限流周期" prop="currentLimitingPeriod">
<el-input v-model="form.currentLimitingPeriod" placeholder="设置限流的时间周期,如每秒限流、没分钟限流等" />
</el-form-item> -->
<!-- 生效范围 -->
<!-- <el-form-item label="限流处理方式" prop="currentLimitingProcessingMethod">
<el-input v-model="form.currentLimitingProcessingMethod" placeholder="请输入限流处理方式" />
</el-form-item> -->
<!-- 超限处理策略 -->
<!-- 监控和警告 -->
<!-- 限流日志 -->
<!-- </template> -->
<!-- 限流策略 -->
<!-- 数据加密策略 -->
<!-- <template v-if="form.strategyType == 'DATA_ENCRYPTION'"> -->
<!-- <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.gateway_data_status"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item> -->
<!-- <el-form-item label="加密算法" prop="encryptionAlgorithm">
<el-radio-group v-model="form.encryptionAlgorithm" @input="changeEncryptionAlgorithm">
<el-radio label="ECC">ECC</el-radio>
<el-radio label="RSA">RSA</el-radio>
<el-radio label="SM2">国密</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="私钥内容" prop="privateKey">
<el-input v-model="form.privateKey" type="textarea" placeholder="请输入私钥" />
</el-form-item>
<el-form-item v-if="publicKeyRequired" label="公钥内容" prop="publicKey">
<el-input v-model="form.publicKey" type="textarea" placeholder="请输入公钥" />
</el-form-item> -->
<!-- </template> -->
<!-- 数据加密策略 -->
<!-- </el-form> -->
<!-- <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div> -->
<!-- </el-dialog> -->
</div>
</template>
<script>
import EventBus from "@/utils/eventBus";
import { listStrategy, getStrategy, delStrategy, addStrategy, updateStrategy, changeStrategyStatus } from "@/api/gateway/strategy";
export default {
name: "Strategy",
dicts: ['gateway_data_status', 'gateway_strategy_type', 'http_request_method'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 策略管理表格数据
strategyList: [],
// // 弹出层标题
// title: "",
// // 是否显示弹出层
// open: false,
// 限流处理方式时间范围
daterangeCreateTime: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
strategyName: null,
strategyType: null,
requestMethod: null,
status: null,
createTime: null,
},
// 表单参数
// form: {
// id: null,
// strategyName: null,
// strategyType: null,
// description: null,
// requestMethod: null,
// encryptionAlgorithm: null,
// status: null,
// privateKey: null,
// publicKey: null,
// currentLimitingAlgorithm: null,
// currentLimitingThreshold: null,
// currentLimitingPeriod: null,
// currentLimitingProcessingMethod: null,
// createBy: null,
// createTime: null,
// updateBy: null,
// updateTime: null
// },
};
},
computed: {
// publicKeyRequired() {
// return this.form.encryptionAlgorithm === 'RSA';
// },
// // 表单校验
// rules() {
// return {
// strategyName: [
// { required: this.form.strategyType === 'DATA_ENCRYPTION', message: "策略名称不能为空", trigger: "blur" }
// ],
// strategyType: [
// { required: true, message: "策略类型不能为空", trigger: "change" }
// ],
// // requestMethod: [
// // { required: true, message: "请求方式不能为空", trigger: "blur" }
// // ],
// encryptionAlgorithm: [
// { required: true, message: "加密算法不能为空", trigger: "blur" }
// ],
// privateKey: [
// { required: true, message: "私钥内容不能为空", trigger: "blur" }
// ],
// publicKey: [
// { required: this.publicKeyRequired, message: "公钥内容不能为空", trigger: "blur" }
// ],
// }
// }
},
created() {
this.getList();
EventBus.$on("reloadStratefyList",this.getList);
},
befoueDestroy() {
EventBus.$off('reloadStratefyList', this.getList);
},
methods: {
/** 查询策略管理列表 */
getList() {
this.loading = true;
this.queryParams.params = {};
if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) {
// 采用apijson方式
this.queryParams.params["beginCreateTime"] = this.daterangeCreateTime[0];
this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1];
this.queryParams.createTime = this.daterangeCreateTime[0]+","+this.daterangeCreateTime[1];
}
listStrategy(this.queryParams).then(response => {
this.strategyList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
// cancel() {
// this.open = false;
// this.reset();
// },
// // 表单重置
// reset() {
// this.form = {
// id: null,
// strategyName: null,
// strategyType: null,
// description: null,
// requestMethod: null,
// encryptionAlgorithm: null,
// status: null,
// privateKey: null,
// publicKey: null,
// currentLimitingAlgorithm: null,
// currentLimitingThreshold: null,
// currentLimitingPeriod: null,
// currentLimitingProcessingMethod: null,
// createBy: null,
// createTime: null,
// updateBy: null,
// updateTime: null
// };
// this.resetForm("form");
// },
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.daterangeCreateTime = [];
this.queryParams.createTime = null;
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
// this.reset();
// this.open = true;
// this.title = "添加策略管理";
this.$router.push({path:'/gateway/strategy-edit'})
},
/** 修改按钮操作 */
handleUpdate(row, type) {
// this.reset();
const id = row.id;
// getStrategy(id).then(response => {
// this.form = response.data;
// this.open = true;
// this.title = "修改策略管理";
// });
this.$router.push({
path:'/gateway/strategy-edit',
query: {
id,
type
}
})
},
// strategyTypeChange() {
// const { id, strategyName, strategyType } = this.form;
// this.reset();
// this.form.id = id;
// this.form.strategyName = strategyName;
// this.form.strategyType = strategyType;
// },
// changeEncryptionAlgorithm(val) {
// // 非RSA清空公钥
// if (val === 'RSA') {
// this.form.publicKey = null;
// };
// },
// /** 提交按钮 */
// submitForm() {
// console.log(this.form)
// // return;
// this.$refs["form"].validate(valid => {
// if (valid) {
// if (this.form.id != null) {
// let data = Object.assign({},this.form)
// delete data.explain
// updateStrategy(data).then(response => {
// this.$modal.msgSuccess("修改成功");
// this.open = false;
// this.getList();
// });
// } else {
// addStrategy(this.form).then(response => {
// this.$modal.msgSuccess("新增成功");
// this.open = false;
// this.getList();
// });
// }
// }
// });
// },
/** 删除按钮操作 */
handleDelete(row) {
const ids = row?.id || this.ids;
this.$modal.confirm('是否确认删除策略管理编号为"' + ids + '"的数据项?').then(function() {
return delStrategy(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 启用/禁用按钮操作 */
handleStatus(row) {
const ids = row?.id ? [row.id] : this.ids;
let status = '1'
if (row) {
status = row.status == '1' ? '0' : '1'
}
const params = {ids, status};
changeStrategyStatus(params).then(({code, msg}) => {
if (code === 200) {
this.$message.success(msg);
this.getList();
}
})
},
/** 导出按钮操作 */
handleExport() {
this.download('gateway/strategy/export', {
...this.queryParams
}, `strategy_${new Date().getTime()}.xlsx`)
}
}
};
</script>