index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <view class="addaddress">
  3. <!-- header -->
  4. <cu-custom isBack bgColor="bg-gradual-blue">
  5. <view slot="content">{{ status ? '修改地址' : '新增地址' }}</view>
  6. </cu-custom>
  7. <!-- section -->
  8. <view class="section">
  9. <form>
  10. <view class="cu-form-group">
  11. <view class="title">姓名</view>
  12. <input :value="name" @input="e => (name = e.detail.value)" placeholder="收货人姓名" />
  13. </view>
  14. <view class="cu-form-group">
  15. <view class="title">电话</view>
  16. <input @input="e => (tel = e.detail.value)" placeholder="收货人电话" />
  17. <view class="cu-capsule radius">
  18. <view class="cu-tag bg-blue">+86</view>
  19. <view class="cu-tag line-blue">中国大陆</view>
  20. </view>
  21. </view>
  22. <view class="cu-form-group">
  23. <view class="title">收货地址</view>
  24. <picker mode="region" @change="e => (region = e.detail.value)" :value="region">
  25. <view v-if="region.length > 0" class="picker">{{ region[0] }},{{ region[1] }},{{ region[2] }}</view>
  26. <view v-else class="text-grey picker">选择省 / 市 / 区</view>
  27. </picker>
  28. </view>
  29. <view class="cu-form-group align-start">
  30. <view class="title">详细地址</view>
  31. <textarea maxlength="-1" :value="textarea" @input="e => (textarea = e.detail.value)" placeholder="街道门牌/楼层房间号等信息"></textarea>
  32. <text @click="addSelect" class="margin-left margin-top cuIcon-locationfill text-orange"></text>
  33. </view>
  34. <view class="cu-form-group">
  35. <view class="title">设置为默认收货地址</view>
  36. <switch @change="e => (checked = e.detail.value)" :checked="checked"></switch>
  37. </view>
  38. </form>
  39. </view>
  40. <!-- footer -->
  41. <view class="footer">
  42. <view class="footer-content padding bg-white">
  43. <button @click="handler" class="cu-btn block">
  44. <text v-if="lock" class="cuIcon-loading2 iconfont-spin"></text>
  45. 保存
  46. </button>
  47. </view>
  48. </view>
  49. <!-- 工具 -->
  50. <cu-modalA title="警告" :show.sync="show" :content="content" />
  51. </view>
  52. </template>
  53. <script>
  54. import { getSetting, openSetting, chooseLocation } from '@/common/device/index.js';
  55. import api from "./api.js";
  56. export default {
  57. data() {
  58. return {
  59. status: false, //false 新增 true 修改
  60. lock: false,
  61. show: false,
  62. content: '',
  63. // 参数
  64. id:'',
  65. name: '',
  66. tel: '',
  67. checked: false,
  68. region: [],
  69. textarea: ''
  70. };
  71. },
  72. methods: {
  73. // 保存
  74. async handler() {
  75. if (this.lock) return false;
  76. let yarn=this.yarn();
  77. if(yarn) return false;
  78. let { name, tel, checked, region, textarea } = this;
  79. if(region.length==0){
  80. this.show=true,
  81. this.content="请选择收货地址!";
  82. return false;
  83. }
  84. // 增加
  85. var result ;
  86. this.lock=true;
  87. if(this.status){
  88. result= await api.updateList({id:this.id,name,tel,default:checked,address:textarea,province:region[0],city:region[1],area:region[2]});
  89. }else{
  90. result=await api.addList({name,tel,default:checked,address:textarea,province:region[0],city:region[1],area:region[2]})
  91. }
  92. this.lock=false;
  93. if(result.code==0){
  94. uni.navigateBack({
  95. delta:1
  96. })
  97. }
  98. },
  99. // 验证
  100. yarn(){
  101. let rules = {
  102. name: [
  103. {
  104. required: true,
  105. message: '收货人姓名不能为空!'
  106. }
  107. ],
  108. tel: [
  109. {
  110. required: true,
  111. message: '收货人电话不能为空!'
  112. },
  113. {
  114. reg: /^1[3,4,5,6,7,8,9][0-9]{9}$/,
  115. message: '收货人电话格式不正确!'
  116. }
  117. ],
  118. textarea: [
  119. {
  120. required: true,
  121. message: '详细地址不能为空!'
  122. }
  123. ]
  124. };
  125. return Object.keys(rules).some(item=>{
  126. return rules[item].some(it=>{
  127. if((it.required && !this[item]) || (it.reg && !it.reg.test(this[item]))) {
  128. this.show=true,
  129. this.content=it.message;
  130. return true;
  131. }
  132. return false;
  133. })
  134. })
  135. },
  136. // 纤细地址定位
  137. async addSelect() {
  138. try {
  139. var address;
  140. var res = await getSetting();
  141. if (res.authSetting['scope.userLocation'] === false) {
  142. let result = await openSetting();
  143. if (result.authSetting['scope.userLocation'] === true) address = await chooseLocation();
  144. }
  145. if (res.authSetting['scope.userLocation.userLocation'] === undefined || result.authSetting['scope.userLocation.userLocation'] === true) {
  146. address = await chooseLocation();
  147. }
  148. this.textarea = address.address;
  149. } catch (err) {
  150. console.log(err.message);
  151. }
  152. }
  153. },
  154. onLoad(options) {
  155. let { data } = options;
  156. if(data){
  157. data=JSON.parse(data);
  158. Object.keys(data).forEach(item=>this[item]=data[item])
  159. this.status=true;
  160. }else{
  161. this.status=false;
  162. }
  163. }
  164. };
  165. </script>
  166. <style lang="scss" scoped>
  167. .addaddress {
  168. .footer {
  169. height: 140upx;
  170. height: calc(140rpx + env(safe-area-inset-bottom) / 2);
  171. padding-bottom: calc(env(safe-area-inset-bottom) / 2);
  172. .footer-content {
  173. position: fixed;
  174. bottom: 0;
  175. left: 0;
  176. width: 100%;
  177. button {
  178. background-color: #ee0a24;
  179. color: #fff;
  180. height: 80upx;
  181. border-radius: 80upx;
  182. }
  183. }
  184. }
  185. }
  186. </style>