add-address.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <view class="add-address">
  3. <custom-nav noback="noback" transparent="transparent" ref="ltm" title=" " />
  4. <w-picker ref="Selector" mode="region" :defaultVal="pickerDefaultVal" themeColor="#F76454" @confirm="onConfirm" />
  5. <view class="content">
  6. <view class="app-item">
  7. <text>收货人</text>
  8. <input type="text" v-model="address.name" placeholder="请填写真实姓名" />
  9. </view>
  10. <view class="app-item">
  11. <text>手机号</text>
  12. <input type="number" v-model="address.phone" maxlength="11" placeholder="请填写手机号码" />
  13. </view>
  14. <view class="app-item" @tap="choosePicker">
  15. <text>所在地区</text>
  16. <input type="text" v-model="address.local" disabled placeholder="请选择所在地区" />
  17. <text class="cuIcon-right"></text>
  18. </view>
  19. <view class="app-item">
  20. <text>详细地址</text>
  21. <textarea v-model="address.detail" :auto-height="true" placeholder="请填写详细地址" />
  22. </view>
  23. <view class="big-btn bg" @tap="save">保存地址</view>
  24. </view>
  25. </view>
  26. </template>
  27. <script>
  28. import WPicker from '@/components/w-picker/w-picker.vue'
  29. import cityData from '@/components/citypicker/city-data/city.js'
  30. import areaData from '@/components/citypicker/city-data/area.js'
  31. import cityPicker from '@/components/citypicker/city-picker.vue'
  32. import provinceData from '@/components/citypicker/city-data/province.js'
  33. import { _API_AddressAdd, _API_AddressUpdata } from '@/apis/address.js'
  34. export default {
  35. components: { WPicker, cityPicker },
  36. data() {
  37. return {
  38. title: '新增地址',
  39. id: '',
  40. address: {
  41. name: '',
  42. phone: '',
  43. local: '',
  44. provice: '',
  45. city: '',
  46. area: '',
  47. detail: ''
  48. },
  49. requesting: false,
  50. pickerDefaultVal: ['河南省', '郑州市', '金水区']
  51. }
  52. },
  53. computed: {
  54. list() { return this.$store.state.address.list }
  55. },
  56. methods: {
  57. save() { // 保存/修改地址
  58. if (!this.address.name.match(/^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/)) { // 校验姓名
  59. uni.toast('真实姓名不符合要求')
  60. return
  61. }
  62. if (!this.address.phone.match(/^1\d{10}$/)) { // 校验手机号
  63. uni.toast('手机号码不符合要求')
  64. return
  65. }
  66. if (!this.address.local.trim().length) { // 校验是否选择地区
  67. uni.toast('请选择所在地区')
  68. return
  69. }
  70. if (!this.address.detail.trim().length) { // 校验是否填写详细地址
  71. uni.toast('详细地址不能为空')
  72. return
  73. }
  74. const address = {
  75. con_name: this.address.name,
  76. con_mobile: this.address.phone,
  77. provice: this.address.provice,
  78. city: this.address.city,
  79. area: this.address.area,
  80. address: this.address.detail
  81. }
  82. if (!this.requesting) {
  83. this.requesting = true
  84. uni.showLoading({ mask: true })
  85. if (this.title === '新增地址') {
  86. _API_AddressAdd(address).then(res => {
  87. uni.navigateBack()
  88. uni.$emit('ADDRESS', '新增地址成功')
  89. })
  90. } else if (this.title === '编辑地址') {
  91. address.id = this.id
  92. _API_AddressUpdata(address).then(res => {
  93. uni.navigateBack()
  94. uni.$emit('ADDRESS', '修改地址成功')
  95. })
  96. }
  97. }
  98. },
  99. choosePicker() { // 显示地址选择器
  100. this.$refs.Selector.show()
  101. },
  102. onConfirm(e) { // 选择地址选择器
  103. this.address.local = `${e.checkArr[0]}-${e.checkArr[1]}-${e.checkArr[2]}`
  104. this.address.provice = e.checkArr[0]
  105. this.address.city = e.checkArr[1]
  106. this.address.area = e.checkArr[2]
  107. }
  108. },
  109. onLoad(opt) {
  110. if (opt.index) { // 如果传入 index 表示用户编辑地址
  111. this.title = '编辑地址' // 修改页面标题
  112. const address = this.list[opt.index]
  113. this.id = address.id // 获取地址 id
  114. this.address.name = address.con_name
  115. this.address.phone = address.con_mobile
  116. this.address.provice = address.provice
  117. this.address.city = address.city
  118. this.address.area = address.area
  119. this.address.local = `${address.provice}-${address.city}-${address.area}`
  120. this.address.detail = address.address
  121. this.pickerDefaultVal = [address.provice, address.city, address.area]
  122. }
  123. }
  124. }
  125. </script>
  126. <style lang="scss">
  127. .add-address {
  128. @include page();
  129. .cuIcon-right {
  130. top: 50%;
  131. right: 30rpx;
  132. position: absolute;
  133. transform: translateY(-50%);
  134. }
  135. }
  136. </style>