addrForm.vue 5.3 KB

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