|
|
@@ -14,6 +14,11 @@
|
|
|
<el-form-item label="制造商">
|
|
|
<el-input v-model="searchForm.manufacturer" placeholder="请输入制造商" clearable style="width:160px" />
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="所属片区">
|
|
|
+ <el-select v-model="searchForm.district" placeholder="请选择所属片区" clearable style="width:120px">
|
|
|
+ <el-option v-for="opt in districtOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="handleSearch">查询</el-button>
|
|
|
<el-button @click="handleReset">重置</el-button>
|
|
|
@@ -25,6 +30,26 @@
|
|
|
<el-card class="table-card">
|
|
|
<el-table :data="tableData" border stripe v-loading="loading" style="width: 100%">
|
|
|
<el-table-column prop="equipmentCode" label="设备编码" min-width="130" />
|
|
|
+ <el-table-column prop="district" label="所属片区" min-width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span>{{ row.district || '-' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="设备图片" width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div v-if="row.equipmentImage" class="table-image-cell">
|
|
|
+ <el-image
|
|
|
+ :src="row.equipmentImage"
|
|
|
+ fit="cover"
|
|
|
+ :preview-src-list="[row.equipmentImage]"
|
|
|
+ preview-teleported
|
|
|
+ hide-on-click-pdf
|
|
|
+ class="equipment-table-image"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <el-tag v-else type="info" size="small">无图</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="equipmentName" label="设备名称" min-width="160" />
|
|
|
<el-table-column prop="equipmentModel" label="设备型号" width="110" />
|
|
|
<el-table-column prop="manufacturer" label="制造商" width="110" />
|
|
|
@@ -84,6 +109,7 @@
|
|
|
<el-descriptions-item label="设备编码" :span="1">{{ detailData.equipmentCode }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="设备名称" :span="1">{{ detailData.equipmentName }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="设备型号">{{ detailData.equipmentModel }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="设备类别">{{ detailData.typeName || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="规格参数">{{ detailData.equipmentSpec }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="制造商">{{ detailData.manufacturer }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="生产日期">{{ detailData.productionDate }}</el-descriptions-item>
|
|
|
@@ -113,6 +139,20 @@
|
|
|
</el-descriptions-item>
|
|
|
<el-descriptions-item label="维护人员">{{ detailData.maintainer || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="联系方式">{{ detailData.maintainerPhone || '-' }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="所属片区">{{ detailData.district || '-' }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="经度">{{ detailData.longitude || '-' }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="纬度">{{ detailData.latitude || '-' }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="设备图片" :span="2">
|
|
|
+ <el-image
|
|
|
+ v-if="detailData.equipmentImage"
|
|
|
+ :src="detailData.equipmentImage"
|
|
|
+ fit="cover"
|
|
|
+ :preview-src-list="[detailData.equipmentImage]"
|
|
|
+ preview-teleported
|
|
|
+ class="detail-equipment-image"
|
|
|
+ />
|
|
|
+ <span v-else>-</span>
|
|
|
+ </el-descriptions-item>
|
|
|
<el-descriptions-item label="备注" :span="2">{{ detailData.remark || '-' }}</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
|
</el-dialog>
|
|
|
@@ -120,28 +160,42 @@
|
|
|
<el-dialog :title="dialogTitle" v-model="dialogVisible" width="1100px" destroy-on-close>
|
|
|
<el-form :model="formData" :rules="rules" ref="formRef" label-width="110px" size="default">
|
|
|
<el-row :gutter="28">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="所属片区" prop="district">
|
|
|
+ <el-select v-model="formData.district" placeholder="请选择所属片区" style="width:100%" @change="onDistrictChange">
|
|
|
+ <el-option v-for="opt in districtOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="设备编码" prop="equipmentCode">
|
|
|
- <el-input v-model="formData.equipmentCode" placeholder="请输入设备编码" />
|
|
|
+ <el-input v-model="formData.equipmentCode" placeholder="保存时自动生成" readonly />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="设备名称" prop="equipmentName">
|
|
|
<el-input v-model="formData.equipmentName" placeholder="请输入设备名称" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="设备型号">
|
|
|
<el-input v-model="formData.equipmentModel" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="规格参数">
|
|
|
<el-input v-model="formData.equipmentSpec" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="制造商">
|
|
|
+ <el-input v-model="formData.manufacturer" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
@@ -151,25 +205,18 @@
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="制造商">
|
|
|
- <el-input v-model="formData.manufacturer" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="安装位置">
|
|
|
<el-input v-model="formData.equipmentLocation" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="维护人员">
|
|
|
<el-input v-model="formData.maintainer" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="所属管线">
|
|
|
<el-select v-model="formData.networkId" placeholder="请选择管线" clearable style="width:100%" @change="onNetworkChange">
|
|
|
@@ -177,6 +224,8 @@
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="关联管点">
|
|
|
<el-select v-model="formData.pointId" placeholder="请先选择管线" clearable style="width:100%">
|
|
|
@@ -184,20 +233,18 @@
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="经度">
|
|
|
<el-input-number v-model="formData.longitude" :precision="10" style="width:100%" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="纬度">
|
|
|
<el-input-number v-model="formData.latitude" :precision="10" style="width:100%" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="28">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="联系方式">
|
|
|
<el-input v-model="formData.maintainerPhone" />
|
|
|
@@ -207,6 +254,29 @@
|
|
|
<el-form-item label="备注">
|
|
|
<el-input v-model="formData.remark" type="textarea" :rows="3" />
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="设备图片">
|
|
|
+ <el-upload
|
|
|
+ class="image-uploader"
|
|
|
+ action="#"
|
|
|
+ :auto-upload="false"
|
|
|
+ :show-file-list="false"
|
|
|
+ :http-request="handleUploadRequest"
|
|
|
+ :on-change="handleImageChange"
|
|
|
+ :on-remove="handleImageRemove"
|
|
|
+ accept="image/jpeg,image/png,image/jpg"
|
|
|
+ >
|
|
|
+ <div v-if="formData.equipmentImage || equipmentImagePreview">
|
|
|
+ <img :src="equipmentImagePreview || formData.equipmentImage" alt="设备图片" class="preview-image" />
|
|
|
+ <div class="image-uploader-cover">
|
|
|
+ <el-icon><Plus /></el-icon>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else class="image-uploader-placeholder">
|
|
|
+ <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
|
|
|
+ <div>点击上传图片</div>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<el-button @click="dialogVisible = false">取消</el-button>
|
|
|
@@ -219,32 +289,62 @@
|
|
|
<script setup>
|
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
+import { Plus, UploadFilled } from '@element-plus/icons-vue'
|
|
|
+import request from '@/utils/request'
|
|
|
import { getEquipmentFullPage, addEquipment, updateEquipment, deleteEquipment, getEquipmentTypeList, getPipeNetworkOptions, getGasPipePointPage } from '@/api/pipeNetwork/basic'
|
|
|
|
|
|
+const baseApi = import.meta.env.VITE_APP_BASE_API
|
|
|
+
|
|
|
const loading = ref(false)
|
|
|
const tableData = ref([])
|
|
|
const pageNum = ref(1)
|
|
|
const pageSize = ref(10)
|
|
|
const total = ref(0)
|
|
|
-const searchForm = reactive({ equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '' })
|
|
|
+const searchForm = reactive({ equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '', district: '' })
|
|
|
const dialogVisible = ref(false)
|
|
|
const dialogTitle = ref('新增')
|
|
|
const formRef = ref(null)
|
|
|
+
|
|
|
const rules = {
|
|
|
- equipmentCode: [{ required: true, message: '请输入设备编码', trigger: 'blur' }],
|
|
|
equipmentName: [{ required: true, message: '请输入设备名称', trigger: 'blur' }],
|
|
|
- equipmentTypeId: [{ required: true, message: '请选择设备类别', trigger: 'change' }]
|
|
|
+ equipmentTypeId: [{ required: true, message: '请选择设备类别', trigger: 'change' }],
|
|
|
+ district: [{ required: true, message: '请选择所属片区', trigger: 'change' }]
|
|
|
}
|
|
|
+
|
|
|
const detailVisible = ref(false)
|
|
|
const detailData = ref(null)
|
|
|
const equipmentTypeOptions = ref([])
|
|
|
const networkOptions = ref([])
|
|
|
const pointOptions = ref([])
|
|
|
+const equipmentImagePreview = ref('')
|
|
|
+let equipmentImageFile = null
|
|
|
+
|
|
|
+const districtOptions = [
|
|
|
+ { label: '城南', value: '城南', prefix: 'CN' },
|
|
|
+ { label: '城北', value: '城北', prefix: 'CB' },
|
|
|
+ { label: '太常', value: '太常', prefix: 'TC' }
|
|
|
+]
|
|
|
+
|
|
|
+const generateEquipmentCode = () => {
|
|
|
+ if (!formData.district) return ''
|
|
|
+ const opt = districtOptions.find(o => o.value === formData.district)
|
|
|
+ if (opt && opt.prefix) {
|
|
|
+ const now = new Date()
|
|
|
+ const dateStr = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}`
|
|
|
+ const timeStr = `${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`
|
|
|
+ return `${opt.prefix}-GAS-${dateStr}${timeStr}`
|
|
|
+ }
|
|
|
+ return ''
|
|
|
+}
|
|
|
+
|
|
|
const formData = reactive({
|
|
|
- equipmentCode: '', equipmentName: '', equipmentModel: '',
|
|
|
+ district: '',
|
|
|
+ equipmentCode: '',
|
|
|
+ equipmentName: '', equipmentModel: '',
|
|
|
equipmentSpec: '', manufacturer: '', equipmentLocation: '', equipmentTypeId: '',
|
|
|
networkId: '', pointId: '',
|
|
|
- longitude: null, latitude: null, maintainer: '', maintainerPhone: '', remark: ''
|
|
|
+ longitude: null, latitude: null, maintainer: '', maintainerPhone: '', remark: '',
|
|
|
+ equipmentImage: ''
|
|
|
})
|
|
|
|
|
|
async function loadData() {
|
|
|
@@ -257,7 +357,7 @@ async function loadData() {
|
|
|
}
|
|
|
function handleSearch() { pageNum.value = 1; loadData() }
|
|
|
function handleReset() {
|
|
|
- Object.assign(searchForm, { equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '' })
|
|
|
+ Object.assign(searchForm, { equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '', district: '' })
|
|
|
handleSearch()
|
|
|
}
|
|
|
async function loadEquipmentTypes() {
|
|
|
@@ -283,17 +383,82 @@ function onNetworkChange(val) {
|
|
|
formData.pointId = ''
|
|
|
if (val) { loadPointOptions(val) } else { pointOptions.value = [] }
|
|
|
}
|
|
|
+function onDistrictChange() {
|
|
|
+ // 当片区变更时,如果正在新增模式下,自动生成设备编码
|
|
|
+ if (!formData.equipmentId && formData.district) {
|
|
|
+ formData.equipmentCode = generateEquipmentCode()
|
|
|
+ }
|
|
|
+}
|
|
|
+/** 覆盖 el-upload 默认上传行为,不做任何请求 */
|
|
|
+function handleUploadRequest() {
|
|
|
+ // 空函数,阻止 el-upload 默认的 action 请求
|
|
|
+}
|
|
|
+
|
|
|
+/** 图片选择后处理(验证 + 预览) */
|
|
|
+function handleImageChange(file) {
|
|
|
+ if (!file.raw) return
|
|
|
+ const isImage = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png' || file.raw.type === 'image/jpg'
|
|
|
+ if (!isImage) {
|
|
|
+ ElMessage.error('只能上传图片文件 (JPG/PNG)!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const isLt5M = file.raw.size / 1024 / 1024 < 5
|
|
|
+ if (!isLt5M) {
|
|
|
+ ElMessage.error('图片大小不能超过 5MB!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ equipmentImageFile = file.raw
|
|
|
+ const reader = new FileReader()
|
|
|
+ reader.readAsDataURL(file.raw)
|
|
|
+ reader.onload = () => {
|
|
|
+ equipmentImagePreview.value = reader.result
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/** 图片删除 */
|
|
|
+function handleImageRemove() {
|
|
|
+ equipmentImageFile = null
|
|
|
+ equipmentImagePreview.value = ''
|
|
|
+ formData.equipmentImage = ''
|
|
|
+}
|
|
|
+
|
|
|
function handleAdd() {
|
|
|
dialogTitle.value = '新增'
|
|
|
- const template = { equipmentCode: '', equipmentName: '', equipmentModel: '', equipmentSpec: '', manufacturer: '', equipmentLocation: '', equipmentTypeId: '', networkId: '', pointId: '', longitude: null, latitude: null, maintainer: '', maintainerPhone: '', remark: '' }
|
|
|
+ const template = {
|
|
|
+ equipmentCode: '',
|
|
|
+ equipmentName: '',
|
|
|
+ equipmentModel: '',
|
|
|
+ equipmentSpec: '',
|
|
|
+ manufacturer: '',
|
|
|
+ equipmentLocation: '',
|
|
|
+ equipmentTypeId: '',
|
|
|
+ networkId: '',
|
|
|
+ pointId: '',
|
|
|
+ longitude: null,
|
|
|
+ latitude: null,
|
|
|
+ maintainer: '',
|
|
|
+ maintainerPhone: '',
|
|
|
+ remark: '',
|
|
|
+ district: '',
|
|
|
+ equipmentImage: ''
|
|
|
+ }
|
|
|
if (formData.equipmentId) delete formData.equipmentId
|
|
|
Object.assign(formData, template)
|
|
|
+ equipmentImageFile = null
|
|
|
+ equipmentImagePreview.value = ''
|
|
|
dialogVisible.value = true
|
|
|
loadEquipmentTypes(); loadNetworkOptions()
|
|
|
}
|
|
|
function handleEdit(row) {
|
|
|
dialogTitle.value = '编辑'
|
|
|
Object.assign(formData, row)
|
|
|
+ // 如果有已有图片,直接使用返回的 URL 生成预览
|
|
|
+ if (row.equipmentImage) {
|
|
|
+ equipmentImagePreview.value = row.equipmentImage
|
|
|
+ } else {
|
|
|
+ equipmentImagePreview.value = ''
|
|
|
+ }
|
|
|
+ equipmentImageFile = null
|
|
|
dialogVisible.value = true
|
|
|
loadEquipmentTypes(); loadNetworkOptions()
|
|
|
if (row.networkId) loadPointOptions(row.networkId)
|
|
|
@@ -301,7 +466,23 @@ function handleEdit(row) {
|
|
|
async function handleSave() {
|
|
|
const valid = await formRef.value.validate().catch(() => false)
|
|
|
if (!valid) return
|
|
|
+
|
|
|
try {
|
|
|
+ // 如果有新图片,先通过 MinIO 通用接口上传到 MinIO
|
|
|
+ if (equipmentImageFile) {
|
|
|
+ const uploadFormData = new FormData()
|
|
|
+ uploadFormData.append('file', equipmentImageFile)
|
|
|
+ uploadFormData.append('dir', 'upload') // 指定存储目录(可选)
|
|
|
+ const uploadResponse = await request({
|
|
|
+ url: '/minio/upload',
|
|
|
+ method: 'post',
|
|
|
+ data: uploadFormData
|
|
|
+ })
|
|
|
+ formData.equipmentImage = uploadResponse.url || uploadResponse.fileName
|
|
|
+ // 上传完成后清空文件,避免重复上传
|
|
|
+ equipmentImageFile = null
|
|
|
+ }
|
|
|
+
|
|
|
const isEdit = !!formData.equipmentId
|
|
|
if (isEdit) {
|
|
|
await updateEquipment(formData)
|
|
|
@@ -309,12 +490,13 @@ async function handleSave() {
|
|
|
const res = await addEquipment(formData)
|
|
|
formData.equipmentId = res.data // 后端 saveWithCheck 返回实体 UUID
|
|
|
if (!formData.equipmentId) {
|
|
|
- ElMessage.error('新增失败,未获取到设备ID')
|
|
|
+ ElMessage.error('新增失败,未获取到设备 ID')
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
ElMessage.success(isEdit ? '修改成功' : '新增成功')
|
|
|
- dialogVisible.value = false; loadData()
|
|
|
+ dialogVisible.value = false
|
|
|
+ loadData()
|
|
|
} catch (e) {
|
|
|
const msg = e?.response?.data?.msg || e?.message || '操作失败'
|
|
|
ElMessage.error(msg)
|
|
|
@@ -337,4 +519,87 @@ onMounted(() => { loadData() })
|
|
|
.equipment-container { padding: 16px; }
|
|
|
.search-card { margin-bottom: 16px; }
|
|
|
.search-form { display: flex; flex-wrap: wrap; }
|
|
|
+
|
|
|
+/* 表格图片样式 */
|
|
|
+.table-image-cell {
|
|
|
+ width: 80px;
|
|
|
+}
|
|
|
+
|
|
|
+.equipment-table-image {
|
|
|
+ width: 64px;
|
|
|
+ height: 64px;
|
|
|
+ border-radius: 4px;
|
|
|
+ cursor: pointer;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+
|
|
|
+/* 详情图片样式 */
|
|
|
+.detail-equipment-image {
|
|
|
+ width: 200px;
|
|
|
+ height: 200px;
|
|
|
+ border-radius: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+
|
|
|
+/* 图片上传样式 */
|
|
|
+.image-uploader {
|
|
|
+ position: relative;
|
|
|
+ border: 1px dashed #d9d9d9;
|
|
|
+ border-radius: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+ width: 200px;
|
|
|
+ height: 200px;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader:hover {
|
|
|
+ border-color: #409eff;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader .preview-image {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+ display: block;
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader-placeholder {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ height: 100%;
|
|
|
+ color: #909399;
|
|
|
+ font-size: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader-placeholder .el-icon--upload {
|
|
|
+ font-size: 28px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader-cover {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ opacity: 0;
|
|
|
+ transition: opacity 0.3s;
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader:hover .image-uploader-cover {
|
|
|
+ opacity: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.image-uploader-cover .el-icon {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 28px;
|
|
|
+}
|
|
|
</style>
|