addrForm.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. fromPage:'',
  57. saveType:'',
  58. id:'',
  59. showMap:false,
  60. model: {
  61. receiveName:'',
  62. receivePhone:'',
  63. receiveAdress:'',
  64. address:'',
  65. ifDefault:0,
  66. },
  67. rules:{
  68. 'receiveName': {
  69. type: 'string',
  70. required: true,
  71. message: '请填写姓名',
  72. trigger: ['blur', 'change']
  73. },
  74. receivePhone: [
  75. {
  76. required: true,
  77. message: '请输入手机号',
  78. trigger: ['change','blur'],
  79. },
  80. {
  81. // 自定义验证函数,见上说明
  82. validator: (rule, value, callback) => {
  83. // 上面有说,返回true表示校验通过,返回false表示不通过
  84. // uni.$u.test.mobile()就是返回true或者false的
  85. return uni.$u.test.mobile(value);
  86. },
  87. message: '手机号码不正确',
  88. // 触发器可以同时用blur和change
  89. trigger: ['change','blur'],
  90. }
  91. ],
  92. 'receiveAdress': {
  93. type: 'string',
  94. required: true,
  95. message: '请选择所在地区',
  96. trigger: ['blur', 'change']
  97. },
  98. 'address': {
  99. type: 'string',
  100. required: true,
  101. message: '请填详细地址',
  102. trigger: ['blur', 'change']
  103. },
  104. }
  105. }
  106. },
  107. onShow() {
  108. },
  109. onLoad(page) {
  110. console.log('page',page);
  111. this.saveType = page.type;
  112. this.id = page.id;
  113. if(this.id){
  114. this.getAddrById(this.id)
  115. }
  116. this.fromPage = page.from;
  117. this.backUrl = page.backUrl;
  118. },
  119. onReady() {
  120. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  121. this.$refs.uForm.setRules(this.rules)
  122. },
  123. methods: {
  124. closePicker(){
  125. this.show = false
  126. },
  127. defaultChange(e){
  128. console.log('defaultChange',e)
  129. },
  130. showRegionPicker() {
  131. // this.showMap = true;
  132. uni.$u.route('/center/map');
  133. },
  134. getAddrById(id){
  135. this.$u.api.getAddrById({id:id}).then(res=>{
  136. console.log('getAddrByIdres',res.data);
  137. const { receiveName, receivePhone, receiveAdress, address, ifDefault } = res.data;
  138. Object.assign(this.model, { receiveName, receivePhone, receiveAdress, address, ifDefault });
  139. }).catch(err=>{
  140. console.log('getAddrById',err);
  141. })
  142. },
  143. submit() {
  144. this.$refs.uForm.validate().then(res => {
  145. console.log('this.model',this.model);
  146. // uni.$u.toast('校验通过')
  147. if(this.saveType=='edit'){
  148. this.editAddr()
  149. }else{
  150. this.addAddr()
  151. }
  152. }).catch(errors => {
  153. uni.$u.toast('校验失败')
  154. })
  155. },
  156. addAddr(){
  157. this.$u.api.addAddr(this.model).then(res=>{
  158. // console.log('res',res);
  159. if(this.backUrl){
  160. uni.$u.route(this.backUrl, {
  161. // type: 'redirectTo'
  162. });
  163. }else{
  164. uni.$u.route('/center/addrlist', {
  165. type: 'redirectTo'
  166. });
  167. }
  168. }).catch(err=>{
  169. console.log('addAddr',err.data);
  170. })
  171. },
  172. editAddr(){
  173. this.model.id = this.id;
  174. this.$u.api.editAddr(this.model).then(res=>{
  175. // console.log('res',res);
  176. uni.$u.route('/center/addrlist', {
  177. type: 'redirectTo'
  178. });
  179. }).catch(err=>{
  180. console.log('addAddr',err.data);
  181. })
  182. }
  183. }
  184. }
  185. </script>
  186. <style>
  187. page{
  188. background-color: #F5F5F5;
  189. }
  190. </style>
  191. <style lang="scss" scoped>
  192. .set-default{
  193. margin-top: 20rpx;
  194. .til{
  195. font-size: 30rpx;
  196. font-weight: 600;
  197. margin-bottom: 8rpx;
  198. }
  199. .tip{
  200. font-size: 24rpx;
  201. color: #999;
  202. }
  203. }
  204. .full-btn{
  205. margin-top: 44rpx;
  206. }
  207. </style>