rfid_app.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package rfidProgram
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "github.com/flipped-aurora/gin-vue-admin/server/global"
  7. "github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
  8. "github.com/flipped-aurora/gin-vue-admin/server/model/rfidProgram"
  9. "github.com/flipped-aurora/gin-vue-admin/server/model/rfidProgram/request"
  10. "github.com/gin-gonic/gin"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. type RfidAppApi struct{}
  16. // CORS 中间件
  17. func corsMiddleware() gin.HandlerFunc {
  18. return func(c *gin.Context) {
  19. c.Writer.Header().Set("Access-Control-Allow-Origin", "http://dev-rfid.7in6.com:23609")
  20. c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
  21. c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Token")
  22. if c.Request.Method == "OPTIONS" {
  23. c.AbortWithStatus(200)
  24. return
  25. }
  26. c.Next()
  27. }
  28. }
  29. // 登录请求结构体
  30. type LoginRequest struct {
  31. Username string `json:"username" binding:"required"`
  32. Password string `json:"password" binding:"required"`
  33. }
  34. // 登录响应
  35. type LoginResponse struct {
  36. UserInfo UserInfo `json:"user_info"`
  37. Token string `json:"token"`
  38. TokenExpireTime time.Time `json:"token_expire_time"`
  39. }
  40. // 用户信息响应
  41. type UserInfo struct {
  42. ID int32 `json:"id"`
  43. Username string `json:"username"`
  44. Nickname string `json:"nickname"`
  45. Building string `json:"building"`
  46. Room string `json:"room"`
  47. Pen string `json:"pen"`
  48. }
  49. // 用户登录
  50. func (rfidAppApi *RfidAppApi) Login(c *gin.Context) {
  51. var req LoginRequest
  52. if err := c.ShouldBindJSON(&req); err != nil {
  53. response.FailWithMessage("参数错误", c)
  54. return
  55. }
  56. // 计算密码 MD5
  57. hash := md5.Sum([]byte(req.Password))
  58. passwordHash := hex.EncodeToString(hash[:])
  59. // 查询用户
  60. var user rfidProgram.RfidUser
  61. result := global.GVA_DB.Where("username = ? AND password = ?", req.Username, passwordHash).First(&user)
  62. if result.Error != nil {
  63. response.FailWithMessage("用户名或密码错误", c)
  64. return
  65. }
  66. // 获取当前时间和今天结束时间
  67. now := time.Now()
  68. todayEnd := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
  69. // 判断 token 是否有效
  70. var token string
  71. if user.Token != "" && user.TokenExpireTime.After(now) {
  72. token = user.Token
  73. } else {
  74. // 生成新 token
  75. token = generateToken(user.Username)
  76. // 更新用户 token
  77. user.Token = token
  78. user.TokenExpireTime = &todayEnd
  79. user.SysRq = &now
  80. global.GVA_DB.Save(&user)
  81. }
  82. // 构造返回数据
  83. userInfo := UserInfo{
  84. ID: *user.Id,
  85. Username: user.Username,
  86. Nickname: user.Nickname,
  87. Building: user.Building,
  88. Room: user.Room,
  89. Pen: user.Pen,
  90. }
  91. loginRes := LoginResponse{
  92. UserInfo: userInfo,
  93. Token: token,
  94. TokenExpireTime: todayEnd,
  95. }
  96. response.OkWithDetailed(loginRes, "登录成功", c)
  97. }
  98. // 生成 token
  99. func generateToken(username string) string {
  100. timestamp := time.Now().Unix()
  101. uniquePart := fmt.Sprintf("%d%d", timestamp, time.Now().UnixNano())
  102. data := fmt.Sprintf("%s%s%s", username, uniquePart, "randomSalt")
  103. hash := md5.Sum([]byte(data))
  104. return hex.EncodeToString(hash[:])
  105. }
  106. // 保存用户设置
  107. func (rfidAppApi *RfidAppApi) PostUserSetup(c *gin.Context) {
  108. var req rfidProgram.RfidUserEditInfo
  109. if err := c.ShouldBindJSON(&req); err != nil {
  110. response.FailWithMessage("参数错误", c)
  111. return
  112. }
  113. // 更新用户信息
  114. result := global.GVA_DB.Model(&rfidProgram.RfidUser{}).Where("id = ?", req.Id).Updates(map[string]interface{}{
  115. "building": req.Building,
  116. "room": req.Room,
  117. "pen": req.Pen,
  118. })
  119. if result.Error != nil {
  120. response.FailWithMessage("保存失败", c)
  121. return
  122. }
  123. response.OkWithMessage("保存成功", c)
  124. }
  125. // 获取用户信息
  126. func (rfidAppApi *RfidAppApi) UserList(c *gin.Context) {
  127. userID := c.Query("userid")
  128. if userID == "" {
  129. response.FailWithMessage("用户ID不能为空", c)
  130. return
  131. }
  132. // 转换用户ID为整数
  133. id, err := strconv.Atoi(userID)
  134. if err != nil {
  135. response.FailWithMessage("用户ID格式错误", c)
  136. return
  137. }
  138. var user rfidProgram.RfidUser
  139. result := global.GVA_DB.Select("nickname", "username", "id", "token", "token_expire_time", "building", "room", "pen").
  140. Where("id = ?", id).First(&user)
  141. if result.Error != nil {
  142. response.FailWithMessage("用户不存在", c)
  143. return
  144. }
  145. response.OkWithMessage("获取用户数据信息", c)
  146. }
  147. // 获取栋舍编号
  148. func (rfidAppApi *RfidAppApi) GetBuilding(c *gin.Context) {
  149. var buildings []rfidProgram.RfidBuilding
  150. result := global.GVA_DB.Find(&buildings)
  151. if result.Error != nil {
  152. response.FailWithMessage("获取栋舍编号失败", c)
  153. return
  154. }
  155. response.OkWithDetailed(buildings, "栋舍编号", c)
  156. }
  157. // 获取房间编号
  158. func (rfidAppApi *RfidAppApi) GetRoom(c *gin.Context) {
  159. var rooms []rfidProgram.RfidRoom
  160. result := global.GVA_DB.Find(&rooms)
  161. if result.Error != nil {
  162. response.FailWithMessage("获取房间编号失败", c)
  163. return
  164. }
  165. response.OkWithDetailed(rooms, "栋舍编号", c)
  166. }
  167. // 获取栏位编号
  168. func (rfidAppApi *RfidAppApi) GetPen(c *gin.Context) {
  169. var pens []rfidProgram.RfidPen
  170. result := global.GVA_DB.Find(&pens)
  171. if result.Error != nil {
  172. response.FailWithMessage("获取栏位编号失败", c)
  173. return
  174. }
  175. response.OkWithDetailed(pens, "栋舍编号", c)
  176. }
  177. // 提交 RFID 记录
  178. func (rfidAppApi *RfidAppApi) PostListAdd(c *gin.Context) {
  179. var req request.RfidRecordRequest
  180. if err := c.ShouldBindJSON(&req); err != nil {
  181. response.FailWithMessage("参数错误", c)
  182. return
  183. }
  184. // 解析 RFID 数据
  185. rfidPairs := strings.Split(req.Rfid, ",")
  186. if len(rfidPairs) == 0 {
  187. response.FailWithMessage("RFID数据不能为空", c)
  188. return
  189. }
  190. var validRecords []rfidProgram.RfidRecords
  191. now := time.Now()
  192. for _, pair := range rfidPairs {
  193. pair = strings.TrimSpace(pair)
  194. if pair == "" {
  195. continue
  196. }
  197. parts := strings.SplitN(pair, ":", 2)
  198. if len(parts) < 2 {
  199. continue
  200. }
  201. rfid := strings.TrimSpace(parts[0])
  202. rfidType := strings.TrimSpace(parts[1])
  203. record := rfidProgram.RfidRecords{
  204. Username: req.Username,
  205. UserId: req.UserID,
  206. Rfid: rfid,
  207. RfidNum: len(rfidPairs),
  208. BuildingName: req.BuildingName,
  209. RoomName: req.RoomName,
  210. PenNo: req.PenNo,
  211. Model: req.DeviceModel,
  212. Version: req.DeviceVersion,
  213. Type: rfidType,
  214. SysRq: &now,
  215. }
  216. validRecords = append(validRecords, record)
  217. }
  218. if len(validRecords) == 0 {
  219. response.FailWithMessage("无有效RFID数据", c)
  220. return
  221. }
  222. // 批量插入记录
  223. result := global.GVA_DB.Create(&validRecords)
  224. if result.Error != nil {
  225. response.FailWithMessage("插入异常", c)
  226. return
  227. }
  228. response.OkWithDetailed(map[string]interface{}{"count": result.RowsAffected}, "数据已提交成功", c)
  229. }