1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee

创建新的小程序,进出码,体温上报功能迁移基本完成

This commit is contained in:
2023-03-17 04:55:02 +08:00
parent 5b98be9bf9
commit b7bf3bfc15
88 changed files with 4337 additions and 276 deletions

View File

@@ -0,0 +1,215 @@
// pages/residents/code.js
import SparkMD5 from '../../utils/spark-md5.min'
import utils from '../../utils/util'
import drawQrcode from '../../utils/qrcode/index'
import scanQRCode from '../../utils/scanQRCode'
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
timeInterval: null,
isShow: 'none',
userText: '',
showText: '',
showTextColor: '',
time: '',
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
console.log('onShow')
// setTimeout(this.refershData, 100)
this.refershData()
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
console.log('onHide')
clearInterval(this.data.timeInterval);
this.setData({
isShow: 'none',
time: ''
})
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
console.log('onUnload')
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
console.log('onPullDownRefresh')
this.refershData(() => {
wx.stopPullDownRefresh();
});
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
},
refershData(callback) {
console.log('this.refershData()')
wx.showNavigationBarLoading();
clearInterval(this.data.timeInterval);
this.setData({
isShow: 'none',
time: '',
userInfo: wx.getStorageSync("userInfo"),
})
if (!this.data.userInfo) {
wx.redirectTo({
url: '/pages/index/login'
})
}
wx.showLoading({
title: '加载中'
})
var that = this;
wx.request({
url: `${app.globalData.baseUrl}/access/code/getCodeInfo`,
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded" //用于post
},
data: {
id: this.data.userInfo.id,
},
success: function (d) {
console.log("begin success")
wx.hideLoading()
let result = d.data;
if (result.success) {
console.log("result.data", result.data);
that.setData({
userText: `${that.data.userInfo.id} | ${that.data.userInfo.realname}`,
showText: result.data.infoText,
showTextColor: result.data.infoTextColor
})
let t = Date.now();
let chksum = SparkMD5.hash(JSON.stringify({
id: that.data.userInfo.id,
t: t
}));
console.log("chksum", chksum)
that.drawCode(`https://epp.cxyxiaomo.com/access/validCode?id=${that.data.userInfo.id}&t=${t}&chksum=${chksum}`, result.data.qrcodeColor)
} else {
wx.showToast({
title: result.msg,
icon: 'error',
duration: 2000
})
}
that.setData({
isShow: ''
})
console.log("end success")
},
fail: function () {
console.log("begin fail")
wx.hideLoading()
wx.showToast({
title: "请求失败",
icon: 'error',
duration: 2000
})
console.log("end fail")
},
complete: function () {
console.log("begin complete")
if (typeof (callback) === "function")
callback();
wx.hideNavigationBarLoading();
console.log("end complete")
}
})
},
drawCode(text = 'https://www.baidu.com/', foreground = 'red') {
console.log("drawCode was called.")
var that = this;
const query = wx.createSelectorQuery()
query.select('#myQrcode')
.fields({
node: true,
size: true
})
.exec(async (res) => {
console.log("before drawQrcode")
var canvas = res[0].node
if (!canvas) {
wx.showToast({
title: "canvas获取失败",
icon: 'error',
duration: 2000
})
return
}
console.log("canvas:", canvas, "res:", res)
// 调用方法drawQrcode生成二维码
await drawQrcode(wx, {
canvas: canvas,
canvasId: 'myQrcode',
width: 150,
padding: 0,
background: '#ffffff',
foreground: foreground,
text: text,
})
console.log("end drawQrcode")
this.updateTime();
this.setData({
timeInterval: setInterval(this.updateTime, 1000)
})
})
},
updateTime() {
this.setData({
time: utils.formatTime(new Date())
})
console.log("刷新时间")
},
scan() {
scanQRCode(wx)
}
})

View File

@@ -0,0 +1,5 @@
{
"usingComponents": {},
"navigationBarTitleText": "身份码",
"enablePullDownRefresh": true
}

View File

@@ -0,0 +1,10 @@
<!--pages/residents/code.wxml-->
<view id="codeView" :style="{ display: isShow }">
<view id="user-text"><text>{{ userText }}</text></view>
<view id="time-text"><text>{{ time }}</text></view>
<canvas type="2d" style="width: 250px; height: 250px;" id="myQrcode"></canvas>
<view id="show-text"><text style="color: {{ showTextColor }}">{{ showText }}</text></view>
<view id="small-text"><text>下拉可刷新</text></view>
<button id="scan-btn" size="mini" bindtap="scan">扫门禁码</button>
</view>

View File

@@ -0,0 +1,37 @@
/* pages/residents/code.wxss */
#codeView {
text-align: center;
margin-top: 50px;
}
#user-text {
font-size: 18px;
}
#time-text {
font-weight: bold;
font-size: 22px;
margin-top: 30px;
}
#myQrcode {
display: block;
margin: 30px auto;
}
#show-text {
font-weight: bold;
font-size: 25px;
}
#small-text {
margin-top: 30px;
color: grey;
font-size: small;
}
#scan-btn {
margin-top: 20px;
padding: 9px 60px;
font-size: initial;
}

