ItemModal.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="modal"
  5. width="80%"
  6. :close-on-click-modal="false"
  7. @close="
  8. res => {
  9. $emit('cancel');
  10. }
  11. "
  12. >
  13. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  14. <el-form-item label="幼儿园名称" prop="name"
  15. ><el-input v-model="form.name" placeholder="请输入幼儿园名称" />
  16. </el-form-item>
  17. <el-form-item label="幼儿园类型" prop="type">
  18. <el-radio-group v-model="form.type">
  19. <el-radio
  20. v-for="(item, index) in TypeOptions"
  21. :key="index"
  22. :label="item.value"
  23. >
  24. {{ item.label }}
  25. </el-radio>
  26. </el-radio-group>
  27. </el-form-item>
  28. <el-form-item label="所在地区" prop="addressArr" required>
  29. <!-- TODO 联动select -->
  30. <AddressSelect v-model="form.addressArr" />
  31. </el-form-item>
  32. <el-form-item label="详细地址" prop="address">
  33. <el-input v-model="form.address" placeholder="请输入详细地址" />
  34. </el-form-item>
  35. <el-form-item label="幼儿园logo" prop="logo" required>
  36. <upload v-model="form.logo" params="prefix=/kindergarten-logo"/>
  37. <el-row>建议尺寸:</el-row>
  38. </el-form-item>
  39. <el-form-item label="幼儿园预览图logo" prop="previewLogo" required>
  40. <upload v-model="form.previewLogo" params="prefix=/kindergarten-logo" />
  41. <el-row>建议尺寸:<a href="http://youxiangle.cn/yxl-back-end/static/yxl/fission/preview-logo-256*110.psd" target="_blank" style="color: rgb(245, 108, 108);">下载psd</a></el-row>
  42. </el-form-item>
  43. <el-form-item label="幼儿园高清图logo" prop="hdLogo" required>
  44. <upload v-model="form.hdLogo" params="prefix=/kindergarten-logo" />
  45. <el-row>建议尺寸:<a href="http://youxiangle.cn/yxl-back-end/static/yxl/fission/hd-logo-1252*521.psd" target="_blank" style="color: rgb(245, 108, 108);">下载psd</a></el-row>
  46. </el-form-item>
  47. <el-form-item label="封面图" prop="cover" required>
  48. <upload v-model="form.cover" :limit="9" params="prefix=/kindergarten-cover" />
  49. <el-row>建议尺寸:</el-row>
  50. </el-form-item>
  51. <el-form-item label="办公电话" prop="phonenumber">
  52. <el-input v-model="form.phonenumber" placeholder="请输入办公电话" />
  53. </el-form-item>
  54. <el-form-item label="幼儿园介绍" prop="brief">
  55. <el-input
  56. v-model="form.brief"
  57. type="textarea"
  58. :rows="2"
  59. placeholder="请输入幼儿园介绍"
  60. />
  61. </el-form-item>
  62. <el-form-item label="营业执照" prop="businessLicense" required>
  63. <upload
  64. v-model="form.businessLicense"
  65. :uploadUrl="$upload('/yxl-back-end/framework/oss/minio/upload')"
  66. />
  67. </el-form-item>
  68. <el-form-item label="申请人姓名" prop="realName">
  69. <el-input v-model="form.realName" placeholder="请输入申请人姓名" />
  70. </el-form-item>
  71. <el-form-item label="手机号" prop="personPhonenumber">
  72. <el-input v-model="form.personPhonenumber" placeholder="请输入手机号" />
  73. </el-form-item>
  74. <el-form-item label="邮箱" prop="email">
  75. <el-input v-model="form.email" placeholder="请输入邮箱" />
  76. </el-form-item>
  77. <el-form-item label="证照号码" prop="idCardNumber">
  78. <el-input v-model="form.idCardNumber" placeholder="请输入证照号码" />
  79. </el-form-item>
  80. <el-form-item label="半身照" prop="bodyPhoto" required>
  81. <upload
  82. v-model="form.bodyPhoto"
  83. :uploadUrl="$upload('/yxl-back-end/framework/oss/minio/upload')"
  84. />
  85. </el-form-item>
  86. <el-form-item label="证件正面" prop="idCardFront" required>
  87. <upload
  88. v-model="form.idCardFront"
  89. :uploadUrl="$upload('/yxl-back-end/framework/oss/minio/upload')"
  90. />
  91. </el-form-item>
  92. <el-form-item label="证件背面" prop="idCardBack" required>
  93. <upload
  94. v-model="form.idCardBack"
  95. :uploadUrl="$upload('/yxl-back-end/framework/oss/minio/upload')"
  96. />
  97. </el-form-item>
  98. <el-form-item label="显示/隐藏" prop="isShow">
  99. <el-radio-group v-model="form.isShow">
  100. <el-radio :label="true">显示</el-radio>
  101. <el-radio :label="false">隐藏</el-radio>
  102. </el-radio-group>
  103. </el-form-item>
  104. </el-form>
  105. <span slot="footer" class="dialog-footer">
  106. <el-button @click="modal = false">取消</el-button>
  107. <el-button type="primary" @click="handleConfirm">确定</el-button>
  108. </span>
  109. </el-dialog>
  110. </template>
  111. <script>
  112. import SCENETYPE from '@/const/sceneType';
  113. import { getItem, saveItem } from '@/api/scene';
  114. const setListImg = str => {
  115. if (!str || str === '') {
  116. return [];
  117. } else {
  118. return str.split(',').map(x => ({ url: x }));
  119. }
  120. };
  121. export default {
  122. name: 'SceneItemModal',
  123. props: {
  124. id: {
  125. type: String,
  126. default: ''
  127. }
  128. },
  129. data() {
  130. var checkEmail = (rule, value, callback) => {
  131. const reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
  132. if (reg.test(value)) {
  133. callback();
  134. } else {
  135. callback(new Error('请输入正确的邮箱'));
  136. }
  137. };
  138. return {
  139. title: '新增幼儿园信息',
  140. modal: true,
  141. TypeOptions: SCENETYPE,
  142. form: {
  143. name: '',
  144. address: '',
  145. idCardNumber: '',
  146. phonenumber: '',
  147. brief: '',
  148. realName: '',
  149. personPhonenumber: '',
  150. type: '',
  151. // TODO 未对接接口字段
  152. province: '',
  153. city: '',
  154. area: '',
  155. logo: [],
  156. previewLogo: [],
  157. hdLogo: [],
  158. cover: [],
  159. businessLicense: [],
  160. bodyPhoto: [],
  161. idCardFront: [],
  162. idCardBack: [],
  163. addressArr: [],
  164. isShow: false
  165. },
  166. rules: {
  167. name: [{ required: true, min: 4, max: 64, message: '请输入幼儿园名称(4 ~ 64个字符)', trigger: 'change' }],
  168. addressArr: [{ type: 'array', required: true, message: '请选择省市区', trigger: 'change'}],
  169. address: [{ required: true, min: 4, max: 255, message: '请输入详细地址(4 ~ 255个字符)', trigger: 'change' }],
  170. phonenumber: [{ required: true, min: 4, max: 64, message: '请输入办公电话(4 ~ 64个字符)', trigger: 'change' }],
  171. brief: [{ required: true, min: 4, max: 255, message: '请输入幼儿园介绍(4 ~ 255个字符)', trigger: 'change' }],
  172. realName: [{ required: true, min: 2, max: 64, message: '请输入申请人姓名(2 ~ 64个字符)', trigger: 'change' }],
  173. personPhonenumber: [{ required: true, min: 4, max: 64, message: '请输入手机号(4 ~ 64个字符)', trigger: 'change' }],
  174. type: [{ required: true, message: '请选择幼儿园类型', trigger: 'change' }],
  175. email: [
  176. { required: true, min: 4, max: 64, message: '请输入邮箱(4 ~ 64个字符)', trigger: 'change' },
  177. { validator: checkEmail, trigger: 'blur' }
  178. ],
  179. idCardNumber: [{ required: true, min: 4, max: 64, message: '请输入证照号码(4 ~ 64个字符)', trigger: 'change' }],
  180. logo: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change'}],
  181. previewLogo: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change'}],
  182. hdLogo: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change'}],
  183. cover: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change' }],
  184. businessLicense: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change' }],
  185. bodyPhoto: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change' }],
  186. idCardFront: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change' }],
  187. idCardBack: [{ type: 'array', required: true, message: '请上传图片', trigger: 'change' }],
  188. addressArr: [{ type: 'array', required: true, message: '请选择地址', trigger: 'change' }]
  189. }
  190. };
  191. },
  192. watch: {
  193. id: {
  194. handler(id) {
  195. if (id) {
  196. this.loadData();
  197. this.title = '编辑幼儿园信息';
  198. }
  199. },
  200. immediate: true
  201. }
  202. },
  203. mounted() {},
  204. methods: {
  205. async loadData() {
  206. const { success, data, msg } = await getItem({
  207. id: this.id
  208. });
  209. if (success) {
  210. let result = data;
  211. result.logo = [{ url: data.logo }];
  212. result.previewLogo = [{ url: data.previewLogo }];
  213. result.hdLogo = [{ url: data.hdLogo }];
  214. result.cover = data.coverList.map(x => ({ url: x })); // setListImg(data.cover);
  215. result.businessLicense = [{ url: data.businessLicense }];
  216. result.bodyPhoto = [{ url: data.bodyPhoto }];
  217. result.idCardFront = [{ url: data.idCardFront }];
  218. result.idCardBack = [{ url: data.idCardBack }];
  219. result.addressArr = [data.province, data.city, data.area];
  220. this.form = result;
  221. }
  222. },
  223. handleConfirm() {
  224. this.$refs.form.validate(async valid => {
  225. if (valid) {
  226. let params = Object.assign({}, this.form);
  227. params.province = this.form.addressArr[0];
  228. params.city = this.form.addressArr[1];
  229. params.area = this.form.addressArr[2];
  230. params.logo = this.form.logo[0].url;
  231. params.previewLogo = this.form.previewLogo[0].url;
  232. params.hdLogo = this.form.hdLogo[0].url;
  233. params.cover = this.form.cover.map(x => x.url).join(',');
  234. params.businessLicense = this.form.businessLicense[0].url;
  235. params.bodyPhoto = this.form.bodyPhoto[0].url;
  236. params.idCardFront = this.form.idCardFront[0].url;
  237. params.idCardBack = this.form.idCardBack[0].url;
  238. if (this.id) params.id = this.id;
  239. const { success, msg } = await saveItem(params);
  240. if (success) {
  241. this.$success('保存成功!');
  242. this.modal = false;
  243. this.$g_emit('scene_reload');
  244. }
  245. }
  246. });
  247. }
  248. }
  249. };
  250. </script>
  251. <style lang="scss" scoped>
  252. .pre-img {
  253. height: 80px;
  254. }
  255. </style>