From 10bc47a275dfd896ba4e72f073d9f901c5390597 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 22 Mar 2023 16:05:14 +0800
Subject: [PATCH] 模块不绑定设备编码,设备编码绑定模块
---
src/views/modules/function.vue | 264 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 192 insertions(+), 72 deletions(-)
diff --git a/src/views/modules/function.vue b/src/views/modules/function.vue
index 4ebc722..194efc5 100644
--- a/src/views/modules/function.vue
+++ b/src/views/modules/function.vue
@@ -1,6 +1,5 @@
<template>
<div>
- {{ modules.id }}--{{ modules.name }}
<!--头部按钮-->
<div class="avue-crud__menu">
<!-- 头部左侧按钮模块 -->
@@ -10,8 +9,8 @@
</div>
<!-- 头部右侧按钮模块 -->
<div class="avue-crud__right">
- <div v-if="content.property== 2" class="model-type">
- <el-radio-group v-model="modelType">
+ <div v-if="selectNode.property== 2" class="model-type">
+ <el-radio-group size="small" v-model="radioType">
<el-radio-button label="管理"></el-radio-button>
<el-radio-button label="预览"></el-radio-button>
</el-radio-group>
@@ -20,11 +19,12 @@
</div>
<el-row>
<!--左侧列表-->
- <el-col :span="6">
+ <el-col :span="5">
<div class="func">
<!--列表展示-->
<div class="list">
- <el-tree v-if="funList.length >0" :data="funList" :props="defaultProps" node-key="id" @node-click="handleNodeClick">
+ <el-tree v-if="funList.length >0" :data="funList" :props="defaultProps" node-key="id"
+ @node-click="handleNodeClick">
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>{{ data.name }}</span>
<span>
@@ -42,66 +42,84 @@
<!--占位-->
<el-col :span="1"></el-col>
<!--右侧预览-->
- <el-col :span="17">
+ <el-col :span="18">
<div class="func-content">
<!--开始页-->
- <div class="start" v-if="content.property == 1">
- <img class="start-img" :src="content.fileUrl[0].value">
- <div class="start-button-group">
- <el-button disabled size="small" v-for="data in contentFunList" :index="data.id" :key="data.id">
- {{ data.name }}
- </el-button>
+ <div class="start" v-if="selectNode.property == 1">
+ <div class="start" v-if="selectNode.fileUrl.length>0">
+ <img class="start-img" :src="selectNode.fileUrl[0].value">
+ <div class="start-button-group">
+ <el-button disabled type="primary" size="small" v-for="data in contentList" :index="data.id"
+ :key="data.id">{{ data.name }}
+ </el-button>
+ </div>
</div>
- </div>
- <!--内容页-->
- <div style="height: 100%;width: 100%" v-if="content.property == 2">
+ <el-empty v-else></el-empty>
- <div style="height: 100%;width: 100%" class="manage" v-if="modelType=='管理'">
+ </div>
+
+ <!--内容页-->
+ <div class="ddiv" v-if="selectNode.property == 2">
+
+ <div class="manage ddiv" v-if="radioType=='管理'">
<!--flash-->
- <div v-if="content.type == 1">
- <avue-form :option="flashOption" v-model="flashForm" @submit="handleSubmitFile"></avue-form>
+ <div v-if="selectNode.type == 1">
+ <avue-form :option="flashOption" v-model="flashForm" :upload-delete="uploadDelete" @submit="handleSubmitFile"></avue-form>
</div>
<!--图册-->
- <div v-if="content.type == 2">
- <avue-form :option="imgOption" v-model="imgForm" @submit="handleSubmitFile"></avue-form>
+ <div v-if="selectNode.type == 2">
+ <avue-form
+ :option="imgOption"
+ v-model="imgForm"
+ :upload-delete="uploadDelete"
+ @submit="handleSubmitFile"></avue-form>
</div>
<!--视频-->
- <div v-if="content.type == 3">
- <avue-form :option="videoOption" v-model="videoForm" @submit="handleSubmitFile"></avue-form>
+ <div v-if="selectNode.type == 3">
+ <avue-form :option="videoOption" v-model="videoForm" :upload-delete="uploadDelete" @submit="handleSubmitFile"></avue-form>
</div>
</div>
- <div style="height: 100%;width: 100%" class="view" v-else>
+ <div class="view ddiv" v-if="radioType == '预览'">
<!--flash-->
- <div v-if="content.type == 1">
+ <div v-if="selectNode.type == 1">
</div>
<!--图册-->
- <div style="height: 100%;width: 100%" v-if="content.type == 2">
- <Flipbook class="flipbook" :pages="flipConfig.pages" :startPage="flipConfig.pageNum" v-slot="flipbook" ref="flipbook">
+ <div class="ddiv" v-if="selectNode.type == 2">
+ <FlipBook class="flipbook" :pages="flipConfig.pages" :startPage="flipConfig.pageNum" v-slot="flipbook"
+ ref="flipbook">
<div class="action-bar">
- <left-icon class="btn left" :class="{ disabled: !flipbook.canFlipLeft }" @click="flipbook.flipLeft"/>
+ <left-icon class="btn left" :class="{ disabled: !flipbook.canFlipLeft }"
+ @click="flipbook.flipLeft"/>
<plus-icon class="btn plus" :class="{ disabled: !flipbook.canZoomIn }" @click="flipbook.zoomIn"/>
<span class="page-num">Page {{ flipbook.page }} of {{ flipbook.numPages }}</span>
- <minus-icon class="btn minus" :class="{ disabled: !flipbook.canZoomOut }" @click="flipbook.zoomOut"/>
- <right-icon class="btn right" :class="{ disabled: !flipbook.canFlipRight }" @click="flipbook.flipRight"/>
+ <minus-icon class="btn minus" :class="{ disabled: !flipbook.canZoomOut }"
+ @click="flipbook.zoomOut"/>
+ <right-icon class="btn right" :class="{ disabled: !flipbook.canFlipRight }"
+ @click="flipbook.flipRight"/>
</div>
- </Flipbook>
+ </FlipBook>
</div>
<!--视频-->
- <div style="height: 100%;width: 100%" v-if="content.type == 3">
+ <div class="ddiv" v-if="selectNode.type == 3">
<iframe class="view-iframe" :src="iframePath"/>
</div>
</div>
</div>
<!--结束页-->
- <div class="end" v-if="content.property == 3">
- <img class="end-img" :src="content.fileUrl[0].value">
+ <div class="end" v-if="selectNode.property == 3">
+ <div class="end" v-if="selectNode.fileUrl.length>0">
+ <img class="end-img" :src="selectNode.fileUrl[0].value">
+ </div>
+ <div v-else>
+ <el-empty></el-empty>
+ </div>
</div>
</div>
</el-col>
@@ -121,6 +139,7 @@
<script>
import {getAll, add, update, remove} from "@/api/modules/function";
+import FlipBook from "flipbook-vue/dist/vue2/flipbook";
import LeftIcon from 'vue-material-design-icons/ChevronLeftCircle'
import RightIcon from 'vue-material-design-icons/ChevronRightCircle'
import PlusIcon from 'vue-material-design-icons/PlusCircle'
@@ -129,12 +148,12 @@
export default {
name: "function",
props: ['modules'],
- components: {LeftIcon, RightIcon, PlusIcon, MinusIcon},
+ components: {FlipBook, LeftIcon, RightIcon, PlusIcon, MinusIcon},
data() {
return {
//所有功能集合
funList: [],
- contentFunList: [],
+ contentList: [],
// 弹框标题
title: '',
// 是否展示弹框
@@ -216,11 +235,11 @@
type: 'number',
span: 24,
display: false,
- rules: [{
- required: true,
- message: "请输入排序",
- trigger: "blur",
- }],
+ // rules: [{
+ // required: true,
+ // message: "请输入排序",
+ // trigger: "blur",
+ // }],
},
{
label: "页面背景",
@@ -228,7 +247,7 @@
type: 'upload',
limit: 1,
drag: true,
- loadText: '模板上传中,请稍等',
+ loadText: '文件上传中,请稍等',
accept: 'image/png, image/jpeg',
propsHttp: {
res: 'data',
@@ -291,6 +310,8 @@
form: {},
imgOption: {
+ submitBtn: false,
+ emptyBtn: false,
column: [
{
label: '图片',
@@ -298,19 +319,23 @@
type: 'upload',
span: 24,
dragFile: true,
+ // multiple: true,
accept: 'image/png, image/jpeg',
listType: "picture-card",
propsHttp: {
res: 'data',
url: 'link'
},
- action: "/api/blade-resource/oss/endpoint/put-file-attach"
+ action: "/api/function/function/put-file-attach",
+ data: {},
},
]
},
imgForm: {},
flashOption: {
+ submitBtn: false,
+ emptyBtn: false,
column: [
{
label: 'flash上传',
@@ -323,13 +348,16 @@
res: 'data',
url: 'link'
},
- action: "/api/blade-resource/oss/endpoint/put-file-attach"
+ action: "/api/function/function/put-file-attach",
+ data: {},
},
]
},
flashForm: {},
videoOption: {
+ submitBtn: false,
+ emptyBtn: false,
column: [
{
label: '视频',
@@ -344,7 +372,8 @@
res: 'data',
url: 'link'
},
- action: "/api/blade-resource/oss/endpoint/put-file-attach"
+ action: "/api/function/function/put-file-attach",
+ data: {},
},
]
},
@@ -354,16 +383,19 @@
children: 'children',
label: 'name'
},
- content: {},
- modelType:'管理',
-
+ //当前选中节点
+ selectNode: {},
+ //管理 预览切换
+ radioType: '管理',
+ //翻页预览的配置
flipConfig: {
pages: [],
pagesHiRes: [],
hasMouse: true,
pageNum: null,
},
- iframePath:"",
+ //视频iframe路径
+ iframePath: "",
}
},
watch: {
@@ -385,14 +417,59 @@
}
}
},
+ "flashForm.url":{
+ handler(newVal){
+ console.log(newVal)
+ }
+ },
+ "imgForm.url":{
+ handler(newVal){
+ console.log(newVal,"---")
+ this.flipConfig.pages = []
+ if (newVal.length > 0) {
+ newVal.forEach(e => {
+ this.flipConfig.pages.push(e.value)
+ })
+ }
+ }
+ },
+ "videoForm.url":{
+ handler(newVal){
+ console.log(newVal)
+ if (newVal.length > 0) {
+ let url = newVal[0].value
+ this.iframePath = 'http://192.168.0.200:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
+ }
+ }
+ },
},
mounted() {
- this.getAllFunc()
+ this.onLoad()
},
methods: {
//返回模块列表页
backModules() {
this.$emit('backModules')
+ },
+ //加载左侧列表
+ onLoad() {
+ this.getAllFunc()
+ },
+ loadNode(data){
+ let column
+ if (data.type == 1) {
+ this.flashForm.url = data.fileUrl
+ column = this.findObject(this.flashOption.column, "url")
+ column.data = {id: data.id}
+ } else if (data.type == 2) {
+ this.imgForm.url = data.fileUrl
+ column = this.findObject(this.imgOption.column, "url")
+ column.data = {id: data.id}
+ } else if (data.type == 3) {
+ this.videoForm.url = data.fileUrl
+ column = this.findObject(this.videoOption.column, "url")
+ column.data = {id: data.id}
+ }
},
//获取当前模块id下的所有子功能
getAllFunc() {
@@ -402,7 +479,7 @@
getAll(params).then(res => {
if (res.data.code == 200) {
this.funList = res.data.data
- this.contentFunList = res.data.data.filter(e => {
+ this.contentList = res.data.data.filter(e => {
return e.property == 2
})
}
@@ -410,6 +487,29 @@
},
handleSubmit(form, done) {
form.modulesId = this.modules.id
+ //限制只能有一个开始页和结束页
+ if (form.property == 1 || form.property == 3) {
+ let data = this.funList
+ let filterArray = data.filter(e => {
+ return e.property == form.property
+ })
+ if (filterArray.length > 0) {
+
+ if (form.property == 1) {
+ if (form.id != filterArray[0].id) {
+ this.$message.warning("开始页已存在")
+ done()
+ return
+ }
+ } else if (form.property == 3) {
+ if (form.id != filterArray[0].id) {
+ this.$message.warning("结束页已存在")
+ done()
+ return
+ }
+ }
+ }
+ }
if (!form.id) {
add(form).then(() => {
this.getAllFunc()
@@ -480,33 +580,43 @@
},
// 节点点击事件
handleNodeClick(data) {
- this.content = data
- if (data.property == 2) {
- if (data.type == 1) {
- this.flashForm.url = data.fileUrl
- } else if (data.type == 2) {
- this.imgForm.url = data.fileUrl
- let fileArray = data.fileUrl
- fileArray.forEach(e => {
- this.flipConfig.pages.push(e.value)
- })
- } else if (data.type == 3) {
- this.videoForm.url = data.fileUrl
- let url = data.fileUrl[0].value
- this.iframePath = 'http://192.168.0.200:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
- }
- }
+ this.selectNode = data
+ this.loadNode(this.selectNode)
},
// 图片提交
handleSubmitFile(form, done) {
- this.content.fileUrl = form.url
- this.handleSubmit(this.content, done)
+ this.selectNode.fileUrl = form.url
+ this.handleSubmit(this.selectNode, done)
+ },
+ //自定义删除方法
+ uploadDelete(file,column){
+ this.selectNode.fileUrl = this.selectNode.fileUrl.filter(e=>{
+ return e.label != file.name
+ })
+ return new Promise((resolve, reject) => {
+ update(this.selectNode).then(res=>{
+ if (res.data.code == 200){
+ resolve()
+ }else {
+ reject()
+ }
+ })
+ });
},
}
}
</script>
<style scoped>
+.ddiv {
+ width: 100%;
+ height: 100%;
+}
+
+.view {
+ background-color: #404040;
+}
+
.func {
height: 77vh;
border: 1px solid;
@@ -539,10 +649,11 @@
.start-button-group {
position: relative;
top: -25%;
- left: 42%;
+ display: flex;
+ justify-content: center;
}
-.model-type{
+.model-type {
display: flex;
justify-content: flex-end;
}
@@ -555,10 +666,10 @@
.flipbook {
width: 100%;
- height: 100vh;
+ height: 100%;
}
-.page-num{
+.page-num {
color: white;
}
@@ -604,6 +715,15 @@
margin-left: 10px;
}
+.flipbook .viewport {
+ width: 90vw !important;
+ height: calc(100vh - 800px - 40px) !important;
+}
+
+.flipbook .bounding-box {
+ box-shadow: 0 0 20px #000;
+}
+
.credit {
font-size: 12px;
line-height: 20px;
--
Gitblit v1.9.3