Files
gr_bi_web/src/views/bigscreenDesigner/designer/components/imageSelect.vue
2026-03-02 10:33:39 +08:00

403 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<el-input
clearable
v-model.trim="ImgUrl"
size="mini"
@change="changeInput"
>
<template slot="append">
<i class="iconfont iconfolder-o" @click="openFileDialog"></i>
</template>
</el-input>
<!-- 将弹窗移到外层并添加必要的属性 -->
<el-dialog
title="图片选择"
width="60%"
:close-on-click-modal="false"
:visible.sync="isShow"
:before-close="closeDialog"
:append-to-body="true"
:modal-append-to-body="true"
custom-class="image-select-dialog"
>
<div v-if="isShow">
<div style="margin-bottom: 20px">
<el-upload
class="el-upload"
ref="upload"
:action="uploadUrl"
:headers="headers"
:on-success="handleUpload"
:on-error="handleError"
:show-file-list="false"
:limit="1"
>
<el-button
type="primary"
icon="el-icon-upload"
v-permission="'fileManage:upload'"
>文件上传</el-button>
</el-upload>
<el-button type="primary" @click="submitSelect">提交</el-button>
<el-button @click="closeDialog">取消</el-button>
</div>
<div class="main_part">
<div class="page_main">
<el-table
ref="tables"
class="elTable"
:data="records"
border
highlight-current-row
@row-dblclick="handleSelectionDblclick"
@current-change="handleCurrentRowChange"
>
<el-table-column label="序号" width="80" align="center">
<template slot-scope="scope">
{{ (queryParams.pageNumber - 1) * queryParams.pageSize + scope.$index + 1 }}
</template>
</el-table-column>
<template v-for="(item, index) in option.columns">
<el-table-column
v-if="item.tableHide != true && item.columnType != 'expand'"
:key="index"
:prop="item.field"
:label="item.label"
:min-width="item.minWidth || 110"
align="center"
>
<template slot-scope="scope">
<div v-if="item.columnType === 'imgPreview'">
<el-image
style="width: 120px; height: 80px"
fit="contain"
:src="scope.row[item.field]"
:preview-src-list="[scope.row[item.field]]"
/>
</div>
<span v-else>{{ scope.row[item.field] }}</span>
</template>
<!-- <template slot-scope="scope">
<div v-if="item.columnType === 'imgPreview'">
<el-image
style="width: 120px; height: 80px"
fit="contain"
:src="scope.row[item.field].replace('http://210.45.128.61:9095','')"
:preview-src-list="[scope.row[item.field].replace('http://210.45.128.61:9095','')]"
/>
</div>
<span v-else>{{ scope.row[item.field].replace("http://210.45.128.61:9095","") }}</span>
</template> -->
</el-table-column>
</template>
</el-table>
<div class="pagination">
<el-pagination
v-show="total > 0"
background
:current-page.sync="queryParams.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="queryParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import {fileAdd, fileDetail, fileList, fileUpdate} from "@/api/file";
const baseURL = process.env.BASE_API;
export default {
components: {
},
watch: {
value: {
handler(val) {
this.ImgUrl = val || ''; // 添加这个 watch
},
immediate: true // 确保组件创建时就执行
}
},
model: {
prop: "value",
event: "input"
},
props: {
value: {
type: "",
default: ""
}
},
data() {
return {
ImgUrl: "",
isShow: false,
uploadUrl: baseURL + "/file/upload",
// 查询表单提交的值
queryParams: {
showMoreSearch: false, // 是否展开更多搜索条件
pageNumber: 1,
pageSize: 10,
order: "",
sort: ""
},
currentRow: null, // 表格中当前选中的记录
highlightRowStyle: null,
records: [], // 接口返回的记录列表
total: 0 , // 接口返回的总条数
rowIdList: [],
option: {
// 使用菜单做为页面标题
title: "文件管理",
// 详情页中输入框左边文字宽度
labelWidth: "120px",
// 查询表单条件
queryFormFields: [
{
inputType: "input",
label: "文件路径",
field: "filePath"
}
],
// 表头按钮
tableButtons: [
{
label: "删除",
type: "danger",
permission: "fileManage:delete",
icon: "el-icon-delete",
plain: false,
click: () => {
return this.$refs.listPage.handleDeleteBatch();
}
}
],
// 操作按钮
buttons: {
query: {
api: fileList,
permission: "fileManage:query",
sort: "create_time",
order: "DESC"
},
queryByPrimarykey: {
api: fileDetail,
permission: "fileManage:query"
},
add: {
api: fileAdd,
permission: "fileManage:upload",
isShow: false
},
edit: {
api: fileUpdate,
permission: "fileManage:update",
isShow: false
},
rowButtonsWidth: 150 // row自定义按钮表格宽度
},
// 表格列
columns: [
{
label: "",
field: "id",
primaryKey: true, // 根据主键查询详情或者根据主键删除时, 主键的
tableHide: true, // 表格中不显示
},
{
// 以下为表格的配置
label: "图片缩略图", // 列名称,必填
field: "urlPath", // 字段名,必填
columnType: "imgPreview", // 图片 不设置默认text
}
]
},
selectedId: '', // 用于radio选中
};
},
created() {
this.ImgUrl = this.value;
},
computed: {
headers() {
return {
Authorization: getToken() // 直接从本地获取token就行
};
}
},
methods: {
openFileDialog(){
this.isShow = true;
this.handleQueryPageList();
},
// 页码改变
handleCurrentChange(pageNumber) {
this.queryParams.pageNumber = pageNumber;
this.handleQueryPageList();
},
// 每页size改变时
handleSizeChange(val) {
this.queryParams.pageNumber = 1;
this.queryParams.pageSize = val;
this.handleQueryPageList();
},
// 列表查询
async handleQueryPageList() {
// 将特殊参数值urlcode处理
// 默认的排序
if (
this.isBlank(this.queryParams["order"]) &&
this.isNotBlank(this.option.buttons.query.order)
) {
this.queryParams["sort"] = this.option.buttons.query.sort;
this.queryParams["order"] = this.option.buttons.query.order;
}
let params = this.urlEncodeObject(this.queryParams, "order,sort");
const { data, code } = await this.option.buttons.query.api(params);
if (code != "200") return;
this.records = data.records;
this.total = data.total;
},
// 上传成功的回调
handleUpload(response, file, fileList) {
// 触发查询按钮
this.handleQueryPageList();
//清除el-upload组件中的文件
this.$refs.upload.clearFiles();
},
handleError() {
this.$message({
message: "上传失败!",
type: "error"
});
},
handleCurrentRowChange(currentRow) {
this.currentRow = currentRow;
this.selectedId = currentRow ? currentRow.id : '';
},
// 双击
handleSelectionDblclick(row) {
this.currentRow = row;
this.submitSelect();
},
submitSelect() {
console.log(this.headers);
this.ImgUrl = this.currentRow.urlPath;
this.$emit("input", this.currentRow.urlPath);
this.$emit("change", this.currentRow.urlPath);
// this.ImgUrl = this.currentRow.urlPath.replace("http://210.45.128.61:9095","");
// this.$emit("input", this.currentRow.urlPath.replace("http://210.45.128.61:9095",""));
// this.$emit("change", this.currentRow.urlPath.replace("http://210.45.128.61:9095",""));
this.closeDialog();
},
changeInput(e) {
if (e) {
console.log(11111111)
this.ImgUrl = e;
} else {
this.ImgUrl = ""; // 直接设置为空字符串
}
this.$emit("input", this.ImgUrl);
this.$emit("change", this.ImgUrl);
},
// 弹窗关闭之前需要执行的逻辑
closeDialog() {
this.records = [];
this.total = 0;
this.isShow = false;
this.currentRow = null;
},
}
};
</script>
<style lang="scss">
.file {
position: absolute;
width: 100%;
padding: 100%;
right: 0;
top: 0;
opacity: 0;
}
:deep(.el-input-group__append),
:deep(.el-input-group__prepend) {
padding: 0 10px !important;
overflow: hidden;
}
.iconfont {
font-size: 12px;
}
/* 弹窗样式 */
.el-dialog__wrapper {
position: fixed !important;
top: 0 !important;
right: 0 !important;
bottom: 0 !important;
left: 0 !important;
overflow: auto !important;
margin: 0 !important;
z-index: 2000 !important; /* 降低弹窗的 z-index */
.el-dialog {
margin: 0vh auto 0 !important;
position: relative !important;
top: 0 !important;
transform: none !important;
max-height: 90vh !important;
.el-dialog__body {
max-height: calc(90vh - 120px) !important;
overflow-y: auto !important;
padding: 20px !important;
}
}
}
/* 表格样式 */
.el-table__row.current-row {
background-color: #409EFF !important;
color: #fff !important;
td {
background-color: #409EFF !important;
color: #fff !important;
}
}
.pagination {
text-align: right;
margin-top: 20px;
}
/* 图片预览样式 */
:deep(.el-image-viewer__wrapper) {
z-index: 2100 !important; /* 确保图片预览在弹窗之上 */
}
/* 遮罩层样式 */
.v-modal {
z-index: 1999 !important; /* 遮罩层在最下面 */
}
</style>