Skip to content

Commit 16a41d7

Browse files
committed
update server
1 parent 7f26fcc commit 16a41d7

File tree

18 files changed

+668
-150
lines changed

18 files changed

+668
-150
lines changed

api/authentication/model.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ def can(self, gid, permissions=Permission.VIEW):
8282
return False
8383
# 判断是否在组中 [ r for r in self.roles if 组 == r.组]
8484
permissions_list = [r.permissions for r in self.roles if r.groups_id == int(gid) or r.groups_id == 2]
85+
print("can:", permissions_list, gid)
8586
if permissions_list:
8687
all_perms = reduce(lambda x, y: x | y, permissions_list)
8788
else:
@@ -106,10 +107,10 @@ def password(self, password):
106107
def verify_password(self, password):
107108
return check_password_hash(self.password_hash, password)
108109

109-
def to_json(self):
110+
def to_json(self, gid):
110111
doc = self.__dict__
111-
print("roles", self.roles)
112-
print(doc)
112+
doc['roles'] = self.roles
113+
# print(self.username, self.roles)
113114
if "_sa_instance_state" in doc:
114115
del doc["_sa_instance_state"]
115116

@@ -126,9 +127,7 @@ def to_json(self):
126127
doc['last_login_at'] = doc['last_login_at'].split('.')[0]
127128

128129
if doc.get('roles', None):
129-
doc['roles'] = [r.to_json() for r in doc['roles']]
130-
131-
print('json:', doc)
130+
doc['roles'] = [str(r.permissions) for r in doc['roles'] if r.groups_id == gid]
132131

133132
return doc
134133

api/authentication/view.py

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,13 @@ def post(self):
101101
email = request.values.get('email', None)
102102
password = request.values.get('password', None)
103103
_secret = current_app.config.get('SECRET_KEY')
104+
print("identfied", email, password)
104105

105106
with current_app.test_client() as c:
106107
resp = c.post('/auth', headers={'Content-Type': 'application/json'},
107108
data=json.dumps({"username": email, "password": password}))
108109
data = json.loads(resp.data.decode('utf8'))
110+
print("auth", data)
109111
if data.get('error'):
110112
raise ErrorCode(451, data.get('description', "Bad Request"))
111113

@@ -120,7 +122,10 @@ def post(self):
120122
logging.error("get token error: %s." % str(e))
121123
state = isinstance(e, ErrorCode) and e or ErrorCode(451, "unknown error:" + str(e))
122124

123-
return {'result': {'username': email, 'token': token, 'exp': exp}, 'state': state.message}, state.eid
125+
return {'result': {'username': email,
126+
'token': token,
127+
'exp': exp,
128+
'permission': Permission.PERMISSION_MAP}, 'state': state.message}, state.eid
124129

125130

126131
class Users(Resource):
@@ -129,6 +134,9 @@ def __init__(self):
129134
self.parser.add_argument('user', type=str, required=True, location='form')
130135
self.parser.add_argument('passwd', type=str, required=True, location='form')
131136

137+
self.parser_post = reqparse.RequestParser()
138+
self.parser_post.add_argument('roles', type=list, action='append', location=['form', 'values', 'json'])
139+
132140
self.parser_get = reqparse.RequestParser()
133141
self.parser_get.add_argument('user', type=str, required=False, location='args')
134142
super(Users, self).__init__()
@@ -149,14 +157,14 @@ def get(self):
149157
description: "JWT <token>"
150158
- in: query
151159
name: gid
152-
type: string
160+
type: integer
153161
- in: query
154162
name: page
155-
type: string
163+
type: integer
156164
description: 当前页
157165
- in: query
158166
name: pageSize
159-
type: string
167+
type: integer
160168
description: 每页显示量
161169
responses:
162170
200:
@@ -171,19 +179,16 @@ def get(self):
171179
page_size = int(request.values.get('pageSize', 10))
172180
keyword = request.values.get('keyword', "")
173181

