提交代码

This commit is contained in:
‘tuzi0421
2024-03-13 16:07:11 +08:00
parent d022e33da9
commit e37d0e4112
34 changed files with 1933 additions and 206 deletions

View File

@ -35,7 +35,9 @@
<view class="person_dataC contentboxsty">
<view class="content_box">
<view class="data_name">设备故障通知</view>
<view class=""></view>
<view class="">
</view>
</view>
<view class="content_box">
<view class="data_name">出材率预警通知</view>
@ -75,9 +77,9 @@
},
//跳转更改手机号页面
toChangPhone(){
// uni.navigateTo({
// url: '/pages/person/changePhone'
// })
uni.navigateTo({
url: '/pages/person/changePhone'
})
}
}
}
@ -100,5 +102,7 @@
.person_logo{width: 40px;height: 40px;}
}
.data_name{flex: 1;}
}
}
</style>

62
pages/person/alarm.vue Normal file
View File

@ -0,0 +1,62 @@
<template>
<!-- 设备报警 -->
<view class="pagepaddings">
<view class="content_layout" @click="cancelLongpress">
<view class="item_layout" v-for="(item, index) in list" :key="index">
<view :class="islongpress?'longpress_style':''" @longpress="longpress" @click="deleteAlarm">
<image :src="item.url" class="img_style" mode=""></image>
</view>
<view class="font13 flex_layout">
<text class="flex1">{{item.name}}</text>
<text>{{item.time}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
islongpress:false,
list:[
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
]
}
},
methods: {
longpress(){
console.log('长按事件')
this.islongpress = true
},
//取消
cancelLongpress(){
this.islongpress = false
},
//删除警告
deleteAlarm(){
if(this.islongpress){
console.log('删除')
}
},
}
}
</script>
<style>
/* .content_layout{display: flex;flex-flow: wrap;}
.item_layout{width: 50%;} */
.content_layout{
display: grid;
grid-template-columns: 1fr 1fr;/* 每一列占一行的一半 */
grid-gap: 10px; /* 可选的间距 */
}
.img_style{height: 110px;width: 100%;}
.longpress_style{background-color: #000;
opacity: 0.2;}
</style>

View File

