user.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <view class="user padding30">
  3. <view class="padding30 bg_color_fff border_radius_20">
  4. <u-form labelPosition="left" :model="userInfo" :rules="rules" ref="formRef" labelWidth="auto">
  5. <u-form-item label="头像" prop="avatar" :borderBottom="true" required>
  6. <view class="avatar flex-center-flex-end">
  7. <button class="chooseAvatar" open-type="chooseAvatar" @chooseavatar="chooseAvatar">
  8. <u-avatar
  9. size="120rpx"
  10. shape="circle"
  11. :src="userInfo.avatar"
  12. mode="aspectFill"
  13. ></u-avatar>
  14. </button>
  15. </view>
  16. </u-form-item>
  17. <u-form-item label="昵称" prop="nickName" :borderBottom="true" required>
  18. <u-input v-model="userInfo.nickName" placeholder="请输入昵称" border="none" clearable inputAlign="right" type="nickname"></u-input>
  19. </u-form-item>
  20. <u-form-item label="手机号" :borderBottom="false" required>
  21. <u-input v-model="userInfo.userPhone" placeholder="账号" border="none" clearable inputAlign="right" readonly></u-input>
  22. </u-form-item>
  23. </u-form>
  24. </view>
  25. <view class="foot bg_color_fff">
  26. <view class="order_btn paddingTB20 flex_1 text_align_center" @click="submitForm">提交</view>
  27. </view>
  28. </view>
  29. </template>
  30. <script setup>
  31. import { ref,reactive } from 'vue'
  32. import { userEdit } from "@/api/user.js";
  33. import { telEncrypt,chooseImageOne,uploadFile } from "@/utils/util.js";
  34. import { useToast } from "@/hooks/useToast";
  35. const { Toast } = useToast();
  36. import { useAppStore } from "@/stores/app";
  37. const appStore = useAppStore();
  38. const formRef = ref(null);
  39. const dgtPopupRef = ref(null);
  40. const userInfo = ref({
  41. userPhone: telEncrypt(appStore.userInfo?.userPhone),
  42. nickName: appStore.userInfo?.nickName,
  43. avatar: appStore.userInfo?.avatar,
  44. });
  45. const rules = reactive({
  46. "avatar": [
  47. { required: true, message: '请上传头像', trigger: ['blur', 'change'] },
  48. ],
  49. "nickName": [
  50. { required: true, message: '请输入昵称', trigger: ['blur', 'change'] },
  51. ]
  52. });
  53. // 提交表单
  54. async function submitForm(){
  55. formRef.value
  56. .validate()
  57. .then((valid) => {
  58. console.log('submitForm',valid);
  59. if (valid) {
  60. userEdit(userInfo.value).then(async res=>{
  61. await appStore.USERINFO();
  62. uni.navigateBack();
  63. })
  64. } else {
  65. Toast({ title: "请完善个人资料" });
  66. }
  67. })
  68. .catch((e) => {
  69. console.log('error submit!!',e[0].message);
  70. Toast({ title: e[0]?.message || "请完善个人资料!" });
  71. });
  72. };
  73. async function uploadImage(){
  74. const res = await chooseImageOne('user/userAvatarUpload');
  75. console.log('uploadImage',res);
  76. if(res){
  77. userInfo.value.avatar= res.data
  78. }
  79. }
  80. async function chooseAvatar(e){
  81. console.log('chooseAvatar',e);
  82. if(e.detail?.avatarUrl){
  83. const res = await uploadFile(e.detail?.avatarUrl,'user/userAvatarUpload');
  84. console.log('uploadImage',res);
  85. if(res){
  86. userInfo.value.avatar= res.data
  87. }
  88. }
  89. }
  90. </script>
  91. <style lang="scss">
  92. .user{
  93. .foot{
  94. .order_btn{
  95. border-radius: 50rpx;
  96. }
  97. }
  98. .avatar{
  99. width: 100%;
  100. }
  101. }
  102. </style>