白名单配置
This commit is contained in:
parent
4c6f3ecf81
commit
cd1ce5b290
|
|
@ -21,9 +21,9 @@ export function updateWhiteAPI(data) {
|
|||
// 删除白名单
|
||||
export function deleteWhiteAPI(data) {
|
||||
return request({
|
||||
url: '/smartArchives/whitelist/data',
|
||||
url: '/smartArchives/whitelist/del',
|
||||
method: 'POST',
|
||||
// data: data,
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -112,3 +112,45 @@ export function isArray(arg) {
|
|||
}
|
||||
return Array.isArray(arg)
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为合法的 IPv4 地址
|
||||
* @param {string} ip
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
export function isIPv4(ip) {
|
||||
if (typeof ip !== 'string') return false
|
||||
// 基础格式校验:四段数字
|
||||
const parts = ip.split('.')
|
||||
if (parts.length !== 4) return false
|
||||
for (let i = 0; i < parts.length; i++) {
|
||||
const seg = parts[i]
|
||||
// 不能为空,必须为数字,不能有前导零(允许单个0)
|
||||
if (seg === '' || /\D/.test(seg)) return false
|
||||
if (seg.length > 1 && seg[0] === '0') return false
|
||||
const n = Number(seg)
|
||||
if (n < 0 || n > 255) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 IPv4 地址转换为 32 位整数(仅内部使用,入参须先通过 isIPv4)
|
||||
* @param {string} ip
|
||||
* @returns {number}
|
||||
*/
|
||||
function ipv4ToInt(ip) {
|
||||
const [a, b, c, d] = ip.split('.').map(Number)
|
||||
return ((a << 24) >>> 0) + (b << 16) + (c << 8) + d
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断起始 IP 是否小于等于结束 IP(均为 IPv4)
|
||||
* @param {string} start
|
||||
* @param {string} end
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
export function isIPv4RangeOrder(start, end) {
|
||||
if (!isIPv4(start) || !isIPv4(end)) return false
|
||||
return ipv4ToInt(start) <= ipv4ToInt(end)
|
||||
}
|
||||
|
|
@ -9,9 +9,9 @@ export const formLabel = [
|
|||
]
|
||||
|
||||
export const columnsList = [
|
||||
{ t_props: 'ipAddress', t_label: '单个IP地址' },
|
||||
{ t_props: 'ipRangeStart', t_label: 'IP网段起始地址' },
|
||||
{ t_props: 'ipRangeEnd', t_label: 'IP网段结束地址' },
|
||||
{ t_props: 'ipAddressDes', t_label: '单个IP地址' },
|
||||
{ t_props: 'ipRangeStartDes', t_label: 'IP网段起始地址' },
|
||||
{ t_props: 'ipRangeEndDes', t_label: 'IP网段结束地址' },
|
||||
{ t_props: 'accessStartTime', t_label: '允许访问的开始时间' },
|
||||
{ t_props: 'accessEndTime', t_label: '允许访问的结束时间' },
|
||||
{ t_props: 'updatedAt', t_label: '更新时间' }
|
||||
|
|
|
|||
|
|
@ -86,10 +86,10 @@ export default {
|
|||
},
|
||||
/** 删除操作 */
|
||||
handleDelete(row) {
|
||||
this.$modal.confirm(`是否确认删除数据类型名称为"${row.dataTypeName}"的数据项?`).then(() => {
|
||||
this.$modal.confirm(`是否确认删除数据?`).then(() => {
|
||||
// 显示加载遮罩
|
||||
this.$modal.loading("正在删除,请稍候...");
|
||||
deleteWhiteAPI([row.id]).then(res => {
|
||||
deleteWhiteAPI({id: row.id}).then(res => {
|
||||
this.$modal.closeLoading();
|
||||
if (res.code === 200) {
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
|
|
|
|||
|
|
@ -3,22 +3,38 @@
|
|||
<el-dialog class="l-dialog" :class="lDialog" :title="title" :visible.sync="dialogVisible" :showClose="true"
|
||||
:closeOnClickModal="false" @close="handleClose" :append-to-body="true">
|
||||
<div>
|
||||
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="110px">
|
||||
<el-form-item label="档案加密名称" prop="encryptName">
|
||||
<el-input class="form-item" v-model="form.encryptName" clearable show-word-limit
|
||||
placeholder="请输入档案加密名称" maxlength="20"></el-input>
|
||||
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px">
|
||||
<el-form-item label="IP类型" prop="ipType">
|
||||
<el-radio
|
||||
v-model="form.ipType"
|
||||
v-for="item in dict.type.sys_white"
|
||||
:key="item.value"
|
||||
:label="item.value"
|
||||
:disabled="isAdd === 'edit'"
|
||||
>{{ item.label }}</el-radio>
|
||||
</el-form-item>
|
||||
<el-form-item label="档案加密类型" prop="encryptType" style="width: 100%;">
|
||||
<el-select class="form-item" v-model="form.encryptType" filterable clearable
|
||||
placeholder="请选择档案加密类型">
|
||||
<el-option v-for="item in dict.type.file_encryption_type" :key="item.value" :label="item.label"
|
||||
:value="item.label"></el-option>
|
||||
</el-select>
|
||||
<el-form-item label="单个IP地址" prop="ipAddressDes" v-if="form.ipType === 'single'" :key="'single-'+form.ipType">
|
||||
<el-input class="form-item" v-model="form.ipAddressDes" clearable show-word-limit
|
||||
placeholder="请输入单个IP地址" maxlength="20"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="档案加密参数" prop="encryptParams">
|
||||
<el-input class="form-item" v-model="form.encryptParams" clearable show-word-limit
|
||||
placeholder="请输入档案加密参数" maxlength="32"></el-input>
|
||||
|
||||
<el-form-item label="IP网段起始地址" prop="ipRangeStartDes" v-if="form.ipType === 'range'" :key="'range-start-'+form.ipType">
|
||||
<el-input class="form-item" v-model="form.ipRangeStartDes" clearable show-word-limit
|
||||
placeholder="请输入IP网段起始地址" maxlength="20"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="IP网段结束地址" prop="ipRangeEndDes" v-if="form.ipType === 'range'" :key="'range-end-'+form.ipType">
|
||||
<el-input class="form-item" v-model="form.ipRangeEndDes" clearable show-word-limit
|
||||
placeholder="请输入IP网段结束地址" maxlength="20"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="时间范围">
|
||||
<el-date-picker v-model="form.timeRange" type="datetimerange" range-separator="至"
|
||||
start-placeholder="开始时间" end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss"
|
||||
:default-time="['00:00:00', '23:59:59']" style="width: 100%" align="right" clearable />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
|
|
@ -30,34 +46,34 @@
|
|||
</template>
|
||||
<script>
|
||||
import _ from 'lodash'
|
||||
import { isIPv4, isIPv4RangeOrder } from '@/utils/validate'
|
||||
import {
|
||||
addWhiteAPI,
|
||||
updateWhiteAPI,
|
||||
} from '@/api/system/white'
|
||||
export default {
|
||||
name: "WhiteForm",
|
||||
dicts: ['file_encryption_type'],
|
||||
dicts: ['sys_white'],
|
||||
props: ["width", "dataForm", "title", "disabled", "isAdd", "rowData"],
|
||||
data() {
|
||||
return {
|
||||
lDialog: this.width > 500 ? "w700" : "w500",
|
||||
dialogVisible: true,
|
||||
isDisabled: true,
|
||||
form: {
|
||||
encryptName: '',
|
||||
encryptType: null,
|
||||
encryptParams: '',
|
||||
},
|
||||
form: {},
|
||||
loading: null,
|
||||
rules: {
|
||||
encryptName: [
|
||||
{ required: true, message: '档案加密名称不能为空', trigger: 'blur' }
|
||||
ipAddressDes: [
|
||||
{ required: true, message: '单个IP地址不能为空', trigger: 'blur' },
|
||||
{ validator: (rule, value, callback) => this.validateIpAddressDes(value, callback), trigger: 'blur' }
|
||||
],
|
||||
encryptType: [
|
||||
{ required: true, message: '档案加密类型不能为空', trigger: 'change' }
|
||||
ipRangeStartDes: [
|
||||
{ required: true, message: 'IP网段起始地址不能为空', trigger: 'blur' },
|
||||
{ validator: (rule, value, callback) => this.validateIpRangeStartDes(value, callback), trigger: 'blur' }
|
||||
],
|
||||
encryptParams: [
|
||||
{ required: true, message: '档案加密参数不能为空', trigger: 'blur' }
|
||||
ipRangeEndDes: [
|
||||
{ required: true, message: 'IP网段结束地址不能为空', trigger: 'blur' },
|
||||
{ validator: (rule, value, callback) => this.validateIpRangeEndDes(value, callback), trigger: 'blur' }
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
@ -65,6 +81,27 @@ export default {
|
|||
created() {
|
||||
this.initFormData();
|
||||
},
|
||||
watch: {
|
||||
'form.ipType'(newVal) {
|
||||
this.$nextTick(() => {
|
||||
if (!this.$refs.ruleForm) return
|
||||
if (newVal === 'single') {
|
||||
// 切到单个IP:清空网段字段并清除其校验
|
||||
this.form.ipRangeStartDes = ''
|
||||
this.form.ipRangeEndDes = ''
|
||||
this.form.ipRangeStart = ''
|
||||
this.form.ipRangeEnd = ''
|
||||
// 先整体清空,再针对当前显示字段校验,避免信息串位
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
} else {
|
||||
// 切到网段:清空单个IP字段并清除其校验
|
||||
this.form.ipAddressDes = ''
|
||||
this.form.ipAddress = ''
|
||||
this.$refs.ruleForm.clearValidate()
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/** 初始化表单数据 */
|
||||
initFormData() {
|
||||
|
|
@ -72,16 +109,34 @@ export default {
|
|||
// 编辑模式:填充表单数据
|
||||
this.form = {
|
||||
id: this.rowData.id,
|
||||
encryptName: this.rowData.encryptName || '',
|
||||
encryptType: this.rowData.encryptType || null,
|
||||
encryptParams: this.rowData.encryptParams || '',
|
||||
ipAddressDes: this.rowData.ipAddressDes || '',
|
||||
ipAddressDesNew: this.rowData.ipAddressDes || '',
|
||||
ipAddress: this.rowData.ipAddress || '',
|
||||
ipRangeStartDes: this.rowData.ipRangeStartDes || '',
|
||||
ipRangeStartDesNew: this.rowData.ipRangeStartDes || '',
|
||||
ipRangeStart: this.rowData.ipRangeStart || '',
|
||||
ipRangeEndDes: this.rowData.ipRangeEndDes || '',
|
||||
ipRangeEndDesNew: this.rowData.ipRangeEndDes || '',
|
||||
ipRangeEnd: this.rowData.ipRangeEnd || '',
|
||||
ipType: this.rowData.ipAddress ? 'single' : 'range',
|
||||
timeRange: this.rowData.accessStartTime && this.rowData.accessEndTime
|
||||
? [this.rowData.accessStartTime, this.rowData.accessEndTime]
|
||||
: [],
|
||||
};
|
||||
} else {
|
||||
// 新增模式:重置表单
|
||||
this.form = {
|
||||
encryptName: '',
|
||||
encryptType: null,
|
||||
encryptParams: '',
|
||||
ipType: 'single',
|
||||
ipAddressDes: '',
|
||||
ipAddressDesNew: '',
|
||||
ipAddress: '',
|
||||
ipRangeStartDes: '',
|
||||
ipRangeStartDesNew: '',
|
||||
ipRangeStart: '',
|
||||
ipRangeEndDes: '',
|
||||
ipRangeEndDesNew: '',
|
||||
ipRangeEnd: '',
|
||||
timeRange: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
|
|
@ -104,9 +159,17 @@ export default {
|
|||
/**重置表单*/
|
||||
reset() {
|
||||
this.form = {
|
||||
encryptName: '',
|
||||
encryptType: null,
|
||||
encryptParams: '',
|
||||
ipType: 'single',
|
||||
ipAddressDes: '',
|
||||
ipAddressDesNew: '',
|
||||
ipAddress: '',
|
||||
ipRangeStartDes: '',
|
||||
ipRangeStartDesNew: '',
|
||||
ipRangeStart: '',
|
||||
ipRangeEndDesNew: '',
|
||||
ipRangeEndDes: '',
|
||||
ipRangeEnd: '',
|
||||
timeRange: [],
|
||||
};
|
||||
this.resetForm("ruleForm");
|
||||
},
|
||||
|
|
@ -116,6 +179,43 @@ export default {
|
|||
this.$emit('handleQuery');
|
||||
this.handleClose();
|
||||
},
|
||||
// 动态校验:仅在对应类型下必填
|
||||
validateIpAddressDes(value, callback) {
|
||||
if (this.form.ipType === 'single') {
|
||||
const previous = this.form.ipAddressDesNew
|
||||
// 若与原值相同则不触发校验错误,直接通过
|
||||
if (previous !== undefined && value === previous) return callback()
|
||||
if (!value) return callback(new Error('单个IP地址不能为空'))
|
||||
if (!isIPv4(value)) return callback(new Error('请输入合法的IPv4地址,如 192.168.1.1'))
|
||||
}
|
||||
callback()
|
||||
},
|
||||
validateIpRangeStartDes(value, callback) {
|
||||
if (this.form.ipType === 'range') {
|
||||
const previous = this.form.ipRangeStartDesNew
|
||||
if (previous !== undefined && value === previous) return callback()
|
||||
if (!value) return callback(new Error('IP网段起始地址不能为空'))
|
||||
if (!isIPv4(value)) return callback(new Error('请输入合法的IPv4地址,如 192.168.1.1'))
|
||||
const end = this.form.ipRangeEndDes
|
||||
if (end && isIPv4(end) && !isIPv4RangeOrder(value, end)) {
|
||||
return callback(new Error('起始地址不能大于结束地址'))
|
||||
}
|
||||
}
|
||||
callback()
|
||||
},
|
||||
validateIpRangeEndDes(value, callback) {
|
||||
if (this.form.ipType === 'range') {
|
||||
const previous = this.form.ipRangeEndDesNew
|
||||
if (previous !== undefined && value === previous) return callback()
|
||||
if (!value) return callback(new Error('IP网段结束地址不能为空'))
|
||||
if (!isIPv4(value)) return callback(new Error('请输入合法的IPv4地址,如 192.168.1.100'))
|
||||
const start = this.form.ipRangeStartDes
|
||||
if (start && isIPv4(start) && !isIPv4RangeOrder(start, value)) {
|
||||
return callback(new Error('结束地址不能小于起始地址'))
|
||||
}
|
||||
}
|
||||
callback()
|
||||
},
|
||||
/**验证 */
|
||||
submitForm(formName) {
|
||||
this.$refs[formName].validate(valid => {
|
||||
|
|
@ -128,6 +228,40 @@ export default {
|
|||
target: this.$el.querySelector('.el-dialog') || document.body
|
||||
})
|
||||
let params = _.cloneDeep(this.form);
|
||||
// 映射时间范围到后端需要的字段(可按需调整字段名)
|
||||
if (Array.isArray(params.timeRange) && params.timeRange.length === 2) {
|
||||
params.startTime = params.timeRange[0]
|
||||
params.endTime = params.timeRange[1]
|
||||
} else {
|
||||
params.startTime = ''
|
||||
params.endTime = ''
|
||||
}
|
||||
// 新增时:将描述字段映射到提交字段
|
||||
if (this.isAdd === 'add') {
|
||||
if (params.ipType === 'single') {
|
||||
params.ipAddress = (params.ipAddressDes || '').trim()
|
||||
params.ipRangeStart = ''
|
||||
params.ipRangeEnd = ''
|
||||
} else {
|
||||
params.ipRangeStart = (params.ipRangeStartDes || '').trim()
|
||||
params.ipRangeEnd = (params.ipRangeEndDes || '').trim()
|
||||
params.ipAddress = ''
|
||||
}
|
||||
} else {
|
||||
// 编辑时:根据 ipType 判断更新哪些字段
|
||||
if (params.ipType === 'single') {
|
||||
if (params.ipAddressDesNew !== params.ipAddressDes) {
|
||||
params.ipAddress = (params.ipAddressDes || '').trim()
|
||||
}
|
||||
} else if (params.ipType === 'range') {
|
||||
if (params.ipRangeStartDesNew !== params.ipRangeStartDes) {
|
||||
params.ipRangeStart = (params.ipRangeStartDes || '').trim()
|
||||
}
|
||||
if (params.ipRangeEndDesNew !== params.ipRangeEndDes) {
|
||||
params.ipRangeEnd = (params.ipRangeEndDes || '').trim()
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.isAdd === 'add') {
|
||||
addWhiteAPI(params).then(res => {
|
||||
this.loading.close();
|
||||
|
|
|
|||
Loading…
Reference in New Issue