WeiXin.ZhiXueHuiCha.MiniPro.../pages/user/index.vue

672 lines
15 KiB
Vue

<template>
<Navigation :title_name="'个人中心'" :isReturn="person.userList&&person.userList.length>0?1:3"
:returnIcon="'../../static/education/add_user.png'" :color="'#000000'" :bgc="'#FFFFFF'"
@iconClick="jumpAddStudent" :isCenter="true" />
<view v-if="person.userList&&person.userList.length>0">
<view class="ech">
<view class="card-wrapper">
<view class="card-scroll">
<view v-for="(item,index) in person.userList" :key="index">
<CurrItem :datas="item" @onOpenStu="getOpenStu(item,index)" @onUnBind="getUnBind(item)"
:isChange="false" :bgIndex="index" />
</view>
</view>
</view>
<view class="option-list">
<view class="option-item" v-for="(op,opIndex) in person.optionList" :key="opIndex"
@click.stop="toRelated(op,opIndex)">
<image :src="op.icon" mode=""></image>
<view class="option-item-name">{{op.name}}</view>
</view>
</view>
</view>
<!-- 用户信息弹窗 -->
<view class="dio" v-if="showChangeStudent">
<view class="dio-contain">
<view class="dio-padding">
<view class="center" :style="{background:stuInfoBackground[backIndex]}">
<image src="https://minio.23544.com:9010/data-center/gzh/Avatar.png" mode=""></image>
<view class="stu-name">{{showLookStudentInfo.name}}</view>
</view>
<view class="id-card">
<view class="number">{{showLookStudentInfo.number}}</view>
<view class="look-btn" :style="{color:stuInfoBackground[backIndex]}" @click="seePhone">查看</view>
</view>
</view>
<view class="cancel" @tap="showChangeStudent=false"></view>
</view>
</view>
<!-- 联系客服弹窗 -->
<Popups :isShow="person.isShowService" :bgColor="'#fff'">
<view style="width: 250px;display: flex;flex-direction: column;align-items: center;">
<view class="popup_cont_des" style="font-size: 20px;margin-top: 25px;">
{{person.phoneNum}}
</view>
<view class="popup_add_btn">
<button class="flex" @tap="connectServe"
style="font-size: 16px;height: 35px;line-height: 35px;width: 100%;">
<image src="@/static/education/phone_icon.png" mode=""></image>
联系客服
</button>
</view>
</view>
</Popups>
</view>
<view v-else>
<view class="empty_box">
<image src="@/static/null_icon.png" mode=""></image>
<text>暂无学生个人信息~</text>
</view>
<view class="add_btn">
<button open-type="getPhoneNumber" v-if="!showReactivePhone" @getphonenumber="getPhoneNumber">添加学生</button>
<button @tap="jumpAddStudent" v-else>添加学生</button>
</view>
</view>
<!-- 短信验证弹窗 -->
<Popups :isShow="showDioUnbindMseeage" :width="260" height="auto" :bgColor="'#fff'"
@cancelBtn="showDioUnbindMseeage=false">
<view class="p_cont">
<view class="popup_cont_title">
短信验证
</view>
<view class="popup_cont_list">
<view class="cont_list_item1">
<view style="font-size: 18px;">向{{unBindPhone}}发送验证信息<br />请输入验证码</view>
<view class="flex">
<input v-for="(item,index) in sendYZMCode" @input="inputLastNumber(index,$event)" :key="index"
:value="item.name" :focus="item.isFocus" @blur="preventFocus(index,$event)" @click="messageFocus(index,$event)"
placeholder-style="color:#BDBDBD;" type="number" maxlength="1"
:class="{'border-indey-message':item.isFocus,'border-error':errroYZM}"
:selection-start="(item.isFocus)?0:-1" :selection-end="(item.isFocus)?item.name.length:-1"/>
</view>
</view>
</view>
<view class="popup_cont_tag flex">
<button v-if="timeLast>0" class="send-btn">{{timeLast}}秒后重发</button>
<button v-else @click="retrieAgain" class="send-btn"
style="font-size: 16px;">{{showMessageText?'再次获取':'获取验证码'}}</button>
</view>
<view class="popup_add_btn">
<button @click="okClickMessage" class="massage-btn" style="font-size: 18px;">确认</button>
</view>
</view>
</Popups>
</template>
<script setup>
import {
ref,
reactive,
onMounted,
watch,
nextTick
} from "vue";
import Popups from "@/components/popups/index.vue";
import CurrItem from "@/components/currItem/index.vue";
import {
getUserInfo,
getUserLogin,
getUserPhone,
getConfig,
postRegister,
getbindstudentList,
getSTudyReportInfo,
putUnBind,
LookStudentInfo,
bindMobile,
getSendTelphoneCode
} from "@/api/user";
import {
onShow,
onHide
} from "@dcloudio/uni-app";
import Navigation from '@/components/navigation/index.vue'
const showDioUnbindMseeage = ref(false) //解绑用户
const showMessageText = ref(false) //解绑倒计时显示文字
const unBindPhone = ref('')
const timeLast = ref(0)
const unBindParams = { //解绑用户参数
"StudentId": 0,
"Mobile": "0",
"SmsId": "0",
"SmsCode": "0"
}
const errroYZM=ref(false) //错误短信边框提示
const sendYZMCode = ref([ //短信验证6位数字
{
name: '',
isFocus: false
},
{
name: '',
isFocus: false
},
{
name: '',
isFocus: false
},
{
name: '',
isFocus: false
},
{
name: '',
isFocus: false
},
{
name: '',
isFocus: false
},
])
let person = reactive({
phoneNum: '18812545252',
phoneNumAll: '',
userList: [], // 用户列表
optionList: [{
name: '联系客服',
icon: '../../static/education/phone.png'
},
{
name: '关于',
icon: '../../static/education/about.png'
}
],
isShowService: false, // 是否显示联系客服
currStudent: {} // 当前学生
})
const showLookStudentInfo = reactive < {
number: string,
name: string
} > ({})
const webSrc = ref('') //webview 换取code 的UR了地址
const jumpHasConnentStudent = ref(false) //是否已有关联学生
const appId = ref('') //appId
const showStudentList = ref(false)
const showReactivePhone = ref(false) //和本机互动,展示是否授权获取手机号
const preventFocus = (index) => {
sendYZMCode.value[index].isFocus = false
}
const focstState=ref(false)
//输入框自动失焦获取聚焦
const inputLastNumber = (index, event) => {
sendYZMCode.value[index].name = event.detail.value
if(!focstState.value){
if (sendYZMCode.value[index].name) {
if (index < 5) {
sendYZMCode.value[index + 1].isFocus = true
}
}else{
if (index > 0) {
sendYZMCode.value[index - 1].isFocus = true
}
}
}else{
focstState.value=false //点击状态未真
}
}
const messageFocus=(index,event)=>{ //短信框输入聚焦
let name = sendYZMCode.value[index].name
if(!name){
focstState.value=false //点击状态未真
}else{
focstState.value=true //点击状态未真
}
errroYZM.value=false //关闭红色错误弹窗
sendYZMCode.value[index].isFocus=true
}
// 再次获取短信验证
const showTimer = ref(true) //是否60秒之后再次获取短信验证码
const timer = ref(0)
const retrieAgain = () => {
if (showTimer.value) {
showTimer.value = false
// let telephone = uni.getStorageSync('USER_PHONE')
showMessageText.value = true
timeLast.value = 60
timer.value = setInterval(() => {
timeLast.value--; // 时间减一秒
if (timeLast.value <= 0) { // 当倒计时结束时
clearInterval(timer.value); // 停止计时器
showTimer.value = true
}
}, 1000); // 每秒执行一次
console.log(unBindPhone.value);
getSendTelphoneCode(unBindPhone.value, 2).then(res => {
console.log(res);
if (res.Code == 200) {
unBindParams.SmsId = res.Data
}
})
}
}
const okClickMessage = () => {
let messageCode = ''
sendYZMCode.value.forEach(item => {
messageCode += item.name
})
unBindParams.SmsCode = messageCode
putUnBind(unBindParams).then(res => {
console.log(res);
if (res.Code == 200) {
showDioUnbindMseeage.value = false
getStudentList() //重新刷新拉取学生列表
} else {
errroYZM.value=true
uni.showToast({
title:res.Message,
position:'bottom'
});
sendYZMCode.value.forEach(item => {
item.name=''
})
}
})
}
// 解绑
const getUnBind = (item) => {
showDioUnbindMseeage.value = true
errroYZM.value=false
LookStudentInfo(item.Id).then(res => {
unBindParams.StudentId = item.Id
unBindParams.Mobile = res.Data.Telephone
unBindPhone.value = res.Data.Telephone
})
sendYZMCode.value.forEach(item => {
item.name = ''
})
}
onShow(() => {
getUserInfo().then(res => {
console.log('用户信息', res);
showReactivePhone.value = res.Data.BindMobile
})
getStudentList()
})
//查看
const showChangeStudent = ref(false)
const stuInfoBackground = ['#6B86FF', '#45CB9F', '#22C1F2']
const backIndex = ref(0)
const getOpenStu = (item, index) => {
showChangeStudent.value = true
person.currStudent = item
backIndex.value = index % 3
LookStudentInfo(item.Id).then(res => {
console.log(res);
showLookStudentInfo.name = res.Data.RealName
person.phoneNumAll = res.Data.Telephone
showLookStudentInfo.number = res.Data.Telephone.replace(res.Data.Telephone.substring(3, 7), '****')
})
}
// 号码查看
const seePhone = () => {
showLookStudentInfo.number = person.phoneNumAll
}
// 跳转关于
const toRelated = (item, index) => {
if (item.name === '关于') {
uni.navigateTo({
url: `/pages/userRelated/index`
})
} else if (item.name === '联系客服') {
person.isShowService = !person.isShowService
6000().then(res => {
console.log(res);
if (res.Code == 200) {
person.phoneNum = res.Data.ServiceNumber
} else {
uni.showToast({
title: '暂无客服'
})
}
})
}
}
// 添加学生跳转
const toAddStudent = (item, index) => {
console.log(99999);
}
//获取用户本机手机号
const getPhoneNumber = (e) => {
console.log(111, e.detail.code);
if (e.detail.errMsg == "getPhoneNumber:ok") {
bindMobile(e.detail.code).then(res => {
if (res.Code == 200) {
uni.navigateTo({
url: '/pages/userAddStudent/index'
})
} else {
console.log('未授权手机号')
}
})
}
}
const jumpAddStudent = (e) => {
uni.navigateTo({
url: '/pages/userAddStudent/index'
})
}
// 获取学生列表方法
const getStudentList = () => {
getbindstudentList().then(res => {
console.log('学生列表', res);
if (res.Code == 200) {
person.userList = res.Data
}
})
}
//监听获取token之后 发送请求学生列表
watch(() => showStudentList.value, () => {
console.log(showStudentList.value);
if (showStudentList.value) {
getStudentList()
}
})
//联系客服
const connectServe = () => {
uni.makePhoneCall({
phoneNumber: person.phoneNum
})
}
</script>
<style lang="scss" scoped>
.empty_box {
z-index: 0;
}
page {
overflow: hidden;
position: inherit !important;
}
.popup_cont {
width: 211px;
}
.add_btn {
position: absolute;
bottom: 30%;
}
.ech {
width: 100vw;
position: relative;
top: 0px;
margin-bottom: 50px;
.card-wrapper {
background: #F5F5F5;
padding: 10px 20px;
display: flex;
justify-content: center;
}
}
.option-list {
width: 100%;
padding: 10px 20px;
box-sizing: border-box;
background: #fff;
.option-item {
display: flex;
align-items: center;
color: #3D425B;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: normal;
letter-spacing: 0.72px;
padding: 10px 0;
border-bottom: 1px solid #ECECEC;
&:last-child {
border-bottom: 0 !important;
}
image {
width: 20px;
height: 20px;
margin-right: 8px;
}
.option-item-name {
width: 92%;
}
}
}
.dio {
width: 100vw;
height: 100%;
position: fixed;
left: 0;
top: 0;
background: rgba(0, 0, 0, 0.42);
z-index: 99;
.dio-contain {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.dio-padding {
border-radius: 10px;
background: #FFF;
padding: 40rpx;
display: flex;
flex-direction: column;
justify-content: center;
}
.cancel {
margin-top: 20px;
width: 40px;
height: 40px;
background: url('@/static/education/cancel.png');
background-size: 100% 100%;
}
}
}
.center {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 250px;
height: 200px;
border-radius: 10px;
background: #6B86FF;
image {
width: 90px;
height: 90px;
border-radius: 50%;
}
.stu-name {
color: #FFF;
font-size: 18px;
font-weight: 400;
letter-spacing: 0.72px;
margin-top: 5px;
}
}
.id-card {
width: 100%;
box-sizing: border-box;
padding: 20px 0 0 0;
color: #3D425B;
font-family: PingFang SC;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: normal;
letter-spacing: 0.72px;
display: flex;
justify-content: space-between;
align-items: center;
.look-btn {
color: #6B86FF;
}
}
.btn-add {
width: 20px;
height: 20px;
position: absolute;
left: 10px;
opacity: 0;
}
.p_cont {
// padding: 20px;
background: #fff;
border-radius: 30rpx;
.popup_cont_pic {
margin: 40rpx auto 20rpx auto;
background: #fff;
width: 140rpx;
height: 140rpx;
border-radius: 30rpx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.popup_add_btn {
button {
width: 45%;
&:nth-child(1) {
width: 55%;
}
}
}
.popup_cont_title {
font-size: 36rpx;
color: #575757;
font-weight: 600;
}
.popup_cont_tag {
justify-content: flex-end;
width: 100%;
text-align: right;
margin-top: 20rpx;
button {
border: 2rpx solid #A5B5FA;
color: #A5B5FA;
font-size: 24rpx;
margin: 0;
padding: 0 20rpx;
background: #fff;
height: 45rpx;
line-height: 45rpx;
&:nth-child(2) {
margin-left: 20rpx;
}
}
}
.popup_cont_list {
text-align: left;
.cont_list_item {
font-size: 28rpx;
background: #F8F9FF;
border-radius: 8rpx;
padding: 32rpx;
margin-top: 30rpx;
&:first-child {
input {
width: 99%;
border: 0;
padding: 10rpx 0;
text-align: left;
}
}
input {
border: 2rpx solid #9C9C9C;
border-radius: 12rpx;
width: 16.6%;
padding: 15rpx 0;
color: #2C2C2C;
font-weight: 500;
margin-top: 20rpx;
margin-right: 10rpx;
text-align: center;
&:last-child {
margin-right: 0;
}
}
}
.cont_list_item1 {
font-size: 28rpx;
border-radius: 8rpx;
margin-top: 30rpx;
input {
border: 2rpx solid #9C9C9C;
border-radius: 12rpx;
width: 16.6%;
padding: 15rpx 0;
color: #2C2C2C;
font-weight: 500;
margin-top: 20rpx;
margin-right: 10rpx;
text-align: center;
&:last-child {
margin-right: 0;
}
}
}
}
}
.massage-btn {
width: 100% !important;
height: 40px !important;
line-height: 40px !important;
}
.send-btn {
width: 50% !important;
height: 30px !important;
line-height: 30px !important;
}
.border-indey-message{
border: 3px solid skyblue !important;
}
.border-error{
border: 1px solid #FF0000 !important;
}
</style>