index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <el-card class="evaluation-card-container">
  3. <div
  4. class="evaluation-card-main"
  5. :style="{ cursor: pointerEnable ? 'pointer' : 'default' }"
  6. >
  7. <div class="evaluation-card-row">
  8. <div class="evaluation-card-title" :title="title">{{ title }}</div>
  9. <el-image v-if="pointerEnable"
  10. class="evaluation-card-icon"
  11. :src="require('@/assets/images/icon_rightArrow.png')"
  12. ></el-image>
  13. </div>
  14. <div class="evaluation-card-row">
  15. <div v-if="subTitle" class="evaluation-card-subTitle">{{ subTitle }}</div>
  16. <div v-if="thirdTitle" class="evaluation-card-subTitle">
  17. {{ thirdTitle }}
  18. </div>
  19. <div class="evaluation-card-stateGroup">
  20. <span
  21. class="evaluation-card-state-item"
  22. v-for="opt in stateOptions"
  23. :key="opt"
  24. :class="{
  25. 'evaluation-card-stateActive': isStateActive(state, opt),
  26. }"
  27. >{{ opt }}</span
  28. >
  29. </div>
  30. <div class="evaluation-card-proportion">{{ proportion }}</div>
  31. </div>
  32. </div>
  33. <div class="evaluation-card-extra">
  34. <slot></slot>
  35. </div>
  36. </el-card>
  37. </template>
  38. <script>
  39. export default {
  40. props: {
  41. pointerEnable: {
  42. type: Boolean,
  43. default: true,
  44. },
  45. title: {
  46. type: String,
  47. default: "",
  48. },
  49. subTitle: {
  50. type: String|Boolean,
  51. default: "",
  52. },
  53. thirdTitle: {
  54. type: String,
  55. default: "",
  56. },
  57. stateOptions: {
  58. type: Array,
  59. default: () => [],
  60. },
  61. state: {
  62. type: String,
  63. default: "",
  64. },
  65. stateMatchFunc: {
  66. type: Function,
  67. default: (state, option) => state == option,
  68. },
  69. proportion: {
  70. type: String,
  71. default: "",
  72. },
  73. },
  74. computed: {},
  75. methods: {
  76. isStateActive: function (state, option) {
  77. return this.stateMatchFunc(state, option);
  78. },
  79. },
  80. };
  81. </script>
  82. <style scoped>
  83. .evaluation-card-container {
  84. border: 1px solid #eee;
  85. border-radius: 8px;
  86. box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
  87. display: flex;
  88. flex-direction: column;
  89. }
  90. .evaluation-card-main {
  91. height: 50px;
  92. background: rgb(255, 255, 255);
  93. color: rgb(48, 49, 51);
  94. cursor: pointer;
  95. display: flex;
  96. flex-direction: column;
  97. justify-content: space-between;
  98. }
  99. .evaluation-card-row {
  100. display: flex;
  101. justify-content: space-between;
  102. align-items: baseline;
  103. }
  104. .evaluation-card-icon {
  105. width: 16px;
  106. height: 16px;
  107. }
  108. .evaluation-card-title {
  109. overflow: hidden;
  110. text-overflow: ellipsis;
  111. white-space: nowrap;
  112. padding-right: 20px;
  113. flex: 1;
  114. }
  115. .evaluation-card-subTitle {
  116. font-size: 14px;
  117. flex: 1;
  118. display: flex;
  119. align-items: center;
  120. }
  121. .evaluation-card-stateGroup {
  122. font-size: 14px;
  123. color: #cccccc;
  124. text-align: center;
  125. flex: 3;
  126. }
  127. .evaluation-card-state-item {
  128. margin-right: 10px;
  129. }
  130. .evaluation-card-stateActive {
  131. color: #30b08f;
  132. }
  133. .evaluation-card-proportion {
  134. font-size: 14px;
  135. color: #999999;
  136. text-align: right;
  137. flex: 1;
  138. display: flex;
  139. justify-content: flex-end;
  140. align-items: center;
  141. }
  142. /deep/ .el-card__body {
  143. padding: 15px;
  144. }
  145. </style>