Commit cfcccc9984be6d121a517c2f802bba7b0e416a66
1 parent
f833bc66
Exists in
v1.2
ok
Showing
9 changed files
with
205 additions
and
142 deletions
Show diff stats
API/Item.go
| ... | ... | @@ -3,6 +3,7 @@ package Api |
| 3 | 3 | import ( |
| 4 | 4 | "encoding/json" |
| 5 | 5 | "github.com/aarongao/tools" |
| 6 | + "github.com/asaskevich/govalidator" | |
| 6 | 7 | "github.com/gin-gonic/gin" |
| 7 | 8 | "go.mongodb.org/mongo-driver/bson" |
| 8 | 9 | "go.mongodb.org/mongo-driver/bson/primitive" |
| ... | ... | @@ -10,6 +11,7 @@ import ( |
| 10 | 11 | "letu/DB" |
| 11 | 12 | "letu/Lib/Auth" |
| 12 | 13 | "strconv" |
| 14 | + "strings" | |
| 13 | 15 | "time" |
| 14 | 16 | ) |
| 15 | 17 | |
| ... | ... | @@ -18,7 +20,7 @@ import ( |
| 18 | 20 | // @Accept json |
| 19 | 21 | // @Produce json |
| 20 | 22 | // @Param id 5dfb03070a9ac17ac7a82054 string true "设备id" |
| 21 | -// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运" | |
| 23 | +// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120)" | |
| 22 | 24 | // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" |
| 23 | 25 | // @Router /ItemInfo? [get] |
| 24 | 26 | func ItemInfo(c *gin.Context) { |
| ... | ... | @@ -49,15 +51,20 @@ func ItemInfo(c *gin.Context) { |
| 49 | 51 | // @Accept json |
| 50 | 52 | // @Produce json |
| 51 | 53 | // @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" |
| 52 | -// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运" | |
| 54 | +// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120)" | |
| 53 | 55 | // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" |
| 54 | 56 | // @Router /AllItems? [get] |
| 55 | 57 | func AllItems(c *gin.Context) { |
| 56 | 58 | c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) |
| 57 | 59 | c.Header("Access-Control-Allow-Credentials", "true") |
| 58 | 60 | |
| 61 | + _select := bson.M{"ScenicId": c.Query("ScenicId"), "Display": true} | |
| 62 | + if c.Query("Display") == "all"{ | |
| 63 | + _select = bson.M{"ScenicId": c.Query("ScenicId")} | |
| 64 | + } | |
| 65 | + | |
| 59 | 66 | var aItems = []DB.SItem{} |
| 60 | - cur, err := DB.CItem.Find(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}) | |
| 67 | + cur, err := DB.CItem.Find(tools.GetContext(), _select) | |
| 61 | 68 | defer cur.Close(tools.GetContext()) |
| 62 | 69 | if err == nil { |
| 63 | 70 | for cur.Next(tools.GetContext()) { |
| ... | ... | @@ -105,6 +112,11 @@ func UpdateItem(c *gin.Context) { |
| 105 | 112 | var Picture []string |
| 106 | 113 | json.Unmarshal([]byte(c.PostForm("Picture")), &Picture) |
| 107 | 114 | |
| 115 | + var CustomAttribute []DB.SCustomAttribute | |
| 116 | + json.Unmarshal([]byte(c.PostForm("CustomAttribute")), &CustomAttribute) | |
| 117 | + | |
| 118 | + var ReminderInterval = strings.Split(c.PostForm("ReminderInterval"),",") | |
| 119 | + | |
| 108 | 120 | var id primitive.ObjectID |
| 109 | 121 | if pid := c.PostForm("id"); pid == "null" { |
| 110 | 122 | id = primitive.NewObjectID() |
| ... | ... | @@ -113,30 +125,49 @@ func UpdateItem(c *gin.Context) { |
| 113 | 125 | } |
| 114 | 126 | |
| 115 | 127 | poststate, _ := strconv.Atoi(c.PostForm("State")) |
| 128 | + Display, _ := strconv.ParseBool(c.PostForm("Display")) | |
| 129 | + WaitingTimeDisplay, _ := strconv.ParseBool(c.PostForm("WaitingTimeDisplay")) | |
| 130 | + | |
| 131 | + | |
| 132 | + Item := &DB.SItem{ | |
| 133 | + Id: &id, | |
| 134 | + Name: c.PostForm("Name"), | |
| 135 | + SubName: c.PostForm("SubName"), | |
| 136 | + ScenicId: c.PostForm("ScenicId"), | |
| 137 | + Location: Location, | |
| 138 | + Icon: c.PostForm("Icon"), | |
| 139 | + LimitHeight: c.PostForm("LimitHeight"), | |
| 140 | + PlayDuration: c.PostForm("PlayDuration"), | |
| 141 | + SceneTime: c.PostForm("SceneTime"), | |
| 142 | + Picture: Picture, | |
| 143 | + Voice: c.PostForm("Voice"), | |
| 144 | + Tel: c.PostForm("Tel"), | |
| 145 | + AverageConsumption: c.PostForm("AverageConsumption"), | |
| 146 | + Menu: c.PostForm("Menu"), | |
| 147 | + Tags: Tags, | |
| 148 | + OpenHours: c.PostForm("OpenHours"), | |
| 149 | + LocationDescription: c.PostForm("LocationDescription"), | |
| 150 | + Reminder: c.PostForm("Reminder"), | |
| 151 | + State: poststate, | |
| 152 | + CustomAttribute: CustomAttribute, | |
| 153 | + Display: Display, | |
| 154 | + WaitingTimeDisplay: WaitingTimeDisplay, | |
| 155 | + ReminderInterval: ReminderInterval, | |
| 156 | + } | |
| 157 | + | |
| 158 | + _, err = govalidator.ValidateStruct(Item); | |
| 159 | + if err != nil { | |
| 160 | + c.JSON(200, tools.ResponseError{ | |
| 161 | + 1, | |
| 162 | + err.Error(), | |
| 163 | + }) | |
| 164 | + return | |
| 165 | + } | |
| 116 | 166 | |
| 117 | 167 | upsert := true |
| 118 | 168 | DB.CItem.FindOneAndUpdate(tools.GetContext(), |
| 119 | 169 | bson.M{"_id": id}, |
| 120 | - bson.M{"$set": bson.M{ | |
| 121 | - "Name": c.PostForm("Name"), | |
| 122 | - "SubName": c.PostForm("SubName"), | |
| 123 | - "ScenicId": c.PostForm("ScenicId"), | |
| 124 | - "Location": Location, | |
| 125 | - "Icon": c.PostForm("Icon"), | |
| 126 | - "LimitHeight": c.PostForm("LimitHeight"), | |
| 127 | - "PlayDuration": c.PostForm("PlayDuration"), | |
| 128 | - "SceneTime": c.PostForm("SceneTime"), | |
| 129 | - "Picture": Picture, | |
| 130 | - "Voice": c.PostForm("Voice"), | |
| 131 | - "Tel": c.PostForm("Tel"), | |
| 132 | - "AverageConsumption": c.PostForm("AverageConsumption"), | |
| 133 | - "Menu": c.PostForm("Menu"), | |
| 134 | - "Tags": Tags, | |
| 135 | - "OpenHours": c.PostForm("OpenHours"), | |
| 136 | - "LocationDescription": c.PostForm("LocationDescription"), | |
| 137 | - "Reminder": c.PostForm("Reminder"), | |
| 138 | - "State": poststate, | |
| 139 | - }}, &options.FindOneAndUpdateOptions{ | |
| 170 | + bson.M{"$set": Item}, &options.FindOneAndUpdateOptions{ | |
| 140 | 171 | Upsert: &upsert, |
| 141 | 172 | }, |
| 142 | 173 | ) |
| ... | ... | @@ -155,7 +186,7 @@ func UpdateItem(c *gin.Context) { |
| 155 | 186 | // ItemTime[c.PostForm("id")] = "0" |
| 156 | 187 | //} |
| 157 | 188 | |
| 158 | - DB.Redis.Set("AllItemTime_" + c.PostForm("ScenicId"), ItemTime, time.Second*60*60*24*30) | |
| 189 | + DB.Redis.Set("AllItemTime_"+c.PostForm("ScenicId"), ItemTime, time.Second*60*60*24*30) | |
| 159 | 190 | |
| 160 | 191 | c.JSON(200, tools.ResponseSeccess{ |
| 161 | 192 | 0, | ... | ... |
API/Scenic.go
| ... | ... | @@ -217,101 +217,120 @@ func initScenic(id string) { |
| 217 | 217 | dba = append(dba, DB.STag{ |
| 218 | 218 | id, |
| 219 | 219 | "type", |
| 220 | + "基础类型", | |
| 220 | 221 | "服务设施", |
| 221 | 222 | }) |
| 222 | 223 | dba = append(dba, DB.STag{ |
| 223 | 224 | id, |
| 224 | 225 | "type", |
| 226 | + "基础类型", | |
| 225 | 227 | "普通", |
| 226 | 228 | }) |
| 227 | 229 | dba = append(dba, DB.STag{ |
| 228 | 230 | id, |
| 229 | 231 | "type", |
| 232 | + "基础类型", | |
| 230 | 233 | "演出", |
| 231 | 234 | }) |
| 232 | 235 | dba = append(dba, DB.STag{ |
| 233 | 236 | id, |
| 234 | 237 | "type", |
| 238 | + "基础类型", | |
| 235 | 239 | "购物", |
| 236 | 240 | }) |
| 237 | 241 | dba = append(dba, DB.STag{ |
| 238 | 242 | id, |
| 239 | 243 | "type", |
| 244 | + "基础类型", | |
| 240 | 245 | "餐饮", |
| 241 | 246 | }) |
| 242 | 247 | dba = append(dba, DB.STag{ |
| 243 | 248 | id, |
| 244 | 249 | "type", |
| 250 | + "基础类型", | |
| 245 | 251 | "游乐设施", |
| 246 | 252 | }) |
| 247 | 253 | |
| 248 | 254 | dba = append(dba, DB.STag{ |
| 249 | 255 | id, |
| 250 | 256 | "age", |
| 257 | + "年龄段", | |
| 251 | 258 | "儿童", |
| 252 | 259 | }) |
| 253 | 260 | dba = append(dba, DB.STag{ |
| 254 | 261 | id, |
| 255 | 262 | "age", |
| 263 | + "年龄段", | |
| 256 | 264 | "成人", |
| 257 | 265 | }) |
| 258 | 266 | dba = append(dba, DB.STag{ |
| 259 | 267 | id, |
| 260 | 268 | "age", |
| 269 | + "年龄段", | |
| 261 | 270 | "青少年", |
| 262 | 271 | }) |
| 263 | 272 | |
| 264 | 273 | dba = append(dba, DB.STag{ |
| 265 | 274 | id, |
| 266 | 275 | "food", |
| 276 | + "餐饮类型", | |
| 267 | 277 | "海鲜", |
| 268 | 278 | }) |
| 269 | 279 | dba = append(dba, DB.STag{ |
| 270 | 280 | id, |
| 271 | 281 | "food", |
| 282 | + "餐饮类型", | |
| 272 | 283 | "团餐", |
| 273 | 284 | }) |
| 274 | 285 | dba = append(dba, DB.STag{ |
| 275 | 286 | id, |
| 276 | 287 | "food", |
| 288 | + "餐饮类型", | |
| 277 | 289 | "烧烤", |
| 278 | 290 | }) |
| 279 | 291 | dba = append(dba, DB.STag{ |
| 280 | 292 | id, |
| 281 | 293 | "food", |
| 294 | + "餐饮类型", | |
| 282 | 295 | "小吃", |
| 283 | 296 | }) |
| 284 | 297 | |
| 285 | 298 | dba = append(dba, DB.STag{ |
| 286 | 299 | id, |
| 287 | 300 | "recommend", |
| 301 | + "推荐指数", | |
| 288 | 302 | "必玩", |
| 289 | 303 | }) |
| 290 | 304 | |
| 291 | 305 | dba = append(dba, DB.STag{ |
| 292 | 306 | id, |
| 293 | 307 | "shop", |
| 308 | + "商品分类", | |
| 294 | 309 | "纪念品", |
| 295 | 310 | }) |
| 296 | 311 | dba = append(dba, DB.STag{ |
| 297 | 312 | id, |
| 298 | 313 | "shop", |
| 314 | + "商品分类", | |
| 299 | 315 | "收藏品", |
| 300 | 316 | }) |
| 301 | 317 | dba = append(dba, DB.STag{ |
| 302 | 318 | id, |
| 303 | 319 | "shop", |
| 320 | + "商品分类", | |
| 304 | 321 | "玩具", |
| 305 | 322 | }) |
| 306 | 323 | |
| 307 | 324 | dba = append(dba, DB.STag{ |
| 308 | 325 | id, |
| 309 | 326 | "thrilling", |
| 327 | + "体验感受", | |
| 310 | 328 | "刺激", |
| 311 | 329 | }) |
| 312 | 330 | dba = append(dba, DB.STag{ |
| 313 | 331 | id, |
| 314 | 332 | "thrilling", |
| 333 | + "体验感受", | |
| 315 | 334 | "放松", |
| 316 | 335 | }) |
| 317 | 336 | ... | ... |
API/Shop.go
| ... | ... | @@ -9,6 +9,7 @@ import ( |
| 9 | 9 | "go.mongodb.org/mongo-driver/mongo/options" |
| 10 | 10 | "letu/DB" |
| 11 | 11 | "letu/Lib/Auth" |
| 12 | + "strconv" | |
| 12 | 13 | ) |
| 13 | 14 | |
| 14 | 15 | // @Title 查询商品信息 |
| ... | ... | @@ -16,7 +17,7 @@ import ( |
| 16 | 17 | // @Accept json |
| 17 | 18 | // @Produce json |
| 18 | 19 | // @Param id 5dfb03070a9ac17ac7a82054 string true "id" |
| 19 | -// @Success 200 {object} tools.ResponseSeccess "Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图" | |
| 20 | +// @Success 200 {object} tools.ResponseSeccess "Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图; Display是否在前台显示" | |
| 20 | 21 | // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" |
| 21 | 22 | // @Router /CommodityInfo? [get] |
| 22 | 23 | func CommodityInfo(c *gin.Context) { |
| ... | ... | @@ -47,15 +48,20 @@ func CommodityInfo(c *gin.Context) { |
| 47 | 48 | // @Accept json |
| 48 | 49 | // @Produce json |
| 49 | 50 | // @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" |
| 50 | -// @Success 200 {object} tools.ResponseSeccess "Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图" | |
| 51 | +// @Success 200 {object} tools.ResponseSeccess "Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图; Display是否在前台显示" | |
| 51 | 52 | // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" |
| 52 | 53 | // @Router /AllCommodity? [get] |
| 53 | 54 | func AllCommodity(c *gin.Context) { |
| 54 | 55 | c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) |
| 55 | 56 | c.Header("Access-Control-Allow-Credentials", "true") |
| 56 | 57 | |
| 58 | + _select := bson.M{"ScenicId": c.Query("ScenicId"), "Display": true} | |
| 59 | + if c.Query("Display") == "all"{ | |
| 60 | + _select = bson.M{"ScenicId": c.Query("ScenicId")} | |
| 61 | + } | |
| 62 | + | |
| 57 | 63 | var aCommoditys = []DB.SCommodity{} |
| 58 | - cur, err := DB.CCommodity.Find(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}) | |
| 64 | + cur, err := DB.CCommodity.Find(tools.GetContext(), _select) | |
| 59 | 65 | defer cur.Close(tools.GetContext()) |
| 60 | 66 | if err == nil { |
| 61 | 67 | for cur.Next(tools.GetContext()) { |
| ... | ... | @@ -110,6 +116,7 @@ func UpdateCommodity(c *gin.Context) { |
| 110 | 116 | } |
| 111 | 117 | |
| 112 | 118 | upsert := true |
| 119 | + Display, _ := strconv.ParseBool(c.PostForm("Display")) | |
| 113 | 120 | DB.CCommodity.FindOneAndUpdate(tools.GetContext(), |
| 114 | 121 | bson.M{"_id": id}, |
| 115 | 122 | bson.M{"$set": bson.M{ |
| ... | ... | @@ -120,6 +127,7 @@ func UpdateCommodity(c *gin.Context) { |
| 120 | 127 | "TopPhoto": TopPhoto, |
| 121 | 128 | "ItemId": c.PostForm("ItemId"), |
| 122 | 129 | "Images": Picture, |
| 130 | + "Display": Display, | |
| 123 | 131 | }}, &options.FindOneAndUpdateOptions{ |
| 124 | 132 | Upsert: &upsert, |
| 125 | 133 | }, | ... | ... |
API/Tag.go
API/Upload.go
| 1 | 1 | package Api |
| 2 | 2 | |
| 3 | 3 | import ( |
| 4 | + "encoding/base64" | |
| 4 | 5 | "fmt" |
| 5 | 6 | "github.com/aarongao/tools" |
| 6 | 7 | "github.com/gin-gonic/gin" |
| 8 | + "io/ioutil" | |
| 7 | 9 | "path" |
| 8 | 10 | "strconv" |
| 11 | + "strings" | |
| 9 | 12 | "time" |
| 10 | 13 | ) |
| 11 | 14 | |
| ... | ... | @@ -47,3 +50,39 @@ func Upload(c *gin.Context) { |
| 47 | 50 | "/" + filePath, |
| 48 | 51 | }) |
| 49 | 52 | } |
| 53 | + | |
| 54 | +// @Title 上传文件BASE64 | |
| 55 | +// @Description 上传文件BASE64 | |
| 56 | +// @Accept json | |
| 57 | +// @Produce json | |
| 58 | +// @Param file 1 file true "文件" | |
| 59 | +// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"图片地址"}" | |
| 60 | +// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" | |
| 61 | +// @Router /UploadBASE64? [post] | |
| 62 | +func UploadBASE64(c *gin.Context) { | |
| 63 | + c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) | |
| 64 | + c.Header("Access-Control-Allow-Credentials", "true") | |
| 65 | + | |
| 66 | + base64Img := c.PostForm("base64Img") | |
| 67 | + | |
| 68 | + index := strings.Index(base64Img, ",") | |
| 69 | + base64Img = base64Img[index+1:] | |
| 70 | + dist, _ := base64.StdEncoding.DecodeString(base64Img) | |
| 71 | + | |
| 72 | + fileExt := ".jpg" | |
| 73 | + filePath := "Upload/" + strconv.Itoa(int(time.Now().UnixNano())) + fileExt | |
| 74 | + | |
| 75 | + err := ioutil.WriteFile(filePath, []byte(dist), 0666) //buffer输出到jpg文件中(不做处理,直接写到文件) | |
| 76 | + if err != nil { | |
| 77 | + fmt.Println(err) | |
| 78 | + c.JSON(200, tools.ResponseError{ | |
| 79 | + 1, | |
| 80 | + "upload file err", | |
| 81 | + }) | |
| 82 | + return | |
| 83 | + } | |
| 84 | + c.JSON(200, tools.ResponseSeccess{ | |
| 85 | + 0, | |
| 86 | + "/" + filePath, | |
| 87 | + }) | |
| 88 | +} | ... | ... |
DB/db.go
| ... | ... | @@ -54,25 +54,34 @@ type SScenic struct { |
| 54 | 54 | |
| 55 | 55 | type SItem struct { |
| 56 | 56 | Id *primitive.ObjectID `bson:"_id" json:"Id" valid:"required"` |
| 57 | - ScenicId string `bson:"ScenicId" json:"ScenicId"` // 景区id | |
| 58 | - Name string `bson:"Name" json:"Name"` | |
| 59 | - SubName string `bson:"SubName" json:"SubName"` | |
| 60 | - Location SLocation `bson:"Location" json:"Location"` | |
| 57 | + ScenicId string `bson:"ScenicId" json:"ScenicId" valid:"required"` // 景区id | |
| 58 | + Name string `bson:"Name" json:"Name" valid:"required"` | |
| 59 | + SubName string `bson:"SubName,omitempty" json:"SubName"` | |
| 60 | + Location SLocation `bson:"Location" json:"Location" valid:"required"` | |
| 61 | 61 | Tags []STag `bson:"Tags" json:"Tags"` |
| 62 | - Icon string `bson:"Icon" json:"Icon"` | |
| 63 | - LimitHeight string `bson:"LimitHeight" json:"LimitHeight"` //限高 | |
| 64 | - PlayDuration string `bson:"PlayDuration" json:"PlayDuration"` //游玩时长 | |
| 65 | - SceneTime string `bson:"SceneTime" json:"SceneTime"` //场次时间 | |
| 66 | - Picture []string `bson:"Picture" json:"Picture"` | |
| 67 | - Voice string `bson:"Voice" json:"Voice"` //音频 | |
| 68 | - Tel string `bson:"Tel" json:"Tel"` | |
| 69 | - AverageConsumption string `bson:"AverageConsumption" json:"AverageConsumption"` //人均消费 | |
| 70 | - Menu string `bson:"Menu" json:"Menu"` //目录 | |
| 71 | - Time string `bson:"Time" json:"Time"` | |
| 72 | - OpenHours string `bson:"OpenHours" json:"OpenHours"` //开放时间 | |
| 73 | - LocationDescription string `bson:"LocationDescription" json:"LocationDescription"` //位置描述 | |
| 74 | - Reminder string `bson:"Reminder" json:"Reminder"` //温馨提示 | |
| 75 | - State int `bson:"State" json:"State"` // 运行状态0=正常1=停运 | |
| 62 | + Icon string `bson:"Icon" json:"Icon" valid:"required"` | |
| 63 | + LimitHeight string `bson:"LimitHeight,omitempty" json:"LimitHeight"` //限高 | |
| 64 | + PlayDuration string `bson:"PlayDuration,omitempty" json:"PlayDuration"` //游玩时长 | |
| 65 | + SceneTime string `bson:"SceneTime,omitempty" json:"SceneTime"` //场次时间 | |
| 66 | + Picture []string `bson:"Picture,omitempty" json:"Picture"` | |
| 67 | + Voice string `bson:"Voice,omitempty" json:"Voice"` //音频 | |
| 68 | + Tel string `bson:"Tel,omitempty" json:"Tel"` | |
| 69 | + AverageConsumption string `bson:"AverageConsumption,omitempty" json:"AverageConsumption"` //人均消费 | |
| 70 | + Menu string `bson:"Menu,omitempty" json:"Menu"` //目录 | |
| 71 | + Time string `bson:"Time,omitempty" json:"Time"` | |
| 72 | + OpenHours string `bson:"OpenHours,omitempty" json:"OpenHours"` //开放时间 | |
| 73 | + LocationDescription string `bson:"LocationDescription,omitempty" json:"LocationDescription"` //位置描述 | |
| 74 | + Reminder string `bson:"Reminder,omitempty" json:"Reminder"` //温馨提示 | |
| 75 | + State int `bson:"State,omitempty" json:"State"` // 运行状态0=正常1=停运 | |
| 76 | + CustomAttribute []SCustomAttribute `bson:"CustomAttribute" json:"CustomAttribute"` // 自定义属性 | |
| 77 | + WaitingTimeDisplay bool `bson:"WaitingTimeDisplay" json:"WaitingTimeDisplay"` //是否有等待时间显示 | |
| 78 | + ReminderInterval []string `bson:"ReminderInterval" json:"ReminderInterval"` //排队提醒间隔时间 | |
| 79 | + Display bool `bson:"Display" json:"Display"` //是否显示 | |
| 80 | +} | |
| 81 | + | |
| 82 | +type SCustomAttribute struct { | |
| 83 | + Title string `bson:"Title" json:"Title"` | |
| 84 | + Content string `bson:"Content" json:"Content"` | |
| 76 | 85 | } |
| 77 | 86 | |
| 78 | 87 | type SModel struct { |
| ... | ... | @@ -170,6 +179,7 @@ type SCommodity struct { |
| 170 | 179 | KvPhoto string `bson:"KvPhoto" json:"KvPhoto"` //用于列表页的图片 |
| 171 | 180 | TopPhoto []SPicture `bson:"TopPhoto" json:"TopPhoto"` //详情页最上面的轮播图 |
| 172 | 181 | Images []string `bson:"Images" json:"Images"` //详情页下面的产品详细图 |
| 182 | + Display bool `bson:"Display" json:"Display"` //是否显示 | |
| 173 | 183 | } |
| 174 | 184 | type SLine struct { |
| 175 | 185 | Id *primitive.ObjectID `bson:"_id" json:"Id" valid:"required"` |
| ... | ... | @@ -220,9 +230,10 @@ type SMember struct { |
| 220 | 230 | } |
| 221 | 231 | |
| 222 | 232 | type STag struct { |
| 223 | - ScenicId string `bson:"ScenicId" json:"ScenicId"` | |
| 224 | - Type string `bson:"Type" json:"Type"` | |
| 225 | - Name string `bson:"Name" json:"Name"` | |
| 233 | + ScenicId string `bson:"ScenicId" json:"ScenicId"` | |
| 234 | + Type string `bson:"Type" json:"Type"` | |
| 235 | + TypeAlias string `TypeAlias:"alias" json:"TypeAlias"` // 类型的别名 | |
| 236 | + Name string `bson:"Name" json:"Name"` | |
| 226 | 237 | } |
| 227 | 238 | |
| 228 | 239 | type SPicture struct { | ... | ... |
README.md
| ... | ... | @@ -2,7 +2,7 @@ |
| 2 | 2 | ## 乐游图后端接口文档 |
| 3 | 3 | | Specification | Value | |
| 4 | 4 | |-----|-----| |
| 5 | -| API Version | 1.1.0 | | |
| 5 | +| API Version | 1.0.0 | | |
| 6 | 6 | | BasePath | 正式 leyoutu.st-i.com.cn; 测试 leyoutu.sti-uat.com | |
| 7 | 7 | |
| 8 | 8 | |
| ... | ... | @@ -64,6 +64,7 @@ |
| 64 | 64 | 1. [更新景区基础信息-高级](#updatescenicsenior-post) |
| 65 | 65 | 1. [用户管理 - 修改用户信息](#updateuser-post) |
| 66 | 66 | 1. [上传](#upload-post) |
| 67 | +1. [上传文件BASE64](#uploadbase64-post) | |
| 67 | 68 | 1. [用户管理 - 获取用户信息](#userinfo-get) |
| 68 | 69 | 1. [增加用户行为日志](#userlog-post) |
| 69 | 70 | |
| ... | ... | @@ -83,7 +84,7 @@ |
| 83 | 84 | |
| 84 | 85 | | Code | Type | Model | Message | |
| 85 | 86 | |-----|-----|-----|-----| |
| 86 | -| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图 | | |
| 87 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图; Display是否在前台显示 | | |
| 87 | 88 | | 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | |
| 88 | 89 | |
| 89 | 90 | |
| ... | ... | @@ -141,7 +142,7 @@ |
| 141 | 142 | |
| 142 | 143 | | Code | Type | Model | Message | |
| 143 | 144 | |-----|-----|-----|-----| |
| 144 | -| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运 | | |
| 145 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120) | | |
| 145 | 146 | | 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | |
| 146 | 147 | |
| 147 | 148 | |
| ... | ... | @@ -331,7 +332,7 @@ |
| 331 | 332 | |
| 332 | 333 | | Code | Type | Model | Message | |
| 333 | 334 | |-----|-----|-----|-----| |
| 334 | -| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图 | | |
| 335 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Price=价格;ShopName=店铺名称;KvPhoto用于列表页的图片;TopPhoto详情页最上面的轮播图;Images详情页下面的产品详细图; Display是否在前台显示 | | |
| 335 | 336 | | 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | |
| 336 | 337 | |
| 337 | 338 | |
| ... | ... | @@ -556,7 +557,7 @@ |
| 556 | 557 | |
| 557 | 558 | | Code | Type | Model | Message | |
| 558 | 559 | |-----|-----|-----|-----| |
| 559 | -| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运 | | |
| 560 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120) | | |
| 560 | 561 | | 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | |
| 561 | 562 | |
| 562 | 563 | |
| ... | ... | @@ -1199,6 +1200,25 @@ |
| 1199 | 1200 | |
| 1200 | 1201 | |
| 1201 | 1202 | |
| 1203 | +<a name="uploadbase64-post"></a> | |
| 1204 | + | |
| 1205 | +#### /UploadBASE64 (POST) | |
| 1206 | + | |
| 1207 | + | |
| 1208 | +上传文件BASE64 | |
| 1209 | + | |
| 1210 | +| Param Name | Example | Data Type | Description | Required? | | |
| 1211 | +|-----|-----|-----|-----|-----| | |
| 1212 | +| file | 1 | file | 文件 | Yes | | |
| 1213 | + | |
| 1214 | + | |
| 1215 | +| Code | Type | Model | Message | | |
| 1216 | +|-----|-----|-----|-----| | |
| 1217 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | {"errcode":0,"result":"图片地址"} | | |
| 1218 | +| 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1202 | 1222 | <a name="userinfo-get"></a> |
| 1203 | 1223 | |
| 1204 | 1224 | #### /UserInfo (GET) | ... | ... |
Version.md
| 1 | -## 版本号:v1.1 | |
| 1 | +## 版本号:v1.2 | |
| 2 | 2 | |
| 3 | -##### 生产环境地址:http://leyoutu.st-i.com.cn/api/v1.1/ | |
| 3 | +##### 生产环境地址:http://leyoutu.st-i.com.cn/api/v1.2/ | |
| 4 | 4 | |
| 5 | -##### 测试环境地址:http://leyoutu.sti-uat.com/api/v1.1/ | |
| 5 | +##### 测试环境地址:http://leyoutu.sti-uat.com/api/v1.2/ | |
| 6 | 6 | |
| 7 | 7 | ##### 变更说明: |
| 8 | 8 | |
| 9 | -1. /UserInfo接口增加权限验证(需要携带Token),游客只能查询自己信息,操作员可查询所有。 | |
| 10 | - | |
| 11 | -2. /AllComplaint接口增加ScenicId景区id参数 | |
| 12 | - | |
| 13 | -3. /SystemInfo 新增系统信息接口 | |
| 14 | - | |
| 15 | - ``` | |
| 16 | - { | |
| 17 | - "errcode": 0, | |
| 18 | - "result": { | |
| 19 | - "UpdateLocationInterval": 30,//上报位置时间间隔(秒) | |
| 20 | - "Version": 1.1//最新版本号 | |
| 21 | - "SupportVersion": 1.1//支持的最旧版本号 | |
| 22 | - } | |
| 23 | - } | |
| 24 | - ``` | |
| 25 | - | |
| 26 | -4. 新增加公告管理模块接口 | |
| 27 | - | |
| 28 | - ``` | |
| 29 | - /Notice/Info | |
| 30 | - /Notice/List | |
| 31 | - /Notice/Create(需要携带Token) | |
| 32 | - /Notice/Remove(需要携带Token) | |
| 33 | - /Notice/Modify(需要携带Token) | |
| 34 | - ``` | |
| 35 | - | |
| 36 | -5. 新增加顶部菜单相关接口 | |
| 37 | - | |
| 38 | - ``` | |
| 39 | - /TopMenus/All 获取所有菜单,以及关联标签 | |
| 40 | - /TopMenus/Update(需要携带Token) | |
| 41 | - /TopMenus/Remove(需要携带Token) | |
| 42 | - ``` | |
| 43 | - | |
| 44 | -6. 删除【游玩项目】标签。增加【游乐设施】【演出】【餐饮】【购物】【普通】 | |
| 45 | - | |
| 46 | -7. 删除【location】标签组 | |
| 47 | - | |
| 48 | -8. 修改地图切片url地址,及切片上传方式 | |
| 49 | - | |
| 50 | - /tiles2/**<u>5e0d504e24e03431008b4567</u>**/18/218274/99286.jpg | |
| 51 | - | |
| 52 | - 其中5e0d504e24e03431008b4567(景区id)为新加目录 | |
| 53 | - | |
| 54 | - 通过FTP方式上传到/root/leyoutu/tiles2/(景区id)/目录下 | |
| 55 | - | |
| 56 | -9. 后台增加管理员日志功能 | |
| 57 | - | |
| 58 | -10. 增加/SysAds/List获取平台广告信息接口 | |
| 59 | - | |
| 60 | -11. /AllLine推荐线路接口返回结果变更,增加固定结构。 | |
| 61 | - | |
| 62 | - ``` | |
| 63 | - { | |
| 64 | - errcode: 0, | |
| 65 | - result: [ ] | |
| 66 | - } | |
| 67 | - ``` | |
| 68 | - | |
| 69 | -12. /ScenicInfo景区信息接口增加新属性 | |
| 70 | - | |
| 71 | - ``` | |
| 72 | - ZoomForIOS //地图的缩放大小(IOS) | |
| 73 | - ZoomForAndroidMin //地图的缩放大小(Android最小) | |
| 74 | - ZoomForAndroidMax //地图的缩放大小(Android最大) | |
| 75 | - Rotation //旋转角度 | |
| 76 | - OpenTiles //否开启地图切片 | |
| 77 | - ColorTiles //切片底色(FFFFFF) | |
| 78 | - ``` | |
| 79 | - | |
| 80 | -13. /AllScenic增加Display=all参数。意思是显示所有数据,默认情况不显示隐藏信息 | |
| 9 | +1. 后台取消景区增加标签功能。 | |
| 10 | +2. 后台优化项目编辑页面布局及功能。 | |
| 11 | +3. 获取标签接口/AllTag增加TypeAlias字段(标签分组的中文名称)。 | |
| 12 | +4. 更新项目信息接口/UpdateItem增加ReminderInterval字段(排队提醒间隔时间)用逗号分割如60,90,120 | |
| 13 | +5. 项目和商品增加是否在前台显示属性 | |
| 81 | 14 | |
| 82 | 15 | |
| 83 | 16 | |
| 84 | 17 | ##### 数据结构变更: |
| 85 | 18 | |
| 86 | -1、标签表、设施信息中的所属标签 | |
| 19 | +1. 标签表增加TypeAlias字段(标签分组的中文名称) | |
| 20 | +2. 删除1.0所属标签 | |
| 21 | +3. 更新商品表和项目表的全部Display字段为true | |
| 22 | +4. 更新项目表的所有游玩项目WaitingTimeDisplay字段为true | |
| 87 | 23 | |
| 88 | -2、平台广告表初始数据 | |
| 89 | 24 | |
| 90 | -2、root用户增加新模块权限 | |
| 91 | 25 | |
| 92 | 26 | |
| 93 | 27 | |
| ... | ... | @@ -101,16 +35,16 @@ |
| 101 | 35 | |
| 102 | 36 | ##### 发布流程: |
| 103 | 37 | |
| 104 | -1. 提交APP代码到git(v1.1分支) | |
| 38 | +1. 提交APP代码到git(v1.2分支) | |
| 105 | 39 | 2. 使用 “测试环境地址” 打包内测版本至TestFlight |
| 106 | -3. 升级 ”生产环境“ 接口至v1.1 | |
| 107 | - 1. 打包上传程序文件main_v1.1 | |
| 40 | +3. 升级 ”生产环境“ 接口至v1.2 | |
| 41 | + 1. 打包上传程序文件main_v1.2 | |
| 108 | 42 | 2. 修改config.json配置文件 |
| 109 | 43 | 3. 运行程序 |
| 110 | - 4. nginx增加/api/v1.1路径支持 | |
| 44 | + 4. nginx增加/api/v1.2路径支持 | |
| 111 | 45 | 5. 上传后台页面 |
| 112 | 46 | 6. 更新root用户模块权限数据 |
| 113 | - 7. 修改数据结构变更及数据缺失(广告,标签等。。) | |
| 47 | + 7. 修改数据结构变更及数据缺失(见上面“数据结构变更”) | |
| 114 | 48 | 4. 使用 “生产环境地址” 打包公测版本至TestFlight |
| 115 | 49 | 5. 发布至商店 |
| 116 | 50 | ... | ... |
main.go
| ... | ... | @@ -40,7 +40,6 @@ func main() { |
| 40 | 40 | flag.StringVar(&runPort, "port", "", "端口号,默认为8080") |
| 41 | 41 | flag.Parse() |
| 42 | 42 | |
| 43 | - | |
| 44 | 43 | // 连接数据库 |
| 45 | 44 | // Set client options |
| 46 | 45 | clientOptions := options.Client() |
| ... | ... | @@ -134,6 +133,8 @@ func main() { |
| 134 | 133 | InitController("POST", "/Tag/Remove", Api.RemoveTag, &DB.SModel{"标签管理", "删除"}) |
| 135 | 134 | |
| 136 | 135 | InitController("POST", "/Upload", Api.Upload, &DB.SModel{}) |
| 136 | + Gin.POST("/UploadBASE64", Api.UploadBASE64) | |
| 137 | + | |
| 137 | 138 | InitController("POST", "/UpdateItem", Api.UpdateItem, &DB.SModel{"项目管理", "修改"}) |
| 138 | 139 | InitController("POST", "/UpdateCommodity", Api.UpdateCommodity, &DB.SModel{"商品管理", "修改"}) |
| 139 | 140 | InitController("POST", "/UpdateLine", Api.UpdateLine, &DB.SModel{"线路管理", "修改"}) |
| ... | ... | @@ -160,8 +161,8 @@ func main() { |
| 160 | 161 | InitController("GET", "/Icon/Info", Api.IconInfo, &DB.SModel{}) |
| 161 | 162 | InitController("POST", "/CheckToken", Api.CheckToken, &DB.SModel{}) |
| 162 | 163 | //InitController("/Tiles", Api.Tiles) |
| 163 | - InitController("POST", "/TopMenus/Update", Api.UpdateTopMenus, &DB.SModel{"菜单管理","修改"}) | |
| 164 | - InitController("POST", "/TopMenus/Remove", Api.RemoveTopMenus, &DB.SModel{"菜单管理","删除"}) | |
| 164 | + InitController("POST", "/TopMenus/Update", Api.UpdateTopMenus, &DB.SModel{"菜单管理", "修改"}) | |
| 165 | + InitController("POST", "/TopMenus/Remove", Api.RemoveTopMenus, &DB.SModel{"菜单管理", "删除"}) | |
| 165 | 166 | InitController("GET", "/TopMenus/All", Api.AllTopMenus, &DB.SModel{}) |
| 166 | 167 | InitController("GET", "/RegisterDevice", Api.RegisterDevice, &DB.SModel{}) |
| 167 | 168 | InitController("POST", "/RemoveUser", Api.RemoveUser, &DB.SModel{"用户管理", "删除"}) |
| ... | ... | @@ -171,7 +172,6 @@ func main() { |
| 171 | 172 | |
| 172 | 173 | InitController("GET", "/AllOperatorLog", Api.AllOperatorLog, &DB.SModel{"操作员日志", "查看所有"}) |
| 173 | 174 | |
| 174 | - | |
| 175 | 175 | InitController("GET", "/AllOperator", Api.AllOperator, &DB.SModel{"操作员管理", "查看所有"}) |
| 176 | 176 | InitController("GET", "/SystemInfo", Api.SystemInfo, &DB.SModel{}) |
| 177 | 177 | |
| ... | ... | @@ -180,7 +180,7 @@ func main() { |
| 180 | 180 | InitController("GET", "/SysAds/List", Api.SysAdsList, &DB.SModel{}) |
| 181 | 181 | InitController("POST", "/SysAds/Modify", Api.ModifySysAds, &DB.SModel{"平台广告", "修改"}) |
| 182 | 182 | |
| 183 | - InitController("GET", "/Analysls/Count", Api.Analysls, &DB.SModel{"平台数据统计","查询"}) | |
| 183 | + InitController("GET", "/Analysls/Count", Api.Analysls, &DB.SModel{"平台数据统计", "查询"}) | |
| 184 | 184 | |
| 185 | 185 | Gin.GET("/AllModules", Auth.Modules) |
| 186 | 186 | //InitController("/ws", Api.WsPage) |
| ... | ... | @@ -228,7 +228,7 @@ func main() { |
| 228 | 228 | |
| 229 | 229 | // 默认情况使用配置文件中的端口号,除非在启动命令中指定-port :808x |
| 230 | 230 | _port := Config.Info.ServerPort |
| 231 | - if runPort != ""{ | |
| 231 | + if runPort != "" { | |
| 232 | 232 | _port = runPort |
| 233 | 233 | } |
| 234 | 234 | Gin.Run(_port) | ... | ... |