diff --git a/cmdb-ui/src/modules/cmdb/lang/en.js b/cmdb-ui/src/modules/cmdb/lang/en.js
index 5b0f791..22e9d5d 100644
--- a/cmdb-ui/src/modules/cmdb/lang/en.js
+++ b/cmdb-ui/src/modules/cmdb/lang/en.js
@@ -1,593 +1,594 @@
-const cmdb_en = {
-    relation: 'Relation',
-    attribute: 'Attributes',
-    configTable: 'Config Table',
-    menu: {
-        views: 'Views',
-        topologyView: 'Topology Views',
-        resources: 'Resources',
-        config: 'Configuration',
-        backend: 'Management',
-        ciTable: 'Resource Views',
-        ciTree: 'Tree Views',
-        ciSearch: 'Search',
-        adCIs: 'AutoDiscovery Pool',
-        preference: 'Preference',
-        batchUpload: 'Batch Import',
-        citypeManage: 'Modeling',
-        backendManage: 'Backend',
-        customDashboard: 'Custom Dashboard',
-        serviceTreeDefine: 'Service Tree',
-        citypeRelation: 'CIType Relation',
-        operationHistory: 'Operation Audit',
-        relationType: 'Relation Type',
-        ad: 'AutoDiscovery',
-        cidetail: 'CI Detail'
-    },
-    ciType: {
-        ciType: 'CIType',
-        attributes: 'Attributes',
-        relation: 'Relation',
-        trigger: 'Triggers',
-        attributeAD: 'Attributes AutoDiscovery',
-        relationAD: 'Relation AutoDiscovery',
-        grant: 'Grant',
-        addGroup: 'New Group',
-        editGroup: 'Edit Group',
-        group: 'Group',
-        attributeLibray: 'Attribute Library',
-        addCITypeInGroup: 'Add a new CIType to the group',
-        addCIType: 'Add CIType',
-        editGroupName: 'Edit group name',
-        deleteGroup: 'Delete this group',
-        CITypeName: 'Name(English)',
-        English: 'English',
-        inputAttributeName: 'Please enter the attribute name',
-        attributeNameTips: 'It cannot start with a number, it can be English numbers and underscores (_)',
-        editCIType: 'Edit CIType',
-        defaultSort: 'Default sort',
-        selectDefaultOrderAttr: 'Select default sorting attributes',
-        asec: 'Forward order',
-        desc: 'Reverse order',
-        uniqueKey: 'Unique Identifies',
-        uniqueKeySelect: 'Please select a unique identifier',
-        uniqueKeyTips: 'json/password/computed/choice can not be unique identifies',
-        notfound: 'Can\'t find what you want?',
-        cannotDeleteGroupTips: 'There is data under this group and cannot be deleted!',
-        confirmDeleteGroup: 'Are you sure you want to delete group [{groupName}]?',
-        confirmDeleteCIType: 'Are you sure you want to delete model [{typeName}]?',
-        uploading: 'Uploading',
-        uploadFailed: 'Upload failed, please try again later',
-        addPlugin: 'New plugin',
-        deletePlugin: 'Delete plugin',
-        confirmDeleteADT: 'Do you confirm to delete [{pluginName}]',
-        attributeMap: 'Attribute mapping',
-        autoDiscovery: 'AutoDiscovery',
-        node: 'Node',
-        adExecConfig: 'Execute configuration',
-        adExecTarget: 'Execute targets',
-        oneagentIdTips: 'Please enter the hexadecimal OneAgent ID starting with 0x',
-        selectFromCMDBTips: 'Select from CMDB ',
-        adAutoInLib: 'Save as CI auto',
-        adInterval: 'Collection frequency',
-        byInterval: 'by interval',
-        allNodes: 'All Instances',
-        specifyNodes: 'Specify Instance',
-        specifyNodesTips: 'Please fill in the specify instance!',
-        username: 'Username',
-        password: 'Password',
-        link: 'Link',
-        list: 'List',
-        listTips: 'The value of the field is one or more, and the type of the value returned by the interface is list.',
-        computeForAllCITips: 'All CI trigger computes',
-        confirmcomputeForAllCITips: 'Confirm triggering computes for all CIs?',
-        isUnique: 'Is it unique',
-        unique: 'Unique',
-        isChoice: 'Choiced',
-        defaultShow: 'Default Display',
-        defaultShowTips: 'The CI instance table displays this field by default',
-        isSortable: 'Sortable',
-        isIndex: 'Indexed',
-        index: 'Index',
-        indexTips: 'Fields can be used for retrieval to speed up queries',
-        confirmDelete: 'Confirm to delete [{name}]?',
-        confirmDelete2: 'Confirm to delete?',
-        computeSuccess: 'Triggered successfully!',
-        basicConfig: 'Basic Settings',
-        AttributeName: 'Name(English)',
-        DataType: 'Data Type',
-        defaultValue: 'Default value',
-        autoIncID: 'Auto-increment ID',
-        customTime: 'Custom time',
-        advancedSettings: 'Advanced Settings',
-        font: 'Font',
-        color: 'Color',
-        choiceValue: 'Predefined value',
-        computedAttribute: 'Computed Attribute',
-        computedAttributeTips: 'The value of this attribute is calculated through an expression constructed from other attributes of the CIType or by executing a piece of code. The reference method of the attribute is: {{ attribute name }}',
-        addAttribute: 'New attribute',
-        existedAttributes: 'Already have attributes',
-        editAttribute: 'Edit attribute',
-        addAttributeTips1: 'If sorting is selected, it must also be selected!',
-        uniqueConstraint: 'Unique Constraint',
-        up: 'Move up',
-        down: 'Move down',
-        selectAttribute: 'Select Attribute',
-        groupExisted: 'Group name already exists',
-        attributeSortedTips: 'Attributes in other groups cannot be sorted. If you need to sort, please drag them to a custom group first!',
-        buildinAttribute: 'built-in attributes',
-        expr: 'Expression',
-        code: 'Code',
-        apply: 'apply',
-        continueAdd: 'Keep adding',
-        filter: 'Filter',
-        choiceOther: 'Other CIType Attributes',
-        choiceWebhookTips: 'The returned results are filtered by fields, and the hierarchical nesting is separated by ##, such as k1##k2. The web request returns {k1: [{k2: 1}, {k2: 2}]}, and the parsing result is [1, 2 ]',
-        selectCIType: 'Please select a CMDB CIType',
-        selectCITypeAttributes: 'Please select CIType attributes',
-        selectAttributes: 'Please select attributes',
-        choiceScriptDemo: 'class ChoiceValue(object):\n    @staticmethod\n    def values():\n        """\n        Execution entry, returns predefined value\n        :return: Returns a list, the type of the value is the same as the type of the attribute\n        For example:\n        return ["online", "offline"]\n        """\n        return []',
-        valueExisted: 'The current value already exists!',
-        addRelation: 'Add Relation',
-        sourceCIType: 'Source CIType',
-        sourceCITypeTips: 'Please select Source CIType',
-        dstCIType: 'Target CIType',
-        dstCITypeTips: 'Please select target CIType',
-        relationType: 'Relation Type',
-        relationTypeTips: 'Please select relation type',
-        isParent: 'is parent',
-        relationConstraint: 'Constraints',
-        relationConstraintTips: 'please select a relationship constraint',
-        one2Many: 'One to Many',
-        one2One: 'One to One',
-        many2Many: 'Many to Many',
-        basicInfo: 'Basic Information',
-        nameInputTips: 'Please enter name',
-        triggerDataChange: 'Data changes',
-        triggerDate: 'Date attribute',
-        triggerEnable: 'Turn on',
-        descInput: 'Please enter descriptions',
-        triggerCondition: 'Triggering conditions',
-        addInstance: 'Add new instance',
-        deleteInstance: 'Delete instance',
-        changeInstance: 'Instance changes',
-        selectMutipleAttributes: 'Please select attributes (multiple selections)',
-        selectSingleAttribute: 'Please select an attribute (single choice)',
-        beforeDays: 'ahead of time',
-        days: 'Days',
-        notifyAt: 'Send time',
-        notify: 'Notify',
-        triggerAction: 'Trigger action',
-        receivers: 'Recipients',
-        emailTips: 'Please enter your email address, separate multiple email addresses with ;',
-        customEmail: 'Custom recipients',
-        notifySubject: 'Notification title',
-        notifySubjectTips: 'Please enter notification title',
-        notifyContent: 'Content',
-        notifyMethod: 'Notify methods',
-        botSelect: 'Please select a robot',
-        refAttributeTips: 'The title and content can reference the attribute value of the CIType. The reference method is: {{ attr_name }}',
-        webhookRefAttributeTips: 'Request parameters can reference the attribute value of the model. The reference method is: {{ attr_name }}',
-        newTrigger: 'Add trigger',
-        editTriggerTitle: 'Edit trigger {name}',
-        newTriggerTitle: 'Add trigger {name}',
-        confirmDeleteTrigger: 'Are you sure to delete this trigger?',
-        int: 'Integer',
-        float: 'Float',
-        text: 'Text',
-        datetime: 'DateTime',
-        date: 'Date',
-        time: 'Time',
-        json: 'JSON',
-        event: 'Event',
-        reg: 'Regex',
-        isInherit: 'Inherit',
-        inheritType: 'Inherit Type',
-        inheritTypePlaceholder: 'Please select inherit types',
-        inheritFrom: 'inherit from {name}',
-        groupInheritFrom: 'Please go to the {name} for modification',
-        downloadType: 'Download CIType',
-        deleteCIType: 'Delete CIType',
-        otherGroupTips: 'Non sortable within the other group',
-        filterTips: 'click to show {name}',
-        attributeAssociation: 'Attribute Association',
-        attributeAssociationTip1: 'Automatically establish relationships through the attributes except password, json and multiple of two models',
-        attributeAssociationTip2: 'Double click to edit',
-        attributeAssociationTip3: 'Two Attributes must be selected',
-        attributeAssociationTip4: 'Please select a attribute from Source CIType',
-        attributeAssociationTip5: 'Please select a attribute from Target CIType',
-        show: 'show attribute',
-        setAsShow: 'Set as show attribute',
-        cancelSetAsShow: 'Cancel show attribute',
-        showTips: 'The names of nodes in the service tree and topology view'
-    },
-    components: {
-        unselectAttributes: 'Unselected',
-        selectAttributes: 'Selected',
-        downloadCI: 'Export data',
-        filename: 'Filename',
-        filenameInputTips: 'Please enter filename',
-        saveType: 'Save type',
-        saveTypeTips: 'Please select save type',
-        xlsx: 'Excel workbook (*.xlsx)',
-        csv: 'CSV (comma separated) (*.csv)',
-        html: 'Web page (*.html)',
-        xml: 'XML data (*.xml)',
-        txt: 'Text file (tab delimited) (*.txt)',
-        grantUser: 'Grant User/Department',
-        grantRole: 'Grant Role',
-        confirmRevoke: 'Confirm to delete the [Authorization] permission of [{name}]?',
-        readAttribute: 'View Attributes',
-        readCI: 'View CIs',
-        config: 'Configuration',
-        ciTypeGrant: 'Grant CIType',
-        ciGrant: 'Grant CI',
-        attributeGrant: 'Grant Attribute',
-        relationGrant: 'Grant Relation',
-        perm: 'Permissions',
-        all: 'All',
-        customize: 'Customize',
-        none: 'None',
-        customizeFilterName: 'Please enter a custom filter name',
-        colorPickerError: 'Initialization color format error, use #fff or rgb format',
-        example: 'Example value',
-        aliyun: 'aliyun',
-        tencentcloud: 'Tencent Cloud',
-        huaweicloud: 'Huawei Cloud',
-        beforeChange: 'Before change',
-        afterChange: 'After change',
-        noticeContentTips: 'Please enter notification content',
-        saveQuery: 'Save Filters',
-        pleaseSearch: 'Please search',
-        conditionFilter: 'Conditional filtering',
-        attributeDesc: 'Attribute Description',
-        ciSearchTips: '1. JSON/password/link attributes cannot be searched\n2. If the search content includes commas, they need to be escaped\n3. Only index attributes are searched, non-index attributes use conditional filtering',
-        ciSearchTips2: 'For example: q=hostname:*0.0.0.0*',
-        subCIType: 'Subscription CIType',
-        already: 'already',
-        not: 'not',
-        sub: 'subscription',
-        selectBelow: 'Please select below',
-        subSuccess: 'Subscription successful',
-        selectMethods: 'Please select a method',
-        noAuthRequest: 'No certification requested yet',
-        noParamRequest: 'No parameter certification yet',
-        requestParam: 'Request parameters',
-        param: 'Parameter{param}',
-        value: 'Value{value}',
-        clear: 'Clear',
-    },
-    batch: {
-        downloadFailed: 'Download failed',
-        unselectCIType: 'No CIType selected yet',
-        pleaseUploadFile: 'Please upload files',
-        batchUploadCanceled: 'Batch upload canceled',
-        selectCIType: 'Select CIType',
-        selectCITypeTips: 'Please select a CIType and then download',
-        downloadTemplate: 'Download Template',
-        clickDownload: 'Click to Download',
-        drawTips: 'Click or drag files here to upload!',
-        supportFileTypes: 'Supported file types: xls, xlsx',
-        uploadResult: 'Upload results',
-        total: 'total',
-        successItems: 'items, succeeded',
-        failedItems: 'items, failed',
-        items: 'items',
-        errorTips: 'Error message',
-        requestFailedTips: 'An error occurred with the request, please try again later',
-        requestSuccessTips: 'Upload completed',
-        uploadFile: 'Upload File',
-        drawTips1: 'Please <span class="cmdb-batch-upload-tips">select a CIType</span>, and then <span class="cmdb-batch-upload-tips">download</span> ,',
-        drawTips2: '<span class="cmdb-batch-upload-tips">click or drag file</span> to upload',
-        dataPreview: 'Preview data and upload',
-        tips1: 'Kind Reminder :',
-        tips2: '1. Click to download the template, and users can customize the header of the template file, including model properties and model associations',
-        // eslint-disable-next-line no-template-curly-in-string
-        tips3: '2. The red color in the template file represents the model relationship, such as the $Product. Product Name (${Model Name}. {Attribute Name}) column, which establishes the relationship with the product.',
-        tips4: '3. In the download template Excel file, the predefined values of attributes will be set as dropdown options. Please note that due to the limitations of Excel itself, a single dropdown box is limited to a maximum of 255 characters. If it exceeds 255 characters, we will not set the dropdown options for this attribute',
-        tips5: '4. When using Excel templates, please ensure that a single file does not exceed 5000 lines.',
-    },
-    preference: {
-        mySub: 'My Subscription',
-        sub: 'Subscribe',
-        cancelSub: 'Unsubscribe',
-        editSub: 'Edit subscription',
-        peopleSub: ' people subscribed',
-        noSub: 'No subscribed',
-        cancelSubSuccess: 'Unsubscribe successfully',
-        confirmcancelSub: 'Are you sure to cancel your subscription?',
-        confirmcancelSub2: 'Are you sure you want to unsubscribe {name}?',
-        of: 'of',
-        hoursAgo: 'hours ago',
-        daysAgo: 'days ago',
-        monthsAgo: 'month ago',
-        yearsAgo: 'years ago',
-        just: 'just now',
-        searchPlaceholder: 'Please search CIType',
-    },
-    custom_dashboard: {
-        charts: 'Chart',
-        newChart: 'Add Chart',
-        editChart: 'Edit Chart',
-        title: 'Title',
-        titleTips: 'Please enter a chart title',
-        calcIndicators: 'Counter',
-        dimensions: 'Dimensions',
-        selectDimensions: 'Please select a dimension',
-        quantity: 'Quantity',
-        childCIType: 'Relational CIType',
-        level: 'Level',
-        levelTips: 'Please enter the relationship level',
-        preview: 'Preview',
-        showIcon: 'Display icon',
-        chartType: 'Chart Type',
-        dataFilter: 'Data Filtering',
-        format: 'Formats',
-        fontColor: 'Font Color',
-        backgroundColor: 'Background',
-        chartColor: 'Chart Color',
-        chartLength: 'Length',
-        barType: 'Bar Type',
-        stackedBar: 'Stacked Bar',
-        multipleSeriesBar: 'Multiple Series Bar ',
-        axis: 'Axis',
-        direction: 'Direction',
-        lowerShadow: 'Lower Shadow',
-        count: 'Indicator',
-        bar: 'Bar',
-        line: 'Line',
-        pie: 'Pie',
-        table: 'Table',
-        default: 'default',
-        relation: 'Relation',
-        noCustomDashboard: 'The administrator has not customized the dashboard yet',
-    },
-    preference_relation: {
-        newServiceTree: 'Add Service Tree',
-        editServiceTree: 'Edit Service Tree',
-        serviceTreeName: 'Name',
-        serviceTreeNamePlaceholder: 'Please enter the service tree name',
-        public: 'Public',
-        saveLayout: 'Save Layout',
-        childNodesNotFound: 'There are no child nodes and no business relationship can be formed. Please select again!',
-        tips1: 'Cannot form a view with the currently selected node, please select again!',
-        tips2: 'Please enter the new serviceTree name!',
-        tips3: 'Please select at least two nodes!',
-        tips4: 'Leaf node must be selected',
-        tips5: 'Select the tree directory node and display the service tree sub nodes as a Table',
-        showLeafNode: 'Show Leaf Node',
-        showTreeNode: 'Show Tree Node',
-        sort: 'Sort',
-        sort1: 'Leaf node information comes first',
-        sort2: 'Tree node information comes first'
-    },
-    history: {
-        ciChange: 'CI',
-        relationChange: 'Relation',
-        ciTypeChange: 'CIType',
-        triggerHistory: 'Triggers',
-        opreateTime: 'Operate Time',
-        user: 'User',
-        userTips: 'Enter filter username',
-        filter: 'Search',
-        filterOperate: 'fitler operation',
-        attribute: 'Attribute',
-        old: 'Old',
-        new: 'New',
-        noUpdate: 'No update',
-        itemsPerPage: '/page',
-        triggerName: 'Name',
-        event: 'Event',
-        action: 'Actoin',
-        status: 'Status',
-        done: 'Done',
-        undone: 'Undone',
-        triggerTime: 'Trigger Time',
-        totalItems: '{total} records in total',
-        pleaseSelect: 'Please select',
-        startTime: 'Start Time',
-        endTime: 'End Time',
-        deleteCIType: 'Delete CIType',
-        addCIType: 'Add CIType',
-        updateCIType: 'Update CIType',
-        addAttribute: 'Add Attribute',
-        updateAttribute: 'Update Attribute',
-        deleteAttribute: 'Delete Attribute',
-        addTrigger: 'Add Trigger',
-        updateTrigger: 'Update Trigger',
-        deleteTrigger: 'Delete Trigger',
-        addUniqueConstraint: 'Add Unique Constraint',
-        updateUniqueConstraint: 'Update Unique Constraint',
-        deleteUniqueConstraint: 'Delete Unique Constraint',
-        addRelation: 'Add Relation',
-        deleteRelation: 'Delete Relation',
-        noModifications: 'No Modifications',
-        attr: 'attribute',
-        attrId: 'attribute id',
-        changeDescription: 'attribute id: {attr_id}, {before_days} day(s) in advance, Subject: {subject}\nContent: {body}\nNotify At: {notify_at}',
-        ticketStartTime: 'Start Time',
-        ticketCreator: 'Creator',
-        ticketTitle: 'Title',
-        ticketFinishTime: 'Finish Time',
-        ticketNodeName: 'Node Name',
-        itsmUninstalled: 'Please use it in combination with VE ITSM',
-        applyItsm: 'Free Apply ITSM',
-        ticketId: 'Ticket ID',
-    },
-    relation_type: {
-        addRelationType: 'New',
-        nameTips: 'Please enter a type name',
-    },
-    ad: {
-        upload: 'Import',
-        download: 'Export',
-        accept: 'Accept',
-        acceptBy: 'Accept By',
-        acceptTime: 'Accept Time',
-        confirmAccept: 'Confirm Accept?',
-        acceptSuccess: 'Accept successfully',
-        isAccept: 'Is accept',
-        deleteADC: 'Confirm to delete this data?',
-        batchDelete: 'Confirm to delete this data?',
-        agent: 'Built-in & Plug-ins',
-        snmp: 'Network Devices',
-        http: 'Public Clouds',
-        rule: 'AutoDiscovery Rules',
-        timeout: 'Timeout error',
-        mode: 'Mode',
-        collectSettings: 'Collection Settings',
-        updateFields: 'Update Field',
-        pluginScript: `# -*- coding:utf-8 -*-
-
-import json
-        
-        
-class AutoDiscovery(object):
-        
-    @property
-    def unique_key(self):
-        """
-        
-        :return: Returns the name of a unique attribute
-        """
-        return
-        
-    @staticmethod
-    def attributes():
-        """
-        Define attribute fields
-        :return: Returns a list of attribute fields. The list items are (name, type, description). The name must be in English.
-        type: String Integer Float Date DateTime Time JSON
-        For example:
-        return [
-            ("ci_type", "String", "CIType name"),
-            ("private_ip", "String", "Internal IP, multiple values separated by commas")
-        ]
-        """
-        return []
-        
-    @staticmethod
-    def run():
-        """
-        Execution entry, returns collected attribute values
-        :return: 
-        Returns a list, the list item is a dictionary, the dictionary key is the attribute name, and the value is the attribute value
-        For example:
-        return [dict(ci_type="server", private_ip="192.168.1.1")]
-        """
-        return []
-        
-        
-if __name__ == "__main__":
-    result = AutoDiscovery().run()
-    if isinstance(result, list):
-        print("AutoDiscovery::Result::{}".format(json.dumps(result)))
-    else:
-        print("ERROR: The collection return must be a list")
-        `,
-        server: 'Server',
-        vserver: 'VServer',
-        nic: 'NIC',
-        disk: 'harddisk',
-    },
-    ci: {
-        attributeDesc: 'Attribute Description',
-        selectRows: 'Select: {rows} items',
-        addRelation: 'Add Relation',
-        all: 'All',
-        batchUpdate: 'Batch Update',
-        batchUpdateConfirm: 'Are you sure you want to make batch updates?',
-        batchUpdateInProgress: 'Currently being updated in batches',
-        batchUpdateInProgress2: 'Updating in batches, {total} in total, {successNum} successful, {errorNum} failed',
-        batchDeleting: 'Deleting...',
-        batchDeleting2: 'Deleting {total} items in total, {successNum} items successful, {errorNum} items failed',
-        copyFailed: 'Copy failed',
-        noLevel: 'No hierarchical relationship!',
-        batchAddRelation: 'Batch Add Relation',
-        history: 'Change Logs',
-        relITSM: 'Related Tickets',
-        topo: 'Topology',
-        table: 'Table',
-        m2mTips: 'The current CIType relationship is many-to-many, please go to the SerivceTree(relation view) to add or delete',
-        confirmDeleteRelation: 'Confirm to delete the relationship?',
-        tips1: 'Use commas to separate multiple values',
-        tips2: 'The field can be modified as needed. When the value is empty, the field will be left empty.',
-        tips3: 'Please select the fields that need to be modified',
-        tips4: 'At least one field must be selected',
-        tips5: 'Search name | alias',
-        tips6: 'Speed ​​up retrieval, full-text search possible, no need to use conditional filtering\n\n json/link/password currently does not support indexing \n\nText characters longer than 190 cannot be indexed',
-        tips7: 'The form of expression is a drop-down box, and the value must be in the predefined value',
-        tips8: 'Multiple values, such as intranet IP',
-        tips9: 'For front-end only',
-        tips10: 'Other attributes of the CIType are computed using expressions\n\nA code snippet computes the returned value.',
-        newUpdateField: 'Add a Attribute',
-        attributeSettings: 'Attribute Settings',
-        share: 'Share',
-        noPermission: 'No Permission',
-        rollback: 'Rollback',
-        rollbackHeader: 'Instance Rollback',
-        rollbackTo: 'Rollback to',
-        rollbackToTips: 'Please select rollback time',
-        baselineDiff: 'Difference from baseline',
-        instance: 'Instance',
-        rollbackBefore: 'Current value',
-        rollbackAfter: 'After rollback',
-        noDiff: 'CI data has not changed after {baseline}',
-        rollbackConfirm: 'Are you sure you want to rollback?',
-        rollbackSuccess: 'Rollback successfully',
-        rollbackingTips: 'Rollbacking',
-        batchRollbacking: 'Deleting {total} items in total, {successNum} items successful, {errorNum} items failed',
-        baselineTips: 'Changes at this point in time will also be rollbacked, Unique ID and password attributes do not support',
-    },
-    serviceTree: {
-        remove: 'Remove',
-        deleteNode: 'Delete {name}',
-        tips1: 'For example: q=os_version:centos&sort=os_version',
-        tips2: 'Expression search',
-        alert1: 'The administrator has not configured the ServiceTree(relation view), or you do not have permission to access it!',
-        copyFailed: 'Copy failed',
-        deleteRelationConfirm: 'Confirm to remove selected {name} from current relationship?',
-        batch: 'Batch',
-        editNode: 'Edit Node',
-        editNodeName: 'Edit Node Name',
-        grantTitle: 'Grant(read)',
-        userPlaceholder: 'Please select users',
-        rolePlaceholder: 'Please select roles',
-        grantedByServiceTree: 'Granted By Service Tree:',
-        grantedByServiceTreeTips: 'Please delete id_filter in Servive Tree',
-        peopleHasRead: 'Personnel authorized to read:',
-        authorizationPolicy: 'CI Authorization Policy:',
-        idAuthorizationPolicy: 'Authorized by node:',
-        view: 'View permissions',
-        searchTips: 'Search in service tree'
-    },
-    tree: {
-        tips1: 'Please go to Preference page first to complete your subscription!',
-        subSettings: 'Settings',
-    },
-    topo: {
-        addTopoView: 'Add Topology View',
-        editTopoView: 'Edit Topology View',
-        addTopoViewInGroup: 'Define topology view under grouping',
-        groupRequired: 'Please select a group first or create a group',
-        viewName: 'Title',
-        viewNamePlaceholder: 'Please enter a title for the topology view',
-        inputNameTips: 'Title is required',
-        centralNodeType: 'Central Node Model',
-        filterInstances: 'Central Node Instances',
-        typeRequired: 'Central Node Model is required',
-        instancesRequired: 'instances are required',
-        path: 'Path',
-        aggregationCount: 'Aggregation Count',
-        aggreationCountTip: 'When the number of child nodes > the number of aggregations, paging display',
-        preview: 'Preivew',
-        noData: 'No data',
-        edit: 'Edit',
-        delete: 'Delete',
-        searchPlaceholder: 'Search topology view',
-        confirmDeleteView: 'Are you sure you want to delete this view ?',
-        noInstancePerm: 'You do not have read permissions for this instance',
-        noPreferenceAttributes: 'This instance has no subscription attributes or no default displayed attributes',
-    },
-}
-export default cmdb_en
+const cmdb_en = {
+    relation: 'Relation',
+    attribute: 'Attributes',
+    configTable: 'Config Table',
+    menu: {
+        views: 'Views',
+        topologyView: 'Topology Views',
+        resources: 'Resources',
+        config: 'Configuration',
+        backend: 'Management',
+        ciTable: 'Resource Views',
+        ciTree: 'Tree Views',
+        ciSearch: 'Search',
+        adCIs: 'AutoDiscovery Pool',
+        preference: 'Preference',
+        batchUpload: 'Batch Import',
+        citypeManage: 'Modeling',
+        backendManage: 'Backend',
+        customDashboard: 'Custom Dashboard',
+        serviceTreeDefine: 'Service Tree',
+        citypeRelation: 'CIType Relation',
+        operationHistory: 'Operation Audit',
+        relationType: 'Relation Type',
+        ad: 'AutoDiscovery',
+        cidetail: 'CI Detail'
+    },
+    ciType: {
+        ciType: 'CIType',
+        attributes: 'Attributes',
+        relation: 'Relation',
+        trigger: 'Triggers',
+        attributeAD: 'Attributes AutoDiscovery',
+        relationAD: 'Relation AutoDiscovery',
+        grant: 'Grant',
+        addGroup: 'New Group',
+        editGroup: 'Edit Group',
+        group: 'Group',
+        attributeLibray: 'Attribute Library',
+        addCITypeInGroup: 'Add a new CIType to the group',
+        addCIType: 'Add CIType',
+        editGroupName: 'Edit group name',
+        deleteGroup: 'Delete this group',
+        CITypeName: 'Name(English)',
+        English: 'English',
+        inputAttributeName: 'Please enter the attribute name',
+        attributeNameTips: 'It cannot start with a number, it can be English numbers and underscores (_)',
+        editCIType: 'Edit CIType',
+        defaultSort: 'Default sort',
+        selectDefaultOrderAttr: 'Select default sorting attributes',
+        asec: 'Forward order',
+        desc: 'Reverse order',
+        uniqueKey: 'Unique Identifies',
+        uniqueKeySelect: 'Please select a unique identifier',
+        uniqueKeyTips: 'json/password/computed/choice can not be unique identifies',
+        notfound: 'Can\'t find what you want?',
+        cannotDeleteGroupTips: 'There is data under this group and cannot be deleted!',
+        confirmDeleteGroup: 'Are you sure you want to delete group [{groupName}]?',
+        confirmDeleteCIType: 'Are you sure you want to delete model [{typeName}]?',
+        uploading: 'Uploading',
+        uploadFailed: 'Upload failed, please try again later',
+        addPlugin: 'New plugin',
+        deletePlugin: 'Delete plugin',
+        confirmDeleteADT: 'Do you confirm to delete [{pluginName}]',
+        attributeMap: 'Attribute mapping',
+        autoDiscovery: 'AutoDiscovery',
+        node: 'Node',
+        adExecConfig: 'Execute configuration',
+        adExecTarget: 'Execute targets',
+        oneagentIdTips: 'Please enter the hexadecimal OneAgent ID starting with 0x',
+        selectFromCMDBTips: 'Select from CMDB ',
+        adAutoInLib: 'Save as CI auto',
+        adInterval: 'Collection frequency',
+        byInterval: 'by interval',
+        allNodes: 'All Instances',
+        specifyNodes: 'Specify Instance',
+        specifyNodesTips: 'Please fill in the specify instance!',
+        username: 'Username',
+        password: 'Password',
+        link: 'Link',
+        list: 'List',
+        listTips: 'The value of the field is one or more, and the type of the value returned by the interface is list.',
+        computeForAllCITips: 'All CI trigger computes',
+        confirmcomputeForAllCITips: 'Confirm triggering computes for all CIs?',
+        isUnique: 'Is it unique',
+        unique: 'Unique',
+        isChoice: 'Choiced',
+        defaultShow: 'Default Display',
+        defaultShowTips: 'The CI instance table displays this field by default',
+        isSortable: 'Sortable',
+        isIndex: 'Indexed',
+        index: 'Index',
+        indexTips: 'Fields can be used for retrieval to speed up queries',
+        confirmDelete: 'Confirm to delete [{name}]?',
+        confirmDelete2: 'Confirm to delete?',
+        computeSuccess: 'Triggered successfully!',
+        basicConfig: 'Basic Settings',
+        AttributeName: 'Name(English)',
+        DataType: 'Data Type',
+        defaultValue: 'Default value',
+        autoIncID: 'Auto-increment ID',
+        customTime: 'Custom time',
+        advancedSettings: 'Advanced Settings',
+        font: 'Font',
+        color: 'Color',
+        choiceValue: 'Predefined value',
+        computedAttribute: 'Computed Attribute',
+        computedAttributeTips: 'The value of this attribute is calculated through an expression constructed from other attributes of the CIType or by executing a piece of code. The reference method of the attribute is: {{ attribute name }}',
+        addAttribute: 'New attribute',
+        existedAttributes: 'Already have attributes',
+        editAttribute: 'Edit attribute',
+        addAttributeTips1: 'If sorting is selected, it must also be selected!',
+        uniqueConstraint: 'Unique Constraint',
+        up: 'Move up',
+        down: 'Move down',
+        selectAttribute: 'Select Attribute',
+        groupExisted: 'Group name already exists',
+        attributeSortedTips: 'Attributes in other groups cannot be sorted. If you need to sort, please drag them to a custom group first!',
+        buildinAttribute: 'built-in attributes',
+        expr: 'Expression',
+        code: 'Code',
+        apply: 'apply',
+        continueAdd: 'Keep adding',
+        filter: 'Filter',
+        choiceOther: 'Other CIType Attributes',
+        choiceWebhookTips: 'The returned results are filtered by fields, and the hierarchical nesting is separated by ##, such as k1##k2. The web request returns {k1: [{k2: 1}, {k2: 2}]}, and the parsing result is [1, 2 ]',
+        selectCIType: 'Please select a CMDB CIType',
+        selectCITypeAttributes: 'Please select CIType attributes',
+        selectAttributes: 'Please select attributes',
+        choiceScriptDemo: 'class ChoiceValue(object):\n    @staticmethod\n    def values():\n        """\n        Execution entry, returns predefined value\n        :return: Returns a list, the type of the value is the same as the type of the attribute\n        For example:\n        return ["online", "offline"]\n        """\n        return []',
+        valueExisted: 'The current value already exists!',
+        addRelation: 'Add Relation',
+        sourceCIType: 'Source CIType',
+        sourceCITypeTips: 'Please select Source CIType',
+        dstCIType: 'Target CIType',
+        dstCITypeTips: 'Please select target CIType',
+        relationType: 'Relation Type',
+        relationTypeTips: 'Please select relation type',
+        isParent: 'is parent',
+        relationConstraint: 'Constraints',
+        relationConstraintTips: 'please select a relationship constraint',
+        one2Many: 'One to Many',
+        one2One: 'One to One',
+        many2Many: 'Many to Many',
+        basicInfo: 'Basic Information',
+        nameInputTips: 'Please enter name',
+        triggerDataChange: 'Data changes',
+        triggerDate: 'Date attribute',
+        triggerEnable: 'Turn on',
+        descInput: 'Please enter descriptions',
+        triggerCondition: 'Triggering conditions',
+        addInstance: 'Add new instance',
+        deleteInstance: 'Delete instance',
+        changeInstance: 'Instance changes',
+        selectMutipleAttributes: 'Please select attributes (multiple selections)',
+        selectSingleAttribute: 'Please select an attribute (single choice)',
+        beforeDays: 'ahead of time',
+        days: 'Days',
+        notifyAt: 'Send time',
+        notify: 'Notify',
+        triggerAction: 'Trigger action',
+        receivers: 'Recipients',
+        emailTips: 'Please enter your email address, separate multiple email addresses with ;',
+        customEmail: 'Custom recipients',
+        notifySubject: 'Notification title',
+        notifySubjectTips: 'Please enter notification title',
+        notifyContent: 'Content',
+        notifyMethod: 'Notify methods',
+        botSelect: 'Please select a robot',
+        refAttributeTips: 'The title and content can reference the attribute value of the CIType. The reference method is: {{ attr_name }}',
+        webhookRefAttributeTips: 'Request parameters can reference the attribute value of the model. The reference method is: {{ attr_name }}',
+        newTrigger: 'Add trigger',
+        editTriggerTitle: 'Edit trigger {name}',
+        newTriggerTitle: 'Add trigger {name}',
+        confirmDeleteTrigger: 'Are you sure to delete this trigger?',
+        int: 'Integer',
+        float: 'Float',
+        text: 'Text',
+        datetime: 'DateTime',
+        date: 'Date',
+        time: 'Time',
+        json: 'JSON',
+        event: 'Event',
+        reg: 'Regex',
+        isInherit: 'Inherit',
+        inheritType: 'Inherit Type',
+        inheritTypePlaceholder: 'Please select inherit types',
+        inheritFrom: 'inherit from {name}',
+        groupInheritFrom: 'Please go to the {name} for modification',
+        downloadType: 'Download CIType',
+        deleteCIType: 'Delete CIType',
+        otherGroupTips: 'Non sortable within the other group',
+        filterTips: 'click to show {name}',
+        attributeAssociation: 'Attribute Association',
+        attributeAssociationTip1: 'Automatically establish relationships through the attributes except password, json and multiple of two models',
+        attributeAssociationTip2: 'Double click to edit',
+        attributeAssociationTip3: 'Two Attributes must be selected',
+        attributeAssociationTip4: 'Please select a attribute from Source CIType',
+        attributeAssociationTip5: 'Please select a attribute from Target CIType',
+        attributeAssociationTip6: 'Cannot be deleted again.',
+        show: 'show attribute',
+        setAsShow: 'Set as show attribute',
+        cancelSetAsShow: 'Cancel show attribute',
+        showTips: 'The names of nodes in the service tree and topology view'
+    },
+    components: {
+        unselectAttributes: 'Unselected',
+        selectAttributes: 'Selected',
+        downloadCI: 'Export data',
+        filename: 'Filename',
+        filenameInputTips: 'Please enter filename',
+        saveType: 'Save type',
+        saveTypeTips: 'Please select save type',
+        xlsx: 'Excel workbook (*.xlsx)',
+        csv: 'CSV (comma separated) (*.csv)',
+        html: 'Web page (*.html)',
+        xml: 'XML data (*.xml)',
+        txt: 'Text file (tab delimited) (*.txt)',
+        grantUser: 'Grant User/Department',
+        grantRole: 'Grant Role',
+        confirmRevoke: 'Confirm to delete the [Authorization] permission of [{name}]?',
+        readAttribute: 'View Attributes',
+        readCI: 'View CIs',
+        config: 'Configuration',
+        ciTypeGrant: 'Grant CIType',
+        ciGrant: 'Grant CI',
+        attributeGrant: 'Grant Attribute',
+        relationGrant: 'Grant Relation',
+        perm: 'Permissions',
+        all: 'All',
+        customize: 'Customize',
+        none: 'None',
+        customizeFilterName: 'Please enter a custom filter name',
+        colorPickerError: 'Initialization color format error, use #fff or rgb format',
+        example: 'Example value',
+        aliyun: 'aliyun',
+        tencentcloud: 'Tencent Cloud',
+        huaweicloud: 'Huawei Cloud',
+        beforeChange: 'Before change',
+        afterChange: 'After change',
+        noticeContentTips: 'Please enter notification content',
+        saveQuery: 'Save Filters',
+        pleaseSearch: 'Please search',
+        conditionFilter: 'Conditional filtering',
+        attributeDesc: 'Attribute Description',
+        ciSearchTips: '1. JSON/password/link attributes cannot be searched\n2. If the search content includes commas, they need to be escaped\n3. Only index attributes are searched, non-index attributes use conditional filtering',
+        ciSearchTips2: 'For example: q=hostname:*0.0.0.0*',
+        subCIType: 'Subscription CIType',
+        already: 'already',
+        not: 'not',
+        sub: 'subscription',
+        selectBelow: 'Please select below',
+        subSuccess: 'Subscription successful',
+        selectMethods: 'Please select a method',
+        noAuthRequest: 'No certification requested yet',
+        noParamRequest: 'No parameter certification yet',
+        requestParam: 'Request parameters',
+        param: 'Parameter{param}',
+        value: 'Value{value}',
+        clear: 'Clear',
+    },
+    batch: {
+        downloadFailed: 'Download failed',
+        unselectCIType: 'No CIType selected yet',
+        pleaseUploadFile: 'Please upload files',
+        batchUploadCanceled: 'Batch upload canceled',
+        selectCIType: 'Select CIType',
+        selectCITypeTips: 'Please select a CIType and then download',
+        downloadTemplate: 'Download Template',
+        clickDownload: 'Click to Download',
+        drawTips: 'Click or drag files here to upload!',
+        supportFileTypes: 'Supported file types: xls, xlsx',
+        uploadResult: 'Upload results',
+        total: 'total',
+        successItems: 'items, succeeded',
+        failedItems: 'items, failed',
+        items: 'items',
+        errorTips: 'Error message',
+        requestFailedTips: 'An error occurred with the request, please try again later',
+        requestSuccessTips: 'Upload completed',
+        uploadFile: 'Upload File',
+        drawTips1: 'Please <span class="cmdb-batch-upload-tips">select a CIType</span>, and then <span class="cmdb-batch-upload-tips">download</span> ,',
+        drawTips2: '<span class="cmdb-batch-upload-tips">click or drag file</span> to upload',
+        dataPreview: 'Preview data and upload',
+        tips1: 'Kind Reminder :',
+        tips2: '1. Click to download the template, and users can customize the header of the template file, including model properties and model associations',
+        // eslint-disable-next-line no-template-curly-in-string
+        tips3: '2. The red color in the template file represents the model relationship, such as the $Product. Product Name (${Model Name}. {Attribute Name}) column, which establishes the relationship with the product.',
+        tips4: '3. In the download template Excel file, the predefined values of attributes will be set as dropdown options. Please note that due to the limitations of Excel itself, a single dropdown box is limited to a maximum of 255 characters. If it exceeds 255 characters, we will not set the dropdown options for this attribute',
+        tips5: '4. When using Excel templates, please ensure that a single file does not exceed 5000 lines.',
+    },
+    preference: {
+        mySub: 'My Subscription',
+        sub: 'Subscribe',
+        cancelSub: 'Unsubscribe',
+        editSub: 'Edit subscription',
+        peopleSub: ' people subscribed',
+        noSub: 'No subscribed',
+        cancelSubSuccess: 'Unsubscribe successfully',
+        confirmcancelSub: 'Are you sure to cancel your subscription?',
+        confirmcancelSub2: 'Are you sure you want to unsubscribe {name}?',
+        of: 'of',
+        hoursAgo: 'hours ago',
+        daysAgo: 'days ago',
+        monthsAgo: 'month ago',
+        yearsAgo: 'years ago',
+        just: 'just now',
+        searchPlaceholder: 'Please search CIType',
+    },
+    custom_dashboard: {
+        charts: 'Chart',
+        newChart: 'Add Chart',
+        editChart: 'Edit Chart',
+        title: 'Title',
+        titleTips: 'Please enter a chart title',
+        calcIndicators: 'Counter',
+        dimensions: 'Dimensions',
+        selectDimensions: 'Please select a dimension',
+        quantity: 'Quantity',
+        childCIType: 'Relational CIType',
+        level: 'Level',
+        levelTips: 'Please enter the relationship level',
+        preview: 'Preview',
+        showIcon: 'Display icon',
+        chartType: 'Chart Type',
+        dataFilter: 'Data Filtering',
+        format: 'Formats',
+        fontColor: 'Font Color',
+        backgroundColor: 'Background',
+        chartColor: 'Chart Color',
+        chartLength: 'Length',
+        barType: 'Bar Type',
+        stackedBar: 'Stacked Bar',
+        multipleSeriesBar: 'Multiple Series Bar ',
+        axis: 'Axis',
+        direction: 'Direction',
+        lowerShadow: 'Lower Shadow',
+        count: 'Indicator',
+        bar: 'Bar',
+        line: 'Line',
+        pie: 'Pie',
+        table: 'Table',
+        default: 'default',
+        relation: 'Relation',
+        noCustomDashboard: 'The administrator has not customized the dashboard yet',
+    },
+    preference_relation: {
+        newServiceTree: 'Add Service Tree',
+        editServiceTree: 'Edit Service Tree',
+        serviceTreeName: 'Name',
+        serviceTreeNamePlaceholder: 'Please enter the service tree name',
+        public: 'Public',
+        saveLayout: 'Save Layout',
+        childNodesNotFound: 'There are no child nodes and no business relationship can be formed. Please select again!',
+        tips1: 'Cannot form a view with the currently selected node, please select again!',
+        tips2: 'Please enter the new serviceTree name!',
+        tips3: 'Please select at least two nodes!',
+        tips4: 'Leaf node must be selected',
+        tips5: 'Select the tree directory node and display the service tree sub nodes as a Table',
+        showLeafNode: 'Show Leaf Node',
+        showTreeNode: 'Show Tree Node',
+        sort: 'Sort',
+        sort1: 'Leaf node information comes first',
+        sort2: 'Tree node information comes first'
+    },
+    history: {
+        ciChange: 'CI',
+        relationChange: 'Relation',
+        ciTypeChange: 'CIType',
+        triggerHistory: 'Triggers',
+        opreateTime: 'Operate Time',
+        user: 'User',
+        userTips: 'Enter filter username',
+        filter: 'Search',
+        filterOperate: 'fitler operation',
+        attribute: 'Attribute',
+        old: 'Old',
+        new: 'New',
+        noUpdate: 'No update',
+        itemsPerPage: '/page',
+        triggerName: 'Name',
+        event: 'Event',
+        action: 'Actoin',
+        status: 'Status',
+        done: 'Done',
+        undone: 'Undone',
+        triggerTime: 'Trigger Time',
+        totalItems: '{total} records in total',
+        pleaseSelect: 'Please select',
+        startTime: 'Start Time',
+        endTime: 'End Time',
+        deleteCIType: 'Delete CIType',
+        addCIType: 'Add CIType',
+        updateCIType: 'Update CIType',
+        addAttribute: 'Add Attribute',
+        updateAttribute: 'Update Attribute',
+        deleteAttribute: 'Delete Attribute',
+        addTrigger: 'Add Trigger',
+        updateTrigger: 'Update Trigger',
+        deleteTrigger: 'Delete Trigger',
+        addUniqueConstraint: 'Add Unique Constraint',
+        updateUniqueConstraint: 'Update Unique Constraint',
+        deleteUniqueConstraint: 'Delete Unique Constraint',
+        addRelation: 'Add Relation',
+        deleteRelation: 'Delete Relation',
+        noModifications: 'No Modifications',
+        attr: 'attribute',
+        attrId: 'attribute id',
+        changeDescription: 'attribute id: {attr_id}, {before_days} day(s) in advance, Subject: {subject}\nContent: {body}\nNotify At: {notify_at}',
+        ticketStartTime: 'Start Time',
+        ticketCreator: 'Creator',
+        ticketTitle: 'Title',
+        ticketFinishTime: 'Finish Time',
+        ticketNodeName: 'Node Name',
+        itsmUninstalled: 'Please use it in combination with VE ITSM',
+        applyItsm: 'Free Apply ITSM',
+        ticketId: 'Ticket ID',
+    },
+    relation_type: {
+        addRelationType: 'New',
+        nameTips: 'Please enter a type name',
+    },
+    ad: {
+        upload: 'Import',
+        download: 'Export',
+        accept: 'Accept',
+        acceptBy: 'Accept By',
+        acceptTime: 'Accept Time',
+        confirmAccept: 'Confirm Accept?',
+        acceptSuccess: 'Accept successfully',
+        isAccept: 'Is accept',
+        deleteADC: 'Confirm to delete this data?',
+        batchDelete: 'Confirm to delete this data?',
+        agent: 'Built-in & Plug-ins',
+        snmp: 'Network Devices',
+        http: 'Public Clouds',
+        rule: 'AutoDiscovery Rules',
+        timeout: 'Timeout error',
+        mode: 'Mode',
+        collectSettings: 'Collection Settings',
+        updateFields: 'Update Field',
+        pluginScript: `# -*- coding:utf-8 -*-
+
+import json
+        
+        
+class AutoDiscovery(object):
+        
+    @property
+    def unique_key(self):
+        """
+        
+        :return: Returns the name of a unique attribute
+        """
+        return
+        
+    @staticmethod
+    def attributes():
+        """
+        Define attribute fields
+        :return: Returns a list of attribute fields. The list items are (name, type, description). The name must be in English.
+        type: String Integer Float Date DateTime Time JSON
+        For example:
+        return [
+            ("ci_type", "String", "CIType name"),
+            ("private_ip", "String", "Internal IP, multiple values separated by commas")
+        ]
+        """
+        return []
+        
+    @staticmethod
+    def run():
+        """
+        Execution entry, returns collected attribute values
+        :return: 
+        Returns a list, the list item is a dictionary, the dictionary key is the attribute name, and the value is the attribute value
+        For example:
+        return [dict(ci_type="server", private_ip="192.168.1.1")]
+        """
+        return []
+        
+        
+if __name__ == "__main__":
+    result = AutoDiscovery().run()
+    if isinstance(result, list):
+        print("AutoDiscovery::Result::{}".format(json.dumps(result)))
+    else:
+        print("ERROR: The collection return must be a list")
+        `,
+        server: 'Server',
+        vserver: 'VServer',
+        nic: 'NIC',
+        disk: 'harddisk',
+    },
+    ci: {
+        attributeDesc: 'Attribute Description',
+        selectRows: 'Select: {rows} items',
+        addRelation: 'Add Relation',
+        all: 'All',
+        batchUpdate: 'Batch Update',
+        batchUpdateConfirm: 'Are you sure you want to make batch updates?',
+        batchUpdateInProgress: 'Currently being updated in batches',
+        batchUpdateInProgress2: 'Updating in batches, {total} in total, {successNum} successful, {errorNum} failed',
+        batchDeleting: 'Deleting...',
+        batchDeleting2: 'Deleting {total} items in total, {successNum} items successful, {errorNum} items failed',
+        copyFailed: 'Copy failed',
+        noLevel: 'No hierarchical relationship!',
+        batchAddRelation: 'Batch Add Relation',
+        history: 'Change Logs',
+        relITSM: 'Related Tickets',
+        topo: 'Topology',
+        table: 'Table',
+        m2mTips: 'The current CIType relationship is many-to-many, please go to the SerivceTree(relation view) to add or delete',
+        confirmDeleteRelation: 'Confirm to delete the relationship?',
+        tips1: 'Use commas to separate multiple values',
+        tips2: 'The field can be modified as needed. When the value is empty, the field will be left empty.',
+        tips3: 'Please select the fields that need to be modified',
+        tips4: 'At least one field must be selected',
+        tips5: 'Search name | alias',
+        tips6: 'Speed ​​up retrieval, full-text search possible, no need to use conditional filtering\n\n json/link/password currently does not support indexing \n\nText characters longer than 190 cannot be indexed',
+        tips7: 'The form of expression is a drop-down box, and the value must be in the predefined value',
+        tips8: 'Multiple values, such as intranet IP',
+        tips9: 'For front-end only',
+        tips10: 'Other attributes of the CIType are computed using expressions\n\nA code snippet computes the returned value.',
+        newUpdateField: 'Add a Attribute',
+        attributeSettings: 'Attribute Settings',
+        share: 'Share',
+        noPermission: 'No Permission',
+        rollback: 'Rollback',
+        rollbackHeader: 'Instance Rollback',
+        rollbackTo: 'Rollback to',
+        rollbackToTips: 'Please select rollback time',
+        baselineDiff: 'Difference from baseline',
+        instance: 'Instance',
+        rollbackBefore: 'Current value',
+        rollbackAfter: 'After rollback',
+        noDiff: 'CI data has not changed after {baseline}',
+        rollbackConfirm: 'Are you sure you want to rollback?',
+        rollbackSuccess: 'Rollback successfully',
+        rollbackingTips: 'Rollbacking',
+        batchRollbacking: 'Deleting {total} items in total, {successNum} items successful, {errorNum} items failed',
+        baselineTips: 'Changes at this point in time will also be rollbacked, Unique ID and password attributes do not support',
+    },
+    serviceTree: {
+        remove: 'Remove',
+        deleteNode: 'Delete {name}',
+        tips1: 'For example: q=os_version:centos&sort=os_version',
+        tips2: 'Expression search',
+        alert1: 'The administrator has not configured the ServiceTree(relation view), or you do not have permission to access it!',
+        copyFailed: 'Copy failed',
+        deleteRelationConfirm: 'Confirm to remove selected {name} from current relationship?',
+        batch: 'Batch',
+        editNode: 'Edit Node',
+        editNodeName: 'Edit Node Name',
+        grantTitle: 'Grant(read)',
+        userPlaceholder: 'Please select users',
+        rolePlaceholder: 'Please select roles',
+        grantedByServiceTree: 'Granted By Service Tree:',
+        grantedByServiceTreeTips: 'Please delete id_filter in Servive Tree',
+        peopleHasRead: 'Personnel authorized to read:',
+        authorizationPolicy: 'CI Authorization Policy:',
+        idAuthorizationPolicy: 'Authorized by node:',
+        view: 'View permissions',
+        searchTips: 'Search in service tree'
+    },
+    tree: {
+        tips1: 'Please go to Preference page first to complete your subscription!',
+        subSettings: 'Settings',
+    },
+    topo: {
+        addTopoView: 'Add Topology View',
+        editTopoView: 'Edit Topology View',
+        addTopoViewInGroup: 'Define topology view under grouping',
+        groupRequired: 'Please select a group first or create a group',
+        viewName: 'Title',
+        viewNamePlaceholder: 'Please enter a title for the topology view',
+        inputNameTips: 'Title is required',
+        centralNodeType: 'Central Node Model',
+        filterInstances: 'Central Node Instances',
+        typeRequired: 'Central Node Model is required',
+        instancesRequired: 'instances are required',
+        path: 'Path',
+        aggregationCount: 'Aggregation Count',
+        aggreationCountTip: 'When the number of child nodes > the number of aggregations, paging display',
+        preview: 'Preivew',
+        noData: 'No data',
+        edit: 'Edit',
+        delete: 'Delete',
+        searchPlaceholder: 'Search topology view',
+        confirmDeleteView: 'Are you sure you want to delete this view ?',
+        noInstancePerm: 'You do not have read permissions for this instance',
+        noPreferenceAttributes: 'This instance has no subscription attributes or no default displayed attributes',
+    },
+}
+export default cmdb_en
diff --git a/cmdb-ui/src/modules/cmdb/lang/zh.js b/cmdb-ui/src/modules/cmdb/lang/zh.js
index 4ed5e5a..35b6a1b 100644
--- a/cmdb-ui/src/modules/cmdb/lang/zh.js
+++ b/cmdb-ui/src/modules/cmdb/lang/zh.js
@@ -1,593 +1,594 @@
-const cmdb_zh = {
-    relation: '关系',
-    attribute: '属性',
-    configTable: '配置表格',
-    menu: {
-        views: '视图',
-        topologyView: '拓扑视图',
-        resources: '资源',
-        config: '配置',
-        backend: '管理',
-        ciTable: '资源数据',
-        ciTree: '资源层级',
-        ciSearch: '资源搜索',
-        adCIs: '自动发现池',
-        preference: '我的订阅',
-        batchUpload: '批量导入',
-        citypeManage: '模型配置',
-        backendManage: '后台管理',
-        customDashboard: '定制仪表盘',
-        serviceTreeDefine: '服务树定义',
-        citypeRelation: '模型关系',
-        operationHistory: '操作审计',
-        relationType: '关系类型',
-        ad: '自动发现',
-        cidetail: 'CI 详情'
-    },
-    ciType: {
-        ciType: '模型',
-        attributes: '模型属性',
-        relation: '模型关联',
-        trigger: '触发器',
-        attributeAD: '属性自动发现',
-        relationAD: '关系自动发现',
-        grant: '权限配置',
-        addGroup: '新增分组',
-        editGroup: '修改分组',
-        group: '分组',
-        attributeLibray: '属性库',
-        addCITypeInGroup: '在该组中新增CI模型',
-        addCIType: '新增CI模型',
-        editGroupName: '重命名分组',
-        deleteGroup: '删除该组',
-        CITypeName: '模型名(英文)',
-        English: '英文',
-        inputAttributeName: '请输入属性名',
-        attributeNameTips: '不能以数字开头,可以是英文 数字以及下划线 (_)',
-        editCIType: '编辑模型',
-        defaultSort: '默认排序',
-        selectDefaultOrderAttr: '选择默认排序属性',
-        asec: '正序',
-        desc: '倒序',
-        uniqueKey: '唯一标识',
-        uniqueKeySelect: '请选择唯一标识',
-        uniqueKeyTips: 'json、密码、计算属性、预定义值属性不能作为唯一标识',
-        notfound: '找不到想要的?',
-        cannotDeleteGroupTips: '该分组下有数据, 不能删除!',
-        confirmDeleteGroup: '确定要删除分组 【{groupName}】 吗?',
-        confirmDeleteCIType: '确定要删除模型 【{typeName}】 吗?',
-        uploading: '正在导入中',
-        uploadFailed: '导入失败,请稍后重试',
-        addPlugin: '新建plugin',
-        deletePlugin: '删除plugin',
-        confirmDeleteADT: '确认删除 【{pluginName}】',
-        attributeMap: '字段映射',
-        autoDiscovery: '自动发现',
-        node: '节点',
-        adExecConfig: '执行配置',
-        adExecTarget: '执行机器',
-        oneagentIdTips: '请输入以0x开头的16进制OneAgent ID',
-        selectFromCMDBTips: '从CMDB中选择 ',
-        adAutoInLib: '自动入库',
-        adInterval: '采集频率',
-        byInterval: '按间隔',
-        allNodes: '所有实例',
-        specifyNodes: '指定实例',
-        specifyNodesTips: '请填写指定实例!',
-        username: '用户名',
-        password: '密码',
-        link: '链接',
-        list: '多值',
-        listTips: '字段的值是1个或者多个,接口返回的值的类型是list',
-        computeForAllCITips: '所有CI触发计算',
-        confirmcomputeForAllCITips: '确认触发所有CI的计算?',
-        isUnique: '是否唯一',
-        unique: '唯一',
-        isChoice: '是否选择',
-        defaultShow: '默认显示',
-        defaultShowTips: 'CI实例表格默认展示该字段',
-        isSortable: '可排序',
-        isIndex: '是否索引',
-        index: '索引',
-        indexTips: '字段可被用于检索,加速查询',
-        confirmDelete: '确认删除【{name}】?',
-        confirmDelete2: '确认删除?',
-        computeSuccess: '触发成功!',
-        basicConfig: '基础设置',
-        AttributeName: '属性名(英文)',
-        DataType: '数据类型',
-        defaultValue: '默认值',
-        autoIncID: '自增ID',
-        customTime: '自定义时间',
-        advancedSettings: '高级设置',
-        font: '字体',
-        color: '颜色',
-        choiceValue: '预定义值',
-        computedAttribute: '计算属性',
-        computedAttributeTips: '该属性的值是通过模型的其它属性构建的表达式或者执行一段代码的方式计算而来,属性的引用方法为: {{ 属性名 }}',
-        addAttribute: '新增属性',
-        existedAttributes: '已有属性',
-        editAttribute: '编辑属性',
-        addAttributeTips1: '选中排序,则必须也要选中!',
-        uniqueConstraint: '唯一校验',
-        up: '上移',
-        down: '下移',
-        selectAttribute: '添加属性',
-        groupExisted: '分组名称已存在',
-        attributeSortedTips: '其他分组中的属性不能进行排序,如需排序请先拖至自定义的分组!',
-        buildinAttribute: '内置字段',
-        expr: '表达式',
-        code: '代码',
-        apply: '应用',
-        continueAdd: '继续添加',
-        filter: '过滤',
-        choiceOther: '其他模型属性',
-        choiceWebhookTips: '返回的结果按字段来过滤,层级嵌套用##分隔,比如k1##k2,web请求返回{k1: [{k2: 1}, {k2: 2}]}, 解析结果为[1, 2]',
-        selectCIType: '请选择CMDB模型',
-        selectCITypeAttributes: '请选择模型属性',
-        selectAttributes: '请选择属性',
-        choiceScriptDemo: 'class ChoiceValue(object):\n    @staticmethod\n    def values():\n        """\n        执行入口, 返回预定义值\n        :return: 返回一个列表, 值的类型同属性的类型\n        例如:\n        return ["在线", "下线"]\n        """\n        return []',
-        valueExisted: '当前值已存在!',
-        addRelation: '新增关系',
-        sourceCIType: '源模型',
-        sourceCITypeTips: '请选择源模型',
-        dstCIType: '目标模型',
-        dstCITypeTips: '请选择目标模型',
-        relationType: '关联类型',
-        relationTypeTips: '请选择关联类型',
-        isParent: '被',
-        relationConstraint: '关系约束',
-        relationConstraintTips: '请选择关系约束',
-        one2Many: '一对多',
-        one2One: '一对一',
-        many2Many: '多对多',
-        basicInfo: '基本信息',
-        nameInputTips: '请输入名称',
-        triggerDataChange: '数据变更',
-        triggerDate: '日期属性',
-        triggerEnable: '开启',
-        descInput: '请输入描述',
-        triggerCondition: '触发条件',
-        addInstance: '新增实例',
-        deleteInstance: '删除实例',
-        changeInstance: '实例变更',
-        selectMutipleAttributes: '请选择属性(多选)',
-        selectSingleAttribute: '请选择属性(单选)',
-        beforeDays: '提前',
-        days: '天',
-        notifyAt: '发送时间',
-        notify: '通知',
-        triggerAction: '触发动作',
-        receivers: '收件人',
-        emailTips: '请输入邮箱,多个邮箱用;分隔',
-        customEmail: '自定义收件人',
-        notifySubject: '通知标题',
-        notifySubjectTips: '请输入通知标题',
-        notifyContent: '内容',
-        notifyMethod: '通知方式',
-        botSelect: '请选择机器人',
-        refAttributeTips: '标题、内容可以引用该模型的属性值,引用方法为: {{ attr_name }}',
-        webhookRefAttributeTips: '请求参数可以引用该模型的属性值,引用方法为: {{ attr_name }}',
-        newTrigger: '新增触发器',
-        editTriggerTitle: '编辑触发器 {name}',
-        newTriggerTitle: '新增触发器 {name}',
-        confirmDeleteTrigger: '确认删除该触发器吗?',
-        int: '整数',
-        float: '浮点数',
-        text: '文本',
-        datetime: '日期时间',
-        date: '日期',
-        time: '时间',
-        json: 'JSON',
-        event: '事件',
-        reg: '正则校验',
-        isInherit: '是否继承',
-        inheritType: '继承模型',
-        inheritTypePlaceholder: '请选择继承模型(多选)',
-        inheritFrom: '属性继承自{name}',
-        groupInheritFrom: '请至{name}进行修改',
-        downloadType: '下载模型',
-        deleteCIType: '删除模型',
-        otherGroupTips: '其他分组属性不可排序',
-        filterTips: '点击可仅查看{name}属性',
-        attributeAssociation: '属性关联',
-        attributeAssociationTip1: '通过2个模型的属性值(除密码、json、多值)来自动建立关系',
-        attributeAssociationTip2: '双击可编辑',
-        attributeAssociationTip3: '属性关联必须选择两个属性',
-        attributeAssociationTip4: '请选择原模型属性',
-        attributeAssociationTip5: '请选择目标模型属性',
-        show: '展示属性',
-        setAsShow: '设置为展示属性',
-        cancelSetAsShow: '取消设置为展示属性',
-        showTips: '服务树和拓扑视图里节点的名称'
-    },
-    components: {
-        unselectAttributes: '未选属性',
-        selectAttributes: '已选属性',
-        downloadCI: '导出数据',
-        filename: '文件名',
-        filenameInputTips: '请输入文件名',
-        saveType: '保存类型',
-        saveTypeTips: '请选择保存类型',
-        xlsx: 'Excel工作簿(*.xlsx)',
-        csv: 'CSV(逗号分隔)(*.csv)',
-        html: '网页(*.html)',
-        xml: 'XML数据(*.xml)',
-        txt: '文本文件(制表符分隔)(*.txt)',
-        grantUser: '授权用户/部门',
-        grantRole: '授权角色',
-        confirmRevoke: '确认删除 【{name}】 的 【授权】 权限?',
-        readAttribute: '查看字段',
-        readCI: '查看实例',
-        config: '配置',
-        ciTypeGrant: '模型权限',
-        ciGrant: '实例权限',
-        attributeGrant: '字段权限',
-        relationGrant: '关系权限',
-        perm: '权限',
-        all: '全部',
-        customize: '自定义',
-        none: '无',
-        customizeFilterName: '请输入自定义筛选条件名',
-        colorPickerError: '初始化颜色格式错误,使用#fff或rgb格式',
-        example: '示例值',
-        aliyun: '阿里云',
-        tencentcloud: '腾讯云',
-        huaweicloud: '华为云',
-        beforeChange: '变更前',
-        afterChange: '变更后',
-        noticeContentTips: '请输入通知内容',
-        saveQuery: '保存条件',
-        pleaseSearch: '请查找',
-        conditionFilter: '条件过滤',
-        attributeDesc: '属性说明',
-        ciSearchTips: '1. json、密码、链接属性不能搜索\n2. 搜索内容包括逗号, 则需转义\n3. 只搜索索引属性, 非索引属性使用条件过滤',
-        ciSearchTips2: '例: q=hostname:*0.0.0.0*',
-        subCIType: '订阅模型',
-        already: '已',
-        not: '未',
-        sub: '订阅',
-        selectBelow: '请在下方进行选择',
-        subSuccess: '订阅成功',
-        selectMethods: '请选择方式',
-        noAuthRequest: '暂无请求认证',
-        noParamRequest: '暂无参数认证',
-        requestParam: '请求参数',
-        param: '参数{param}',
-        value: '值{value}',
-        clear: '清空',
-    },
-    batch: {
-        downloadFailed: '失败下载',
-        unselectCIType: '尚未选择模板类型',
-        pleaseUploadFile: '请上传文件',
-        batchUploadCanceled: '批量上传已取消',
-        selectCIType: '选择模型',
-        selectCITypeTips: '请选择模型后下载模板',
-        downloadTemplate: '下载模板',
-        clickDownload: '点击下载',
-        supportFileTypes: '支持文件类型:xls,xlsx',
-        uploadResult: '上传结果',
-        total: '共',
-        successItems: '条,已成功',
-        failedItems: '条,失败',
-        items: '条',
-        errorTips: '错误信息',
-        requestFailedTips: '请求出现错误,请稍后再试',
-        requestSuccessTips: '批量上传已完成',
-        uploadFile: '文件上传',
-        drawTips1: '请先<span class="cmdb-batch-upload-tips">选择模型</span>,<span class="cmdb-batch-upload-tips">下载模板</span>后',
-        drawTips2: '<span class="cmdb-batch-upload-tips">点击或拖拽文件</span>至此上传',
-        dataPreview: '数据预览并导入',
-        tips1: '温馨提示:',
-        tips2: '1. 点击下载模板,用户可以自定义模板文件的表头,包括模型属性、模型关联',
-        // eslint-disable-next-line no-template-curly-in-string
-        tips3: '2. 模板文件中红色为模型关系,如$产品.产品名(${模型名}.{属性名})这一列就可建立和产品之间的关系',
-        tips4: '3. 下载模板excel文件中会将属性的预定义值置为下拉选项,请注意,受excel本身的限制,单个下拉框限制了最多255个字符,如果超过255个字符,我们不会设置该属性的下拉选项',
-        tips5: '4. 在使用excel模板时,请确保单个文件不超过5000行',
-    },
-    preference: {
-        mySub: '我的订阅',
-        sub: '订阅',
-        cancelSub: '取消订阅',
-        editSub: '编辑订阅',
-        peopleSub: '位同事已订阅',
-        noSub: '暂无同事订阅',
-        cancelSubSuccess: '取消订阅成功',
-        confirmcancelSub: '确认取消订阅',
-        confirmcancelSub2: '确认取消订阅 {name} 吗?',
-        of: '的',
-        hoursAgo: '小时前',
-        daysAgo: '天前',
-        monthsAgo: '月前',
-        yearsAgo: '年前',
-        just: '刚刚',
-        searchPlaceholder: '请搜索模型',
-    },
-    custom_dashboard: {
-        charts: '图表',
-        newChart: '新增图表',
-        editChart: '编辑图表',
-        title: '标题',
-        titleTips: '请输入图表标题',
-        calcIndicators: '计算指标',
-        dimensions: '维度',
-        selectDimensions: '请选择维度',
-        quantity: '数量',
-        childCIType: '关系模型',
-        level: '层级',
-        levelTips: '请输入关系层级',
-        preview: '预览',
-        showIcon: '是否显示icon',
-        chartType: '图表类型',
-        dataFilter: '数据筛选',
-        format: '格式',
-        fontColor: '字体颜色',
-        backgroundColor: '背景颜色',
-        chartColor: '图表颜色',
-        chartLength: '图表长度',
-        barType: '柱状图类型',
-        stackedBar: '堆积柱状图',
-        multipleSeriesBar: '多系列柱状图',
-        axis: '轴',
-        direction: '方向',
-        lowerShadow: '下方阴影',
-        count: '指标',
-        bar: '柱状图',
-        line: '折线图',
-        pie: '饼状图',
-        table: '表格',
-        default: '默认',
-        relation: '关系',
-        noCustomDashboard: '管理员暂未定制仪表盘',
-    },
-    preference_relation: {
-        newServiceTree: '新增服务树',
-        editServiceTree: '编辑服务树',
-        serviceTreeName: '服务树名',
-        serviceTreeNamePlaceholder: '请输入服务树名',
-        public: '公开',
-        saveLayout: '保存布局',
-        childNodesNotFound: '不存在子节点,不能形成业务关系,请重新选择!',
-        tips1: '不能与当前选中节点形成视图,请重新选择!',
-        tips2: '请输入新增服务树名!',
-        tips3: '请选择至少两个节点!',
-        tips4: '树子节点为必选',
-        tips5: '选中树目录节点,服务树子节点展示成Table',
-        showLeafNode: '树的子节点展示成Table',
-        showTreeNode: '展示树节点信息',
-        sort: '顺序',
-        sort1: '树子节点信息在前',
-        sort2: '树节点信息在前'
-
-    },
-    history: {
-        ciChange: 'CI变更',
-        relationChange: '关系变更',
-        ciTypeChange: '模型变更',
-        triggerHistory: '触发历史',
-        opreateTime: '操作时间',
-        user: '用户',
-        userTips: '输入筛选用户名',
-        filter: '筛选',
-        filterOperate: '筛选操作',
-        attribute: '属性',
-        old: '旧',
-        new: '新',
-        noUpdate: '没有修改',
-        itemsPerPage: '/页',
-        triggerName: '触发器名称',
-        event: '事件',
-        action: '动作',
-        status: '状态',
-        done: '已完成',
-        undone: '未完成',
-        triggerTime: '触发时间',
-        totalItems: '共 {total} 条记录',
-        pleaseSelect: '请选择',
-        startTime: '开始时间',
-        endTime: '结束时间',
-        deleteCIType: '删除模型',
-        addCIType: '新增模型',
-        updateCIType: '修改模型',
-        addAttribute: '新增属性',
-        updateAttribute: '修改属性',
-        deleteAttribute: '删除属性',
-        addTrigger: '新增触发器',
-        updateTrigger: '修改触发器',
-        deleteTrigger: '删除触发器',
-        addUniqueConstraint: '新增联合唯一',
-        updateUniqueConstraint: '修改联合唯一',
-        deleteUniqueConstraint: '删除联合唯一',
-        addRelation: '新增关系',
-        deleteRelation: '删除关系',
-        noModifications: '没有修改',
-        attr: '属性名',
-        attrId: '属性ID',
-        changeDescription: '属性ID:{attr_id},提前:{before_days}天,主题:{subject}\n内容:{body}\n通知时间:{notify_at}',
-        ticketStartTime: '工单发起时间',
-        ticketCreator: '发起人',
-        ticketTitle: '工单名称',
-        ticketFinishTime: '节点完成时间',
-        ticketNodeName: '节点名称',
-        itsmUninstalled: '请结合维易ITSM使用',
-        applyItsm: '免费申请',
-        ticketId: '工单ID',
-    },
-    relation_type: {
-        addRelationType: '新增关系类型',
-        nameTips: '请输入类型名',
-    },
-    ad: {
-        upload: '规则导入',
-        download: '规则导出',
-        accept: '入库',
-        acceptBy: '入库人',
-        acceptTime: '入库时间',
-        confirmAccept: '确认入库?',
-        acceptSuccess: '入库成功',
-        isAccept: '是否入库',
-        deleteADC: '确认删除该条数据?',
-        batchDelete: '确认删除这些数据?',
-        agent: '内置 & 插件',
-        snmp: '网络设备',
-        http: '公有云资源',
-        rule: '自动发现规则',
-        timeout: '超时错误',
-        mode: '模式',
-        collectSettings: '采集设置',
-        updateFields: '更新字段',
-        pluginScript: `# -*- coding:utf-8 -*-
-
-import json
-        
-        
-class AutoDiscovery(object):
-        
-    @property
-    def unique_key(self):
-        """
-        
-        :return: Returns the name of a unique attribute
-        """
-        return
-        
-    @staticmethod
-    def attributes():
-        """
-        Define attribute fields
-        :return: Returns a list of attribute fields. The list items are (name, type, description). The name must be in English.
-        type: String Integer Float Date DateTime Time JSON
-        For example:
-        return [
-            ("ci_type", "String", "CIType name"),
-            ("private_ip", "String", "Internal IP, multiple values separated by commas")
-        ]
-        """
-        return []
-        
-    @staticmethod
-    def run():
-        """
-        Execution entry, returns collected attribute values
-        :return: 
-        Returns a list, the list item is a dictionary, the dictionary key is the attribute name, and the value is the attribute value
-        For example:
-        return [dict(ci_type="server", private_ip="192.168.1.1")]
-        """
-        return []
-        
-        
-if __name__ == "__main__":
-    result = AutoDiscovery().run()
-    if isinstance(result, list):
-        print("AutoDiscovery::Result::{}".format(json.dumps(result)))
-    else:
-        print("ERROR: The collection return must be a list")
-        `,
-        server: '物理机',
-        vserver: '虚拟机',
-        nic: '网卡',
-        disk: '硬盘',
-    },
-    ci: {
-        attributeDesc: '查看属性配置',
-        selectRows: '选取:{rows} 项',
-        addRelation: '添加关系',
-        all: '全部',
-        batchUpdate: '批量修改',
-        batchUpdateConfirm: '确认要批量修改吗?',
-        batchUpdateInProgress: '正在批量修改',
-        batchUpdateInProgress2: '正在批量修改,共{total}个,成功{successNum}个,失败{errorNum}个',
-        batchDeleting: '正在删除...',
-        batchDeleting2: '正在删除,共{total}个,成功{successNum}个,失败{errorNum}个',
-        copyFailed: '复制失败!',
-        noLevel: '无层级关系!',
-        batchAddRelation: '批量添加关系',
-        history: '变更记录',
-        relITSM: '关联工单',
-        topo: '拓扑',
-        table: '表格',
-        m2mTips: '当前模型关系为多对多,请前往关系视图进行增删操作',
-        confirmDeleteRelation: '确认删除关系?',
-        tips1: '多个值使用,分割',
-        tips2: '可根据需要修改字段,当值为 空 时,则该字段 置空',
-        tips3: '请选择需要修改的字段',
-        tips4: '必须至少选择一个字段',
-        tips5: '搜索 名称 | 别名',
-        tips6: '加快检索, 可以全文搜索, 无需使用条件过滤\n\n json、链接、密码目前不支持建索引 \n\n文本字符长度超过190不能建索引',
-        tips7: '表现形式是下拉框, 值必须在预定义值里',
-        tips8: '多值, 比如内网IP',
-        tips9: '仅针对前端',
-        tips10: '模型的其他属性通过表达式的方式计算出来\n\n一个代码片段计算返回的值',
-        newUpdateField: '新增修改字段',
-        attributeSettings: '字段设置',
-        share: '分享',
-        noPermission: '暂无权限',
-        rollback: '回滚',
-        rollbackHeader: '实例回滚',
-        rollbackTo: '回滚至: ',
-        rollbackToTips: '请选择回滚时间点',
-        baselineDiff: '基线对比结果',
-        instance: '实例',
-        rollbackBefore: '当前值',
-        rollbackAfter: '回滚后',
-        noDiff: '在【{baseline}】后数据没有发生变化',
-        rollbackConfirm: '确认要回滚吗 ?',
-        rollbackSuccess: '回滚成功',
-        rollbackingTips: '正在批量回滚中',
-        batchRollbacking: '正在回滚,共{total}个,成功{successNum}个,失败{errorNum}个',
-        baselineTips: '该时间点的变更也会被回滚, 唯一标识、密码属性不支持回滚',
-    },
-    serviceTree: {
-        remove: '移除',
-        deleteNode: '移除 {name}',
-        tips1: '例:q=os_version:centos&sort=os_version',
-        tips2: '表达式搜索',
-        alert1: '管理员 还未配置业务关系, 或者你无权限访问!',
-        copyFailed: '复制失败',
-        deleteRelationConfirm: '确认将选中的 {name} 从当前关系中删除?',
-        batch: '批量操作',
-        editNode: '编辑节点',
-        editNodeName: '修改节点名',
-        grantTitle: '授权(查看权限)',
-        userPlaceholder: '请选择用户',
-        rolePlaceholder: '请选择角色',
-        grantedByServiceTree: '服务树授权:',
-        grantedByServiceTreeTips: '请先在服务树里删掉节点授权',
-        peopleHasRead: '当前有查看权限的人员:',
-        authorizationPolicy: '实例授权策略:',
-        idAuthorizationPolicy: '按节点授权的:',
-        view: '查看权限',
-        searchTips: '在服务树中筛选'
-    },
-    tree: {
-        tips1: '请先到 我的订阅 页面完成订阅!',
-        subSettings: '订阅设置',
-    },
-    topo: {
-        addTopoView: '新增拓扑视图',
-        editTopoView: '编辑拓扑视图',
-        addTopoViewInGroup: '在分组下定义拓扑视图',
-        groupRequired: '请先选择分组或者创建分组',
-        viewName: '标题',
-        viewNamePlaceholder: '请输入拓扑视图的标题',
-        inputNameTips: '必须输入标题',
-        centralNodeType: '中心节点模型',
-        filterInstances: '中心节点实例',
-        typeRequired: '必须要选择中心节点模型',
-        instancesRequired: '实例必须要选择',
-        path: '路径选择',
-        aggregationCount: '聚合数',
-        aggreationCountTip: '当子节点数 > 聚合数 则进行分页展示',
-        preview: '预览',
-        noData: '没有数据',
-        edit: '编辑',
-        delete: '删除',
-        searchPlaceholder: '搜索拓扑视图',
-        confirmDeleteView: '您确定要删除该视图吗?',
-        noInstancePerm: '您没有该实例的查看权限',
-        noPreferenceAttributes: '该实例没有订阅属性或者没有默认展示的属性',
-    },
-}
-export default cmdb_zh
+const cmdb_zh = {
+    relation: '关系',
+    attribute: '属性',
+    configTable: '配置表格',
+    menu: {
+        views: '视图',
+        topologyView: '拓扑视图',
+        resources: '资源',
+        config: '配置',
+        backend: '管理',
+        ciTable: '资源数据',
+        ciTree: '资源层级',
+        ciSearch: '资源搜索',
+        adCIs: '自动发现池',
+        preference: '我的订阅',
+        batchUpload: '批量导入',
+        citypeManage: '模型配置',
+        backendManage: '后台管理',
+        customDashboard: '定制仪表盘',
+        serviceTreeDefine: '服务树定义',
+        citypeRelation: '模型关系',
+        operationHistory: '操作审计',
+        relationType: '关系类型',
+        ad: '自动发现',
+        cidetail: 'CI 详情'
+    },
+    ciType: {
+        ciType: '模型',
+        attributes: '模型属性',
+        relation: '模型关联',
+        trigger: '触发器',
+        attributeAD: '属性自动发现',
+        relationAD: '关系自动发现',
+        grant: '权限配置',
+        addGroup: '新增分组',
+        editGroup: '修改分组',
+        group: '分组',
+        attributeLibray: '属性库',
+        addCITypeInGroup: '在该组中新增CI模型',
+        addCIType: '新增CI模型',
+        editGroupName: '重命名分组',
+        deleteGroup: '删除该组',
+        CITypeName: '模型名(英文)',
+        English: '英文',
+        inputAttributeName: '请输入属性名',
+        attributeNameTips: '不能以数字开头,可以是英文 数字以及下划线 (_)',
+        editCIType: '编辑模型',
+        defaultSort: '默认排序',
+        selectDefaultOrderAttr: '选择默认排序属性',
+        asec: '正序',
+        desc: '倒序',
+        uniqueKey: '唯一标识',
+        uniqueKeySelect: '请选择唯一标识',
+        uniqueKeyTips: 'json、密码、计算属性、预定义值属性不能作为唯一标识',
+        notfound: '找不到想要的?',
+        cannotDeleteGroupTips: '该分组下有数据, 不能删除!',
+        confirmDeleteGroup: '确定要删除分组 【{groupName}】 吗?',
+        confirmDeleteCIType: '确定要删除模型 【{typeName}】 吗?',
+        uploading: '正在导入中',
+        uploadFailed: '导入失败,请稍后重试',
+        addPlugin: '新建plugin',
+        deletePlugin: '删除plugin',
+        confirmDeleteADT: '确认删除 【{pluginName}】',
+        attributeMap: '字段映射',
+        autoDiscovery: '自动发现',
+        node: '节点',
+        adExecConfig: '执行配置',
+        adExecTarget: '执行机器',
+        oneagentIdTips: '请输入以0x开头的16进制OneAgent ID',
+        selectFromCMDBTips: '从CMDB中选择 ',
+        adAutoInLib: '自动入库',
+        adInterval: '采集频率',
+        byInterval: '按间隔',
+        allNodes: '所有实例',
+        specifyNodes: '指定实例',
+        specifyNodesTips: '请填写指定实例!',
+        username: '用户名',
+        password: '密码',
+        link: '链接',
+        list: '多值',
+        listTips: '字段的值是1个或者多个,接口返回的值的类型是list',
+        computeForAllCITips: '所有CI触发计算',
+        confirmcomputeForAllCITips: '确认触发所有CI的计算?',
+        isUnique: '是否唯一',
+        unique: '唯一',
+        isChoice: '是否选择',
+        defaultShow: '默认显示',
+        defaultShowTips: 'CI实例表格默认展示该字段',
+        isSortable: '可排序',
+        isIndex: '是否索引',
+        index: '索引',
+        indexTips: '字段可被用于检索,加速查询',
+        confirmDelete: '确认删除【{name}】?',
+        confirmDelete2: '确认删除?',
+        computeSuccess: '触发成功!',
+        basicConfig: '基础设置',
+        AttributeName: '属性名(英文)',
+        DataType: '数据类型',
+        defaultValue: '默认值',
+        autoIncID: '自增ID',
+        customTime: '自定义时间',
+        advancedSettings: '高级设置',
+        font: '字体',
+        color: '颜色',
+        choiceValue: '预定义值',
+        computedAttribute: '计算属性',
+        computedAttributeTips: '该属性的值是通过模型的其它属性构建的表达式或者执行一段代码的方式计算而来,属性的引用方法为: {{ 属性名 }}',
+        addAttribute: '新增属性',
+        existedAttributes: '已有属性',
+        editAttribute: '编辑属性',
+        addAttributeTips1: '选中排序,则必须也要选中!',
+        uniqueConstraint: '唯一校验',
+        up: '上移',
+        down: '下移',
+        selectAttribute: '添加属性',
+        groupExisted: '分组名称已存在',
+        attributeSortedTips: '其他分组中的属性不能进行排序,如需排序请先拖至自定义的分组!',
+        buildinAttribute: '内置字段',
+        expr: '表达式',
+        code: '代码',
+        apply: '应用',
+        continueAdd: '继续添加',
+        filter: '过滤',
+        choiceOther: '其他模型属性',
+        choiceWebhookTips: '返回的结果按字段来过滤,层级嵌套用##分隔,比如k1##k2,web请求返回{k1: [{k2: 1}, {k2: 2}]}, 解析结果为[1, 2]',
+        selectCIType: '请选择CMDB模型',
+        selectCITypeAttributes: '请选择模型属性',
+        selectAttributes: '请选择属性',
+        choiceScriptDemo: 'class ChoiceValue(object):\n    @staticmethod\n    def values():\n        """\n        执行入口, 返回预定义值\n        :return: 返回一个列表, 值的类型同属性的类型\n        例如:\n        return ["在线", "下线"]\n        """\n        return []',
+        valueExisted: '当前值已存在!',
+        addRelation: '新增关系',
+        sourceCIType: '源模型',
+        sourceCITypeTips: '请选择源模型',
+        dstCIType: '目标模型',
+        dstCITypeTips: '请选择目标模型',
+        relationType: '关联类型',
+        relationTypeTips: '请选择关联类型',
+        isParent: '被',
+        relationConstraint: '关系约束',
+        relationConstraintTips: '请选择关系约束',
+        one2Many: '一对多',
+        one2One: '一对一',
+        many2Many: '多对多',
+        basicInfo: '基本信息',
+        nameInputTips: '请输入名称',
+        triggerDataChange: '数据变更',
+        triggerDate: '日期属性',
+        triggerEnable: '开启',
+        descInput: '请输入描述',
+        triggerCondition: '触发条件',
+        addInstance: '新增实例',
+        deleteInstance: '删除实例',
+        changeInstance: '实例变更',
+        selectMutipleAttributes: '请选择属性(多选)',
+        selectSingleAttribute: '请选择属性(单选)',
+        beforeDays: '提前',
+        days: '天',
+        notifyAt: '发送时间',
+        notify: '通知',
+        triggerAction: '触发动作',
+        receivers: '收件人',
+        emailTips: '请输入邮箱,多个邮箱用;分隔',
+        customEmail: '自定义收件人',
+        notifySubject: '通知标题',
+        notifySubjectTips: '请输入通知标题',
+        notifyContent: '内容',
+        notifyMethod: '通知方式',
+        botSelect: '请选择机器人',
+        refAttributeTips: '标题、内容可以引用该模型的属性值,引用方法为: {{ attr_name }}',
+        webhookRefAttributeTips: '请求参数可以引用该模型的属性值,引用方法为: {{ attr_name }}',
+        newTrigger: '新增触发器',
+        editTriggerTitle: '编辑触发器 {name}',
+        newTriggerTitle: '新增触发器 {name}',
+        confirmDeleteTrigger: '确认删除该触发器吗?',
+        int: '整数',
+        float: '浮点数',
+        text: '文本',
+        datetime: '日期时间',
+        date: '日期',
+        time: '时间',
+        json: 'JSON',
+        event: '事件',
+        reg: '正则校验',
+        isInherit: '是否继承',
+        inheritType: '继承模型',
+        inheritTypePlaceholder: '请选择继承模型(多选)',
+        inheritFrom: '属性继承自{name}',
+        groupInheritFrom: '请至{name}进行修改',
+        downloadType: '下载模型',
+        deleteCIType: '删除模型',
+        otherGroupTips: '其他分组属性不可排序',
+        filterTips: '点击可仅查看{name}属性',
+        attributeAssociation: '属性关联',
+        attributeAssociationTip1: '通过2个模型的属性值(除密码、json、多值)来自动建立关系',
+        attributeAssociationTip2: '双击可编辑',
+        attributeAssociationTip3: '属性关联必须选择两个属性',
+        attributeAssociationTip4: '请选择原模型属性',
+        attributeAssociationTip5: '请选择目标模型属性',
+        attributeAssociationTip6: '不可再删除',
+        show: '展示属性',
+        setAsShow: '设置为展示属性',
+        cancelSetAsShow: '取消设置为展示属性',
+        showTips: '服务树和拓扑视图里节点的名称'
+    },
+    components: {
+        unselectAttributes: '未选属性',
+        selectAttributes: '已选属性',
+        downloadCI: '导出数据',
+        filename: '文件名',
+        filenameInputTips: '请输入文件名',
+        saveType: '保存类型',
+        saveTypeTips: '请选择保存类型',
+        xlsx: 'Excel工作簿(*.xlsx)',
+        csv: 'CSV(逗号分隔)(*.csv)',
+        html: '网页(*.html)',
+        xml: 'XML数据(*.xml)',
+        txt: '文本文件(制表符分隔)(*.txt)',
+        grantUser: '授权用户/部门',
+        grantRole: '授权角色',
+        confirmRevoke: '确认删除 【{name}】 的 【授权】 权限?',
+        readAttribute: '查看字段',
+        readCI: '查看实例',
+        config: '配置',
+        ciTypeGrant: '模型权限',
+        ciGrant: '实例权限',
+        attributeGrant: '字段权限',
+        relationGrant: '关系权限',
+        perm: '权限',
+        all: '全部',
+        customize: '自定义',
+        none: '无',
+        customizeFilterName: '请输入自定义筛选条件名',
+        colorPickerError: '初始化颜色格式错误,使用#fff或rgb格式',
+        example: '示例值',
+        aliyun: '阿里云',
+        tencentcloud: '腾讯云',
+        huaweicloud: '华为云',
+        beforeChange: '变更前',
+        afterChange: '变更后',
+        noticeContentTips: '请输入通知内容',
+        saveQuery: '保存条件',
+        pleaseSearch: '请查找',
+        conditionFilter: '条件过滤',
+        attributeDesc: '属性说明',
+        ciSearchTips: '1. json、密码、链接属性不能搜索\n2. 搜索内容包括逗号, 则需转义\n3. 只搜索索引属性, 非索引属性使用条件过滤',
+        ciSearchTips2: '例: q=hostname:*0.0.0.0*',
+        subCIType: '订阅模型',
+        already: '已',
+        not: '未',
+        sub: '订阅',
+        selectBelow: '请在下方进行选择',
+        subSuccess: '订阅成功',
+        selectMethods: '请选择方式',
+        noAuthRequest: '暂无请求认证',
+        noParamRequest: '暂无参数认证',
+        requestParam: '请求参数',
+        param: '参数{param}',
+        value: '值{value}',
+        clear: '清空',
+    },
+    batch: {
+        downloadFailed: '失败下载',
+        unselectCIType: '尚未选择模板类型',
+        pleaseUploadFile: '请上传文件',
+        batchUploadCanceled: '批量上传已取消',
+        selectCIType: '选择模型',
+        selectCITypeTips: '请选择模型后下载模板',
+        downloadTemplate: '下载模板',
+        clickDownload: '点击下载',
+        supportFileTypes: '支持文件类型:xls,xlsx',
+        uploadResult: '上传结果',
+        total: '共',
+        successItems: '条,已成功',
+        failedItems: '条,失败',
+        items: '条',
+        errorTips: '错误信息',
+        requestFailedTips: '请求出现错误,请稍后再试',
+        requestSuccessTips: '批量上传已完成',
+        uploadFile: '文件上传',
+        drawTips1: '请先<span class="cmdb-batch-upload-tips">选择模型</span>,<span class="cmdb-batch-upload-tips">下载模板</span>后',
+        drawTips2: '<span class="cmdb-batch-upload-tips">点击或拖拽文件</span>至此上传',
+        dataPreview: '数据预览并导入',
+        tips1: '温馨提示:',
+        tips2: '1. 点击下载模板,用户可以自定义模板文件的表头,包括模型属性、模型关联',
+        // eslint-disable-next-line no-template-curly-in-string
+        tips3: '2. 模板文件中红色为模型关系,如$产品.产品名(${模型名}.{属性名})这一列就可建立和产品之间的关系',
+        tips4: '3. 下载模板excel文件中会将属性的预定义值置为下拉选项,请注意,受excel本身的限制,单个下拉框限制了最多255个字符,如果超过255个字符,我们不会设置该属性的下拉选项',
+        tips5: '4. 在使用excel模板时,请确保单个文件不超过5000行',
+    },
+    preference: {
+        mySub: '我的订阅',
+        sub: '订阅',
+        cancelSub: '取消订阅',
+        editSub: '编辑订阅',
+        peopleSub: '位同事已订阅',
+        noSub: '暂无同事订阅',
+        cancelSubSuccess: '取消订阅成功',
+        confirmcancelSub: '确认取消订阅',
+        confirmcancelSub2: '确认取消订阅 {name} 吗?',
+        of: '的',
+        hoursAgo: '小时前',
+        daysAgo: '天前',
+        monthsAgo: '月前',
+        yearsAgo: '年前',
+        just: '刚刚',
+        searchPlaceholder: '请搜索模型',
+    },
+    custom_dashboard: {
+        charts: '图表',
+        newChart: '新增图表',
+        editChart: '编辑图表',
+        title: '标题',
+        titleTips: '请输入图表标题',
+        calcIndicators: '计算指标',
+        dimensions: '维度',
+        selectDimensions: '请选择维度',
+        quantity: '数量',
+        childCIType: '关系模型',
+        level: '层级',
+        levelTips: '请输入关系层级',
+        preview: '预览',
+        showIcon: '是否显示icon',
+        chartType: '图表类型',
+        dataFilter: '数据筛选',
+        format: '格式',
+        fontColor: '字体颜色',
+        backgroundColor: '背景颜色',
+        chartColor: '图表颜色',
+        chartLength: '图表长度',
+        barType: '柱状图类型',
+        stackedBar: '堆积柱状图',
+        multipleSeriesBar: '多系列柱状图',
+        axis: '轴',
+        direction: '方向',
+        lowerShadow: '下方阴影',
+        count: '指标',
+        bar: '柱状图',
+        line: '折线图',
+        pie: '饼状图',
+        table: '表格',
+        default: '默认',
+        relation: '关系',
+        noCustomDashboard: '管理员暂未定制仪表盘',
+    },
+    preference_relation: {
+        newServiceTree: '新增服务树',
+        editServiceTree: '编辑服务树',
+        serviceTreeName: '服务树名',
+        serviceTreeNamePlaceholder: '请输入服务树名',
+        public: '公开',
+        saveLayout: '保存布局',
+        childNodesNotFound: '不存在子节点,不能形成业务关系,请重新选择!',
+        tips1: '不能与当前选中节点形成视图,请重新选择!',
+        tips2: '请输入新增服务树名!',
+        tips3: '请选择至少两个节点!',
+        tips4: '树子节点为必选',
+        tips5: '选中树目录节点,服务树子节点展示成Table',
+        showLeafNode: '树的子节点展示成Table',
+        showTreeNode: '展示树节点信息',
+        sort: '顺序',
+        sort1: '树子节点信息在前',
+        sort2: '树节点信息在前'
+
+    },
+    history: {
+        ciChange: 'CI变更',
+        relationChange: '关系变更',
+        ciTypeChange: '模型变更',
+        triggerHistory: '触发历史',
+        opreateTime: '操作时间',
+        user: '用户',
+        userTips: '输入筛选用户名',
+        filter: '筛选',
+        filterOperate: '筛选操作',
+        attribute: '属性',
+        old: '旧',
+        new: '新',
+        noUpdate: '没有修改',
+        itemsPerPage: '/页',
+        triggerName: '触发器名称',
+        event: '事件',
+        action: '动作',
+        status: '状态',
+        done: '已完成',
+        undone: '未完成',
+        triggerTime: '触发时间',
+        totalItems: '共 {total} 条记录',
+        pleaseSelect: '请选择',
+        startTime: '开始时间',
+        endTime: '结束时间',
+        deleteCIType: '删除模型',
+        addCIType: '新增模型',
+        updateCIType: '修改模型',
+        addAttribute: '新增属性',
+        updateAttribute: '修改属性',
+        deleteAttribute: '删除属性',
+        addTrigger: '新增触发器',
+        updateTrigger: '修改触发器',
+        deleteTrigger: '删除触发器',
+        addUniqueConstraint: '新增联合唯一',
+        updateUniqueConstraint: '修改联合唯一',
+        deleteUniqueConstraint: '删除联合唯一',
+        addRelation: '新增关系',
+        deleteRelation: '删除关系',
+        noModifications: '没有修改',
+        attr: '属性名',
+        attrId: '属性ID',
+        changeDescription: '属性ID:{attr_id},提前:{before_days}天,主题:{subject}\n内容:{body}\n通知时间:{notify_at}',
+        ticketStartTime: '工单发起时间',
+        ticketCreator: '发起人',
+        ticketTitle: '工单名称',
+        ticketFinishTime: '节点完成时间',
+        ticketNodeName: '节点名称',
+        itsmUninstalled: '请结合维易ITSM使用',
+        applyItsm: '免费申请',
+        ticketId: '工单ID',
+    },
+    relation_type: {
+        addRelationType: '新增关系类型',
+        nameTips: '请输入类型名',
+    },
+    ad: {
+        upload: '规则导入',
+        download: '规则导出',
+        accept: '入库',
+        acceptBy: '入库人',
+        acceptTime: '入库时间',
+        confirmAccept: '确认入库?',
+        acceptSuccess: '入库成功',
+        isAccept: '是否入库',
+        deleteADC: '确认删除该条数据?',
+        batchDelete: '确认删除这些数据?',
+        agent: '内置 & 插件',
+        snmp: '网络设备',
+        http: '公有云资源',
+        rule: '自动发现规则',
+        timeout: '超时错误',
+        mode: '模式',
+        collectSettings: '采集设置',
+        updateFields: '更新字段',
+        pluginScript: `# -*- coding:utf-8 -*-
+
+import json
+        
+        
+class AutoDiscovery(object):
+        
+    @property
+    def unique_key(self):
+        """
+        
+        :return: Returns the name of a unique attribute
+        """
+        return
+        
+    @staticmethod
+    def attributes():
+        """
+        Define attribute fields
+        :return: Returns a list of attribute fields. The list items are (name, type, description). The name must be in English.
+        type: String Integer Float Date DateTime Time JSON
+        For example:
+        return [
+            ("ci_type", "String", "CIType name"),
+            ("private_ip", "String", "Internal IP, multiple values separated by commas")
+        ]
+        """
+        return []
+        
+    @staticmethod
+    def run():
+        """
+        Execution entry, returns collected attribute values
+        :return: 
+        Returns a list, the list item is a dictionary, the dictionary key is the attribute name, and the value is the attribute value
+        For example:
+        return [dict(ci_type="server", private_ip="192.168.1.1")]
+        """
+        return []
+        
+        
+if __name__ == "__main__":
+    result = AutoDiscovery().run()
+    if isinstance(result, list):
+        print("AutoDiscovery::Result::{}".format(json.dumps(result)))
+    else:
+        print("ERROR: The collection return must be a list")
+        `,
+        server: '物理机',
+        vserver: '虚拟机',
+        nic: '网卡',
+        disk: '硬盘',
+    },
+    ci: {
+        attributeDesc: '查看属性配置',
+        selectRows: '选取:{rows} 项',
+        addRelation: '添加关系',
+        all: '全部',
+        batchUpdate: '批量修改',
+        batchUpdateConfirm: '确认要批量修改吗?',
+        batchUpdateInProgress: '正在批量修改',
+        batchUpdateInProgress2: '正在批量修改,共{total}个,成功{successNum}个,失败{errorNum}个',
+        batchDeleting: '正在删除...',
+        batchDeleting2: '正在删除,共{total}个,成功{successNum}个,失败{errorNum}个',
+        copyFailed: '复制失败!',
+        noLevel: '无层级关系!',
+        batchAddRelation: '批量添加关系',
+        history: '变更记录',
+        relITSM: '关联工单',
+        topo: '拓扑',
+        table: '表格',
+        m2mTips: '当前模型关系为多对多,请前往关系视图进行增删操作',
+        confirmDeleteRelation: '确认删除关系?',
+        tips1: '多个值使用,分割',
+        tips2: '可根据需要修改字段,当值为 空 时,则该字段 置空',
+        tips3: '请选择需要修改的字段',
+        tips4: '必须至少选择一个字段',
+        tips5: '搜索 名称 | 别名',
+        tips6: '加快检索, 可以全文搜索, 无需使用条件过滤\n\n json、链接、密码目前不支持建索引 \n\n文本字符长度超过190不能建索引',
+        tips7: '表现形式是下拉框, 值必须在预定义值里',
+        tips8: '多值, 比如内网IP',
+        tips9: '仅针对前端',
+        tips10: '模型的其他属性通过表达式的方式计算出来\n\n一个代码片段计算返回的值',
+        newUpdateField: '新增修改字段',
+        attributeSettings: '字段设置',
+        share: '分享',
+        noPermission: '暂无权限',
+        rollback: '回滚',
+        rollbackHeader: '实例回滚',
+        rollbackTo: '回滚至: ',
+        rollbackToTips: '请选择回滚时间点',
+        baselineDiff: '基线对比结果',
+        instance: '实例',
+        rollbackBefore: '当前值',
+        rollbackAfter: '回滚后',
+        noDiff: '在【{baseline}】后数据没有发生变化',
+        rollbackConfirm: '确认要回滚吗 ?',
+        rollbackSuccess: '回滚成功',
+        rollbackingTips: '正在批量回滚中',
+        batchRollbacking: '正在回滚,共{total}个,成功{successNum}个,失败{errorNum}个',
+        baselineTips: '该时间点的变更也会被回滚, 唯一标识、密码属性不支持回滚',
+    },
+    serviceTree: {
+        remove: '移除',
+        deleteNode: '移除 {name}',
+        tips1: '例:q=os_version:centos&sort=os_version',
+        tips2: '表达式搜索',
+        alert1: '管理员 还未配置业务关系, 或者你无权限访问!',
+        copyFailed: '复制失败',
+        deleteRelationConfirm: '确认将选中的 {name} 从当前关系中删除?',
+        batch: '批量操作',
+        editNode: '编辑节点',
+        editNodeName: '修改节点名',
+        grantTitle: '授权(查看权限)',
+        userPlaceholder: '请选择用户',
+        rolePlaceholder: '请选择角色',
+        grantedByServiceTree: '服务树授权:',
+        grantedByServiceTreeTips: '请先在服务树里删掉节点授权',
+        peopleHasRead: '当前有查看权限的人员:',
+        authorizationPolicy: '实例授权策略:',
+        idAuthorizationPolicy: '按节点授权的:',
+        view: '查看权限',
+        searchTips: '在服务树中筛选'
+    },
+    tree: {
+        tips1: '请先到 我的订阅 页面完成订阅!',
+        subSettings: '订阅设置',
+    },
+    topo: {
+        addTopoView: '新增拓扑视图',
+        editTopoView: '编辑拓扑视图',
+        addTopoViewInGroup: '在分组下定义拓扑视图',
+        groupRequired: '请先选择分组或者创建分组',
+        viewName: '标题',
+        viewNamePlaceholder: '请输入拓扑视图的标题',
+        inputNameTips: '必须输入标题',
+        centralNodeType: '中心节点模型',
+        filterInstances: '中心节点实例',
+        typeRequired: '必须要选择中心节点模型',
+        instancesRequired: '实例必须要选择',
+        path: '路径选择',
+        aggregationCount: '聚合数',
+        aggreationCountTip: '当子节点数 > 聚合数 则进行分页展示',
+        preview: '预览',
+        noData: '没有数据',
+        edit: '编辑',
+        delete: '删除',
+        searchPlaceholder: '搜索拓扑视图',
+        confirmDeleteView: '您确定要删除该视图吗?',
+        noInstancePerm: '您没有该实例的查看权限',
+        noPreferenceAttributes: '该实例没有订阅属性或者没有默认展示的属性',
+    },
+}
+export default cmdb_zh
diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue
index 90d44a0..0adcfe4 100644
--- a/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue
+++ b/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue
@@ -1,5 +1,5 @@
 <template>
