zjxpcyc пре 6 година
родитељ
комит
3f1c93f506
8 измењених фајлова са 192 додато и 24 уклоњено
  1. 22
    0
      log/common.log
  2. 1
    1
      models/cases/cases.go
  3. 15
    0
      models/sys.go
  4. 17
    17
      routers/common.go
  5. 1
    1
      routers/guest.go
  6. 5
    5
      routers/wechat.go
  7. 116
    0
      utils/permission.go
  8. 15
    0
      utils/utils.go

+ 22
- 0
log/common.log Прегледај датотеку

@@ -0,0 +1,22 @@
1
+2018/08/19 11:00:44 [E] 用户登录失败: 账户不存在
2
+2018/08/19 11:02:08 [E] 用户登录失败: 账户不存在
3
+2018/08/19 11:02:30 [E] 用户登录失败: 账户不存在
4
+2018/08/19 11:04:13 [E] 用户登录失败: 账户不存在
5
+2018/08/19 11:04:23 [E] 用户登录失败: 账户不存在
6
+2018/08/19 11:04:53 [E] 用户登录失败: 账户不存在
7
+2018/08/19 12:40:59 [E] 用户登录失败: 账户不存在
8
+2018/08/19 12:41:32 [E] 用户登录失败: 账户不存在
9
+2018/08/19 12:53:00 [E] 用户登录失败: 账户不存在
10
+2018/08/19 12:53:39 [E] 用户登录失败: 账户不存在
11
+2018/08/19 12:53:59 [E] 用户登录失败: 账户不存在
12
+2018/08/19 12:56:51 [E] 用户登录失败: 账户不存在
13
+2018/08/19 12:57:10 [E] 用户登录失败: 账户不存在
14
+2018/08/19 12:58:27 [E] 用户登录失败: 账户不存在
15
+2018/08/19 13:00:08 [E] 用户登录失败: 账户不存在
16
+2018/08/19 13:33:36 [E] 用户登录失败: 账户不存在
17
+2018/08/19 13:51:39 [E] 用户登录失败: 账户不存在
18
+2018/08/19 13:51:48 [E] 用户登录失败: 账户不存在
19
+2018/08/19 13:52:14 [E] 用户登录失败: 用户密码不正确
20
+2018/08/19 13:52:14 [E] 用户登录失败: 账户不存在
21
+2018/08/19 13:52:20 [E] 用户登录失败: 账户不存在
22
+2018/08/19 13:52:27 [E] 用户登录失败: 账户不存在

+ 1
- 1
models/cases/cases.go Прегледај датотеку

@@ -1,7 +1,7 @@
1 1
 package cases
2 2
 
