小实例?小系统?
是的,小实例,小系统,或者说是子系统。
因为签到本身的业务逻辑并不复杂,属于整个大的业务系统中的一个小环节,,至于签到的前置和后置操作,这里不做考虑,所以就是小实例,小系统。
模块拆解
一个简单签到系统,应该包含至少两个部分
这里,我介绍的场景是第二种方式,其中刷脸签到的场景,我在之前的一篇博文里也有介绍过,大伙感兴趣的可以去翻一下,👉传送门
来看下我这边涉及到的基本流程
其中即时消息的模块,应用在了管理人员扫码完成签到后,即时推送给用户签到结果。
客户端(签到人员)
因为这里主要是介绍即时通信在系统中的使用场景,其他的部分我觉得在代码甚至业务上并没有太大的通用性,所以就主要介绍即时消息的使用。
在即时消息的选型上,我们最开始也是用的 signalr,后来该到了腾讯的 IM SDK 上。
注册腾讯云,开通 IM 服务的流程也不多说了,之前也介绍过,在这里👉传送门
来看下客户端的继承代码
function TimInit(){ axios.post("后端接口地址", {"请求参数"}) .then(function(data){ console.log(data); let json = data.data; let ret = JSON.parse(json.data.ret); if(ret.ActionStatus=="OK"){ TT.info("消息中心连接成功"); let options = { SDKAppID: 1400441609, userID: getCookie("username") }; options.userSig = json.data.usersig; console.log(options); let tim = TIM.create(options); // 设置 SDK 日志输出级别,详细分级请参见 setLogLevel 接口的说明 tim.setLogLevel(1); tim.on(TIM.EVENT.MESSAGE_RECEIVED, function (event) { // 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面 console.log(event.data); if(event.data){ let from = event.data[0].from; let content = event.data[0].payload.text; if(from=="tony" || from =="administrator"){ TT.note("消息中心:" + content); } } }); tim.login(options); } })}
复制代码
这一个函数,包含了导入当前用户,监听消息提醒,登录。
集成好后,浏览器控制台打印出如下消息,代表接入成功
到这里,我们就可以写我们的生成签到码的逻辑了,具体形式就是根据登陆后获取到的个人信息和时间戳,生成一个唯一的签到码,时间戳的做用是标识这个签到码的有效时间。
//生成个人签到二维码function makeCode() { var qrcode = new QRCode(document.getElementById("myCode"), { width: 260, height: 260, correctLevel: QRCode.CorrectLevel.Q }); let content = { "userId": userId, "timeStamp": new Date().getTime() }; qrcode.makeCode(JSON.stringify(content));}
复制代码
到这里,客户端的主要流程就完成了,其他就是一些记录签到时间,次数等后置操作
服务端(扫码人员)
服务端的流程也不困难,只是流程相对多一些,包含了很多数据管理的功能项,这里还是着重说一下扫码人员扫码之后的一些操作。
既然是扫码,得解决怎么扫码的问题。因为我们这是一个轻量级的小系统,所以就直接用微信的扫码接口
。这个接口的使用门槛很低,即便是个人主体账号,也可以使用。
axios.get("@Url.Action("getWxConfig")", { params: { "url": curr_href }}).then(function (data) { console.log(data); var json = data.data;
wx.config({ debug: false, appId: '*******', // 必填,公众号的唯一标识 timestamp: json.data.timeStamp, // 必填,生成签名的时间戳 nonceStr: json.data.nonce, // 必填,生成签名的随机串 signature: json.data.signature,// 必填,签名 jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表 });})$("#btnScan").click(function () { wx.scanQRCode({ needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ["qrCode"], // 可以指定扫二维码还是一维码,默认二者都有 success: function (res) { let params = JSON.parse(res.resultStr); params.__RequestVerificationToken = token; params.adminId = adminId; params.trainId = trainId; params.columnId = columnId; scan(params); } });})
复制代码
配置好后,绑定到按钮点击事件上,就可以调起微信扫一扫接口了,非常方便。
扫码之后,就是像服务端发送扫码结果的消息了,扫码会识别出用户 id 和时间戳,以及扫码人员自身所绑定的场次信息,将这些数据封装成 json 提交到后台在完成一系列验证操作之后,返回用户签到成功与否的消息。
签到流程结束,后台代码就是接受消息,像 IM 服务中心发送请求,基本都是业务代码,没啥可贴的了。
/// <summary>/// 请求hub中心,发送消息/// </summary>/// <param name="toAccount"></param>/// <param name="msg"></param>/// <returns></returns>public async Task<dynamic> RequestImHub(string toAccount,string msg){ var item = "{\"SyncOtherMachine\":2,\"To_Account\":\"" + toAccount + "\",\"MsgLifeTime\":60,\"MsgBody\":[{\"MsgType\":\"TIMTextElem\",\"MsgContent\":{\"Text\":\"" + msg + "\"}}],\"CloudCustomData\":\"\"}"; return await RequestHelper.HttpPostAsync($"{CipAssistant.ConfigurationHelper.GetSectionValue("imHub")}/send", item, "application/json");}
复制代码
IM 中心的代码在这里有,就不再贴了。
好了,其实代码根本就不重要,主要就是继承的过程,来看下效果
为了方便管理人员扫码,这里还设置了一个自动扫码的开关,开启后,设备就可以定时循环扫描了,可以节省一定的人力成本。
这个图里一直提示签到失败,是因为我在上面已经完成当前场次的签到了,主要演示的是它循环定时扫码的功能。
介绍这篇,其实就是想多展示一些小众场景的即时通信 IM 的使用案例,除了常见的聊天,客服,实时音视频等这些常见场景,在很多地方 IM 都可以发挥重要功能,就像是给系统插上了翅膀一样,灵活多变。当然了,也看成本,毕竟第三方的都是收费的,自己搞的话连接数多了要考虑负载问题,说到底还是权衡成本啦。
好了,今天基本就这样了。晚安~
评论