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) | ... | ... |