更新记录

1.1.2(2026-09-17) 下载此版本

  • 移除组件级未登录预检(1.1.1 引入的 openidMissing 选图入口拦截):正常流程 (页面登录守卫 + getUserInfo 后放开组件)下不可达,且未登录时上传第一步 getOssAuth 即 401 失败、已登录未加载资料时 mediaCheckAsync 有 「用户资料未加载,请重试」兜底——组件不再感知登录态,保持单一职责。 使用前提(登录态与用户信息由宿主页面保证)已写入组件头注释与 readme。

1.1.0(2026-09-17) 下载此版本

  • 审核开关(自动判定 + 可覆盖):新增 isAvatarReviewEnabled() 与 setup 配置 reviewEnabled?: boolean | (() => boolean)
    • 默认自动判定:仅微信小程序非开发版(体验版 / 正式版)启用内容安全检测; 开发版(开发者工具 / 开发预览)联调免审;微信 H5、支付宝 H5、App 等环境无小程序检测通道,恒免审。
    • 免审模式下上传成功即回写 v-model 并触发 approve,toast「头像已更新」,无「审核中/继续检测」环节。
    • avatar-review-corecreateAvatarReviewModel 新增 reviewEnabled 选项(默认 true,纯逻辑层不感知平台)。

平台兼容性

uni-app(5.24)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(5.24)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

wc-avatar-picker

头像上传组件:选图 → OSS 直传(依赖 wc-upload)→ 微信内容安全异步检测(轮询结果), 审核通过才回写 v-model,未通过 / 审核中的图片只作预览,不会写入业务资料。

封装自 won-passion-for-sports(uni1)的 ProfileAvatarPicker + modules/security 实现,逻辑与视觉保持一致。

安装前置

  1. 已安装 wc-upload ≥ 1.1.0(及其依赖 wc-request,已 setupWcAuth()
  2. 已安装 uni-icons(相机角标图标)
  3. wc-upload 已按项目体系配置授权端点(见下),server 已放行 OSS 上传域名
  4. 宿主在 main.ts 调用一次 setupWcAvatarPicker()(见下)

宿主接线(本项目 main.ts 已配置)

插件无法感知宿主账号体系,openid / 应用标识需一次性注入; 本项目(收款 3.0)的接线方式:

import { useAuthStore } from "@/uni_modules/wc-auth/commons";
import { setOssAuthUrl } from "@/uni_modules/wc-upload/commons/api";
import { setupWcAvatarPicker } from "@/uni_modules/wc-avatar-picker/commons/config";

// 本项目登录体系为 wonUser,OSS 授权走 /core/mobile/wonUser 路径
setOssAuthUrl("/core/mobile/wonUser/aliyun/ossAuth");

setupWcAvatarPicker({
    // openid 取当前登录账号快照(小程序登录必有;需先 getUserInfo() 加载)
    getOpenid: () => useAuthStore().userInfo?.account?.openid || "",
    // 与登录 wcappid 同源(.env 的 VITE_APP_WCAPPID)
    wcAppId: (import.meta.env.VITE_APP_WCAPPID || "").trim(),
    // 兜底图:本项目无默认头像资源,留空显示灰底圆形占位
    fallbackSrc: "",
    // 审核开关(可选,缺省自动判定):仅微信小程序非开发版启用检测;
    // 开发版联调、微信 H5 / 支付宝 H5 等环境自动免审(上传成功即过审)。
    // 需要强制覆盖时传 boolean 或函数,例如体验版也免审:
    // reviewEnabled: () => {
    //   try { return uni.getAccountInfoSync().miniProgram.envVersion === "release" }
    //   catch { return true }
    // },
});
  • getOpenid 返回空时,提交检测直接报「用户资料未加载,请重试」; 使用组件的页面应先 await getUserInfo()(mine 页已有此调用,store 有缓存直接复用)。
  • server 侧需保证 wc_app_id(wonCollectPayment)已在望潮用户中心登记本小程序的 appid/secret,/core/mobile/security/mediaCheckAsync 才能对 openid 发起检测。

使用(easycom,免注册)

<template>
    <wc-avatar-picker
        ref="avatarPickerRef"
        v-model="form.headimgurl"
        :avatar-size="176"
        tip-text="点击更换头像"
        :disabled="pageLoading"
    />
</template>

<script setup lang="ts">
interface AvatarPickerInstance {
    hasPending: () => boolean
    isBusy: () => boolean
}
const avatarPickerRef = ref<AvatarPickerInstance | null>(null)

// 保存前统一拦截:上传/审核进行中,或存在待审核候选头像
const avatarBusy = computed(() => avatarPickerRef.value?.isBusy() ?? false)
const hasPendingAvatar = computed(() => avatarPickerRef.value?.hasPending() ?? false)
</script>

本项目用户信息字段为 headimgurl(wc-auth WonUserInfo),绑定时注意字段名。

Props

属性 类型 默认值 说明
v-model string '' 已审核通过的头像 URL;新头像过审后自动回写
avatar-size string \| number 176 头像尺寸;数字按 rpx 处理
tip-text string 点击更换头像 空闲态提示文案
disabled boolean false 禁用选择(上传 / 审核中组件会自行锁定)
fallback-src string '' 兜底图;未传时用 setupWcAvatarPicker 的全局配置

Events

事件 参数 说明
update:modelValue (url: string) 过审头像回写 v-model
approve (url: string) 新头像通过审核时触发(与回写同步)

实例方法(ref 调用)

方法 返回 说明
hasPending() boolean 存在待审核候选头像(保存前应拦截提交)
isBusy() boolean 上传或审核进行中

行为约定

说明
选图(微信端) 原生 open-type="chooseAvatar" 按钮覆盖层,合规获取微信头像
选图(其他端) uni.chooseImage#ifndef MP-WEIXIN,仅兜底)
上传 wc-uploaduploadFileToOss / chooseAndUploadImage(OSS PostObject 直传)
审核开关 自动判定:仅微信小程序非开发版(体验版/正式版)启用;开发版、微信 H5 / 支付宝 H5、App 等免审。可用 setup 的 reviewEnabled 强制覆盖
检测(启用时) 上传成功即提交 mediaCheckAsync(scene=profile),轮询结果最长 60s
审核通过 回写 v-model + approve 事件 + 「头像审核通过」toast
免审环境 上传成功即回写 v-model + approve 事件 + 「头像已更新」toast,无检测环节
审核不通过 清除候选,红条提示「头像内容不合规,请更换头像」
检测超时/异常 进入 retry 态,黄条提示「点击继续检测」,复用 trace_id 续查
外部回写 v-model 通过 syncApprovedAvatar 同步为已审值(不触发重复检测)
组件卸载 invalidateTask() 作废进行中的上传 / 轮询任务

SDK(commons)

// 统一出口(mp-weixin 下如遇 barrel 问题,可直接 import 具体模块)
import {
    setupWcAvatarPicker,
    createAvatarReviewModel,   // 审核状态机(纯逻辑,可复用到昵称等其它资料检测)
    mediaCheckAsync,           // 提交微信异步检测
    waitForMediaCheckResult,   // 轮询检测结果
    isMediaCheckPassed,        // 回调结果判定
    MEDIA_SCENE,
    MEDIA_TYPE,
} from '@/uni_modules/wc-avatar-picker/commons'

范围说明

刻意不包含(保持简单):

  • 资料保存接口(各业务自己提交 v-model 拿到的过审 URL)
  • 装饰边框 / 认证徽标等展示形态(宿主可自行包一层或改样式)
  • 昵称等文本检测(createAvatarReviewModel 已解耦依赖,可参照组件接线复用)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。