addrForm.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <view class="pages">
  3. <u-navbar
  4. title="收货地址"
  5. :autoBack="true"
  6. :safeAreaInsetTop="true"
  7. >
  8. </u-navbar>
  9. <view class="page-wrap">
  10. <view class="view-wrap">
  11. <u--form
  12. labelPosition="left"
  13. :model="model"
  14. :rules="rules"
  15. ref="uForm"
  16. labelWidth="80"
  17. >
  18. <u-form-item label="姓名" prop="receiveName" borderBottom ref="receiveName">
  19. <u--input v-model="model.receiveName" placeholder="请输入收货人姓名" border="none"></u--input>
  20. </u-form-item>
  21. <u-form-item label="手机号码" prop="receivePhone" borderBottom ref="receivePhone">
  22. <u--input v-model="model.receivePhone" placeholder="请输入收货人手机号码" border="none"></u--input>
  23. </u-form-item>
  24. <u-form-item label="所在地区" prop="receiveAdress" borderBottom ref="receiveAdress">
  25. <view class="1" @tap="showRegionPicker">
  26. <u--input v-model="model.receiveAdress" placeholder="省市区县、乡镇等" border="none"></u--input>
  27. </view>
  28. </u-form-item>
  29. <u-form-item label="详细地址" prop="address" borderBottom ref="address">
  30. <u--textarea v-model="model.address" placeholder="街道楼牌号等" ></u--textarea>
  31. </u-form-item>
  32. </u--form>
  33. </view>
  34. <view class="set-default view-wrap u-flex u-row-between">
  35. <view class="left">
  36. <view class="til">设置默认地址</view>
  37. <view class="tip">提醒:每次下单会默认推荐该地址</view>
  38. </view>
  39. <view class="right">
  40. <u-switch v-model="model.ifDefault" :activeValue="Number(1)" :inactiveValue="Number(0)" size="24" activeColor="#5ac725" inactiveColor="#ddd" @change="defaultChange"></u-switch>
  41. </view>
  42. </view>
  43. <view class="full-btn" @click="submit">保存</view>
  44. </view>
  45. <map v-if="showMap" />
  46. </view>
  47. </template>
  48. <script>
  49. import map from "./map.vue";
  50. export default {
  51. components:{
  52. map
  53. },
  54. data() {
  55. return {
  56. saveType:'',
  57. id:'',
  58. showMap:false,
  59. model: {
  60. receiveName:'',
  61. receivePhone:'',
  62. receiveAdress:'',
  63. address:'',
  64. ifDefault:0,
  65. },
  66. rules:{
  67. 'receiveName': {
  68. type: 'string',
  69. required: true,
  70. message: '请填写姓名',
  71. trigger: ['blur', 'change']
  72. },
  73. receivePhone: [
  74. {
  75. required: true,
  76. message: '请输入手机号',
  77. trigger: ['change','blur'],
  78. },
  79. {
  80. // 自定义验证函数,见上说明
  81. validator: (rule, value, callback) => {
  82. // 上面有说,返回true表示校验通过,返回false表示不通过
  83. // uni.$u.test.mobile()就是返回true或者false的
  84. return uni.$u.test.mobile(value);
  85. },
  86. message: '手机号码不正确',
  87. // 触发器可以同时用blur和change
  88. trigger: ['change','blur'],
  89. }
  90. ],
  91. 'receiveAdress': {
  92. type: 'string',
  93. required: true,
  94. message: '请选择所在地区',
  95. trigger: ['blur', 'change']
  96. },
  97. 'address': {
  98. type: 'string',
  99. required: true,
  100. message: '请填详细地址',
  101. trigger: ['blur', 'change']
  102. },
  103. }
  104. }
  105. },
  106. onShow() {
  107. },
  108. onLoad(page) {
  109. console.log('page',page);
  110. this.saveType = page.type;
  111. this.id = page.id;
  112. if(this.id){
  113. this.getAddrById(this.id)
  114. }
  115. },
  116. onReady() {
  117. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  118. this.$refs.uForm.setRules(this.rules)
  119. },
  120. methods: {
  121. closePicker(){
  122. this.show = false
  123. },
  124. defaultChange(e){
  125. console.log('defaultChange',e)
  126. },
  127. showRegionPicker() {
  128. // this.showMap = true;
  129. uni.$u.route('/center/map');
  130. },
  131. getAddrById(id){
  132. this.$u.api.getAddrById({id:id}).then(res=>{
  133. console.log('getAddrByIdres',res.data);
  134. const { receiveName, receivePhone, receiveAdress, address, ifDefault } = res.data;
  135. Object.assign(this.model, { receiveName, receivePhone, receiveAdress, address, ifDefault });
  136. }).catch(err=>{
  137. console.log('getAddrById',err);
  138. })
  139. },
  140. submit() {
  141. this.$refs.uForm.validate().then(res => {
  142. console.log('this.model',this.model);
  143. uni.$u.toast('校验通过')
  144. if(this.saveType=='edit'){
  145. this.editAddr()
  146. }else{
  147. this.addAddr()
  148. }
  149. }).catch(errors => {
  150. uni.$u.toast('校验失败')
  151. })
  152. },
  153. addAddr(){
  154. this.$u.api.addAddr(this.model).then(res=>{
  155. // console.log('res',res);
  156. uni.$u.route('/center/addrlist', {
  157. type: 'redirectTo'
  158. });
  159. }).catch(err=>{
  160. console.log('addAddr',err.data);
  161. })
  162. },
  163. editAddr(){
  164. this.model.id = this.id;
  165. this.$u.api.editAddr(this.model).then(res=>{
  166. // console.log('res',res);
  167. uni.$u.route('/center/addrlist', {
  168. type: 'redirectTo'
  169. });
  170. }).catch(err=>{
  171. console.log('addAddr',err.data);
  172. })
  173. }
  174. }
  175. }
  176. </script>
  177. <style>
  178. page{
  179. background-color: #F5F5F5;
  180. }
  181. </style>
  182. <style lang="scss" scoped>
  183. .set-default{
  184. margin-top: 20rpx;
  185. .til{
  186. font-size: 30rpx;
  187. font-weight: 600;
  188. margin-bottom: 8rpx;
  189. }
  190. .tip{
  191. font-size: 24rpx;
  192. color: #999;
  193. }
  194. }
  195. .full-btn{
  196. margin-top: 44rpx;
  197. }
  198. </style>