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