您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <template>
  2. <view class="form">
  3. <u-form label-width="132rpx" :model="state.formData" ref="uForm">
  4. <u-form-item label="收货人">
  5. <u-input placeholder="名字" :customStyle="btnGetCode" v-model="state.formData.consignee" maxlength="20" />
  6. </u-form-item>
  7. <u-form-item label="手机号">
  8. <u-input placeholder="手机号" :customStyle="btnGetCode" type="number" v-model="state.formData.consigneeTel"
  9. maxlength="11" />
  10. </u-form-item>
  11. <u-form-item label="所在地区">
  12. <picker mode="region" :value="state.formData.region" @change="regionConfirm">
  13. <view class="choice-picker">{{state.formData.region?state.formData.region:"请选择"}}</view>
  14. </picker>
  15. </u-form-item>
  16. <u-form-item label="详细地址">
  17. <u-input placeholder="小区楼栋/乡村名称" :customStyle="textareaStyle" v-model="state.formData.address" maxlength="50" />
  18. </u-form-item>
  19. <u-form-item v-if="!state.orderNo" label="邮政编码">
  20. <u-input placeholder="邮政编码" :customStyle="btnGetCode" v-model="state.formData.postalCode" type="number"
  21. maxlength="6" />
  22. </u-form-item>
  23. <view v-if="!state.orderNo" class="form-item forn-switch">
  24. <label>设置默认收货地址</label>
  25. <switch :checked="state.formData.defaultAddress==1" color="#004576" style="transform:scale(0.75)"
  26. @change="changeSwitch"></switch>
  27. </view>
  28. </u-form>
  29. <view class="action">
  30. <button type="default" class="btns" @click="savaHandle()">保存</button>
  31. <button v-if="!state.orderNo" type="default" class="btns del" @click="deleteHandle()">删除</button>
  32. </view>
  33. </view>
  34. </template>
  35. <script setup lang="ts">
  36. import {
  37. reactive
  38. } from "vue";
  39. import {
  40. onLoad
  41. } from "@dcloudio/uni-app";
  42. import {
  43. addressAdd,
  44. addressDeleteNew,
  45. upAdressQuery,
  46. updateAdress
  47. } from "@/utils/network/api.js";
  48. import {
  49. request, requestNew
  50. } from "@/utils/network/request.js";
  51. import {
  52. getItem,
  53. StorageKeys
  54. } from "@/utils/storage";
  55. import {
  56. msg
  57. } from "@/utils/utils";
  58. const btnGetCode = {
  59. background: "#F1F1F1",
  60. "border-radius": "20rpx",
  61. padding: "10rpx 20rpx",
  62. height: "40px",
  63. };
  64. const textareaStyle = {
  65. background: "#F1F1F1",
  66. "border-radius": "20rpx",
  67. padding: "20rpx 10rpx",
  68. };
  69. const state = reactive({
  70. formData: {
  71. consignee: "",
  72. consigneeTel: "",
  73. region: "",
  74. address: "",
  75. postalCode: "",
  76. defaultAddress: 2,
  77. openId: undefined,
  78. id: undefined,
  79. },
  80. orderNo: ''
  81. });
  82. //switch 事件
  83. const changeSwitch = (e : any) => {
  84. console.log(e);
  85. state.formData.defaultAddress = e.detail.value ? 1 : 2;
  86. console.log(state.formData);
  87. };
  88. // 选择地区回调
  89. const regionConfirm = (e : any) => {
  90. state.formData.region = e.detail.value[0] + e.detail.value[1] + e.detail.value[2];
  91. };
  92. const savaHandle = () => {
  93. state.formData.openId = getItem(StorageKeys.OpenId);
  94. if (state.orderNo) {
  95. editAddressFromOrder();
  96. } else {
  97. queryAddOrEditAddress(addressAdd, state.formData);
  98. }
  99. };
  100. const deleteHandle = () => {
  101. if (getItem(StorageKeys.OpenId)) {
  102. state.formData.openId = getItem(StorageKeys.OpenId);
  103. const options = {
  104. type: 2,
  105. data: state.formData,
  106. method: "POST",
  107. showLoading: true,
  108. };
  109. console.log(options, '删除请求参数');
  110. requestNew(addressDeleteNew, options).then((res) => {
  111. console.log(res, '删除');
  112. msg("删除地址成功");
  113. setTimeout(() => {
  114. uni.navigateBack({
  115. delta: 1,
  116. });
  117. }, 1500)
  118. });
  119. } else {
  120. uni.navigateTo({
  121. url: `/subpackage/orders/essential-information?del=1`
  122. });
  123. }
  124. }
  125. // 从订单点击修改地址进入
  126. const editAddressFromOrder = () => {
  127. const options = {
  128. type: 2,
  129. data: {
  130. address: state.formData.address,
  131. consignee: state.formData.consignee,
  132. consigneeTel: state.formData.consigneeTel,
  133. region: state.formData.region,
  134. orderNo: state.orderNo,
  135. },
  136. method: "POST",
  137. showLoading: true,
  138. };
  139. requestNew(updateAdress, options).then((res) => {
  140. msg("编辑地址成功");
  141. setTimeout(() => {
  142. uni.navigateBack({
  143. delta: 1,
  144. });
  145. }, 1500)
  146. });
  147. }
  148. /* 新增/编辑收货地址 */
  149. const queryAddOrEditAddress = (code, data) => {
  150. if (getItem(StorageKeys.OpenId)) {
  151. const options = {
  152. type: 2,
  153. data: data,
  154. method: "POST",
  155. showLoading: true,
  156. };
  157. requestNew(code, options).then((res) => {
  158. msg("编辑地址成功");
  159. setTimeout(() => {
  160. uni.navigateBack({
  161. delta: 1,
  162. });
  163. }, 1500)
  164. });
  165. } else {
  166. uni.$emit('updateData', state.formData)
  167. uni.navigateBack({
  168. delta: 1,
  169. });
  170. }
  171. };
  172. onLoad((option) => {
  173. if (option.content) {
  174. state.formData = JSON.parse(option.content);
  175. } else if (option.orderNo) {
  176. state.orderNo = option.orderNo;
  177. const options = {
  178. type: 2,
  179. data: {
  180. orderNo: option.orderNo
  181. },
  182. method: "POST",
  183. showLoading: true,
  184. };
  185. requestNew(upAdressQuery, options).then((res) => {
  186. const data = res;
  187. state.formData = res;
  188. });
  189. }
  190. });
  191. </script>
  192. <style lang="scss" scoped>
  193. .form-item {
  194. display: flex;
  195. justify-content: space-between;
  196. align-items: center;
  197. font-size: 30rpx;
  198. padding: 20rpx 0;
  199. }
  200. .form {
  201. padding: 30rpx;
  202. }
  203. .action {
  204. padding-left: 20rpx;
  205. padding-right: 20rpx;
  206. padding-bottom: 30rpx;
  207. .button::after {
  208. border: none;
  209. }
  210. .button-default::after {
  211. border: none;
  212. }
  213. .btns {
  214. height: 80rpx;
  215. background: radial-gradient(at 0% 0%, #01243A 0%, #004576 100%);
  216. border-radius: 40rpx;
  217. font-size: 32rpx;
  218. font-weight: 400;
  219. color: #ffffff;
  220. line-height: 80rpx;
  221. width: 670rpx;
  222. margin: 0 auto;
  223. box-sizing: border-box;
  224. &.del {
  225. background: #fff;
  226. border: 2rpx solid #DCDCDC;
  227. color: #666666;
  228. margin-top: 30rpx;
  229. }
  230. }
  231. .button-default {
  232. height: 80rpx;
  233. background: rgba(0, 179, 139, .1);
  234. border-radius: 40rpx;
  235. font-size: 32rpx;
  236. font-weight: 400;
  237. color: #00B38B;
  238. line-height: 80rpx;
  239. width: 45%;
  240. }
  241. }
  242. .white-action {
  243. padding-left: 20rpx;
  244. padding-right: 20rpx;
  245. padding-bottom: 30rpx;
  246. .button {
  247. height: 80rpx;
  248. border-radius: 40rpx;
  249. background: #ffffff;
  250. box-shadow: 0rpx 4rpx 11rpx 1rpx rgba(223, 223, 223, 0.5);
  251. font-size: 32rpx;
  252. font-weight: 400;
  253. color: #666666;
  254. line-height: 80rpx;
  255. }
  256. }
  257. .choice-picker {
  258. background: #F1F1F1;
  259. border-radius: 20rpx;
  260. padding: 10rpx 20rpx;
  261. height: 40px;
  262. color: black;
  263. }
  264. </style>