From cd40c6f6f3a6138cb70b2e2d017cc7f34a887ef8 Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期五, 17 四月 2026 13:59:49 +0800
Subject: [PATCH] 1.更新vf107代码,更新自动上报通行记录接口、人员查询接口、人员添加接口

---
 vf107/src/service/api.js |  456 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 403 insertions(+), 53 deletions(-)

diff --git a/vf107/src/service/api.js b/vf107/src/service/api.js
index 65e7be6..c75cb20 100644
--- a/vf107/src/service/api.js
+++ b/vf107/src/service/api.js
@@ -202,7 +202,12 @@
     if (data.type == 0) {
         try {
             driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgrading" })
-            ota.updateHttp(data.url, data.md5,  100)
+            // 纭繚URL鍖呭惈鍗忚鍓嶇紑
+            let url = data.url
+            if (!url.startsWith('http://') && !url.startsWith('https://')) {
+                url = 'http://' + url
+            }
+            ota.updateHttp(url, data.md5,  300)
             driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgradeSuccess" })
         } catch (error) {
             driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgradeFail" })
@@ -315,7 +320,18 @@
                 let person = sqliteService.d1_person.findByUserId(record.userId)
                 if (person.length) {
                     record.name = person[0].name
-                    record.extra = person[0].extra
+                    // 灏唀xtra瀛楁浠嶫SON瀛楃涓茶В鏋愪负JSON瀵硅薄
+                    if (person[0].extra && typeof person[0].extra === 'string') {
+                        try {
+                            record.extra = JSON.parse(person[0].extra)
+                        } catch (error) {
+                            // 濡傛灉瑙f瀽澶辫触锛屼繚鎸佸師鏍�
+                            console.error('瑙f瀽extra瀛楁澶辫触:', error)
+                            record.extra = person[0].extra
+                        }
+                    } else {
+                        record.extra = person[0].extra
+                    }
                 }
             }
         })
@@ -396,6 +412,7 @@
             userId: person.userId || 'unknown',
             errmsg: ''
         }
+        // 澧炲己鏁版嵁楠岃瘉
         if (!person.userId || !person.name) {
             errorItem.errmsg = "userId or name cannot be empty"
             errors.push(errorItem)
@@ -406,11 +423,15 @@
             errors.push(errorItem)
             continue
         }
+        
+        // 鏋勫缓浜哄憳璁板綍
         let record = {}
         record.userId = person.userId
         record.name = person.name
         record.extra = isEmpty(person.extra) ? JSON.stringify({}) : JSON.stringify(person.extra)
         record.permissionIds = person.permissionIds ? person.permissionIds.join(",") : ""
+        
+        // 淇濆瓨浜哄憳淇℃伅
         let ret = sqliteService.d1_person.save(record)
         if (ret != 0) {
             sqliteService.d1_person.deleteByUserId(record.userId)
@@ -420,6 +441,197 @@
                 errors.push(errorItem)
                 continue
             }
