myapp_sjy 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/Dockerfile +7 -0
  2. package/app.js +58 -0
  3. package/bin/www +92 -0
  4. package/package.json +100 -0
  5. package/pkg.zip +0 -0
  6. package/public/css/layui.css +1 -0
  7. package/public/css/modules/code.css +1 -0
  8. package/public/css/modules/laydate/default/laydate.css +1 -0
  9. package/public/css/modules/layer/default/icon-ext.png +0 -0
  10. package/public/css/modules/layer/default/icon.png +0 -0
  11. package/public/css/modules/layer/default/layer.css +1 -0
  12. package/public/css/modules/layer/default/loading-0.gif +0 -0
  13. package/public/css/modules/layer/default/loading-1.gif +0 -0
  14. package/public/css/modules/layer/default/loading-2.gif +0 -0
  15. package/public/font/iconfont.eot +0 -0
  16. package/public/font/iconfont.svg +554 -0
  17. package/public/font/iconfont.ttf +0 -0
  18. package/public/font/iconfont.woff +0 -0
  19. package/public/font/iconfont.woff2 +0 -0
  20. package/public/layui.js +5 -0
  21. package/public/stylesheets/style.css +8 -0
  22. package/routes/api.js +642 -0
  23. package/routes/datatime.js +16 -0
  24. package/routes/db.js +145 -0
  25. package/routes/index.js +28 -0
  26. package/routes/nppBackup/sql.js.2024-07-08_082213.bak +25 -0
  27. package/routes/nppBackup/sql.js.2024-07-08_082214.bak +25 -0
  28. package/routes/sql.js +25 -0
  29. package/routes/switch.js +33 -0
  30. package/routes/switch1.js +12 -0
  31. package/views/addroom.ejs +223 -0
  32. package/views/addstu.ejs +318 -0
  33. package/views/error.ejs +3 -0
  34. package/views/hisinfo.ejs +442 -0
  35. package/views/hisinfo1.ejs +291 -0
  36. package/views/login.ejs +227 -0
  37. package/views/modroom.ejs +365 -0
  38. package/views/modstu.ejs +375 -0
  39. package/views/rtinfo.ejs +342 -0
  40. package/views/rtinfo1.ejs +268 -0
