AlgoCanSelect.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <!-- 模板部分保持不变 -->
  3. <div class="algo-select-container">
  4. <el-card>
  5. <template #header> <div class="card-title">选择相机关联的算法</div> </template>
  6. <div class="algo-list">
  7. <div
  8. v-for="(item, index) in props.algoList"
  9. :key="index"
  10. class="algo-item"
  11. :class="{ active: selectedIds.includes(item.id), disabled: !hasAddPermission }"
  12. @click="handleAlgoSelect(item)"
  13. >
  14. <span class="algo-name">{{ item.name }}</span>
  15. </div>
  16. </div>
  17. </el-card>
  18. </div>
  19. </template>
  20. <script setup lang="ts">
  21. import { useUserStore } from '@/store/modules/user';
  22. import { PERM_ALGO } from '@/types/permission/constants';
  23. import { ElCard } from 'element-plus';
  24. import { computed, defineEmits } from 'vue';
  25. const emit = defineEmits<{
  26. (e: 'select', data: number): void;
  27. }>();
  28. interface AlgoItemLabel {
  29. name: string;
  30. id: number;
  31. }
  32. const props = defineProps<{ algoList: AlgoItemLabel[]; selectedIds: number[] }>();
  33. const userStore = useUserStore();
  34. // 处理方法
  35. const handleAlgoSelect = (item: AlgoItemLabel) => {
  36. if (!hasAddPermission.value) return;
  37. const hasId = props.selectedIds.includes(item.id);
  38. if (!hasId) {
  39. emit('select', item.id);
  40. }
  41. };
  42. const hasAddPermission = computed(() => userStore.checkPermission(PERM_ALGO.CONFIG_ADD));
  43. </script>
  44. <style lang="less" scoped>
  45. /* 样式保持不变 */
  46. .algo-select-container {
  47. margin-left: 10px;
  48. width: 250px;
  49. .algo-list {
  50. // display: flex;
  51. // flex-wrap: wrap;
  52. // gap: 12px;
  53. max-height: 442px;
  54. overflow-y: auto;
  55. }
  56. .algo-item {
  57. padding: 4px 16px;
  58. // border: 1px solid #d9d9d9;
  59. margin: 10px 0;
  60. border-radius: 4px;
  61. cursor: pointer;
  62. transition: all 0.3s;
  63. &:hover {
  64. border-color: #1890ff;
  65. color: #1890ff;
  66. }
  67. &.active {
  68. background: #1890ff;
  69. color: #fff;
  70. border-color: #1890ff;
  71. cursor: not-allowed;
  72. }
  73. &.disabled {
  74. cursor: not-allowed;
  75. opacity: 0.5;
  76. }
  77. }
  78. }
  79. .card-title {
  80. font-weight: bold;
  81. }
  82. </style>