3 3
 import (
4
-	"jcjy/demo/models"
4
+	"spaceofcheng/services/models"
5 5
 	"spaceofcheng/services/models/model"
6 6
 	"spaceofcheng/services/utils"
7 7
 	"strconv"

+ 15
- 0
models/sys.go Прегледај датотеку

@@ -139,3 +139,18 @@ func (m *SysDAO) UpdateUserMapping(user *model.TaUserMapping) error {
139 139
 		Update(&user)
140 140
 	return err
141 141
 }
142
+
143
+// GetCaseByContext 获取案场
144
+func GetCaseByContext(ctx *utils.Context) (string, error) {
145
+	csRaw := ctx.Get("currentCase")
146
+	if csRaw == nil {
147
+		return "", errors.New("当前人员无案场权限")
148
+	}
149
+
150
+	cs := csRaw.(model.SysUserCase)
151
+	if cs.CaseId == "" || cs.Status == STATUS_DEL {
152
+		return "", errors.New("当前人员无案场权限")
153
+	}
154
+
155
+	return cs.CaseId, nil
156
+}

+ 17
- 17
routers/common.go Прегледај датотеку

@@ -91,22 +91,22 @@ func getCommonRoutes() beego.LinkNamespace {
91 91
 		beego.NSRouter("/case", &cases.CaseController{}, "put:SaveCase"),
92 92
 		beego.NSRouter("/case/:id", &cases.CaseController{}, "delete:DelCase"),
93 93
 
94
-		beego.NSRouter("/key", &cases.CaseController{}, "get:GetKeyList"),
95
-		beego.NSRouter("/key", &cases.CaseController{}, "post:AddKeys"),
96
-		beego.NSRouter("/unlock/:keyid", &cases.CaseController{}, "put:UnLockKey"),
97
-		beego.NSRouter("/key/:id", &cases.CaseController{}, "delete:DelKey"),
98
-
99
-		beego.NSRouter("/area", &cases.CaseController{}, "get:GetCaseArea"),
100
-		beego.NSRouter("/area/:areaid", &cases.CaseController{}, "get:GetCaseAreaByID"),
101
-		beego.NSRouter("/area", &cases.CaseController{}, "post:SaveCaseArea"),
102
-		beego.NSRouter("/area", &cases.CaseController{}, "put:SaveCaseArea"),
103
-		beego.NSRouter("/area/:areaid", &cases.CaseController{}, "delete:DelCaseArea"),
104
-
105
-		beego.NSRouter("/table", &cases.CaseController{}, "get:GetCaseTable"),
106
-		beego.NSRouter("/table/:tableid", &cases.CaseController{}, "get:GetCaseTableByID"),
107
-		beego.NSRouter("/table", &cases.CaseController{}, "post:SaveCaseTable"),
108
-		beego.NSRouter("/table", &cases.CaseController{}, "put:SaveCaseTable"),
109
-		beego.NSRouter("/table/:tableid", &cases.CaseController{}, "delete:DelCaseTable"),
94
+		beego.NSRouter("/casekey", &cases.CaseController{}, "get:GetKeyList"),
95
+		beego.NSRouter("/casekey", &cases.CaseController{}, "post:AddKeys"),
96
+		beego.NSRouter("/caseunlock/:keyid", &cases.CaseController{}, "put:UnLockKey"),
97
+		beego.NSRouter("/casekey/:id", &cases.CaseController{}, "delete:DelKey"),
98
+
99
+		beego.NSRouter("/casearea", &cases.CaseController{}, "get:GetCaseArea"),
100
+		beego.NSRouter("/casearea/:areaid", &cases.CaseController{}, "get:GetCaseAreaByID"),
101
+		beego.NSRouter("/casearea", &cases.CaseController{}, "post:SaveCaseArea"),
102
+		beego.NSRouter("/casearea", &cases.CaseController{}, "put:SaveCaseArea"),
103
+		beego.NSRouter("/casearea/:areaid", &cases.CaseController{}, "delete:DelCaseArea"),
104
+
105
+		beego.NSRouter("/casetable", &cases.CaseController{}, "get:GetCaseTable"),
106
+		beego.NSRouter("/casetable/:tableid", &cases.CaseController{}, "get:GetCaseTableByID"),
107
+		beego.NSRouter("/casetable", &cases.CaseController{}, "post:SaveCaseTable"),
108
+		beego.NSRouter("/casetable", &cases.CaseController{}, "put:SaveCaseTable"),
109
+		beego.NSRouter("/casetable/:tableid", &cases.CaseController{}, "delete:DelCaseTable"),
110 110
 
111 111
 		beego.NSRouter("/role", &system.RoleController{}, "get:GetRoleList"),
112 112
 		beego.NSRouter("/role/:roleid", &system.RoleController{}, "get:GetRoleByID"),
@@ -121,6 +121,6 @@ func getCommonRoutes() beego.LinkNamespace {
121 121
 		beego.NSRouter("/customer", &customer.CustomerController{}, "get:CustWXList"),
122 122
 
123 123
 		// 系统相关
124
-		beego.NSRouter("/system/env", &user.UserController{}, "get:GetEnvVars"),
124
+		beego.NSRouter("/system/init", &user.UserController{}, "get:GetEnvVars"),
125 125
 	)
126 126
 }

+ 1
- 1
routers/guest.go Прегледај датотеку

@@ -20,7 +20,7 @@ func getGuestRoutes() beego.LinkNamespace {
20 20
 		beego.NSRouter("/cms/news", &message.MessageController{}, "get:GetNewsByLocation"),
21 21
 
22 22
 		// 案场
23
-		beego.NSRouter("/case/area", &cases.CaseController{}, "get:GetAreaByCase"),
23
+		beego.NSRouter("/casearea", &cases.CaseController{}, "get:GetAreaByCase"),
24 24
 
25 25
 		// 验证码 获取, 校验
26 26
 		beego.NSRouter("/captcha", &controllers.BaseController{}, "get:SendCaptcha"),

+ 5
- 5
routers/wechat.go Прегледај датотеку

@@ -36,11 +36,11 @@ func getWechatRoutes() beego.LinkNamespace {
36 36
 		beego.NSRouter("/signout", &user.UserController{}, "post:SignOut"),
37 37
 
38 38
 		// cms 位置
39
-		beego.NSRouter("/cms/location", &message.MessageController{}, "get:GetLocations"),
40
-		beego.NSRouter("/cms/location/:locationid", &message.MessageController{}, "get:GetLocationById"),
41
-		beego.NSRouter("/cms/location", &message.MessageController{}, "post:SaveLocation"),
42
-		beego.NSRouter("/cms/location/:locationid", &message.MessageController{}, "put:SaveLocation"),
43
-		beego.NSRouter("/cms/location/:locationid", &message.MessageController{}, "delete:DelLocation"),
39
+		beego.NSRouter("/cms/area", &message.MessageController{}, "get:GetLocations"),
40
+		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "get:GetLocationById"),
41
+		beego.NSRouter("/cms/area", &message.MessageController{}, "post:SaveLocation"),
42
+		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "put:SaveLocation"),
43
+		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "delete:DelLocation"),
44 44
 
45 45
 		// cms