-  <div :style="{ padding: '0 20px 20px' }">
+  <div class="relation-table" :style="{ padding: '0 20px 20px' }">
     <a-button
       v-if="!isInGrantComp"
       style="margin-bottom: 10px"
@@ -18,6 +18,7 @@
       highlight-hover-row
       keep-source
       class="ops-stripe-table"
+      min-height="500"
       :row-class-name="rowClass"
       :edit-config="{ trigger: 'dblclick', mode: 'cell', showIcon: false }"
       resizable
@@ -43,7 +44,7 @@
           <span v-else>{{ constraintMap[row.constraint] }}</span>
         </template>
       </vxe-column>
-      <vxe-column :width="250" field="attributeAssociation" :edit-render="{}">
+      <vxe-column :width="300" field="attributeAssociation" :edit-render="{}">
         <template #header>
           <span>
             <a-tooltip :title="$t('cmdb.ciType.attributeAssociationTip1')">
@@ -56,43 +57,73 @@
           </span>
         </template>
         <template #default="{row}">
-          <span
-            v-if="row.parent_attr_id && row.child_attr_id"
-          >{{ getAttrNameById(row.isParent ? row.attributes : attributes, row.parent_attr_id) }}=>
-            {{ getAttrNameById(row.isParent ? attributes : row.attributes, row.child_attr_id) }}</span
+          <template
+            v-for="item in row.parentAndChildAttrList"
           >
