【征稿计划第二期】【使用攻略】【红酒识别】快速接入百度智能小程序

本期活动,小帅就来带开发者们快速将红酒识别接入百度智能小程序哦。

接口文档 https://ai.baidu.com/docs#/ImageClassify-API/71e05fb6

创建自己的百度智能小程序

官网链接  https://smartprogram.baidu.com/developer/index.html

小程序名称信息填写

名称需要审核哦最好不要重名、选择一个自己小程序的LOGO、简介、服务范围(一定要选择正确哦)、标签就自己找针对性的关键词添加即可

查看自己的小程序

点击名称 进去

设置-开发设置 记录自己的小程序id appkey、appsecret等相关重要信息 备用

继续往下。找到服务器域名 并配置百度ai接口域名  和 图片转base64的域名

开发工具创建小程序

填写自己小程序的appid、名称、项目目录后点击完成即可

开始编写小程序代码

先来写接口工具类等其他方法

图片转base64 百度智能小程序暂无直接可用组件或api。小帅为了方便大家。就封装了一个在线的http的接口供大家使用。

接口文档地址 https://www.kancloud.cn/ydxiaoshuai/image2base64/1170322

/**
 * 调用百度红酒识别示例代码 baiduai.js
 */
//图片转base64接口
let img2base64Url = 'https://www.ydxiaoshuai.cn/image/convert/base64/v1';
let accessToken = ''//自己的accessToken 根据实际情况可以进行封装 自动获取token
let redwineUrl = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/redwine';//红酒识别接口
//红酒接口 图片数据 返回结果
let redwineRequest = (base64Img,callback)=>{
  //拼接接口body参数
  let params = {
     image:base64Img
  }
  //发送接口请求
  swan.request({
    url: redwineUrl + '?access_token=' + accessToken,
    data:params,
    header: {
      'content-type': 'application/x-www-form-urlencoded'
    },
    method: 'POST',
    success:function(res){
      callback.success(res.data)
    },
    fail: function (res) {
      if (callback.fail)
        callback.fail()
    }
  })
}
function getImg2base64(){
    return img2base64Url;
}
//暴露出去的接口&参数
module.exports = {
  redwineRequest: redwineRequest,
  getImg2base64: getImg2base64
}

编写页面样式及相关代码

页面index.swan

页面需要一个上传图片的按钮 和图片回显的区域 还有接口识别返回的数据显示的区域

<view>
  <view class="img_wrap">
    <image src="{{img}}" mode='aspectFill'/>
  </view>
<view class='chooseImg' bindtap="uploads">
<text>拍照/选取图片</text>
  </view>
  <view s-if="{{result}}">
         <view class="out_text">红酒名称 <text class="inner_text">{{result.wineNameCn}}</text></view>
         <view s-if="{{result.hasdetail==1}}">
             <view class="out_text">所属国家 <text class="inner_text">{{result.countryCn}}</text></view>
             <view class="out_text">红酒产区 <text class="inner_text">{{result.regionCn}}</text></view>
             <view class="out_text">所属酒庄 <text class="inner_text">{{result.wineryCn}}</text></view>
             <view class="out_text">糖分类型 <text class="inner_text">{{result.classifyBySugar}}</text></view>
             <view class="out_text">红酒类型 <text class="inner_text">{{result.classifyByColor}}</text></view>
             <view class="out_text">红酒色泽 <text class="inner_text">{{result.color}}</text></view>
             <view class="out_text">品尝温度 <text class="inner_text">{{result.tasteTemperature}}</text></view>
             <view class="out_text">酒品描述 <text class="inner_text">{{result.description}}</text></view>
         </view>
  </view>
</view>

样式index.css

给一些稍微友好  好看的ui样式

.image {
  width: 100%;
  height: 360rpx;
}
button{
  font-family: 微软雅黑;
}
text{
  font-family: 微软雅黑;
}
.page-body-info {
  display: flex;
  box-sizing: border-box;
  padding:60rpx;
  height:840rpx;
  border-top: 2rpx solid #D9D9D9;
  border-bottom: 2rpx solid #D9D9D9;
  align-items: center;
  justify-content: center;
}