46 46
 		beego.NSRouter("/cms/info", &message.MessageController{}, "get:GetCmsInfoList"),

+ 116
- 0
utils/permission.go Прегледај датотеку

@@ -0,0 +1,116 @@
1
+package utils
2
+
3
+import (
4
+	"errors"
5
+
6
+	"github.com/go-xorm/xorm"
7
+)
8
+
9
+// 系统内置数据种类
10
+const (
11
+	DATATYPE_USER   = "user"
12
+	DATATYPE_CASE   = "case"
13
+	DATATYPE_COURSE = "course"
14
+	DATATYPE_COUPON = "coupon"
15
+	DATATYPE_CARD   = "card"
16
+)
17
+
18
+// DataAuthEngine 鉴权数据
19
+type DataAuthEngine struct {
20
+	db *xorm.Engine
21
+}
22
+
23
+// NewDataAuthEngine 新建实例
24
+func NewDataAuthEngine(db *xorm.Engine) *DataAuthEngine {
25
+	return &DataAuthEngine{
26
+		db: db,
27
+	}
28
+}
29
+
30
+// HasUserPermission 是否有人员权限
31
+func (t *DataAuthEngine) HasUserPermission(userID, borrower string, caseID ...string) error {
32
+	// 1、先判断组织是否相同
33
+	userOrg, err := t.getOrgOfData(userID, DATATYPE_USER)
34
+	if err != nil {
35
+		LogError("查询用户(" + userID + ") 所属组织失败: " + err.Error())
36
+		return errors.New("查询用户相关信息失败")
37
+	}
38
+
39
+	borwOrg, err := t.getOrgOfData(borrower, DATATYPE_USER)
40
+	if err != nil {
41
+		LogError("查询用户(" + borrower + ") 所属组织失败: " + err.Error())
42
+		return errors.New("查询用户相关信息失败")
43
+	}
44
+
45
+	if userOrg != borwOrg {
46
+		return errors.New("人员不存在或无权浏览")
47
+	}
48
+
49
+	// 2、再判断是否案场相同
50
+	sameCases, err := t.getSameCase(userID, borrower)
51
+	if err != nil {
52
+		return errors.New("用户没有相同案场授权")
53
+	}
54
+
55
+	// 3、是否指定了案场
56
+	if len(caseID) > 0 {
57
+		if StrSliceIndexOf(sameCases, caseID[0]) < 0 {
58
+			return errors.New("用户没有当前案场权限")
59
+		}
60
+	}
61
+
62
+	return nil
63
+}
64
+
65
+func (t *DataAuthEngine) getOrgOfData(dataID, dataType string) (string, error) {
66
+	org := make(map[string]interface{})
67
+
68
+	switch dataType {
69
+	// 用户
70
+	case DATATYPE_USER:
71
+		if _, err := t.db.SQL("select org_id from sys_user where user_id = ?", dataID).Get(&org); err != nil {
72
+			return "", err
73
+		}
74
+
75
+		orgID := org["org_id"].(string)
76
+		return orgID, nil
77
+
78
+		// 案场
79
+	case DATATYPE_CASE:
80
+		if _, err := t.db.SQL("select org_id from sys_case where case_id = ?", dataID).Get(&org); err != nil {
81
+			return "", err
82
+		}
83
+
84
+		orgID := org["org_id"].(string)
85
+		return orgID, nil
86
+	default:
87
+		return "", nil
88
+	}
89
+}
90
+
91
+func (t *DataAuthEngine) getSameCase(user1, user2 string) ([]string, error) {
92
+	sql := `
93
+		SELECT t.case_id
94
+		FROM
95
+			sys_user_case t
96
+		JOIN sys_user_case s ON t.user_id = ?
97
+		AND s.user_id = ?
98
+		AND t.case_id = s.case_id	
99
+	`
100
+	res, err := t.db.Query(sql, user1, user2)
101
+	if err != nil {
102
+		LogError("查询用户相同案场失败: " + err.Error())
103
+		return nil, err
104
+	}
105
+
106
+	if res == nil || len(res) == 0 {
107
+		return nil, errors.New("用户没有相同案场授权")
108
+	}
109
+
110
+	csIDs := make([]string, 0)
111
+	for _, cs := range res {
112
+		csIDs = append(csIDs, string(cs["case_id"]))
113
+	}
114
+
115
+	return csIDs, nil
116
+}

+ 15
- 0
utils/utils.go Прегледај датотеку

@@ -33,3 +33,18 @@ func GetClientType(r *http.Request) string {
33 33
 
34 34
 	return ClientAdmin
35 35
 }
36
+
37
+// StrSliceIndexOf slice indexof
38
+func StrSliceIndexOf(s []string, t string) int64 {
39
+	if s == nil || len(s) == 0 {
40
+		return -1
41
+	}
42
+
43
+	for k, v := range s {
44
+		if v == t {
45
+			return int64(k)
46
+		}
47
+	}
48
+
49
+	return -1
50
+}