378 lines
10 KiB
Vue
378 lines
10 KiB
Vue
<template>
|
||
<div>
|
||
<el-card
|
||
style="width: 200px; position: relative"
|
||
v-if="materialId">
|
||
<div
|
||
v-if="materialId"
|
||
title="取消"
|
||
class="icon-button"
|
||
@click="clear">
|
||
<el-icon>
|
||
<CircleCloseFilled />
|
||
</el-icon>
|
||
</div>
|
||
|
||
<el-image
|
||
fit="contain"
|
||
style="width: 100px; height: 100px"
|
||
:src="material.imageUrlPreviewPath">
|
||
<template #error>
|
||
<div class="image-slot">暂无图片</div>
|
||
</template>
|
||
</el-image>
|
||
<div>
|
||
<div
|
||
:title="materialType.name"
|
||
class="material-type">
|
||
类型:{{ materialType.name }}
|
||
</div>
|
||
<div
|
||
:title="material.name"
|
||
class="material-name">
|
||
名称:{{ material.name }}
|
||
</div>
|
||
</div>
|
||
</el-card>
|
||
<el-dialog
|
||
style="height: 80vh"
|
||
width="70%"
|
||
append-to-body
|
||
lock-scroll
|
||
:close-on-click-modal="false"
|
||
v-model="dialogVisible"
|
||
title="请选择材料">
|
||
<div
|
||
class="search-warp"
|
||
style="margin-bottom: 10px">
|
||
<el-select
|
||
@change="onClickSearch"
|
||
v-model="search.type"
|
||
@clear="removeSearch"
|
||
class="search-item search-input"
|
||
clearable
|
||
placeholder="选择材料类型">
|
||
<el-option
|
||
v-for="item in materialTypeList"
|
||
:value="item.id"
|
||
:label="item.name"></el-option>
|
||
</el-select>
|
||
<el-input
|
||
class="search-item search-input"
|
||
clearable
|
||
@keyup.enter.native="onClickSearch"
|
||
@clear="removeSearch"
|
||
v-model="search.name"
|
||
placeholder="请输入名称查询"
|
||
suffix-icon="search"></el-input>
|
||
</div>
|
||
<div class="div-content">
|
||
<el-card
|
||
v-for="material in materialList"
|
||
:class="{ 'is-selected': material.isSelected }"
|
||
@click="selectMaterial(material)"
|
||
@dblclick="dbSelectMaterial(material)"
|
||
:title="material.description">
|
||
<el-image
|
||
fit="contain"
|
||
style="width: 200px; height: 200px"
|
||
:src="material.imageUrlPreviewPath">
|
||
<template #error>
|
||
<div class="image-slot">
|
||
<!–
|
||
<el-icon><Picture /></el-icon>
|
||
–> 暂无图片
|
||
</div>
|
||
</template>
|
||
</el-image>
|
||
<template #footer>
|
||
<div class="card-footer">
|
||
<div
|
||
:title="materialType.name"
|
||
class="title-material-type">
|
||
类型:{{ materialType.name }}
|
||
</div>
|
||
<div
|
||
:title="material.name"
|
||
class="title-material-name">
|
||
名称:{{ material.name }}
|
||
</div>
|
||
</div>
|
||
</template>
|
||
</el-card>
|
||
</div>
|
||
<template #footer>
|
||
<el-button @click="clickCancel">取消</el-button>
|
||
<el-button
|
||
type="primary"
|
||
@click="confirm">
|
||
确定
|
||
</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
import ArtSystem from '../artSystem.js';
|
||
import { CircleClose, CircleCloseFilled } from '@element-plus/icons-vue';
|
||
export default {
|
||
name: 'materialCard',
|
||
emits: ['confirm'],
|
||
components: { CircleCloseFilled, CircleClose },
|
||
props: {
|
||
modelValue: Boolean,
|
||
currentMaterial: Object, //cellsysArt的Material对象
|
||
materialId: Number,
|
||
},
|
||
computed: {
|
||
dialogVisible: {
|
||
get() {
|
||
return this.modelValue;
|
||
},
|
||
set(val) {
|
||
this.$emit('update:modelValue', val);
|
||
},
|
||
},
|
||
materialType() {
|
||
if (this.material && this.material.materialType) {
|
||
return this.material.materialType;
|
||
} else {
|
||
return {};
|
||
}
|
||
},
|
||
},
|
||
|
||
data() {
|
||
return {
|
||
listQuery: {
|
||
total: 0,
|
||
currPage: 1,
|
||
pageSize: 10,
|
||
filter: [],
|
||
listLoading: false,
|
||
},
|
||
search: {
|
||
name: null,
|
||
type: null,
|
||
},
|
||
materialTypeList: [],
|
||
materialList: [],
|
||
material: {},
|
||
activeName: null,
|
||
};
|
||
},
|
||
created() {
|
||
if (this.currentMaterial) {
|
||
this.material = this.currentMaterial;
|
||
} else {
|
||
this.queryMaterialList();
|
||
}
|
||
this.queryMaterialType();
|
||
},
|
||
methods: {
|
||
clickCancel() {
|
||
this.material = null;
|
||
this.dialogVisible = false;
|
||
},
|
||
confirm() {
|
||
if (!this.material) {
|
||
return this.$message({
|
||
type: 'warning',
|
||
message: '还未选择材料',
|
||
});
|
||
}
|
||
this.$emit('confirm', this.material.id);
|
||
this.dialogVisible = false;
|
||
},
|
||
clear() {
|
||
this.material = null;
|
||
this.$emit('confirm', null);
|
||
},
|
||
selectMaterial(material) {
|
||
// 更新选中状态,这里假设你只想单选
|
||
this.materialList.forEach((mat) => {
|
||
mat.isSelected = mat.id === material.id;
|
||
});
|
||
this.material = material;
|
||
},
|
||
dbSelectMaterial(material) {
|
||
this.material = material;
|
||
this.$emit('confirm', this.material.id);
|
||
this.dialogVisible = false;
|
||
},
|
||
onClickSearch() {
|
||
let filter = [];
|
||
let { name, type } = this.search;
|
||
if (name) {
|
||
filter.push({
|
||
name: 'name',
|
||
operator: 'like',
|
||
value: name,
|
||
});
|
||
}
|
||
|
||
if (type) {
|
||
filter.push({
|
||
name: 'material_type_id',
|
||
operator: '=',
|
||
value: type,
|
||
});
|
||
}
|
||
this.listQuery.filter = filter;
|
||
this.queryMaterialList(filter);
|
||
},
|
||
removeSearch() {
|
||
this.queryMaterialList();
|
||
},
|
||
|
||
queryMaterialType() {
|
||
let params = {
|
||
pageInfo: {
|
||
pageSize: 0,
|
||
currPage: 0,
|
||
},
|
||
};
|
||
ArtSystem.queryMaterialType(params).then((response) => {
|
||
this.materialTypeList = response.data;
|
||
});
|
||
},
|
||
queryMaterialList(filter) {
|
||
let params = {
|
||
pageInfo: {
|
||
pageSize: 0,
|
||
currPage: 0,
|
||
},
|
||
filter: filter,
|
||
order: { id: 'desc' },
|
||
};
|
||
ArtSystem.queryMaterial(params).then((response) => {
|
||
this.materialList = response.data;
|
||
if (this.materialId) {
|
||
this.material = this.materialList[0];
|
||
}
|
||
});
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style scoped>
|
||
.icon-button {
|
||
position: absolute;
|
||
top: 0;
|
||
right: 5px;
|
||
cursor: pointer;
|
||
font-size: 20px;
|
||
color: #dd2c00;
|
||
}
|
||
|
||
.search-warp {
|
||
display: inline-block;
|
||
margin-bottom: 7px;
|
||
|
||
& .search-item {
|
||
display: inline-block;
|
||
|
||
& + .search-item {
|
||
margin-left: 15px;
|
||
}
|
||
}
|
||
|
||
& .search-input {
|
||
border-radius: 30px;
|
||
width: 15rem;
|
||
}
|
||
|
||
& .search-input {
|
||
.el-input__wrapper {
|
||
border-radius: 30px;
|
||
width: 100%;
|
||
}
|
||
|
||
.el-select__wrapper {
|
||
border-radius: 30px;
|
||
width: 100%;
|
||
}
|
||
}
|
||
|
||
& .el-range-editor.el-input__wrapper {
|
||
margin-left: 15px;
|
||
border-radius: 30px;
|
||
}
|
||
}
|
||
|
||
.div-content {
|
||
height: calc(100% - 44px);
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
overflow-y: auto;
|
||
min-height: 40vh;
|
||
}
|
||
|
||
:deep(.el-tab-pane) {
|
||
height: 100%;
|
||
}
|
||
|
||
.el-card {
|
||
margin: 10px;
|
||
width: 300px;
|
||
height: 300px;
|
||
text-align: center;
|
||
}
|
||
|
||
/* 添加选中状态的样式 */
|
||
.el-card.is-selected {
|
||
border-color: #409eff; /* Element UI主题色的蓝色 */
|
||
box-shadow: 0 0 10px #409eff;
|
||
}
|
||
|
||
.card-footer {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.title-material-type {
|
||
width: 50%;
|
||
display: -webkit-box;
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 1; /* 限制显示的行数 */
|
||
overflow: hidden;
|
||
}
|
||
|
||
.title-material-name {
|
||
width: 50%;
|
||
display: -webkit-box;
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 1; /* 限制显示的行数 */
|
||
overflow: hidden;
|
||
}
|
||
|
||
.image-slot {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: var(--el-fill-color-light);
|
||
color: var(--el-text-color-secondary);
|
||
font-size: 30px;
|
||
}
|
||
|
||
.material-type {
|
||
text-align: left;
|
||
width: 100%;
|
||
display: -webkit-box;
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 1; /* 限制显示的行数 */
|
||
overflow: hidden;
|
||
}
|
||
|
||
.material-name {
|
||
text-align: left;
|
||
width: 100%;
|
||
display: -webkit-box;
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 1; /* 限制显示的行数 */
|
||
overflow: hidden;
|
||
}
|
||
</style>
|