+            <div
+              :key="item.id"
+              v-if="item.parentAttrId && item.childAttrId"
+            >
+              {{ getAttrNameById(row.isParent ? row.attributes : attributes, item.parentAttrId) }}=>
+              {{ getAttrNameById(row.isParent ? attributes : row.attributes, item.childAttrId) }}
+            </div>
+          </template>
         </template>
         <template #edit="{ row }">
-          <div style="display:inline-flex;align-items:center;">
+          <div
+            v-for="item in tableAttrList"
+            :key="item.id"
+            class="table-attribute-row"
+          >
             <a-select
               allowClear
               size="small"
-              v-model="parent_attr_id"
+              v-model="item.parentAttrId"
               :getPopupContainer="(trigger) => trigger.parentNode"
               :style="{ width: '100px' }"
+              show-search
+              optionFilterProp="title"
             >
-              <a-select-option
+            <a-select-option
                 v-for="attr in filterAttributes(row.isParent ? row.attributes : attributes)"
                 :key="attr.id"
+                :value="attr.id"
+                :title="attr.alias || attr.name"
               >
                 {{ attr.alias || attr.name }}
               </a-select-option>
             </a-select>
-            =>
+            <span class="table-attribute-row-link">=></span>
             <a-select
               allowClear
               size="small"