.faceInfo{
  font-size: 28rpx;
   display:block;
   margin:0 auto;
   margin-left: 33%;
}
.faceInfoValue{
  color: #1BA0E1;
  letter-spacing:0px;
}
.chooseImg {
  display:block;
  margin:0 auto;
  color: rgb(255, 255, 255);
  font-size: 40rpx;
  font-family: 微软雅黑;
  width: 400rpx;
  height: 100rpx;
  text-align: center;
  line-height: 90rpx;
  border-radius:50rpx;
  background-color:#3366FF;
  margin-top:10px;
}
.img_wrap {
    width: 750rpx;
    height: 620rpx;
    background: #ececec;
}

image {
    width: 100%;
    height: 100%;
    max-height: 1
}
.msg {
    margin: 20rpx 0;
    text-align: center;
}
.table {
 margin-top: 10rpx;
  border: 0px solid darkgray;
}
.tr {
  display: flex;
  width: 100%;
  justify-content: center;
  height: 80rpx;
  
}
.td {
    font-size: 28rpx;
    width:40%;
     display: flex;
    justify-content: center;
    text-align: center;
    align-items: center;
}
.bg-w{

}
.bg-g{
  background: white;
}
.th {
  font-size: 28rpx;
  width: 48%;
  justify-content: center;
  background: #3366FF;
  color: #fff;
  display: flex;
  height: 80rpx;
  align-items: center;
}
.inner_text{
    font-size: 36rpx;
    color: #1BA0E1;
    font-family: 微软雅黑;
    word-break: normal;
    word-wrap: break-word;
}
.out_text{
    margin-top:20rpx;
    margin-left: 10rpx;
    margin-right: 10rpx;
    border: 1rpx solid rgb(238, 238, 238);
    padding:10rpx 10rpx;
    font-size: 36rpx;
    font-family: 微软雅黑;
}

 编写页面处理代码

需要上传图片到小帅的图片转base64接口。返回base64数据。再给接口进行识别。返回数据进行页面渲染。步骤不是很多哦

var app = getApp();
//引用封装的工具类方法、图片转base64接口地址
var redWine = require('../../utils/baiduai.js');
var img2base64Url = redWine.getImg2base64();
Page({
    data: {
        title: '酒知识 一步即知',
        result:null,
        img:""
    },
uploads: function() {
        var that = this;
        swan.chooseImage({
            count: 1,
            sizeType: ['compressed'],
            success: res => {
                let image = "";
                if(res.tempFiles[0].size > 4096*1024){
                    console.info('jinlaile ');
                    swan.showToast({
                        title: '图片文件过大哦',
                        icon:'none',
                        mask:true,
                        duration:1500
                    });
                }else{
                    image =  res.tempFilePaths[0];
                }
                that.setData({
                        img:image
                }),
                swan.showLoading({
                    title: '信息正在赶来的路上',
                    mask: true
                }),

                //上传图片进行base64转换
                swan.uploadFile({
                    url: img2base64Url,
                    filePath: image,
                    name: 'file',
                    success:function(res){
                        var data = res.data;
                        console.info('图片转base64返回的结果:'+data.code);
                        //如果成功,进行调用红酒识别接口
                        if(data.code==200){
                            redWine.redwineRequest(data.data.base64,{
                                //接口返回数据。对数据进行赋值
                                success(res){
                                    swan.hideLoading();
                                    that.setData({
                                        result:res.result
                                    })
                                    console.info(res)
                                },
                                fail(res){
                                    swan.hideLoading();
                                    swan.showModal({
                                        title: '识别失败',
                                        content: '稍后再试一试'
                                    });
                                }
                            })
                        } else {
                            swan.showModal({
                                title: '图片转换出错',
                                content: '图片转换出错'
                            });
                        }
                    }
                });
            }
        });
},
});

准备图片进行功能测试

红酒图

小程序演示图

上传代码进行发布

上传代码

版本号、描述 自己定义即可   最低基础库 需要选择哦

提交审核

开发管理-开发版本 提交审核 也可以选为体验版 供部分人员优先体验

测试账号 如果没有 填写 无 即可  对自己版本的描述 自己编写即可 提交审核即可

转载于:https://my.oschina.net/xshuai/blog/3075992

微信小程序封装Request请求,支持自动携带token 实现一个网络请求(可实现携带 token 和不携带 token 访问api) request.js ###封装请求是否自动带上token const API_BASE_URL = 'https://***.com'; const REQUEST = (url, method, data = {}) => { return new Promise((resolve, reject) => { wx.request({ url: API_BASE_URL + url, 阅读详情

