add-address.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <view class="add-address">
  3. <custom-nav ref="ltm" :title="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. this.$refs.ltm.toast('真实姓名不符合要求')
  60. return
  61. }
  62. if (!this.address.phone.match(/^1\d{10}$/)) { // 校验手机号
  63. this.$refs.ltm.toast('手机号码不符合要求')
  64. return
  65. }
  66. if (!this.address.local.trim().length) { // 校验是否选择地区
  67. this.$refs.ltm.toast('请选择所在地区')
  68. return
  69. }
  70. if (!this.address.detail.trim().length) { // 校验是否填写详细地址
  71. this.$refs.ltm.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. this.$refs.ltm.loading()
  85. if (this.title === '新增地址') {
  86. _API_AddressAdd(address).then(res => {
  87. uni.navigateBack()
  88. this.requesting = false
  89. address.id = res.data.id
  90. uni.$emit('ADDRESS', '新增地址成功')
  91. this.$store.commit('address/ADD_ADDRESS', address)
  92. })
  93. } else if (this.title === '编辑地址') {
  94. address.id = this.id
  95. _API_AddressUpdata(address).then(res => {
  96. uni.navigateBack()
  97. this.requesting = false
  98. uni.$emit('ADDRESS', '修改地址成功')
  99. this.$store.commit('address/UPDATA_ADDRESS', address)
  100. })
  101. }
  102. }
  103. },
  104. choosePicker() { // 显示地址选择器
  105. this.$refs.Selector.show()
  106. },
  107. onConfirm(e) { // 选择地址选择器
  108. this.address.local = `${e.checkArr[0]}-${e.checkArr[1]}-${e.checkArr[2]}`
  109. this.address.provice = e.checkArr[0]
  110. this.address.city = e.checkArr[1]
  111. this.address.area = e.checkArr[2]
  112. }
  113. },
  114. onLoad(opt) {
  115. if (opt.index) { // 如果传入 index 表示用户编辑地址
  116. this.title = '编辑地址' // 修改页面标题
  117. const address = this.list[opt.index]
  118. this.id = address.id // 获取地址 id
  119. this.address.name = address.con_name
  120. this.address.phone = address.con_mobile
  121. this.address.provice = address.provice
  122. this.address.city = address.city
  123. this.address.area = address.area
  124. this.address.local = `${address.provice}-${address.city}-${address.area}`
  125. this.address.detail = address.address
  126. this.pickerDefaultVal = [address.provice, address.city, address.area]
  127. }
  128. }
  129. }
  130. </script>
  131. <style lang="scss">
  132. .add-address {
  133. @include page();
  134. .cuIcon-right {
  135. top: 50%;
  136. right: 30rpx;
  137. position: absolute;
  138. transform: translateY(-50%);
  139. }
  140. }
  141. </style>