dashboard-shell-shell 3.0.5-test.4 → 3.0.5-test.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/assets/brand/csp/favicon.png +0 -0
  2. package/assets/icons/iconfont.css +4 -1
  3. package/assets/images/pl/dark/logo.png +0 -0
  4. package/assets/styles/all.scss +23 -3
  5. package/assets/styles/base/_variables.scss +5 -5
  6. package/assets/styles/fonts/_icons.scss +3 -2
  7. package/assets/styles/global/_button.scss +8 -8
  8. package/assets/styles/global/_form.scss +1 -0
  9. package/assets/styles/global/_select.scss +1 -1
  10. package/assets/styles/global/_tooltip.scss +9 -5
  11. package/assets/styles/themes/_light.scss +6 -4
  12. package/assets/styles/vendor/vue-select.scss +2 -1
  13. package/assets/translations/en-us.yaml +59 -0
  14. package/assets/translations/zh-hans.yaml +168 -15
  15. package/components/ActionDropdown.vue +1 -1
  16. package/components/ButtonDropdown.vue +3 -1
  17. package/components/CodeMirror.vue +6 -4
  18. package/components/ContainerResourceLimit.vue +2 -2
  19. package/components/CopyToClipboard.vue +15 -0
  20. package/components/Drawer/Chrome.vue +2 -2
  21. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +30 -27
  22. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +1 -1
  23. package/components/Drawer/ResourceDetailDrawer/index.vue +5 -4
  24. package/components/ExplorerMembers.vue +28 -4
  25. package/components/GlobalRoleBindings.vue +51 -112
  26. package/components/PodSecurityAdmission.vue +2 -2
  27. package/components/RelatedResources.vue +3 -0
  28. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +1 -3
  29. package/components/Resource/Detail/Metadata/KeyValue.vue +8 -4
  30. package/components/Resource/Detail/Metadata/index.vue +3 -1
  31. package/components/Resource/Detail/TitleBar/Title.vue +4 -3
  32. package/components/Resource/Detail/TitleBar/Top.vue +2 -0
  33. package/components/Resource/Detail/TitleBar/composables.ts +16 -1
  34. package/components/Resource/Detail/TitleBar/index.vue +123 -25
  35. package/components/ResourceDetail/Masthead/index.vue +1 -1
  36. package/components/ResourceDetail/Masthead/latest.vue +1 -1
  37. package/components/ResourceDetail/Masthead/legacy.vue +8 -7
  38. package/components/ResourceDetail/legacy.vue +18 -16
  39. package/components/ResourceList/Masthead.vue +13 -17
  40. package/components/ResourceTable.vue +10 -0
  41. package/components/SideNav.vue +21 -21
  42. package/components/SortableTable/THead.vue +46 -1
  43. package/components/SortableTable/index.vue +40 -20
  44. package/components/Tabbed/index.vue +6 -1
  45. package/components/auth/Principal.vue +10 -5
  46. package/components/auth/RoleDetailEdit.vue +11 -7
  47. package/components/breadcrumb/index.vue +119 -0
  48. package/components/form/ArrayList.vue +164 -147
  49. package/components/form/ArrayListGrouped.vue +5 -3
  50. package/components/form/ChangePassword.vue +1 -1
  51. package/components/form/Command.vue +4 -5
  52. package/components/form/Conditions.vue +15 -1
  53. package/components/form/Footer.vue +1 -0
  54. package/components/form/HealthCheck.vue +0 -2
  55. package/components/form/HookOption.vue +87 -58
  56. package/components/form/InputWithSelect.vue +8 -7
  57. package/components/form/KeyValue.vue +20 -2
  58. package/components/form/LabeledSelect.vue +6 -3
  59. package/components/form/Labels.vue +2 -2
  60. package/components/form/MatchExpressions.vue +4 -4
  61. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  62. package/components/form/Members/ClusterPermissionsEditor.vue +31 -28
  63. package/components/form/Members/MembershipEditor.vue +2 -2
  64. package/components/form/NameNsDescription.vue +1 -1
  65. package/components/form/Networking.vue +6 -9
  66. package/components/form/NodeAffinity.vue +29 -28
  67. package/components/form/PodAffinity.vue +23 -23
  68. package/components/form/Probe.vue +15 -11
  69. package/components/form/ProjectMemberEditor.vue +28 -25
  70. package/components/form/ResourceQuota/Namespace.vue +4 -4
  71. package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
  72. package/components/form/ResourceQuota/Project.vue +4 -4
  73. package/components/form/ResourceQuota/ProjectRow.vue +36 -30
  74. package/components/form/ResourceSelector.vue +1 -1
  75. package/components/form/Security.vue +1 -3
  76. package/components/form/Select.vue +7 -1
  77. package/components/form/ServiceNameSelect.vue +2 -5
  78. package/components/form/ServicePorts.vue +149 -75
  79. package/components/form/Taints.vue +2 -1
  80. package/components/form/Tolerations.vue +13 -9
  81. package/components/form/ValueFromResource.vue +110 -96
  82. package/components/form/WorkloadPorts.vue +143 -123
  83. package/components/formatter/WorkloadHealthScale.vue +4 -3
  84. package/components/nav/Group.vue +6 -0
  85. package/components/nav/Header.vue +7 -4
  86. package/components/nav/NamespaceFilter.vue +15 -21
  87. package/components/nav/TopLevelMenu.vue +99 -125
  88. package/components/nav/Type.vue +11 -3
  89. package/config/menuRouteMap.js +10 -0
  90. package/config/product/explorer.js +31 -9
  91. package/config/router/navigation-guards/index.js +61 -3
  92. package/detail/node.vue +28 -23
  93. package/dialog/AddCustomBadgeDialog.vue +17 -9
  94. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  95. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  96. package/edit/autoscaling.horizontalpodautoscaler/index.vue +3 -1
  97. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  98. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  99. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  100. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  101. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  102. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  103. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  104. package/edit/configmap.vue +4 -0
  105. package/edit/networking.k8s.io.ingress/Certificate.vue +14 -5
  106. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  107. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  108. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  109. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -3
  110. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  111. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +12 -11
  112. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  113. package/edit/persistentvolume/index.vue +3 -1
  114. package/edit/persistentvolumeclaim.vue +2 -0
  115. package/edit/secret/index.vue +2 -2
  116. package/edit/service.vue +4 -1
  117. package/edit/storage.k8s.io.storageclass/index.vue +10 -8
  118. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  119. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  120. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  121. package/edit/workload/Job.vue +31 -34
  122. package/edit/workload/Upgrading.vue +5 -5
  123. package/edit/workload/index.vue +22 -18
  124. package/edit/workload/storage/Mount.vue +1 -0
  125. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  126. package/edit/workload/storage/azureDisk.vue +14 -10
  127. package/edit/workload/storage/azureFile.vue +9 -7
  128. package/edit/workload/storage/csi/index.vue +6 -9
  129. package/edit/workload/storage/emptyDir.vue +7 -5
  130. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  131. package/edit/workload/storage/hostPath.vue +7 -5
  132. package/edit/workload/storage/nfs.vue +8 -6
  133. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  134. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  135. package/edit/workload/storage/secret.vue +9 -6
  136. package/edit/workload/storage/vsphereVolume.vue +11 -7
  137. package/initialize/app-extended.js +7 -1
  138. package/models/provisioning.cattle.io.cluster.js +19 -18
  139. package/package.json +1 -1
  140. package/pages/account/index.vue +90 -118
  141. package/pages/account/pri.vue +229 -0
  142. package/pages/auth/login.vue +6 -1
  143. package/pages/auth/setup.vue +36 -17
  144. package/pages/c/_cluster/_product/namespaces.vue +1 -1
  145. package/pages/c/_cluster/auth/roles/index.vue +38 -5
  146. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  147. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  148. package/pages/home.vue +3 -4
  149. package/pkg/tsconfig.json +9 -9
  150. package/pkg/vue.config.js +1 -1
  151. package/plugins/dashboard-store/resource-class.js +28 -27
  152. package/rancher-components/BadgeState/BadgeState.vue +33 -52
  153. package/rancher-components/Banner/Banner.vue +4 -1
  154. package/rancher-components/Form/Radio/RadioGroup.vue +9 -1
  155. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +31 -2
  156. package/rancher-components/RcDropdown/RcDropdownMenu.vue +8 -7
  157. package/scripts/publish-shell.sh +1 -1
  158. package/store/i18n.js +4 -0
  159. package/store/type-map.js +1 -3
  160. package/types/shell/index.d.ts +4 -30
  161. package/utils/error.js +3 -1
  162. package/utils/errorTranslate.json +366 -2
  163. package/vue.config.js +1 -1
