edit.vue 10 KB

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