相关推荐

码云 Gitee Webhook 接入实战:明文 Token 与失败重放

把 GitHub Actions 那套 Webhook 原样接到码云,最常见的两个现场是:头对不上(永远空)、以及构建「偶发没触发」——不是分支过滤错了,是码云失败只推一次。Gitee 用 HTTPS 头里的明文密码,服务端做恒定时间比较即可。可靠性不能指望对端重试,要自己做幂等和死信。Token 放 Secrets Manager,比较用幂等键用after(commit),避免 UI「重发」打两次部署生产接收器前面加 SQS + DLQ。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 104

微信小程序请求封装token

在page下建立文件夹 require.js var tokenKey = "access-token"; var serverUrl = "http://124.204.51.174:8080/gcs"; // 例外不用token的地址 var exceptionAddrArr = [ '/user/login',]; //请求头处理函数 function CreateHeader(url, type) { let header = {} if (type == 'POST_PARAMS

火腿肠的博客 1695

在web预览中使用POST请求无法拿到数据 遇到的坑

说一个最近遇到的百度小程序的坑 在web预览中使用POST请求无法拿到数据 使用GET方式才行 不知道是不是我写的不对 目前只能使用GET方式 是我自己的问题还是百度小程序的问题 忘大佬指教 swan.request({ url:'https://www.*****.com/index.php/api/Baidu_Api/index',//你的接口地址 method:'GET', header:{ ...

m0_37359790的博客 535

百度AI技术「红酒识别」开发体验

一、需求描述 “来一瓶82年的拉菲”,相信大家一定听过这个梗(对于红酒的认识,我也就只知道这个梗了,惭愧。。。),在红酒消费越来越趋平民化的今天,了解一些红酒知识还是有好处的。但是如果作为一个普通人,想要根据掌握的红酒知识,直接说出眼前的红酒的名称国家、产区、特点等信息,还是具有一定的困难的。 因此,如果能够使用百度AI的“红酒识别”技术,只需要简单拍张照,直接反馈给你眼前的红酒信息,相信还是...

Listen2You的博客 1062

Laravel 学习-获取请求头(header)注意事项

Laravel获取请求头(header)注意事项 \Request::header(); //这个是获取header里面的version参数值 \Request::header('user-token'); 或者: $request->header('user-token'); 注意:header 的参数名称不能用下划线,否则传不进来,切记、切记、切记 ...

TO_Web的博客 984

API封装和token设置

API封装和token设置及理解前言一、封装API有什么用?二、关于token1.什么是token?2.为什么要用token?3.如何设置token?三、如何封装?1.初步封装:(此处设置token)2.进一步封装:总结 前言 在日常做项目请求接口时,在不同的组件都有不同的接口,要修改更换接口的时候要一个个找,太不方便了,这时候我们就需要封装API。 一、封装API有什么用? 封装API就相当于搞一个的文件或文件夹来统一管理你的接口路径,在你修改查询接口时更方便,也可以减少组件里的代码操作,是项目结构

weixin_46648362的博客 2328

群晖私有 Docker Registry 部署与使用

本文详细介绍在群晖上部署私有Docker Registry的完整流程,包括目录结构搭建、Docker Compose配置、反向代理与端口映射设置。通过htpasswd实现用户认证,使用Registry UI可视化管理镜像,支持客户端登录、推送与拉取。强调安全配置与空间回收操作,提供常见问题排查方案,适用于本地及公网访问场景。

bcqd1211的博客 203

Glide 源码解析:从图片请求到透明 Fragment,以及权限库为何也爱这么做

这篇从 `Glide.with()` 出发,顺着 RequestManager、生命周期、请求追踪与解码引擎一路走下去。重点不只是“Glide 怎么加载图片”,而是看它为什么要放一个没有 UI 的 Fragment 在页面里,以及这个思路为什么也会出现在权限申请库中

trebleZ的博客 171

linux搭建kafka

查看容器状态:执行docker ps,确认kafka与kafka-ui两个容器均处于Up状态。访问 UI 地址:在浏览器打开,进入 Kafka UI 控制台。检查集群连接:在 UI 的 Cluster 页面确认local集群显示为在线,且 Broker 数量为 1。

Asion15727288501的博客 261

UI设计外包项目复盘沉淀|兰亭妙微:交互设计复盘,到底要写哪些内容

复盘是设计师实现能力迭代非常关键的手段,尤其新人设计师,大量细碎基础项目,如果缺少复盘沉淀,工作做完很难转化为个人经验。兰亭妙微团队在内部项目流程中,会要求设计师在项目收尾一周内完成复盘文档,把项目过程中的感触、问题、解决方案梳理沉淀下来。针对个人,提炼可以复用的方法论,思考这套经验是否可以复用到其他项目,是否可以输出团队规范、内部文档,把个人经验转化为团队资产。梳理项目的原始背景与预期目标,明确当初立项要解决什么业务痛点,达成怎样的业务结果,后续全部复盘内容都围绕这个主线展开,避免写成无主线的流水账。

lanlanwork12的博客 96

SwiftUIUIKit 怎么选?两代 UI 框架的适用范围

SwiftUIUIKit 怎么选?不是"谁取代谁",是两代技术并存各有边界。本质差异在范式:UIKit 命令式手动管理、十年存量与第三方生态;SwiftUI 声明式状态驱动、苹果逐年加码但仍有短板。选型配比:新项目默认 SwiftUI(新 API 优先)、存量 UIKit 项目用 UIHostingController 渐进迁移、超长列表与复杂集合视图等性能场景 UIKit 兜底、watchOS/visionOS 优先 SwiftUI。附速查表与警示:别信"全面取代"论,判断看项目清单不看论坛风向。

2501_91590906的博客 217

AI 不只回答问题:用 Hermes Agent 把微信指令接到 Windows 电脑上

AI 不只回答问题:用 Hermes Agent 把微信指令接到 Windows 电脑上

2301_81152266的博客 1万+

UI自动化测试:Jenkins配置

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

HUACE5400的博客 119

Java 集合、泛型与 Android 容器选择

用户在搜索页输入关键字:Repository 返回一批 `Article`,页面要去重、按热度排序、交给 RecyclerView.Adapter<VH>渲染;点击收藏后还要按 id 缓存,并把 UI 更新投递回主线程。此时问题不再是“记住每个集合的定义”,而是“哪一个契约能让数据在 Android 生命周期与线程边界中仍然正确”。

trebleZ的博客 215

【dioxus0.7基础语法学与练】第8课:RSX 宏 — Dioxus 声明式 UI 语法

RSX(Rust Syntax Extension)是 Dioxus 框架的核心宏。

jackchuanqi的博客 327

iPhone Duo 适配详解,需要改变的不止是布局模型

看了下官方的适配 Duo 设计指引,苹果的指南还真有点东西,看的头皮发麻,比如 Duo 下,外屏和内屏最好不能是两套 UI ,应用应该做到支持持续适应当前拥有的空间界面效果。外屏、内屏、半折、Split View、横向摆放或者两个 App 并排,总体来说都是同一个问题:App 的窗口尺寸和可用区域正在变化,只要应用能够正确支持 resizing,然后支持使用系统导航和布局组件,Apple 认为大部分 App 都可以做到 Duo 适配。比如外屏的比例和传统 iPhone 有明显区别,又宽又矮,所以 Apple

恋猫de小郭的博客 192

Hermes架构拆解之Session

基于 Hermes 拆解 Session 与 Context 的核心机制,重点讲清 SessionSource、session_key、session_id、SessionContext 与 Conversation History 的关系,并结合 Gateway 与 Web UI 两种场景,解释 Hermes 如何定位会话、加载历史,以及 Web 多会话为何能够独立切换并持续对话。

一心同学的博客 136

11、UI系统

Control 是所有 UI 节点的基类。

qq_45859942的博客 28

【Xilem 0.4 基础语法学与练】第11课(深入篇):为什么其他 Rust 框架不是一切皆设计图

"一切皆设计图"包含两个承诺:UI 是纯函数(State → View Tree),框架自动 diff 增量更新Rust 的所有权系统和生命周期机制天然地和设计图模式存在张力,主要体现在闭包捕获的生命周期问题和类型擦除的代价egui 走即时模式,根本没有设计图,用每帧全量重算换取零状态同步Iced 有设计图但 diff 更粗粒度,用简单性换极致性能Dioxus 有设计图(Virtual DOM)但用运行时 diff,因为要兼容 Web DOM 的动态类型。

jackchuanqi的博客 123
上一篇: 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
chuwan7172
博客等级 码龄10年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值