+        }
+        
+        // 澶勭悊浜鸿劯淇℃伅
+        if (person.face) {
+            try {
+                logger.info('[api] 寮�濮嬪鐞嗕汉鑴镐俊鎭�:', person.userId)
+                
+                let faceFilePath = person.face
+                
+                // 妫�鏌ユ槸鍚︽槸base64缂栫爜鐨勫浘鐗囨暟鎹�
+                if (person.face.startsWith('data:image/')) {
+                    logger.info('[api] 妫�娴嬪埌base64缂栫爜鐨勫浘鐗囨暟鎹�')
+                    // 鎻愬彇base64鏁版嵁
+                    let base64Data = person.face.split(',')[1]
+                    // 鍒涘缓涓存椂鏂囦欢
+                    faceFilePath = '/data/user/temp_face_' + person.userId + '.jpg'
+                    std.ensurePathExists(faceFilePath)
+                    // 灏哹ase64鏁版嵁杞崲涓烘枃浠�
+                    dxCommonUtils.fs.base64ToFile(faceFilePath, base64Data)
+                    logger.info('[api] 宸插皢base64鏁版嵁淇濆瓨涓烘枃浠�:', faceFilePath)
+                } else {
+                    errorItem.errmsg = "鏁版嵁鏍煎紡閿欒锛宖ace瀛楁蹇呴』鏄痓ase64缂栫爜鐨勫浘鐗囨暟鎹�"
+                    errors.push(errorItem)
+                    continue
+                }
+                
+                // 娉ㄥ唽浜鸿劯
+                logger.info('[api] 寮�濮嬫敞鍐屼汉鑴�:', person.userId)
+                let featureFile = driver.face.getFeaByFile(faceFilePath)
+                let addFeaRes = driver.face.addFea(person.userId, featureFile.feature)
+                
+                if (addFeaRes == 0) {
+                    // 娉ㄥ唽鎴愬姛鍚庣Щ鍔ㄥ浘鐗囧埌鐢ㄦ埛鐩綍
+                    let src = "/data/user/" + person.userId + "/register.jpg"
+                    std.ensurePathExists(src)
+                    logger.info('[api] 绉诲姩浜鸿劯鍥剧墖鍒扮敤鎴风洰褰�:', faceFilePath, '->', src)
+                    dxos.systemBrief('mv ' + faceFilePath + " " + src)
+                    
+                    // 淇濆瓨浜鸿劯鍑瘉
+                    logger.info('[api] 淇濆瓨浜鸿劯鍑瘉:', person.userId)
+                    let voucherRet = sqliteService.d1_voucher.save({
+                        keyId: std.genRandomStr(32),
+                        type: "300",
+                        code: src,
+                        userId: person.userId,
+                        extra: JSON.stringify({ faceType: 0 })
+                    });
+                    logger.info('[api] 淇濆瓨浜鸿劯鍑瘉缁撴灉:', voucherRet)
+                } else {
+                    logger.error('[api] 娉ㄥ唽浜鸿劯澶辫触锛岃繑鍥炵爜:', addFeaRes)
+                    errorItem.errmsg = "娉ㄥ唽浜鸿劯澶辫触锛岃繑鍥炵爜:" + addFeaRes
+                    errors.push(errorItem)
+                    continue
+                }
+            } catch (error) {
+                logger.error('[api] 澶勭悊浜鸿劯淇℃伅閿欒:', error)
+                errorItem.errmsg = "澶勭悊浜鸿劯淇℃伅閿欒: " + error.message
+                errors.push(errorItem)
+                continue
+            } finally {
+                logger.info('[api] 浜鸿劯淇℃伅澶勭悊瀹屾垚:', person.userId)
+            }
+        }
+        
+        // 澶勭悊鎸囩汗淇℃伅
+        if (person.fingerprint) {
+            try {
+                logger.info('[api] 寮�濮嬪鐞嗘寚绾逛俊鎭�:', person.userId)
+                
+                // 妫�鏌ヤ箣鍓嶆槸鍚︽湁鎸囩汗鍑瘉
+                let oldVoucher = sqliteService.d1_voucher.findByuserIdAndType(person.userId, "500");
+                if (oldVoucher.length > 0) {
+                    logger.info('[api] 鍒犻櫎鏃ф寚绾瑰嚟璇�:', JSON.stringify(oldVoucher[0]))
+                    try {
+                        let ret = driver.finger.delete(parseInt(oldVoucher[0].code))
+                        if (ret != 0) {
+                            errorItem.errmsg = "finger delete error ret:" + ret
+                            errors.push(errorItem)
+                            continue
+                        }
+                    } catch (error) {
+                        logger.error('[api] 鍒犻櫎鏃ф寚绾瑰け璐�:', error)
+                    }
+                }
+                
+                // 褰曞叆鏂版寚绾�
+                logger.info('[api] 褰曞叆鏂版寚绾�:', person.userId)
+                let index = driver.finger.insert(person.fingerprint)
+                if(index < 0){
+                    errorItem.errmsg = "insertKey finger insert error ret:" + index
+                    errors.push(errorItem)
+                    continue
+                }
+                
+                // 淇濆瓨鎸囩汗鍑瘉
+                logger.info('[api] 淇濆瓨鎸囩汗鍑瘉:', person.userId)
+                let voucherRet = sqliteService.d1_voucher.save({
+                    keyId: std.genRandomStr(32),
+                    type: "500",
+                    code: index.toString(),
+                    userId: person.userId,
+                    extra: JSON.stringify({ type: 0 })
+                });
+                logger.info('[api] 淇濆瓨鎸囩汗鍑瘉缁撴灉:', voucherRet)
+                logger.info('[api] 鎸囩汗淇℃伅澶勭悊瀹屾垚:', person.userId)
+            } catch (error) {
+                logger.error('[api] 澶勭悊鎸囩汗淇℃伅閿欒:', error)
+                errorItem.errmsg = "澶勭悊鎸囩汗淇℃伅閿欒: " + error.message
+                errors.push(errorItem)
+                continue
+            }
+        }
+        
+        // 澶勭悊NFC鍗′俊鎭�
+        if (person.nfcCard) {
+            try {
+                logger.info('[api] 寮�濮嬪鐞哊FC鍗′俊鎭�:', person.userId)
+                
+                // 妫�鏌FC鍗℃槸鍚﹂噸澶�
+                let existingVoucher = sqliteService.d1_voucher.findByCodeAndType(person.nfcCard, "200")
+                if (existingVoucher.length > 0 && existingVoucher[0].userId != person.userId) {
+                    errorItem.errmsg = "NFC鍗″凡琚叾浠栫敤鎴蜂娇鐢�"
+                    errors.push(errorItem)
+                    continue
+                }
+                
+                // 淇濆瓨NFC鍗″嚟璇�
+                logger.info('[api] 淇濆瓨NFC鍗″嚟璇�:', person.userId)
+                let voucherRet = sqliteService.d1_voucher.save({
+                    keyId: std.genRandomStr(32),
+                    type: "200",
+                    code: person.nfcCard.toUpperCase(),
+                    userId: person.userId,
+                    extra: JSON.stringify({ type: 0 })
+                });
+                logger.info('[api] 淇濆瓨NFC鍗″嚟璇佺粨鏋�:', voucherRet)
+                logger.info('[api] NFC鍗′俊鎭鐞嗗畬鎴�:', person.userId)
+            } catch (error) {
+                logger.error('[api] 澶勭悊NFC鍗′俊鎭敊璇�:', error)
+                errorItem.errmsg = "澶勭悊NFC鍗′俊鎭敊璇�: " + error.message
+                errors.push(errorItem)
+                continue
+            }
+        }
+        
+        // 涓虹敤鎴锋坊鍔犳潈闄�
+        try {
+            // 鑾峰彇鐢ㄦ埛绫诲瀷
+            let userType = 0
+            if (person.extra) {
+                try {
+                    userType = person.extra.type || 0
+                } catch (error) {
+                    logger.error('[api] 瑙f瀽鐢ㄦ埛绫诲瀷澶辫触:', error)
+                }
+            }
+            
+            // 鍙湁淇濈鍛橈紙0锛夊拰绉戦暱锛�1锛夐渶瑕佹坊鍔犳潈闄�
+            if (userType == 0 || userType == 1) {
+                // 妫�鏌ユ槸鍚﹀凡瀛樺湪鏉冮檺璁板綍
+                let existingPermissions = sqliteService.d1_permission.findByUserId(person.userId)
+                if (existingPermissions && existingPermissions.length == 0) {
+                    // 娣诲姞姘镐箙鏉冮檺
+                    let permissionId = std.genRandomStr(32)
+                    let permissionRet = sqliteService.d1_permission.save({
+                        permissionId: permissionId,
+                        userId: person.userId,
+                        door: "", // 绌哄瓧绗︿覆琛ㄧず鎵�鏈夐棬
+                        timeType: 0, // 姘镐箙鏉冮檺
+                        beginTime: 0,
+                        endTime: 0,
+                        period: ""
+                    });
+                    logger.info('[api] 涓虹敤鎴锋坊鍔犳潈闄愮粨鏋�:', permissionRet)
+                    
+                    // 鏇存柊浜哄憳琛ㄤ腑鐨刾ermissionIds瀛楁
+                    if (permissionRet == 0) {
+                        // 鏋勫缓鏇存柊璁板綍
+                        let updateRecord = { permissionIds: permissionId }
+                        // 浣跨敤updateAllByUserId鏂规硶鏇存柊
+                        let updateRet = sqliteService.d1_person.updateAllByUserId(updateRecord, person.userId)
+                        logger.info('[api] 鏇存柊浜哄憳鏉冮檺ID缁撴灉:', updateRet)
+                    }
+                } else {
+                    logger.info('[api] 鐢ㄦ埛宸插瓨鍦ㄦ潈闄愯褰曪紝璺宠繃鏉冮檺娣诲姞:', person.userId)
+                }
+            } else {
+                logger.info('[api] 鐢ㄦ埛绫诲瀷涓嶉渶瑕佹坊鍔犳潈闄愶紝璺宠繃鏉冮檺娣诲姞:', person.userId)
+            }
+        } catch (error) {
+            logger.error('[api] 娣诲姞鏉冮檺鏃跺嚭閿�:', error)
         }
     }
     if (errors.length > 0) {
@@ -438,6 +650,14 @@
                 userId: userId || 'unknown',
                 errmsg: ''
             }
