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.

301 lines
9.0 KiB

1 week ago
1 week ago
1 week ago
1 week ago
1 week 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.city"
  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. },
  74. multiArray: [],
  75. cityList:[],
  76. multiIndex: [0, 0],
  77. addressId:'',
  78. }
  79. },
  80. onLoad(option) {
  81. this.optionType=option.optionType;
  82. if(this.optionType=='edit'){
  83. this.addressId=option.addressId;
  84. this.getAddressDetails(option.addressId);
  85. }
  86. },
  87. mounted() {
  88. this.getCityList()
  89. },
  90. methods:{
  91. getAddressDetails(id){
  92. getAddressDetails(id).then(res=>{
  93. if(res&& res.id){
  94. const {
  95. name,
  96. phone,
  97. emergencyPhone,
  98. province,
  99. city,
  100. district,
  101. detailAddress,
  102. openId,
  103. isDefault
  104. } = res;
  105. this.addressInfo = {
  106. name,
  107. phone,
  108. emergencyPhone,
  109. province,
  110. city,
  111. district,
  112. detailAddress,
  113. openId,
  114. isDefault
  115. };
  116. }else{
  117. this.$modal.showToast('获取地址详情失败')
  118. }
  119. })
  120. },
  121. // 选择地区
  122. selectAddress(){
  123. uni.chooseLocation({
  124. success: res => {
  125. this.addressInfo.latitude = res.latitude
  126. this.addressInfo.longitude = res.longitude
  127. var reg = /.+?(省|市|自治区|自治州|县|区)/g;
  128. let arr = res.address.match(reg)
  129. this.addressInfo.province = arr[0]
  130. this.addressInfo.city = arr[1]
  131. this.addressInfo.district = arr[2]
  132. if (!res.address && res.name) { //用户直接选择城市的逻辑
  133. return this.addressInfo.selectAddress = res.name
  134. }
  135. if (res.address || res.name) {
  136. return this.addressInfo.selectAddress = res.address + res.name
  137. }
  138. this.addressInfo.selectAddress = '' //用户啥都没选就点击勾选
  139. },
  140. fail(e) {
  141. console.log("获取位置信息失败!", e)
  142. }
  143. })
  144. },
  145. save(){
  146. let params = this.addressInfo
  147. if(params.phone){
  148. if(!(/^1[3456789]\d{9}$/.test(params.phone))){
  149. this.$modal.showToast('手机号码有误')
  150. return false;
  151. }
  152. } else {
  153. this.$modal.showToast('请输入手机号')
  154. return false;
  155. }
  156. if(params.emergencyPhone){
  157. if(!(/^1[3456789]\d{9}$/.test(params.emergencyPhone))){
  158. this.$modal.showToast('手机号码有误')
  159. return false;
  160. }
  161. }
  162. if(!params.name){
  163. this.$modal.showToast('请输入联系人')
  164. return false;
  165. }
  166. this.loading=true
  167. if(this.optionType=='edit'){
  168. params.id = this.addressId;
  169. updateAddress(params).then(res=>{
  170. if(res&&res==1){
  171. this.$globalData.newOrderData.currentAddress={
  172. id:params.id,
  173. name:params.name,
  174. phone:params.phone,
  175. province:params.province,
  176. city:params.city,
  177. district:params.district,
  178. detailAddress:params.detailAddress,
  179. }
  180. this.loading=false
  181. uni.redirectTo({
  182. url: `/pages/newOrder/serviceNew`
  183. });
  184. }else {
  185. this.loading=false
  186. this.$modal.showToast('更新地址失败')
  187. }
  188. })
  189. } else if(this.optionType=='add'){
  190. addAddress(params).then(res=>{
  191. if(res&&res>0){
  192. this.$globalData.newOrderData.currentAddress={
  193. id:res,
  194. name:params.name,
  195. phone:params.phone,
  196. province:params.province,
  197. city:params.city,
  198. district:params.district,
  199. detailAddress:params.detailAddress,
  200. }
  201. this.loading=false
  202. uni.redirectTo({
  203. url: `/pages/newOrder/serviceNew`
  204. });
  205. }else {
  206. this.loading=false
  207. this.$modal.showToast('新增地址失败')
  208. }
  209. })
  210. }
  211. },
  212. getCityList() {
  213. getCity().then(res => {
  214. if (res.code == 200) {
  215. console.log('city', JSON.parse(res.msg));
  216. this.cityList = JSON.parse(res.msg)
  217. const cityLabels = this.cityList.map(item =>item.city)
  218. this.multiArray[0] = cityLabels
  219. this.multiArray[1] = this.cityList[0].region.map(e=> e.region)
  220. } else {
  221. this.$modal.showToast('获取城市失败,请联系系统管理员!');
  222. }
  223. })
  224. },
  225. columnchange(e){
  226. console.log(e)
  227. // 当滚动切换一级分类时,为当前的一级分类添加它的子类
  228. if (e.detail.column == 0) {
  229. const currentCity = this.cityList[e.detail.value]
  230. // #ifdef H5
  231. // 在小程序中直接赋值无效 H5 可直接赋值
  232. this.multiArray[1] = currentCity.region.map(e=>e.region)
  233. // #endif
  234. // #ifdef MP-WEIXIN
  235. // 在 H5 环境下 $set 会导致一级分类无法滚动, 小程序正常运行
  236. this.$set(this.multiArray, 1, currentCity.region.map(e=>e.region))
  237. // #endif
  238. this.multiIndex=[e.detail.value,0]
  239. }
  240. },
  241. bindMultiPickerColumnChange(e) {
  242. console.log('值为:' + e.detail.value)
  243. this.multiIndex = e.detail.value
  244. this.addressInfo.province = this.multiArray[0][this.multiIndex[0]]
  245. this.addressInfo.city = this.multiArray[0][this.multiIndex[0]]
  246. this.addressInfo.district = this.multiArray[1][this.multiIndex[1]]
  247. this.isSelected = true
  248. this.$forceUpdate()
  249. },
  250. groupChange(n) {
  251. console.log('groupChange', n);
  252. this.addressInfo.isDefault=+(!this.addressInfo.isDefault)
  253. },
  254. }
  255. }
  256. </script>
  257. <style lang="scss">
  258. .container {
  259. position: relative;
  260. height: 100%;
  261. padding-bottom: 90px;
  262. .address-save {
  263. background-color: #FFFFFF;
  264. padding: 10px 20px 40px;
  265. width: 100%;
  266. height: 90px;
  267. position: fixed;
  268. bottom: 0;
  269. z-index: 100;
  270. .address-save-btn {
  271. width: 100%;
  272. border-radius: 6px;
  273. background: #FFB13F;
  274. font-size: 16px;
  275. color: #FFFFFF;
  276. }
  277. }
  278. }
  279. .address-info{
  280. background-color: #fff;
  281. padding: 10px 20px;
  282. .u-radio-group{
  283. float: right;
  284. }
  285. }
  286. </style>