edit.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <template>
  2. <view>
  3. <up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
  4. <up-form-item label="姓名" prop="name" borderBottom labelWidth="70">
  5. <up-input v-model="modelForm.name" border="none" placeholder="请输入姓名"></up-input>
  6. </up-form-item>
  7. <up-form-item label="性别" prop="sex" borderBottom @click="() => (sexFlag = true)" labelWidth="70">
  8. <up-input v-model="displaySex" disabled disabledColor="#ffffff" placeholder="请选择性别" border="none"></up-input>
  9. <template #right>
  10. <up-icon name="arrow-right"></up-icon>
  11. </template>
  12. </up-form-item>
  13. <up-form-item label="关系" prop="label" borderBottom @click="() => labelFlag = true" labelWidth="70">
  14. <up-input v-model="modelForm.label" disabled disabledColor="#ffffff" placeholder="请选择关系"
  15. border="none"></up-input>
  16. <template #right>
  17. <up-icon name="arrow-right"></up-icon>
  18. </template>
  19. </up-form-item>
  20. <up-form-item label="年龄" prop="age" borderBottom labelWidth="70">
  21. <up-input v-model="modelForm.age" border="none" placeholder="请输入年龄"></up-input>
  22. </up-form-item>
  23. <up-form-item label="手机号" prop="telephone" borderBottom labelWidth="70">
  24. <up-input v-model="modelForm.telephone" border="none" placeholder="请输入手机号"></up-input>
  25. </up-form-item>
  26. <up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true" labelWidth="70">
  27. <pickerAddress @change="addressChange"
  28. :selectValue="[ modelForm.provinceInd, modelForm.cityInd, modelForm.districtInd ]">
  29. <view class="inp"
  30. :class="modelForm.provinceName&&modelForm.cityName&&modelForm.districtName?'':'address-inp'">
  31. {{modelForm.provinceName ? modelForm.provinceName:'省'}} /
  32. {{modelForm.cityName ? modelForm.cityName:'市'}} /
  33. {{modelForm.districtName ? modelForm.districtName:'区'}}
  34. </view>
  35. </pickerAddress>
  36. <template #right>
  37. <up-icon name="map" size="22" @click="onCityWx"></up-icon>
  38. </template>
  39. </up-form-item>
  40. <up-form-item label="地址" prop="address" borderBottom labelWidth="70">
  41. <up-input v-model="modelForm.address" border="none" placeholder="请输入地址"></up-input>
  42. </up-form-item>
  43. <up-form-item label="门牌号" prop="detailAddress" borderBottom labelWidth="70">
  44. <up-input v-model="modelForm.detailAddress" border="none" placeholder="请输入地址"></up-input>
  45. </up-form-item>
  46. </up-form>
  47. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  48. @close="sexFlag = false"></up-action-sheet>
  49. <up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
  50. @close="labelFlag = false"></up-action-sheet>
  51. <view class="Wrapper-Btn">
  52. <up-button @click="handleQux" type="error" :plain="true" :hairline="true" text="取消"
  53. :customStyle="hadlClickEdit"></up-button>
  54. <up-button type="error" @click="handleSubmit" text="编辑" :customStyle="hadlClickEdit" />
  55. </view>
  56. </view>
  57. </template>
  58. <script setup>
  59. import {
  60. ref,
  61. reactive,
  62. computed,
  63. } from 'vue';
  64. import {
  65. onLoad
  66. } from '@dcloudio/uni-app';
  67. import {
  68. useraDdress,
  69. } from "@/api/userSettings.js"
  70. // import pickerAddress from '@/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  71. import pickerAddress from '@/pages_mine/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  72. import {
  73. splitAddress
  74. } from '@/utils/adress'
  75. const formRef = ref(null)
  76. // 获取页面传递的参数
  77. onLoad((options) => {
  78. if (options) {
  79. options.cityName = decodeURIComponent(decodeURIComponent(options.cityName || ''));
  80. options.districtName = decodeURIComponent(decodeURIComponent(options.districtName || ''));
  81. options.label = decodeURIComponent(decodeURIComponent(options.label || ''));
  82. options.provinceName = decodeURIComponent(decodeURIComponent(options.provinceName || ''));
  83. options.name = decodeURIComponent(decodeURIComponent(options.name || ''));
  84. options.address = decodeURIComponent(decodeURIComponent(options.address || ''));
  85. options.detailAddress = decodeURIComponent(decodeURIComponent(options.detailAddress || ''));
  86. modelForm.value = {
  87. ...modelForm.value,
  88. ...options,
  89. sex: options.sex ? Number(options.sex) : '',
  90. age: options.age ? Number(options.age) : '',
  91. provinceName: options.provinceName || '',
  92. cityName: options.cityName || '',
  93. districtName: options.districtName || '',
  94. districtCode:options.districtCode,
  95. provinceCode:options.provinceCode
  96. };
  97. }
  98. });
  99. const modelForm = ref({
  100. name: '',
  101. sex: '',
  102. label: '',
  103. age: '',
  104. telephone: '',
  105. provinceName: '', // 省
  106. provinceCode: '',
  107. provinceInd: 0,
  108. cityName: '', // 市
  109. cityCode: '',
  110. cityInd: 0,
  111. districtName: '',
  112. districtCode: '',
  113. districtInd: 0,
  114. address: ''
  115. })
  116. // 回显把provinceName,cityName,districtName字段拼接
  117. const rulesForm = ref({
  118. name: {
  119. type: 'string',
  120. required: true,
  121. message: '请填写姓名',
  122. trigger: ['blur', 'change'],
  123. },
  124. sex: {
  125. type: 'number',
  126. required: true,
  127. message: '请选择性别',
  128. trigger: ['change']
  129. },
  130. label: {
  131. type: 'string',
  132. required: true,
  133. message: '请选择关系',
  134. trigger: ['change'],
  135. },
  136. userInfo: {
  137. type: 'string',
  138. required: true,
  139. message: '请填写年龄',
  140. trigger: ['blur', 'change'],
  141. },
  142. telephone: {
  143. type: 'string',
  144. required: true,
  145. message: '请填写手机号',
  146. trigger: ['blur', 'change'],
  147. },
  148. })
  149. let sexFlag = ref(false)
  150. let labelFlag = ref(false)
  151. let addressShow = ref(false)
  152. let index = ref(0)
  153. const sexOptions = ref([{
  154. name: '男',
  155. value: 0,
  156. }, {
  157. name: '女',
  158. value: 1,
  159. }, ]);
  160. const relaTionsHip = ref([{
  161. name: '父母'
  162. }, {
  163. name: '子女'
  164. },
  165. {
  166. name: '兄弟'
  167. },
  168. {
  169. name: '朋友'
  170. },
  171. {
  172. name: '同学'
  173. },
  174. {
  175. name: '同事'
  176. },
  177. {
  178. name: '配偶'
  179. }
  180. ]);
  181. const displaySex = computed({
  182. get() {
  183. const option = sexOptions.value.find(item => item.value === modelForm.value.sex)
  184. return option ? option.name : ''
  185. },
  186. set(newValue) {
  187. const option = sexOptions.value.find(item => item.name === newValue)
  188. if (option) {
  189. modelForm.value.sex = option.value
  190. }
  191. }
  192. })
  193. // 性别选择处理
  194. function sexSelect(e) {
  195. modelForm.value.sex = e.value; // 确保是 0 或 1
  196. console.log('Selected sex:', e.value, 'Model sex:', modelForm.value.sex);
  197. sexFlag.value = false;
  198. // 手动触发验证
  199. formRef.value.validateField('sex');
  200. }
  201. function sexSelectsHip(e) {
  202. modelForm.value.label = e.name;
  203. labelFlag.value = false;
  204. }
  205. function addressChange(info) {
  206. console.log('地区选择器返回的完整数据:', info);
  207. console.log('地区编码:', info.code);
  208. if (!info || !info.data) {
  209. console.error('Invalid address change info:', info);
  210. return;
  211. }
  212. if (!Array.isArray(info.data) || info.data.length < 3) {
  213. console.error('Invalid address data:', info.data);
  214. return;
  215. }
  216. const code = Array.isArray(info.code) ? info.code : ['', '', ''];
  217. let indexArray;
  218. if (Array.isArray(info.index)) {
  219. indexArray = info.index;
  220. } else if (info.index && typeof info.index[Symbol.iterator] === 'function') {
  221. indexArray = Array.from(info.index);
  222. } else {
  223. indexArray = [0, 0, 0];
  224. }
  225. modelForm.value.provinceName = info.data[0] || '';
  226. modelForm.value.provinceCode = code[0] || '';
  227. modelForm.value.provinceInd = indexArray[0] || 0;
  228. modelForm.value.cityName = info.data[1] || '';
  229. modelForm.value.cityCode = code[1] || '';
  230. modelForm.value.cityInd = indexArray[1] || 0;
  231. modelForm.value.districtName = info.data[2] || '';
  232. modelForm.value.districtCode = code[2] || '';
  233. modelForm.value.districtInd = indexArray[2] || 0;
  234. }
  235. function onCityWx(row) {
  236. console.log('地区选点', row);
  237. wx.chooseLocation({
  238. success: function(res) {
  239. const result = splitAddress(res.address);
  240. console.log(res, result);
  241. modelForm.value.provinceName = result.province
  242. modelForm.value.cityName = result.city
  243. modelForm.value.districtName = result.district
  244. modelForm.value.address = result.detail
  245. modelForm.value.longitude = res.longitude
  246. modelForm.value.latitude = res.latitude
  247. },
  248. fail: function(err) {
  249. console.log(err);
  250. uni.showToast({
  251. title: '获取地址失败',
  252. icon: 'error',
  253. });
  254. },
  255. })
  256. }
  257. // 提交编辑
  258. async function handleSubmit() {
  259. try {
  260. // 1. 验证表单
  261. await formRef.value.validate();
  262. // 2. 准备提交数据
  263. const submitData = {
  264. ...modelForm.value,
  265. sex: modelForm.value.sex,
  266. };
  267. // 3. 显示加载中提示(可选)
  268. uni.showLoading({
  269. title: '提交中...',
  270. mask: true
  271. });
  272. // 4. 调用接口
  273. const response = await useraDdress(submitData);
  274. // 5. 隐藏加载中
  275. uni.hideLoading();
  276. // 6. 处理响应
  277. if (response.code === 200) {
  278. await new Promise((resolve) => {
  279. uni.showToast({
  280. title: '编辑成功',
  281. icon: 'success',
  282. duration: 1500, // 默认1500ms
  283. mask: true,
  284. success: () => {
  285. // 等待Toast显示完成
  286. setTimeout(() => resolve(), 1500);
  287. }
  288. });
  289. });
  290. // 7. 跳转页面
  291. uni.navigateTo({
  292. url: '/pages_mine/pages/selectAddress/index'
  293. });
  294. } else {
  295. uni.showToast({
  296. title: response.msg || '编辑失败',
  297. icon: 'none'
  298. });
  299. }
  300. } catch (error) {
  301. uni.hideLoading();
  302. console.error('编辑失败', error);
  303. uni.showToast({
  304. title: '编辑失败: ' + (error.message || '未知错误'),
  305. icon: 'none'
  306. });
  307. }
  308. }
  309. const handleQux = () => {
  310. uni.navigateBack({
  311. delta: -1
  312. })
  313. }
  314. const hadlClickEdit = {
  315. width: '240rpx',
  316. marginTop: '30rpx'
  317. }
  318. </script>
  319. <style scoped>
  320. .Wrapper-Btn {
  321. display: flex;
  322. justify-content: center;
  323. align-items: center;
  324. }
  325. </style>