Parcourir la source

添加配置页面,整理配置

main
yk il y a 1 an
Parent
révision
82a5aa4222
11 fichiers modifiés avec 309 ajouts et 77 suppressions
  1. +1
    -1
      .gitignore
  2. +7
    -4
      build_and_run.sh
  3. +49
    -47
      business/staff.go
  4. +6
    -0
      common/config.go
  5. +12
    -10
      config.json
  6. +10
    -2
      main.go
  7. BIN
      staffs.db
  8. +193
    -0
      templates/conf.html
  9. +21
    -0
      templates/login.html
  10. +0
    -1
      templates/mgr.html
  11. +10
    -12
      templates/reg.html

+ 1
- 1
.gitignore Voir le fichier

@@ -1,2 +1,2 @@
.idea/ .idea/
logs/
logs/*

+ 7
- 4
build_and_run.sh Voir le fichier

@@ -1,8 +1,11 @@
#!/bin/bash #!/bin/bash
# 重新构建docker镜像 # 重新构建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镜像 # 运行生成的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

+ 49
- 47
business/staff.go Voir le fichier

@@ -16,7 +16,6 @@ import (
"io" "io"
"mime/multipart" "mime/multipart"
"net/http" "net/http"
"os"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
@@ -728,7 +727,7 @@ func extractFeature(data interface{}) (string, error) {
} }


func LocalFetchStaffFaceFeature(base64 string) (string, string, error) { func LocalFetchStaffFaceFeature(base64 string) (string, string, error) {
url := common.ConfigData.LocalDetectUrl
url := "http://" + common.ConfigData.DevIp + common.ConfigData.LocalDetectUrl
method := "POST" method := "POST"


imgName := "static/faces/" + fmt.Sprintf("%d", time.Now().Unix()) + "test.jpg" imgName := "static/faces/" + fmt.Sprintf("%d", time.Now().Unix()) + "test.jpg"
@@ -820,67 +819,70 @@ func TimerHandle() {
now := time.Now() now := time.Now()
// 将时间设置为23点59分59秒 // 将时间设置为23点59分59秒
t := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 55, 0, now.Location()) 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) duration := t.Sub(now)
isWithin10Seconds := duration > 0*time.Second && duration <= time.Duration(timeStep)*time.Second 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 { if isWithin10Seconds {
common.Info(common.GenLogLine() + "--1.1执行RenameLogFile--") common.Info(common.GenLogLine() + "--1.1执行RenameLogFile--")
common.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 { } 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 { } 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结束=====") common.Info(common.GenLogLine() + "=====执行timerHandle结束=====")
} }
} }


+ 6
- 0
common/config.go Voir le fichier

@@ -21,7 +21,9 @@ type Config struct {
PushDataUrl string `json:"pushDataUrl"` PushDataUrl string `json:"pushDataUrl"`
LocalDetectUrl string `json:"localDetectUrl"` LocalDetectUrl string `json:"localDetectUrl"`
DevId string `json:"devId"` DevId string `json:"devId"`
DevIp string `json:"devIp"`
Timer int `json:"timer"` Timer int `json:"timer"`
Sync int `json:"sync"`
Mode string `json:"mode"` Mode string `json:"mode"`
} }


@@ -54,6 +56,8 @@ func UpdateConfig(updateValues map[string]interface{}) string {
config.Phone = value.(string) config.Phone = value.(string)
case "devId": case "devId":
config.DevId = value.(string) config.DevId = value.(string)
case "devIp":
config.DevIp = value.(string)
case "mode": case "mode":
config.Mode = value.(string) config.Mode = value.(string)
case "enterpriseName": case "enterpriseName":
@@ -82,6 +86,8 @@ func UpdateConfig(updateValues map[string]interface{}) string {
config.StaffInfoUrl = value.(string) config.StaffInfoUrl = value.(string)
case "timer": case "timer":
config.Timer = int(value.(float64)) config.Timer = int(value.(float64))
case "sync":
config.Sync = int(value.(float64))
default: default:
return "Unknown config key: " + key return "Unknown config key: " + key
} }


+ 12
- 10
config.json Voir le fichier

@@ -1,19 +1,21 @@
{ {
"fetchTokenUrl": "http://127.0.0.1:8080/auth/deviceLogin",
"fetchTokenUrl": "http://172.17.0.1:8080/auth/deviceLogin",
"phone": "18910801519", "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", "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": "演示机", "enterpriseName": "演示机",
"port": "18080", "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", "devId": "442926c7610ed10b",
"devIp": "192.168.10.32",
"timer": 90, "timer": 90,
"sync": 0,
"mode": "online" "mode": "online"
} }

+ 10
- 2
main.go Voir le fichier

@@ -73,6 +73,7 @@ func main() {
router.LoadHTMLGlob("templates/*") router.LoadHTMLGlob("templates/*")
router.GET("/", HomeHandler) router.GET("/", HomeHandler)
router.GET("/reg", RegPageHandler) router.GET("/reg", RegPageHandler)
router.GET("/config", ConfigPageHandler)
router.GET("/info", InfoPageHandler) router.GET("/info", InfoPageHandler)
router.POST("/send_validation_code", SendCodeHandler) router.POST("/send_validation_code", SendCodeHandler)
router.POST("/valid_code", ValidCodeHandler) router.POST("/valid_code", ValidCodeHandler)
@@ -83,7 +84,7 @@ func main() {
router.GET("/register", RegisterPageHandler) router.GET("/register", RegisterPageHandler)
router.POST("/register", RegisterHandler) router.POST("/register", RegisterHandler)
router.POST("/pass", PassHandler) router.POST("/pass", PassHandler)
router.POST("/update", UpdateConfigHandler)
router.POST("/updateConfig", UpdateConfigHandler)


common.Info(common.GenLogLine()+"file content:%s", common.ReadFile("di.txt")) common.Info(common.GenLogLine()+"file content:%s", common.ReadFile("di.txt"))


@@ -120,7 +121,7 @@ func UpdateConfigHandler(c *gin.Context) {
//更新配置文件变量configData //更新配置文件变量configData
common.LoadConfig() common.LoadConfig()


c.JSON(http.StatusOK, gin.H{"message": "Config updated successfully"})
c.JSON(http.StatusOK, gin.H{"message": "配置更新成功"})
} }


func HomeHandler(c *gin.Context) { func HomeHandler(c *gin.Context) {
@@ -134,6 +135,13 @@ func RegPageHandler(c *gin.Context) {
c.HTML(http.StatusOK, "reg.html", nil) 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) { func InfoPageHandler(c *gin.Context) {
staffId := c.Query("staffId") staffId := c.Query("staffId")
res, err := business.StaffInfo(staffId) res, err := business.StaffInfo(staffId)


BIN
staffs.db Voir le fichier


+ 193
- 0
templates/conf.html Voir le fichier

@@ -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>

+ 21
- 0
templates/login.html Voir le fichier

@@ -136,6 +136,10 @@
top: 18vw; top: 18vw;
right: 26vw; right: 26vw;
} }
#div-a-reg{
margin-top: 3vh;
text-align: center;
}
} }
@media screen and (orientation: landscape) { @media screen and (orientation: landscape) {
input:focus { input:focus {
@@ -328,6 +332,21 @@
cursor: pointer; 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 { button:disabled {
color: black !important; color: black !important;
@@ -361,6 +380,8 @@
</div> </div>
</div> </div>
<div class="login_button hand">登 录</div> <div class="login_button hand">登 录</div>

<div id="div-a-reg"><a id="a-reg" href="/reg">去注册</a></div>
</div> </div>
<script src="/static/js/jquery.min.js"></script> <script src="/static/js/jquery.min.js"></script>
<script src="/static/js/msg-box.js"></script> <script src="/static/js/msg-box.js"></script>


+ 0
- 1
templates/mgr.html Voir le fichier

@@ -289,7 +289,6 @@
<script src="/static/js/jquery.min.js"></script> <script src="/static/js/jquery.min.js"></script>
<script src="/static/js/msg-box.js"></script> <script src="/static/js/msg-box.js"></script>
<script> <script>
console.log("9999999");
var token= sessionStorage.getItem('token'); var token= sessionStorage.getItem('token');
console.log(token) console.log(token)
if (!token){ if (!token){


+ 10
- 12
templates/reg.html Voir le fichier

@@ -102,6 +102,10 @@
left: 27vw !important; left: 27vw !important;
position: relative; position: relative;
} }
#div-a-login{
margin-top: 3vh;
text-align: center;
}
} }
@media screen and (orientation: landscape) { @media screen and (orientation: landscape) {
input:focus { input:focus {
@@ -216,6 +220,11 @@
position: relative; 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="员工手机号"> <input class="register_phoneInput" name="staffPhone" type="text" placeholder="员工手机号">
</div> </div>
<div class="register_loginButton hand">注册人脸</div> <div class="register_loginButton hand">注册人脸</div>
<div id="div-a-login"><a id="a-login" href="/">去登录</a></div>
</div> </div>
<script src="/static/js/jquery.min.js"></script> <script src="/static/js/jquery.min.js"></script>
<script src="/static/js/msg-box.js"></script> <script src="/static/js/msg-box.js"></script>
<script> <script>
$(function(){ $(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() { $(".register_loginButton").on("click",function() {




Chargement…
Annuler
Enregistrer