@ -1,6 +1,14 @@
<template>
<view>
<view class="pagepaddings font13">
<view class="phone_page contentboxsty">
<view class="content_row">
<input placeholder="请输入要更换的手机号码" />
</view>
<view class="content_row noborbot">
<input placeholder="请输入短信验证码" />
<view class="theme_color">获取验证码</view>
</view>
</view>
</view>
</template>
@ -17,6 +25,8 @@
}
</script>
<style>
<style>
.phone_page{padding: 0 12px;}
.content_row{display: flex;height: 49px;align-items: center;border-bottom: 1px solid #2D3A6F;}
.content_row input{flex: 1;}
</style>

View File

@ -0,0 +1,464 @@
<template>
<view v-if="step==1">
<view class="scan_box">
<image class="avatar_frame" src="http://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/morentouxiang.png" mode=""></image>
<image class="scan_img" src="http://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/saomiao.png"></image>
</view>
<view class="start_view" @click="startAttestation(2)">
<view class="start_but">
开始认证
</view>
</view>
</view>
<view class="page-content" v-else-if="step==2">
<view class="containerV">
<view class="headerV">
<view class="top-tips1 font15">
<view>请把脸移入圈内保持不动</view>
</view>
<!-- <view class="top-tips2">
为了便于识别认证请拍摄本人头像
</view> -->
</view>
<view class="contentV">
<view class="mark"></view>
<image v-if="tempImg" mode="widthFix" :src="tempImg" />
<camera v-if='isAuthCamera' :device-position="devicePosition ?'front': 'back'" class="camera"
flash="off" resolution='high' />
<view v-show="!tempImg && tipsText" class="tipV">{{ tipsText }}</view>
</view>
<view class="footerV">
<view style="width: 100%;">
<view v-if="!tempImg" style="width: 100%;">
<!-- <view class="privacyV">
<view class="icon"></view>
<view class="text">
照片隐私<text @click="handleJumpSecurityClick">安全保障</text>
</view>
</view>
<view class="bottom-tips-2">该照片仅作为你认证的凭证</view> -->
<view class="take-photo-bgV">
<!-- 图片上传 -->
<!-- <view v-show="true" class="btn-change-upload" @click="handleChooseImage" ></view> -->
<!--拍照-->
<view class="btn-take-photo" @click="handleTakePhotoClick" ></view>
<!-- 切换镜头 -->
<view class="btn-change-camera" @click="handleChangeCameraClick" ></view>
</view>
</view>
<view class="confirmV" v-else>
<view class="btn-cancel" @click="handleCancelClick">
取消
</view>
<view class="btn-ok" @click="handleOkClick">
确定
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'index',
components: {
},
data() {
return {
step:1,
tipsText: '', // 错误文案提示
tempImg: '', // 本地图片路径
// BASE_API,
cameraEngine: null, // 相机引擎
devicePosition: false, // 摄像头朝向
isAuthCamera: true, // 是否拥有相机权限
}
},
onLoad(options) {
this.initData()
},
mounted(){
},
methods: {
//
startAttestation(type){
this.step=type;
},
// 初始化相机引擎
initData() {
this.handleChangeCameraClick();
// console.log(1111)
// const session = wx.createVKSession({
// track: {
// face: { mode: 1 } // mode: 1 - 使用摄像头2 - 手动传入图像
// },
// })
// console.log(222)
// // 摄像头实时检测模式下监测到人脸时updateAnchors 事件会连续触发 (每帧触发一次)
// session.on('updateAnchors', anchors => {
// anchors.forEach(anchor => {
// console.log('anchor.points', anchor.points)
// console.log('anchor.origin', anchor.origin)
// console.log('anchor.size', anchor.size)
// console.log('anchor.angle', anchor.angle)
// })
// })
// console.log(333)
// // 当人脸从相机中离开时,会触发 removeAnchors 事件
// session.on('removeAnchors', () => {
// console.log('removeAnchors')
// })
// // 需要调用一次 start 以启动
// session.start(errno => {
// if (errno) {
// // 如果失败,将返回 errno
// } else {
// // 否则返回null表示成功
// }
// })
// console.log(444)
this.cameraEngine = wx.createCameraContext()
const listener = this.cameraEngine.onCameraFrame((frame) => {
if (this.tempImg) {
return;
}
wx.createVKSession({
track: {
plane: {mode: 3},
},
version: 'v2',
// gl, // WebGLRenderingContext
})
})
// // #ifdef MP-WEIXIN
// // 1、初始化人脸识别
// wx.initFaceDetect()
// // 2、创建 camera 上下文 CameraContext 对象
// this.cameraEngine = wx.createCameraContext()
// // 3、获取 Camera 实时帧数据
// const listener = this.cameraEngine.onCameraFrame((frame) => {
// if (this.tempImg) {
// return;
// }
// // 4、人脸识别使用前需要通过 wx.initFaceDetect 进行一次初始化,推荐使用相机接口返回的帧数据
// wx.faceDetect({
// frameBuffer: frame.data,
// width: frame.width,
// height: frame.height,
// enablePoint: true,
// enableConf: true,
// enableAngle: true,
// enableMultiFace: true,
// success: (faceData) => {
// let face = faceData.faceInfo[0]
// if (faceData.x == -1 || faceData.y == -1) {
// this.tipsText = '检测不到人'
// }
// if (faceData.faceInfo.length > 1) {
// this.tipsText = '请保证只有一个人'
// } else {
// const {
// pitch,
// roll,
// yaw
// } = face.angleArray;
// const standard = 0.5
// if (Math.abs(pitch) >= standard || Math.abs(roll) >= standard ||
// Math.abs(yaw) >= standard) {
// this.tipsText = '请平视摄像头'
// } else if (face.confArray.global <= 0.8 || face.confArray.leftEye <=
// 0.8 || face.confArray.mouth <= 0.8 || face.confArray.nose <= 0.8 ||
// face.confArray.rightEye <= 0.8) {
// this.tipsText = '请勿遮挡五官'
// } else {
// this.tipsText = '请拍照'
// // 这里可以写自己的逻辑了
// }
// }
// },
// fail: (err) => {
// if (err.x == -1 || err.y == -1) {
// this.tipsText = '检测不到人'
// } else {
// this.tipsText = err.errMsg || '网络错误,请退出页面重试'
// }
// },
// })
// })
// 5、开始监听帧数据
// listener.start()
// #endif
},
// 切换设备镜头
handleChangeCameraClick() {
this.devicePosition = !this.devicePosition;
},
// 图片上传
handleChooseImage() {
uni.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album','camera'],
success: (res) => {
console.log(res,'打印res哈哈哈哈哈')
if (res.errMsg === 'chooseImage:ok') {
uni.showLoading({
title: '照片上传中...'
})
const tempFilePaths = res.tempFilePaths[0]
this.upLoad(res.tempFilePaths);
}
},
fail: (res) => {
},
});
},
// 拍照点击
handleTakePhotoClick() {
if (this.tipsText != "" && this.tipsText != "请拍照") {
return;
}
uni.getSetting({
success: (res) => {
if (!res.authSetting['scope.camera']) {
this.isAuthCamera = false
uni.openSetting({
success: (res) => {
if (res.authSetting['scope.camera']) {
this.isAuthCamera = true;
}
}
})
}
}
})
this.cameraEngine.takePhoto({
quality: "high",
success: ({
tempImagePath
}) => {
this.tempImg = tempImagePath
}
})
console.log(this.tempImg,2121)
},
// 点击确定上传
handleOkClick() {
// 这里的 this.tempImg 是经过人脸检测后 拍照拿到的路径
this.upLoadOne(this.tempImg)
uni.navigateBack({
delta: 1
});
},
upLoad(tempFilePaths) {
// # 注意 这里上传图片拿到的tempFilePaths是一个数组啊
// 图片上传
uni.showLoading({
title: "上传中,请稍后...",
});
let proAll = [];
tempFilePaths.forEach((item) => {
console.log(item,'打印item')
proAll.push(this.upLoadOne(item));
});
Promise.all(proAll).then((res) => {
// 上传完成
uni.hideLoading();
});
},
upLoadOne(imgPath) {
// 然后这里imgPath 传过来的是 要上传的临时本地图片的路径
// 具体上传方法根据自己的请求方式 请求自己的接口
},
// 点击 - 取消上传
handleCancelClick() {
this.tempImg = ''
},
// 点击 - 人脸安全保障按钮
handleJumpSecurityClick() {
uni.showToast({
icon: "none",
title: "假装跳转人脸安全保障",
duration: 2000,
})
},
}
}
</script>
<style lang="scss" scoped>
.scan_box{width: 200px;height: 200px;margin: 70px auto;border: 3px solid #009688;border-radius: 50%;background-color: #EEEEEE;
display: flex;justify-content: center;
}
.avatar_frame{width: 100%;height: 100%;}
.scan_img{height: 98px;padding-top: 14px; position: absolute;width: 200px;}
.start_view{display: flex;justify-content: center;padding-top: 20px;}
.start_but{width: 116px;height: 34px;border-radius: 29px;background: #009688;align-items: center;justify-content: center;display: flex;}
.page-content {
width: 100%;
height: 100%;
.containerV {
width: 100%;
height: 100%;
.headerV {
.top-tips1 {
margin-top: 60rpx;
color: #FFFFFF;
font-size: 36rpx;
text-align: center;
}
.top-tips2 {
margin-top: 20rpx;
color: #00AAFF;
font-size: 28rpx;
text-align: center;
}
}
.contentV {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 400rpx;
margin-top: 30rpx;
.tipV {
bottom: 30rpx;
position: absolute;
line-height: 90rpx;
padding-left: 24rpx;
padding-right: 24rpx;
max-width: calc(100vw - 50rpx * 2);
text-align: center;
font-size: 30rpx;
background: #000000;
opacity: 0.75;
color: #FFFFFF;
border-radius: 16rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
z-index: 5;
}
.camera {
width: 400upx;
height: 400upx;
border-radius: 50%;
border: 3px solid #009688;
}
.mark {
position: absolute;
left: 0;
top: 0;
z-index: 2;
width: 750rpx;
height: 100%;
// background:deeppink;
background-size: 750rpx 661rpx;
}
image {
position: absolute;
width: 100%;
height: 100%;
z-index: 3;
}
}
.footerV {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.privacyV {
padding-top: 30rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.text {
font-size: 30rpx;
color: #1C1C1C;
text-align: center;
line-height: 42rpx;
margin-left: 15rpx;
text {
font-size: 30rpx;
color: #00AAFF;
text-align: center;
line-height: 42rpx;
}
}
.icon {
width: 40rpx;
height: 47rpx;
background:green;
background-size: 100% auto;
}
}
.bottom-tips-2 {
margin-top: 20rpx;
color: #999999;
text-align: center;
font-size: 26rpx;
}
.take-photo-bgV {
width: 100%;
margin-top: 300rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.btn-take-photo {
margin: 0rpx 80rpx 0rpx 80rpx;
width: 196rpx;
height: 196rpx;
background: yellow;
background-size: 100% auto;
}
.btn-change-upload {
left: 130rpx;
width: 80rpx;
height: 80rpx;
background: blue;
background-size: 100% auto;
}
.btn-change-camera {
right: 130rpx;
width: 80rpx;
height: 80rpx;
background:red;
background-size: 100% auto;
}
}
.confirmV {
margin: 200rpx 100rpx 0rpx 100rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.btn-cancel {
font-size: 32rpx;
color: #1C1C1C;
}
.btn-ok {
font-size: 32rpx;
color: #00AAFF;
}
}
}
}
}
</style>

View File

@ -0,0 +1,158 @@
<template>
<view class="pagepaddings">
<!-- <checkbox-group @change="checkboxChange">
<label class="uni-list-cell uni-list-cell-pd" v-for="item in items" :key="item.value">
<view>
<checkbox :value="item.value" :checked="item.checked" />
</view>
<view>{{item.name}}</view>
</label>
</checkbox-group> -->
<view class="contentboxsty" v-for="(item, index) in list" :key="index.id">
<view class="list_name">
<checkbox-group @change="changeCheckbox">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="item.id" :checked="item.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <checkbox-group @change="selectPath(e,item)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="item.id" :checked="item.checked" style="transform:scale(0.7)" />
</checkbox-group> -->
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth12" @click="selectPath($event.target,item)"></text> -->
{{item.name}}{{item.checked}}
</view>
<view class="list_content" v-for="(i, ind) in item.child" :key="ind">
<view class="content_name">
<checkbox-group @change="selectPath(e,i)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="i.id" :checked="i.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth5"></text> -->
<text class="">{{i.name}}</text>
</view>
<view class="content_item">
<view class="content_data" v-for="(btn, inx) in i.child" :key="inx">
<checkbox-group @change="selectPath(e,i)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="btn.id" :checked="btn.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth5"></text> -->
<text class="">{{btn.name}}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
items: [{
value: 'USA',
name: '美国'
},
{
value: 'CHN',
name: '中国',
checked: 'true'
},
{
value: 'BRA',
name: '巴西'
},
{
value: 'JPN',
name: '日本'
},
{
value: 'ENG',
name: '英国'
},
{
value: 'FRA',
name: '法国'
}
],
list:[
{name:'首页',checked:true,id:1,child:[{
id: 2,
name:'控制台',
checked:true,
child:[
{id:121,name:'设备信息',},
{id:122,name:'生产加工信息',},
{id:123,name:'生产加工信息',},
{id:124,name:'账号信息',},
{id:125,name:'通知设置',},
{id:126,name:'升级角色'},],
},
],
},
// {name:'生产工单',id:11,child:[{
// id: 3,
// name:'待生产工单',
// child:[{name:'添加工单'},
// {name:'审核工单'},
// {name:'删除工单'},
// ],
// },
// {name:'已排产工单',
// child:[],
// },
// ],
// }
],
arr:[]
}
},
methods: {
checkboxChange: function (e) {
var items = this.items,
values = e.detail.value;
for (var i = 0, lenI = items.length; i < lenI; ++i) {
const item = items[i]
if(values.includes(item.value)){
this.$set(item,'checked',true)
}else{
this.$set(item,'checked',false)
}
}
console.log(items)
},
changeCheckbox(e){
console.log(e)
// var items = this.list,
// values = e.detail.value;
// for (var i = 0, lenI = items.length; i < lenI; ++i) {
// const item = items[i]
// if(values.includes(item.value)){
// this.$set(item,'checked',true)
// }else{
// this.$set(item,'checked',false)
// }
// }
// console.log(items)
},
selectPath(e,item){
console.log(e,item,222)
},
}
}
</script>
<style>
.contentboxsty{padding: 14px 12px;margin-bottom: 12px;}
.list_name{display: flex;align-items: center;padding-bottom: 7px;border-bottom: 1px solid #2D3A6F;}
.content_name{padding:8px 0 ;display: flex;align-items: center;}
.content_item{display: flex;align-items: center;flex-wrap: wrap;}
.content_data{padding: 4px 15px 4px 0;display: flex;align-items: center;}
/* 复选框-背景颜色 */
checkbox.checkbox-backgroun-yellow[checked] .wx-checkbox-input,
checkbox.checkbox-backgroun-yellow.checked .uni-checkbox-input{
background-color: #009688 !important;
border-color: #009688 !important;
color: #ffffff !important;
}
</style>

View File

@ -32,7 +32,7 @@
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">流程审批</view>
</view>
<view class="backlog_module">
<view class="backlog_module" @click="toAlarm">
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">设备报警</view>
</view>
@ -40,7 +40,7 @@
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">权限审批</view>
</view>
<view class="backlog_module">
<view class="backlog_module" @click="toSafetyAccidents()">
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">安全事故</view>
</view>
@ -51,7 +51,7 @@
<view class="font14">账户中心</view>
</view>
<view class="con_data">
<view class="con_module">
<view class="con_module" @click="toMessage">
<view class="t-icon t-icon-xiaoxitongzhi-gerenzhongxin personicon"></view>
<view class="font13">消息管理</view>
<view class=""></view>
@ -61,11 +61,16 @@
<view class="font13">审批直达</view>
<view class=""></view>
</view> -->
<view class="con_module noborbot">
<view class="con_module" @click="toMyAuthority()">
<view class="t-icon t-icon-wodequanxian personicon"></view>
<view class="font13">我的权限</view>
<view class=""></view>
</view>
<view class="con_module noborbot" @click="toFaceAuthentication()">
<view class="t-icon t-icon-renlianrenzheng personicon"></view>
<view class="font13">人脸认证</view>
<view class=""></view>
</view>
</view>
<view class="con_set">
<view class="t-icon t-icon-xitongshezhi-gerenzhongxin personicon"></view>
@ -90,12 +95,40 @@
}
},
methods: {
//跳转设备报警
toAlarm(){
uni.navigateTo({
url:'/pages/person/alarm'
})
},
toSafetyAccidents(){
uni.navigateTo({
url:'/pages/person/safetyAccidents'
})
},
//跳转账户中心页
toAccountCenter(){
uni.navigateTo({
url: '/pages/person/accountCenter'
})
},
//跳转人脸认证页
toFaceAuthentication(){
uni.navigateTo({
url:'/pages/person/faceAuthentication'
})
},
toMyAuthority(){
uni.navigateTo({
url:'/pages/person/myAuthority'
})
},
//跳转消息页
toMessage(){
uni.navigateTo({
url: '/pages/index/message'
})
},
}
}
</script>

View File

@ -0,0 +1,43 @@
<template>
<!-- 安全事故 -->
<view class="pagepaddings">
<view class="contentboxsty font13" v-for="(item, index) in list" :key="index">
<view class="name font_bold font14">
{{item.name}}
</view>
<view class="img_style">
<image :src="item.url"></image>
</view>
<view class="flex_layout padd_bot6">
<view class="flex1">员工安全行为</view>
<view class="">2023-09-01</view>
</view>
<view class="">
事件描述事件描述事件描述事件描述事件描述事件描述
事件描述事件描述事件描述事件描述事件描述事件描述
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
list:[
{name:'设备一',url:'../../static/logo.png'},
{name:'设备一',url:'../../static/logo.png'},
]
}
},
methods: {
}
}
</script>
<style>
.contentboxsty{padding: 14px 12px;margin-bottom: 12px;}
.img_style{padding: 12px 0 14px 0;}
</style>