+            try {
+                // 鍒犻櫎浜鸿劯鏁版嵁
+                driver.face.deleteFea(userId)
+                logger.info('[api] 鍒犻櫎浜鸿劯鏁版嵁鎴愬姛:', userId)
+            } catch (error) {
+                logger.error(`Failed to delete face feature for user ${userId}:`, error)
+            }
+            
             // 鍒犻櫎鎸囩汗鍑瘉涔嬪墠闇�瑕佸厛鍒犻櫎鎸囩汗搴撲腑鐨勬寚绾�
             let fingerVoucher = sqliteService.d1_voucher.findByuserIdAndType(userId, "500")
             if (fingerVoucher.length > 0) {
@@ -448,19 +668,18 @@
                     errors.push(errorItem)
                     continue
                 }
+                logger.info('[api] 鍒犻櫎鎸囩汗鏁版嵁鎴愬姛:', userId)
             }
+            
             let ret1 = sqliteService.d1_person.deleteByUserId(userId)
             let ret3 = sqliteService.d1_voucher.deleteByUserId(userId)
-            if (ret1 != 0 || ret3 != 0) {
-                errorItem.errmsg = `sql error: person(${ret1}), voucher(${ret3})`
+            let ret4 = sqliteService.d1_permission.deleteByUserId(userId)
+            if (ret1 != 0 || ret3 != 0 || ret4 != 0) {
+                errorItem.errmsg = `sql error: person(${ret1}), voucher(${ret3}), permission(${ret4})`
                 errors.push(errorItem)
                 continue
             }
-            try {
-                driver.face.deleteFea(userId)
-            } catch (error) {
-                logger.error(`Failed to delete face feature for user ${userId}:`, error)
-            }
+            logger.info('[api] 鍒犻櫎浜哄憳鎴愬姛:', userId)
         }
     }
     if (errors.length > 0) {
@@ -479,6 +698,19 @@
     }
     let totalCount = sqliteService.d1_person.count(data)
     let persons = sqliteService.d1_person.findAll(data)
