EditViewTemplate.ftl 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <div class="edit-view">
  3. <page-title>
  4. <el-button @click="$router.go(-1)">取消</el-button>
  5. <el-button @click="onDelete" :loading="$store.state.fetchingData" type="danger" v-if="formData.id">
  6. 删除
  7. </el-button>
  8. <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
  9. </page-title>
  10. <div class="edit-view__content-wrapper">
  11. <div class="edit-view__content-section">
  12. <el-form :model="formData" :rules="rules" ref="form" label-width="${labelWidth}" label-position="right"
  13. size="small"
  14. style="max-width: 500px;">
  15. <#list model.fields as field>
  16. <el-form-item prop="${field.modelName}" label="${field.remark}">
  17. <#if field.showInForm>
  18. <#if field.formType == 'singleLineText'>
  19. <el-input v-model="formData.${field.modelName}"></el-input>
  20. <#elseif field.formType == 'textarea'>
  21. <el-input type="textarea" v-model="formData.${field.modelName}"></el-input>
  22. <#elseif field.formType == 'number'>
  23. <el-input-number type="number" v-model="formData.${field.modelName}"></el-input-number>
  24. <#elseif field.formType == 'date'>
  25. <el-date-picker
  26. v-model="formData.${field.modelName}"
  27. type="date"
  28. value-format="yyyy-MM-dd"
  29. placeholder="选择日期">
  30. </el-date-picker>
  31. <#elseif field.formType == 'datetime'>
  32. <el-date-picker
  33. v-model="formData.${field.modelName}"
  34. type="datetime"
  35. value-format="yyyy-MM-dd HH:mm:ss"
  36. placeholder="选择日期时间">
  37. </el-date-picker>
  38. <#elseif field.formType == 'select'>
  39. <el-select v-model="formData.${field.modelName}" clearable filterable placeholder="请选择">
  40. <el-option
  41. v-for="item in ${field.modelName}Options"
  42. :key="item.value"
  43. :label="item.label"
  44. :value="item.value">
  45. </el-option>
  46. </el-select>
  47. <#elseif field.formType == 'multiSelect'>
  48. <template>
  49. <el-select v-model="formData.${field.modelName}" multiple clearable filterable
  50. placeholder="请选择">
  51. <el-option
  52. v-for="item in ${field.modelName}Options"
  53. :key="item.value"
  54. :label="item.label"
  55. :value="item.value">
  56. </el-option>
  57. </el-select>
  58. </template>
  59. <#elseif field.formType == 'singleImage'>
  60. <single-upload v-model="formData.${field.modelName}"></single-upload>
  61. <#elseif field.formType == 'multiImage'>
  62. <multi-upload v-model="formData.${field.modelName}"></multi-upload>
  63. <#elseif field.formType == 'fileUpload'>
  64. <el-upload
  65. class="upload-demo"
  66. action="../upload/file"
  67. :on-change="handleChange"
  68. :file-list="fileList3">
  69. <el-button size="small" type="primary">
  70. 点击上传
  71. </el-button>
  72. </el-upload>
  73. <#elseif field.formType == 'tree'>
  74. <el-tree
  75. :props="props"
  76. :load="loadNode"
  77. lazy
  78. show-checkbox
  79. @check-change="handleCheckChange">
  80. </el-tree>
  81. <#elseif field.formType == 'switch'>
  82. <el-switch v-model="formData.${field.modelName}"></el-switch>
  83. <#elseif field.formType == 'richText'>
  84. <rich-text v-model="formData.${field.modelName}"></rich-text>
  85. <#elseif field.formType == 'loginName'>
  86. <el-input v-model="formData.${field.modelName}" disabled></el-input>
  87. <#elseif field.formType == 'currentTime'>
  88. <el-input v-model="formData.${field.modelName}" disabled></el-input>
  89. <#elseif field.formType == 'currentDate'>
  90. <el-input v-model="formData.${field.modelName}" disabled></el-input>
  91. <#else>
  92. <el-input v-model="formData.${field.modelName}"></el-input>
  93. </#if>
  94. </#if>
  95. </el-form-item>
  96. </#list>
  97. <el-form-item class="form-submit">
  98. <el-button @click="onSave" :loading="saving" type="primary">
  99. 保存
  100. </el-button>
  101. <el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id">
  102. 删除
  103. </el-button>
  104. <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
  105. </el-form-item>
  106. </el-form>
  107. </div>
  108. </div>
  109. </div>
  110. </template>
  111. <script>
  112. export default {
  113. name: '${model.className}Edit',
  114. created() {
  115. if (this.$route.query.id) {
  116. this.$http
  117. .get('${model.className?uncap_first}/get/' + ${r'this.$route.query.id'})
  118. .then(res => {
  119. <#list model.fields as field>
  120. <#if field.formType == 'multiSelect'>
  121. if (res.${field.modelName}) {
  122. res.${field.modelName} = res.${field.modelName}.split(',');
  123. } else {
  124. res.${field.modelName} = [];
  125. }
  126. </#if>
  127. </#list>
  128. this.formData = res;
  129. })
  130. .catch(e => {
  131. console.log(e);
  132. this.$message.error(e.error);
  133. });
  134. }
  135. <#list model.fields as field>
  136. <#if (field.formType == 'select' || field.formType == 'multiSelect') && field.apiFlag == '2'>
  137. this.$http.get('${field.optionsMethod}', {size: 1000, query: {del: false}}).then(res => {
  138. if (res.content.length > 0) {
  139. res.content.forEach(item => {
  140. this.${field.modelName}Options.push({
  141. label: item.${field.optionsLabel},
  142. value: item.${field.optionsValue}<#if field.formType == 'multiSelect'> + ''</#if>
  143. });
  144. })
  145. }
  146. }).catch(e => {
  147. console.log(e);
  148. this.$message.error(e.error);
  149. });
  150. </#if>
  151. </#list>
  152. },
  153. data() {
  154. return {
  155. saving: false,
  156. formData: {
  157. <#list model.fields as field>
  158. <#if field.formType == 'loginName'>
  159. ${field.modelName}: '',
  160. </#if>
  161. </#list>
  162. },
  163. rules: {
  164. <#list model.fields as field>
  165. <#if field.required!false == true || field.validate!false == true>
  166. ${field.modelName}: [
  167. <#if field.required!false == true>
  168. {
  169. required: true,
  170. message: '请输入${field.remark!field.modelName}',
  171. trigger: 'blur'
  172. },
  173. </#if>
  174. <#if field.validate!false == true>
  175. <#if field.maxLength?? && field.minLength??>
  176. {
  177. min: ${field.minLength},
  178. max: ${field.maxLength},
  179. message: '长度在 ${field.minLength} 到 ${field.maxLength} 个字符',
  180. trigger: 'blur'
  181. },
  182. </#if>
  183. <#if field.min?? && field.max??>
  184. {
  185. validator: (rule, value, callback) => {
  186. if (value) {
  187. if (value <= ${field.max} && value >= ${field.min}) {
  188. callback();
  189. } else {
  190. callback(new Error('值在 ${field.min} 到 ${field.max} 之间'));
  191. }
  192. }
  193. }, trigger: 'blur'
  194. },
  195. </#if>
  196. <#if field.validatorType == 'phone'>
  197. {
  198. pattern: /^1[3-9]\d{9}$/,
  199. message: "请输入正确的手机号",
  200. trigger: "blur"
  201. },
  202. </#if>
  203. <#if field.validatorType == 'number'>
  204. {
  205. type: "number",
  206. message: "输入有误",
  207. trigger: "blur"
  208. },
  209. </#if>
  210. <#if field.validatorType == 'url'>
  211. {
  212. pattern: /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/,
  213. message: "请输入正确的URL",
  214. trigger: "blur"
  215. },
  216. </#if>
  217. <#if field.validatorType == 'email'>
  218. {
  219. type: "email",
  220. message: "请输入正确的邮箱地址",
  221. trigger: "blur"
  222. },
  223. </#if>
  224. <#if field.validatorType == 'id'>
  225. {
  226. pattern: /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/,
  227. message: "请输入正确的身份证号码",
  228. trigger: "blur"
  229. },
  230. </#if>
  231. <#if field.validatorType == 'english'>
  232. {
  233. pattern: /^[A-Za-z].+$/,
  234. message: "输入有误",
  235. trigger: "blur"
  236. },
  237. </#if>
  238. </#if>
  239. ],
  240. </#if>
  241. </#list>
  242. },
  243. <#list model.fields as field>
  244. <#if (field.formType == 'select' || field.formType=='multiSelect')>
  245. <#if (field.apiFlag == '2' || field.apiFlag == '3')>
  246. ${field.modelName}Options: [],
  247. <#else>
  248. ${field.modelName}Options: ${field.optionsValue},
  249. </#if>
  250. </#if>
  251. </#list>
  252. }
  253. },
  254. methods: {
  255. onSave() {
  256. this.$refs.form.validate((valid) => {
  257. if (valid) {
  258. this.submit();
  259. } else {
  260. return false;
  261. }
  262. });
  263. },
  264. submit() {
  265. let data = {...this.formData};
  266. <#list model.fields as field>
  267. <#if field.formType == 'currentTime"||${field.formType}=="currentDate'>
  268. if (data.${field.modelName}) {
  269. data.${field.modelName} = Date.parse(new Date(data.${field.modelName}));
  270. }
  271. </#if>
  272. </#list>
  273. this.saving = true;
  274. this.$http
  275. .post('/${model.className?uncap_first}/save', data, {body: 'json'})
  276. .then(res => {
  277. this.saving = false;
  278. this.$message.success('成功');
  279. this.$router.go(-1);
  280. })
  281. .catch(e => {
  282. console.log(e);
  283. this.saving = false;
  284. this.$message.error(e.error);
  285. });
  286. },
  287. onDelete() {
  288. this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
  289. return this.$http.post(`/${model.className?uncap_first}/del/${r'${this.formData.id}'}`)
  290. }).then(() => {
  291. this.$message.success('删除成功');
  292. this.$router.go(-1);
  293. }).catch(e => {
  294. if (e !== 'cancel') {
  295. console.log(e);
  296. this.$message.error((e || {}).error || '删除失败');
  297. }
  298. })
  299. },
  300. }
  301. }
  302. </script>
  303. <style lang="less" scoped></style>