-              v-model="child_attr_id"
+              v-model="item.childAttrId"
               :getPopupContainer="(trigger) => trigger.parentNode"
               :style="{ width: '100px' }"
+              show-search
+              optionFilterProp="title"
             >
               <a-select-option
                 v-for="attr in filterAttributes(row.isParent ? attributes : row.attributes)"
                 :key="attr.id"
+                :value="attr.id"
+                :title="attr.alias || attr.name"
               >
                 {{ attr.alias || attr.name }}
               </a-select-option>
             </a-select>
+            <a
+              class="table-attribute-row-action"
+              @click="removeTableAttr(item.id)"
+            >
+              <a-icon type="minus-circle" />
+            </a>
+            <a
+              class="table-attribute-row-action"
+              @click="addTableAttr"
+            >
+              <a-icon type="plus-circle" />
+            </a>
           </div>
         </template>
       </vxe-column>
@@ -179,13 +210,16 @@
           </a-select>
         </a-form-item>
         <a-form-item :label="$t('cmdb.ciType.attributeAssociation')">
-          <a-row>
-            <a-col :span="11">
+          <a-row
+            v-for="item in modalAttrList"
+            :key="item.id"
+          >
+            <a-col :span="10">
               <a-form-item>
                 <a-select
                   :placeholder="$t('cmdb.ciType.attributeAssociationTip4')"
                   allowClear