+    
+    // 灏唀xtra瀛楁浠嶫SON瀛楃涓茶В鏋愪负JSON瀵硅薄
+    persons.forEach(person => {
+        if (person.extra && typeof person.extra === 'string') {
+            try {
+                person.extra = JSON.parse(person.extra)
+            } catch (error) {
+                // 濡傛灉瑙f瀽澶辫触锛屼繚鎸佸師鏍�
+                console.error('瑙f瀽extra瀛楁澶辫触:', error)
+            }
+        }
+    })
+    
     return {
         content: persons,
         page: data.page,
@@ -573,10 +805,18 @@
         if (voucher.type == "200" || voucher.type == "201" || voucher.type == "202") {
             voucher.code = voucher.code.toUpperCase()
         }
-        if (voucher.type == "300" && voucher.extra.faceType != 0 && voucher.extra.faceType != 1) {
-            errorItem.errmsg = "faceType Incorrect format"
-            errors.push(errorItem)
-            continue
+        if (voucher.type == "300") {
+            if (voucher.extra) {
+                if (voucher.extra.faceType != 0 && voucher.extra.faceType != 1) {
+                    errorItem.errmsg = "faceType Incorrect format"
+                    errors.push(errorItem)
+                    continue
+                }
+            } else {
+                errorItem.errmsg = "faceType is required"
+                errors.push(errorItem)
+                continue
+            }
         }
         if (voucher.type == "400") {
             if (voucher.code.length != 6) {
@@ -585,17 +825,6 @@
                 continue
             }
         }
-        // // 鍒ゆ柇鎸囩汗鍑瘉鏄惁閲嶅锛屽鏋滄病鏈夐噸澶嶅氨褰曞叆鎸囩汗
-        // if (voucher.type == "500") {
-        //     voucher.code = parseInt(voucher.code)
-        //     let index = driver.finger.insert(voucher.code)
-        //     if(index < 0){
-        //         errorItem.errmsg = "finger insert error ret:" + index
-        //         errors.push(errorItem)
-        //         continue
-        //     }
-        //     voucher.code = index
-        // }
         let record = {}
         record.keyId = voucher.keyId
         record.type = voucher.type
@@ -755,8 +984,17 @@
     let totalCount = sqliteService.d1_voucher.count(data)
     let vouchers = sqliteService.d1_voucher.findAll(data)
     vouchers.forEach(element => {
-        if (element.type == 300 && element.extra && JSON.parse(element.extra).faceType == 0) {
-            //浜鸿劯鐗规畩澶勭悊涓�涓�
+        // 灏唀xtra瀛楁浠嶫SON瀛楃涓茶В鏋愪负JSON瀵硅薄
+        if (element.extra && typeof element.extra === 'string') {
+            try {
+                element.extra = JSON.parse(element.extra)
+            } catch (error) {
+                // 濡傛灉瑙f瀽澶辫触锛屼繚鎸佸師鏍�
+                console.error('瑙f瀽extra瀛楁澶辫触:', error)
+            }
+        }
+        // 浜鸿劯鐗规畩澶勭悊涓�涓�
+        if (element.type == 300 && element.extra && element.extra.faceType == 0) {
             element.code = dxCommonUtils.fs.fileToBase64(element.code)
         }
     });
@@ -1217,7 +1455,7 @@
     return true
 }
 
-//娓呯┖鏉冮檺
+// 娓呯┖鏉冮檺
 api.clearPermission = function () {
     let ret = sqliteService.d1_permission.deleteAll()
     if (ret == 0) {
@@ -1225,28 +1463,6 @@
     } else {
         return "sql error "
     }
-}
-
-// 鍒ょ┖
-function isEmpty(value) {
-    return value === undefined || value === null || value === ""
-}
-
-// 婵�娲讳簯璇�
-api.eidActive = function (data) {
-    if (data.code && data.code.startsWith("___VBAR_ID_ACTIVE_V")) {
-        try {
-            let activeResute = driver.nfc.eidActive(data.code);
-            if (activeResute != 0) {
-                return 'Activation failed'
-            }
-        } catch (error) {
-            return error.message
-        }
-    } else {
-        return 'The key format is incorrect'
-    }
-    return true
 }
 
 // 鏂板瀵嗛挜
@@ -1299,9 +1515,9 @@
 // 鍒犻櫎瀵嗛挜
 api.delSecurity = function (data) {
     let errors = []
-    if (data.length > 0) {
-        for (let i = 0; i < data.length; i++) {
-            const securityId = data[i];
+    if (data.securityIds && data.securityIds.length > 0) {
+        for (let i = 0; i < data.securityIds.length; i++) {
+            const securityId = data.securityIds[i];
             let errorItem = {
                 securityId: securityId || 'unknown',
                 errmsg: ''
@@ -1326,8 +1542,142 @@
     if (ret == 0) {
         return true
     } else {
-        return "sql error "
+        return "sql error ret:" + ret
     }
 }
 
+// 娣诲姞搴旀�ュ紑浠撳瘑鐮�
+api.insertEmergencyPassword = function (data) {
+    // 搴旀�ュ紑浠撳瘑鐮佸湪璁惧涓粎鏈夊敮涓�鐨�1涓紝鎵�浠ュ厛娓呯┖琛�
+    let deleteRet = sqliteService.d1_emergency_password.deleteAll()
+    if (deleteRet != 0) {
+        return "娓呯┖鏃у瘑鐮佸け璐�: " + deleteRet
+    }
+    
+    // 妫�鏌ュ瘑鐮佹槸鍚︽湁鏁�
+    if (!data.password) {
+        return "password cannot be empty"
+    }
+    
+    // 妫�鏌ュ瘑鐮侀暱搴︽槸鍚﹀ぇ浜庣瓑浜�8浣�
+    if (data.password.length < 8) {
+        return "Password length must be at least 8 digits"
+    }
+    
+    // 鏋勫缓瀵嗙爜璁板綍
+    let record = {}
+    record.id = data.id || 'emergency_' + Date.now() // 濡傛灉娌℃湁id锛岃嚜鍔ㄧ敓鎴�
+    record.password = data.password
+    record.description = data.description || "浜戠涓嬪彂" // 濡傛灉娌℃湁浼犲叆description锛岄粯璁や负"浜戠涓嬪彂"锛圡QTT鍜孒TTP鎺ュ彛璁剧疆鐨勬儏鍐碉級
+    record.createTime = Date.now()
+    record.updateTime = Date.now()
+    record.status = data.status || 1
+    
+    // 淇濆瓨瀵嗙爜
+    let ret = sqliteService.d1_emergency_password.save(record)
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+// 娓呯┖瀵嗛挜
+api.clearSecurity = function () {
+    let ret = sqliteService.d1_security.deleteAll()
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+// 娣诲姞搴旀�ュ紑浠撳瘑鐮�
+api.insertEmergencyPassword = function (data) {
+    // 搴旀�ュ紑浠撳瘑鐮佸湪璁惧涓粎鏈夊敮涓�鐨�1涓紝鎵�浠ュ厛娓呯┖琛�
+    let deleteRet = sqliteService.d1_emergency_password.deleteAll()
+    if (deleteRet != 0) {
+        return "娓呯┖鏃у瘑鐮佸け璐�: " + deleteRet
+    }
+    
+    // 妫�鏌ュ瘑鐮佹槸鍚︽湁鏁�
+    if (!data.password) {
+        return "password cannot be empty"
+    }
+    
+    // 妫�鏌ュ瘑鐮侀暱搴︽槸鍚﹀ぇ浜庣瓑浜�8浣�
+    if (data.password.length < 8) {
+        return "Password length must be at least 8 digits"
+    }
+    
+    // 鏋勫缓瀵嗙爜璁板綍
+    let record = {}
+    record.id = data.id || 'emergency_' + Date.now() // 濡傛灉娌℃湁id锛岃嚜鍔ㄧ敓鎴�
+    record.password = data.password
+    record.description = data.description || "浜戠涓嬪彂" // 濡傛灉娌℃湁浼犲叆description锛岄粯璁や负"浜戠涓嬪彂"锛圡QTT鍜孒TTP鎺ュ彛璁剧疆鐨勬儏鍐碉級
+    record.createTime = Date.now()
+    record.updateTime = Date.now()
+    record.status = data.status || 1
+    
+    // 淇濆瓨瀵嗙爜
+    let ret = sqliteService.d1_emergency_password.save(record)
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+// 鏌ヨ搴旀�ュ紑浠撳瘑鐮�
+api.getEmergencyPassword = function () {
+    let passwords = sqliteService.d1_emergency_password.findAll()
+    if (passwords && passwords.length > 0) {
+        let password = passwords[0];
+        // 杞崲鏃堕棿鎴充负瀛楃涓叉牸寮�
+        if (password.createTime) {
+            // 灏濊瘯灏哻reateTime杞崲涓烘暟瀛�
+            const createTimeNum = Number(password.createTime);
+            if (!isNaN(createTimeNum)) {
+                password.createTime = timestampToDateString(createTimeNum);
+            }
+        }
+        if (password.updateTime) {
+            // 灏濊瘯灏唘pdateTime杞崲涓烘暟瀛�
+            const updateTimeNum = Number(password.updateTime);
+            if (!isNaN(updateTimeNum)) {
+                password.updateTime = timestampToDateString(updateTimeNum);
+            }
+        }
+        return password;
+    }
+    return {};
+}
+
+// 娓呯┖搴旀�ュ紑浠撳瘑鐮�
+api.clearEmergencyPassword = function () {
+    let ret = sqliteService.d1_emergency_password.deleteAll()
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+// 鏃堕棿鎴宠浆鏃ユ湡瀛楃涓�
+function timestampToDateString(timestamp) {
+    const date = new Date(timestamp);
+    const year = date.getFullYear();
+    const month = String(date.getMonth() + 1).padStart(2, '0');
+    const day = String(date.getDate()).padStart(2, '0');
+    const hours = String(date.getHours()).padStart(2, '0');
+    const minutes = String(date.getMinutes()).padStart(2, '0');
+    const seconds = String(date.getSeconds()).padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}
+
+// 鍒ょ┖
+function isEmpty(value) {
+    return value === undefined || value === null || value === ""
+}
+
 export default api
\ No newline at end of file

--
Gitblit v1.9.3