@@ -1074,12 +1074,22 @@ export default {
1074
1074
  if ( col.labelKey ) {
1075
1075
  return this.t(col.labelKey, undefined, true);
1076
1076
  } else if ( col.label ) {
1077
- return col.label;
1077
+ // 判断 label 是否为中文
1078
+ if (this.isChinese(col.label)) {
1079
+ return col.label;
1080
+ } else {
1081
+ return this.t(`tableHeaders.${col.label.replace(/\s+/g, '').toLowerCase()}`, undefined, true);
1082
+ }
1078
1083
  }
1079
1084
 
1080
1085
  return ucFirst(col.name);
1081
1086
  },
1082
1087
 
1088
+ // 判断字符串是否包含中文
1089
+ isChinese(str) {
1090
+ return /[\u4e00-\u9fa5]/.test(str);
1091
+ },
1092
+
1083
1093
  valueFor(row, col, isLabel) {
1084
1094
  if (typeof col.value === 'function') {
1085
1095
  return col.value(row);
@@ -1259,15 +1269,15 @@ export default {
1259
1269
  >
1260
1270
  <!-- 主标题和过滤器区域 -->
1261
1271
  <div
1262
- :class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel}"
1263
- class="sortable-table-header mb-20"
1272
+ :class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel }"
1273
+ class="sortable-table-header"
1264
1274
  >
1265
1275
  <slot name="title" />
1266
1276
 
1267
1277
  <!-- 顶部功能行区域 -->
1268
1278
  <div
1269
1279
  v-if="showHeaderRow"
1270
- class="fixed-header-table-actions"
1280
+ class="fixed-header-table-actions mb-20"
1271
1281
  :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering, }"