-                  v-decorator="['parent_attr_id', { rules: [{ required: false }] }]"
+                  v-model="item.parentAttrId"
                 >
                   <a-select-option v-for="attr in filterAttributes(attributes)" :key="attr.id">
                     {{ attr.alias || attr.name }}
@@ -196,12 +230,12 @@
             <a-col :span="2" :style="{ textAlign: 'center' }">
               =>
             </a-col>
-            <a-col :span="11">
+            <a-col :span="9">
               <a-form-item>
                 <a-select
                   :placeholder="$t('cmdb.ciType.attributeAssociationTip5')"
                   allowClear
-                  v-decorator="['child_attr_id', { rules: [{ required: false }] }]"
+                  v-model="item.childAttrId"
                 >
                   <a-select-option v-for="attr in filterAttributes(modalChildAttributes)" :key="attr.id">
                     {{ attr.alias || attr.name }}
@@ -209,6 +243,20 @@
                 </a-select>
               </a-form-item>
             </a-col>
+            <a-col :span="3">
+              <a
+                class="modal-attribute-action"
+                @click="removeModalAttr(item.id)"
+              >
+                <a-icon type="minus-circle" />
+              </a>
+              <a
+                class="modal-attribute-action"
+                @click="addModalAttr"
+              >
+                <a-icon type="plus-circle" />
+              </a>
+            </a-col>
           </a-row>
         </a-form-item>
       </a-form>
