白名单配置

This commit is contained in:
cwchen 2025-09-10 18:00:08 +08:00
parent 4c6f3ecf81
commit cd1ce5b290
5 changed files with 217 additions and 41 deletions

View File

@ -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,
})
}

View File

@ -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)
}

View File

@ -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: '更新时间' }

View File

@ -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("删除成功");

View File

@ -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();