!196 --1.图片选择组件(支持图片上传);2.修复问题(选中当前新增的组件)
Merge pull request !196 from JiangHH/dev
This commit is contained in:
@@ -71,6 +71,11 @@
|
|||||||
@change="changed($event, item.name)"
|
@change="changed($event, item.name)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<imageSelect
|
||||||
|
v-if="item.type == 'image-select'"
|
||||||
|
v-model="formData[item.name]"
|
||||||
|
@change="changed($event, item.name)"
|
||||||
|
/>
|
||||||
<el-radio-group
|
<el-radio-group
|
||||||
v-if="item.type == 'el-radio-group'"
|
v-if="item.type == 'el-radio-group'"
|
||||||
v-model="formData[item.name]"
|
v-model="formData[item.name]"
|
||||||
@@ -341,9 +346,11 @@ import customUpload from "./customUpload.vue";
|
|||||||
import dynamicAddRadar from "./dynamicAddRadar";
|
import dynamicAddRadar from "./dynamicAddRadar";
|
||||||
import MonacoEditor from "@/components/MonacoEditor/index";
|
import MonacoEditor from "@/components/MonacoEditor/index";
|
||||||
import componentLinkage from './componentLinkage';
|
import componentLinkage from './componentLinkage';
|
||||||
|
import imageSelect from './imageSelect';
|
||||||
export default {
|
export default {
|
||||||
name: "DynamicForm",
|
name: "DynamicForm",
|
||||||
components: {
|
components: {
|
||||||
|
imageSelect,
|
||||||
ColorPicker,
|
ColorPicker,
|
||||||
vueJsonEditor,
|
vueJsonEditor,
|
||||||
dynamicComponents,
|
dynamicComponents,
|
||||||
|
|||||||
@@ -0,0 +1,384 @@
|
|||||||
|
<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>
|
||||||
|
</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.closeDialog();
|
||||||
|
},
|
||||||
|
changeInput(e) {
|
||||||
|
if (e) {
|
||||||
|
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>
|
||||||
@@ -548,7 +548,8 @@ export default {
|
|||||||
this.layerWidget[this.currentWidgetTotal].widgetId = uuid;
|
this.layerWidget[this.currentWidgetTotal].widgetId = uuid;
|
||||||
this.widgets[this.currentWidgetTotal].value.widgetCode = this.dragWidgetCode;
|
this.widgets[this.currentWidgetTotal].value.widgetCode = this.dragWidgetCode;
|
||||||
const index = this.widgets.length - 1;
|
const index = this.widgets.length - 1;
|
||||||
this.layerClick(index); // 选中当前新增的组件
|
this.widgetIndex = index;
|
||||||
|
this.widgetsClickAndCtrl(index); // 选中当前新增的组件
|
||||||
this.grade = false; // 去除网格线
|
this.grade = false; // 去除网格线
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -56,12 +56,12 @@ export const widgetImage = {
|
|||||||
value: '0'
|
value: '0'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'custom-upload',
|
type: 'image-select',
|
||||||
label: '图片地址',
|
label: '图片地址',
|
||||||
name: 'imageAdress',
|
name: 'imageAdress',
|
||||||
required: false,
|
required: false,
|
||||||
placeholder: '',
|
placeholder: '',
|
||||||
value: 'http://10.108.26.197:9095/file/download/fd20d563-00aa-45e2-b5db-aff951f814ec',
|
value: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'vue-color',
|
type: 'vue-color',
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ const screenConfig = {
|
|||||||
value: '#1E1E1E',
|
value: '#1E1E1E',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'custom-upload',
|
type: 'image-select',
|
||||||
label: '图片地址',
|
label: '图片地址',
|
||||||
name: 'backgroundImage',
|
name: 'backgroundImage',
|
||||||
required: false,
|
required: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user