go语言写的人脸本地化程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

305 line
7.9 KiB

  1. package main
  2. import (
  3. "digimetastaffsync/business"
  4. "digimetastaffsync/common"
  5. "digimetastaffsync/mydatabase"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "io"
  9. "log"
  10. "net/http"
  11. "os"
  12. "path/filepath"
  13. "strconv"
  14. "strings"
  15. )
  16. func init() {
  17. setupLogger()
  18. common.SetFlags(log.Ldate | log.Ltime)
  19. common.LoadConfig()
  20. }
  21. func setupLogger() {
  22. logsDir := "logs"
  23. logFileName := "web.log"
  24. logFilePath := filepath.Join(logsDir, logFileName)
  25. // 检查日志文件是否存在
  26. if _, err := os.Stat(logFilePath); os.IsNotExist(err) {
  27. // 不存在则创建新文件
  28. err := os.MkdirAll(logsDir, 0755)
  29. if err != nil {
  30. log.Fatalf("Error creating logs directory: %v", err)
  31. }
  32. // 创建日志文件
  33. file, err := os.Create(logFilePath)
  34. if err != nil {
  35. log.Fatalf("Error creating log file: %v", err)
  36. }
  37. defer file.Close()
  38. // 设置 Gin 默认的写入器
  39. gin.DefaultWriter = io.MultiWriter(file)
  40. } else {
  41. // 存在则打开已有文件
  42. file, err := os.OpenFile(logFilePath, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
  43. if err != nil {
  44. log.Fatalf("Error opening log file: %v", err)
  45. }
  46. defer file.Close()
  47. // 设置 Gin 默认的写入器
  48. gin.DefaultWriter = io.MultiWriter(file)
  49. }
  50. // 设置 Gin 的日志输出
  51. gin.SetMode(gin.ReleaseMode)
  52. }
  53. type Config struct {
  54. Port string `json:"port"`
  55. Phone string `json:"phone"`
  56. Mode string `json:"mode"`
  57. DevId string `json:"devId"`
  58. }
  59. func main() {
  60. router := gin.Default()
  61. router.LoadHTMLGlob("templates/*")
  62. router.GET("/", HomeHandler)
  63. router.GET("/reg", RegPageHandler)
  64. router.GET("/config", ConfigPageHandler)
  65. router.GET("/info", InfoPageHandler)
  66. router.POST("/send_validation_code", SendCodeHandler)
  67. router.POST("/valid_code", ValidCodeHandler)
  68. router.POST("/phone_login", PhoneLoginHandler)
  69. router.POST("/mgr_login", MgrLoginHandler)
  70. router.GET("/mgr", MgrPageHandler)
  71. router.GET("/test", TestHandler)
  72. router.GET("/register", RegisterPageHandler)
  73. router.POST("/register", RegisterHandler)
  74. router.POST("/pass", PassHandler)
  75. router.POST("/updateConfig", UpdateConfigHandler)
  76. common.Info(common.GenLogLine()+"file content:%s", common.ReadFile("di.txt"))
  77. defer mydatabase.GetDb().Close()
  78. port := common.ConfigData.Port
  79. if port == "" {
  80. port = "18080"
  81. log.Printf("Defaulting to port %s", port)
  82. }
  83. // 启动定时任务,用于同步人脸操作
  84. go business.TimerHandle()
  85. log.Printf("Listening on port %s", port)
  86. log.Printf("Open http://localhost:%s in the browser", port)
  87. router.Static("/static", "./static")
  88. router.Run(fmt.Sprintf(":%s", port))
  89. }
  90. // UpdateConfigHandler 更新配置
  91. func UpdateConfigHandler(c *gin.Context) {
  92. var updateValues map[string]interface{}
  93. if err := c.BindJSON(&updateValues); err != nil {
  94. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  95. return
  96. }
  97. str := common.UpdateConfig(updateValues)
  98. if str != "" {
  99. c.JSON(http.StatusInternalServerError, gin.H{"message": str})
  100. return
  101. }
  102. //更新配置文件变量configData
  103. common.LoadConfig()
  104. c.JSON(http.StatusOK, gin.H{"message": "配置更新成功"})
  105. }
  106. func HomeHandler(c *gin.Context) {
  107. t := c.Query("type")
  108. c.HTML(http.StatusOK, "login.html", gin.H{
  109. "type": t,
  110. })
  111. }
  112. func RegPageHandler(c *gin.Context) {
  113. c.HTML(http.StatusOK, "reg.html", nil)
  114. }
  115. func ConfigPageHandler(c *gin.Context) {
  116. c.HTML(http.StatusOK, "conf.html", gin.H{
  117. "config": common.ConfigData,
  118. })
  119. }
  120. func InfoPageHandler(c *gin.Context) {
  121. staffId := c.Query("staffId")
  122. res, err := business.StaffInfo(staffId)
  123. if err != nil {
  124. c.HTML(http.StatusOK, "info.html", gin.H{
  125. "err": err.Error(),
  126. })
  127. }
  128. fmt.Printf("res:%v", res)
  129. c.HTML(http.StatusOK, "info.html", gin.H{
  130. "info": res,
  131. })
  132. }
  133. func PhoneLoginHandler(c *gin.Context) {
  134. phone := c.PostForm("phone")
  135. res, err := business.PhoneLogin(phone)
  136. if err != nil {
  137. c.JSON(http.StatusInternalServerError, err.Error())
  138. }
  139. c.JSON(http.StatusOK, res)
  140. }
  141. func MgrLoginHandler(c *gin.Context) {
  142. phone := c.PostForm("userName")
  143. pwd := c.PostForm("password")
  144. str := business.MgrLogin(phone, pwd)
  145. c.JSON(http.StatusOK, str)
  146. }
  147. func SendCodeHandler(c *gin.Context) {
  148. phone := c.PostForm("phone")
  149. str := business.SendCode(phone)
  150. c.JSON(http.StatusOK, str)
  151. }
  152. func ValidCodeHandler(c *gin.Context) {
  153. phone := c.PostForm("phone")
  154. code := c.PostForm("code")
  155. str, err := business.ValidCode(phone, code)
  156. if err != nil {
  157. c.JSON(http.StatusInternalServerError, err.Error())
  158. }
  159. c.JSON(http.StatusOK, str)
  160. }
  161. // RegisterPageHandler 处理注册页面请求
  162. func RegisterPageHandler(c *gin.Context) {
  163. c.HTML(http.StatusOK, "register.html", map[string]interface{}{"Message": ""})
  164. }
  165. // MgrPageHandler 处理管理页面请求
  166. func MgrPageHandler(c *gin.Context) {
  167. key := c.Query("key")
  168. users, err := mydatabase.Select(key)
  169. if err != nil {
  170. log.Fatal(err)
  171. }
  172. if err != nil {
  173. common.Error("Error marshaling JSON:%s", err)
  174. return
  175. }
  176. c.HTML(http.StatusOK, "mgr.html", gin.H{
  177. "users": users,
  178. "key": key,
  179. })
  180. }
  181. func TestHandler(c *gin.Context) {
  182. fmt.Printf("timer: ====%d\n", common.ConfigData.Timer)
  183. str, err := common.FileToBase64("static/faces/1710208090test.jpg")
  184. if err != nil {
  185. fmt.Printf("error: ====%s\n", err)
  186. }
  187. fmt.Printf("str: ====%s\n", str)
  188. c.JSON(http.StatusOK, "request successfully")
  189. }
  190. // RegisterHandler 处理注册页面请求
  191. func RegisterHandler(c *gin.Context) {
  192. // 从表单中获取用户输入
  193. username := c.PostForm("staffName")
  194. phone := c.PostForm("staffPhone")
  195. avatar := c.PostForm("avatar")
  196. emp, _ := mydatabase.SelectOneByPhone(phone)
  197. fmt.Println(emp)
  198. if emp.ID > 0 {
  199. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "已存在该手机号对应的员工,请查验后重试!"})
  200. return
  201. }
  202. // 在实际应用中,你可能会将用户信息保存到数据库中
  203. avatar = strings.ReplaceAll(avatar, "data:image/jpeg;base64,", "")
  204. features, imgName, err := business.LocalFetchStaffFaceFeature(avatar)
  205. if err != nil {
  206. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": err.Error()})
  207. return
  208. }
  209. mydatabase.Insert(username, 0, phone, imgName, features, 1)
  210. // 将注册成功的消息渲染到页面
  211. message := fmt.Sprintf("Registration successful! %s %s %s %s!", username, phone, imgName, features)
  212. fmt.Println(message)
  213. c.JSON(http.StatusOK, map[string]interface{}{"Message": "注册成功,请等待审核!"})
  214. }
  215. // PassHandler 审核通过或拒绝的处理函数
  216. func PassHandler(c *gin.Context) {
  217. // 从表单中获取用户输入
  218. id := c.PostForm("id")
  219. handleType := c.PostForm("handle")
  220. handleTypeInt, _ := strconv.Atoi(handleType)
  221. if handleTypeInt != 1 && handleTypeInt != 2 && handleTypeInt != 4 {
  222. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "handleType参数错误!"})
  223. return
  224. }
  225. idInt, _ := strconv.Atoi(id)
  226. emp, err := mydatabase.SelectOne(idInt)
  227. if err != nil || !(emp.ID > 0) {
  228. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "指定id未查询到记录"})
  229. return
  230. }
  231. if handleTypeInt == 1 {
  232. emp.Avatar = strings.ReplaceAll(emp.Avatar, "data:image/jpeg;base64,", "")
  233. //将员工信息提交到后台
  234. resp, err := business.HandleStaff(business.EmpToReq(emp))
  235. if err != nil {
  236. c.JSON(http.StatusOK, map[string]interface{}{"Message": err.Error()})
  237. return
  238. }
  239. if resp != nil && resp.Code != 0 {
  240. c.JSON(http.StatusOK, map[string]interface{}{"Message": resp.Msg})
  241. return
  242. }
  243. //更新sqllite里面数据状态
  244. mydatabase.Update(emp.ID, emp.Name, emp.Phone, emp.Avatar, 1, 1)
  245. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功,注册流程结束!"})
  246. } else if handleTypeInt == 2 {
  247. //更新sqllite里面数据状态
  248. mydatabase.SoftDelete(emp.ID)
  249. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功"})
  250. } else if handleTypeInt == 4 {
  251. //删除数据
  252. mydatabase.Delete(emp.ID)
  253. //删除指定路径图片
  254. if emp.Avatar != "" {
  255. os.Remove(emp.Avatar)
  256. }
  257. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功"})
  258. }
  259. }