add-or-edit-address.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <template>
  2. <div class="addr-pop-con">
  3. <!-- 弹窗 -->
  4. <div class="popup-mask"></div>
  5. <div class="fix-transform-blur">
  6. <div class="popup-box">
  7. <!-- 新增地址 -->
  8. <div class="tit">
  9. <div class="text" v-if="editAddrId">{{$t('address.modifyAddress')}}</div>
  10. <div class="text" v-else>{{$t('address.addRecipientInformation')}}</div>
  11. <div class="close" @click="hidePop"></div>
  12. </div>
  13. <div class="con">
  14. <div class="edit">
  15. <div class="item error">
  16. <div class="label" :class="['label',$t('language')=='en' ? 'labelEn' : '']">{{$t('address.recipient')}}:</div>
  17. <div class="text-box">
  18. <input type="text" class="input" v-model="addressForm.receiver" maxlength="15"/>
  19. <div v-if="errTip==1" class="error-text">{{$t('address.addRecipientInformation')}}</div>
  20. </div>
  21. </div>
  22. <div class="item">
  23. <div :class="['label',$t('language')=='en' ? 'labelEn' : '']">{{$t('applyReturn.mobileNumber')}}:</div>
  24. <div class="text-box">
  25. <input type="text" class="input" v-model="addressForm.mobile" maxlength="11" />
  26. <div v-if="errTip==2" class="error-text">{{$t('address.cellPhoneNumberCannotBeEmpty')}}</div>
  27. <div v-if="errTip==5" class="error-text">{{$t('address.cellPhoneNumberRightFormat')}}</div>
  28. </div>
  29. </div>
  30. <div class="item">
  31. <div :class="['label',$t('language')=='en' ? 'labelEn' : '']">{{$t('freeShop.area')}}:</div>
  32. <div class="text-box">
  33. <div class="area-box">
  34. <!-- 省 -->
  35. <el-select
  36. v-model="addressForm.province"
  37. prop="province"
  38. :placeholder="this.$t('applyReturn.select')"
  39. class="area"
  40. @change="selectProvince"
  41. >
  42. <el-option
  43. v-for="province in provinceList"
  44. :key="province.areaId"
  45. :label="province.areaName"
  46. :value="province"
  47. >{{ province.areaName }}</el-option>
  48. </el-select>
  49. <!-- 市 -->
  50. <el-select
  51. v-model="addressForm.city"
  52. prop="city"
  53. class="area"
  54. :placeholder="this.$t('applyReturn.select')"
  55. @change="selectCity"
  56. >
  57. <el-option
  58. v-for="city in cityList"
  59. :key="city.areaId"
  60. :label="city.areaName"
  61. :value="city"
  62. >{{ city.areaName }}</el-option>
  63. </el-select>
  64. <!-- 区 -->
  65. <el-select
  66. v-model="addressForm.area"
  67. class="area"
  68. prop="area"
  69. @change="selectArea"
  70. :placeholder="this.$t('applyReturn.select')"
  71. >
  72. <el-option
  73. v-for="area in areaList"
  74. :key="area.areaId"
  75. :label="area.areaName"
  76. :value="area"
  77. >{{ area.areaName }}</el-option>
  78. </el-select>
  79. </div>
  80. <div v-if="errTip==3" class="error-text">{{$t('address.pleaseYourCompleteRegionalInformation')}}</div>
  81. </div>
  82. </div>
  83. <div class="item">
  84. <div :class="['label',$t('language')=='en' ? 'labelEn' : '']">{{$t('freeShop.detailedAddress')}}:</div>
  85. <div class="text-box">
  86. <input type="text" class="input" v-model="addressForm.addr" maxlength="50"/>
  87. <div v-if="errTip==4" class="error-text">{{$t('freeShop.detailedAddressTips')}}</div>
  88. </div>
  89. </div>
  90. <div class="item item-btn" :style="{marginLeft:$t('language')=='en'?'35px':'0'}">
  91. <div class="label-btn">&nbsp;</div>
  92. <a href="javascript:void(0)" class="btn-r" @click="submitAddress">{{$t('address.saveRecipientInformation')}}</a>
  93. </div>
  94. </div>
  95. </div>
  96. <!-- /新增地址 -->
  97. </div>
  98. </div>
  99. <!-- /弹窗 -->
  100. </div>
  101. </template>
  102. <script>
  103. import util from '../plugins/util'
  104. export default {
  105. props: ['editAddrId'],
  106. data () {
  107. return {
  108. provinceList: [],
  109. cityList: [],
  110. areaList: [],
  111. addressForm: {
  112. receiver: '', // 收货人
  113. mobile: '', // 手机号
  114. addr: '', // 详细地址
  115. addrId: 0, // 地址ID
  116. province: '',
  117. provinceId: null,
  118. postCode: '',
  119. city: '',
  120. cityId: null,
  121. area: '',
  122. areaId: null
  123. },
  124. errTip: 0, // 错误提示: 1收件人 2手机号 3地区数据 4详细地址
  125. }
  126. },
  127. mounted () {
  128. this.init()
  129. if (this.editAddrId) {
  130. this.getAddrInfo(this.editAddrId)
  131. }
  132. },
  133. methods: {
  134. // 页面加载获取数据:省份数据
  135. init () {
  136. this.listAreaByParentId().then(({ data }) => {
  137. this.provinceList = data
  138. })
  139. },
  140. /**
  141. * 省市区
  142. */
  143. listAreaByParentId (pid) {
  144. if (!pid) { pid = 0 }
  145. return this.$axios.get('/p/area/listByPid', { params: { pid } })
  146. },
  147. /**
  148. * 选择省
  149. */
  150. selectProvince (val) {
  151. // 设置省id
  152. this.addressForm.provinceId = val.areaId
  153. this.addressForm.province = val.areaName
  154. // 将市和区的值清除
  155. this.addressForm.cityId = null
  156. this.addressForm.city = ''
  157. this.addressForm.areaId = null
  158. this.addressForm.area = ''
  159. // 获取城市的select
  160. this.listAreaByParentId(this.addressForm.provinceId).then(({ data }) => {
  161. this.cityList = data
  162. })
  163. },
  164. /**
  165. * 选择市
  166. */
  167. selectCity (val) {
  168. // 设置市id
  169. this.addressForm.cityId = val.areaId
  170. this.addressForm.city = val.areaName
  171. // 将区域的值清除
  172. this.addressForm.areaId = null
  173. this.addressForm.area = ''
  174. // 获取区域的select
  175. this.listAreaByParentId(this.addressForm.cityId).then(({ data }) => {
  176. this.areaList = data
  177. })
  178. },
  179. /**
  180. * 选择区
  181. */
  182. selectArea (val) {
  183. // 设置区id
  184. this.addressForm.areaId = val.areaId
  185. this.addressForm.area = val.areaName
  186. },
  187. /**
  188. * 根据地址id获取地址信息
  189. */
  190. getAddrInfo (addrId) {
  191. this.$axios.get('/p/address/addrInfo/' + addrId).then(({ data }) => {
  192. this.addressForm = data
  193. this.listAreaByParentId(data.provinceId).then(({ data }) => {
  194. this.cityList = data
  195. })
  196. this.listAreaByParentId(data.cityId).then(({ data }) => {
  197. this.areaList = data
  198. })
  199. })
  200. },
  201. /**
  202. * 更新/添加地址
  203. */
  204. submitAddress () {
  205. if (!this.addressForm.receiver.trim()) {
  206. this.errTip = 1
  207. return
  208. } else if (!this.addressForm.mobile.trim()) {
  209. this.errTip = 2
  210. return
  211. } else if (!util.checkPhoneNumber(this.addressForm.mobile)) {
  212. this.errTip = 5
  213. return
  214. } else if (!this.addressForm.provinceId || !this.addressForm.cityId || !this.addressForm.areaId) {
  215. this.errTip = 3
  216. return
  217. } else if (!this.addressForm.addr.trim() || this.addressForm.addr.length<5) {
  218. this.errTip = 4
  219. return
  220. } else {
  221. this.errTip = 0
  222. }
  223. let addrParam = {
  224. addrId: this.editAddrId ? this.editAddrId : 0,
  225. addr: this.addressForm.addr,
  226. area: this.addressForm.area,
  227. areaId: this.addressForm.areaId,
  228. city: this.addressForm.city,
  229. cityId: this.addressForm.cityId,
  230. mobile: this.addressForm.mobile,
  231. postCode: this.addressForm.postCode || '',
  232. province: this.addressForm.province,
  233. provinceId: this.addressForm.provinceId,
  234. receiver: this.addressForm.receiver
  235. }
  236. this.$axios({
  237. method: this.editAddrId ? 'put' : 'post',
  238. url: this.editAddrId ? '/p/address/updateAddr' : '/p/address/addAddr',
  239. data: addrParam,
  240. }).then(({ data }) => {
  241. this.$message({
  242. message: data,
  243. type: 'success',
  244. duration: 1000
  245. })
  246. this.$emit('getAddrList')
  247. this.$emit('toggleAddrPop', false)
  248. this.$emit('reloadOrderInfo')
  249. })
  250. },
  251. /**
  252. * 隐藏新增地址弹窗
  253. */
  254. hidePop () {
  255. this.$emit('toggleAddrPop', false);
  256. },
  257. }
  258. }
  259. </script>
  260. <style>
  261. .area .el-input__inner {
  262. margin: 0;
  263. padding: 0;
  264. height: unset;
  265. line-height: unset;
  266. }
  267. .area .el-scrollbar {
  268. width: 97px;
  269. }
  270. .area .el-input__suffix-inner {
  271. position: absolute;
  272. top: -10px;
  273. left: -18px;
  274. }
  275. .el-select-dropdown {
  276. z-index: 20005 !important;
  277. }
  278. .el-select-dropdown__item.selected {
  279. color: unset;
  280. font-weight: unset;
  281. }
  282. .el-select .area .el-select > .el-input {
  283. overflow: hidden;
  284. }
  285. /* 修复transform导致弹窗内容模糊问题 */
  286. .fix-transform-blur {
  287. z-index: 10000;
  288. position: fixed;
  289. top: 40%;
  290. left: 50%;
  291. transform: translate(-50%, -40%);
  292. }
  293. /* 国际化样式修整 */
  294. .labelEn {
  295. width: 110px !important;
  296. text-align: center !important;
  297. }
  298. </style>