Browse Source

轮播图样式,数据结构

yjf_v2
liwenxuan 2 years ago
parent
commit
8f56567150
  1. 14
      src/api/DesignForm/types.ts
  2. BIN
      src/assets/404_images/untilUploadImg.png
  3. 9
      src/components/DesignForm/assembly/index.ts
  4. 227
      src/components/DesignForm/formControlAttr.vue
  5. 7
      src/widget/videoupload/index.vue

14
src/api/DesignForm/types.ts

@ -158,8 +158,8 @@ export interface PublicAtrr{
export interface VideoMsg {
CreatedAt: string
UpdatedAt: string
fileSize: bigint
id: bigint
fileSize: number
id: number
key: string
name: string
physicspath: string
@ -174,4 +174,12 @@ export interface VideoMsg {
attrId:string//字段标识 e.g : videoUpAndPlay1705024134559
poster?:string//视频封面url
loop:boolean//是否循环播放
}
}
//低代码轮播图单个属性对象
export interface CarsuselConfig {
uploadFlag:boolean,
imgId:string,
sort:number,
imgUrl:string,
link:string
}

BIN
src/assets/404_images/untilUploadImg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

9
src/components/DesignForm/assembly/index.ts

@ -343,7 +343,14 @@ const selectOption: any = [
icon: '',
iconFont: 'fa-window-restore',
control: {
modelValue: ''
modelValue: '',
carsuselConfigArr:[{
uploadFlag:false,
imgId:'',
sort:1,
imgUrl: '',
link: ''
}]
},
config: {}
}

227
src/components/DesignForm/formControlAttr.vue

@ -1278,109 +1278,21 @@ import { VideoMsg } from '@/api/DesignForm/types'
import { genFileId } from 'element-plus'
import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
//:el-upload limit on-exceed
const upload = ref<UploadInstance>()
const handleExceed: UploadProps['onExceed'] = (files) => {
upload.value!.clearFiles()
const file = files[0] as UploadRawFile
file.uid = genFileId()
upload.value!.handleStart(file)
}
//videoMsg[videoIndex]
const videoIndex = ref(0);
const videoMsgArr:VideoMsg[] = reactive<VideoMsg[]>([{
CreatedAt: '',
UpdatedAt: '',
fileSize: 0n,
id: 0n,
key: '',
name: '',
physicspath: '',
size: '',
tag: '',
type: 0,
url: '',
videoReady: false,
videoHeight:400,
videoWidth:700,
videoAutoPlay: false,
attrId: '',
poster:'',
loop: false
}]);
/* //监听当前操作视频的变化
watch(videoMsgArr[videoIndex.value], () => {
//
// `newValue` `oldValue`
//
emits('videoMsgChange',videoMsgArr[videoIndex.value]);
},{deep:true})
function setVideoIndex(newValue:any,oldValue:any){
//alert(videoIndex.value)
const result = videoMsgArr.findIndex(function(item) {
item.attrId === newValue.activeKey;
});
if(result!=-1){
videoIndex.value = result;
}
//alert(videoIndex.value)
}
*/
/* const LastEdit = {
oldKey:'',
oldType:'',
}
//,,videoIndex
watch(
() => store, (newValue, oldValue) => {
//alert("newValue:"+newValue+",oldValue:"+oldValue)
let newKey = newValue.activeKey;
//alert("newKey==="+newKey+"|||oldKey==="+LastEdit.oldKey)
if(oldValue==undefined){
//alert('')
}else{
// if(LastEdit.oldKey===''){
// alert("")
//}else{
// if(newKey===''){
// alert('')
// }else{
// alert("")
// }
//}
//else
LastEdit.oldKey = newKey
LastEdit.oldType = newValue.controlAttr.type
}
if(newValue.controlAttr.type==='videoUpAndPlay'){
console.log('是视频')
}
},{deep:true}
) */
//
function videoUploadOk(response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) {
const { control = {} } : { control: any } = controlData.value
control.videoMsg[videoIndex.value].url = response.data.url;
control.videoMsg[videoIndex.value].videoReady = true;
control.videoMsg[videoIndex.value].CreatedAt = response.data.CreatedAt;
@ -1393,10 +1305,6 @@ function videoUploadOk(response: any, uploadFile: UploadFile, uploadFiles: Uploa
control.videoMsg[videoIndex.value].size = response.data.size;
control.videoMsg[videoIndex.value].tag = response.data.tag;
control.videoMsg[videoIndex.value].type = response.data.type;
// controlData.value.control.videoMsg = [videoMsgArr]
}
//
@ -1416,17 +1324,53 @@ function videoUploadErr(error: Error, uploadFile: UploadFile, uploadFiles: Uploa
//liwenxuan 20240111 carousel start
const direction = ref('ltr')
const drawer = ref(false)
const handleClose = (done: () => void) => {
ElMessageBox.confirm('Are you sure you want to close this?')
.then(() => {
done()
})
.catch(() => {
// catch error
})
import { Delete,Plus } from '@element-plus/icons-vue'
import { CarsuselConfig } from '@/api/DesignForm/types'
import errimg from '@/assets/404_images/untilUploadImg.png'
//
const dialogTableVisible = ref(false)
//
const showImagePreview = ref(false)
//
function carouselImgUploadSuccess(response: any, uploadFile: UploadFile, uploadFiles: UploadFiles){
alert('轮播图图片上传成功')
}
//url,
const carouselImgUrlList = computed(() => {
const list:string[] = [];
const carsuselConfigData:CarsuselConfig[] = controlData.value.control.carsuselConfigArr
carsuselConfigData.forEach(element => {
if(element.uploadFlag===true){
list.push(element.imgUrl)
}
});
return list;
})
//table
function createRow(){
//alert('')
}
function deleteRow(){
//alert('')
}
//
const closePreview = () => {
showImagePreview.value = false
}
//
const handlePreview = (index: number, row: any) => {
showImagePreview.value = true
}
//liwenxuan 20240111 carousel end
@ -1515,7 +1459,8 @@ const handleClose = (done: () => void) => {
</el-row>
<el-row v-else-if="item.type === 'carousel'">
<el-button type="primary" append-to-body="true" modal="true" @click="drawer = true" >轮播图设置</el-button>
<el-button type="primary" append-to-body="true" modal="true" @click="dialogTableVisible = true" >轮播图设置</el-button>
</el-row>
@ -1530,6 +1475,8 @@ const handleClose = (done: () => void) => {
</el-form-item>
</template>
<template v-if="controlData.config">
@ -2010,6 +1957,74 @@ const handleClose = (done: () => void) => {
</el-tab-pane>
</el-tabs>
</div>
<!-- 轮播图设置弹窗 20240122 start -->
<el-dialog v-model="dialogTableVisible" title="轮播图设置" style="width:60%">
<el-table :data="controlData.control.carsuselConfigArr" border style="width: 100%" row-key="imgId">
<el-table-column label="设置图片" width="180" >
<template #default="propFlag">
<el-upload
:action="uploadUrl" :before-remove="beforeRemove"
:on-success="carouselImgUploadSuccess"
:on-error="videoUploadErr"
:limit="1"
accept=".jpg,.jpeg,.png,.tif,.tga,.bmp,.dds,.svg,.eps,.pdf,.hdr,.raw,.exr,.psd,.afphoto,.afdesign">
<el-button v-if="!propFlag.row.uploadFlag" type="primary">点此上传</el-button>
<el-button v-if="propFlag.row.uploadFlag" type="primary">已上传,点击修改</el-button>
</el-upload>
</template>
</el-table-column>
<el-table-column prop="imgUrl" label="查看图片" width="180">
<template #default="imgScope">
<!-- {{ imgScope.row.imgUrl }} -->
<el-image style="width: 100px; height: 100px;cursor:pointer;" :src="imgScope.row.imgUrl" fit="contain" alt="暂未上传" @click="handlePreview(imgScope.$index, imgScope.row)" >
<template #error>
<div class="image-slot">
<el-image style="width: 100px; height: 100px;" :src="errimg" fit="contain" ></el-image>
</div>
</template>
</el-image>
</template>
</el-table-column>
<el-table-column prop="link" label="链接地址">
<template #default="linkScope">
<el-input v-model="linkScope.row.link" placeholder="输入图片的链接地址" />
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="120" >
<template #default="scope">
<el-tooltip
class="box-item"
content="删除本行"
placement="top-start">
<el-button v-if="controlData.control.carsuselConfigArr.length>1" type="danger" :icon="Delete" circle @click="deleteRow"/>
</el-tooltip>
<!-- {{ tableData[tableDataLength-1] }} -->
<!-- {{ scope.row }} -->
<el-tooltip
class="box-item"
content="新增一行"
placement="top-start">
<el-button v-if="controlData.control.carsuselConfigArr[controlData.control.carsuselConfigArr.length-1].imgId == scope.row.imgId" type="success" :icon="Plus" circle @click="createRow" />
</el-tooltip>
</template>
</el-table-column>
</el-table>
</el-dialog>
<!-- 图片预览 -->
<el-image-viewer
v-if="showImagePreview"
:zoom-rate="1.2"
:url-list="carouselImgUrlList"
@close="closePreview"
/>
<!-- 轮播图设置弹窗 liwenxuan 20240122 end -->
</template>
<style lang='scss' scoped>

7
src/widget/videoupload/index.vue

@ -14,7 +14,7 @@
<input v-model="value" type="hidden" >
</el-form-item>
<VideoUploadPlay :data="props.data" @added-video="addedVideo"></VideoUploadPlay>
<VideoUploadPlay :data="props.data"></VideoUploadPlay>
</template>
<script lang='ts' setup>
import VideoUploadPlay from './videoUploadPlay.vue';
@ -158,12 +158,7 @@ const formatCustomRules = () => {
const addedVideo = (val:any) =>{
console.log("最新视频上传列表--->",val)
value.value = val
}
</script>
<style lang='scss' scoped>
.imgbox{

Loading…
Cancel
Save