userAddress.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. <template>
  2. <uni-popup ref="popup" type="bottom">
  3. <view class="Address_container">
  4. <div class="tit flex_r flex_jb">
  5. <text class="cancel" v-if="isadd" @click="isadd = false">取消</text>
  6. <text v-else></text>
  7. <text class="close" @click="close">关闭</text>
  8. </div>
  9. <div class="s_con">
  10. <form @submit="formSubmit" v-if="isadd">
  11. <view class='addAddress'>
  12. <!-- <view class="pad30">
  13. <view class='default acea-row borderRadius15'>
  14. <textarea v-model="addressValue" placeholder="粘贴地址信息,自动拆分姓名、电话和地址" @blur="identify()" class="inputa-text" />
  15. </view>
  16. </view> -->
  17. <view class="pad30 mt-22">
  18. <view class='list borderRadius15'>
  19. <view class='item acea-row row-between-wrapper'>
  20. <view class='name'>姓名</view>
  21. <input type='text' placeholder='请输入姓名' v-model="userAddress.name" class="inputa" />
  22. </view>
  23. <view class='item acea-row row-between-wrapper'>
  24. <view class='name'>联系电话</view>
  25. <input type='number' placeholder='请输入联系电话' v-model='userAddress.mobile' class="inputa" />
  26. </view>
  27. <view class='item acea-row row-between-wrapper'>
  28. <view class='name'>所在地区</view>
  29. <input type='text' placeholder='请填写具体地址' v-model='userAddress.region' @click="btnClick" disabled class="inputa" />
  30. </view>
  31. <view class='item acea-row row-between-wrapper'>
  32. <view class='name'>详细地址</view>
  33. <input type='text' placeholder='请填写具体地址' v-model='userAddress.address' class="inputa" />
  34. </view>
  35. <view class='item acea-row'>
  36. <view class='name'>默认地址</view>
  37. <uni-data-checkbox v-model="is_default" :localdata="range"></uni-data-checkbox>
  38. </view>
  39. </view>
  40. </view>
  41. <button class='keepBnt bg-color' form-type="submit">立即保存</button>
  42. </view>
  43. </form>
  44. <div class="editaddress" v-else>
  45. <view class="addbar" @click="onadd">
  46. <text class="iconfont sp">&#xe760;</text>
  47. <text class="sp">添加地址</text>
  48. </view>
  49. <uni-swipe-action class="swipeAction">
  50. <uni-swipe-action-item class="swipeAction_item" v-for="(i,s) in addressList" :key="s">
  51. <view class="addressLi clearfix" @click="onSelect(i,s)">
  52. <view class="addressLi_l">
  53. <text v-if="i.id != presentId" class="iconfont">&#xe623;</text>
  54. <text v-else class="iconfont pitchOn">&#xe624;</text>
  55. </view>
  56. <view class="addressLi_r">
  57. <view class="user">
  58. <text class="name">{{i.name}}</text>
  59. <text>{{i.mobile}}</text>
  60. <text v-if="i.status == 1" class="defaultAddress">默认</text>
  61. </view>
  62. <view class="address">{{i.province + ' ' + i.city + ' ' + i.area + ' ' + i.street + ' ' + i.address}}</view>
  63. </view>
  64. </view>
  65. <template v-slot:right>
  66. <view class="btns clearfix">
  67. <view class="btn edit" @click="onedit(i)"><text class="iconfont">&#xe600;</text></view>
  68. <view class="btn del" @click="delAddress(i.id)"><text class="iconfont">&#xe601;</text></view>
  69. </view>
  70. </template>
  71. </uni-swipe-action-item>
  72. </uni-swipe-action>
  73. </div>
  74. </div>
  75. </view>
  76. <select-address :address.sync="address" ref='selectAddress' @change="changeAddress"/>
  77. </uni-popup>
  78. </template>
  79. <script>
  80. import { post } from "@/request/api.js";
  81. // import AddressParse from './zh-address-parse.min.js'
  82. // import smart from 'address-smart-parse'
  83. // import selectAddress from "@/components/selectAddress/selectAddress.vue"
  84. import selectAddress from "@/components/lcw-select-address/lcw-select-address.vue"
  85. let app = getApp();
  86. var appEv = app.$vm.$options;
  87. export default {
  88. components: {
  89. selectAddress
  90. },
  91. data() {
  92. return {
  93. userAddress: {}, //地址详情
  94. // addressValue: "",
  95. is_default: 0, //是否设为默认地址
  96. range: [{ "value": 0, "text": "否" }, { "value": 1, "text": "是" }],
  97. isadd: false,
  98. addressList: [],
  99. presentId: "", //当前选择地址的id
  100. address: {
  101. province: '',
  102. city: '',
  103. area: '',
  104. street: ''
  105. }
  106. }
  107. },
  108. created() {
  109. this.loadAddress();
  110. },
  111. methods: {
  112. btnClick() {
  113. this.$refs.selectAddress.open()
  114. },
  115. changeAddress(address){ //选择成功回调
  116. this.address = address;
  117. this.userAddress.region = ""
  118. for (const i in address) {
  119. if(i != "regional_code") this.userAddress.region += address[i] + " "
  120. }
  121. },
  122. // identify() {
  123. // if (this.addressValue) {
  124. // const da = smart(this.addressValue)
  125. // let {province,city,county,street} = da
  126. // street = street || ''
  127. // let obj = {
  128. // name: da.name,
  129. // mobile: da.phone,
  130. // address: da.address,
  131. // region: province + ' ' + city + ' ' + county + ' ' + street
  132. // }
  133. // this.address = { province,city,area: county,street }
  134. // this.$set(this,"userAddress",obj)
  135. // }
  136. // },
  137. formSubmit() {
  138. let url;
  139. let { address, mobile, name } = this.userAddress
  140. let data = {
  141. ...this.address,
  142. address, mobile, name,
  143. is_default: this.is_default
  144. }
  145. if (this.userAddress.id) {
  146. url = "user/editAddress";
  147. data.id = this.userAddress.id
  148. } else url = "user/addAddress";
  149. post(url, data).then(res => {
  150. if (res.code === 0) {
  151. appEv.errTips(res.msg);
  152. this.loadAddress();
  153. this.isadd = false;
  154. }
  155. })
  156. },
  157. // 获取用户地址
  158. loadAddress() {
  159. post("v1/user/addressList").then(res => {
  160. if (res.code === 0) {
  161. this.addressList = res.data.data;
  162. }
  163. })
  164. },
  165. onSelect(i, s) {
  166. this.presentId = i.id;
  167. this.$emit('addressConfirm', i);
  168. this.close();
  169. },
  170. onadd() {
  171. this.isadd = true;
  172. this.userAddress = {};
  173. },
  174. onedit(da) {
  175. let {id,name,mobile,address,province,city,area,street,status, regional_code} = da
  176. this.userAddress = { id,name,mobile,address };
  177. this.address = { province,city,area,street, regional_code };
  178. this.userAddress.region = province + ' ' + city + ' ' + area + ' ' + street;
  179. this.is_default = status
  180. this.isadd = true
  181. },
  182. delAddress(id) {
  183. post("v1/user/delAddress", { id }).then(res => {
  184. if (res.code === 0) {
  185. appEv.errTips(res.msg);
  186. this.loadAddress();
  187. }
  188. })
  189. },
  190. open(da) {
  191. this.$refs.popup.open('bottom')
  192. if (da == "add") this.isadd = true
  193. else {
  194. this.isadd = false;
  195. this.presentId = da;
  196. }
  197. },
  198. close() {
  199. this.$refs.popup.close()
  200. }
  201. },
  202. }
  203. </script>
  204. <style lang="scss" scoped>
  205. .inputa-text{
  206. width: 100%;
  207. height: 160rpx;
  208. border: 1px solid #c0b5b5;
  209. border-radius: 16rpx;
  210. padding: 12rpx;
  211. }
  212. .Address_container {
  213. // height: 70vh;
  214. min-height: 70vh;
  215. background-color: #f5f5f5;
  216. border-radius: 30rpx 30rpx 0 0;
  217. overflow: hidden;
  218. }
  219. .tit {
  220. height: 100rpx;
  221. line-height: 100rpx;
  222. background: #fff;
  223. border-radius: 30rpx 30rpx 0 0;
  224. color: #333;
  225. .cancel {
  226. padding: 0 30rpx;
  227. }
  228. .close {
  229. // float: right;
  230. padding: 0 30rpx;
  231. }
  232. }
  233. .s_con {
  234. height: calc(100% - 100rpx);
  235. // overflow-y: auto;
  236. padding-top: 20rpx;
  237. .pad30 {
  238. padding: 0 30rpx
  239. }
  240. .p_center {
  241. text-align: center;
  242. }
  243. .acea-row {
  244. display: flex;
  245. }
  246. .row-middle {
  247. align-items: center
  248. }
  249. .row-between-wrapper {
  250. align-items: center;
  251. justify-content: space-between
  252. }
  253. .borderRadius15 {
  254. border-radius: 15rpx !important;
  255. }
  256. }
  257. .addAddress {
  258. width: 100%;
  259. .list {
  260. background-color: #fff;
  261. .item {
  262. padding: 30rpx;
  263. border-top: 1rpx solid #eee;
  264. // position: relative;
  265. .icon-dizhi {
  266. font-size: 36rpx !important;
  267. }
  268. .name {
  269. width: 180rpx;
  270. font-size: 30rpx;
  271. color: #333;
  272. }
  273. .address {
  274. flex: 1;
  275. }
  276. input {
  277. flex: 1;
  278. font-size: 0 30rpx;
  279. }
  280. }
  281. }
  282. .default {
  283. padding: 30rpx;
  284. background-color: #fff;
  285. }
  286. .keepBnt {
  287. width: 690rpx;
  288. height: 86rpx;
  289. border-radius: 50rpx;
  290. text-align: center;
  291. line-height: 86rpx;
  292. margin: 50rpx auto;
  293. font-size: 32rpx;
  294. color: #fff;
  295. }
  296. }
  297. .placeholder {
  298. color: #ccc;
  299. }
  300. .mt-22 {
  301. margin-top: 22rpx;
  302. }
  303. .bg-color {
  304. background-color: #2DB389;
  305. }
  306. .addbar {
  307. background: #fff;
  308. text-align: center;
  309. margin-bottom: 20rpx;
  310. padding: 36rpx 0;
  311. .iconfont {
  312. font-size: 46rpx;
  313. margin-right: 20rpx;
  314. }
  315. .sp {
  316. vertical-align: middle;
  317. }
  318. }
  319. .swipeAction {
  320. font-size: 28rpx;
  321. .addressLi {
  322. .addressLi_l {
  323. width: 80rpx;
  324. height: 80rpx;
  325. display: flex;
  326. align-items: center;
  327. .iconfont {
  328. color: #666;
  329. font-size: 38rpx;
  330. }
  331. .pitchOn {
  332. color: #1989fa;
  333. }
  334. }
  335. .addressLi_r {
  336. width: calc(100% - 80rpx);
  337. }
  338. .addressLi_l,
  339. .addressLi_r {
  340. float: left;
  341. }
  342. .user {
  343. margin-bottom: 10rpx;
  344. }
  345. .name {
  346. font-size: 32rpx;
  347. margin-right: 10rpx;
  348. }
  349. .address {
  350. font-size: 24rpx;
  351. color: #999;
  352. padding: 0;
  353. }
  354. }
  355. // .swipeAction_item {
  356. // background: #fff;
  357. // margin-bottom: 20rpx;
  358. // }
  359. .btns {
  360. .btn {
  361. float: left;
  362. display: flex;
  363. justify-content: center;
  364. align-items: center;
  365. height: 100%;
  366. padding: 0 30rpx;
  367. color: #fff;
  368. font-size: 36rpx;
  369. }
  370. .edit {
  371. background: rgba(25, 137, 250, 0.5);
  372. }
  373. .del {
  374. background: rgba(238, 10, 36, 0.5);
  375. }
  376. .iconfont {
  377. color: #fff;
  378. }
  379. }
  380. }
  381. ::v-deep .uni-swipe_box {
  382. padding: 20rpx 30rpx;
  383. background: #fff;
  384. margin-bottom: 20rpx;
  385. }
  386. .defaultAddress {
  387. border: 1rpx solid #2DB389;
  388. color: #2DB389;
  389. border-radius: 6rpx;
  390. font-size: 18rpx;
  391. padding: 0 6rpx;
  392. margin-left: 20rpx;
  393. }
  394. </style>