作者 yangfu

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

@@ -29,8 +29,8 @@ log_level = "${LOG_LEVEL||debug}" @@ -29,8 +29,8 @@ log_level = "${LOG_LEVEL||debug}"
29 ##统一用户中心相关配置 29 ##统一用户中心相关配置
30 ucenter_check_alt = "rsF0pL!6DwjBO735" 30 ucenter_check_alt = "rsF0pL!6DwjBO735"
31 ucenter_base_url = "http://suplus-ucenter-dev.fjmaimaimai.com" 31 ucenter_base_url = "http://suplus-ucenter-dev.fjmaimaimai.com"
32 -ucenter_app_key = "0692f2b7e8d6dbd8526579864b87e3bfbc5d5c31"  
33 -ucenter_secret = "0692f2b7e8d6dbd8526579864b87e3bfbc5d5c31" 32 +ucenter_app_key = "39aefef9e22744a3b2d2d3791824ae7b"
  33 +ucenter_secret = "cykbjnfqgctn"
34 # 审批流程修改 消息发布 34 # 审批流程修改 消息发布
35 message_publish = "audit_change" 35 message_publish = "audit_change"
36 #---自定义配置 结束---- 36 #---自定义配置 结束----
@@ -59,8 +59,15 @@ func (c *AuthController) Login() { @@ -59,8 +59,15 @@ func (c *AuthController) Login() {
59 msg = protocol.NewReturnResponse(nil, err) 59 msg = protocol.NewReturnResponse(nil, err)
60 return 60 return
61 } 61 }
  62 + err = serveauth.ResetLoginToken(logintoken)
  63 + if err != nil {
  64 + log.Error("token 信息记录数据库失败")
  65 + }
62 err = serveauth.ResetLoginTokenRedis(logintoken) 66 err = serveauth.ResetLoginTokenRedis(logintoken)
63 - msg = protocol.NewReturnResponse(logintoken, err) 67 + if err != nil {
  68 + log.Error("token 信息记录redis失败")
  69 + }
  70 + msg = protocol.NewReturnResponse(logintoken, nil)
