评论

微信小程序头像昵称实战篇

微信小程序头像昵称怎么获取

2022-08-25

api文档地址:  https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html

目前的api变更后,得到的地址为 临时地址, 这个是文档没有说明的, 最佳实践,是需要把得到的地址上传到自己的服务器,然后用服务器返回的地址作为 真实头像的永久地址.



核心点说明:

//获取到api返回的新地址路径
onChooseAvatar(e) {
      this.avatarUrl = e.detail.avatarUrl
      console.log('e.detail', e.detail)
     // this.updateUserInfo();
      this.uploadFile();
    },



/* 上传 头像 转 话格式*/
    uploadFile(){
      uni.uploadFile({
        url: config.webUrl + '/upload/uploadImages',//后台接口
        filePath: this.avatarUrl,// 上传图片 url
        name:'image',
       // formData: this.formData,
        header: {
          'content-type': 'multipart/form-data',
          'token': uni.getStorageSync('token')
        }, // header 值
        success: res => {
          let obj = JSON.parse(res.data)
          console.log('obj', obj)
          if (obj.code == 1) {
           let imgUrl = obj.data.full_path;
           this.userImg = imgUrl;
            this.updateUserInfo();
          } else {
            uni.showToast({
              icon: 'none',
              title: '图片太大,请重新选择!'
            });
          }
        },
        fail: e => {
          this.$toast('上传失败')
        }
      });
    },


这里需要注意, wx.uploadFile 返回的是字符串类型,需要前端自己处理一下数据结构:



完整代码如下:


import config from "@/common/config.js";
import {debounce} from '@/utils/debounce.js'
export default {
  data() {
    return {
      defaultAvatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0',
      avatarUrl: '',
      nick_name: '',
      userImg: '',
    }
  },

  onLoad() {
    let userInfo = uni.getStorageSync('userInfo') || {};
    let { nick_name,img_url } = {...userInfo};
    this.userImg = img_url;
    this.nick_name = nick_name;
  },
  methods: {
    onChooseAvatar(e) {
      this.avatarUrl = e.detail.avatarUrl
      console.log('e.detail', e.detail)
     // this.updateUserInfo();
      this.uploadFile();
    },



    inputWord: debounce(function(e){
      this.nick_name = e.detail.value
      console.log('this.nick_name.length',this.nick_name.length)
      let str = this.nick_name.trim();
      if(str.length==0){
        this.$toast('请输入合法的昵称')
        return
      }
      if((/[^/a-zA-Z0-9\u4E00-\u9FA5]/g).test(str)){
        this.$toast('请输入中英文和数字')
        return
      }
      this.updateUserInfo()
    }, 1500),


    /* 上传 头像 转 话格式*/
    uploadFile(){
      uni.uploadFile({
        url: config.webUrl + '/upload/uploadImages',//后台接口
        filePath: this.avatarUrl,// 上传图片 url
        name:'image',
       // formData: this.formData,
        header: {
          'content-type': 'multipart/form-data',
          'token': uni.getStorageSync('token')
        }, // header 值
        success: res => {
          let obj = JSON.parse(res.data)
          console.log('obj', obj)
          if (obj.code == 1) {
           let imgUrl = obj.data.full_path;
           this.userImg = imgUrl;
            this.updateUserInfo();
          } else {
            uni.showToast({
              icon: 'none',
              title: '图片太大,请重新选择!'
            });
          }
        },
        fail: e => {
          this.$toast('上传失败')
        }
      });
    },



    updateUserInfo(){
      let self = this;
      uni.showLoading({});
      let params = {
        img_url: this.userImg,
        nick_name: this.nick_name.trim(),
      }
      self.$http.post('updateUserInfo', params).then(res => {
        uni.hideLoading()
        if (res.data.code == 1) {
          self.$toast('修改成功!')
        }else {
          self.$toast(res.data.msg)
        }

      })
    },

  }
}




请一键三连,争取升个级,谢谢各位道友!

补充一下,如果api不生效注意切换一下版本库:

我本地用的2.26.1



实际效果图:












最后一次编辑于  2022-11-24  
点赞 12
收藏
评论

