【PT.SCC实名制管理系统】24.10.01 -30天,考勤打卡小程序
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.
 
 
 
 

340 lines
7.3 KiB

<template>
<view class="home">
<!-- 顶部背景 -->
<view class="home-top">
<image class="home-top-bg" src="https://tennis-oss.xzaiyp.top/2024-10-22/81f3569e-c60c-4945-bfc9-b0e976f26d8e.png" mode="widthFix"></image>
</view>
<!-- 卡片(地图) -->
<view class="card">
<view @click="openBroadside" class="team">
<view class="change-icon">
<image src="https://tennis-oss.xzaiyp.top/2024-10-22/4e624b94-e080-4ec4-86de-196ad83538a5.png" mode="widthFix"></image>
</view>
<view class="project"
v-if="userInfo.team">
{{ userInfo.team.name }}
</view>
</view>
<view class="map">
<map style="width: 100%; height: 100%"
:latitude="position.latitude"
:longitude="position.longitude"
:markers="covers" :scale="13">
</map>
</view>
</view>
<!-- 打卡按钮 -->
<view class="punch-card">
<view @click="toClock" class="circle"
:style="{background : ['#aaa', '', '#f40'][position.status]}">
<view class="title" v-if="position.status == 0">定位中...</view>
<view class="title" v-else-if="position.status == 2">定位失败</view>
<view class="title" v-else>拍照打卡</view>
<view class="time">{{ date.format('YYYY-MM-DD HH:mm:ss') }}</view>
</view>
</view>
<!-- 签到记录 -->
<div @click="toRecord" class="sign">
<div class="sign-title">
<image class="sign-title-img" src="https://tennis-oss.xzaiyp.top/2024-10-22/3d70c0d0-f298-4187-8b01-d809757f4049.png" mode="widthFix"></image>
<div class="title">打卡记录</div>
</div>
<div class="project">
<text class="project-name"
v-if="userInfo.team">{{ userInfo.team.name }}</text>
<uv-icon name="arrow-right" color="#000"></uv-icon>
</div>
</div>
<!-- <image
@click="upload"
:src="image" mode=""></image> -->
<!-- tab栏 -->
<tabbar :select="0"></tabbar>
<!-- 侧边栏 -->
<broadside ref="broadside"></broadside>
</view>
</template>
<script>
import tabbar from '../../components/base/tabbar.vue'
import broadside from '../../components/broadside/broadside.vue'
import { mapState } from 'vuex'
export default {
name: "Home",
components: {
tabbar,
broadside
},
data() {
return {
latitude: 39.909,
longitude: 116.39742,
covers: [],
inter : null,
date : this.$dayjs(),
image : '',
}
},
computed : {
...mapState(['teamList', 'userInfo', 'position']),
},
onLoad() {
this.inter = setInterval(() => {
this.date = this.$dayjs()
}, 1000)
},
onUnload() {
clearInterval(this.inter)
},
onShow() {
this.getLocation()
this.$store.commit('getUserInfo')
this.$store.commit('getLocation')
},
methods: {
// 跳转签到记录
toRecord() {
uni.navigateTo({
url: "/pages/subPack/record/record"
})
},
upload(){
this.$Oss.ossUploadImage({
success : url => {
this.image = url
}
})
},
//打开侧边栏
openBroadside() {
this.$refs.broadside.open()
},
toClock(){
if(this.position.status == 0){
uni.showToast({
title: '正在定位中,请稍后!',
icon : 'none'
})
return
}
if(this.position.status == 0){
uni.showToast({
title: '定位失败,请检查当前定位是否开启!',
icon : 'none'
})
return
}
// uni.navigateTo({
// url: "/pages/subPack/human/human"
// })
// 检查当前是否在打卡时间段内
this.$api('clockTime', {
lon : this.position.longitude,
lat : this.position.latitude,
}, res => {
//打卡(跳转人脸识别)
if(res.code == 200){
uni.navigateTo({
// url: "/pages/subPack/face/face"
url: "/pages/subPack/human/human"
})
}
})
},
//获取用户位置
getLocation() {
let self = this;
// uni.showLoading({
// title: '定位中...'
// })
uni.getLocation({
type: 'gcj02',
success: function(res) {
// uni.hideLoading()
self.longitude = res.longitude;
self.latitude = res.latitude;
// self.covers.push({
// id: 1,
// latitude: res.latitude,
// longitude: res.longitude,
// iconPath: 'https://tennis-oss.xzaiyp.top/2024-10-22/103fa1db-8524-45e6-8d00-c36a69977a5b.png',
// width: 30,
// height: 30
// })
},
fail() {
self.checkAndRequestLocationPermission()
}
});
},
checkAndRequestLocationPermission() {
let self = this;
uni.getSetting({
success: function(res) {
if (!res.authSetting['scope.userLocation']) {
// 用户未授权定位权限
uni.showModal({
title: '提示',
content: '当前定位未开启,请点击确定手动开启定位',
success: function(modalRes) {
if (modalRes.confirm) {
// 用户选择确认开启定位
uni.openSetting({
success: function(settingRes) {
if (settingRes.authSetting[
'scope.userLocation']) {
// 重新获取位置信息
self.getLocation();
} else {
// 用户未开启定位权限
console.log('用户未开启定位权限');
}
},
fail: function(err) {
console.log('打开设置页面失败:', err);
}
});
} else {
// 用户选择取消
self.getLocation()
}
}
});
} else {
// 用户已授权定位权限但获取位置失败(可能是设备未开启定位服务)
console.log('用户已授权定位权限,但获取位置失败');
// 可以提示用户检查设备定位服务是否开启
}
}
});
},
}
}
</script>
<style lang="scss" scoped>
.home {
background: $bg-color;
min-height: 100vh;
// 顶部背景
.home-top {
height: 490rpx;
overflow: hidden;
.home-top-bg {
width: 750rpx;
}
}
// 卡片(地图)
.card {
width: 95%;
margin: -340rpx auto 0rpx auto;
position: relative;
.team {
display: flex;
margin: 15rpx 0rpx;
color: white;
font-size: 34rpx;
.change-icon {
display: flex;
align-items: center;
width: 40rpx;
margin-right: 10rpx;
image {
width: 100%;
}
}
}
.map {
height: 350rpx;
background: $main-color;
border-radius: 20rpx;
overflow: hidden;
}
}
//打卡按钮
.punch-card {
display: flex;
justify-content: center;
margin: 60rpx 0rpx;
.circle {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 370rpx;
height: 370rpx;
border-radius: 50%;
background: $main-color;
color: white;
.title {
font-size: 36rpx;
}
.time {
font-size: 30rpx;
margin-top: 20rpx;
}
}
}
// 签到记录
.sign {
display: flex;
flex-wrap: wrap;
width: 90%;
margin: 0rpx auto;
background: white;
border-radius: 15rpx;
box-sizing: border-box;
padding: 30rpx 30rpx 30rpx 20rpx;
box-shadow: 0rpx 0rpx 10rpx rgba(0, 0, 0, .1);
.sign-title {
display: flex;
width: 30%;
.sign-title-img {
width: 40rpx;
margin-right: 15rpx;
}
.title {}
}
.project {
display: flex;
width: 70%;
justify-content: space-between;
.project-name {
color: $main-color;
}
}
}
}
</style>