personalInfo.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <view>
  3. <up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
  4. <up-form-item label="姓名" prop="nickName" borderBottom labelWidth="70">
  5. <up-input v-model="modelForm.nickName" border="none" placeholder="请输入姓名" :disabled="loading"></up-input>
  6. </up-form-item>
  7. <up-form-item label="性别" prop="sex" borderBottom @click="() => !loading && (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="age" borderBottom labelWidth="70">
  15. <up-input v-model="modelForm.age" border="none" placeholder="请输入年龄" :disabled="loading"></up-input>
  16. </up-form-item>
  17. <up-form-item label="手机号" prop="phonenumber" borderBottom labelWidth="70">
  18. <up-input v-model="modelForm.phonenumber" border="none" placeholder="请输入手机号" :disabled="loading"></up-input>
  19. </up-form-item>
  20. </up-form>
  21. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  22. @close="sexFlag = false"></up-action-sheet>
  23. <view class="Wrapper-Btn">
  24. <up-button @click="handleQux" type="error" :plain="true" :hairline="true" text="取消"
  25. :customStyle="hadlClickEdit" :disabled="loading"></up-button>
  26. <up-button type="error" @click="handleSubmit" text="保存" :customStyle="hadlClickEdit" :loading="loading" :disabled="loading" />
  27. </view>
  28. </view>
  29. </template>
  30. <script setup>
  31. import { ref, computed, onMounted } from 'vue'
  32. import { updateUserInfo, userUserInfoEdit } from '@/api/personaInforMation.js'
  33. import { useStore } from 'vuex'
  34. const store = useStore()
  35. const formRef = ref(null)
  36. const sexFlag = ref(false)
  37. const sexOptions = ref([
  38. { name: '男', value: 0 },
  39. { name: '女', value: 1 }
  40. ])
  41. const modelForm = ref({
  42. nickName: '',
  43. sex: '',
  44. age: '',
  45. phonenumber: ''
  46. })
  47. const loading = ref(false)
  48. const rulesForm = ref({
  49. nickName: {
  50. type: 'string',
  51. required: true,
  52. message: '请输入姓名',
  53. trigger: ['blur', 'change']
  54. },
  55. sex: {
  56. type: 'number',
  57. required: true,
  58. message: '请选择性别',
  59. trigger: ['change']
  60. },
  61. age: {
  62. type: 'string',
  63. required: true,
  64. message: '请输入年龄',
  65. trigger: ['blur', 'change']
  66. },
  67. phonenumber: {
  68. type: 'string',
  69. required: true,
  70. message: '请输入手机号',
  71. trigger: ['blur', 'change']
  72. }
  73. })
  74. onMounted(async () => {
  75. loading.value = true
  76. try {
  77. const res = await userUserInfoEdit({})
  78. if (res && res.code === 200 && res.data) {
  79. modelForm.value = {
  80. nickName: res.data.nickName || '',
  81. sex: res.data.sex !== undefined ? Number(res.data.sex) : '',
  82. age: res.data.age || '',
  83. phonenumber: res.data.phonenumber || ''
  84. }
  85. } else {
  86. modelForm.value = {
  87. nickName: '',
  88. sex: '',
  89. age: '',
  90. phonenumber: ''
  91. }
  92. }
  93. } catch (e) {
  94. console.error('获取用户信息失败:', e)
  95. uni.showToast({
  96. title: '获取用户信息失败',
  97. icon: 'none'
  98. })
  99. } finally {
  100. loading.value = false
  101. }
  102. })
  103. const handleQux = () => {
  104. uni.navigateBack({
  105. delta: 1
  106. })
  107. }
  108. const handleSubmit = async () => {
  109. try {
  110. if (!formRef.value) {
  111. console.error('表单引用不存在')
  112. return
  113. }
  114. const valid = await formRef.value.validate()
  115. if (!valid) return
  116. loading.value = true
  117. const params = {
  118. nickName: modelForm.value.nickName,
  119. sex: modelForm.value.sex,
  120. age: modelForm.value.age,
  121. phonenumber: modelForm.value.phonenumber
  122. }
  123. const res = await updateUserInfo(params)
  124. if (res && res.code === 200) {
  125. store.commit('SET_NICKNAME', params.nickName)
  126. uni.showToast({
  127. title: '保存成功',
  128. icon: 'success'
  129. })
  130. uni.navigateBack({ delta: 1 })
  131. } else {
  132. uni.showToast({
  133. title: res.msg || '保存失败',
  134. icon: 'none'
  135. })
  136. }
  137. } catch (e) {
  138. console.error('提交失败:', e)
  139. uni.showToast({
  140. title: '请求异常',
  141. icon: 'none'
  142. })
  143. } finally {
  144. loading.value = false
  145. }
  146. }
  147. const displaySex = computed({
  148. get() {
  149. const option = sexOptions.value.find(item => item.value === modelForm.value.sex)
  150. return option ? option.name : ''
  151. },
  152. set(newValue) {
  153. const option = sexOptions.value.find(item => item.name === newValue)
  154. if (option) {
  155. modelForm.value.sex = option.value
  156. }
  157. }
  158. })
  159. function sexSelect(e) {
  160. modelForm.value.sex = Number(e.value)
  161. sexFlag.value = false
  162. }
  163. const hadlClickEdit = {
  164. width: '240rpx',
  165. marginTop: '30rpx'
  166. }
  167. </script>
  168. <style scoped>
  169. .Wrapper-Btn {
  170. display: flex;
  171. justify-content: center;
  172. align-items: center;
  173. }
  174. </style>