index.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. // import FlexNetwork from '@Network/views/flex-network'
  2. // import ReservedIpList from '@Network/views/reserved-ip'
  3. // import DNS from '@Network/views/dns'
  4. // import LoadbalancerclusterList from '@Network/views/ssh-service'
  5. import Layout from '@/layouts/RouterView'
  6. import { hasSetupKey, isBaremetalProduct } from '@/utils/auth'
  7. import i18n from '@/locales'
  8. import store from '@/store'
  9. import { isScopedPolicyMenuHidden } from '@/utils/scopedPolicy'
  10. const AgentList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/agent')
  11. const AgentForm = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/agent/form')
  12. const Cloudregion = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Cloudenv/views/cloudregion')
  13. const Zone = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Cloudenv/views/zone')
  14. const CdnList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/cdn')
  15. const CdnCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/cdn/create')
  16. const SslCertificateList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/ssl-certificate')
  17. const VpcPeerConnectCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/vpc-peer-connect/create')
  18. const Ipv6Gateway = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/ipv6-gateway')
  19. const DnsZone = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/dns-zone')
  20. const DnsZoneCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/dns-zone/create')
  21. const EipCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/eip/create')
  22. const Wire = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/wire')
  23. const Network = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/network')
  24. const NetworkCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/network/Create')
  25. const EditAttributes = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/network/EditAttributes')
  26. const BatchEditAttributes = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/network/BatchEditAttributes')
  27. const Eip = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/eip')
  28. const Waf = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/waf')
  29. const GlobalVpc = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/global-vpc')
  30. const GlobalVpcCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/global-vpc/create')
  31. const RouteTableList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/route-table')
  32. const NatList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/nats')
  33. const NatCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/nats/create/index')
  34. const VPC = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/vpc')
  35. const VpcNetwork = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/vpc-network')
  36. const VpcPeerConnect = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/vpc-peer-connect')
  37. const VPCCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/vpc/create')
  38. const LbList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/lb')
  39. const LBCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/lb/create/index')
  40. const LbListenerCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/loadbalancerlistener/create')
  41. const HealthCheck = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/health-check')
  42. const LbaclsList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/lbacls')
  43. const LbcertsList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/lbcerts')
  44. const LoadbalancerclusterList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/loadbalancercluster')
  45. const LBClusterUpdate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/loadbalancercluster/update')
  46. const SshProxyList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/ssh-proxy')
  47. const SshProxyCreate = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/ssh-proxy/form')
  48. const SshAgentList = () => import(/* webpackChunkName: "network" */ /* webpackPrefetch: true */ '@Network/views/ssh-agent')
  49. const WebApp = () => import(/* webpackChunkName: "compute" */ /* webpackPrefetch: true */ '@Compute/views/webapp')
  50. export default {
  51. index: 40,
  52. meta: {
  53. label: i18n.t('network.text_16'),
  54. icon: 'menu-network',
  55. },
  56. menus: [
  57. {
  58. meta: {
  59. label: i18n.t('cloudenv.text_9'),
  60. },
  61. submenus: [
  62. {
  63. path: '/cloudregion',
  64. meta: {
  65. label: i18n.t('cloudenv.text_10'),
  66. permission: 'areas_list',
  67. hidden: () => {
  68. if (isScopedPolicyMenuHidden('sub_hidden_menus.cloudregion')) {
  69. return true
  70. }
  71. return !hasSetupKey(['onestack', 'private', 'vmware', 'baremetal'])
  72. },
  73. },
  74. component: Layout,
  75. children: [
  76. {
  77. name: 'Cloudregion',
  78. path: '',
  79. component: Cloudregion,
  80. },
  81. ],
  82. },
  83. {
  84. path: '/zone',
  85. meta: {
  86. label: i18n.t('cloudenv.text_11'),
  87. permission: 'zones_list',
  88. hidden: () => {
  89. if (isScopedPolicyMenuHidden('sub_hidden_menus.zone')) {
  90. return true
  91. }
  92. return !hasSetupKey(['onestack', 'private', 'vmware', 'baremetal'])
  93. },
  94. },
  95. component: Layout,
  96. children: [
  97. {
  98. name: 'Zone',
  99. path: '',
  100. component: Zone,
  101. },
  102. ],
  103. },
  104. ],
  105. },
  106. /**
  107. * 基础网络
  108. */
  109. {
  110. meta: {
  111. label: i18n.t('network.text_711'),
  112. },
  113. submenus: [
  114. {
  115. path: '/vpc-network',
  116. meta: {
  117. permission: 'inter_vpc_networks_list',
  118. label: i18n.t('dictionary.vpc_network'),
  119. t: 'dictionary.vpc_network',
  120. hidden: () => {
  121. if (store.getters.isProjectMode || isScopedPolicyMenuHidden('sub_hidden_menus.vpc_network')) return true
  122. return !hasSetupKey(['aliyun', 'qcloud'])
  123. },
  124. },
  125. component: Layout,
  126. children: [
  127. {
  128. name: 'VpcNetwork',
  129. path: '',
  130. component: VpcNetwork,
  131. },
  132. ],
  133. },
  134. {
  135. path: '/vpc-peerconnect',
  136. meta: {
  137. label: i18n.t('dictionary.vpc_peer_connect'),
  138. permission: 'vpc_peering_connections_list',
  139. t: 'dictionary.vpc_peer_connect',
  140. hidden: () => {
  141. if (store.getters.isProjectMode || isScopedPolicyMenuHidden('sub_hidden_menus.vpc_peerconnect')) return true
  142. return !hasSetupKey(['qcloud', 'huawei', 'aws', 'hcs'])
  143. },
  144. },
  145. component: Layout,
  146. children: [
  147. {
  148. name: 'VpcPeerConnect',
  149. path: '',
  150. component: VpcPeerConnect,
  151. },
  152. {
  153. name: 'VpcPeerConnectCreate',
  154. path: 'create',
  155. component: VpcPeerConnectCreate,
  156. },
  157. ],
  158. },
  159. {
  160. path: '/globalvpc',
  161. meta: {
  162. label: i18n.t('dictionary.globalvpc'),
  163. permission: 'network_globalvpcs_list',
  164. t: 'dictionary.globalvpc',
  165. hidden: () => {
  166. if (isScopedPolicyMenuHidden('sub_hidden_menus.globalvpc')) {
  167. return true
  168. }
  169. return !hasSetupKey('google')
  170. },
  171. },
  172. component: Layout,
  173. children: [
  174. {
  175. name: 'GlobalVPC',
  176. path: '',
  177. component: GlobalVpc,
  178. },
  179. {
  180. name: 'GlobalVpcCreate',
  181. path: 'create',
  182. component: GlobalVpcCreate,
  183. },
  184. ],
  185. },
  186. {
  187. path: '/vpc',
  188. meta: {
  189. label: i18n.t('dictionary.vpc'),
  190. permission: 'vpcs_list',
  191. t: 'dictionary.vpc',
  192. hidden: () => {
  193. if (isScopedPolicyMenuHidden('sub_hidden_menus.vpc')) {
  194. return true
  195. }
  196. if (store.getters?.globalSetting?.value?.productVersion === 'LightEdge') {
  197. return true
  198. }
  199. return isBaremetalProduct() || !hasSetupKey(['openstack', 'onestack', 'zstack', 'dstack', 'public', 'baremetal', 'apsara', 'hcso', 'hcs', 'bingocloud'])
  200. },
  201. },
  202. component: Layout,
  203. children: [
  204. {
  205. name: 'VPC',
  206. path: '',
  207. component: VPC,
  208. },
  209. {
  210. name: 'VPCCreate',
  211. path: 'create',
  212. component: VPCCreate,
  213. },
  214. ],
  215. },
  216. {
  217. path: '/routetable',
  218. meta: {
  219. label: i18n.t('dictionary.route_table'),
  220. permission: 'route_tables_list',
  221. hidden: () => {
  222. if (isScopedPolicyMenuHidden('sub_hidden_menus.routetable')) {
  223. return true
  224. }
  225. if (store.getters.isProjectMode) return true
  226. return !hasSetupKey(['aliyun', 'qcloud', 'huawei', 'aws', 'hcs'])
  227. },
  228. },
  229. component: Layout,
  230. children: [
  231. {
  232. name: 'RouteTable',
  233. path: '',
  234. component: RouteTableList,
  235. },
  236. ],
  237. },
  238. {
  239. path: '/wire',
  240. meta: {
  241. label: i18n.t('dictionary.wire'),
  242. permission: 'wires_list',
  243. t: 'dictionary.wire',
  244. hidden: () => {
  245. if (isScopedPolicyMenuHidden('sub_hidden_menus.wire')) {
  246. return true
  247. }
  248. return !hasSetupKey(['onestack', 'vmware', 'zstack', 'dstack', 'nutanix', 'baremetal'])
  249. },
  250. // hidden: () => !hasServices(['esxiagent', 'hostagent', 'bmagent']) && !hasBrands('ZStack'),
  251. },
  252. component: Layout,
  253. children: [
  254. {
  255. name: 'WireList',
  256. path: '',
  257. component: Wire,
  258. },
  259. ],
  260. },
  261. // {
  262. // path: '/flexnetwork',
  263. // meta: {
  264. // label: '弹性网卡',
  265. // permission: 'networkcard_list',
  266. // },
  267. // component: Layout,
  268. // children: [
  269. // {
  270. // name: 'NetworkcardList',
  271. // path: '',
  272. // component: FlexNetwork,
  273. // },
  274. // ],
  275. // },
  276. {
  277. path: '/network',
  278. meta: {
  279. label: i18n.t('dictionary.network'),
  280. permission: 'networks_list',
  281. t: 'dictionary.network',
  282. hidden: () => {
  283. if (isScopedPolicyMenuHidden('sub_hidden_menus.network')) {
  284. return true
  285. }
  286. return !hasSetupKey(['onestack', 'private', 'public', 'baremetal', 'vmware'])
  287. },
  288. },
  289. component: Layout,
  290. children: [
  291. {
  292. name: 'NetworkIndex',
  293. path: '',
  294. component: Network,
  295. meta: {
  296. key: '/network',
  297. keepAlive: true,
  298. keepAliveViews: ['NetworkUpdate', 'NetworkBatchUpdate'],
  299. },
  300. },
  301. {
  302. name: 'NetworkCreate',
  303. path: 'create',
  304. component: NetworkCreate,
  305. },
  306. {
  307. name: 'NetworkUpdate',
  308. path: 'edit',
  309. component: EditAttributes,
  310. },
  311. {
  312. name: 'NetworkBatchUpdate',
  313. path: 'batch-edit',
  314. component: BatchEditAttributes,
  315. },
  316. ],
  317. },
  318. // {
  319. // path: '/reservedip',
  320. // meta: {
  321. // label: '预留IP',
  322. // permission: 'reservedips_list',
  323. // },
  324. // component: Layout,
  325. // children: [
  326. // {
  327. // name: 'ReservedIP',
  328. // path: '',
  329. // component: ReservedIpList,
  330. // },
  331. // ],
  332. // },
  333. ],
  334. },
  335. /**
  336. * 网络服务
  337. */
  338. {
  339. meta: {
  340. label: i18n.t('network.text_712'),
  341. },
  342. submenus: [
  343. {
  344. path: '/eip',
  345. meta: {
  346. label: i18n.t('dictionary.eip'),
  347. permission: 'eips_list',
  348. t: 'dictionary.eip',
  349. hidden: () => {
  350. if (isScopedPolicyMenuHidden('sub_hidden_menus.eip')) {
  351. return true
  352. }
  353. return !hasSetupKey(['onestack', 'private', 'public'])
  354. },
  355. },
  356. component: Layout,
  357. children: [
  358. {
  359. name: 'EipList',
  360. path: '',
  361. component: Eip,
  362. },
  363. {
  364. name: 'EipCreate',
  365. path: 'create',
  366. component: EipCreate,
  367. },
  368. ],
  369. },
  370. {
  371. path: '/nat',
  372. meta: {
  373. label: i18n.t('dictionary.nat'),
  374. permission: 'natgateways_list',
  375. t: 'dictionary.nat',
  376. hidden: () => {
  377. if (isScopedPolicyMenuHidden('sub_hidden_menus.nat')) {
  378. return true
  379. }
  380. return !hasSetupKey(['aliyun', 'huawei', 'hcso', 'hcs'])
  381. },
  382. },
  383. component: Layout,
  384. children: [
  385. {
  386. name: 'Nat',
  387. path: '',
  388. component: NatList,
  389. },
  390. {
  391. name: 'NatCreate',
  392. path: 'create',
  393. component: NatCreate,
  394. },
  395. ],
  396. },
  397. // {
  398. // path: '/dns',
  399. // meta: {
  400. // label: i18n.t('dictionary.dns'),
  401. // permission: 'dnsrecords_list',
  402. // t: 'dictionary.dns',
  403. // // hidden: () => true,
  404. // },
  405. // component: Layout,
  406. // children: [
  407. // {
  408. // name: 'DNS',
  409. // path: '',
  410. // component: DNS,
  411. // },
  412. // ],
  413. // },
  414. {
  415. path: '/dns-zone',
  416. meta: {
  417. label: i18n.t('dictionary.dns_zone'),
  418. permission: 'dns_zones_list',
  419. hidden: () => {
  420. if (isScopedPolicyMenuHidden('sub_hidden_menus.dns_zone')) {
  421. return true
  422. }
  423. return !hasSetupKey(['onecloud', 'aws', 'qcloud', 'aliyun', 'cloudflare'])
  424. },
  425. },
  426. component: Layout,
  427. children: [
  428. {
  429. name: 'DnsZone',
  430. path: '',
  431. component: DnsZone,
  432. },
  433. {
  434. name: 'DnsZoneCreate',
  435. path: 'create',
  436. component: DnsZoneCreate,
  437. },
  438. ],
  439. },
  440. {
  441. path: '/ipv6-gateway',
  442. meta: {
  443. label: i18n.t('dictionary.ipv6_gateway'),
  444. permission: 'ipv6_gateways_list',
  445. hidden: () => {
  446. if (isScopedPolicyMenuHidden('sub_hidden_menus.ipv6_gateway')) {
  447. return true
  448. }
  449. return !hasSetupKey(['apsara', 'aliyun'])
  450. },
  451. },
  452. component: Layout,
  453. children: [
  454. {
  455. name: 'IPv6Gateway',
  456. path: '',
  457. component: Ipv6Gateway,
  458. },
  459. ],
  460. },
  461. ],
  462. },
  463. /**
  464. * 网络安全
  465. */
  466. {
  467. meta: {
  468. label: i18n.t('network.text_756'),
  469. },
  470. submenus: [
  471. {
  472. path: '/waf',
  473. meta: {
  474. label: i18n.t('dictionary.waf_instance'),
  475. permission: 'waf_instances_list',
  476. t: 'dictionary.waf_instance',
  477. hidden: () => {
  478. if (isScopedPolicyMenuHidden('sub_hidden_menus.waf')) return true
  479. if (!(store.getters.isDomainMode || store.getters.isAdminMode)) return true
  480. return !hasSetupKey(['aws', 'azure', 'aliyun', 'qcloud', 'cloudflare'])
  481. },
  482. },
  483. component: Layout,
  484. children: [
  485. {
  486. name: 'WafList',
  487. path: '',
  488. component: Waf,
  489. },
  490. ],
  491. },
  492. {
  493. path: '/webapp',
  494. meta: {
  495. label: i18n.t('compute.webapp'),
  496. permission: 'webapps_list',
  497. hidden: () => {
  498. if (isScopedPolicyMenuHidden('sub_hidden_menus.webapp')) {
  499. return true
  500. }
  501. return !hasSetupKey(['azure'])
  502. },
  503. },
  504. component: Layout,
  505. children: [
  506. {
  507. name: 'WebApp',
  508. path: '',
  509. component: WebApp,
  510. },
  511. ],
  512. },
  513. ],
  514. },
  515. /**
  516. * SSH代理
  517. */
  518. {
  519. meta: {
  520. label: i18n.t('network.ssh-proxy.title'),
  521. hidden: () => (store.getters.isProjectMode || !hasSetupKey(['private', 'vmware', 'public'])),
  522. },
  523. submenus: [
  524. {
  525. path: '/ssh-proxy',
  526. meta: {
  527. label: i18n.t('network.ssh-proxy.endpoints'),
  528. permission: 'sshproxy_node_list',
  529. hidden: () => {
  530. if (isScopedPolicyMenuHidden('sub_hidden_menus.ssh_proxy')) {
  531. return true
  532. }
  533. if (store.getters?.globalSetting?.value?.productVersion === 'AI') {
  534. return true
  535. }
  536. return !hasSetupKey(['private', 'vmware', 'public'])
  537. },
  538. },
  539. component: Layout,
  540. children: [
  541. {
  542. name: 'SshProxyList',
  543. path: '',
  544. component: SshProxyList,
  545. },
  546. {
  547. name: 'SshProxyCreate',
  548. path: 'create',
  549. component: SshProxyCreate,
  550. },
  551. ],
  552. },
  553. {
  554. path: '/ssh-agent',
  555. meta: {
  556. label: i18n.t('network.ssh-proxy.proxyservice'),
  557. permission: 'sshproxy_service_list',
  558. hidden: () => {
  559. if (isScopedPolicyMenuHidden('sub_hidden_menus.ssh_agent')) {
  560. return true
  561. }
  562. if (store.getters?.globalSetting?.value?.productVersion === 'AI') {
  563. return true
  564. }
  565. return store.getters.isDomainMode || !hasSetupKey(['private', 'vmware', 'public'])
  566. },
  567. },
  568. component: Layout,
  569. children: [
  570. {
  571. name: 'SshAgentList',
  572. path: '',
  573. component: SshAgentList,
  574. },
  575. ],
  576. },
  577. ],
  578. },
  579. /**
  580. * 负载均衡
  581. */
  582. {
  583. meta: {
  584. label: i18n.t('network.text_713'),
  585. labelAlias: '网络负载均衡',
  586. // hidden: () => !hasServices('lbagent') && !hasHypervisors(['aliyun', 'qcloud', 'huawei', 'aws']),
  587. },
  588. submenus: [
  589. {
  590. path: '/lb',
  591. meta: {
  592. label: i18n.t('network.text_714'),
  593. permission: 'lb_loadbalancers_list',
  594. hidden: () => {
  595. if (isScopedPolicyMenuHidden('sub_hidden_menus.lb')) {
  596. return true
  597. }
  598. return !hasSetupKey(['lb', 'aliyun', 'huawei', 'qcloud', 'aws', 'k8s', 'apsara', 'hcso', 'hcs', 'azure', 'google'])
  599. },
  600. },
  601. component: Layout,
  602. children: [
  603. {
  604. name: 'LBList',
  605. path: '',
  606. component: LbList,
  607. },
  608. {
  609. name: 'LBCreate',
  610. path: 'create',
  611. component: LBCreate,
  612. },
  613. {
  614. name: 'LBSDetailListenerCreate',
  615. path: ':id/listener-create',
  616. component: LbListenerCreate,
  617. },
  618. {
  619. name: 'LBSDetailListenerUpdate',
  620. path: ':id/listener-update',
  621. component: LbListenerCreate,
  622. },
  623. ],
  624. },
  625. {
  626. path: '/lbacl',
  627. meta: {
  628. label: i18n.t('network.text_715'),
  629. permission: 'lb_loadbalanceracls_list',
  630. hidden: () => {
  631. if (isScopedPolicyMenuHidden('sub_hidden_menus.lbacl')) {
  632. return true
  633. }
  634. return !hasSetupKey(['lb', 'aliyun', 'huawei', 'qcloud', 'aws', 'k8s', 'hcso', 'hcs', 'azure', 'google'])
  635. },
  636. },
  637. component: Layout,
  638. children: [
  639. {
  640. name: 'LbaclList',
  641. path: '',
  642. component: LbaclsList,
  643. },
  644. ],
  645. },
  646. {
  647. path: '/lbcert',
  648. meta: {
  649. label: i18n.t('network.text_716'),
  650. permission: 'lb_loadbalancercertificates_list',
  651. hidden: () => {
  652. if (isScopedPolicyMenuHidden('sub_hidden_menus.lbcert')) {
  653. return true
  654. }
  655. return !hasSetupKey(['lb', 'aliyun', 'huawei', 'qcloud', 'aws', 'k8s', 'apsara', 'hcso', 'hcs', 'azure', 'google'])
  656. },
  657. },
  658. component: Layout,
  659. children: [
  660. {
  661. name: 'LbcertList',
  662. path: '',
  663. component: LbcertsList,
  664. },
  665. ],
  666. },
  667. {
  668. path: '/health-check',
  669. meta: {
  670. label: i18n.t('network.health_check'),
  671. permission: 'loadbalancer_health_checks_list',
  672. t: 'network.health_check',
  673. hidden: () => {
  674. if (isScopedPolicyMenuHidden('sub_hidden_menus.health_check')) {
  675. return true
  676. }
  677. return !hasSetupKey(['lb', 'aliyun', 'huawei', 'qcloud', 'aws', 'k8s', 'apsara', 'hcso', 'hcs', 'azure', 'google'])
  678. },
  679. },
  680. component: Layout,
  681. children: [
  682. {
  683. name: 'HealthCheckList',
  684. path: '',
  685. component: HealthCheck,
  686. },
  687. ],
  688. },
  689. ],
  690. },
  691. /**
  692. * 负载均衡集群
  693. */
  694. {
  695. meta: {
  696. label: i18n.t('network.text_17'),
  697. labelAlias: i18n.t('network.text_18'),
  698. },
  699. submenus: [
  700. {
  701. path: '/cluster',
  702. meta: {
  703. label: i18n.t('network.text_19'),
  704. permission: 'lb_loadbalancerclusters_list',
  705. hidden: () => {
  706. if (isScopedPolicyMenuHidden('sub_hidden_menus.cluster')) {
  707. return true
  708. }
  709. return !hasSetupKey(['lb', 'k8s'])
  710. },
  711. },
  712. component: Layout,
  713. children: [
  714. {
  715. name: 'LoadbalancerclusterIndex',
  716. path: '',
  717. component: LoadbalancerclusterList,
  718. meta: {
  719. key: '/cluster',
  720. keepAlive: true,
  721. keepAliveViews: ['LBClusterUpdate'],
  722. },
  723. },
  724. {
  725. name: 'LBClusterUpdate',
  726. path: 'update',
  727. component: LBClusterUpdate,
  728. },
  729. ],
  730. },
  731. {
  732. path: '/lbagent',
  733. meta: {
  734. label: i18n.t('network.text_20'),
  735. permission: 'lb_loadbalanceragents_list',
  736. hidden: () => {
  737. if (isScopedPolicyMenuHidden('sub_hidden_menus.lbagent')) {
  738. return true
  739. }
  740. return !hasSetupKey(['lb', 'k8s'])
  741. },
  742. },
  743. component: Layout,
  744. children: [
  745. {
  746. name: 'AgentIndex',
  747. path: '',
  748. component: AgentList,
  749. meta: {
  750. key: '/lbagent',
  751. keepAlive: true,
  752. keepAliveViews: ['AgentForm'],
  753. },
  754. },
  755. {
  756. name: 'AgentForm',
  757. path: 'form',
  758. component: AgentForm,
  759. },
  760. ],
  761. },
  762. ],
  763. },
  764. {
  765. meta: {
  766. label: i18n.t('dictionary.cdn'),
  767. },
  768. submenus: [
  769. {
  770. path: '/cdn',
  771. meta: {
  772. label: i18n.t('dictionary.cdn_domain'),
  773. permission: 'cdn_domains_list',
  774. t: 'dictionary.cdn_domain',
  775. hidden: () => {
  776. if (isScopedPolicyMenuHidden('sub_hidden_menus.cdn')) {
  777. return true
  778. }
  779. return !hasSetupKey(['aliyun', 'qcloud', 'cloudflare'])
  780. },
  781. },
  782. component: Layout,
  783. children: [
  784. {
  785. name: 'CdnList',
  786. path: '',
  787. component: CdnList,
  788. },
  789. {
  790. name: 'CdnCreate',
  791. path: 'create',
  792. component: CdnCreate,
  793. },
  794. ],
  795. },
  796. {
  797. path: '/ssl-certificate',
  798. meta: {
  799. label: i18n.t('network.ssl_certificate'),
  800. permission: 'ssl_certificates_list',
  801. t: 'network.ssl_certificate',
  802. hidden: () => {
  803. if (isScopedPolicyMenuHidden('sub_hidden_menus.ssl_certificate')) {
  804. return true
  805. }
  806. return !hasSetupKey(['cloudflare'])
  807. },
  808. },
  809. component: Layout,
  810. children: [
  811. {
  812. name: 'SslCertificateList',
  813. path: '',
  814. component: SslCertificateList,
  815. },
  816. ],
  817. },
  818. ],
  819. },
  820. ],
  821. }