@@ -0,0 +1,442 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>签到管理系统</title>
7
+ <meta name="renderer" content="webkit">
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1">
10
+ <link href="/css/layui.css" rel="stylesheet">
11
+ <style>
12
+ .layui-header {
13
+ height: 60px;
14
+ background-color: #10081a !important; /* 深蓝色 */
15
+ }
16
+ .layui-layout-left {
17
+ margin-left: 0 !important;
18
+ }
19
+
20
+ .layui-layout-right {
21
+ margin-right: 0 !important;
22
+ }
23
+
24
+ body {
25
+ font-size: 16px;
26
+ /*字体大小*/
27
+ color: #010704;
28
+ /*字体颜色*/
29
+ }
30
+
31
+ .footer-bg {
32
+ background-image: url('https://p2.ssl.qhimgs1.com/t017677196113fc982c.jpg');
33
+ background-size: cover;
34
+ background-position: center;
35
+ height: 200px;
36
+ }
37
+ .layui-side {
38
+ background-color: #9ca58d !important;
39
+ }
40
+ </style>
41
+ </head>
42
+
43
+ <body style="background-image: url('https://p2.ssl.qhimgs1.com/t017677196113fc982c.jpg'); background-size: cover; background-repeat: no-repeat; background-position: center; background-attachment: fixed;">
44
+ <div class="layui-layout layui-layout-admin">
45
+ <div class="header-bg">
46
+ <!-- 顶部导航栏 -->
47
+ <div class="layui-header">
48
+ <div class="layui-logo layui-hide-xs layui-bg-black">签到管理系统</div>
49
+
50
+ <!-- 导航菜单 -->
51
+ <ul class="layui-nav layui-layout-left">
52
+ <li class="layui-nav-item">
53
+ <a href="javascript:;"><i class="layui-icon layui-icon-user"></i> 学生信息管理</a>
54
+ <dl class="layui-nav-child">
55
+ <dd><a href="modstu"><i class="layui-icon layui-icon-edit"></i> 查询与更新</a></dd>
56
+ <dd><a href="addstu"><i class="layui-icon layui-icon-add-1"></i> 新增学生信息</a></dd>
57
+ </dl>
58
+ </li>
59
+ <li class="layui-nav-item">
60
+ <a href="javascript:;"><i class="layui-icon layui-icon-set"></i> 设备标识管理</a>
61
+ <dl class="layui-nav-child">
62
+ <dd><a href="modroom"><i class="layui-icon layui-icon-edit"></i> 查询与更新</a></dd>
63
+ <dd><a href="addroom"><i class="layui-icon layui-icon-add-1"></i> 新增设备信息</a></dd>
64
+ </dl>
65
+ </li>
66
+ </ul>
67
+
68
+ <!-- 右侧用户菜单 -->
69
+ <ul class="layui-nav layui-layout-right">
70
+ <li class="layui-nav-item layui-hide layui-show-sm-inline-block">
71
+ <a href="javascript:;">
72
+ <img src="https://pic.rmb.bdstatic.com/359341f4f00ad8453f6eb04b433c35ad.jpeg" class="layui-nav-img">
73
+ <!-- tester -->
74
+ </a>
75
+ <dl class="layui-nav-child">
76
+ <!-- <dd><a href="javascript:;">修改登录密码</a></dd>
77
+ <dd><a href="javascript:;">修改绑定手机</a></dd> -->
78
+ <dd><a href="/">登出</a></dd>
79
+ </dl>
80
+ </li>
81
+ <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
82
+ <a href="javascript:;">
83
+ <i class="layui-icon layui-icon-more-vertical"></i>
84
+ </a>
85
+ </li>
86
+ </ul>
87
+ </div>
88
+ </div>
89
+
90
+ <!-- 左侧导航栏 -->
91
+ <div class="layui-side layui-bg-black">
92
+ <ul class="layui-nav layui-nav-tree" lay-filter="test">
93
+ <li class="layui-nav-item">
94
+ <a href="/switch"><i class="layui-icon layui-icon-ok"></i> 实时签到信息</a>
95
+ </li>
96
+ <li class="layui-nav-item layui-this">
97
+ <a href="hisinfo"><i class="layui-icon layui-icon-chart"></i> 历史签到信息</a>
98
+ </li>
99
+ </ul>
100
+ </div>
101
+
102
+ <div class="layui-body" style="height: 100%">
103
+ <div class="layui-form-item">
104
+ <div class="layui-inline">
105
+ <label class="layui-form-label" style="white-space: nowrap; margin-top: 25px;">日期时间范围</label>
106
+ <div class="layui-input-inline" style="width: 300px; margin-top: 25px;">
107
+ <input type="text" class="layui-input" id="timerange" placeholder=" - ">
108
+ </div>
109
+ </div>
110
+
111
+ <div class="layui-inline" style="margin-top: 25px; margin-left: 10px;">
112
+ <label class="layui-form-label">学号查询</label>
113
+ <div class="layui-input-inline">
114
+ <input type="text" id="studentId" class="layui-input" placeholder="请输入学号">
115
+ </div>
116
+ <!-- <button id="searchButton" class="layui-btn">查询</button> -->
117
+ </div>
118
+
119
+ <div class="layui-inline" style="margin-top: 25px; margin-left: 10px;">
120
+ <label class="layui-form-label">房间号查询</label>
121
+ <div class="layui-input-inline">
122
+ <input type="text" id="roomNumber" class="layui-input" placeholder="请输入房间号">
123
+ </div>
124
+ </div>
125
+
126
+ <button id="combinedSearchButton" class="layui-btn">组合查询</button>
127
+
128
+ <div class="layui-inline" style="float: right; margin-top: 25px;">
129
+ <button id="chartshow" class="layui-btn" type="button" lay-filter="chartshow">迟到情况统计
130
+ </button>
131
+ </div>
132
+ </div>
133
+
134
+ <table class="layui-table" id="record" lay-filter="demot1">
135
+ </table>
136
+ </div>
137
+
138
+
139
+
140
+ <div class="layui-footer">
141
+ 不积跬步,无以至千里。
142
+ </div>
143
+ </div>
144
+
145
+ <div class="layui-row layui-col-md3" style="width:550px;margin:auto;display:none;" id="chart">
146
+ <canvas id="myChart"></canvas>
147
+ <table lay-even lay-skin="nob" style="float: right">
148
+ <tbody>
149
+ <tr>
150
+ <td>正常:</td>
151
+ <td><label name="normalper" id="normalper" style="float: right"></label></td>
152
+ </tr>
153
+ <tr>
154
+ <td>迟到:</td>
155
+ <td><label name="lateper" id="lateper" style="float: right"></label></td>
156
+ </tr>
157
+ </tbody>
158
+ </table>
159
+ </div>
160
+
161
+ <script src="/layui.js"></script>
162
+ <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
163
+ <script src="https://cdn.bootcss.com/Chart.js/2.7.3/Chart.js"></script>
164
+
165
+ <script>
166
+
167
+ layui.use(['layer', 'form', 'table', 'laydate'], function () {
168
+ var layer = layui.layer;
169
+ var form = layui.form;
170
+ var table = layui.table;
171
+ var laydate = layui.laydate;
172
+
173
+ // 初始化表格
174
+ var tableIns = table.render({
175
+ elem: '#record',
176
+ url: '/api/combinedSearch', // 数据来源URL
177
+ page: true, // 开启分页
178
+ sort: true,
179
+ cols: [
180
+ [ // 表格标题
181
+ { field: 'stuid', title: '学号', width: 130 },
182
+ { field: 'name', title: '姓名', width: 130 },
183
+ { field: 'type', title: '类型', width: 130, sort: true },
184
+ { field: 'room', title: '教室', width: 130 },
185
+ { field: 'time', title: '签到时间', sort: true },
186
+ { field: 'qd', title: '签到情况', sort: true }
187
+ ]
188
+ ],
189
+ done: function (res) {
190
+ if (res.code === 0) {
191
+ // 分页数据符合规范
192
+ } else {
193
+ // 处理错误情况
194
+ layer.msg('查询数据失败');
195
+ }
196
+ },
197
+ sort: function (obj) { // 定义排序的回调
198
+ // 获取当前排序的字段和排序顺序
199
+ var field = obj.field; // 当前排序的字段名
200
+ var order = obj.type; // 当前排序的顺序:asc 升序,desc 降序
201
+
202
+ // 重新加载表格,添加排序参数
203
+ tableIns.reload({
204
+ where: {
205
+ sortField: field, // 排序字段
206
+ sortOrder: order // 排序顺序
207
+ }
208
+ });
209
+ }
210
+ });
211
+
212
+ //绑定查询按钮的点击事件
213
+ // document.getElementById('searchButton').addEventListener('click', function () {
214
+ // var studentId = document.getElementById('studentId').value; // 获取学号输入框的值
215
+
216
+ // // 重新加载表格,包含分页参数
217
+ // tableIns.reload({
218
+ // where: { // 设置查询条件
219
+ // stuid: studentId
220
+ // },
221
+ // page: {
222
+ // curr: 1 // 从第一页开始
223
+ // }
224
+ // });
225
+ // });
226
+
227
+ // 绑定组合查询按钮的点击事件
228
+ document.getElementById('combinedSearchButton').addEventListener('click', function () {
229
+ var studentId = document.getElementById('studentId').value.trim();
230
+ var roomNumber = document.getElementById('roomNumber').value.trim();
231
+
232
+ // 检查输入是否为空
233
+ if (!studentId || !roomNumber) {
234
+ layer.msg('学号或房间号不能为空');
235
+ return;
236
+ }
237
+
238
+ tableIns.reload({
239
+ where: { // 设置查询条件
240
+ stuid: studentId,
241
+ roomNumber: roomNumber
242
+ },
243
+ page: {
244
+ curr: 1 // 从第一页开始
245
+ }
246
+ });
247
+
248
+
249
+ // 构建查询参数
250
+ // var queryParams = new URLSearchParams({
251
+ // stuid: studentId,
252
+ // roomNumber: roomNumber,
253
+ // page: 1,
254
+ // limit: 10,
255
+ // sort: 'time',
256
+ // order: 'desc'
257
+ // }).toString();
258
+
259
+ // // 调用后端API进行组合查询
260
+ // fetch('/api/combinedSearch?' + queryParams, {
261
+ // method: 'GET'
262
+ // })
263
+ // .then(response => response.json())
264
+ // .then(data => {
265
+ // if (data.code === 0) {
266
+ // // 重新渲染表格
267
+ // tableIns.reload({
268
+ // data: data.data
269
+ // });
270
+ // } else {
271
+ // layer.msg('查询失败:' + data.msg);
272
+ // }
273
+ // })
274
+ // .catch(error => {
275
+ // layer.msg('查询出错');
276
+ // console.error('Error:', error);
277
+ // });
278
+ });
279
+ });
280
+ //JS
281
+ layui.use(['element', 'layer', 'util', 'table', 'laydate'], function () {
282
+ var element = layui.element;
283
+ var layer = layui.layer;
284
+ var util = layui.util;
285
+ var table = layui.table;
286
+ var laydate = layui.laydate;
287
+ var $ = layui.$;
288
+ var form = layui.form;
289
+ var returnMessage;
290
+ // var $ = layui.jquery;
291
+ var ctx = document.getElementById('myChart').getContext('2d');
292
+
293
+ laydate.render({
294
+ elem: '#timerange'
295
+ , type: 'datetime'
296
+ , range: true
297
+ , done: function (value, date, endDate) {
298
+ sessionStorage.setItem("timerange", value);
299
+ value = value.split(" - ");
300
+ $.ajax({
301
+ type: 'post',
302
+ url: '/api/timesearch',
303
+ data: {
304
+ bt: value[0],
305
+ et: value[1],
306
+ sign: 1
307
+ },
308
+ success: function (data) {
309
+ top.location.href = '';
310
+ top.location.reload();
311
+ }
312
+ });
313
+ }
314
+ });
315
+
316
+ $(document).on('click', '#chartshow', function () {
317
+ var myChart = new Chart(ctx, {
318
+ type: 'pie',
319
+ data: {
320
+ labels: ['正常', '迟到'],
321
+ datasets: [{
322
+ label: '示例',
323
+ data: [sessionStorage.getItem("normal"), sessionStorage.getItem("late")],
324
+ backgroundColor: ['#58D3F7', '#FA8258'],
325
+ borderWidth: 1
326
+ }]
327
+ }
328
+ })
329
+ $('#normalper').html(((parseInt(sessionStorage.getItem("normal")) / (parseInt(sessionStorage.getItem("normal")) +
330
+ parseInt(sessionStorage.getItem("late")))) * 100).toFixed(2) + '%');
331
+ $('#lateper').html(((parseInt(sessionStorage.getItem("late")) / (parseInt(sessionStorage.getItem("normal")) +
332
+ parseInt(sessionStorage.getItem("late")))) * 100).toFixed(2) + '%');
333
+ layer.open({
334
+ type: 1,
335
+ id: 5,
336
+ title: "迟到情况统计",
337
+ area: ['35%', '50%'],
338
+ content: $("#chart"),
339
+ });
340
+ });
341
+
342
+ //头部事件
343
+ util.event('lay-header-event', {
344
+ menuLeft: function (othis) { // 左侧菜单事件
345
+ layer.msg('展开左侧菜单的操作', { icon: 0 });
346
+ },
347
+ menuRight: function () { // 右侧菜单事件
348
+ layer.open({
349
+ type: 1,
350
+ title: '作者',
351
+ content: '<div style="padding: 15px;">信息工程学院<br />王璐、孙佳雨</div>',
352
+ area: ['150px', '100%'],
353
+ offset: 'rt', // 右上角
354
+ anim: 'slideLeft', // 从右侧抽屉滑出
355
+ shadeClose: true,
356
+ scrollbar: false
357
+ });
358
+ }
359
+ });
360
+
361
+ table.render({
362
+ elem: '#record',
363
+ url: '/api/recordlist',
364
+ toolbar: true,
365
+ title: '签到记录',
366
+ totalRow: true,
367
+ page: true,
368
+ id: 'abc',
369
+ limit: 10,
370
+ limits: [5, 10, 20, 30],
371
+ initSort: {
372
+ field: 'time',
373
+ type: 'desc'
374
+ },
375
+ parseData: function (res) { //res 即为原始返回的数据
376
+ var current_pages;
377
+ if (this.page === true) current_pages = 1;
378
+ else current_pages = this.page.curr;
379
+ var data = res.data.slice(this.limit * (current_pages - 1), this.limit * current_pages);
380
+ return {
381
+ "code": res.code,
382
+ "msg": res.msg,
383
+ "count": res.data.length,
384
+ "data": data
385
+ }
386
+ },
387
+ sort: true,
388
+ cols: [
389
+ [{
390
+ field: 'stuid',
391
+ title: '学号',
392
+ width: 130,
393
+ sort: true
394
+ }, {
395
+ field: 'name',
396
+ title: '姓名',
397
+ width: 130
398
+ }, {
399
+ field: 'type',
400
+ title: '类型',
401
+ width: 130,
402
+ sort: true
403
+ }, {
404
+ field: 'room',
405
+ title: '教室',
406
+ width: 130
407
+ }, {
408
+ field: 'time',
409
+ title: '签到时间',
410
+ sort: true
411
+ }, {
412
+ field: 'qd',
413
+ title: '签到情况',
414
+ sort: true
415
+ }]
416
+ ],
417
+ done: function (res, curr, count) {
418
+ $.ajax({
419
+ type: 'get',
420
+ url: '/api/chartcheck',
421
+ success: function (data) {
422
+ sessionStorage.setItem("late", data.la);
423
+ sessionStorage.setItem("normal", data.no);
424
+ }
425
+ });
426
+ $.each(res.data, function (index, item) {
427
+ if (item.qd == '迟到') {
428
+ $("#record").next().find('tbody tr[data-index="' + index +
429
+ '"]').css("background-color", "#FFA07A");
430
+ }
431
+ });
432
+ }
433
+ });
434
+
435
+
436
+
437
+ });
438
+ </script>
439
+
440
+ </body>
441
+
442
+ </html>