kitchendDevice/pages/index/index.vue

587 lines
12 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">
<view class="box1 box" v-if="!token" @click="handleLogin">
<view class="info2">
{{$t('msgLoginTips')}}
</view>
</view>
<!-- 个人资料 -->
<view v-if="token" class="content-box">
<view class="box" v-if="info.aud_id">
<view class="info">
<view class="name" @click="handleUserEdit">
<image :src="info.head_pic"></image>
<text class="bold">{{info.nickname}}</text>
<text>{{info.gender=='1'?$t('infoMan'):$t('infoWoman')}}</text>
</view>
<view class="edit" @click="handleUserEdit">
<image src="/static/26.png"></image>
</view>
</view>
<view class="age">
<view class="age-item">
<view><text>{{info.age}}</text></view>
<view>{{$t("infoAge")}}</view>
</view>
<view class="age-item age-item2">
<view><text>{{info.weight}}</text></view>
<view>{{$t("infoWeight")}}</view>
</view>
<view class="age-item">
<view><text>{{info.height}}</text></view>
<view>{{$t("infoHeight")}}</view>
</view>
</view>
</view>
<view class="box1 box" v-else @click="handleUserEdit">
<view class="info2">
{{$t('msgAddUser')}}
</view>
</view>
</view>
<!-- 计食器 -->
<view class="jishiqi">
<view class="top">
<view class="date">{{foodInfo.date}}</view>
<view class="detail" @click="navTo('/pageTwo/count/everyDay?page=home')">
<image src="/static/fenxi.png"></image>
{{$t('titleeveryDay')}}
</view>
</view>
<view class="left" v-if="foodInfo.list.length">
<view class="chart-wrap">
<qiun-data-charts v-if="handTrue" type="arcbar" :chartData="chartData" :cHeight="320"
:cWidth="320" />
<view class="center">
{{$t('countIntake')}}
<text>{{foodInfo.nutrients_four[0].today_intake}}</text>
<view class="unit">Kcal</view>
</view>
</view>
<view class="mubiao">
{{$t('titleBody')}}<text>{{foodInfo.nutrients_four[0].suggestion}}</text>kcal
</view>
</view>
<view class="right" v-if="foodInfo.list.length">
<view class="item" v-for="(ite,ind) in foodInfo.nutrients_four.slice(1)">
<view class="left-icon">
<image :src="ite.icon"></image>
<view class="val" :style="{color:ite.color}">{{ite.proportion_fp||0}}%</view>
</view>
<view class="right-info">
<view class="right-info-top">
<text class="name">{{ite.name}}</text>
<text class="">
{{ite.today_intake||0}}/{{ite.suggestion||0}}g
</text>
</view>
<view class="right-info-bottom">
<view class="val" :style="{ width: ite.proportion + '%',background:ite.color}">
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 早午餐 -->
<view class="tools" v-if="foodInfo.list.length">
<view class="tools-item" v-for="(ite,ind) in foodInfo.list">
<view class="title">
<image :src="ite.icon"></image>
<text>{{ite.name}}</text>
</view>
<view class="kcal">
<text>{{ite.val}}</text>kcal
</view>
<view class="tools-btn" @click="navTo('/pageTwo/count/search?index='+ind+'&time='+foodInfo.date)">
{{$t('btnAdd')}}
</view>
<view class="add" @click="navTo('/pageTwo/count/everyMeal?page=home&index='+ind)">
<image src="/static/xiangqing.png"></image>
</view>
</view>
</view>
<!-- 搜索 -->
<!-- <view class="serachBox">
<view class="title">
<view class="quan mr-5"></view>教你做
</view>
<view class="searchInput">
<div class="search-wrap" @click="navTo('/pages/search/search')">
<text>输入食材快速搜索菜谱</text>
<image src="/static/28.png"></image>
</div>
</view>
</view> -->
<!-- 轮播 -->
<view class="f_banner footbox" v-if="configInfo.banner_data.length">
<swiper class="swiper" circular="true">
<swiper-item v-for="(ite,index) in configInfo.banner_data" @click="$tools.NewsPtype(ite)">
<image :src="ite.pic" mode="aspectFill"></image>
</swiper-item>
</swiper>
</view>
</view>
</template>
<script>
import {
mapState
} from "vuex";
import qiunDataCharts from '@/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue';
export default {
data() {
return {
token: "",
handTrue: false,
unwatch: null,
chartData: {
series: [{
data: 0,
color: "#3CB383"
}]
},
}
},
components: {
qiunDataCharts
},
computed: {
...mapState(["configInfo", "user", "countFoodInfo", "bleValue"]),
info() {
return this.user
},
kcalVal() {
return this.configInfo.kcal_data
},
foodInfo() {
let that = this
this.handTrue = false
this.$nextTick(() => {
this.handTrue = true
that.chartData.series[0].data = this.user.aud_id ? Number(this.user.food_count
.nutrients_four[0].proportion) / 100 : 0
})
return this.user.aud_id ? this.user.food_count : this.configInfo.default_count_foot
}
},
onLoad() {
let that = this
uni.setNavigationBarTitle({
title: that.$t('titleHome')
})
that.token = uni.getStorageSync('token')
if (that.token) {
that.$ble.openBluetoothAdapter()
}
that.$ble.onBLEConnectionStateChange()
uni.onBluetoothAdapterStateChange(function(res) {
that.$store.commit("changeBluetooth", res.available);
})
},
onPullDownRefresh() {
let that = this
that.index = 0
that.footlist = []
that.$store.dispatch("getUserInfo")
setTimeout(function() {
uni.stopPullDownRefresh();
}, 500);
},
onShow() {
let that = this
that.handTrue = false
this.$nextTick(() => {
that.handTrue = true
that.chartData.series[0].data = that.user.aud_id ? Number(that.user.food_count
.nutrients_four[0].proportion) / 100 : 0
})
this.startWatching()
},
onHide() {
this.stopWatching()
},
methods: {
startWatching() {
this.unwatch = this.$watch('bleValue', (newVal, oldVal) => {
// 这里可以执行你的业务逻辑
if (newVal.serviceId != '' && newVal.oldCountWeight != newVal.countWeight) {
uni.switchTab({
url: "/pages/count/count"
})
newVal.oldCountWeight = newVal.countWeight
}
}, {
immediate: false, // 是否立即执行
deep: true
})
},
stopWatching() {
if (this.unwatch) {
this.unwatch() // 调用取消监听函数
this.unwatch = null
}
},
// 登录
handleLogin() {
uni.reLaunch({
url: "/pageTwo/login/login"
})
},
// 登录
handleUserEdit() {
uni.navigateTo({
url: "/pageTwo/me/userEdit"
})
},
// 功能页面跳转
navTo(url) {
let that = this
if (!this.token) {
this.$tools.msg(this.$t('msgLoginTips'))
return
}
if (that.info.aud_id == '') {
that.$tools.msg(that.$t('msgAddUser'))
return
}
uni.navigateTo({
url
})
uni.switchTab({
url
})
},
}
}
</script>
<style lang="scss" scoped>
.headerbgimg {
position: absolute;
width: 400rpx;
height: 360rpx;
top: 0;
right: -15%;
}
.content-box {
width: 100%;
position: relative;
overflow: hidden;
}
.chart-wrap {
position: relative;
width: 280rpx;
height: 280rpx;
display: flex;
flex-wrap: wrap;
margin-left: -5px;
.center {
border: none;
width: 280rpx;
height: 210rpx;
position: absolute;
top: 44rpx;
}
}
.box {
width: calc(100% - 100rpx);
background: $maincolor;
display: flex;
padding: 30rpx 20rpx;
align-items: center;
overflow: hidden;
margin: 15px 15px 0;
border-radius: 10px;
flex-wrap: wrap;
.info {
color: #fff;
width: 100%;
display: flex;
align-items: center;
.name {
width: 80%;
display: flex;
font-size: 32rpx;
float: left;
align-items: center;
text {
margin-right: 30rpx;
}
image {
width: 35px;
height: 35px;
margin-right: 15px;
}
}
.edit {
width: 20%;
text-align: right;
float: left;
image {
width: 22px;
height: 22px;
}
}
}
.age {
display: flex;
width: 100%;
justify-content: space-between;
color: #fff;
margin-top: 15px;
.age-item {
width: 33.3%;
text-align: center;
text {
font-size: 20px;
margin-right: 5px;
display: inline-block;
}
}
.age-item2 {
position: relative;
}
.age-item2::after {
content: "";
position: absolute;
left: 0;
top: 10px;
bottom: 10px;
width: 1px;
background-color: #9CDCBF;
}
.age-item2::before {
content: "";
position: absolute;
right: 0;
top: 10px;
bottom: 10px;
width: 1px;
background-color: #9CDCBF;
}
}
}
.jishiqi {
width: calc(100% - 50px);
background: #fff;
padding: 10px 10px 15px;
border-radius: 10px;
margin: 15px;
height: auto;
overflow: hidden;
box-shadow: 0px 1px 5px 2px #dfe2e1fc;
.top {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
}
.date {
font-size: 14px;
font-weight: bold;
}
.detail {
color: #3CB383;
width: auto;
padding: 3px 10px;
background: #fff;
border-radius: 8px;
border: 1px solid #3CB383;
display: flex;
align-items: center;
image {
width: 44rpx;
height: 44rpx;
margin-right: 5px;
}
}
.left {
margin-top: -10px;
}
.right {
margin-top: 0;
}
}
.box1 {
.header {
width: 100rpx;
height: 100rpx;
background: #fff;
text-align: center;
line-height: 100rpx;
image {
width: 80rpx;
height: 80rpx;
color: #fff;
margin-top: 10rpx;
}
}
.info2 {
color: #fff;
font-size: 36rpx;
font-weight: bold;
}
}
.tools {
margin: 0 30rpx 0;
display: flex;
flex-wrap: wrap;
width: calc(100% - 60rpx);
justify-content: space-between;
.tools-item {
width: 42%;
background: #fff;
position: relative;
padding: 10rpx 20rpx;
height: 240rpx;
overflow: hidden;
border-radius: 20rpx;
margin-bottom: 30rpx;
display: flex;
flex-direction: column;
justify-content: space-around;
box-shadow: 0px 1px 5px 2px #dfe2e1fc;
.title {
display: flex;
align-items: center;
font-size: 28rpx;
image {
width: 50rpx;
height: 50rpx;
margin-right: 5px;
}
}
.kcal {
text-align: center;
text {
font-size: 56rpx;
font-weight: bold;
margin-right: 20rpx;
}
}
.tools-btn {
border: 1px solid #9CDCBF;
text-align: center;
border-radius: 20rpx;
width: 60%;
margin-left: 20%;
color: $maincolor;
padding: 3px 0;
}
.add {
width: 48rpx;
height: 48rpx;
position: absolute;
top: 20rpx;
right: 20rpx;
z-index: 999;
image {
width: 100%;
height: 100%;
}
}
.bgimg {
width: 180rpx;
height: 180rpx;
position: absolute;
top: 20rpx;
right: -50rpx;
opacity: 0.6;
}
}
}
.serachBox {
width: calc(100% - 60rpx);
.title {
display: flex;
align-items: center;
font-size: 32rpx;
font-weight: bold;
}
.searchInput {
width: calc(100% - 60rpx);
background-color: #fff;
padding: 30rpx;
margin-top: 20rpx;
border-radius: 20rpx;
}
.search-wrap {
height: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
border: 1px solid $maincolor;
border-radius: 30rpx;
padding: 0 20rpx;
background: #fff;
image {
width: 50rpx;
height: 50rpx;
}
}
}
.f_banner {
width: 100% !important;
height: 450rpx;
margin: 30rpx auto;
/deep/swiper {
height: 450rpx;
}
image {
width: 100%;
height: 100%;
background-size: 100%;
position: relative;
}
}
</style>