| 107 | } |
| 108 | |
| 109 | func updateQuery(c *gin.Context) { |
| 110 | // 当查询参数存在约定的ID参数名时,尝试解码并回填 |
| 111 | q := c.Request.URL.Query() |
| 112 | updated := false |
| 113 | |
| 114 | for key, values := range q { |
| 115 | // 兼容 snake_case 与 camelCase 的 ID 字段/参数名 |
| 116 | if hashids.IsIDField(key) || hashids.IsIDParam(key) { |
| 117 | newVals := make([]string, len(values)) |
| 118 | var decodedSlice []int64 |
| 119 | decodedAny := false |
| 120 | |
| 121 | for i, v := range values { |
| 122 | if v == "" { |
| 123 | newVals[i] = v |
| 124 | continue |
| 125 | } |
| 126 | if decoded, err := hashids.TryParseID(v); err == nil { |
| 127 | newVals[i] = strconv.FormatInt(decoded, 10) |
| 128 | decodedSlice = append(decodedSlice, decoded) |
| 129 | decodedAny = true |
| 130 | } else { |
| 131 | newVals[i] = v |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | if decodedAny { |
| 136 | q[key] = newVals |
| 137 | updated = true |
| 138 | // 上下文存储解码结果:单值为 int64,多值为 []int64 |
| 139 | if len(decodedSlice) == 1 { |
| 140 | c.Set("decoded_"+key, decodedSlice[0]) |
| 141 | } else if len(decodedSlice) > 1 { |
| 142 | c.Set("decoded_"+key, decodedSlice) |
| 143 | } |
| 144 | logger.SysLogf("RequestDecoder: decoded query param '%s' %v -> %v", key, values, newVals) |
| 145 | } |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | if updated { |
| 150 | c.Request.URL.RawQuery = q.Encode() |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | // decodeRequestIDs 递归解码请求数据中的ID字段 |
| 155 | func decodeRequestIDs(data interface{}) interface{} { |