edit.vue 8.6 KB

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