index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <view class="address-edit">
  3. <u-form :model="form" ref="form">
  4. <u-form-item label="收货人" prop="name" required>
  5. <u-input v-model="form.name" placeholder="请输入收货人姓名" />
  6. </u-form-item>
  7. <u-form-item label="手机号码" prop="phone" required>
  8. <u-input v-model="form.phone" placeholder="请输入手机号码" type="number" maxlength="11" />
  9. </u-form-item>
  10. <u-form-item label="所在地区" prop="region" required @click="showRegionPicker = true">
  11. <view class="region-select">
  12. <text v-if="form.province">{{form.province + form.city + form.district}}</text>
  13. <text v-else class="placeholder">请选择所在地区</text>
  14. <u-icon name="arrow-right"></u-icon>
  15. </view>
  16. </u-form-item>
  17. <u-form-item label="详细地址" prop="address" required>
  18. <u-textarea v-model="form.address" placeholder="请输入详细地址信息" />
  19. </u-form-item>
  20. <u-form-item>
  21. <u-switch v-model="form.isDefault" activeColor="#D93025">
  22. <text slot="label" class="switch-label">设为默认地址</text>
  23. </u-switch>
  24. </u-form-item>
  25. </u-form>
  26. <view class="submit-btn">
  27. <u-button type="primary" @click="submit" color="#D93025">保存</u-button>
  28. </view>
  29. <u-picker
  30. :show="showRegionPicker"
  31. :columns="regionColumns"
  32. @confirm="confirmRegion"
  33. @cancel="showRegionPicker = false"
  34. title="选择地区">
  35. </u-picker>
  36. </view>
  37. </template>
  38. <script>
  39. export default {
  40. data() {
  41. return {
  42. form: {
  43. name: '',
  44. phone: '',
  45. province: '',
  46. city: '',
  47. district: '',
  48. address: '',
  49. isDefault: false
  50. },
  51. showRegionPicker: false,
  52. regionColumns: [
  53. // 这里需要接入省市区数据
  54. // 可以使用第三方包或者自行维护数据
  55. ],
  56. rules: {
  57. name: [{
  58. required: true,
  59. message: '请输入收货人姓名',
  60. trigger: ['blur', 'change']
  61. }],
  62. phone: [{
  63. required: true,
  64. message: '请输入手机号码',
  65. trigger: ['blur', 'change']
  66. }, {
  67. pattern: /^1[3-9]\d{9}$/,
  68. message: '请输入正确的手机号码',
  69. trigger: ['blur', 'change']
  70. }],
  71. region: [{
  72. required: true,
  73. message: '请选择所在地区',
  74. trigger: ['blur', 'change']
  75. }],
  76. address: [{
  77. required: true,
  78. message: '请输入详细地址',
  79. trigger: ['blur', 'change']
  80. }]
  81. }
  82. }
  83. },
  84. onLoad(options) {
  85. if (options.id) {
  86. this.getAddressDetail(options.id)
  87. }
  88. },
  89. methods: {
  90. async getAddressDetail(id) {
  91. try {
  92. const res = await this.$api.address.detail(id)
  93. Object.assign(this.form, res.data)
  94. } catch (e) {
  95. this.$u.toast('获取地址信息失败')
  96. }
  97. },
  98. confirmRegion(e) {
  99. const [province, city, district] = e.value
  100. this.form.province = province
  101. this.form.city = city
  102. this.form.district = district
  103. this.showRegionPicker = false
  104. },
  105. async submit() {
  106. try {
  107. await this.$refs.form.validate()
  108. const api = this.form.id ? 'update' : 'add'
  109. await this.$api.address[api](this.form)
  110. this.$u.toast(this.form.id ? '修改成功' : '添加成功')
  111. setTimeout(() => {
  112. uni.navigateBack()
  113. }, 1500)
  114. } catch (e) {
  115. if (e.errors) return
  116. this.$u.toast(this.form.id ? '修改失败' : '添加失败')
  117. }
  118. }
  119. }
  120. }
  121. </script>
  122. <style lang="scss" scoped>
  123. .address-edit {
  124. min-height: 100vh;
  125. background: #f5f5f5;
  126. padding: 20rpx;
  127. :deep(.u-form) {
  128. background: #fff;
  129. border-radius: 12rpx;
  130. padding: 20rpx;
  131. .u-form-item {
  132. padding: 20rpx 0;
  133. }
  134. }
  135. .region-select {
  136. display: flex;
  137. align-items: center;
  138. justify-content: space-between;
  139. .placeholder {
  140. color: #c0c4cc;
  141. }
  142. }
  143. .switch-label {
  144. font-size: 28rpx;
  145. margin-right: 20rpx;
  146. }
  147. .submit-btn {
  148. margin-top: 40rpx;
  149. padding: 0 20rpx;
  150. }
  151. }
  152. </style>