create.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <view class="container" :style="appThemeStyle">
  3. <!-- 标题 -->
  4. <view class="page-title">收货地址</view>
  5. <!-- 表单组件 -->
  6. <view class="form-wrapper">
  7. <u-form :model="form" ref="uForm" label-width="140rpx">
  8. <u-form-item label="姓名" prop="name">
  9. <u-input v-model="form.name" placeholder="请输入收货人姓名" />
  10. </u-form-item>
  11. <u-form-item label="电话" prop="phone">
  12. <u-input v-model="form.phone" placeholder="请输入收货人手机号" />
  13. </u-form-item>
  14. <u-form-item label="地区" prop="region">
  15. <select-region ref="sRegion" v-model="form.region" />
  16. </u-form-item>
  17. <u-form-item label="详细地址" prop="detail" :border-bottom="false">
  18. <u-input v-model="form.detail" placeholder="街道门牌、楼层等信息" />
  19. </u-form-item>
  20. </u-form>
  21. </view>
  22. <!-- 操作按钮 -->
  23. <view class="footer">
  24. <view class="btn-wrapper">
  25. <!-- #ifdef MP-WEIXIN -->
  26. <view class="btn-item btn-item-wechat" @click="chooseAddress()">选择微信收货地址</view>
  27. <!-- #endif -->
  28. <view class="btn-item btn-item-main" :class="{ disabled }" @click="handleSubmit()">保存</view>
  29. </view>
  30. </view>
  31. </view>
  32. </template>
  33. <script>
  34. import SelectRegion from '@/components/select-region/select-region'
  35. import { isMobile } from '@/utils/verify'
  36. import * as AddressApi from '@/api/address'
  37. // 表单字段元素
  38. const form = {
  39. name: '',
  40. phone: '',
  41. region: [],
  42. detail: ''
  43. }
  44. // 表单验证规则
  45. const rules = {
  46. name: [{
  47. required: true,
  48. message: '请输入姓名',
  49. trigger: ['blur', 'change']
  50. }],
  51. phone: [{
  52. required: true,
  53. message: '请输入手机号',
  54. trigger: ['blur', 'change']
  55. }, {
  56. // 自定义验证函数
  57. validator: (rule, value, callback) => {
  58. // 返回true表示校验通过,返回false表示不通过
  59. return isMobile(value)
  60. },
  61. message: '手机号码不正确',
  62. // 触发器可以同时用blur和change
  63. trigger: ['blur'],
  64. }],
  65. region: [{
  66. required: true,
  67. message: '请选择省市区',
  68. trigger: ['blur', 'change'],
  69. type: 'array'
  70. }],
  71. detail: [{
  72. required: true,
  73. message: '请输入详细地址',
  74. trigger: ['blur', 'change']
  75. }],
  76. }
  77. export default {
  78. components: {
  79. SelectRegion
  80. },
  81. data() {
  82. return {
  83. form,
  84. rules,
  85. // 按钮禁用
  86. disabled: false
  87. }
  88. },
  89. /**
  90. * 生命周期函数--监听页面加载
  91. */
  92. onLoad(options) {},
  93. // 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
  94. onReady() {
  95. this.$refs.uForm.setRules(this.rules)
  96. },
  97. methods: {
  98. // 选择微信地址
  99. // #ifdef MP-WEIXIN
  100. chooseAddress() {
  101. const app = this
  102. const { form, $refs } = this
  103. uni.chooseAddress({
  104. success(res) {
  105. const names = $refs.sRegion.getOptionItemByNames(res)
  106. form.name = res.userName
  107. form.phone = res.telNumber
  108. form.detail = res.detailInfo
  109. form.region = names.length > 0 ? names : []
  110. },
  111. fail({ errMsg }) {
  112. app.$toast(errMsg)
  113. console.error('获取微信地址失败:', errMsg)
  114. }
  115. })
  116. },
  117. // #endif
  118. // 表单提交
  119. handleSubmit() {
  120. const app = this
  121. if (app.disabled) {
  122. return false
  123. }
  124. app.$refs.uForm.validate(valid => {
  125. if (valid) {
  126. app.disabled = true
  127. AddressApi.add(app.form)
  128. .then(result => {
  129. app.$toast(result.message)
  130. uni.navigateBack()
  131. })
  132. .finally(() => app.disabled = false)
  133. }
  134. })
  135. }
  136. }
  137. }
  138. </script>
  139. <style>
  140. page {
  141. background: #f7f8fa;
  142. }
  143. </style>
  144. <style lang="scss" scoped>
  145. .page-title {
  146. width: 94%;
  147. margin: 0 auto;
  148. padding-top: 40rpx;
  149. font-size: 28rpx;
  150. color: rgba(69, 90, 100, 0.6);
  151. }
  152. .form-wrapper {
  153. margin: 20rpx auto 20rpx auto;
  154. padding: 0 40rpx;
  155. width: 94%;
  156. box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
  157. border-radius: 16rpx;
  158. background: #fff;
  159. }
  160. // 底部操作栏
  161. .footer {
  162. margin-top: 80rpx;
  163. .btn-wrapper {
  164. height: 100%;
  165. // display: flex;
  166. // align-items: center;
  167. padding: 0 20rpx;
  168. }
  169. .btn-item {
  170. flex: 1;
  171. font-size: 28rpx;
  172. height: 86rpx;
  173. color: #fff;
  174. border-radius: 50rpx;
  175. display: flex;
  176. justify-content: center;
  177. align-items: center;
  178. }
  179. .btn-item-wechat {
  180. background: #0ba90b;
  181. margin-bottom: 26rpx;
  182. }
  183. .btn-item-main {
  184. background: linear-gradient(to right, $main-bg, $main-bg2);
  185. color: $main-text;
  186. // 禁用按钮
  187. &.disabled {
  188. opacity: 0.6;
  189. }
  190. }
  191. }
  192. </style>