174-
print(1, page_size)
175182
# 如果是超级管理员可获取所有用户信息
176-
if self.gid == 2:
177-
print(2, page_size)
183+
if self.gid == 0:
178184
users_class = User.query.filter(or_(User.username.like("%"+keyword+"%"),
179185
User.email.like("%"+keyword+"%"),
180186
User.phone.like("%"+keyword+"%"),
181187
User.job.like("%"+keyword+"%"),)
182-
).order_by(User.id.desc()).paginate(page, page_size, error_out=False)
188+
).order_by(User.id.desc()).paginate(page, page_size, error_out=True)
183189

184190
# 否则获取指定项目下的所有用户
185191
else:
186-
print(page_size)
187192
users_class = User.query.join(User.roles).filter(
188193
and_(Role.groups_id == self.gid,
189194
or_(User.email.like("%"+keyword+"%"),
@@ -194,9 +199,8 @@ def get(self):
194199

195200
users = users_class.items
196201
users_total = users_class.total
197-
print("user:", users)
198202

199-
doc = [u.to_json() for u in users]
203+
doc = [u.to_json(self.gid) for u in users]
200204

201205
except Exception as e:
202206
logging.error("get user info error: %s." % str(e))
@@ -205,9 +209,10 @@ def get(self):
205209
return {'result': {'doc': doc, 'total': users_total}, 'state': state.message}, state.eid
206210

207211
@jwt_required()
212+
@permission_required(Permission.VIEW)
208213
def post(self):
209214
"""
210-
员工信息修改接口
215+
用户添加修改
211216
---
212217
tags:
213218
- USER
@@ -217,6 +222,18 @@ def post(self):
217222
type: string
218223
required: true
219224
description: "JWT <token>"
225+
- in: formData
226+
name: id
227+
type: integer
228+
description: "用户ID"
229+
- in: formData
230+
name: username
231+
type: string
232+
description: "用户名"
233+
- in: formData
234+
name: job
235+
type: string
236+
description: "职位"
220237
- in: formData
221238
name: phone
222239
type: string
@@ -225,6 +242,14 @@ def post(self):
225242
name: email
226243
type: string
227244
description: "邮箱"
245+
- in: formData
246+
name: active
247+
type: string
248+
description: "是否激活"
249+
- in: formData
250+
name: roles
251+
type: array
252+
description: "角色"
228253
responses:
229254
200:
230255
description: 员工信息修改接口
@@ -233,24 +258,52 @@ def post(self):
233258
state = STATE_OK
234259
rs = False
235260
try:
236-
uid = current_identity.__dict__.get('id')
261+
request_param = dict(request.values.items())
262+
print("user post:", request_param)
263+
uid = request.values.get("id", None)
264+
username = request.values.get("username", None)
237265
phone = request.values.get("phone", None)
238266
email = request.values.get("email", None)
239-
user = User.query.get(int(uid))
240-
if phone or email:
241-
if phone:
242-
user.phone = phone
267+
job = request.values.get("job", None)
268+
roles = request.values.get("roles", "").split(',')
269+
print(roles, type(roles))
243270

244-
if email:
245-
user.email = email
271+
if not username and not email:
272+
raise STATE_PARAM_ERR
246273

247-
db.session.add(user)
248-
db.session.commit()
274+
if not uid:
275+
user = User(username=username,
276+
email=email,
277+
phone=phone,
278+
job=job,
279+
active=True)
249280

250-
rs = True
281+
password = current_app.config.get('PASSWORD_KEY')
282+
user.password = password
251283

252284
else:
253-
raise STATE_PARAM_ERR
285+
user = User.query.get(int(uid))
286+
user.username = username,
287+
user.email = email,
288+
user.phone = phone,
289+
user.job = job
290+
user.active = True
291+
292+
if roles:
293+
print("roles", roles)
294+
for r in roles:
295+
role = Role.query.filter_by(groups_id=self.gid, permissions=int(r)).first()
296+
print("role s", role)
297+
if role not in user.roles:
298+
print("not role s")
299+
user.roles.append(role)
300+
301+
# user.roles
302+
print("db sssss")
303+
db.session.add(user)
304+
db.session.commit()
305+
306+
rs = True
254307

255308
except Exception as e:
256309
logging.error("get user info error: %s." % str(e))
@@ -305,7 +358,7 @@ def get(self):
305358
page_size = int(request.values.get('pageSize', 10))
306359
keyword = request.values.get('keyword', "")
307360

308-
if self.gid == 2:
361+
if self.gid == 2 and [r for r in self.user.roles if r.groups_id == 2]:
309362
groups_class = Groups.query.filter(Groups.name.like('%{0}%'.format(keyword))).order_by(
310363
Groups.id.desc()).paginate(page, page_size, error_out=False)
311364

utils/ErrorCode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __str__(self):
1313
STATE_CREATE_OK = ErrorCode(201, '创建资源ok')
1414
STATE_UNKNOWN = ErrorCode(451, '未知错误')
1515
STATE_LOGIN_ERR = ErrorCode(401, '登陆验证错误')
16-
STATE_PARAM_ERR = ErrorCode(402, '参数错误')
16+
STATE_PARAM_ERR = ErrorCode(400, '参数错误')
1717
STATE_DB_UPDATE_ERR = ErrorCode(422, '数据库更新错误')
18-
STATE_EmptyData_ERR = ErrorCode(400, '数据库查询为空数据')
18+
STATE_EmptyData_ERR = ErrorCode(402, '数据库查询为空数')
1919
STATE_PreconditionFailed = ErrorCode(412, '字段中给出先决条件时,没能满足其中的一个或多个')

utils/permission.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ def decorator(f):
2323
@wraps(f)
2424
def _deco(self, *args, **kwargs):
2525
print("self post", dict(request.values.items()))
26+
self.gid = request.values.get("gid", 2)
27+
2628
if permission == Permission.SUPER_ADMIN:
2729
self.gid = 2
2830

2931
else:
30-
self.gid = int(request.values.get("gid", 2))
32+
self.gid = int(self.gid) if self.gid else 2
3133

3234
uid = current_identity.__dict__.get('id')
3335
self.user = User.query.get(int(uid))

vue-init/src/api/auth.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,24 @@ export const getUsers = (token, gid=2, page=1, pageSize=10, keyword=null) => {
9696
})
9797
};
9898

99+
export const postUsers = (token, data) => {
100+
let l = new Array()
101+
for (let r of data.roles) {
102+
l.push(r)
103+
}
104+
delete data.roles
105+
data["roles"] = l.join()
106+
107+
return axios({
108+
method: 'post',
109+
url: baseUrl + '/api/v1/user',
110+
headers: {
111+
'Authorization': 'JWT '+token,
112+
'Content-Type': 'application/x-www-form-urlencoded'
113+
},
114+
data: Qs.stringify(data)
115+
})
116+
};
99117
export default {
100118
getUsers,
101119
deleteGroups,

vue-init/src/components/layout.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,18 @@
176176
menus: [
177177
{name: 'Overview', icon:'speedometer', path: '/'},
178178
{name: '资产管理', icon:'ios-paper', path: [
179-
{name: '服务器管理', icon:'ios-navigate', path: '/'},
180-
{name: 'IDC管理', icon:'android-list', path: '/user'}
179+
{name: '服务器列表', icon:'ios-navigate', path: '/server'},
180+
{name: 'IDC管理', icon:'android-list', path: '/user'},
181+
{name: '服务器分组', icon:'android-list', path: '/server_group'}
181182
]},
182183
{name: '权限管理', icon:'ios-paper', path: [
183184
{name: '用户管理', icon:'ios-navigate', path: '/user'},
184185
{name: '项目管理', icon:'android-list', path: '/group'}
186+
]},
187+
{name: '服务器操作', icon:'ios-paper', path: [
188+
{name: '代码发布', icon:'ios-navigate', path: '/user'},
189+
{name: 'Pipeline', icon:'android-list', path: '/group'},
190+
{name: '批量操作', icon:'android-list', path: '/group'}
185191
]}
186192
]
187193
}

vue-init/src/components/login.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@
151151
this.$store.dispatch('save_token', {
152152
'user': res.data.result.username,
153153
'token': res.data.result.token,
154-
'src': res.data.result.src
154+
'src': res.data.result.src,
155+
'roles': res.data.result.permission
155156
});
156157
this.$Message.success('提交成功!');
157158
this.$router.push('/');

0 commit comments

Comments
 (0)