| | |
| | | <el-col :xs="24" :sm="12" :md="8" :lg="6" class="image-card-container"> |
| | | <div class="image-card" :class="{ 'batch-selected': isBatchMode && selected }" @click="handleCardClick"> |
| | | <!-- 多选框 (仅在批量模式下显示) --> |
| | | <div class="checkbox-wrapper" v-if="isBatchMode"> |
| | | <el-checkbox v-model="localSelected" @click.stop @change="emitSelection" /> |
| | | </div> |
| | | <!-- <div class="checkbox-wrapper" v-if="isBatchMode"> |
| | | </div> --> |
| | | <el-checkbox class="checkbox-wrapper" v-if="isBatchMode" v-model="localSelected" @click.stop |
| | | @change="emitSelection" /> |
| | | <!-- 图片容器 --> |
| | | <div class="image-container" > |
| | | <!-- <img :src="item.image" class="gallery-image" alt="监控截图" /> --> |
| | | <img src="@/assets/img/样本图.png" class="gallery-image" alt="监控截图" /> |
| | | |
| | | <!-- 标注状态标签 --> |
| | | <!-- <div :class="['tag', getTagClass(item.status)]"> |
| | | {{ getStatusText(item.status) }} |
| | | </div> --> |
| | | <div class="image-container"> |
| | | <!-- <img :src="item.imagePath" class="gallery-image" alt="监控截图" /> --> |
| | | <el-image :src="item.imagePath" class="gallery-image" fit="scale-down" /> |
| | | </div> |
| | | |
| | | <!-- 卡片操作按钮 --> |
| | | <div class="card-actions-icon"> |
| | | <div class="card-actions"> |
| | | <el-button size="mini" plain :type="item.status === 'correct' ? 'success' : 'info'" |
| | | @click.stop="changeStatus('correct')">正确</el-button> |
| | | <el-button size="mini" plain :type="item.status === 'incorrect' ? 'danger' : 'info'" |
| | | @click.stop="changeStatus('incorrect')">错误</el-button> |
| | | <el-button size="mini" plain :type="item.status === 'unknown' ? 'warning' : 'info'" |
| | | @click.stop="changeStatus('unknown')">不确定</el-button> |
| | | <el-button size="mini" plain :type="item.status === 1 ? 'success' : 'info'" |
| | | @click.stop="changeStatus(1)">正确</el-button> |
| | | <el-button size="mini" plain :type="item.status === 2 ? 'danger' : 'info'" |
| | | @click.stop="changeStatus(2)">错误</el-button> |
| | | <el-button size="mini" plain :type="item.status === 0 ? 'warning' : 'info'" |
| | | @click.stop="changeStatus(0)">不确定</el-button> |
| | | </div> |
| | | <img src="@/assets/img/删除标签.png" class="btn-icon" /> |
| | | <img src="@/assets/img/删除标签.png" class="btn-icon" @click.stop="deleteDetails()" /> |
| | | </div> |
| | | <!-- 图片信息 --> |
| | | <div class="image-info"> |
| | | <div class="image-date">{{ item.date }}</div> |
| | | <div class="image-source">{{ item.camera }}</div> |
| | | <div class="image-date">{{ formatStartDateTime(item.createTime) }}</div> |
| | | <div class="image-source">{{ item.cameraName }}</div> |
| | | </div> |
| | | |
| | | <!-- 详细操作菜单 --> |
| | |
| | | } |
| | | }, |
| | | watch: { |
| | | selected(newVal) { |
| | | this.localSelected = newVal; |
| | | selected: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | this.localSelected = newVal; |
| | | } |
| | | }, |
| | | // 添加对item.selected的深度监听 |
| | | 'item.selected': { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | this.localSelected = newVal; |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | // 格式化开始时间(保持原时间) |
| | | formatStartDateTime(date) { |
| | | if (!date) return null; |
| | | const d = new Date(date); |
| | | const pad = (num) => num.toString().padStart(2, "0"); |
| | | return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad( |
| | | d.getDate() |
| | | )} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; |
| | | }, |
| | | handleCardClick() { |
| | | // 批量模式下点击卡片触发选择 |
| | | if (this.isBatchMode) { |
| | | this.localSelected = !this.localSelected; |
| | | this.emitSelection(); |
| | | } else { |
| | | this.$emit('card-click', this.item); |
| | | } |
| | | }, |
| | | emitSelection() { |
| | | // console.info(this.selected) |
| | | this.localSelected = !this.localSelected; |
| | | this.$emit('toggle-select'); |
| | | }, |
| | | // 获取标签类名 |
| | | getTagClass(status) { |
| | | return { |
| | | 'correct': 'tag-correct', |
| | | 'incorrect': 'tag-incorrect', |
| | | 'unknown': 'tag-unknown' |
| | | }[status]; |
| | | }, |
| | | |
| | | // 获取状态文本 |
| | | getStatusText(status) { |
| | | return { |
| | | 'correct': '正确', |
| | | 'incorrect': '错误', |
| | | 'unknown': '不确定' |
| | | }[status]; |
| | | }, |
| | | |
| | | // 更改状态 |
| | | changeStatus(status) { |
| | | this.$emit('status-change', { id: this.item.id, status }); |
| | | if (!this.isBatchMode) { |
| | | this.$emit('status-change', { trainId: this.item.trainId, status }); |
| | | } |
| | | }, |
| | | |
| | | // 删除 |
| | | deleteDetails() { |
| | | this.$emit('delete-details', this.item); |
| | | }, |
| | | |
| | | // 显示详情 |
| | | showDetails() { |
| | |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .image-card.batch-selected { |
| | | box-shadow: 0 0 0 2px #409eff; |
| | | border-color: #409eff; |
| | | box-shadow: 0 0 0 2px #409eff; |
| | | border-color: #409eff; |
| | | } |
| | | |
| | | .image-card:hover { |
| | |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | /* height: 100%; */ |
| | | height: 100%; |
| | | /* object-fit: cover; */ |
| | | transition: transform 0.3s ease; |
| | | } |
| | |
| | | color: #409EFF; |
| | | border-color: #409EFF; |
| | | } |
| | | |
| | | .checkbox-wrapper { |
| | | color: #FFFFFF; |
| | | position: absolute; |
| | | top: 10px; |
| | | left: 20px; |
| | | z-index: 10; |
| | | width: 18px; |
| | | /* height: 18px; */ |
| | | color: #FFFFFF; |
| | | position: absolute; |
| | | /* top: 10px; |
| | | left: 20px; */ |
| | | margin-top: 10px; |
| | | margin-left: 10px; |
| | | z-index: 10; |
| | | } |
| | | </style> |