64 return 71 return
65 } 72 }
66 73
@@ -18,20 +18,6 @@ type BaseController struct { @@ -18,20 +18,6 @@ type BaseController struct {
18 beego.Controller 18 beego.Controller
19 } 19 }
20 20
21 -func (this *BaseController) Options() {  
22 - this.AllowCross() //允许跨域  
23 - this.Ctx.ResponseWriter.WriteHeader(204)  
24 - this.Data["json"] = map[string]interface{}{}  
25 - this.ServeJSON()  
26 -}  
27 -  
28 -func (this *BaseController) AllowCross() {  
29 - this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", "*")  
30 - this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")  
31 - this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Headers", "*")  
32 - //this.Ctx.WriteString("")  
33 -}  
34 -  
35 //Prepare 实现beego.ControllerInterface 的接口 21 //Prepare 实现beego.ControllerInterface 的接口
36 func (this *BaseController) Prepare() { 22 func (this *BaseController) Prepare() {
37 this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", "*") 23 this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", "*")
@@ -48,7 +34,7 @@ func (this *BaseController) Prepare() { @@ -48,7 +34,7 @@ func (this *BaseController) Prepare() {
48 34
49 func (this *BaseController) GetAppHead() (appHead protocol.BaseHeader) { 35 func (this *BaseController) GetAppHead() (appHead protocol.BaseHeader) {
50 appHead.AccessToken = this.Ctx.Input.Header(protocol.HeaderAccessToken) 36 appHead.AccessToken = this.Ctx.Input.Header(protocol.HeaderAccessToken)
51 - appHead.RefreshToken = this.Ctx.Input.Header(protocol.HeaderRefreshToken) 37 + //appHead.RefreshToken = this.Ctx.Input.Header(protocol.HeaderRefreshToken)
52 return 38 return
53 39
54 } 40 }
@@ -23,10 +23,19 @@ func (c *CommonController) SelectorDepartment() { @@ -23,10 +23,19 @@ func (c *CommonController) SelectorDepartment() {
23 defer func() { 23 defer func() {
24 c.ResposeJson(msg) 24 c.ResposeJson(msg)
25 }() 25 }()
  26 + type Parameter struct {
  27 + DepartmentId int64 `json:"department_id"`
  28 + }
  29 + var param Parameter
  30 + if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
  31 + log.Error("json 解析失败 err:%s", err)
  32 + msg = protocol.BadRequestParam("1")
  33 + return
  34 + }
26 companyid := c.GetCompanyId() 35 companyid := c.GetCompanyId()
27 - departs := servecommon.SelectorDepartment(companyid)  
28 -  
29 - msg = protocol.NewReturnResponse(departs, nil) 36 + departs := servecommon.SelectorDepartment(companyid, param.DepartmentId)
  37 + data := protocol.ResponseListData{List: departs}
  38 + msg = protocol.NewReturnResponse(data, nil)
30 return 39 return
31 } 40 }
32 41
@@ -87,3 +96,23 @@ func (c *CommonController) SelectorPosition() { @@ -87,3 +96,23 @@ func (c *CommonController) SelectorPosition() {
87 msg = protocol.NewReturnResponse(departs, nil) 96 msg = protocol.NewReturnResponse(departs, nil)
88 return 97 return
89 } 98 }
  99 +
  100 +func (c *CommonController) SelectorUserAndDepart() {
  101 + var msg *protocol.ResponseMessage
  102 + defer func() {
  103 + c.ResposeJson(msg)
  104 + }()
  105 + type Parameter struct {
  106 + DepartmentId int64 `json:"department_id"`
  107 + }
  108 + var param Parameter
  109 + if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
  110 + log.Error("json 解析失败 err:%s", err)
  111 + msg = protocol.BadRequestParam("1")
  112 + return
  113 + }
  114 + companyid := c.GetCompanyId()
  115 + departs, err := servecommon.SelectorUserAndDepartment(param.DepartmentId, companyid)
  116 + msg = protocol.NewReturnResponse(departs, err)
  117 + return
  118 +}
@@ -226,6 +226,37 @@ func (c *RbacController) RoleHasMenu() { @@ -226,6 +226,37 @@ func (c *RbacController) RoleHasMenu() {
226 return 226 return
227 } 227 }
228 228
  229 +//TODO
  230 +func (c *RbacController) GetRoleMenuAll() {
  231 + var msg *protocol.ResponseMessage
  232 + defer func() {
  233 + c.ResposeJson(msg)
  234 + }()
  235 + log.Info("====>")
  236 + list, err := serverbac.GetRoleHasMenuAll(1, 1)
  237 + msg = protocol.NewReturnResponse(list, err)
  238 + return
  239 +}
  240 +
  241 +//RoleMenuEdit 设置角色的菜单
  242 +//@router /role/menu/edit
229 func (c *RbacController) RoleMenuEdit() { 243 func (c *RbacController) RoleMenuEdit() {
  244 + var msg *protocol.ResponseMessage
  245 + defer func() {
  246 + c.ResposeJson(msg)
  247 + }()
  248 + type Parameter struct {
  249 + RoleId int64 `json:"role_id"`
  250 + MenuIds []int64 `json:"menu_ids"`
  251 + }
  252 + var param Parameter
  253 + if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
  254 + log.Error("json 解析失败 err:%s", err)
  255 + msg = protocol.BadRequestParam("1")
  256 + return
  257 + }
  258 + companyid := c.GetCompanyId()
  259 + err := serverbac.RoleMenuEdit(companyid, param.RoleId, param.MenuIds)
  260 + msg = protocol.NewReturnResponse(nil, err)
230 return 261 return
231 } 262 }
@@ -19,7 +19,7 @@ var LogRequestData = func(ctx *context.Context) { @@ -19,7 +19,7 @@ var LogRequestData = func(ctx *context.Context) {
19 log.Info("====>Recv Request:%s", ctx.Input.URI()) 19 log.Info("====>Recv Request:%s", ctx.Input.URI())
20 hmap := map[string]string{ 20 hmap := map[string]string{
21 protocol.HeaderAccessToken: ctx.Input.Header(protocol.HeaderAccessToken), 21 protocol.HeaderAccessToken: ctx.Input.Header(protocol.HeaderAccessToken),
22 - protocol.HeaderRefreshToken: ctx.Input.Header(protocol.HeaderRefreshToken), 22 + //protocol.HeaderRefreshToken: ctx.Input.Header(protocol.HeaderRefreshToken),
23 } 23 }
24 if ctx.Input.RequestBody != nil { 24 if ctx.Input.RequestBody != nil {
25 log.Info("====>Recv data from client:\nHeadData: %v \nBodyData: %s", hmap, string(ctx.Input.RequestBody)) 25 log.Info("====>Recv data from client:\nHeadData: %v \nBodyData: %s", hmap, string(ctx.Input.RequestBody))
@@ -38,7 +38,7 @@ var AuthToken = func(ctx *context.Context) { @@ -38,7 +38,7 @@ var AuthToken = func(ctx *context.Context) {
38 mtoken *serveauth.MyToken 38 mtoken *serveauth.MyToken
39 ) 39 )
40 accesstoken := ctx.Input.Header(protocol.HeaderAccessToken) 40 accesstoken := ctx.Input.Header(protocol.HeaderAccessToken)
41 - refreshToken := ctx.Input.Header(protocol.HeaderRefreshToken) 41 + // refreshToken := ctx.Input.Header(protocol.HeaderRefreshToken)
42 mtoken, err = serveauth.ValidJWTToken(accesstoken) 42 mtoken, err = serveauth.ValidJWTToken(accesstoken)
43 if accesstoken == "123456" && beego.BConfig.RunMode != "prod" { 43 if accesstoken == "123456" && beego.BConfig.RunMode != "prod" {
44 return 44 return
@@ -47,14 +47,14 @@ var AuthToken = func(ctx *context.Context) { @@ -47,14 +47,14 @@ var AuthToken = func(ctx *context.Context) {
47 storetoken, err = redisdata.GetLoginToken(mtoken.UID) 47 storetoken, err = redisdata.GetLoginToken(mtoken.UID)
48 if err != nil { 48 if err != nil {
49 log.Error("redisdata.GetLoginToken err:%s", err) 49 log.Error("redisdata.GetLoginToken err:%s", err)
50 - msg = protocol.NewMesage("10024") 50 + msg = protocol.NewMessage("10024")
51 ctx.Output.JSON(msg, false, false) 51 ctx.Output.JSON(msg, false, false)
52 return 52 return
53 } 53 }
54 if beego.BConfig.RunMode == "prod" { 54 if beego.BConfig.RunMode == "prod" {
55 //校验是否是单客户端操作 55 //校验是否是单客户端操作
56 if storetoken.AccessToken != accesstoken { 56 if storetoken.AccessToken != accesstoken {
57 - msg = protocol.NewMesage("10025") 57 + msg = protocol.NewMessage("10025")
58 ctx.Output.JSON(msg, false, false) 58 ctx.Output.JSON(msg, false, false)
59 return 59 return
60 } 60 }
@@ -64,14 +64,12 @@ var AuthToken = func(ctx *context.Context) { @@ -64,14 +64,12 @@ var AuthToken = func(ctx *context.Context) {
64 return 64 return
65 } 65 }
66 if ok := serveauth.IsJwtErrorExpired(err); ok { 66 if ok := serveauth.IsJwtErrorExpired(err); ok {
67 - //token过期,刷新  
68 - logintoken, err := serveauth.RefreshLoginToken(refreshToken)  
69 - msg = protocol.NewReturnResponse(logintoken, err) 67 + msg := protocol.NewMessage("10024")
70 ctx.Output.JSON(msg, false, false) 68 ctx.Output.JSON(msg, false, false)
71 return 69 return
72 } 70 }
73 - log.Error("token 校验失败")  
74 - msg = protocol.NewMesage("1") 71 + log.Error("token 校验失败:%s", err)
  72 + msg = protocol.NewMessage("10024")
75 ctx.Output.JSON(msg, false, false) 73 ctx.Output.JSON(msg, false, false)
76 return 74 return
77 } 75 }
@@ -90,8 +88,8 @@ var AllowOption = func(ctx *context.Context) { @@ -90,8 +88,8 @@ var AllowOption = func(ctx *context.Context) {
90 AllowAllOrigins: true, //允许的请求来源 88 AllowAllOrigins: true, //允许的请求来源
91 }) 89 })
92 f(ctx) 90 f(ctx)
93 - ctx.Output.Body([]byte("{}"))  
94 ctx.Output.SetStatus(204) 91 ctx.Output.SetStatus(204)
  92 + ctx.Output.Body(nil)
95 return 93 return
96 } 94 }
97 95
@@ -38,3 +38,14 @@ func GetMenuById(id int) (v *Menu, err error) { @@ -38,3 +38,14 @@ func GetMenuById(id int) (v *Menu, err error) {
38 } 38 }
39 return nil, err 39 return nil, err
40 } 40 }
  41 +
  42 +func GetMenuByIds(ids []int64) (v []*Menu, err error) {
  43 + o := orm.NewOrm()
  44 + _, err = o.QueryTable(&Menu{}).
  45 + Filter("id__in", ids).
  46 + All(&v)
  47 + if err == orm.ErrNoRows {
  48 + return v, nil
  49 + }
  50 + return v, nil
  51 +}
@@ -7,8 +7,9 @@ import ( @@ -7,8 +7,9 @@ import (
7 type RoleMenu struct { 7 type RoleMenu struct {
8 Id int64 `orm:"column(id);auto" description:"主键"` 8 Id int64 `orm:"column(id);auto" description:"主键"`
9 RoleId int64 `orm:"column(role_id);null" description:"role.id"` 9 RoleId int64 `orm:"column(role_id);null" description:"role.id"`
10 - MenuId int64 `orm:"column(menu_id);null" description:"menu.id"` 10 + MenuId int `orm:"column(menu_id);null" description:"menu.id"`
11 Opption string `orm:"column(opption);size(500);null" description:"配置"` 11 Opption string `orm:"column(opption);size(500);null" description:"配置"`
  12 + Code string `orm:"column(code)"`
12 } 13 }
13 14
14 func (t *RoleMenu) TableName() string { 15 func (t *RoleMenu) TableName() string {
@@ -19,14 +20,6 @@ func init() { @@ -19,14 +20,6 @@ func init() {
19 orm.RegisterModel(new(RoleMenu)) 20 orm.RegisterModel(new(RoleMenu))
20 } 21 }
21 22
22 -// AddRoleMenu insert a new RoleMenu into database and returns  
23 -// last inserted Id on success.  
24 -func AddRoleMenu(m *RoleMenu) (id int64, err error) {  
25 - o := orm.NewOrm()  
26 - id, err = o.Insert(m)  
27 - return  
28 -}  
29 -  
30 func GetRoleMenuByRole(roleid int64) ([]RoleMenu, error) { 23 func GetRoleMenuByRole(roleid int64) ([]RoleMenu, error) {
31 var ( 24 var (
32 list []RoleMenu 25 list []RoleMenu
@@ -16,6 +16,7 @@ type User struct { @@ -16,6 +16,7 @@ type User struct {
16 CsAccount int64 `orm:"column(cs_account)" description:"客服有话说ID"` 16 CsAccount int64 `orm:"column(cs_account)" description:"客服有话说ID"`
17 IsKefu int8 `orm:"column(is_kefu)" description:"是否是客服 0:否 1:是"` 17 IsKefu int8 `orm:"column(is_kefu)" description:"是否是客服 0:否 1:是"`
18 ImToken string `orm:"column(im_token);size(128)" description:"网易云token"` 18 ImToken string `orm:"column(im_token);size(128)" description:"网易云token"`
  19 + Accid int64 `orm:"column(accid)" description:"网易云id"`
19 LastLoginTime time.Time `orm:"column(last_login_time);type(timestamp)" description:"最后一次登录时间"` 20 LastLoginTime time.Time `orm:"column(last_login_time);type(timestamp)" description:"最后一次登录时间"`
20 CreateAt time.Time `orm:"column(create_at);type(timestamp);auto_now_add" description:"创建时间"` 21 CreateAt time.Time `orm:"column(create_at);type(timestamp);auto_now_add" description:"创建时间"`
21 EnableStatus int8 `orm:"column(enable_status)" description:"是否有效"` 22 EnableStatus int8 `orm:"column(enable_status)" description:"是否有效"`
@@ -133,7 +133,7 @@ type TemplateItem struct { @@ -133,7 +133,7 @@ type TemplateItem struct {
133 133
134 type VisibleObject struct { 134 type VisibleObject struct {
135 Id string `json:"id"` 135 Id string `json:"id"`
136 - Name string `json:"name",omitempty` 136 + Name string `json:"name,omitempty"`
137 Type int `json:"type"` //1:部门 2:指定人员 137 Type int `json:"type"` //1:部门 2:指定人员
138 } 138 }
139 139
@@ -2,7 +2,8 @@ package protocol @@ -2,7 +2,8 @@ package protocol
2 2
3 //指定的请求头字段 3 //指定的请求头字段
4 const ( 4 const (
5 - HeaderAccessToken string = "x-mmm-accesstoken" 5 + // HeaderAccessToken string = "x-mmm-accesstoken"
  6 + HeaderAccessToken string = "Authorization"
6 HeaderRefreshToken string = "x-mmm-refreshtoken" 7 HeaderRefreshToken string = "x-mmm-refreshtoken"
7 ) 8 )
8 9
@@ -13,11 +13,15 @@ type ResponsePageInfo struct { @@ -13,11 +13,15 @@ type ResponsePageInfo struct {
13 // ListData interface{} `json:"lists"` 13 // ListData interface{} `json:"lists"`
14 } 14 }
15 15
  16 +type ResponseListData struct {
  17 + List interface{} `json:"lists"`
  18 +}
  19 +
16 // DepartmentBase下拉选择列表-部门 20 // DepartmentBase下拉选择列表-部门
17 type DepartmentBase struct { 21 type DepartmentBase struct {
18 Id int64 `json:"id" orm:"column(id)"` 22 Id int64 `json:"id" orm:"column(id)"`
19 Name string `json:"name" orm:"column(name)"` 23 Name string `json:"name" orm:"column(name)"`
20 - ParentId int64 `json:"parent_id" orm:"column(parent_id)"` 24 + ParentId int64 `json:"parentId" orm:"column(parent_id)"`
21 } 25 }
22 26
23 //RoleBase 下拉选择列表-角色 27 //RoleBase 下拉选择列表-角色
@@ -33,7 +37,7 @@ type RoleBase struct { @@ -33,7 +37,7 @@ type RoleBase struct {
33 type PositionBase struct { 37 type PositionBase struct {
34 Id int64 `json:"id" orm:"column(id)"` 38 Id int64 `json:"id" orm:"column(id)"`
35 Name string `json:"name" orm:"column(name)"` 39 Name string `json:"name" orm:"column(name)"`
36 - ParentId int64 `json:"parent_id" orm:"column(parent_id)"` 40 + ParentId int64 `json:"parentId" orm:"column(parent_id)"`
37 } 41 }
38 42
39 //DepartUserBase 下拉选择列表-部门下的人员 43 //DepartUserBase 下拉选择列表-部门下的人员
@@ -41,3 +45,9 @@ type DepartUserBase struct { @@ -41,3 +45,9 @@ type DepartUserBase struct {
41 UserCompanyId int64 `json:"id" orm:"column(user_company_id)"` 45 UserCompanyId int64 `json:"id" orm:"column(user_company_id)"`
42 Name string `json:"name" orm:"-"` 46 Name string `json:"name" orm:"-"`
43 } 47 }
  48 +
  49 +//部门和人员混合
  50 +type DepartAndUser struct {
  51 + Departments []DepartmentBase `json:"departments"`
  52 + Members []DepartmentMember `json:"members"`
  53 +}
@@ -17,11 +17,6 @@ type DepartmentManager struct { @@ -17,11 +17,6 @@ type DepartmentManager struct {
17 Name string `json:"name"` 17 Name string `json:"name"`
18 } 18 }
19 19
20 -type DepartmentMember struct {  
21 - Id int64 `json:"id"`  
22 - Name string `json:"name"`  
23 -}  
24 -  
25 //RequestDepartmentEdit 编辑 20 //RequestDepartmentEdit 编辑
26 type RequestDepartmentEdit struct { 21 type RequestDepartmentEdit struct {
27 ID int64 `json:"id"` 22 ID int64 `json:"id"`
@@ -35,12 +30,17 @@ type RequestDepartmentDelete struct { @@ -35,12 +30,17 @@ type RequestDepartmentDelete struct {
35 CompanyID int64 `json:"company_id"` //公司 30 CompanyID int64 `json:"company_id"` //公司
36 } 31 }
37 32
  33 +type DepartmentMember struct {
  34 + Id int64 `json:"id"`
  35 + Name string `json:"name"`
  36 +}
  37 +
38 //ResponseDepartmentInfo ... 38 //ResponseDepartmentInfo ...
39 type ResponseDepartmentInfo struct { 39 type ResponseDepartmentInfo struct {
40 ID int64 `json:"id"` 40 ID int64 `json:"id"`
41 CompanyID int64 `json:"company_id"` //公司 41 CompanyID int64 `json:"company_id"` //公司
42 Name string `json:"name"` //部门名字 42 Name string `json:"name"` //部门名字
43 - ParantID int64 `json:"parant_id"` //父级部门Id 43 + ParantID int64 `json:"parantId"` //父级部门Id
44 Manages []DepartmentManager `json:"manages"` //部门管理员 44 Manages []DepartmentManager `json:"manages"` //部门管理员
45 Members []DepartmentMember `json:"members"` //部门成员 45 Members []DepartmentMember `json:"members"` //部门成员
46 Member int64 `json:"member"` //成员数 46 Member int64 `json:"member"` //成员数
@@ -32,7 +32,7 @@ type ResponseMessage struct { @@ -32,7 +32,7 @@ type ResponseMessage struct {
32 Data interface{} `json:"data"` 32 Data interface{} `json:"data"`
33 } 33 }
34 34
35 -func NewMesage(code string) *ResponseMessage { 35 +func NewMessage(code string) *ResponseMessage {
36 ecode := SearchErr(code) 36 ecode := SearchErr(code)
37 rsp := &ResponseMessage{ 37 rsp := &ResponseMessage{
38 Errno: transformCode(ecode.Errno), 38 Errno: transformCode(ecode.Errno),
@@ -79,7 +79,7 @@ func (e ErrWithMessage) Unwrap() error { @@ -79,7 +79,7 @@ func (e ErrWithMessage) Unwrap() error {
79 79
80 //ParseToMessage 实现CustomErrParse的接口 80 //ParseToMessage 实现CustomErrParse的接口
81 func (e ErrWithMessage) ParseToMessage() *ResponseMessage { 81 func (e ErrWithMessage) ParseToMessage() *ResponseMessage {
82 - return NewMesage(e.Errno) 82 + return NewMessage(e.Errno)
83 } 83 }
84 84
85 func SearchErr(code string) ErrorCode { 85 func SearchErr(code string) ErrorCode {
@@ -90,7 +90,7 @@ func SearchErr(code string) ErrorCode { @@ -90,7 +90,7 @@ func SearchErr(code string) ErrorCode {
90 func NewReturnResponse(data interface{}, eRR error) (msg *ResponseMessage) { 90 func NewReturnResponse(data interface{}, eRR error) (msg *ResponseMessage) {
91 // var msg *ResponseMessage 91 // var msg *ResponseMessage
92 if eRR == nil { 92 if eRR == nil {
93 - msg = NewMesage("0") 93 + msg = NewMessage("0")
94 msg.Data = data 94 msg.Data = data
95 return msg 95 return msg
96 } 96 }
@@ -98,12 +98,12 @@ func NewReturnResponse(data interface{}, eRR error) (msg *ResponseMessage) { @@ -98,12 +98,12 @@ func NewReturnResponse(data interface{}, eRR error) (msg *ResponseMessage) {
98 return x.ParseToMessage() 98 return x.ParseToMessage()
99 } 99 }
100 100
101 - return NewMesage("1") 101 + return NewMessage("1")
102 } 102 }
103 103
104 //BadRequestParam 控制层响应返回 104 //BadRequestParam 控制层响应返回
105 func BadRequestParam(code string) *ResponseMessage { 105 func BadRequestParam(code string) *ResponseMessage {
106 - return NewMesage(code) 106 + return NewMessage(code)
107 } 107 }
108 108
109 //NewPageDataResponse 控制层分页数据响应返回 109 //NewPageDataResponse 控制层分页数据响应返回
@@ -112,9 +112,9 @@ func NewPageDataResponse(data interface{}, eRR error) (msg *ResponseMessage) { @@ -112,9 +112,9 @@ func NewPageDataResponse(data interface{}, eRR error) (msg *ResponseMessage) {
112 if x, ok := eRR.(CustomErrParse); ok { 112 if x, ok := eRR.(CustomErrParse); ok {
113 return x.ParseToMessage() 113 return x.ParseToMessage()
114 } 114 }
115 - return NewMesage("1") 115 + return NewMessage("1")
116 } 116 }
117 - msg = NewMesage("0") 117 + msg = NewMessage("0")
118 msg.Data = map[string]interface{}{ 118 msg.Data = map[string]interface{}{
119 "gridResult": data, 119 "gridResult": data,
120 } 120 }
@@ -6,7 +6,7 @@ import ( @@ -6,7 +6,7 @@ import (
6 ) 6 )
7 7
8 func Test_Err(t *testing.T) { 8 func Test_Err(t *testing.T) {
9 - errmsg := NewMesage("0") 9 + errmsg := NewMessage("0")
10 bt1, _ := json.Marshal(errmsg) 10 bt1, _ := json.Marshal(errmsg)
11 t.Log(string(bt1)) 11 t.Log(string(bt1))
12 normalmsg := NewErrWithMessage("0") 12 normalmsg := NewErrWithMessage("0")
@@ -7,6 +7,7 @@ var errmessge ErrorMap = map[string]string{ @@ -7,6 +7,7 @@ var errmessge ErrorMap = map[string]string{
7 //角色相关 7 //角色相关
8 "10001": "请先删除该分组下的其他角色", 8 "10001": "请先删除该分组下的其他角色",
9 "10002": "请先删除该角色下的人员", 9 "10002": "请先删除该角色下的人员",
  10 + "10003": "无效角色",
10 //职位相关 11 //职位相关
11 "10011": "该职位已被使用无法删除", 12 "10011": "该职位已被使用无法删除",
12 //安全认证相关 13 //安全认证相关
@@ -15,7 +16,7 @@ var errmessge ErrorMap = map[string]string{ @@ -15,7 +16,7 @@ var errmessge ErrorMap = map[string]string{
15 "10023": "用户无使用权限", 16 "10023": "用户无使用权限",
16 "10024": "登录凭证失效", 17 "10024": "登录凭证失效",
17 "10025": "该账号已在其他地方登录", 18 "10025": "该账号已在其他地方登录",
18 - "10026": "登录凭证过期", 19 + // "10026": "登录凭证过期",
19 "10027": "无操作权限", 20 "10027": "无操作权限",
20 //用户相关 21 //用户相关
21 "10031": "无效角色", 22 "10031": "无效角色",
1 package routers 1 package routers
2 2
  3 +import (
  4 + "encoding/json"
  5 +)
  6 +
3 //PermissionBase 路由对应的权限 7 //PermissionBase 路由对应的权限
4 type PermissionBase struct { 8 type PermissionBase struct {
5 CodeName string //模块标识 9 CodeName string //模块标识
6 ActionName string 10 ActionName string
7 - MethodMap map[string]func()  
8 -}  
9 -  
10 -func (p PermissionBase) ValidMapping(actionName string, fn func()) {  
11 - p.MethodMap[actionName] = fn 11 + // MethodMap map[string]func()
12 } 12 }
13 13
14 var routerPermission = map[string]PermissionBase{ 14 var routerPermission = map[string]PermissionBase{
@@ -18,22 +18,61 @@ var routerPermission = map[string]PermissionBase{ @@ -18,22 +18,61 @@ var routerPermission = map[string]PermissionBase{
18 "/v1/department/delete": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "delete"}, 18 "/v1/department/delete": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "delete"},
19 } 19 }
20 20
21 -//PermissionWithPosition 职位管理相关  
22 -// type PermissionWithPosition struct {  
23 -// PermissionBase  
24 -// } 21 +var permissionObject = map[string]interface{}{
  22 + "": 0,
  23 +}
  24 +
  25 +//模块编号
  26 +const (
  27 + MENU_DEPARTMENT string = "OPPMG_DEPARTMENT" //公司部门管理模块
  28 + MENU_POSITION string = "OPPMG_POSITION" //公司职务管理
  29 + MENU_RBAC string = "OPPMG_RBAC" //员工角色/权限设置
  30 + MENU_USER string = "OPPMG_USER" //公司员工管理
  31 + MENU_ENTERPRISE_BASIC string = "OPPMG_ENTERPRISE_BASIC" //企业基础设置(大节点)
  32 + MENU_SYSTEM_FUNCTION string = "OPPMG_SYSTEM_FUNCTION" //系统功能(大节点)
  33 + MENU_CONMPANY string = "OPPMG_CONMPANY" //企业信息维护
  34 + MENU_CHANCE_TEMP string = "OPPMG_CHANCE_TEMP" //机会模板管理
  35 + MENU_SORCE string = "OPPMG_SORCE" //评分模式
  36 + MENU_CHANCE string = "OPPMG_CHANCE" //机会管理
  37 +)
25 38
26 -//GetCode 模块标识  
27 -// func (c *PermissionWithPosition) GetCodeName() string {  
28 -// return "OPPMG_DEPARTMENT"  
29 -// } 39 +type PermissionContentObject interface {
  40 + StringUnmarshal(string) error
  41 + ObjectMarshal() (string, error)
  42 +}
30 43
31 -//Valid 权限校验  
32 -// func (c PermissionWithPosition) Valid(userCompanyID int64) bool {  
33 -// return true  
34 -// } 44 +type PermissionContentBase struct {
  45 + Check int8 `json:"check"`
  46 +}
35 47
36 -//PermissionWithDepart 部门管理相关  
37 -// type PermissionWithDepart struct {  
38 -// Check int8 `json:"check"`  
39 -// } 48 +func NewPermissionContentBase() PermissionContentObject {
  49 + return &PermissionContentBase{}
  50 +}
  51 +
  52 +func (p *PermissionContentBase) StringUnmarshal(s string) error {
  53 + err := json.Unmarshal([]byte(s), p)
  54 + return err
  55 +}
  56 +
  57 +func (p *PermissionContentBase) ObjectMarshal() (string, error) {
  58 + bt, err := json.Marshal(p)
  59 + if err != nil {
  60 + return "", err
  61 + }
  62 + return string(bt), err
  63 +}
  64 +
  65 +type CodeToObject func() PermissionContentObject
  66 +
  67 +var CodePermissionObject = map[string]CodeToObject{
  68 + MENU_DEPARTMENT: NewPermissionContentBase, //公司部门管理模块
  69 + MENU_POSITION: NewPermissionContentBase, //公司职务管理
  70 + MENU_RBAC: NewPermissionContentBase, //员工角色/权限设置
  71 + MENU_USER: NewPermissionContentBase, //公司员工管理
  72 + MENU_ENTERPRISE_BASIC: NewPermissionContentBase, //企业基础设置(大节点)
  73 + MENU_SYSTEM_FUNCTION: NewPermissionContentBase, //系统功能(大节点)
  74 + MENU_CONMPANY: NewPermissionContentBase, //企业信息维护
  75 + MENU_CHANCE_TEMP: NewPermissionContentBase, //机会模板管理
  76 + MENU_SORCE: NewPermissionContentBase, //评分模式
  77 + MENU_CHANCE: NewPermissionContentBase, //机会管理
  78 +}
@@ -3,6 +3,8 @@ package routers @@ -3,6 +3,8 @@ package routers
3 import ( 3 import (
4 "oppmg/controllers" 4 "oppmg/controllers"
5 5
  6 + "github.com/astaxie/beego/context"
  7 +
6 "oppmg/middleware" 8 "oppmg/middleware"
7 9
8 "github.com/astaxie/beego" 10 "github.com/astaxie/beego"
@@ -36,6 +38,7 @@ func init() { @@ -36,6 +38,7 @@ func init() {
36 beego.NSRouter("/role/list", &controllers.RbacController{}, "post:RoleList"), 38 beego.NSRouter("/role/list", &controllers.RbacController{}, "post:RoleList"),
37 beego.NSRouter("/menu/list", &controllers.RbacController{}, "post:MenuList"), 39 beego.NSRouter("/menu/list", &controllers.RbacController{}, "post:MenuList"),
38 beego.NSRouter("/role/menu", &controllers.RbacController{}, "post:RoleHasMenu"), 40 beego.NSRouter("/role/menu", &controllers.RbacController{}, "post:RoleHasMenu"),
  41 + beego.NSRouter("/role/menu/edit", &controllers.RbacController{}, "post:RoleMenuEdit"),
39 ), 42 ),
40 beego.NSNamespace("/user", 43 beego.NSNamespace("/user",
41 beego.NSRouter("/list", &controllers.CompanyController{}, "post:UserList"), 44 beego.NSRouter("/list", &controllers.CompanyController{}, "post:UserList"),
@@ -62,6 +65,7 @@ func init() { @@ -62,6 +65,7 @@ func init() {
62 beego.NSRouter("/department", &controllers.CommonController{}, "post:SelectorDepartment"), 65 beego.NSRouter("/department", &controllers.CommonController{}, "post:SelectorDepartment"),
63 beego.NSRouter("/role", &controllers.CommonController{}, "post:SelectorRole"), 66 beego.NSRouter("/role", &controllers.CommonController{}, "post:SelectorRole"),
64 beego.NSRouter("/position", &controllers.CommonController{}, "post:SelectorPosition"), 67 beego.NSRouter("/position", &controllers.CommonController{}, "post:SelectorPosition"),
  68 + beego.NSRouter("/user_and_department", &controllers.CommonController{}, "post:SelectorUserAndDepart"),
65 ), 69 ),
66 beego.NSNamespace("/template", 70 beego.NSNamespace("/template",
67 beego.NSRouter("/add", &controllers.TemplateController{}, "post:TemplateAdd"), 71 beego.NSRouter("/add", &controllers.TemplateController{}, "post:TemplateAdd"),
@@ -88,9 +92,20 @@ func init() { @@ -88,9 +92,20 @@ func init() {
88 beego.NSRouter("/company", &controllers.CompanyController{}, "post:InitCompany"), 92 beego.NSRouter("/company", &controllers.CompanyController{}, "post:InitCompany"),
89 beego.NSRouter("/company/info", &controllers.CompanyController{}, "post:GetCompanyForUCenter"), 93 beego.NSRouter("/company/info", &controllers.CompanyController{}, "post:GetCompanyForUCenter"),
90 ) 94 )
  95 +
91 beego.AddNamespace(nsV1) 96 beego.AddNamespace(nsV1)
92 beego.AddNamespace(nsAuth) 97 beego.AddNamespace(nsAuth)
93 beego.AddNamespace(nsUcenter) 98 beego.AddNamespace(nsUcenter)
94 99
  100 + nsTest := beego.NewNamespace("/test",
  101 + beego.NSCond(func(ctx *context.Context) bool {
  102 + if beego.BConfig.RunMode != "prod" {
  103 + return true
  104 + }
  105 + return false
  106 + }),
  107 + beego.NSRouter("/te", &controllers.RbacController{}, "get:GetRoleMenuAll"),
  108 + )
  109 + beego.AddNamespace(nsTest)
95 beego.SetStaticPath("/log", beego.AppConfig.String("log_filename")) 110 beego.SetStaticPath("/log", beego.AppConfig.String("log_filename"))
96 } 111 }
@@ -3,11 +3,13 @@ package auth @@ -3,11 +3,13 @@ package auth
3 import ( 3 import (
4 "crypto/sha1" 4 "crypto/sha1"
5 "encoding/hex" 5 "encoding/hex"
  6 + "encoding/json"
6 "fmt" 7 "fmt"
7 "io" 8 "io"
8 "oppmg/common/log" 9 "oppmg/common/log"
9 "oppmg/models" 10 "oppmg/models"
10 "oppmg/protocol" 11 "oppmg/protocol"
  12 + "oppmg/services/ucenter"
11 "oppmg/storage/redisdata" 13 "oppmg/storage/redisdata"
12 "oppmg/utils" 14 "oppmg/utils"
13 "strings" 15 "strings"
@@ -79,7 +81,7 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error { @@ -79,7 +81,7 @@ func ResetLoginToken(loginToken protocol.LoginAuthToken) error {
79 uAuth.RefreshToken = loginToken.RefreshToken 81 uAuth.RefreshToken = loginToken.RefreshToken
80 uAuth.RefreshTokenExp = time.Unix(loginToken.RefreshExpires, 0) 82 uAuth.RefreshTokenExp = time.Unix(loginToken.RefreshExpires, 0)
81 uAuth.UpdateAt = nowTime 83 uAuth.UpdateAt = nowTime
82 - upCol := []string{"CurrentCompanyId", "AccessToken", "RefreshToken", "RefreshTokenExp", "UpdateAt"} 84 + upCol := []string{"CurrentCompanyId", "AccessTokenExp", "RefreshTokenExp", "AccessToken", "RefreshToken", "RefreshTokenExp", "UpdateAt"}
83 if err = models.UpdateUserAuthById(uAuth, upCol); err != nil { 85 if err = models.UpdateUserAuthById(uAuth, upCol); err != nil {
84 e := fmt.Errorf("UpdateUserAuthById err:%s", err) 86 e := fmt.Errorf("UpdateUserAuthById err:%s", err)
85 log.Error(e.Error()) 87 log.Error(e.Error())
@@ -189,7 +191,7 @@ func LoginAuthByUCenter(account, password string) (protocol.LoginAuthToken, erro @@ -189,7 +191,7 @@ func LoginAuthByUCenter(account, password string) (protocol.LoginAuthToken, erro
189 } 191 }
190 if ok := userdata.IsEnable(); !ok { 192 if ok := userdata.IsEnable(); !ok {
191 log.Debug("userdata.IsEnable()==false") 193 log.Debug("userdata.IsEnable()==false")
192 - return logintoken, protocol.NewErrWithMessage("10021") 194 + return logintoken, protocol.NewErrWithMessage("10022")
193 } 195 }
194 if companys, err = getUserCompanyReal(userdata.Id); err != nil { 196 if companys, err = getUserCompanyReal(userdata.Id); err != nil {
195 log.Error("getUserCompanyReal err:%s", err) 197 log.Error("getUserCompanyReal err:%s", err)
@@ -197,33 +199,55 @@ func LoginAuthByUCenter(account, password string) (protocol.LoginAuthToken, erro @@ -197,33 +199,55 @@ func LoginAuthByUCenter(account, password string) (protocol.LoginAuthToken, erro
197 } 199 }
198 if len(companys) == 0 { 200 if len(companys) == 0 {
199 log.Debug("no company") 201 log.Debug("no company")
200 - return logintoken, protocol.NewErrWithMessage("10021") 202 + return logintoken, protocol.NewErrWithMessage("10022")
201 } 203 }
202 companyid = companys[0].Id 204 companyid = companys[0].Id
203 - // var uclientReturn ucenter.ResponseLogin  
204 - // param := ucenter.RequesLogin{  
205 - // Phone: account,  
206 - // Password: password,  
207 - // }  
208 - // uclient := ucenter.NewUCenterClient()  
209 - // btBody, err := uclient.Call(param) 205 + // var uclientReturn *ucenter.ResponseLogin
  206 + // uclientReturn, err = requestUCenterLogin(account, password)
210 // if err != nil { 207 // if err != nil {
211 - // log.Error("统一用户中心请求失败 err:%s", err)  
212 - // return logintoken, protocol.NewErrWithMessage("1") 208 + // return logintoken, protocol.NewErrWithMessage("10021")
213 // } 209 // }
214 - // err = json.Unmarshal(btBody, &uclientReturn) 210 + // //更新用户数据
  211 + // _ = uclientReturn
  212 + // userdata.Accid = uclientReturn.Data.Accid
  213 + // userdata.Icon = uclientReturn.Data.Avatar
  214 + // userdata.ImToken = uclientReturn.Data.Imtoken
  215 + // userdata.NickName = uclientReturn.Data.NickName
  216 + // userdata.CsAccount = uclientReturn.Data.CustomerAccount
  217 + // userdata.LastLoginTime = time.Now()
  218 + // err = models.UpdateUserById(userdata, []string{"Accid", "Icon", "ImToken", "NickName", "CsAccount", "LastLoginTime"})
215 // if err != nil { 219 // if err != nil {
216 - // log.Error("解析统一用户中心响应失败 err:%s", err)  
217 - // return logintoken, protocol.NewErrWithMessage("1")  
218 - // }  
219 - // if !(uclientReturn.Code == ucenter.ResponseCode0 &&  
220 - // uclientReturn.Msg == ucenter.ResponseMsgOk) {  
221 - // return logintoken, protocol.NewErrWithMessage("10021") 220 + // log.Error("更新用户数据失败:%s", err)
222 // } 221 // }
223 logintoken, _ = GenerateAuthToken(userdata.Id, companyid) 222 logintoken, _ = GenerateAuthToken(userdata.Id, companyid)
224 return logintoken, err 223 return logintoken, err
225 } 224 }
226 225
  226 +func requestUCenterLogin(account, password string) (*ucenter.ResponseLogin, error) {
  227 + var uclientReturn *ucenter.ResponseLogin
  228 + param := ucenter.RequesLogin{
  229 + Type: 1,
  230 + Phone: account,
  231 + Password: password,
  232 + }
  233 + uclient := ucenter.NewUCenterClient()
  234 + btBody, err := uclient.Call(param)
  235 + if err != nil {
  236 + log.Error("统一用户中心请求失败 err:%s", err)
  237 + return nil, protocol.NewErrWithMessage("1")
  238 + }
  239 + err = json.Unmarshal(btBody, &uclientReturn)
  240 + if err != nil {
  241 + log.Error("解析统一用户中心响应失败 err:%s", err)
  242 + return nil, protocol.NewErrWithMessage("1")
  243 + }
  244 + if !(uclientReturn.Code == ucenter.ResponseCode0 &&
  245 + uclientReturn.Msg == ucenter.ResponseMsgOk) {
  246 + return nil, protocol.NewErrWithMessage("10021")
  247 + }
  248 + return uclientReturn, nil
  249 +}
  250 +
227 type companybase struct { 251 type companybase struct {
228 Id int64 `orm:"column(id)"` 252 Id int64 `orm:"column(id)"`
229 Name string `orm:"coumn(name)"` 253 Name string `orm:"coumn(name)"`
@@ -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 * 30 //主token过期时间,30分钟 71 + expiresIn int64 = 60 * 60 * 2 //主token过期时间,30分钟
72 refreshtoken string //副token,刷新主token用 72 refreshtoken string //副token,刷新主token用
73 - refreshExpires int64 = 60 * 30 * 2 //副token 过期时间 ,60分钟 73 + refreshExpires int64 = 60 * 60 * 2 //副token 过期时间 ,60分钟
74 err error 74 err error
75 nowtime = time.Now() 75 nowtime = time.Now()
76 ) 76 )
@@ -8,13 +8,21 @@ import ( @@ -8,13 +8,21 @@ import (
8 "oppmg/utils" 8 "oppmg/utils"
9 ) 9 )
10 10
11 -func SelectorDepartment(companyid int64) []protocol.DepartmentBase {  
12 - const dataSql string = `SELECT id,name,parent_id FROM department WHERE company_id = ? AND delete_at = 0` 11 +func SelectorDepartment(companyid int64, departmentid int64) []protocol.DepartmentBase {
  12 +
13 var ( 13 var (
14 err error 14 err error
15 departs []protocol.DepartmentBase 15 departs []protocol.DepartmentBase
  16 + cond []interface{}
  17 + where string
16 ) 18 )
17 - err = utils.ExecuteQueryAll(&departs, dataSql, companyid) 19 + dataSql := `SELECT id,name,parent_id FROM department WHERE company_id = ? AND delete_at = 0 `
  20 + cond = append(cond, companyid)
  21 + if departmentid >= 0 {
  22 + cond = append(cond, departmentid)
  23 + where += ` And parent_id=? `
  24 + }
  25 + err = utils.ExecuteQueryAll(&departs, dataSql+where, cond...)
18 if err != nil { 26 if err != nil {
19 e := fmt.Errorf("EXECUTE SQL err:%s", err) 27 e := fmt.Errorf("EXECUTE SQL err:%s", err)
20 log.Error(e.Error()) 28 log.Error(e.Error())
@@ -105,3 +113,43 @@ func SelectorPosition(companyid int64) []protocol.PositionBase { @@ -105,3 +113,43 @@ func SelectorPosition(companyid int64) []protocol.PositionBase {
105 return positions 113 return positions
106 114
107 } 115 }
  116 +
  117 +func SelectorUserAndDepartment(departid int64, companyId int64) (*protocol.DepartAndUser, error) {
  118 + var (
  119 + mDepart *models.Department
  120 + departsUser protocol.DepartAndUser
  121 + departbase []protocol.DepartmentBase
  122 + departMember []protocol.DepartmentMember
  123 + err error
  124 + where string
  125 + cond []interface{}
  126 + )
  127 + if departid > 0 {
  128 + mDepart, err = models.GetDepartmentById(departid)
  129 + if err != nil {
  130 + log.Error("GetDepartmentById err:%s", err)
  131 + return nil, protocol.NewErrWithMessage("1")
  132 + }
  133 + if mDepart.CompanyId != companyId {
  134 + log.Error("companyid err")
  135 + return nil, protocol.NewErrWithMessage("1")
  136 + }
  137 + departMember = mDepart.GetMembers()
  138 + departsUser.Members = departMember
  139 + }
  140 + datasql0 := `SELECT id, company_id,name,parent_id ` +
  141 + ` FROM department WHERE company_id = ? AND delete_at = 0 `
  142 + cond = append(cond, companyId)
  143 + if departid >= 0 {
  144 + cond = append(cond, departid)
  145 + where += ` AND parent_id =? `
  146 + }
  147 + err = utils.ExecuteQueryAll(&departbase, datasql0+where, cond...)
  148 + if err != nil {
  149 + e := fmt.Errorf("EXECUTE SQL err:%s", err)
  150 + log.Error(e.Error())
  151 + return nil, protocol.NewErrWithMessage("1", err)
  152 + }
  153 + departsUser.Departments = departbase
  154 + return &departsUser, nil
  155 +}
@@ -380,7 +380,7 @@ func GetDepartmentUser(companyid int64, departmentid int64) ([]protocol.DepartUs @@ -380,7 +380,7 @@ func GetDepartmentUser(companyid int64, departmentid int64) ([]protocol.DepartUs
380 department, err = models.GetDepartmentById(departmentid) 380 department, err = models.GetDepartmentById(departmentid)
381 if err != nil { 381 if err != nil {
382 log.Error("获取部门失败:%s", err) 382 log.Error("获取部门失败:%s", err)
383 - return nil, protocol.NewErrWithMessage("1") 383 + return nil, nil
384 } 384 }
385 if department.CompanyId != companyid { 385 if department.CompanyId != companyid {
386 log.Error("deparment.CompanyId err") 386 log.Error("deparment.CompanyId err")
  1 +package rbac
  2 +
  3 +import (
  4 + "oppmg/common/log"
  5 + "oppmg/models"
  6 + "oppmg/protocol"
  7 + "oppmg/utils"
  8 +
  9 + "github.com/astaxie/beego/orm"
  10 +)
  11 +
  12 +//获取全部的权限菜单
  13 +func GetMenuAll() ([]protocol.PermissionItem, error) {
  14 + const datasql string = `SELECT id,name,icon,parent_id,senior_status,sort,code
  15 + FROM menu WHERE enabled=1 ORDER BY sort `
  16 + var (
  17 + list []protocol.PermissionItem
  18 + err error
  19 + )
  20 + err = utils.ExecuteQueryAll(&list, datasql)
  21 + if err != nil {
  22 + log.Error("EXECUTE SQL err:%s", err)
  23 + return nil, protocol.NewErrWithMessage("1")
  24 + }
  25 + return list, nil
  26 +}
  27 +
  28 +//
  29 +func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus, error) {
  30 + var (
  31 + roleData *models.Role
  32 + err error
  33 + )
  34 + roleData, err = models.GetRoleById(roleid)
  35 + if err != nil {
  36 + log.Error("获取角色数据失败:%s", err)
  37 + return nil, err
  38 + }
  39 + if roleData.Types != models.ROLETYPES_ROLE {
  40 + log.Error("角色类型错误")
  41 + return nil, protocol.NewErrWithMessage("1")
  42 + }
  43 + if roleData.CompanyId != companyid {
  44 + log.Error("角色的公司id不匹配")
  45 + return nil, protocol.NewErrWithMessage("1")
  46 + }
  47 + var (
  48 + rolemenu []models.RoleMenu
  49 + ids []int64
  50 + )
  51 + rolemenu, err = models.GetRoleMenuByRole(roleid)
  52 + if err != nil {
  53 + log.Error("获取角色下的菜单数据失败:%s", err)
  54 + return nil, protocol.NewErrWithMessage("1")
  55 + }
  56 + for _, v := range rolemenu {
  57 + ids = append(ids, int64(v.MenuId))
  58 + }
  59 + data := &protocol.ResponseRoleMenus{
  60 + RoleId: roleData.Id,
  61 + RoleName: roleData.Name,
  62 + MenuId: ids,
  63 + }
  64 + return data, nil
  65 +}
  66 +
  67 +func GetRoleHasMenuAll(roleid int64, companyid int64) (map[string]PermissionContentObject, error) {
  68 + var (
  69 + roleData *models.Role
  70 + err error
  71 + )
  72 + roleData, err = models.GetRoleById(roleid)
  73 + if err != nil {
  74 + log.Error("获取角色数据失败:%s", err)
  75 + return nil, err
  76 + }
  77 + if roleData.Types != models.ROLETYPES_ROLE {
  78 + log.Error("角色类型错误")
  79 + return nil, protocol.NewErrWithMessage("1")
  80 + }
  81 + if roleData.CompanyId != companyid {
  82 + log.Error("角色的公司id不匹配")
  83 + return nil, protocol.NewErrWithMessage("1")
  84 + }
  85 + var (
  86 + rolemenu []models.RoleMenu
  87 + returnList = make(map[string]PermissionContentObject)
  88 + )
  89 + rolemenu, err = models.GetRoleMenuByRole(roleid)
  90 + if err != nil {
  91 + log.Error("获取角色下的菜单数据失败:%s", err)
  92 + return nil, protocol.NewErrWithMessage("1")
  93 + }
  94 + for _, v := range rolemenu {
  95 + if fn, ok := CodePermissionObject[v.Code]; ok {
  96 + obj := fn()
  97 + err := obj.StringUnmarshal(v.Opption)
  98 + if err != nil {
  99 + log.Error("解析权限规则失败", err)
  100 + continue
  101 + }
  102 + returnList[v.Code] = obj
  103 + }
  104 + }
  105 + return returnList, nil
  106 +}
  107 +
  108 +func RoleMenuEdit(companyid int64, roleId int64, menuids []int64) error {
  109 + roleMenus, err := GetRoleHasMenu(companyid, roleId)
  110 + if err != nil {
  111 + return err
  112 + }
  113 + var (
  114 + oldMenuIds []int64
  115 + addMenuIds []int64
  116 + delMenuIds []int64
  117 + addMenu []*models.Menu
  118 + )
  119 + oldMenuIds = roleMenus.MenuId
  120 + addMenuIds = utils.ArrayInt64Diff(menuids, oldMenuIds)
  121 + delMenuIds = utils.ArrayInt64Diff(oldMenuIds, menuids)
  122 + if len(addMenuIds) > 0 {
  123 + addMenu, err = models.GetMenuByIds(addMenuIds)
  124 + if err != nil {
  125 + log.Error("获取菜单数据失败:%s", err)
  126 + return protocol.NewErrWithMessage("1")
  127 + }
  128 + }
  129 + o := orm.NewOrm()
  130 + o.Begin()
  131 + if len(delMenuIds) > 0 {
  132 + _, err = o.QueryTable(&models.RoleMenu{}).
  133 + Filter("role_id", roleId).
  134 + Filter("menu_id__in", delMenuIds).
  135 + Delete()
  136 + if err != nil {
  137 + log.Error("删除角色和菜单关系失败:%s", err)
  138 + o.Rollback()
  139 + return protocol.NewErrWithMessage("1")
  140 + }
  141 + }
  142 + for _, v := range addMenu {
  143 + m := models.RoleMenu{
  144 + RoleId: roleId,
  145 + MenuId: v.Id,
  146 + Code: v.Code,
  147 + Opption: "{}",
  148 + }
  149 + if _, err = o.Insert(&m); err != nil {
  150 + log.Error("添加角色和菜单关系失败:%s", err)
  151 + o.Rollback()
  152 + return protocol.NewErrWithMessage("1")
  153 + }
  154 + }
  155 + o.Commit()
  156 + return nil
  157 +
  158 +}
1 package rbac 1 package rbac
2 2
3 import ( 3 import (
4 - "oppmg/common/log"  
5 - "oppmg/models"  
6 - "oppmg/protocol"  
7 - "oppmg/utils" 4 + "encoding/json"
8 ) 5 )
9 6
10 -//获取全部的权限菜单  
11 -func GetMenuAll() ([]protocol.PermissionItem, error) {  
12 - const datasql string = `SELECT id,name,icon,parent_id,senior_status,sort,code  
13 - FROM menu WHERE enabled=1 ORDER BY sort `  
14 - var (  
15 - list []protocol.PermissionItem  
16 - err error  
17 - )  
18 - err = utils.ExecuteQueryAll(&list, datasql)  
19 - if err != nil {  
20 - log.Error("EXECUTE SQL err:%s", err)  
21 - return nil, protocol.NewErrWithMessage("1")  
22 - }  
23 - return list, nil 7 +//PermissionBase 路由对应的权限
  8 +type PermissionBase struct {
  9 + CodeName string //模块标识
  10 + ActionName string
  11 + // MethodMap map[string]func()
24 } 12 }
25 13
26 -//  
27 -func GetRoleHasMenu(roleid int64, companyid int64) (*protocol.ResponseRoleMenus, error) {  
28 - var (  
29 - roleData *models.Role  
30 - err error  
31 - )  
32 - roleData, err = models.GetRoleById(roleid)  
33 - if err != nil {  
34 - log.Error("获取角色数据失败:%s", err)  
35 - return nil, err  
36 - }  
37 - if roleData.Types != models.ROLETYPES_ROLE {  
38 - log.Error("角色类型错误")  
39 - return nil, protocol.NewErrWithMessage("1")  
40 - }  
41 - if roleData.CompanyId != companyid {  
42 - log.Error("角色的公司id不匹配")  
43 - return nil, protocol.NewErrWithMessage("1")  
44 - }  
45 - var (  
46 - rolemenu []models.RoleMenu  
47 - ids []int64  
48 - )  
49 - rolemenu, err = models.GetRoleMenuByRole(roleid) 14 +var routerPermission = map[string]PermissionBase{
  15 + "/v1/department/list": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "check"},
  16 + "/v1/department/add": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "add"},
  17 + "/v1/department/edit": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "edit"},
  18 + "/v1/department/delete": PermissionBase{CodeName: "OPPMG_DEPARTMENT", ActionName: "delete"},
  19 +}
  20 +
  21 +var permissionObject = map[string]interface{}{
  22 + "": 0,
  23 +}
  24 +
  25 +//模块编号
  26 +const (
  27 + MENU_DEPARTMENT string = "OPPMG_DEPARTMENT" //公司部门管理模块
  28 + MENU_POSITION string = "OPPMG_POSITION" //公司职务管理
  29 + MENU_RBAC string = "OPPMG_RBAC" //员工角色/权限设置
  30 + MENU_USER string = "OPPMG_USER" //公司员工管理
  31 + MENU_ENTERPRISE_BASIC string = "OPPMG_ENTERPRISE_BASIC" //企业基础设置(大节点)
  32 + MENU_SYSTEM_FUNCTION string = "OPPMG_SYSTEM_FUNCTION" //系统功能(大节点)
  33 + MENU_CONMPANY string = "OPPMG_CONMPANY" //企业信息维护
  34 + MENU_CHANCE_TEMP string = "OPPMG_CHANCE_TEMP" //机会模板管理
  35 + MENU_SORCE string = "OPPMG_SORCE" //评分模式
  36 + MENU_CHANCE string = "OPPMG_CHANCE" //机会管理
  37 +)
  38 +
  39 +type PermissionContentObject interface {
  40 + StringUnmarshal(string) error
  41 + ObjectMarshal() (string, error)
  42 +}
  43 +
  44 +type PermissionContentBase struct {
  45 + Check int8 `json:"check"`
  46 +}
  47 +
  48 +func NewPermissionContentBase() PermissionContentObject {
  49 + return &PermissionContentBase{}
  50 +}
  51 +
  52 +func (p *PermissionContentBase) StringUnmarshal(s string) error {
  53 + err := json.Unmarshal([]byte(s), p)
  54 + return err
  55 +}
  56 +
  57 +func (p *PermissionContentBase) ObjectMarshal() (string, error) {
  58 + bt, err := json.Marshal(p)
50 if err != nil { 59 if err != nil {
51 - log.Error("获取角色下的菜单数据失败:%s", err)  
52 - return nil, protocol.NewErrWithMessage("1")  
53 - }  
54 - for _, v := range rolemenu {  
55 - ids = append(ids, v.MenuId) 60 + return "", err
56 } 61 }
57 - data := &protocol.ResponseRoleMenus{  
58 - RoleId: roleData.Id,  
59 - RoleName: roleData.Name,  
60 - MenuId: ids,  
61 - }  
62 - return data, nil 62 + return string(bt), err
63 } 63 }
64 64
65 -func RoleMenuEdit(companyid int64, roleid int64, menuids []int64) {  
66 65
  66 +type CodeToObject func() PermissionContentObject
  67 +
  68 +var CodePermissionObject = map[string]CodeToObject{
  69 + MENU_DEPARTMENT: NewPermissionContentBase, //公司部门管理模块
  70 + MENU_POSITION: NewPermissionContentBase, //公司职务管理
  71 + MENU_RBAC: NewPermissionContentBase, //员工角色/权限设置
  72 + MENU_USER: NewPermissionContentBase, //公司员工管理
  73 + MENU_ENTERPRISE_BASIC: NewPermissionContentBase, //企业基础设置(大节点)
  74 + MENU_SYSTEM_FUNCTION: NewPermissionContentBase, //系统功能(大节点)
  75 + MENU_CONMPANY: NewPermissionContentBase, //企业信息维护
  76 + MENU_CHANCE_TEMP: NewPermissionContentBase, //机会模板管理
  77 + MENU_SORCE: NewPermissionContentBase, //评分模式
  78 + MENU_CHANCE: NewPermissionContentBase, //机会管理
67 } 79 }
@@ -158,11 +158,6 @@ func RoleGroupDelete(param protocol.RequestRoleDelete) error { @@ -158,11 +158,6 @@ func RoleGroupDelete(param protocol.RequestRoleDelete) error {
158 return nil 158 return nil
159 } 159 }
160 160
161 -//CanSetRole 操作员是否可以操作角色  
162 -func CanSetRole(adminId int64, groupId int64) bool {  
163 - return false  
164 -}  
165 -  
166 func GetRoleList(companyId int64) ([]protocol.RoleGroup, error) { 161 func GetRoleList(companyId int64) ([]protocol.RoleGroup, error) {
167 var ( 162 var (
168 roleGroups []protocol.RoleGroup 163 roleGroups []protocol.RoleGroup
@@ -213,19 +208,3 @@ func getRoleGroupByCompany(companyid int64) ([]protocol.RoleInfo, error) { @@ -213,19 +208,3 @@ func getRoleGroupByCompany(companyid int64) ([]protocol.RoleInfo, error) {
213 err = utils.ExecuteQueryAll(&roles, datasql, companyid, models.ROLETYPES_GROUP) 208 err = utils.ExecuteQueryAll(&roles, datasql, companyid, models.ROLETYPES_GROUP)
214 return roles, err 209 return roles, err
215 } 210 }
216 -  
217 -func GetRoleGroup() error {  
218 - return nil  
219 -}  
220 -  
221 -func RoleHasPermission() error {  
222 - return nil  
223 -}  
224 -  
225 -func PermissionHasRole() error {  
226 - return nil  
227 -}  
228 -  
229 -func RolsHasUser() error {  
230 - return nil  
231 -}  
@@ -14,6 +14,7 @@ type CommResponse struct { @@ -14,6 +14,7 @@ type CommResponse struct {
14 14
15 //RequesLogin 用户登录 15 //RequesLogin 用户登录
16 type RequesLogin struct { 16 type RequesLogin struct {
  17 + Type int8 `json:"type"`
17 Password string `json:"password"` 18 Password string `json:"password"`
18 Phone string `json:"phone"` 19 Phone string `json:"phone"`
19 } 20 }
@@ -27,7 +28,7 @@ func (r RequesLogin) Format() []byte { @@ -27,7 +28,7 @@ func (r RequesLogin) Format() []byte {
27 28
28 //Format 实现IUCenterParam接口 29 //Format 实现IUCenterParam接口
29 func (r RequesLogin) GetPath() (string, string) { 30 func (r RequesLogin) GetPath() (string, string) {
30 - return "/auth/login", "POST" 31 + return "/auth/serverLogin", "POST"
31 } 32 }
32 33
33 //Format 实现IUCenterParam接口 34 //Format 实现IUCenterParam接口
@@ -48,6 +49,9 @@ type ResponseLogin struct { @@ -48,6 +49,9 @@ type ResponseLogin struct {
48 Phone string `json:"phone"` 49 Phone string `json:"phone"`
49 NickName string `json:"nickname"` //昵称 50 NickName string `json:"nickname"` //昵称
50 Avatar string `json:"avatar"` //头像 51 Avatar string `json:"avatar"` //头像
  52 + Imtoken string `json:"imtoken"` //网易云imtoken
  53 + Accid int64 `json:"accid"`
  54 + CustomerAccount int64 `json:"customerAccount"` //客服id
51 } `json:"data"` 55 } `json:"data"`
52 } 56 }
53 57
@@ -55,7 +55,7 @@ func buildCheckSum(nowTime string) string { @@ -55,7 +55,7 @@ func buildCheckSum(nowTime string) string {
55 //httpDo post发送json 55 //httpDo post发送json
56 func (client UCenterClient) httpDo(path string, mathod string, posts []byte) ([]byte, error) { 56 func (client UCenterClient) httpDo(path string, mathod string, posts []byte) ([]byte, error) {
57 httpclient := http.Client{ 57 httpclient := http.Client{
58 - Timeout: 5 * time.Second, //请求超时时间5秒 58 + Timeout: 10 * time.Second, //请求超时时间5秒
59 } 59 }
60 reqURL := client.baseUrl + path 60 reqURL := client.baseUrl + path
61 req, err := http.NewRequest(mathod, reqURL, bytes.NewReader(posts)) 61 req, err := http.NewRequest(mathod, reqURL, bytes.NewReader(posts))
@@ -64,7 +64,9 @@ func (client UCenterClient) httpDo(path string, mathod string, posts []byte) ([] @@ -64,7 +64,9 @@ func (client UCenterClient) httpDo(path string, mathod string, posts []byte) ([]
64 } 64 }
65 req.Header = client.buildHeader() 65 req.Header = client.buildHeader()
66 resp, err := httpclient.Do(req) 66 resp, err := httpclient.Do(req)
  67 +
67 log.Info("====>Send To UCenter:%s", string(posts)) 68 log.Info("====>Send To UCenter:%s", string(posts))
  69 + // log.Info("====>Send Header:%v", req.Header)
68 if err != nil { 70 if err != nil {
69 return nil, err 71 return nil, err
70 } 72 }
@@ -9,5 +9,4 @@ type RedisLoginToken struct { @@ -9,5 +9,4 @@ type RedisLoginToken struct {
9 AccessToken string `json:"access_token"` 9 AccessToken string `json:"access_token"`
10 RefreshToken string `json:"refresh_token"` 10 RefreshToken string `json:"refresh_token"`
11 CurrentCompany int64 `json:"current_company"` 11 CurrentCompany int64 `json:"current_company"`
12 - IsOk bool `json:"-"`  
13 } 12 }
@@ -23,7 +23,6 @@ func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64) @@ -23,7 +23,6 @@ func SetLoginToken(param protocol.LoginAuthToken, userid int64, companyid int64)
23 AccessToken: param.AccessToken, 23 AccessToken: param.AccessToken,
24 RefreshToken: param.RefreshToken, 24 RefreshToken: param.RefreshToken,
25 CurrentCompany: companyid, 25 CurrentCompany: companyid,
26 - IsOk: true,  
27 } 26 }
28 value, _ = json.Marshal(data) 27 value, _ = json.Marshal(data)
29 exp = param.RefreshExpires - nowTime 28 exp = param.RefreshExpires - nowTime
@@ -67,8 +66,26 @@ func ExistLoginToken(userid int64) bool { @@ -67,8 +66,26 @@ func ExistLoginToken(userid int64) bool {
67 func DeleteLoginToken(userid int64) error { 66 func DeleteLoginToken(userid int64) error {
68 client := redis.GetRedis() 67 client := redis.GetRedis()
69 key := fmt.Sprintf("%s%s:%d", KEY_PREFIX, KEY_USER_TOKEN, userid) 68 key := fmt.Sprintf("%s%s:%d", KEY_PREFIX, KEY_USER_TOKEN, userid)
70 - err:=client.Del(key).Err() 69 + err := client.Del(key).Err()
71 return err 70 return err
72 } 71 }
73 72
  73 +// 刷新token 的有效期
  74 +func RefreshLoginTokenExpires(userid int64) error {
  75 + client := redis.GetRedis()
  76 + key := fmt.Sprintf("%s%s:%d", KEY_PREFIX, KEY_USER_TOKEN, userid)
  77 + result, err := client.Exists(key).Result()
  78 + if err != nil {
  79 + return err
  80 + }
  81 + if result == 0 {
  82 + return nil
  83 + }
  84 + _, err = client.Expire(key, 30*time.Minute).Result()
  85 + if err != nil {
  86 + return err
  87 + }
  88 + return nil
  89 +}
  90 +
74 //消息发布订阅 91 //消息发布订阅
@@ -14,7 +14,7 @@ func ArrayInt64Diff(arr1 []int64, arr2 []int64) []int64 { @@ -14,7 +14,7 @@ func ArrayInt64Diff(arr1 []int64, arr2 []int64) []int64 {
14 } 14 }
15 setmap := make(map[int64]bool) 15 setmap := make(map[int64]bool)
16 for i := range arr2 { 16 for i := range arr2 {
17 - setmap[arr1[i]] = true 17 + setmap[arr2[i]] = true
18 } 18 }
19 var result []int64 19 var result []int64
20 for i := range arr1 { 20 for i := range arr1 {
@@ -26,6 +26,25 @@ func ArrayInt64Diff(arr1 []int64, arr2 []int64) []int64 { @@ -26,6 +26,25 @@ func ArrayInt64Diff(arr1 []int64, arr2 []int64) []int64 {
26 return result 26 return result
27 } 27 }
28 28
  29 +//ArrayIntDiff 返回切片的差集:arr1-arr2
  30 +func ArrayIntDiff(arr1 []int, arr2 []int) []int {
  31 + if len(arr2) == 0 {
  32 + return arr1
  33 + }
  34 + setmap := make(map[int]bool)
  35 + for i := range arr2 {
  36 + setmap[arr1[i]] = true
  37 + }
  38 + var result []int
  39 + for i := range arr1 {
  40 + if _, ok := setmap[arr1[i]]; !ok {
  41 + result = append(result, arr1[i])
  42 + }
  43 + }
  44 +
  45 + return result
  46 +}
  47 +
29 //ArrayStringIn 检查s字符串是否在切片sl中 48 //ArrayStringIn 检查s字符串是否在切片sl中
30 func ArrayStringIn(arr1 []string, s string) bool { 49 func ArrayStringIn(arr1 []string, s string) bool {
31 for _, v := range arr1 { 50 for _, v := range arr1 {
@@ -70,6 +70,7 @@ token 的响应内容 @@ -70,6 +70,7 @@ token 的响应内容
70 70
71 ```json 71 ```json
72 { 72 {
  73 + "token":""
73 "code": 0, 74 "code": 0,
74 "msg": "成功", 75 "msg": "成功",
75 "data": { 76 "data": {
@@ -147,7 +148,6 @@ token 的响应内容 @@ -147,7 +148,6 @@ token 的响应内容
147 148
148 ## 公司部门管理 149 ## 公司部门管理
149 150
150 -  
151 ### 部门列表 151 ### 部门列表
152 152
153 - 请求路径:/v1/department/list 153 - 请求路径:/v1/department/list
@@ -155,9 +155,7 @@ token 的响应内容 @@ -155,9 +155,7 @@ token 的响应内容
155 - 请求 json: 155 - 请求 json:
156 156
157 ```json 157 ```json
158 -{  
159 -  
160 -} 158 +{}
161 ``` 159 ```
162 160
163 - 正常响应 json 161 - 正常响应 json
@@ -167,16 +165,18 @@ token 的响应内容 @@ -167,16 +165,18 @@ token 的响应内容
167 "code": 0, 165 "code": 0,
168 "msg": "成功", 166 "msg": "成功",
169 "data": { 167 "data": {
170 - "list": [ 168 + "lists": [
171 { 169 {
172 "id": 1, 170 "id": 1,
173 "company_id": 1, 171 "company_id": 1,
174 "name": "部门1", 172 "name": "部门1",
175 "parant_id": 0, 173 "parant_id": 0,
176 - "manages": [{  
177 - "id":1,  
178 - "name":"主管"  
179 - }], 174 + "manages": [
  175 + {
  176 + "id": 1,
  177 + "name": "主管"
  178 + }
  179 + ],
180 "member": 1 180 "member": 1
181 }, 181 },
182 { 182 {
@@ -184,10 +184,12 @@ token 的响应内容 @@ -184,10 +184,12 @@ token 的响应内容
184 "company_id": 1, 184 "company_id": 1,
185 "name": "部门1-2", 185 "name": "部门1-2",
186 "parant_id": 1, 186 "parant_id": 1,
187 - "manages": [{  
188 - "id":1,  
189 - "name":"主管"  
190 - }], 187 + "manages": [
  188 + {
  189 + "id": 1,
  190 + "name": "主管"
  191 + }
  192 + ],
191 "member": 1 193 "member": 1
192 } 194 }
193 ] 195 ]
@@ -199,9 +201,6 @@ token 的响应内容 @@ -199,9 +201,6 @@ token 的响应内容
199 201
200 --- 202 ---
201 203
202 -  
203 -  
204 -  
205 ### 添加部门 204 ### 添加部门
206 205
207 - 请求路径:/v1/department/add 206 - 请求路径:/v1/department/add
@@ -289,7 +288,6 @@ token 的响应内容 @@ -289,7 +288,6 @@ token 的响应内容
289 288
290 ## 公司职位管理 289 ## 公司职位管理
291 290
292 -  
293 ### 职位列表 291 ### 职位列表
294 292
295 - 请求路径:/v1/position/list 293 - 请求路径:/v1/position/list
@@ -297,9 +295,7 @@ token 的响应内容 @@ -297,9 +295,7 @@ token 的响应内容
297 - 请求 json: 295 - 请求 json:
298 296
299 ```json 297 ```json
300 -{  
301 -  
302 -} 298 +{}
303 ``` 299 ```
304 300
305 - 响应 json 301 - 响应 json
@@ -448,6 +444,7 @@ token 的响应内容 @@ -448,6 +444,7 @@ token 的响应内容
448 --- 444 ---
449 445
450 ## 公司员工角色 446 ## 公司员工角色
  447 +
451 ### 角色列表 448 ### 角色列表
452 449
453 - 请求路径:/v1/rbac/role/list 450 - 请求路径:/v1/rbac/role/list
@@ -455,15 +452,12 @@ token 的响应内容 @@ -455,15 +452,12 @@ token 的响应内容
455 - 请求 json: 452 - 请求 json:
456 453
457 ```json 454 ```json
458 -{  
459 -  
460 -} 455 +{}
461 ``` 456 ```
462 457
463 - 响应 json 458 - 响应 json
464 459
465 ```json 460 ```json
466 -  
467 { 461 {
468 "code": 0, 462 "code": 0,
469 "msg": "成功", 463 "msg": "成功",
@@ -569,9 +563,6 @@ token 的响应内容 @@ -569,9 +563,6 @@ token 的响应内容
569 563
570 --- 564 ---
571 565
572 -  
573 -  
574 -  
575 ### 添加角色 566 ### 添加角色
576 567
577 - 请求路径:/v1/rbac/role/add 568 - 请求路径:/v1/rbac/role/add