小程序实现拍照打卡的详细代码是什么
Admin 2022-09-13 群英技术资讯 366 次浏览
由于拍照组件是相当于一个块,用隐藏显示的方法不太好,为了更好的用户交互,选择了在一个新的页面调用相机组件,上传图片并保存打卡数据的方式。
签到页面wxml
<view class="signBtn" bindtap="signSubmit"> <view>{{signTime}}</view> <view>打卡签到</view> </view>
签到页面js
onLoad: function (options) { setInterval(function(){ showTime(_self); }, 1000); }, //签到按钮方法 signSubmit(){ let _self = this.data; let userInfo = this.data.ruleInfo; let data = { //签到需要保存的数据 } if(this.data.signDisabled){//在打卡距离内 if(this.data.photoDisabled){//需要拍照人员 this.toPhoto(data); return true; } wx.request({ url: getApp().globalData.requestPath + '/sign/saveSignRuleData', data: data, method:'POST', header: {'content-type': 'application/json'}, success: function (res) { if(res.data.success){ wx.showToast({ title: '打卡成功', }) }else{ wx.showToast({ icon:'none', title: res.data.msg, }) } } }) }else{ wx.showToast({ icon: 'none', title: '当前位置不允许打卡', }) } }, //跳转到拍照页面方法 toPhoto(data){ let signData = JSON.stringify(data); wx.navigateTo({ url: './takePhoto?signData='+signData, //跳转到自定义的一个拍照页面 }) } //自动获取时间,并实时显示 function showTime(obj){ var today,year,month,day,hour,second,minute; var strTime; var strDate; today=new Date(); var year=today.getFullYear(); var month=today.getMonth(); var day=today.getDate(); hour = today.getHours(); minute =today.getMinutes(); second = today.getSeconds(); strDate = year+"年"+check(month)+"月"+check(day)+"日"; strTime = check(hour)+":"+check(minute)+":"+check(second); obj.setData({ signTime : strTime }) }
拍照页面wxml
<view> <camera class="camera" device-position='{{devicePosition}}'> <cover-view> <cover-image wx:if="{{havaPhoto}}" src="{{src}}"></cover-image> </cover-view> </camera> <view hidden="{{havaPhoto}}" style="background-color:black;height:15vh"> <button bindtap="takePhoto" class="takeButton" style="left:45vw">拍照</button> <button bindtap="changeCamera" class="takeButton" style="right:15vw">转换</button> </view> <view hidden="{{!havaPhoto}}" style="background-color:black;height:15vh"> <button bindtap="retake" class="takeButton" style="left:15vw">重拍</button> <button bindtap="signPhoto" class="takeButton" style="left:45vw">打卡</button> </view> </view>
拍照页面js
takePhoto(){//拍照按钮 let ctx = wx.createCameraContext(); let _self = this; ctx.takePhoto({ quality: 'high',//high,normal,low success: (res) => { _self.setData({ src:res.tempImagePath, havaPhoto:true }) } }) }, retake(){//重新拍摄 this.setData({ havaPhoto:false, src:'' }) }, changeCamera(){//转换摄像头 if(this.data.devicePosition=='front'){ this.setData({ devicePosition:'back' }) }else{ this.setData({ devicePosition:'front' }) } }, signPhoto(){//上传文件,并保存打卡数据 let _self = this; wx.uploadFile({ url: getApp().globalData.requestPath + '/sign/saveSignPhoto', filePath: _self.data.src, name: 'filePath', formData: { 'user': _self.data.signData.userId }, success: function (res) { let resData = JSON.parse(res.data); let data = _self.data.signData; data.imagePath = resData.msg; if(res.statusCode==200 && resData.success){ wx.request({ url: getApp().globalData.requestPath + '/sign/saveSignRuleData', data: data, method:'POST', header: {'content-type': 'application/json'}, success: function (result) { if(result.data.success){ wx.showToast({ title: '打卡成功', }) setTimeout(() => { wx.navigateBack(); }, 2000); }else{ wx.showToast({ icon:'none', title: result.data.msg, }) } } }) }else{ wx.showToast({ title: resData.msg, }) setTimeout(() => { wx.navigateBack(); }, 2000); } } }) }
保存照片
@RequestMapping("/saveSignPhoto") @ResponseBody public AjaxResult saveSignPhoto(HttpServletRequest request, @RequestParam(value = "filePath", required = false) MultipartFile file) throws IOException { String fileName = file.getOriginalFilename(); String path; String type; String trueFileName; String basePath = "D:/file/"; String user = request.getParameter("user"); if(!file.isEmpty()) { type = fileName.contains(".") ? fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()) : null; if (type != null) { if ("PNG".equals(type.toUpperCase())||"JPG".equals(type.toUpperCase())) { // 项目在容器中实际发布运行的根路径 // String realPath = request.getSession().getServletContext().getRealPath("/"); // 自定义的文件名称 trueFileName = System.currentTimeMillis() + "_" +user + "_" + sdf.format(new Date()) + "." +type; // 设置存放图片文件的路径 path = basePath + trueFileName; file.transferTo(new File(path)); }else { return AjaxResult.errorResult("文件类型错误"); } }else { return AjaxResult.errorResult("文件类型不存在"); } }else { return AjaxResult.errorResult("文件不存在"); } return AjaxResult.successResult(trueFileName); }
保存打卡数据
@RequestMapping("/saveSignRuleData") @ResponseBody public AjaxResult saveSignRuleData(@RequestBody BgCard bgCard){ boolean flag = signDataService.saveSignRuleData(bgCard); if(flag){ return AjaxResult.successResult(); }else { return AjaxResult.errorResult("保存失败"); } }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了js实现文字无缝轮播,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章小编给大家分享的是深拷贝和浅拷贝的内容,下文介绍了变量类型与存储空间、深拷贝和浅拷贝的概念和深拷贝和浅拷贝的常用方法等等,文中示例介绍的很详细,感兴趣的朋友可以了解看看,下面让我们一起来学习一下吧!
虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化。接下来就学习学习它是如何使用的
本篇文章带大家了解一下Node中的文件模块和核心模块,聊聊文件模块的查找和文件模块的编译执行、JavaScript与C/C++ 核心模块的编译执行,希望对大家有所帮助!
这篇文章主要介绍了JavaScript构造树形结构的一种高效算法,对算法感兴趣的同学,可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008