feat(imageUpload): 增加图片位置输入功能

- 在 ColumnInfoForm 组件中,为图库上传添加位置输入功能
- 在 ImageUpload 组件中,增加位置输入弹窗和相关逻辑- 优化图片上传流程,支持位置信息的记录和展示
main
Tuzki 9 months ago
parent ba70910bd0
commit 570b2597d1
  1. 112
      src/components/ImageUpload/index.vue
  2. 6
      src/views/cjy/columninfo/ColumnInfoForm.vue

@ -29,7 +29,31 @@
</div>
<el-dialog
:visible.sync="dialogVisible"
title="输入图片位置"
:visible.sync="positionDialogVisible"
width="400"
@close="resetPosition"
:modal="false"
append-to-body
>
<div>
<el-form :model="position" :rules="rules" ref="positionForm">
<el-form-item label="X 坐标" prop="x">
<el-input v-model="position.x" type="number"></el-input>
</el-form-item>
<el-form-item label="Y 坐标" prop="y">
<el-input v-model="position.y" type="number"></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="positionDialogVisible = false">取消</el-button>
<el-button type="primary" @click="confirmPosition">确定</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="previewDialogVisible"
title="预览"
width="800"
append-to-body
@ -67,6 +91,11 @@ export default {
isShowTip: {
type: Boolean,
default: true
},
//
showPositionInput: {
type: Boolean,
default: false
}
},
data() {
@ -74,11 +103,22 @@ export default {
number: 0,
uploadList: [],
dialogImageUrl: "",
dialogVisible: false,
positionDialogVisible: false, //
previewDialogVisible: false, //
hideUpload: false,
uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", //
headers: { Authorization: "Bearer " + getAccessToken() }, //
fileList: []
fileList: [],
currentFile: null, //
position: { x: '', y: '' }, //
rules: {
x: [
{ required: true, message: 'X 坐标为必填项', trigger: 'blur' }
],
y: [
{ required: true, message: 'Y 坐标为必填项', trigger: 'blur' }
]
}
};
},
watch: {
@ -114,19 +154,71 @@ export default {
//
handleRemove(file, fileList) {
const findex = this.fileList.map(f => f.name).indexOf(file.name);
if(findex > -1) {
if (findex > -1) {
this.fileList.splice(findex, 1);
this.$emit("input", this.listToString(this.fileList));
}
},
//
cancelUpload() {
if (this.currentFile) {
// handleRemove
this.handleRemove(this.currentFile, this.fileList);
}
this.currentFile = null; //
this.positionDialogVisible = false; //
this.$modal.closeLoading(); //
},
resetPosition() {
this.position.x = '';
this.position.y = '';
this.cancelUpload(); //
},
//
handleUploadSuccess(res) {
// edit by
this.uploadList.push({ name: res.data, url: res.data });
if (this.uploadList.length === this.number) {
er
this.currentFile = { name: res.data, url: res.data };
// fileList
const exists = this.fileList.some(file => file.name === this.currentFile.name);
if (!exists) {
this.fileList.push(this.currentFile); // fileList
}
if (this.showPositionInput) {
this.positionDialogVisible = true; //
} else {
// uploadList
this.uploadList.push(this.currentFile);
this.updateFileList(); //
this.$modal.closeLoading(); //
}
},
confirmPosition() {
this.$refs.positionForm.validate((valid) => {
if (valid) {
const positionUrl = `${this.currentFile.url}?x=${this.position.x}&y=${this.position.y}`;
this.uploadList.push({ name: this.currentFile.name, url: positionUrl });
this.updateFileList1();
this.positionDialogVisible = false; //
} else {
// this.$message.error('');
}
});
},
//
updateFileList() {
if (this.uploadList.length > 0) {
// this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = []; // uploadList
this.$emit("input", this.listToString(this.fileList));
this.$modal.closeLoading();
}
},
updateFileList1() {
if (this.uploadList.length > 0) {
this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = [];
this.number = 0;
this.uploadList = []; // uploadList
this.$emit("input", this.listToString(this.fileList));
this.$modal.closeLoading();
}
@ -173,7 +265,7 @@ export default {
//
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
this.previewDialogVisible = true; //
},
//
listToString(list, separator) {

@ -9,7 +9,7 @@
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="资讯类型" prop="infoType">
<el-form-item v-if="formData.type==7" label="资讯类型" prop="infoType">
<el-select v-model="formData.infoType" placeholder="请选择资讯类型">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.INFO_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value" />
@ -28,10 +28,10 @@
<Editor v-model="formData.introduction" :min-height="192"/>
</el-form-item>
<el-form-item label="logo">
<ImageUpload v-model="formData.logo"/>
<ImageUpload :limit="1" v-model="formData.logo"/>
</el-form-item>
<el-form-item label="图库">
<ImageUpload v-model="formData.image"/>
<ImageUpload :showPositionInput="formData.type==6" v-model="formData.image"/>
</el-form-item>
<el-form-item label="内容">
<Editor v-model="formData.content" :min-height="192"/>

Loading…
Cancel
Save