zpw-vue-form
Version:
vue 表单系统
375 lines (366 loc) • 11.6 kB
JavaScript
/**
* @
* @param s - 格式字符串
* @param len - 长度
* @returns {*|string} - 结果
* @ignore
*/
function padding(s, len) {
len = len - (s + '').length;
for (var i = 0; i < len; i++) { s = '0' + s; }
return s;
}
/**
* @module utils
* @description 工具包
* @author pengwei.zhao
* @copyright @2013-2020 pengwei.zhao. | pengwei.zhao版权所有
* @version 1.0.0
* @const{(Object.)}
* @readonly
*/
let utils = {
/**
* @function formatDate
* @summary 格式化日期
* @param {Date} date - 日期
* @param {string} pattern - 格式表达式
*
* yyyy年MM月dd日 hh时mm分ss秒
* @example
* .formatDate("2019/01/01 08:01:01","yyyy年MM月dd日 hh时mm分ss秒")
* return "2019年01月01日 08时01分01秒"
* @return - 格式化后的日期
*/
formatDate: function (date, pattern) {
if (!date || !pattern) {
return;
}
pattern = pattern || 'yyyy-MM-dd';
return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
switch ($0.charAt(0)) {
case 'y': return padding(date.getFullYear(), $0.length);
case 'M': return padding(date.getMonth() + 1, $0.length);
case 'd': return padding(date.getDate(), $0.length);
case 'w': return date.getDay() + 1;
case 'h': return padding(date.getHours(), $0.length);
case 'm': return padding(date.getMinutes(), $0.length);
case 's': return padding(date.getSeconds(), $0.length);
}
});
},
/**
* @function formatFormData
* @summary 表单答案去除_form字段
* @param {Object} data - 表单实列
* @example
* utils.formatFormData({
* name_from:nameValue,
* phone_from: phoneValue
* })
* return {
* from:nameValue,
* from: phoneValue
* }
* * @return - 格式化后的结果
*/
formatFormData(data){
let keys = Object.keys(data),netData = {};
for(let i = 0;i < keys.length;i++){
let key = keys[i];
if(key.replace(/_form/gi,"")&&data[key]){
netData[key.replace(/_form/gi,"")] = data[key];
}
}
return netData;
},
/**
* @function validFormType
* @summary 验证表单类型Type是否在如下类型中
*
* input-text,
* input-checkbox,
* input-date,
* input-file,
* input-password,
* select-single,
* textarea-single,
* input-radio,
* input-number,
* static,
* input-text-mutil
* @param {Object} formData - 表单实列集
* @example
* utils.formatFormData([{
qid:"name",
name:"姓名",
type:"input-text",
rule:"notNull",
placeholder:"请输入姓名"
},{
qid:"phone",
name:"手机号码",
type:"input-test",
rule:"notNull",
placeholder:"请输入手机号码"
}])
return [{
qid:"name",
name:"姓名",
type:"input-text",
rule:"notNull",
placeholder:"请输入姓名"
}]
* @return - 验证后的表单实列集
*/
validFormType(formData){
const self = this,types = ["input-text","input-checkbox","input-date","input-file","input-password","select-single","textarea-single","input-radio","input-number","static","input-text-mutil"],newFormData = [];
for(let i =0;i < formData.length;i++){
let type = formData[i].type;
if(type && types.indexOf(type) != -1){
newFormData.push(formData[i])
}else{
console.info(formData[i])
}
}
return newFormData;
},
/**
* @function formatAnswer
* @summary 格式化表单答案数据
* @param {Array} allQuests - 表单实列集
* @param {allAnswers} allAnswers - 表单答案集
* @example
* utils.formatAnswer([{
qid:"name",
name:"姓名",
type:"input-text",
rule:"notNull",
placeholder:"请输入姓名"
}],[{
\name:nameValue,
}])
* return [{
* name:nameValue,
* }]
* * @return - 格式化后的结果
*/
formatAnswer(allQuests,allAnswers){
let getAnswerByQid = function(quests,qid){
for(let i = 0,flag = true;flag && i < quests.length; i++){
if(quests[i].qid == qid){
flag = false;
return quests[i]
}
}
}
let questAnswers = [],exportAnswers = [];
allAnswers.forEach((answers,index) => {
let parts = allQuests[index];
exportAnswers.push(answers);
if(parts&&answers&&!parts.isHide){
let quests = JSON.parse(parts.contentJson).parts[0].quest,keys = Object.keys(answers);
keys.forEach((qid,k) => {
if(qid != undefined) {
let quest = getAnswerByQid(quests, qid) || {}, currAnswer = answers[qid];
let p_qid = qid.split("_");
if(quest&&quest.isSplit&&currAnswer&&p_qid.length>1){
p_qid = p_qid.slice(0,p_qid.length-1).join("_");
if(exportAnswers[index][p_qid] instanceof Array){
if(currAnswer instanceof Array){
exportAnswers[index][p_qid] = (exportAnswers[index][p_qid].concat(currAnswer)).join(",")
}else{
exportAnswers[index][p_qid] = exportAnswers[index][p_qid].join(",") +","+ currAnswer
}
}else{
if(currAnswer instanceof Array){
exportAnswers[index][p_qid] = exportAnswers[index][p_qid] +","+currAnswer.join(",");
}else{
exportAnswers[index][p_qid] = exportAnswers[index][p_qid] +","+currAnswer;
}
}
}
}
})
}
})
for(let i = 0;i < allAnswers.length;i++){
let answers = allAnswers[i],parts = allQuests[i];
if(parts&&answers&&!parts.isHide){
let quests = JSON.parse(parts.contentJson).parts[0].quest,keys = Object.keys(answers),questAnswer = {};
questAnswer.answers = [];
questAnswer.id = parts.id;
questAnswer.computeCode = parts.computeCode;
questAnswer.export = {};
for(let j = 0;j < keys.length; j++){
let qid = keys[j];
if(qid != undefined){
let quest = getAnswerByQid(quests,qid)||{},answer = {},currAnswer = answers[qid];
quest.entityName = "name"+qid;
if(quest&&!quest.isSplit&&currAnswer){
questAnswer.export[quest.entityName] = exportAnswers[i][qid];
answer.qid = qid;
answer.name = quest.name;
answer.answer = currAnswer||"";
questAnswer.answers.push(answer);
}
}
}
questAnswers.push(questAnswer);
}
}
return questAnswers;
},
/**
* 设置定时器
* @param fn
* @param time
*/
timeOut(fn,time){
let timer = setTimeout(function(){
fn();
clearTimeout(timer);
},time||1000)
},
/**
* 数字转中文
* @param num
* @returns {*}
*/
NumberToChinese(num){
var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
var chnUnitSection = ["","万","亿","万亿","亿亿"];
var chnUnitChar = ["","十","百","千"];
function SectionToChinese(section){
var strIns = '', chnStr = '';
var unitPos = 0;
var zero = true;
while(section > 0){
var v = section % 10;
if(v === 0){
if(!zero){
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
}else{
zero = false;
strIns = chnNumChar[v];
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
unitPos++;
section = Math.floor(section / 10);
}
return chnStr;
}
var unitPos = 0;
var strIns = '', chnStr = '';
var needZero = false;
if(num === 0){
return chnNumChar[0];
}
while(num > 0){
var section = num % 10000;
if(needZero){
chnStr = chnNumChar[0] + chnStr;
}
strIns = SectionToChinese(section);
strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
chnStr = strIns + chnStr;
needZero = (section < 1000) && (section > 0);
num = Math.floor(num / 10000);
unitPos++;
}
return chnStr;
},
/**
* 是否是移动端
* @returns {RegExpMatchArray}
*/
isMobile() {
let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
return flag;
},
/**
* 通过数组获取英文
* @param number
*/
getEnByNumber(number){
return ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"][number];
},
/**
* 通过数组获取英文
* @param letter
*/
getNumberByEn(letter){
let number = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"].indexOf(letter);
return number != -1?number:letter;
},
/**
* 通过日期计算年龄
*/
getAgeByDate(t){
var e = (new Date).getFullYear(),
a = (new Date).getMonth() + 1,
s = (new Date).getDate() + 1,
n = new Date(t).getFullYear(),
r = new Date(t).getMonth() + 1,
i = new Date(t).getDate() + 1,
o = e - n,
l = a - r,
u = s - i;
return l < 0 && (o -= 1, l += 12), u < 0 && (0 == l && (o -= 1, l += 12), l -= 1, u += 30), {
age: (0 != o ? o + "岁" : "") + (0 != l ? l + "个月" : "") + (0 != u ? u + "天" : ""),
year: o,
month: l,
day: u
}
},
/**
* 通过日期计算年龄
*/
getYearByDate(date){
let currYear = new Date().getFullYear();
let currMonth = new Date().getMonth()+1;
let currDay = new Date().getDate()+1;
let myYear = new Date(date).getFullYear();
let myMonth = new Date(date).getMonth()+1;
let myDay = new Date(date).getDate()+1;
if(currYear - myYear >= 0){
return currYear - myYear;
}
},
/**
* 获取问卷缓存答案
*/
getStorageAnswer(name){
const self = this;
let answer = self.$storage.get(name);
return answer?new Date(answer.time).getTime() - new Date().getTime() > 1000*60*10?{}:answer.answer:{};
},
//回显缓存答案
setStorageAnswer(name){
const self = this;
let answer = self.$storage.get(name);
return new Promise((resolve,reject) => {
if(answer&& new Date().getTime() - new Date(answer.time).getTime() < 1000*60*100){
let questions = answer.answer;
for(let i = 0;i < questions.length;i++){
let answers = questions[i].answers,id = questions[i].id;
for(let k = 0;k < self.allQuest.length;k++){
if(self.allQuest[k].id == id){
for(let j = 0;j < answers.length;j++){
self.$refs["formInit"+k][0].forms[answers[j].qid + "_form"] = answers[j].answer;
}
self.allAnswer[k]= self.$util.formatFormData(self.$refs["formInit"+k][0].forms);
}
}
}
resolve(true)
}else{
resolve(false)
}
});
}
}
export default utils;