View File

@@ -0,0 +1,291 @@
// pages/residents/report.js
import utils from '../../utils/util'
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
isSkipOnShowFunc: false, // 是否跳过 onShow
userInfo: null,
timeInterval: null,
formData: {
userId: '',
userRealname: '',
address: '',
time: '',
timestamp: '',
temperature: 0,
},
// 是否填报过
isFilled: true,
filledMsg: "",
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
if (this.data.isSkipOnShowFunc) {
this.setData({
isSkipOnShowFunc: false,
})
return
}
console.log('onShow')
let userInfo = wx.getStorageSync("userInfo")
console.log("userInfo", userInfo)
this.setData({
userInfo: userInfo,
"formData.userId": userInfo.id,
"formData.userRealname": userInfo.realname,
timeInterval: setInterval(this.updateTime, 1000)
})
console.log("formData", this.data.formData)
this.updateTime();
// 获取用户当日是否填报过
wx.showLoading({
title: '加载中'
})
var that = this;
wx.request({
url: `${app.globalData.baseUrl}/access/report/getLatestRecord`,
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded" //用于post
},
data: {
userId: this.data.userInfo.id
},
success: function (d) {
wx.hideLoading()
let result = d.data
console.log("result", result)
if (result.success) {
console.log("result.data", result.data);
if (result.data == null || new Date(result.data.time) < new Date(new Date().toISOString().substring(0, 10))) {
// 如果没有填报记录,或者填报记录不是今天,那么说明没有填报过
that.setData({
isFilled: false
})
} else {
// 有今日记录,说明已经填报过
that.setData({
isFilled: true,
filledMsg: "您已完成今日体温填报"
})
}
} else {
wx.showToast({
title: "加载填报信息失败",
icon: 'error',
duration: 2000
})
}
},
fail: function () {
wx.hideLoading()
wx.showToast({
title: "请求失败",
icon: 'error',
duration: 2000
})
},
complete: function () {
wx.hideNavigationBarLoading();
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
},
bindTemperatureChanged(e) {
this.setData({
"formData.temperature": e.detail.value
})
},
updateTime() {
let timestamp = Date.now()
this.setData({
"formData.timestamp": timestamp,
"formData.time": utils.formatTime(new Date(timestamp))
})
},
chooseLocation: async function () {
wx.showLoading({
title: '正在获取权限'
})
await new Promise((resolve) => {
wx.getSetting({
success(res) {
wx.hideLoading()
if (!res.authSetting['scope.userLocation']) {
wx.authorize({
scope: 'scope.userLocationBackground',
success() {
resolve();
}
})
} else {
resolve();
}
}
})
});
wx.showLoading({
title: '正在定位'
})
var that = this;
this.setData({
isSkipOnShowFunc: true, // 关闭位置选择器后,会触发 onShow这里避免掉
})
wx.chooseLocation({
success: function (res) {
console.log("wx.chooseLocation success")
that.setData({
"formData.address": res.address
})
},
fail: function () {
console.log("wx.chooseLocation fail", that.data.formData)
if (!that.data.formData.address) {
wx.showToast({
title: "请获取当前位置",
icon: 'error'
})
}
},
})
wx.hideLoading()
},
// 体温上报 提交按钮
report() {
console.log("点击提交", "this.data.formData", this.data.formData)
if (!this.data.formData.address) {
wx.showToast({
title: "请获取当前位置",
icon: 'error'
})
return;
}
wx.showLoading({
title: '加载中'
})
var that = this;
wx.request({
url: `${app.globalData.baseUrl}/access/report/submit`,
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded" //用于post
},
data: {
...this.data.formData,
},
success: function (d) {
console.log("begin success")
wx.hideLoading()
let result = d.data;
if (result.success) {
// 填报完成
that.setData({
isFilled: true,
filledMsg: "您已完成今日体温填报"
})
console.log("result.data", result.data);
wx.showToast({
title: "填报成功",
icon: 'success',
duration: 2000
})
} else {
wx.showToast({
title: result.msg || "出错啦",
icon: 'error',
duration: 2000
})
}
that.isShow = ''
console.log("end success")
},
fail: function () {
console.log("begin fail")
wx.hideLoading()
wx.showToast({
title: "请求失败",
icon: 'error',
duration: 2000
})
console.log("end fail")
},
complete: function () {
console.log("begin complete")
if (typeof (callback) === "function")
callback();
wx.hideNavigationBarLoading();
console.log("end complete")
}
})
},
// 历史填报
myreport() {
wx.navigateTo({
url: "/pages/residents/reportHistory"
})
}
})

View File

@@ -0,0 +1,4 @@
{
"usingComponents": {},
"navigationBarTitleText": "体温上报"
}

View File

