You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
11 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. <template>
  2. <view class="container">
  3. <view class="address-info ">
  4. <u--form labelPosition="left" ref="uForm">
  5. <u-form-item required label="联系人" prop="addressInfo.name" labelWidth="120" borderBottom>
  6. <u--input v-model="addressInfo.name" placeholder="请输入联系人姓名" placeholderStyle="text-align:right;color:#AAA" border="none" inputAlign="right"></u--input>
  7. </u-form-item>
  8. <u-form-item required label="手机号码" prop="addressInfo.phone" labelWidth="120" borderBottom>
  9. <u--input v-model="addressInfo.phone" placeholder="请输入手机号码" placeholderStyle="text-align:right;color:#AAA" border="none" inputAlign="right"></u--input>
  10. </u-form-item>
  11. <u-form-item label="应急联络" prop="addressInfo.emergencyPhone" labelWidth="120" borderBottom>
  12. <u--input v-model="addressInfo.emergencyPhone" placeholder="请输入应急联络号码" placeholderStyle="text-align:right;color:#AAA" border="none" inputAlign="right"></u--input>
  13. </u-form-item>
  14. <!-- <u-form-item label="所在城市" prop="addressInfo.city" labelWidth="120" borderBottom>
  15. <picker mode="multiSelector" @columnchange="columnchange" @change="bindMultiPickerColumnChange" :value="multiIndex"
  16. :range="multiArray">
  17. <view style="display: flex;justify-content: space-between;">
  18. <u--input :value="addressInfo.city? (addressInfo.city +' '+ addressInfo.district):''"
  19. disabled disabledColor="#ffffff" placeholder="请选择所在城市"
  20. placeholderStyle="text-align:right;color:#AAA" border="none" inputAlign="right">
  21. </u--input>
  22. <u-icon slot="right" name="arrow-right" color="#AAA"></u-icon>
  23. </view>
  24. </picker>
  25. </u-form-item> -->
  26. <u-form-item label="所在地区" prop="addressInfo.city" labelWidth="120" borderBottom>
  27. <view style="display: flex;justify-content: space-between;" @click="selectAddress">
  28. <u--input :value="addressInfo.selectAddress"
  29. disabled disabledColor="#ffffff" placeholder="请选择所在地区"
  30. placeholderStyle="text-align:right;color:#AAA" border="none" inputAlign="right">
  31. </u--input>
  32. <u-icon slot="right" name="arrow-right" color="#AAA"></u-icon>
  33. </view>
  34. </u-form-item>
  35. <u-form-item label="详细地址" prop="addressInfo.detailAddress" labelWidth="120" borderBottom>
  36. <u--input v-model="addressInfo.detailAddress" placeholder="如楼栋、门牌号" placeholderStyle="text-align:right;color:#AAA;" border="none" inputAlign="right"></u--input>
  37. </u-form-item>
  38. <u-form-item label="设为默认地址" prop="addressInfo.isDefault" labelWidth="120">
  39. <view>
  40. <u-radio-group :value="addressInfo.isDefault?'默认':''" placement="column" @change="groupChange">
  41. <u-radio name="默认" activeColor="#ffbf60" labelColor="#ffbf60" label="默认"></u-radio>
  42. </u-radio-group>
  43. </view>
  44. </u-form-item>
  45. </u--form>
  46. </view>
  47. <view class="address-save">
  48. <button class="address-save-btn" @click="save" :loading="loading">保存</button>
  49. </view>
  50. </view>
  51. </template>
  52. <script>
  53. import {
  54. getCity
  55. } from '@/api/system/user.js'
  56. import {
  57. getAddressDetails,addAddress,updateAddress
  58. } from '@/api/system/address.js'
  59. export default{
  60. data(){
  61. return{
  62. loading:false,
  63. addressInfo:{
  64. name:"",
  65. phone:"",
  66. emergencyPhone:"",
  67. province:"",
  68. city:"",
  69. district:"",
  70. detailAddress:"",
  71. openId:"",
  72. isDefault:0,
  73. latitude:"",
  74. longitude:"",
  75. selectAddress:""
  76. },
  77. multiArray: [],
  78. cityList:[],
  79. multiIndex: [0, 0],
  80. addressId:'',
  81. }
  82. },
  83. onLoad(option) {
  84. this.optionType=option.optionType;
  85. if(this.optionType=='edit'){
  86. this.addressId=option.addressId;
  87. this.getAddressDetails(option.addressId);
  88. }
  89. },
  90. mounted() {
  91. this.getCityList()
  92. },
  93. methods:{
  94. getAddressDetails(id){
  95. getAddressDetails(id).then(res=>{
  96. if(res&& res.id){
  97. const {
  98. name,
  99. phone,
  100. emergencyPhone,
  101. province,
  102. city,
  103. district,
  104. detailAddress,
  105. openId,
  106. isDefault,
  107. latitude,
  108. longitude,
  109. } = res;
  110. this.addressInfo = {
  111. name,
  112. phone,
  113. emergencyPhone,
  114. province,
  115. city,
  116. district,
  117. detailAddress,
  118. openId,
  119. isDefault,
  120. latitude,
  121. longitude,
  122. selectAddress: `${province}${city}${district}`,
  123. };
  124. }else{
  125. this.$modal.showToast('获取地址详情失败')
  126. }
  127. })
  128. },
  129. // 选择地区
  130. selectAddress(){
  131. uni.chooseLocation({
  132. success: res => {
  133. this.addressInfo.latitude = res.latitude
  134. this.addressInfo.longitude = res.longitude
  135. var reg = /.+?(省|市|自治区|自治州|县|区)/g;
  136. let address = ''
  137. if (!res.address && res.name) { //用户直接选择城市的逻辑
  138. address = res.name
  139. }
  140. if (res.address || res.name) {
  141. address = res.address + res.name
  142. }
  143. if(!address){
  144. return
  145. }
  146. let arr = address.match(reg)
  147. this.addressInfo.province = arr[0] || ''
  148. this.addressInfo.city = arr[1] || ''
  149. this.addressInfo.district = arr[2] || ''
  150. let detail = arr[2] || arr[1] || arr[0] || ''
  151. this.addressInfo.detailAddress = address.substring(address.indexOf(detail) + detail.length)
  152. this.addressInfo.selectAddress = `${arr[0] || ''}${arr[1] || ''}${arr[2] || ''}`
  153. return
  154. // console.log(res);
  155. // this.addressInfo.latitude = res.latitude
  156. // this.addressInfo.longitude = res.longitude
  157. // // this.addressInfo.district = ''
  158. // // this.addressInfo.province = ''
  159. // var reg = /.+?(省|市|自治区|自治州|县|区)/g;
  160. // let arr = res.address.match(reg)
  161. // // var add1 = '四川省成都市都江堰市天马镇34号';
  162. // // var add2 = '北京市北京市东城区前门大街1号'
  163. // // var add3 = '新疆维吾尔自治区乌鲁木齐市天山区中山路479号';
  164. // // var add4 = '四川省成都市双流县幸福社区23号';
  165. // // var add5 = '香港特别行政区中西区尖沙嘴路';
  166. // // console.log(add1 + ': ', add1.match(reg));
  167. // // console.log(add2 + ': ', add2.match(reg));
  168. // // console.log(add3 + ': ', add3.match(reg));
  169. // // console.log(add4 + ': ', add4.match(reg));
  170. // // console.log(add5 + ': ', add5.match(reg));
  171. // this.addressInfo.province = arr[0]
  172. // this.addressInfo.city = arr[1]
  173. // this.addressInfo.district = arr[2]
  174. // if (!res.address && res.name) { //用户直接选择城市的逻辑
  175. // return this.addressInfo.selectAddress = res.name
  176. // }
  177. // if (res.address || res.name) {
  178. // return this.addressInfo.selectAddress = res.address + res.name
  179. // }
  180. // this.addressInfo.selectAddress = '' //用户啥都没选就点击勾选
  181. },
  182. fail(e) {
  183. console.log("获取位置信息失败!", e)
  184. }
  185. })
  186. },
  187. save(){
  188. let params = this.addressInfo
  189. if(params.phone){
  190. if(!(/^1[3456789]\d{9}$/.test(params.phone))){
  191. this.$modal.showToast('手机号码有误')
  192. return false;
  193. }
  194. } else {
  195. this.$modal.showToast('请输入手机号')
  196. return false;
  197. }
  198. if(params.emergencyPhone){
  199. if(!(/^1[3456789]\d{9}$/.test(params.emergencyPhone))){
  200. this.$modal.showToast('手机号码有误')
  201. return false;
  202. }
  203. }
  204. if(!params.name){
  205. this.$modal.showToast('请输入联系人')
  206. return false;
  207. }
  208. // 所在地区与详细地址必填校验
  209. if(!params.province && !params.city && !params.district){
  210. this.$modal.showToast('请选择所在地区')
  211. return false;
  212. }
  213. // 需具备定位信息(经纬度)
  214. if(!params.latitude || !params.longitude){
  215. this.$modal.showToast('定位信息缺失,请重新选择所在地区')
  216. this.addressInfo.province = ''
  217. this.addressInfo.city = ''
  218. this.addressInfo.district = ''
  219. this.addressInfo.selectAddress = ''
  220. return false;
  221. }
  222. if(!params.detailAddress){
  223. this.$modal.showToast('请输入详细地址')
  224. return false;
  225. }
  226. this.loading=true
  227. console.log(params);
  228. if(this.optionType=='edit'){
  229. params.id = this.addressId;
  230. updateAddress(params).then(res=>{
  231. if(res&&res==1){
  232. setTimeout(() => {
  233. let len = getCurrentPages().length;
  234. this.loading=false
  235. if(len >= 2) {
  236. uni.navigateBack();
  237. }else {
  238. uni.redirectTo({url:'/pages/personalCenter/address'});
  239. }
  240. }, 2000);
  241. }else {
  242. this.loading=false
  243. this.$modal.showToast('更新地址失败')
  244. }
  245. })
  246. } else if(this.optionType=='add'){
  247. addAddress(params).then(res=>{
  248. if(res&&res>0){
  249. setTimeout(() => {
  250. let len = getCurrentPages().length;
  251. this.loading=false
  252. if(len >= 2) {
  253. uni.navigateBack();
  254. }else {
  255. uni.redirectTo({url:'/pages/personalCenter/address'});
  256. }
  257. }, 2000);
  258. }else {
  259. this.loading=false
  260. this.$modal.showToast('新增地址失败')
  261. }
  262. })
  263. }
  264. },
  265. getCityList() {
  266. getCity().then(res => {
  267. if (res.code == 200) {
  268. console.log('city', JSON.parse(res.msg));
  269. this.cityList = JSON.parse(res.msg)
  270. const cityLabels = this.cityList.map(item =>item.city)
  271. this.multiArray[0] = cityLabels
  272. this.multiArray[1] = this.cityList[0].region.map(e=> e.region)
  273. } else {
  274. this.$modal.showToast('获取城市失败,请联系系统管理员!');
  275. }
  276. })
  277. },
  278. columnchange(e){
  279. console.log(e)
  280. // 当滚动切换一级分类时,为当前的一级分类添加它的子类
  281. if (e.detail.column == 0) {
  282. const currentCity = this.cityList[e.detail.value]
  283. // #ifdef H5
  284. // 在小程序中直接赋值无效 H5 可直接赋值
  285. this.multiArray[1] = currentCity.region.map(e=>e.region)
  286. // #endif
  287. // #ifdef MP-WEIXIN
  288. // 在 H5 环境下 $set 会导致一级分类无法滚动, 小程序正常运行
  289. this.$set(this.multiArray, 1, currentCity.region.map(e=>e.region))
  290. // #endif
  291. this.multiIndex=[e.detail.value,0]
  292. }
  293. },
  294. bindMultiPickerColumnChange(e) {
  295. console.log('值为:' + e.detail.value)
  296. this.multiIndex = e.detail.value
  297. this.addressInfo.province = this.multiArray[0][this.multiIndex[0]]
  298. this.addressInfo.city = this.multiArray[0][this.multiIndex[0]]
  299. this.addressInfo.district = this.multiArray[1][this.multiIndex[1]]
  300. this.isSelected = true
  301. this.$forceUpdate()
  302. },
  303. groupChange(n) {
  304. console.log('groupChange', n);
  305. this.addressInfo.isDefault=+(!this.addressInfo.isDefault)
  306. },
  307. }
  308. }
  309. </script>
  310. <style lang="scss">
  311. .container {
  312. position: relative;
  313. height: 100%;
  314. padding-bottom: 90px;
  315. .address-save {
  316. background-color: #FFFFFF;
  317. padding: 10px 20px 40px;
  318. width: 100%;
  319. height: 90px;
  320. position: fixed;
  321. bottom: 0;
  322. z-index: 100;
  323. .address-save-btn {
  324. width: 100%;
  325. border-radius: 6px;
  326. background: #FFB13F;
  327. font-size: 16px;
  328. color: #FFFFFF;
  329. }
  330. }
  331. }
  332. .address-info{
  333. background-color: #fff;
  334. padding: 10px 20px;
  335. .u-radio-group{
  336. float: right;
  337. }
  338. }
  339. </style>