addrForm.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. if(page.backUrl){
  119. this.backUrl = decodeURIComponent(page.backUrl);
  120. }
  121. },
  122. onReady() {
  123. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  124. this.$refs.uForm.setRules(this.rules)
  125. },
  126. methods: {
  127. closePicker(){
  128. this.show = false
  129. },
  130. defaultChange(e){
  131. console.log('defaultChange',e)
  132. },
  133. showRegionPicker() {
  134. // this.showMap = true;
  135. uni.$u.route('/center/map');
  136. },
  137. getAddrById(id){
  138. this.$u.api.getAddrById({id:id}).then(res=>{
  139. console.log('getAddrByIdres',res.data);
  140. const { receiveName, receivePhone, receiveAdress, address, ifDefault } = res.data;
  141. Object.assign(this.model, { receiveName, receivePhone, receiveAdress, address, ifDefault });
  142. }).catch(err=>{
  143. console.log('getAddrById',err);
  144. })
  145. },
  146. submit() {
  147. this.$refs.uForm.validate().then(res => {
  148. console.log('this.model',this.model);
  149. // uni.$u.toast('校验通过')
  150. if(this.saveType=='edit'){
  151. this.editAddr()
  152. }else{
  153. this.addAddr()
  154. }
  155. }).catch(errors => {
  156. uni.$u.toast('校验失败')
  157. })
  158. },
  159. addAddr(){
  160. let that = this;
  161. this.$u.api.addAddr(this.model).then(res=>{
  162. uni.$u.toast('保存成功')
  163. setTimeout(()=>{
  164. if(that.backUrl){
  165. console.log('that.backUrl',that.backUrl);
  166. uni.$u.route(that.backUrl, {});
  167. }else{
  168. uni.$u.route('/center/addrlist', {
  169. type: 'redirectTo'
  170. });
  171. }
  172. },1500)
  173. }).catch(err=>{
  174. console.log('addAddr',err.data);
  175. })
  176. },
  177. editAddr(){
  178. this.model.id = this.id;
  179. this.$u.api.editAddr(this.model).then(res=>{
  180. uni.$u.toast('保存成功')
  181. // console.log('res',res);
  182. setTimeout(()=>{
  183. uni.$u.route('/center/addrlist', {
  184. type: 'redirectTo'
  185. });
  186. },1500)
  187. }).catch(err=>{
  188. console.log('addAddr',err.data);
  189. })
  190. }
  191. }
  192. }
  193. </script>
  194. <style>
  195. page{
  196. background-color: #F5F5F5;
  197. }
  198. </style>
  199. <style lang="scss" scoped>
  200. .set-default{
  201. margin-top: 20rpx;
  202. .til{
  203. font-size: 30rpx;
  204. font-weight: 600;
  205. margin-bottom: 8rpx;
  206. }
  207. .tip{
  208. font-size: 24rpx;
  209. color: #999;
  210. }
  211. }
  212. .full-btn{
  213. margin-top: 44rpx;
  214. }
  215. </style>