addCard.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <div class="form">
  3. <el-form ref="BankRef" :rules="bankRules" :model="bankForm" label-width="80">
  4. <el-form-item prop="name" label="姓名">
  5. <el-input v-model="bankForm.name" disabled></el-input>
  6. </el-form-item>
  7. <el-form-item prop="bank" label="银行">
  8. <el-select v-model="bankForm.bankName" :disabled="bankForm.isRead">
  9. <el-option v-for="item in bankOption" :key="item.id" :value="item.id" :label="item.label"></el-option>
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item prop="bankCardNumber" label="银行卡号">
  13. <el-input v-model="bankForm.bankCardNumber" :disabled="bankForm.isRead"></el-input>
  14. </el-form-item>
  15. <el-form-item prop="bankName" label="开户行">
  16. <el-input v-model="bankForm.bankAddress" :disabled="bankForm.isRead"></el-input>
  17. </el-form-item>
  18. <el-form-item prop="photo" label="照片" class="upload-btn">
  19. <el-upload :auto-upload="false" v-if="!bankForm.imageUrl" :show-file-list="false" accept=".png, .jpg, .jpeg" @change="uploadImage">
  20. <el-button size="large" icon="Plus" />
  21. </el-upload>
  22. <div class="image-view" v-else>
  23. <img :src="bankForm.imageUrl" />
  24. <div class="btns" v-if="!bankForm.isRead">
  25. <el-upload :disabled="bankForm.isRead" style="display: inline" :auto-upload="false" :show-file-list="false" accept=".png, .jpg, .jpeg" @change="uploadImage">
  26. <el-icon class="btn-icon"><Upload /></el-icon>
  27. </el-upload>
  28. <!-- <el-icon class="btn-icon" @click="imageView"><View /></el-icon>-->
  29. </div>
  30. </div>
  31. </el-form-item>
  32. <div style="display: flex; justify-content: flex-end" v-if="!bankForm.isRead">
  33. <el-button @click="onSubmit(BankRef, 0)">取消</el-button>
  34. <el-button type="primary" @click="onSubmit(BankRef, 1)">确定</el-button>
  35. </div>
  36. </el-form>
  37. <div class="image-show" v-show="imageShow" @click="() => { imageShow = false }">
  38. <img :src="bankForm.imageUrl" />
  39. </div>
  40. </div>
  41. </template>
  42. <script setup lang="ts">
  43. import { ref, defineEmits, onMounted, watch } from 'vue'
  44. import {ElMessage, FormInstance} from 'element-plus'
  45. import api from "@/api";
  46. const BankRef = ref<FormInstance>()
  47. let props = defineProps<{
  48. userInfo: {
  49. userJzgInfoId: string,
  50. name: string,
  51. bankName?: string,
  52. bankCardNumber?: string,
  53. bankAddress?: string,
  54. attachment?: string,
  55. imageUrl?: string
  56. isRead?: boolean
  57. }
  58. }>()
  59. const emits = defineEmits(['closeDialog'])
  60. watch(() => props.userInfo, (newVal, oldVal) => {
  61. bankForm.value = newVal
  62. }, { deep: true });
  63. let bankForm = ref({
  64. userJzgInfoId: props.userInfo.userJzgInfoId,
  65. name: props.userInfo.name,
  66. bankName: props.userInfo.bankName,
  67. bankCardNumber: props.userInfo.bankCardNumber,
  68. bankAddress: props.userInfo.bankAddress,
  69. attachment: props.userInfo.attachment,
  70. imageUrl: props.userInfo.attachment,
  71. isRead: props.userInfo.isRead
  72. })
  73. const bankRules = {
  74. name: [
  75. { required: true, message: '请填写姓名', trigger: 'blur' }
  76. ],
  77. bankName: [
  78. { required: true, message: '请填写开户行', trigger: 'blur' }
  79. ],
  80. bankCardNumber: [
  81. { required: true, message: '请填写银行卡号', trigger: 'blur' },
  82. {
  83. pattern: /^([1-9]{1})(\d{15}|\d{16}|\d{18})$/,
  84. message: '请填写正确的银行卡号',
  85. trigger: 'blur'
  86. }
  87. ],
  88. bankAddress: [
  89. { required: true, message: '请填写开户行', trigger: 'blur' }
  90. ],
  91. }
  92. // 照片
  93. let imageShow = ref(false)
  94. const uploadImage = async (file) => {
  95. let files = file.raw
  96. const params = new FormData(); // 声明formData数据类型
  97. params.append("file", files);
  98. params.append("type", "image");
  99. const { code, data, msg } = await api.commonApi.fileUpload(params)
  100. if(code == 200) {
  101. bankForm.value.imageUrl = data.downloadUrl
  102. bankForm.value.attachment = data.id
  103. }
  104. }
  105. const imageView = () => {
  106. imageShow.value = true
  107. }
  108. // 初始化银行数据
  109. let bankOption = ref([])
  110. const initBankCard = () => {
  111. api.commonApi.personInfo('bank_info').then(res => {
  112. if(res.code == 200) {
  113. bankOption.value = res.data
  114. } else {
  115. ElMessage({
  116. message: res.msg,
  117. type: 'warning'
  118. })
  119. }
  120. })
  121. }
  122. const onSubmit = async (BankRef:FormInstance | undefined, type: number) => {
  123. if(!BankRef) {
  124. BankRef.resetFields()
  125. emits('closeDialog', '取消')
  126. return
  127. }
  128. if(type) {
  129. await BankRef.validate((valid) => {
  130. if(valid) {
  131. console.log(bankForm.value)
  132. return
  133. api.operationApi.addBankCard(bankForm.value).then(res => {
  134. if(res.code == 200) {
  135. ElMessage({
  136. message: res.msg,
  137. type: 'success'
  138. })
  139. } else {
  140. ElMessage({
  141. message: res.msg,
  142. type: 'warning'
  143. })
  144. }
  145. BankRef.resetFields()
  146. emits('closeDialog', '确定')
  147. })
  148. } else {
  149. ElMessage({
  150. message: '请正确填写相关信息!',
  151. type: 'warning'
  152. })
  153. }
  154. })
  155. } else {
  156. BankRef.resetFields()
  157. emits('closeDialog', '取消')
  158. }
  159. }
  160. onMounted(() => {
  161. initBankCard()
  162. })
  163. </script>
  164. <style scoped lang="scss">
  165. .form{
  166. position: relative;
  167. .upload-btn{
  168. :deep(.el-button) {
  169. width: 80px;
  170. height: 80px;
  171. font-size: 30px;
  172. color: #ccc;
  173. }
  174. }
  175. .image-view{
  176. width: 80px;
  177. height: 80px;
  178. border-radius: 5px;
  179. position: relative;
  180. img{
  181. display: block;
  182. width: 100%;
  183. height: 100%;
  184. border-radius: 5px;
  185. }
  186. .btns{
  187. display: none;
  188. }
  189. &:hover{
  190. .btns{
  191. width: 100%;
  192. height: 100%;
  193. border-radius: 5px;
  194. position: absolute;
  195. background: rgba(0,0,0, .3);
  196. top: 0;
  197. left: 0;
  198. line-height: 80px;
  199. display: flex;
  200. align-content: center;
  201. justify-content: center;
  202. .btn-icon{
  203. color: #fff;
  204. font-size: 18px;
  205. margin: 0 10px;
  206. cursor: pointer;
  207. }
  208. }
  209. }
  210. }
  211. .image-show{
  212. width: 100%;
  213. height: 100%;
  214. position: absolute;
  215. margin: auto;
  216. top: 0;
  217. left: 0;
  218. display: flex;
  219. align-content: center;
  220. justify-content: center;
  221. background: rgba(0,0,0,.4);
  222. img{
  223. display: block;
  224. width: 80%;
  225. height: 100%;
  226. }
  227. }
  228. }
  229. </style>