@@ -1,2 +1,2 @@ | |||
.idea/ | |||
logs/ | |||
logs/* |
@@ -1,8 +1,11 @@ | |||
#!/bin/bash | |||
# 重新构建docker镜像 | |||
sudo docker build -t staff-sync . | |||
sudo docker build -t local-face-app . | |||
sudo mkdir -p /home/digimeta/staff-sync | |||
sudo mkdir -p /home/digimeta/local-face | |||
sudo cp -r ./config.json /home/digimeta/local-face/ | |||
# 运行生成的docker镜像 | |||
sudo docker run --add-host='oa.dfwytech.net:10.1.31.231' -v /home/digimeta/staff-sync/logs:/app/logs -v /home/digimeta/staff-sync/config.json:/app/config.json --restart=always -p 48480:18080 --name staff-sync -d staff-sync | |||
sudo tail -f -n 500 /home/digimeta/logs/web.log | |||
#sudo docker run --add-host='oa.dfwytech.net:10.1.31.231' -v /home/digimeta/local-face/logs:/app/logs -v /home/digimeta/local-face/config.json:/app/config.json --restart=always -p 48484:18080 --name local-face-app -d local-face-app | |||
sudo docker run -v /home/digimeta/local-face/logs:/app/logs -v /home/digimeta/local-face/config.json:/app/config.json --restart=always -p 48484:18080 --name local-face-app -d local-face-app | |||
sudo tail -f -n 500 /home/digimeta/local-face/logs/web.log |
@@ -16,7 +16,6 @@ import ( | |||
"io" | |||
"mime/multipart" | |||
"net/http" | |||
"os" | |||
"sort" | |||
"strconv" | |||
"strings" | |||
@@ -728,7 +727,7 @@ func extractFeature(data interface{}) (string, error) { | |||
} | |||
func LocalFetchStaffFaceFeature(base64 string) (string, string, error) { | |||
url := common.ConfigData.LocalDetectUrl | |||
url := "http://" + common.ConfigData.DevIp + common.ConfigData.LocalDetectUrl | |||
method := "POST" | |||
imgName := "static/faces/" + fmt.Sprintf("%d", time.Now().Unix()) + "test.jpg" | |||
@@ -820,67 +819,70 @@ func TimerHandle() { | |||
now := time.Now() | |||
// 将时间设置为23点59分59秒 | |||
t := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 55, 0, now.Location()) | |||
common.Info(common.GenLogLine() + "--1,执行日志分割 START--") | |||
duration := t.Sub(now) | |||
isWithin10Seconds := duration > 0*time.Second && duration <= time.Duration(timeStep)*time.Second | |||
fmt.Fprintln(os.Stdout, isWithin10Seconds) | |||
common.Info(common.GenLogLine() + "--1,执行日志分割判断 是否开始切割:--" + strconv.FormatBool(isWithin10Seconds)) | |||
if isWithin10Seconds { | |||
common.Info(common.GenLogLine() + "--1.1执行RenameLogFile--") | |||
common.RenameLogFile() | |||
} | |||
common.Info(common.GenLogLine() + "--1,执行日志分割 END--") | |||
common.Info(common.GenLogLine() + "--2,数据同步 START--") | |||
common.Info(common.GenLogLine() + "--1,执行日志分割判断 END--") | |||
//获取接口数据 | |||
staffs := Fetch() | |||
cachedTime := common.GetCache("maxTime") | |||
if common.ConfigData.Sync == 1 { | |||
common.Info(common.GenLogLine() + "--2,数据同步 START--") | |||
if len(staffs) == 0 { | |||
common.Info(common.GenLogLine() + "数据为空") | |||
} else { | |||
//获取最新更新时间 | |||
maxTime := GetNewestModified(staffs) | |||
var t1 time.Time | |||
var t2 time.Time | |||
var t3 time.Time | |||
if cachedTime == "" { | |||
cachedTime = common.ReadFile("di.txt") | |||
common.SetCacheWithExpire("maxTime", cachedTime, 0) | |||
} | |||
t1, _ = time.Parse("2006-01-02 15:04:05", cachedTime) | |||
t2, _ = time.Parse("2006-01-02 15:04:05", maxTime) | |||
if !t2.After(t1) { | |||
common.Info(common.GenLogLine() + "--2.1, 数据已被同步") | |||
//获取接口数据 | |||
staffs := Fetch() | |||
cachedTime := common.GetCache("maxTime") | |||
if len(staffs) == 0 { | |||
common.Info(common.GenLogLine() + "数据为空") | |||
} else { | |||
common.SetCacheWithExpire("maxTime", maxTime, 0) | |||
for _, staff := range staffs { | |||
time.Sleep(1 * time.Second) // 暂停1秒 | |||
t3, _ = time.Parse("2006-01-02 15:04:05", staff.Modified) | |||
if t3.After(t1) { | |||
staff.StaffBase64Img = FetchStaffImage(staff.Code) | |||
common.Info(common.GenLogLine()+"----%v", "" == staff.StaffBase64Img) | |||
str := HandleStaff(staff) | |||
common.Info(common.GenLogLine()+"--2.2注册人员 姓名:%s 编号:%s 更新时间:%s--\n", staff.StaffName, staff.Code, staff.Modified) | |||
//str := RegOnlineStaff(staff) | |||
ss := "" | |||
if str == nil { | |||
ss = "保存成功" | |||
//获取最新更新时间 | |||
maxTime := GetNewestModified(staffs) | |||
var t1 time.Time | |||
var t2 time.Time | |||
var t3 time.Time | |||
if cachedTime == "" { | |||
cachedTime = common.ReadFile("di.txt") | |||
common.SetCacheWithExpire("maxTime", cachedTime, 0) | |||
} | |||
t1, _ = time.Parse("2006-01-02 15:04:05", cachedTime) | |||
t2, _ = time.Parse("2006-01-02 15:04:05", maxTime) | |||
if !t2.After(t1) { | |||
common.Info(common.GenLogLine() + "--2.1, 数据已被同步") | |||
} else { | |||
common.SetCacheWithExpire("maxTime", maxTime, 0) | |||
for _, staff := range staffs { | |||
time.Sleep(1 * time.Second) // 暂停1秒 | |||
t3, _ = time.Parse("2006-01-02 15:04:05", staff.Modified) | |||
if t3.After(t1) { | |||
staff.StaffBase64Img = FetchStaffImage(staff.Code) | |||
common.Info(common.GenLogLine()+"----%v", "" == staff.StaffBase64Img) | |||
str := HandleStaff(staff) | |||
common.Info(common.GenLogLine()+"--2.2注册人员 姓名:%s 编号:%s 更新时间:%s--\n", staff.StaffName, staff.Code, staff.Modified) | |||
//str := RegOnlineStaff(staff) | |||
ss := "" | |||
if str == nil { | |||
ss = "保存成功" | |||
} else { | |||
ss = str.Error() | |||
} | |||
fmt.Printf("注册人员:%v\n", ss) | |||
common.Info(common.GenLogLine()+"--2.3注册人员:%v--\n", ss) | |||
} else { | |||
ss = str.Error() | |||
break | |||
} | |||
fmt.Printf("注册人员:%v\n", ss) | |||
common.Info(common.GenLogLine()+"--2.3注册人员:%v--\n", ss) | |||
} else { | |||
break | |||
} | |||
common.WriteFile("di.txt", maxTime) | |||
common.Info(common.GenLogLine()+"--2.4,数据同步,缓存数据maxID-- :%s", common.GetCache("maxTime")) | |||
} | |||
common.WriteFile("di.txt", maxTime) | |||
common.Info(common.GenLogLine()+"--2.4,数据同步,缓存数据maxID-- :%s", common.GetCache("maxTime")) | |||
} | |||
common.Info(common.GenLogLine() + "--2,数据同步 END--") | |||
} | |||
common.Info(common.GenLogLine() + "--2,数据同步 END--") | |||
common.Info(common.GenLogLine() + "=====执行timerHandle结束=====") | |||
} | |||
} | |||
@@ -21,7 +21,9 @@ type Config struct { | |||
PushDataUrl string `json:"pushDataUrl"` | |||
LocalDetectUrl string `json:"localDetectUrl"` | |||
DevId string `json:"devId"` | |||
DevIp string `json:"devIp"` | |||
Timer int `json:"timer"` | |||
Sync int `json:"sync"` | |||
Mode string `json:"mode"` | |||
} | |||
@@ -54,6 +56,8 @@ func UpdateConfig(updateValues map[string]interface{}) string { | |||
config.Phone = value.(string) | |||
case "devId": | |||
config.DevId = value.(string) | |||
case "devIp": | |||
config.DevIp = value.(string) | |||
case "mode": | |||
config.Mode = value.(string) | |||
case "enterpriseName": | |||
@@ -82,6 +86,8 @@ func UpdateConfig(updateValues map[string]interface{}) string { | |||
config.StaffInfoUrl = value.(string) | |||
case "timer": | |||
config.Timer = int(value.(float64)) | |||
case "sync": | |||
config.Sync = int(value.(float64)) | |||
default: | |||
return "Unknown config key: " + key | |||
} | |||
@@ -1,19 +1,21 @@ | |||
{ | |||
"fetchTokenUrl": "http://127.0.0.1:8080/auth/deviceLogin", | |||
"fetchTokenUrl": "http://172.17.0.1:8080/auth/deviceLogin", | |||
"phone": "18910801519", | |||
"fetchDataUrl": "http://127.0.0.1:8080/system/staff/list", | |||
"fetchDataUrl": "http://172.17.0.1:8080/system/staff/list", | |||
"fetchData2Url": "http://10.1.26.139/api/dizhiyuan/member/DZYAction", | |||
"sendCodeUrl": "http://127.0.0.1:8080/system/sms/api/send-code", | |||
"checkSendCodeUrl": "http://127.0.0.1:8080/system/staff/api/ableLogin", | |||
"phoneLoginUrl": "http://127.0.0.1:8080/auth/phoneLogin", | |||
"mgrLoginUrl": "http://127.0.0.1:8080/auth/mgr-login", | |||
"validCodeUrl": "http://127.0.0.1:8080/system/staff/api/validCode", | |||
"staffInfoUrl": "http://127.0.0.1:8080/system/staff/list", | |||
"sendCodeUrl": "http://172.17.0.1:8080/system/sms/api/send-code", | |||
"checkSendCodeUrl": "http://172.17.0.1:8080/system/staff/api/ableLogin", | |||
"phoneLoginUrl": "http://172.17.0.1:8080/auth/phoneLogin", | |||
"mgrLoginUrl": "http://172.17.0.1:8080/auth/mgr-login", | |||
"validCodeUrl": "http://172.17.0.1:8080/system/staff/api/validCode", | |||
"staffInfoUrl": "http://172.17.0.1:8080/system/staff/list", | |||
"enterpriseName": "演示机", | |||
"port": "18080", | |||
"pushDataUrl": "http://127.0.0.1:8080/system/staff/api/new-staff", | |||
"localDetectUrl": "http://192.168.10.32:8080/face/feature", | |||
"pushDataUrl": "http://172.17.0.1:8080/system/staff/api/new-staff", | |||
"localDetectUrl": "/face/feature", | |||
"devId": "442926c7610ed10b", | |||
"devIp": "192.168.10.32", | |||
"timer": 90, | |||
"sync": 0, | |||
"mode": "online" | |||
} |
@@ -73,6 +73,7 @@ func main() { | |||
router.LoadHTMLGlob("templates/*") | |||
router.GET("/", HomeHandler) | |||
router.GET("/reg", RegPageHandler) | |||
router.GET("/config", ConfigPageHandler) | |||
router.GET("/info", InfoPageHandler) | |||
router.POST("/send_validation_code", SendCodeHandler) | |||
router.POST("/valid_code", ValidCodeHandler) | |||
@@ -83,7 +84,7 @@ func main() { | |||
router.GET("/register", RegisterPageHandler) | |||
router.POST("/register", RegisterHandler) | |||
router.POST("/pass", PassHandler) | |||
router.POST("/update", UpdateConfigHandler) | |||
router.POST("/updateConfig", UpdateConfigHandler) | |||
common.Info(common.GenLogLine()+"file content:%s", common.ReadFile("di.txt")) | |||
@@ -120,7 +121,7 @@ func UpdateConfigHandler(c *gin.Context) { | |||
//更新配置文件变量configData | |||
common.LoadConfig() | |||
c.JSON(http.StatusOK, gin.H{"message": "Config updated successfully"}) | |||
c.JSON(http.StatusOK, gin.H{"message": "配置更新成功"}) | |||
} | |||
func HomeHandler(c *gin.Context) { | |||
@@ -134,6 +135,13 @@ func RegPageHandler(c *gin.Context) { | |||
c.HTML(http.StatusOK, "reg.html", nil) | |||
} | |||
func ConfigPageHandler(c *gin.Context) { | |||
c.HTML(http.StatusOK, "conf.html", gin.H{ | |||
"config": common.ConfigData, | |||
}) | |||
} | |||
func InfoPageHandler(c *gin.Context) { | |||
staffId := c.Query("staffId") | |||
res, err := business.StaffInfo(staffId) | |||
@@ -0,0 +1,193 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||
<title>配置页面</title> | |||
<style> | |||
body{ | |||
margin: 0; | |||
} | |||
li { | |||
list-style-type: none; | |||
} | |||
@media screen and (orientation: portrait) { | |||
.login { | |||
width: 100vw; | |||
height: 100vh; | |||
background-image: url("/static/img/phoneBgc.jpg"); | |||
background-size: 100% 100%; | |||
background-repeat: no-repeat; | |||
} | |||
.register { | |||
background-image: url("/static/img/registerBgc.jpg") !important; | |||
padding-top: 15vh; | |||
} | |||
.enterprise-name, .devId, .devIp, .sync { | |||
width: 50vw; | |||
height: 5vh; | |||
border-radius: 2vw; | |||
background-color: transparent; | |||
font-size: 3vw; | |||
padding-left: 2vw; | |||
border: 1px solid #000; | |||
margin-bottom: 2vh; | |||
} | |||
.register_inputBox { | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
align-items: center; | |||
margin-top: 5vh; | |||
position: relative; | |||
} | |||
.register_loginButton { | |||
width: 40vw; | |||
height: 5vh; | |||
background-color: rgb(101, 161, 255); | |||
border-radius: 10vw; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
color:#fff; | |||
font-size: 4vw; | |||
margin: 2vh 0 0 30vw; | |||
} | |||
#div-a-login{ | |||
margin-top: 3vh; | |||
text-align: center; | |||
} | |||
} | |||
@media screen and (orientation: landscape) { | |||
input:focus { | |||
border: 0.1vw solid #000; | |||
outline: none; /* 可选,用于去除默认的外边框样式 */ | |||
} | |||
.login { | |||
width: 100vw; | |||
height: 100vh; | |||
background-image: url("/static/img/phoneBgc_pc.jpg"); | |||
background-size: 100% 100%; | |||
background-repeat: no-repeat; | |||
position: relative; | |||
} | |||
.register { | |||
background-image: url("/static/img/registerBgc_pc.jpg") !important; | |||
} | |||
.register_inputBox { | |||
width: 100vw; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
align-items: center; | |||
position: relative; | |||
padding-top: 42vh; | |||
} | |||
.enterprise-name, .devId, .devIp,.sync { | |||
width: 37vh; | |||
height: 6vh; | |||
border-radius: 2vh; | |||
background-color: transparent; | |||
font-size: 3vh; | |||
border: 0.1vw solid #000; | |||
padding-left: 1vw ; | |||
margin-bottom: 2vh; | |||
} | |||
.register_loginButton { | |||
width: 8vw; | |||
height: 2vw; | |||
background-color: rgb(101, 161, 255); | |||
border-radius: 1vw; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
color: #fff; | |||
font-size: 3vh; | |||
position: absolute; | |||
left: 46vw; | |||
top: 65vh; | |||
} | |||
.hand:hover{ | |||
cursor: pointer; | |||
} | |||
#div-a-login{ | |||
margin-top: 10vh; | |||
text-align: center; | |||
font-size: 3vh; | |||
} | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<!-- 注册页面 --> | |||
<div class="register login"> | |||
<div class="register_inputBox"> | |||
<input class="enterprise-name" name="enterpriseName" value="{{.config.EnterpriseName}}" type="text" placeholder="租户名"> | |||
<input class="devId" name="devId" type="text" value="{{.config.DevId}}" placeholder="对应数字人设备号"> | |||
<input class="devIp" name="devIp" value="{{.config.DevIp}}" type="text" placeholder="数字人ip"> | |||
<select class="sync" name="sync" > | |||
<option value="1" {{if eq .config.Sync 1}}selected{{end}}>同步</option> | |||
<option value="0" {{if eq .config.Sync 0}}selected{{end}}>不同步</option> | |||
</select> | |||
</div> | |||
<div class="register_loginButton hand">保存配置</div> | |||
<div id="div-a-login"><a id="a-login" href="/">去登录</a></div> | |||
</div> | |||
<script src="/static/js/jquery.min.js"></script> | |||
<script src="/static/js/msg-box.js"></script> | |||
<script> | |||
$(function(){ | |||
$(".register_loginButton").on("click",function() { | |||
var enterpriseName = $(".enterprise-name").val(); | |||
var devId = $(".devId").val(); | |||
var devIp = $(".devIp").val(); | |||
//ip4正则字符串 | |||
const regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; | |||
if (devIp !== "" && !regex.test(devIp)){ | |||
$.MsgBox.Alert("提示", "ip填写错误,请检查"); | |||
return; | |||
} | |||
var settings = { | |||
"url": "/updateConfig", | |||
"method": "POST", | |||
"timeout": 0, | |||
"headers": { | |||
"Content-Type": "application/json" | |||
}, | |||
"data": JSON.stringify({ | |||
"devIp": devIp, | |||
"devId": devId, | |||
"enterpriseName": enterpriseName, | |||
"sync": Number($(".sync").val()) | |||
}), | |||
}; | |||
$.ajax(settings).done(function (response) { | |||
$.MsgBox.AlertWithCallback( "提示",response.message, function(){ | |||
window.location.reload() | |||
}) | |||
}); | |||
}) | |||
}) | |||
</script> | |||
</body> | |||
</html> |
@@ -136,6 +136,10 @@ | |||
top: 18vw; | |||
right: 26vw; | |||
} | |||
#div-a-reg{ | |||
margin-top: 3vh; | |||
text-align: center; | |||
} | |||
} | |||
@media screen and (orientation: landscape) { | |||
input:focus { | |||
@@ -328,6 +332,21 @@ | |||
cursor: pointer; | |||
} | |||
#div-a-reg{ | |||
width: 16vw; | |||
height: 3vw; | |||
background-color:transparent; | |||
border-radius: 10vh; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
color: #fff; | |||
font-size: 2vh; | |||
position: absolute; | |||
left: 55vw; | |||
top: 72vh; | |||
} | |||
} | |||
button:disabled { | |||
color: black !important; | |||
@@ -361,6 +380,8 @@ | |||
</div> | |||
</div> | |||
<div class="login_button hand">登 录</div> | |||
<div id="div-a-reg"><a id="a-reg" href="/reg">去注册</a></div> | |||
</div> | |||
<script src="/static/js/jquery.min.js"></script> | |||
<script src="/static/js/msg-box.js"></script> | |||
@@ -289,7 +289,6 @@ | |||
<script src="/static/js/jquery.min.js"></script> | |||
<script src="/static/js/msg-box.js"></script> | |||
<script> | |||
console.log("9999999"); | |||
var token= sessionStorage.getItem('token'); | |||
console.log(token) | |||
if (!token){ | |||
@@ -102,6 +102,10 @@ | |||
left: 27vw !important; | |||
position: relative; | |||
} | |||
#div-a-login{ | |||
margin-top: 3vh; | |||
text-align: center; | |||
} | |||
} | |||
@media screen and (orientation: landscape) { | |||
input:focus { | |||
@@ -216,6 +220,11 @@ | |||
position: relative; | |||
} | |||
#div-a-login{ | |||
margin-top: 10vh; | |||
text-align: center; | |||
font-size: 3vh; | |||
} | |||
} | |||
@@ -297,23 +306,12 @@ | |||
<input class="register_phoneInput" name="staffPhone" type="text" placeholder="员工手机号"> | |||
</div> | |||
<div class="register_loginButton hand">注册人脸</div> | |||
<div id="div-a-login"><a id="a-login" href="/">去登录</a></div> | |||
</div> | |||
<script src="/static/js/jquery.min.js"></script> | |||
<script src="/static/js/msg-box.js"></script> | |||
<script> | |||
$(function(){ | |||
$.MsgBox = { | |||
Alert: function(title, msg) { | |||
GenerateHtml("alert", title, msg); | |||
btnOk(); //alert只是弹出消息,因此没必要用到回调函数callback | |||
btnNo(); | |||
}, | |||
Confirm: function(title, msg, callback) { | |||
GenerateHtml("confirm", title, msg); | |||
btnOk(callback); | |||
btnNo(); | |||
} | |||
} | |||
$(".register_loginButton").on("click",function() { | |||