@@ -0,0 +1,59 @@
<!--pages/residents/report.wxml-->
<view>
<view wx:if="{{ !isFilled }}" class="form">
<view class="row">
<view class="rowItem rowLeft center">
<text>姓名</text>
</view>
<view class="rowItem rowRight center">
<input class="rowRightElement" value="{{ formData.userRealname }}" disabled="true" />
</view>
</view>
<view class="row">
<view class="rowItem rowLeft center">
<text>填报时间</text>
</view>
<view class="rowItem rowRight center">
<input class="rowRightElement" value="{{ formData.time }}" disabled="true" />
</view>
</view>
<view class="row">
<view class="rowItem rowLeft center">
<text>地址</text>
</view>
<view class="rowItem rowRight center" bindtap="chooseLocation">
<input class="rowRightElement" placeholder="点击获取当前位置" value="{{ formData.address }}" disabled="true" maxlength="500" />
</view>
</view>
<view class="row">
<view class="rowItem rowLeft center">
<text>今日体温</text>
</view>
<view class="rowItem rowRight center">
<radio-group class="rowRightElement" bindchange="bindTemperatureChanged">
<radio value="0" checked="true" />正常
<radio value="1" />异常(≥37.3°)
</radio-group>
</view>
</view>
<view class="tips-area">
<view class="tips" style="color: red;">
* 本人承诺以上所填报的内容全部真实,并愿意承担相应责任。
</view>
</view>
<view style="text-align: center;">
<button class="controlBtn" size="mini" type="none" bindtap="myreport">历史填报</button>
<button class="controlBtn" size="mini" type="primary" bindtap="report">提交</button>
</view>
</view>
<view wx:else style="text-align: center;">
<!-- -->
<view style="margin: 40px 0;">{{ filledMsg }}</view>
<button class="controlBtn" size="mini" type="none" bindtap="myreport">历史填报</button>
</view>
</view>

View File

@@ -0,0 +1,39 @@
/* pages/residents/report.wxss */
.form {
padding: 20px 30px;
}
.row {
margin: 30px 0;
border-bottom: 2px solid grey;
}
.rowItem {
margin: 0;
padding: 0;
display: inline-block;
vertical-align: middle;
height: 1.6rem;
}
.rowLeft {
width: 30%;
}
.rowRight {
width: 70%;
}
.rowRightElement {
width: 100%;
}
.center {
text-align: center;
}
.controlBtn {
width: 250px;
margin: 0 30px;
}

View File

@@ -0,0 +1,125 @@
// pages/residents/reportHistory.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
userInfo: null,
displayName: '',
displayResult: [],
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
console.log('onShow')
let userInfo = wx.getStorageSync("userInfo")
this.setData({
userInfo: userInfo,
displayName: userInfo.realname
})
// 获取用户填报历史
wx.showLoading({
title: '加载中'
})
var that = this;
wx.request({
url: `${app.globalData.baseUrl}/access/report/getRecordList`,
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded" //用于post
},
data: {
userId: this.data.userInfo.id
},
success: function (d) {
wx.hideLoading()
let result = d.data
console.log("result", result)
if (result.success) {
console.log("result.data", result.data)
that.setData({
displayResult: result.data.map(item => {
// 时间友好化显示
let t = new Date(item.time).getTime() + 8 * 3600 * 1000
item.time = new Date(t).toISOString().substring(0, 19).replace("T", " ")
return item
})
})
} else {
wx.showToast({
title: "加载填报信息失败",
icon: 'error',
duration: 2000
})
}
},
fail: function () {
wx.hideLoading()
wx.showToast({
title: "请求失败",
icon: 'error',
duration: 2000
})
},
complete: function () {
wx.hideNavigationBarLoading();
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,4 @@
{
"usingComponents": {},
"navigationBarTitleText": "体温上报 - 历史记录"
}

View File

@@ -0,0 +1,21 @@
<!--pages/residents/reportHistory.wxml-->
<view>
<view style="margin: 20px; text-align: center;">
<text>姓名:{{ displayName }}</text>
</view>
<view class="container">
<view class="item {{ item.temperature == 1 ? 'abnormal' : 'normal' }}" wx:for="{{displayResult}}" wx:for-item="item">
<view>
<view class="record_time">
<!-- 填报时间: -->
{{ item.time }}
</view>
<view class="record_address">
<!-- 地址: -->
{{ item.address }}
</view>
</view>
<view class="statusText">{{ item.temperature == 1 ? "异常" : "正常" }}</view>
</view>
</view>
</view>

View File

@@ -0,0 +1,33 @@
/* pages/residents/reportHistory.wxss */
.item {
/* background-color: #dedede; */
border-radius: 8px;
margin: 12px 20px;
padding: 18px;
display: grid;
grid-template-columns: 1fr auto;
place-items: center;
color: white;
}
.item.normal {
background-color: green;
}
.item.abnormal {
background-color: red;
}
.record_time {
font-size: 17px;
}
.record_address {
font-size: 15px;
}
.statusText {
font-size: large;
font-weight: bold;
padding: 0 20px;
}