<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/vue/2.6.11/vue.js"></script>
<!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="app">
<el-form ref="data" :model="data" label-position="left" :rules="rules" status-icon>
<el-form-item v-for="(item, index) in data.formList" :label="item.ENAME" :key="item.EID" status-icon
:prop="'formList.' + index + '.VALUE'" :rules="item.RULES.formInlineVal">
<template v-if="item.ETYPE == 1">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 2">
<el-input v-model.number="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 3">
<div class="block">
<el-date-picker v-model="item.VALUE" type="datetime" placeholder="选择日期时间">
</el-date-picker>
</div>
</template>
<template v-if="item.ETYPE == 4">
<el-select v-model="item.VALUE" placeholder="请选择">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</template>
<template v-if="item.ETYPE == 5">
<el-radio-group v-model="item.VALUE">
<el-radio label="线上品牌商赞助"></el-radio>
<el-radio label="线下场地免费"></el-radio>
</el-radio-group>
</template>
<template v-if="item.ETYPE == 6">
<el-checkbox-group v-model="item.VALUE">
<el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
<el-checkbox label="地推活动" name="type"></el-checkbox>
<el-checkbox label="线下主题活动" name="type"></el-checkbox>
<el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</template>
<template v-if="item.ETYPE == 9">
<el-input v-model="item.VALUE" type="textarea" placeholder="请输入">
</el-input>
</template>
<template v-if="item.ETYPE == 10">
<el-input type="password" v-model="item.VALUE" autocomplete="off"></el-input>
</template>
<template v-if="item.ETYPE == 16">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 36">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 17">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 18">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 19">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 20">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 21">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 23">
<el-input v-model="item.VALUE"></el-input>
</template>
<template v-if="item.ETYPE == 7">
<el-upload class="upload-demo" ref="upload" :action="saveMeals" :file-list="item.VALUE"
:on-remove="handleRemove" :before-upload="beforeUpload" name="meals" accept="file/*"
:on-change="fileChange" :on-success="handleUploadSuccess" :auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button size="medium" type="success" @click="submitUpload(item.VALUE)">
<i class="el-icon-upload el-icon--right"></i>上传到服务器
</el-button>
</el-upload>
</template>
</el-form-item>
<el-form-item style="text-align: center;margin-top: 10px;">
<el-button type="primary" @click="submitForm('data')">提交</el-button>
<el-button @click="resetForm('data')">重置</el-button>
</el-form-item>
</el-form>
</div>
<script>
new Vue({
el: '#app',
data() {
//密码
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
callback();
}
};
//手机号验证
var checkCellPhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('手机号不能为空'));
} else {
const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
if (reg.test(value)) {
callback();
} else {
return callback(new Error('请输入正确的手机号'));
}
}
};
//座机号验证
var checkTelePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('座机号不能为空'));
} else {
const reg = /^(\d{3,4}-)?\d{7,8}$/;//座机和传真格式是一样的:区号-号码
if (reg.test(value)) {
callback();
} else {
return callback(new Error('请输入正确的座机号'));
}
}
};
//金额验证
var checkPrice = (rule, value, callback) => {
if (!value) {
return callback(new Error('金额不能为空'));
} else {
const rgx = /(^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d{1,2})?$)/;
if (value.match(rgx) == null) {
return callback(new Error('请检查输入格式,不能为空,且最多两位小数'))
} else {
callback();
}
}
};
//身份证号验证
var checkID = (rule, value, callback) => {
if (!value) {
return callback(new Error('身份证号不能为空'));
} else {
const reg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/;
if (reg.test(value)) {
callback();
} else {
return callback(new Error('请输入正确的身份证号'));
}
}
};
//IP验证
var checkCodeIp = (rule, value, callback) => {
const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
if (reg.test(value)) {
callback();
} else {
return callback(new Error('输入格式不合法!'));
}
};
return {
data: {
formList: [], //存放表单数据
myFileList: [],
},
rules: { //表单校验规则
text: [
{ required: 1, message: '请输入名称', trigger: 'blur' },
// { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
number: [
{ required: 1, message: '数字不能为空' },
{ type: 'number', message: '必须为数字值' }
],
datetime: [
{ type: 'date', required: 1, message: '请选择时间', trigger: 'change' }
],
select: [
{ required: 1, message: '请选择', trigger: 'change' }
],
radio: [
{ required: 1, message: '请选择', trigger: 'change' }
],
checkbox: [
{ type: 'array', required: 1, message: '请至少选择一个', trigger: 'change' }
],
textarea: [
{ required: 1, message: '请输入内容', trigger: 'blur' }
],
password: [
{ required: 1, validator: validatePass, trigger: 'blur' }
],
curruser: [
{ required: 1, message: '请输入', trigger: 'blur' },
],
currTenant: [
{ required: 1, message: '请输入', trigger: 'blur' },
],
email: [
{ required: 1, message: '请输入邮箱地址', trigger: 'blur' },
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
],
cellphone: [
{ required: 1, trigger: 'blur', validator: checkCellPhone }
],
telephone: [
{ required: 1, trigger: 'blur', validator: checkTelePhone }
],
money: [
{ required: 1, trigger: ['blur', 'change'], validator: checkPrice },
],
ID: [
{ required: 1, trigger: ['blur', 'change'], validator: checkID },
],
IP: [
{ required: 1, message: 'IP不能为空', trigger: 'blur' },
{ validator: checkCodeIp, trigger: 'blur' }
],
file: [
{ required: 1, message: '请选择上传', trigger: 'change' }
]
}
}
},
methods: {
init: function () { //初始化加载数据
var that = this;
$.ajax({
type: "get",
url: "",
cache: false,
async: false,
dataType: "JSON",
success: function (data) {
},
error: function (data) {
}
});
var temp = [{ 'ENAME': '申请人', 'EID': 'SHENQINGREN', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '1' },
{ 'ENAME': '申请原因', 'EID': 'SHENQINGYUANYIN', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '2' },
{ 'ENAME': '计划开始时间', 'EID': 'STARTTIME', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '3' },
{ 'ENAME': '计划结束时间', 'EID': 'ENDTIME', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '3' },
{ 'ENAME': '下拉框', 'EID': 'SELECT', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '4' },
{ 'ENAME': '单选', 'EID': 'RADIO', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '5' },
{ 'ENAME': '多选', 'EID': 'CHECKBOX', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '6' },
{ 'ENAME': '多行输入', 'EID': 'TEXTAREA', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '9' },
{ 'ENAME': '密码', 'EID': 'PASSWORD', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '10' },
{ 'ENAME': '当前用户', 'EID': 'CURRUSRE', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '16' },
{ 'ENAME': '当前租户', 'EID': 'CURRTENANT', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '36' },
{ 'ENAME': '邮箱', 'EID': 'EMAIL', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '17' },
{ 'ENAME': '手机号', 'EID': 'CELLPHONE', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '18' },
{ 'ENAME': '座机号', 'EID': 'TELEPHONE', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '19' },
{ 'ENAME': '金额', 'EID': 'MONEY', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '20' },
{ 'ENAME': '身份证号', 'EID': 'ID', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '21' },
{ 'ENAME': 'IP地址', 'EID': 'IP', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '23' },
{ 'ENAME': '文件上传', 'EID': 'FILE', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '7' },
];
for (var i = 0; i < temp.length; i++) { //对初始数据加工,挂上对应rule
switch (temp[i].ETYPE) {
case '1': //text
temp[i].VALUE = '';
that.addRules(temp[i], 'text');
break;
case '2': //number
temp[i].VALUE = '';
that.addRules(temp[i], 'number');
break;
case '3': //datetime
temp[i].VALUE = '';
that.addRules(temp[i], 'datetime');
break;
case '4': //select
temp[i].VALUE = '';
that.addRules(temp[i], 'select');
break;
case '5': //radio
temp[i].VALUE = '';
that.addRules(temp[i], 'radio');
break;
case '6': //checkbox
temp[i].VALUE = [];
that.addRules(temp[i], 'checkbox');
break;
case '9': //textarea
temp[i].VALUE = '';
that.addRules(temp[i], 'textarea');
break;
case '10': //password
temp[i].VALUE = '';
that.addRules(temp[i], 'password');
break;
case '16': //curruser
temp[i].VALUE = '';
that.addRules(temp[i], 'curruser');
break;
case '36': //currTenant
temp[i].VALUE = '';
that.addRules(temp[i], 'currTenant');
break;
case '17': //email
temp[i].VALUE = '';
that.addRules(temp[i], 'email');
break;
case '18': //cellphone
temp[i].VALUE = '';
that.addRules(temp[i], 'cellphone');
break;
case '19': //telephone
temp[i].VALUE = '';
that.addRules(temp[i], 'telephone');
break;
case '20': //money
temp[i].VALUE = '';
that.addRules(temp[i], 'money');
break;
case '21': //ID
temp[i].VALUE = '';
that.addRules(temp[i], 'ID');
break;
case '23': //IP
temp[i].VALUE = '';
that.addRules(temp[i], 'IP');
break;
case '7': //file
debugger
temp[i].VALUE = [];
temp[i].saveMeals = '';
that.addRules(temp[i], 'file');
break;
}
}
that.data.formList = temp;
console.log(that.data.formList);
},
addRules: function (obj, type) { //组装rules数据格式
var that = this;
var arr = [];
obj.REQUIRED = obj.REQUIRED ^ 1; //0、1互转
$.each(that.rules[type], function (i, val) {
val.required = obj.REQUIRED
arr.push(val);
});
obj.RULES = new Object();
var formInlineVal = arr;
obj.RULES.formInlineVal = formInlineVal;
},
submitForm(formName) { //点击提交按钮调用
this.$refs[formName].validate((valid) => {
if (valid) {
alert('submit!');
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) { //点击重置按钮 清空表单信息
this.$refs[formName].resetFields();
},
//上传文件相关方法
beforeUpload(file) {//文件上传前的钩子函数
debugger
console.log('file>>>>>');
console.log(file);
},
submitUpload(val) {//上传
if (this.myFileList == null || this.myFileList == '') { //判断当前是否有上传文件
this.$message({ type: 'error', message: "请选择文件!" })
return false;
} else {
console.log('this.myFileList>>>>>');
console.log(this.myFileList);
var fileData = this.myFileList[0];
val.push(fileData);//VALUE字段灌入上传的文件信息数据
console.log('上传服务器>>>>');
console.log(this.data.formList);
this.$refs.upload.submit();
$.ajax({
type: "post",
url: "",
data: fileData,
contentType: false,//这里不能少
dataType: 'json',
success: function (data) {
},
error: function (error) {
}
});
}
},
// 上传成功的钩子函数
handleUploadSuccess(response, file, fileList) {
this.$refs.upload.clearFiles();//移除文件,防止重复上传
this.$message(response);//显示上传结果
},
handleRemove() {//移除文件
this.myFileList = [];
},
fileChange(file, fileList) {//限制只能选中一个文件
this.myFileList = fileList.slice(-1); //获取当前上传文件数据
}
},
mounted: function () {
this.init(); //初始化加载表单数据
}
})
</script>
</body>
</html>
element根据后台返回的数据动态加载表单及对应的验证规则
最新推荐文章于 2023-12-06 17:42:42 发布