作者 唐旭辉

Merge branch 'dev' of http://gitlab.fjmaimaimai.com/mmm-go/oppmg into dev

@@ -48,12 +48,20 @@ func (this *BaseController) ResposeJson(msg *protocol.ResponseMessage) { @@ -48,12 +48,20 @@ func (this *BaseController) ResposeJson(msg *protocol.ResponseMessage) {
48 func (this *BaseController) GetCompanyId() int64 { 48 func (this *BaseController) GetCompanyId() int64 {
49 v := this.Ctx.Input.GetData(protocol.HeaderCompanyid) 49 v := this.Ctx.Input.GetData(protocol.HeaderCompanyid)
50 companyid, _ := strconv.ParseInt(fmt.Sprint(v), 10, 64) 50 companyid, _ := strconv.ParseInt(fmt.Sprint(v), 10, 64)
  51 +
  52 + if beego.BConfig.RunMode != "prod" && companyid == 0 {
  53 + companyid, _ = strconv.ParseInt(this.Ctx.Input.Header("x-mmm-cid"), 10, 64)
  54 + }
51 return companyid 55 return companyid
52 } 56 }
53 57
54 func (this *BaseController) GetUserId() int64 { 58 func (this *BaseController) GetUserId() int64 {
55 v := this.Ctx.Input.GetData(protocol.HeaderUserid) 59 v := this.Ctx.Input.GetData(protocol.HeaderUserid)
56 userid, _ := strconv.ParseInt(fmt.Sprint(v), 10, 64) 60 userid, _ := strconv.ParseInt(fmt.Sprint(v), 10, 64)
  61 +
  62 + if beego.BConfig.RunMode != "prod" && userid == 0 {
  63 + userid, _ = strconv.ParseInt(this.Ctx.Input.Header("x-mmm-uid"), 10, 64)
  64 + }
57 return userid 65 return userid
58 } 66 }
59 67
@@ -31,9 +31,9 @@ func (this *BulletinController) BulletinRelease() { @@ -31,9 +31,9 @@ func (this *BulletinController) BulletinRelease() {
31 msg = protocol.BadRequestParam("1") 31 msg = protocol.BadRequestParam("1")
32 return 32 return
33 } 33 }
34 - if request.Type != 1 || request.Type != 2 { 34 + if !(request.Type == 1 || request.Type == 2) {
35 msg = protocol.BadRequestParam("1") 35 msg = protocol.BadRequestParam("1")
36 - log.Error("type error :", request.Type) 36 + log.Error("type error :%v", request.Type)
37 return 37 return
38 } 38 }
39 if b, m := this.Valid(request); !b { 39 if b, m := this.Valid(request); !b {
@@ -79,15 +79,15 @@ func (this *BulletinController) GetBulletin() { @@ -79,15 +79,15 @@ func (this *BulletinController) GetBulletin() {
79 this.ResposeJson(msg) 79 this.ResposeJson(msg)
80 }() 80 }()
81 var request *protocol.GetBulletinRequest 81 var request *protocol.GetBulletinRequest
82 - if err := json.Unmarshal(this.Ctx.Input.RequestBody, &request); err != nil {  
83 - log.Error("json 解析失败", err)  
84 - msg = protocol.BadRequestParam("1")  
85 - return  
86 - }  
87 - if b, m := this.Valid(request); !b {  
88 - msg = m  
89 - return  
90 - } 82 + //if err := json.Unmarshal(this.Ctx.Input.RequestBody, &request); err != nil {
  83 + // log.Error("json 解析失败", err)
  84 + // msg = protocol.BadRequestParam("1")
  85 + // return
  86 + //}
  87 + //if b, m := this.Valid(request); !b {
  88 + // msg = m
  89 + // return
  90 + //}
91 param := this.Ctx.Input.Param(":id") 91 param := this.Ctx.Input.Param(":id")
92 id, _ := strconv.ParseInt(param, 10, 64) 92 id, _ := strconv.ParseInt(param, 10, 64)
93 if id == 0 { 93 if id == 0 {
@@ -2,6 +2,7 @@ package middleware @@ -2,6 +2,7 @@ package middleware
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "github.com/astaxie/beego"
5 "oppmg/common/log" 6 "oppmg/common/log"
6 "oppmg/protocol" 7 "oppmg/protocol"
7 serveauth "oppmg/services/auth" 8 serveauth "oppmg/services/auth"
@@ -55,6 +56,9 @@ var LogRequestData = func(ctx *context.Context) { @@ -55,6 +56,9 @@ var LogRequestData = func(ctx *context.Context) {
55 //AuthToken Before Router 56 //AuthToken Before Router
56 var AuthToken = func(ctx *context.Context) { 57 var AuthToken = func(ctx *context.Context) {
57 log.Debug("执行中间件AuthToken") 58 log.Debug("执行中间件AuthToken")
  59 + if beego.BConfig.RunMode != "prod" {
  60 + return
  61 + }
58 var ( 62 var (
59 storetoken redisdata.RedisLoginToken 63 storetoken redisdata.RedisLoginToken
60 msg *protocol.ResponseMessage 64 msg *protocol.ResponseMessage
@@ -83,14 +83,14 @@ func DeleteBulletin(id int) (err error) { @@ -83,14 +83,14 @@ func DeleteBulletin(id int) (err error) {
83 } 83 }
84 84
85 func GetBulletins(companyId int64, status int8, page, pageSize int) (v []*Bulletin, total int, err error) { 85 func GetBulletins(companyId int64, status int8, page, pageSize int) (v []*Bulletin, total int, err error) {
86 - sql := "select * from bulletin where (status=? or ?==0) and company_id =? order by create_at desc limit ?,?" 86 + sql := "select * from bulletin where (status=? or ?=0) and company_id =? order by create_at desc limit ?,?"
87 o := orm.NewOrm() 87 o := orm.NewOrm()
88 - if _, err = o.Raw(sql, status, companyId, page-1, pageSize).QueryRows(&v); err != nil { 88 + if _, err = o.Raw(sql, status, status, companyId, page-1, pageSize).QueryRows(&v); err != nil {
89 return 89 return
90 } 90 }
91 91
92 - sqlTotal := "select count(1) from bulletin where (status=? or ?==0) and company_id =?"  
93 - if _, err = o.Raw(sqlTotal, status, companyId).QueryRows(&total); err != nil { 92 + sqlTotal := "select count(1) from bulletin where (status=? or ?=0) and company_id =?"
  93 + if err = o.Raw(sqlTotal, status, status, companyId).QueryRow(&total); err != nil {
94 return 94 return
95 } 95 }
96 return 96 return
@@ -15,8 +15,6 @@ type BulletinQuestion struct { @@ -15,8 +15,6 @@ type BulletinQuestion struct {
15 Content string `orm:"column(content);size(2000);null" description:"内容"` 15 Content string `orm:"column(content);size(2000);null" description:"内容"`
16 CreateAt time.Time `orm:"column(create_at);type(timestamp);null" description:"创建时间"` 16 CreateAt time.Time `orm:"column(create_at);type(timestamp);null" description:"创建时间"`
17 UpdateAt time.Time `orm:"column(update_at);type(timestamp);null" description:"更新时间"` 17 UpdateAt time.Time `orm:"column(update_at);type(timestamp);null" description:"更新时间"`
18 - MustRead int8 `orm:"column(must_read);null" description:"公告内容看完才可以关闭 1:是 0:否"`  
19 - MustAnswer int8 `orm:"column(must_answer);null" description:"回答完问题才可以关闭 1:是 0:否"`  
20 } 18 }
21 19
22 func (t *BulletinQuestion) TableName() string { 20 func (t *BulletinQuestion) TableName() string {
@@ -110,7 +110,7 @@ func getUserNameByIds(ids []int64) ([]User, error) { @@ -110,7 +110,7 @@ func getUserNameByIds(ids []int64) ([]User, error) {
110 o := orm.NewOrm() 110 o := orm.NewOrm()
111 _, err = o.QueryTable(&User{}). 111 _, err = o.QueryTable(&User{}).
112 Filter("id__in", ids). 112 Filter("id__in", ids).
113 - Filter("delete_at", time.Unix(0, 0)).All(&users) 113 + Filter("delete_at", 0).All(&users)
114 114
115 if err == orm.ErrNoRows { 115 if err == orm.ErrNoRows {
116 return users, nil 116 return users, nil
1 package protocol 1 package protocol
2 2
  3 +const (
  4 + BulletinUnRelease = 1 //下架
  5 + BulletinRelease = 2 //上架
  6 +)
  7 +
  8 +const (
  9 + QuestionSingleSelect = 0 //单选
  10 + QuestionMultiSelect = 1 //多选
  11 +)
  12 +
3 /*BulletinRelease */ 13 /*BulletinRelease */
4 type BulletinReleaseRequest struct { 14 type BulletinReleaseRequest struct {
5 Id int `json:"id"` 15 Id int `json:"id"`
@@ -20,11 +30,11 @@ type Question struct { @@ -20,11 +30,11 @@ type Question struct {
20 Content []QuestionContent `json:"content" valid:"Required"` 30 Content []QuestionContent `json:"content" valid:"Required"`
21 } 31 }
22 type QuestionContent struct { 32 type QuestionContent struct {
23 - Id int  
24 - Content string 33 + Id int `json:"id" valid:"Required"`
  34 + Content string `json:"content" valid:"Required"`
25 } 35 }
26 type Cover struct { 36 type Cover struct {
27 - Path string `json:"path"` 37 + Path string `json:"path" valid:"Required"`
28 H int `json:"h"` 38 H int `json:"h"`
29 W int `json:"w"` 39 W int `json:"w"`
30 } 40 }
@@ -43,28 +53,33 @@ type BulletinListResponse struct { @@ -43,28 +53,33 @@ type BulletinListResponse struct {
43 } 53 }
44 54
45 type BulletinItem struct { 55 type BulletinItem struct {
46 - Id int `json:"id"`  
47 - Type int8 `json:"type"`  
48 - Title string `json:"title"`  
49 - Status int8 `json:"status"`  
50 - Receiver []string `json:"receiver" valid:"Required"`  
51 - CreateAt string `json:"time"` 56 + Id int `json:"id"`
  57 + Type int8 `json:"type"`
  58 + Title string `json:"title"`
  59 + Status int8 `json:"status"`
  60 + Receiver []Receiver `json:"receiver" valid:"Required"`
  61 + CreateAt string `json:"time"`
52 } 62 }
53 63
54 /*GetBulletin */ 64 /*GetBulletin */
55 type GetBulletinRequest struct { 65 type GetBulletinRequest struct {
56 } 66 }
57 type GetBulletinResponse struct { 67 type GetBulletinResponse struct {
58 - Id int `json:"id"`  
59 - Type int `json:"type" valid:"Required"`  
60 - Title string `json:"title" valid:"Required"`  
61 - Content string `json:"content" valid:"Required"`  
62 - AllowClose int `json:"allow_close"`  
63 - AllowCondition int `json:"allow_condition"`  
64 - QuestionSwitch int `json:"question_switch"`  
65 - Receiver []string `json:"receiver" valid:"Required"`  
66 - Question Question `json:"question"`  
67 - Cover Cover `json:"cover" valid:"Required"` 68 + Id int `json:"id"`
  69 + Type int `json:"type" valid:"Required"`
  70 + Title string `json:"title" valid:"Required"`
  71 + Content string `json:"content" valid:"Required"`
  72 + AllowClose int `json:"allow_close"`
  73 + AllowCondition int `json:"allow_condition"`
  74 + QuestionSwitch int `json:"question_switch"`
  75 + Receiver []Receiver `json:"receiver" valid:"Required"`
  76 + Question Question `json:"question"`
  77 + Cover Cover `json:"cover" valid:"Required"`
  78 +}
  79 +
  80 +type Receiver struct {
  81 + Id int64 `json:"id"`
  82 + NickName string `json:"name"`
68 } 83 }
69 84
70 /*UpdateBulletin */ 85 /*UpdateBulletin */
@@ -38,10 +38,10 @@ func init() { @@ -38,10 +38,10 @@ func init() {
38 beego.NSRouter("/refresh_token", &controllers.AuthController{}, "get:RefreshToken"), 38 beego.NSRouter("/refresh_token", &controllers.AuthController{}, "get:RefreshToken"),
39 ), 39 ),
40 beego.NSNamespace("/bulletin", 40 beego.NSNamespace("/bulletin",
41 - beego.NSRouter("/release", &controllers.BulletinController{}, "post:BulletinRelease"), 41 + beego.NSRouter("/add", &controllers.BulletinController{}, "post:BulletinRelease"),
42 beego.NSRouter("/list", &controllers.BulletinController{}, "post:BulletinList"), 42 beego.NSRouter("/list", &controllers.BulletinController{}, "post:BulletinList"),
43 beego.NSRouter("/:id([0-9]+)", &controllers.BulletinController{}, "get:GetBulletin"), 43 beego.NSRouter("/:id([0-9]+)", &controllers.BulletinController{}, "get:GetBulletin"),
44 - beego.NSRouter("/update", &controllers.BulletinController{}, "get:UpdateBulletin"), 44 + beego.NSRouter("/update", &controllers.BulletinController{}, "post:UpdateBulletin"),
45 ), 45 ),
46 ) 46 )
47 47
@@ -37,6 +37,7 @@ func BulletinRelease(uid, companyId int64, request *protocol.BulletinReleaseRequ @@ -37,6 +37,7 @@ func BulletinRelease(uid, companyId int64, request *protocol.BulletinReleaseRequ
37 CompanyId: companyId, 37 CompanyId: companyId,
38 CreateAt: time.Now(), 38 CreateAt: time.Now(),
39 UpdateAt: time.Now(), 39 UpdateAt: time.Now(),
  40 + Status: protocol.BulletinUnRelease,
40 } 41 }
41 42
42 orm := orm2.NewOrm() 43 orm := orm2.NewOrm()
@@ -55,6 +56,11 @@ func BulletinRelease(uid, companyId int64, request *protocol.BulletinReleaseRequ @@ -55,6 +56,11 @@ func BulletinRelease(uid, companyId int64, request *protocol.BulletinReleaseRequ
55 log.Error(err.Error()) 56 log.Error(err.Error())
56 return 57 return
57 } 58 }
  59 + if !(request.Question.Type == protocol.QuestionSingleSelect || request.Question.Type == protocol.QuestionMultiSelect) {
  60 + err = protocol.NewErrWithMessage("1")
  61 + log.Error("BulletinRelease:Question.Type error:%v", request.Question.Type)
  62 + return
  63 + }
58 bulletinQuestion = &models.BulletinQuestion{ 64 bulletinQuestion = &models.BulletinQuestion{
59 BulletinId: int(id), 65 BulletinId: int(id),
60 Type: int8(request.Question.Type), 66 Type: int8(request.Question.Type),
@@ -86,6 +92,7 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) ( @@ -86,6 +92,7 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) (
86 if request.PageSize == 0 { 92 if request.PageSize == 0 {
87 request.PageSize = 20 93 request.PageSize = 20
88 } 94 }
  95 + rsp = &protocol.BulletinListResponse{}
89 if list, total, err = models.GetBulletins(companyId, request.Status, request.Page, request.PageSize); err != nil { 96 if list, total, err = models.GetBulletins(companyId, request.Status, request.Page, request.PageSize); err != nil {
90 log.Error(err.Error()) 97 log.Error(err.Error())
91 return 98 return
@@ -93,16 +100,14 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) ( @@ -93,16 +100,14 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) (
93 if len(list) == 0 { 100 if len(list) == 0 {
94 return 101 return
95 } 102 }
96 - rsp = &protocol.BulletinListResponse{} 103 + rsp.Total = total
97 for i := range list { 104 for i := range list {
98 bulletin := list[i] 105 bulletin := list[i]
99 item := &protocol.BulletinItem{ 106 item := &protocol.BulletinItem{
100 - Id: bulletin.Id,  
101 - Type: bulletin.Type,  
102 - Title: bulletin.Title,  
103 - Status: int8(bulletin.Status),  
104 - //TODO:user  
105 - Receiver: []string{}, 107 + Id: bulletin.Id,
  108 + Type: bulletin.Type,
  109 + Title: bulletin.Title,
  110 + Status: int8(bulletin.Status),
106 CreateAt: bulletin.CreateAt.Format("2006-01-02 15:04:05"), 111 CreateAt: bulletin.CreateAt.Format("2006-01-02 15:04:05"),
107 } 112 }
108 if item.Receiver, err = getUsersName(bulletin.Receiver); err != nil { 113 if item.Receiver, err = getUsersName(bulletin.Receiver); err != nil {
@@ -111,7 +116,7 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) ( @@ -111,7 +116,7 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) (
111 } 116 }
112 rsp.List = append(rsp.List, item) 117 rsp.List = append(rsp.List, item)
113 } 118 }
114 - rsp.Total = total 119 +
115 return 120 return
116 } 121 }
117 122
@@ -131,13 +136,16 @@ func getUsers(idsstr string) (v []models.User, err error) { @@ -131,13 +136,16 @@ func getUsers(idsstr string) (v []models.User, err error) {
131 return models.GetUserNameByIds(ids) 136 return models.GetUserNameByIds(ids)
132 } 137 }
133 138
134 -func getUsersName(idsStr string) (v []string, err error) { 139 +func getUsersName(idsStr string) (v []protocol.Receiver, err error) {
135 var users []models.User 140 var users []models.User
136 if users, err = getUsers(idsStr); err != nil { 141 if users, err = getUsers(idsStr); err != nil {
137 return 142 return
138 } 143 }
139 for i := range users { 144 for i := range users {
140 - v = append(v, users[i].NickName) 145 + v = append(v, protocol.Receiver{
  146 + Id: users[i].Id,
  147 + NickName: users[i].NickName,
  148 + })
141 } 149 }
142 return 150 return
143 } 151 }
@@ -178,6 +186,7 @@ func GetBulletin(id int, companyId int64, request *protocol.GetBulletinRequest) @@ -178,6 +186,7 @@ func GetBulletin(id int, companyId int64, request *protocol.GetBulletinRequest)
178 } 186 }
179 rsp.QuestionSwitch = int(bulletin.QuestionSwitch) 187 rsp.QuestionSwitch = int(bulletin.QuestionSwitch)
180 rsp.Question = protocol.Question{ 188 rsp.Question = protocol.Question{
  189 + Id: question.Id,
181 Type: int(question.Type), 190 Type: int(question.Type),
182 Title: question.Title, 191 Title: question.Title,
183 } 192 }
@@ -238,12 +247,18 @@ func UpdateBulletin(companyId int64, request *protocol.UpdateBulletinRequest) (r @@ -238,12 +247,18 @@ func UpdateBulletin(companyId int64, request *protocol.UpdateBulletinRequest) (r
238 log.Error(err.Error()) 247 log.Error(err.Error())
239 return 248 return
240 } 249 }
  250 + if bulletinQuestion.BulletinId != bulletin.Id {
  251 + err = protocol.NewErrWithMessage("1")
  252 + log.Error("UpdateBulletin:BulletinId not equal:(%v!=%v)", bulletinQuestion.BulletinId, bulletin.Id)
  253 + return
  254 + }
241 if questionContent, err = json.Marshal(request.Question.Content); err != nil { 255 if questionContent, err = json.Marshal(request.Question.Content); err != nil {
242 log.Error(err.Error()) 256 log.Error(err.Error())
243 return 257 return
244 } 258 }
245 bulletinQuestion.Content = string(questionContent) 259 bulletinQuestion.Content = string(questionContent)
246 bulletinQuestion.Type = int8(request.Question.Type) 260 bulletinQuestion.Type = int8(request.Question.Type)
  261 + bulletinQuestion.UpdateAt = time.Now()
247 if err = models.UpdateBulletinQuestionById(bulletinQuestion); err != nil { 262 if err = models.UpdateBulletinQuestionById(bulletinQuestion); err != nil {
248 log.Error(err.Error()) 263 log.Error(err.Error())
249 return 264 return
@@ -144,3 +144,237 @@ token 的响应内容 @@ -144,3 +144,237 @@ token 的响应内容
144 - 备注:切换公司实际是变更 token 信息 144 - 备注:切换公司实际是变更 token 信息
145 145
146 --- 146 ---
  147 +
  148 +
  149 +## 公告
  150 +
  151 +### 添加公告
  152 +
  153 +- 请求路径 :/v1/bulletin/add
  154 +- 请求方式 :post
  155 +- 请求 json:
  156 +
  157 +```json
  158 +{
  159 + "type":2,
  160 + "title":"标题",
  161 + "content":"公告内容",
  162 + "allow_close":0,
  163 + "allow_condition":3,
  164 + "question_switch":1,
  165 + "receiver":["1","2"],
  166 + "question":
  167 + {
  168 + "id":1,
  169 + "type":1,
  170 + "title":"今天星期几?",
  171 + "content":[
  172 + {
  173 + "id":1,
  174 + "content":"星期1"
  175 + },
  176 + {
  177 + "id":2,
  178 + "content":"星期2"
  179 + }
  180 + ]
  181 + },
  182 + "cover":{
  183 + "path":"/xx/xx.img",
  184 + "w":50,
  185 + "h":70
  186 + }
  187 +}
  188 +```
  189 +
  190 +```
  191 +obj.type 公告类型(1图+跳转链接、2纯文本)
  192 +obj.title 标题
  193 +obj.content 公告内容
  194 +obj.allow_close 允许关闭公告(0允许,1禁止)
  195 +obj.allow_condition 关闭条件 (1(bit 0):公告内容查看完 2(bit 1):回答完问题)
  196 +obj.question_switch 设置问题开关 (是否有问题) 1:是 0:否
  197 +obj.receiver 接收者
  198 +obj.question.type 类型:0-单选,1-多选
  199 +obj.question.title 标题
  200 +obj.question.content 问题选项
  201 +obj.cover 封面
  202 +```
  203 +
  204 +- 响应 json
  205 +
  206 +```json
  207 +{
  208 + "code": "00000",
  209 + "msg": "成功",
  210 + "data": {}
  211 +}
  212 +```
  213 +
  214 +---
  215 +
  216 +
  217 +### 公告列表
  218 +
  219 +- 请求路径 :/v1/bulletin/list
  220 +- 请求方式 :post
  221 +- 请求 json:
  222 +
  223 +```json
  224 +{
  225 + "page":1,
  226 + "page_size":20,
  227 + "status":0
  228 +}
  229 +```
  230 +
  231 +```
  232 +obj.status 状态 0-所有 1-下架 2-上架
  233 +```
  234 +
  235 +- 响应 json
  236 +
  237 +```json
  238 +{
  239 + "code": "00000",
  240 + "msg": "成功",
  241 + "data": {
  242 + "list": [
  243 + {
  244 + "id": 5,
  245 + "type": 2,
  246 + "title": "测试公告",
  247 + "status": 1,
  248 + "receiver": [
  249 + {
  250 + "id": 1,
  251 + "name": "Jennifer Clark"
  252 + },
  253 + {
  254 + "id": 2,
  255 + "name": "邓娱婷1208"
  256 + }
  257 + ],
  258 + "time": "2019-12-11 17:11:43"
  259 + }
  260 + ],
  261 + "Total": 2
  262 + }
  263 +}
  264 +```
  265 +
  266 +
  267 +### 公告详情
  268 +
  269 +- 请求路径 :/v1/bulletin/:id
  270 +- 请求方式 :get
  271 +- 请求 json:
  272 +
  273 +```json
  274 +{
  275 +}
  276 +```
  277 +
  278 +```
  279 +obj.status 状态 0-所有 1-下架 2-上架
  280 +```
  281 +
  282 +- 响应 json
  283 +
  284 +```json
  285 +{
  286 + "code": "00000",
  287 + "msg": "成功",
  288 + "data": {
  289 + "id": 5,
  290 + "type": 2,
  291 + "title": "测试公告",
  292 + "content": "今天发布了一则公告",
  293 + "allow_close": 0,
  294 + "allow_condition": 3,
  295 + "question_switch": 1,
  296 + "receiver": [
  297 + {
  298 + "id": 1,
  299 + "name": "Jennifer Clark"
  300 + },
  301 + {
  302 + "id": 2,
  303 + "name": "邓娱婷1208"
  304 + }
  305 + ],
  306 + "question": {
  307 + "id": 4,
  308 + "type": 1,
  309 + "title": "今天星期几?",
  310 + "content": [
  311 + {
  312 + "id": 1,
  313 + "content": "星期1"
  314 + },
  315 + {
  316 + "id": 2,
  317 + "content": "星期2"
  318 + }
  319 + ]
  320 + },
  321 + "cover": {
  322 + "path": "/xx/xx.img",
  323 + "h": 70,
  324 + "w": 50
  325 + }
  326 + }
  327 +}
  328 +```
  329 +
  330 +
  331 +### 公告更新
  332 +
  333 +- 请求路径 :/v1/bulletin/update
  334 +- 请求方式 :post
  335 +- 请求 json:
  336 +
  337 +```json
  338 +{
  339 + "id":3,
  340 + "type":2,
  341 + "title":"测试公告3",
  342 + "content":"今天发布了一则公告3",
  343 + "allow_close":0,
  344 + "allow_condition":2,
  345 + "question_switch":1,
  346 + "receiver":["1","2","3"],
  347 + "question":
  348 + {
  349 + "id":2,
  350 + "type":1,
  351 + "title":"今天星期几?",
  352 + "content":[
  353 + {
  354 + "id":1,
  355 + "content":"星期2"
  356 + },
  357 + {
  358 + "id":2,
  359 + "content":"星期3"
  360 + }
  361 + ]
  362 + },
  363 + "cover":{
  364 + "path":"/xx/xx.img",
  365 + "w":50,
  366 + "h":70
  367 + }
  368 +}
  369 +```
  370 +
  371 +- 响应 json
  372 +
  373 +```json
  374 +{
  375 + "code": "00000",
  376 + "msg": "成功",
  377 + "data": null
  378 +}
  379 +```
  380 +