1272
1282
  style="display: flex;"
1273
1283
  >
@@ -1280,6 +1290,8 @@ export default {
1280
1290
  style="max-height: 32px;"
1281
1291
  >
1282
1292
 
1293
+ <slot name="search-main-button" />
1294
+
1283
1295
  <!-- 已应用的高级筛选 -->
1284
1296
  <ul
1285
1297
  v-if="hasAdvancedFiltering"
@@ -1367,9 +1379,6 @@ export default {
1367
1379
  <slot name="header-button" />
1368
1380
 
1369
1381
  <div style="display: flex;">
1370
-
1371
- <slot name="search-main-button" />
1372
-
1373
1382
  <!-- 搜索输入框 -->
1374
1383
  <input
1375
1384
  v-if="search"
@@ -1398,14 +1407,18 @@ export default {
1398
1407
 
1399
1408
  </div>
1400
1409
 
1401
- <!-- 中间区域插槽 -->
1402
- <div
1403
- v-if="!hasAdvancedFiltering && $slots['header-middle']"
1404
- class="middle"
1405
- style="margin-left: 10px;"
1406
- >
1407
- <slot name="header-middle" />
1408
- </div>
1410
+ <div style="display: flex;">
1411
+ <slot name="header-button-left" />
1412
+
1413
+ <!-- 中间区域插槽 -->
1414
+ <div
1415
+ v-if="!hasAdvancedFiltering && $slots['header-middle']"
1416
+ class="middle"
1417
+ style="margin-left: 10px;"
1418
+ >
1419
+ <slot name="header-middle" />
1420
+ </div>
1421
+ </div>
1409
1422
  </div>
1410
1423
  </div>
1411
1424
 
@@ -1841,7 +1854,7 @@ export default {
1841
1854
  class="paging"
1842
1855
  >
1843
1856
  <div style="height: 100%; align-content: center;">
1844
- 共 {{ filteredRows.length }} 条
1857
+ 共 {{ filteredRows ? filteredRows.length : 0 }} 条
1845
1858
  </div>
1846
1859
 
1847
1860
  <button
@@ -2186,7 +2199,7 @@ export default {
2186
2199
  border-collapse: collapse;
2187
2200
  min-width: 400px;
2188
2201
  border-radius: 5px 5px 0 0;
2189
- border-bottom: 1px solid var(--border);
2202
+ border-bottom: 1px solid var(--border) !important;
2190
2203
  /* outline: 1px solid var(--border); */
2191
2204
  background: var(--sortable-table-bg);
2192
2205
  border-radius: 4px;
@@ -2201,6 +2214,9 @@ export default {
2201
2214
  td {
2202
2215
  padding: 8px 5px;
2203
2216
  border: 0;
2217
+ white-space: normal;
2218
+ word-break: break-all;
2219
+ overflow-wrap: break-word;
2204
2220
 
2205
2221
  &:first-child {
2206
2222
  padding-left: 10px;
@@ -2217,8 +2233,9 @@ export default {
2217
2233
 
2218
2234
  tbody {
2219
2235
  tr {
2220
- border-bottom: 1px solid var(--sortable-table-top-divider);
2236
+ border-bottom: 1px solid var(--sortable-table-top-divider) !important;
2221
2237
  background-color: var(--sortable-table-row-bg);
2238
+ height: 60px;
2222
2239
 
2223
2240
  &.main-row.has-sub-row {
2224
2241
  border-bottom: 0;
@@ -2282,6 +2299,7 @@ export default {
2282
2299
 
2283
2300
  &:first-child {
2284
2301
  border-bottom: 2px solid var(--sortable-table-row-bg);
2302
+ height: 40px;
2285
2303
  }
2286
2304
 
2287
2305
  &:not(:first-child) {
@@ -2658,13 +2676,15 @@ export default {
2658
2676
 
2659
2677
  .pageSelect{
2660
2678
  &:deep() .vs__actions:after{
2661
- padding-top: 10px;
2679
+ // padding-top: 10px;
2680
+ display: flex;
2681
+ align-items: center;
2662
2682
  }
2663
2683
  }
2664
2684
  .sort-table-div{
2665
2685
  width:100%;
2666
2686
  white-space:nowrap;
2667
- overflow-x: auto;
2687
+ // overflow-x: auto;
2668
2688
  }
2669
2689
 
2670
2690
  /* 滚动阴影左边 */
@@ -384,12 +384,13 @@ export default {
384
384
 
385
385
  &.horizontal {
386
386
  border: solid thin var(--border);
387
- border-bottom: 0;
387
+ // border-bottom: 0;
388
388
  display: flex;
389
389
  flex-direction: row;
390
390
 
391
391
  + .tab-container {
392
392
  border: solid thin var(--border);
393
+ border-top: 0px;
393
394
  }
394
395
 
395
396
  .tab.active {
@@ -504,6 +505,8 @@ margin: 0px -20px;
504
505
  display: flex;
505
506
  border-bottom:1px solid #d7d7d7;
506
507
  padding: 0 0 0 20px;
508
+ // overflow: auto;
509
+ // overflow-y: hidden;
507
510
  /* flex: 1 0; */
508
511
  /* flex-direction: column; */
509
512
 
@@ -571,6 +574,8 @@ margin: 0px -20px;
571
574
  li {
572
575
  display: flex;
573
576
  flex: 1;
577
+ border-left: 1px solid var(--border);
578
+ border-right: 1px solid var(--border);
574
579
 
575
580
  .btn {
576
581
  flex: 1 1;
@@ -20,7 +20,11 @@ export default {
20
20
  isShowPass: {
21
21
  type: Boolean,
22
22
  default: false,
23
- }
23
+ },
24
+ userLogoSize: {
25
+ type: Number,
26
+ default: 20,
27
+ },
24
28
  },
25
29
 
26
30
  async fetch() {
@@ -90,8 +94,9 @@ export default {
90
94
  </template>
91
95
 
92
96
  <template v-else-if="principal">
93
- <div class="avatar">
97
+ <div :style="userLogoSize === 79 ? { width: '287px' } : {}" class="avatar">
94
98
  <img
99
+ :style="{ width: userLogoSize + 'px', height: userLogoSize + 'px' }"
95
100
  src="@shell/assets/images/user.png"
96
101
  :class="{'round': principal.roundAvatar}"
97
102
  :alt="t('principal.alt.avatar')"
@@ -166,7 +171,7 @@ export default {
166
171
  </template>
167
172
 
168
173
  <style lang="scss" scoped>
169
- $size: 79px;
174
+ $size: 20px;
170
175
 
171
176
  .principal {
172
177
  display: grid;
@@ -174,7 +179,7 @@ export default {
174
179
  "avatar name"
175
180
  "avatar description";
176
181
  grid-template-columns: $size auto;
177
- grid-template-rows: auto math.div($size, 2);
182
+ // grid-template-rows: auto math.div($size, 2);
178
183
  column-gap: 10px;
179
184
 
180
185
  th {
@@ -209,7 +214,7 @@ export default {
209
214
  .avatar {
210
215
  /* grid-area: avatar;
211
216
  text-align: center; */
212
- width: 287px;
217
+ // width: 287px;
213
218
  display: flex;
214
219
  justify-content: center;
215
220
  align-items: center;
@@ -152,7 +152,7 @@ export default {
152
152
  });
153
153
  }
154
154
 
155
- if (this.value?.metadata?.name && !this.value.displayName) {
155
+ if (this.value?.metadata?.name && !this.value?.displayName) {
156
156
  this.value['displayName'] = this.value.metadata.name;
157
157
  }
158
158
 
@@ -705,12 +705,12 @@ export default {
705
705
  <!-- 列表头部 -->
706
706
  <template #column-headers>
707
707
  <div class="column-headers row">
708
- <div :class="ruleClass">
708
+ <div class="arrayListCls" :class="ruleClass">
709
709
  <span class="text-label">{{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.verbs') }}
710
710
  <span class="required">*</span>
711
711
  </span>
712
712
  </div>
713
- <div :class="ruleClass">
713
+ <div class="arrayListCls" :class="ruleClass">
714
714
  <span class="text-label">
715
715
  {{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.resources') }}
716
716
  <i
@@ -723,7 +723,7 @@ export default {
723
723
  >*</span>
724
724
  </span>
725
725
  </div>
726
- <div :class="ruleClass">
726
+ <div class="arrayListCls" :class="ruleClass">
727
727
  <span class="text-label">{{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.apiGroups') }}</span>
728
728
  </div>
729
729
  <div
@@ -740,7 +740,7 @@ export default {
740
740
  <div class="columns row mr-20">
741
741
 
742
742
  <!-- 动作(verbs)选择 -->
743
- <div :class="ruleClass">
743
+ <div class="arrayListCls" :class="ruleClass">
744
744
  <!-- Select verbs -->
745
745
  <Select
746
746
  :value="props.row.value.verbs"
@@ -758,7 +758,7 @@ export default {
758
758
  </div>
759
759
 
760
760
  <!-- 资源(resources)选择 -->
761
- <div :class="ruleClass">
761
+ <div class="arrayListCls" :class="ruleClass">
762
762
  <Select
763
763
  style="width: auto;"
764
764
  :value="getRule('resources', props.row.value)"
@@ -776,7 +776,7 @@ export default {
776
776
  </div>
777
777
 
778
778
  <!-- API Groups 输入 -->
779
- <div :class="ruleClass">
779
+ <div class="arrayListCls" :class="ruleClass">
780
780
  <LabeledInput
781
781
  :value="getRule('apiGroups', props.row.value)"
782
782
  :disabled="isBuiltin"
@@ -788,6 +788,7 @@ export default {
788
788
 
789
789
  <!-- 非命名空间 URL 输入(仅非命名空间模式显示) -->
790
790
  <div
791
+ class="arrayListCls"
791
792
  v-if="!isNamespaced"
792
793
  :class="ruleClass"
793
794
  >
@@ -859,6 +860,9 @@ export default {
859
860
  </template>
860
861
 
861
862
  <style lang="scss" scoped>
863
+ .arrayListCls {
864
+ min-width: 360px;
865
+ }
862
866
  .ruleCls {
863
867
  margin-right: 10px;
864
868
  }
@@ -0,0 +1,119 @@
1
+ <script>
2
+ import { get } from '@shell/utils/object';;
3
+ import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
4
+ import { useStore } from 'vuex';
5
+
6
+ export default {
7
+
8
+ name: 'MastheadBreadcrumb',
9
+
10
+ components: {
11
+ },
12
+ props: {
13
+ resourceTypeLabel: {
14
+ type: String,
15
+ default: ''
16
+ },
17
+
18
+ resource: {
19
+ type: String,
20
+ default: null,
21
+ },
22
+
23
+ realMode: {
24
+ type: String,
25
+ default: 'view',
26
+ }
27
+
28
+ },
29
+
30
+ setup() {
31
+ const store = useStore();
32
+ const { featureDropdownMenu } = useRuntimeFlag(store);
33
+
34
+ return { featureDropdownMenu };
35
+ },
36
+
37
+ data() {
38
+ return {
39
+ };
40
+ },
41
+
42
+ computed: {
43
+
44
+ demoDisplay() {
45
+
46
+ const resources = this.$route.params?.resource || ''
47
+
48
+ let productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], resources);
49
+ const parts = productId?.split('::') || [];
50
+ const newString = 'root';
51
+
52
+ if (!parts?.includes(newString)) {
53
+ parts?.unshift(newString); // 将字符串添加到数组第一位
54
+ }
55
+
56
+ const partsEn = parts.map((item) => {
57
+ return this.$store.getters['i18n/t'](`typeLabel."${ item.toLowerCase() }"`);
58
+ });
59
+
60
+ return partsEn;
61
+ },
62
+
63
+ },
64
+
65
+ methods: {
66
+ get,
67
+ }
68
+ };
69
+ </script>
70
+
71
+ <template>
72
+ <div class="masthead">
73
+ <div class="title">
74
+ <!-- 标题区域 -->
75
+ <div
76
+ class="excram-list"
77
+ >
78
+ <span
79
+ v-for="(item,index) in demoDisplay"
80
+ :key="index"
81
+ >
82
+ <span>{{ item }}</span>
83
+ <span>/</span>
84
+ </span>
85
+ <span class="excram-last-name">
86
+ {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + resourceTypeLabel }}
87
+ </span>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </template>
92
+
93
+ <style lang='scss' scoped>
94
+
95
+ .excram-list{
96
+ font-size: 14px;
97
+ margin-bottom: 20px;
98
+ }
99
+ .excram-last-name{
100
+ color: var(--link);
101
+ }
102
+
103
+ .detailIcon-span{
104
+ width: 24px;
105
+ height: 24px;
106
+ display: inline-block;
107
+ position: relative;
108
+ background: var(--primary);
109
+ margin-right: 10px;
110
+ }
111
+ .detailIcon{
112
+ position: absolute;
113
+ color: #fff;
114
+ font-size: 38px;
115
+ left: 4px;
116
+ top: -2px;
117
+ }
118
+
119
+ </style>