瀏覽代碼

代码生成器-Form升级为FormModel,后续表单一律使用FormModel表单

ZhangWenQiang 4 年之前
父節點
當前提交
7e36d720bf

+ 13 - 0
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/common/init/initValue.ftl

@@ -0,0 +1,13 @@
+<#list columns as po>
+    <#if po.isShow == 'Y'>
+        <#if po.fieldName != 'id'>
+            <#if po.defaultVal??>
+                <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int">
+            ${po.fieldName}:${po.defaultVal},
+                <#else>
+            ${po.fieldName}:"${po.defaultVal}",
+                </#if>
+            </#if>
+        </#if>
+    </#if>
+</#list>

+ 13 - 0
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/common/init/initValueSub.ftl

@@ -0,0 +1,13 @@
+<#list sub.colums as po>
+    <#if po.isShow == 'Y'>
+        <#if po.fieldName != 'id'>
+            <#if po.defaultVal??>
+                <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int">
+            ${po.fieldName}:${po.defaultVal},
+                <#else>
+            ${po.fieldName}:"${po.defaultVal}",
+                </#if>
+            </#if>
+        </#if>
+    </#if>
+</#list>

+ 27 - 0
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl

@@ -16,6 +16,15 @@
   </#if>
 </#function>
 <#---->
+<#--下划线转驼峰-->
+<#function dashedToCamel(str)>
+    <#assign text=""/>
+    <#assign strlist = str?split("_")/>
+    <#list strlist as v>
+        <#assign text=text+v?cap_first/>
+    </#list>
+    <#return text?uncap_first>
+</#function>
 <#-- 驼峰转下划线 -->
 <#function camelToDashed(str, case='normal')>
   <#return camelToChar(str, "_", case)>
@@ -70,4 +79,22 @@
   <#else>
     <#return "">
   </#if>
+</#function>
+
+<#-- ** 如果Blob就显示 String * -->
+<#function autoStringSuffix po>
+    <#if  po.fieldDbType=='Blob'>
+        <#return "'${po.fieldName}String'">
+    <#else>
+        <#return "'${po.fieldName}'">
+    </#if>
+</#function>
+
+<#-- ** 如果Blob就显示model方式 String * -->
+<#function autoStringSuffixForModel po>
+    <#if  po.fieldDbType=='Blob'>
+        <#return "${po.fieldName}String">
+    <#else>
+        <#return "${po.fieldName}">
+    </#if>
 </#function>

+ 47 - 49
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl

@@ -1,54 +1,52 @@
 <#include "../utils.ftl">
 <#if po.isShow == 'Y' && poHasCheck(po)>
   <#if po.fieldName != 'id'>
