RuralDatabase/reference/3d-map/renderApiServer/renderVue/renderFormView.js

421 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const content = `
<!--
此代码由renderVue工具自动生成
作者mask
-->
<template>
<div class="demo-demo-form-dialog-container">
<el-dialog v-model="state.showDialog" destroy-on-close :title="state.title" draggable :close-on-click-modal="false"
:close-on-press-escape="false" width="70%" @close="resetForm">
<el-form :model="state.form" ref="formRef" size="default" label-width="150px">
<el-row :gutter="35">
<%- column %>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click.stop="onCancel" size="default">取 消</el-button>
<el-button type="primary" @click.stop="onSure" size="default" :loading="state.sureLoading">确 定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { reactive, toRefs, ref, getCurrentInstance, defineAsyncComponent, defineProps, watch, computed } from 'vue'
import { <%= dirName %>UpdateInput } from '/@/api/interface'
import {
<%= lowerCasedirName %>Get,
<%= lowerCasedirName %>Add,
<%= lowerCasedirName %>Update,
} from "/@/api/controller";
import { useDictListInfo } from '/@/stores/dictListInfo'
import { storeToRefs } from 'pinia'
import pinia from '/@/stores/index'
import { useUserInfo } from '/@/stores/userInfo';
const storesUserInfo = useUserInfo(pinia)
const { proxy } = getCurrentInstance() as any
const DictSelect = defineAsyncComponent(() => import('/@/components/DictSelect/index.vue'))
const CommonInterfaceSelect = defineAsyncComponent(() => import('/@/components/CommonInterfaceSelect/index.vue'))
const storesUseUserInfo = useDictListInfo()
const { dictListInfo } = storeToRefs(storesUseUserInfo)
const formRef = ref()
const state = reactive({
title: '新增',
showDialog: false,
sureLoading: false,
form: {} as <%= dirName %>UpdateInput,
upload:{
<%= uploadVar %>
}
})
const emit = defineEmits(["refresh"])
function resetForm() {
state.form = {} as <%= dirName %>UpdateInput
<%= uploadVarReset %>
}
// 打开对话框
const open = async (row: any) => {
if (row && row.id) {
try {
state.title = '修改'
const res = await <%= lowerCasedirName %>Get({ id: row.id })
if (res?.success) {
state.form = res.data
<%= uploadEcho %>
}
} catch (error) {
proxy.$modal.closeLoading()
}
}
state.showDialog = true
}
// 取消
const onCancel = () => {
resetForm()
state.showDialog = false
}
// 确定
const onSure = () => {
formRef.value.validate(async (valid: boolean) => {
if (!valid) return
state.sureLoading = true
let res = {} as any
if (state.form.id) {
try {
res = await <%= lowerCasedirName %>Update(state.form)
if (res.success) {
proxy.$modal.msgSuccess('修改成功')
resetForm()
}
} catch (error) {
} finally {
state.sureLoading = false
}
} else {
try {
res = await <%= lowerCasedirName %>Add(state.form)
if (res.success) {
proxy.$modal.msgSuccess('新增成功')
resetForm()
}
} catch (error) {
} finally {
state.sureLoading = false
}
}
if (res?.success) {
emit('refresh')
state.showDialog = false
}
})
}
defineExpose({
open,
})
</script>
`;
let ejs = require('ejs');
let { toCapitalizeFirstLetter } = require('../utils/index.js');
/**
* 上传接口的后缀 例如:/api/business-manage/contract/upload-attachment 后缀为upload-attachment
*/
const uploadSuffix = 'upload-attachment';
/**
* 生成el-form-item数据
* @param {*} barr { label: string, prop: string ,type: string}[]
*/
function renderColumn(barr, permissionPrefix, requiredArr) {
/**
* 生成的el-form-item数据
*/
let column = '';
/**
* 保存附件上传所用到的函数部分代码
*/
let uploadFuncStr = '';
/**
* 保存附件上传所用到的变量部分代码
*/
let uploadVar = '';
/**
* 保存附件上传所用到的变量重置部分代码
*/
let uploadVarReset = '';
/**
* 保存附件上传所用到的变量回显部分代码
*/
let uploadEcho = '';
// 遍历过滤后的数组
for (let i = 0; i < barr.length; i++) {
let item = barr[i];
let label = item.label ? item.label : '';
// 如果对象标签中包含字典
if (label.indexOf('字典') != -1) {
column += renderDictColumn(item, requiredArr);
// 如果对象标签中包含是否
} else if (label.indexOf('是否') != -1) {
column += renderBooleanColumn(item, requiredArr);
} else if (label.indexOf('日期') != -1 || label.indexOf('时间') != -1) {
column += renderDateColumn(item, requiredArr);
} else if (label.indexOf('备注') != -1 || label.indexOf('描述') != -1) {
column += renderTextAreaColumn(item, requiredArr);
} else if (label.indexOf('附件') != -1) {
let { formItem, formFuncStr } = renderUploadColumn(item, requiredArr);
column += formItem;
if (!uploadFuncStr) {
uploadFuncStr += `//上传
const fileAction = computed(() => {
return import.meta.env.VITE_API_URL + '/${permissionPrefix.replaceAll(':', '/')}/upload-attachment'
})
const fileHeaders = computed(() => {
return { Authorization: 'Bearer ' + storesUserInfo.getToken() }
})\n`;
}
uploadFuncStr += `${formFuncStr}\n`;
uploadVar += `${item.prop}: [],\n`;
uploadVarReset += `state.upload.${item.prop}= [];\n`;
uploadEcho += `if (state.form.${item.prop}) state.upload.${item.prop} = state.form.${item.prop}\n`;
} else {
// 调用renderDateColumn函数生成el-descriptions-item数据
column += renderInputColumn(item, requiredArr);
}
}
return { column, uploadVar, uploadVarReset, uploadFuncStr, uploadEcho };
}
/**
* 生成表单页
* @param {object} obj swagger信息
* @param {string} dirName 文件夹名称
* @param {string} permissionPrefix 权限前缀
*/
function renderForm(obj, dirName, permissionPrefix) {
// 过滤掉不需要生成的字段
// let filter = ['附件'];
let filter = [];
let schemas = obj.components.schemas[dirName + 'AddInput'];
let properties = schemas.properties;
let requiredArr = schemas.required;
let arr = [];
for (let key in properties) {
arr.push({ label: properties[key].description, prop: key, type: properties[key].type });
}
// 过滤数组
let barr = arr.filter((item) => {
// 声明一个布尔值
let isFlag = true;
// 遍历过滤字段
filter.map((filterItem) => {
// 如果过滤字段在对象标签中则将布尔值设置为false
if (item.label.indexOf(filterItem) !== -1) {
return (isFlag = false);
}
});
// 如果布尔值为false则返回false
if (!isFlag) {
return false;
// 如果布尔值为true则返回true
} else {
return true;
}
});
let { column, uploadVar, uploadVarReset, uploadFuncStr, uploadEcho } = renderColumn(barr, permissionPrefix, requiredArr ? requiredArr : []);
let lowerCasedirName = dirName.charAt(0).toLowerCase() + dirName.slice(1);
let templateStr = ejs.render(content, {
permissionPrefix,
column,
dirName,
lowerCasedirName,
uploadVar,
uploadVarReset,
uploadFuncStr,
uploadEcho,
});
return templateStr;
}
//生成字典行
function renderDictColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`;
}
}
return `${`<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="${item.label}" prop="${item.prop}" ${str}>
<DictSelect v-model="state.form.${item.prop}" placeholder="请选择${item.label}"
:options="dictListInfo.${item.prop}" clearable />
</el-form-item>
</el-col>`}\n`;
}
//生成 是否 字段的行
function renderBooleanColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`;
}
}
return `${`<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<el-form-item label="${item.label}" prop="${item.prop}" ${str}>
<el-switch v-model="state.form.${item.prop}" />
</el-form-item>
</el-col>`}\n`;
}
//生成 日期 字段的行
function renderDateColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`;
}
}
return `${`<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<el-form-item label="${item.label}" prop="${item.prop}" ${str}>
<el-date-picker v-model="state.form.${item.prop}" format="YYYY/MM/DD" value-format="YYYY-MM-DD" type="date"
placeholder="请选择${item.label}" style="width: 100%" />
</el-form-item>
</el-col>\n`}`;
}
/**
* 生成input输入框
*/
function renderInputColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请输入${item.label}', trigger: ['blur', 'change'] }]"`;
}
}
return `${`<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<el-form-item label="${item.label}" prop="${item.prop}" ${str}>
<el-input v-model="state.form.${item.prop}" placeholder="请输入${item.label}" clearable />
</el-form-item>
</el-col>\n`}`;
}
/**
* 生成多行文本输入框
*/
function renderTextAreaColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请输入${item.label}', trigger: ['blur', 'change'] }]"`;
}
}
return `${`<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-form-item label="${item.label}" prop="${item.prop}" ${str}>
<el-input v-model="state.form.${item.prop}" placeholder="请输入${item.label}" type="textarea" :rows="5" clearable />
</el-form-item>
</el-col>\n`}`;
}
/**
*
* @param {*} item
* @param {*} requiredArr 必填项prop列表
* @returns {*} formItem:表单部分, formFuncStr: 函数部分
*/
function renderUploadColumn(item, requiredArr) {
let str = '';
for (let item of requiredArr) {
if (item.includes(item.prop)) {
str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['change'] }]"`;
}
}
return {
formItem: `${`<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-form-item label="上传附件" prop="${item.prop}" ${str}>
<el-upload ref="upload" v-model:file-list="state.upload.${item.prop}" class="w100" :on-change="handleChange${toCapitalizeFirstLetter(item.prop)}"
:action="fileAction" multiple :headers="fileHeaders" :before-upload="() => {
import${toCapitalizeFirstLetter(item.prop)}Loading = true
}" :on-success="onImportSuccess${toCapitalizeFirstLetter(item.prop)}" :on-error="onFileError${toCapitalizeFirstLetter(item.prop)}">
<el-button type="primary" :loading="import${toCapitalizeFirstLetter(item.prop)}Loading">选择文件</el-button>
</el-upload>
</el-form-item>
</el-col>\n`}`,
formFuncStr: `${`
const import${toCapitalizeFirstLetter(item.prop)}Loading = ref(false)
//上传成功
const onImportSuccess${toCapitalizeFirstLetter(item.prop)} = (res: {
data: never; success: any; msg: any
}) => {
import${toCapitalizeFirstLetter(item.prop)}Loading.value = false
}
//上传失败
const onFileError${toCapitalizeFirstLetter(item.prop)} = (error: any) => {
import${toCapitalizeFirstLetter(item.prop)}Loading.value = false
let message = ''
if (error.message) {
try {
message = JSON.parse(error.message)?.msg
} catch (err) {
message = error.message || ''
}
}
if (message) proxy.$modal.msgError(message)
}
const handleChange${toCapitalizeFirstLetter(item.prop)} = (uploadFile: any, uploadFiles: any) => {
if (uploadFiles) {
let arr: any = []
uploadFiles.forEach((item: any, index: number) => {
if (item.url && item.status == 'success') {
arr.push(item)
} else if (item.status == 'success' && item.response && item.response.success) {
arr.push(item.response.data)
} else if (item.status == 'success' && item.response && !item.response.success) {
proxy.$modal.msgError(item.response.msg)
state.upload.${item.prop}.pop()
}
})
state.form.files = arr
}
}\n`}`,
};
}
module.exports = {
renderForm,
};