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

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 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>