<|start_filename|>edgegallery-fe/src/locales/sandbox_en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const sandboxEn = {
  sandbox: {
    selectSandbox: 'Select Sandbox',
    sandboxDetail: 'Sandbox Detail',
    edgeApplication: 'Edge Application',
    terminal: '5G Terminal',
    baseStation: '5G Base station',
    upf: 'Edge UPF',
    coreNetwork: '5G Core network',
    configureNetwork: 'Configure Network',
    releaseResources: 'Release Resources',
    createImage: 'Create Image',
    vm: 'VM',
    vmDetail: 'VM Detail',
    vmName: 'VM Name',
    network: 'Network',
    image: 'Image',
    flavor: 'Flavor',
    instanceStatus: 'Instance Status',
    instanceInformation: 'Instance Information',
    errMsg: 'Error Message',
    imageName: 'Image Name',
    downloadUrl: 'Download Url',
    stageStatus: 'Stage Status',
    uploadAppPackage: 'Upload Application Code Package',
    uploadAppPackagePromt: 'Note: The file is uploaded to the root directory of the virtual machine by default',
    selectFile: 'Select Package File',
    selectNetworkType: 'Configure Network Type',
    addCustomNetwork: 'Add Custom Network',
    addDescribe: 'Add Describe',
    vmInformation: 'VM Information',
    enterVmName: 'Please enter the name of the VM',
    selectVmflavor: 'Select Vm Flavor',
    useCase: 'Use Case',
    memory: 'Memory',
    systemDisk: 'System Disk',
    dataDisk: 'Data Disk',
    otherCapability: 'Other Capability',
    configureNetworkPorts: 'Configure Network Ports',
    selectImage: 'Select Image',
    imageType: {
      publicImage: 'Public',
      privateImage: 'Private'
    },
    flavorExtraSpecs: 'Flavor Extra Specs',
    enterFlavorExtraSpecs: 'Enter Flavor Extra Specs',
    script: 'Script',
    useScript: 'Whether to use injection script',
    enterScriptContent: 'Enter Script Content',
    type: 'type',
    customSpec: 'Custom Specs',
    typeTip: 'Please select a type',
    hugePage: 'HugePage',
    gpuType: 'GPU Type',
    gpuNum: 'Num',
    hostGroup: 'HostGroup Label',
    cpuPolicy: 'Binding Strategy',
    cpuThread: 'CPU Thread Policy',
    numaNode: 'NUMA Region',
    hugePageTip: 'Please select large page memory',
    gpuTypeTip: 'Please select GPU type',
    gpuNumTip: 'Please select GPU type first',
    hostGroupTip: 'Please enter the host group label',
    isImageEmpty: 'Please select image',
    isNetworkEmpty: 'Please configure the network port',
    addCustomSpec: 'There is no matching data, click to add '
  },
  rulesConfig: {
    appRuleConfig: 'Application Rule Configuration',
    filterRules: 'Filter Rules',
    addFlowFilter: 'Add Flow Filter',
    srcAddress: 'Src IP Address',
    srcPort: 'Src Port',
    dstAddress: 'Dst IP Address',
    dstPort: 'Dst Port',
    tgtTunnelAddress: 'Tunnel destination address',
    dstTunnelPort: 'Tunnel destination port',
    interfaceInfo: 'Interface Information',
    forwardInterfaceTabTitle: 'Forward Interface Information',
    addInterfaceInfo: 'Add Interface Information',
    interfaceType: 'Interface Type',
    tunnelType: 'Tunnel Type',
    srcTunnelAddress: 'Tunnel source address',
    tunnelParams: 'Tunnel Specified Parameters',
    macAddress: 'Destination MAC Address',
    sourceMacAddress: 'Source MAC Address',
    dstIpAddress: 'Dst Ip Address',
    flowFilter: 'Flow Filter',
    multipleIP: 'Please separate multiple IPs with\',\'',
    multiplePort: 'Please separate multiple Ports with\',\'',
    tag: 'Tag',
    protocol: 'Protocol',
    srcTunnelPort: 'Tunnel source port',
    tunnelInfo: 'Tunnel Information',
    macInfo: 'MAC Information',
    IpInfo: 'IP Information',
    ipAddress: 'IP Address',
    trafficRuleIdisEmpty: 'Traffic Rule Id cannot be empty!',
    dnsRuleIdisEmpty: 'DNS Rule Id cannot be empty!',
    trafficRuleIdisExists: 'Traffic Rule Id already exists!',
    dnsRuleIdisExists: 'DNS Rule Id already exists!'
  },
  container: {
    script: 'Script',
    import: 'Import',
    container: 'Container',
    containerDetail: 'Container Detail',
    containerScript: 'Container Script',
    uploadFile: 'Upload File',
    downloadDemo: 'Download Template',
    configFile: 'Config File',
    configFileText: 'Support two mode switching of browsing and editing',
    format: 'Params Check',
    imageInfo: 'Image Information',
    serviceInfo: 'Service Information',
    mepAgentTip: 'If mepagent is not integrated, api cannot be released',
    cpuUsage: 'CPU Usage',
    memUsage: 'Memory Usage',
    diskUsage: 'Disk Usage',
    appName: 'Application Name',
    appClass: 'Load Type',
    createTime: 'Create Time',
    dependent: 'Dependent',
    deploymentStatus: 'Deployment Status',
    podInformation: 'pod Information',
    podName: 'pod Name',
    podStatus: 'pod Status',
    containerName: 'Container Name',
    deployLog: 'Deployment Log'
  },
  sandboxPromptInfomation: {
    imageFileType: 'Please upload files in .rar, .tar, .zip format, and the size does not exceed 5G!',
    addVmSuccess: 'The VM is added successfully!',
    completeContent: 'Please complete the content and click submit again!',
    releaseEnvFailed: 'Failed to release environment!',
    imageInfoErr: 'The image does not exist, please go to "System Image Management" to upload the image!',
    containerScriptUploadTip: 'Please upload files in .yaml or .tgz format!',
    cleanEnvSuccess: 'Release resources successfully!',
    cleanEnvFailed: 'Failed to release resources!',
    noServiceInfo: 'The service information is wrong, please check the file!',
    noImageInfo: 'There is no image information, please check the file!',
    noFormat: 'The parameter verification is wrong, please check the file!',
    imageInfoError: 'information is wrong, please check the file!',
    notInHarbor: 'does not exist in the harbor warehouse, please upload it first!',
    addCustomSuccess: 'Custom specification added successfully!',
    deleteInternetSuccess: 'Network configuration deleted successfully!',
    addInternetFaild: 'The maximum number of network configuration data is 4!',
    internetNameRepeat: 'Duplicate network configuration name!',
    startFailed: 'Failed',
    exportFailed: 'Failed',
    addInternetTip: 'Network name cannot be empty!'
  }
}
export default sandboxEn


<|start_filename|>edgegallery-fe/src/navdata/appStoreNav.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import { NAV_PRE } from '../constants.js'

const pathPre = NAV_PRE.APPSTORE

const appStoreNavData = [
  {
    id: '2.1',
    name: 'Overview',
    path: pathPre + '/home',
    display: true
  },
  {
    id: '2.2',
    name: 'APP Store',
    path: pathPre + '/index',
    display: true
  },
  {
    id: '2.3',
    name: 'My APP',
    path: pathPre + '/myapp',
    display: true,
    authority: ['ROLE_APPSTORE_ADMIN', 'ROLE_APPSTORE_TENANT']
  },
  {
    id: '2.1.8',
    name: 'Docs',
    path: pathPre + '/docs',
    display: true
  },
  {
    id: '2.4',
    name: 'APP Share',
    path: pathPre + '/appShare',
    display: true,
    authority: ['ROLE_APPSTORE_ADMIN'],
    children: [
      {
        id: '2.4.1',
        name: 'External AppStore Management',
        path: pathPre + '/apppromote',
        display: true
      }, {
        id: '2.4.2',
        name: 'App Promote',
        path: pathPre + '/apppromotion',
        display: true
      }, {
        id: '2.4.3',
        name: 'App Pull',
        path: pathPre + '/appPull',
        display: true
      }, {
        id: '2.4.4',
        name: 'Message Center',
        path: pathPre + '/msgCenter',
        display: true
      }, {
        id: '2.4.5',
        name: 'Operation Analyse',
        path: pathPre + '/operationAnalyse',
        display: true
      }
    ]
  },
  {
    id: '2.5',
    name: 'System',
    path: pathPre + '/system',
    display: true,
    authority: ['ROLE_APPSTORE_ADMIN'],
    children: [
      {
        id: '2.5.1',
        name: 'APP Manager',
        path: pathPre + '/appManager',
        display: true
      }, {
        id: '2.5.2',
        name: 'SystemHost',
        path: pathPre + '/systemHost',
        display: true
      }
    ]
  }
]

export {
  appStoreNavData
}


<|start_filename|>src/locales/cn.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
const cn = {
  common: {
    cancelText: '知道了',
    cancel: '取消',
    confirm: '确认',
    close: '关闭',
    download: '下载',
    list: '列表',
    input: '请输入',
    select: '请选择',
    developing: '页面正在开发中。',
    edit: '编辑',
    save: '保存',
    search: '搜索',
    reset: '重置',
    delete: '删除',
    status: '状态',
    operation: '操作',
    all: '全部',
    unknown: '未知',
    more: '更多',
    check: '查看'
  },
  home: {
    enterDev: '进入开发',
    select: '选择',
    start: '开始',
    partner: '合作伙伴'
  },
  footer: {
    about: '关于',
    website: '官网',
    videoResource: '视频资源',
    trainingMaterials: '培训材料',
    communication: '沟通交流',
    softwareDownload: '软件下载',
    community: '社区介绍',
    project: '项目',
    membership: '会员',
    contactUs: '联系我们',
    followUs: '关注我们',
    WeChatPublic: '微信公众号',
    codeWarehouse: '代码仓库',
    followWeibo: '关注微博',
    mailingList: '邮件列表',
    copyright: '版权所有 © EdgeGallery 2019 - 2021 保留一切权利 请参见法律声明',
    legalNotice: '法律声明',
    privacyPolicy: '政策隐私'
  },
  devTools: {
    mecDeveloper: 'MEC开发者',
    pluginName: '插件名称',
    description: '描述',
    author: '作者',
    score: '评分',
    chooseFunction: '请选择功能',
    enterSearch: '请输入关键词',
    detail: '详情',
    delete: '删除',
    deletePlugin: '确定要删除插件吗？',
    deleteProject: '确定要删除项目吗？',
    deleteReport: '确定要删除报告吗？',
    deleteSucc: '删除数据成功',
    deleteFail: '删除数据失败',
    applicationName: '应用名称',
    applicationVersion: '应用版本',
    downloads: '下载次数',
    satisfaction: '满意度',
    pluginDescription: '插件描述',
    submitRate: '请评分',
    upload: '上传',
    pluginFunction: '插件语言',
    pluginType: '插件类型',
    uploadPlugin: '上传插件',
    fileText: '请上传.zip,.rar格式文件，且大小不超过20MB',
    uploadLogo: '上传图标',
    logoText: '请上传.jpg或.png格式文件，或选择默认应用图标，且大小不超过2M',
    uploadApi: '上传API',
    uploadApiFile: 'API定义文件',
    apiText: '请上传.json或者.yaml文件',
    version: '版本',
    uploadNow: '立即上传',
    pluginList: '插件',
    sdkList: 'SDK',
    toolChainText: '请上传.tar.gz文件，且大小不超过10M',
    toolChainInfo1: '工具链是MEC Developer开发者平台中的一个重要特性，当x86平台的App想要上车ARM平台时，底层的代码不可避免的需要进行修改或重写。 App提供者可以通过MEC Developer开发者平台中集成的工具链进行源代码分析，定位需要修改的源代码并根据指导意见进行修改，方便App 部署在ARM平台。',
    toolChainInfo2: '目前，可以对以下文件进行分析',
    toolChainInfo3: 'C/C++软件源码',
    toolChainInfo4: 'C/C++软件构建工程文件',
    toolChainInfo5: 'X86汇编代码',
    mdText: '请上传.md文件，用来说明插件的功能、使用方法等'
  },
  toolBox: {
    appEditorTitle: '应用编辑',
    selectApp: '选择应用',
    provider: '厂商',
    architecture: '架构',
    synchronizeDate: '同步时间',
    publish: '发布',
    publishSuc: '发布成功',
    publishFail: '发布失败',
    modifyPkgSuccess: '修改成功',
    modifyPkgFail: '修改失败',
    appEditor: {
      checkModified: '修改失败或者未修改任何内容均不能发布',
      edit: '预览与编辑',
      checkMf: '发布应用前需要修改‘.mf’文件中的app_product_name,app_provider_id, app_package_version 三个字段中任意一个',
      editAppTitle: '选择需要修改的应用',
      syncFailed: '同步失败!'
    }
  },
  api: {
    docs: '文档',
    updated: '更新时间',
    modify: '修改',
    downLoad: '下载',
    share: '分享',
    applicationAPI: '应用API',
    faceRecognition: '人脸识别',
    vr: 'VR',
    ar: 'AR',
    name: '名称',
    description: '描述',
    apiDetail: 'API详情',
    network: '网络',
    computing: '计算',
    ai: 'AI',
    video: '视频',
    serviceIntroduction: '服务介绍',
    serviceList: '服务列表',
    deleteApi: '点击删除已公开的API',
    usageInstruction: '使用说明',
    serviceSelection: '服务选择：',
    noDataNotice: '暂无数据',
    installGuide: '安装指导',
    hotServices: '热门服务',
    capabilitieTitle: '边缘能力随心选择',
    capabilitieTitle2: '极致体验触手可及',
    capabilitieOneTip: 'EdgeGallery服务全景图',
    capabilitieTwoTip: '开发者实践专区',
    serviceDoc: '服务文档',
    onlineEmulator: '在线模拟器',
    videoTutorial: '视频教程课堂专区',
    developerCommunity: '问答社区',
    Detail: '查看详情',
    videoTutorialDetail: '指导开发者基于EdgeGallery平台进行app应用开发、部署调测、测试认证以及应用发布的全流程。',
    developerCommunityDetail: '用于开发者的交流和学习。',
    telecomStandardCapabilitieTitle: '电信标准支持全景图',
    swithToAPI: '点击跳转到接口在线模拟器界面',
    onlineExperience: '在线体验',
    onlineService: '在线体验服务暂未开通',
    mostPopular: '最受欢迎',
    latestUpdate: '最新更新',
    hot: '热度',
    showMore: '显示更多',
    partition: '所属分区'
  },
  nav: {
    home: '首页',
    devtools: '开发工具',
    plugin: '插件',
    sdk: 'SDk',
    upload: '上传',
    api: 'API',
    introduction: '简介',
    mepApi: '能力中心',
    applicationApi: '应用API',
    test: '测试',
    howTest: '如何测试',
    testApplication: '测试应用',
    testTask: '测试任务管理',
    mecOpenSource: 'MEC开源生态',
    workSpace: '工作空间',
    docs: '文档',
    search: '搜索',
    hsInvalidHintForTimeout: '您长时间未操作，',
    hsInvalidHintForLogout: '您通过其它页面执行了登录或注销操作，',
    hsInvalidHintForServerStopped: '后台服务升级，',
    hsInvalidHint: '当前会话已失效。请选择刷新页面或重新登录。',
    refresh: '刷新',
    reLogin: '重新登录',
    help: '帮助',
    contact: '联系我们',
    serviceDoc: '服务文档',
    apiMulator: '在线模拟器',
    component: '界面组件'
  },
  capabilityCenter: {
    telecomStandards: '电信标准支持全景图'
  },
  workspace: {
    projectStatusEnum: {
      createNew: '新建',
      testing: '测试中',
      tested: '测试完成',
      released: '已发布'
    },
    configYaml: {
      yamlFileType: '请选择后缀名为".yaml"的文件',
      uploadYamlFirst: '请先上传Yaml或者进行可视化配置',
      importFile: '文件导入',
      config: '可视化配置',
      uploadFile: '上传文件',
      downloadDemo: '模版下载',
      uploadYaml: '上传',
      uploadYamlTip: '请上传.yaml文件',
      pass: '文件检测通过',
      fail: '文件检测未通过',
      format: '参数校验',
      imageInfo: '镜像信息',
      serviceInfo: '服务信息',
      mepAgent: 'MEP Agent',
      mepAgentTip: '（如果没有集成mepagent，将无法发布API）',
      visualConfigTip: '如若已上传yaml文件，则不需进行可视化配置'
    },
    uploadImage: {
      successfulTest: '测试成功',
      failTest: '测试失败',
      testfirst: '请先测试',
      useEnvTip: '注：启动后，系统不会再分配公共测试环境，所有测试任务在用户自己的服务器上完成',
      useEnv: '启用环境:',
      test: '测试',
      importNode: '导入节点信息IP:',
      installation: '安装向导',
      software: '软件',
      version: '版本',
      uploadAppImage: '上传APP镜像包',
      mode1: '方式一',
      mode1Desc: '镜像包上传至公共镜像仓库',
      mode1Tip: '(支持dockerhub、SWR镜像仓库，已上传到公共仓库的镜像，请在配置文件中直接引用）',
      mode2: '方式二',
      mode2Desc: '镜像包上传至EdgeGallery镜像仓库',
      mode2Tip: '（请上传rar、tar、zip格式的文件，且大小不超过5G）',
      mode3: '方式三',
      mode3Desc: '镜像包上传至私有边缘节点',
      mode3Tip: '如何搭建私有边缘节点，请参考'
    },
    supportPlatform: {
      title: '选择要支持的部署平台'
    },
    deployFailLog: {
      CSAR: '应用包生成失败，请检查是否上传部署文件',
      hostInfo: '没有可用的沙箱环境，请配置沙箱环境',
      instantiateInfo: '应用实例化失败，可能原因有： 1.沙箱环境配置有误 2.应用名或者端口已被占用 3.其他问题请联系管理员处理',
      workStatus: '获取应用状态失败,可能原因：镜像拉取失败，其他问题联系管理员处理'
    },
    prepare: {
      toolTip: '根据开发语言，选择合适的编程IDE，进行本地安装并完成相关的配置。',
      pluginTip1: 'EdgeGallery平台提供了本地开发使用的',
      pluginTip2: ' IDE插件 ',
      pluginTip3: '，可用来生成的样例代码（目前支持Python和Java语言）',
      codeTip1: 'EdgeGallery提供以下APP本地开发的示例代码供开发者参考，或者点击',
      codeTip2: ' 下载 ',
      codeTip3: '到本地'
    },
    appRelease: {
      appConfig: '应用配置',
      appCertify: '应用认证',
      startTest: '启动测试',
      appRelease: '应用发布',
      addFilter: '添加流量过滤器',
      srcAddress: '源IP地址',
      srcPort: '源端口号',
      dstAddress: '目的IP地址',
      dstPort: '目的端口号',
      trafficRuleId: '流规则标识',
      filterType: '过滤类型',
      priority: '优先级',
      protocol: '协议类型',
      action: '规则动作',
      dnsRuleId: 'DNS规则标识',
      ipAddress: 'IP地址',
      ipAddressType: 'IP地址类型',
      domainName: 'FQDN域名',
      ttl: '有效时长',
      checkRules: '查看详情',
      dnsRule: 'DNS规则',
      trafficRule: '分流规则',
      trafficFilter: '流过滤规则',
      tag: '标签',
      tgtTunnelAddress: '隧道目的地址',
      dstTunnelPort: '隧道目的端口',
      srcTunnelAddress: '隧道源地址',
      srcTunnelPort: '隧道源端口',
      multipleIP: '多个IP请用\',\'分隔',
      multiplePort: '多个端口请用\',\'分隔',
      forwardInterface: '接口信息',
      forwardInterfaceTabTitle: '转发接口信息',
      newInterface: '新增接口信息',
      interfaceType: '接口类型',
      tunnelType: '隧道类型',
      tunnelParams: '隧道指定参数',
      macAddress: '目的MAC地址',
      sourceMacAddress: '源MAC地址',
      interfaceInfo: '接口信息',
      tunnelInfo: '隧道信息',
      macInfo: 'MAC信息',
      IpInfo: 'IP信息',
      capabilityType: '能力类型',
      noService: '您的应用没有依赖平台的生态服务',
      blackWhiteList: '黑白名单',
      UEIdentity: 'UE标识',
      enterAtp: '了解应用测试',
      selectInitialization: '请在左侧服务列表选择需要用到的服务',
      free: '免费',
      price: '元（RMB）/小时',
      priceTitle: '应用定价设置'
    },
    deployDebugVm: {
      vmNameLbl: '项目名称',
      vmSpecLbl: '规格',
      vmImageLbl: '镜像',
      vmNetworkLbl: '网络',
      vmIpLbl: 'IP地址',
      vmStatusLbl: '状态',
      vmApplyTimeLbl: '申请时间',
      vncBtnLbl: '远程登录',
      uploadBtnLbl: '上传代码',
      deleteBtnLbl: '删除',
      createImage: '生成镜像',
      applyResource: '申请资源',
      configSpec: '规格设置',
      configNetwork: '网络设置',
      otherSetting: '应用设置',
      vmName: '虚拟机名称',
      vmSpec: '虚拟机规格',
      selectVmSpecTip: '选择虚拟机规格',
      vmSpecMustSelectTip: '请选择虚拟机规格！',
      scene: '适用场景',
      memory: '内存',
      systemDisk: '系统盘',
      dataDisk: '数据盘',
      otherAbility: '其它能力',
      selectVmImageTip: '选择镜像',
      publicImage: '公有镜像',
      privateImage: '私有镜像',
      selectVmSystemTypeTip: '系统类型',
      selectVmSystemImageTip: '系统镜像',
      vmSystemImageMustSelectTip: '请选择系统镜像！',
      selectNetworkTypeTip: '选择网络类型',
      networkType: '网络类型',
      vmNetworkTypeMustSelectTip: '请选择网络类型！',
      uploadApp: '上传应用代码包',
      selectFile: '选择包文件',
      upload: '开始上传',
      uploadAppFileTip: '请上传.zip,.rar,.tar格式文件，且大小不超过500MB',
      appPackageFileEmpty: '请选择应用代码包文件！',
      deleteVmResPrompt: '确定要删除该虚拟机资源吗？',
      loadVmConfigFailed: '加载虚拟机资源配置失败！',
      applyVmResStart: '开始生成应用包',
      applyVmResFailed: '生成应用包失败！',
      deleteVmResSuccess: '删除虚拟机资源成功！',
      deleteVmResFailed: '删除虚拟机资源失败！',
      createImageText: '应用调测完成，生成镜像',
      generate: '生成',
      stageStatus: '阶段状态',
      uploadPromt: '注：文件默认上传到虚拟机的根目录下',
      vmList: '虚拟机资源详情',
      deployResultList: '部署调测结果',
      deleteVmDeployList: '确定要删除该部署调测结果吗？',
      resourceConfigPromt: '请先进行资源配置',
      releasePromt: '应用没有资源配置，不能进行发布操作',
      flavorExtraSpecs: '主机组配置',
      useScript: '是否使用注入脚本：',
      script: '脚本',
      resourceConfig: '资源配置',
      deploySelect: '部署调测可选',
      deployTips: '通过部署调测可申请虚拟机环境导入app测试包并测试，不通过部署调测也可直接发布vm包',
      setTips: '应用设置根据应用选填',
      akTitle: '应用密钥设置',
      generatePackage: '生成应用包',
      type: '分类'
    },
    visualConfig: {
      podBasicInfo: 'Pod基本信息',
      podNameVerify: 'pod Name不能为空，不能包含下划线',
      workContainer: '工作容器',
      containerNameVerify: '容器名称不能为空',
      imageInfoVerify: '镜像信息格式：imageName:version',
      pullStrategy: '拉取策略',
      internalPort: '内部端口',
      internalPortVerify: '内部端口不能为空',
      envVariable: '环境变量',
      variableName: '变量名',
      variableValue: '值',
      commandLine: '命令行',
      accessMethod: '访问方式Service',
      serviceNameVerify: 'service Name不能为空，不能包含下划线',
      destinationPort: '目标端口',
      destinationPortVerify: '目标端口不能为空',
      nodePort: '节点端口',
      nodePortVerify: '节点端口不能为空',
      viewYamlFile: '查看Yaml文件',
      saveConfigSuccess: '保存配置成功',
      saveConfigFail: '保存配置失败',
      back: '返回',
      visualConfigFile: '可视化配置文件'
    },
    workSpace: '工作空间',
    myProjectList: '我的项目',
    addNewProject: '创建项目',
    projectStatus: '项目状态',
    serial: '序号',
    icon: '图标',
    defaultIcon: '默认图标',
    customIcon: '自定义图标',
    projectName: '项目名称',
    projectType: '项目类型',
    version: '版本',
    provider: '提供者',
    platform: '平台',
    industry: '行业',
    createDate: '创建时间',
    status: '状态',
    operation: '操作',
    remove: '移除',
    detail: '详情',
    statusNew: '新建',
    statusDeploying: '部署中',
    statusSuccess: '部署完成',
    statusFail: '部署失败',
    statusTesting: '测试中',
    statusTested: '测试完成',
    statusReleased: '已发布',
    createProject: '应用开发项目',
    migrationProject: '应用集成项目',
    basicInformation: '基本信息',
    registInformation: '注册信息',
    appName: '应用名称',
    uploadIcon: '上传图标',
    limitition: '请上传.jpg或.png格式文件，或选择默认应用图标，且大小不超过2M',
    iconRequired: '请上传图标',
    chooseAbilities: '能力选择',
    openMEPCapabilities: 'EdgeGallery能力',
    chooseMepC: '选择需要的EdgeGallery能力',
    seviceDiscovery: '业务发现',
    dns: '域名解析',
    location: '位置',
    traffic: '流量',
    bandwith: '宽带',
    rnis: '无线网络信息服务',
    fiveGcapabilities: '5GC能力',
    openMEPECOCapabilities: 'EdgeGallery-eco能力',
    chooseMEPeco: '选择需要的EdgeGallery-eco能力',
    previous: '上一步',
    next: '下一步',
    selectionAbilitiesDetail: '选择能力详情',
    platformCapabilities: '平台能力',
    service: '服务',
    serviceVersion: '服务版本',
    serviceDescription: '服务描述',
    selectLeastOne: '至少选择一个',
    projectLink: '项目链接',
    toolChain: '工具链',
    programTools: '编程工具',
    programPlugin: '编程插件',
    sampleCode: '示例代码',
    confirm: '确定',
    capabilityDetails: '能力选择',
    deploymentTest: '部署调测',
    applicationRelease: '应用发布',
    environmentPreparation: '开发环境准备',
    environmentPreparationTip: '根据应用开发需求，准备一下开发环境',
    choosePlatform: '选择部署平台',
    selectImage: '上传App镜像',
    configureYaml: '配置部署文件',
    server: '选择服务器',
    test: '部署测试',
    abilitiesDetail: '能力详情',
    appDevelopment: '应用开发',
    appIntegration: '应用集成',
    buildTip: '你的应用已经可以被EdgeGallery平台集成，请测试自身APP业务',
    finishTest: '完成测试',
    saveData: '保存配置',
    statistics: '数据统计',
    realTimeStatistics: '实时统计',
    performaceStatistics: '性能统计',
    first: '第一步',
    buildDocker: '构建Docker镜像',
    second: '第二步',
    chooseFile: '拖动镜像文件到这里，或者点击上传',
    remoteaddress: '或者给一个远端支持标准仓库命令的地址',
    name: '名称',
    architecture: '架构',
    address: '地址',
    deploy: '部署',
    description: '描述',
    selectRepository: '选择存储库',
    select: '请选择',
    nextStep: '下一步',
    publish: '发布',
    publishtext: '是否发布您的APP到EdgeGallery 应用商店',
    publictext: '是否公开您的APP的API能力到EdgeGallery生态系统',
    method1: '方式1：选择镜像（选择平台提供的App镜像，用于快速部署上线）',
    method2: '方式2：指定镜像包（需要用户先自己上传到镜像仓库）',
    imagename: '镜像名称',
    imageversion: '版本',
    port: '端口号',
    add: '添加',
    method3: '方式3：上传App镜像包（上传镜像包后，系统会自动将镜像推送至系统仓库）',
    method4: '方式4：上传App源码（上传源码后，系统会自动进行编译生成镜像，并推送至xxx仓库）',
    uploadYaml: '上传Yaml',
    uploadApppackage: '上传APP镜像包',
    appimage: 'App镜像',
    addimage: '添加镜像',
    servicename: '服务名称',
    href: '链接',
    internalPort: '内部端口号',
    outPort: '外部端口号',
    confirmUpload: '确定上传',
    uploadSourceCode: '上传源代码',
    storagePath: '源代码存放路径',
    checkItem: '检查项目：编译器选项、编译器宏、汇编程序、内置函数、属性',
    targetOS: '目标操作系统',
    buildTools: '构建工具',
    compileCommand: '编译命令',
    compilerVersion: '编译器版本',
    targetVersion: '目标系统内核版本',
    analysis: '分析',
    historicalReport: '历史报告',
    sourceCodePath: '源代码存放路径',
    analysisResults: '分析结果',
    needtranscount: '需要移植的源文件',
    codeCount: '需要移植的代码行数',
    makefileSourceCode: 'C/C++和Makefile源代码',
    lines: '行',
    assemblyCode: '汇编代码',
    downloadReport: '下载报告',
    startDeploySucc: '已经开始部署',
    startDeployFail: '部署失败',
    deploying: '正在部署，请稍后...',
    uploadCodeFail: '上传源码失败！',
    reportPromt: '您的报告已过期，无法在线查看，请下载后查看',
    serviceDetails: '服务详情',
    releaseTime: '发布时间',
    sdkDownload: 'SDK 下载',
    apiTopText: 'API模拟器提供公共环境用于本地接口调试和线上模拟测试。开发者可以使用模拟器主机地址和应用外部端口号的方式在本地访问，实际部署测试时通过调用mep服务发现接口查看具体服务的url。',
    projectDetails: '基本信息',
    releaseDetails: '能力发布详情',
    releaseTest: '应用发布测试',
    developer: '开发者',
    dependentApp: '依赖应用',
    noDependent: '无依赖',
    deploymentPlatform: '部署平台',
    uploadFile: '说明文档',
    appStoreMd: '请上传.md文件，用来介绍APP的基本功能、使用场景等',
    apiFunctionMd: '请上传.md文件，用来描述API功能、使用等',
    routeConfig: '路由配置',
    protocol: '协议',
    appDetails: '应用包详情',
    appTest: '应用测试',
    releaseText: '应用发布之前请点击“应用认证”进行测试 ',
    instantiateId: '实例化ID',
    applicationDesc: '应用描述',
    ruleConfig: '应用规则配置',
    trafficRules: '流量规则',
    dnsRules: 'DNS规则',
    appPublishConfig: '服务发布配置',
    appPublishSuccess: '应用已发布到AppStore，点击链接查看详情',
    appDetail: '应用详情',
    deploymentStatus: '部署状态',
    startDeployment: '开始部署',
    completeTest: '完成测试',
    recycle: '释放资源',
    completeMsg: '点击完成测试后，会释放环境资源，否则平台会在24小时后自动释放环境资源',
    deploymentSuccess: '部署完成',
    createDeploymentFile: '生成部署文件',
    assignTestNodes: '分配测试节点',
    distributeInfo: '上传应用包',
    applicationRelease2: '应用下发',
    instantiateApplication: '实例化应用',
    getDeploymentStatus: '获取部署状态',
    deploymentComplete: '部署完成',
    deploymentResult: '部署结果',
    testMsg: '你的应用已经可以被EdgeGallery平台集成，请测试APP业务',
    PODStatus: 'POD状态',
    PODName: 'Pod名称',
    downloadLog: '下载日志',
    operatingStatus: '运行状态',
    container: '容器',
    containerName: '容器名称',
    containerResource: '资源',
    hostInfo: '节点信息',
    selectEnv: '选择测试环境',
    deployDetail: '部署详情',
    sandboxEnv: '沙箱环境',
    sandboxEnvDesc: '模拟真实场景，快速调测',
    fiveGEnv: '5G环境',
    fiveGEnvDesc: '由于5G环境资源有限，有可能申请失败',
    uploadConfigMessage: '请上传部署文件',
    deployConfig: '部署配置',
    clearEnv: '已清空环境',
    clearEnvFail: '清空环境失败',
    unUploaded: '未上传',
    uploaded: '已上传',
    privateHost: '私有节点',
    publicHost: '公有节点',
    capabilityInfo1: '请选择您的应用需要依赖的生态服务，有关生态能力详情请查看能力中心。',
    capabilityInfo2: '如果是集成项目，或者您的服务不需要依赖其他服务，可以跳过该步骤继续创建。',
    availableService: '可选服务',
    selectedService: '已选服务',
    recycleTip: '注：测试完成请及时释放资源，避免资源占用，否则系统24小时后自动释放',
    noService: '您暂未选择任何服务',
    testNode: '测试节点IP',
    podBelongsTo: '所属Pod',
    cpuUsage: 'CPU使用率',
    memUsage: '内存使用率',
    diskUsage: '硬盘使用率',
    deployType: '负载类型',
    containerImage: '容器',
    vmImage: '虚拟机',
    podEventsInfo: 'Pod日志详情',
    projectExist: '已存在同名、同版本、同提供商的应用',
    refresh: '刷新'
  },
  test: {
    howToTest: {
      howToTest: '如何测试',
      updated: '更新时间',
      modify: '修改',
      share: '分享',
      apply: '立即测试'
    },
    testApp: {
      uploadApp: '上传应用',
      appFormat: '请上传.csar文件，且大小不超过20MB。',
      uploadLogo: '上传图标',
      logoFormat: '请上传.jpg或.png格式文件，或选择默认应用图标，且大小不超过2M',
      affinity: '亲和性',
      type: '类型',
      choosetype: '请选择类型',
      description: '描述',
      upload: '立即上传',
      cancel: '取消'
    },
    testTask: {
      appName: '应用名称',
      testStatus: '测试状态',
      startTime: '提交时间',
      endTime: '测试结束时间',
      reset: '重置',
      inquire: '查询',
      taskNumber: '任务编号',
      applicationName: '应用名称',
      version: '版本',
      applicationTime: '提交时间',
      operation: '操作',
      checkReport: '检查报告',
      upload: '上传',
      report: {
        ticket: '任务单号',
        basicInfo: '基本信息',
        packageName: '包名称',
        status: '状态',
        details: '详情'
      }
    }
  },
  mecOpen: {
    mecOpen: 'MEC开源生态',
    info: '开发者可在华为MEC平台上贡献文档、组件及开发插件等开源贡献。积极贡献的开发者可优先在华为MEC平台下载、测试，并可获得开源生态贡献专区颁发的奖牌，欢迎各位开发者积极贡献，帮助我们提升用户体验，改善我们的生态环境。',
    contribution: '贡献排行榜',
    code: '贡献代码',
    lines: '行'
  },
  promptMessage: {
    prompt: '提示',
    noPermission: '您没有权限进入用户管理页面！',
    uploadSuccess: '上传成功！',
    uploadFailure: '上传失败！',
    uploadYamlFailure: '文件内容有误，请参考样例文件！',
    nameEmpty: '名称不能为空！',
    pluginNameEmpty: '插件名称不能为空！',
    pluginFunEmpty: '插件语言不能为空！',
    plugTypeEmpty: '插件类型不能为空！',
    pluginFileEmpty: '插件文件不能为空！',
    logoEmpty: '图标不能为空！',
    apiEmpty: 'API文件不能为空！',
    versionEmpty: '版本不能为空！',
    descriptionEmpty: '描述不能为空！',
    moreThan500: '只能上传不超过500KB的文件！',
    moreThan2: '只能上传不超过2MB的文件！',
    moreThan10M: '只能上传不超过10MB的文件！',
    moreThan20M: '只能上传不超过20MB的文件！',
    moreThan500M: '只能上传不超过500MB的文件！',
    onlyOneFile: '仅支持一个文件，请先移除已有文件！',
    fileNameType: '文件名称不能包含空格！',
    notPicture: '请上传图片',
    appEmpty: 'app不能为空！',
    affinityEmpty: '架构不能为空！',
    typeEmpty: '类型不能为空！',
    testSuccess: '启动测试成功！',
    testFail: '启动测试失败！',
    testComplete: '测试完成，请单击查看报告',
    addProjectSuccess: '新增项目成功！',
    editProjectSuccess: '编辑项目成功！',
    addProjectFail: '新增项目失败！',
    editProjectFail: '编辑项目失败！',
    checkNamePass: '认证失败，请检查用户名或密码。',
    checkCaptcha: '验证码无效，请检查验证码。',
    registerSuccess: '用户注册成功！',
    resisterFail: '用户注册失败。 ',
    logoutPage: '您确定要退出吗？',
    yesBtn: '是',
    noBtn: '否',
    loginexpired: '登录已过期，请重新登录！',
    imageNameErr: '镜像名称不能为空',
    uploadApiFile: '请上传Api文件',
    uploadYamlFile: '请上传Yaml文件',
    uploadFileMsg: '请上传一个APP镜像或Yaml文件',
    service: '请输入完整的服务内容',
    addImage: '请添加镜像',
    selectService: '请选择一个服务器！',
    selectCommand: '编译命令不能为空！',
    codeEmpty: '源码不能为空！',
    analysisCodeFail: '分析任务失败！',
    uploadCodeText: '正在上传源代码，请稍候...',
    analyzingText: '正在分析，请稍候...',
    loadingText: '正在加载，请稍候...',
    logoutFail: '注销失败，请重试！',
    contrastTime: '提交时间不能早于测试结束时间！',
    imageVersionErr: '版本不能为空',
    yamlFileType: '请选择后缀名为".yaml、.json"的文件',
    projectNameEmpty: '应用名称不能为空',
    providerEmpty: '提供者不能为空',
    architectureEmpty: '架构不能为空',
    industryEmpty: '行业不能为空',
    getDataFail: '获取数据失败！',
    isPublishFailed: '发布到EdgeGallery 应用商店失败！',
    isPublicFailed: '公开API能力到EdgeGallery生态系统失败！',
    canOnlyUpload: '只能上传.csar文件类型',
    pluginNameRule: '请输入1-30个字符的插件名称，开头不能为空',
    nameRule: '请输入不含空格的4-32个字符名称，不能全为数字，可以包含数字、字母、汉字、_、-，开头结尾不能为_、-',
    nameRuleResourceConfig: '请输入不含空格的4-32个字符名称，不能全为数字，可以包含数字、字母、_、-，开头结尾不能为_、-',
    versionRule: '请输入1-10个字符的版本号，只能包含数字、字母、_、-和空格，开头不能为空',
    providerRule: '请输入1-30个字符的提供者名称，开头不能为空',
    introductionRule: '请输入1-1024个字符的描述，开头不能为空，不能全为数字',
    checkFileType: '请上传符合格式的文件',
    downloading: '正在下载，请稍后...',
    guestPrompt: 'Guest用户无权操作，请先登录！',
    saveSuccess: '保存成功！',
    saveFail: '保存失败！',
    sampleCodeInfo: '没有选择能力服务，不能下载样例代码',
    fileNotSupport: '压缩文件，不支持在线浏览',
    fileIsEmpty: '文件内容为空',
    addSuccess: '添加数据成功',
    editSuccess: '编辑数据成功',
    saveRuleSuccess: '保存规则成功',
    editRuleSuccess: '编辑规则成功',
    saveRuleFail: '保存规则失败',
    editRuleFail: '编辑规则失败',
    appReleaseSuccess: '应用发布成功',
    appReleaseFail: '应用发布失败',
    deployTypeEmpty: '负载类型不能为空',
    isPublished: '应用已经发布到应用仓库',
    notDeploy: '应用没有部署调测，不能进行发布操作',
    ipErrorInfo: '请输入正确的IP地址',
    hostErrorInfo: '请输入正确的Host地址',
    portErrorInfo: '端口号范围30000-30400',
    systemCapaNameCn: '请输入长度1-20的中文名称，开头不能为空',
    systemCapaNameEn: '请输入长度1-40的英文名称，开头不能为空',
    systemCapaDescCn: '请输入长度1-200的中文描述，开头不能为空',
    systemCapaDescEn: '请输入长度1-400的英文描述，开头不能为空',
    systemServiceName: '请输入长度1-40的服务名称',
    systemProviderName: '请输入长度1-20的供应商名称',
    systemDocument: '请上传中文说明文档',
    systemDocumentEn: '请上传英文说明文档',
    imageFileType: '请上传.rar，.tar，.zip格式的文件，且大小不超过5G',
    imageInfoErr: '镜像不存在，请前往“系统-系统镜像管理”上传镜像',
    twoLevelName: '请输入长度1-40的服务名称，开头不能为空',
    serviceDesc: '请输入长度1-400的服务描述，开头不能为空',
    typeError: '格式错误',
    typeConfig: '请上传config文件'
  },
  breadCrumb: {
    mecDeveloper: '首页',
    api: 'API',
    applicationApi: '开发者平台API',
    apiDetail: 'API详情',
    docs: '文档',
    mecOpenSourceEcology: '社区',
    devTools: '开发工具',
    detail: '详情',
    upload: '上传',
    test: '测试',
    testApplication: '测试应用',
    howToTest: '如何测试',
    testReport: '测试报告',
    testTask: '测试任务',
    workspace: '工作空间',
    system: '系统',
    systemProject: '项目管理',
    systemMep: '能力中心管理',
    systemHost: '沙箱管理',
    systemImgMgmt: '系统镜像管理',
    profileMgmt: '场景管理'
  },
  system: {
    completeInfo: '请填写完整的信息',
    upload: '上传',
    name: '名称',
    addHost: '新增沙箱环境',
    pleaseInput: '请输入',
    pleaseUpload: '请上传',
    error: '失败',
    success: '成功',
    correct: '正确',
    address: '部署区域',
    username: '用户名',
    password: '密码',
    char: '字符',
    useDetail: '使用详情',
    deleteConfirm: '确定删除吗？',
    userId: '用户ID',
    projectId: '项目ID',
    deployTime: '部署时间',
    deleteTime: '删除时间',
    addMep: '新增服务',
    basicInfo: '基本信息',
    registerInfo: '注册信息',
    capType: '能力分类',
    oneLevelCapability: '一级能力',
    twoLevelCapability: '二级能力',
    isExistCapability: '已存在同名服务',
    capTypeOPENMEP: '生态能力',
    serviceName: '服务名称',
    inPort: '端口号',
    version: '版本',
    provider: '提供商',
    apiFileId: 'API定义文件',
    fileExceed: '最多上传一个文件',
    guideFileId: '说明文档',
    guideFileId_zh: '中文说明文档',
    guideFileId_en: '英文说明文档',
    zh_cn: '中文',
    en: '英文',
    portRange: '端口范围',
    config_id: '配置文件',
    networkConfig: '网络配置',
    log: {
      userName: '使用者',
      projectName: '项目名',
      appInstancesId: '实例化ID',
      deployTime: '使用时间',
      status: '状态',
      operation: '操作'
    },
    type: '类型',
    lcmIp: 'lcmIP',
    mecHost: 'mecHost',

    profileMgmt: {
      addProfile: '新增场景',
      appList: '应用列表',
      newProfile: '创建场景',
      modifyProfile: '修改',
      file: '文件',
      uploadFile: '上传文件',
      contentTip: '文件格式为zip'
    },
    imageMgmt: {
      imgName: '镜像名称',
      imgPath: '镜像路径',
      imgType: '镜像类型',
      osName: '操作系统',
      osVersion: '版本',
      osBit: '位数',
      sysDisk: '磁盘大小',
      userName: '所属用户',
      createTime: '创建时间',
      uploadTime: '上传时间',
      imgFormat: '镜像格式',
      beginTime: '上传时间（起始）',
      endTime: '上传时间（结束）',
      slimming: '瘦身',
      imageSize: '镜像大小',
      typeValue: {
        public: '公共',
        private: '私有',
        isPublic: '是否公开'
      },
      statusValue: {
        uploadWait: '待上传',
        uploading: '正在上传',
        merging: '正在合并',
        uploadSucceeded: '上传成功',
        uploadFailed: '上传失败',
        uploadCancelled: '上传已取消',
        published: '已发布'
      },
      uploadStatusText: {
        success: '正在合并',
        error: '上传失败',
        uploading: '正在上传',
        paused: '暂停',
        waiting: '等待'
      },
      slimStatusText: {
        slimWait: '等待瘦身',
        slimming: '瘦身中',
        slimSucceed: '瘦身成功',
        slimFailed: '瘦身失败'
      },
      operation: {
        newImg: '新建系统镜像',
        upload: '上传',
        selectImgFile: '选择文件',
        publish: '发布'
      },
      containerImage: {
        synchronize: '同步镜像',
        syncing: '同步中...',
        pleaseWait: '同步镜像需要几分钟，请耐心等待···',
        synchronized: '镜像已同步',
        latestImage: '已经是最新镜像',
        noImage: 'Harbor仓库暂无镜像',
        imageFailed: '镜像同步失败'
      },
      errorType: {
        formatMistake: '上传的文件格式错误。',
        zipFileOpenFailed: '文件打开失败，可能文件不是一个有效的zip文件，请检查。',
        fileSystemMergeFailed: '请求文件系统服务合并文件返回失败，可能是处理超时。',
        failedOnUploadToFS: '上传至文件系统服务失败，请检查文件系统服务地址配置，并确认文件系统服务是否正常。',
        unknown: '未知错误'
      },
      tip: {
        newImg: '新建系统镜像',
        editImg: '修改系统镜像',
        viewImg: '查看系统镜像详情',
        nameRules: '4-32位不含中文和空格',
        nameRule: '请输入4-32不含中文和空格的字符，开头结尾不能为_、-、.',
        versionEmpty: '系统版本号不能为空！',
        versionRule: '请输入有效的系统版本号，包含1-20个字符！',
        systemDiskEmpty: '系统磁盘大小不能为空！',
        systemDiskRule: '请输入1-9999的整数！',
        uploadImg: '上传系统镜像',
        uploadImgPromt: '请上传qcow2或iso格式文件。',
        uploadContainerImgPromt: '上传tar格式的镜像包，通过解析tar包，重新命名格式镜像，推送到Harbor仓库，上传前检查tar包中镜像的名称是否包含/，如果包含可能会导致镜像路径混乱，后续的部署失败',
        uploadImgPromtExample: '示意：',
        sysImageFileType: '请上传大小不超过100G的文件！',
        sysContainerImageFileType: '请上传.tar格式的文件，且大小不超过5G！',
        onlyOneImageFile: '只能上传一个文件！',
        noFileSelected: '未选择上传的文件',
        confirmDeleteImage: '确认要删除该系统镜像吗？',
        confirmPublishImage: '确认要发布该系统镜像吗？',
        confirmResetImage: '请谨慎进行状态重置操作！确保该镜像是在上传过程发生了意外中断。您确认要重置该镜像的状态吗？',
        confirmReUploadImage: '已经上传了该系统镜像，再次上传将覆盖原有镜像。是否继续？',
        confirmUploadImageOnUploading: '该镜像处于正在上传状态，请谨慎操作！确保该镜像是在上传过程发生了意外中断而需要重新或继续上传。如果您选择了上一次上传中断的文件，将会从中断点开始继续上传。是否继续？',
        confirmUploadImageOnUploadFailed: '该镜像处于上传失败状态。如果是上传过程发生了意外中断，并且您再次选择上一次上传中断的文件，将会从中断点开始继续上传。是否继续？',
        confirmDownloadImage: '系统镜像文件较大，下载耗时较长。是否继续下载该镜像？',
        systemNameExist: '此用户名下已存在同名同版本的系统镜像！',
        newImgFailed: '新建系统镜像失败！',
        modifyImgFailed: '修改系统镜像失败！',
        deleteImgFailed: '删除系统镜像失败！',
        publishImgFailed: '发布系统镜像失败！',
        resetImgStatusFailed: '重置镜像状态失败！',
        queryImgFailed: '查询系统镜像失败！',
        uploadingHint: '系统镜像正在上传，请等待！',
        uploadImgSucceed: '系统镜像上传处理成功！',
        uploadImgFailed: '镜像文件合并请求返回失败，但是后台可能仍然在合并处理中，请耐心等待，可在镜像列表中观察镜像上传状态！',
        invalidUploadFile: '上传的文件不符合要求！',
        mergingHintForCancel: '系统镜像已经在进行合并处理，无法取消！',
        confirmCancelUpload: '确认要取消上传吗？',
        cancelUploadFailed: '取消上传失败！',
        cancelingHint: '正在取消，请稍候...',
        mecHostExist: '已经存在相同的mecHost',
        textWrap: '可以包含中英文、空格、/，首尾不能有空格'
      }
    }
  },
  ...zhLocale
}
export default cn


<|start_filename|>edgegallery-fe/src/locales/app_cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const appCn = {
  incubation: {
    zoomOut: '缩小',
    search: '搜索',
    delete: '删除',
    more: '更多',
    putAway: '收起',
    newAndRecent: '新建应用/最近操作',
    otehrs: '其他分类',
    addNewApp: '新增应用',
    checkFromApp: '此类内容需在应用中查看',
    return: '返回',
    appInfo: '应用信息',
    appName: '应用名称',
    version: '版本',
    provider: '提供者',
    industry: '行业',
    architecture: '架构',
    appClass: '负载类型',
    type: '应用类型',
    description: '描述',
    upload: '点击上传',
    logo: '图标',
    guideDoc: '指导文档',
    or: '或',
    chooseAppClass: '请选择负载类型',
    chooseArchitecture: '请选择架构类型',
    chooseIndustry: '请选择行业类型',
    chooseType: '请选择应用类型',
    logoLimit: '必须是jpg、png格式图片',
    docLimit: '只能上传.md文件，且不超过500kb',
    deleteAppTip: '此操作将永久删除该应用, 是否继续?',
    deleted: '删除成功',
    afterDelete: '当前应用已删除!',
    uploadLimit: '仅支持上传一个文件！',
    others: '其他分类',
    direction: '行动方向',
    currentLocation: '当前应用位置',
    necessaryNode: '必经节点',
    addAppSuccess: '创建应用成功！',
    addAppFailed: '创建应用失败！',
    modifyAppSuccess: '编辑应用成功！',
    modifyAppFailed: '编辑应用失败！',
    fileLimitNum: '仅支持上传一个文件！',
    nameTip: '请输入应用名称',
    nameRule: '不含空格，长度4-32，不能全为数字，可以包含数字、字母、汉字、_、-，开头结尾不能为_、-',
    lengthTip: '长度在 3 到 15 个字符',
    versionTip: '请输入应用版本',
    versionRule: '长度1-10，只能包含数字、字母、_、-和空格，开头不能为空',
    providerTip: '请输入应用开发商',
    providerRule: '长度1-30，开头不能为空',
    descTip: '请输入应用描述',
    descriptionRule: '长度1-1024，开头不能为空，不能全为数字',
    container: '容器',
    vm: '虚拟机',
    uploadSizeLimit: '上传文件超多超过2M限制，请重试',
    appWorkflow: '5G边缘应用孵化流水线',
    newProject: '新建应用',
    selectProfile: '选择场景',
    appList: '应用列表',
    noData: '暂无数据',
    noProfile: '请选择场景',
    createSuc: '创建应用成功!',
    createFail: '创建应用失败!',
    uploadMdFileTip: '请上传应用介绍文档！',
    packageSpecs: '打包规范',
    chooseSpecs: '选择打包规范',
    emulator: '在线模拟器',
    current: '当前节点',
    done: '已完成',
    notOperated: '尚未执行',
    pleaseUpload: '请上传'
  },
  service: {
    basicInfo: '基本信息',
    secLevelCn: '二级能力',
    secLevelEn: '二级能力（英文）',
    firLevel: '一级能力',
    secLevel: '二级能力',
    inputBox: '请输入内容',
    apiFile: 'API定义文件',
    yamlMust: '仅支持.yaml文档',
    mdMust: '仅支持.md文档',
    guideFile: '说明文档',
    customPic: '自定义图片',
    registrationInfo: '注册信息',
    serviceName: '服务名称',
    serviceName1: '服务名称：',
    internalPort: '内部端口号',
    protocol: '协议',
    expURL: '在线体验URL',
    editSuccess: '编辑能力成功！',
    publishSuccess: '发布能力成功！',
    serviceTip: '请选择您的应用需要依赖的生态服务，有关生态能力详情请查看能力中心。如果是集成应用，或者您的应用不需要依赖其他服务，可以跳过该步骤继续创建。',
    chosenService: '已选服务: ',
    chooseServices: '能力选择',
    apiMonitor: 'API模拟器提供公共环境用于本地接口调试和线上模拟测试。开发者可以使用模拟器主机地址和应用外部端口号的方式在本地访问，实际部署测试时通过调用mep服务发现接口查看具体服务的url。',
    serviceDetail: '服务详情',
    version1: '版本：',
    publishTime: '发布时间 ：',
    type: '类型 ：',
    servicePublish: '能力发布',
    addServiceConfig: '添加服务发布配置',
    deleteServiceTip: '此操作将永久删除该服务, 是否继续?',
    serviceNameTip: '请填写服务名称',
    innerPortTip: '请填写内部端口号',
    protocolTip: '请填写协议',
    secondLevelNameCnTip: '请填写二级能力中文名',
    secondLevelNameEnTip: '请填写二级能力英文名',
    uploadApiFile: '请上传Api文件',
    iconRequired: '请上传图标',
    guideFileId: '说明文档',
    fileNameType: '文件名称不能包含空格！',
    isNameEmpty: '请输入名称',
    nameRules: '请输入长度1-40的名称，开头不能为空',
    serviceDesc: '请输入长度1-400的服务描述，开头不能为空',
    successOperation: '操作成功！'
  },
  workflow: {
    incubation: '应用孵化',
    mustSteps: '请先完成必经步骤！',
    appstore: '应用仓库',
    produceEnv: '应用部署'
  }
}
export default appCn


<|start_filename|>edgegallery-fe/src/locales/appstore_en.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import enLocale from 'element-ui/lib/locale/lang/en'
const appstoreEn = {
  order: {
    orderMana: 'Order Management',
    orderNum: 'Order Number',
    nodeName: 'Node Name',
    appName: 'App Name',
    appNameLabel: 'App Name: ',
    nodeIp: 'Node IP',
    orderTime: 'Order Time',
    nodeAddress: 'Node Location',
    status: 'Status',
    orderUserName: 'User Name',
    activation: 'Activate',
    unsubscribe: 'Unsubscribe',
    confirmToActivate: 'Are you sure to activate order: ',
    tip: 'Prompt',
    confirm: 'Confirm',
    cancel: 'Cancel',
    success: 'Operate Successfully!',
    canceled: 'Canceled!',
    confirmToUnsub: 'Are you sure to cancel order: ',
    unsubSuccess: 'Unsubscribe Successfully',
    orderStatus: {
      activating: 'Activating',
      activateFailed: 'Activate Failed',
      activated: 'Activated',
      deactivating: 'Deactivating',
      deactivateFailed: 'Deactivate Failed',
      deactivated: 'Deactivated'
    },
    subscribe: 'Subscribe',
    price: ' Yuan (RMB)/ Hour',
    subPrice: 'Price: ',
    subSuccess: 'Subscribed successfully!',
    chooseArea: 'Please choose location first！',
    noNodes: 'There is no nodes can be used!'
  },
  system: {
    ipErrorInfo: 'Please enter the correct IP address',
    upload: 'Upload',
    error: 'Error',
    success: 'Success',
    name: 'Name',
    addHost: 'Add Host',
    pleaseInput: 'Please input',
    pleaseUpload: 'Please upload',
    address: 'Address',
    username: 'Username',
    char: 'characters',
    correct: 'correct',
    useDetail: 'Log',
    deleteConfirm: 'Are you sure to delete?',
    userId: 'User ID',
    projectId: 'Project ID',
    deployTime: 'Deploy Time',
    deleteTime: 'Delete Time',
    addMep: 'Add Service',
    basicInfo: 'Basic Info',
    registerInfo: 'Register Info',
    capType: 'Type',
    capTypeOPENMEP: 'OPENMEP',
    serviceName: 'Service Name',
    inPort: 'Port',
    version: 'Version',
    provider: 'Provider',
    apiFileId: 'API Document',
    fileExceed: 'Upload a maximum of one file',
    guideFileId: 'Guide',
    guideFileId_zh: 'Guide(chinese)',
    guideFileId_en: 'Guide(english)',
    zh_cn: 'please input chinese',
    en: 'please input english',
    portRange: 'Port Range',
    config_id: 'Config File',
    other: 'Other',
    protocol: 'Protocol',
    status: 'status',
    architecture: 'Architecture',
    operation: 'Operation',
    delete: 'delete',
    saveSuccess: 'Saved successfully!',
    saveFail: 'Save failed!',
    uploadSuccess: 'Upload success!',
    uploadFailed: 'Upload failure!',
    guestPrompt: 'The guest user has no right to operate, please log in first!',
    modify: 'Modify',
    noDataNotice: 'No data available',
    typeError: 'Format error',
    typeConfig: 'Please upload config file',
    networkConfig: 'Network Config',
    log: {
      userName: 'Username',
      projectName: 'Project Name',
      appInstancesId: 'App Instances Id',
      deployTime: 'Deploy Time',
      status: 'Status',
      operation: 'Operation'
    },
    type: 'Type',
    lcmIp: 'lcmIP',
    mecHost: 'mecHost',

    imageMgmt: {
      imgName: 'Image Name',
      imgType: 'Image Type',
      osName: 'Operate System',
      osVersion: 'Version',
      osBit: 'System Bit',
      sysDisk: 'Disk Size',
      userName: 'User',
      createTime: 'Create Time',
      uploadTime: 'Upload Time',
      imgFormat: 'Image Format',
      beginTime: 'Begin Time',
      endTime: 'End Time',
      typeValue: {
        public: 'Public',
        private: 'Private'
      },
      statusValue: {
        uploadWait: 'To be uploaded',
        uploading: 'Uploading',
        uploadSucceeded: 'Upload succeeded',
        uploadFailed: 'Upload failed',
        published: 'Published'
      },
      uploadStatusText: {
        success: 'Upload succeeded',
        error: 'Upload failed',
        uploading: 'Uploading',
        paused: 'Paused',
        waiting: 'Waiting'
      },
      operation: {
        newImg: 'New System Image',
        upload: 'Upload',
        selectImgFile: 'Select File',
        publish: 'Publish'
      },
      tip: {
        newImg: 'New System Image',
        editImg: 'Edit System Image',
        viewImg: 'View System Image Detail',
        versionEmpty: 'System version cannot be empty!',
        systemDiskEmpty: 'System disk size cannot be empty!',
        systemDiskRule: 'Please enter a 2 to 4-digit integer!',
        uploadImg: 'Upload System Image',
        uploadIsoImgPromt: 'Please zip the image file in iso format and upload it.',
        uploadQcow2ImgPromt: 'Please zip the image file in qcow2 format and upload it.',
        sysImageFileType: 'Please upload files in .zip format, and the size does not exceed 5G!',
        onlyOneImageFile: 'You can only upload one file!',
        noFileSelected: 'No file selected',
        confirmDeleteImage: 'Are you sure to delete this system image?',
        confirmPublishImage: 'Are you sure to publish this system image?',
        newImgFailed: 'New system image failed!',
        modifyImgFailed: 'Modify system image failed!',
        deleteImgFailed: 'Delete system image failed!',
        publishImgFailed: 'Publish system image failed!',
        queryImgFailed: 'Query system image failed!',
        uploadingHint: 'The system image is uploading, please wait!'
      }
    }
  },
  appstoreCommon: {
    cancelText: 'OK',
    more: 'More',
    check: 'Check',
    clean: 'Clean',
    sort: 'Sort',
    workloadType: 'Workload Type :',
    address: 'Address',
    type: 'Type :',
    video: 'Video',
    game: 'Game',
    VideoSurveilance: 'Video Surveilance',
    AR: 'AR/VR',
    api: 'API',
    sdk: 'SDK',
    MEP: 'MEP',
    Security: 'Security',
    blockchain: 'Blockchain',
    smartDevice: 'SmartDevice',
    IOT: 'Internet of Things',
    bigdata: 'BigData',
    calculate: 'Calculate',
    all: 'All',
    architecture: 'Architecture',
    GPU: 'GPU',
    MEN: 'MEM',
    CPU: 'CPU',
    AI: 'AI',
    industry: 'Industry :',
    Smartpark: 'Smart Park',
    supermarket: 'Supermarket',
    industrialManufacturing: 'Industrial Manufacturing',
    logistics: 'Transportation and logistics',
    hydroelectricity: 'Hydroelectricity',
    games: 'Games and competitions',
    openSource: 'Open Source',
    else: 'Else',
    appName: 'App Name',
    version: 'Version',
    size: 'Size',
    provider: 'Provider',
    contact: 'Contact Information',
    operation: 'Operation',
    detail: ' detail',
    delete: 'Delete',
    cancel: 'Cancel',
    confirm: 'Confirm',
    detect: 'Detect',
    download: 'Download',
    uploadTime: 'UploadTime',
    applicationName: 'Application Name',
    description: 'Description',
    appDisplay: 'App Display',
    innerPublic: 'Visible in this Appstore',
    public: 'Can be pushed to other Appstore',
    userName: 'Uploder',
    getCaptcha: ' Get Captcha ',
    inputCaptcha: 'Please enter the Captcha code',
    choose: 'Please Choose',
    number: 'number',
    appStoreName: 'AppStore Name',
    appStoreVersion: 'AppStore Version',
    company: 'Company',
    url: 'Url',
    appdTransId: 'APPD Version',
    modifyApp: 'Modify',
    pageTotalNum: 'Total',
    noData: 'No Data',
    displaySwitch: 'display switch',
    appModify: 'Modify',
    experienceable: 'Experienceable',
    getResInfoFailed: 'Failed to get resource information',
    exception400: 'Request error',
    exception401: 'Request is not authorized',
    exception403: 'Request denied access',
    exceptionxxx: 'Request exception, please check',
    exceptionServer: 'Service abnormal, please check',
    loading: 'Loading'
  },
  promptMessage: {
    uninvolved: 'Refer to port from app detail',
    hostErrorInfo: 'Please enter the correct Host address',
    portErrorInfo: 'Port number range 30000-32000',
    guestUser: 'The guest user has no right to operate. please log in first!',
    operationFailed: 'The operation failure!',
    getfail: 'Get Failed!',
    modifySuccess: 'Modify the success!',
    modifyFail: 'Modify the failure',
    fileNotSupport: 'The file format does not support!',
    fileEmpty: 'The file is empty content!',
    deleteSuccess: 'Delete the success!',
    fileNotContent: 'The file format does not support  or empty content!',
    canOnlyUpload: 'Can only upload .',
    files: ' files.',
    uploadPicture: 'Can only upload .jpg and .png files.',
    uploadPackageFile: 'You need to upload package file first!',
    uploadIconFile: 'You need to upload icon file or select icon first!',
    industryEmpty: 'Industry cannot be empty',
    typeEmpty: 'Type cannot be empty',
    architectureEmpty: 'Architecture cannot be empty',
    shortDescEmpty: 'Description cannot be empty',
    completedTest: 'You have completed the test, please click to view the report',
    uploadSuccess: 'Upload success!',
    uploadFailed: 'Upload failure!',
    checkName: 'Authentication Failure, please recheck the User Name or Password.',
    repeatEnter: 'The input information is wrong, please re-enter it.',
    userResistedSuccess: 'User is registered successfully!!',
    userResistedFaile: 'Failed to register user',
    deletePrompt: 'This operation will delete the app permanently. Do you want to continue?',
    prompt: 'Prompt',
    checkUploadProgress: 'Check upload progress immediately?',
    browserAdvise: 'For sure some functions work well, please use Chrome',
    userNameIsExists: 'The user name has been registered, please change a new one.',
    phoneNumIsExists: 'The phone number is registered.',
    subCommentFail: 'Comment submission failed.',
    getCommentFail: 'Failed to get comment.',
    getAppFail: 'Failed to get App data.',
    reLogin: 'Access token expired,please log in again.',
    getTaskListFail: 'Failed to get test task.',
    getMyAppFail: 'Failed to get my App data.',
    verifyNamePhoneFail: 'Failed to verify user name or phone number.',
    registerFail: 'Registration failed.',
    getCaptchaSuccess: 'The verification code has been sent to your mobile phone, please check.',
    getCaptchaFail: 'Failed to obtain captcha.',
    confirmLogout: 'Are you sure to log out?',
    subCommentFailReason: 'Rating and content are required',
    contrastTime: 'The submission time cannot be earlier than the test end time!',
    cannotComment: 'You cannot comment on your application',
    onlyOneFile: 'Only one file is allowed, please remove the file first!',
    publishSuccess: 'Publish Success',
    createtask: 'Whether to create a test task?',
    createFail: 'Test task check failed',
    testFail: 'The test task failed, please go to view the test report!',
    testAgain: 'Test again',
    testSuccess: 'The test task is successful, please go to view the test report!',
    testRunning: 'The test task is running, please go to check the test progress!',
    testWaiting: 'The test task is waiting to run, please go to check the test progress!',
    testCreated: 'The test task has been created, please go to run the test task!',
    deleteAppStore: 'This operation will permanently delete the external warehouse. Do you want to continue?',
    registerHost: 'Please contact the administrator to add a sandbox environment for experience',
    instantiateFailed: 'Failed to instantiate the application',
    getNodePortFailed: 'Failed to obtain service borrowing point information',
    cleanEnvFailed: 'Release resource failed',
    cleanEnvSuccess: 'Release resource Success',
    portRange: 'Range 30000-32000',
    getReleaseDataFail: 'Failed to get experience initialization information',
    getNodePortSuccess: 'Success to obtain service borrowing point information'
  },
  store: {
    synchronous: 'Synchronous app to MEAO',
    appChange: 'Application package conversion tool',
    backAppStore: 'Back App Store',
    backMyApp: 'Back My App',
    selectTestSce: 'Select Test Scenarios',
    type: 'Type',
    industry: 'Industry',
    advancedSearch: 'Advanced Search',
    clearAll: 'Delete',
    screening: 'Screening',
    most: 'Most',
    name: 'Name',
    downloadcount: ' downloads',
    score: 'Score',
    appPackageInfo: 'App Package Basic Information',
    createTime: 'Create Time',
    download: 'Download',
    synchronize: 'Synchronize',
    synchronizedwaiting: 'Uploading package takes a long time.',
    notSupportSynchronized: 'Not support synchronized pacakge',
    comments: 'Comments',
    allComments: 'All Comments',
    introduction: 'Application Details',
    introductionTip: 'No details are available for this app!',
    demo: 'Video',
    message: 'Message',
    postComment: 'Post a Comment',
    uploadApp: 'Upload',
    uploadLogo: 'Upload Logo',
    uploadVideo: 'Upload Demo Video',
    appstore: 'App Store',
    appShare: 'App Share',
    limitition: 'Please upload a file in .jpg or .png format, or select the default application icon, and the size does not exceed 2M',
    appPackage: 'App Package',
    dragPackage: 'Drag App package files here orclick to upload',
    onlyCsar: 'Can only upload .csar files.',
    packageSizeLimit: 'no more than 10M',
    appIcon: 'App Icon',
    appVideo: 'App Video',
    onlyImg: 'Can only upload .jpg and .png files ,or select the default App icon.',
    onlyVideo: 'Can only upload .mp4 files.',
    iconSizeLimit: 'no more than 2M.',
    videoSizeLimit: 'no more than 10M.',
    userName: 'Commentator',
    time: 'Time',
    toBeAdded: 'To be added',
    commentInfo: 'Write your comment and help me grow!',
    noComment: 'There are no comments yet, please leave your first comment!',
    hasNotVideo: 'There is no demo video for the current application!',
    newUploadApp: 'Recently Popular Apps',
    senceCase: 'Sence Case',
    introduct: 'Introduct:',
    tag: 'Tag',
    reapp: 'Related applications',
    viewMore: 'View More',
    clickViewMore: 'Click to view more >>',
    moreInfo: 'More Information >>',
    speakPeek: '2021 A Sneak Peek',
    reCommendColletion: 'Recommended Collection Specially',
    higherScore: 'High score application',
    addYourApp: 'Realize your application',
    addYourAppTitle: 'Conveniently and quickly receive AppStore, quickly realize application testing and sharing',
    developerPlateform: 'Developer Plateform',
    officialGuide: 'Official Guidance',
    recommendBroswer: 'It is recommended to use Google Chrome and IE9 or higher browsers to browse',
    downloadNum: ' Downloads',
    workloadType: 'Workload Type',
    deployContainer: 'Container',
    deployVM: 'VM',
    downloadImage: 'Application package download',
    downloadImageTip: 'Image download link is included in the package',
    downloadImageTip2: 'Image is included in the package,which may cost longer time to download,please keep patient',
    need: 'App package with image',
    noNeed: 'App package without image',
    showOnline: 'Try it online',
    releaseResource: 'Release resources',
    tryAppTip: 'Need to provide a front-end interface for experience, and add the URL of the interface access in the descriptionn',
    releaseAppResource: 'After the experience is completed, please release the resources in time to avoid resource occupation, otherwise the system will release automatically after 24 hours',
    serviceName: 'ServiceName',
    Ip: 'IP',
    port: 'Port',
    assignTestNodes: 'Assign Test Nodes',
    instantiateApplication: 'Instantiate Application',
    getDeploymentStatus: 'Get Deployment Status',
    experiencePhase: 'Experience phase',
    pleaseInstantiateApp: 'Please instantiate the app',
    waitInstantiatedApp: 'App is being instantiated, please wait patiently',
    StartDeployApp: 'Application start deployment',
    queryDeployStatus: 'Please query the deployment status',
    waitQueryStatus: 'Querying the deployment status, please wait patiently',
    deployFinished: 'Application deployment completed',
    tryAppDes: 'Please experience with the interface experience url in the application description according to the following service information',
    serviceNodeInfo: 'Service Node Info',
    appdConversion: 'Appd Conversion',
    filterApp: 'Filter App',
    taskId: 'Task ID',
    MeaoName: 'MEAO Name',
    MeaoUrl: 'MEAO Url',
    taskCreateTime: 'TaskCreateTime',
    taskStatus: 'TaskStatus',
    taskProgress: 'TaskProgress',
    synchronizeToMeao: 'Synchronize To MEAO'
  },
  myApp: {
    checkTest: 'View historical test tasks',
    startTime: 'Starting Time',
    reset: 'Reset',
    inquire: 'Inquire',
    version: 'Version',
    endTime: 'End Time',
    operation: 'Operation',
    taskNumber: 'Task Number',
    checkReport: 'Check Report',
    upload: 'Upload',
    appName: 'Application Name',
    status: 'Status',
    test: 'Test',
    publish: 'Publish',
    addApp: 'Add External Warehouse',
    provider: 'Provider',
    modifyAppStore: 'Edit External Warehouse',
    appModify: 'Modify',
    getStatusFailed: 'failed to get app status',
    more: 'more',
    free: 'Free',
    price: ' Yuan（RMB）/Hour',
    priceTitle: 'Apply pricing settings'
  },
  atp: {
    step1: 'Virus Scan',
    step2: 'Compliance Test',
    step3: 'Sandbox Test',
    step4: 'Review',
    testCase: 'Test Case',
    startTest: 'Start Test',
    result: 'ATP Result',
    caseName: 'CaseName',
    caseDetail: 'CaseDetail',
    testReport: 'ATP Report',
    detail: 'detail',
    version: 'Version',
    packageName: 'Package Name',
    startTime: 'Starting Time',
    endTime: 'End Time',
    status: 'Status',
    ticketNumber: 'Mission ticket number',
    baseInfo: 'Basic Information',
    uploadUser: 'Upload User',
    success: 'success',
    failed: 'failed',
    dependencyDetail: 'Dependency Details',
    versionDependency: 'Version Dependency',
    testTask: 'Test task description',
    testItems: 'Test Items',
    caseNumber: 'Number of use cases',
    cancel: 'Cancel',
    confirm: 'Confirm',
    returnList: 'Return to task list',
    security: 'security',
    complianceTest: 'Compliance Test',
    sandboxTest: 'Sandbox Test',
    review: 'Review',
    testCaseManagement: 'Test Case Management',
    fileSize: 'File Size',
    applicationName: 'applicationName',
    appPackage: 'appPackage',
    uploadApp: 'uploadApp',
    onlyCsar: 'Can only upload .csar files.',
    packageSizeLimit: 'no more than 10M'
  },
  apppromotion: {
    prepare: 'Prepare',
    pushing: 'Pushing',
    pushResult: 'Push Result',
    pushFail: 'Failed to push app',
    warehouseTip: 'Please confirm whether there is an external warehouse!',
    number: 'number',
    appName: 'App Name',
    provider: 'Provider',
    version: 'Version',
    tesResult: 'ATP Test Result',
    testRepo: 'Test Result',
    lastProTime: 'Last Pro Time',
    proTimes: 'Promote Times',
    batchPro: 'Batch Push',
    messageType: 'Message Type',
    messagePull: 'pull',
    messagePush: 'push',
    messageNotice: 'notice',
    messageBeDownload: 'download',
    messageUnknow: 'unknow',
    sourceAppStore: 'Source AppStore',
    targetAppStore: 'Target AppStore',
    dateTime: 'Time',
    description: 'Description',
    mesOperation: 'Operation',
    checkDetail: 'detail',
    appPromotion: 'APP Promote',
    operationAna: 'Operation Analyse',
    execute: 'Execute',
    closePanel: 'Close',
    accept: 'accept',
    acceptFailed: 'failed to accept message!',
    getNoticeFailed: 'failedto get Notices!',
    getPromInfoFailed: 'failed to get promote information!',
    getOperatorInfoFailed: 'failed to get operator information!',
    promoteFailed: 'failed to promote app!',
    promoteFailedForNoExistStore: 'failed to promote app,please add an external Appstore first',
    msgNum: 'Unread Messages',
    checkAllMsg: 'Check All',
    hotIndustry: '■ Popular edge app industry distribution',
    pushApp: 'PUSH',
    noticeApp: 'NOTICE',
    totalNum: 'total',
    appDownloadTrend: '■ APP pull trend chart',
    appPushStatistic: '■ APP push statistics',
    appNoticeStatistic: '■ Message notice statistics',
    appHotIndustryDesc: 'Download distribution map of popular industry APP',
    appPushStatisticDesc: 'Top5 APP to extrapolate target appStore statistics chart',
    appNoticeStatisticDesc: 'Top5 external appStore push APP statistics chart',
    appPullStatisticDesc: 'Pull APP trend graphs in the past week',
    appPushTargetAppstore: 'target appstore',
    pushChartUnit: 'Unit: Times',
    quarterly1: 'First season',
    quarterly2: 'Second quarter',
    quarterly3: 'Third quarter',
    quarterly4: 'Fourth quarter',
    viewTestRepo: 'view report',
    intentionAppstore: 'Intention platform',
    acceptSuccess: 'App received successfully, please check or publish in "My App"',
    deleteMsgSuccess: 'msg delete success',
    deleteMsgFailed: 'msg delete failed',
    deleteMsgTip: 'click to delete message',
    acceptMsgTip: 'click to accept message',
    targetPaltform: 'select an intended platform',
    selectAll: 'select all',
    nameCheck: 'platform name can not be null',
    versionCheck: 'platform version can not be null',
    companyCheck: 'company can not be null',
    addrCheck: 'URL can not be null',
    appdCheck: 'APPD transducer can not be null',
    descriptionCheck: 'description can not be null',
    haveNoAnaData: 'No operation analyse data!',
    existSameAppstoreName: 'An external appstore with the same name already exists, please edit the name of the external appstore again!'
  },
  appOnline: {
    startExperience: 'Click the online experience button to experience immediately...',
    waitUploadApp: 'Aploading app, please wait...',
    waitDistributeApp: 'App is being distributed, please wait patiently...',
    waitGetInstantiatedInfo: 'Getting instantiation information, please wait patiently...',
    waitInstantiatedApp: 'App is being instantiated, please wait patiently',
    deployFinished: 'Application deployment completed'
  },
  about: {
  },
  ...enLocale
}
export default appstoreEn


<|start_filename|>edgegallery-fe/src/locales/appstore_cn.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
const appstoreCn = {
  order: {
    orderMana: '订单管理',
    orderNum: '订单编号',
    nodeName: '节点名称',
    appName: '应用名称',
    appNameLabel: '应用名称：',
    nodeIp: '节点IP',
    orderTime: '下单时间',
    nodeAddress: '节点位置',
    status: '状态',
    orderUserName: '用户名',
    activation: '激活',
    unsubscribe: '退订',
    confirmToActivate: '是否要激活订单： ',
    tip: '提示',
    confirm: '确定',
    cancel: '取消',
    success: '操作成功！',
    canceled: '已取消！',
    confirmToUnsub: '是否要取消订单： ',
    unsubSuccess: '退订成功！',
    orderStatus: {
      activating: '正在激活',
      activateFailed: '激活失败',
      activated: '已激活',
      deactivating: '正在停用',
      deactivateFailed: '停用失败',
      deactivated: '已停用'
    },
    subscribe: '订购',
    price: ' 元（RMB）/小时',
    subPrice: '订购价格：',
    subSuccess: '订购成功！',
    chooseArea: '请先选择部署区域！',
    noNodes: '没有可供使用的边缘节点！'
  },
  appstoreSystem: {
    ipErrorInfo: '请输入正确的IP地址',
    upload: '上传',
    name: '名称',
    addHost: '新增沙箱环境',
    pleaseInput: '请输入',
    pleaseUpload: '请上传',
    error: '失败',
    success: '成功',
    correct: '正确',
    address: '部署区域',
    username: '用户名',
    char: '字符',
    useDetail: '使用详情',
    deleteConfirm: '确定删除吗？',
    userId: '用户ID',
    projectId: '应用ID',
    deployTime: '部署时间',
    deleteTime: '删除时间',
    addMep: '新增服务',
    basicInfo: '基本信息',
    registerInfo: '注册信息',
    capType: '能力分类',
    capTypeOPENMEP: '生态能力',
    serviceName: '服务名称',
    inPort: '端口号',
    version: '版本',
    provider: '提供商',
    apiFileId: 'API定义文件',
    fileExceed: '最多上传一个文件',
    guideFileId: '说明文档',
    guideFileId_zh: '中文说明文档',
    guideFileId_en: '英文说明文档',
    zh_cn: '中文',
    en: '英文',
    portRange: '端口范围',
    config_id: '配置文件',
    other: '其他',
    protocol: '协议',
    status: '状态',
    architecture: '架构',
    operation: '操作',
    delete: '删除',
    saveSuccess: '保存成功！',
    saveFail: '保存失败！',
    uploadSuccess: '上传成功！',
    uploadFailed: '上传失败！',
    guestPrompt: 'Guest用户无权操作，请先登录！',
    modify: '修改',
    noDataNotice: '暂无数据',
    typeError: '格式错误',
    typeConfig: '请上传config文件',
    networkConfig: '网络配置',
    log: {
      userName: '使用者',
      projectName: '应用名',
      appInstancesId: '实例化ID',
      deployTime: '使用时间',
      status: '状态',
      operation: '操作'
    },
    type: '类型',
    lcmIp: 'lcmIP',
    mecHost: 'mecHost',

    imageMgmt: {
      imgName: '镜像名称',
      imgType: '镜像类型',
      osName: '操作系统',
      osVersion: '版本',
      osBit: '位数',
      sysDisk: '磁盘大小',
      userName: '所属用户',
      createTime: '创建时间',
      uploadTime: '上传时间',
      imgFormat: '镜像格式',
      beginTime: '起始时间',
      endTime: '结束时间',
      typeValue: {
        public: '公共',
        private: '私有'
      },
      statusValue: {
        uploadWait: '待上传',
        uploading: '正在上传',
        uploadSucceeded: '上传成功',
        uploadFailed: '上传失败',
        published: '已发布'
      },
      uploadStatusText: {
        success: '上传成功',
        error: '上传失败',
        uploading: '正在上传',
        paused: '暂停',
        waiting: '等待'
      },
      operation: {
        newImg: '新建系统镜像',
        upload: '上传',
        selectImgFile: '选择文件',
        publish: '发布'
      },
      tip: {
        newImg: '新建系统镜像',
        editImg: '修改系统镜像',
        viewImg: '查看系统镜像详情',
        versionEmpty: '系统版本号不能为空！',
        systemDiskEmpty: '系统磁盘大小不能为空！',
        systemDiskRule: '请输入两到四位的整数！',
        uploadImg: '上传系统镜像',
        uploadIsoImgPromt: '请把iso格式的镜像文件压缩为zip后上传。',
        uploadQcow2ImgPromt: '请把qcow2格式的镜像文件压缩为zip后上传。',
        sysImageFileType: '请上传.zip格式的文件，且大小不超过5G！',
        onlyOneImageFile: '只能上传一个文件！',
        noFileSelected: '未选择上传的文件',
        confirmDeleteImage: '确认要删除该系统镜像吗？',
        confirmPublishImage: '确认要发布该系统镜像吗？',
        newImgFailed: '新建系统镜像失败！',
        modifyImgFailed: '修改系统镜像失败！',
        deleteImgFailed: '删除系统镜像失败！',
        publishImgFailed: '发布系统镜像失败！',
        queryImgFailed: '查询系统镜像失败！',
        uploadingHint: '系统镜像正在上传，请等待！'
      }
    }
  },
  appstoreCommon: {
    cancelText: '知道了',
    more: '更多',
    check: '查看',
    clean: '清空',
    sort: '排序',
    workloadType: '负载类型 :',
    address: '地址',
    type: '类型 :',
    video: '视频应用',
    game: '游戏',
    VideoSurveilance: '视频监控',
    AR: 'AR/VR',
    api: 'API',
    sdk: 'SDK',
    MEP: 'MEP',
    Security: '安全',
    blockchain: '区块链',
    smartDevice: '智能设备',
    IOT: '物联网',
    bigdata: '大数据',
    calculate: '计算',
    all: 'All',
    architecture: '架构 :',
    GPU: 'GPU',
    MEN: 'MEM',
    CPU: 'CPU',
    AI: 'AI',
    industry: '行业 :',
    Smartpark: '智慧园区',
    supermarket: '智慧商超',
    industrialManufacturing: '工业制造',
    logistics: '交通物流',
    hydroelectricity: '水利',
    games: '游戏竞技',
    openSource: '开源',
    else: '其他',
    appName: '应用名称',
    version: '版本',
    size: '大小',
    provider: '厂商',
    contact: '联系方式',
    operation: '操作',
    detail: ' 详情',
    delete: '删除',
    cancel: '取消',
    confirm: '确认',
    detect: '检测',
    download: '下载',
    uploadTime: '上传时间',
    applicationName: '应用名称',
    description: '描述',
    appDisplay: '应用展示',
    innerPublic: '本仓库可见',
    public: '可推广到其他仓库',
    userName: '上传人',
    getCaptcha: '获取验证码',
    inputCaptcha: '请输入验证码',
    choose: '请选择',
    number: '序号',
    appStoreName: '平台名称',
    appStoreVersion: '平台版本',
    url: 'URL',
    appdTransId: 'APPD版本',
    modifyApp: '编辑',
    company: '公司',
    pageTotalNum: '总条数',
    noData: '暂无数据',
    displaySwitch: '展示切换',
    appModify: '修改',
    experienceable: '支持体验',
    getResInfoFailed: '获取资源信息失败',
    exception400: '请求错误',
    exception401: '请求未授权',
    exception403: '请求被拒绝访问',
    exceptionxxx: '请求异常，请检查',
    exceptionServer: '服务异常，请检查',
    loading: '加载中'
  },
  promptMessage: {
    uninvolved: '请参考应用详情端口',
    hostErrorInfo: '请输入正确的Host地址',
    portErrorInfo: '端口号范围30000-32000',
    guestUser: 'guest用户无权操作！ 请登录',
    operationFailed: '操作失败！',
    getfail: '获取失败！',
    modifySuccess: '修改成功！',
    modifyFail: '修改失败！',
    fileNotSupport: '文件格式不支持！',
    fileEmpty: '文件内容为空！',
    deleteSuccess: '删除成功！',
    fileNotContent: '文件格式不支持或内容为空！',
    fileNameType: '文件名称不能包含空格！',
    moreThan2: '只能上传不超过2MB的文件！',
    checkFileType: '请上传符合格式的文件',
    canOnlyUpload: '只能上传 .',
    files: ' 类型文件.',
    uploadPicture: '请上传.jpg或.png格式文件.',
    uploadPackageFile: '请添加需要上传的安装包文件！',
    uploadIconFile: '请上传图标文件或者选择图标！',
    industryEmpty: '行业不能为空',
    architectureEmpty: '架构不能为空',
    typeEmpty: '类型不能为空',
    shortDescEmpty: '描述不能为空',
    completedTest: '您已经完成了测试，请点击查看报告',
    uploadSuccess: '上传成功！',
    uploadFailed: '上传失败！',
    checkName: '验证失败，请重新检查用户名或密码.',
    repeatEnter: '输入信息有误，请重新输入。',
    userResistedSuccess: '用户注册成功！！',
    userResistedFaile: '注册用户失败',
    deletePrompt: '该操作将永久删除应用程序。你想继续吗?',
    deleteAppStore: '该操作将永久删除外部仓库。你想继续吗?',
    prompt: '提示',
    checkUploadProgress: '立即检查上传进度?',
    browserAdvise: '为了部分功能正常使用，我们建议使用Chrom浏览器！',
    userNameIsExists: '用户名已注册，请更换新用户名。',
    phoneNumIsExists: '电话号码已经注册了。',
    subCommentFail: '提交评论失败。',
    getCommentFail: '获取评论失败。',
    getAppFail: '获取App数据失败。',
    reLogin: '会话超时,请重新登录.',
    getTaskListFail: '获取测试任务失败。',
    getMyAppFail: '获取我的App数据失败。',
    verifyNamePhoneFail: '验证用户名或手机号失败。',
    registerFail: '注册失败。',
    getCaptchaSuccess: '验证码已发送至您的手机，请查收。',
    getCaptchaFail: '获取验证码失败。',
    confirmLogout: '您确定要退出吗?',
    contrastTime: '提交时间不能早于测试结束时间！',
    subCommentFailReason: '评分和评论内容是必须的',
    cannotComment: '您不能评论自己的应用',
    onlyOneFile: '仅支持一个文件，请先移除已有文件！',
    publishSuccess: '发布成功',
    createtask: '是否创建测试任务？',
    createFail: '测试任务检查失败',
    testFail: '测试任务失败，请前往查看测试报告！',
    testAgain: '再次测试',
    testSuccess: '测试任务成功，请前往查看测试报告！',
    testRunning: '测试任务正在运行，请前往查看测试进展！',
    testWaiting: '测试任务正在等待运行，请前往查看测试进展！',
    testCreated: '测试任务已创建，请前往运行测试任务！',
    appStoreNameEmpty: '平台名称不能为空',
    appStoreVersionEmpty: '平台版本不能为空',
    appdTransIdEmpty: '转换器不能为空',
    normalVerify: '输入的内容格式不正确',
    addAppStoreSuccess: '添加AppStore成功',
    editAppStoreSuccess: '编辑AppStore成功',
    cleanTestEnvFail: '清除测试环境失败。',
    getNodePortFail: '获取体验信息失败。',
    registerHost: '请联系管理员添加可供体验的沙箱环境',
    instantiateFailed: '实例化应用失败',
    getNodePortFailed: '获取服务节点信息失败',
    cleanEnvFailed: '释放资源失败',
    cleanEnvSuccess: '释放资源成功',
    portRange: '范围30000 - 32000',
    getReleaseDataFail: '获取体验初始化信息失败',
    getNodePortSuccess: '获取服务节点信息成功'
  },
  store: {
    synchronous: '同步应用到MEAO',
    appChange: '应用包转换工具',
    backAppStore: '返回应用仓库',
    backMyApp: '返回我的应用',
    selectTestSce: '选择测试场景',
    industry: '行业',
    type: '类型',
    advancedSearch: '高级搜索',
    clearAll: '清空',
    screening: '筛选',
    most: '下载量',
    downloadcount: ' 次下载',
    name: '名称',
    score: '评分',
    appPackageInfo: '应用程序基本信息',
    createTime: '创建时间',
    download: '下载',
    synchronize: '同步',
    synchronizedwaiting: '需要一定时间上传应用包',
    notSupportSynchronized: '暂时不支持此平台同步',
    comments: '评论',
    allComments: '全部评论',
    introduction: '应用详情',
    introductionTip: '本应用暂无详情信息！',
    demo: '视频',
    message: '消息',
    postComment: '提交评论',
    uploadApp: '上传应用',
    uploadVideo: '上传视频',
    uploadLogo: '上传图标',
    appPackage: '应用程序',
    dragPackage: '拖动应用程序包文件到这里或点击上传',
    onlyCsar: '只能上传.csar;.zip文件.',
    packageSizeLimit: '文件大小不超过10M',
    appIcon: '应用图标',
    appVideo: '应用视频',
    onlyImg: '请上传.jpg或.png格式文件，或者选择默认图标',
    onlyVideo: '只能上传 .mp4 文件.',
    iconSizeLimit: '文件大小不超过2M',
    videoSizeLimit: '文件大小不超过10M.',
    userName: '用户',
    time: '时间',
    toBeAdded: '待补充',
    iconRequired: '请上传图标',
    appstore: '应用仓库',
    appShare: '应用共享',
    limitition: '请上传.jpg或.png格式文件，或选择默认应用图标，且大小不超过2M',
    commentInfo: '写下你的评论，帮助我成长吧！',
    noComment: '暂时没有评论哦，请留下你的第一条评论吧！',
    chooseUploadeWay: '应用大小选择',
    MinFileUpload: '文件大小不超过10M',
    BigFileUpload: '文件大小超过10M',
    hasNotVideo: '当前应用还没有可演示的视频！',
    newUploadApp: '近期热门应用',
    senceCase: '场景案例',
    introduct: '简介：',
    tag: '标签',
    reapp: '相关应用',
    viewMore: '查看更多',
    clickViewMore: '点击查看更多 >>',
    moreInfo: '更多信息 >>',
    speakPeek: '2021 先睹为快',
    reCommendColletion: '特别推荐锦集',
    higherScore: '高分应用',
    addYourApp: '实现你的应用',
    addYourAppTitle: '方便快捷的接入AppStore，快速实现应用测试与共享',
    developerPlateform: '开发者平台',
    officialGuide: '官方指导',
    recommendBroswer: '建议使用Google Chrome及IE9以上浏览器浏览',
    downloadNum: '次下载',
    workloadType: '负载类型',
    deployContainer: '容器',
    deployVM: '虚拟机',
    downloadImage: '应用包下载',
    downloadImageTip: ' 应用包内有镜像下载链接',
    downloadImageTip2: ' 镜像在应用包里，镜像文件较大，下载耗时较长，请耐心等待',
    need: '带镜像的应用包',
    noNeed: '不带镜像的应用包',
    showOnline: '在线体验',
    releaseResource: '释放资源',
    tryAppTip: '需要提供可供体验的前台界面，并在描述里面添加界面访问的URL',
    releaseAppResource: '体验完成后请及时释放资源，避免资源占用，否则系统24小时后自动释放',
    serviceName: '服务名称',
    Ip: 'IP',
    port: '端口',
    assignTestNodes: '分配测试节点',
    instantiateApplication: '实例化应用',
    getDeploymentStatus: '获取部署状态',
    TestNodeFirstStep: '请分配测试节点',
    TestNodeSecondStep: '正在分配测试节点，请耐心等待点',
    TestNodeThirdStep: '测试节点已分配完成',
    experiencePhase: '体验阶段',
    pleaseInstantiateApp: '请实例化应用',
    waitInstantiatedApp: '正在实例化应用，请耐心等待',
    StartDeployApp: '应用开始部署',
    queryDeployStatus: '请查询部署状态',
    waitQueryStatus: '正在查询部署状态，请耐心等待',
    deployFinished: '应用部署完成',
    tryAppDes: '请根据如下服务信息，结合应用描述中界面体验url进行体验',
    serviceNodeInfo: '服务节点信息',
    appdConversion: '应用包转换',
    filterApp: '筛选应用',
    taskId: '任务 ID',
    MeaoName: 'MEAO 名称',
    MeaoUrl: 'MEAO 访问地址',
    taskCreateTime: '任务创建时间',
    taskStatus: '任务状态',
    taskProgress: '任务进度',
    synchronizeToMeao: '同步到 MEAO'
  },
  myApp: {
    checkTest: '查看历史测试任务',
    startTime: '提交时间',
    reset: '重置',
    inquire: '查询',
    version: '版本',
    endTime: '结束时间',
    operation: '操作',
    taskNumber: '任务序号',
    checkReport: '查看报告',
    upload: '上传',
    status: '状态',
    test: '测试',
    publish: '发布',
    addApp: '添加外部仓库',
    modifyAppStore: '编辑外部仓库',
    provider: '供应商',
    appModify: '修改',
    getStatusFailed: '获取应用状态失败',
    more: '更多',
    free: '免费',
    price: ' 元（RMB）/小时',
    priceTitle: '应用定价设置'
  },
  atp: {
    step1: '病毒扫描',
    step2: '遵从性测试',
    step3: '沙箱测试',
    step4: '审核',
    testCase: '测试用例',
    startTest: '开始测试',
    result: '测试结果',
    caseName: '用例名称',
    caseDetail: '用例详情',
    testReport: '测试报告分析',
    detail: '详情',
    version: '版本',
    packageName: '应用名称',
    startTime: '提交时间',
    endTime: '结束时间',
    status: '状态',
    ticketNumber: '任务号',
    baseInfo: '基础信息',
    uploadUser: '上传人',
    success: '成功数量',
    failed: '失败数量',
    dependencyDetail: '依赖详情',
    versionDependency: '版本依赖',
    testTask: '测试任务描述',
    testItems: '测试项',
    caseNumber: '用例个数',
    cancel: '取消',
    confirm: '确定',
    returnList: '返回任务列表',
    security: '安全测试',
    complianceTest: '遵从性测试',
    sandboxTest: '沙箱测试',
    review: '审核',
    testCaseManagement: '测试用例管理',
    fileSize: '文件大小',
    applicationName: '应用名称',
    appPackage: '应用包',
    uploadApp: '上传应用',
    onlyCsar: '只能上传.csar;.zip文件.',
    packageSizeLimit: '文件大小不超过10M'
  },
  apppromotion: {
    prepare: '准备',
    pushing: '推送中',
    pushFail: '推送app失败',
    warehouseTip: '请确认有无外部仓库！',
    pushResult: '推送结果',
    number: '序号',
    appName: '应用名称',
    provider: '厂商',
    version: '版本',
    tesResult: '认证测试结果',
    testRepo: '认证测试报告',
    lastProTime: '最后推广时间',
    proTimes: '推广次数',
    batchPro: '批量推送',
    messageType: '消息类型',
    messagePull: '拉取',
    messagePush: '推送',
    messageNotice: '通知',
    messageBeDownload: '下载',
    messageUnknow: '未知',
    sourceAppStore: '源应用仓库',
    targetAppStore: '目标应用仓库',
    dateTime: '时间',
    description: '描述',
    mesOperation: '操作',
    checkDetail: '查看',
    appPromotion: '应用推送',
    operationAna: '操作分析',
    execute: '执行',
    closePanel: '关闭',
    accept: '接收',
    acceptFailed: '消息接收失败！',
    getNoticeFailed: '获取消息失败！',
    getPromInfoFailed: '获取推送信息失败！',
    getOperatorInfoFailed: '获取操作信息失败！',
    promoteFailed: '推送app失败！',
    promoteFailedForNoExistStore: '推送app失败，请先添加外部应用仓库',
    viewTestRepo: '查看报告',
    msgNum: '未读消息',
    checkAllMsg: '查看全部',
    hotIndustry: '■ 热门边缘应用行业分布',
    pushApp: '对外推送',
    noticeApp: '收到推送',
    totalNum: '总量',
    appDownloadTrend: '■ APP拉取趋势图',
    appPushStatistic: '■ APP推送统计',
    appNoticeStatistic: '■ 消息通知统计',
    appPushTargetAppstore: '目标仓库',
    appHotIndustryDesc: '热门行业应用下载分布图',
    appPushStatisticDesc: 'Top5应用外推目标仓库统计图',
    appNoticeStatisticDesc: 'Top5外部仓库推送应用统计图',
    appPullStatisticDesc: '近一周拉取应用趋势图',
    pushChartUnit: '单位：次',
    quarterly1: '第一季度',
    quarterly2: '第二季度',
    quarterly3: '第三季度',
    quarterly4: '第四季度',
    intentionAppstore: '意向平台',
    acceptSuccess: '应用接收成功，请到“我的应用”中查看或发布',
    deleteMsgSuccess: '删除消息成功',
    deleteMsgFailed: '删除消息失败',
    deleteMsgTip: '单击删除消息',
    acceptMsgTip: '单击接收消息',
    targetPaltform: '请选择意向平台',
    selectAll: '全选',
    nameCheck: '平台名称不能为空',
    versionCheck: '平台版本不能为空',
    companyCheck: '公司不能为空',
    addrCheck: 'URL不能为空',
    appdCheck: '转换器不能为空',
    descriptionCheck: '描述不能为空',
    haveNoAnaData: '暂无操作分析数据！',
    existSameAppstoreName: '已存在同名外部仓库，请重新编辑外部仓库名称'
  },
  appOnline: {
    startExperience: '点击在线体验按钮,马上进行体验...',
    waitUploadApp: '正在上传应用,请耐心等待...',
    waitDistributeApp: '正在分发应用,请耐心等待...',
    waitGetInstantiatedInfo: '正在获取实例化信息,请耐心等待...',
    waitInstantiatedApp: '正在实例化应用，请耐心等待...',
    deployFinished: '应用部署已完成'
  },
  about: {},
  ...zhLocale
}
export default appstoreCn


<|start_filename|>src/locales/en.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import enLocale from 'element-ui/lib/locale/lang/en'
const en = {
  common: {
    cancelText: 'OK',
    cancel: 'Cancel',
    confirm: 'Confirm',
    close: 'Close',
    download: 'Download',
    list: 'List',
    input: 'Please enter the ',
    select: 'Please select',
    developing: 'The page is under development.',
    edit: 'Edit',
    save: 'Save',
    search: 'Search',
    reset: 'Reset',
    delete: 'Delete',
    status: 'Status',
    operation: 'Operation',
    all: 'All',
    unknown: 'Unknown',
    more: 'More',
    check: 'Check'
  },
  home: {
    enterDev: 'Enter development',
    select: 'Select',
    start: 'Start',
    partner: 'Partner'
  },
  footer: {
    about: 'About',
    website: 'Official website',
    videoResource: 'Video',
    trainingMaterials: 'Training material',
    communication: 'Communication',
    softwareDownload: 'Software Download',
    community: 'Community',
    project: 'Project',
    membership: 'Membership',
    contactUs: 'Contact Us',
    followUs: 'Follow Us',
    WeChatPublic: 'WeChat public account',
    codeWarehouse: 'Code warehouse',
    followWeibo: 'Follow the Weibo',
    mailingList: 'Mailing list',
    copyright: 'Copyright © EdgeGallery 2019 - 2021. All rights reserved. For details, see the Legal Statement',
    legalNotice: 'Legal Notice',
    privacyPolicy: 'Privacy Policy'
  },
  devTools: {
    mecDeveloper: 'MEC Developer',
    pluginName: 'Plugin Name',
    description: 'Description',
    author: 'Author',
    score: 'Score',
    chooseFunction: 'Please Choose Function',
    enterSearch: 'Enter To Search',
    detail: 'Detail',
    delete: 'Delete',
    deletePlugin: 'Are you sure you want to delete the plugin?',
    deleteProject: 'Are you sure you want to delete the project?',
    deleteReport: 'Are you sure you want to delete the report?',
    deleteSucc: 'Data deleted successfully',
    deleteFail: 'Failed to delete data',
    applicationName: 'Application Name',
    applicationVersion: 'Application Version',
    downloads: 'Downloads',
    satisfaction: 'Satisfaction',
    pluginDescription: 'Plugin Description',
    submitRate: 'Please submit your rating',
    upload: 'Upload',
    pluginFunction: 'Plugin Language',
    pluginType: 'Plugin Type',
    uploadPlugin: 'Upload Plugin',
    fileText: 'Please upload files in .zip, .rar format, and the size does not exceed 20MB',
    uploadLogo: 'Upload Logo',
    logoText: 'Can only upload .jpg/.png files or select the default APP icon and no more than 2M',
    uploadApi: 'Upload API',
    uploadApiFile: 'API definition file',
    apiText: 'Can only upload .json,.yaml files',
    version: 'Version',
    uploadNow: 'Upload Now',
    pluginList: 'Plugin',
    sdkList: 'SDK',
    toolChainText: 'Can only upload .tar.gz files and no more than 10M',
    toolChainInfo1: 'The toolChain is an important feature of the MEC Developer developer platform. When an App on the x86 platform wants to get on the ARM platform, the underlying code inevitably needs to be modified or rewritten. App providers can analyze the source code through the toolChain integrated in the MEC Developer developer platform, locate the source code that needs to be modified and modify it according to the guidance, so that the App can be deployed on the ARM platform.',
    toolChainInfo2: 'Currently, the following files can be analyzed',
    toolChainInfo3: 'C/C++ software source code',
    toolChainInfo4: 'C/C++ software construction project file',
    toolChainInfo5: 'X86 assembly code',
    mdText: 'Please upload an .md file to explain the functions and usage of the plug-in, etc.'
  },
  toolBox: {
    appEditorTitle: 'Application Editor',
    selectApp: 'Select application',
    provider: 'Provider',
    architecture: 'Architecture',
    synchronizeDate: 'Synchronised time',
    publish: 'Publish',
    publishSuc: 'Publish Successful',
    publishFail: 'Publish failed',
    modifyPkgSuccess: 'Successfully modified',
    modifyPkgFail: 'Fail to edit',
    appEditor: {
      checkModified: 'Change failure or no content is not modified',
      edit: 'Preview and edit',
      checkMf: 'Before publishing the application, you need to modify any of the three fields app_product_name, app_provider_id, app_package_version in the ‘.mf’ file',
      editAppTitle: 'Select the application that needs to be modified',
      syncFailed: 'Sync failed!'
    }
  },
  api: {
    docs: 'Docs',
    updated: 'Updated',
    modify: 'Modify',
    downLoad: 'Download',
    share: 'Share',
    applicationAPI: 'Application API',
    faceRecognition: 'Face Recognition',
    vr: 'VR',
    ar: 'AR',
    name: 'Name',
    description: 'Description',
    apiDetail: 'API Detail',
    network: 'Network',
    computing: 'Computing',
    ai: 'AI',
    video: 'Video',
    srviceIntroduction: 'Service Introduction',
    serviceList: 'Service List',
    deleteApi: 'Click to delete public API',
    usageInstruction: 'Usage Instruction',
    serviceSelection: 'Service Selection:',
    noDataNotice: 'No data available',
    installGuide: 'Installation Guide',
    hotServices: 'Popular Service',
    capabilitieTitle: 'Edge ability to choose as you like',
    capabilitieTitle2: 'The ultimate experience at your fingertips',
    capabilitieOneTip: 'EdgeGallery Service Showcase',
    capabilitieTwoTip: 'Developer Practice Area',
    serviceDoc: 'service docs',
    onlineEmulator: 'online emulator',
    videoTutorial: 'Video Tutorial Area',
    developerCommunity: 'Q&A Community',
    Detail: 'Detail',
    videoTutorialDetail: 'Guide developers in the whole process of app application developer, deploy, test, and release based on the EdgeGallery platform.',
    developerCommunityDetail: 'Used for developer communication and learning.',
    telecomStandardCapabilitieTitle: 'Telecom Standard Capability Landscape',
    swithToAPI: 'Click this button to go to the API simulator page',
    onlineExperience: 'Online Experience',
    onlineService: 'The online experience service is not enabled',
    mostPopular: 'Most Popular',
    latestUpdate: 'Latest Update',
    hot: 'Hot',
    showMore: 'More',
    partition: 'Owning Partition'
  },
  nav: {
    home: 'Home',
    devtools: 'DevTools',
    plugin: 'Plugin',
    sdk: 'SDk',
    upload: 'Upload',
    api: 'API',
    introduction: 'Introduction',
    mepApi: 'Ability Center',
    applicationApi: 'Application API',
    test: 'Test',
    howTest: 'How To Test',
    testApplication: 'Test Application',
    testTask: 'Test Task Management',
    mecOpenSource: 'MEC Open Source Ecology',
    workSpace: 'WorkSpace',
    docs: 'Document',
    search: 'Search',
    hsInvalidHintForTimeout: 'You have not operated for a long time, ',
    hsInvalidHintForLogout: 'You have logged in or logged out through other pages, ',
    hsInvalidHintForServerStopped: 'The server has been upgraded, ',
    hsInvalidHint: 'the current session has expired. Please choose to refresh the page or log in again.',
    refresh: 'Refresh',
    reLogin: 'Login',
    help: 'Help',
    contact: 'Contact',
    serviceDoc: 'Service Document',
    apiMulator: 'Online Simulator',
    component: 'Interface Components'
  },
  capabilityCenter: {
    telecomStandards: 'Telecom standards support panorama'
  },
  workspace: {
    projectStatusEnum: {
      createNew: 'New',
      testing: 'Testing',
      tested: 'Tested',
      released: 'Released'
    },
    configYaml: {
      yamlFileType: 'Please select files with the suffix ".yaml"',
      uploadYamlFirst: 'Please upload Yaml first or perform visual configuration',
      importFile: 'Import File',
      config: 'Visual Configuration',
      uploadFile: 'Upload File',
      downloadDemo: 'download template',
      uploadYaml: 'Upload file',
      uploadYamlTip: 'upload .yaml file',
      pass: 'file detection passed',
      fail: 'file detection failed',
      format: 'params check',
      imageInfo: 'image information',
      serviceInfo: 'service information',
      mepAgent: 'MEP Agent',
      mepAgentTip: '(If mepagent is not integrated, api cannot be released)',
      visualConfigTip: 'If the yaml file has been uploaded, the visual configuration is not required'
    },
    uploadImage: {
      successfulTest: 'Test successfully',
      failTest: 'Test failed',
      testfirst: 'Please test first',
      useEnvTip: 'Note: All of the test tasks will be completed on the private edge node when enable it',
      useEnv: 'Enable:',
      test: 'Test',
      importNode: 'Import Host IP:',
      installation: 'Installation Doc',
      software: 'Software',
      version: 'Version',
      uploadAppImage: 'Upload APP Image',
      mode1: 'Mode 1',
      mode1Desc: 'Upload app image to the public repository',
      mode1Tip: 'Note: Support dockerhub, SWR mirror warehouse, the mirror that has been uploaded to the public warehouse, please refer to it directly in the configuration file',
      mode2: 'Mode 2',
      mode2Desc: 'Upload app image to the EdgeGallery repository',
      mode2Tip: 'Note: Please upload files in rar, tar, zip format, and the size does not exceed 5G',
      mode3: 'Mode 3',
      mode3Desc: 'Upload app image to the private Edge Node',
      mode3Tip: 'How to build a private Edge Node, please refer to'
    },
    supportPlatform: {
      title: 'Select the deployment platform to support'
    },
    deployFailLog: {
      CSAR: 'CSAR package generation failed, please check whether the deployment file is uploaded',
      hostInfo: 'No test environment available, please configure the test environment',
      instantiateInfo: 'APP instantiation failed. The possible reasons are: 1. The test environment is configured incorrectly. 2. APP name or port is already occupied 3. For other problems, please contact the administrator.',
      workStatus: 'Failed to obtain APP status, possible reason: image pull fail, contact the administrator for other problems'
    },
    prepare: {
      toolTip: 'According to the development language of the application, the IDE is locally installed and configured',
      pluginTip1: 'EdgeGallery provides locally developed',
      pluginTip2: ' IDE plugin ',
      pluginTip3: ',Sample code that can be used to generate (currently supports python and java languages)',
      codeTip1: 'EdgeGallery provides the sample code of the following APP local development for developers\' reference,or click to ',
      codeTip2: ' download ',
      codeTip3: 'to local'
    },
    appRelease: {
      appConfig: 'Application Configuration',
      appCertify: 'Application Certification',
      startTest: 'Start Test',
      appRelease: 'Application Release',
      addFilter: 'Add flow filter',
      srcAddress: 'Src IP Address',
      srcPort: 'Src Port',
      dstAddress: 'Dst IP Address',
      dstPort: 'Dst Port',
      trafficRuleId: 'Traffic Rule Id',
      filterType: 'Filter Type',
      priority: 'Priority',
      protocol: 'Protocol',
      action: 'Action',
      dnsRuleId: 'DNS Rule Id',
      ipAddress: 'IP Address',
      ipAddressType: 'IP Address Type',
      domainName: 'DomainName',
      ttl: 'TTL',
      checkRules: 'Check Rules',
      dnsRule: 'DNS Rules',
      trafficRule: 'Traffic Rules',
      trafficFilter: 'Traffic Filter',
      tag: 'Tag',
      tgtTunnelAddress: 'Tunnel destination address',
      dstTunnelPort: 'Tunnel destination port',
      srcTunnelAddress: 'Tunnel source address',
      srcTunnelPort: 'Tunnel source port',
      multipleIP: 'Please separate multiple IPs with\',\'',
      multiplePort: 'Please separate multiple Ports with\',\'',
      forwardInterface: 'Interface Information',
      forwardInterfaceTabTitle: 'Forward Interface Information',
      newInterface: 'New Interface Information',
      interfaceType: 'Interface Type',
      tunnelType: 'Tunnel Type',
      tunnelParams: 'Tunnel Specified Parameters',
      macAddress: 'Destination MAC Address',
      sourceMacAddress: 'Source MAC Address',
      interfaceInfo: 'Interface Information',
      tunnelInfo: 'Tunnel Information',
      macInfo: 'MAC Information',
      IpInfo: 'IP Information',
      capabilityType: 'Capability Type',
      noService: 'Your application does not rely on the ecosystem services of the platform',
      blackWhiteList: 'Black and White list',
      UEIdentity: 'UE Identity',
      enterAtp: 'To know Application Testing',
      selectInitialization: 'Please select the service you need in the service list on the left',
      free: 'Free',
      price: 'Yuan（RMB）/Hour',
      priceTitle: 'Apply pricing settings'
    },
    deployDebugVm: {
      vmNameLbl: 'Project Name',
      vmSpecLbl: 'Specification',
      vmImageLbl: 'System Image',
      vmNetworkLbl: 'Network',
      vmIpLbl: 'IP Address',
      vmStatusLbl: 'Status',
      vmApplyTimeLbl: 'Apply Time',
      vncBtnLbl: 'Remote Login',
      uploadBtnLbl: 'Upload Code',
      deleteBtnLbl: 'Delete',
      createImage: 'Create Image',
      applyResource: 'Apply Resource',
      configSpec: 'Specification Setting',
      otherSetting: 'Application Setting',
      configNetwork: 'Network Setting',
      vmName: 'Virtual Machine Name',
      vmSpec: 'Virtual Machine Specification',
      selectVmSpecTip: 'Select Virtual Machine Specification',
      vmSpecMustSelectTip: 'Please select virtual machine specification!',
      scene: 'Scene',
      memory: 'Memory',
      systemDisk: 'System Disk',
      dataDisk: 'Data Disk',
      otherAbility: 'Other Ability',
      selectVmImageTip: 'Select System Image',
      publicImage: 'Public',
      privateImage: 'Private',
      selectVmSystemTypeTip: 'System Type',
      selectVmSystemImageTip: 'System Image',
      vmSystemImageMustSelectTip: 'Please select system image!',
      selectNetworkTypeTip: 'Select Network Type',
      networkType: 'Network Type',
      vmNetworkTypeMustSelectTip: 'Please select network type!',
      uploadApp: 'Upload Application Code Package',
      selectFile: 'Select Package File',
      upload: 'Start Upload',
      uploadAppFileTip: 'Please upload files in .zip, .rar, .tar format, and the size does not exceed 500MB',
      appPackageFileEmpty: 'Please select application code package file!',
      deleteVmResPrompt: 'Are you sure you want to delete the virtual machine resource?',
      loadVmConfigFailed: 'Load Virtual Machine Resource Configuration Failed!',
      applyVmResStart: 'Start generating application package',
      applyVmResFailed: 'Failed to generate application package!',
      deleteVmResSuccess: 'Delete Virtual Machine Resource Succeed!',
      deleteVmResFailed: 'Delete Virtual Machine Resource Failed!',
      createImageText: 'Application commissioning completed, Generate the mirror',
      generate: 'Generate',
      stageStatus: 'Stage Status',
      uploadPromt: 'Note: The file is uploaded to the root directory of the virtual machine by default',
      vmList: 'Virtual machine resource detail',
      deployResultList: 'Deployment Test results',
      deleteVmDeployList: 'Are you sure you want to delete the deployment test result?',
      resourceConfigPromt: 'Please configure resources first',
      releasePromt: 'The application has no resource configuration and cannot be published',
      flavorExtraSpecs: 'Flavor Extra Specs',
      useScript: 'Whether to use injection script:',
      script: 'Script',
      resourceConfig: 'Resource Allocation',
      deploySelect: 'Optional deployment and commissioning',
      deployTips: 'Through deployment and commissioning, you can apply for the virtual machine environment to import the app test package and test it, and you can directly publish the vm package without the deployment and commissioning.',
      setTips: 'Application settings are optional according to the application',
      akTitle: 'Application key settings',
      generatePackage: 'Generate application package',
      type: 'Type'
    },
    visualConfig: {
      podBasicInfo: 'Pod Basic Information',
      podNameVerify: 'Pod name cannot be empty and cannot contain underscores',
      workContainer: 'Working Container',
      containerNameVerify: 'Container name cannot be empty',
      imageInfoVerify: 'Image information format: imageName:version',
      pullStrategy: 'Pull Strategy',
      internalPort: 'Internal Port',
      internalPortVerify: 'Internal port cannot be empty',
      envVariable: 'Environment Variable',
      variableName: 'Variable Name',
      variableValue: 'Value',
      commandLine: 'Command Line',
      accessMethod: 'Access Method Service',
      serviceNameVerify: 'Service name cannot be empty and cannot contain underscores',
      destinationPort: 'Destination Port',
      destinationPortVerify: 'Destination port cannot be empty',
      nodePort: 'Node Port',
      nodePortVerify: 'Node port cannot be empty',
      viewYamlFile: 'View Yaml',
      saveConfigSuccess: 'Save the configuration successfully',
      saveConfigFail: 'Failed to save configuration',
      back: 'Back',
      visualConfigFile: 'Visual configuration file'
    },
    workSpace: 'WorkSpace',
    myProjectList: 'My Project List',
    addNewProject: 'Create Project',
    projectStatus: 'Project Status',
    serial: 'Serials',
    icon: 'Icon',
    defaultIcon: 'Default',
    customIcon: 'Custom',
    projectName: 'Project Name',
    projectType: 'Project Type',
    version: 'Version',
    provider: 'Provider',
    platform: 'Platform',
    industry: 'Industry',
    createDate: 'CreateDate',
    status: 'Status',
    operation: 'Operation',
    remove: 'Remove',
    detail: 'Detail',
    statusNew: 'New Project',
    statusDeploying: 'Deploying',
    statusSuccess: 'Deploy Finish',
    statusFail: 'Deploy Failed',
    statusTesting: 'Testing',
    statusTested: 'Tested',
    statusReleased: 'Released',
    createProject: 'Application development project',
    migrationProject: 'Application integration project',
    basicInformation: 'Basic Information',
    registInformation: 'Registration message',
    appName: 'App Name',
    uploadIcon: 'Upload Icon',
    limitition: 'Can only upload .jpg/.png files or select the default APP icon and no more than 2M',
    iconRequired: 'Icon is required',
    chooseAbilities: 'Ability Selection',
    openMEPCapabilities: 'EdgeGallery Capabilities',
    chooseMepC: 'Choose the EdgeGallery capabilities what you want',
    seviceDiscovery: 'Service Discovery',
    dns: 'DNS',
    location: 'Location',
    traffic: 'Traffic',
    bandwith: 'Bandwith',
    rnis: 'RNIS',
    fiveGcapabilities: '5GC capabilities',
    openMEPECOCapabilities: 'EdgeGallery-eco Capabilities',
    chooseMEPeco: 'Choose the EdgeGallery-eco capabilities what you want',
    previous: 'Previous',
    next: 'Next',
    selectionAbilitiesDetail: 'Selection Abilities Detail',
    platformCapabilities: 'Platform capabilities',
    service: 'Service',
    serviceVersion: 'Service Version',
    serviceDescription: 'Service Description',
    selectLeastOne: 'Please select at least one',
    projectLink: 'Project Link',
    toolChain: 'ToolChain',
    programTools: 'Programming Tools',
    programPlugin: 'Programming Plugin',
    sampleCode: 'Sample Code',
    confirm: 'Confirm',
    capabilityDetails: 'Capability Select',
    deploymentTest: 'Deployment Test',
    applicationRelease: 'App Release',
    environmentPreparation: 'Environment Preparation',
    environmentPreparationTip: 'According to the application development requirements, prepare the development environment',
    choosePlatform: 'Choose Deployment Platform',
    selectImage: 'Upload App Image',
    configureYaml: 'Configure Deployment Files',
    server: 'Select Server',
    test: 'Deployment Test',
    abilitiesDetail: 'Abilities Detail',
    appDevelopment: 'App Development',
    appIntegration: 'Application Integration',
    buildTip: 'Your application has been integrated with EdgeGallery platform, please test your own APP business',
    finishTest: 'Finish Test',
    saveData: 'Save config',
    statistics: 'Statistics',
    realTimeStatistics: 'Real-time Statistics',
    performaceStatistics: 'Performance Statistics',
    first: 'First',
    buildDocker: 'Build your docker image',
    second: 'Second',
    chooseFile: 'Drag the image file here, or click to upload',
    remoteaddress: 'Or give a remote address that supports standard warehouse commands',
    name: 'Name',
    architecture: 'Architecture',
    address: 'Address',
    deploy: 'Deploy',
    description: 'Description',
    selectRepository: 'Select Repository',
    select: 'Please Select',
    nextStep: 'Next Step',
    publish: 'Publish',
    publishtext: 'Whether to publish your APP to the EdgeGallery APP store',
    publictext: 'Whether or not to expose your APP\'s API capabilities to the EdgeGallery ecosystem',
    method1: 'Method 1: Select the image (select the App image provided by the platform for rapid deployment and launch)',
    method2: 'Method 2: Specify the image package (requires the user to upload to the image repository first)',
    imagename: 'imageName',
    imageversion: 'Version',
    port: 'Port',
    add: 'Add ',
    method3: 'Method 3: Upload the App image package (after uploading the image package, the system will automatically push the image to the system warehouse)',
    method4: 'Method 4: Upload the app source code (after uploading the source code, the system will automatically compile and generate an image and push it to the xxx warehouse)',
    uploadYaml: 'Upload Yaml',
    uploadApppackage: 'Upload APP image package',
    appimage: 'App Image',
    addimage: 'Add Image',
    servicename: 'Service Name',
    href: 'Href',
    internalPort: 'Internal Port',
    outPort: 'External Port',
    confirmUpload: 'Confirm upload',
    uploadSourceCode: 'Upload source code',
    storagePath: 'Source code storage path',
    checkItem: 'Check items: compiler options, compiler macros, assembler, built-in functions, properties',
    targetOS: 'Target operating system',
    buildTools: 'Build Tools',
    compileCommand: 'Compile Command',
    compilerVersion: 'Compiler Version',
    targetVersion: 'Target system kernel version',
    analysis: 'Analysis',
    historicalReport: 'Historical Report',
    sourceCodePath: 'Source code storage path',
    analysisResults: 'Analysis results',
    needtranscount: 'Source files to be migrated',
    codeCount: 'Number of lines of code to port',
    makefileSourceCode: 'C/C++ and Makefile source code',
    lines: 'lines',
    assemblyCode: 'Assembly code',
    downloadReport: 'Download Report',
    startDeploySucc: 'Start Deployment',
    startDeployFail: 'Deployment failed',
    deploying: 'Deploying, please wait...',
    uploadCodeFail: 'Failed to upload source code！',
    reportPromt: 'Your report has expired and cannot be viewed online, please download and view',
    serviceDetails: 'Service Details',
    releaseTime: 'Release Time',
    sdkDownload: 'SDK Download',
    apiTopText: 'The API simulator provides a public environment for local interface debugging and online simulation testing. Developers can use the simulator host address and application external port number to access locally, In the actual deploy test, use the mep service discovery interface to find the URL of the service.',
    projectDetails: 'Basic Information',
    releaseDetails: 'Capability Release Details',
    releaseTest: 'Application Release Test',
    developer: 'Developer',
    dependentApp: 'Dependent Application',
    noDependent: 'No dependence',
    deploymentPlatform: 'Deployment Platform',
    uploadFile: 'Documentation',
    appStoreMd: 'Please upload the .md file to describe the application introduction, scene, etc.',
    apiFunctionMd: 'Please upload the .md file to describe the API function, usage, etc.',
    routeConfig: 'Route Configuration',
    protocol: 'Protocol',
    appDetails: 'App Package Details',
    appTest: 'Application Test',
    releaseText: 'Please click "application certification" to test before application release',
    instantiateId: 'Instantiate ID',
    applicationDesc: 'Application Description',
    ruleConfig: 'Application Rule Configuration',
    trafficRules: 'Traffic Rules',
    dnsRules: 'DNS Rules',
    appPublishConfig: 'Service Publishing Configuration',
    appPublishSuccess: 'The application has been published to AppStore, click the link to view details',
    appDetail: 'Application Details',
    deploymentStatus: 'Deployment Status',
    startDeployment: 'Start Deployment',
    completeTest: 'Complete Test',
    recycle: 'Release Resouces',
    completeMsg: 'After clicking to complete test button, the environmental resources will be released, otherwise the platform will automatically release the environmental resources after 24 hours',
    deploymentSuccess: 'Deployment Finish',
    createDeploymentFile: 'Create Deployment File',
    assignTestNodes: 'Assign Test Nodes',
    applicationRelease2: 'Application Release',
    distributeInfo: 'Upload App Package',
    instantiateApplication: 'Instantiate Application',
    getDeploymentStatus: 'Get Deployment Status',
    deploymentComplete: 'Deployment Complete',
    deploymentResult: 'Deployment Result',
    testMsg: 'Your application has already been integrated by EdgeGallery platform, you can test it now',
    PODStatus: 'Pod Status',
    PODName: 'Pod name',
    downloadLog: 'Download Log',
    operatingStatus: 'Operating Status',
    container: 'Container',
    containerName: 'Container Name',
    containerResource: 'Resource',
    hostInfo: 'Host Info',
    selectEnv: 'Select Testing Environment',
    deployDetail: 'Deploy Detail',
    sandboxEnv: 'SandBox Environment',
    sandboxEnvDesc: 'Real scences simulation, quick test',
    fiveGEnv: '5G Environment',
    fiveGEnvDesc: 'Because of the limit of 5G environment resources, application may fail',
    uploadConfigMessage: 'Please Upload Your Configure File',
    deployConfig: 'Deploy Field',
    clearEnv: 'Testing Environment Cleared',
    clearEnvFail: 'Testing Environment Cleared Failed',
    unUploaded: 'Empty',
    uploaded: 'Uploaded',
    privateHost: 'Private Host',
    publicHost: 'Public Host',
    capabilityInfo1: 'Please select the ecological services that your application needs to rely on. For details on ecological capabilities, please refer to Ability Center.',
    capabilityInfo2: 'If it is an integrated project, or your service does not need to depend on other services, you can skip this step and continue creating.',
    availableService: 'Available Services',
    selectedService: 'Selected Services',
    recycleTip: 'Note: Please release the resources in time after the test is completed to avoid resource occupation, otherwise the system will automatically release after 24 hours',
    noService: "You haven't selected any services",
    testNode: 'Test Node',
    podBelongsTo: 'Pod Name',
    cpuUsage: 'CPU Usage',
    memUsage: 'Memory Usage',
    diskUsage: 'Disk Usage',
    deployType: 'Workload Type',
    containerImage: 'Container',
    vmImage: 'VM',
    podEventsInfo: 'Pod Events Info',
    projectExist: 'An application with the same name, version, and provider already exists',
    refresh: 'Refresh'
  },
  test: {
    howToTest: {
      howToTest: 'How To Test',
      updated: 'Updated',
      modify: 'Modify',
      share: 'Share',
      apply: 'Test Now'
    },
    testApp: {
      uploadApp: 'Upload App',
      appFormat: 'Can only upload .csar files and no more than 10Mb.',
      uploadLogo: 'Upload Logo',
      logoFormat: 'Can only upload .jpg/.png files or select the default APP icon and no more than 2M',
      affinity: 'Affininty',
      type: 'Type',
      choosetype: 'Please Choose Type',
      description: 'Description',
      upload: 'Upload Now',
      cancel: 'Cancel'
    },
    testTask: {
      appName: 'Application Name',
      testStatus: 'Test Status',
      startTime: 'Submit Time',
      endTime: 'Test End Time',
      reset: 'Reset',
      inquire: 'Inquire',
      taskNumber: 'Task Number',
      applicationName: 'Application Name',
      version: 'Version',
      applicationTime: 'Application Time',
      operation: 'Operation',
      checkReport: 'Check Report',
      upload: 'Upload',
      report: {
        ticket: 'Mission Ticket Number',
        basicInfo: 'Basic Information',
        packageName: 'Package Name',
        status: 'Status',
        details: 'Details'
      }
    }
  },
  mecOpen: {
    mecOpen: 'MEC Open Source Ecology',
    info: 'We provide the open source contribution of documents and components and development plug-ins for developers on the Huawei MEC platform. Developers who are actively contributing will be able to enjoy the priority download and test rights of Huawei MEC Developer Platform. And will be awarded medals in the open source eco-contribution section, and developers are welcome to actively contribute your abilities. To help us improve the user experience and enhance our ecological environment.',
    contribution: 'Contribution List',
    code: 'Code contribution',
    lines: 'lines'
  },
  promptMessage: {
    prompt: 'Prompt',
    noPermission: 'You have no permission to enter the user management page!',
    uploadSuccess: 'Upload success!',
    uploadFailure: 'Upload failure!',
    uploadYamlFailure: 'The content of the file is wrong, please refer to the sample file!',
    nameEmpty: 'Name cannot be empty!',
    pluginNameEmpty: 'Plugin Name cannot be empty!',
    pluginFunEmpty: 'Plugin Language cannot be empty!',
    plugTypeEmpty: 'Plugin Type cannot be empty!',
    pluginFileEmpty: 'Plugin file cannot be empty!',
    logoEmpty: 'Logo cannot be empty!',
    apiEmpty: 'Api file cannot be empty!',
    versionEmpty: 'Version cannot be empty!',
    descriptionEmpty: 'Description cannot be empty!',
    moreThan500: 'Can only upload no more than 500KB!',
    moreThan2: 'Can only upload no more than 2MB!',
    moreThan10M: 'Can only upload no more than 10MB!',
    moreThan20M: 'Can only upload no more than 20MB!',
    moreThan500M: 'Can only upload no more than 500MB!',
    onlyOneFile: 'Only one file is allowed, please remove the file first!',
    fileNameType: 'The file name cannot contain spaces!',
    notPicture: 'Please upload pictures.',
    appEmpty: 'Application file cannot be empty!',
    affinityEmpty: 'Architecture cannot be empty!',
    typeEmpty: 'Type cannot be empty!',
    testSuccess: 'Start Test Success!',
    testFail: 'Start Test failed!',
    testComplete: 'You have completed the test, please click to view the report',
    addProjectSuccess: 'New project added successfully!',
    editProjectSuccess: 'Edit project successfully!',
    addProjectFail: 'Failed to add New project!',
    editProjectFail: 'Failed to edit project!',
    checkNamePass: 'Authentication Failure, please recheck the User Name or Password.',
    checkCaptcha: 'Invalid captcha, please recheck the Captcha.',
    registerSuccess: 'User is registered successfully!',
    resisterFail: 'Failed to register user, ',
    logoutPage: 'Are you sure to log out?',
    yesBtn: 'Yes',
    noBtn: 'No',
    loginexpired: 'Login expired, please login again！',
    imageNameErr: 'Image name cannot be empty',
    uploadApiFile: 'Please upload the Api file!',
    uploadYamlFile: 'Please upload the Yaml file!',
    uploadFileMsg: 'Please upload an APP image or Yaml file!',
    service: 'Please enter the full service content!',
    addImage: 'Please add the Image',
    selectService: 'Please select a server!',
    selectCommand: 'Compile command cannot be empty!',
    codeEmpty: 'Source code cannot be empty!',
    analysisCodeFail: 'Analysis task failed!',
    uploadCodeText: 'Please wait, uploading source code ...',
    analyzingText: 'Please wait, analyzing ...',
    loadingText: 'Loading, please wait ...',
    logoutFail: 'Logout failed, please try again!',
    contrastTime: 'The submission time cannot be earlier than the test end time!',
    imageVersionErr: 'Version cannot be empty',
    yamlFileType: 'Please select files with the suffix ".yaml, .json"',
    projectNameEmpty: 'Application Name cannot be empty',
    providerEmpty: 'Provider cannot be empty',
    architectureEmpty: 'Architecture cannot be empty',
    industryEmpty: 'Industry cannot be empty',
    getDataFail: 'Failed to get data!',
    isPublishFailed: 'Publish to EdgeGallery App Store failed!',
    isPublicFailed: 'Exposing API capabilities to EdgeGallery ecosystem failed!',
    canOnlyUpload: 'Can only upload .csar files',
    pluginNameRule: 'Please enter a plugin name of 1-30 characters, the beginning cannot be empty',
    nameRule: 'Please enter 4-32 characters without spaces, not all numbers, which can contain numbers, letters, Chinese character, _, -, and cannot start and end with _,-',
    nameRuleResourceConfig: 'Please enter 4-32 characters without spaces, not all numbers, which can contain numbers, letters, _, -, and cannot start and end with _,-',
    versionRule: 'Please enter the version number of 1-10 characters, can only contain numbers, letters, _,-and spaces, and cannot be empty at the beginning',
    providerRule: 'Please enter a provider name of 1-30 characters, the beginning cannot be empty',
    introductionRule: 'Please enter a description of 1-1024 characters, the beginning cannot be empty or all numbers',
    checkFileType: 'Please upload a file that matches the format',
    downloading: 'Downloading, please wait...',
    guestPrompt: 'The guest user has no right to operate, please log in first!',
    saveSuccess: 'Saved successfully!',
    saveFail: 'Save failed!',
    sampleCodeInfo: 'Cannot download sample code without selecting capability service',
    fileNotSupport: 'Compressed file, do not support online browsing',
    fileIsEmpty: 'File content is empty',
    addSuccess: 'Data added successfully',
    editSuccess: 'Edit data successfully',
    saveRuleSuccess: 'Save the rule successfully',
    editRuleSuccess: 'Edit rule successfully',
    saveRuleFail: 'Failed to save rule',
    editRuleFail: 'Edit rule failed',
    appReleaseSuccess: 'Application published successfully',
    appReleaseFail: 'Application publishing failed',
    deployTypeEmpty: 'Workload type can not be empty.',
    isPublished: 'The application has been published to the application warehouse',
    notDeploy: 'The application is not deployed, and the release operation cannot be performed',
    ipErrorInfo: 'Please enter the correct IP address',
    hostErrorInfo: 'Please enter the correct Host address',
    portErrorInfo: 'Port number range 30000-30400',
    systemCapaNameCn: 'Please enter a Chinese name with a length of 1-20, and the beginning cannot be empty',
    systemCapaNameEn: 'Please enter a English name with a length of 1-40, and the beginning cannot be empty',
    systemCapaDescCn: 'Please enter a Chinese description with a length of 1-200, and the beginning cannot be empty',
    systemCapaDescEn: 'Please enter a English description with a length of 1-400, and the beginning cannot be empty',
    systemServiceName: 'Please enter a service name with a length of 1-40',
    systemProviderName: 'Please enter a provider name with a length of 1-20',
    systemDocument: 'Please upload Chinese documentation',
    systemDocumentEn: 'Please upload English documentation',
    imageFileType: 'Please upload files in .rar, .tar, .zip format, and the size does not exceed 5G',
    imageInfoErr: 'The image does not exist, please go to "System-System Image Management" to upload the image',
    twoLevelName: 'Please enter the service name with a length of 1-40, the beginning cannot be empty',
    serviceDesc: 'Please enter service description with a length of 1-400, the beginning cannot be empty',
    typeError: 'Format error',
    typeConfig: 'Please upload config file'
  },
  breadCrumb: {
    mecDeveloper: 'Home',
    api: 'API',
    applicationApi: 'MECDeveloper Platform API',
    apiDetail: 'API Detail',
    docs: 'Docs',
    mecOpenSourceEcology: 'MEC Open Source Ecology',
    devTools: 'DevTools',
    detail: 'Detail',
    upload: 'Upload',
    test: 'Test',
    testApplication: 'Test Application',
    howToTest: 'How To Test',
    testReport: 'Test Report',
    testTask: 'Test Task',
    workspace: 'Workspace',
    system: 'System',
    systemProject: 'Project Management',
    systemMep: 'Ability Center Management',
    systemHost: 'Host Management',
    systemImgMgmt: 'System Image Management',
    profileMgmt: 'Profile Management'
  },
  system: {
    completeInfo: 'Please fill in the complete information',
    upload: 'Upload',
    error: 'Error',
    success: 'Success',
    name: 'Name',
    addHost: 'Add Host',
    pleaseInput: 'Please input ',
    pleaseUpload: 'Please upload ',
    address: 'Address',
    username: 'Username',
    password: 'Password',
    char: 'characters',
    correct: 'correct',
    useDetail: 'Log',
    deleteConfirm: 'Are you sure to delete?',
    userId: 'User ID',
    projectId: 'Project ID',
    deployTime: 'Deploy Time',
    deleteTime: 'Delete Time',
    addMep: 'Add Service',
    basicInfo: 'Basic Info',
    registerInfo: 'Register Info',
    capType: 'Type',
    oneLevelCapability: 'oneLevelCapability',
    twoLevelCapability: 'twoLevelCapability',
    isExistCapability: 'A service with the same name already exists',
    capTypeOPENMEP: 'OPENMEP',
    serviceName: 'Service Name',
    inPort: 'Port',
    version: 'Version',
    provider: 'Provider',
    apiFileId: 'API Document',
    fileExceed: 'Upload a maximum of one file',
    guideFileId: 'Guide',
    guideFileId_zh: 'Guide(chinese)',
    guideFileId_en: 'Guide(english)',
    zh_cn: 'please input chinese',
    en: 'please input english',
    portRange: 'Port Range',
    config_id: 'Config File',
    networkConfig: 'Network Config',
    log: {
      userName: 'Username',
      projectName: 'Project Name',
      appInstancesId: 'App Instances Id',
      deployTime: 'Deploy Time',
      status: 'Status',
      operation: 'Operation'
    },
    type: 'Type',
    lcmIp: 'lcmIP',
    mecHost: 'mecHost',

    profileMgmt: {
      addProfile: 'Add Profile',
      appList: 'App List',
      newProfile: ' Add Profile',
      modifyProfile: 'Modify',
      file: 'File',
      uploadFile: 'Upload File',
      contentTip: 'The file format is zip'
    },
    imageMgmt: {
      imgName: 'Image Name',
      imgPath: 'Image Path',
      imgType: 'Image Type',
      osName: 'Operate System',
      osVersion: 'Version',
      osBit: 'System Bit',
      sysDisk: 'Disk Size',
      userName: 'User',
      createTime: 'Create Time',
      uploadTime: 'Upload Time',
      imgFormat: 'Image Format',
      beginTime: 'Upload Time(Begin)',
      endTime: 'Upload Time(End)',
      slimming: 'Slimming',
      imageSize: 'Image Size',
      typeValue: {
        public: 'Public',
        private: 'Private',
        isPublic: 'Is it Public'
      },
      statusValue: {
        uploadWait: 'To be uploaded',
        uploading: 'Uploading',
        merging: 'Merging',
        uploadSucceeded: 'Upload succeeded',
        uploadFailed: 'Upload failed',
        uploadCancelled: 'Upload cancelled',
        published: 'Published'
      },
      uploadStatusText: {
        success: 'Merging file',
        error: 'Upload failed',
        uploading: 'Uploading',
        paused: 'Paused',
        waiting: 'Waiting'
      },
      slimStatusText: {
        slimWait: 'To be slim',
        slimming: 'Slimming',
        slimSucceed: 'Slim Succeed',
        slimFailed: 'Slim Failed'
      },
      operation: {
        newImg: 'New System Image',
        upload: 'Upload',
        selectImgFile: 'Select File',
        publish: 'Publish'
      },
      containerImage: {
        synchronize: 'Synchronize Image',
        syncing: 'Syncing...',
        pleaseWait: 'It takes a few minutes to synchronize the image, please wait patiently···',
        synchronized: 'Image synchronized',
        latestImage: 'Already the latest image',
        noImage: 'Harbor warehouse has no image',
        imageFailed: 'Image synchronization failed'
      },
      errorType: {
        formatMistake: 'The uploaded file format is incorrect.',
        zipFileOpenFailed: 'Failed to open the file. The file may not be a valid zip file. Please check.',
        fileSystemMergeFailed: 'The request for the file system to merge files returned a failure, possibly due to a processing timeout.',
        failedOnUploadToFS: 'Failed to upload to the file system service. Please check the file system service address configuration and confirm whether the file system service is normal.',
        unknown: 'Unknown error.'
      },
      tip: {
        newImg: 'New System Image',
        editImg: 'Edit System Image',
        viewImg: 'View System Image Detail',
        nameRules: '4-32 without Chinese and spaces',
        nameRule: 'Please enter 4-32 characters without Chinese characters and spaces. The beginning and the end cannot be _, -,.',
        versionEmpty: 'System version cannot be empty!',
        versionRule: 'Please enter a valid version of 1-20 characters!',
        systemDiskEmpty: 'System disk size cannot be empty!',
        systemDiskRule: 'Please enter an integer from 1-9999!',
        uploadImg: 'Upload System Image',
        uploadImgPromt: 'Please upload a file in qcow2 or iso format.',
        uploadContainerImgPromt: 'Upload the image package in tar format, rename the format image by parsing the tar package, and push it to the Harbor warehouse, Before uploading, check whether the name of the image in the tar package contains /. If it does, it may cause confusion in the image path and subsequent deployment failures',
        uploadImgPromtExample: 'Example:',
        sysImageFileType: 'Please upload a file that does not exceed 100G in size!',
        sysContainerImageFileType: 'Please upload files in .tar format, and the size does not exceed 5G!',
        onlyOneImageFile: 'You can only upload one file!',
        noFileSelected: 'No file selected',
        confirmDeleteImage: 'Are you sure to delete this system image?',
        confirmPublishImage: 'Are you sure to publish this system image?',
        confirmResetImage: 'Please reset the status carefully! Ensure that the image is accidentally interrupted during upload. Are you sure you want to reset the status of the image?',
        confirmReUploadImage: 'The system image has been uploaded, and the original image will be overwritten if it is uploaded again. Continue?',
        confirmUploadImageOnUploading: 'The system image is uploading. Please be careful! Ensure that the image needs to be uploaded again or continue because of an unexpected interruption in the upload process. If you select the file that was interrupted in the last upload, the upload will continue from the interruption point. Continue?',
        confirmUploadImageOnUploadFailed: 'The system image is in upload failed status. If the upload process is interrupted unexpectedly, and you select the file interrupted last time again, the upload will continue from the interruption point. Continue?',
        confirmDownloadImage: 'The system image is large, it will takes a long time to download. Do you want to continue downloading the image?',
        systemNameExist: 'A system image with the same name and version already exists under this user name!',
        newImgFailed: 'New system image failed!',
        modifyImgFailed: 'Modify system image failed!',
        deleteImgFailed: 'Delete system image failed!',
        publishImgFailed: 'Publish system image failed!',
        resetImgStatusFailed: 'Reset system image status failed!',
        queryImgFailed: 'Query system image failed!',
        uploadingHint: 'The system image is uploading, please wait!',
        uploadImgSucceed: 'The system image upload succeed!',
        uploadImgFailed: 'Upload system image failed!',
        invalidUploadFile: 'The uploaded file does not meet the requirements!',
        mergingHintForCancel: 'The system image is merging, the upload operation cannot be cancelled!',
        confirmCancelUpload: 'Are you sure to cancel the upload operation?',
        cancelUploadFailed: 'Cancel upload operation failed!',
        cancelingHint: 'Canceling, please wait...',
        mecHostExist: 'The same mecHost already exists',
        textWrap: ' Can contain Chinese and English, spaces, /, no spaces at the beginning and end'
      }
    }
  },
  ...enLocale
}
export default en


<|start_filename|>edgegallery-fe/src/locales/sandbox_cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const sandboxCn = {
  sandbox: {
    selectSandbox: '选择沙箱',
    sandboxDetail: '沙箱详情',
    edgeApplication: '边缘应用',
    terminal: '5G终端',
    baseStation: '5G基站',
    upf: '边缘UPF',
    coreNetwork: '5G核心网',
    configureNetwork: '配置网络',
    releaseResources: '释放资源',
    createImage: '生成镜像',
    vm: '虚拟机',
    vmDetail: '虚拟机详情',
    vmName: '虚拟机名称',
    network: '网络',
    image: '镜像',
    flavor: '规格',
    instanceStatus: '实例状态',
    instanceInformation: '实例信息',
    errMsg: '错误信息',
    imageName: '镜像名称',
    downloadUrl: '下载地址',
    stageStatus: '阶段状态',
    uploadAppPackage: '上传应用代码包',
    uploadAppPackagePromt: '注：文件默认上传到虚拟机的根目录下',
    selectFile: '选择包文件',
    selectNetworkType: '配置网络类型',
    addCustomNetwork: '添加自定义网络',
    addDescribe: '添加描述',
    vmInformation: '虚拟机信息',
    enterVmName: '请输入虚拟机名称',
    selectVmflavor: '选择虚拟机规格',
    useCase: '使用场景',
    memory: '内存',
    systemDisk: '系统盘',
    dataDisk: '数据盘',
    otherCapability: '其他能力',
    configureNetworkPorts: '配置网络端口',
    selectImage: '选择镜像',
    imageType: {
      publicImage: '公有镜像',
      privateImage: '私有镜像'
    },
    flavorExtraSpecs: '主机组配置',
    enterFlavorExtraSpecs: '填写主机组配置',
    script: '脚本',
    useScript: '是否使用注入脚本',
    enterScriptContent: '填写脚本内容',
    type: '类型',
    customSpec: '自定义规格',
    typeTip: '请选择类型',
    hugePage: '大页内存',
    gpuType: 'GPU类型',
    gpuNum: '数量',
    hostGroup: '主机组标签',
    cpuPolicy: '绑核策略',
    cpuThread: 'CPU线程隔离策略',
    numaNode: 'NUMA区域',
    hugePageTip: '请选择大页内存',
    gpuTypeTip: '请选择GPU类型',
    gpuNumTip: '请先选择GPU类型',
    hostGroupTip: '请输入主机组标签',
    isImageEmpty: '请选择镜像',
    isNetworkEmpty: '请配置网络端口',
    addCustomSpec: '没有匹配的数据，点击添加'
  },
  rulesConfig: {
    appRuleConfig: '应用规则配置',
    filterRules: '流过滤规则',
    addFlowFilter: '添加流量过滤器',
    srcAddress: '源IP地址',
    srcPort: '源端口号',
    dstAddress: '目的IP地址',
    dstPort: '目的端口号',
    tgtTunnelAddress: '隧道目的地址',
    dstTunnelPort: '隧道目的端口',
    interfaceInfo: '接口信息',
    forwardInterfaceTabTitle: '转发接口信息',
    addInterfaceInfo: '添加接口信息',
    interfaceType: '接口类型',
    tunnelType: '隧道类型',
    srcTunnelAddress: '隧道源地址',
    tunnelParams: '隧道指定参数',
    macAddress: '目的MAC地址',
    sourceMacAddress: '源MAC地址',
    dstIpAddress: '目的地址',
    flowFilter: '流量过滤器',
    multipleIP: '多个IP请用\',\'分隔',
    multiplePort: '多个端口请用\',\'分隔',
    tag: '标签',
    protocol: '协议类型',
    srcTunnelPort: '隧道源端口',
    tunnelInfo: '隧道信息',
    macInfo: 'MAC信息',
    IpInfo: 'IP信息',
    ipAddress: 'IP地址',
    trafficRuleIdisEmpty: '流规则标识不能为空！',
    dnsRuleIdisEmpty: 'DNS规则标识不能为空！',
    trafficRuleIdisExists: '流规则标识已存在！',
    dnsRuleIdisExists: 'DNS规则标识已存在！'
  },
  container: {
    script: '脚本',
    import: '导入',
    container: '容器',
    containerDetail: '容器详情',
    containerScript: '容器脚本',
    uploadFile: '上传文件',
    downloadDemo: '模版下载',
    configFile: '配置文件',
    configFileText: '支持浏览和编辑两个模式切换',
    format: '参数校验',
    imageInfo: '镜像信息',
    serviceInfo: '服务信息',
    mepAgentTip: '如果没有集成mepagent，将无法发布API',
    cpuUsage: 'CPU使用率',
    memUsage: '内存使用率',
    diskUsage: '硬盘使用率',
    appName: '应用名称',
    appClass: '负载类型',
    createTime: '创建时间',
    dependent: '依赖应用',
    deploymentStatus: '部署状态',
    podInformation: 'pod信息',
    podName: 'pod名称',
    podStatus: 'pod状态',
    containerName: '容器名称',
    deployLog: '部署日志'
  },
  sandboxPromptInfomation: {
    imageFileType: '请上传.rar，.tar，.zip格式的文件，且大小不超过5G！',
    addVmSuccess: '虚拟机添加成功！',
    completeContent: '请完善内容，再次点击提交！',
    releaseEnvFailed: '释放环境失败！',
    imageInfoErr: '镜像不存在，请前往“系统镜像管理”上传镜像！',
    containerScriptUploadTip: '请上传.yaml或.tgz格式的文件！',
    cleanEnvSuccess: '释放资源成功！',
    cleanEnvFailed: '释放资源失败！',
    noServiceInfo: '服务信息有误，请检查文件！',
    noImageInfo: '没有镜像信息，请检查文件！',
    noFormat: '参数校验有误，请检查文件！',
    imageInfoError: '镜像信息有误，请检查文件！',
    notInHarbor: '镜像不存在harbor仓库中，请先去上传！',
    addCustomSuccess: '自定义规格添加成功！',
    deleteInternetSuccess: '删除网络配置成功！',
    addInternetFaild: '网络配置数据最多为4条！',
    internetNameRepeat: '网络配置名重复！',
    startFailed: '启动失败',
    exportFailed: '导出失败',
    addInternetTip: '网络类型名称不能为空！'
  }
}
export default sandboxCn


<|start_filename|>edgegallery-fe/src/locales/images_cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const imagesCn = {
  appPackage: {
    appdTitle: '应用配置预览',
    basicInfo: '基本信息',
    appName: '应用名称 :',
    provider: '提供者 :',
    industry: '行业 :',
    type: '类型 :',
    architecture: '架构 :',
    dependent: '依赖应用 :',
    createTime: '创建时间 :',
    description: '描述',
    baseDesc: '描述 :',
    fileName: '应用详情 :',
    resourceConfig: '资源配置',
    vmName: '虚拟机名称',
    spec: '规格',
    network: '连接网络',
    basicImage: '基础镜像',
    vmImage: '虚机镜像',
    exportImage: '导出镜像',
    rule: '分流规则',
    trafficRule: '流量规则',
    addTrafficRule: '添加流量规则',
    trafficRuleId: '流规则标识',
    dnsRuleId: 'DNS规则标识',
    domainName: 'FQDN域名',
    ipAddressType: 'IP地址类型',
    ttl: 'TTL',
    filterType: '过滤类型',
    priority: '优先级',
    action: '规则动作',
    dnsRule: 'DNS规则',
    addDnsRule: '添加DNS规则',
    serviceName: '服务名称',
    port: '内部端口号',
    version: '版本',
    baseVersion: '版本 :',
    protocol: '协议',
    dnaRule: 'DNA规则',
    capabalityConfig: '能力配置',
    capabalityDepend: '能力依赖',
    capabalityRelease: '能力发布',
    appdPreview: '打包预览',
    build: '打包',
    packFinished: '打包完成',
    packFinishedTip: '认证前系统会默认释放虚拟机资源，释放后将不可再返回修改。',
    packBack: '返回',
    packAuthentication: '认证',
    appdDetail: '应用包详情',
    packageSuc: '打包成功',
    packageFail: '打包失败',
    packageFinish: '打包完成',
    subText: '认证前系统会默认释放资源,释放后再不可再返回修改',
    notSupport: '格式不支持修改',
    noDependences: '无依赖'
  }
}
export default imagesCn


<|start_filename|>src/main.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import Vue from 'vue'
import App from './App.vue'
import router from './router/router.js'
import store from './store/store.js'
import ElementUI from 'element-ui'
import locale from 'element-ui/lib/locale/lang/en'
import i18n from './locales/i18n.js'
import VueCookies from 'vue-cookies'
import uploader from 'vue-simple-uploader'
import 'eg-view/src/assets/style/element-variables.scss'
import 'eg-view/src/assets/style/normal.css'
import VCharts from 'v-charts'
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
import 'swiper/css/swiper.css'
import VueAwesomeSwiper from 'vue-awesome-swiper'
import '../src/assets/css/common.css'
import EgMessageBox from './components/common/MessageBox'

Vue.use(EgMessageBox)
Vue.use(VueAwesomeSwiper)
Vue.use(VCharts)
Vue.use(ElementUI, { locale })
Vue.use(mavonEditor)
Vue.use(VueCookies)
Vue.use(uploader)

Vue.config.productionTip = false

new Vue({
  router,
  store,
  i18n,
  render: h => h(App)
}).$mount('#app')

router.afterEach((to, from, next) => {
  window.scrollTo(0, 0)
})


<|start_filename|>edgegallery-fe/src/locales/atp_en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const atpEn = {
  report: {
    result: 'Result',
    provider: 'Provider',
    testReport: 'EdgeGallery test certification report',
    downloadReport: 'Download Report',
    reportanalysis: 'Test report analysis',
    version: 'Version',
    packageName: 'Package Name',
    startTime: 'Starting Time',
    endTime: 'End Time',
    status: 'Status',
    detail: 'Details',
    ticketNumber: 'Mission ticket number',
    baseInfo: 'Basic Information',
    uploadUser: 'Upload User',
    failReason: 'Fail Reason',
    rate: 'Pass rate',
    model: 'Certification template',
    reportDetail: 'Test case details',
    number: 'Number',
    caseDistribution: 'Scenario use case distribution',
    successfulRate: 'Test case success rate'
  },
  testCase: {
    upload: 'Upload',
    noCase: 'There is no use case for this scenario',
    caseDetail: 'Testcase Detail',
    viewCase: 'View',
    selectScenes: 'Select',
    startTest: 'Start Test',
    contributionCase: 'Contribution Case',
    createTime: 'createTime',
    management: 'Testcase Management',
    caseName: 'Testcase Name',
    caseType: 'Type',
    casePurpose: 'Purpose',
    step: 'Test Steps',
    type: 'Type',
    expectedResult: 'Result',
    language: 'Language',
    verificationModel: 'Testcase Model',
    operation: 'Operation',
    delete: 'Delete',
    edit: 'Modify',
    add: 'Add',
    model: 'Model',
    standard: 'Community Standards',
    addCase: 'Add Case',
    editCase: 'Edit Case',
    import: 'Case Import',
    sample: 'Sample Download',
    description: 'Description',
    testSuiteList: 'Test Suite',
    nameCn: 'Chinese Name',
    nameEn: 'English Name',
    descriptionCn: 'Chinese Description',
    descriptionEn: 'English Description',
    expecteCn: 'Chinese Expected',
    expecteEn: 'English Expected',
    stepCn: 'Chinese Steps',
    stepEn: 'English Steps',
    applicationTestPlatform: 'Application Test Platform',
    testSuiteManagement: 'Test Suite Management',
    testSuiteCn: 'Test Suite Chinese Name',
    testSuiteEn: 'Test Suite English Name',
    testSuiteDescriptionCn: 'Test Suite Chinese Description',
    testSuiteDescriptionEn: 'Test Suite English Description',
    testScenarioManagement: 'Test Scenarios Management',
    testScenarioCn: 'Test Scenario Chinese Name',
    testScenarioEn: 'Test Scenario English Name',
    testScenarioDescriptionCn: 'Test Scenario Chinese Description',
    testScenarioDescriptionEn: 'Test Scenario English Description',
    testScenarioIcon: 'Test Scenario Icon',
    testScenarioLabel: 'Test Scenario Label',
    selectTestScenario: 'Select Label',
    addTestSuite: 'Add Test Suite',
    editTestSuite: 'Modify Test Suite',
    addTestScenario: 'Add Test Scenario',
    editTestScenario: 'Modify Test Scenario',
    provideNameCn: 'Please provide Chinese name',
    provideDescriptionCn: 'Please provide Chinese description',
    provideTestScenario: 'Please select Test Scenarios',
    provideTestSuite: 'Please select Test Suites',
    provideTestType: 'Please select Test Type',
    provideNameSearch: 'Please enter a name to search',
    pleaseInput: 'Please Input',
    download: 'Download'

  },
  atpTestProcess: {
    publishSuc: 'Publish Successful',
    publishFail: 'publish Failed',
    viewReport: 'View Report',
    publish: 'Publish',
    testAgain: 'Test Again',
    selectScene: 'Select Scenario',
    contribution: 'Testcase Contribution',
    seeDetail: 'Detail',
    selectTestScene: 'Select Scene',
    caseDetail: 'Testcase Detail',
    name: 'Name',
    status: 'Status',
    type: 'Type',
    description: 'Description',
    score: 'Score',
    result: 'Result',
    find: '',
    issue: 'Issues were found in all scenarios',
    hover: 'Successful / Total',
    clickContribution: 'Click to contribute use case',
    choose: 'Please choose',
    failReason: 'Reasons for failure',
    clickDownloadCase: 'Click to Download the Case',
    contentTip: 'The use case script is packaged into a zip package format and uploaded',
    uploadReport: 'Upload self-test report',
    platformReport: 'Platform test report',
    applicationReport: 'Application self-test report',
    pageNum: 'Page Number',
    waitManual: 'Wait for the manual case to complete',
    selftestUpload: 'Self-test report upload',
    haveReport: 'If you have a self-test report, you can upload the report here',
    pdfFormat: '(The report file must be in pdf format)',
    later: 'Tell you later',
    uploadNow: 'Upload Now'
  }
}
export default atpEn


<|start_filename|>edgegallery-fe/src/api/appstoreApi.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  GET,
  POST
} from '../tools/request.js'
import {
  PROXY_PREFIX_CURRENTSERVER
} from '../tools/constant.js'

const URL_PREFIX_APPSTORE = PROXY_PREFIX_CURRENTSERVER + '/mec-appstore/mec/appstore/v1/'
const URL_PREFIX_APPSTORE_V2 = PROXY_PREFIX_CURRENTSERVER + '/mec-appstore/mec/appstore/v2/'

let appstoreApi = {
  getAppData: function (params) {
    let url = URL_PREFIX_APPSTORE_V2 + 'apps/action/query'
    return POST(url, params)
  },
  getAppPromTable: function (limit, offset, appName, sortType, sortItem) {
    let url = URL_PREFIX_APPSTORE_V2 + 'packages/pushable?limit=' + limit + '&offset=' + offset + '&appName=' + appName + '&sortType=' + sortType + '&sortItem=' + sortItem
    return GET(url, '')
  },
  promProviderInfo: function (curPageSize, offset, appStoreName) {
    let url = URL_PREFIX_APPSTORE_V2 + 'appstores?limit=' + curPageSize + '&offset=' + offset + '&appStoreName=' + appStoreName
    return GET(url, '')
  },
  promTask: function (packageId, param) {
    let url = URL_PREFIX_APPSTORE + 'packages/' + packageId + '/action/push'
    return POST(url, param)
  },
  getComments: function (appId, limit, offset) {
    let url = URL_PREFIX_APPSTORE_V2 + 'apps/' + appId + '/comments?limit=' + limit + '&offset=' + offset
    return GET(url)
  },
  submitAppComment: function (appId, params, userId, userName) {
    let url = URL_PREFIX_APPSTORE + 'apps/' + appId + '/comments?userId=' + userId + '&userName=' + userName
    return POST(url, params)
  },
  getNodePort: function (appId, packageId, userId, name, ip) {
    let url = URL_PREFIX_APPSTORE + 'experience/deploy?appId=' + appId + '&packageId=' + packageId + '&userId=' + userId + '&name=' + name + '&ip=' + ip
    return GET(url)
  },
  getExperienceStatus: function (packageId) {
    let url = 'experience/packages/' + packageId + '/status'
    return GET(url)
  },
  getThirdSystemByType: function (type) {
    let url = URL_PREFIX_APPSTORE + 'thirdsystem/systemType/' + type
    return GET(url, '')
  },
  getProgressByPackageId: function (packageId) {
    let url = URL_PREFIX_APPSTORE + 'upload_progress/package/' + packageId
    return GET(url, '')
  },
  synchronizedPakage: function (currentData, meaoId) {
    let url = URL_PREFIX_APPSTORE + 'apps/' + currentData.appId + '/packages/' + currentData.packageId + '/meao/' + meaoId + '/action/sync'
    return GET(url)
  },
  cleanTestEnv: function (packageId, userId, name, ip) {
    let url = URL_PREFIX_APPSTORE + 'experience/clean?packageId=' + packageId + '&userId=' + userId + '&name=' + name + '&ip=' + ip
    return POST(url)
  },
  getNodeStatus: function (packageId, userId, name, ip) {
    let url = URL_PREFIX_APPSTORE + 'experience/container/workStatus?packageId=' + packageId + '&userId=' + userId + '&name=' + name + '&ip=' + ip
    return GET(url)
  },
  getAppDetailTable: function (appId, userId, limit, offset) {
    let url = ''
    if (userId == null) {
      url = URL_PREFIX_APPSTORE_V2 + 'apps/' + appId + '/packages?limit=' + limit + '&offset=' + offset
    } else {
      url = URL_PREFIX_APPSTORE_V2 + 'apps/' + appId + '/packages?userId=' + userId + '&limit=' + limit + '&offset=' + offset
    }
    return GET(url)
  },
  getAppList: function (appId) {
    let url = URL_PREFIX_APPSTORE + 'apps/' + appId
    return GET(url)
  },
  getPackageDetail: function (appId, packageId) {
    let url = URL_PREFIX_APPSTORE + 'apps/' + appId + '/packages/' + packageId
    return GET(url)
  },
  getMechosts: function () {
    return GET(URL_PREFIX_APPSTORE + 'mechosts')
  },
  createOrder: function (param) {
    return POST(URL_PREFIX_APPSTORE + 'orders', param)
  },
  downloadAppPakageApi: function (appId, row, isDownloadImage) {
    let URL = URL_PREFIX_APPSTORE + 'apps/' + appId + '/packages/' + row.packageId + '/action/download?isDownloadImage=' + isDownloadImage
    window.open(URL)
  }
}
export {
  URL_PREFIX_APPSTORE, URL_PREFIX_APPSTORE_V2, appstoreApi
}


<|start_filename|>edgegallery-fe/src/locales/mecm_en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const mecmEn = {
  deployCommon: {
    name: 'Name',
    version: 'Version',
    provider: 'Provider',
    affinity: 'Architecture',
    operation: 'Operation',
    tip: 'Enter the name',
    cancel: 'cancel',
    confirm: 'confirm'
  },
  deployList: {
    deployListTitle: 'AppDeploy',
    tip: 'Enter the content',
    type: 'Type',
    industry: 'Industry',
    appstoreName: 'App Store Name',
    createTime: 'Sync Time',
    operationBtn: 'Distribution'
  },
  distributeDeploy: {
    title: 'Instantiate',
    hostIp: 'Host IP',
    status: 'Status',
    delete: 'Delete',
    distribute: 'Distribute',
    deploy: 'Deploy',
    distributeDeploySuccess: 'Distribute & Deploy Success',
    beforeDeleteFromMechost: 'Are you sure to delete this package from the MEC host?',
    deletePacFrmoHost: 'You have deleted the package from the host successfully!',
    tip: 'Enter the name, IP or status',
    multipleDeploy: 'Batch Deployment',
    onePackageAtLeast: 'Please select one piece pf data at least',
    deleteError: 'Please delete the error status applications'
  },
  distribute: {
    title: 'distribute',
    ip: 'IP',
    city: 'City',
    MEPM: 'App LCM IP',
    hwCapability: 'Capabilities',
    selectMecHost: 'Please choose the host.',
    selectVersion: 'Please choose the package version first.',
    failedToDistribute: 'Failed to distribute.'
  },
  deployConfig: {
    title: 'Deployment Configuration',
    IPAddress: 'IP Address: ',
    status: 'Status: ',
    appName: 'App Name',
    appDesc: 'App Description',
    placeholderName: 'Name',
    placeholderDesc: 'Description',
    hardwareAbilities: 'Hardware Abilities',
    appNameVerifyRequired: 'Please input the APP name',
    appNameVerifyValid: '4 to 16 digits (letters, numbers)',
    appDescVerifyRequired: 'Please input the description.',
    deployFailed: 'Deploy failed!',
    getTemplateListFail: 'Failed to get parameters'
  }
}
export default mecmEn


<|start_filename|>edgegallery-fe/src/locales/thirdsystem_cn.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
const thirdsystemCn = {
  thirdSystem: {
    threeSystem: '三方系统管理',
    search: '请输入名称进行搜索',
    allNum: '总数',
    active: '激活',
    invalid: '失效',
    systemName: '系统名称',
    url: 'URL',
    region: '部署区域',
    product: '产品',
    vendor: '厂商',
    version: '版本',
    status: '状态',
    username: '用户名',
    password: '密码',
    systemDetail: '系统详情',
    icon: '图标',
    deleteSucess: '删除成功',
    tootipSystemName: '请输入系统名称',
    tootipProduct: '请输入产品名称',
    tootipUrl: '请输入URL',
    tootipVersion: '请输入版本信息',
    tooltipRegion: '请输入部署区域',
    tooltipVendor: '请输入厂商名称',
    tooltipUsername: '请输入用户名',
    tooltipPassword: '<PASSWORD>',
    addSystemSucess: '新建系统成功！',
    updateStstemSucess: '更新成功！',
    deleteSystemSucess: '删除数据成功！',
    or: '或',
    uploadRequire: '只能上传一张jpg/png文件',
    deleteTip: '请您确定是否删除？',
    tip: '提示',
    deleteCancel: '已取消删除'
  },
  about: {},
  ...zhLocale
}
export default thirdsystemCn


<|start_filename|>edgegallery-fe/src/locales/thirdsystem_en.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import enLocale from 'element-ui/lib/locale/lang/en'
const thirdsystemEn = {
  thirdSystem: {
    threeSystem: 'Third party system management',
    search: 'Please enter name to search',
    allNum: 'allNum',
    active: 'active',
    invalid: 'invalid',
    systemName: 'Name',
    url: 'Url',
    region: 'Region',
    product: 'Product',
    vendor: 'Factory',
    version: 'Verison',
    status: 'State',
    username: 'User',
    password: 'Password',
    systemDetail: 'System details',
    icon: 'Icon',
    deleteSucess: 'delete sucess',
    tootipSystemName: 'Please enter the system name',
    tootipProduct: 'Please enter the product name',
    tootipUrl: 'Please enter URL',
    tootipVersion: 'Please enter version information',
    tooltipRegion: 'Please enter deployment area',
    tooltipVendor: 'Please enter the vendor ',
    tooltipUsername: 'Please enter the username',
    tooltipPassword: '<PASSWORD> the password',
    addSystemSucess: 'New message succeeded!',
    updateStstemSucess: 'Update succeeded!',
    deleteSystemSucess: 'Delete succeeded!',
    or: 'or',
    uploadRequire: 'Only one JPG / PNG file can be uploaded',
    deleteTip: 'Are you sure you want to delete?',
    tip: 'Tips',
    deleteCancel: 'Deletion cancelled'
  },
  about: {
  },
  ...enLocale
}
export default thirdsystemEn


<|start_filename|>edgegallery-fe/src/locales/cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
import cnHome from './home_cn.js'
import cnApp from './app_cn.js'
import cnAppStore from './appstore_cn.js'
import cnCapability from './capability_cn.js'
import cnSandbox from './sandbox_cn.js'
import cnThirdsystem from './thirdsystem_cn.js'
import cnImages from './images_cn.js'
import cnAtp from './atp_cn.js'
import cnMecm from './mecm_cn.js'
const cn = {
  common: {
    classic: '经典版',
    operation: '操作',
    edit: '编辑',
    delete: '删除',
    cancel: '取消',
    confirm: '确认',
    finish: '完成',
    save: '保存',
    close: '关闭',
    detail: '详情',
    select: '选择',
    add: '添加',
    login: '请登录后查看',
    upload: '上传',
    start: '启动',
    name: '名称',
    describe: '描述',
    userName: '用户名',
    enterUserName: '请输入用户名',
    password: '密码',
    enterPassword: '<PASSWORD>',
    pleaseSelect: '请选择',
    back: '返回',
    noData: '暂无数据'
  },
  promptInformation: {
    confirmDelete: '确认删除该数据？',
    deleteFailed: '删除数据失败！',
    editDataSuccess: '编辑数据成功！',
    editDataFailed: '编辑数据失败！',
    noPermission: 'Guest没有权限操作，请登录后重试',
    fileIsEmpty: '文件内容为空！',
    addFailed: '添加数据失败！'
  },
  normal: {
    newVersion: '新版',
    cancel: '取消',
    confirm: '确认'
  },
  nav: {
    logIn: '登录',
    userAccountCenter: '我的帐号',
    logOut: '注销',
    refresh: '刷新',
    reLogin: '重新登录',
    hsInvalidHintForTimeout: '您长时间未操作，',
    hsInvalidHintForLogout: '您通过其它页面执行了登录或注销操作，',
    hsInvalidHintForServerStopped: '后台服务升级，',
    hsInvalidHint: '当前会话已失效。请选择刷新页面或重新登录。'
  },
  homePromptMessage: {
    prompt: '提示',
    logoutPage: '确认要注销当前用户？'
  },
  ...zhLocale,
  ...cnHome,
  ...cnApp,
  ...cnAppStore,
  ...cnCapability,
  ...cnSandbox,
  ...cnImages,
  ...cnAtp,
  ...cnMecm,
  ...cnThirdsystem
}
export default cn


<|start_filename|>edgegallery-fe/src/api/mecmApi.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  GET,
  POST,
  DELETE
} from '../tools/request.js'
import {
  PROXY_PREFIX_CURRENTSERVER
} from '../tools/constant.js'

const URL_PREFIX_MECM_APM = PROXY_PREFIX_CURRENTSERVER + '/mecm-apm/apm/v1'
const URL_PREFIX_MECM_APPO = PROXY_PREFIX_CURRENTSERVER + '/mecm-appo/appo/v1'
const URL_PREFIX_MECM_INVENTORY = PROXY_PREFIX_CURRENTSERVER + '/mecm-inventory/inventory/v1'

let appo = {
  toDeploy (userId, params) {
    return POST(URL_PREFIX_MECM_APPO + '/tenants/' + userId + '/app_instances', params)
  },
  toBatchDeploy (userId, params) {
    return POST(URL_PREFIX_MECM_APPO + '/tenants/' + userId + '/app_instances/batch_create', params)
  },
  getInstanceInfo (userId, instanceId) {
    return GET(URL_PREFIX_MECM_APPO + '/tenants/' + userId + '/app_instance_infos/' + instanceId)
  },
  instantiateApp (userId, instanceId, params) {
    return POST(URL_PREFIX_MECM_APPO + '/tenants/' + userId + '/app_instances/' + instanceId, params)
  },
  batchInstantiateApp (userId, params) {
    return POST(URL_PREFIX_MECM_APPO + '/tenants/' + userId + '/app_instances/batch_instantiate', params)
  }
}

let apm = {
  getDistributeDeployList: function (userId) {
    return GET(URL_PREFIX_MECM_APM + '/tenants/' + userId + '/packages')
  },
  deleteDistributionApp (type, hostIp, packageId, userId) {
    let url = URL_PREFIX_MECM_APM + '/tenants/' + userId + '/packages/' + packageId + '/hosts/' + hostIp
    if (type === 2) {
      url = URL_PREFIX_MECM_APM + '/tenants/' + userId + '/packages/' + packageId
    }
    return DELETE(url)
  },
  initApmPackages () {
    return GET(URL_PREFIX_MECM_APM + '/apps/syncstatus')
  },
  distributeApp (params, userId) {
    return POST(URL_PREFIX_MECM_APM + '/tenants/' + userId + '/packages', params)
  },
  getAppTemplateApi (userId, packageId) {
    return GET(URL_PREFIX_MECM_APM + '/tenants/' + userId + '/packages/' + packageId + '/apptemplate')
  }
}

let inventory = {
  getEdgeNodeList (userId) {
    return GET(URL_PREFIX_MECM_INVENTORY + '/tenants/' + userId + '/mechosts')
  }
}

export {
  appo,
  apm,
  inventory
}


<|start_filename|>edgegallery-fe/public/js/webssh.js<|end_filename|>
function WSSHClient () {
};

WSSHClient.prototype._generateEndpoint = function () {
  let _currUrl = window.location.host
  let _protocol = ''
  let _VncUrl = ''
  if (window.location.protocol === 'https:') {
    _protocol = 'wss://'
  } else {
    _protocol = 'ws://'
  }
  if (_currUrl.indexOf('30095') !== -1) {
    _VncUrl = _currUrl.replace('30095', '30098')
  } else if (_currUrl.indexOf('8080') !== -1) {
    _VncUrl = _currUrl.replace('8080', '9082')
  } else {
    _VncUrl = _currUrl + ':30098'
  }
  var endpoint = _protocol + _VncUrl + '/webssh'
  return endpoint
}

WSSHClient.prototype.connect = function (options) {
  var endpoint = this._generateEndpoint()

  if (window.WebSocket) {
    // If it supportswebsocket
    this._connection = new WebSocket(endpoint)
  } else {
    // Otherwise report an error
    options.onError('WebSocket Not Supported')
    return
  }

  this._connection.onopen = function () {
    options.onConnect()
  }

  this._connection.onmessage = function (evt) {
    var data = evt.data.toString()
    // data = base64.decode(data);
    options.onData(data)
  }

  this._connection.onclose = function (evt) {
    options.onClose()
  }
}

WSSHClient.prototype.send = function (data) {
  this._connection.send(JSON.stringify(data))
}

WSSHClient.prototype.sendInitData = function (options) {
  // Connection parameters
  this._connection.send(JSON.stringify(options))
}

WSSHClient.prototype.sendClientData = function (data) {
  // Send instructions
  this._connection.send(JSON.stringify({ 'operate': 'command', 'command': data }))
}

var client = new WSSHClient()


<|start_filename|>edgegallery-fe/src/constants.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const NAV_PRE = {
  DEVELOPER: '/developer',
  APPSTORE: '/appStore/home',
  MECM: '/mecm',
  ATP: '/atp',
  SYSTEM: '/system'
}

const FIRST_LEVEL_MENU_PATH = {
  HOME: '/index',
  DEVELOPER: '/EG/developer/home',
  APPSTORE: '/appStore/home',
  MECM: '/mecm',
  ATP: '/atp',
  SYSTEM: '/system'
}

const MODULES = {
  DEVELOPER: {
    name: 'developer',
    port: '30092'
  },
  APPSTORE: {
    name: 'appStore',
    port: '30091'
  },
  MECM: {
    name: 'mecm',
    port: '30093'
  },
  ATP: {
    name: 'atp',
    port: '30094'
  }
}
const systemName = [
  {
    labelcn: '大数据系统',
    labelen: 'Big data system'
  },
  {
    labelcn: '公有云',
    labelen: 'Public Cloud'
  },
  {
    labelcn: '3dr 边缘系统',
    labelen: '3dr Limbic system'
  },
  {
    labelcn: '应用',
    labelen: 'Application'
  },
  {
    labelcn: '5G 网元',
    labelen: '5G Network element'
  },
  {
    labelcn: 'laaS',
    labelen: 'laaS'
  },
  {
    labelcn: 'Meao',
    labelen: 'Meao'
  }
]

const HEALTH_URL = '/health'

export {
  NAV_PRE,
  FIRST_LEVEL_MENU_PATH,
  MODULES,
  HEALTH_URL,
  systemName
}


<|start_filename|>edgegallery-fe/src/pages/appstore/tools/constant.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const INDUSTRY = [
  {
    labelcn: '智慧城市',
    labelen: 'Smart City',
    value: 'Smart City',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '智慧园区',
    labelen: 'Smart Park',
    value: 'Smart Park',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '智慧农业',
    labelen: 'Smart Agriculture',
    value: 'Smart Agriculture',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '工业互联网',
    labelen: 'Industrial Internet',
    value: 'Industrial Internet',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '交通物流',
    labelen: 'Transportation Logistics',
    value: 'Transportation Logistics',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '能源',
    labelen: 'Energy',
    value: 'Energy',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '金融',
    labelen: 'Finance',
    value: 'Finance',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '教育',
    labelen: 'Education',
    value: 'Education',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '文化旅游',
    labelen: 'Cultural Tourism',
    value: 'Cultural Tourism',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '医疗健康',
    labelen: 'Medical Health',
    value: 'Medical Health',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '数字政府',
    labelen: 'Digital Government',
    value: 'Digital Government',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '生态环境',
    labelen: 'Ecosystem',
    value: 'Ecosystem',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '游戏竞技',
    labelen: 'Game Competition',
    value: 'Game Competition',
    selected: false,
    type: 'industry'
  },
  {
    labelcn: '其他',
    labelen: 'Others',
    value: 'Others',
    selected: false,
    type: 'industry'
  }
]

const TYPES = [
  {
    labelcn: '视频应用',
    labelen: 'Video Application',
    value: 'Video Application',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '安全',
    labelen: 'Safety',
    value: 'Safety',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '区块链',
    labelen: 'Blockchain',
    value: 'Blockchain',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '物联网',
    labelen: 'Internet of Things',
    value: 'Internet of Things',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '大数据',
    labelen: 'Big Data',
    value: 'Big Data',
    selected: false,
    type: 'types'
  },
  {
    labelcn: 'AR/VR',
    labelen: 'AR/VR',
    value: 'AR/VR',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '游戏',
    labelen: 'Game',
    value: 'Game',
    selected: false,
    type: 'types'
  },
  {
    labelcn: '其他',
    labelen: 'Others',
    value: 'Others',
    selected: false,
    type: 'types'
  }
]

const TTYPES = [
  {
    label: ['联通_APPD_2.0', 'Unicom_APPD_2.0'],
    value: '联通_APPD_2.0',
    selected: false,
    type: 'types'
  },
  {
    label: ['移动_APPD_2.0', 'Mobile_APPD_2.0'],
    value: '移动_APPD_2.0',
    selected: false,
    type: 'types'
  },
  {
    label: ['电信_APPD_2.0', 'Telecom_APPD_2.0'],
    value: '电信_APPD_2.0',
    selected: false,
    type: 'types'
  },
  {
    label: ['社区_APPD_2.0', 'Community_APPD_2.0'],
    value: '社区_APPD_2.0',
    selected: false,
    type: 'types'
  }
]

const AFFINITY = [
  {
    label: 'X86',
    value: 'X86',
    selected: false,
    type: 'affinity'
  },
  {
    label: 'ARM64',
    value: 'ARM64',
    selected: false,
    type: 'affinity'
  },
  {
    label: 'ARM32',
    value: 'ARM32',
    selected: false,
    type: 'affinity'
  }
]

const DEPLOYMODE = [
  {
    labelcn: '容器',
    labelen: 'container',
    value: 'container',
    selected: false,
    type: 'workloadType'
  },
  {
    labelcn: '虚拟机',
    labelen: 'vm',
    value: 'vm',
    selected: false,
    type: 'workloadType'
  }
]

const SORTITEM = [
  {
    labelcn: '下载量',
    labelen: 'DownloadCount',
    value: 'DownloadCount',
    selected: false,
    type: 'sortItem'
  },
  {
    labelcn: '名称',
    labelen: 'AppName',
    value: 'AppName',
    selected: false,
    type: 'sortItem'
  },
  {
    labelcn: '评分',
    labelen: 'Score',
    value: 'Score',
    selected: false,
    type: 'sortItem'
  },
  {
    labelcn: '上传时间',
    labelen: 'CreateTime',
    value: 'CreateTime',
    selected: false,
    type: 'sortItem'
  }
]

const MEAO = [
  {
    labelcn: '华为 MEAO',
    labelen: 'Huawei MEAO',
    value: ''
  },
  {
    labelcn: '九州云 MEAO',
    labelen: 'JiuzhouCloud MEAO',
    value: ''
  }
]

const Architecture = [
  {
    value: 'X86',
    label: 'X86'
  }, {
    value: 'ARM64',
    label: 'ARM64'
  }, {
    value: 'ARM32',
    label: 'ARM32'
  }
]

export {
  TYPES, AFFINITY, SORTITEM, INDUSTRY, TTYPES, DEPLOYMODE, Architecture, MEAO
}


<|start_filename|>edgegallery-fe/src/router/router.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import Vue from 'vue'
import Router from 'vue-router'
import navDataCn from '../navdata/navDataCn.js'
import { NAV_PRE, FIRST_LEVEL_MENU_PATH } from '../constants'

Vue.use(Router)

function getRouterComponent (routerPath) {
  if (routerPath.startsWith(FIRST_LEVEL_MENU_PATH.HOME)) {
    return () => import('../pages/homePage/Home.vue')
  } else if (routerPath.startsWith(NAV_PRE.APPSTORE) || routerPath.startsWith(NAV_PRE.DEVELOPER) || routerPath.startsWith(NAV_PRE.MECM) || routerPath.startsWith(NAV_PRE.ATP)) {
    return () => import('../pages/Container.vue')
  } else if (routerPath.startsWith(FIRST_LEVEL_MENU_PATH.SYSTEM)) {
    return () => import('../pages/system/System.vue')
  } else {
    return () => import('../pages/homePage/Home.vue')
  }
}

function getRouterConfigItem (navItem) {
  return {
    path: navItem.path,
    component: getRouterComponent(navItem.path)
  }
}

function getRouterConfigRecursively (navParam) {
  let routerConfig = []
  navParam.forEach(item => {
    if (item.children && item.children.length > 0) {
      routerConfig = routerConfig.concat(getRouterConfigRecursively(item.children))
    } else {
      routerConfig.push(getRouterConfigItem(item))
    }
  })
  return routerConfig
}

const originalPush = Router.prototype.push
const originalReplace = Router.prototype.replace
// push
Router.prototype.push = function push (location, onResolve, onReject) {
  if (onResolve || onReject) { return originalPush.call(this, location, onResolve, onReject) }
  return originalPush.call(this, location).catch(err => err)
}
// replace
Router.prototype.replace = function push (location, onResolve, onReject) {
  if (onResolve || onReject) { return originalReplace.call(this, location, onResolve, onReject) }
  return originalReplace.call(this, location).catch(err => err)
}

function getRouterConfig () {
  return getRouterConfigRecursively(navDataCn)
}

let routes = getRouterConfig()
export default new Router({
  routes: [
    {
      path: '/',
      redirect: 'index'
    },
    {
      path: '/index',
      name: 'newhome',
      component: () => import('../pages/homePage/Home.vue')
    },
    {
      path: '/EG/developer/home',
      name: 'incubation',
      component: () => import('../pages/developer/Index.vue')
    },
    {
      path: '/EG/developer/createApplication',
      name: 'createApplication',
      component: () => import('../pages/developer/application/CreateApplication.vue')
    },
    {
      path: '/EG/developer/createProfileApplication',
      name: 'createProfileApplication',
      component: () => import('../pages/developer/application/CreateProfileApplication.vue')
    },
    {
      path: '/EG/developer/capabilityCenter',
      name: 'capabilityCenter',
      component: () => import('../pages/developer/capabilityCenter/Index.vue')
    },
    {
      path: '/EG/developer/capabilityPublish',
      name: 'capabilityPublish',
      component: () => import('../pages/developer/capabilityCenter/CapabilityPublish.vue')
    },
    {
      path: '/EG/developer/applicationRules',
      name: 'incubationRules',
      component: () => import('../pages/developer/sandbox/applicationRules/Index.vue')
    },
    {
      path: '/EG/developer/sandbox',
      name: 'sandbox',
      component: () => import('../pages/developer/sandbox/Index.vue')
    },
    {
      path: '/EG/developer/sandboxFrame',
      name: 'sandboxFrame',
      component: () => import('../pages/developer/sandbox/Sandbox.vue')
    },
    {
      path: '/EG/developer/selectScenarios',
      name: 'selectScenarios',
      component: () => import('../pages/developer/atp/SelectScenarios.vue')
    },
    {
      path: '/EG/developer/testProcess',
      name: 'testProcess',
      component: () => import('../pages/developer/atp/TestProcess.vue')
    }, {
      path: '/EG/developer/testReport',
      name: 'testReport',
      component: () => import('../pages/developer/atp/TestReport.vue')
    },
    {
      path: '/EG/developer/sandboxDetails',
      name: 'sandboxDetail',
      component: () => import('../pages/developer/sandbox/SandboxDetail.vue')
    },
    {
      path: '/EG/images/appPackageBuild',
      name: 'appPackageBuild',
      component: () => import('../pages/developer/image/AppPackageBuild.vue')
    },
    {
      path: '/EG/images/appdPreview',
      name: 'appdPreview',
      component: () => import('../pages/developer/image/AppdPreview.vue')
    },
    {
      path: '/EG/mecm/appDeployDetail',
      name: 'appDeployDetail',
      component: () => import('../pages/mecm/AppDeployDetailList.vue')
    },
    {
      path: '/EG/mecm/distributeDeploy',
      name: 'distributeDeploy',
      component: () => import('../pages/mecm/DistributeDeploy.vue')
    },
    {
      path: '/EG/mecm/distribute',
      name: 'distribute',
      component: () => import('../pages/mecm/Distribute.vue')
    },
    {
      path: '/EG/mecm/deployConfig',
      name: 'deployConfig',
      component: () => import('../pages/mecm/DeployConfig.vue')
    },
    {
      path: '/EG/mecm/distributeFinish',
      name: 'distributeFinish',
      component: () => import('../pages/mecm/DistributeFinish.vue')
    },
    {
      path: '/EG/appstore/appWarehouse',
      name: 'appWarehouse',
      component: () => import('../pages/appstore/Index.vue')
    },
    {
      path: '/EG/appstore/apppromotion',
      name: 'appPromotion',
      component: () => import('../pages/appstore/AppPromotion.vue')
    },
    {
      path: '/EG/appstore/appDetail',
      name: 'appDetail',
      component: () => import('../pages/appstore/detail/AppDetail.vue')
    },
    {
      path: '/detail',
      name: 'detail',
      component: () => import('../pages/system/Detail.vue')
    },
    ...routes
  ]
})


<|start_filename|>edgegallery-fe/src/tools/tool.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import axios from 'axios'
import Vue from 'vue'
import VueCookies from 'vue-cookies'
import {
  PROXY_PREFIX_CURRENTSERVER
} from './constant.js'
Vue.use(VueCookies)

function getCookie (name) {
  let arr = []
  let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
  arr = document.cookie.match(reg)
  if (arr) {
    return (arr[2])
  } else {
    return null
  }
}

function logoutApi () {
  return axios({
    method: 'POST',
    url: PROXY_PREFIX_CURRENTSERVER + '/logout',
    withCredentials: true,
    headers: {
      'Content-Type': 'application/json',
      'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
    }
  })
}

function loginApi () {
  return axios({
    method: 'GET',
    url: PROXY_PREFIX_CURRENTSERVER + '/auth/login-info',
    headers: {
      'Content-Type': 'application/json'
    }
  })
}

function healthCheck (url) {
  return axios({
    method: 'GET',
    url: url,
    withCredentials: true,
    headers: {
      'Content-Type': 'application/json',
      'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
    },
    timeout: 3000
  })
}

export {
  logoutApi,
  loginApi,
  healthCheck,
  getCookie
}


<|start_filename|>edgegallery-fe/src/api/developerApi.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  GET,
  POST,
  PUT,
  DELETE
} from '../tools/request.js'
import {
  PROXY_PREFIX_CURRENTSERVER
} from '../tools/constant.js'

const URL_PREFIX_DEVELOPER = PROXY_PREFIX_CURRENTSERVER + '/mec-developer/mec/developer/v2/'
let sandbox = {
  // determine whether to select sandbox by applicationid
  getUserSelectSandbox (applicationid) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationid)
  },
  // get all sandboxlist
  getSandboxList: function (vimtype, architecture) {
    return GET(URL_PREFIX_DEVELOPER + 'mephosts' + '?vimType=' + vimtype + '&architecture=' + architecture + '&limit=12&offset=0')
  },
  // get sandboxname by mephostid
  getSandboxByMepHostId: function (mepHostId) {
    return GET(URL_PREFIX_DEVELOPER + 'mephosts/' + mepHostId)
  },
  // Judge whether the sandbox is selected successfully
  selectSandbox: function (applicationId, mepHostId) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/sel-mephost', mepHostId)
  },
  // get all internet type
  getAllInternetType (applicationid) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationid + '/networks')
  },
  // add internet type
  addInternetType (applicationid, parmas) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationid + '/networks', parmas)
  },
  // get vm specs
  getVmspec () {
    return GET(URL_PREFIX_DEVELOPER + 'flavors/')
  },
  // get vm image list
  getVmImageList (parmas) {
    return POST(URL_PREFIX_DEVELOPER + 'vmimages/action/get-list', parmas)
  },
  // add vm image
  addVmImage (applicationId, parmas) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms', parmas)
  },
  // get vmList
  getVmlist (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms')
  },
  // delete vmImage
  deleteVmImage (applicationId, vmId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId)
  },
  // edit vmDetail
  editVmDetail (applicationId, vmId, parmas) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId, parmas)
  },
  // get vm operationId
  getVmPullId (applicationId, vmId) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId + '/action/launch')
  },
  // look vm status
  getVmStatus (operationId) {
    return GET(URL_PREFIX_DEVELOPER + 'operations/' + operationId)
  },
  // clearVmImage
  clearVmImage (applicationId) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/clean-env')
  },
  // export Image
  exportImage (applicationId, vmId) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId + '/action/export-image')
  },
  getVmDetail (applicationId, vmId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId)
  },
  getVmDetailImage (imageId) {
    return GET(URL_PREFIX_DEVELOPER + 'vmimages/' + imageId)
  },
  getVmDetailFlavor (flavorId) {
    return GET(URL_PREFIX_DEVELOPER + 'flavors/' + flavorId)
  },
  vncLogin (applicationId, vmId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId + '/action/vnc')
  },
  sshLogin (applicationId, vmId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/vms/' + vmId + '/action/ssh')
  },
  getScriptByImageId (pkgSpecId, osType) {
    return GET(URL_PREFIX_DEVELOPER + 'user-datas?' + 'pkgSpecId=' + pkgSpecId + '&osType=' + osType)
  },
  getUpfFinished (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration')
  },
  addCustom (parmas) {
    return POST(URL_PREFIX_DEVELOPER + 'flavors', parmas)
  },
  deleteInternet (applicationid, networkId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + applicationid + '/networks/' + networkId)
  },
  container: {
    postHelmChartsFile (applicationId, parmas) {
      return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/helmcharts', parmas)
    },
    getHelmchartsFileList (applicationId) {
      return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/helmcharts')
    },
    getHelmChartFileContent (applicationId, helmChartId, filePath) {
      return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/helmcharts/' + helmChartId + '/action/get-inner-file?filePath=' + filePath)
    },
    saveHelmChartFile (applicationId, helmChartId, params) {
      return PUT(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/helmcharts/' + helmChartId + '/action/modify-inner-file', params)
    },
    deleteHelmChartsFile (applicationId, helmChartId) {
      return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/helmcharts/' + helmChartId)
    },
    deployContainer (applicationId) {
      return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/containers/action/launch')
    },
    getDeployContainerInfo (operationId) {
      return GET(URL_PREFIX_DEVELOPER + 'operations/' + operationId)
    },
    getApplicationDetail (applicationId) {
      return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/detail')
    },
    cleanContainerEnv (applicationId) {
      return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/clean-env')
    }
  }

}

let applicationApi = {
  getApplicationList: function () {
    return GET(URL_PREFIX_DEVELOPER + 'applications?limit=120&offset=0')
  },
  getAppInfo: function (appId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + appId)
  },
  deleteApp: function (appId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + appId)
  },
  modifyApp: function (appId, params) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + appId, params)
  },
  getFileStream: function (fileId) {
    return URL_PREFIX_DEVELOPER + 'upload-files/' + fileId + '/action/get-file-stream'
  },
  getFileInfo: function (fileId) {
    return GET(URL_PREFIX_DEVELOPER + 'upload-files/' + fileId)
  },
  uploadFileApi: function (params) {
    return POST(URL_PREFIX_DEVELOPER + 'upload-files', params)
  },
  createNewApp: function (params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications', params)
  },
  getServiceList: function () {
    return GET(URL_PREFIX_DEVELOPER + 'query/capability-group-stats/type/OPENMEP')
  },
  getCapabilityByGroupId: function (groupId) {
    return GET(URL_PREFIX_DEVELOPER + 'query/capabilities/group-id/' + groupId)
  },
  addService: function (appId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/servicerequireds', params)
  },
  getServiceDependencies (appId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/servicerequireds')
  },
  deleteService: function (appId, serId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/servicerequireds/' + serId)
  },
  getApiUrl: function (apiFileId) {
    return URL_PREFIX_DEVELOPER + 'upload-files/' + apiFileId + '/action/get-file-stream'
  },
  publishService: function (appId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/serviceproduceds', params)
  },
  getPublishedService: function (appId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/serviceproduceds')
  },
  modifyPublishedService: function (appId, serId, params) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/serviceproduceds/' + serId, params)
  },
  deletePublishedService: function (appId, serId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + appId + '/appconfiguration/serviceproduceds/' + serId)
  },
  publishApp: function (applicationId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/release', params)
  },
  getProfileDataList: function (params) {
    return GET(URL_PREFIX_DEVELOPER + 'profiles', params)
  },
  createProfileNewApp: function (profileId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'profiles/' + profileId + '/create-application', params)
  },
  getSpecOptions: function () {
    return GET(URL_PREFIX_DEVELOPER + 'pkg-specs')
  },
  getAbilityIconApi: function (fileId) {
    return URL_PREFIX_DEVELOPER + 'upload-files/' + fileId + '/action/get-file-stream'
  }
}

let applicationRules = {
  getAppTrafficRules: function (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/trafficrules')
  },
  postAppTrafficRule: function (applicationId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/trafficrules', params)
  },
  editAppTrafficRule: function (applicationId, ruleId, params) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/trafficrules/' + ruleId, params)
  },
  deleteAppTrafficRule: function (applicationId, ruleId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/trafficrules/' + ruleId)
  },
  getAppDnsRules: function (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/dnsrules')
  },
  postAppDnsRule: function (applicationId, params) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/dnsrules', params)
  },
  editAppDnsRule: function (applicationId, ruleId, params) {
    return PUT(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/dnsrules/' + ruleId, params)
  },
  deleteAppDnsRule: function (applicationId, ruleId) {
    return DELETE(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/appconfiguration/dnsrules/' + ruleId)
  }
}
let imageApi = {
  getAppInfo: function (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/detail')
  },
  getVmFlavors: function (flavorId) {
    return GET(URL_PREFIX_DEVELOPER + 'flavors/' + flavorId)
  },
  getImage: function (imageId) {
    return GET(URL_PREFIX_DEVELOPER + 'vmimages/' + imageId)
  },
  generatePackage: function (applicationId) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/generate-package')
  },
  getPackageStructure: function (packageId) {
    return GET(URL_PREFIX_DEVELOPER + 'apppackages/' + packageId + '/action/get-pkg-structure')
  },
  getPackageFile: function (packageId, parmas) {
    return POST(URL_PREFIX_DEVELOPER + 'apppackages/' + packageId + '/action/get-file-content', parmas)
  },
  modifyPackageFile: function (packageId, params) {
    return PUT(URL_PREFIX_DEVELOPER + 'apppackages/' + packageId + '/action/update-file-content', params)
  },
  getFileInfo: function (fileId) {
    return GET(URL_PREFIX_DEVELOPER + 'upload-files/' + fileId)
  },
  packageToZip: function (packageId) {
    return POST(URL_PREFIX_DEVELOPER + 'apppackages/' + packageId + '/action/zip-package')
  }
}
let atpTestApi = {
  submitTest: function (applicationId) {
    return POST(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/atp-tests')
  },
  getTestId: function (applicationId) {
    return GET(URL_PREFIX_DEVELOPER + 'applications/' + applicationId + '/action/atp-tests')
  }
}

export {
  URL_PREFIX_DEVELOPER,
  sandbox,
  applicationApi,
  applicationRules,
  imageApi,
  atpTestApi
}


<|start_filename|>src/pages/home/home.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const aLinkList = [
  {
    id: 4,
    src: require('../../assets/images/homeAlink04.png'),
    url: 'https://gitee.com/',
    title: 'Gitee'
  },
  {
    id: 1,
    src: require('../../assets/images/homeAlink01.png'),
    url: 'https://jenkins.io/zh/',
    title: 'Jenkins'
  },
  {
    id: 2,
    src: require('../../assets/images/homeAlink02.png'),
    url: 'https://www.ansible.com/',
    title: 'ANSIBLE'
  },
  {
    id: 3,
    src: require('../../assets/images/homeAlink03.png'),
    url: 'https://www.spinnaker.io/',
    title: 'Spinnaker'
  },
  {
    id: 5,
    src: require('../../assets/images/homeAlink05.png'),
    url: 'https://www.jaegertracing.io/',
    title: 'JAEGER'
  },
  {
    id: 6,
    src: require('../../assets/images/homeAlink06.png'),
    url: 'https://grafana.com/',
    title: 'Grafana'
  },
  {
    id: 7,
    src: require('../../assets/images/homeAlink07.png'),
    url: 'https://prometheus.io/',
    title: 'Prometheus'
  },
  {
    id: 9,
    src: require('../../assets/images/homeAlink09.png'),
    url: 'https://cri-o.io/',
    title: 'cri-o'
  },
  {
    id: 10,
    src: require('../../assets/images/homeAlink10.png'),
    url: 'https://github.com/containernetworking',
    title: 'CNI'
  },
  {
    id: 11,
    src: require('../../assets/images/homeAlink11.png'),
    url: 'https://kubevirt.io/',
    title: 'KubeVirt'
  },
  {
    id: 12,
    src: require('../../assets/images/homeAlink12.png'),
    url: 'https://helm.sh/',
    title: 'HELM'
  },
  {
    id: 13,
    src: require('../../assets/images/homeAlink13.png'),
    url: 'https://kubernetes.io/',
    title: 'Kubernetes'
  },
  {
    id: 15,
    src: require('../../assets/images/homeAlink15.png'),
    url: 'https://kubeedge.io/en/',
    title: 'KubeEdge'
  },
  {
    id: 16,
    src: require('../../assets/images/homeAlink16.png'),
    url: 'https://github.com/knative/docs/',
    title: 'Knative'
  },
  {
    id: 17,
    src: require('../../assets/images/homeAlink17.png'),
    url: 'https://www.onap.org/',
    title: 'ONAP'
  }
]

export {
  aLinkList
}


<|start_filename|>edgegallery-fe/src/tools/mecm/constants.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
const INDUSTRY = [
  {
    label: ['智慧园区', 'Smart Park'],
    value: 'Smart Park',
    selected: false,
    type: 'industry'
  },
  {
    label: ['智慧商超', 'Smart Supermarket'],
    value: 'Smart Supermarket',
    selected: false,
    type: 'industry'
  },
  {
    label: ['工业制造', 'Industrial Manufacturing'],
    value: 'Industrial Manufacturing',
    selected: false,
    type: 'industry'
  },
  {
    label: ['交通物流', 'Transportation Logistics'],
    value: 'Transportation Logistics',
    selected: false,
    type: 'industry'
  },
  {
    label: ['水利', 'Water Conservancy'],
    value: 'Water Conservancy',
    selected: false,
    type: 'industry'
  },
  {
    label: ['游戏竞技', 'Game Competition'],
    value: 'Game Competition',
    selected: false,
    type: 'industry'
  },
  {
    label: ['开源', 'Open Source'],
    value: 'Open Source',
    selected: false,
    type: 'industry'
  },
  {
    label: ['其他', 'Other'],
    value: 'Other',
    selected: false,
    type: 'industry'
  }
]

const TYPESFORAPP = [
  {
    label: ['视频应用', 'Video Application'],
    value: 'Video Application',
    selected: false,
    type: 'types'
  },
  {
    label: ['游戏', 'Game'],
    value: 'Game',
    selected: false,
    type: 'types'
  },
  {
    label: ['视频监控', 'Video Surveillance'],
    value: 'Video Surveillance',
    selected: false,
    type: 'types'
  },
  {
    label: ['安全', 'Safety'],
    value: 'Safety',
    selected: false,
    type: 'types'
  },
  {
    label: ['区块链', 'Blockchain'],
    value: 'Blockchain',
    selected: false,
    type: 'types'
  },
  {
    label: ['智能设备', 'Smart Device'],
    value: 'Smart Device',
    selected: false,
    type: 'types'
  },
  {
    label: ['物联网', 'Internet of Things'],
    value: 'Internet of Things',
    selected: false,
    type: 'types'
  },
  {
    label: ['大数据', 'Big Data'],
    value: 'Big Data',
    selected: false,
    type: 'types'
  },
  {
    label: ['AR/VR', 'AR/VR'],
    value: 'AR/VR',
    selected: false,
    type: 'types'
  },
  {
    label: ['API', 'API'],
    value: 'API',
    selected: false,
    type: 'types'
  },
  {
    label: ['SDK', 'SDK'],
    value: 'SDK',
    selected: false,
    type: 'types'
  },
  {
    label: ['MEP', 'MEP'],
    value: 'MEP',
    selected: false,
    type: 'types'
  }
]
export {
  INDUSTRY, TYPESFORAPP
}


<|start_filename|>edgegallery-fe/src/locales/en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import enLocale from 'element-ui/lib/locale/lang/en'
import enHome from './home_en.js'
import enApp from './app_en.js'
import enAppStore from './appstore_en.js'
import enCapability from './capability_en.js'
import enSandbox from './sandbox_en.js'
import enThirdsystem from './thirdsystem_en.js'
import enImages from './images_en.js'
import enAtp from './atp_en.js'
import enMecm from './mecm_en.js'
const en = {
  common: {
    classic: 'Classic',
    operation: 'Operation',
    edit: 'Edit',
    delete: 'Delete',
    cancel: 'Cancel',
    confirm: 'Confirm',
    finish: 'Finish',
    save: 'Save',
    close: 'Close',
    detail: 'Detail',
    select: 'Select',
    add: 'Add',
    login: 'Please login.',
    upload: 'Upload',
    start: 'Start',
    name: 'Name',
    describe: 'Describe',
    userName: 'User Name',
    enterUserName: 'Please enter user name',
    password: 'Password',
    enterPassword: '<PASSWORD>',
    pleaseSelect: 'Please select',
    back: 'Back',
    noData: 'No Data'
  },
  promptInformation: {
    confirmDelete: 'Confirm to delete the data?',
    deleteFailed: 'Failed to delete data!',
    editDataSuccess: 'Edit data successfully!',
    editDataFailed: 'Failed to edit data!',
    noPermission: 'Guest user has no permissioin，please login and retry it!',
    fileIsEmpty: 'File content is empty!',
    addFailed: 'Failed to add data!'
  },
  normal: {
    newVersion: 'New Version',
    cancel: 'Cancel',
    confirm: 'Confirm'
  },
  nav: {
    logIn: 'Login',
    userAccountCenter: 'My Account',
    logOut: 'Logout',
    refresh: 'Refresh',
    reLogin: 'ReLogin',
    hsInvalidHintForTimeout: 'You have not operated for a long time, ',
    hsInvalidHintForLogout: 'You have logged in or logged out through other pages, ',
    hsInvalidHintForServerStopped: 'The server has been upgraded, ',
    hsInvalidHint: 'the current session has expired. Please choose to refresh the page or log in again.'
  },
  homePromptMessage: {
    prompt: 'Prompt',
    logoutPage: 'Are you sure to log out?'
  },
  ...enLocale,
  ...enHome,
  ...enAppStore,
  ...enCapability,
  ...enSandbox,
  ...enImages,
  ...enAtp,
  ...enMecm,
  ...enApp,
  ...enThirdsystem
}
export default en


<|start_filename|>edgegallery-fe/src/navdata/atpNav.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import { NAV_PRE } from '../constants'

const atpPathPre = NAV_PRE.ATP

const atpNavData = [
  {
    name: 'Overview',
    path: atpPathPre + '/index',
    display: true,
    id: '4.1'
  },
  {
    name: 'Test Model',
    display: true,
    id: '4.2',
    children: [
      {
        name: 'Scenarios Management',
        path: atpPathPre + '/scenarios',
        display: true,
        id: '4.2.1'
      }, {
        name: 'Suites Management',
        path: atpPathPre + '/suites',
        display: true,
        id: '4.2.2'
      }, {
        name: 'Case Management',
        path: atpPathPre + '/testcasemanage',
        display: true,
        id: '4.2.3'
      }
    ]
  },
  {
    name: 'Task',
    path: atpPathPre + '/tasklist',
    display: true,
    id: '4.3'
  },
  {
    name: 'Contribution Case',
    path: atpPathPre + '/contributionlist',
    display: true,
    id: '4.4',
    authority: ['ROLE_APPSTORE_ADMIN']
  },
  {
    name: 'Configuration',
    path: atpPathPre + '/configurationlist',
    display: true,
    id: '4.5'
  }
]

export {
  atpNavData
}


<|start_filename|>src/components/common/MessageBox/index.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import Vue from 'vue'
import MessageBox from '../MessageBox/MessageBox.vue'

const EGMessageBox = Vue.extend(MessageBox)

const messageBoxComp = function (desc, type, cancelText, confirmText) {
  let options = {}
  if (typeof desc === 'object') {
    options = desc
  } else {
    options.type = type || 'info'
    options.desc = desc || ''
    options.cancelText = cancelText || this.$t('common.cancelText')
    options.confirmText = confirmText || ''
  }

  let instance = new EGMessageBox({
    data: options
  }).$mount()

  document.body.appendChild(instance.$el)

  return instance.init()
}

export default {
  install: (Vues) => {
    Vues.prototype.$eg_messagebox = messageBoxComp
  }
}


<|start_filename|>edgegallery-fe/src/locales/app_en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const appEn = {
  incubation: {
    zoomOut: 'Zoom out',
    search: 'Search',
    delete: 'Delete',
    more: 'More',
    putAway: 'Put away',
    newAndRecent: 'New/Recent',
    otehrs: 'Others',
    addNewApp: 'Create App',
    checkFromApp: 'You need to check it in the app content',
    return: 'Return',
    appInfo: 'App Information',
    appName: 'App Name',
    version: 'Version',
    provider: 'Provider',
    industry: 'Industry',
    architecture: 'Architecture',
    appClass: 'Load type',
    type: 'App Type',
    description: 'Description',
    upload: 'Click to upload',
    logo: 'Logo',
    guideDoc: 'Guide Document',
    or: 'or',
    chooseAppClass: 'Load type',
    chooseArchitecture: 'Architecture',
    chooseIndustry: 'Industry',
    chooseType: 'App Type',
    logoLimit: 'Only supports jpg, png format pictures',
    docLimit: 'Only .md files can be uploaded, and no more than 500kb',
    deleteAppTip: 'This operation will permanently delete the app, do you want to continue?',
    deleted: 'Successfully deleted',
    afterDelete: 'The current application has been deleted!',
    uploadLimit: 'Only supports uploading one file!',
    others: 'Others',
    direction: 'Action Direction',
    currentLocation: 'Current Location',
    necessaryNode: 'Necessary Node',
    addAppSuccess: 'Created App successfully!',
    addAppFailed: 'Created App failed!',
    modifyAppSuccess: 'Modified App successfully!',
    modifyAppFailed: 'Modified App failed!',
    fileLimitNum: 'Only support one file!',
    nameTip: 'You should enter the app name.',
    nameRule: 'No spaces, length 4-32, cannot be all numbers, can include numbers, letters, Chinese characters, _, -, and cannot start and end with _,-',
    lengthTip: 'The app name should be including 3-15 letters.',
    versionTip: 'Please enter the app version.',
    versionRule: 'Length 1-10, can only contain numbers, letters, _,-and spaces, and cannot be empty at the beginning',
    providerTip: 'Please enter the app provider.',
    providerRule: 'Length 1-30, cannot be empty at the beginning',
    descTip: 'Please enter the app description.',
    providerEmpty: 'Provider cannot be empty',
    descriptionRule: 'Length 1-1024, the beginning cannot be empty, and cannot be all numbers',
    container: 'Container',
    vm: 'VM',
    uploadSizeLimit: 'The size of uploaded files exceeds the 2M limit, please try again.',
    appWorkflow: '5G App incubation workflow',
    newProject: 'New Project',
    selectProfile: 'Select Profile',
    appList: 'Application List',
    noData: 'No Data',
    noProfile: 'Please select a profile',
    createSuc: 'Successfully created application.',
    createFail: 'Failed to create application.',
    uploadMdFileTip: 'Please upload application introduction file.',
    packageSpecs: 'Packaging specification',
    chooseSpecs: 'Choose packaging specification',
    emulator: 'Emulator',
    current: 'Current',
    done: 'Done',
    notOperated: 'Not-operated',
    pleaseUpload: 'Please upload '
  },
  service: {
    basicInfo: 'Basic information',
    secLevelCn: 'Second Level',
    secLevelEn: 'Second Level(En)',
    firLevel: 'First Level',
    secLevel: 'Second Level',
    inputBox: 'Type something',
    apiFile: 'API file',
    yamlMust: 'Only supports .yaml documents',
    mdMust: 'Only supports .md files',
    guideFile: 'Document',
    customPic: 'Picture',
    registrationInfo: 'Registration detail',
    serviceName: 'Service Name',
    serviceName1: 'Service Name:',
    internalPort: 'Internal port',
    protocol: 'Protocol',
    expURL: 'Online URL',
    editSuccess: 'Successful modify service!',
    publishSuccess: 'Successful release service!',
    serviceTip: 'Please select the ecological services that your application needs to rely on. For details on ecological capabilities, please refer to the Competence Center. If it is an integrated application, or your application does not need to rely on other services, you can skip this step and continue to create it.',
    chosenService: 'Selected service:',
    chooseServices: 'Service selection',
    apiMonitor: 'The API simulator provides a public environment for local interface debugging and online simulation testing. Developers can use the simulator host address and application external port number to access locally, and check the URL of a specific service by calling the mep service discovery interface during actual deployment and testing.',
    serviceDetail: 'Service details',
    version1: 'Version: ',
    publishTime: 'release time:',
    type: 'Type: ',
    servicePublish: 'Service release',
    addServiceConfig: 'Add service',
    deleteServiceTip: 'This operation will permanently delete the service, do you want to continue?',
    serviceNameTip: 'Please enter the service name.',
    innerPortTip: 'Please enter the internal port',
    protocolTip: 'Please enter the protocol.',
    secondLevelNameCnTip: 'Please enter the second level service name(Cn).',
    secondLevelNameEnTip: 'Please enter the second level service name(En).',
    uploadApiFile: 'Please upload the Api file!',
    iconRequired: 'Icon is required',
    guideFileId: 'Guide',
    fileNameType: 'The file name cannot contain spaces!',
    isNameEmpty: 'Please enter a name',
    nameRules: 'Please enter a name with a length of 1-40,the beginning cannot be empty',
    serviceDesc: 'Please enter service description with a length of 1-400,the beginning cannot be empty',
    successOperation: 'Successful operation!'
  },
  workflow: {
    incubation: 'Incubation',
    mustSteps: 'Please complete the necessary steps first!',
    appstore: 'App Store',
    produceEnv: 'Deployment'
  }
}
export default appEn


<|start_filename|>src/tools/api_mock.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import axios from 'axios'
require('../mock.js')

let Workspace = {
  getProjectListApi: function (userId) {
    return axios.get('/mock/developer/projectlist')
  },
  getIconApi: function (fileId, userId) {
    return ''
  },
  getProjectInfoApi: function () {
    return axios.get('/mock/developer/projectinfo')
  }
}
let vmService = {
  getProjectVmResList: function () {
    return axios.get('/mock/developer/project/vmlist')
  },
  getVmConfigData: function () {
    return axios.get('/mock/developer/vmconfig')
  },
  applyVmResource: function (projectId, params) {
    return axios.get('/mock/donothing')
  },
  deleteVmResource: function (projectId, vmId) {
    return axios.get('/mock/donothing')
  },
  uploadFile: function (projectId, params) {
    return axios.get('/mock/donothing')
  },
  getCreateImageListApi: function () {
    return axios.get('/mock/developer/imageList')
  }
}
let imageMgmtService = {
  getImageDataList: function (queryData, userId) {
    return axios.get('/mock/developer/system/systemimage/list')
  },
  newImage: function (imgData, userId) {
    return axios.get('/mock/donothing')
  },
  modifyImage: function (imgData, systemId, userId) {
    return axios.get('/mock/donothing')
  },
  deleteImage: function (systemId, userId) {
    return axios.get('/mock/donothing')
  },
  publishImage: function (systemId, userId) {
    return axios.get('/mock/donothing')
  },
  resetImageStatus: function (systemId, userId) {
    return axios.get('/mock/donothing')
  },
  mergeImage: function (systemId, fileName, identifier) {
    return axios.get('/mock/donothing')
  },
  cancelUploadImage: function (systemId, identifier) {
    return axios.get('/mock/donothing')
  },
  downloadSystemImageUrl: function (systemId, userId) {
    return 'mec/developer/v1/system/images/' + systemId + '/download?userId=' + userId
  }
}

export {
  Workspace,
  vmService,
  imageMgmtService
}


<|start_filename|>edgegallery-fe/src/tools/commondata.js<|end_filename|>
const Industry = [
  {
    value: 'Smart City',
    label: ['智慧城市', 'Smart City']
  }, {
    value: 'Smart Park',
    label: ['智慧园区', 'Smart Park']
  }, {
    value: 'Smart Agriculture',
    label: ['智慧农业', 'Smart Agriculture']
  }, {
    value: 'Industrial Internet',
    label: ['工业互联网', 'Industrial Internet']
  }, {
    value: 'Transportation Logistics',
    label: ['交通物流', 'Transportation Logistics']
  }, {
    value: 'Energy',
    label: ['能源', 'Energy']
  }, {
    value: 'Finance',
    label: ['金融', 'Finance']
  }, {
    value: 'Education',
    label: ['教育', 'Education']
  }, {
    value: 'Cultural Tourism',
    label: ['文化旅游', 'Cultural Tourism']
  }, {
    value: 'Medical Health',
    label: ['医疗健康', 'Medical Health']
  }, {
    value: 'Digital Government',
    label: ['数字政府', 'Digital Government']
  }, {
    value: 'Ecosystem',
    label: ['生态环境', 'Ecosystem']
  }, {
    value: 'Game Competition',
    label: ['游戏竞技', 'Game Competition']
  }, {
    value: 'Others',
    label: ['其他', 'Others']
  }
]

const Type = [
  {
    value: 'Video Application',
    label: ['视频应用', 'Video Application']
  }, {
    value: 'Safety',
    label: ['安全', 'Safety']
  }, {
    value: 'Blockchain',
    label: ['区块链', 'Blockchain']
  }, {
    value: 'Internet of Things',
    label: ['物联网', 'Internet of Things']
  }, {
    value: 'Big Data',
    label: ['大数据', 'Big Data']
  }, {
    value: 'AR/VR',
    label: ['AR/VR', 'AR/VR']
  }, {
    value: 'Game',
    label: ['游戏', 'Game']
  }, {
    value: 'Others',
    label: ['其他', 'Others']
  }
]

const Architecture = [
  {
    value: 'X86',
    label: 'X86'
  }, {
    value: 'ARM64',
    label: 'ARM64'
  }, {
    value: 'ARM32',
    label: 'ARM32'
  }
]

const Status = {
  CREATED: ['创建完成', 'Created', 'app-created'],
  CONFIGURED: ['配置完成', 'Configuared', 'app-success'],
  PACKAGED: ['打包完成', 'Packaged', 'app-success'],
  TESTED: ['测试完成', 'Tested', 'app-success'],
  RELEASED: ['已发布', 'Released', 'app-published']
}

export {
  Industry,
  Type,
  Architecture,
  Status
}


<|start_filename|>edgegallery-fe/src/tools/constant.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const PROXY_PREFIX_CURRENTSERVER = window.location.pathname.slice(0, window.location.pathname.length - 1)
const PORT_CURRENTSERVER = '30095'
const DOMAIN_CURRENTSERVER = 'edgegallery'

const PLATFORMNAME_APPSTORE = 'APPSTORE'
const PLATFORMNAME_DEVELOPER = 'DEVELOPER'
const PLATFORMNAME_MECM = 'MECM'
const PLATFORMNAME_ATP = 'ATP'
const PLATFORMNAME_LAB = 'LAB'
const PLATFORMNAME_EGVIEWDOC = 'EGVIEWDOC'

const PLATFORM_LIST = [
  {
    name: PLATFORMNAME_APPSTORE,
    port: '30091',
    domain: 'appstore',
    proxyPrefix: '/edgegallery/appstore'
  },
  {
    name: PLATFORMNAME_DEVELOPER,
    port: '30092',
    domain: 'developer',
    proxyPrefix: '/edgegallery/developer'
  },
  {
    name: PLATFORMNAME_MECM,
    port: '30093',
    domain: 'mecm',
    proxyPrefix: '/edgegallery/mecm'
  },
  {
    name: PLATFORMNAME_ATP,
    port: '30094',
    domain: 'atp',
    proxyPrefix: '/edgegallery/atp'
  },
  {
    name: PLATFORMNAME_LAB,
    port: '30096',
    domain: 'lab',
    proxyPrefix: '/edgegallery/lab'
  },
  {
    name: PLATFORMNAME_EGVIEWDOC,
    port: '30089',
    domain: 'egviewdoc',
    proxyPrefix: '/edgegallery/egviewdoc'
  }
]

export {
  PROXY_PREFIX_CURRENTSERVER,
  PORT_CURRENTSERVER,
  DOMAIN_CURRENTSERVER,
  PLATFORMNAME_APPSTORE,
  PLATFORMNAME_DEVELOPER,
  PLATFORMNAME_MECM,
  PLATFORMNAME_ATP,
  PLATFORMNAME_EGVIEWDOC,
  PLATFORMNAME_LAB,
  PLATFORM_LIST
}


<|start_filename|>src/assets/css/workspace.css<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/* style for button */
.work-button {
  background-color: #5e40c8;
  border-radius: 8px;
  border:none;
  font-size: 18px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif !important;
  color: #FFFFFF;
  min-width: 150px;
  height: 40px;
  line-height: 40px;
  padding: 0 20px;
}

.work-button:hover {
  background-color: #5e40c8;
  color: #FFFFFF;
}

.work-button.el-button.is-disabled {
  background-color: #8278b7;
  border-radius: 8px;
  border:none;
  color: #FFFFFF;
}

.work-button.el-button.is-disabled:hover {
  background-color: #8278b7;
  border-radius: 8px;
  border:none;
  color: #FFFFFF;
}

.work-button.el-button {
  background-color: #5e40c8;
  color: #FFFFFF;
}

.work-button.el-button:hover, .work-button.el-button:focus {
  background-color: #5e40c8;
  color: #FFFFFF;
}

/* style for input */
.work-input .el-input {
  height: 36px;
  line-height: 36px;
  font-size: 16px;
  width: 100%;
}

.work-input .el-input .el-input__inner {
  background-color: #fbfbfb !important;
  border: transparent !important;
  color: #380879;
  border-radius: 8px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
}

.work-input .el-input.is-disabled  .el-input__inner{
  background-color: #e2e4ee !important;
  color: #b6adc7;
}

/* style for div background-style */
.work-div {
  width: 100%;
  background-color: #f1f2f6;
  border: solid 1px e5e5ee;
  border-radius: 16px;
  box-shadow: 6px 4px 45px 0 rgba(36, 20, 119, 0.11) inset;
}

/* style for basic radio */
.work-radio .el-radio__inner::after {
    display: none;
}

.work-radio .el-radio__input .el-radio__inner {
  height: 19px;
  width: 19px;
  border-color: #5e40c8;
  background: #fbfbfb !important;
}

.work-radio .el-radio__input .el-radio__inner::before {
  content: '';
  display: block;
  position: relative;
  width: 9px;
  height: 9px;
  background-color: #ceccdc;
  border-radius: 50%;
  left: 4px;
  top: 4px;
}

.work-radio .el-radio__label {
  color: #380879 !important;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  font-size: 16px;
}

.work-radio .el-radio__input.is-checked .el-radio__inner {
  border-color: #5e40cb;
  background: #fbfbfb;
}

.work-radio .el-radio__input.is-checked .el-radio__inner::before {
  content: '';
  display: block;
  position: relative;
  width: 9px;
  height: 9px;
  background-color: #55d8bf;
  border-radius: 50%;
  left: 4px;
  top: 4px;
  z-index: 10;
}

/* style for radio-button */
.work-radio-button .el-radio-button__inner {
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background-color: #dedae9;
  color: #f7f6fa;
  border: none;
  height: 39px;
}

.work-radio-button .el-radio-button__inner::before {
  content: '';
  display: none;
}

.work-radio-button .el-radio-button__inner:hover {
  color: #380879;
}

.work-radio-button .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  background-color: #8278b7;
  -webkit-box-shadow: none;
  box-shadow: none;
  border: none;
}

.work-radio-button .el-radio-button:first-child .el-radio-button__inner {
  border-radius: 8px 0 0 8px;
}

.work-radio-button .el-radio-button:last-child .el-radio-button__inner {
  border-radius: 0 8px 8px 0;
}

/* style for select */
.work-select .el-input {
  font-size: 16px;
}

.work-select .el-input .el-input__inner {
  background-color: #fbfbfb;
  border: transparent;
  color: #380879;
  height: 36px;
  line-height: 36px;
  border-radius: 8px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
}

.work-select .el-input .el-input__inner::placeholder {
  color: #aea4c3;
}

.work-select .el-input.is-disabled .el-input__inner{
  background-color: #e2e4ee;
  color: #b6adc7;
}

.work-select.el-select .el-input .el-select__caret {
  color: #7a6e8a;
}

/* style for static text */
.work-p {
  font-size: 16px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  color: #380879;
  padding-top: 5px;
}

.work-p-must::before {
  content: "*";
  color: #f23662;
}

/* style for title */
.work-title {
  background-image: linear-gradient(to right, #fbfbfb, rgba(241,242,246,1));
  height: 47px;
  max-width: 727px;
  position: relative;
  border-radius: 12px;
  line-height: 47px;
  font-size: 20px;
  color: #380879;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  padding-left: 52px;
  /* box-shadow: 0 5px 20px 3px rgba(53, 34, 114, 0.05); */
}

.work-title::before {
  content: "";
  display: block;
  position: absolute;
  width: 17px;
  height: 17px;
  background-color: #5844be;
  border-radius: 5px;
  left: 12px;
  top: 14px;
}

.work-title::after {
  content: "";
  display: block;
  position: absolute;
  width: 17px;
  height: 17px;
  background-image: linear-gradient(to top right, #3ddec0, #8df0dc);
  border-radius: 4px;
  opacity: 0.7;
  left: 9px;
  top: 19px;
}

/* style for title-clickable */
.work-title-clickable {
  background-image: linear-gradient(to right, #fbfbfb, rgba(241,242,246,1));
  height: 47px;
  max-width: 727px;
  position: relative;
  border-radius: 12px;
  line-height: 47px;
  color: #380879;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  padding-left: 10px;
  transform-style: preserve-3d;
}

.work-title-clickable::before {
  content: '';
  display: block;
  position: absolute;
  top: 20px;
  width: 100%;
  height: 40px;
  background-image: linear-gradient(90deg, rgba(40,12,128,.05), rgba(241,242,246,1));
  transform: translateZ(-10px);
  filter: blur(10px);
}

.work-title-clickable .work-radio .el-radio__label {
  padding-left: 18px;
  font-size: 20px;
}

.work-title-clickable .work-radio .el-radio__input {
  padding-bottom: 5px;
}

/* style for table */
.work-table-title {
  display: block;
  height: 35px;
  line-height: 35px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background-color: #8379b8;
  border-top-left-radius: 12px;
  border-top-right-radius: 12px;
  padding-left: 15px;
  color: #fefefe;
}

.work-table .el-table {
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background-color: #f1f2f6;
  border-radius: 0 0 12px 12px;
  box-shadow: 0 0 10px 1px #e5e5ee inset;
}

.work-table .el-table::before {
  display: none;
}

.work-table .el-table__header {
  background-color: #dedae9;
  border-radius: 0;
}

.work-table .el-table__body {
  background-color: transparent;
}

.work-table .el-table tr {
  background-color: transparent;
}

.work-table .el-table tr td {
  height: 36px !important;
  line-height: 36px !important;
  background-color: transparent;
  color: #62517a;
}

.work-table .el-table tr th {
  border: none;
}

.work-table .el-table tr:last-child {
  border: none !important;
}

.work-table .el-table__body-wrapper tr:last-child td:first-child{
  border-bottom-left-radius: 12px;
}

.work-table .el-table__body-wrapper tr:last-child td:last-child {
  border-bottom-right-radius: 12px;
}

.work-table .el-table__header .el-table-column--selection{
  visibility: hidden;
}

.work-table .has-gutter tr th {
  height: 36px;
  padding: 0;
  font-weight: normal;
  background-color: #dedae9;
  overflow: hidden;
  color: #62517a;
  border-radius: 0;
}

.work-table .el-table__header-wrapper {
  border-radius: 0;
}

.work-table .el-table__empty-block {
  border-radius: 0 0 12px 12px;
  background-color: transparent;
  min-height: 36px;
}

.work-table .el-table__empty-text {
  height: 36px;
  line-height: 36px;
}

/* style for steps */
.work-steps {
  margin: 8px;
}

.work-steps .el-step__line {
  border-top: 4px dotted #5844be !important;
  background: #fbfbfb !important;
  margin-left: 33px !important;
  margin-right: 15px !important;
}

.work-steps .el-step__line .el-step__line-inner {
  border-width: 0 !important;
}

.work-steps .el-step__icon {
  position: relative;
  display: block;
  top: 6px;
}

.work-steps .el-step__icon.is-text {
  width: 14px;
  height: 14px;
  font-size: 0;
}

.work-steps .el-step__head.is-wait {
  color: #5844be;
  border-color: #5844be;
}

.work-steps .el-step__head.is-wait .el-step__icon {
  background-color: #fbfbfb;
  border: solid 2px #5844be;
}

.work-steps .el-step__head.is-process .el-step__icon {
  background-color: #5844be;
}

.work-steps .el-step__head.is-process {
  border-color: #5844be;
}

.work-steps .el-step__head.is-process::before {
  content: '';
  display: block;
  position: absolute;
  top: 2px;
  left: -4px;
  width: 22px;
  height: 22px;
  background-color: #bcb7d7;
  border-radius: 50%;
  z-index: 1;
}

.work-steps .el-step__head.is-process::after {
  content: '';
  display: block;
  position: absolute;
  top: -2px;
  left: -8px;
  width: 30px;
  height: 30px;
  background-color: #e8e6f0;
  border-radius: 50%;
  z-index: 0;
}

.work-steps .el-step__head.is-success .el-step__icon {
  background-color: #5844be;
}

.work-steps .el-step__head.is-success::before {
  content: '';
  display: block;
  position: absolute;
  top: 2px;
  left: -4px;
  width: 22px;
  height: 22px;
  background-color: #bcb7d7;
  border-radius: 50%;
  z-index: 1;
}

.work-steps .el-step__head.is-success::after {
  content: '';
  display: block;
  position: absolute;
  top: -2px;
  left: -8px;
  width: 30px;
  height: 30px;
  background-color: #e8e6f0;
  border-radius: 50%;
  z-index: 0;
}

/* style for check-box */
.work-checkbox .el-checkbox__inner::after {
  display: none;
}

.work-checkbox .el-checkbox__input .el-checkbox__inner {
  height: 19px;
  width: 19px;
  border-color: #5e40c8;
  border-radius: 50%;
  background: #fbfbfb !important;
}

.work-checkbox .el-checkbox__input .el-checkbox__inner::before {
  content: '';
  display: block;
  position: relative;
  width: 9px;
  height: 9px;
  background-color: #ceccdc;
  border-radius: 50%;
  left: 4px;
  top: 4px;
}

.work-checkbox .el-checkbox__label {
  color: #380879 !important;
}

.work-checkbox .el-checkbox__input.is-checked .el-checkbox__inner {
  border-color: #5e40cb;
  background: #fbfbfb;
}

.work-checkbox .el-checkbox__input.is-checked .el-checkbox__inner::before {
  content: '';
  display: block;
  position: relative;
  width: 9px;
  height: 9px;
  background-color: #55d8bf;
  border-radius: 50%;
  left: 4px;
  top: 4px;
  z-index: 10;
}

<|start_filename|>edgegallery-fe/src/locales/images_en.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const imagesEn = {
  appPackage: {
    appdTitle: 'App configuration&Preview',
    basicInfo: 'Basic Info',
    appName: 'App Name :',
    provider: 'Provider :',
    industry: 'Industry :',
    type: 'Type :',
    architecture: 'Architecture :',
    dependent: 'Dependent :',
    createTime: 'Create Time :',
    description: 'Description',
    baseDesc: 'Description :',
    fileName: 'APP Detail :',
    resourceConfig: 'Resource Config',
    vmName: 'VM Name',
    spec: 'Spec',
    network: 'Network',
    basicImage: 'Basic Image',
    vmImage: 'VM Image',
    exportImage: 'Export Image',
    rule: 'Traffic Rules',
    trafficRule: 'Traffic Rules',
    addTrafficRule: 'Add Traffic Rules',
    trafficRuleId: 'Traffic Rule Id',
    dnsRuleId: 'DNS Rule Id',
    domainName: 'Domain Name',
    ipAddressType: 'Ip Address Type',
    ttl: 'TTL',
    filterType: 'Filter Type',
    priority: 'Priority',
    action: 'Action',
    dnsRule: 'DNS Rule',
    addDnsRule: 'Add Dns Rule',
    serviceName: 'Service Name',
    port: 'Port',
    version: 'Version',
    baseVersion: 'Version :',
    protocol: 'Protocol',
    dnaRule: 'DNA Rule',
    capabalityConfig: 'Capabality Config',
    capabalityDepend: 'Capabality Depend',
    capabalityRelease: 'Capabality Release',
    appdPreview: 'Build&Preview',
    build: 'Build',
    packFinished: 'Pack Finished',
    packFinishedTip: 'Before authentication, the system will release the virtual machine resources by default. After release, you can not return to modify.',
    packBack: 'back',
    packAuthentication: 'Authentication',
    appdDetail: 'Appd Detail',
    packageSuc: 'Packaged successfully',
    packageFail: 'Packaging failed',
    packageFinish: 'Packaged',
    subText: 'The system will release resources by default before authentication. Cannot return to modify after release.',
    notSupport: 'Format does not support modification',
    noDependences: 'no Dependences'
  }
}
export default imagesEn


<|start_filename|>edgegallery-fe/src/api/thirdSystemApi.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  GET,
  POST,
  PUT,
  DELETE
} from '../tools/request.js'
import {
  PROXY_PREFIX_CURRENTSERVER
} from '../tools/constant.js'

const URL_SYSTEM = PROXY_PREFIX_CURRENTSERVER + '/mec-thirdsystem' + '/mec/third-system/v1'

let system = {
  systemNum: function (params) {
    let url = URL_SYSTEM + '/count'
    return POST(url, params)
  },
  getOneSystem: function (type) {
    let url = URL_SYSTEM + '/systemType/' + type
    return GET(url)
  },
  addSystems: function (params) {
    let url = URL_SYSTEM
    return POST(url, params)
  },
  updateSystems: function (thirdSystemId, params) {
    let url = URL_SYSTEM + '/' + thirdSystemId
    return PUT(url, params)
  },
  deleteSystems: function (thirdSystemId) {
    let url = URL_SYSTEM + '/' + thirdSystemId
    return DELETE(url)
  },
  searchSystem: function (params) {
    let url = URL_SYSTEM + '/nameLike/' + params
    return GET(url)
  },
  getSystemDetail: function (thirdSystemId) {
    let url = URL_SYSTEM + '/' + thirdSystemId + '/action/display'
    return GET(url)
  }
}
export {
  system
}


<|start_filename|>edgegallery-fe/src/store/store.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    activeTab: sessionStorage.getItem('activeTab'),
    keyValue: sessionStorage.getItem('keyValue'),
    language: localStorage.getItem('language') ? localStorage.getItem('language') : 'en',
    currentFlow: sessionStorage.getItem('currentFlow') || '0',
    zoom: sessionStorage.getItem('zoom') || '2',
    appName: sessionStorage.getItem('appName') ? sessionStorage.getItem('appName') : '5G',
    currentAppListTemp: JSON.parse(sessionStorage.getItem('currentAppList')) || []
  },
  mutations: {
    changeTab (state, data) {
      state.activeTab = data
      sessionStorage.setItem('activeTab', data)
    },
    getKeyValue (state, data) {
      state.keyValue = data
      sessionStorage.setItem('keyValue', data)
    },
    changelanguage (state, data) {
      state.language = data
    },
    changeZoom (state, data) {
      state.zoom = data
      sessionStorage.setItem('zoom', data)
    },
    changeFlow (state, data) {
      state.currentFlow = data
      sessionStorage.setItem('currentFlow', data)
    },
    changeApp (state, data) {
      state.appName = data
      sessionStorage.setItem('appName', data)
    },
    currentAppList (state, data) {
      state.currentAppListTemp = data
      sessionStorage.setItem('currentAppList', JSON.stringify(data))
    }
  },
  actions: {

  }
})


<|start_filename|>src/tools/project_data.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const Industry = [
  {
    value: 'Smart Park',
    label: ['智慧园区', 'Smart Park']
  }, {
    value: 'Smart Supermarket',
    label: ['智慧商城', 'Smart Supermarket']
  }, {
    value: 'Industrial Manufacturing',
    label: ['工业制造', 'Industrial Manufacturing']
  }, {
    value: 'Transportation Logistics',
    label: ['交通物流', 'Transportation Logistics']
  }, {
    value: 'Water Conservancy',
    label: ['水利', 'Water Conservancy']
  }, {
    value: 'Game Competition',
    label: ['游戏竞技', 'Game Competition']
  }, {
    value: 'Open Source',
    label: ['开源', 'Open Source']
  }, {
    value: 'Other',
    label: ['其他', 'Other']
  }
]

const Type = [
  {
    value: 'Video Application',
    label: ['视频应用', 'Video Application']
  }, {
    value: 'Game',
    label: ['游戏', 'Game']
  }, {
    value: 'Video Surveillance',
    label: ['视频监控', 'Video Surveillance']
  }, {
    value: 'Safety',
    label: ['安全', 'Safety']
  }, {
    value: 'Blockchain',
    label: ['区块链', 'Blockchain']
  }, {
    value: 'Smart Device',
    label: ['智能设备', 'Smart Device']
  }, {
    value: 'Internet of Things',
    label: ['物联网', 'Internet of Things']
  }, {
    value: 'Big Data',
    label: ['大数据', 'Big Data']
  }, {
    value: 'AR/VR',
    label: ['AR/VR', 'AR/VR']
  }, {
    value: 'API',
    label: ['API', 'API']
  }, {
    value: 'SDK',
    label: ['SDK', 'SDK']
  }, {
    value: 'MEP',
    label: ['MEP', 'MEP']
  }, {
    value: 'Other',
    label: ['其他', 'Other']
  }
]

const Architecture = [
  {
    value: 'X86',
    label: 'X86'
  }, {
    value: 'ARM64',
    label: 'ARM64'
  }, {
    value: 'ARM32',
    label: 'ARM32'
  }
]

const Capability = [
  {
    value: 'Platform basic services',
    label: ['平台基础服务', 'Platform basic services']
  }, {
    value: 'Service governance',
    label: ['服务治理', 'Service governance']
  }, {
    value: 'Telecom network capabilities',
    label: ['电信网络能力', 'Telecom network capabilities']
  }, {
    value: 'Bandwidth management',
    label: ['带宽管理', 'Bandwidth management']
  }, {
    value: 'Location service',
    label: ['位置服务', 'Location service']
  }, {
    value: 'UE identity',
    label: ['UE标识', 'UE identity']
  }, {
    value: 'Traffic Rule',
    label: ['流量规则', 'Traffic Rule']
  }, {
    value: 'AI capabilities',
    label: ['AI功能', 'AI capabilities']
  }, {
    value: 'Face Recognition',
    label: ['人脸识别', 'Face Recognition']
  }, {
    value: 'Card recognition',
    label: ['卡证识别', 'Card recognition']
  }, {
    value: 'Gesture recognition',
    label: ['姿态识别', 'Gesture recognition']
  }, {
    value: 'face and body recognition',
    label: ['人脸和人体识别', 'Face and body recognition']
  }, {
    value: 'Picture text recognition',
    label: ['图片和文字识别', 'Picture text recognition']
  }, {
    value: 'Knowledge Graph',
    label: ['知识图谱', 'knowledge Graph']
  }, {
    value: 'Natural language processing',
    label: ['自然语言处理', 'Natural language processing']
  }, {
    value: 'Video Surveillance',
    label: ['视频监控', 'Video Surveillance']
  }, {
    value: 'Video processing',
    label: ['视频处理', 'Video processing']
  }, {
    value: 'Encoding decoding',
    label: ['编解码', 'Encoding decoding']
  }, {
    value: 'DateBase',
    label: ['数据库', 'DateBase']
  }, {
    value: 'Data management',
    label: ['数据管理', 'Data management']
  }, {
    value: 'Public framework',
    label: ['公共框架', 'Public framework']
  }, {
    value: 'Message bus',
    label: ['消息总线', 'Message bus']
  }, {
    value: 'Gateway',
    label: ['统一网关', 'Gateway']
  }, {
    value: 'Multi-cloud capabilities',
    label: ['多云功能', 'Multi-cloud capabilities']
  }, {
    value: 'Traffic',
    label: ['流量', 'Traffic']
  }, {
    value: 'Service Discovery',
    label: ['服务发现', 'Service Discovery']
  }, {
    value: 'Location',
    label: ['位置', 'Location']
  }, {
    value: 'Bandwidth',
    label: ['带宽', 'Bandwidth']
  }, {
    value: 'Face Recognition',
    label: ['人脸识别', 'Face Recognition']
  }
]

const ApiInfo = [
  {
    value: 'Service',
    label: ['服务介绍', 'Service Introduction']
  },
  {
    value: 'List',
    label: ['服务列表', 'Service List']
  }
]

export {
  Industry,
  Type,
  Architecture,
  Capability,
  ApiInfo
}


<|start_filename|>edgegallery-fe/docker/Dockerfile<|end_filename|>
# Copyright 2021 Huawei Technologies Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

FROM swr.cn-north-4.myhuaweicloud.com/edgegallery/website-gateway
ENV APP_HOME /usr/app

ENV USER_NAME=eguser
ENV GROUP_NAME=eggroup

# Set the working directory.
WORKDIR /usr/app

RUN mkdir -p -m 750 /usr/app/configs/ &&\
    mkdir -p -m 750 /usr/app/configs/static/ &&\
    chown -R eguser:eggroup /usr/app/configs/

COPY --chown=eguser:eggroup dist/ /usr/app/configs/static/

<|start_filename|>src/tools/tool.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import axios from 'axios'
import Vue from 'vue'
import ElementUI from 'element-ui'
import i18n from '../locales/i18n.js'
import 'element-ui/lib/theme-chalk/index.css'
import VueCookies from 'vue-cookies'
import {
  PROXY_PREFIX_CURRENTSERVER
} from './constant.js'
Vue.use(VueCookies)

const urlPrefix = PROXY_PREFIX_CURRENTSERVER + '/mec-developer/'
const urlPrefixTool = PROXY_PREFIX_CURRENTSERVER + '/toolchain/'
const urlPrefixAppstore = PROXY_PREFIX_CURRENTSERVER + '/mec-appstore/'

let accessToken = JSON.stringify(sessionStorage.getItem('accessToken'))
let codeErr = false

function getCookie (name) {
  let arr = []
  let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
  arr = document.cookie.match(reg)
  if (arr) {
    return (arr[2])
  } else {
    return null
  }
}

function Get (url, params, type = 'developer') {
  let prefixUrl = urlPrefix
  if (type !== 'developer') {
    prefixUrl = urlPrefixTool
  }
  return new Promise((resolve, reject) => {
    axios.get(prefixUrl + url, {
      params: params,
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        codeErr = true
        console.log(err.response)
        reject(err)
        ElementUI.Message.error(i18n.t('promptMessage.getDataFail'))
      })
  })
}

function GetFun (url, params, type = 'developer') {
  let prefixUrl = urlPrefix
  if (type !== 'developer') {
    prefixUrl = urlPrefixTool
  }
  return new Promise((resolve, reject) => {
    axios.get(prefixUrl + url, {
      params: params,
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        reject(err)
      })
  })
}

function Delete (url, params, type = 'developer') {
  let prefixUrl = urlPrefix
  if (type !== 'developer') {
    prefixUrl = urlPrefixTool
  }
  return new Promise((resolve, reject) => {
    axios.delete(prefixUrl + url, {
      params: params,
      headers: {
        'Content-Type': 'application/json',
        'access_token': accessToken
      }
    })
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        guestPrompt(reject, err)
      })
  })
}

function guestPrompt (reject, err) {
  reject(err)
  if (err.response.data.code === 403) {
    ElementUI.Message.error(i18n.t('promptMessage.guestPrompt'))
  }
}

function Post (url, params, type = 'developer') {
  let prefixUrl = urlPrefix
  if (type === 'appstore') {
    prefixUrl = urlPrefixAppstore
  } else if (type !== 'developer') {
    prefixUrl = urlPrefixTool
  }
  return new Promise((resolve, reject) => {
    axios.post(prefixUrl + url, params, {
      headers: {
        'Content-Type': 'application/json',
        'X-XSRF-TOKEN': getCookie('XSRF-TOKEN'),
        'access_token': accessToken
      }
    })
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        guestPrompt(reject, err)
      })
  })
}

function Put (url, params) {
  return new Promise((resolve, reject) => {
    axios.put(urlPrefix + url, params, {
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        guestPrompt(reject, err)
      })
  })
}

function downloadFile ({ url, params, type = 'application/x-compressed' }) {
  axios.post(urlPrefix + url, params, {
    responseType: 'arraybuffer'
  }).then(res => {
    let blob = new Blob([res.data], { type: type })
    if ('msSaveOrOpenBlob' in navigator) {
      window.navigator.msSaveBlob(blob)
    } else {
      let link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.click()
    }
  }).catch(err => {
    if (err.response.data.code === 403) {
      ElementUI.Message.error(i18n.t('promptMessage.guestPrompt'))
    }
  })
}

function downLoadReport ({ url, reportId }) {
  axios({
    method: 'get',
    url: urlPrefixTool + url,
    responseType: 'blob'
  }).then((data) => {
    if (!data) {
      return
    }
    let objectUrl = window.URL.createObjectURL(data.data)
    let link = document.createElement('a')
    link.style.display = 'none'
    link.href = objectUrl
    link.setAttribute('download', reportId + '.csv')
    document.body.appendChild(link)
    link.click()
  })
}

function logoutApi () {
  return axios({
    method: 'POST',
    url: PROXY_PREFIX_CURRENTSERVER + '/logout',
    withCredentials: true,
    headers: {
      'Content-Type': 'application/json',
      'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
    }
  })
}

function loginApi () {
  return axios({
    method: 'GET',
    url: PROXY_PREFIX_CURRENTSERVER + '/auth/login-info',
    headers: {
      'Content-Type': 'application/json'
    }
  })
}

function uniqueArray (arrData) {
  let _resultData = []
  for (let item of arrData) {
    if (_resultData.indexOf(item) === -1) {
      _resultData.push(item)
    }
  }
  return _resultData
}

export {
  Get,
  Post,
  Put,
  Delete,
  urlPrefix,
  urlPrefixTool,
  urlPrefixAppstore,
  downloadFile,
  downLoadReport,
  logoutApi,
  loginApi,
  codeErr,
  GetFun,
  uniqueArray,
  getCookie
}


<|start_filename|>edgegallery-fe/src/tools/common.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  PLATFORM_LIST,
  PROXY_PREFIX_CURRENTSERVER,
  PORT_CURRENTSERVER,
  DOMAIN_CURRENTSERVER
} from './constant.js'

function getPlatformUrlPrefix (platformName) {
  let _platform = PLATFORM_LIST.find(platformItem => platformItem.name === platformName)

  let _proxyPrefix = _platform ? _platform.proxyPrefix : PROXY_PREFIX_CURRENTSERVER
  let _port = _platform ? _platform.port : PORT_CURRENTSERVER
  let _domain = _platform ? _platform.domain : DOMAIN_CURRENTSERVER

  let _originUrl = window.location.origin
  if (PROXY_PREFIX_CURRENTSERVER) {
    return _originUrl + _proxyPrefix
  }

  if (_originUrl.indexOf(PORT_CURRENTSERVER) !== -1) {
    return _originUrl.replace(PORT_CURRENTSERVER, _port)
  } else {
    return _originUrl.replace(DOMAIN_CURRENTSERVER, _domain)
  }
}

function formatDate (timestamp) {
  let date = new Date(timestamp)
  let year = date.getFullYear()
  let month = date.getMonth() + 1
  let day = date.getDate()
  return year + (month < 10 ? '-0' : '-') + month + (day < 10 ? '-0' : '-') + day
}
function formatDateTime (dateStr) {
  if (!dateStr) {
    return ''
  }
  let date = new Date(Date.parse(dateStr))
  let Y = date.getFullYear()
  let M = date.getMonth() + 1
  let D = date.getDate()
  let H = date.getHours()
  let m = date.getMinutes()
  let s = date.getSeconds()
  return Y +
      '-' +
      (M > 9 ? M : '0' + M) +
      '-' +
      (D > 9 ? D : '0' + D) +
      ' ' +
      (H > 9 ? H : '0' + H) +
      ':' +
      (m > 9 ? m : '0' + m) +
      ':' +
      (s > 9 ? s : '0' + s)
}
function filterArr (arr) {
  return arr.filter(function (item, index, arrSub) {
    return arrSub.indexOf(item, 0) === index
  })
}
export {
  getPlatformUrlPrefix,
  formatDateTime,
  formatDate,
  filterArr
}


<|start_filename|>src/router/router.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      redirect: 'mecDeveloper',
      component: () => import('../pages/home/Home.vue')
    },
    {
      path: '/index',
      redirect: 'mecDeveloper',
      component: () => import('../pages/home/Home.vue')
    },
    {
      path: '',
      component: () => import('../components/layout/Layout.vue'),
      meta: {
        id: '3.0'
      },
      children: [
        {
          path: 'mecDeveloper',
          name: 'home',
          component: () => import('../pages/home/Home.vue'),
          meta: {
            id: '3.0'
          }
        },
        {
          path: 'mecDeveloper/plugin/list',
          component: () => import('../pages/plugin/List.vue'),
          meta: {
            keepAlive: true, // this component needs to be cached
            id: '3.1.1'
          }
        },
        {
          path: 'mecDeveloper/plugin/upload',
          name: 'upload',
          component: () => import('../pages/plugin/Upload.vue'),
          meta: {
            id: '3.1.3'
          }
        },
        {
          path: 'mecDeveloper/plugin/detail',
          name: 'listDetail',
          component: () => import('../pages/plugin/Detail.vue'),
          meta: {
            id: '3.1.4'
          }
        },
        {
          path: 'mecDeveloper/plugin/toolchain',
          name: 'toolChain',
          component: () => import('../pages/plugin/ToolChain.vue'),
          meta: {
            id: '3.1.5'
          }
        },
        {
          path: 'mecDeveloper/plugin/toolreport',
          name: 'toolReport',
          component: () => import('../pages/plugin/ToolReport.vue'),
          meta: {
            id: '3.1.6'
          }
        },
        {
          path: 'mecDeveloper/docs',
          name: 'devDocs',
          component: () => import('../pages/Document/Document.vue'),
          meta: {
            id: '3.1.6'
          }
        },
        {
          path: 'mecDeveloper/docs/component',
          name: 'viewComponent',
          component: () => import('../pages/Document/viewComponent.vue'),
          meta: {
            id: '3.1.7'
          }
        },
        {
          path: 'mecDeveloper/api/mep',
          name: 'mep',
          component: () => import('../pages/abilityCenter/AbilityHome.vue'),
          meta: {
            id: '3.2.1'
          }
        },
        {
          path: 'mecDeveloper/api/mep/serviceDoc',
          name: 'serviceDoc',
          component: () => import('../pages/abilityCenter/ServiceDoc.vue'),
          props: true,
          meta: {
            id: '3.2.1'
          }
        },
        {
          path: 'mecDeveloper/api/mep/apiAmulator',
          name: 'apiAmulator',
          component: () => import('../pages/abilityCenter/ApiAmulator.vue'),
          props: true,
          meta: {
            id: '3.2.1'
          }
        },
        {
          path: 'mecDeveloper/api/mep/ascend',
          name: 'ascend',
          component: () => import('../pages/abilityCenter/Ascend.vue'),
          meta: {
            id: '3.2.1'
          }
        },
        {
          path: '/mecDeveloper/work',
          name: 'workspace',
          component: () => import('../pages/workspace/Index.vue'),
          meta: {
            id: '3.5'
          }
        },
        {
          path: '/mecDeveloper/projectType',
          name: 'selectProjectType',
          component: () => import('../pages/workspace/SelectProjectType.vue'),
          meta: {
            id: '3.5.1'
          }
        },
        {
          path: '/mecDeveloper/work/detail',
          name: 'appDetail',
          component: () => import('../pages/workspace/AppDetail.vue'),
          meta: {
            id: '3.6'
          }
        },
        {
          path: '/mecDeveloper/system/mep',
          name: 'systemProject',
          component: () => import('../pages/system/MepList.vue'),
          meta: {
            id: '3.8'
          }
        },
        {
          path: '/mecDeveloper/system/host',
          name: 'systemHost',
          component: () => import('../pages/system/HostList.vue'),
          meta: {
            id: '3.9'
          }
        },
        {
          path: '/mecDeveloper/system/imagemgmt',
          name: 'systemImage',
          component: () => import('../pages/system/imagemgmt/Index.vue'),
          meta: {
            id: '3.10'
          }
        },
        {
          path: '/mecDeveloper/system/profilemgmt',
          name: 'profileMgmt',
          component: () => import('../pages/system/profileMgmt/profileList.vue'),
          meta: {
            id: '3.11'
          }
        },
        {
          path: '/mecDeveloper/toolbox/appedit',
          name: 'applicationEditor',
          component: () => import('../pages/toolBox/applicationEditor/Index.vue'),
          meta: {
            id: '3.12'
          }
        }
      ]
    }
  ],
  scrollBehavior (to, from, savedPosition) {
    return {
      x: 0,
      y: 0
    }
  }
})


<|start_filename|>edgegallery-fe/src/navdata/mecmNav.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
import { NAV_PRE } from '../constants'

const pathPre = NAV_PRE.MECM

const mecmNavData = [
  {
    'id': '3.1',
    'icon': '',
    'name': 'Overview',
    'path': pathPre + '/',
    'pageId': '2.0',
    'display': false
  },
  {
    'id': '3.2',
    'name': 'APP Management',
    'path': pathPre + '/app/pakage',
    'pageId': '2.0.1',
    'display': false,
    'children': [
      {
        'id': '3.3',
        'name': 'Package Management',
        'path': pathPre + '/mecm/app/package',
        'pageId': '2.0.1.1',
        'display': false
      },
      {
        'id': '3.5',
        'name': 'App Instance List',
        'path': pathPre + '/mecm/app/instance',
        'pageId': '2.0.1.3',
        'display': false
      }
    ]
  },
  {
    'id': '3.6',
    'name': 'Edge Nodes',
    'path': pathPre + '/mecm/node/index',
    'pageId': '2.0.2',
    'display': false
  },
  {
    'id': '3.9',
    'name': 'Systems',
    'path': pathPre + '/systems',
    'pageId': '2.0.3',
    'display': false,
    'children': [
      {
        'id': '3.11',
        'name': 'MEPM',
        'path': pathPre + '/mecm/system/mepm',
        'pageId': '2.0.3.1.1',
        'display': false
      },
      {
        'id': '3.12',
        'name': 'App Store',
        'path': pathPre + '/mecm/system/appstore',
        'pageId': '2.0.3.1.3',
        'display': false
      }
    ]
  }
]

export {
  mecmNavData
}


<|start_filename|>src/assets/css/common.css<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
@font-face
{
  font-family: defaultFont;
  src: url(../fonts/Harmony-Regular.ttf);
}
@font-face
{
  font-family: defaultFontBlod;
  src: url(../fonts/Harmony-SemiBold.ttf);
}
@font-face {
  font-family: defaultFontUltraLight;
  src: url(../fonts/Harmony-UltraLight.ttf);
}

@font-face {
  font-family: defaultFontLight;
  src: url(../fonts/Harmony-Light.ttf);
}
html,body,div,p,h1,h2,h3,h4,h5,h6,ul,li,button,span,a{
  margin:0;
  padding:0;
  box-sizing: border-box;
}
.defaultFont button{
  font-family:defaultFont, Arial, Helvetica, sans-serif;
}
.defaultFont{
  font-family:defaultFont, Arial, Helvetica, sans-serif;
}
.defaultFontBlod{
  font-family:defaultFontBlod, Arial, Helvetica, sans-serif;
}
.fontUltraLight {
  font-family: defaultFontUltraLight,
    Arial,
    Helvetica,
    sans-serif !important;
}

.defaultFontLight {
  font-family: defaultFontLight,
    Arial,
    Helvetica,
    sans-serif !important;
}

.defaultFontLight button {
  font-family: defaultFontLight,
    Arial,
    Helvetica,
    sans-serif !important;
}

html,body{
  min-width: 1200px;
  height:100%;
  font-size: 14px;
}
a{
  color: #688ef3;
  text-decoration: none;
}
.markdown-body{
  font-family: defaultFont, Arial, Helvetica, sans-serif !important;
}
.markdown-body a{
  color: #688ef3 !important;
}
li{
  list-style: none;
}
.lt{
  float: left;
}
.rt{
  float: right;
}
.clearfix{
  clear: both;
}
.breadcrumb{
  height:50px;
  line-height: 50px;
}
.pageBar{
  float:right;
  margin-top:25px;
}
.error{
  color:#F56C6C;
}
.success{
  color:#67C23A;
}
.wait{
  color:#E6A23C;
}
.primary{
  color:#688ef3;
}
.Running{
  color:#688ef3;
}
.mt20{
  margin-top:20px;
}
.el-button.mt20{
  margin-top:20px;
}
.ml10{
  margin-left: 10px;
}
.tit_gray_bg{
  font-size: 16px;
  background: #f0f0f0;
  padding: 10px;
  margin-bottom: 15px;
}
.flex{
  display: flex
}
.h100{
  height: 100%;
}
.cp, .curp{
  cursor: pointer;
}
.el-button.linearGradient{
  background-image: linear-gradient(127deg, #54aaf3, #53dabd);
  border: none;
}
.el-button.linearGradient span{
  position: relative;
  z-index: 2;
}
.el-button.linearGradient::after {
  content: '';
  width: 86%;
  height: 100%;
  position: absolute;
  right: 7%;
  bottom: -10px;
  background: inherit;
  filter: blur(0.65rem);
  opacity: 0.7;
  z-index: 1;
}
.el-button.linearGradient2{
  background-image: linear-gradient(127deg, #4444d0, #6724cb);
  border: none;
}
.el-button.linearGradient2 span{
  position: relative;
  z-index: 2;
}
.el-button.linearGradient2::after {
  content: '';
  width: 86%;
  height: 100%;
  position: absolute;
  right: 7%;
  bottom: -10px;
  background: inherit;
  filter: blur(0.65rem);
  opacity: 0.7;
  z-index: 1;
}
.el-button.linearGradient2:active{
  background-image: linear-gradient(127deg, #4a4aac, #6724cb);
  border: none;
}
.el-button.defaultBtn{
  background: #5844be;
  border: none;
}
.el-button.defaultBtn:active{
  background: #544295;
  border: none;
}
.el-button.featuresBtn{
  font-size: 14px !important;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background: #8a75d5 !important;
  border: none;
  color: #ffffff !important;
  box-shadow: 0 0 29px rgba(36,20,119,0.13) inset;
}
.el-button.featuresBtn.is-disabled{
  color: #ededed !important;
  background: #bdb9cf !important;
}
.el-tabs__active-bar{
  background-color: #688ef3;
}
.el-button.editBtn{
  color: #7597f4;
}
.el-button.deleteBtn{
  color: #f67878;
}
.el-button.bgBtn{
  background-color: #5844be;
  border: none;
  color: #fff;
  border-radius: 10px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
}
.el-button.confirm{
  background: #688ef3;
  color: #fff;
}
.el-button.cancel{
  border: 1px solid #688ef3;
  color: #688ef3;
}
.el-button.p8{
  padding: 8px 12px;
}
.el-button{
  padding: 8px 24px;
}
.el-button.el-button--text{
  padding: 0px;
}
.el-dialog__header{
  background: #688ef3 !important;
}
.half{
  float: left;
  width: 50% !important;
}
.default_dialog .el-dialog{
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background: #efefef;
  border-radius: 12px;
}
.default_dialog .el-table{
  border-radius: 6px;
}
.default_dialog .el-dialog__body{
  padding: 0 80px 0 !important;
}
.default_dialog .el-dialog__header{
  background: #efefef !important;
  border-radius: 12px 12px 0 0;
  padding: 40px 40px 20px 40px;
}
.default_dialog .el-dialog .el-dialog__title{
  color: #380879 !important;
  font-size: 20px;
}
.default_dialog .el-form-item{
  width: 100%;
}
.default_dialog .el-dialog .el-form-item__label{
  height: 32px !important;
  line-height: 32px !important;
  color: #380879;
  font-size: 16px;
}
.default_dialog .el-dialog .el-input__inner,.default_dialog .el-dialog .el-textarea__inner{
  border: none  !important;
  border-radius: 8px !important;
}
.default_dialog .title_icon{
  display: inline-block;
  width: 17px;
  height: 17px;
  border-radius: 3px;
  background-image: linear-gradient(45deg, #72dcc8, #c0e8e0);
  margin-right: 20px;
  position: relative;
  top: 2px;
}
.default_dialog .el-dialog__close{
  display: none;
}
.el-dialog--center .el-dialog__header{
  text-align: left;
}
.default_radio .el-radio__inner::after{
  width: 8px;
  height: 8px;
  background: #ceccdc;
  border-radius: 50%;
  transform: translate(-50%, -50%) scale(1);
}
.default_radio .el-radio__input.is-checked .el-radio__inner::after{
  background: #55d8bf;
}
.default_radio .el-radio__inner{
  width: 18px;
  height: 18px;
  border-color: #5844be;
}
.default_radio .el-radio__input.is-checked .el-radio__inner{
  background: none;
  border-color: #5844be;
}
.default_radio .el-radio__label{
  color: #380879;
  font-size: 16px;
}
.default_radio .el-radio__input.is-checked + .el-radio__label{
  color: #380879;
}
.el-icon-warning{
  color: #688ef3;
  margin:0 5px 0 10px;
  font-size: 14px;
}
div::-webkit-scrollbar{
  width: 8px;
  height: 12px;
}
div::-webkit-scrollbar-thumb{
  border-radius: 10px;
  background: rgba(0,0,0,0.2);
}
body::-webkit-scrollbar{
  width: 8px;
  height: 12px;
}
body::-webkit-scrollbar-thumb{
  border-radius: 10px;
  background: rgba(0,0,0,0.2);
}
.el-upload-list{
  float: left;
  width: 100%;
  text-align: left;
}
.el-upload-list__item{
  width: 25%;
  min-width: 200px;
}
.el-select-dropdown__list {
  padding: 0px 0 !important;
}
.el-form-item .el-form-item__content{
  line-height:30px;
}
.el-form-item--small .el-form-item__content{
  line-height:32px;
}
.el-form-item--mini .el-form-item__content{
  line-height: 28px;
}

.padding_default{
  padding: 0 13%;
}
.footer_top{
  padding-bottom: 100px !important;
}
.title_left{
  margin-left: 140px;
  font-size: 36px;
  color: #5d3da0;
}
.line_bot1{
  display: block;
  width: 88px;
  height: 7px;
  border-radius: 4px;
  background: rgba(158, 123, 205, 0.2);
  margin-top: 15px;
  flex-shrink: 0;
}
.line_bot2{
  display: block;
  width: 88px;
  height: 7px;
  border-radius: 4px;
  background: rgba(83, 205, 204, 0.2);
  margin-top: 15px;
  flex-shrink: 0;
}
.title_top{
  padding: 80px 0 60px !important;
  position: relative;
}
.title_top_home{
  padding-top: 150px !important;
  position: relative;
}
.el-menu--horizontal > .el-menu-item.is-active,
.main-sidebar .el-menu.el-menu--horizontal .el-menu-item:not(.is-disabled):hover,
.el-menu--horizontal > .el-submenu.is-active .el-submenu__title,
.main-sidebar .el-menu--horizontal > .el-submenu .el-submenu__title:hover{
  border-bottom: none !important;
}

.el-menu--horizontal > .el-menu-item,.el-menu--horizontal > .el-menu-item:hover{
  border-bottom: none;
}
.el-menu--horizontal > .el-submenu{
  position: relative;
}
.el-menu--horizontal > .el-menu-item:after,.el-menu--horizontal > .el-submenu:after{
  content:'';
  position:absolute;
  border-bottom:2px solid #61cdd0;
  left: 50%;
  bottom: 0;
  width: 0%;
  transition:all 0.5s;
}
.el-menu--horizontal > .el-menu-item:hover:after,.el-menu--horizontal > .el-submenu:hover:after{
  content:'';
  position:absolute;
  border-bottom:2px solid #61cdd0;
  left: 40%;
  width: 25%;
  transform: scale(4,1);
}
.el-menu--horizontal > .el-menu-item.is-active:after,.el-menu--horizontal > .el-submenu.is-active:after{
  left: 0;
  width: 100%;
  border-bottom:2px solid #61cdd0;
}
.el-menu--horizontal > .el-menu-item.is-active:hover:after,.el-menu--horizontal > .el-submenu.is-active:hover:after{
  left: 0;
  width: 100%;
  border-bottom:2px solid #61cdd0;
  transform: scale(1);
}
@media screen and (max-width:1600px){
  .padding_default{
    padding: 0 6.5%;
  }
}
@media screen and (min-width: 1201px) { 
  .monitor {max-width: 1200px} 
} 
@media screen and (max-width: 1200px) { 
  .monitor {max-width: 900px} 
}

/* dialog */
.el-dialog__body{
  padding-top:15px!important;
  padding-bottom:30px!important;
}
.el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close,.el-dialog__title,.el-dialog__headerbtn .el-dialog__close{
  color:#fff!important;
}
.dialog-footer{
  text-align: right;
  padding-right: 60px !important;
}
.center{
  text-align: center;
  padding-right: 0 !important;
}
.uploader-btn{
  font-size: 14px!important;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  background: #a59fc9!important;
  border: 0px !important;
  color: #fff!important;
}
.uploader-file-remove{
  display: none !important;
}
.uploader {
  padding-top: 20px;
  text-align: center;
}
.uploader-list {
  padding-top: 10px;
}
.cancel_upload{
  z-index: 100;
  position: absolute;
  top: 10px;
  right: 0px;
  height: 48px;
  width: 100px;
}
.cancel_upload_btn{
  height: 48px;
}
.uploader-file-name{
  width: 30% !important;
}
.uploader-file-status{
  width: 20%;
}
.prompt_nofile{
  margin-top: 10px;
  font-size: 14px;
  color: #380879;
}
/* navBar */
.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{
  margin-top:3px;
}
.el-submenu__icon-arrow{
  margin-top:-3px;
}

.el-message{
  top: 65px !important;
}

body .el-table th.gutter{
  display: table-cell !important;
}

.bread-crumb{
  height: 70px;
  line-height: 70px !important;
  font-size: 14px;
}
.clear:after{
  content: '';
  display: block;
  clear: both;
}
.swagger-ui .info .url{
  display: none;
}
.v-note-wrapper{
  z-index: 1 !important;
  border: none !important;
}
.tableStyle.el-table,.tableStyle .el-table__body-wrapper{
  overflow: visible;
}
.tableStyle.el-table tbody tr:hover>td { 
  background-color:#ffffff!important;
}
.tableStyle.el-table th{
  background: #edeef8;
  font-size: 18px;
  color: #62517a;
  font-weight: normal;
}
.el-table__header-wrapper{
  border-radius: 8px;
}
.tableStyle.el-table .cell {
  padding: 0 0 0 30px !important;
  overflow: visible;
}
.tableStyle.el-table tbody td {
  border-bottom: 2px solid #f5eeff;
  padding: 10px 0 !important;
}
.tableStyle.el-table .cell.el-tooltip{
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  word-break: break-all;
}
.tableStyle.el-table .el-button{
  margin-bottom: 5px;
  margin-right: 5px !important;
}
.tableStyle.el-table .el-button + .el-button{
  margin-left: 0;
}
.tableStyle_en.el-table th > .cell{
  font-size: 16px !important;
}
.el-button.operations_btn{
  background: #efefef;
  padding: 5px 15px;
  border: none;
  position: relative;
}
.el-button.operations_btn .el-button{
  margin-right: 0px!important;
}
.el-button.operations_btn .el-button--text,.el-button--text:focus, .el-button--text:hover{
  color:#606266;
}
.el-button.is-disabled, .el-button.is-disabled:focus, .el-button.is-disabled:hover{
  color: #c0c4cc !important;
  background: #efefef;
}

/* el-pagination */
.el-pager li{
  min-width: 24px !important;
  color: #62517a;
  margin: 0 2px;
}
.el-pager li.active{
  color: #6b5b81;
}
.el-pager li:not(.disabled).active {
  background-color: #5844be !important;
  color: #fff;
  border-radius: 50%;
}
.el-pagination__jump{
  display: none !important;
}
.el-pagination__total{
  float: right;
  margin: 0 0 0 10px;
}
.el-pagination__sizes .el-select .el-input{
  width: 82px;
}
.el-icon-arrow-up:before{
  font-size: 16px;
  position: relative;
}
.el-select .el-input.is-focus .el-input__inner,.el-pagination__sizes .el-input .el-input__inner:hover{
  border-color: #b2b2b2 !important;
}
.el-select-dropdown__item.selected{
  color: #380879 !important;
}
.el-textarea .el-textarea__inner{
  min-height: 80px !important;
}
.el-table .sort-caret.descending{
  border-top-color: #b5e8e9;
  bottom: 4px;
}
.el-table .descending .sort-caret.descending{
  border-top-color: #61cdd0;
}
.el-table .sort-caret.ascending{
  border-bottom-color: #b5e8e9;
  top: 4px;
}
.el-table .ascending .sort-caret.ascending{
  border-bottom-color: #61cdd0;
}
.el-table .sort-caret{
  border: solid 6px transparent;
}
.default_dropdown .el-table__column-filter-trigger i{
  font-size: 16px;
  transform: scale(1.0);
  margin-left: 8px;
}
.default_dropdown .el-icon-arrow-down:before{
  color: #61cdd0;
  background: url('../images/table_filter_down.png') center center no-repeat;
}
.el-table-filter{
  box-shadow: none;
  border: none;
  margin: 15px 0 2px;
  background: url('../images/table_filter_content_up.png') 80% 0 no-repeat;
  padding-top: 6px;
}
.el-table-filter .el-table-filter__content{
  background-color: #edeef8;
  border-radius: 6px 6px 0 0;
}
.el-table-filter .el-table-filter__content .el-checkbox__inner{
  border: 1px solid #c8c8e0;
  background: none;
  border-radius: 3px;
}
.el-table-filter .el-table-filter__content .el-checkbox__label{
  color: #abaecb;
}
.el-table-filter .el-table-filter__content .is-checked .el-checkbox__inner{
  border: 1px solid #a19aac;
  background: none;
}
.el-table-filter .el-table-filter__content .is-checked .el-checkbox__label,.el-table-filter .el-table-filter__content .el-checkbox__label:hover{
  color: #62517a;
}
.el-checkbox__input.is-checked .el-checkbox__inner::after{
  width: 7px;
  height: 7px;
  left: 2.5px;
  top: 2.5px;
  border: none;
  background: #61cdd0;
  border-radius: 50%;
  transform: rotate(0deg);
}
.el-table-filter .el-table-filter__bottom{
  background-color: #edeef8;
  border-radius: 0 0 6px 6px;
  border-top: 1px solid #fff;
}
.el-table-filter__bottom button:hover{
  color: #5e40c8;
}
.el-table-filter__bottom button.is-disabled,.el-table-filter__bottom button.is-disabled:hover{
  color: #abaecb;
}
.el-table th>.cell.highlight{
  color: #5e40c8;
}
.btn_div{
  position: absolute;
  right: 0;
  top: 18px;
  border-radius: 5px 5px 0 0;
  z-index: 2;
}
.dropdown_list li{
  height: 25px;
  line-height: 25px;
  border-bottom: 1px solid #e7e7e7;
  background: #efefef;
  padding: 0 15px;
  color: #7a6e8a;
  position: relative;
}
.dropdown_list li em{
  display: inline-block;
  width: 1px;
  position: absolute;
  top: 10px;
  left: 1px;
  transition:all 0.6s;
}
.dropdown_list li:first-child{
  border-radius: 5px 5px 0 0;
}
.dropdown_list li:last-child{
  border-bottom: none;
  border-radius: 0 0 5px 5px;
}
.dropdown_list li:hover{
  color: #7a6e8a;
}
.dropdown_list li:hover em{
  background: #61cdd0;
  height: 7px;
  transform: scale(1,2);
}
.dropdown_list li.disabled,.dropdown_list li.disabled:hover{
  color: #bcb9c1;
  cursor: default;
}
.btn_div.el-icon-caret-top:before{
  color: #efefef;
  top: 5px;
  left: 10px;
  position: relative;
}
.search_input{
  width: 215px;
}
.search_input .el-input__inner{
  border-radius: 8px;
  border-color: #5e40c8;
  height: 30px;
  line-height: 30px;
}
.search_input .search_icon{
  display: inline-block;
  width: 15px;
  height: 15px;
  background: url('../images/work_project_search_icon.png');
  position: absolute;
  top: 8px;
  right: 5px;
  cursor: pointer;
}
.default_info_promt{
  display: inline-block;
  width: 16px;
  height: 16px;
  line-height: 14px;
  text-align: center;
  color: #ffffff;
  font-size: 12px;
  background: #5844be;
  border-radius: 50%;
  margin-left: 10px;
}
.empty_img{
  background: url('../images/empty.png') center 10px no-repeat;
  padding-top: 200px;
}
.el-popover{
  max-width: 40%;
  left: 30%;
}

<|start_filename|>src/tools/api.js<|end_filename|>
/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import { Get, Delete, Put, Post, urlPrefix, urlPrefixTool, downloadFile, GetFun } from './tool.js'
import axios from 'axios'

let Plugin = {
  // Get the list of plugins
  getPluginListApi: function (limitSize, offsetPage, inputPluginName, selectCodeLanguage) {
    return Get('mec/developer/v1/plugins/?pluginType=1&limit=' + limitSize + '&offset=' + offsetPage + '&pluginName=' + inputPluginName + '&codeLanguage=' + selectCodeLanguage)
  },
  // Get plugin icon
  getImageUrlApi: function (pluginId) {
    return urlPrefix + 'mec/developer/v1/plugins/' + pluginId + '/action/get-logofile'
  },
  // Get plugin download path
  getDownloadUrlApi: function (pluginId) {
    return urlPrefix + 'mec/developer/v1/plugins/' + pluginId + '/action/download'
  },
  // Remove plugin
  deletePluginApi: function (pluginId, userId) {
    return Delete('mec/developer/v1/plugins/' + pluginId + '?userId=' + userId)
  },
  // Rate the plugin
  ratePluginApi: function (rateId, valueRate, userId, userName) {
    return Put('mec/developer/v1/plugins/' + rateId + '/action/score?score=' + valueRate + '&userId=' + userId + '&userName=' + userName)
  },
  // Upload plugin
  uploadPluginApi: function (params) {
    return Post('mec/developer/v1/plugins/', params)
  },
  // Get Plugin Detail Document
  getDetailDocsApi: function (pluginId) {
    return Get('mec/developer/v1/plugins/' + pluginId + '/action/content')
  },
  // Get the uploaded source code
  getSourceCodeApi: function (userId, type) {
    return Get('mec/toolchain/v1/porting/' + userId, '', type)
  },
  // Delete source code
  deleteSourceCodeApi: function (userId, type) {
    return Delete('mec/toolchain/v1/porting/' + userId, '', type)
  },
  // Upload source code
  uploadSourceCodeApi: function (userId, params, type) {
    return Post('mec/toolchain/v1/porting/' + userId, params, type)
  },
  // Analyze the source code
  analysisCodeApi: function (userId, params, type) {
    return Post('mec/toolchain/v1/porting/' + userId + '/tasks', params, type)
  },
  // Get a list of scan tasks
  getScanTaskApi: function (userId, type) {
    return Get('mec/toolchain/v1/porting/' + userId + '/tasks', '', type)
  },
  // Download report
  downLoadReportApi: function (userId, reportId) {
    return urlPrefixTool + 'mec/toolchain/v1/porting/' + userId + '/tasks/' + reportId + '/download'
  },
  // Delete report
  deleteReportApi: function (userId, reportId, type) {
    return Delete('mec/toolchain/v1/porting/' + userId + '/tasks/' + reportId, '', type)
  },
  // Get single report information
  getTaskInformationApi: function (userId, reportId, type) {
    return Get('mec/toolchain/v1/porting/' + userId + '/tasks/' + reportId, '', type)
  }
}

let Api = {
  // ObtainMepService list
  getMepServiceApi: function () {
    return Get('mec/developer/v2/capability-groups/openmep-api')
  },
  // ObtainMEP-EcoService list
  getMepEcoServiceApi: function () {
    return Get('mec/developer/v2/capability-groups/openmepeco-api')
  },
  // Get a list of services
  getServiceApi: function (type) {
    return Get('mec/developer/v1/query/capability-groups/type/' + type)
  },
  // ObtainApi-swaggerUIpath
  getSwaggerUrlApi: function (apiFileId) {
    return urlPrefix + 'mec/developer/v2/upload-files/' + apiFileId + '/action/get-file-stream'
  },
  // SDKdownload
  downloadSDKApi: function (fileId, lan) {
    return urlPrefix + 'mec/developer/v1/files/sdk/' + fileId + '/download/' + lan
  },
  // Delete publicAPI
  deletePublicApi: function (capabilityId, userId) {
    return Delete('mec/developer/v1/capabilities/' + capabilityId + '?userId=' + userId)
  }
}

let Capability = {
  getCapabilityByNameWithFuzzy: function (params) {
    return Get('mec/developer/v2/query/capabilities/name', params)
  },
  getCapabilityByNameEnWithFuzzy: function (params) {
    return Get('mec/developer/v2/query/capabilities/name-en', params)
  },
  createCapability: function (capability) {
    return Post('mec/developer/v2/capabilities', capability)
  },
  editCapability: function (capabilityId, capability) {
    return Put('mec/developer/v2/capabilities/' + capabilityId, capability)
  },
  deleteCapabilityById: function (id) {
    return Delete('mec/developer/v2/capabilities/' + id)
  },
  getAllCapability: function () {
    return Get('mec/developer/v2/query/capabilities/type/OPENMEP')
  },
  getCapabilityByGroupId: function (groupId) {
    return Get('mec/developer/v2/query/capabilities/group-id/' + groupId)
  },
  getCapabilityById: function (id) {
    return Get('mec/developer/v2/capabilities/' + id)
  },
  getCapabilityByProjectId: function (projectId) {
    return Get('mec/developer/v2/query/capabilities/project-id/' + projectId)
  },
  getAllCapabilityGroup: function () {
    return Get('mec/developer/v2/query/capability-groups/type/OPENMEP')
  },
  getCapabilityGroupByType: function (type) {
    return Get('mec/developer/v2/query/capability-groups/type/' + type)
  },
  getCapabilityGroupStats: function () {
    return Get('mec/developer/v2/query/capability-group-stats/type/OPENMEP')
  },
  getCapabilityGroupById: function (groupId) {
    return Get('mec/developer/v2/capability-groups/' + groupId)
  },
  getStandardCapabilities: function () {
    return Get('mec/developer/v2/query/capabilities/type/STANDARD')
  }
}

let Test = {
  // Upload applicationAPP
  uploadAppApi: function (params) {
    return Post('mec/developer/v1/apps/', params)
  },
  // Start the test task after uploading successfully
  startTestApi: function (appId, userId) {
    return Get('mec/developer/v1/apps/' + appId + '/action/start-test?userId=' + userId)
  },
  // Get a list of test tasks
  getTaskListApi: function (userId, params) {
    return Get('mec/developer/v1/apps/?userId=' + userId, params)
  },
  // Get test subtask
  getSubTaskApi: function (appId, taskId) {
    return Get('mec/developer/v1/apps/' + appId + '/task/' + taskId + '/subtasks')
  },
  // Upload toAppStore
  uploadTaskApi: function (appId, userId, userName) {
    return Post('mec/developer/v1/apps/' + appId + '/action/upload?userId=' + userId + '&userName=' + userName, '')
  }
}

let System = {
  deleteHost: function (mephostId) {
    return Delete(`mec/developer/v2/mephosts/${mephostId}`)
  },
  deleteService: function (params) {
    return Delete('mec/developer/v1/capabilities', params)
  },
  getLogData: function (hostId) {
    return Get(`mec/developer/v2/mephosts/${hostId}/logs`)
  },
  saveHostInfo: function (params) {
    const func = params.id ? Put : Post
    const path = params.id ? `mec/developer/v2/mephosts/${params.id}` : 'mec/developer/v2/mephosts'
    const data = { ...params }
    return func(path, data)
  },
  saveService: function (params) {
    const func = Post
    const path = 'mec/developer/v1/capabilities'
    return func(path, params)
  },
  saveCapabilityGroup: function (params) {
    const func = Post
    const path = 'mec/developer/v2/capability-groups'
    return func(path, params)
  },
  getHosts: function (params) {
    return Get('mec/developer/v2/mephosts', params)
  },
  getSerives: function (params) {
    return Get('mec/developer/v2/capabilities', params)
  },
  getFileInfo: function (fileId) {
    return Get('mec/developer/v2/upload-files/' + fileId)
  }
}

let Workspace = {
  // Test and save the node information in the details
  saveNodeInfo: function (userId, params) {
    const { ip, port } = params
    const func = params.hostId ? Put : Post
    const path = params.hostId ? `mec/developer/v1/hosts/${params.hostId}/?userId=${userId}` : `mec/developer/v1/hosts/?userId=${userId}`
    const data = { architecture: 'X86', userId, status: 'NORMAL', ip, port, name: ip, address: ip }
    return func(path, data)
  },
  // Get node information in details
  getNodeInfo: function (userId) {
    return Get('mec/developer/v1/hosts?userId=' + userId)
  },
  // Get a list of items
  getProjectListApi: function (userId, params) {
    return Get('mec/developer/v1/projects/?userId=' + userId, params)
  },
  // Get the project icon
  getIconApi: function (fileId, userId) {
    return urlPrefix + 'mec/developer/v1/files/' + fileId + '?userId=' + userId + '&type=OPENMEP_ECO'
  },
  getCapabilityIconApi: function (fileId) {
    return urlPrefix + 'mec/developer/v2/upload-files/' + fileId + '/action/get-file-stream'
  },
  getServiceIconApi: function (fileId, userId) {
    return urlPrefix + 'mec/developer/v1/files/' + fileId + '?userId=' + userId + '&type=OPENMEP'
  },
  // Delete item
  deleteProjectApi: function (itemId, userId) {
    return Delete('mec/developer/v1/projects/' + itemId + '?userId=' + userId)
  },
  // Staging icon generation iconID
  postIconFileIdApi: function (userId, params) {
    return Post('mec/developer/v1/files?userId=' + userId, params)
  },
  // Get a list of capabilities details services
  getServiceListApi: function (groupId) {
    return Get('mec/developer/v2/capability-groups/' + groupId)
  },
  // Download sample code
  getSampleCodeApi: function (apiFileIdArr) {
    let params = {
      url: 'mec/developer/v1/files/samplecode',
      params: apiFileIdArr
    }
    return downloadFile(params)
  },
  // Get sample code structure
  getSampleListApi: function (apiFileIdArr) {
    return Post('mec/developer/v1/files/samplecode/get-pkg-structure', apiFileIdArr)
  },
  // Get sample code content
  getSampleContentApi: function (fileName) {
    return Get('mec/developer/v1/files/samplecode/get-file-content?fileName=' + fileName)
  },
  // New/Migration project
  newProjectApi: function (userId, params) {
    return Post('mec/developer/v1/projects/?userId=' + userId, params)
  },
  // Edit/Migration project
  editProjectApi: function (projectId, userId, params) {
    return Put('mec/developer/v1/projects/' + projectId + '?userId=' + userId, params)
  },
  // ObtainApiofswaggerUIpath
  getApiUrl: function (apiFileId, userId, type) {
    return urlPrefix + 'mec/developer/v1/files/' + apiFileId + '?userId=' + userId + '&type=' + type
  },
  // Get the previously submitted configuration
  getTestConfigApi: function (projectId) {
    return Get('mec/developer/v1/projects/' + projectId + '/test-config')
  },
  // Refresh the deployment status result
  refreshDeployStatusApi: function (projectId) {
    return Get('mec/developer/v1/projects/' + projectId + '/container/workStatus')
  },
  // Upload configuration
  postTestConfigApi: function (projectId, userId, params) {
    return Post('mec/developer/v1/projects/' + projectId + '/test-config?userId=' + userId, params)
  },
  // Change setting
  putTestConfigApi: function (projectId, userId, params) {
    return Put('mec/developer/v1/projects/' + projectId + '/test-config?userId=' + userId, params)
  },
  // Save the visualization configuration
  /* postConfigVisualApi: function (projectId, userId, params, configType) {
    return Post('mec/developer/v1/deploy/' + projectId + '?userId=' + userId + '&configType=' + configType, params)
  }, */
  postConfigVisualApi: function (projectId, userId, params, configType) {
    return Post('mec/developer/v1/deploy/' + projectId + '/action/save-yaml?userId=' + userId + '&configType=' + configType, params)
  },
  // Obtain the generated visualization configuration file
  getConfigVisualApi: function (fileId) {
    return Get('mec/developer/v1/deploy/' + fileId)
  },
  // Echo the generated visualization configuration file
  getEchoConfigFileApi: function (fileId) {
    return Get('mec/developer/v1/deploy/' + fileId + '/action/get-json')
  },
  // Edit the generated visualization configuration file
  editConfigVisualApi: function (fileId, params) {
    return Put('mec/developer/v1/deploy/' + fileId, params)
  },
  // Deploy build test
  deployTestApi: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/action/deploy?userId=' + userId, '')
  },
  // Terminate deployment
  terminateProjectAPI: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/action/terminate?userId=' + userId, '')
  },
  // Empty the test environment
  cleanTestEnvApi: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/action/clean?userId=' + userId, '')
  },
  // Add mirror
  addImageNameApi: function (projectId, params) {
    return Post('mec/developer/v1/projects/' + projectId + '/image', params)
  },
  // Delete mirror
  deleteImageNameApi: function (projectId, itemId) {
    return Delete('mec/developer/v1/projects/' + projectId + '/image/' + itemId)
  },
  // Uploadyamlfile
  submitYamlFileApi: function (userId, projectId, params, configType) {
    return Post('mec/developer/v1/files/helm-template-yaml?userId=' + userId + '&projectId=' + projectId + '&configType=' + configType, params)
  },
  // UploadApifile
  submitApiFileApi: function (userId, params) {
    return Post('mec/developer/v1/files?userId=' + userId, params)
  },
  // UploadConfigFile
  submitConfigFileApi: function (params) {
    return Post('mec/developer/v2/mephosts/action/upload-config-file', params)
  },
  // Get uploadedApifile
  getApiFileApi: function (appApiFileId, userId) {
    return Get('mec/developer/v1/files/api-info/' + appApiFileId + '?userId=' + userId)
  },
  // Get the added image
  getImageApi: function (projectId, params) {
    return Get('mec/developer/v1/projects/' + projectId + '/image', params)
  },
  // Get uploadedyamlfile
  getYamlFileApi: function (userId, projectId) {
    return Get('mec/developer/v1/files/helm-template-yaml?userId=' + userId + '&projectId=' + projectId)
  },
  // Delete uploadedyamlfile
  deleteYamlFileApi: function (fileId) {
    return Delete('mec/developer/v1/files/helm-template-yaml?fileId=' + fileId)
  },
  // Get server list
  getHostsApi: function () {
    return Get('mec/developer/v1/hosts')
  },
  // Get project information
  getProjectInfoApi: function (projectId, userId) {
    return Get('mec/developer/v1/projects/' + projectId + '?userId=' + userId)
  },
  // ObtaincsarPackage structure
  getAppPackageListApi: function (projectId, csarId) {
    return Get('mec/developer/v1/apprelease/' + projectId + '/' + csarId + '/action/get-pkg-structure')
  },
  // ObtaincsarPackage file content
  getAppFileApi: function (projectId, fileName) {
    return GetFun('mec/developer/v1/apprelease/' + projectId + '/' + 'action/get-pkg-content?fileName=' + fileName)
  },
  // Get rule configuration
  getReleaseConfigApi (projectId) {
    return Get('mec/developer/v1/releaseconfig/' + projectId + '/action/release-config')
  },
  // save/Modify rule configuration
  saveRuleConfig (projectId, params, releaseId) {
    let method = releaseId ? Put : Post
    return method('mec/developer/v1/releaseconfig/' + projectId + '/action/release-config', params)
  },
  // Application test
  getAtpTestApi: function (projectId, userId) {
    return Get('mec/developer/v1/projects/' + projectId + '/action/atp?userId=' + userId)
  },
  // Upload application release details
  PostReleaseApi: function (projectId, params) {
    return Post('mec/developer/v1/releaseconfig/' + projectId + '/action/release-config', params)
  },
  // Get app release details
  getReleaseApi: function (projectId) {
    return Get('mec/developer/v1/releaseconfig/' + projectId + '/action/release-config')
  },
  // Modify app release details
  PutReleaseApi: function (projectId, params) {
    return Put('mec/developer/v1/releaseconfig/' + projectId + '/action/release-config', params)
  },
  // releaseAPPToAppstore
  isPublishApi: function (projectId, userId, userName, param) {
    return Post('mec/developer/v1/projects/' + projectId + '/action/upload?userId=' + userId + '&userName=' + userName, param)
  },
  // publicAPPofAPIability
  isPublicApi: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/action/open-api?userId=' + userId, '')
  }

}

let vmService = {
  getProjectVmResList: function (projectId, userId) {
    return Get('mec/developer/v1/projects/' + projectId + '/vm?userId=' + userId)
  },
  getVmConfigData: function () {
    return Get('mec/developer/v1/vmconfig')
  },
  applyVmResource: function (projectId, userId, params) {
    return Post('mec/developer/v1/projects/' + projectId + '/vm-package?userId=' + userId, params)
  },
  getApplyVmResourceList: function (projectId, userId) {
    return Get('mec/developer/v1/projects/' + projectId + '/vm-package?userId=' + userId)
  },
  deleteVmResource: function (projectId, userId) {
    return Delete('mec/developer/v1/projects/' + projectId + '/vm-package?userId=' + userId)
  },
  uploadFile: function (projectId, vmId, userId, params) {
    return Post('mec/developer/v1/projects/' + projectId + '/vm/' + vmId + '/files?userId=' + userId, params)
  },
  // Empty the test environment
  cleanTestVmEnvApi: function (projectId) {
    return Post('mec/developer/v1/projects/' + projectId + '/vm/clean')
  },
  // Deployment and commissioning
  vmDeployTestApi: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/vm-create?userId=' + userId)
  },
  // Delete the commissioning result
  deleteVmDeployListApi: function (projectId, vmId, userId) {
    return Delete('mec/developer/v1/projects/' + projectId + '/vm/' + vmId + '?userId=' + userId)
  },
  // Generate mirror
  createVmImageApi: function (projectId, userId) {
    return Post('mec/developer/v1/projects/' + projectId + '/vm/image?userId=' + userId)
  },
  // Get mirror list
  getCreateImageListApi: function (projectId, userId) {
    return Get('mec/developer/v1/projects/' + projectId + '/vm/image?userId=' + userId)
  },
  // Delete mirror
  deleteVmImageApi: function (projectId, userId) {
    return Delete('mec/developer/v1/projects/' + projectId + '/vm/image?userId=' + userId)
  },
  // Download mirror
  downloadVmImageApi: function (projectId, vmId, userId) {
    return urlPrefix + 'mec/developer/v1/projects/' + projectId + '/vm/' + vmId + '/package?userId=' + userId
  }
}

let imageMgmtService = {
  getImageDataList: function (queryData) {
    return Post('mec/developer/v2/vmimages/action/get-list', queryData)
  },
  newImage: function (imgData) {
    return Post('mec/developer/v2/vmimages', imgData)
  },
  modifyImage: function (imgData, id) {
    return Put('mec/developer/v2/vmimages/' + id, imgData)
  },
  deleteImage: function (id) {
    return Delete('mec/developer/v2/vmimages/' + id)
  },
  publishImage: function (id) {
    return Put('mec/developer/v2/vmimages/' + id + '/action/publish')
  },
  resetImageStatus: function (id) {
    return Put('mec/developer/v2/vmimages/' + id + '/action/reset')
  },
  mergeImage: function (id, fileName, identifier) {
    return Get('mec/developer/v2/vmimages/' + id + '/action/merge?fileName=' + fileName + '&identifier=' + identifier)
  },
  cancelUploadImage: function (id, identifier) {
    return Delete('mec/developer/v2/vmimages/' + id + '/action/upload?identifier=' + identifier)
  },
  downloadSystemImageUrl: function (id) {
    return urlPrefix + 'mec/developer/v2/vmimages/' + id + '/action/download'
  },
  slimImage: function (imageId) {
    return Post('mec/developer/v2/vmimages/' + imageId + '/action/slim', '')
  },
  getOperationInfo (operationId) {
    return Get('mec/developer/v2/operations/' + operationId)
  },
  // ContainerImage
  newContainerImage: function (imgData) {
    return Post('mec/developer/v2/containerimages/', imgData)
  },
  deleteContainerImage: function (imageId) {
    return Delete('mec/developer/v2/containerimages/' + imageId)
  },
  modifyContainerImage: function (imgData, imageId) {
    return Put('mec/developer/v2/containerimages/' + imageId, imgData)
  },
  getContainerImageDataList: function (queryData) {
    return Post('mec/developer/v2/containerimages/action/get-all-images', queryData)
  },
  mergeContainerImage: function (imageId, fileName, identifier) {
    return Get('mec/developer/v2/containerimages/' + imageId + '/action/merge?fileName=' + fileName + '&guid=' + identifier)
  },
  downloadContainerImageUrl: function (imageId) {
    return urlPrefix + 'mec/developer/v2/containerimages/' + imageId + '/action/download'
  },
  synchronizeContainerImageApi: function () {
    return GetFun('mec/developer/v2/containerimages/action/synchronize')
  },
  cancelUploadContainerImage: function (imageId) {
    return Delete('mec/developer/v2/containerimages/' + imageId + '/action/upload')
  }
}

let profileMgmtApi = {
  getProfileDataList: function (params) {
    return Get('mec/developer/v2/profiles', params)
  },
  addProfile: function (params) {
    return Post('mec/developer/v2/profiles', params)
  },
  modifyProfile: function (profileId, params) {
    return Put('mec/developer/v2/profiles/' + profileId, params)
  },
  deleteOneProfile: function (profileId) {
    return Delete('mec/developer/v2/profiles/' + profileId)
  },
  downLoadProfileApi: function (profileId, appName) {
    let url = urlPrefix + 'mec/developer/v2/profiles/' + profileId + '/action/download?type=profileFile' + '&name=' + appName
    return axios({
      method: 'get',
      url: url,
      responseType: 'blob'
    }).then((res) => {
      if (!res) {
        return
      }
      let objectUrl = window.URL.createObjectURL(res.data)
      let link = document.createElement('a')
      link.style.display = 'none'
      link.href = objectUrl
      link.setAttribute('download', appName + '.' + 'zip')
      document.body.appendChild(link)
      link.click()
    })
  }
}

let applicationEditorApi = {
  getReleasedPackage: function (params) {
    return Get('mec/developer/v2/released-packages', params)
  },
  getAppData: function (params) {
    return Post('mec/appstore/v2/apps/action/query', params, 'appstore')
  },
  syncApplication: function (params) {
    return Post('mec/developer/v2/released-packages', params)
  },
  getPkgStucture: function (packageId) {
    return Get('mec/developer/v2/released-packages/' + packageId + '/action/get-pkg-structure')
  },
  getPkgContent: function (packageId, params) {
    return Post('mec/developer/v2/released-packages/' + packageId + '/action/get-file-content', params)
  },
  modifyPkgFile: function (packageId, params) {
    return Put('mec/developer/v2/released-packages/' + packageId + '/action/edit-file-content', params)
  },
  deleteModifyApp: function (packageId) {
    return Delete('mec/developer/v2/released-packages/' + packageId)
  },
  publishModifyApp: function (packageId, params) {
    return Post('mec/developer/v2/released-packages/' + packageId + '/action/release', params)
  }
}
export {
  Plugin,
  Api,
  Test,
  Workspace,
  System,
  vmService,
  imageMgmtService,
  Capability,
  profileMgmtApi,
  applicationEditorApi
}


<|start_filename|>src/mock.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
const Mock = require('mockjs')

const getProjectList = function () {
  return [{
    'id': 'ba32617a-99e0-4974-881f-68425f29f206',
    'projectType': 'CREATE_NEW',
    'name': 'New_VM_App',
    'version': '1.0',
    'provider': 'Huawei',
    'platform': ['X86'],
    'deployPlatform': 'VIRTUALMACHINE',
    'type': 'Video Application',
    'industry': ['Smart Park'],
    'description': 'New VM App',
    'iconFileId': '5260cc60-42a3-4db8-8570-532d17d1f26a',
    'status': 'ONLINE',
    'capabilityList': [{
      'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
      'oneLevelName': '平台基础服务',
      'oneLevelNameEn': 'Platform services',
      'twoLevelName': '服务治理',
      'twoLevelNameEn': 'Service governance',
      'type': 'OPENMEP',
      'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
      'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
      'capabilityDetailList': [{
        'detailId': '143e8608-7304-4932-9d99-4bd6b115dac8',
        'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
        'service': '服务发现',
        'serviceEn': 'service discovery',
        'version': 'v1',
        'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
        'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
        'provider': 'Huawei',
        'apiFileId': '540e0817-f6ea-42e5-8c5b-cb2daf9925a3',
        'guideFileId': '9bb4a85f-e985-47e1-99a4-20c03a486864',
        'guideFileIdEn': '9ace2dfc-6548-4511-96f3-2f622736e18a',
        'uploadTime': '2020-11-20 00:00:00.000000',
        'port': 8684.0,
        'host': 'service-discovery',
        'protocol': 'http',
        'userId': 'admin'
      }]
    }],
    'lastTestId': null,
    'userId': '803c33e0-21ab-4cc3-827f-847790d0d7b4',
    'createDate': '2021-02-26 14:26',
    'openCapabilityId': null
  }, {
    'id': '97793a29-73f2-4918-b08f-8ff85a27e24d',
    'projectType': 'INTEGRATED',
    'name': 'Integrated_K8S_App',
    'version': '1.0',
    'provider': 'Huawei',
    'platform': ['X86'],
    'deployPlatform': 'KUBERNETES',
    'type': 'Video Application',
    'industry': ['Smart Park'],
    'description': 'Integrated K8S App',
    'iconFileId': '5bfcda96-5e0e-492c-a19a-45f13e436bb1',
    'status': 'ONLINE',
    'capabilityList': [],
    'lastTestId': null,
    'userId': '803c33e0-21ab-4cc3-827f-847790d0d7b4',
    'createDate': '2021-02-26 11:25',
    'openCapabilityId': null
  }, {
    'id': '7dd9cc61-8225-4c0f-84c5-2ed0c65c2e32',
    'projectType': 'CREATE_NEW',
    'name': 'New_K8S_App',
    'version': '1.0',
    'provider': 'Huawei',
    'platform': ['X86'],
    'deployPlatform': 'KUBERNETES',
    'type': 'Video Application',
    'industry': ['Smart Park'],
    'description': 'New K8S App',
    'iconFileId': '99c16cbc-f332-4c9f-94ce-309c8862be37',
    'status': 'ONLINE',
    'capabilityList': [{
      'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
      'oneLevelName': '平台基础服务',
      'oneLevelNameEn': 'Platform services',
      'twoLevelName': '服务治理',
      'twoLevelNameEn': 'Service governance',
      'type': 'OPENMEP',
      'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
      'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
      'capabilityDetailList': [{
        'detailId': '143e8608-7304-4932-9d99-4bd6b115dac8',
        'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
        'service': '服务发现',
        'serviceEn': 'service discovery',
        'version': 'v1',
        'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
        'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
        'provider': 'Huawei',
        'apiFileId': '540e0817-f6ea-42e5-8c5b-cb2daf9925a3',
        'guideFileId': '9bb4a85f-e985-47e1-99a4-20c03a486864',
        'guideFileIdEn': '9ace2dfc-6548-4511-96f3-2f622736e18a',
        'uploadTime': '2020-11-20 00:00:00.000000',
        'port': 8684.0,
        'host': 'service-discovery',
        'protocol': 'http',
        'userId': 'admin'
      }]
    }],
    'lastTestId': null,
    'userId': '803c33e0-21ab-4cc3-827f-847790d0d7b4',
    'createDate': '2021-02-25 16:52',
    'openCapabilityId': null
  }]
}

const getProjectInfo = function () {
  return {
    'id': 'ba32617a-99e0-4974-881f-68425f29f206',
    'projectType': 'CREATE_NEW',
    'name': 'New_VM_app',
    'version': '1.0',
    'provider': 'Huawei',
    'platform': ['X86'],
    'deployPlatform': 'VIRTUALMACHINE',
    'type': 'Video Application',
    'industry': ['Smart Park'],
    'description': 'Test APP',
    'iconFileId': '5260cc60-42a3-4db8-8570-532d17d1f26a',
    'status': 'ONLINE',
    'capabilityList': [{
      'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
      'oneLevelName': '平台基础服务',
      'oneLevelNameEn': 'Platform services',
      'twoLevelName': '服务治理',
      'twoLevelNameEn': 'Service governance',
      'type': 'OPENMEP',
      'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
      'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
      'capabilityDetailList': [{
        'detailId': '143e8608-7304-4932-9d99-4bd6b115dac8',
        'groupId': 'c0db376b-ae50-48fc-b9f7-58a609e3ee12',
        'service': '服务发现',
        'serviceEn': 'service discovery',
        'version': 'v1',
        'description': 'EdgeGallery平台为APP提供服务注册、发现、订阅等相关功能。',
        'descriptionEn': 'The EdgeGallery platform provides APP with related functions such as service registration, discovery, and subscription.',
        'provider': 'Huawei',
        'apiFileId': '540e0817-f6ea-42e5-8c5b-cb2daf9925a3',
        'guideFileId': '9bb4a85f-e985-47e1-99a4-20c03a486864',
        'guideFileIdEn': '9ace2dfc-6548-4511-96f3-2f622736e18a',
        'uploadTime': '2020-11-20 00:00:00.000000',
        'port': 8684.0,
        'host': 'service-discovery',
        'protocol': 'http',
        'userId': 'admin'
      }]
    }],
    'lastTestId': null,
    'userId': '803c33e0-21ab-4cc3-827f-847790d0d7b4',
    'createDate': '2021-02-26 14:26',
    'openCapabilityId': null
  }
}

const getProjectVmList = function () {
  return [
    {
      'vmId': 'ba32617a-99e0-4974-881f-68425f29f206-vm-1111',
      'projectId': 'ba32617a-99e0-4974-881f-68425f29f206',
      'vmRegulation': {
        'regulationId': 0,
        'architecture': 'X86',
        'nameZh': '通用计算型',
        'nameEn': 'General Computing',
        'sceneZh': '普通APP',
        'sceneEn': 'Ordinary APP',
        'memory': 8,
        'cpu': 4,
        'systemDisk': 50,
        'dataDisk': 100,
        'gpu': '',
        'otherAbility': ''
      },
      'vmSystem': {
        'systemId': 0,
        'type': 'public',
        'operateSystem': 'ubuntu',
        'version': '16.04',
        'systemBit': '64bit',
        'systemDisk': 50
      },
      'vmNetwork': ['Network_MEP', 'Network_N6'],
      'vmName': 'TestVM',
      'status': 'Running',
      'stageStatus': {
        'csar': 'Failed',
        'hostInfo': null,
        'instantiateInfo': null,
        'workStatus': null
      },
      'lcmToken': null,
      'vmInfo': [
        {
          'serverId': 'server--1',
          'vncUrl': '',
          'networks': [
            {
              'name': '',
              'ip': '0.0.0.0'
            }
          ]
        }
      ],
      'appInstanceId': 'e52fc7e6-2ef1-43be-83d9-0fd4924bb159',
      'createTime': '2021-2-27 10:27',
      'log': 'generate  vm csar failed:null',
      'nextStage': 'hostInfo'
    }
  ]
}

const getVmConfig = function () {
  return {
    'vmRegulationList': [
      {
        'regulationId': 1,
        'architecture': 'X86',
        'nameZh': '通用计算型.2',
        'nameEn': 'Universal Computer 2',
        'sceneZh': '普通APP',
        'sceneEn': 'Common App',
        'cpu': 4,
        'memory': 8,
        'systemDisk': 50,
        'dataDisk': 100,
        'gpu': '',
        'otherAbility': '1*Atlas300C(16G)'
      },
      {
        'regulationId': 2,
        'architecture': 'X86',
        'nameZh': '通用计算型.4',
        'nameEn': 'Universal Computer 4',
        'sceneZh': '普通APP',
        'sceneEn': 'Common App',
        'cpu': 4,
        'memory': 8,
        'systemDisk': 50,
        'dataDisk': 100,
        'gpu': '',
        'otherAbility': '1*Atlas300C(16G)'
      },
      {
        'regulationId': 3,
        'architecture': 'ARM',
        'nameZh': '高I/O型.2',
        'nameEn': 'High I/O 2',
        'sceneZh': '高I/O型APP',
        'sceneEn': 'High I/O APP',
        'cpu': 8,
        'memory': 16,
        'systemDisk': 50,
        'dataDisk': 200,
        'gpu': '',
        'otherAbility': '2*Atlas300C(16G)'
      }
    ],
    'vmSystemList': [
      {
        'systemId': 1,
        'systemName': 'testSysImg-1',
        'type': 'public',
        'operateSystem': 'Ubuntu',
        'version': '18.04',
        'systemBit': '64bit',
        'systemDisk': 40
      },
      {
        'systemId': 2,
        'systemName': 'testSysImg-2',
        'type': 'public',
        'operateSystem': 'Ubuntu',
        'version': '18.05',
        'systemBit': '32bit',
        'systemDisk': 100
      },
      {
        'systemId': 3,
        'systemName': 'testSysImg-3',
        'type': 'public',
        'operateSystem': 'Suse',
        'version': '12.1',
        'systemBit': '64bit',
        'systemDisk': 80
      },
      {
        'systemId': 4,
        'systemName': 'testSysImg-4',
        'type': 'public',
        'operateSystem': 'Suse',
        'version': '12.3',
        'systemBit': '32bit',
        'systemDisk': 100
      },
      {
        'systemId': 5,
        'systemName': 'testSysImg-5',
        'type': 'private',
        'operateSystem': 'Ubuntu',
        'version': '18.04',
        'systemBit': '64bit',
        'systemDisk': 40
      },
      {
        'systemId': 6,
        'systemName': 'testSysImg-6',
        'type': 'private',
        'operateSystem': 'Ubuntu',
        'version': '18.05',
        'systemBit': '32bit',
        'systemDisk': 100
      }
    ],
    'vmNetworkList': [
      {
        'networkType': 'Network_N6',
        'descriptionZh': 'N6网络，端侧设备在访问边缘应用时，需要通过该网络进行访问',
        'descriptionEn': 'N6 network, when end-side devices access edge applications, they need to access through this network'
      },
      {
        'networkType': 'Network_MEP',
        'descriptionZh': '与边缘计算平台之间的网络，当应用存在服务依赖或需要发布服务时，需要该网络',
        'descriptionEn': 'The network with the edge computing platform, when the application has service dependency or needs to publish the service, the network is needed'
      },
      {
        'networkType': 'Network_Internet',
        'descriptionZh': 'Internet网络',
        'descriptionEn': 'Internet Network'
      }
    ]
  }
}

const doNothing = function () {
  return {}
}

const getCreateImageList = function () {
  return [
    {
      'vmName': 'sdfsgrehgetr',
      'imageName': 'fdghshstrjtrjj',
      'progress': 30,
      'status': 'create'
    },
    {
      'vmName': 'jkyujtfgftg',
      'imageName': 'sdgfrehgtjuyjtygjhnfg',
      'progress': 50,
      'status': 'progress'
    },
    {
      'vmName': 'asdqwrghfgjtyiu',
      'imageName': 'asefwegrehtrjhtrjtr',
      'progress': 75,
      'status': 'progress'
    },
    {
      'vmName': 'sdfretytryutryutr',
      'imageName': 'asefwegrehjghjyuio8uotrjhtrjtr',
      'progress': 100,
      'status': 'success'
    }
  ]
}

const getImageDataList = function () {
  return {
    'totalCount': 20,
    'imageList': [
      {
        'systemId': 1,
        'systemName': 'TestImage-1',
        'type': 'public',
        'operateSystem': 'ubuntu',
        'version': '16.05',
        'systemBit': '64',
        'systemDisk': 40,
        'userId': 'TestUser-1',
        'userName': 'TestUser',
        'createTime': '2021-5-7 17:38:12',
        'systemFormat': 'iso',
        'uploadTime:': '',
        'status': 'UPLOAD_WAIT'
      },
      {
        'systemId': 2,
        'systemName': 'TestImage-2',
        'type': 'private',
        'operateSystem': 'ubuntu',
        'version': '16.04',
        'systemBit': '64',
        'systemDisk': 80,
        'userId': 'TestUser-2',
        'userName': 'TestUser2',
        'createTime': '2021-5-6 15:03:21',
        'systemFormat': 'iso',
        'uploadTime:': '',
        'status': 'UPLOADING'
      },
      {
        'systemId': 3,
        'systemName': 'TestImage-3',
        'type': 'public',
        'operateSystem': 'ubuntu',
        'version': '16.05',
        'systemBit': '64',
        'systemDisk': 40,
        'userId': 'TestUser-2',
        'userName': 'TestUser2',
        'createTime': '2021-5-5 17:38:12',
        'systemFormat': 'qcow2',
        'uploadTime:': '2021-5-5 17:45:23',
        'status': 'UPLOAD_SUCCEED'
      },
      {
        'systemId': 4,
        'systemName': 'TestImage-4',
        'type': 'private',
        'operateSystem': 'ubuntu',
        'version': '16.05',
        'systemBit': '64',
        'systemDisk': 40,
        'userId': 'TestUser-2',
        'userName': 'TestUser2',
        'createTime': '2021-5-4 09:38:12',
        'systemFormat': 'qcow2',
        'uploadTime:': '',
        'status': 'UPLOAD_FAILED',
        'errorType': 'zipFileOpenFailed'
      },
      {
        'systemId': 5,
        'systemName': 'TestImage-5',
        'type': 'public',
        'operateSystem': 'ubuntu',
        'version': '16.05',
        'systemBit': '64',
        'systemDisk': 40,
        'userId': 'TestUser-1',
        'userName': 'TestUser',
        'createTime': '2021-5-3 17:38:12',
        'systemFormat': 'iso',
        'uploadTime:': '2021-5-3 17:45:23',
        'status': 'PUBLISHED'
      }
    ]
  }
}

Mock.mock('/mock/developer/projectlist', getProjectList)
Mock.mock('/mock/developer/projectinfo', getProjectInfo)
Mock.mock('/mock/developer/project/vmlist', getProjectVmList)
Mock.mock('/mock/developer/vmconfig', getVmConfig)

Mock.mock('/mock/donothing', doNothing)

Mock.mock('/mock/developer/imageList', getCreateImageList)

Mock.mock('/mock/developer/system/systemimage/list', getImageDataList)


<|start_filename|>src/navdata/nav_data.js<|end_filename|>

/*
 *  Copyright 2020-2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const mecDeveloper = [
  {
    id: '3.1',
    name: 'Home',
    path: '/mecDeveloper',
    display: true
  },
  {
    id: '3.2',
    name: 'Integrated Tools',
    path: '/mecDeveloper/plugin/list',
    display: true,
    children: [
      {
        id: '3.3',
        name: 'Plugin',
        path: '/mecDeveloper/plugin/list',
        display: true
      },
      {
        id: '3.4',
        name: 'Upload',
        path: '/mecDeveloper/plugin/upload',
        display: true
      }
      /* {
        id: '3.16',
        name: 'ToolChain',
        path: '/mecDeveloper/plugin/toolchain',
        display: true
      } */
    ]
  },
  {
    id: '3.7',
    name: 'ToolBox',
    path: '/mecDeveloper/toolbox',
    authority: ['ROLE_DEVELOPER_ADMIN'],
    display: true,
    children: [
      {
        id: '3.8',
        name: 'Application Editor ',
        path: '/mecDeveloper/toolbox/appedit',
        display: true
      }
    ]
  },
  {
    id: '3.5',
    name: 'Ability Center',
    path: '/mecDeveloper/api/mep',
    display: true
  },
  {
    id: '3.15',
    name: 'Workspace',
    path: '/mecDeveloper/work',
    display: true
  },
  /* {
    id: '3.17',
    name: 'Community Lab',
    display: true
  }, */
  {
    id: '3.18',
    name: 'System',
    display: true,
    path: '/mecDeveloper/system',
    authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT'],
    children: [
      {
        id: '3.20',
        name: 'Host Management',
        path: '/mecDeveloper/system/host',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '3.21',
        name: 'Ability Center Management',
        path: '/mecDeveloper/system/mep',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '3.22',
        name: 'System Image Management',
        path: '/mecDeveloper/system/imagemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      },
      {
        id: '3.23',
        name: 'Profile Management',
        path: '/mecDeveloper/system/profilemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      }
    ]
  },
  {
    id: '3.6',
    name: 'Document',
    path: '/mecDeveloper/docs',
    display: true,
    children: [
      {
        id: '3.23',
        name: 'Platform Guide',
        path: '/mecDeveloper/docs',
        display: true
      },
      {
        id: '3.24',
        name: 'Interface Components',
        path: '/mecDeveloper/docs/component',
        display: true
      }
    ]
  }
]

export default {
  mecDeveloper
}


<|start_filename|>edgegallery-fe/src/navdata/devNavCn.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
import { NAV_PRE } from '../constants'

const atpPathPre = NAV_PRE.ATP
const pathPre = NAV_PRE.DEVELOPER
const devNavData = [
  {
    id: '1.7',
    name: '应用孵化',
    path: '/EG/developer/home',
    display: true
  },
  {
    id: '1.3',
    name: '能力中心',
    path: pathPre + '/mecDeveloper/api/mep',
    display: true
  },
  {
    id: '1.8',
    name: '工具箱',
    path: pathPre + '/mecDeveloper/toolbox/appedit',
    display: true,
    authority: ['ROLE_APPSTORE_ADMIN'],
    children: [
      {
        id: '1.8.1',
        name: '应用编辑',
        path: pathPre + '/mecDeveloper/toolbox/appedit',
        display: true
      }
    ]
  },
  {
    id: '1.6',
    name: '文档',
    path: pathPre + '/mecDeveloper/docs',
    display: true,
    children: [
      {
        id: '1.6.1',
        name: '平台指南',
        path: pathPre + '/mecDeveloper/docs',
        display: true
      },
      {
        id: '1.6.2',
        name: '界面组件',
        path: pathPre + '/mecDeveloper/docs/component',
        display: true
      }
    ]
  },
  {
    id: '2',
    name: '测试认证中心',
    path: atpPathPre + '/index',
    display: true,
    children: [
      {
        name: '测试场景管理',
        path: atpPathPre + '/scenarios',
        display: true,
        id: '4.2.1'
      }, {
        name: '测试套管理',
        path: atpPathPre + '/suites',
        display: true,
        id: '4.2.2'
      }, {
        name: '测试用例管理',
        path: atpPathPre + '/testcasemanage',
        display: true,
        id: '4.2.3'
      },
      {
        name: '任务管理',
        path: atpPathPre + '/tasklist',
        display: true,
        id: '4.3'
      },
      {
        name: '贡献管理',
        path: atpPathPre + '/contributionlist',
        display: true,
        id: '4.4',
        authority: ['ROLE_APPSTORE_ADMIN']
      },
      {
        name: '配置管理',
        path: atpPathPre + '/configurationlist',
        display: true,
        id: '4.5'
      }
    ]
  },
  {
    id: '1.5',
    name: '系统管理',
    display: true,
    path: pathPre + '/mecDeveloper/system',
    authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT'],
    children: [
      {
        id: '1.5.1',
        name: '沙箱管理',
        path: pathPre + '/mecDeveloper/system/host',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '1.5.2',
        name: '能力中心管理',
        path: pathPre + '/mecDeveloper/system/mep',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '1.5.3',
        name: '系统镜像管理',
        path: pathPre + '/mecDeveloper/system/imagemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      },
      {
        id: '1.5.4',
        name: '场景管理',
        path: pathPre + '/mecDeveloper/system/profilemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      }
    ]
  }
]

export {
  devNavData
}


<|start_filename|>edgegallery-fe/src/pages/appstore/tools/commonUtil.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
import Vue from 'vue'
import i18n from '../../../locales/i18n.js'

function showTipMsg (language, error, defaultMsg) {
  let retCode = error.response.data.retCode
  let params = error.response.data.params
  if (retCode) {
    showRetCodeTipMsg(language, retCode, params)
  } else {
    showFilterExceptionTip(error, defaultMsg)
  }
}

function showRetCodeTipMsg (language, retCode, params) {
  if (retCode === 1) {
    Vue.prototype.$message({
      duration: 2000,
      message: this.$t('common.exceptionServer'),
      type: 'warning'
    })
  } else {
    let resData = null
    let resMap = null
    if (language === 'cn') {
      resData = JSON.parse(sessionStorage.getItem('resCodeInfo')).zh_CN
      resMap = new Map(Object.entries(resData))
    } else {
      resData = JSON.parse(sessionStorage.getItem('resCodeInfo')).en_US
      resMap = new Map(Object.entries(resData))
    }
    getTipMsg(resMap, retCode, params)
  }
}

function getTipMsg (resMap, retCode, params) {
  for (let code of resMap.keys()) {
    if (retCode === Number(code)) {
      let msg = resMap.get(code)
      if (msg.indexOf('%s') !== -1 && params !== null) {
        for (let param of params) {
          msg.splice(msg.indexOf('%s'), 1, param)
        }
      }
      showWarningDlg(msg)
      return
    }
  }
}

function showWarningDlg (msg) {
  Vue.prototype.$message({
    duration: 2000,
    message: msg,
    type: 'warning'
  })
}

function showFilterExceptionTip (error, defaultMsg) {
  let errorCode = error.response.data.code
  let msg = ''
  switch (errorCode) {
    case 400:
      msg = i18n.t('common.exception400')
      break
    case 401:
      msg = i18n.t('common.exception401')
      break
    case 403:
      msg = i18n.t('common.exception403')
      break
    default:
      msg = defaultMsg
  }
  showWarningDlg(msg)
}

export default {
  showTipMsg
}


<|start_filename|>edgegallery-fe/src/navdata/devNav.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
import { NAV_PRE } from '../constants'

const pathPre = NAV_PRE.DEVELOPER
const atpPathPre = NAV_PRE.ATP
const devNavData = [
  {
    id: '1.7',
    name: 'Incubation',
    path: '/EG/developer/home',
    display: true
  },
  {
    id: '1.3',
    name: 'Ability Center',
    path: pathPre + '/mecDeveloper/api/mep',
    display: true
  },
  {
    id: '1.8',
    name: 'Toolbox',
    path: pathPre + '/mecDeveloper/toolbox/appedit',
    display: true,
    authority: ['ROLE_APPSTORE_ADMIN'],
    children: [
      {
        id: '1.8.1',
        name: 'Application Editor',
        path: pathPre + '/mecDeveloper/toolbox/appedit',
        display: true
      }
    ]
  },
  {
    id: '1.6',
    name: 'Document',
    path: pathPre + '/mecDeveloper/docs',
    display: true,
    children: [
      {
        id: '1.6.1',
        name: 'Platform Guide',
        path: pathPre + '/mecDeveloper/docs',
        display: true
      },
      {
        id: '1.6.2',
        name: 'Interface Components',
        path: pathPre + '/mecDeveloper/docs/component',
        display: true
      }
    ]
  },
  {
    id: '4',
    name: 'Testing Center',
    path: atpPathPre + '/index',
    display: true,
    children: [
      {
        name: 'Scenarios Management',
        path: atpPathPre + '/scenarios',
        display: true,
        id: '4.2.1'
      }, {
        name: 'Suites Management',
        path: atpPathPre + '/suites',
        display: true,
        id: '4.2.2'
      }, {
        name: 'Case Management',
        path: atpPathPre + '/testcasemanage',
        display: true,
        id: '4.2.3'
      },
      {
        name: 'Task',
        path: atpPathPre + '/tasklist',
        display: true,
        id: '4.3'
      },
      {
        name: 'Contribution Case',
        path: atpPathPre + '/contributionlist',
        display: true,
        id: '4.4',
        authority: ['ROLE_APPSTORE_ADMIN']
      },
      {
        name: 'Configuration',
        path: atpPathPre + '/configurationlist',
        display: true,
        id: '4.5'
      }
    ]
  },
  {
    id: '1.5',
    name: 'System',
    display: true,
    path: pathPre + '/mecDeveloper/system',
    authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT'],
    children: [
      {
        id: '1.5.1',
        name: 'Host Management',
        path: pathPre + '/mecDeveloper/system/host',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '1.5.2',
        name: 'Ability Center Management',
        path: pathPre + '/mecDeveloper/system/mep',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN']
      },
      {
        id: '1.5.3',
        name: 'System Image Management',
        path: pathPre + '/mecDeveloper/system/imagemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      },
      {
        id: '1.5.4',
        name: 'Profile Management',
        path: pathPre + '/mecDeveloper/system/profilemgmt',
        display: true,
        authority: ['ROLE_DEVELOPER_ADMIN', 'ROLE_DEVELOPER_TENANT']
      }
    ]
  }
]

export {
  devNavData
}


<|start_filename|>edgegallery-fe/src/locales/atp_cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const atpCn = {
  report: {
    result: '结果',
    provider: '供应商',
    testReport: 'EdgeGallery测试认证报告',
    downloadReport: '下载报告',
    reportanalysis: '测试报告分析',
    version: '版本',
    packageName: '应用名称',
    startTime: '提交时间',
    endTime: '结束时间',
    status: '状态',
    detail: '详情',
    ticketNumber: '任务号',
    baseInfo: '基本信息',
    uploadUser: '上传人',
    failReason: '失败原因',
    rate: '通过率',
    model: '认证模板',
    reportDetail: '测试用例详情',
    number: '数量',
    caseDistribution: '场景用例分布',
    successfulRate: '测试用例成功率'
  },
  atpPromptMessage: {
    guestUser: 'guest用户无权操作! 请先登录',
    gettestcaseFail: '测试用例获取失败',
    resolveFail: '解析依赖失败',
    creattaskFail: '创建任务失败',
    getprocessFail: '获取任务进展失败',
    onlyCsar: '只能上传 .csar 文件.',
    packageSizeLimit: '文件大小不超过10M',
    getTaskListFail: '获取测试任务失败。',
    contrastTime: '提交时间不能早于测试结束时间！',
    confirmLogout: '您确定要退出吗?',
    prompt: '提示',
    browserAdvise: '为了部分功能正常使用，我们建议使用Chrom浏览器！',
    downloadSuccess: '下载成功',
    downloadFail: '下载失败',
    deletePrompt: '是否要继续删除此用例？',
    deleteSuitePrompt: '是否要继续删除此测试套？',
    deleteSenarioPrompt: '是否要继续删除此测试场景？',
    onlyOneFile: '仅支持一个文件，请先移除已有文件！',
    deleteSuccess: '删除成功',
    deleteFail: '删除失败',
    runFailed: '运行失败',
    getSceneFail: '获取场景失败',
    modifySuccess: '修改成功',
    addFail: '添加失败',
    addSuccess: '添加成功',
    modifyFail: '修改失败',
    submitSuccess: '提交成功',
    manualTip: '自动化用例已完成，还有手动用例，需等待管理员手工完成',
    noCase: '此场景没有用例',
    cannotDeleteSuite: '该测试套被某些测试用例所使用，无法删除!',
    cannotDeleteScenario: '该测试场景被某些测试套所使用，无法删除!',
    selectIcon: '请选择图标',
    nameEmpty: '名称不能为空!',
    objectiveEmpty: '目的不能为空!',
    typeEmpty: '类型不能为空!',
    descriptionEmpty: '描述不能为空!',
    configEmpty: '参数不能为空',
    expectResultEmpty: '预期结果不能为空!',
    testStepEmpty: '步骤不能为空!',
    testSuiteEmpty: '测试套不能为空!',
    fileEmpty: '文件不能为空!',
    languageEmpty: '语言不能为空!',
    configIdEmpty: '配置项不能不选!',
    nameLength: '长度为1-16位',
    deleteContrubuteCase: '是否要继续删除贡献用例?',
    confirmdeleteTask: '是否要继续删除测试任务?',
    moreThan2: '只能上传不超过2MB的文件！',
    uploadSuc: '上传成功',
    configUsed: '配置项被使用,不能删除!',
    configNameEn: '请输入长度1-64的英文名称，开头不能为空!',
    configDescEn: '请输入长度1-255的英文描述，开头不能为空!'
  },
  testCase: {
    upload: '上传',
    noCase: '此场景没有用例',
    caseDetail: '用例详情',
    viewCase: '查看用例',
    selectScenes: '选择场景',
    startTest: '开始测试',
    contributionCase: '贡献用例',
    createTime: '创建时间',
    management: '测试用例管理',
    caseName: '用例名称',
    caseType: '用例类型',
    casePurpose: '测试用例目的',
    step: '测试步骤',
    type: '贡献类型',
    expectedResult: '预期结果',
    language: '测试用例语言',
    verificationModel: '所属认证模板',
    operation: '操作',
    delete: '删除',
    edit: '编辑',
    add: '新增',
    model: '认证模板',
    standard: '社区标准',
    addCase: '新增测试用例',
    editCase: '编辑测试用例',
    import: '用例导入',
    sample: '样例下载',
    testSuiteList: '测试套',
    testStep: '测试步骤',
    testLanguage: '测试语言',
    description: '描述',
    nameCn: '中文名称',
    nameEn: '英文名称',
    descriptionCn: '中文描述',
    descriptionEn: '英文描述',
    expecteCn: '中文预期结果',
    expecteEn: '英文预期结果',
    stepCn: '中文步骤',
    stepEn: '英文步骤',
    applicationTestPlatform: '应用测试平台',
    testSuiteManagement: '测试套管理',
    testSuiteCn: '测试套中文名',
    testSuiteEn: '测试套英文名',
    testSuiteDescriptionCn: '测试套描述中文',
    testSuiteDescriptionEn: '测试套描述英文',
    testScenarioManagement: '测试场景管理',
    testScenarioCn: '测试场景中文名',
    testScenarioEn: '测试场景英文名',
    testScenarioDescriptionCn: '测试场景描述中文',
    testScenarioDescriptionEn: '测试描述英文',
    testScenarioIcon: '场景图标',
    testScenarioLabel: '测试场景标签',
    selectTestScenario: '选择标签',
    addTestSuite: '新增测试套',
    editTestSuite: '编辑测试套',
    addTestScenario: '新增测试场景',
    editTestScenario: '编辑测试场景',
    provideNameCn: '请提供中文名',
    provideDescriptionCn: '请提供中文描述',
    provideTestScenario: '选择测试场景',
    provideTestSuite: '选择测试套',
    provideTestType: '选择用例类型',
    provideNameSearch: '请输入名称搜索',
    pleaseInput: '请输入',
    download: '下载'
  },
  process: {
    modifyStatus: '修改用例状态'
  },
  atpTestProcess: {
    publishSuc: '发布成功',
    publishFail: '发布失败',
    viewReport: '查看报告',
    publish: '发布',
    testAgain: '再次测试',
    selectScene: '选择用例场景',
    contribution: '贡献测试用例',
    seeDetail: '详情',
    caseDetail: '用例详情',
    selectTestScene: '选择场景',
    name: '用例名称',
    status: '用例状态',
    type: '类型',
    description: '描述',
    score: '分',
    result: '结果',
    find: '所有场景共发现',
    issue: '项问题',
    hover: '成功用例/总用例',
    clickContribution: '点击贡献用例',
    choose: '请选择',
    failReason: '失败理由',
    clickDownloadCase: '点击下载用例',
    contentTip: '用例脚本打包成zip包格式上传',
    uploadReport: '上传自测报告',
    platformReport: '平台测试报告',
    applicationReport: '应用自测报告',
    pageNum: '页码',
    waitManual: '等待手动用例完成',
    selftestUpload: '自测报告上传',
    haveReport: '若有自测报告,可在此处上传报告',
    pdfFormat: '(报告文件必须为pdf格式)',
    later: '以后再说',
    uploadNow: '立即上传'
  }
}
export default atpCn


<|start_filename|>edgegallery-fe/src/assets/css/common.css<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 @font-face
 {
   font-family: defaultFont;
   src: url(../fonts/HarmonyOS_Sans_SC_Regular.ttf);
 }
 @font-face
 {
   font-family: defaultFontBold;
   src: url(../fonts/HarmonyOS_Sans_SC_Bold.ttf);
 }
 @font-face {
  font-family: defaultFontLight;
  src: url(../fonts/HarmonyOS_Sans_SC_Light.ttf);
}
 @font-face {
   font-family: defaultFontUltraLight;
   src: url(../fonts/Harmony-UltraLight.ttf);
 }
 html,body,div,p,h1,h2,h3,h4,h5,h6,ul,li,button,span,a{
   margin:0;
   padding:0;
   box-sizing: border-box;
 }
 textarea::-webkit-input-placeholder{
   color: #fff;
 }
 .defaultFont button{
   font-family:defaultFont, Arial, Helvetica, sans-serif;
 }
 .defaultFont{
   font-family:defaultFont, Arial, Helvetica, sans-serif;
 }
 .defaultFontBold{
   font-family:defaultFontBold, Arial, Helvetica, sans-serif;
 }
 .fontUltraLight {
   font-family: defaultFontUltraLight,
     Arial,
     Helvetica,
     sans-serif !important;
 }
 
 .defaultFontLight {
   font-family: defaultFontLight,
     Arial,
     Helvetica,
     sans-serif !important;
 }
 
 .defaultFontLight button {
   font-family: defaultFontLight,
     Arial,
     Helvetica,
     sans-serif !important;
 }
 
 html,body{
   min-width: 1200px;
   height:100%;
   font-size: 16px;
   background: #f6f5f8 !important;
 }
 a{
   color: #688ef3;
   text-decoration: none;
 }
 li{
   list-style: none;
 }
 .lt{
   float: left;
 }
 .rt{
   float: right;
 }
 .clearfix{
   clear: both;
 }
 .breadcrumb{
   height:50px;
   line-height: 50px;
 }
 .pageBar{
   float:right;
   margin-top:25px;
 }
 .error{
   color:#F56C6C;
 }
 .success{
   color:#67C23A;
 }
 .wait{
   color:#E6A23C;
 }
 .primary{
   color:#688ef3;
 }
 .Running{
   color:#688ef3;
 }
 .mt20{
   margin-top:20px;
 }
 .el-button.mt20{
   margin-top:20px;
 }
 .ml10{
   margin-left: 10px;
 }
 .tit_gray_bg{
   font-size: 16px;
   background: #f0f0f0;
   padding: 10px;
   margin-bottom: 15px;
 }
 .flex{
   display: flex
 }
 .flex-center{
  display: flex;
  justify-content: center;
  align-items: center;
 }
 .h100{
   height: 100%;
 }
 .cp, .curp{
   cursor: pointer;
 }
 .el-row{
  height: 100%;
}
 .el-button.linearGradient{
   background-image: linear-gradient(127deg, #54aaf3, #53dabd);
   border: none;
 }
 .el-button.linearGradient span{
   position: relative;
   z-index: 2;
 }
 .el-button.linearGradient::after {
   content: '';
   width: 86%;
   height: 100%;
   position: absolute;
   right: 7%;
   bottom: -10px;
   background: inherit;
   filter: blur(0.65rem);
   opacity: 0.7;
   z-index: 1;
 }
 .el-button.linearGradient2{
   background-image: linear-gradient(127deg, #4444d0, #6724cb);
   border: none;
 }
 .el-button.linearGradient2 span{
   position: relative;
   z-index: 2;
 }
 .el-button.linearGradient2::after {
   content: '';
   width: 86%;
   height: 100%;
   position: absolute;
   right: 7%;
   bottom: -10px;
   background: inherit;
   filter: blur(0.65rem);
   opacity: 0.7;
   z-index: 1;
 }
 .el-button.linearGradient2:active{
   background-image: linear-gradient(127deg, #4a4aac, #6724cb);
   border: none;
 }
 .el-button.defaultBtn{
   background: #5844be;
   border: none;
 }
 .el-button.defaultBtn:active{
   background: #544295;
   border: none;
 }
 .el-button.featuresBtn{
   font-size: 14px !important;
   font-family: defaultFontLight, Arial, Helvetica, sans-serif;
   background: #8a75d5 !important;
   border: none;
   color: #ffffff !important;
   box-shadow: 0 0 29px rgba(36,20,119,0.13) inset;
 }
 .el-button.featuresBtn.is-disabled{
   color: #ededed !important;
   background: #bdb9cf !important;
 }
 .el-tabs__active-bar{
   background-color: #688ef3;
 }
 .el-button.editBtn{
   color: #7597f4;
 }
 .el-button.deleteBtn{
   color: #f67878;
 }
 .el-button.bgBtn{
   background-color: #5844be;
   border: none;
   color: #fff;
   border-radius: 10px;
   font-family: defaultFontLight, Arial, Helvetica, sans-serif;
 }
 .el-button.confirm{
   background: #688ef3;
   color: #fff;
 }
 .el-button.cancel{
   border: 1px solid #688ef3;
   color: #688ef3;
 }
 .el-button.p8{
   padding: 8px 12px;
 }
 .el-button{
   padding: 8px 24px;
   font-size: 16px;
 }
 .el-button.el-button--text{
   padding: 0px;
 }
 .el-dialog__header{
   background: #688ef3;
 }
 .half{
   float: left;
   width: 50% !important;
 }
 .default_dialog .el-dialog{
   font-family: defaultFontLight, Arial, Helvetica, sans-serif;
   background: rgba(75,55,154,0.9);
   border-radius: 12px;
   margin-top: 0 !important;
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
   max-height: 90%;
   overflow: auto;
 }
 .default_dialog .el-table{
   border-radius: 6px;
 }
 .default_dialog .el-dialog__body{
   padding: 40px !important;
   color: #fff;
 }
 .default_dialog .el-dialog__header{
   background: rgba(75,55,154,0.9) !important;
   border-radius: 12px 12px 0 0;
   padding: 0;
 }
 .default_dialog .el-dialog .el-dialog__title{
   color: #380879 !important;
   font-size: 20px;
 }
 .default_dialog.el-dialog__wrapper{
  backdrop-filter: blur(10px);
 }
 .default_dialog .el-dialog__footer{
   padding: 0 40px;
   position: sticky;
   right: 40px;
   bottom: 40px;
   /* background: rgba(75,55,154,1) !important; */
 }
 .default_dialog .dialog-footer{
  text-align: right;
}
 .v-modal{
  opacity: 0;
 }
 .default_dialog .el-form-item{
   width: 100%;
 }
 .default_dialog .el-dialog .el-form-item__label{
   height: 32px !important;
   line-height: 32px !important;
   color: #380879;
   font-size: 16px;
 }
 .default_dialog .el-dialog .el-input__inner,.default_dialog .el-dialog .el-textarea__inner{
   border: none  !important;
   border-radius: 8px !important;
 }
 .default_dialog .title_icon{
   display: inline-block;
   width: 17px;
   height: 17px;
   border-radius: 3px;
   background-image: linear-gradient(45deg, #72dcc8, #c0e8e0);
   margin-right: 20px;
   position: relative;
   top: 2px;
 }
 .default_dialog .el-dialog__close{
   display: none;
 }
 .el-dialog--center .el-dialog__header{
   text-align: left;
 }
 .default_radio .el-radio__inner::after{
   width: 8px;
   height: 8px;
   background: #ceccdc;
   border-radius: 50%;
   transform: translate(-50%, -50%) scale(1);
 }
 .default_radio .el-radio__input.is-checked .el-radio__inner::after{
   background: #55d8bf;
 }
 .default_radio .el-radio__inner{
   width: 18px;
   height: 18px;
   border-color: #5844be;
 }
 .default_radio .el-radio__input.is-checked .el-radio__inner{
   background: none;
   border-color: #5844be;
 }
 .default_radio .el-radio__label{
   color: #380879;
   font-size: 16px;
 }
 .default_radio .el-radio__input.is-checked + .el-radio__label{
   color: #380879;
 }
 .el-icon-warning{
   color: #688ef3;
   margin:0 5px 0 10px;
   font-size: 14px;
 }
::-webkit-scrollbar{
  width: 8px;
  height: 10px;
}
::-webkit-scrollbar-thumb{
  border-radius: 10px;
  background: rgba(0,0,0,0.3);
}

 .el-upload-list{
   float: left;
   width: 100%;
   text-align: left;
 }
 .el-upload-list__item{
   width: 25%;
   min-width: 200px;
   background-color: #F5F7FA;
 }
 .el-select-dropdown__list {
   padding: 0px 0 !important;
 }
 .el-form-item .el-form-item__content{
   line-height:30px;
 }
 .el-form-item--small .el-form-item__content{
   line-height:32px;
 }
 .el-form-item--mini .el-form-item__content{
   line-height: 28px;
 }
 
 .padding_default{
   padding: 0 13%;
 }
 .footer_top{
   padding-bottom: 100px !important;
 }
 .title_left{
   margin-left: 140px;
   font-size: 36px;
   color: #5d3da0;
 }
 .title_center{
   font-size: 36px;
   font-family: defaultFontBold, Arial, Helvetica, sans-serif;
   display: flex;
   flex-direction: column;
  align-items: center;
 }
 .title_color1{
   color: #5944C1;
 }
 .title_color2{
  color: #ffffff;
}
 .line_bot1{
   display: block;
   width: 88px;
   height: 7px;
   border-radius: 4px;
   background: rgba(158, 123, 205, 0.2);
   margin-top: 15px;
   flex-shrink: 0;
 }
 .line_bot2{
   display: block;
   width: 88px;
   height: 7px;
   border-radius: 4px;
   background: rgba(83, 205, 204, 0.2);
   margin-top: 15px;
   flex-shrink: 0;
 }
 .line_bot3{
  display: block;
  width: 88px;
  height: 7px;
  border-radius: 4px;
  background: rgba(228, 221, 239, 1);
  margin-top: 15px;
  flex-shrink: 0;
}
 .title_top{
   padding: 80px 0 60px !important;
   position: relative;
 }
 .title_top_home{
   padding-top: 150px !important;
   position: relative;
 }
 .el-menu--horizontal > .el-menu-item.is-active,
 .main-sidebar .el-menu.el-menu--horizontal .el-menu-item:not(.is-disabled):hover,
 .el-menu--horizontal > .el-submenu.is-active .el-submenu__title,
 .main-sidebar .el-menu--horizontal > .el-submenu .el-submenu__title:hover,
 .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus{
   border-bottom: none !important;
   background-color: transparent !important;
   color: #fff !important;
   font-family: defaultFontBold, Arial, Helvetica, sans-serif;
 }
 
 .el-menu--horizontal > .el-menu-item,.el-menu--horizontal > .el-menu-item:hover{
   border-bottom: none;
   letter-spacing: 1px;
   font-family: defaultFont, Arial, Helvetica, sans-serif;
   font-size: 18px !important;
 }
 .main-sidebar .el-menu.el-menu--horizontal .el-menu-item{
   margin-right: 40px;
 }
 .el-menu--horizontal > .el-submenu{
   position: relative;
 }
 .el-menu--horizontal > .el-menu-item:after,.el-menu--horizontal > .el-submenu:after{
   content:'';
   position:absolute;
   border-bottom:2px solid #43F6AD;
   left: 50%;
   bottom: 0;
   width: 0%;
   transition:all 0.5s;
 }
 .el-menu--horizontal > .el-menu-item:hover:after,.el-menu--horizontal > .el-submenu:hover:after{
   content:'';
   position:absolute;
   border-bottom:2px solid #43F6AD;
   left: 40%;
   width: 25%;
   transform: scale(4,1);
 }
 .el-menu--horizontal > .el-menu-item.is-active:after,.el-menu--horizontal > .el-submenu.is-active:after{
   left: 0;
   width: 100%;
   border-bottom:2px solid #43F6AD;
 }
 .el-menu--horizontal > .el-menu-item.is-active:hover:after,.el-menu--horizontal > .el-submenu.is-active:hover:after{
   left: 0;
   width: 100%;
   border-bottom:2px solid #43F6AD;
   transform: scale(1);
 }
  .first-menu{
    font-size: 25px!important;
  }
  .second-menu{
    font-size: 18px!important;
  }
  .third-menu{
    font-size: 16px!important;
  }
 @media screen and (max-width:1600px){
   .padding_default{
     padding: 0 6.5%;
   }
 }
 @media screen and (min-width: 1201px) { 
   .monitor {max-width: 1200px} 
 } 
 @media screen and (max-width: 1200px) { 
   .monitor {max-width: 900px} 
 }
 
 /* dialog */
 .el-dialog__body{
   padding-top:15px!important;
   padding-bottom:30px!important;
 }
 .el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close,.el-dialog__title,.el-dialog__headerbtn .el-dialog__close{
   color:#fff!important;
 }
 
 /* navBar */
 .el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{
   margin-top:3px;
 }
 .el-submenu__icon-arrow{
   margin-top:-3px;
 }
 
 .el-message{
   top: 65px !important;
 }
 
 body .el-table th.gutter{
   display: table-cell !important;
 }
 
 .bread-crumb{
   height: 70px;
   line-height: 70px !important;
   font-size: 14px;
 }
 .clear:after{
   content: '';
   display: block;
   clear: both;
 }
 .swagger-ui .info .url{
   display: none;
 }
 .v-note-wrapper{
   z-index: 1 !important;
   border: none !important;
 }
 .tableStyle.el-table,.tableStyle .el-table__body-wrapper{
   overflow: visible;
 }
 .tableStyle.el-table tbody tr:hover>td { 
   background-color:#ffffff!important;
 }
 .tableStyle.el-table th{
   background: #edeef8;
   font-size: 18px;
   color: #62517a;
   font-weight: normal;
 }
 .el-table__header-wrapper{
   border-radius: 8px 8px 0 0;
 }
 .tableStyle.el-table .cell {
   padding: 0 0 0 30px !important;
   overflow: visible;
 }
 .tableStyle.el-table tbody td {
   border-bottom: 2px solid #f5eeff;
   padding: 10px 0 !important;
 }
 .tableStyle.el-table .cell.el-tooltip{
   white-space: nowrap;
   text-overflow: ellipsis;
   overflow: hidden;
   word-break: break-all;
 }
 .tableStyle.el-table .el-button{
   margin-bottom: 5px;
   margin-right: 5px !important;
 }
 .tableStyle.el-table .el-button + .el-button{
   margin-left: 0;
 }
 .el-button.operations_btn{
   background: #efefef;
   padding: 5px 15px;
   border: none;
   position: relative;
 }
 .el-button.operations_btn .el-button{
   margin-right: 0px!important;
 }
 .el-button.operations_btn .el-button--text,.el-button--text:focus, .el-button--text:hover{
   color:#606266;
 }
 .el-button.is-disabled, .el-button.is-disabled:focus, .el-button.is-disabled:hover{
   color: #c0c4cc !important;
 }
 
 /* el-pagination */
 .el-pager li{
   min-width: 24px !important;
   color: #62517a;
   margin: 0 2px;
 }
 .el-pager li.active{
   color: #6b5b81;
 }
 .el-pager li:not(.disabled).active {
   background-color: #5844be !important;
   color: #fff;
   border-radius: 50%;
 }
 .el-pagination__jump{
   display: none !important;
 }
 .el-pagination__total{
   float: right;
   margin: 0 0 0 10px;
 }
 .el-pagination__sizes .el-select .el-input{
   width: 82px;
 }
 .el-icon-arrow-up:before{
   font-size: 8px;
   position: relative;
 }
 .el-select .el-input.is-focus .el-input__inner,.el-pagination__sizes .el-input .el-input__inner:hover{
   border-color: #b2b2b2 !important;
 }
 .el-select-dropdown__item.selected{
   color: #380879 !important;
 }
 .el-textarea .el-textarea__inner{
   min-height: 80px !important;
 }
 .el-table .sort-caret.descending{
   border-top-color: #b5e8e9;
   bottom: 4px;
 }
 .el-table .descending .sort-caret.descending{
   border-top-color: #61cdd0;
 }
 .el-table .sort-caret.ascending{
   border-bottom-color: #b5e8e9;
   top: 4px;
 }
 .el-table .ascending .sort-caret.ascending{
   border-bottom-color: #61cdd0;
 }
 .el-table .sort-caret{
   border: solid 6px transparent;
 }
 .default_dropdown .el-table__column-filter-trigger i{
   font-size: 16px;
   transform: scale(1.0);
   margin-left: 8px;
 }
 .default_dropdown .el-icon-arrow-down:before{
   color: #61cdd0;
   background: url('../images/table_filter_down.png') center center no-repeat;
 }
 .el-table-filter{
   box-shadow: none;
   border: none;
   margin: 15px 0 2px;
   background: url('../images/table_filter_content_up.png') 80% 0 no-repeat;
   padding-top: 6px;
 }
 .el-table-filter .el-table-filter__content{
   background-color: #edeef8;
   border-radius: 6px 6px 0 0;
 }
 .el-table-filter .el-table-filter__content .el-checkbox__inner{
   border: 1px solid #c8c8e0;
   background: none;
   border-radius: 3px;
 }
 .el-table-filter .el-table-filter__content .el-checkbox__label{
   color: #abaecb;
 }
 .el-table-filter .el-table-filter__content .is-checked .el-checkbox__inner{
   border: 1px solid #a19aac;
   background: none;
 }
 .el-table-filter .el-table-filter__content .is-checked .el-checkbox__label,.el-table-filter .el-table-filter__content .el-checkbox__label:hover{
   color: #62517a;
 }
 .el-checkbox__input.is-checked .el-checkbox__inner{
  background-color: #3AC372;
  border-color: rgba(255,255,255,.3);
}
.el-checkbox__inner{
  background-color: transparent;
  border: 1px solid #fff;
}
.el-checkbox__input.is-focus .el-checkbox__inner, .el-checkbox__inner:hover{
  border-color: #fff;
}
 .el-table-filter .el-table-filter__bottom{
   background-color: #edeef8;
   border-radius: 0 0 6px 6px;
   border-top: 1px solid #fff;
 }
 .el-table-filter__bottom button:hover{
   color: #5e40c8;
 }
 .el-table-filter__bottom button.is-disabled,.el-table-filter__bottom button.is-disabled:hover{
   color: #abaecb;
 }
 .el-table th>.cell.highlight{
   color: #5e40c8;
 }
 .btn_div{
   position: absolute;
   right: 0;
   top: 18px;
   border-radius: 5px 5px 0 0;
   z-index: 2;
 }
 .dropdown_list li{
   height: 25px;
   line-height: 25px;
   border-bottom: 1px solid #e7e7e7;
   background: #efefef;
   padding: 0 15px;
   color: #7a6e8a;
   position: relative;
 }
 .dropdown_list li em{
   display: inline-block;
   width: 1px;
   position: absolute;
   top: 10px;
   left: 1px;
   transition:all 0.6s;
 }
 .dropdown_list li:first-child{
   border-radius: 5px 5px 0 0;
 }
 .dropdown_list li:last-child{
   border-bottom: none;
   border-radius: 0 0 5px 5px;
 }
 .dropdown_list li:hover{
   color: #7a6e8a;
 }
 .dropdown_list li:hover em{
   background: #61cdd0;
   height: 7px;
   transform: scale(1,2);
 }
 .dropdown_list li.disabled,.dropdown_list li.disabled:hover{
   color: #bcb9c1;
   cursor: default;
 }
 .btn_div.el-icon-caret-top:before{
   color: #efefef;
   top: 5px;
   left: 10px;
   position: relative;
 }
 .search_input{
   width: 215px;
 }
 .search_input .el-input__inner{
   border-radius: 8px;
   border-color: #5e40c8;
   height: 30px;
   line-height: 30px;
 }
 .search_input .search_icon{
   display: inline-block;
   width: 15px;
   height: 15px;
   background: url('../images/work_project_search_icon.png');
   position: absolute;
   top: 8px;
   right: 5px;
   cursor: pointer;
 }
 .default_info_promt{
   display: inline-block;
   width: 16px;
   height: 16px;
   line-height: 14px;
   text-align: center;
   color: #ffffff;
   font-size: 12px;
   background: #5844be;
   border-radius: 50%;
   margin-left: 10px;
 }
 .icon-pos-right{
   position: absolute;
   right: -25px;
   top: 7px;
 }
 .empty_img{
   background: url('../images/empty.png') center 10px no-repeat;
   padding-top: 200px;
 }

.el-button.common-btn{
  /* box-shadow: 0px 12px 12px -8px rgba(76,85,170,.8); */
  border-radius: 17px !important;
  padding: 6px 32px !important;
  border: none !important;
  color: #5944C0 !important;
  font-size: 18px !important;
}
.el-button.common-btn:hover{
  color: #fff !important;
  background-color: #5347a0 !important;
}
.el-button.common-btn.is-disabled,.el-button.common-btn.is-disabled:focus, .el-button.common-btn.is-disabled:hover{
  color: #5E49A7 !important;
  background-color: rgba(10,9,54,.1) !important;
}
.el-button.inner-btn{
  color: #fff !important;
  font-size: 18px !important;
  background-color: #4e3494 !important;
  border: none;
  padding: 14px 30px;
}
.el-button.inner-btn:hover{
  color: #806bbc !important;
  background-color: #412590 !important;
}
.el-button.el-button-operation {
  font-size: 14px;
  width: auto;
  background: #4E3494;
  border-radius: 6px;
  border: none;
  color: #fff;
}
.el-button.el-button-operation:hover {
  background: #412590;
}
.el-button+.el-button{
  margin-left: 32px !important;
}
.el-button.common-dark-btn{
  color: #fff;
  background-color: #60569A;
}
.common-info {
  display: inline-block;
  width: 24px;
  height: 24px;
  background: url(../images/application/app_info_icon.png) no-repeat center;
  background-size: contain;
  position: relative;
}

.el-table.common-table{
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  font-size: 16px;
}
.el-table.common-table, .el-table__expanded-cell, .el-table.common-table th.el-table__cell, 
.el-table.common-table th,.el-table.common-table th.el-table__cell > .cell, .el-table.common-table tr, .el-table.common-table td.el-table__cell > .cell { 
  background-color: transparent;
  color: #fff;
}
.el-table tbody tr:hover>td {
background-color:transparent !important
}
.common-table.el-table th.el-table__cell.is-leaf, .common-table.el-table td.el-table__cell{
  border-bottom: 1px solid #4e3494;
}
.el-table.common-table thead tr{
  height: 51px;
  background-color: #4e3494;
}
.el-table.common-table .el-table__cell {
  padding: 0;
}
.el-table td{
  min-height: 50px !important;
}
th{
  font-weight: normal;
}
.el-table.common-table::before{
  height: 0;
}
.el-button--text,.el-button--text:hover{
  color: #fff !important;
}
.el-button.operation-btn-text{
  font-size: 14px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif !important;
  color: #fff;
}
.el-button.operation-btn-text:hover{
  color: #fff;
}
.btn-container{
  text-align: right;
  margin: 32px 0 0 0;
}
.btn-container .el-button{
  font-size: 14px;
}
 .hoverHands:hover{
  cursor: pointer;
 }
.common-div-bg{
  max-height: 95%;
  overflow: auto;
  padding: 40px;
  border-radius: 16px;
  background: rgba(46,20,124,.7);
  backdrop-filter: blur(6px);
  clear: both;
  position: relative;
}
.rules-title{
  font-weight: normal;
  font-size: 20px;
  margin-bottom: 20px;
}
.rules-title:before{
  display: inline-block;
  content: '';
  width: 9px;
  height: 9px;
  background: #5944C0;
  border-radius: 50%;
  position: relative;
  top: -2px;
}
.rules-title-green{
  font-weight: normal;
  font-size: 16px;
  margin-bottom: 20px;
}
.rules-title-green:before{
  display: inline-block;
  content: '';
  width: 9px;
  height: 9px;
  background: #76E1E9;
  border-radius: 50%;
  position: relative;
}
.rules-title-sub{
  font-weight: normal;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  padding-left: 15px;
  margin: 5px 0 20px;
  font-size: 18px;
}
.title-top{
  margin-top: 30px;
}
.el-form.common-form .el-form-item__label{
  color: #fff;
  font-size: 20px;
  line-height: 46px;
}
.el-form.common-form .el-form-item__error{
  font-size: 14px;
  padding-top: 4px;
}
.el-form.common-form .el-input__inner,.el-form.common-form .el-textarea__inner{
  color: #fff;
  background-color: rgb(78,52,148);
  border: none;
  font-size: 18px;
}

.el-form.common-form .el-input__inner:focus{
  border: 1px solid #ddd;
}
.el-form.common-form .el-input-number--mini{
  width: 100%;
}
.el-form.common-form .el-form-item--mini.el-form-item{
  margin-bottom: 20px;
}
.el-form.common-form .el-form-item__content, .el-form.common-form .el-input__inner{
  min-height: 46px !important;
  line-height: 46px !important;
  font-size: 18px;
  color: #c9bdf3;
}
.el-form.common-form .el-input-number__decrease, .el-form.common-form  .el-input-number__increase{
  font-size: 16px;
  height: 46px;
  background-color: #907cd0;
  border: none;
}
.el-form.common-form .el-icon-minus:before,.el-form.common-form  .el-icon-plus:before{
  position: relative;
  top: 10px;
  color: #fff;
}
.el-input-number .el-input__inner{
  text-align: left;
}
.el-select .el-input .el-select__caret, .el-table__empty-text{
  color: #fff;
}
/* .el-select-dropdown{
  background-color: rgba(255,255,255,.8);
}
.el-select-dropdown__item.hover, .el-select-dropdown__item:hover,.el-select-dropdown__item.selected{
  background-color: rgba(255,255,255,.8);
} */
.input-half{
  width: 50%;
}
.el-tooltip__popper.is-dark{
  background: rgba(0,0,0,.7);
}
.el-form-item__label{
  font-size: 16px;
  color: #fff!important;
}
.cb{
  clear: both;
}

.label-item-half{
  float: left;
  width: 50%;
}
.label-item-half .el-select{
  width: 100%;
}

.common-dlg-title{
  font-weight: normal;
  font-size: 25px;
  margin-bottom: 15px;
}
.common-dlg-title:before{
  display: inline-block;
  content: '';
  width: 12px;
  height: 12px;
  background: #76E1E9;
  border-radius: 50%;
  position: relative;
  top: -3px;
}
.center{
  display: flex;
  justify-content: left;
  flex-direction: column;
  flex-wrap: wrap;
}
.workflow{
  height: 33%;
  padding-top: 30px;
  
}
.workflow .step-item{
  display: inline-block;
  width: 140px;
  height: 140px;
  position: relative;
  cursor: pointer;
  border: 1px solid transparent;
}
.workflow .flow-name{
  position: relative;
  text-align: center;
  top: 100px;
  font-size: 20px;
  font-family: defaultFont, Arial, Helvetica, sans-serif;
  clear: both;
}
.capability-center .flow-name{
  top: 90px;
}
.item-active{
  border: 3px solid #f2b720 !important;
  border-radius: 14px;
}
.item-history{
  border: 3px solid #4A9893 !important;
  border-radius: 14px;
}
 .item-active .steps-num{
  background: #f2b720;
 }
 .item-history .steps-num{
   background: #4A9893;
 }
 .steps-num{
  float: right;
  width: 70px;
  height: 35px;
  border-radius: 12px;
  color: #331A86;
  background: #9484D2;
  text-align: center;
  line-height: 35px;
  margin: 3px 3px 0 0;
  position: relative;
  top: -45px;
  right: 0px;
  font-size: 20px;
  font-weight: bold;
 }
 .step-item{
  background: url('../../assets/images/application/app_icon_bg.png') no-repeat;
  background-size: cover;
}
.step-item img{
  width: 55px;
  position: absolute;
  top: 20px;
  left: 42px;
  opacity: 1;
}

@keyframes breathe  {
  0%{
     opacity:0.2;
     filter: drop-shadow(0px 0px 20px rgba(255, 255, 255,0.1));
  }
  100%{
    opacity:1;
     filter: drop-shadow(0px 0px 20px rgba(255, 255, 255,0.8));
  }
}

 .tip-btn-group .tip-btn{
  border-radius: 12px;
  width: 100px;
  color: #5944C0;
}
.question{
  width: 67px;
  height: 67px;
  position: absolute;
  top: 10%;
  right: 5%;
  opacity: 0;
}
.test-btn.el-button{
  border: 1px solid #fff;
  background-color: transparent;
  padding: 12px 30px;
  color: #fff;
  border-radius: 16px;
}
.test-light-btn.el-button{
  box-shadow: 0px 12px 12px -8px rgba(76,85,170,.8);
  background-image: linear-gradient(127deg,#FFFFFF,#D7E2FF);
  padding: 12px 30px;
  color: #0F0D87;
  border-radius: 16px;
}
.el-input.common-input .el-input__inner{
  width: 180px;
  color: #fff;
  background-color: rgba(255,255,255,.45);
  border: none;
}
input::-webkit-input-placeholder {
  color: #c9bdf3 !important;
  font-size: 16px;
}
.el-input{
  font-size: 16px;
}
.el-upload--picture-card{
  background: #4E3494 !important;
  border: 1px dashed #9687e5;
}
.el-upload--picture-card:hover{
  border-color: #9687e5;
  color: #9687e5;
}
.title-icon{
  font-size: 25px;
}
.title-icon::before{
  content: '';
  display:inline-block;
  width:9px;
  height:9px;
  border-radius: 50%;
  margin-right: 11px;
  background-color: #76E1E9;
  position: absolute;
  top: 13px;
  left: -18px;
}
.el-upload-list__item-name{
  color: rgb(25, 25, 252) !important;
  background-color: #F5F7FA;
}
.common-radio .el-radio__input{
  border: 1px solid #fff;
  border-radius: 50%;
  width: 14px;
  height: 14px;
  position: relative;
  top: -3px;
}
.common-radio .el-radio__inner,.el-radio__inner:hover{
  border: none;
  background-color: #4E3494;
  width: 8px;
  height: 8px;
  position: relative;
  top: -2px;
  left: 2px;
}
.common-radio .el-radio__input.is-checked .el-radio__inner,.common-radio .el-radio__inner::after{
  background: #3AC372;
}
.common-radio .el-radio__label {
  color: #fff;
  padding-left: 12px;
  font-size: 18px;
}
.common-radio .el-radio__input.is-checked+.el-radio__label{
  color: #fff;
}
.common-checkbox .el-checkbox__inner{
  background: #4E3494;
  width: 8px;
  height: 8px;
  position: relative;
  top: -2px;
  left: 2px;
  border: none;
}
.common-checkbox .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner{
  background: #3AC372;
}
.common-checkbox .el-checkbox__input{
  border: 1px solid #fff;
  border-radius: 2px;
  width: 14px;
  height: 14px;
}
.common-checkbox .el-checkbox__inner::after{
  width: 4px;
  height: 4px;
  left: 1px;
  top: 0px;
}
.workflow-name{
  float: right;
  position: relative;
  font-size: 25px;
  font-family: defaultFontLight, Arial, Helvetica, sans-serif;
  font-weight: bold;
}
.el-input__inner{
  height: 30px!important;
}
.common-mavon-editor.markdown-body{
  color: #fff !important;
}
.common-mavon-editor.v-note-wrapper,.common-mavon-editor .content-input-wrapper,
.common-mavon-editor.markdown-body .highlight pre, .common-mavon-editor.markdown-body pre,
.common-mavon-editor.markdown-body textarea {
  background-color: #000 !important;
  color: #fff !important;
  font-size: 18px;
}
.common-mavon-editor .hljs,.common-mavon-editor .v-show-content{
  color: #fff !important;
  background: #000 !important;
  overflow:visible;
}
.common-mavon-editor .scroll-style{
  color: #3AC372 !important;
  background: #000;
}
.common-mavon-editor .hljs-number{
  color: #2fbfbf !important;
}
.common-mavon-editor pre{
  background: #000 !important;
}
.common-mavon-editor .hljs-string{
  color: #e65579 !important;
}
.common-mavon-editor.v-note-wrapper .v-note-panel .v-note-show .v-show-content,
.common-mavon-editor.v-note-wrapper .v-note-panel .v-note-show .v-show-content-html{
  padding: 10px;
}
.btn-disabled{
  pointer-events: none;
  cursor: default;
  color: #5E49A7 !important;
  background-color: rgba(10,9,54,.1) !important;
}

.el-textarea .el-input__count {
  background: none;
  color: #fff;
}
.el-link{
  font-size: 18px;
}


<|start_filename|>edgegallery-fe/src/locales/mecm_cn.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const mecmCn = {
  deployCommon: {
    name: '名称',
    version: '版本',
    provider: '厂商',
    affinity: '架构',
    operation: '操作',
    tip: '输入名称搜索',
    cancel: '取消',
    confirm: '确认'
  },
  deployList: {
    deployListTitle: '应用部署',
    tip: '输入内容进行搜索',
    type: '类型',
    industry: '行业',
    appstoreName: '应用仓库',
    createTime: '同步时间',
    operationBtn: '分发'
  },
  distributeDeploy: {
    title: '部署',
    hostIp: '主机IP地址',
    status: '状态',
    delete: '删除',
    distribute: '分发',
    deploy: '部署',
    distributeDeploySuccess: '分发部署成功',
    beforeDeleteFromMechost: '确认要从该节点删除应用应用包？',
    deletePacFrmoHost: '你已经成功从节点删除应用',
    tip: '输入主机IP或状态搜索',
    multipleDeploy: '批量部署',
    onePackageAtLeast: '请至少选择一条数据进行操作',
    deleteError: '请先删除分发状态为“Error”的应用'
  },
  distribute: {
    title: '分发',
    ip: 'IP地址',
    city: '城市',
    MEPM: 'MEPM地址',
    hwCapability: '硬件能力',
    selectMecHost: '请选择要下发的host节点。',
    selectVersion: '请选择要下发的应用包版本。',
    failedToDistribute: '分发失败。'
  },
  deployConfig: {
    title: '部署配置',
    IPAddress: 'IP地址：',
    status: '状态：',
    appName: '应用名称',
    appDesc: '应用描述',
    placeholderName: '名称',
    placeholderDesc: '描述',
    hardwareAbilities: '硬件能力',
    appNameVerifyRequired: '请输入应用名称',
    appNameVerifyValid: '4到16位（字母，数字）',
    appDescVerifyRequired: '请输入描述',
    deployFailed: '部署失败，请检查！',
    getTemplateListFail: '获取参数失败'
  }
}
export default mecmCn


<|start_filename|>src/pages/abilityCenter/ability.js<|end_filename|>
/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import en from '../../locales/en.js'
import cn from '../../locales/cn.js'
import { Capability } from '../../tools/api.js'

let allAbilities = []

let getAbilitiesByFirstLevelName = function (firstLevelName) {
  let capabilities = []
  Capability.getStandardCapabilities().then(results => {
    capabilities = results.data
  })
  let result = []
  result = capabilities.filter(item => item.group.name === firstLevelName)

  return result
}

let getSecondLevelAbilitys = function (parentIndex) {
  if (parentIndex >= 0 && parentIndex < allAbilities.length) {
    if (allAbilities[parentIndex].children && allAbilities[parentIndex].children.length > 0) {
      return allAbilities[parentIndex].children
    }
  }
  return []
}

let insetNewNode = function (groupData, tempTreeData, lan) {
  let firstLevelName = groupData.oneLevelName
  let secondLevelName = groupData.twoLevelName
  let thirdLevelName = groupData.threeLevelName
  let firstLevelNameEn = groupData.oneLevelNameEn
  let secondLevelNameEn = groupData.twoLevelNameEn
  let thirdLevelNameEn = groupData.threeLevelNameEn
  let obj = {
    key: '',
    label: '',
    labelEn: '',
    children: []
  }
  if (secondLevelName) {
    if (thirdLevelName) {
      let secondeLevelChildren = []
      secondeLevelChildren.push({ key: thirdLevelName, label: thirdLevelName, labelEn: thirdLevelNameEn, groupId: groupData.groupId })
      obj.children.push({
        key: lan === 'en' ? secondLevelNameEn : secondLevelName,
        label: secondLevelName,
        labelEn: secondLevelNameEn,
        children: secondeLevelChildren
      })
    } else {
      obj.children.push({
        key: lan === 'en' ? secondLevelNameEn : secondLevelName,
        label: secondLevelName,
        labelEn: secondLevelNameEn,
        groupId: groupData.groupId,
        description: groupData.description,
        descriptionEn: groupData.descriptionEn
      })
    }
  }
  obj.key = lan === 'en' ? firstLevelNameEn : firstLevelName
  obj.label = firstLevelName
  obj.labelEn = firstLevelNameEn
  tempTreeData.push(obj)
  return tempTreeData
}
let getHostAbility = function (data) {
  let result = []
  data.forEach(ele => {
    if (ele.children && ele.children.length > 0) {
      result = result.concat(ele.children)
    }
  })
  return result.slice(0, 8)
}

let initAbilities = function (groupDataFromServer, lan) {
  let tempTreeData = []
  for (let groupItem of groupDataFromServer) {
    let firstLevelName = groupItem.oneLevelName
    let firstLevelNameEn = groupItem.oneLevelNameEn
    let secondLevelName = groupItem.twoLevelName
    let secondLevelNameEn = groupItem.twoLevelNameEn
    let sameFirstNameItem = tempTreeData.filter(function (item) {
      if (item.key === getName(lan, firstLevelNameEn, firstLevelName)) {
        return item
      }
    })
    if (sameFirstNameItem.length > 0) {
      let sameSecondNameItem = sameFirstNameItem[0].children.filter(function (item) {
        if (item.key === getName(lan, secondLevelNameEn, secondLevelName)) {
          return item
        }
      })
      if (sameSecondNameItem.length > 0) {
        addThirdLevelNode(sameSecondNameItem, lan, groupItem)
      } else {
        addTwoLevelNode(sameFirstNameItem, lan, groupItem)
      }
    } else {
      tempTreeData = insetNewNode(groupItem, tempTreeData, lan)
    }
  }
  tempTreeData = [{
    key: 'hotServices',
    label: cn.api['hotServices'],
    labelEn: en.api['hotServices'],
    children: getHostAbility(tempTreeData)
  }].concat(tempTreeData)
  let tmpIndex = 0
  tempTreeData.forEach(ele => {
    ele.index = tmpIndex
    tmpIndex++
  })
  allAbilities = tempTreeData
  return allAbilities
}

let addTwoLevelNode = function (sameFirstNameItem, lan, groupItem) {
  let secondLevelName = groupItem.twoLevelName
  let thirdLevelName = groupItem.threeLevelName
  let secondLevelNameEn = groupItem.twoLevelNameEn
  let thirdLevelNameEn = groupItem.threeLevelNameEn
  if (thirdLevelName) {
    sameFirstNameItem[0].children.push({
      key: getName(lan, secondLevelNameEn, secondLevelName),
      label: secondLevelName,
      labelEn: secondLevelNameEn,
      groupId: groupItem.groupId,
      children: { key: thirdLevelName, label: thirdLevelName, labelEn: thirdLevelNameEn, groupId: groupItem.groupId }
    })
  } else {
    sameFirstNameItem[0].children.push({
      key: getName(lan, secondLevelNameEn, secondLevelName),
      label: secondLevelName,
      labelEn: secondLevelNameEn,
      groupId: groupItem.groupId,
      description: groupItem.description,
      descriptionEn: groupItem.descriptionEn
    })
  }
}

let addThirdLevelNode = function (sameSecondNameItem, lan, groupItem) {
  let thirdLevelName = groupItem.threeLevelName
  let thirdLevelNameEn = groupItem.threeLevelNameEn
  if (thirdLevelName) {
    if (sameSecondNameItem[0].children) {
      sameSecondNameItem[0].children.push({
        key: getName(lan, thirdLevelNameEn, thirdLevelName),
        label: thirdLevelName,
        labelEn: thirdLevelNameEn,
        groupId: groupItem.groupId
      })
    } else {
      sameSecondNameItem[0].children = [].concat({
        key: getName(lan, thirdLevelNameEn, thirdLevelName),
        label: thirdLevelName,
        labelEn: thirdLevelNameEn,
        groupId: groupItem.groupId
      })
    }
  }
}

let getName = function (lan, enName, cnName) {
  return lan === 'en' ? enName : cnName
}

export default {
  initAbilities,
  getSecondLevelAbilitys,
  getAbilitiesByFirstLevelName
}


<|start_filename|>edgegallery-fe/src/api/atpApi.js<|end_filename|>

/*
 *  Copyright 2021 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import {
  GET,
  POST,
  PUT
} from '../tools/request.js'
import {
  PROXY_PREFIX_CURRENTSERVER
} from '../tools/constant.js'

const URL_PREFIX_ATP = PROXY_PREFIX_CURRENTSERVER + '/mec-atp/edgegallery/atp/v2/'

let atpApi = {
  getAllSceneApi: function () {
    return GET(URL_PREFIX_ATP + 'testscenarios?limit=12&offset=0')
  },
  getSceneIconApi: function (appId) {
    return GET(URL_PREFIX_ATP + 'apps/' + appId)
  },
  getSceneCaseApi: function (params) {
    return POST(URL_PREFIX_ATP + 'testscenarios/testcases', params)
  },
  runTaskApi: function (taskId, params) {
    return POST(URL_PREFIX_ATP + 'tasks/' + taskId + '/action/run', params)
  },
  getTaskApi: function (taskId) {
    return GET(URL_PREFIX_ATP + 'tasks/' + taskId)
  },
  modifyStatusApi: function (taskId, params) {
    return PUT(URL_PREFIX_ATP + 'tasks/' + taskId + '/testcase', params)
  },
  contributionApi: function (params) {
    return POST(URL_PREFIX_ATP + 'contributions', params)
  },
  uploadReportApi: function (taskId, params) {
    return POST(URL_PREFIX_ATP + 'tasks/' + taskId + '/action/upload-report', params)
  }
}

export {
  URL_PREFIX_ATP, atpApi
}


<|start_filename|>vue.config.js<|end_filename|>
/*
 *  Copyright 2020 Huawei Technologies Co., Ltd.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

const HttpProxyAgent = require('http-proxy-agent')
const path = require('path')

function resolve (dir) {
  return path.join(__dirname, dir)
}

module.exports = {
  chainWebpack: (config) => {
    config.resolve.alias
      .set('@', resolve('src')).end()

    config.module
      .rule('yaml')
      .test(/\.yaml$/)
      .include.add(resolve('src/assets/file'))
      .end()
      .use('url-loader')
      .loader('url-loader')
      .options({
        limit: 10000,
        name: `static/yaml/[name].[hash:7].[ext]`
      })
      .end()
  },
  devServer: {
    disableHostCheck: true,
    proxy: {
      '/user-mgmt-be': {
        target: 'http://user-mgmt-be',
        agent: new HttpProxyAgent('http://127.0.0.1:8082'),
        changeOrigin: true,
        pathRewrite: {
          '^/user-mgmt-be': ''
        }
      },
      '/mec-developer': {
        target: 'http://mec-developer',
        agent: new HttpProxyAgent('http://127.0.0.1:8082'),
        changeOrigin: true,
        pathRewrite: {
          '^/mec-developer': ''
        }
      },
      '/toolchain': {
        target: 'http://toolchain',
        agent: new HttpProxyAgent('http://127.0.0.1:8082'),
        changeOrigin: true,
        pathRewrite: {
          '^/toolchain': ''
        }
      }

    }
  },
  publicPath: process.env.NODE_ENV === 'production' ? './' : '/',

  pluginOptions: {
    i18n: {
      locale: 'en',
      fallbackLocale: 'en',
      localeDir: 'locales',
      enableInSFC: false
    }
  }
}
