Commit cfcccc9984be6d121a517c2f802bba7b0e416a66

Authored by aarongao
1 parent f833bc66
Exists in v1.2

ok

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
... ... @@ -179,6 +179,7 @@ func CreateTag(c *gin.Context) {
179 179 DB.CTags.InsertOne(tools.GetContext(),DB.STag{
180 180 c.PostForm("ScenicId"),
181 181 c.PostForm("TagGroup"),
  182 + c.PostForm("TypeAlias"),
182 183 c.PostForm("TagName"),
183 184 })
184 185  
... ...
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)
... ...