-          ${po.fieldName}: {
-            rules: [
-    <#assign fieldValidType = po.fieldValidType!''>
-    <#-- 非空校验 -->
-    <#if po.nullable == 'N' || fieldValidType == '*'>
-              { required: true, message: '请输入${po.filedComment}!'},
-    </#if>
-    <#-- 唯一校验 -->
-    <#if fieldValidType == 'only'>
-              { validator: (rule, value, callback) => validateDuplicateValue('${tableName}', '${po.fieldDbName}', value, this.model.id, callback)},
-    <#-- 6到16位数字 -->
-    <#elseif fieldValidType == 'n6-16'>
-              { pattern: /\d{6,18}/, message: '请输入6到16位数字!'},
-    <#-- 6到16位任意字符 -->
-    <#elseif fieldValidType == '*6-16'>
-              { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
-    <#-- 6到18位字符串 -->
-    <#elseif fieldValidType == 's6-18'>
-              { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
-    <#-- 网址 -->
-    <#elseif fieldValidType == 'url'>
-              { pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/, message: '请输入正确的网址!'},
-    <#-- 电子邮件 -->
-    <#elseif fieldValidType == 'e'>
-              { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},
-    <#-- 手机号码 -->
-    <#elseif fieldValidType == 'm'>
-              { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
-    <#-- 邮政编码 -->
-    <#elseif fieldValidType == 'p'>
-              { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},
-    <#-- 字母 -->
-    <#elseif fieldValidType == 's'>
-              { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},
-    <#-- 数字 -->
-    <#elseif fieldValidType == 'n'>
-              { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},
-    <#-- 整数 -->
-    <#elseif fieldValidType == 'z'>
-              { pattern: /^-?\d+$/, message: '请输入整数!'},
-    <#-- 金额 -->
-    <#elseif fieldValidType == 'money'>
-              { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},
-    <#-- 无校验 -->
-    <#else>
-      <#t>
-    </#if>
-            ]
-          },
+          ${po.fieldName}: [
+        <#assign fieldValidType = po.fieldValidType!''>
+        <#-- 非空校验 -->
+        <#if po.nullable == 'N' || fieldValidType == '*'>
+                  { required: true, message: '请输入${po.filedComment}!'},
+        </#if>
+        <#-- 唯一校验 -->
+        <#if fieldValidType == 'only'>
+                  { validator: (rule, value, callback) => validateDuplicateValue('${tableName}', '${po.fieldDbName}', value, this.model.id, callback)},
+        <#-- 6到16位数字 -->
+        <#elseif fieldValidType == 'n6-16'>
+                  { pattern: /\d{6,18}/, message: '请输入6到16位数字!'},
+        <#-- 6到16位任意字符 -->
+        <#elseif fieldValidType == '*6-16'>
+                  { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
+        <#-- 6到18位字符串 -->
+        <#elseif fieldValidType == 's6-18'>
+                  { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+        <#-- 网址 -->
+        <#elseif fieldValidType == 'url'>
+                  { pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/, message: '请输入正确的网址!'},
+        <#-- 电子邮件 -->
+        <#elseif fieldValidType == 'e'>
+                  { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},
+        <#-- 手机号码 -->
+        <#elseif fieldValidType == 'm'>
+                  { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
+        <#-- 邮政编码 -->
+        <#elseif fieldValidType == 'p'>
+                  { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},
+        <#-- 字母 -->
+        <#elseif fieldValidType == 's'>
+                  { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},
+        <#-- 数字 -->
+        <#elseif fieldValidType == 'n'>
+                  { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},
+        <#-- 整数 -->
+        <#elseif fieldValidType == 'z'>
+                  { pattern: /^-?\d+$/, message: '请输入整数!'},
+        <#-- 金额 -->
+        <#elseif fieldValidType == 'money'>
+                  { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},
+        <#-- 无校验 -->
+        <#else>
+          <#t>
+        </#if>
+            ],
   </#if>
 </#if>

+ 86 - 75
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei

@@ -11,7 +11,7 @@
     @cancel="handleCancel"
     cancelText="关闭">
     <a-spin :spinning="confirmLoading">
-      <a-form :form="form">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
 <#assign form_date = false>
 <#assign form_select = false>
 <#assign form_select_multi = false>
@@ -35,83 +35,95 @@
 	<#elseif po.dictField?default("")?trim?length gt 1>
 		<#assign form_field_dictCode="${po.dictField}">
 	</#if>
-        <a-form-item label="${po.filedComment}" :labelCol="labelCol" :wrapperCol="wrapperCol">
+        <a-form-model-item label="${po.filedComment}" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="${autoStringSuffixForModel(po)}">
 	<#if po.classType =='date'>
-		<#assign form_date=true>
-          <j-date placeholder="请选择${po.filedComment}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" style="width: 100%"/>
-	<#elseif po.classType =='datetime'>
-		<#assign form_date=true>
-          <j-date placeholder="请选择${po.filedComment}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"/>
-	<#elseif po.classType =='popup'>
-		<#assign form_popup=true>
-          <j-popup
-            v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"
-            :trigger-change="true"
-            org-fields="${po.dictField}"
-            dest-fields="${Format.underlineToHump(po.dictText)}"
-            code="${po.dictTable}"
-            @callback="popupCallback"/>
-    <#elseif po.classType =='sel_depart'>
-		<#assign form_sel_depart=true>
-          <j-select-depart v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" multi/>
-	<#elseif po.classType =='pca'>
-		<#assign form_pca=true>
-		  <j-area-linkage type="cascader" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入省市区"/>
-    <#elseif po.classType =='password'>
-	      <a-input-password v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}"/>
-	<#elseif po.classType =='sel_user'>
-		<#assign form_sel_user = true>
-          <j-select-user-by-dep v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"/>
-	<#elseif po.classType =='textarea'>
-          <a-textarea v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" rows="4" placeholder="请输入${po.filedComment}"/>
-	<#elseif po.classType=='list' || po.classType=='radio'>
-		<#assign form_select = true>
-          <j-dict-select-tag type="${po.classType}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}"/>
-	<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
-		<#assign form_select_multi = true>
-          <j-multi-select-tag type="${po.classType}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}"/>
-	<#elseif po.classType=='sel_search'>
-    	<#assign form_select_search = true>
-          <j-search-select-tag v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" dict="${form_field_dictCode}" />
-    <#elseif po.classType=='cat_tree'>
-    	<#assign form_cat_tree = true>
-          <j-category-select v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" pcode="${po.dictField?default("")}" placeholder="请选择${po.filedComment}" <#if po.dictText?default("")?trim?length gt 1>back="${po.dictText}" @change="handleCategoryChange"</#if>/>
-    	<#if po.dictText?default("")?trim?length gt 1>
-    	<#assign form_cat_back = "${po.dictText}">
-    	</#if>
-	<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
-          <a-input-number v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}" style="width: 100%"/>
-	<#elseif po.classType=='file'>
-		<#assign form_file = true>
-          <j-upload v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true"></j-upload>
-	<#elseif po.classType=='image'>
-	    <#assign form_image = true>
-          <j-image-upload isMultiple v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"></j-image-upload>
-	<#elseif po.classType=='umeditor'>
-        <#assign form_editor = true>
-          <j-editor v-decorator="['${po.fieldName}',{trigger:'input'}]"/>
-    <#elseif po.fieldDbType=='Blob'>
-          <a-input v-decorator="['${po.fieldName}String'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}"></a-input>
-	<#else>
-          <a-input v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}"></a-input>
-    </#if>
-        </a-form-item>
+                  <j-date placeholder="请选择${po.filedComment}" v-model="model.${po.fieldName}"  style="width: 100%" />
+    	<#elseif po.classType =='datetime'>
+                  <j-date placeholder="请选择${po.filedComment}"  v-model="model.${po.fieldName}" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
+    	<#elseif po.classType =='time'>
+                  <j-time placeholder="请选择${po.filedComment}"  v-model="model.${po.fieldName}" style="width: 100%" />
+    	<#elseif po.classType =='popup'>
+    	    <#assign form_popup=true>
+                  <j-popup
+                    v-model="model.${po.fieldName}"
+                    field="${po.fieldName}"
+                    org-fields="${po.dictField}"
+                    dest-fields="${Format.underlineToHump(po.dictText)}"
+                    code="${po.dictTable}"
+                    :multi="${po.extendParams.popupMulti?c}"
+                    @input="popupCallback"/>
+        <#elseif po.classType =='sel_depart'>
+                  <j-select-depart v-model="model.${po.fieldName}" multi />
+    <#elseif po.classType =='switch'>
+                  <j-switch v-model="model.${po.fieldName}" <#if po.dictField != 'is_open'>:options="${po.dictField}"</#if> ></j-switch>
+    	<#elseif po.classType =='pca'>
+                 <j-area-linkage type="cascader" v-model="model.${po.fieldName}" placeholder="请输入省市区" />
+    	<#elseif po.classType =='markdown'>
+                  <j-markdown-editor v-model="model.${autoStringSuffixForModel(po)}" id="${po.fieldName}"></j-markdown-editor>
+        <#elseif po.classType =='password'>
+                  <a-input-password v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" />
+    	<#elseif po.classType =='sel_user'>
+                  <j-select-user-by-dep v-model="model.${po.fieldName}" />
+    	<#elseif po.classType =='textarea'>
+                  <a-textarea v-model="model.${autoStringSuffixForModel(po)}" rows="4" placeholder="请输入${po.filedComment}" />
+    	<#elseif po.classType=='list' || po.classType=='radio'>
+                  <j-dict-select-tag type="${po.classType}" v-model="model.${po.fieldName}" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}" />
+    	<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
+                  <j-multi-select-tag type="${po.classType}" v-model="model.${po.fieldName}" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}" />
+    	<#elseif po.classType=='sel_search'>
+                  <j-search-select-tag v-model="model.${po.fieldName}" dict="${form_field_dictCode}" />
+        <#elseif po.classType=='cat_tree'>
+        	<#assign form_cat_tree = true>
+                  <j-category-select v-model="model.${po.fieldName}" pcode="${po.dictField?default("")}" placeholder="请选择${po.filedComment}" <#if po.dictText?default("")?trim?length gt 1>back="${dashedToCamel(po.dictText)}" @change="handleCategoryChange"</#if> />
+        	<#if po.dictText?default("")?trim?length gt 1>
+        	<#assign form_cat_back = "${po.dictText}">
+        	</#if>
+    	<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+                  <a-input-number v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" style="width: 100%" />
+    	<#elseif po.classType=='file'>
+                  <j-upload v-model="model.${po.fieldName}"  <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>
+    	<#elseif po.classType=='image'>
+                  <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model="model.${po.fieldName}" ></j-image-upload>
+    	<#elseif po.classType=='umeditor'>
+                  <j-editor v-model="model.${autoStringSuffixForModel(po)}" />
+        <#elseif po.fieldDbType=='Blob'>
+                  <a-input v-model="model.${autoStringSuffixForModel(po)}" placeholder="请输入${po.filedComment}" ></a-input>
+    		<#elseif po.classType == 'sel_tree'>
+      	          <j-tree-select
+                    ref="treeSelect"
+                    placeholder="请选择${po.filedComment}"
+                    v-model="model.${po.fieldName}"
+                    <#if po.dictText??>
+                    <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+                    dict="${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}"
+                    <#elseif po.dictText?split(',')[1]??>
+                    pidField="${po.dictText?split(',')[1]}"
+                    <#elseif po.dictText?split(',')[3]??>
+                    hasChildField="${po.dictText?split(',')[3]}"
+                    </#if>
+                    </#if>
+                    pidValue="${po.dictField}">
+                  </j-tree-select>
+    	<#else>
+                  <a-input v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" ></a-input>
+        </#if>
+        </a-form-model-item>
 </#if>
 </#list>
         <#if form_cat_tree && form_cat_back?length gt 1>
-        <a-form-item v-show="false">
+        <a-form-model-item v-show="false">
           <a-input v-decorator="['${form_cat_back}']"></a-input>
-        </a-form-item>
+        </a-form-model-item>
         </#if>
 
-      </a-form>
+      </a-form-model>
     </a-spin>
   </j-modal>
 </template>
 
 <script>
 
-  import { httpAction } from '@/api/manage'
+  import { httpAction, getAction } from '@/api/manage'
   import pick from 'lodash.pick'
   import { validateDuplicateValue } from '@/utils/util'
   <#if form_date>
@@ -188,11 +200,12 @@
     },
     data () {
       return {
-        form: this.$form.createForm(this),
         title:"操作",
         width:800,
         visible: false,
-        model: {},
+        model: {
+          <#include "/common/init/initValue.ftl">
+        },
         labelCol: {
           xs: { span: 24 },
           sm: { span: 5 },
@@ -216,12 +229,8 @@
         this.edit({});
       },
       edit (record) {
-        this.form.resetFields();
         this.model = Object.assign({}, record);
         this.visible = true;
-        this.$nextTick(() => {
-          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id'><#if po.fieldDbType=='Blob'>,'${po.fieldName}String'<#else>,'${po.fieldName}'</#if></#if></#list>))
-        })
       },
       close () {
         this.$emit('close');
@@ -230,8 +239,8 @@
       handleOk () {
         const that = this;
         // 触发表单验证
-        this.form.validateFields((err, values) => {
-          if (!err) {
+        this.$refs.form.validate(valid => {
+          if (valid) {
             that.confirmLoading = true;
             let httpurl = '';
             let method = '';
@@ -255,6 +264,8 @@
               that.confirmLoading = false;
               that.close();
             })
+          } else {
+            return false;
           }
          
         })
@@ -263,11 +274,11 @@
         this.close()
       },
       popupCallback(row){
-        this.form.setFieldsValue(pick(row<#list columns as po><#if po.fieldName !='id'><#if po.fieldDbType=='Blob'>,'${po.fieldName}String'<#else>,'${po.fieldName}'</#if></#if></#list>))
+        this.model = Object.assign(this.model, row);
       },
       <#if form_cat_tree>
       handleCategoryChange(value,backObj){
-        this.form.setFieldsValue(backObj)
+        this.model = Object.assign(this.model, backObj);
       }
       </#if>
 

+ 97 - 54
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style#Drawer.vuei

@@ -9,7 +9,7 @@
     :visible="visible">
   
     <a-spin :spinning="confirmLoading">
-      <a-form :form="form">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
 <#assign form_date = false>
 <#assign form_select = false>
 <#assign form_select_multi = false>
@@ -27,55 +27,88 @@
 	<#elseif po.dictField?default("")?trim?length gt 1>
 		<#assign form_field_dictCode="${po.dictField}">
 	</#if>
-        <a-form-item label="${po.filedComment}" :labelCol="labelCol" :wrapperCol="wrapperCol">
+        <a-form-model-item label="${po.filedComment}" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="${autoStringSuffixForModel(po)}">
 	<#if po.classType =='date'>
-		<#assign form_date=true>
-          <j-date placeholder="请选择${po.filedComment}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" style="width: 100%"/>
-	<#elseif po.classType =='datetime'>
-		<#assign form_date=true>
-          <j-date placeholder="请选择${po.filedComment}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"/>
-	<#elseif po.classType =='popup'>
-		<#assign form_popup=true>
-          <j-popup
-            v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"
-            :trigger-change="true"
-            org-fields="${po.dictField?default("")}"
-            dest-fields="${Format.underlineToHump(po.dictText)}"
-            code="${po.dictTable}"
-            @callback="popupCallback"/>
-	<#elseif po.classType =='sel_depart'>
-		<#assign form_sel_depart=true>
-          <j-select-depart v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"/>
-	<#elseif po.classType =='sel_user'>
-		<#assign form_sel_user = true>
-          <j-select-user-by-dep v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"/>
-	<#elseif po.classType =='textarea'>
-          <a-textarea v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" rows="4" placeholder="请输入${po.filedComment}"/>
-	<#elseif po.classType=='list' || po.classType=='radio'>
-		<#assign form_select = true>
-          <j-dict-select-tag type="${po.classType}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}"/>
-	<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
-		<#assign form_select_multi = true>
-          <j-multi-select-tag type="${po.classType}" v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}"/>
-	<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
-          <a-input-number v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}" style="width: 100%"/>
-	<#elseif po.classType=='file'>
-		<#assign form_file = true>
-          <j-upload v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" :trigger-change="true"></j-upload>
-    <#elseif po.classType=='image'>
-        <#assign form_image = true>
-          <j-image-upload isMultiple v-decorator="['${po.fieldName}'${autoWriteRules(po)}]"></j-image-upload>
-	<#else>
-          <a-input v-decorator="['${po.fieldName}'${autoWriteRules(po)}]" placeholder="请输入${po.filedComment}"></a-input>
-    </#if>
-        </a-form-item>
+                  <j-date placeholder="请选择${po.filedComment}" v-model="model.${po.fieldName}"  style="width: 100%" />
+    	<#elseif po.classType =='datetime'>
+                  <j-date placeholder="请选择${po.filedComment}"  v-model="model.${po.fieldName}" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
+    	<#elseif po.classType =='time'>
+                  <j-time placeholder="请选择${po.filedComment}"  v-model="model.${po.fieldName}" style="width: 100%" />
+    	<#elseif po.classType =='popup'>
+    	    <#assign form_popup=true>
+                  <j-popup
+                    v-model="model.${po.fieldName}"
+                    field="${po.fieldName}"
+                    org-fields="${po.dictField}"
+                    dest-fields="${Format.underlineToHump(po.dictText)}"
+                    code="${po.dictTable}"
+                    :multi="${po.extendParams.popupMulti?c}"
+                    @input="popupCallback"/>
+        <#elseif po.classType =='sel_depart'>
+                  <j-select-depart v-model="model.${po.fieldName}" multi />
+    <#elseif po.classType =='switch'>
+                  <j-switch v-model="model.${po.fieldName}" <#if po.dictField != 'is_open'>:options="${po.dictField}"</#if> ></j-switch>
+    	<#elseif po.classType =='pca'>
+                 <j-area-linkage type="cascader" v-model="model.${po.fieldName}" placeholder="请输入省市区" />
+    	<#elseif po.classType =='markdown'>
+                  <j-markdown-editor v-model="model.${autoStringSuffixForModel(po)}" id="${po.fieldName}"></j-markdown-editor>
+        <#elseif po.classType =='password'>
+                  <a-input-password v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" />
+    	<#elseif po.classType =='sel_user'>
+                  <j-select-user-by-dep v-model="model.${po.fieldName}" />
+    	<#elseif po.classType =='textarea'>
+                  <a-textarea v-model="model.${autoStringSuffixForModel(po)}" rows="4" placeholder="请输入${po.filedComment}" />
+    	<#elseif po.classType=='list' || po.classType=='radio'>
+                  <j-dict-select-tag type="${po.classType}" v-model="model.${po.fieldName}" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}" />
+    	<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
+                  <j-multi-select-tag type="${po.classType}" v-model="model.${po.fieldName}" dictCode="${form_field_dictCode}" placeholder="请选择${po.filedComment}" />
+    	<#elseif po.classType=='sel_search'>
+                  <j-search-select-tag v-model="model.${po.fieldName}" dict="${form_field_dictCode}" />
+        <#elseif po.classType=='cat_tree'>
+        	<#assign form_cat_tree = true>
+                  <j-category-select v-model="model.${po.fieldName}" pcode="${po.dictField?default("")}" placeholder="请选择${po.filedComment}" <#if po.dictText?default("")?trim?length gt 1>back="${dashedToCamel(po.dictText)}" @change="handleCategoryChange"</#if> />
+        	<#if po.dictText?default("")?trim?length gt 1>
+        	<#assign form_cat_back = "${po.dictText}">
+        	</#if>
+    	<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+                  <a-input-number v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" style="width: 100%" />
+    	<#elseif po.classType=='file'>
+                  <j-upload v-model="model.${po.fieldName}" <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>
+    	<#elseif po.classType=='image'>
+                  <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model="model.${po.fieldName}" ></j-image-upload>
+    	<#elseif po.classType=='umeditor'>
+                  <j-editor v-model="model.${autoStringSuffixForModel(po)}" />
+        <#elseif po.fieldDbType=='Blob'>
+                  <a-input v-model="model.${autoStringSuffixForModel(po)}" placeholder="请输入${po.filedComment}" ></a-input>
+    		<#elseif po.classType == 'sel_tree'>
+      	          <j-tree-select
+                    ref="treeSelect"
+                    placeholder="请选择${po.filedComment}"
+                    v-model="model.${po.fieldName}"
+                    <#if po.dictText??>
+                    <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+                    dict="${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}"
+                    <#elseif po.dictText?split(',')[1]??>
+                    pidField="${po.dictText?split(',')[1]}"
+                    <#elseif po.dictText?split(',')[3]??>
+                    hasChildField="${po.dictText?split(',')[3]}"
+                    </#if>
+                    </#if>
+                    pidValue="${po.dictField}">
+                  </j-tree-select>
+    	<#else>
+                  <a-input v-model="model.${po.fieldName}" placeholder="请输入${po.filedComment}" ></a-input>
+        </#if>
+        </a-form-model-item>
 </#if>
 </#list>    
         
-      </a-form>
+      </a-form-model>
     </a-spin>
-    <a-button type="primary" @click="handleOk">确定</a-button>
-    <a-button type="primary" @click="handleCancel">取消</a-button>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button type="primary" @click="handleOk" style="margin-bottom: 0;">确定</a-button>
+    </div>
   </a-drawer>
 </template>
 
@@ -133,11 +166,12 @@
     },
     data () {
       return {
-        form: this.$form.createForm(this),
         title:"操作",
         width:800,
         visible: false,
-        model: {},
+        model: {
+          <#include "/common/init/initValue.ftl">
+        },
         labelCol: {
           xs: { span: 24 },
           sm: { span: 5 },
@@ -161,12 +195,8 @@
         this.edit({});
       },
       edit (record) {
-        this.form.resetFields();
         this.model = Object.assign({}, record);
         this.visible = true;
-        this.$nextTick(() => {
-          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id'>,'${po.fieldName}'</#if></#list>))
-        })
       },
       close () {
         this.$emit('close');
@@ -175,8 +205,8 @@
       handleOk () {
         const that = this;
         // 触发表单验证
-        this.form.validateFields((err, values) => {
-          if (!err) {
+        this.$refs.form.validate(valid => {
+          if (valid) {
             that.confirmLoading = true;
             let httpurl = '';
             let method = '';
@@ -200,6 +230,8 @@
               that.confirmLoading = false;
               that.close();
             })
+          }else {
+             return false;
           }
          
         })
@@ -208,7 +240,7 @@
         this.close()
       },
       popupCallback(row){
-        this.form.setFieldsValue(pick(row<#list columns as po><#if po.fieldName !='id'>,'${po.fieldName}'</#if></#list>))
+        this.model = Object.assign(this.model, row);
       }
       
     }
@@ -222,4 +254,15 @@
     margin-bottom: 30px;
     float: right;
   }
+  .drawer-footer{
+      position: absolute;
+      bottom: -8px;
+      width: 100%;
+      border-top: 1px solid #e8e8e8;
+      padding: 10px 16px;
+      text-align: right;
+      left: 0;
+      background: #fff;
+      border-radius: 0 0 2px 2px;
+    }
 </style>

+ 18 - 44
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei

@@ -10,35 +10,31 @@
     cancelText="关闭">
     
     <a-spin :spinning="confirmLoading">
-      <a-form :form="form">
-      
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+
 <#list columns as po><#rt/>
 <#if po.fieldName !='id'><#rt/>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="${po.filedComment}">
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="${po.fieldName}" label="${po.filedComment}">
           <#if po.fieldType =='date'>
-          <a-date-picker v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-date-picker v-model="model.${po.fieldName}"/>
           <#elseif po.fieldType =='datetime'>
-          <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-date-picker showTime valueFormat='YYYY-MM-DD HH:mm:ss' v-model="model.${po.fieldName}" />
           <#elseif "int,decimal,double,"?contains(po.fieldType)>
-          <a-input-number v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-input-number v-model="model.${po.fieldName}"/>
           <#else>
-          <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-input placeholder="请输入${po.filedComment}" v-model="model.${po.fieldName}" />
           </#if>
-        </a-form-item>
+        </a-form-model-item>
 </#if>
 </#list>
-		
-      </a-form>
+
+      </a-form-model>
     </a-spin>
   </j-modal>
 </template>
 
 <script>
   import { httpAction } from '@/api/manage'
-  import pick from 'lodash.pick'
   import moment from "moment"
 
   export default {
@@ -58,12 +54,11 @@
         },
 
         confirmLoading: false,
-        form: this.$form.createForm(this),
         validatorRules:{
         <#list columns as po>
         <#if po.fieldName !='id'>
         <#if po.nullable =='N'>
-        ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]},
+        ${po.fieldName}:[{ required: true, message: '请输入${po.filedComment}!' }],
         </#if>
         </#if>
 	    </#list>
@@ -78,32 +73,23 @@
     },
     methods: {
       add () {
+        //初始化默认值
         this.edit({});
       },
       edit (record) {
-        this.form.resetFields();
         this.model = Object.assign({}, record);
         this.visible = true;
-        this.$nextTick(() => {
-          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of("date")==-1>,'${po.fieldName}'</#if></#list>))
-		  //时间格式化
-          <#list columns as po>
-          <#if po.fieldName !='id' && po.fieldType?index_of("date")!=-1>
-          this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null})
-          </#if>
-          </#list>
-        });
-
       },
       close () {
         this.$emit('close');
         this.visible = false;
+        this.$refs.form.clearValidate();
       },
       handleOk () {
         const that = this;
         // 触发表单验证
-        this.form.validateFields((err, values) => {
-          if (!err) {
+         this.$refs.form.validate(valid => {
+          if (valid) {
             that.confirmLoading = true;
             let httpurl = '';
             let method = '';
@@ -114,18 +100,7 @@
               httpurl+=this.url.edit;
                method = 'put';
             }
-            let formData = Object.assign(this.model, values);
-            //时间格式化
-            <#list columns as po>
-            <#if po.fieldName !='id' && po.fieldType =='date'>
-            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;
-            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>
-            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;
-            </#if>
-            </#list>
-            
-            console.log(formData)
-            httpAction(httpurl,formData,method).then((res)=>{
+            httpAction(httpurl,this.model,method).then((res)=>{
               if(res.success){
                 that.$message.success(res.message);
                 that.$emit('ok');
@@ -136,9 +111,8 @@
               that.confirmLoading = false;
               that.close();
             })
-
-
-
+          }else{
+             return false;
           }
         })
       },

+ 38 - 50
happy-cloud-system/happy-cloud-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style#Drawer.vuei

@@ -5,41 +5,39 @@
       placement="right"
       :closable="false"
       @close="close"
-      :visible="visible"
-  >
+      :visible="visible">
 
     <a-spin :spinning="confirmLoading">
-      <a-form :form="form">
-      
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+
 <#list columns as po><#rt/>
 <#if po.fieldName !='id'><#rt/>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="${po.filedComment}">
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="${po.fieldName}" label="${po.filedComment}">
           <#if po.fieldType =='date'>
-          <a-date-picker v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-date-picker v-model="model.${po.fieldName}" />
           <#elseif po.fieldType =='datetime'>
-          <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-date-picker showTime valueFormat='YYYY-MM-DD HH:mm:ss' v-model="model.${po.fieldName}" />
           <#elseif "int,decimal,double,"?contains(po.fieldType)>
-          <a-input-number v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-input-number v-model="model.${po.fieldName}" />
           <#else>
-          <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" />
+          <a-input placeholder="请输入${po.filedComment}" v-model="model.${po.fieldName}" />
           </#if>
-        </a-form-item>
+        </a-form-model-item>
 </#if>
 </#list>
-		
-      </a-form>
+
+      </a-form-model>
     </a-spin>
-    <a-button type="primary" @click="handleOk">确定</a-button>
-    <a-button type="primary" @click="handleCancel">取消</a-button>
+
+    <div class="drawer-bootom-button">
+      <a-button type="primary" @click="handleOk">确定</a-button>
+      <a-button type="primary" @click="handleCancel">取消</a-button>
+    </div>
   </a-drawer>
 </template>
 
 <script>
   import { httpAction } from '@/api/manage'
-  import pick from 'lodash.pick'
   import moment from "moment"
 
   export default {
@@ -59,12 +57,11 @@
         },
 
         confirmLoading: false,
-        form: this.$form.createForm(this),
         validatorRules:{
         <#list columns as po>
         <#if po.fieldName !='id'>
         <#if po.nullable =='N'>
-        ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]},
+        ${po.fieldName}:[{ required: true, message: '请输入${po.filedComment}!' }],
         </#if>
         </#if>
 	    </#list>
@@ -79,32 +76,23 @@
     },
     methods: {
       add () {
+        //初始化默认值
         this.edit({});
       },
       edit (record) {
-        this.form.resetFields();
         this.model = Object.assign({}, record);
         this.visible = true;
-        this.$nextTick(() => {
-          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of("date")==-1>,'${po.fieldName}'</#if></#list>))
-		  //时间格式化
-          <#list columns as po>
-          <#if po.fieldName !='id' && po.fieldType?index_of("date")!=-1>
-          this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null})
-          </#if>
-          </#list>
-        });
-
       },
       close () {
         this.$emit('close');
         this.visible = false;
+        this.$refs.form.clearValidate();
       },
       handleOk () {
         const that = this;
         // 触发表单验证
-        this.form.validateFields((err, values) => {
-          if (!err) {
+        this.$refs.form.validate(valid => {
+          if (valid) {
             that.confirmLoading = true;
             let httpurl = '';
             let method = '';
@@ -115,18 +103,7 @@
               httpurl+=this.url.edit;
                method = 'put';
             }
-            let formData = Object.assign(this.model, values);
-            //时间格式化
-            <#list columns as po>
-            <#if po.fieldName !='id' && po.fieldType =='date'>
-            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;
-            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>
-            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;
-            </#if>
-            </#list>
-            
-            console.log(formData)
-            httpAction(httpurl,formData,method).then((res)=>{
+            httpAction(httpurl,this.model,method).then((res)=>{
               if(res.success){
                 that.$message.success(res.message);
                 that.$emit('ok');
@@ -137,10 +114,9 @@
               that.confirmLoading = false;
               that.close();
             })
-
-
-
-          }
+          }else{
+            return false;
+         }
         })
       },
       handleCancel () {
@@ -153,10 +129,22 @@
 </script>
 
 <style lang="less" scoped>
-/** Button按钮间距 */
+  /**Button按钮间距*/
   .ant-btn {
     margin-left: 30px;
     margin-bottom: 30px;
     float: right;
   }
+ /**抽屉按钮样式*/
+  .drawer-bootom-button {
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
 </style>