2 changed files with 65 additions and 978 deletions
@ -1,976 +0,0 @@ |
|||
<template> |
|||
<div> |
|||
<div class="dialog-h-content scroll-h"> |
|||
<el-form |
|||
v-if="iniLoaded" |
|||
ref="ref_form" |
|||
:model="fmData" |
|||
:inline="true" |
|||
:disabled="formType === 'watch'" |
|||
class="m-fm" |
|||
:class="editParamsDiv ? 'z-div' : ''" |
|||
> |
|||
<div class="list"> |
|||
<el-form-item |
|||
v-for="item in editParams" |
|||
class="item" |
|||
label-width="140px" |
|||
style="display: block" |
|||
:key="'edit' + item.keyName" |
|||
:label="item.field" |
|||
:prop="item.keyName" |
|||
:rules="item.rules || []" |
|||
> |
|||
<template v-if="item.type == 'switch'"> |
|||
<el-switch |
|||
v-model="fmData[item.keyName]" |
|||
size="small" |
|||
:active-text="item.activeText || ''" |
|||
:inactive-text="item.inactiveText || ''" |
|||
:active-value="item.activeValue || true" |
|||
:inactive-value="item.inactiveValue || false" |
|||
> |
|||
</el-switch> |
|||
</template> |
|||
|
|||
<template v-if="item.type == 'input'"> |
|||
<el-input |
|||
v-if=" |
|||
formType == 'add' || (formType == 'edit' && !item.editDisable) |
|||
" |
|||
v-model="fmData[item.keyName]" |
|||
class="item-input" |
|||
size="small" |
|||
clearable |
|||
show-word-limit |
|||
:maxlength="item.maxlength || ''" |
|||
:placeholder="item.placeholder || '请输入'" |
|||
> |
|||
</el-input> |
|||
|
|||
<div class="item-show" v-else> |
|||
{{ fmData[item.keyName] || "--" }} |
|||
</div> |
|||
</template> |
|||
|
|||
<template v-if="item.type == 'textarea'"> |
|||
<el-input |
|||
v-if=" |
|||
formType == 'add' || (formType == 'edit' && !item.editDisable) |
|||
" |
|||
v-model="fmData[item.keyName]" |
|||
type="textarea" |
|||
class="item-input" |
|||
size="small" |
|||
clearable |
|||
show-word-limit |
|||
:rows="3" |
|||
:maxlength="item.maxlength || ''" |
|||
:placeholder="item.placeholder || '请输入'" |
|||
> |
|||
</el-input> |
|||
|
|||
<div class="item-show" v-else> |
|||
{{ fmData[item.keyName] || "--" }} |
|||
</div> |
|||
</template> |
|||
|
|||
<template v-if="item.type == 'date'"> |
|||
<el-date-picker |
|||
v-if=" |
|||
formType == 'add' || (formType == 'edit' && !item.editDisable) |
|||
" |
|||
v-model="fmData[item.keyName]" |
|||
:picker-options="item.pickerOptions" |
|||
class="item-input" |
|||
size="small" |
|||
clearable |
|||
show-word-limit |
|||
:value-format="item.format || 'yyyy-MM-dd'" |
|||
:placeholder="item.placeholder || '请输入'" |
|||
> |
|||
</el-date-picker> |
|||
|
|||
<div class="item-show" v-else> |
|||
{{ fmData[item.keyName] || "--" }} |
|||
</div> |
|||
</template> |
|||
|
|||
<template v-if="item.type == 'number'"> |
|||
<el-input-number |
|||
v-model="fmData[item.keyName]" |
|||
class="item-number" |
|||
size="small" |
|||
clearable |
|||
:precision="item.precision || 0" |
|||
:step="item.step || 1" |
|||
:min="item.min || 0" |
|||
:max="item.max || 999999999999" |
|||
:placeholder="item.placeholder || '请输入'" |
|||
> |
|||
</el-input-number> |
|||
<span v-if="item.unitName">({{ item.unitName }})</span> |
|||
</template> |
|||
|
|||
<template v-else-if="item.type == 'select'"> |
|||
<el-select |
|||
v-model="fmData[item.keyName]" |
|||
:placeholder="item.placeholder || '请选择'" |
|||
size="small" |
|||
clearable |
|||
class="item-select" |
|||
:multiple="item.multiple || false" |
|||
:filterable="item.filterable || false" |
|||
:allowCreate="item.allowCreate || false" |
|||
:collapse-tags="item.collapseTags || false" |
|||
default-first-option |
|||
@change="(e) => handleChangeSelect(e, item)" |
|||
> |
|||
<template v-if="item.optionType == 'group'"> |
|||
<el-option-group |
|||
v-for="group in item.optionList" |
|||
:key="group.label" |
|||
:label="group.label" |
|||
> |
|||
<el-option |
|||
v-for="subItem in group.optionList" |
|||
:key="subItem.value" |
|||
:label="subItem.label" |
|||
:value="subItem.value" |
|||
> |
|||
</el-option> |
|||
</el-option-group> |
|||
</template> |
|||
<template v-else> |
|||
<el-option |
|||
v-for="(subItem, subIndex) in item.optionList" |
|||
:key="subItem.value + subIndex" |
|||
:label="subItem.label" |
|||
:value="subItem.value" |
|||
> |
|||
</el-option> |
|||
</template> |
|||
</el-select> |
|||
</template> |
|||
|
|||
<template v-else-if="item.type == 'rich-text'"> |
|||
<div |
|||
v-if=" |
|||
formType == 'add' || (formType == 'edit' && !item.editDisable) |
|||
" |
|||
class="item-rich-text" |
|||
> |
|||
<Tinymce |
|||
:ref="'richText' + item.keyName" |
|||
v-model="fmData[item.keyName]" |
|||
:customerId="customerId" |
|||
:placeholder="item.placeholder || '请输入'" |
|||
:height="500" |
|||
/> |
|||
</div> |
|||
<div |
|||
v-else |
|||
class="item-rich-text z-show" |
|||
@click="handleClickHtmlNode" |
|||
> |
|||
<div v-html="fmData[item.keyName]"></div> |
|||
</div> |
|||
</template> |
|||
|
|||
<template v-else-if="item.type == 'cascader'"> |
|||
<el-cascader |
|||
v-model="fmData[item.keyName]" |
|||
:placeholder="item.placeholder || '请选择'" |
|||
:options="item.optionList" |
|||
:props="item.optionProps || {}" |
|||
:show-all-levels="false" |
|||
:collapse-tags="item.collapseTags || false" |
|||
size="small" |
|||
clearable |
|||
class="item-select" |
|||
@change="(e) => handleChangeCascader(e, item)" |
|||
> |
|||
</el-cascader> |
|||
</template> |
|||
|
|||
<template v-else-if="item.type == 'upload'"> |
|||
<el-upload :headers="$getElUploadHeaders()" |
|||
v-if=" |
|||
formType == 'add' || (formType == 'edit' && !item.editDisable) |
|||
" |
|||
ref="upload" |
|||
class="avatar-uploader" |
|||
:class="{ 'z-full': fmData[item.keyName].length >= item.limit }" |
|||
:action="item.uploadUrl || uploadUrl" |
|||
:data="{ customerId: customerId }" |
|||
:show-file-list="true" |
|||
:list-type="item.listType || 'picture'" |
|||
:limit="item.limit || 100" |
|||
:file-list="fmData[item.keyName]" |
|||
:on-success="(res, file) => handleImgSuccess(res, file, item)" |
|||
:on-error="(res, file) => handleImgError(res, file, item)" |
|||
:on-remove="(res) => handleImgRemove(res, item)" |
|||
:on-exceed="(res) => handleImgExceed(res, item)" |
|||
:before-upload="(file) => beforeImgUpload(file, item)" |
|||
> |
|||
<a><i class="el-icon-plus"></i> 点击上传</a> |
|||
</el-upload> |
|||
<el-image |
|||
v-else-if="fmData[item.keyName].length > 0" |
|||
style="width: 100px; height: 100px" |
|||
:src="fmData[item.keyName][0].url" |
|||
fit="cover" |
|||
:preview-src-list="fmData[item.keyName].map((item) => item.url)" |
|||
></el-image> |
|||
<span v-else>--</span> |
|||
</template> |
|||
|
|||
<template v-else-if="item.type == 'address'"> |
|||
<div class="address-item"> |
|||
<el-input |
|||
class="address-item-input" |
|||
:placeholder="item.placeholder || '请输入所在地址'" |
|||
v-model="fmData[item.keyName]" |
|||
:maxlength="item.maxlength || ''" |
|||
show-word-limit |
|||
size="small" |
|||
> |
|||
</el-input> |
|||
<el-button |
|||
style="margin-left: 10px" |
|||
type="default" |
|||
size="small" |
|||
ref="mapSearch" |
|||
@click="handleSearchMap(item)" |
|||
>查询</el-button |
|||
> |
|||
<div id="app" class="div_map"></div> |
|||
<div style="margin-top: 10px" v-show="false"> |
|||
<span>经度</span> |
|||
<el-input |
|||
class="address-item-input2" |
|||
maxlength="50" |
|||
placeholder="请输入经度" |
|||
v-model="fmData[item.supKeys[0]]" |
|||
> |
|||
</el-input> |
|||
<span style="margin-left: 20px">纬度</span> |
|||
<el-input |
|||
class="address-item-input2" |
|||
maxlength="50" |
|||
placeholder="请输入纬度" |
|||
v-model="fmData[item.supKeys[1]]" |
|||
> |
|||
</el-input> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
</el-form-item> |
|||
</div> |
|||
</el-form> |
|||
|
|||
<div class="div_btn resi-btns" v-if="!formBtnFixed"> |
|||
<el-button size="small" @click="handleCancle">{{ |
|||
editConfig.cancelBtnName || "取消" |
|||
}}</el-button> |
|||
<el-button |
|||
v-if="formType != 'watch'" |
|||
type="primary" |
|||
size="small" |
|||
:disabled="btnDisable" |
|||
@click="handleComfirm" |
|||
>{{ editConfig.confirmBtnName || "确定" }}</el-button |
|||
> |
|||
<slot |
|||
name="operateSup" |
|||
v-bind:id="formId" |
|||
v-bind:info="fmData" |
|||
v-bind:formType="formType" |
|||
></slot> |
|||
</div> |
|||
|
|||
<slot |
|||
name="bottomSup" |
|||
v-bind:id="formId" |
|||
v-bind:info="fmData" |
|||
v-bind:formType="formType" |
|||
></slot> |
|||
</div> |
|||
|
|||
<div class="div_btn resi-btns" v-if="formBtnFixed"> |
|||
<el-button size="small" @click="handleCancle">{{ |
|||
editConfig.cancelBtnName || "取消" |
|||
}}</el-button> |
|||
<el-button |
|||
v-if="formType != 'watch'" |
|||
type="primary" |
|||
size="small" |
|||
:disabled="btnDisable" |
|||
@click="handleComfirm" |
|||
>{{ editConfig.confirmBtnName || "确定" }}</el-button |
|||
> |
|||
<slot |
|||
name="operateSup" |
|||
v-bind:id="formId" |
|||
v-bind:info="fmData" |
|||
v-bind:formType="formType" |
|||
></slot> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { requestPost } from "@/js/dai/request"; |
|||
import nextTick from "dai-js/tools/nextTick"; |
|||
import Schema from "async-validator"; |
|||
import Tinymce from "@c/tinymce2/index.vue"; |
|||
|
|||
var map; |
|||
var search; |
|||
var markers; |
|||
var infoWindowList; |
|||
var geocoder; // 新建一个正逆地址解析类 |
|||
|
|||
export default { |
|||
components: { Tinymce }, |
|||
|
|||
props: { |
|||
formId: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
formType: { |
|||
type: String, |
|||
default: "info", |
|||
}, |
|||
formBtnFixed: { |
|||
type: Boolean, |
|||
default: true, |
|||
}, |
|||
idName: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
addUrl: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
editUrl: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
delUrl: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
infoUrl: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
|
|||
editParams: { |
|||
type: Array, |
|||
default: () => [], |
|||
}, |
|||
editFixedParams: { |
|||
type: Object, |
|||
default: () => ({}), |
|||
}, |
|||
editParamsDiv: { |
|||
type: Number, |
|||
default: 0, |
|||
}, |
|||
editElseRules: { |
|||
type: Object, |
|||
default: () => ({}), |
|||
}, |
|||
editConfig: { |
|||
type: Object, |
|||
default: () => ({}), |
|||
}, |
|||
}, |
|||
|
|||
data() { |
|||
return { |
|||
iniLoaded: false, |
|||
|
|||
btnDisable: false, |
|||
|
|||
fmData: {}, |
|||
|
|||
editParams1: [], |
|||
editParams2: [], |
|||
|
|||
uploadUrl: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadqrcodeV2", |
|||
customerId: localStorage.getItem("customerId"), |
|||
}; |
|||
}, |
|||
computed: {}, |
|||
watch: { |
|||
editParams: { |
|||
handler() { |
|||
this.computeFmData(); |
|||
}, |
|||
deep: true, |
|||
}, |
|||
}, |
|||
|
|||
async mounted() { |
|||
this.initForm(); |
|||
}, |
|||
|
|||
methods: { |
|||
async initForm() { |
|||
this.iniFmData(); |
|||
|
|||
if (this.formId && this.formType != "add") { |
|||
this.getInfo(); |
|||
} |
|||
}, |
|||
|
|||
computeFmData() { |
|||
console.log(this.fmData); |
|||
}, |
|||
|
|||
iniFmData() { |
|||
const { editParams, fmData, editParamsDiv } = this; |
|||
editParams.forEach((item, index) => { |
|||
if (typeof item.value == "function") { |
|||
fmData[item.keyName] = item.value(); |
|||
} else if ( |
|||
typeof item.value == "string" || |
|||
typeof item.value == "number" || |
|||
typeof item.value == "boolean" |
|||
) { |
|||
fmData[item.keyName] = item.value; |
|||
} else if (typeof item.value == "undefined") { |
|||
fmData[item.keyName] = ""; |
|||
} else { |
|||
fmData[item.keyName] = item.value || ""; |
|||
console.error( |
|||
"不应该直接传入数组或对象的值,这样会导致传入的值被子组件修改。editParams-------------cpts/base/cpts/edit.vue", |
|||
item |
|||
); |
|||
} |
|||
|
|||
if (item.supValues) { |
|||
item.supValues.forEach((value, index) => { |
|||
if (typeof value == "function") { |
|||
fmData[item.supKeys[index]] = value(); |
|||
} else if ( |
|||
typeof value == "string" || |
|||
typeof value == "number" || |
|||
typeof value == "boolean" |
|||
) { |
|||
fmData[item.supKeys[index]] = value; |
|||
} else if (typeof value == "undefined") { |
|||
fmData[item.supKeys[index]] = ""; |
|||
} else { |
|||
fmData[item.supKeys[index]] = value; |
|||
console.error( |
|||
"不应该直接传入数组或对象的值,这样会导致传入的值被子组件修改。editParams-------------cpts/base/cpts/edit.vue", |
|||
item |
|||
); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
if (item.type == "select" || item.type == "cascader") { |
|||
if (item.optionUrl) { |
|||
this.getFmOptions( |
|||
index, |
|||
item.optionUrl, |
|||
item.optionUrlParams || {}, |
|||
item.optionCook || null |
|||
); |
|||
} |
|||
} else if (item.type == "address") { |
|||
this.$nextTick(async () => { |
|||
await nextTick(300); |
|||
this.initMap(item); |
|||
}); |
|||
} |
|||
}); |
|||
|
|||
this.fmData = { ...fmData }; |
|||
if (editParamsDiv) { |
|||
this.editParams1 = editParams.slice(0, editParamsDiv); |
|||
this.editParams2 = editParams.slice(editParamsDiv); |
|||
} else { |
|||
this.editParams1 = editParams; |
|||
} |
|||
console.log("------------------------------------", this.fmData); |
|||
this.iniLoaded = true; |
|||
}, |
|||
|
|||
handleClickHtmlNode(e) { |
|||
//在判断事件目标节点的时候,考虑到兼容性应该统一转换成大写或小写进行判断 |
|||
if (e.target.localName.toLowerCase() === "a") { |
|||
// 通过判端目标节点以后,就能在这里对其进行操作啦。 |
|||
let url = e.target.getAttribute("src"); //获取a标签属性,我这里自定义了一个属性data-id并将id赋值给了该属性,如何需要获取click方法的参数,需要获取a标签的click属性,并手动解析获取里面的参数 |
|||
window.open(url); |
|||
} |
|||
}, |
|||
|
|||
async getFmOptions(index, url, params, cookFn) { |
|||
const { data, code, msg } = await requestPost(url, { |
|||
...params, |
|||
}); |
|||
|
|||
if (code === 0) { |
|||
this.editParams[index].optionList = |
|||
typeof cookFn == "function" ? cookFn(data) : data || []; |
|||
} else { |
|||
this.$message.error("请求检索基础数据失败!"); |
|||
} |
|||
}, |
|||
|
|||
handleChangeCascader(vals, item) { |
|||
this.fmData[item["keyName"]] = vals; |
|||
if (typeof item.handleChangeFn == "function") { |
|||
item.handleChangeFn(vals, item, this); |
|||
} |
|||
}, |
|||
handleChangeSelect(vals, item) { |
|||
console.log(vals, item); |
|||
this.fmData[item["keyName"]] = vals; |
|||
if (typeof item.handleChangeFn == "function") { |
|||
item.handleChangeFn(vals, item, this); |
|||
} |
|||
}, |
|||
|
|||
beforeImgUpload(file, item) { |
|||
if (typeof item.beforeImgUpload == "function") { |
|||
if (!item.beforeImgUpload(file, item, this)) return false; |
|||
} |
|||
return true; |
|||
}, |
|||
|
|||
handleImgRemove(file, item) { |
|||
console.log("handleImgRemove", file); |
|||
let url = file.response ? file.response.data.url : file.url; |
|||
if (url) { |
|||
let { fmData } = this; |
|||
this.fmData[item.keyName] = fmData[item.keyName].filter( |
|||
(item) => item.url !== url |
|||
); |
|||
if (item.supKeys && Array.isArray(item.supKeys)) { |
|||
if (item.supKeys.length > 0) { |
|||
this.fmData[item.supKeys[0]] = fmData[item.keyName].map( |
|||
(item) => item.url |
|||
); |
|||
} |
|||
if (item.supKeys.length > 1) { |
|||
this.fmData[item.supKeys[1]] = |
|||
this.fmData[item.supKeys[0]][0] || ""; |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
|
|||
handleImgExceed(res, item) { |
|||
console.log(res); |
|||
// this.$message({ |
|||
// type: "warning", |
|||
// message: "文件数量最多不超过三个", |
|||
// }); |
|||
}, |
|||
|
|||
handleImgSuccess(res, file, item) { |
|||
console.log("handleImgSuccess", res); |
|||
if (res.code === 0 && res.msg === "success") { |
|||
let { fmData } = this; |
|||
// let picItem = { |
|||
// url: res.data.url, |
|||
// name: file.name, |
|||
// size: file.size, |
|||
// type: file.type, |
|||
// format: file.name.split(".").pop(), |
|||
// }; |
|||
let picItem = file; |
|||
picItem.url = res.data.url; |
|||
picItem.format = file.name.split(".").pop(); |
|||
|
|||
if (Array.isArray(this.fmData[item.keyName])) { |
|||
this.fmData[item.keyName].push(picItem); |
|||
} else { |
|||
this.fmData[item.keyName] = [picItem]; |
|||
} |
|||
if (item.supKeys && Array.isArray(item.supKeys)) { |
|||
if (item.supKeys.length > 0) { |
|||
this.fmData[item.supKeys[0]] = fmData[item.keyName].map( |
|||
(item) => item.url |
|||
); |
|||
} |
|||
if (item.supKeys.length > 1) { |
|||
this.fmData[item.supKeys[1]] = |
|||
this.fmData[item.supKeys[0]][0] || ""; |
|||
} |
|||
} |
|||
} else { |
|||
this.$message.error(res.msg); |
|||
} |
|||
}, |
|||
|
|||
handleImgError(res, file, item) { |
|||
console.log(res); |
|||
}, |
|||
|
|||
// 地图初始化函数,本例取名为init,开发者可根据实际情况定义 |
|||
initMap(item) { |
|||
let { latitude, longitude } = this.$store.state.user; |
|||
if (!latitude || latitude == "" || latitude == "0") { |
|||
latitude = 39.9088810666821; |
|||
longitude = 116.39743841556731; |
|||
} |
|||
// 定义地图中心点坐标 |
|||
var center = new window.TMap.LatLng(latitude, longitude); |
|||
// 定义map变量,调用 TMap.Map() 构造函数创建地图 |
|||
map = new window.TMap.Map(document.getElementById("app"), { |
|||
center: center, // 设置地图中心点坐标 |
|||
zoom: 13, // 设置地图缩放级别 |
|||
pitch: 43.5, // 设置俯仰角 |
|||
rotation: 45, // 设置地图旋转角度 |
|||
}); |
|||
|
|||
search = new window.TMap.service.Search({ pageSize: 10 }); |
|||
// 新建一个地点搜索类 |
|||
markers = new TMap.MultiMarker({ |
|||
map: map, |
|||
geometries: [], |
|||
}); |
|||
infoWindowList = Array(10); |
|||
|
|||
geocoder = new TMap.service.Geocoder(); // 新建一个正逆地址解析类 |
|||
|
|||
// 监听地图平移结束 |
|||
map.on("panend", (e) => { |
|||
this.handleMoveCenter(item, e); |
|||
}); |
|||
// this.handleMoveCenter(item); |
|||
}, |
|||
|
|||
setMarker(lat, lng) { |
|||
markers.setGeometries([]); |
|||
markers.add([ |
|||
{ |
|||
id: "4", |
|||
styleId: "marker", |
|||
position: new TMap.LatLng(lat, lng), |
|||
properties: { |
|||
title: "marker4", |
|||
}, |
|||
}, |
|||
]); |
|||
}, |
|||
|
|||
handleSearchMap(item) { |
|||
infoWindowList.forEach((infoWindow) => { |
|||
infoWindow.close(); |
|||
}); |
|||
infoWindowList.length = 0; |
|||
markers.setGeometries([]); |
|||
// 在地图显示范围内以给定的关键字搜索地点 |
|||
search |
|||
.searchRectangle({ |
|||
keyword: this.fmData[item.keyName], |
|||
bounds: map.getBounds(), |
|||
}) |
|||
.then((result) => { |
|||
let { data } = result; |
|||
if (Array.isArray(data) && data.length > 0) { |
|||
const { |
|||
location: { lat, lng }, |
|||
} = data[0]; |
|||
map.setCenter(new TMap.LatLng(lat, lng)); |
|||
this.setMarker(lat, lng); |
|||
// item.supValues[0] = lng; |
|||
// item.supValues[1] = lat; |
|||
this.fmData[item.supKeys[0]] = lng; |
|||
this.fmData[item.supKeys[1]] = lat; |
|||
} else { |
|||
this.$message.error("未检索到相关位置坐标"); |
|||
} |
|||
}); |
|||
}, |
|||
|
|||
handleMoveCenter(item, e) { |
|||
console.log(e); |
|||
//修改地图中心点 |
|||
const center = map.getCenter(); |
|||
const lat = center.getLat(); |
|||
const lng = center.getLng(); |
|||
// item.supValues[0] = lng; |
|||
// item.supValues[1] = lat; |
|||
this.fmData[item.supKeys[0]] = lng; |
|||
this.fmData[item.supKeys[1]] = lat; |
|||
this.setMarker(lat, lng); |
|||
|
|||
if (e && e.originalEvent) { |
|||
geocoder |
|||
.getAddress({ location: new TMap.LatLng(lat, lng) }) // 将给定的坐标位置转换为地址 |
|||
.then((result) => { |
|||
this.fmData[item.keyName] = result.result.address; |
|||
}); |
|||
} |
|||
}, |
|||
|
|||
async getInfo() { |
|||
let url = this.infoUrl; |
|||
if (!url) return; |
|||
const { idName, formId } = this; |
|||
|
|||
if (url.endsWith("/")) { |
|||
url += formId; |
|||
} |
|||
|
|||
const params = { |
|||
[idName]: formId, |
|||
}; |
|||
|
|||
let { data, code, msg } = await requestPost(url, params); |
|||
if (code === 0) { |
|||
const { editConfig } = this; |
|||
console.log("xxxxxxxxxxxxxxxxxxxxxx", editConfig); |
|||
if (editConfig && typeof editConfig.cookInfoFn == "function") { |
|||
data = editConfig.cookInfoFn(data); |
|||
} |
|||
this.fmData = { |
|||
...this.fmData, |
|||
...data, |
|||
}; |
|||
|
|||
await nextTick(600); |
|||
if (map) { |
|||
if (data.latitude) { |
|||
map.setCenter(new TMap.LatLng(data.latitude, data.longitude)); |
|||
} else { |
|||
if (this.formType == "edit" && this.$refs && this.$refs.mapSearch) { |
|||
this.$refs.mapSearch[0].handleClick(); |
|||
} |
|||
} |
|||
} |
|||
} else { |
|||
this.$message.error(msg); |
|||
} |
|||
}, |
|||
|
|||
watchImg(src) { |
|||
window.open(src); |
|||
}, |
|||
|
|||
// 过滤文本 |
|||
dormatHtml(content) { |
|||
if ( |
|||
content.startsWith( |
|||
"<!DOCTYPE html>\n<html>\n<head>\n</head>\n<body>\n" |
|||
) && |
|||
content.endsWith("\n</body>\n</html>") |
|||
) { |
|||
content = content.slice(45, -16); |
|||
} |
|||
return content; |
|||
}, |
|||
|
|||
cookBeforeSubmit(data) { |
|||
Object.keys(data).forEach((k) => { |
|||
if (typeof data[k] == "string") { |
|||
data[k] = this.dormatHtml(data[k]); |
|||
} |
|||
}); |
|||
return data; |
|||
}, |
|||
|
|||
async handleComfirm() { |
|||
this.btnDisable = true; |
|||
setTimeout(() => { |
|||
this.btnDisable = false; |
|||
}, 5000); |
|||
|
|||
console.log(this.$refs["ref_form"]); |
|||
|
|||
this.$refs["ref_form"].validate((valid, messageObj) => { |
|||
console.log(valid, messageObj); |
|||
if (!valid) { |
|||
app.util.validateRule(messageObj); |
|||
this.btnDisable = false; |
|||
} else { |
|||
if (this.editElseRules) { |
|||
const validator = new Schema(this.editElseRules); |
|||
validator |
|||
.validate(this.fmData) |
|||
.then(() => { |
|||
this.submit(); |
|||
}) |
|||
.catch(({ err, fields }) => { |
|||
console.log("--------------", err, fields); |
|||
app.util.validateRule(fields); |
|||
}); |
|||
} else { |
|||
this.submit(); |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
|
|||
async submit() { |
|||
const { editConfig, fmData, formType, editFixedParams } = this; |
|||
if ( |
|||
typeof editConfig.beforeSubmit == "function" && |
|||
!editConfig.beforeSubmit(formType, fmData, this) |
|||
) { |
|||
return; |
|||
} |
|||
|
|||
let url = ""; |
|||
let params = { |
|||
...fmData, |
|||
...editFixedParams, |
|||
// serviceType: this.fmData.serviceTypeArr.join(","), |
|||
}; |
|||
|
|||
params = this.cookBeforeSubmit(params); |
|||
|
|||
if (this.formType === "add") { |
|||
url = this.addUrl; |
|||
} else { |
|||
url = this.editUrl; |
|||
} |
|||
|
|||
const { data, code, msg } = await requestPost(url, params); |
|||
|
|||
if (code === 0) { |
|||
this.$message({ |
|||
type: "success", |
|||
message: "操作成功", |
|||
}); |
|||
this.handleCancle(); |
|||
this.$emit("afterEdit"); |
|||
this.btnDisable = false; |
|||
} else { |
|||
this.btnDisable = false; |
|||
this.$message.error(msg); |
|||
} |
|||
}, |
|||
|
|||
handleCancle() { |
|||
this.$emit("close"); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.m-fm { |
|||
margin-top: 30px; |
|||
|
|||
&.z-div { |
|||
.list { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
|
|||
.item { |
|||
min-width: 45%; |
|||
|
|||
.item-rich-text { |
|||
width: 817px; |
|||
max-height: 500px; |
|||
overflow: auto; |
|||
|
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
&.z-show { |
|||
box-sizing: border-box; |
|||
padding: 15px; |
|||
border: 1px solid #eee; |
|||
height: auto; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.item-show { |
|||
width: 324px; |
|||
} |
|||
|
|||
.item-input { |
|||
width: 324px; |
|||
} |
|||
.item-select { |
|||
width: 324px; |
|||
} |
|||
.item-number { |
|||
width: 180px; |
|||
} |
|||
|
|||
.address-item { |
|||
width: 350px; |
|||
|
|||
.address-item-input { |
|||
width: 74%; |
|||
} |
|||
.address-item-input2 { |
|||
margin-left: 5px; |
|||
width: 40%; |
|||
} |
|||
} |
|||
} |
|||
.avatar-uploader { |
|||
&.z-full { |
|||
/deep/ .el-upload.el-upload--picture-card { |
|||
display: none !important; |
|||
} |
|||
} |
|||
|
|||
a { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
color: #65a5f9; |
|||
i { |
|||
margin-right: 4px; |
|||
color: #65a5f9; |
|||
font-size: 18px; |
|||
} |
|||
&:hover { |
|||
text-decoration: none; |
|||
} |
|||
} |
|||
} |
|||
.item-rich-text { |
|||
width: 600px; |
|||
height: 500px; |
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
.item-show { |
|||
width: 100%; |
|||
} |
|||
} |
|||
|
|||
.item-select, |
|||
.item-show, |
|||
.item-input { |
|||
width: 450px; |
|||
} |
|||
.item-number { |
|||
width: 225px; |
|||
} |
|||
|
|||
.address-item { |
|||
width: 450px; |
|||
|
|||
.address-item-input { |
|||
width: 85%; |
|||
} |
|||
.address-item-input2 { |
|||
margin-left: 5px; |
|||
width: 40%; |
|||
} |
|||
} |
|||
.div_map { |
|||
margin-top: 10px; |
|||
} |
|||
} |
|||
</style> |
Loading…
Reference in new issue