kitchendDevice/pageTwo/count/food-copy.vue

1320 lines
37 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<!-- 搜索 -->
<search ref="search" :voice="true" @handleSearch="handleSearch" @mic="onShowSearchType(1)"
@camera="onShowSearchType(2)"></search>
<view class="box menu">
<!-- 头部1级菜单栏 -->
<view class="tab_list">
<scroll-view class="scroll-menu" scroll-x="true" style="white-space: nowrap;">
<view class="tabbar" v-for="(ite,ind) in menuTop" :key="ind" @click="handleToggle(ind)">
<view :class="[index ==ind?'active':'']">{{ite.name}}</view>
</view>
</scroll-view>
</view>
<!-- 左侧2菜单栏 -->
<view class="left">
<view class="name" v-for="(ite,ind) in menu2" :key="ind" :class="[leftInd==ind?'active':'']"
@click="handleToggleLeft(ind)">
{{ite.name}}
</view>
</view>
<!-- 右侧商品 -->
<view class="right">
<!-- <view class="right_list">
<view class="list mt-20">
<view class="item" v-for="(it,id) in menu3" :key="id" @click="handleDetail(it)">
<text>{{it.name}}</text>
</view>
</view>
</view> -->
<food-item :foodList="menu3" @scroll="onScrollBottom" @select="handleDetail"></food-item>
<view v-if="!menu3.length" class="nolist">
<icon class="iconfont icon-wancan"></icon>
<text>还没有数据哦!</text>
</view>
</view>
</view>
<!-- 底部购物车 -->
<view class="groupbtn">
<view class="che" @click="isShop =! isShop">
<text v-if="ActiveList.length">{{ActiveList.length}}</text>
<!-- <image src="../../static/pan.png"></image> -->
<icon class="t-icon t-icon-canpan"></icon>
</view>
<view class="subbtn" @click="handlesubbtn"> 确定</view>
</view>
<!-- 购物车列表 -->
<view class="wrapper activeList" v-if="isShop">
<view class="bg" @click='isShop=false'>
<view class="box" @click.stop>
<view class="title">共{{ActiveList.length}}条记录</view>
<view class="list" v-if="ActiveList.length">
<view class="item" v-for="(ite,ind) in ActiveList" :key="ind">
<view class="">
<text class="name">{{ite.name}}</text>
<text>{{ite.weight}}{{ite.unit}}</text>
</view>
<icon class="iconfont icon-ashbin" @click="handledelactive(ite)"></icon>
</view>
</view>
<view v-else class="nolist list">
<icon class="iconfont icon-wancan"></icon>
<text>还没有记录哦</text>
</view>
</view>
</view>
</view>
<uni-drawer ref="showRight" mode="right" width="300" @change="FoodDetailChange">
<scroll-view style="height: 100%;" scroll-y="true">
<view class="foodDetail">
<view class="foodInfo">
<image :src="activeFoodDetail.pic_url" mode="aspectFill"></image>
<view class="info">
<view class="name">{{activeFoodDetail.name}}</view>
<view class="kcal">{{Number(activeType.kcal*activeType.weight/100).toFixed(1)}}千卡</view>
</view>
</view>
<view class="foodContent">
<view class="title">热量和营养</view>
<view class="progress">
<div class="chart-wrap">
<qiun-data-charts type="ring" :opts="opts" :canvas2d="true" canvasId="foodCharts2" :chartData="chartData" :cHeight="250"
:cWidth="250" />
<view class="uchart-kcal">{{Math.floor(activeType.kcal*activeType.weight/100)}}</view>
</div>
<view class="info" v-if="activeType.nutrients_four">
<view class="info-item" v-for="(item,index) in activeType.nutrients_four.slice(1)" :key="index">
<view class="color" :style="{'background-color':`${item.color}`}"></view>
<view>{{item.name}}{{item.proportion}}%</view>
</view>
</view>
</view>
<view class="tips">
<text>营养素</text>
<text>{{activeType.weight}}克含量</text>
</view>
<view class="foodDetailList">
<view class="foodDetailItem" v-for="(item,index) in activeFoodDetail.nutrients_list" :key="index">
<view class="name">{{item.name_ch}}</view>
<view class="value">{{Number(item.value*activeType.weight/100).toFixed(2)}}{{item.unit}}</view>
</view>
</view>
</view>
</view>
</scroll-view>
</uni-drawer>
<!-- 测量区 -->
<view class="wrapper" v-if="IsWeight && !IsFoodDetail">
<view class="bg" @click='IsWeight=false'>
<view class="box" @click.stop>
<view class="title">
<view class="cancel">
<icon class="iconfont icon-error" @click="Cancelword()"></icon>
</view>
</view>
<view class="foodItem" @click="showFoodDetail(activeType)">
<view class="left">
<image :src="activeType.pic_url" mode="aspectFill"></image>
<view class="info">
<view class="name">{{activeType.name}}</view>
<view class="kcal">{{activeType.kcal}}千卡/100克</view>
</view>
</view>
<view class="more">查看营养含量</view>
</view>
<view class="foodInfo">
<view class="foodInfoItem" v-for="(item,index) in activeType.nutrients_four" :key="index">
<view class="name">
<view class="color" :style="{'background-color':item.color}" v-if="item.color != ''"></view>
<text>{{item.name}}({{unitConversion(item.unit)}})</text>
</view>
<view class="value">{{ Number(activeType.weight/100 * item.value).toFixed(1) }}</view>
</view>
</view>
<view class="weight" @click="handleWeight()">
<image class="chengIcon" src="../../static/chengIcon.png" mode="widthFix"></image>
</view>
<!-- <view class="name">{{activeType.name}}</view> -->
<view class="val">
<text>{{activeType.weight?Number(activeType.weight).toFixed(1):'0'}}</text>克
</view>
<view class="mybrankmask" v-if="wordType == 1">
<view class="MymaskAll">
<view class="MymaskList">
<view class="maskListItem" @click="NumberCk(1)">1</view>
<view class="maskListItem" @click="NumberCk(2)">2</view>
<view class="maskListItem" @click="NumberCk(3)">3</view>
</view>
<view class="MymaskList">
<view class="maskListItem" @click="NumberCk(4)">4</view>
<view class="maskListItem" @click="NumberCk(5)">5</view>
<view class="maskListItem" @click="NumberCk(6)">6</view>
</view>
<view class="MymaskList">
<view class="maskListItem" @click="NumberCk(7)">7</view>
<view class="maskListItem" @click="NumberCk(8)">8</view>
<view class="maskListItem" @click="NumberCk(9)">9</view>
</view>
<view class="MymaskList">
<view class="maskListItem" @click="NumberCk('.')">.</view>
<view class="maskListItem" @click="NumberCk(0)">0</view>
<view class="maskListItem" @click="Cancelword()">
<image src="../../static/Clear.png"></image>
<!-- <image class="rulerIcon" src="../../static/ruler.png"></image> -->
</view>
</view>
</view>
<view class="MymaskList MymaskList2">
<view class="maskListItem text" @click="Tuige()">
<image src="../../static/close.png" class="close"></image>
</view>
<view class="maskListItem text" @click="Clear()">清空</view>
<view class="maskListItem width48" @click="Next()">保存</view>
</view>
</view>
<!-- <view class="rulerWrap" v-else>
<ruler ref="ruler" :min="0" :max="1000" :disable="false" :multiple="1" :point="0" :defaultValue="activeType.weight"
@change="rulerChange"></ruler>
<view class="rulerBtn">
<image src="../../static/keybord.png" @click="Changeword()"></image>
<view class="confirm" @click="Next()">保存</view>
</view>
</view> -->
</view>
</view>
</view>
<!--蓝牙连接区 -->
<view id="wrapper" class="wrapper" v-show="isBle && !IsFoodDetail">
<view class="bg" @click='isBle=false'>
<view class="box" @click.stop>
<view class="title">
<icon class="iconfont icon-error" @click='isBle=false'></icon>
</view>
<view class="foodItem" @click="showFoodDetail(activeType)">
<view class="left">
<image :src="activeType.pic_url" mode="aspectFill"></image>
<view class="info">
<view class="name">{{activeType.name}}</view>
<view class="kcal">{{activeType.kcal}}千卡/100克</view>
</view>
</view>
<view class="more">查看营养含量</view>
</view>
<view class="foodInfo">
<view class="foodInfoItem" v-for="(item,index) in activeType.nutrients_four" :key="index">
<view class="name">
<view class="color" :style="{'background-color':item.color}" v-if="item.color != ''"></view>
<text>{{item.name}}({{unitConversion(item.unit)}})</text>
</view>
<view class="value">{{ Number(activeType.weight/100 * item.value).toFixed(1) }}</view>
</view>
</view>
<view class="weight" @click="handleMannulWeight()">
<image class="keybordIcon" src="../../static/keybordIcon.png" mode="widthFix"></image>
</view>
<view class="blue-tooth">
<blue-tooth @handleBle="handleBle" :weightType="'2'" :weightKcal="weightKcal" @realTimeWeight="realTimeWeight"></blue-tooth>
</view>
</view>
</view>
</view>
<view class="auto-search-dialog" v-if="showAutoSearchDlg">
<view class="auto-search-inner">
<text>{{autoSearchContent != '' ? `识别到你描述的食材为“${autoSearchContent}”,是否查找食材“${autoSearchContent}”` : "长安麦克风图标开始说话,松开后结束"}}</text>
<view class="mic-icon" :style="{'border-color':mic_touch ? '#18bc37' : '#777777'}"
@touchstart="onVoiceTouchStart" @touchend="onVoiceTouchEnd"
v-if=" autoSearchType == 1 && autoSearchContent == ''">
<uni-icons type="mic-filled" size="80" :color="mic_touch ? '#18bc37' : '#777777'"></uni-icons>
</view>
<view class="btn-wrap" v-else>
<view class="retry" @click="retrySearch">重试</view>
<view class="confirm" @click="handleVoiceSearch(autoSearchContent)">确定</view>
</view>
<uni-icons class="close" type="close" color="#ffffff" size="45" @click="showAutoSearchDlg=false"></uni-icons>
</view>
</view>
</view>
</template>
<script>
import {
mapState
} from "vuex";
let myTime
import search from "../../components/search.vue"
import blueTooth from "../../components/bluetooth_food.vue"
import FoodItem from "../../components/food_item.vue"
// import ruler from "../../components/select-ruler/select-ruler.vue"
import qiunDataCharts from '@/uni_modules/qiun-data-charts/components/qiun-data-charts.vue';
const plugin = requirePlugin("WechatSI")
export default {
components: {
search,
blueTooth,
FoodItem,
qiunDataCharts,
// ruler
},
data() {
return {
typename: "",
typeind: 0,
index: 0,
leftInd: 0,
menu: [],
menu2: [],
menu3: [],
myvalue: [],
searchResults: [],
ActiveList: [],
activeType: {},
IsWeight: false,
isShop: false,
isBle: false,
IsFoodDetail: false,
weightKcal: "",
kcal: "",
weight: "",
stopblue: true,
page: 1,
loading: false,
autoSearchType: 1, //搜索类型1语音识别 2图像识别
voiceManager: null,
autoSearchContent: '',
isConnection: 0, //是否连接成功
showAutoSearchDlg: false,
mic_touch: false,
activeFoodDetail: {},
wordType: 1,
chartData: {},
opts: {
dataLabel: false,
color: ["#5180D8","#ED7886","#FFB169"],
background: "transparent",
canvas: {
background: "transparent"
},
legend: {
show: false // 这个设置将隐藏图例
},
title: {
name: "",
fontSize: 20,
offsetY: -3,
color: "#333333"
},
subtitle: {
name: "千卡",
fontSize: 14,
offsetY: 12,
color: "#888888"
},
extra: {
ring: {
ringWidth: 10,
labelWidth: 0,
border: false,
// customRadius: 50
}
}
},
};
},
watch: {
activeType: {
handler(newVal, oldVal) {
console.log(newVal)
},
deep: true
}
},
computed: {
...mapState(["user", 'isConnected', "isBluetoothTyle", 'foodList']),
menuTop() {
this.menu2 = this.foodList.length ? this.foodList[0].list : []
return [...this.foodList, {
id: 4,
list: [],
name: '搜索'
}]
},
getKcal() {
if(this.activeFoodDetail) {
return this.activeFoodDetail.kcal
}
return 0
}
},
onLoad(options) {
let that = this
that.typename = options.name
that.typeind = options.ind
that.handleHomeInfo()
},
mounted() {
let that = this
that.voiceManager = plugin.getRecordRecognitionManager()
that.voiceManager.onStop = function(res) {
that.autoSearchContent = res.result.replace('。', '')
}
that.voiceManager.onError = function(res) {
console.error("error msg", res.retcode)
}
that.voiceManager.stop()
},
methods: {
showFoodDetail(item) {
this.activeFoodDetail = item
this.$refs.showRight.open();
this.IsFoodDetail = true
let chart_data = []
this.opts.color = []
// if(this.activeType.weight == '') {
// this.opts.title.name = '0'
// }else {
// this.opts.title.name = Math.floor(item.kcal * this.activeType.weight/100)
// }
for (let i = 1; i < item.nutrients_four.length; ++i) {
this.opts.color.push(item.nutrients_four[i].color)
chart_data.push({
name: item.nutrients_four[i].name,
value: Number(item.nutrients_four[i].proportion),
})
}
this.chartData = JSON.parse(JSON.stringify({
series: [{
data: chart_data
}]
}));
},
getKcal() {
this.opts.title.name = this.activeFoodDetail.nutrients_four[0].value * this.activeType.weight
},
FoodDetailChange(show) {
this.IsFoodDetail = show
},
handleHomeInfo() {
let that = this
that.loading = true
that.$model.getCookFoodList({
food_level2_id: that.menu2[that.leftInd].id,
page: that.page,
search_data: that.name
}).then(res => {
if (res.code != 0) return
that.lastPage = res.data.page_total
that.loading = false
that.menu3 = that.menu3.concat(res.data.content_list)
})
},
// 头部切换
handleToggle(ind) {
let that = this
that.index = ind
that.leftInd = 0
that.menu2 = that.menuTop[ind].list
that.menu3 = []
that.page = 1
if (that.menu2.length) {
that.handleHomeInfo()
}
},
// 左侧切换
handleToggleLeft(ind) {
let that = this
that.leftInd = ind
that.menu3 = []
that.page = 1
that.handleHomeInfo()
},
onScrollBottom() {
let that = this
if (!this.lastPage || this.page >= this.lastPage) {
uni.showToast({
title: '没有更多数据!',
icon: 'none'
})
return
}
this.page++
if (that.menu2.length) {
that.handleHomeInfo()
}
},
// 搜索
handleSearch(name) {
let that = this
let list = []
that.$model.getFoodSearch({
food_name: name
}).then(res => {
if (res.code != 0) {
uni.showToast({
title: res.msg,
icon: 'error'
})
return
}
that.index = 3
that.menu2 = []
that.menu3 = res.data
})
},
handleVoiceSearch() {
let that = this
if (that.autoSearchContent != '') {
that.$refs.search.searchByName(that.autoSearchContent)
that.showAutoSearchDlg = false
that.autoSearchContent = ''
}
},
// 商品选择
handleDetail(ite) {
var that = this;
that.myvalue = []
that.activeType = ite
that.activeType.weight = 0
// that.IsWeight = true
that.weightKcal = that.activeType.kcal
that.isShop = false
that.isBle = true
console.log("选中的商品", ite)
},
// 购物车提交
handlesubbtn() {
let that = this
if (that.ActiveList.length <= 0) return
that.$model.getAddIntakeFood({
aud_id: that.user.aud_id,
meals_type: that.typename,
food_list: that.ActiveList
}).then(res => {
if (res.code != 0) return
uni.navigateBack({
delta: 1
})
})
},
//删除购物车食材
handledelactive(ite) {
let that = this
that.ActiveList.splice(that.ActiveList.indexOf(ite), 1);
},
// 键盘点击
NumberCk(val) {
let that = this
that.myvalue = that.myvalue[0] == '.' ? [0, '.'].concat(val) : that.myvalue.concat(val)
if (that.myvalue.toString().indexOf('.') != -1) {
let ind = that.myvalue.indexOf(".")
that.myvalue = that.myvalue.slice(0, ind + 2)
}
if (that.myvalue.toString().indexOf('.') == -1 && that.myvalue.length > 3) {
that.myvalue = ["9", "9", "9"]
}
that.activeType.weight = that.myvalue.join("")
},
// 键盘退格
Tuige() {
let that = this
var txt = that.myvalue
if (txt.length >= 1) {
if (txt[txt.length - 2] != '.') {
that.myvalue = txt.slice(0, txt.length - 1)
} else {
that.myvalue = txt.slice(0, txt.length - 2)
}
}
that.activeType.weight = that.myvalue.join("")
// console.log("退格1", txt, that.myvalue.join(""))
},
// 键盘取消
Cancelword() {
this.IsWeight = false
this.myvalue = []
this.activeType = {}
// console.log("取消")
},
//切换键盘
Changeword() {
this.wordType = this.wordType == 1 ? 2 : 1
},
// 键盘清空
Clear() {
this.myvalue = []
this.activeType.weight = null
// console.log("清空")
},
// 键盘保存
Next() {
let that = this
let ite = that.activeType
that.IsWeight = false
if (that.ActiveList.indexOf(ite) == -1) {
that.ActiveList.push(ite);
} else {
let index = that.ActiveList.indexOf(ite)
that.ActiveList[index].weight = that.activeType.weight;
that.ActiveList[index].unit = that.activeType.unit;
}
console.log("保存", that.ActiveList)
},
rulerChange(val) {
this.activeType = Object.assign({}, this.activeType, { weight: val })
},
// 测量
handleWeight() {
let that = this
that.weightKcal = that.activeType.kcal
that.isBle = true
that.IsWeight = false
},
// 手动测量
handleMannulWeight() {
let that = this
that.isBle = false
that.IsWeight = true
},
//测量返回
handleBle(weight, unit, kcal) {
let that = this
that.isBle = false
that.activeType.weight = weight
that.activeType.unit = unit
that.activeType.kcal = kcal
that.Next()
console.log("返回", that.activeType, weight, unit, kcal)
},
//实时重量
realTimeWeight(weight,unit) {
if(!this.IsWeight) {
this.activeType = Object.assign({}, this.activeType, { weight: this.convertToGrams(weight,unit) })
}
},
onShowSearchType(type) {
let that = this
this.autoSearchType = type
if (type == 1) {
that.showAutoSearchDlg = true
} else if (type == 2) {
that.selectPhoto()
}
},
retrySearch() {
let that = this
that.autoSearchContent = ''
if (that.autoSearchType == 2) {
that.showAutoSearchDlg = false
that.selectPhoto()
}
},
selectPhoto() {
let that = this
uni.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
sizeType: ['compressed'],
camera: 'back',
success(res) {
const tempFilePath = res.tempFiles[0].tempFilePath
uni.getFileSystemManager().readFile({
filePath: tempFilePath,
encoding: 'base64',
success: (res) => {
const base64 = 'data:image/jpeg;base64,' + res.data
uni.showLoading({
title: '图片识别中...',
mask: true
})
that.$model.getPhotoSearch({
img_str: base64,
}).then(res => {
uni.hideLoading()
if (res.code != 0) return
that.autoSearchContent = res.data.name
that.showAutoSearchDlg = true
})
},
fail: (err) => {
console.error('读取文件失败:', err)
}
})
},
fail(err) {
console.error('拍照失败:', err)
}
})
},
onVoiceTouchStart() {
let that = this
that.mic_touch = true
that.voiceManager.start({
duration: 60000,
lang: "zh_CN"
})
},
onVoiceTouchEnd() {
let that = this
that.mic_touch = false
that.voiceManager.stop()
},
unitConversion(unit) {
if (unit == 'kcal') {
return '千卡'
} else if (unit == 'g') {
return '克'
}
return unit
},
convertToGrams(value, fromUnit) {
const conversionFactors = {
'lb': 453.59237, // 1磅 = 453.59237克
'oz': 28.349523125, // 1盎司 = 28.349523125克
'kg': 1000, // 1公斤 = 1000克
'g': 1
};
if (!conversionFactors.hasOwnProperty(fromUnit)) {
return ''
}
return value * conversionFactors[fromUnit];
}
}
}
</script>
<style lang="scss" scoped>
.tab_list {
display: flex;
margin: 100rpx -20rpx 0;
justify-content: space-between;
.scroll-menu {
width: 100%;
.tabbar {
padding: 20rpx;
display: inline-block;
view {
display: inline-block;
}
}
}
.active {
color: #fff;
padding: 5px 8px;
border-radius: 5px;
background-color: #ff4c4f;
}
}
.left {
top: 90px !important;
}
.right {
top: 90px !important;
.list {
display: block !important;
column-count: 3;
/* 分成两列 */
column-gap: 20rpx;
/* 列间距 */
}
.item {
break-inside: avoid;
/* 防止元素被分割到不同列 */
border: 1px solid #f7f7f7;
display: flex;
align-items: center;
box-sizing: border-box;
justify-content: space-around;
// height: 60rpx;
border-radius: 5px;
margin: 0 2% 20rpx;
box-shadow: 0 0 10rpx #e1e1e1;
text {
margin-bottom: 0 !important;
padding: 10rpx;
}
}
.icon-xuanzhong {
color: $maincolor;
}
.active0 {
border: 1px solid $maincolor;
}
}
.weightPages {
display: flex;
flex-wrap: wrap;
flex-direction: column;
position: absolute;
left: 0;
right: 0;
bottom: 40rpx;
top: 120rpx;
justify-content: space-around;
.weight {
background: #fff;
color: #666;
font-size: 16px;
flex-wrap: wrap;
text-align: center;
view {
width: 60%;
height: 100rpx;
display: flex;
margin-left: 25%;
align-items: flex-end;
margin-bottom: 30rpx;
text {
width: 80px;
display: inline-block;
border-bottom: 1px solid #dfdfdf;
margin: 0 20rpx;
font-size: 18px;
font-weight: bold;
color: #f0ae43;
}
}
}
.tips {
font-size: 24rpx;
text-align: center;
}
.btn {
color: #fff;
width: 80%;
margin-left: 10%;
}
.table {
width: 100%;
font-size: 16px;
font-weight: bold;
text-align: center;
margin: 30rpx 0;
}
.image {
width: 1120rpx;
height: 1120rpx;
margin: auto;
image {
width: 100%;
height: 100%;
}
}
.tips {
margin-bottom: 30rpx;
margin-left: 30rpx;
display: flex;
color: #999;
}
}
.groupbtn {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20rpx;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 55px;
z-index: 15;
background-color: #fff;
overflow: hidden;
box-shadow: 0px 1px 5px 2px #dfe2e1fc;
.subbtn {
color: #fff;
width: 40%;
text-align: center;
border-radius: 20rpx;
height: 31px;
line-height: 31px;
background-color: $maincolor;
}
.che {
width: 100rpx;
height: 80rpx;
position: relative;
text {
position: absolute;
height: 30rpx;
background: red;
width: 30rpx;
border-radius: 50%;
display: inline-block;
color: #fff;
line-height: 30rpx;
text-align: center;
font-size: 24rpx;
right: 0;
top: 5px;
}
image,
.t-icon {
width: 100rpx;
height: 100rpx;
margin-top: -3px;
border-radius: 50%;
}
}
}
.menu {
.left {
bottom: 55px;
height: calc(100vh - 1100rpx);
}
.right {
bottom: 55px;
height: calc(100vh - 1100rpx);
}
}
.activeList {
z-index: 12;
bottom: 100rpx;
.title {
font-weight: bold;
margin: 5px 0;
}
.list {
padding-bottom: 55px;
.name {
margin-right: 5px;
}
}
}
.voice-photo-wrap {
display: flex;
flex-direction: column;
justify-content: space-between;
position: fixed;
bottom: 200rpx;
right: 0;
width: 70rpx;
height: 160rpx;
.voice {
border-radius: 35rpx;
background-color: #70a1ff;
.voice-icon {
width: 70rpx;
height: 70rpx;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAY1BMVEUAAAD+/v7+/v7////////+/v7////////+/v7////+/v7////+/v7////+/v7+/v7////+/v7////+/v7+/v7////+/v7+/v7////+/v7+/v7////+/v7+/v7+/v7///////8gTHxJAAAAIHRSTlMAkL8QIPcwoLAI32DXUO9IKMd4p5iIaOcYt1hAOM9wgPxxuZIAAAMsSURBVGje7djpcqQgEADg9kDF0fF2PMd+/6dcYRajwTERsTab8vsTClPVabqJCFwuP0TVpIaXGWlTwUms0iQomCmFEzzvuHB/ag/j+CgJHNCqEWn0tevWAfmbTAQa3ZBLykqUJ0EuBW0iZPxmPhe+1k9bLvGdp2EtZ62azZIY9OBL48rzLi8S1VeQBGSU51KCBtRn9bBghf1gj3SkEvI/dyPJEI7L2LaDNwJercMoa60B3ijYljy+Xh2OnM2nnZaSEHiL5dnAUU+pJFJRnqBAWnVze6MacJSxHcTUFiQIRw6FpZbN9pqCCJm0fxjNQdCez9t4ShBizectckaQxw0Wygef/r+66wryI4JYqfsSsMYaf+aRdFAyxmnWYr37ktLdJxTJ7fM7QFLvTARlOSzkKLOOBZEzafQEMb2Rz2rCBqV0VMnGWfZm9NljUzGIs6e7nCvI7wtC/FEfwUKUsFlyOMjWm5ES5DQHwRhmYtQfRP4OqjUH6W+jEJZoyGYDbUG8s7ur+LqFCzbo9gcBHIV7TvURjmAfIj4Um+3vEyK+T0r+e/v4YhlaqXmlRm7FsvqwjylehRbZukIZpr8/57XbQXTutB96ulGSbBoZKtcQ9jQqYVWJoiSxGO1RTatkvb92oP70KN3dwSJ98yOpbC1K/XG+MHmn73WbuooGbDjQ9a+KQHQZT1xlvTw+bMlaLtRls8QBxmNDG3bLxWWDuB1MWphpg9lhrEPFO5aYfPx7L5CrQ5FNVCNXzA61NijIZ+tcivvTOi+GzCTLQ+XzdYpVYZPZTWZ7R8kjEvegoiIKbvObTKsguEAGa34P+gRFHo78WPRb4c+yMCqRcCBuEtRYwd9VEZw0z5LEM0obhI7nEVigzPbxi6V4vvohhgPiBzLem6ra3iuGA4fYJnL5SpjKQK634SCaIUfckC7mo5wgl1lw3CB69+6lTVdRGndhapKpk0ELOyO4QlRLlzbBVWYLOjliJ873owPadYPXi3ULvKKD07T8oEXhVPbKm+MKcgW5gvyKIHZqfOby16Q0PcSgqLrjt/kVqIlwh1A1E4LfRpTrFHnmN7kRXC7/xB8ZerD103/W/wAAAABJRU5ErkJggg==);
background-size: cover;
}
}
.photo {
border-radius: 35rpx;
background-color: #ffbe76;
.photo-icon {
width: 70rpx;
height: 70rpx;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAXVBMVEUAAAD////////////+/v7////////+/v7+/v7////////////////+/v7+/v7+/v7////+/v7+/v7+/v7+/v7////+/v7+/v7+/v7+/v7+/v7+/v7////+/v7///9dayJ/AAAAHnRSTlMAoDBf71BA3/eACCWI18+/eDjHso8Q56dYl2hHGG/EjhawAAABlUlEQVRo3u2W23KDIBBAEUERvF8ac+P/P7MVWiYDmk7o8tDMnrddlxydNe4SBEEQBEGQpFTZIfV2nbvwEi8R+hCxbDfhwizaUegnFECS/pmkApJ0zyQTgMS1RJQBbMt/fBXcXaqOdQx6wz/uHoCSl1mKgNo12INbexEgf5FQfcDOQakPoJGSca+4BZbMe8VnYAnfK+bAErVXfPuT5Mx99quv3GN+QZKTSHKUvKvkNtBbWsl6YuazP63JJNdSOxqeRjIHcxdekmmPE7yk1wE1tGT46UW1rlWrDWIAlnT2Z+0FmQsTdrCSwTrc6cJaKJzEdaQnjrvtCqikMyuWJA7JzOQHlZTBOzsZLahEBMvEbJoEKvkIFt0zvKTZsu1jZjQZUMnp+w12KLvEg0q4/+ebTOICKlmYvXNpQ5mZkC2gElI9jBHJR/e1B5XIUltYOzJtKRdgCVFMezAKP7SupecYUoxf1Tw6WpVmkZAX9zBNnm4lkqrPpi7r6TtskChByX+QsFjEC5J4UAIvURkAiiAIgiAIggDxCa/TqV5BIswVAAAAAElFTkSuQmCC);
background-size: cover;
}
}
}
.auto-search-dialog {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 999;
.auto-search-inner {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
position: relative;
width: 70%;
height: 350rpx;
padding: 80rpx 0;
background-color: #fff;
border-radius: 20rpx;
box-shadow: 0 0 20rpx #ccc;
.close {
position: absolute;
left: 0;
right: 0;
bottom: -140rpx;
width: 90rpx;
margin: 0 auto;
}
}
text {
font-size: 32rpx;
width: 80%;
}
.mic-icon {
display: flex;
justify-content: center;
align-items: center;
width: 150rpx;
height: 150rpx;
border-radius: 50%;
border: 8rpx solid #777777;
}
.btn-wrap {
display: flex;
justify-content: space-around;
width: 90%;
.retry,
.confirm {
width: 190rpx;
height: 60rpx;
line-height: 60rpx;
text-align: center;
font-size: 28rpx;
border: 2rpx solid #777;
border-radius: 15rpx;
}
}
}
.foodDetail {
background-color: #F7F7F7;
padding: 20rpx;
box-sizing: border-box;
.foodInfo {
display: flex;
width: 100%;
padding: 30rpx;
border-radius: 20rpx;
box-sizing: border-box;
background-color: #fff;
box-sizing: 0 0 20rpx #f1f1f1;
image {
width: 90rpx;
height: 90rpx;
border-radius: 15rpx;
}
.info {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 30rpx;
.name {
font-size: 28rpx;
font-weight: 700;
margin-bottom: 10rpx;
}
.kcal {
font-size: 24rpx;
color: #666;
}
}
}
.foodContent {
width: 100%;
padding: 30rpx;
margin-top: 16rpx;
box-sizing: border-box;
border-radius: 20rpx;
box-sizing: border-box;
background-color: #fff;
box-sizing: 0 0 20rpx #f1f1f1;
.title {
font-size: 28rpx;
font-weight: 600;
}
.progress {
display: flex;
align-items: center;
.chart-wrap {
position: relative;
width: 250rpx;
height: 250rpx;
margin-top: -30rpx;
.uchart-kcal {
position: absolute;
left: 60rpx;
top: 120rpx;
width: 130rpx;
font-size: 40rpx;
text-align: center;
z-index: 9;
}
}
.info {
display: flex;
flex-direction: column;
justify-content: center;
font-size: 24rpx;
.info-item {
display: flex;
align-items: center;
margin-top: 20rpx;
.color {
width: 6rpx;
height: 20rpx;
margin-right: 10rpx;
border-radius: 3rpx;
}
}
}
}
.tips {
display: flex;
justify-content: space-between;
border-bottom: 1px solid #f1f1f1;
padding: 16rpx 0;
font-size: 24rpx;
margin-top: 10rpx;
}
.foodDetailList {
margin-top: 10rpx;
.foodDetailItem {
display: flex;
justify-content: space-between;
padding: 20rpx 0;
box-sizing: border-box;
.name {
font-size: 24rpx;
color: #777;
}
.val {
font-size: 24rpx;
font-weight: 700;
color: #333;
}
}
}
}
}
.icon-error {
position: absolute;
right: 10rpx;
top: -35rpx;
font-size: 100rpx;
background: #fff;
border-radius: 50%;
width: 100rpx;
height: 100rpx;
}
.wrapper {
.box {
height: 800rpx !important;
padding: 30rpx !important;
.weight {
position: absolute;
right: 10rpx;
top: 260rpx;
padding: 10rpx;
z-index: 99;
}
.mybrankmask .rulerIcon {
width: 60rpx !important;
height: 60rpx !important;
}
.rulerWrap {
margin-top: 50rpx;
.rulerBtn {
display: flex;
justify-content: center;
align-items: center;
margin-top: 50rpx;
image {
width: 50rpx;
height: 50rpx;
}
.confirm {
width: 60%;
height: 60rpx;
line-height: 60rpx;
text-align: center;
font-size: 32rpx;
color: #fff;
border-radius: 30rpx;
background-color: #ffbe76;
margin-left: 50rpx;
}
}
}
.val {
margin: 50rpx 0 !important;
font-size: 40rpx;
text {
font-size: 80rpx !important;
width: 180rpx !important;
}
}
.keybordIcon {
width: 50rpx;
height: 43rpx;
}
.chengIcon {
width: 50rpx;
height: 50rpx;
}
}
.foodItem {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 10rpx;
.more {
padding: 8rpx 15rpx;
border-radius: 12rpx;
color: #fff;
background-color: #f0ae43;
}
image {
width: 90rpx;
height: 90rpx;
border-radius: 15rpx;
}
.left {
display: flex;
align-items: center;
.info {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 30rpx;
.name {
font-size: 26rpx;
color: #333;
text-align: left;
margin-bottom: 10rpx;
}
.kcal {
font-size: 24rpx;
color: #666;
}
}
}
}
.foodInfo {
display: flex;
justify-content: space-around;
margin-top: 30rpx;
padding: 0 20rpx;
box-sizing: border-box;
.foodInfoItem {
display: flex;
flex-direction: column;
align-items: center;
.name {
display: flex;
align-items: center;
font-size: 24rpx;
color: #8F8F8F;
.color {
width: 6rpx;
height: 20rpx;
margin-right: 10rpx;
border-radius: 3rpx;
}
}
.value {
font-size: 28rpx;
margin-top: 10rpx;
}
}
}
.blue-tooth {
margin-top: 80rpx;
}
}
</style>