18 个评论

  • BoboWu
    BoboWu
    2022-12-06

    同有疑问,返回的一个tmp的地址,永久地址是哪个?楼主后面怎么解决的?

    2022-12-06
    赞同
    回复 1
    • 你是人间四月天
      你是人间四月天
      2022-12-07
      参考这里: 后端提供接口,把这个地址上传到服务器上,服务器返回的地址,就是永久地址了.
      2022-12-07
      回复
  • 玄野计
    玄野计
    2022-11-23

    我这手机iPhone xr 微信版本8.0.16 调试库版本2.2.1.4,但是真机调试,button chooseAvatar 没有用

    2022-11-23
    赞同
    回复 1
  • 无敌小旋风
    无敌小旋风
    2022-11-14

    兄弟们求救,这个获取的临时图片地址,是必须要以文件的形式上传到服务器中是不?本地无法直接使用这个临时路径

    2022-11-14
    赞同
    回复 2
    • 你是人间四月天
      你是人间四月天
      2022-11-15
      大兄弟你说的是对的,用临时地址,过一会儿又没得了,用户会给你提bug的啊. 最好是上传到自己服务器上面哈.
      2022-11-15
      回复
    • COOL
      COOL
      2023-03-16回复你是人间四月天
      可以上传到云存储吗?如果可以做?
      2023-03-16
      回复
  • Anygolf🐯
    Anygolf🐯
    2022-11-10
    uni.uploadFile({
            url: config.webUrl + '/upload/uploadImages',//后台接口
            filePath: this.avatarUrl,// 上传图片 url
            name:'image',
    


    这个是个临时的url,服务端怎么处理?

    2022-11-10
    赞同
    回复 6
    • 你是人间四月天
      你是人间四月天
      2022-11-10
      服务端那边给前端提供一个文件上传的接口,然后他们把这个文件上传到文件服务器,返回给前端一个永久有效的外网地址.


      具体后端接口是怎么实现的,这个我不懂,你需要问问后端开发的道友.
      2022-11-10
      1
      回复
    • Half_nothing
      Half_nothing
      2023-01-17
      就是,后端拿到这个临时地址,把图片保存到本地或者专门的文件服务器(比如cos)后拿到一个地址,叫做永久地址(也不是那么“永久”就是了),然后数据库存的是永久地址,客户端请求的时候返回的是永久地址不是临时地址。
      2023-01-17
      回复
    • Youky
      Youky
      2023-03-14回复Half_nothing
      后端拿到的肯定不是临时地址吧,应该是拿到的文件,临时地址是给微信用的
      2023-03-14
      回复
    • COOL
      COOL
      2023-03-16回复你是人间四月天
      那,我们用云开发的,没有后端服务器,怎么存呢
      2023-03-16
      回复
    • 你是人间四月天
      你是人间四月天
      2023-03-17回复COOL
      原理应该是一样的,云开发是否提供了文件存储呢? 意思就是需要把本地的资源存到远程的服务器,然后得到一个这样的远程地址(我认为这个地址,服务器不挂,就是永久的意思)
      2023-03-17
      回复
    查看更多(1)
  • 君临天下
    君临天下
    2022-11-04

    encryptedData都还在,可以直接获取头像和昵称,这个改不改不影响业务逻辑

    2022-11-04
    赞同
    回复 1
  • Torin
    Torin
    2022-10-24

    昵称存在一个非法校验的问题,目前昵称校验没有回调,在输入框自动清除非法昵称之前,修改的时候用户点击确认过快,导致非法昵称提交成功,看你的代码,也存在这个问题哦。非法:如黄赌毒的昵称,不是非法字符

    2022-10-24
    赞同
    回复 3
    • 你是人间四月天
      你是人间四月天
      2022-10-24
      那你有什么解决方案没呢?
      2022-10-24
      回复
    • 你是人间四月天
      你是人间四月天
      2022-10-24
      如果需要,我目前可以想到的是,在截图的地方添加校验.
      2022-10-24
      回复
    • EnockT
      EnockT
      2023-01-05
      (uni-app适用)在登录时通过以下代码片段可获取,注:input组件上需增加id="nickname-input"
      uni.createSelectorQuery().in(this) // 注意这里要加上 in(this)
           .select("#nickname-input")
           .fields({
            properties: ["value"],
           })
           .exec((res) => {
            const nickName = res?. [0]?.value
            this.form.nickName = nickName
           })
      2023-01-05
      回复
  • 你是人间四月天
    你是人间四月天
    2022-10-24

    补充一下,如果api不生效注意切换一下版本库:

    我本地用的2.26.1

    2022-10-24
    赞同
    回复
  • 你是人间四月天
    你是人间四月天
    2022-09-29

    补充一下页面结构如下:


    <template>
      <view class="page-bg">
        <view class="main-container">
          <view class="tl-card-1">
            <view class="tl-height-100 border-bottom tl-font-32-333-4">
              头像
              <button class="tl-p-r tl-img-60" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
                <image class="tl-img-60" :src="userImg ? userImg: defaultAvatarUrl" mode="aspectFill"></image>
              </button>
            </view>
            <view class="tl-line-2"></view>
            <view class="tl-height-100 tl-font-32-333-4">
              昵称
    <!--          <input type="nickname" maxlength="16" minlength="2"  :value="nick_name" placeholder-style="color:#FD5858" class="tl-p-r2 tl-font-32-999-4" placeholder="请输入昵称" />-->
              <input type="nickname" maxlength="16" minlength="2" @input="inputWord"  v-model="nick_name" placeholder-style="color:#FD5858" class="tl-p-r2 tl-font-32-999-4" placeholder="请输入昵称" />
            </view>
          </view>
          <view class="w-100" >
            <view class="tl-btn-360" @tap="updateUserInfo" v-show="isBtn">保存</view>
          </view>
    
        </view>
      </view>
    </template>
    




    2022-09-29
    赞同
    回复 4
    • tiandaodao
      tiandaodao
      2022-11-21
      推荐获取昵称使用form submit方式
      2022-11-21
      回复
    • true
      true
      2022-11-23
      发现获取微信昵称的时候,input不触发,放bulr才触发
      2022-11-23
      回复
    • true
      true
      2022-11-23回复tiandaodao
      为啥?我只看到官方推荐用form,但是没发现必要性,请问会有啥区别呢?
      2022-11-23
      1
      回复
    • 你是人间四月天
      你是人间四月天
      2022-11-24回复true
      不懂为啥要用form,值不是可以直接拿到吗?
      2022-11-24
      回复

正在加载...

登录 后发表内容