作者 tangxvhui

。。

@@ -36,6 +36,7 @@ ucenter_secret = "cykbjnfqgctn" @@ -36,6 +36,7 @@ ucenter_secret = "cykbjnfqgctn"
36 file_save_path = "/var/www/opp/file" 36 file_save_path = "/var/www/opp/file"
37 file_host = "http://mmm-oppmg-dev.fjmaimaimai.com" 37 file_host = "http://mmm-oppmg-dev.fjmaimaimai.com"
38 file_host_path = "/file/opp" 38 file_host_path = "/file/opp"
  39 +
39 # 审批流程修改 消息发布 40 # 审批流程修改 消息发布
40 message_publish = "audit_change" 41 message_publish = "audit_change"
41 #---自定义配置 结束---- 42 #---自定义配置 结束----
@@ -13,6 +13,7 @@ import ( @@ -13,6 +13,7 @@ import (
13 "github.com/GeeTeam/gt3-golang-sdk/geetest" 13 "github.com/GeeTeam/gt3-golang-sdk/geetest"
14 ) 14 )
15 15
  16 +//AuthController 授权认证相关
16 type AuthController struct { 17 type AuthController struct {
17 BaseController 18 BaseController
18 } 19 }
@@ -83,7 +84,7 @@ func (c *AuthController) Login() { @@ -83,7 +84,7 @@ func (c *AuthController) Login() {
83 } 84 }
84 85
85 // LoginSms 登录 86 // LoginSms 登录
86 -// @router /login [post] 87 +// @router /login_sms [post]
87 func (c *AuthController) LoginSms() { 88 func (c *AuthController) LoginSms() {
88 var msg *protocol.ResponseMessage 89 var msg *protocol.ResponseMessage
89 defer func() { 90 defer func() {
@@ -7,6 +7,7 @@ import ( @@ -7,6 +7,7 @@ import (
7 "oppmg/services/bulletin" 7 "oppmg/services/bulletin"
8 ) 8 )
9 9
  10 +//BulletinController 公告
10 type BulletinController struct { 11 type BulletinController struct {
11 BaseController 12 BaseController
12 } 13 }
@@ -2,6 +2,7 @@ package controllers @@ -2,6 +2,7 @@ package controllers
2 2
3 import ( 3 import (
4 "encoding/json" 4 "encoding/json"
  5 + "oppmg/common/config"
5 "oppmg/common/log" 6 "oppmg/common/log"
6 "oppmg/protocol" 7 "oppmg/protocol"
7 servecommon "oppmg/services/common" 8 servecommon "oppmg/services/common"
@@ -97,6 +98,8 @@ func (c *CommonController) SelectorPosition() { @@ -97,6 +98,8 @@ func (c *CommonController) SelectorPosition() {
97 return 98 return
98 } 99 }
99 100
  101 +//SelectorUserAndDepart 下拉列表 -用户部门混合
  102 +//@router /user_and_department [post]
100 func (c *CommonController) SelectorUserAndDepart() { 103 func (c *CommonController) SelectorUserAndDepart() {
101 var msg *protocol.ResponseMessage 104 var msg *protocol.ResponseMessage
102 defer func() { 105 defer func() {
@@ -116,3 +119,40 @@ func (c *CommonController) SelectorUserAndDepart() { @@ -116,3 +119,40 @@ func (c *CommonController) SelectorUserAndDepart() {
116 msg = protocol.NewReturnResponse(departs, err) 119 msg = protocol.NewReturnResponse(departs, err)
117 return 120 return
118 } 121 }
  122 +
  123 +//DefaultImage 获取默认图片
  124 +//@router /default_image
  125 +func (c *CommonController) DefaultImage() {
  126 + var msg *protocol.ResponseMessage
  127 + defer func() {
  128 + c.ResposeJson(msg)
  129 + }()
  130 + type Parameter struct {
  131 + CmdType int64 `json:"cmd_type"`
  132 + }
  133 + var param Parameter
  134 + if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
  135 + log.Error("json 解析失败 err:%s", err)
  136 + msg = protocol.BadRequestParam("1")
  137 + return
  138 + }
  139 + imgehost := config.MConfig.FileHost + "/static/chance_template"
  140 + imageNames := []string{}
  141 + switch param.CmdType {
  142 + case 1:
  143 + //返回机会分类的图标
  144 + imageNames = []string{
  145 + imgehost + "/图片1.jpg",
  146 + }
  147 + case 2:
  148 + //返回机会模板的图标
  149 + imageNames = []string{
  150 + imgehost + "/图片1.jpg",
  151 + }
  152 + }
  153 + data := map[string][]string{
  154 + "urls": imageNames,
  155 + }
  156 + msg = protocol.NewReturnResponse(data, nil)
  157 + return
  158 +}
@@ -9,6 +9,7 @@ import ( @@ -9,6 +9,7 @@ import (
9 "strings" 9 "strings"
10 ) 10 )
11 11
  12 +// CompanyController 公司基础数据设置
12 type CompanyController struct { 13 type CompanyController struct {
13 BaseController 14 BaseController
14 } 15 }
@@ -518,8 +519,10 @@ func (c *CompanyController) DepartmentUser() { @@ -518,8 +519,10 @@ func (c *CompanyController) DepartmentUser() {
518 msg = protocol.BadRequestParam("1") 519 msg = protocol.BadRequestParam("1")
519 return 520 return
520 } 521 }
  522 +
521 companyid := c.GetCompanyId() 523 companyid := c.GetCompanyId()
522 resultdata, err := servecompany.GetDepartmentUser(companyid, param.DepartmentId) 524 resultdata, err := servecompany.GetDepartmentUser(companyid, param.DepartmentId)
  525 +
523 msg = protocol.NewReturnResponse(resultdata, err) 526 msg = protocol.NewReturnResponse(resultdata, err)
524 return 527 return
525 } 528 }
@@ -8,6 +8,7 @@ import ( @@ -8,6 +8,7 @@ import (
8 serverbac "oppmg/services/rbac" 8 serverbac "oppmg/services/rbac"
9 ) 9 )
10 10
  11 +// RbacController 角色权限
11 type RbacController struct { 12 type RbacController struct {
12 BaseController 13 BaseController
13 } 14 }
@@ -7,6 +7,7 @@ import ( @@ -7,6 +7,7 @@ import (
7 "oppmg/services/audit" 7 "oppmg/services/audit"
8 ) 8 )
9 9
  10 +//TemplateController 机会模板
10 type TemplateController struct { 11 type TemplateController struct {
11 BaseController 12 BaseController
12 } 13 }
@@ -41,7 +41,6 @@ var AuthToken = func(ctx *context.Context) { @@ -41,7 +41,6 @@ var AuthToken = func(ctx *context.Context) {
41 accesstoken := ctx.Input.Header(protocol.HeaderAccessToken) 41 accesstoken := ctx.Input.Header(protocol.HeaderAccessToken)
42 //解出需要的jwt串 例:头【Authorization】:Bearer 123token456 42 //解出需要的jwt串 例:头【Authorization】:Bearer 123token456
43 s := strings.Split(accesstoken, "\u0020") 43 s := strings.Split(accesstoken, "\u0020")
44 - // strings.TrimSpace()  
45 if len(s) > 0 { 44 if len(s) > 0 {
46 accesstoken = s[len(s)-1] 45 accesstoken = s[len(s)-1]
47 } 46 }
@@ -66,8 +65,10 @@ var AuthToken = func(ctx *context.Context) { @@ -66,8 +65,10 @@ var AuthToken = func(ctx *context.Context) {
66 return 65 return
67 } 66 }
68 } 67 }
  68 + redisdata.RefreshLoginTokenExpires(mtoken.UID, mtoken.CompanyID)
69 ctx.Input.SetData(protocol.HeaderCompanyid, mtoken.CompanyID) 69 ctx.Input.SetData(protocol.HeaderCompanyid, mtoken.CompanyID)
70 ctx.Input.SetData(protocol.HeaderUserid, mtoken.UID) 70 ctx.Input.SetData(protocol.HeaderUserid, mtoken.UID)
  71 +
71 return 72 return
72 } 73 }
73 if ok := serveauth.IsJwtErrorExpired(err); ok { 74 if ok := serveauth.IsJwtErrorExpired(err); ok {
@@ -34,8 +34,8 @@ type ResponseLogin struct { @@ -34,8 +34,8 @@ type ResponseLogin struct {
34 type LoginAuthToken struct { 34 type LoginAuthToken struct {
35 AccessToken string `json:"access_token"` 35 AccessToken string `json:"access_token"`
36 ExpiresIn int64 `json:"expires_in"` 36 ExpiresIn int64 `json:"expires_in"`
37 - RefreshToken string `json:"refresh_token"`  
38 - RefreshExpires int64 `json:"refresh_expires"` 37 + // RefreshToken string `json:"refresh_token"`
  38 + // RefreshExpires int64 `json:"refresh_expires"`
39 } 39 }
40 40
41 //RequestSwapCompany 切换公司 41 //RequestSwapCompany 切换公司
@@ -71,6 +71,7 @@ func init() { @@ -71,6 +71,7 @@ func init() {
71 beego.NSRouter("/role", &controllers.CommonController{}, "post:SelectorRole"), 71 beego.NSRouter("/role", &controllers.CommonController{}, "post:SelectorRole"),
72 beego.NSRouter("/position", &controllers.CommonController{}, "post:SelectorPosition"), 72 beego.NSRouter("/position", &controllers.CommonController{}, "post:SelectorPosition"),
73 beego.NSRouter("/user_and_department", &controllers.CommonController{}, "post:SelectorUserAndDepart"), 73 beego.NSRouter("/user_and_department", &controllers.CommonController{}, "post:SelectorUserAndDepart"),
  74 + beego.NSRouter("/default_image", &controllers.CommonController{}, "post:DefaultImage"),
74 ), 75 ),
75 beego.NSNamespace("/template", 76 beego.NSNamespace("/template",
76 beego.NSRouter("/add", &controllers.TemplateController{}, "post:TemplateAdd"), 77 beego.NSRouter("/add", &controllers.TemplateController{}, "post:TemplateAdd"),
@@ -60,8 +60,6 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error { @@ -60,8 +60,6 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error {
60 CurrentCompanyId: companyid, 60 CurrentCompanyId: companyid,
61 AccessToken: loginToken.AccessToken, 61 AccessToken: loginToken.AccessToken,
62 AccessTokenExp: time.Unix(loginToken.ExpiresIn, 0), //, 62 AccessTokenExp: time.Unix(loginToken.ExpiresIn, 0), //,
63 - RefreshToken: loginToken.RefreshToken,  
64 - RefreshTokenExp: time.Unix(loginToken.RefreshExpires, 0),  
65 CreateAt: nowTime, 63 CreateAt: nowTime,
66 UpdateAt: nowTime, 64 UpdateAt: nowTime,
67 DeviceType: models.DEVICE_TYPE_WEB, 65 DeviceType: models.DEVICE_TYPE_WEB,
@@ -77,10 +75,8 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error { @@ -77,10 +75,8 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error {
77 uAuth.CurrentCompanyId = companyid 75 uAuth.CurrentCompanyId = companyid
78 uAuth.AccessToken = loginToken.AccessToken 76 uAuth.AccessToken = loginToken.AccessToken
79 uAuth.AccessTokenExp = time.Unix(loginToken.ExpiresIn, 0) 77 uAuth.AccessTokenExp = time.Unix(loginToken.ExpiresIn, 0)
80 - uAuth.RefreshToken = loginToken.RefreshToken  
81 - uAuth.RefreshTokenExp = time.Unix(loginToken.RefreshExpires, 0)  
82 uAuth.UpdateAt = nowTime 78 uAuth.UpdateAt = nowTime
83 - upCol := []string{"CurrentCompanyId", "AccessTokenExp", "RefreshTokenExp", "AccessToken", "RefreshToken", "RefreshTokenExp", "UpdateAt"} 79 + upCol := []string{"CurrentCompanyId", "AccessTokenExp", "RefreshTokenExp", "AccessToken", "UpdateAt"}
84 if err = models.UpdateUserAuthById(uAuth, upCol); err != nil { 80 if err = models.UpdateUserAuthById(uAuth, upCol); err != nil {
85 e := fmt.Errorf("UpdateUserAuthById err:%s", err) 81 e := fmt.Errorf("UpdateUserAuthById err:%s", err)
86 log.Error(e.Error()) 82 log.Error(e.Error())
@@ -68,9 +68,9 @@ func GenerateAuthToken(uid int64, companyid int64) (protocol.LoginAuthToken, err @@ -68,9 +68,9 @@ func GenerateAuthToken(uid int64, companyid int64) (protocol.LoginAuthToken, err
68 var ( 68 var (
69 authToken protocol.LoginAuthToken 69 authToken protocol.LoginAuthToken
70 accesstoken string //主token,请求用 70 accesstoken string //主token,请求用
71 - expiresIn int64 = 60 * 60 * 2 //主token过期时间,30分钟  
72 - refreshtoken string //副token,刷新主token用  
73 - refreshExpires int64 = 60 * 60 * 2 //副token 过期时间 ,60分钟 71 + expiresIn int64 = 60 * 60 * 6 //主token过期时间,6小时
  72 + // refreshtoken string //副token,刷新主token用
  73 + // refreshExpires int64 = 60 * 60 * 2 //副token 过期时间 ,60分钟
74 err error 74 err error
75 nowtime = time.Now() 75 nowtime = time.Now()
76 ) 76 )
@@ -78,13 +78,13 @@ func GenerateAuthToken(uid int64, companyid int64) (protocol.LoginAuthToken, err @@ -78,13 +78,13 @@ func GenerateAuthToken(uid int64, companyid int64) (protocol.LoginAuthToken, err
78 if err != nil { 78 if err != nil {
79 return authToken, err 79 return authToken, err
80 } 80 }
81 - refreshtoken, err = CreateJWTToken(uid, companyid, nowtime.Unix()+refreshExpires+2)  
82 - if err != nil {  
83 - return authToken, err  
84 - } 81 + // refreshtoken, err = CreateJWTToken(uid, companyid, nowtime.Unix()+refreshExpires+2)
  82 + // if err != nil {
  83 + // return authToken, err
  84 + // }
85 authToken.AccessToken = accesstoken 85 authToken.AccessToken = accesstoken
86 authToken.ExpiresIn = nowtime.Unix() + expiresIn 86 authToken.ExpiresIn = nowtime.Unix() + expiresIn
87 - authToken.RefreshToken = refreshtoken  
88 - authToken.RefreshExpires = nowtime.Unix() + refreshExpires 87 + // authToken.RefreshToken = refreshtoken
  88 + // authToken.RefreshExpires = nowtime.Unix() + refreshExpires
89 return authToken, err 89 return authToken, err
90 } 90 }
@@ -337,7 +337,7 @@ func DepartmentDelete(param protocol.RequestDepartmentDelete) error { @@ -337,7 +337,7 @@ func DepartmentDelete(param protocol.RequestDepartmentDelete) error {
337 //DepartmentListAll 获取公司的部门 337 //DepartmentListAll 获取公司的部门
338 func DepartmentListAll(companyId int64) ([]protocol.ResponseDepartmentInfo, error) { 338 func DepartmentListAll(companyId int64) ([]protocol.ResponseDepartmentInfo, error) {
339 var ( 339 var (
340 - departs []protocol.ResponseDepartmentInfo 340 + departs = make([]protocol.ResponseDepartmentInfo, 0)
341 departmodels []*models.Department 341 departmodels []*models.Department
342 err error 342 err error
343 ) 343 )
@@ -349,7 +349,7 @@ func DepartmentListAll(companyId int64) ([]protocol.ResponseDepartmentInfo, erro @@ -349,7 +349,7 @@ func DepartmentListAll(companyId int64) ([]protocol.ResponseDepartmentInfo, erro
349 if err != nil { 349 if err != nil {
350 e := fmt.Errorf("EXECUTE SQL err:%s", err) 350 e := fmt.Errorf("EXECUTE SQL err:%s", err)
351 log.Error(e.Error()) 351 log.Error(e.Error())
352 - return nil, protocol.NewErrWithMessage("1", err) 352 + return departs, protocol.NewErrWithMessage("1", err)
353 } 353 }
354 for _, v := range departmodels { 354 for _, v := range departmodels {
355 cnt, err := models.CountUserDepartByDepart(v.Id) 355 cnt, err := models.CountUserDepartByDepart(v.Id)
@@ -378,7 +378,7 @@ func GetDepartmentUser(companyid int64, departmentid int64) ([]protocol.DepartUs @@ -378,7 +378,7 @@ func GetDepartmentUser(companyid int64, departmentid int64) ([]protocol.DepartUs
378 err error 378 err error
379 ) 379 )
380 var ( 380 var (
381 - returnData []protocol.DepartUserBase 381 + returnData = make([]protocol.DepartUserBase, 0)
382 ) 382 )
383 department, err = models.GetDepartmentById(departmentid) 383 department, err = models.GetDepartmentById(departmentid)
384 if err != nil { 384 if err != nil {
@@ -278,7 +278,7 @@ func GetPositionList(companyid int64) ([]protocol.ResponsePositionInfo, error) { @@ -278,7 +278,7 @@ func GetPositionList(companyid int64) ([]protocol.ResponsePositionInfo, error) {
278 ) 278 )
279 var ( 279 var (
280 err error 280 err error
281 - list []protocol.ResponsePositionInfo 281 + list = make([]protocol.ResponsePositionInfo, 0)
282 ) 282 )
283 err = utils.ExecuteQueryAll(&list, dataSql, companyid) 283 err = utils.ExecuteQueryAll(&list, dataSql, companyid)
284 if err != nil { 284 if err != nil {
@@ -15,7 +15,7 @@ func GetMenuAll() ([]protocol.PermissionItem, error) { @@ -15,7 +15,7 @@ func GetMenuAll() ([]protocol.PermissionItem, error) {
15 const datasql string = `SELECT id,name,icon,parent_id,senior_status,sort,code 15 const datasql string = `SELECT id,name,icon,parent_id,senior_status,sort,code
16 FROM menu WHERE enabled=1 ORDER BY sort ` 16 FROM menu WHERE enabled=1 ORDER BY sort `
17 var ( 17 var (
18 - list []protocol.PermissionItem 18 + list = make([]protocol.PermissionItem, 0)
19 err error 19 err error
20 ) 20 )
21 err = utils.ExecuteQueryAll(&list, datasql) 21 err = utils.ExecuteQueryAll(&list, datasql)
@@ -26,7 +26,6 @@ func GetMenuAll() ([]protocol.PermissionItem, error) { @@ -26,7 +26,6 @@ func GetMenuAll() ([]protocol.PermissionItem, error) {
26 return list, nil 26 return list, nil
27 } 27 }
28 28
29 -//  
30 func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus, error) { 29 func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus, error) {
31 var ( 30 var (
32 roleData *models.Role 31 roleData *models.Role
@@ -48,7 +47,7 @@ func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus, @@ -48,7 +47,7 @@ func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus,
48 } 47 }
49 var ( 48 var (
50 rolemenu []models.RoleMenu 49 rolemenu []models.RoleMenu
51 - ids []int64 50 + ids = make([]int64, 0)
52 ) 51 )
53 rolemenu, err = models.GetRoleMenuByRole(roleid) 52 rolemenu, err = models.GetRoleMenuByRole(roleid)
54 if err != nil { 53 if err != nil {
@@ -7,6 +7,7 @@ import ( @@ -7,6 +7,7 @@ import (
7 "oppmg/protocol" 7 "oppmg/protocol"
8 ) 8 )
9 9
  10 +//RequestUCenterLogin 调用用户中心进行账号密码登录
10 func RequestUCenterLogin(account, password string) (*ResponseLogin, error) { 11 func RequestUCenterLogin(account, password string) (*ResponseLogin, error) {
11 var uclientReturn *ResponseLogin 12 var uclientReturn *ResponseLogin
12 param := RequesLogin{ 13 param := RequesLogin{
@@ -32,6 +33,7 @@ func RequestUCenterLogin(account, password string) (*ResponseLogin, error) { @@ -32,6 +33,7 @@ func RequestUCenterLogin(account, password string) (*ResponseLogin, error) {
32 return uclientReturn, nil 33 return uclientReturn, nil
33 } 34 }
34 35
  36 +//RequestUCenterAddUser 调用用户中心进行注册用户
35 func RequestUCenterAddUser(phone string, nickname string, avatar string) (*ResponseAddUser, error) { 37 func RequestUCenterAddUser(phone string, nickname string, avatar string) (*ResponseAddUser, error) {
36 38
37 if len(avatar) <= 0 { 39 if len(avatar) <= 0 {
@@ -3,7 +3,6 @@ package ucenter @@ -3,7 +3,6 @@ package ucenter
3 import ( 3 import (
4 "encoding/json" 4 "encoding/json"
5 "errors" 5 "errors"
6 - "fmt"  
7 ) 6 )
8 7
9 //CommResponse 公共响应结构 8 //CommResponse 公共响应结构
@@ -42,6 +41,7 @@ func (r RequesLogin) Valid() error { @@ -42,6 +41,7 @@ func (r RequesLogin) Valid() error {
42 return nil 41 return nil
43 } 42 }
44 43
  44 +//ResponseLogin 登录响应返回
45 type ResponseLogin struct { 45 type ResponseLogin struct {
46 CommResponse 46 CommResponse
47 Data struct { 47 Data struct {
@@ -55,6 +55,7 @@ type ResponseLogin struct { @@ -55,6 +55,7 @@ type ResponseLogin struct {
55 } `json:"data"` 55 } `json:"data"`
56 } 56 }
57 57
  58 +//RequestAddUser 注册用户
58 type RequestAddUser struct { 59 type RequestAddUser struct {
59 Phone string `json:"phone"` 60 Phone string `json:"phone"`
60 RegIm int8 `json:"regIm"` 61 RegIm int8 `json:"regIm"`
@@ -99,34 +100,34 @@ type ResponseAddUser struct { @@ -99,34 +100,34 @@ type ResponseAddUser struct {
99 } `json:"data"` 100 } `json:"data"`
100 } 101 }
101 102
102 -type RequestCheckCompany struct {  
103 - CompanyId int64 `json:"company_id"`  
104 -}  
105 -  
106 -//Format 实现IUCenterParam接口  
107 -func (r RequestCheckCompany) Format() []byte {  
108 - return nil  
109 -}  
110 -  
111 -//Format 实现IUCenterParam接口  
112 -func (r RequestCheckCompany) GetPath() (string, string) {  
113 - return fmt.Sprintf("/company/%d", r.CompanyId), "GET"  
114 -}  
115 -  
116 -//Format 实现IUCenterParam接口  
117 -func (r RequestCheckCompany) Valid() error {  
118 - if r.CompanyId == 0 {  
119 - return errors.New("r.CompanyId == 0")  
120 - }  
121 - return nil  
122 -}  
123 -  
124 -type ResponseCheckCompany struct {  
125 - CommResponse  
126 - Data struct {  
127 - CompanyId int64 `json:"id"` //公司的id  
128 - CompanyName string `json:"name"` //公司的名称  
129 - AdminAccount string `json:"admin_account"` //主管账号  
130 - AdminName string `json:"admin_name"` //主管名称  
131 - } `json:"data"`  
132 -} 103 +// type RequestCheckCompany struct {
  104 +// CompanyId int64 `json:"company_id"`
  105 +// }
  106 +
  107 +// //Format 实现IUCenterParam接口
  108 +// func (r RequestCheckCompany) Format() []byte {
  109 +// return nil
  110 +// }
  111 +
  112 +// //Format 实现IUCenterParam接口
  113 +// func (r RequestCheckCompany) GetPath() (string, string) {
  114 +// return fmt.Sprintf("/company/%d", r.CompanyId), "GET"
  115 +// }
  116 +
  117 +// //Format 实现IUCenterParam接口
  118 +// func (r RequestCheckCompany) Valid() error {
  119 +// if r.CompanyId == 0 {
  120 +// return errors.New("r.CompanyId == 0")
  121 +// }
  122 +// return nil
  123 +// }
  124 +
  125 +// type ResponseCheckCompany struct {
  126 +// CommResponse
  127 +// Data struct {
  128 +// CompanyId int64 `json:"id"` //公司的id
  129 +// CompanyName string `json:"name"` //公司的名称
  130 +// AdminAccount string `json:"admin_account"` //主管账号
  131 +// AdminName string `json:"admin_name"` //主管名称
  132 +// } `json:"data"`
  133 +// }
  1 +# 用来存放业务需要并且长期使用的静态文件
  2 +# 文件
  3 +* avatar_default.png 用户默认头像
  4 +# 文件夹
  5 +* chance_template 存放机会模板默认的图标
1 package redisdata 1 package redisdata
2 2
3 -import "fmt" 3 +import (
  4 + "fmt"
  5 + "time"
  6 +)
4 7
5 const ( 8 const (
6 KEY_PREFIX string = "oppmg_" //统一前缀 9 KEY_PREFIX string = "oppmg_" //统一前缀
7 KEY_USER_TOKEN string = "token" //登录token存储 10 KEY_USER_TOKEN string = "token" //登录token存储
8 ) 11 )
9 12
  13 +const (
  14 + LOGIN_TOKEN_EXP = 1800 * time.Second //token 过期时间30分钟
  15 +)
  16 +
10 type RedisLoginToken struct { 17 type RedisLoginToken struct {
11 AccessToken string `json:"access_token"` 18 AccessToken string `json:"access_token"`
12 RefreshToken string `json:"refresh_token"` 19 RefreshToken string `json:"refresh_token"`
@@ -6,7 +6,6 @@ import ( @@ -6,7 +6,6 @@ import (
6 "oppmg/common/redis" 6 "oppmg/common/redis"
7 "oppmg/protocol" 7 "oppmg/protocol"
8 "strings" 8 "strings"
9 - "time"  
10 ) 9 )
11 10
12 func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64) error { 11 func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64) error {
@@ -15,18 +14,15 @@ func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64) @@ -15,18 +14,15 @@ func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64)
15 key string 14 key string
16 value []byte 15 value []byte
17 err error 16 err error
18 - exp int64  
19 - nowTime = time.Now().Unix()  
20 ) 17 )
21 data := RedisLoginToken{ 18 data := RedisLoginToken{
22 AccessToken: param.AccessToken, 19 AccessToken: param.AccessToken,
23 - RefreshToken: param.RefreshToken,  
24 CurrentCompany: companyid, 20 CurrentCompany: companyid,
25 } 21 }
26 value, _ = json.Marshal(data) 22 value, _ = json.Marshal(data)
27 - exp = param.RefreshExpires - nowTime 23 +
28 key = GetKeyLoginToken(userid, companyid) 24 key = GetKeyLoginToken(userid, companyid)
29 - err = client.Set(key, string(value), time.Duration(exp)*time.Second).Err() 25 + err = client.Set(key, string(value), LOGIN_TOKEN_EXP).Err()
30 return err 26 return err
31 } 27 }
32 28
@@ -80,7 +76,7 @@ func RefreshLoginTokenExpires(userid int64, companyid int64) error { @@ -80,7 +76,7 @@ func RefreshLoginTokenExpires(userid int64, companyid int64) error {
80 if result == 0 { 76 if result == 0 {
81 return nil 77 return nil
82 } 78 }
83 - _, err = client.Expire(key, 30*time.Minute).Result() 79 + _, err = client.Expire(key, LOGIN_TOKEN_EXP).Result()
84 if err != nil { 80 if err != nil {
85 return err 81 return err
86 } 82 }
1 -# 机会导向管理后台接口(非正式版)  
2 -  
3 -## 全局统一设定  
4 -  
5 -### 请求头指定要求的字段  
6 -  
7 -| 字段 | 说明 |  
8 -| ------------------ | ---------------------------- |  
9 -| x-mmm-accesstoken | 发起请求时使用时校验用 token |  
10 -| x-mmm-refreshtoken | 刷新 token 时使用的 token |  
11 -  
12 -- 备注 :token 使用 jwt 进行处理.其中包含有 user_id、company_id 的数据,登录时获取  
13 -  
14 ----  
15 -  
16 -### token 机制描述  
17 -  
18 -token 的响应内容  
19 -  
20 -```json  
21 -{  
22 - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTM2OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.R056B306_vO4UKfMRalncFULE5Z0phN4WOhS9PMwydc",  
23 - "expires_in": 1576053688,  
24 - "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTU0OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.OY54QdDwAq2B1NPnAmHkSxy_KvhktmZA2boSlcSSfoU",  
25 - "refresh_expires": 1576055488  
26 -}  
27 -```  
28 -  
29 -客户端可本地存储该内容数据。  
30 -  
31 -- access_token 对应请求头的 x-mmm-accesstoken。expires_in 指的是 access_token 的到期时间(时间戳),客户端可以依此判断 access_token 到期时间,然后决定是否调用接口刷新 token。  
32 -- refresh_token 对应请求头的 x-mmm-refreshtoken。refresh_expires 指的是 refresh_token 的到期时间(时间戳),客户端可以依此判断 refresh_token 到期时间,然后决定是否退出重新登录。  
33 -- 刷新 toke 的依据是 refresh_token,如果 refresh_token 过期失效则只能退出系统重新登录。  
34 -- 为应对客户端未主动刷新 token 的情况。当服务端发现 access_token 过期且 refresh_token 未过期时返回错误码【2】,并附带刷新后的 token,影响的内容格式同上,客户端可依此刷新请求头。当服务端发现 refresh_token 过期时返回错误码【3】,客户需要退出重新登录。  
35 -  
36 ----  
37 -  
38 -### 通用响应结构  
39 -  
40 -```json  
41 -{  
42 - "code": "错误码数字",  
43 - "msg": "错误描述字符串",  
44 - "data": {  
45 - "xxx": "any"  
46 - }  
47 -}  
48 -```  
49 -  
50 -- 备注:data 中的内容根据各接口实际情况确定  
51 -  
52 ----  
53 -  
54 -## 认证相关  
55 -  
56 -### 登录  
57 -  
58 -- 请求路径 :/auth/login  
59 -- 请求方式 :POST  
60 -- 请求 json:  
61 -  
62 -```json  
63 -{  
64 - "account": "账号",  
65 - "password": "密码"  
66 -}  
67 -```  
68 -  
69 -- 正常响应 json  
70 -  
71 -```json  
72 -{  
73 - "token":""  
74 - "code": 0,  
75 - "msg": "成功",  
76 - "data": {  
77 - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTM2OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.R056B306_vO4UKfMRalncFULE5Z0phN4WOhS9PMwydc",  
78 - "expires_in": 1576053688,  
79 - "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTU0OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.OY54QdDwAq2B1NPnAmHkSxy_KvhktmZA2boSlcSSfoU",  
80 - "refresh_expires": 1576055488  
81 - }  
82 -}  
83 -```  
84 -  
85 -- 备注:该请求无需指定请求头  
86 -  
87 ----  
88 -  
89 -### 刷新 token  
90 -  
91 -- 请求路径 :/v1/auth/refresh_token  
92 -- 请求方式 :get  
93 -- 请求 json:  
94 -  
95 -```json  
96 -  
97 -```  
98 -  
99 -- 正常响应 json  
100 -  
101 -```json  
102 -{  
103 - "code": 0,  
104 - "msg": "成功",  
105 - "data": {  
106 - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTM2OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.R056B306_vO4UKfMRalncFULE5Z0phN4WOhS9PMwydc",  
107 - "expires_in": 1576053688,  
108 - "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTU0OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.OY54QdDwAq2B1NPnAmHkSxy_KvhktmZA2boSlcSSfoU",  
109 - "refresh_expires": 1576055488  
110 - }  
111 -}  
112 -```  
113 -  
114 -- 备注:无  
115 -  
116 ----  
117 -  
118 -### 切换公司  
119 -  
120 -- 请求路径 :/v1/auth/change_company  
121 -- 请求方式 :post  
122 -- 请求 json:  
123 -  
124 -```json  
125 -{  
126 - "company_id": 2  
127 -}  
128 -```  
129 -  
130 -- 正常响应 json  
131 -  
132 -```json  
133 -{  
134 - "code": 0,  
135 - "msg": "成功",  
136 - "data": {  
137 - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTM2OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.R056B306_vO4UKfMRalncFULE5Z0phN4WOhS9PMwydc",  
138 - "expires_in": 1576053688,  
139 - "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYwNTU0OTAsImlhdCI6MTU3NjA1MTg4OCwiaXNzIjoibW1tX29wcG1nIiwibmJmIjoxNTc2MDUxODg4LCJ1aWQiOjEwLCJjb21wYW55X2lkIjoyfQ.OY54QdDwAq2B1NPnAmHkSxy_KvhktmZA2boSlcSSfoU",  
140 - "refresh_expires": 1576055488  
141 - }  
142 -}  
143 -```  
144 -  
145 -- 备注:切换公司实际是变更 token 信息  
146 -  
147 ----  
148 -  
149 -## 公司部门管理  
150 -  
151 -### 部门列表  
152 -  
153 -- 请求路径:/v1/department/list  
154 -- 请求方式:post  
155 -- 请求 json:  
156 -  
157 -```json  
158 -{}  
159 -```  
160 -  
161 -- 正常响应 json  
162 -  
163 -```json  
164 -{  
165 - "code": 0,  
166 - "msg": "成功",  
167 - "data": {  
168 - "lists": [  
169 - {  
170 - "id": 1,  
171 - "company_id": 1,  
172 - "name": "部门1",  
173 - "parant_id": 0,  
174 - "manages": [  
175 - {  
176 - "id": 1,  
177 - "name": "主管"  
178 - }  
179 - ],  
180 - "member": 1  
181 - },  
182 - {  
183 - "id": 2,  
184 - "company_id": 1,  
185 - "name": "部门1-2",  
186 - "parant_id": 1,  
187 - "manages": [  
188 - {  
189 - "id": 1,  
190 - "name": "主管"  
191 - }  
192 - ],  
193 - "member": 1  
194 - }  
195 - ]  
196 - }  
197 -}  
198 -```  
199 -  
200 -- 备注;无  
201 -  
202 ----  
203 -  
204 -### 添加部门  
205 -  
206 -- 请求路径:/v1/department/add  
207 -- 请求方式:post  
208 -- 请求 json:  
209 -  
210 -```json  
211 -{  
212 - "name": "部门8",  
213 - "parent_id": 13,  
214 - "manages": [1, 2, 3] //部门主管id列表  
215 -}  
216 -```  
217 -  
218 -- 正常响应 json  
219 -  
220 -```json  
221 -{  
222 - "code": 0,  
223 - "msg": "成功",  
224 - "data": {  
225 - "id": 12 //部门id  
226 - }  
227 -}  
228 -```  
229 -  
230 -- 备注;无  
231 -  
232 ----  
233 -  
234 -### 编辑部门  
235 -  
236 -- 请求路径:/v1/department/edit  
237 -- 请求方式:post  
238 -- 请求 json:  
239 -  
240 -```json  
241 -{  
242 - "id": 1,  
243 - "name": "部门8",  
244 - "parent_id": 13,  
245 - "manages": [1, 2, 3] //部门主管id列表  
246 -}  
247 -```  
248 -  
249 -- 响应 json  
250 -  
251 -```json  
252 -{  
253 - "code": 0,  
254 - "msg": "成功",  
255 - "data": null  
256 -}  
257 -```  
258 -  
259 -- 备注;无  
260 -  
261 ----  
262 -  
263 -### 删除部门  
264 -  
265 -- 请求路径:/v1/department/delete  
266 -- 请求方式:post  
267 -- 请求 json:  
268 -  
269 -```json  
270 -{  
271 - "ids": [1, 2]  
272 -}  
273 -```  
274 -  
275 -- 响应 json  
276 -  
277 -```json  
278 -{  
279 - "code": 0,  
280 - "msg": "成功",  
281 - "data": null  
282 -}  
283 -```  
284 -  
285 -- 备注;无  
286 -  
287 ----  
288 -  
289 -## 公司职位管理  
290 -  
291 -### 职位列表  
292 -  
293 -- 请求路径:/v1/position/list  
294 -- 请求方式:post  
295 -- 请求 json:  
296 -  
297 -```json  
298 -{}  
299 -```  
300 -  
301 -- 响应 json  
302 -  
303 -```json  
304 -{  
305 - "code": 0,  
306 - "msg": "成功",  
307 - "data": [  
308 - {  
309 - "id": 1,  
310 - "name": "董事长",  
311 - "parent_id": 0  
312 - },  
313 - {  
314 - "id": 2,  
315 - "name": "总经理",  
316 - "parent_id": 1  
317 - },  
318 - {  
319 - "id": 3,  
320 - "name": "副总经理",  
321 - "parent_id": 2  
322 - },  
323 - {  
324 - "id": 4,  
325 - "name": "技术总监",  
326 - "parent_id": 2  
327 - },  
328 - {  
329 - "id": 5,  
330 - "name": "职位a",  
331 - "parent_id": 0  
332 - },  
333 - {  
334 - "id": 6,  
335 - "name": "职位b-1",  
336 - "parent_id": 9  
337 - },  
338 - {  
339 - "id": 7,  
340 - "name": "职位a-2",  
341 - "parent_id": 5  
342 - },  
343 - {  
344 - "id": 8,  
345 - "name": "职位a-1-1",  
346 - "parent_id": 6  
347 - },  
348 - {  
349 - "id": 9,  
350 - "name": "职位b-1",  
351 - "parent_id": 0  
352 - }  
353 - ]  
354 -}  
355 -```  
356 -  
357 -- 备注;无  
358 -  
359 ----  
360 -  
361 -### 添加职位  
362 -  
363 -- 请求路径:/v1/position/add  
364 -- 请求方式:post  
365 -- 请求 json:  
366 -  
367 -```json  
368 -{  
369 - "name": "职位b-1",  
370 - "parent_id": 8  
371 -}  
372 -```  
373 -  
374 -- 响应 json  
375 -  
376 -```json  
377 -{  
378 - "code": 0,  
379 - "msg": "成功",  
380 - "data": {  
381 - "id": 2  
382 - }  
383 -}  
384 -```  
385 -  
386 -- 备注;无  
387 -  
388 ----  
389 -  
390 -### 编辑职位  
391 -  
392 -- 请求路径:/v1/position/edit  
393 -- 请求方式:post  
394 -- 请求 json:  
395 -  
396 -```json  
397 -{  
398 - "id": 2,  
399 - "name": "职位b-1",  
400 - "parent_id": 8  
401 -}  
402 -```  
403 -  
404 -- 响应 json  
405 -  
406 -```json  
407 -{  
408 - "code": 0,  
409 - "msg": "成功",  
410 - "data": {  
411 - "id": 2  
412 - }  
413 -}  
414 -```  
415 -  
416 -- 备注;无  
417 -  
418 ----  
419 -  
420 -### 删除职位  
421 -  
422 -- 请求路径:/v1/position/delete  
423 -- 请求方式:post  
424 -- 请求 json:  
425 -  
426 -```json  
427 -{  
428 - "ids": [1, 2, 3]  
429 -}  
430 -```  
431 -  
432 -- 响应 json  
433 -  
434 -```json  
435 -{  
436 - "code": 0,  
437 - "msg": "成功",  
438 - "data": null  
439 -}  
440 -```  
441 -  
442 -- 备注;无  
443 -  
444 ----  
445 -  
446 -## 公司员工角色  
447 -  
448 -### 角色列表  
449 -  
450 -- 请求路径:/v1/rbac/role/list  
451 -- 请求方式:post  
452 -- 请求 json:  
453 -  
454 -```json  
455 -{}  
456 -```  
457 -  
458 -- 响应 json  
459 -  
460 -```json  
461 -{  
462 - "code": 0,  
463 - "msg": "成功",  
464 - "data": {  
465 - "list": [  
466 - {  
467 - "id": 1,  
468 - "company_id": 1,  
469 - "name": "部门1",  
470 - "parant_id": 0,  
471 - "manages": [],  
472 - "members": [  
473 - {  
474 - "id": 1,  
475 - "name": "Jennifer Clark"  
476 - }  
477 - ],  
478 - "member": 1  
479 - },  
480 - {  
481 - "id": 2,  
482 - "company_id": 1,  
483 - "name": "部门1-2",  
484 - "parant_id": 1,  
485 - "manages": [],  
486 - "members": [],  
487 - "member": 1  
488 - },  
489 - {  
490 - "id": 3,  
491 - "company_id": 1,  
492 - "name": "部门1-2-3",  
493 - "parant_id": 2,  
494 - "manages": [],  
495 - "members": [],  
496 - "member": 0  
497 - },  
498 - {  
499 - "id": 4,  
500 - "company_id": 1,  
501 - "name": "部门1-2-4",  
502 - "parant_id": 2,  
503 - "manages": [],  
504 - "members": [],  
505 - "member": 0  
506 - },  
507 - {  
508 - "id": 5,  
509 - "company_id": 1,  
510 - "name": "部门1-2-5",  
511 - "parant_id": 3,  
512 - "manages": [],  
513 - "members": [],  
514 - "member": 0  
515 - },  
516 - {  
517 - "id": 7,  
518 - "company_id": 1,  
519 - "name": "部门1-2-5-7",  
520 - "parant_id": 5,  
521 - "manages": [],  
522 - "members": [],  
523 - "member": 0  
524 - },  
525 - {  
526 - "id": 10,  
527 - "company_id": 1,  
528 - "name": "部门2",  
529 - "parant_id": 0,  
530 - "manages": [],  
531 - "members": [],  
532 - "member": 0  
533 - },  
534 - {  
535 - "id": 26,  
536 - "company_id": 1,  
537 - "name": "部门名称1",  
538 - "parant_id": 1,  
539 - "manages": [  
540 - {  
541 - "id": 1,  
542 - "name": "Jennifer Clark"  
543 - }  
544 - ],  
545 - "members": [],  
546 - "member": 0  
547 - },  
548 - {  
549 - "id": 27,  
550 - "company_id": 1,  
551 - "name": "部门名称1",  
552 - "parant_id": 1,  
553 - "manages": [],  
554 - "members": [],  
555 - "member": 0  
556 - }  
557 - ]  
558 - }  
559 -}  
560 -```  
561 -  
562 -- 备注;无  
563 -  
564 ----  
565 -  
566 -### 添加角色  
567 -  
568 -- 请求路径:/v1/rbac/role/add  
569 -- 请求方式:post  
570 -- 请求 json:  
571 -  
572 -```json  
573 -{  
574 - "pid": 8,  
575 - "name": "角色7"  
576 -}  
577 -```  
578 -  
579 -- 响应 json  
580 -  
581 -```json  
582 -{  
583 - "code": 0,  
584 - "msg": "成功",  
585 - "data": {  
586 - "id": 2  
587 - }  
588 -}  
589 -```  
590 -  
591 -- 备注;无  
592 -  
593 ----  
594 -  
595 -### 编辑角色  
596 -  
597 -- 请求路径:/v1/rbac/role/edit  
598 -- 请求方式:post  
599 -- 请求 json:  
600 -  
601 -```json  
602 -{  
603 - "id": 7,  
604 - "pid": 8,  
605 - "name": "角色7"  
606 -}  
607 -```  
608 -  
609 -- 响应 json  
610 -  
611 -```json  
612 -{  
613 - "code": 0,  
614 - "msg": "成功",  
615 - "data": {  
616 - "id": 2  
617 - }  
618 -}  
619 -```  
620 -  
621 -### 删除角色  
622 -  
623 -- 请求路径:/v1/rbac/role/delete  
624 -- 请求方式:post  
625 -- 请求 json:  
626 -  
627 -```json  
628 -{  
629 - "id": 1  
630 -}  
631 -```  
632 -  
633 -- 响应 json  
634 -  
635 -```json  
636 -{  
637 - "code": 0,  
638 - "msg": "成功",  
639 - "data": null  
640 -}  
641 -```  
642 -  
643 -- 备注;无  
644 -  
645 ----  
646 -  
647 -- 备注;无  
648 -  
649 ----  
650 -  
651 -## 公告  
652 -  
653 -### 添加公告  
654 -  
655 -- 请求路径 :/v1/bulletin/add  
656 -- 请求方式 :post  
657 -- 请求 json:  
658 -  
659 -```json  
660 -{  
661 - "type": 2,  
662 - "title": "标题",  
663 - "content": "公告内容",  
664 - "allow_close": 0,  
665 - "question_switch": 1,  
666 - "receiver": ["1", "2"],  
667 - "question": {  
668 - "id": 1,  
669 - "type": 1,  
670 - "title": "今天星期几?",  
671 - "content": [  
672 - {  
673 - "id": 1,  
674 - "content": "星期1"  
675 - },  
676 - {  
677 - "id": 2,  
678 - "content": "星期2"  
679 - }  
680 - ]  
681 - },  
682 - "cover": {  
683 - "path": "/xx/xx.img",  
684 - "w": 50,  
685 - "h": 70  
686 - }  
687 -}  
688 -```  
689 -  
690 -```  
691 -obj.type 公告类型(1图+跳转链接、2纯文本)  
692 -obj.title 标题  
693 -obj.content 公告内容  
694 -obj.allow_close 允许关闭公告(0允许关闭窗口,1阅读完才能关闭,2选项打勾后才能关闭)  
695 -obj.question_switch 设置问题开关 (是否有问题) 1:是 0:否  
696 -obj.receiver 接收者  
697 -obj.question.type 类型:0-单选,1-多选  
698 -obj.question.title 标题  
699 -obj.question.content 问题选项  
700 -obj.cover 封面  
701 -```  
702 -  
703 -- 响应 json  
704 -  
705 -```json  
706 -{  
707 - "code": "00000",  
708 - "msg": "成功",  
709 - "data": {}  
710 -}  
711 -```  
712 -  
713 ----  
714 -  
715 -### 公告列表  
716 -  
717 -- 请求路径 :/v1/bulletin/list  
718 -- 请求方式 :post  
719 -- 请求 json:  
720 -  
721 -```json  
722 -{  
723 - "page": 1,  
724 - "page_size": 20,  
725 - "status": 0  
726 -}  
727 -```  
728 -  
729 -```  
730 -obj.status 状态 0-所有 1-下架 2-上架  
731 -```  
732 -  
733 -- 响应 json  
734 -  
735 -```json  
736 -{  
737 - "code": "00000",  
738 - "msg": "成功",  
739 - "data": {  
740 - "list": [  
741 - {  
742 - "id": 5,  
743 - "type": 2,  
744 - "title": "测试公告",  
745 - "status": 1,  
746 - "receiver": [  
747 - {  
748 - "id": 1,  
749 - "name": "Jennifer Clark"  
750 - },  
751 - {  
752 - "id": 2,  
753 - "name": "邓娱婷1208"  
754 - }  
755 - ],  
756 - "time": "2019-12-11 17:11:43"  
757 - }  
758 - ],  
759 - "Total": 2  
760 - }  
761 -}  
762 -```  
763 -  
764 -### 公告详情  
765 -  
766 -- 请求路径 :/v1/bulletin/get  
767 -- 请求方式 :post  
768 -- 请求 json:  
769 -  
770 -```json  
771 -{  
772 - "id": 5  
773 -}  
774 -```  
775 -  
776 -```  
777 -obj.status 状态 0-所有 1-下架 2-上架  
778 -```  
779 -  
780 -- 响应 json  
781 -  
782 -```json  
783 -{  
784 - "code": "00000",  
785 - "msg": "成功",  
786 - "data": {  
787 - "id": 5,  
788 - "type": 2,  
789 - "title": "测试公告",  
790 - "content": "今天发布了一则公告",  
791 - "allow_close": 0,  
792 - "question_switch": 1,  
793 - "receiver": [  
794 - {  
795 - "id": 1,  
796 - "name": "Jennifer Clark"  
797 - },  
798 - {  
799 - "id": 2,  
800 - "name": "邓娱婷1208"  
801 - }  
802 - ],  
803 - "question": {  
804 - "id": 4,  
805 - "type": 1,  
806 - "title": "今天星期几?",  
807 - "content": [  
808 - {  
809 - "id": 1,  
810 - "content": "星期1"  
811 - },  
812 - {  
813 - "id": 2,  
814 - "content": "星期2"  
815 - }  
816 - ]  
817 - },  
818 - "cover": {  
819 - "path": "/xx/xx.img",  
820 - "h": 70,  
821 - "w": 50  
822 - }  
823 - }  
824 -}  
825 -```  
826 -  
827 -### 公告更新  
828 -  
829 -- 请求路径 :/v1/bulletin/update  
830 -- 请求方式 :post  
831 -- 请求 json:  
832 -  
833 -```json  
834 -{  
835 - "id": 3,  
836 - "type": 2,  
837 - "title": "测试公告3",  
838 - "content": "今天发布了一则公告3",  
839 - "allow_close": 0,  
840 - "question_switch": 1,  
841 - "receiver": ["1", "2", "3"],  
842 - "question": {  
843 - "id": 2,  
844 - "type": 1,  
845 - "title": "今天星期几?",  
846 - "content": [  
847 - {  
848 - "id": 1,  
849 - "content": "星期2"  
850 - },  
851 - {  
852 - "id": 2,  
853 - "content": "星期3"  
854 - }  
855 - ]  
856 - },  
857 - "cover": {  
858 - "path": "/xx/xx.img",  
859 - "w": 50,  
860 - "h": 70  
861 - }  
862 -}  
863 -```  
864 -  
865 -- 响应 json  
866 -  
867 -```json  
868 -{  
869 - "code": "00000",  
870 - "msg": "成功",  
871 - "data": null  
872 -}  
873 -```