2025-04-03 11:07:30 +08:00

999 lines
24 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="myBox">
<view class="box flex justify-start align-items flex-column">
<view class="con-center flex flex-start flex-column">
<!-- <view class="header flex justify-center align-items w-100">
我的
</view> -->
<view class="header flex align-items">
<view class="hea-left flex align-items" @click="clickTop()">
<image :src="avatar" mode="" class="avatar"></image>
<view class="first-header flex justify-center align-items">
<span>
{{userName}}
</span>
<image src="../../static/my/edit.png" mode=""
style="width: 32rpx; height: 32rpx;margin-left: 16rpx;"></image>
</view>
</view>
<view class="hea-right flex flex-column align-items" @click="out()" v-if="token">
<image src="../../static/my/Leave.png" mode="" style="width: 64rpx; height: 64rpx;"></image>
<span>退出登录</span>
</view>
</view>
<view class="jifen flex align-items" @click.top="showModel()">
<view class="left flex">
<image src="../../static/my/jifen.png" mode="" style="width: 36rpx; height: 36rpx;"></image>
<span class="title">当前积分</span>
<span class="scoring">0</span>
</view>
<view class="right flex justify-center align-items">
<span>积分明细</span>
<image src="../../static/my/right.png" mode="" style="width: 24rpx; height: 24rpx;"></image>
</view>
</view>
<view class="first flex flex-column align-items" style="margin-top: 24rpx;">
<!-- <view class="first-header flex justify-center align-items">
<span>{{userName}}
<image src="../../static/my/edit.png" mode=""
style="width: 32rpx; height: 32rpx;margin-left: 16rpx;" @click="clickTop()"></image>
</span>
<image :src="avatar" mode="" class="avatar"></image>
</view>
<span class="line"></span> -->
<view class="centerBox flex align-items justify-start" style="margin-left: 60rpx;">
<view class="bb flex flex-column align-items justify-center" v-for="(item,index) in list"
:key="index" @click="to(item.url)">
<image :src="item.image" mode="" style="width: 64rpx; height: 64rpx;margin-bottom: 24rpx;">
</image>
<span class="text">{{item.text}}</span>
<span class="numberPos" v-if="index == 6 && unread_number !=''">
<u-badge type="warning" numberType="ellipsis" max="99" :value="unread_number"></u-badge>
</span>
</view>
</view>
</view>
<view class="first flex flex-column flex-start justify-center" style="margin-top: 42rpx;">
<view class="centerBox flex justify-start align-items" style="margin-left: 60rpx;">
<view class="flex flex-column align-items justify-center" v-for="(item,index) in list2"
:key="index" @click="jump(item.url,item.auth_status)" v-if="item.auth_status == 1">
<image :src="item.image" mode="" style="width: 64rpx; height: 64rpx;margin-bottom: 24rpx;">
</image>
<span class="text">{{item.text}}</span>
</view>
</view>
</view>
<view class="first service flex justify-center align-items" style="padding-bottom: 0;" @click="callPhone(init.mobile)">
<image src="../../static/my/server.png" mode="" style="width: 64rpx;height: 64rpx;"></image>
<span class="flex justify-center align-items">联系客服:{{init.mobile}}</span>
</view>
</view>
<u-popup :show="showPopup" mode="center" round="20" :customStyle="popupStyle" closeable="true"
@close="close">
<!-- 隐私协议 -->
<lsl-protocol-popup
title="用户协议和隐私政策提示"
predesc="感谢您使用洛阳青年夜校。为保护您的个人信息安全,在您洛阳青年夜校的服务前,请务必仔细阅读"
subdesc='以了解详细内容。如您同意,请点击“同意并继续”并开始使用我们的服务。'
top_img='https://xxx.xxx.com/images/home/zcts@2x.png'
color="#C9935C"
hideTabBar="true"
:onNeed='false'
@agree="getList"
:other="other"
:title_style="'padding-top:60rpx;'"
open_type='agreePrivacyAuthorization'>
</lsl-protocol-popup>
<view class="popup">
<img src="../../static/shou.png" alt="" />
<text id="txt1">欢迎来到青年夜校~</text>
<text id="txt2">您还未授权登录,授权成功后可查看丰富的课程知识~</text>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber"
style="width: 240rpx;height: 90rpx;border-radius: 59rpx;background: #008CFF;font-size: 34rpx;color: #fff;font-weight: bold;">授权登录</button>
</view>
</u-popup>
<u-toast ref="uToast"></u-toast>
</view>
<tab-bar :tabBarShow="3"></tab-bar>
</view>
</template>
<script>
import {
mapActions
} from 'vuex';
export default {
...mapActions(['number']),
data() {
return {
topHeight: '',
popupStyle: {
width: '690rpx',
height: '630rpx',
},
showPopup: false,
userName: '请登录',
show: false,
avatar: '',
agree: false,
other: [{
tit: '《用户协议》',
type: 'page', // doc自行下载打开文档 page跳转页面
content: '/pages/Negotiate/agreement', // 文档地址/页面跳转地址
},
{
tit: '《隐私政策》',
type: 'page', // doc自行下载打开文档 page跳转页面
content: '/pages/Negotiate/privacy', // 文档地址/页面跳转地址
},
],
protocolArr: ["<隐私协议>"],
userinfo: {},
shop_id:'',
openidInfo: null,
token: '',
src: '',
openid_code: '',
code: '',
unread_number: '',
init:{},
timer: null, // 定时器
list: [{
image: '../../static/my/class.png',
text: '我的课程',
url: '/packageA/my/orderList'
},
{
image: '../../static/my/make.png',
text: '预约课程',
url: '/packageA/my/makeList'
},
{
image: '../../static/my/start.png',
text: '收藏课程',
url: '/packageA/my/Collect'
},
{
image: '../../static/my/afterSales.png',
text: '售后订单',
url: '/pages/afterSales/list'
},
{
image: '../../static/my/Course.png',
text: '课程表',
url: '/packageA/my/timetable',
},
{
image: '../../static/my/Feedback.png',
text: '课程反馈',
url: '/packageA/my/Feedback',
},
{
image: '../../static/my/station.png',
text: '消息通知',
url: '/packageA/my/station'
},
// {
// image: '../../static/my/orderList.png',
// text: '订单管理',
// url: '/packageA/my/orderList'
// },
{
image: '../../static/my/Personal.png',
text: '修改信息',
url: "/packageA/my/person-detail"
},
{
image: '../../static/my/exercise.png',
text: '我的活动',
url: "/packageA/activity/exercise"
},
{
image: '../../static/my/Help.png',
text: '帮助',
url: "/packageA/my/help"
},
],
list2: [{
image: '../../static/my/Platform.png',
text: '申请入驻',
url: "/pages/index/Apply",
auth_status: 1
},
{
image: '../../static/my/Check.png',
text: '报名审核',
url: "/packageA/my/classCheck",
auth_status: 0
},
{
image: '../../static/my/Manage.png',
text: '课程管理',
auth_status: 0,
url: '/packageA/my/management',
},
{
image: '../../static/my/activity.png',
text: '活动管理',
auth_status: 0,
url: '/packageA/my/ac-management',
},
{
image: '../../static/my/verification.png',
text: '核销课程',
url: '/packageA/my/cancel',
auth_status: 0
},
{
image: '../../static/my/cancal.png',
text: '核销活动',
url: '/packageA/my/cancelActivity',
auth_status: 0
},
// {
// image: '../../static/my/list.png',
// text: '订单管理',
// auth_status: 0
// },
// {
// image: '../../static/my/phone.png',
// text: '学员管理',
// auth_status: 0
// },
{
image: '../../static/my/organization.png',
text: '我的机构',
auth_status: 0,
url: '/pages/center/MechanismDetail',
},
{
image: '../../static/my/addClass.png',
text: '创建课程',
auth_status: 0,
url: '/packageA/my/addManagement',
}
]
};
},
// watch: {
// showPopup: {
// handler(newVal, oldVal) {
// if (newVal == true) {
// uni.hideTabBar()
// } else {
// uni.showTabBar()
// }
// },
// immediate: true,
// deep: true
// },
// },
// onLoad() {
// this.token = uni.getStorageSync('token')
// const userinfo = uni.getStorageSync('userInfo')
// const niName = uni.getStorageSync('niName')
// if (niName) {
// this.userName = niName
// } else {
// this.userName = userinfo.name
// }
// this.avatar = uni.getStorageSync('avatar');
// let openidInfo = uni.getStorageSync('openidInfo')
// let _this = this;
// if (!openidInfo) {
// _this.miniLogin();
// }
// },
onLoad() {
uni.hideTabBar()
},
onShow() {
this.getStatus()
this.token = uni.getStorageSync('token')
this.unread_number = this.number
const userinfo = uni.getStorageSync('userInfo')
const niName = uni.getStorageSync('niName')
if (niName) {
console.log(1,'niName',niName)
this.userName = niName
} else {
console.log(2)
this.userName = userinfo.name
}
this.avatar = uni.getStorageSync('userInfo').avatar || '../../static/moren.png';
let openidInfo = uni.getStorageSync('openidInfo')
let _this = this;
if (!openidInfo) {
_this.miniLogin();
}
this.number()
this.getinit()
},
created() {
const systemInfo = uni.getSystemInfoSync();
const statusBarHeightPx = systemInfo.statusBarHeight;
const windowWidthPx = systemInfo.windowWidth;
// 将 statusBarHeight 从 px 转换为 rpx
const statusBarHeightRpx = statusBarHeightPx * (750 / windowWidthPx);
this.topHeight = statusBarHeightRpx;
},
beforeDestroy() {
this.stopTimer();
},
mounted() {
this.startTimer();
},
methods: {
callPhone(phone) {
uni.makePhoneCall({
phoneNumber: phone
})
},
getinit() {
uni.$u.http.get('/api/index/init', {}).then(res => {
if (res.code == 1) {
this.init = res.data.customer_service
uni.setStorageSync('init',res.data.customer_service)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
}).catch(error => {
uni.showToast({
title: '请求失败,请稍后再试',
icon: 'none',
duration: 2000
});
});
},
// 查看自己的状态
getStatus() {
uni.$u.http.get('/api/school/shop/auth_info', {}).then(res => {
console.log(this.list2.length,'this.list2.length')
if (res.code == 1) {
let have_auth = false;
let have_shop = false;
if(res.data.verification_auth.verification){
have_auth = true;
}
if(res.data.auth_status == 1 && res.data.shop_id){
have_shop = true;
}
if(have_auth){
for (let i = 1; i < this.list2.length; i++) {
this.list2[i].auth_status = 1;
}
if(res.data.auth_status == -1){
this.list2[0].auth_status = 0;
}
this.list2[this.list2.length - 1].auth_status = 0;
this.list2[this.list2.length - 2].auth_status = 0;
}
if(have_shop){
this.list2[0].auth_status = 0;
for (let i = 1; i < this.list2.length; i++) {
this.list2[i].auth_status = 1;
}
this.shop_id = res.data.shop_id
uni.setStorageSync('shop_id',res.data.shop_id)
uni.setStorageSync('apply_info',res.data.apply_info)
this.list2[this.list2.length - 2].url = `/pages/center/MechanismDetail?id=${res.data.shop_id}`;
}
}
}).catch(error => {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
})
},
// 积分
showModel() {
uni.showToast({
title: '开发中,暂未开放',
icon: 'none'
});
},
// 退出登录
out() {
let _this = this;
uni.clearStorageSync()
uni.reLaunch({
url: '/pages/my/index'
})
// uni.$u.http.post('/api/user/logout', {}).then(res => {
// if (res.code == 1) {
// uni.reLaunch({
// url: '/pages/my/index'
// })
// }
// }).catch(error => {
// uni.showToast({
// title: res.msg,
// icon: 'none',
// duration: 2000
// })
// })
},
to(url) {
console.log(url)
uni.navigateTo({
url: url
});
},
jump(url, type) {
console.log(url)
if (url == '/packageA/my/cancel') {
uni.scanCode({
success: (res) => {
console.log('扫码结果:' + res.result);
uni.navigateTo({
url: url + '?res=' + encodeURIComponent(res.result)
});
},
fail: (err) => {
console.error('扫码失败:' + err);
uni.showToast({
title: '扫码已取消',
icon: 'none'
});
}
});
} else if (url == '/packageA/my/addManagement') {
uni.$u.http.get('/api/school/shop/auth_info', ).then(res => {
if (res.code == 1) {
if (res.data.check_full){
uni.navigateTo({
url: "/packageA/my/addManagement?shop_id=" + this.shop_id
})
} else{
uni.showToast({
title: '必要展示信息未完善,请先在机构完善展示信息',
icon: 'none',
duration: 2000
});
}
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
}).catch(error => {
console.error('请求失败', error);
});
} else if (url == '/packageA/my/cancelActivity') {
uni.scanCode({
success: (res) => {
console.log('扫码结果:' + res.result);
uni.navigateTo({
url: url + '?res=' + encodeURIComponent(res.result)
});
},
fail: (err) => {
console.error('扫码失败:' + err);
uni.showToast({
title: '扫码已取消',
icon: 'none'
});
}
});
} else {
uni.navigateTo({
url: url
});
}
},
close() {
this.showPopup = false
},
//小程序静默登录
miniLogin() {
let _this = this;
uni.login({
provider: 'weixin',
success: function(res) {
console.log('res.code',res.code)
_this.getOpenidByCode(res.code)
_this.code = res.code
uni.setStorageSync('code', res.code)
_this.getStatus()
},
fail: function(error) {
console.log('authError', error);
}
})
},
//根据code获取openid
getOpenidByCode(code) {
let _this = this;
uni.$u.http.post('/api/user/getOpenid ', {
code: code,
}).then(res => {
if (res.code == 1) {
_this.openidInfo = res.data;
uni.setStorageSync('openidInfo', res.data)
// _this.$api.setCache('openidInfo', res.data);
}
}).catch(error => {
console.log('获取openid失败', error);
})
},
// 获取手机号
getPhoneNumber(e) {
var _this = this;
_this.miniLogin()
console.log('e.detail', e.detail)
if (!e.detail.iv) {
uni.showToast({
title: '授权失败,请重新授权',
icon: 'none',
duration: 2000
})
_this.miniLogin();
// this.$api.toast('授权失败,请重新点击授权');
return false;
}
// if (e.detail.errMsg !== "getPhoneNumber:ok") {
// uni.showToast({
// title: '授权失败,请重新点击授权',
// icon: 'none',
// duration: 2000
// })
// _this.miniLogin();
// return false;
// }
var openidInfo = uni.getStorageSync('openidInfo');
if (!openidInfo) {
_this.miniLogin();
uni.showToast({
title: '未获取到信息,请重新点击授权',
icon: 'none',
duration: 2000
})
// this.$api.toast('未获取到信息,请重新点击授权');
return false;
}
_this.decodeMobile({
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
sessionKey: openidInfo.session_key,
}, openidInfo);
},
//解析手机号
decodeMobile(data, openidInfo) {
var _this = this;
uni.$u.http.post('/api/user/decodeData', {
encryptedData: data.encryptedData,
iv: data.iv,
sessionKey: data.sessionKey,
}).then(res => {
console.log('res', res)
if (res.code == 1) {
_this.userRegister(res.data.phoneNumber, openidInfo.openid);
} else {
uni.showToast({
title: res.msg || '解析手机号失败',
icon: 'none',
duration: 2000
})
// _this.$api.toast(res.msg || '解析手机号失败')
}
}).catch(error => {
});
},
//用户注册
userRegister(mobile, openid) {
var _this = this;
console.log(uni.getStorageInfoSync("code"))
uni.$u.http.post('/api/user/registerLogin', {
mobile: mobile,
openid: openid,
code: _this.code,
apptype: 'miniapp',
platform: 'wechat'
}).then(res => {
if (res.code == 1) {
uni.setStorageSync('token', res.data.token)
_this.getUserInfo()
this.token = res.data.token
// _this.$api.setCache('token', res.data.token);
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
uni.clearStorageSync()
_this.miniLogin()
// _this.$api.toast(res.msg);
}
}).catch(error => {
console.log('error', error);
// _this.$api.modal('温馨提示', error.data.msg, function() {
// }, false);
});
},
// 获取个人信息
getUserInfo() {
uni.$u.http.get('/api/user/index', {}).then(res => {
if (res.code == 1) {
uni.setStorageSync('userInfo', res.data.user_info)
uni.showToast({
title: '登陆成功',
icon: 'none',
duration: 2000
})
this.showPopup = false
this.userName = res.data.user_info.nickname
this.avatar = res.data.user_info.avatar
uni.setStorageSync("niName", res.data.user_info.nickname)
this.userinfo = res.data.user_info
this.token = res.data.user_info.token
} else {
this.showPopup = false
uni.showToast({
title: '登陆失败',
icon: 'error',
duration: 2000
})
}
}).catch(error => {
console.log('error', error);
this.showPopup = false
uni.showToast({
title: '登陆失败',
icon: 'error',
duration: 2000
})
})
},
// getPhoneNumber(e) {
// var that = this
// if (e.detail.errMsg == 'getPhoneNumber:ok') {
// wx.login({
// success: function(res) {
// uni.$u.http.post('/Loginye/wx_getcode', {
// code: e.detail.code,
// openid_code: res.code
// }).then(res => {
// if (res.code == 0) {
// uni.setStorageSync('token', res.data)
// uni.setStorageSync('userInfo', res.userinfo)
// uni.setStorageSync('avatar', res.userinfo.head_img)
// that.userName = res.userinfo.name
// that.token = res.data
// that.src = res.userinfo.head_img
// that.showPopup = false
// console.log(that, "sdad")
// that.$refs.uToast.show({
// type: 'success',
// message: '授权成功'
// })
// }
// }).catch(err => {
// console.log(err);
// })
// }
// })
// } else {
// this.$refs.uToast.show({
// type: 'error',
// message: '授权失败,请重试'
// })
// this.showPopup = false
// }
// },
clickTop() {
// uni.navigateTo({
// url: '/packageA/my/person-detail'
// })
// console.log(this.token)
if (!this.token) {
this.miniLogin()
this.showPopup = true
} else {
uni.navigateTo({
url: "/packageA/my/person-detail",
})
}
},
checkTokenAndRequest() {
if (uni.getStorageSync('token')) {
this.number();
}
},
// 定时器
startTimer() {
if (!this.timer) { // 确保定时器只启动一次
this.timer = setInterval(() => {
this.checkTokenAndRequest();
}, 10000); // 每隔 10 秒执行一次
}
},
stopTimer() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
},
// 未读消息
number() {
let that = this
uni.$u.http.get('/api/school/message/message_count', {
params: {},
}).then(res => {
if (res.code == 1) {
that.$store.commit('setNumber', res.data.unread_number);
that.unread_number = res.data.unread_number
uni.setStorageSync('unread_number', res.data.unread_number)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
}).catch(error => {});
},
}
}
</script>
<style lang="scss" scoped>
.myBox {
width: 750rpx;
min-height: 100vh;
// background: linear-gradient(to bottom, #F1F2F8 0%, #F1F2F8 50%, #FFFFFF 100%);
background-color: #F1F2F8;
}
.box {
border-radius: 8rpx 8rpx 8rpx 8rpx;
// padding-top: env(safe-area-inset-top);
padding-top: 52rpx;
/* 顶部安全距离 */
.backImg {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -1;
}
}
.w-100 {
width: 100%;
}
.flex {
display: flex;
}
.flex-start {
align-items: flex-start;
}
.justify-center {
justify-content: center;
}
.align-items {
align-items: center;
}
.flex-column {
flex-flow: column;
}
.justify-start {
justify-content: start;
}
.con-center {
margin-bottom: 150rpx;
.header {
width: 690rpx;
justify-content: space-between;
.hea-left {
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
}
margin-left: 20rpx;
.first-header {
margin-left: 18rpx;
span {
font-family: PingFang SC, PingFang SC;
font-weight: 800;
font-size: 34rpx;
color: #181818;
line-height: 26rpx;
}
}
.line {
width: 320rpx;
height: 1rpx;
background: #BABDC7;
border-radius: 0rpx 0rpx 0rpx 0rpx;
margin: 19rpx 0 7rpx 0;
}
.red {
font-family: PingFang SC, PingFang SC;
font-weight: 800;
font-size: 26rpx;
color: #FF4949;
line-height: 32rpx;
}
}
.hea-right {}
.line {}
}
}
.first {
width: 690rpx;
padding-bottom: 32rpx;
margin-top: 52rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
.centerBox {
flex-wrap: wrap;
view {
width: 120rpx;
margin: 42rpx 90rpx 0 0;
position: relative;
.numberPos {
position: absolute;
right: 0%;
top: 0;
}
.text {
font-weight: 500;
font-size: 30rpx;
color: #181818;
}
}
}
}
.popup {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-left: 73rpx;
padding-right: 73rpx;
img {
width: 352rpx;
height: 328rpx;
margin-top: -138rpx;
margin-bottom: 60rpx;
}
#txt1 {
font-size: 34rpx;
font-weight: bold;
color: #181818;
}
#txt2 {
text-align: center;
margin-top: 40rpx;
font-size: 30rpx;
color: #666;
margin-bottom: 60rpx;
}
}
.jifen {
width: 690rpx;
height: 86rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
margin-top: 41rpx;
justify-content: space-between;
.left {
margin-left: 32rpx;
.title {
width: 104rpx;
height: 32rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 800;
font-size: 26rpx;
color: #181818;
line-height: 32rpx;
margin: 0 12rpx 0 6rpx;
}
.scoring {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 42rpx;
color: #FFB134;
line-height: 32rpx;
}
}
.right {
margin-right: 32rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #9E9E9E;
line-height: 32rpx;
span {
margin-right: 8rpx;
}
}
}
.service{
margin-top: 42rpx;
margin-bottom: 120rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 30rpx;
color: #008CFF;
height: 100rpx;
}
</style>