go语言写的人脸本地化程序
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 

292 linhas
7.6 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("/info", InfoPageHandler)
  65. router.POST("/send_validation_code", SendCodeHandler)
  66. router.POST("/valid_code", ValidCodeHandler)
  67. router.POST("/phone_login", PhoneLoginHandler)
  68. router.POST("/mgr_login", MgrLoginHandler)
  69. router.GET("/mgr", MgrPageHandler)
  70. router.GET("/test", TestHandler)
  71. router.GET("/register", RegisterPageHandler)
  72. router.POST("/register", RegisterHandler)
  73. router.POST("/pass", PassHandler)
  74. router.POST("/update", UpdateConfigHandler)
  75. common.Info(common.GenLogLine()+"file content:%s", common.ReadFile("di.txt"))
  76. defer mydatabase.GetDb().Close()
  77. port := common.ConfigData.Port
  78. if port == "" {
  79. port = "18080"
  80. log.Printf("Defaulting to port %s", port)
  81. }
  82. // 启动定时任务,用于同步人脸操作
  83. go business.TimerHandle()
  84. log.Printf("Listening on port %s", port)
  85. log.Printf("Open http://localhost:%s in the browser", port)
  86. router.Static("/static", "./static")
  87. router.Run(fmt.Sprintf(":%s", port))
  88. }
  89. // UpdateConfigHandler 更新配置
  90. func UpdateConfigHandler(c *gin.Context) {
  91. var updateValues map[string]interface{}
  92. if err := c.BindJSON(&updateValues); err != nil {
  93. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  94. return
  95. }
  96. str := common.UpdateConfig(updateValues)
  97. if str != "" {
  98. c.JSON(http.StatusInternalServerError, gin.H{"message": str})
  99. return
  100. }
  101. //更新配置文件变量configData
  102. common.LoadConfig()
  103. c.JSON(http.StatusOK, gin.H{"message": "Config updated successfully"})
  104. }
  105. func HomeHandler(c *gin.Context) {
  106. t := c.Query("type")
  107. c.HTML(http.StatusOK, "login.html", gin.H{
  108. "type": t,
  109. })
  110. }
  111. func RegPageHandler(c *gin.Context) {
  112. c.HTML(http.StatusOK, "reg.html", nil)
  113. }
  114. func InfoPageHandler(c *gin.Context) {
  115. staffId := c.Query("staffId")
  116. res, err := business.StaffInfo(staffId)
  117. if err != nil {
  118. c.HTML(http.StatusOK, "info.html", gin.H{
  119. "err": err.Error(),
  120. })
  121. }
  122. fmt.Printf("res:%v", res)
  123. c.HTML(http.StatusOK, "info.html", gin.H{
  124. "info": res,
  125. })
  126. }
  127. func PhoneLoginHandler(c *gin.Context) {
  128. phone := c.PostForm("phone")
  129. res, err := business.PhoneLogin(phone)
  130. if err != nil {
  131. c.JSON(http.StatusInternalServerError, err.Error())
  132. }
  133. c.JSON(http.StatusOK, res)
  134. }
  135. func MgrLoginHandler(c *gin.Context) {
  136. phone := c.PostForm("userName")
  137. pwd := c.PostForm("password")
  138. str := business.MgrLogin(phone, pwd)
  139. c.JSON(http.StatusOK, str)
  140. }
  141. func SendCodeHandler(c *gin.Context) {
  142. phone := c.PostForm("phone")
  143. str := business.SendCode(phone)
  144. c.JSON(http.StatusOK, str)
  145. }
  146. func ValidCodeHandler(c *gin.Context) {
  147. phone := c.PostForm("phone")
  148. code := c.PostForm("code")
  149. str, err := business.ValidCode(phone, code)
  150. if err != nil {
  151. c.JSON(http.StatusInternalServerError, err.Error())
  152. }
  153. c.JSON(http.StatusOK, str)
  154. }
  155. // RegisterPageHandler 处理注册页面请求
  156. func RegisterPageHandler(c *gin.Context) {
  157. c.HTML(http.StatusOK, "register.html", map[string]interface{}{"Message": ""})
  158. }
  159. // MgrPageHandler 处理管理页面请求
  160. func MgrPageHandler(c *gin.Context) {
  161. key := c.Query("key")
  162. users, err := mydatabase.Select(key)
  163. if err != nil {
  164. log.Fatal(err)
  165. }
  166. if err != nil {
  167. common.Error("Error marshaling JSON:%s", err)
  168. return
  169. }
  170. c.HTML(http.StatusOK, "mgr.html", gin.H{
  171. "users": users,
  172. "key": key,
  173. })
  174. }
  175. func TestHandler(c *gin.Context) {
  176. fmt.Printf("timer: ====%d\n", common.ConfigData.Timer)
  177. c.JSON(http.StatusOK, "request successfully")
  178. }
  179. // RegisterHandler 处理注册页面请求
  180. func RegisterHandler(c *gin.Context) {
  181. // 从表单中获取用户输入
  182. username := c.PostForm("staffName")
  183. phone := c.PostForm("staffPhone")
  184. avatar := c.PostForm("avatar")
  185. emp, _ := mydatabase.SelectOneByPhone(phone)
  186. fmt.Println("====phone:" + phone)
  187. fmt.Println(emp)
  188. if emp.ID > 0 {
  189. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "已存在该手机号对应的员工,请查验后重试!"})
  190. return
  191. }
  192. // 在实际应用中,你可能会将用户信息保存到数据库中
  193. avatar = strings.ReplaceAll(avatar, "data:image/jpeg;base64,", "")
  194. features, imgName, err := business.LocalFetchStaffFaceFeature(avatar)
  195. if err != nil {
  196. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": err.Error()})
  197. return
  198. }
  199. mydatabase.Insert(username, 0, phone, imgName, features, 1)
  200. // 将注册成功的消息渲染到页面
  201. message := fmt.Sprintf("Registration successful! %s %s %s %s!", username, phone, imgName, features)
  202. fmt.Println(message)
  203. c.JSON(http.StatusOK, map[string]interface{}{"Message": "注册成功,请等待审核!"})
  204. }
  205. // PassHandler 审核通过或拒绝的处理函数
  206. func PassHandler(c *gin.Context) {
  207. // 从表单中获取用户输入
  208. id := c.PostForm("id")
  209. handleType := c.PostForm("handle")
  210. handleTypeInt, _ := strconv.Atoi(handleType)
  211. if handleTypeInt != 1 && handleTypeInt != 2 && handleTypeInt != 4 {
  212. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "handleType参数错误!"})
  213. return
  214. }
  215. idInt, _ := strconv.Atoi(id)
  216. emp, err := mydatabase.SelectOne(idInt)
  217. if err != nil || !(emp.ID > 0) {
  218. c.JSON(http.StatusInternalServerError, map[string]interface{}{"Message": "指定id未查询到记录"})
  219. return
  220. }
  221. if handleTypeInt == 1 {
  222. emp.Avatar = strings.ReplaceAll(emp.Avatar, "data:image/jpeg;base64,", "")
  223. //将员工信息提交到后台
  224. resp, err := business.RegStaff(business.EmpToReq(emp))
  225. if err != nil {
  226. c.JSON(http.StatusOK, map[string]interface{}{"Message": err.Error()})
  227. return
  228. }
  229. if resp != nil && resp.Code != 0 {
  230. c.JSON(http.StatusOK, map[string]interface{}{"Message": resp.Msg})
  231. return
  232. }
  233. //更新sqllite里面数据状态
  234. mydatabase.Update(emp.ID, emp.Name, emp.Phone, emp.Avatar, 1, 1)
  235. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功,注册流程结束!"})
  236. } else if handleTypeInt == 2 {
  237. //更新sqllite里面数据状态
  238. mydatabase.SoftDelete(emp.ID)
  239. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功"})
  240. } else if handleTypeInt == 4 {
  241. //删除数据
  242. mydatabase.Delete(emp.ID)
  243. //删除指定路径图片
  244. if emp.Avatar != "" {
  245. os.Remove(emp.Avatar)
  246. }
  247. c.JSON(http.StatusOK, map[string]interface{}{"Message": "操作成功"})
  248. }
  249. }