import acl from '/@/api/acl'; import { http } from '/nerv-lib/util/http'; import { dateUtil } from '/nerv-lib/util/date-util'; import { get } from 'lodash-es'; import { useRouter } from 'vue-router'; export const aclTableConfig = { api: acl.LIST, title: '防火墙', showAction: ['remove'], columns: [ { title: '项目', name: 'viewInfo', textEllipsis: true, width: '15%', customRender: (text: any) => { return get(text.record, 'viewInfo.project[0]'); }, }, { title: '防火墙ID', textEllipsis: true, width: '20%', dataIndex: 'metadata', customRender: (text: any) => { return get(text.record, 'metadata.name'); }, }, { title: '名称', textEllipsis: true, width: '20%', dataIndex: 'spec', customRender: (text: any) => { return get(text.record, 'spec.display_name'); }, }, { title: '描述', textEllipsis: true, dataIndex: 'spec', customRender: (text: any) => { return get(text.record, 'spec.display_description'); }, width: '15%', }, { title: '租户', textEllipsis: true, dataIndex: 'spec', width: '10%', customRender: (text: any) => { return get(text.record, 'spec.tenant'); }, }, { title: '创建时间', dataIndex: 'metadata', width: '20%', customRender: (text: any) => { return dateUtil(text.text?.creationTimestamp).format('YYYY-MM-DD HH:mm:ss'); }, }, ], actions: [ { label: '查看', name: 'NoeaclDetail', openPermission: true, handle: (record, e, { router }) => { router.push({ name: 'NoeaclDetail', params: { id: record.metadata?.name, }, }); }, }, { label: '修改入站规则', name: 'NoeaclUpdateIngressRule', openPermission: true, handle: (record, e, { router }) => { router.push({ name: 'NoeaclUpdateIngressRule', params: { id: record.metadata?.name, }, }); }, }, { label: '修改出站规则', name: 'NoeaclUpdateEgressRule', openPermission: true, handle: (record, e, { router }) => { router.push({ name: 'NoeaclUpdateEgressRule', params: { id: record.metadata?.name, }, }); }, }, ], headerActions: [ { label: '添加', name: 'NoeaclAdd', type: 'primary', handle: (record, e, { router }) => { router.push({ name: 'NoeaclAdd' }); }, }, ], }; export const aclAddConfig = { title: '添加', formLayout: '修改', api: acl.ADD, schemas: [ // { // label: '项目', // field: 'project_id', // component: 'NsSelectApi' /* todo 需要根据权限过滤 */, // componentProps: { // api: { // url: '/api/passport/passport/objs/Authorization/CheckAuthorization', // method: 'POST', // }, // showSearch: true, // filterOption: (input: string, option: any) => { // return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; // }, // // filterData: (item) => { // // return authorizationService().checkPermission('vdisk', 'Volume', 'add', item.projectname); // // }, // resultField: 'projects', // labelField: 'projectname', // valueField: 'projectid', // immediate: true, // placeholder: '请选择项目', // }, // rules: [ // { // type: 'number', // required: true, // message: '项目必填', // trigger: 'blur', // }, // ], // }, { label: '租户', field: 'tenant', component: 'NsSelectApi' /* todo 需要根据权限过滤 */, componentProps: { api: { url: '/api/passport/passport/objs/Tenant?where=tenant_status=?&values=1', method: 'GET', }, autoSelectFirst: true, showSearch: true, filterOption: (input: string, option: any) => { return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, resultField: 'data', labelField: 'tenant', valueField: 'tenant', immediate: true, placeholder: '请选择租户', }, rules: [ { required: true, message: '租户必填', trigger: 'blur', }, ], }, { label: '项目', field: 'project_id', component: 'NsSelectApi' /* todo 需要根据权限过滤 */, dynamicParams: { tenant: 'tenant', }, componentProps: { api: { url: '/api/passport/passport/objs/Tenant/Projects', method: 'GET', }, autoSelectFirst: true, showSearch: true, filterOption: (input: string, option: any) => { return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, resultField: 'projects', labelField: 'projectName', valueField: 'projectID', immediate: true, placeholder: '请选择项目', }, rules: [ { type: 'number', required: true, message: '项目必填', trigger: 'blur', }, ], }, { field: 'name', label: '防火墙名称', component: 'NsInput', componentProps: { placeholder: '请输入', }, rules: [ { required: true, message: '防火墙名称必填', trigger: 'blur', }, { pattern: '^[a-zA-Z][a-zA-Z0-9_-]{5,31}$', message: '以字母开头输入6-32个字符,只能包含字母,数字,短横线(-)和下划线(_)', trigger: 'blur', }, ], }, { label: '描述', field: 'description', component: 'NsTextarea', componentProps: { showCount: true, maxlength: 255, }, }, ], }; export const aclEditConfig = { title: '编辑', formLayout: '修改', getApi: () => { const router = useRouter(); return http.get(`${acl.DETAIL}/${router.currentRoute.value.params?.uid}`); }, api: (record) => { return http.put(`${acl.EDIT}/${record.uuid}`, record); }, schemas: [ { field: 'uuid', component: 'NsInputText', show: false, }, { field: 'name', label: '网络名称', component: 'NsInput', componentProps: { placeholder: '请输入', }, rules: [ { required: true, message: '网络名称必填', trigger: 'blur', }, ], }, { label: '描述', field: 'description', component: 'NsTextarea', componentProps: { showCount: true, maxlength: 255, }, }, ], }; export const aclDetailConfig = { title: '详情', showBack: true, api: () => { const router = useRouter(); return http.get(`${acl.DETAIL}/${router.currentRoute.value.params?.id}`); }, dataHandle: (val) => { return val; }, detail: [ { title: '', items: [ { label: '名称', name: 'name', }, { label: '描述', name: 'description', }, { label: '状态', name: 'status', }, { label: '租户', name: 'tenant', }, { label: '创建时间', name: 'created_at', format: (value) => { return dateUtil(value).format('YYYY-MM-DD HH:mm:ss'); }, }, { label: '修改时间', name: 'updated_at', format: (value) => { return dateUtil(value).format('YYYY-MM-DD HH:mm:ss'); }, }, ], }, { title: '', items: [ { label: '入站规则', name: 'ingress_rules', type: 'table', props: { listField: 'ingress_rules', columns: [ { title: '协议', dataIndex: 'protocol', }, { title: '名称', dataIndex: 'name', }, { title: 'IP协议', dataIndex: 'ether_type', }, { title: '端口范围', dataIndex: 'ether_type', customRender: (text: any) => { if (text.record['port_range_min'] && text.record['port_range_max']) { return `${text.record['port_range_min']}-${text.record['port_range_max']}`; } else { return 'any'; } }, }, { title: '远端IP前缀', dataIndex: 'remote_ip_prefix', }, ], }, }, ], }, { title: '', items: [ { label: '出站规则', name: 'egress_rules', type: 'table', props: { listField: 'egress_rules', columns: [ { title: '协议', dataIndex: 'protocol', }, { title: '名称', dataIndex: 'name', }, { title: 'IP协议', dataIndex: 'ether_type', }, { title: '端口范围', dataIndex: 'ether_type', customRender: (text: any) => { if (text.record['port_range_min'] && text.record['port_range_max']) { return `${text.record['port_range_min']}-${text.record['port_range_max']}`; } else { return 'any'; } }, }, { title: '远端IP前缀', dataIndex: 'remote_ip_prefix', }, ], }, }, ], }, ], };