@@ -227,6 +275,7 @@ import {
 } from '@/modules/cmdb/api/CITypeRelation'
 import { getCITypes } from '@/modules/cmdb/api/CIType'
 import { getCITypeAttributesById } from '@/modules/cmdb/api/CITypeAttr'
+import { v4 as uuidv4 } from 'uuid'
 
 import CMDBGrant from '../../components/cmdbGrant'
 
@@ -259,8 +308,8 @@ export default {
       tableData: [],
       parentTableData: [],
       attributes: [],
-      parent_attr_id: undefined,
-      child_attr_id: undefined,
+      tableAttrList: [],
+      modalAttrList: [],
       modalChildAttributes: [],
     }
   },
@@ -297,8 +346,11 @@ export default {
     async getCITypeParent() {
       await getCITypeParent(this.CITypeId).then((res) => {
         this.parentTableData = res.parents.map((item) => {
+          const parentAndChildAttrList = this.handleAttrList(item)
+
           return {
             ...item,
+            parentAndChildAttrList,
             source_ci_type_name: this.CITypeName,
             source_ci_type_id: this.CITypeId,
             isParent: true,
@@ -309,8 +361,11 @@ export default {
     getCITypeChildren() {
       getCITypeChildren(this.CITypeId).then((res) => {
         const data = res.children.map((obj) => {
+          const parentAndChildAttrList = this.handleAttrList(obj)
+
           return {
             ...obj,
+            parentAndChildAttrList,
             source_ci_type_name: this.CITypeName,
             source_ci_type_id: this.CITypeId,
           }
@@ -322,6 +377,20 @@ export default {
         }
       })
     },
+
+    handleAttrList(data) {
+      const length = Math.min(data?.parent_attr_ids?.length || 0, data.child_attr_ids?.length || 0)
+      const parentAndChildAttrList = []
+      for (let i = 0; i < length; i++) {
+        parentAndChildAttrList.push({
+          id: uuidv4(),
+          parentAttrId: data?.parent_attr_ids?.[i] ?? '',
+          childAttrId: data?.child_attr_ids?.[i] ?? ''
+        })
+      }
+      return parentAndChildAttrList
+    },
+
     getCITypes() {
       getCITypes().then((res) => {
         this.CITypes = res.ci_types
@@ -342,6 +411,13 @@ export default {
     handleCreate() {
       this.drawerTitle = this.$t('cmdb.ciType.addRelation')
       this.visible = true
+      this.$set(this, 'modalAttrList', [
+        {
+          id: uuidv4(),
+          parentAttrId: undefined,
+          childAttrId: undefined
+        }
+      ])
       this.$nextTick(() => {
         this.form.setFieldsValue({
           source_ci_type_id: this.CITypeId,
@@ -365,19 +441,22 @@ export default {
             ci_type_id,
             relation_type_id,
             constraint,
-            parent_attr_id = undefined,
-            child_attr_id = undefined,
           } = values
 
-          if ((!parent_attr_id && child_attr_id) || (parent_attr_id && !child_attr_id)) {
-            this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+          const {
+            parent_attr_ids,
+            child_attr_ids,
+            validate
+          } = this.handleValidateAttrList(this.modalAttrList)
+          if (!validate) {
             return
           }
+
           createRelation(source_ci_type_id, ci_type_id, {
             relation_type_id,
             constraint,
-            parent_attr_id,
-            child_attr_id,
+            parent_attr_ids,
+            child_attr_ids,
           }).then((res) => {
             this.$message.success(this.$t('addSuccess'))
             this.onClose()
@@ -386,6 +465,37 @@ export default {
         }
       })
     },
+
+    /**
+     * 校验属性列表
+     * @param {*} attrList
+     */
+     handleValidateAttrList(attrList) {
+      const parent_attr_ids = []
+      const child_attr_ids = []
+      attrList.map((attr) => {
+        if (attr.parentAttrId) {
+          parent_attr_ids.push(attr.parentAttrId)
+        }
+        if (attr.childAttrId) {
+          child_attr_ids.push(attr.childAttrId)
+        }
+      })
+
+      if (parent_attr_ids.length !== child_attr_ids.length) {
+        this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+        return {
+          validate: false
+        }
+      }
+
+      return {
+        validate: true,
+        parent_attr_ids,
+        child_attr_ids
+      }
+    },
+
     handleOpenGrant(record) {
       this.$refs.cmdbGrant.open({
         name: `${record.source_ci_type_name} -> ${record.name}`,
@@ -401,23 +511,45 @@ export default {
       if (row.isParent) return 'relation-table-parent'
     },
     handleEditActived({ row }) {
-      this.parent_attr_id = row?.parent_attr_id ?? undefined
-      this.child_attr_id = row?.child_attr_id ?? undefined
+      const tableAttrList = []
+
+      const length = Math.min(row?.parent_attr_ids?.length || 0, row.child_attr_ids?.length || 0)
+      if (length) {
+        for (let i = 0; i < length; i++) {
+          tableAttrList.push({
+            id: uuidv4(),
+            parentAttrId: row?.parent_attr_ids?.[i] ?? undefined,
+            childAttrId: row?.child_attr_ids?.[i] ?? undefined
+          })
+        }
+      } else {
+        tableAttrList.push({
+          id: uuidv4(),
+          parentAttrId: undefined,
+          childAttrId: undefined
+        })
+      }
+      this.$set(this, 'tableAttrList', tableAttrList)
     },
     async handleEditClose({ row }) {
       const { source_ci_type_id: parentId, id: childrenId, constraint, relation_type } = row
-      const { parent_attr_id, child_attr_id } = this
       const _find = this.relationTypes.find((item) => item.name === relation_type)
       const relation_type_id = _find?.id
-      if ((!parent_attr_id && child_attr_id) || (parent_attr_id && !child_attr_id)) {
-        this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+      
+      const {
+        parent_attr_ids,
+        child_attr_ids,
+        validate
+      } = this.handleValidateAttrList(this.tableAttrList)
+      if (!validate) {
         return
       }
+
       await createRelation(row.isParent ? childrenId : parentId, row.isParent ? parentId : childrenId, {
         relation_type_id,
         constraint,
-        parent_attr_id,
-        child_attr_id,
+        parent_attr_ids,
+        child_attr_ids,
       }).finally(() => {
         this.getData()
       })
@@ -427,7 +559,9 @@ export default {
       return _find?.alias ?? _find?.name ?? id
     },
     changeChild(value) {
-      this.form.setFieldsValue({ child_attr_id: undefined })
+      this.modalAttrList.forEach((item) => {
+        item.childAttrId = undefined
+      })
       getCITypeAttributesById(value).then((res) => {
         this.modalChildAttributes = res?.attributes ?? []
       })
@@ -436,10 +570,75 @@ export default {
       // filter password/json/is_list
       return attributes.filter((attr) => !attr.is_password && !attr.is_list && attr.value_type !== '6')
     },
+    addTableAttr() {
+      this.tableAttrList.push({
+        id: uuidv4(),
+        parentAttrId: undefined,
+        childAttrId: undefined
+      })
+    },
+    removeTableAttr(id) {
+      if (this.tableAttrList.length <= 1) {
+        this.$message.error(this.$t('cmdb.ciType.attributeAssociationTip6'))
+        return
+      }
+      const index = this.tableAttrList.findIndex((item) => item.id === id)
+      if (index !== -1) {
+        this.tableAttrList.splice(index, 1)
+      }
+    },
+
+    addModalAttr() {
+      this.modalAttrList.push({
+        id: uuidv4(),
+        parentAttrId: undefined,
+        childAttrId: undefined
+      })
+    },
+
+    removeModalAttr(id) {
+      if (this.modalAttrList.length <= 1) {
+        this.$message.error(this.$t('cmdb.ciType.attributeAssociationTip6'))
+        return
+      }
+      const index = this.modalAttrList.findIndex((item) => item.id === id)
+      if (index !== -1) {
+        this.modalAttrList.splice(index, 1)
+      }
+    }
   },
 }
 </script>
 
+<style lang="less" scoped>
+.relation-table {
+  /deep/ .vxe-cell {
+    max-height: max-content !important;
+  }
+}
+.table-attribute-row {
+  display: inline-flex;
+  align-items: center;
+  margin-top: 5px;
+
+  &:last-child {
+    margin-bottom: 5px;
+  }
+
+  &-link {
+    margin: 0 5px;
+  }
+
+  &-action {
+    margin-left: 5px;
+  }
+}
+
+.modal-attribute-action {
+  margin-left: 5px;
+}
+</style>
+
 <style lang="less">
 .ops-stripe-table .vxe-body--row.row--stripe.relation-table-divider {
   background-color: #b1b8d3 !important;
diff --git a/cmdb-ui/src/modules/cmdb/views/model_relation/index.vue b/cmdb-ui/src/modules/cmdb/views/model_relation/index.vue
index 4962570..d5a1d25 100644
--- a/cmdb-ui/src/modules/cmdb/views/model_relation/index.vue
+++ b/cmdb-ui/src/modules/cmdb/views/model_relation/index.vue
@@ -70,13 +70,16 @@
           </a-select>
         </a-form-item>
         <a-form-item :label="$t('cmdb.ciType.attributeAssociation')">
-          <a-row>
-            <a-col :span="11">
+          <a-row
+            v-for="item in modalAttrList"
+            :key="item.id"
+          >
+            <a-col :span="10">
               <a-form-item>
                 <a-select
                   :placeholder="$t('cmdb.ciType.attributeAssociationTip4')"
                   allowClear
-                  v-decorator="['parent_attr_id', { rules: [{ required: false }] }]"
+                  v-model="item.parentAttrId"
                 >
                   <a-select-option v-for="attr in filterAttributes(modalParentAttributes)" :key="attr.id">
                     {{ attr.alias || attr.name }}
@@ -87,12 +90,12 @@
             <a-col :span="2" :style="{ textAlign: 'center' }">
               =>
             </a-col>
-            <a-col :span="11">
+            <a-col :span="9">
               <a-form-item>
                 <a-select
                   :placeholder="$t('cmdb.ciType.attributeAssociationTip5')"
                   allowClear
-                  v-decorator="['child_attr_id', { rules: [{ required: false }] }]"
+                  v-model="item.childAttrId"
                 >
                   <a-select-option v-for="attr in filterAttributes(modalChildAttributes)" :key="attr.id">
                     {{ attr.alias || attr.name }}
@@ -100,6 +103,20 @@
                 </a-select>
               </a-form-item>
             </a-col>
+            <a-col :span="3">
+              <a
+                class="modal-attribute-action"
+                @click="removeModalAttr(item.id)"
+              >
+                <a-icon type="minus-circle" />
+              </a>
+              <a
+                class="modal-attribute-action"
+                @click="addModalAttr"
+              >
+                <a-icon type="plus-circle" />
+              </a>
+            </a-col>
           </a-row>
         </a-form-item>
       </a-form>
@@ -114,6 +131,7 @@ import { getCITypeGroupsConfig } from '@/modules/cmdb/api/ciTypeGroup'
 import { getCITypes } from '@/modules/cmdb/api/CIType'
 import { createRelation, deleteRelation, getCITypeChildren, getRelationTypes } from '@/modules/cmdb/api/CITypeRelation'
 import { getCITypeAttributesById } from '@/modules/cmdb/api/CITypeAttr'
+import { v4 as uuidv4 } from 'uuid'
 
 export default {
   name: 'Index',
@@ -139,6 +157,7 @@ export default {
 
       modalParentAttributes: [],
       modalChildAttributes: [],
+      modalAttrList: [],
     }
   },
   computed: {
@@ -228,6 +247,13 @@ export default {
     handleCreate() {
       this.drawerTitle = this.$t('cmdb.ciType.addRelation')
       this.visible = true
+      this.$set(this, 'modalAttrList', [
+        {
+          id: uuidv4(),
+          parentAttrId: undefined,
+          childAttrId: undefined
+        }
+      ])
       this.$nextTick(() => {
         this.form.setFieldsValue({
           source_ci_type_id: this.sourceCITypeId,
@@ -249,19 +275,22 @@ export default {
             ci_type_id,
             relation_type_id,
             constraint,
-            parent_attr_id = undefined,
-            child_attr_id = undefined,
           } = values
 
-          if ((!parent_attr_id && child_attr_id) || (parent_attr_id && !child_attr_id)) {
-            this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+          const {
+            parent_attr_ids,
+            child_attr_ids,
+            validate
+          } = this.handleValidateAttrList(this.modalAttrList)
+          if (!validate) {
             return
           }
+
           createRelation(source_ci_type_id, ci_type_id, {
             relation_type_id,
             constraint,
-            parent_attr_id,
-            child_attr_id,
+            parent_attr_ids,
+            child_attr_ids,
           }).then((res) => {
             this.$message.success(this.$t('addSuccess'))
             this.onClose()
@@ -272,6 +301,37 @@ export default {
       this.sourceCITypeId = undefined
       this.targetCITypeId = undefined
     },
+
+    /**
+     * 校验属性列表
+     * @param {*} attrList
+     */
+     handleValidateAttrList(attrList) {
+      const parent_attr_ids = []
+      const child_attr_ids = []
+      attrList.map((attr) => {
+        if (attr.parentAttrId) {
+          parent_attr_ids.push(attr.parentAttrId)
+        }
+        if (attr.childAttrId) {
+          child_attr_ids.push(attr.childAttrId)
+        }
+      })
+
+      if (parent_attr_ids.length !== child_attr_ids.length) {
+        this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+        return {
+          validate: false
+        }
+      }
+
+      return {
+        validate: true,
+        parent_attr_ids,
+        child_attr_ids
+      }
+    },
+
     handleOk() {
       this.$refs.table.refresh()
     },
@@ -284,14 +344,18 @@ export default {
     },
     handleSourceTypeChange(value) {
       this.sourceCITypeId = value
-      this.form.setFieldsValue({ parent_attr_id: undefined })
+      this.modalAttrList.forEach((item) => {
+        item.parentAttrId = undefined
+      })
       getCITypeAttributesById(value).then((res) => {
         this.modalParentAttributes = res?.attributes ?? []
       })
     },
     handleTargetTypeChange(value) {
       this.targetCITypeId = value
-      this.form.setFieldsValue({ child_attr_id: undefined })
+      this.modalAttrList.forEach((item) => {
+        item.childAttrId = undefined
+      })
       getCITypeAttributesById(value).then((res) => {
         this.modalChildAttributes = res?.attributes ?? []
       })
@@ -303,12 +367,30 @@ export default {
       // filter password/json/is_list
       return attributes.filter((attr) => !attr.is_password && !attr.is_list && attr.value_type !== '6')
     },
+
+    addModalAttr() {
+      this.modalAttrList.push({
+        id: uuidv4(),
+        parentAttrId: undefined,
+        childAttrId: undefined
+      })
+    },
+
+    removeModalAttr(id) {
+      if (this.modalAttrList.length <= 1) {
+        this.$message.error(this.$t('cmdb.ciType.attributeAssociationTip6'))
+        return
+      }
+      const index = this.modalAttrList.findIndex((item) => item.id === id)
+      if (index !== -1) {
+        this.modalAttrList.splice(index, 1)
+      }
+    }
   },
 }
 </script>
 
 <style lang="less" scoped>
-
 .model-relation {
   background-color: #fff;
   border-radius: @border-radius-box;
@@ -316,4 +398,8 @@ export default {
   height: calc(100vh - 64px);
   margin-bottom: -24px;
 }
+
+.modal-attribute-action {
+  margin-left: 5px;
+}
 </style>
diff --git a/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue b/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue
index 0260f66..31134a7 100644
--- a/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue
+++ b/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue
@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div class="model-relation-table">
     <vxe-table
       ref="xTable"
       stripe
@@ -7,6 +7,7 @@
       show-header-overflow
       show-overflow
       resizable
+      :scroll-y="{enabled: false}"
       :height="`${windowHeight - 160}px`"
       :data="tableData"
       :sort-config="{ defaultSort: { field: 'created_at', order: 'desc' } }"
@@ -34,7 +35,7 @@
           {{ handleConstraint(row.constraint) }}
         </template>
       </vxe-column>
-      <vxe-column :width="250" field="attributeAssociation" :edit-render="{}">
+      <vxe-column :width="300" field="attributeAssociation" :edit-render="{}">
         <template #header>
           <span>
             <a-tooltip :title="$t('cmdb.ciType.attributeAssociationTip1')">
@@ -47,37 +48,73 @@
           </span>
         </template>
         <template #default="{row}">
-          <span
-            v-if="row.parent_attr_id && row.child_attr_id"
-          >{{ getAttrNameById(type2attributes[row.parent_id], row.parent_attr_id) }}=>
-            {{ getAttrNameById(type2attributes[row.child_id], row.child_attr_id) }}</span
+          <template
+            v-for="item in row.parentAndChildAttrList"
           >
+            <div
+              :key="item.id"
+              v-if="item.parentAttrId && item.childAttrId"
+            >
+              {{ getAttrNameById(type2attributes[row.parent_id], item.parentAttrId) }}=>
+              {{ getAttrNameById(type2attributes[row.child_id], item.childAttrId) }}
+            </div>
+          </template>
         </template>
         <template #edit="{ row }">
-          <div style="display:inline-flex;align-items:center;">
+          <div
+            v-for="item in tableAttrList"
+            :key="item.id"
+            class="table-attribute-row"
+          >
             <a-select
               allowClear
               size="small"
-              v-model="parent_attr_id"
+              v-model="item.parentAttrId"
               :getPopupContainer="(trigger) => trigger.parentNode"
               :style="{ width: '100px' }"
+              show-search
+              optionFilterProp="title"
             >
-              <a-select-option v-for="attr in filterAttributes(type2attributes[row.parent_id])" :key="attr.id">
+              <a-select-option
+                v-for="attr in filterAttributes(type2attributes[row.parent_id])"
+                :key="attr.id"
+                :value="attr.id"
+                :title="attr.alias || attr.name"
+              >
                 {{ attr.alias || attr.name }}
               </a-select-option>
             </a-select>
-            =>
+            <span class="table-attribute-row-link">=></span>
             <a-select
               allowClear
               size="small"
-              v-model="child_attr_id"
+              v-model="item.childAttrId"
               :getPopupContainer="(trigger) => trigger.parentNode"
               :style="{ width: '100px' }"
+              show-search
+              optionFilterProp="title"
             >
-              <a-select-option v-for="attr in filterAttributes(type2attributes[row.child_id])" :key="attr.id">
+              <a-select-option
+                v-for="attr in filterAttributes(type2attributes[row.child_id])"
+                :key="attr.id"
+                :value="attr.id"
+                :title="attr.alias || attr.name"
+              >
                 {{ attr.alias || attr.name }}
               </a-select-option>
             </a-select>
+            <a
+              class="table-attribute-row-action"
+              @click="removeTableAttr(item.id)"
+            >
+              <a-icon type="minus-circle" />
+            </a>
+            <a
+              class="table-attribute-row-action"
+              @click="addTableAttr"
+            >
+              <a-icon type="plus-circle" />
+            </a>
           </div>
         </template>
       </vxe-column>
@@ -97,6 +134,7 @@
 </template>
 
 <script>
+import { v4 as uuidv4 } from 'uuid'
 import { getCITypeRelations, deleteRelation, createRelation } from '@/modules/cmdb/api/CITypeRelation'
 import { getRelationTypes } from '@/modules/cmdb/api/relationType'
 import CMDBGrant from '../../../components/cmdbGrant'
@@ -108,8 +146,7 @@ export default {
       tableData: [],
       relationTypeList: null,
       type2attributes: {},
-      parent_attr_id: undefined,
-      child_attr_id: undefined,
+      tableAttrList: [],
     }
   },
   components: {
@@ -137,9 +174,29 @@ export default {
     },
     async getMainData() {
       const { relations, type2attributes } = await getCITypeRelations()
-      this.tableData = relations
+      this.tableData = relations.map((item) => {
+        const parentAndChildAttrList = this.handleAttrList(item)
+        return {
+          ...item,
+          parentAndChildAttrList
+        }
+      })
       this.type2attributes = type2attributes
     },
+
+    handleAttrList(data) {
+      const length = Math.min(data?.parent_attr_ids?.length || 0, data.child_attr_ids?.length || 0)
+      const parentAndChildAttrList = []
+      for (let i = 0; i < length; i++) {
+        parentAndChildAttrList.push({
+          id: uuidv4(),
+          parentAttrId: data?.parent_attr_ids?.[i] ?? '',
+          childAttrId: data?.child_attr_ids?.[i] ?? ''
+        })
+      }
+      return parentAndChildAttrList
+    },
+
     // 获取关系
     async getRelationTypes() {
       const res = await getRelationTypes()
@@ -171,21 +228,75 @@ export default {
       })
     },
     handleEditActived({ row }) {
-      this.parent_attr_id = row?.parent_attr_id ?? undefined
-      this.child_attr_id = row?.child_attr_id ?? undefined
+      const tableAttrList = []
+
+      const length = Math.min(row?.parent_attr_ids?.length || 0, row.child_attr_ids?.length || 0)
+      if (length) {
+        for (let i = 0; i < length; i++) {
+          tableAttrList.push({
+            id: uuidv4(),
+            parentAttrId: row?.parent_attr_ids?.[i] ?? undefined,
+            childAttrId: row?.child_attr_ids?.[i] ?? undefined
+          })
+        }
+      } else {
+        tableAttrList.push({
+          id: uuidv4(),
+          parentAttrId: undefined,
+          childAttrId: undefined
+        })
+      }
+      console.log('handleEditActived', tableAttrList)
+      this.$set(this, 'tableAttrList', tableAttrList)
     },
+
+    /**
+     * 校验属性列表
+     * @param {*} attrList
+     */
+     handleValidateAttrList(attrList) {
+      const parent_attr_ids = []
+      const child_attr_ids = []
+      attrList.map((attr) => {
+        if (attr.parentAttrId) {
+          parent_attr_ids.push(attr.parentAttrId)
+        }
+        if (attr.childAttrId) {
+          child_attr_ids.push(attr.childAttrId)
+        }
+      })
+
+      if (parent_attr_ids.length !== child_attr_ids.length) {
+        this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+        return {
+          validate: false
+        }
+      }
+
+      return {
+        validate: true,
+        parent_attr_ids,
+        child_attr_ids
+      }
+    },
+
     async handleEditClose({ row }) {
       const { parent_id, child_id, constraint, relation_type_id } = row
-      const { parent_attr_id = undefined, child_attr_id = undefined } = this
-      if ((!parent_attr_id && child_attr_id) || (parent_attr_id && !child_attr_id)) {
-        this.$message.warning(this.$t('cmdb.ciType.attributeAssociationTip3'))
+
+      const {
+        parent_attr_ids,
+        child_attr_ids,
+        validate
+      } = this.handleValidateAttrList(this.tableAttrList)
+      if (!validate) {
         return
       }
+
       await createRelation(parent_id, child_id, {
         relation_type_id,
         constraint,
-        parent_attr_id,
-        child_attr_id,
+        parent_attr_ids,
+        child_attr_ids,
       }).finally(() => {
         this.getMainData()
       })
@@ -198,8 +309,49 @@ export default {
       // filter password/json/is_list
       return attributes.filter((attr) => !attr.is_password && !attr.is_list && attr.value_type !== '6')
     },
+
+    addTableAttr() {
+      this.tableAttrList.push({
+        id: uuidv4(),
+        parentAttrId: undefined,
+        childAttrId: undefined
+      })
+    },
+    removeTableAttr(id) {
+      if (this.tableAttrList.length <= 1) {
+        this.$message.error(this.$t('cmdb.ciType.attributeAssociationTip6'))
+        return
+      }
+      const index = this.tableAttrList.findIndex((item) => item.id === id)
+      if (index !== -1) {
+        this.tableAttrList.splice(index, 1)
+      }
+    },
   },
 }
 </script>
 
-<style></style>
+<style lang="less" scoped>
+.relation-table {
+  /deep/ .vxe-cell {
+    max-height: max-content !important;
+  }
+}
+.table-attribute-row {
+  display: inline-flex;
+  align-items: center;
+  margin-top: 5px;
+
+  &:last-child {
+    margin-bottom: 5px;
+  }
+
+  &-link {
+    margin: 0 5px;
+  }
+
+  &-action {
+    margin-left: 5px;
+  }
+}
+</style>