济菏高速业务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

689 lines
18 KiB

<template>
<el-dialog
:title="calcTitle"
:visible.sync="dialogVisible"
width="800px"
append-to-body
:close-on-click-modal="false"
>
<!-- <div style="color:#fff">
<p>类型:{{type}} 增删改类型:{{mode}}</p>
<p>模板id:{{ tpl }}</p>
</div> -->
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
</div>
<el-card>
<BoardTplPreview
style="width: 100%"
:boardWH="screenSize"
:tpl="dataForm"
></BoardTplPreview>
</el-card>
<el-card>
<el-form
:model="dataForm"
:rules="dataRule"
label-width="110px"
ref="dataForm"
size="mini"
>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="所属类别"
v-if="type == 'template' && mode != 'toDevice'"
prop="category"
>
<el-select
v-model="dataForm.category"
placeholder="请选择所属类别"
size="mini"
>
<el-option
v-for="item in templateCategoryList"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col class="infoBoardButton" :span="16">
<el-form-item label="对齐方式">
<el-radio-group v-model="dataForm.formatStyle">
<el-radio-button label="0">左对齐</el-radio-button>
<el-radio-button label="2">中间对齐</el-radio-button>
<el-radio-button label="1">右对齐</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter="24"
style="display: flex; flex-wrap: wrap; width: 100%"
>
<el-col :span="24">
<el-form-item label="详细内容" prop="content">
<el-input
type="textarea"
:rows="6"
placeholder="详细内容"
v-model="dataForm.content"
></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="字体颜色">
<el-select
v-model="dataForm.fontColor"
filterable
placeholder="请选择"
>
<el-option
v-for="item in colorList"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="字体大小">
<el-select v-model="dataForm.fontSize" style="width: 100%">
<el-option
v-for="item in fontSizeList"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
v-if="+(item.dictValue.replace('px',''))<=maxFontSize"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="字体类型">
<el-select v-model="dataForm.fontType" placeholder="请选择">
<el-option
v-for="item in fontTypeList"
:key="item.dictLabel"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="停留时间(秒)">
<el-input-number :min="0" v-model="dataForm.stopTime" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入屏方式">
<el-select v-model="dataForm.inScreenMode" placeholder="请选择">
<el-option
v-for="item in inScreenModeList"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="屏幕尺寸">
<el-select v-model="screenSize" placeholder="请选择" disabled>
<el-option
v-for="item in screenSizeOptions"
:key="item.device_pixel"
:label="item.device_pixel"
:value="item.device_pixel"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button style="background-color: #0e708b; color: #fff" @click="onClose"
>取消</el-button
>
<el-button
@click="onSubmit('dataForm')"
v-loading="loading"
style="background-color: #10aac2; color: #fff"
>确认</el-button
>
</div>
</el-dialog>
</template>
<script>
import {
getTemplateList,
addTemplate,
addTemplateContent,
editTemplateContent,
editTemplate,
deleteTemplate,
getTemplateContent,
getGalleryList,
getFontSizeByDevicePixel,
uploadBoardEditInfo,
} from "@/api/board/template";
import BoardPreview from "@screen/components/infoBoard/BoardPreview.vue";
import BoardTplPreview from "@screen/components/infoBoard/BoardTplPreview.vue";
import infoBoardUtils from "@screen/utils/infoBoard.js";
import { checkBoardContent } from "@/api/board/board";
export default {
data() {
return {
maxFontSize:100,
alignmentNum: 2,
content: "",
boardWidth: "",
boardHeight: "",
checkList: [], //复选框一组
obj: "",
imgUrl: [],
imgUrlOther: [],
dialogVisible: false,
fileList: [
{
name: "food.jpeg",
url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
},
{
name: "food2.jpeg",
url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
},
],
listquery: [], //拖拽图片
curDragImgItem: "",
startTxt_x: "000",
startTxt_y: "000",
width: "400",
height: "40",
// content: "",
fontSize: "24",
fontType: "KaiTi",
fontSpacing: 0,
coordinate: "000000",
url: "",
previewContent: "", //预览内容
ispreviewContent: -1,
dataForm: {
category: "",
formatStyle: "",
content: "",
fontColor: "",
fontSize: "",
fontType: "",
stopTime: "",
inScreenMode: "",
screenSize: "",
},
templateContent: [],
templateDelContent: [],
dataRule: {
content: [
{
required: true,
message: "请输入详细内容",
trigger: "blur",
},
],
category: [
{
required: true,
message: "请选择类别",
trigger: "blur",
},
],
},
screenSizeOptions: [],
colorList: [],
isCurrencyOptions: [
{
code: "0",
content: "通用",
},
{
code: "1",
content: "仅为智能推荐模板",
},
],
inScreenModeList: [],
imgSize: [
{
type: "1024*128",
name: "全屏",
},
{
type: "",
name: "正常",
},
],
fontSizeList: [],
title: "选择图片",
loading: false,
isAdd: false,
templateCategoryList: [],
infoType: "",
devicePixelBoolean: false,
categoryRules: false,
deviceCttDefault: {
residenceTime: "50",
intonation: "0",
fontSpacing: "1",
screenEntryMethod: "1",
screenOutputMethod: "1",
lineSpacing: "0",
yCoordinate: "0",
whetherToSynchronizePlayback: "0",
whetherToPlayText: "0",
playbackCount: "1",
flashingFrequency: "5",
backgroundColor: "8",
foregroundColor: "FFFF00",
textContent: "",
fontStyle: "0",
displayAreaWidth: "768",
displayAreaHeight: "64",
playbackDuration: "50",
volume: "0",
xCoordinate: "0",
screenEntrySpeed: "1",
horizontalAlignment: "2",
playSpecialEffects: "0",
setUpTheSpeaker: "0",
flickerSpeed: "0",
specialEffectsSpeed: "1",
fontSize: "20",
verticalAlignment: "2",
speechSpeed: "0",
font: "3",
},
templateDefault: {
category: "",
formatStyle: "2",
content: "",
fontColor: "",
fontSize: "",
fontType: "",
stopTime: 50,
inScreenMode: "",
screenSize: "",
},
isLocked: false,
};
},
props: {
mode: {
//add edit
type: String,
default: "",
},
type: {
//template board
type: String,
default: "",
},
visible: {
type: Boolean,
default: false,
},
screenSize: {
type: String,
default: "",
},
tpl: {
type: Object,
default: () => {},
},
},
components: {
BoardPreview,
BoardTplPreview,
},
computed: {
calcTitle() {
let str = "";
if (this.mode == "toDevice") {
str = `从模板添加设备信息`;
} else {
str = `${this.mode == "add" ? "新增" : "编辑"}${
this.type == "template" ? "信息模板" : "设备信息"
}`;
}
return str;
},
},
watch: {
screenSize:{
handler(newV){
if(newV){
let boardH = newV.split("*")[1];
let fontSize = "20";
if (['64', '48'].includes(boardH)) {
this.maxFontSize = +boardH
fontSize = boardH + ""
} else if (['80'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 2 + ""
} else if (['160'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 4 + ""
}
this.deviceCttDefault.fontSize = fontSize
this.templateDefault.screenSize = newV;
this.templateDefault.fontSize = fontSize;
}
},
immediate:true
},
visible: {
handler(newV) {
this.dialogVisible = newV;
if (this.$refs.dataForm) {
this.$refs.dataForm.clearValidate();
}
// if(newV){
// this.initData();
// }
},
immediate: true,
},
dialogVisible(newV) {
this.$emit("update:visible", newV);
},
tpl: {
handler(newV) {
// { "id": 3, "category": "0", "content": "保持车距,控制车速", "screenSize": "768*64", "fontColor": "FFFF00", "fontSize": "64", "fontType": "2", "fontSpacing": "0", "rollingSpeed": null, "stopTime": "50", "inScreenMode": "1", "formatStyle": "2", "remark": null, "createTime": "2024-01-06 10:40:19", "updateTime": "2024-01-06 11:04:53" }
if (newV && Object.keys(newV).length > 0) {
//防止关闭对话框时触发
this.initData();
}
},
deep: true,
},
mode: {
handler(newV) {
this.initData();
},
},
type: {
handler(newV) {
this.initData();
},
},
},
mounted() {},
created() {
this.templateDefault.fontType = this.fontTypeList[0].dictValue //设置模板的默认值
this.getDicts("iot_devices_font_color").then((res) => {
this.colorList = res.data;
this.templateDefault.fontColor = this.colorList[0].dictValue
// console.log(this.colorList, "字体颜色");
});
this.getDicts("iot_device_font_inScreen_mode").then((res) => {
this.inScreenModeList = res.data;
this.templateDefault.inScreenMode = this.inScreenModeList[0].dictValue
// console.log(this.inScreenModeList, "入屏方式");
});
this.getDicts("iot_template_category").then((res) => {
this.templateCategoryList = res.data;
this.templateDefault.category = this.templateCategoryList[0].dictValue
});
this.getDicts("iot_device_font_size").then((res) => {
this.fontSizeList = res.data;
// this.templateDefault.fontSize = this.fontSizeList[0].dictValue
// this.dataForm.FONT_SIZE = res.data[1].dictValue
});
},
methods: {
initData() {
if (this.isLocked) {
return;
}
this.isLocked = true;
setTimeout(() => {
this.isLocked = false;
}, 100);
// getTemplateList({id:this.tpl.id}).then(res=>{
// console.log(res.data , "++++++++===========");
// })
if (this.mode == "add") {
let tempTpl = null;
if (this.type == "template") {
tempTpl = _.merge({}, this.templateDefault, this.tpl);
} else {
tempTpl = _.merge({}, this.deviceCttDefault, this.tpl.origin); //首页弹窗,新增设备项时,需要传设备尺寸过来
}
this.dataForm = infoBoardUtils.dialogSourceFormat(
tempTpl,
this.type,
this.mode
);
} else {
this.dataForm = infoBoardUtils.dialogSourceFormat(
this.tpl,
this.type,
this.mode,
this.deviceCttDefault
);
}
if (this.visible == false && this.mode == "toDevice") {
this.onSubmit();
}
},
onClose() {
this.dialogVisible = false;
},
// 表单提交
async onSubmit(formName) {
// this.$refs[formName].validate((valid) => {
// if (valid) {
// } else {
// console.log('格式不正确!!');
// return false;
// }
// });
if (this.type == "template" && this.dataForm.category == undefined) {
return this.$modal.msgError("请选择分类!");
}
if (!this.dataForm.content.trim()) {
return this.$modal.msgError("当前输入内容为空");
}
if (this.dataForm.content.indexOf("\\") >= 0) {
return this.$modal.msgError("内容不能含有特殊字符'\\\\'");
}
let ctt = this.dataForm.content;
checkBoardContent(ctt).then((res) => {
if (res.code == 200) {
doNext();
} else {
this.$message({
type: "danger",
message: res.msg,
});
return;
}
});
let doNext = () => {
let data = infoBoardUtils.dialogSaveFormat(
this.dataForm,
this.type,
this.mode
);
this.loading = true;
// let templateId = "";
if (this.type == "template") {
if (this.mode == "edit") {
editTemplate(data).then((res) => {
afterSave("修改");
});
} else if (this.mode == "toDevice") {
this.loading = false;
this.$emit("afterSubmit", {
type: this.type,
mode: this.mode,
data: data,
});
} else {
addTemplate(data).then((res) => {
afterSave("新增");
});
}
} else {
this.loading = false;
// this.dialogVisible = false
this.$emit("afterSubmit", {
type: this.type,
mode: this.mode,
data: data,
});
}
const afterSave = (para) => {
this.$message.success(para + "成功!");
this.loading = false;
// this.dialogVisible = false
this.$emit("afterSubmit", { type: this.type, mode: this.mode });
};
};
},
},
};
</script>
<style lang="scss" scoped>
.infoBoardButton {
::v-deep .el-radio-button--medium .el-radio-button__inner {
// height: 3vh;
// line-height: 3vh;
// padding: 0 0.6vw;
// font-size: 0.7vw;
}
}
.previewContentCSS {
border: yellow 1px dashed;
}
/* 页脚 */
.dialog-footer {
padding-left: 450px;
}
.photoOther img,
.photo img {
max-width: 300px;
width: 100%;
// height: 80px;
}
.infoBoardButton {
display: flex;
justify-content: left;
}
.boardTextStyle {
line-height: 1;
caret-color: rgba(0, 0, 0, 0);
user-select: none;
position: absolute;
// max-height: 128px;
overflow: hidden;
}
.blackBoard2 {
background: #000000;
display: flex;
margin: 0 auto;
overflow: hidden;
position: relative;
// justify-content: center;
align-items: center;
}
::v-deep .el-card__body {
padding: 10px 0;
}
//
::v-deep .el-dialog__header {
background-color: #145977;
}
::v-deep .el-dialog__body {
padding: 5px 20px;
background-color: #145977;
}
::v-deep .el-dialog__footer {
background-color: #145977;
}
::v-deep .el-card {
margin-top: 1vh;
background-color: #145977;
border: 2px solid #1d7890;
}
::v-deep .el-form-item__label {
color: #3de8ff;
}
::v-deep .el-input--mini .el-input__inner {
color: #fff;
background-color: #096d8c;
}
::v-deep .el-input-number.is-controls-right .el-input-number__decrease {
color: #fff;
background-color: #096d8c;
}
::v-deep .el-dialog__title {
color: #fff;
}
::v-deep .el-textarea__inner {
color: #fff;
background-color: #096d8c;
border-color: #096d8c;
}
::v-deep .el-input-number.is-controls-right .el-input-number__decrease {
border-color: transparent;
}
::v-deep .el-input-number.is-controls-right .el-input-number__increase {
border-color: transparent;
color: #fff;
background-color: #096d8c;
}
::v-deep .el-button--medium {
padding: 5px 25px;
font-size: 14px;
border-radius: 20px;
border: transparent;
}
::v-deep .el-radio-button__inner {
color: #ffffff;
background-color: pink;
border-color: #1d58a9;
-webkit-box-shadow: -1px 0 0 0 #1d58a9;
box-shadow: -1px 0 0 0 #1d58a9;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
border-radius: 3px 3px 3px 3px;
opacity: 1;
border: none !important;
}
::v-deep .infoBoardButton .el-radio-button--medium .el-radio-button__inner {
margin: 0 3px;
}
</style>