You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

522 lines
11 KiB

<template>
<view class="wrap">
<image class="bg" :src="require('@/static/qus-bg.jpg')" mode=""></image>
<view class="me" :style="{paddingTop: navBarTop+'px'}">
<view class="me-avatar" @click="showform = true,maskClose=true">
<image :src="info.headimgurl?info.headimgurl:headReplace" mode=""></image>
<view class="">
{{info.name?info.name:''}}
</view>
</view>
<view class="me-list">
<view class="me-list-item" v-for="item in list" @click="toUrl(item)">
<view class="me-list-item-left">
<view class="">
<image :src="item.src" :style="{width:item.width,height:item.height}"></image>
</view>
<view>{{item.title}}</view>
</view>
<view>
<view v-if="item.id==='cer'" class="cer">
<view class="cer-progress">
<view v-if="done>0 && answerTotal>0">{{(done/answerTotal)*100+'%'}}</view>
<view v-else>0</view>
<view class="cer-progress-bar">
<view class="cer-progress-item" :style="{'width':done>0 && answerTotal>0?(done/answerTotal)*100+'%':0}">
</view>
</view>
</view>
<view class="cer-btn" :class="{'cer-btn-active':(done>0 && answerTotal>0 && done>=answerTotal)?true:false}">
<text>{{done>0 && answerTotal>0 && done >= answerTotal ? '生成证书' : '未完成打卡'}}</text>
</view>
</view>
<u-icon v-else name="arrow-right" size="40" color="#e0e0e0"></u-icon>
</view>
</view>
</view>
</view>
<!-- 锦囊 -->
<view class="tips" v-if="showTips" :class="showTips?'fade-in':'fade-out'">
<view class="tips-wrap" @click="showTips=false">
<view class="tips-wrap-close" @click="showTips=false">
x
</view>
<view class="tips-wrap-img">
<u-image :show-loading="false" :fade="false" mode="widthFix" :width="711"
:src="require('../../static/toast.png')"></u-image>
<view class="tips-wrap-tip">
<view class="">
<rich-text v-if='showTips' :nodes="tips?tips:' '"></rich-text>
</view>
</view>
</view>
</view>
</view>
<!-- 弹出头像 昵称 -->
<u-popup v-model="showform" mode="bottom" :mask-close-able="maskClose">
<view class="login-form">
<view>
<span>头像:</span>
<view style="border:none">
<button open-type="chooseAvatar" @chooseavatar='onChooseAvatar' style="padding: 0;margin: 0;">
<image :src="imgurl" mode=""></image>
</button>
</view>
</view>
<view>
<span>姓名:</span>
<view>
<input type="nickname" @blur="blurname" :placeholderStyle="'color:#999;font-size:30rpx'"
v-model="form.name" placeholder="请输入姓名" :border="false" shape="circle" clearable></input>
</view>
</view>
</view>
<view class="login-btn">
<view class="login-btn-btn" @click="submit">提 交</view>
</view>
</u-popup>
<tabbar :currentPage="2"></tabbar>
</view>
</template>
<script>
import tabbar from '@/components/tabbar/tabbar.vue'
import {
ROOTPATH as baseUrl
} from "@/common/config.js"
import {
isNull,
toast,
shareInfo
} from "@/common/util.js"
export default {
components: {
tabbar
},
data() {
return {
navBarTop: 0,
showTips: false,
tips: '',
info: {},
headReplace: '',
showform: false,
maskClose: false,
imgurl: '',
form: {
name: ''
},
done: 0,
answerTotal: 0,
list: [{
id: 'cer',
title: '我的红色证书',
url: '/packages/cer/cer',
src: require('@/static/me-icon1.png'),
width: '76rpx',
height: '44rpx',
}, {
id: 'record',
title: '我的红色足迹',
url: '/packages/record/record',
src: require('@/static/me-icon2.png'),
width: '49rpx',
height: '49rpx',
}, {
id: 'tips',
title: '活动锦囊',
url: '',
src: require('@/static/me-icon3.png'),
width: '46rpx',
height: '48rpx',
}]
}
},
onShareAppMessage() {
return shareInfo
},
onShareTimeline() {
return shareInfo
},
onLoad() {
const MenuButton = uni.getMenuButtonBoundingClientRect()
this.navBarTop = MenuButton.top //左侧文字与右侧胶囊对齐
this.getConfig()
},
onShow() {
this.getInitUser()
this.getDone()
},
methods: {
onChooseAvatar(e) {
console.log(e)
console.log(e);
let a = uni.uploadFile({
url: baseUrl + "/api/mobile/upload-file",
filePath: e.detail.avatarUrl,
name: 'file',
formData: {
token: this.vuex_token
},
success: (res) => {
uni.showToast({
title: '上传成功',
duration: 1000
})
console.log("res", res)
this.imgurl = JSON.parse(res.data).url
this.form.headimgurl = this.imgurl
}
})
},
// 获取昵称
blurname(e) {
console.log(e)
if (e) {
this.form.name = e.detail.value
}
},
async getInitUser() {
const res = await this.$u.api.user()
this.$u.vuex('vuex_user', res)
console.log(this.vuex_user)
this.form = res
this.imgurl = res.headimgurl ? res.headimgurl : ''
this.info = this.$u.deepClone(res);
if (isNull(res.name)) {
this.showform = true
}
},
async getDone() {
const res = await this.$u.api.getPoints()
// this.done = res.point_answer_total
this.done = res.point_answer_total > this.answerTotal ? this.answerTotal : res.point_answer_total
},
async getConfig() {
await this.$u.api.getAppId().then(res=>{
res.config.map(item => {
if (item.key === 'tips') {
this.tips = item.value
}
if (item.key === 'answer_total') {
this.answerTotal = parseInt(item.value)
}
})
})
},
submit() {
if (isNull(this.form.name)) {
toast("请填写所有信息")
return
}
this.$u.api.saveUser(this.form).then(res => {
toast('更新成功')
this.showform = false
this.getInitUser()
})
},
toUrl(item) {
if (item.id == 'cer') {
if (this.done > this.answerTotal - 1) {
uni.navigateTo({
url: item.url
})
} else {
toast('请先完成打卡')
}
} else if (item.id == 'tips') {
this.showTips = true
} else {
uni.navigateTo({
url: item.url
})
}
},
}
}
</script>
<style lang="scss">
.wrap {
width: 100vw;
height: 100vh;
// overflow: scroll;
.bg {
height: 100vh;
width: 100vw;
position: absolute;
top: 0;
left: 0;
}
.me {
position: relative;
height: 100vh;
overflow: scroll;
top: 0;
padding-bottom: 140rpx;
&-avatar {
width: 100%;
text-align: center;
color: #960909;
font-size: 36rpx;
// width:173rpx;
// height:173rpx;
// border-radius: 173rpx;
// margin:0 auto;
image {
border: 10rpx solid #dfc9b1;
width: 173rpx;
height: 173rpx;
border-radius: 173rpx;
margin-bottom: 20rpx;
}
}
&-list {
border-radius: 15rpx;
background-color: #fff;
box-shadow: -2px -3rpx 12px rgba(0, 0, 0, 0.1);
margin: 70rpx 35rpx;
padding: 30rpx;
min-height: 750rpx;
&-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 35rpx 10rpx;
font-size: 28rpx;
color: #666666;
border-bottom: 1px solid #e0e0e0;
& image {
vertical-align: middle;
margin: 0 auto
}
&-left {
display: flex;
align-items: center;
>view {
&:first-child {
width: 76rpx;
text-align: center;
margin-right: 20rpx
}
}
u-icon {
margin-right: 20rpx;
}
}
& .cer {
display: flex;
font-size: 24rpx;
align-items: center;
&-progress {
color: #960909;
text-align: center;
font-weight: bolder;
&-bar {
width: 110rpx;
background-color: #f7f1e2;
height: 15rpx;
overflow: hidden;
border-radius: 15rpx;
border: 2px solid #8f856c;
}
&-item {
background-color: #b93736;
height: 100%;
width: 0;
}
}
&-btn {
background-color: #e0e0e0;
padding: 10rpx 20rpx;
color: #666666;
border-radius: 40rpx;
margin-left: 20rpx;
&-active {
background-color: #960909;
color: #fff
}
}
}
}
}
}
.login {
&-form {
padding: 20rpx 60rpx;
margin-top: 20rpx;
padding-bottom: 120rpx;
>view {
margin-bottom: 30rpx;
background-color: #fff;
padding: 20rpx 40rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
span {
width: 120rpx;
text-align: right;
}
button {
width: 100rpx;
height: 100rpx;
image {
width: 100%;
height: 100%;
}
}
>view {
border: 1px solid #999;
border-radius: 10rpx;
display: flex;
width: calc(100% - 120rpx);
padding: 10rpx 20rpx;
input {
width: 100%;
}
}
}
}
&-btn {
padding: 30rpx 60rpx;
padding-top: 0;
&-btn {
box-shadow: 0.5px 3px 9px 0px rgba(235, 107, 85, 0.3);
background: #960909;
border-radius: 44rpx;
text-align: center;
height: 88rpx;
color: #fff;
line-height: 88rpx;
font-size: 34rpx;
}
}
}
.tips {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.7);
position: fixed;
top: 0;
left: 0;
z-index: 999;
&-wrap {
&-close {
color: #fff;
width: 80rpx;
height: 80rpx;
border-radius: 80rpx;
line-height: 70rpx;
text-align: center;
border: 1px solid #fff;
position: absolute;
top: 135rpx;
left: 20rpx;
font-size: 50rpx;
z-index: 10;
}
&-img {
position: relative;
top: 0;
width: 100%;
u-image {
&>view {
margin: 0 auto;
}
}
}
&-tip {
color: #333;
font-size: 33rpx;
margin: 0 auto;
line-height: 2;
height: 650rpx;
overflow: scroll;
position: absolute;
top: 350rpx;
left: 50%;
transform: translate(-50%, 0%);
width: 80%;
view {
p {
text-indent: 2em;
}
}
}
}
}
}
.fade-in {
animation: fade-in .5s cubic-bezier(0.39, 0.575, 0.565, 1) both;
}
@keyframes fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.fade-out {
animation: fade-out .4s ease-out both;
}
@keyframes fade-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
</style>