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.

346 lines
11 KiB

5 years ago
<template>
<div class="project-form"
:style="{backgroundColor:projectTheme.backgroundColor,
background:projectTheme.backgroundImg?'url('+projectTheme.backgroundImg+') no-repeat center':''}"
>
5 years ago
<div class="">
5 years ago
<div :style="{textAlign:projectTheme.logoPosition}">
<img
:src="projectTheme.logoImg" class="logo-img"
>
5 years ago
</div>
5 years ago
<el-image
5 years ago
v-if="projectTheme.headImgUrl"
:src="projectTheme.headImgUrl"
style="width: 100%;"
fit="scale-down"
/>
<h4 v-if="projectTheme.showTitle" class="form-name-text" style="text-align: center;">
5 years ago
{{ formConf.title }}
</h4>
5 years ago
<div
v-show="projectTheme.showDescribe"
class="form-name-text" v-html="formConf.description"
/>
<el-divider />
<parser v-if="startParser"
:key="parserKey"
:form-model="formModel"
:label-form-model="labelFormModel"
:form-conf="formConf" @next="nextPage" @prev="prevPage" @submit="submitForm"
/>
5 years ago
</div>
</div>
</template>
<script>
import Parser from '@/components/parser/Parser'
import {dbDataConvertForItemJson} from '@/utils/convert'
import {getExpression} from '@/utils/expression'
import _ from 'lodash'
5 years ago
window.onload = function() {
document.addEventListener('touchstart', function(event) {
if (event.touches.length > 1) {
event.preventDefault()
}
})
document.addEventListener('gesturestart', function(event) {
event.preventDefault()
})
}
export default {
components: {
Parser
},
props: {
projectConfig: {
projectKey: '',
5 years ago
showBtns: true,
// 项目种类 1 普通 2模板
projectKind: 1
5 years ago
}
},
data() {
return {
logicShowTriggerRule: {},
startParser: false,
formModel: {},
labelFormModel: {},
5 years ago
projectTheme: {
5 years ago
headImgUrl: '',
5 years ago
logoImg: '',
5 years ago
showTitle: true,
showDescribe: true
5 years ago
},
parserKey: +new Date(),
// 每页数据
perPageFields: {},
5 years ago
formConf: {
fields: [],
logicShowRule: {},
projectKey: '',
5 years ago
projectKind: 1,
5 years ago
__methods__: {},
formRef: 'elForm',
formModel: 'formData',
5 years ago
labelFormModel: 'labelFormData',
5 years ago
size: 'small',
labelPosition: 'top',
labelWidth: 100,
formRules: 'rules',
gutter: 15,
disabled: false,
span: 24,
formBtns: true,
resetBtn: false,
submitBtnText: '提交',
submitBtnColor: '#409EFF',
showNumber: false,
5 years ago
unFocusedComponentBorder: true
}
}
},
computed: {},
watch: {},
5 years ago
beforeCreate() {
document.querySelector('body').className = 'project-body'
},
5 years ago
created() {
if (this.projectConfig && this.projectConfig.projectKey) {
this.formConf.projectKey = this.projectConfig.projectKey
5 years ago
if (this.projectConfig.projectKind) {
this.formConf.projectKind = this.projectConfig.projectKind
}
5 years ago
} else if (this.$route.query.key) {
// 不存去路由中尝试获取 iframe
this.formConf.projectKey = this.$route.query.key
5 years ago
if (this.$route.query.kind) {
this.formConf.projectKind = this.$route.query.kind
}
this.formConf.formBtns = true
5 years ago
}
this.formConf.size = window.innerWidth < 480 ? 'medium' : 'small'
},
async mounted() {
5 years ago
let url = `/user/project/details/${this.formConf.projectKey}`
if (this.formConf.projectKind == 2) {
url = `/project/template/details/${this.formConf.projectKey}`
}
let logicItemList = []
// 处理逻辑表单
if (this.formConf.projectKind == 1) {
let res = await this.queryLogicItemList()
logicItemList = res.data
}
let logicItemMap = new Map()
logicItemList.forEach(item => {
logicItemMap.set(item.formItemId, item)
this.logicShowTriggerHandle(item)
})
5 years ago
this.$api.get(url).then(res => {
5 years ago
if (res.data) {
let serialNumber = 1
5 years ago
let fields = res.data.projectItems.map(item => {
let projectItem = dbDataConvertForItemJson(item)
projectItem.serialNumber = serialNumber
projectItem.logicShow = !logicItemMap.get(projectItem.formItemId)
serialNumber++
return projectItem
5 years ago
})
this.pageShowHandle(fields)
if (_.keys(this.perPageFields).length != 0) {
this.formConf.fields = _.get(this.perPageFields, 1)
this.formConf.formBtns = false
} else {
this.formConf.fields = fields
}
4 years ago
if (res.data.project) {
this.formConf.title = res.data.project.name
this.formConf.description = res.data.project.describe
}
this.formConf.logicShowRule = this.logicShowTriggerRule
// 主题数据
5 years ago
if (res.data.userProjectTheme) {
5 years ago
this.projectTheme = res.data.userProjectTheme
5 years ago
let {submitBtnText, showNumber, btnsColor} = res.data.userProjectTheme
if (submitBtnText) this.formConf.submitBtnText = submitBtnText
if (showNumber) this.formConf.showNumber = showNumber
if (btnsColor) this.formConf.submitBtnColor = btnsColor
5 years ago
}
this.startParser = true
5 years ago
}
5 years ago
})
},
methods: {
// 分页显示数据处理
pageShowHandle(allFields) {
// 判断是否存在分页
let index = allFields.findIndex(item => {
return item.typeId === 'PAGINATION'
})
if (index < 0) {
return
}
let curr = 1
// 每页字段
let perPageFields = {}
// 分页字段数据
let pageFields = {}
allFields.forEach(item => {
let fields = _.get(perPageFields, curr)
if (item.typeId === 'PAGINATION') {
_.set(pageFields, curr, item)
if (fields) {
item.currPageNum = curr++
}
} else {
if (!fields || fields == undefined) {
fields = new Array()
}
fields.push(item)
_.set(perPageFields, curr, fields)
}
})
let len = _.keys(perPageFields).length
// 计算页数 添加分页
_.keys(perPageFields).forEach(key => {
let pageItem = _.get(pageFields, key)
let fields = _.get(perPageFields, key)
pageItem.totalPageNum = len
fields.push(pageItem)
_.set(perPageFields, key, fields)
})
this.perPageFields = perPageFields
},
/**
4 years ago
* 处理逻辑显示数据
*/
logicShowTriggerHandle(logicItem) {
if (!logicItem) {
return
}
// 建立触发关系 该字段值发生变化时 哪些问题需要进行逻辑判断 确定是否显示
logicItem.conditionList.forEach(item => {
let rules = this.logicShowTriggerRule[item.formItemId]
if (!rules) {
rules = new Array()
}
rules.push({
// 触发的字段
triggerFormItemId: logicItem.formItemId,
logicExpression: getExpression(logicItem.conditionList, logicItem.expression)
})
this.logicShowTriggerRule[item.formItemId] = rules
})
},
// 统一处理axios请求
queryLogicItemList() {
return new Promise((resolve, reject) => {
this.$api.get('/user/project/logic/list', {params: {projectKey: this.formConf.projectKey}})
.then(res => {
resolve(res)
}).catch(err => {
reject(err)
})
})
},
prevPage(params) {
this.switchPage(params.page - 1, params)
},
nextPage(params) {
this.switchPage(params.page + 1, params)
},
switchPage(page, params) {
let {labelFormModel, formModel} = params
this.formModel = formModel
this.labelFormModel = labelFormModel
this.formConf.formBtns = _.keys(this.perPageFields).length == page
this.formConf.fields = _.get(this.perPageFields, page)
this.parserKey = +new Date()
},
5 years ago
submitForm(data) {
5 years ago
this.$emit('submit', data)
5 years ago
}
}
}
</script>
5 years ago
<style lang="scss">
5 years ago
5 years ago
.project-form {
4 years ago
margin: 15px auto;
width: 800px;
padding: 15px;
background-repeat: repeat;
background-color: rgba(229, 239, 247, 0.87);
5 years ago
}
4 years ago
5 years ago
.project-body::-webkit-scrollbar {
4 years ago
width: 0 !important;
background: transparent;
5 years ago
}
4 years ago
5 years ago
.project-body {
4 years ago
-ms-overflow-style: none;
overflow: -moz-scrollbars-none;
5 years ago
}
4 years ago
5 years ago
.logo-img {
4 years ago
max-height: 120px;
5 years ago
}
4 years ago
5 years ago
.submit-btn-form-item {
4 years ago
text-align: left;
}
4 years ago
5 years ago
.submit-btn-form-item button {
4 years ago
width: 20%;
}
4 years ago
5 years ago
@media screen and (max-width: 750px) {
4 years ago
.project-form {
margin: 0;
width: 100% !important;
background-color: white;
}
.logo-img {
max-height: 2.94rem;
}
.submit-btn-form-item {
text-align: center;
}
.submit-btn-form-item button {
width: 80%;
}
4 years ago
}
4 years ago
4 years ago
@media screen and (max-width: 500px) {
4 years ago
.el-message {
min-width: 300px !important;
}
.el-message-box {
width: 300px !important;
}
//! 日期范围兼容移动端
//.el-date-range-picker__content{
// float: none!important;
// width: 100% !important;
//}
//# 日期范围兼容移动端
.el-dialog__wrapper .el-dialog {
width: 300px !important;
.el-dialog__body {
padding: 10px 20px !important;
.el-form-item__label {
width: 68px !important;
}
4 years ago
}
4 years ago
}
4 years ago
}
4 years ago
5 years ago
</style>