refactor(数据库): 移除clock_records表中的distance_meters字段并更新相关查询
移除不再使用的distance_meters字段,简化数据库结构 更新前端展示失败的打卡记录样式和添加notes列显示 删除不再需要的SSL证书文件
This commit is contained in:
@@ -1,23 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID1zCCAr+gAwIBAgIUBR7JyWNONICsFp/nQvPR29Z5PBAwDQYJKoZIhvcNAQEL
|
||||
BQAwezELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM
|
||||
DVNhbi1GcmFuY2lzY28xEzARBgNVBAoMCk15LUNvbXBhbnkxFjAUBgNVBAsMDU15
|
||||
LURlcGFydG1lbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yNTA2MjYwMjAyMjFa
|
||||
Fw0yNjA2MjYwMjAyMjFaMHsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9y
|
||||
bmlhMRYwFAYDVQQHDA1TYW4tRnJhbmNpc2NvMRMwEQYDVQQKDApNeS1Db21wYW55
|
||||
MRYwFAYDVQQLDA1NeS1EZXBhcnRtZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEi
|
||||
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCRiQgTu/x1V9NTVf4zJ7PQgTO
|
||||
ivda/SNi4HdSoiiyzDfXtyeXXfQwuHR+nGtqr+iideuDtEubig5Zru4gRY1oKGcn
|
||||
mnUdjSpjIaH655gjyCV+tuYC774Fdn4sFZiPAe5ExAwOEgOHsrgGeuLYIIIXX/0J
|
||||
FW2mQWOB0wHzxftNgKC1WoutZ4uNq15nC/W7BfpyR7pUkOVAb0oCNdKsIB4NDq9/
|
||||
is6MW/ZrLTZtsTAP0/f76BKqpM36eeUApvGe4RDQYNGxMVp2SO5oemjOyIz2qXZp
|
||||
SZsSilDhJWqytxd8G3KbdGoZYBmdtuv+Tu48aZMiImpp1+zNDJGiZlzYqd2ZAgMB
|
||||
AAGjUzBRMB0GA1UdDgQWBBQtH8QZY8Ew389MUw+cBocOb4pCfTAfBgNVHSMEGDAW
|
||||
gBQtH8QZY8Ew389MUw+cBocOb4pCfTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
|
||||
DQEBCwUAA4IBAQBwVkWIfqpxAPyEoDQY7XMZrZQ7C6N7VDb5sMFoutTItmlbZOto
|
||||
U08x5HfTfSuqUA2jK0FYhWLFea2njsa8ycffFGbf1YzOTY8956ufSOQrLtzJsZ74
|
||||
aIOr+VffhcdU1HQ3ncp6XY/XySK/C0tyZlJUvw5SIllMQog1jA8B4EX3LSGd0V3Q
|
||||
Hu2FI3G/+iNDk2w4PF9iKFk2p//1Wq+xOjhrxmjyTxKa4w6mM/hwhUBz4nbd5HYo
|
||||
/TyjW7TjAGRYYXOw+NLwoVyLzaSVRVEppGmxFHbuicxfbdHbQAzdhUU7Z2rEp2qA
|
||||
FilIQHQH3kKnifEtfG8zwfAu1rN7c02gdpu3
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,28 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCRiQgTu/x1V9N
|
||||
TVf4zJ7PQgTOivda/SNi4HdSoiiyzDfXtyeXXfQwuHR+nGtqr+iideuDtEubig5Z
|
||||
ru4gRY1oKGcnmnUdjSpjIaH655gjyCV+tuYC774Fdn4sFZiPAe5ExAwOEgOHsrgG
|
||||
euLYIIIXX/0JFW2mQWOB0wHzxftNgKC1WoutZ4uNq15nC/W7BfpyR7pUkOVAb0oC
|
||||
NdKsIB4NDq9/is6MW/ZrLTZtsTAP0/f76BKqpM36eeUApvGe4RDQYNGxMVp2SO5o
|
||||
emjOyIz2qXZpSZsSilDhJWqytxd8G3KbdGoZYBmdtuv+Tu48aZMiImpp1+zNDJGi
|
||||
ZlzYqd2ZAgMBAAECggEAJrZJ4BtCsnahezqoh0Yk9ilSYmLsJ9gt6zfN5ywzfm91
|
||||
yDkxvTamYGf9JLagK/36Fhd30wKEF24i7mmOf2VEqIb2iTx8zmLxGZhb2e640RaC
|
||||
rDWfb2HdBGMogLnb8NFCbLcBLPOXevyYsYfeuJD/w08oEZ2QwDKi9L16k9w1d6uK
|
||||
+aebcVggNWOAlDeOtJCn1nqy0TnLl8VSlM42SZKIgFdkXrHWKpfrr+GX1ckj70No
|
||||
/kEHOnMzyT4s0YKvIE114Wm5oIvjACVGO09JJVeolYY/1/y7waMgZmpCD3vp14wF
|
||||
1pZGLQsH4SA7EGv2hRKSENpmuxULdH+tI5A7TvbMtQKBgQD0ec6Jb4TuoKmRftDp
|
||||
GNTeke6x9vyZyyQF+9Z2ZeFwA8k0Agg0r6BWwjX0xNjNv97T8RX2qj26q9EpquEl
|
||||
Uql5y7pTrKaDtGGnI7en5gz3ZhmO4fwxM2TyRHzePXCzbAFvHdq48iI8IPQDLfaj
|
||||
mD/sMBtE24I0W+r4c4lXj7PDJQKBgQDLbocXZjFE0y0OE+sIFVFfU9fD0gOGiQpu
|
||||
i83bCorqEB1sqzIaq3bMDMdVMj9v+Pt2biiIx2JF4QuFC8B2nksFzUjc4Ya567xU
|
||||
qSHqwQfhYqe+g7VpjP4EEefQFCSN/pHFODuqh/Qnl+FBiKvIH8Cx9XlJyFgrjLcG
|
||||
L3+DGlBgZQKBgQCgEMRejaqOhpifT1W+2Gg/VXLgCGM42p06Ybn4CRqCOahZqd7v
|
||||
h/HF/CBRozSD+dUOFTIZLzt9ZhNrYZtJ0YZu3SmgsVDQuKCbSzJq9p+Ut7+SInn5
|
||||
SLoWOSs8YyPQBa4mr3hOURKDJdw93LE4SW3I2XJxMftdBrWgeBz7PHYpFQKBgGhC
|
||||
eVHwugeAA3NXmflGk7G7krV1iQEGcyY82IAOYyuanrn283Lftb7WPcLYQdLtVFNa
|
||||
GcQgC6mssO67GySv89tBXrp1i0r2Gkt5czyROay1lyr47Zzu+bC0TI5EBIgRlDvz
|
||||
mgDINMWl/XhMx12FiIisOkEqQKXxNEwjQ8K5VcBRAoGANpRsF9FaMdObg7vLS0iI
|
||||
AKyr8qYVbiXzxKudxBM2DspBo9Ot5Mr68zEQPxd73ErK5WTnf0U7VCG1+/Ikq46H
|
||||
5IallJBUegQaGyPOETRQDakzQNQrvcjh1knqBjBj5mvEjDZnvxa3pg+IC+4IvSGm
|
||||
7WaDkfSnenvCVQ3tx+XQUaw=
|
||||
-----END PRIVATE KEY-----
|
||||
+4
-5
@@ -41,7 +41,6 @@ async function startServer() {
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// --- FIX START ---
|
||||
// Define the geofence polygon by calling the 'polygon' function directly
|
||||
const geofence = polygon([
|
||||
[
|
||||
@@ -55,7 +54,7 @@ async function startServer() {
|
||||
[101.80827335908509, 2.8350045747358337],
|
||||
],
|
||||
])
|
||||
// --- FIX END ---
|
||||
|
||||
|
||||
app.use(cors())
|
||||
app.use(express.json())
|
||||
@@ -128,8 +127,8 @@ async function startServer() {
|
||||
|
||||
// Insert the failed attempt into the database
|
||||
await db.execute(
|
||||
'INSERT INTO clock_records (worker_id, event_type, timestamp, qr_code_id, latitude, longitude, notes, distance_meters) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
[userId, 'failed', new Date(), qrCodeValue, latitude, longitude, notes, distance]
|
||||
'INSERT INTO clock_records (worker_id, event_type, timestamp, qr_code_id, latitude, longitude, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
[userId, 'failed', new Date(), qrCodeValue, latitude, longitude, notes]
|
||||
);
|
||||
|
||||
// Return an error to the user
|
||||
@@ -577,7 +576,7 @@ async function startServer() {
|
||||
const placeholders = idsArray.map(() => '?').join(',')
|
||||
|
||||
// MODIFIED: Use LEFT JOIN and COALESCE to handle manual entries, and select `notes`
|
||||
let query = `SELECT cr.id, w.full_name, cr.event_type, cr.timestamp, COALESCE(qc.name, 'Manual Entry') as qrCodeUsedName, cr.latitude, cr.longitude, cr.notes, cr.distance_meters FROM clock_records cr LEFT JOIN qr_codes qc ON cr.qr_code_id = qc.id JOIN workers w ON cr.worker_id = w.id WHERE cr.worker_id IN (${placeholders})`;
|
||||
let query = `SELECT cr.id, w.full_name, cr.event_type, cr.timestamp, COALESCE(qc.name, 'Manual Entry') as qrCodeUsedName, cr.latitude, cr.longitude, cr.notes FROM clock_records cr LEFT JOIN qr_codes qc ON cr.qr_code_id = qc.id JOIN workers w ON cr.worker_id = w.id WHERE cr.worker_id IN (${placeholders})`;
|
||||
|
||||
const params = [...idsArray]
|
||||
if (startDate && endDate) {
|
||||
|
||||
@@ -19,7 +19,6 @@ CREATE TABLE `clock_records` (
|
||||
`longitude` decimal(11,8) DEFAULT NULL,
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`notes` text,
|
||||
`distance_meters` decimal(10,2) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `worker_id` (`worker_id`),
|
||||
KEY `qr_code_id` (`qr_code_id`)
|
||||
|
||||
@@ -337,6 +337,11 @@
|
||||
>
|
||||
Location
|
||||
</th>
|
||||
<th
|
||||
class="px-4 py-3 text-sm font-semibold text-gray-600 dark:text-gray-300 uppercase tracking-wider"
|
||||
>
|
||||
Notes
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 dark:divide-gray-700">
|
||||
@@ -351,6 +356,7 @@
|
||||
:class="{
|
||||
'bg-green-500': record.event_type === 'clock_in',
|
||||
'bg-red-500': record.event_type === 'clock_out',
|
||||
'bg-yellow-500': record.event_type === 'failed',
|
||||
}"
|
||||
>
|
||||
{{ record.event_type.replace('_', ' ') }}
|
||||
@@ -362,6 +368,7 @@
|
||||
<td class="px-4 py-3 text-gray-800 dark:text-white">
|
||||
{{ record.qrCodeUsedName }}
|
||||
</td>
|
||||
<td class="px-4 py-3 text-gray-800 dark:text-white">{{ record.notes || 'N/A' }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user