Skip to content

Commit a4e275f

Browse files
committed
refactor: 为了方便学习源码,移除掉DAO层
1 parent 8f9f65c commit a4e275f

9 files changed

Lines changed: 246 additions & 386 deletions

File tree

app/api/cms/admin.py

Lines changed: 161 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
from itertools import groupby
88
from operator import itemgetter
99

10-
from flask import jsonify
11-
from lin.core import get_ep_infos, route_meta
12-
from lin.exception import Success
10+
from flask import jsonify, request
11+
from lin import db
12+
from lin.core import get_ep_infos, route_meta, manager, find_user, find_auth_module
13+
from lin.db import get_total_nums
14+
from lin.enums import UserSuper, UserActive
15+
from lin.exception import Success, NotFound, ParameterException, Forbidden
1316
from lin.jwt import admin_required
1417
from lin.log import Logger
1518
from lin.redprint import Redprint
1619

17-
from app.dao.auth import AuthDAO
18-
from app.dao.group import GroupDAO
19-
from app.dao.user import UserDAO
20+
from app.libs.utils import paginate
2021
from app.validators.forms import NewGroup, DispatchAuth, DispatchAuths, RemoveAuths, UpdateGroup, ResetPasswordForm, \
2122
UpdateUserInfoForm
2223

@@ -34,7 +35,31 @@ def authority():
3435
@route_meta(auth='查询所有用户', module='管理员', mount=False)
3536
@admin_required
3637
def get_admin_users():
37-
user_and_group, total_nums = UserDAO().get_all()
38+
start, count = paginate()
39+
group_id = request.args.get('group_id')
40+
condition = {
41+
'super': UserSuper.COMMON.value,
42+
'group_id': group_id
43+
} if group_id else {
44+
'super': UserSuper.COMMON.value
45+
}
46+
47+
users = db.session.query(
48+
manager.user_model, manager.group_model.name
49+
).filter_by(soft=True, **condition).join(
50+
manager.group_model,
51+
manager.user_model.group_id == manager.group_model.id
52+
).offset(start).limit(count).all()
53+
54+
user_and_group = []
55+
for user, group_name in users:
56+
setattr(user, 'group_name', group_name)
57+
user._fields.append('group_name')
58+
user.hide('update_time', 'delete_time')
59+
user_and_group.append(user)
60+
# 有分组的时候就加入分组条件
61+
# total_nums = get_total_nums(manager.user_model, is_soft=True, super=UserSuper.COMMON.value)
62+
total_nums = get_total_nums(manager.user_model, is_soft=True, **condition)
3863
return jsonify({
3964
"collection": user_and_group,
4065
'total_nums': total_nums
@@ -46,7 +71,13 @@ def get_admin_users():
4671
@admin_required
4772
def change_user_password(uid):
4873
form = ResetPasswordForm().validate_for_api()
49-
UserDAO().reset_user_password(uid, form.new_password.data)
74+
75+
user = find_user(id=uid)
76+
if user is None:
77+
raise NotFound(msg='用户不存在')
78+
with db.auto_commit():
79+
user.reset_password(form.new_password.data)
80+
5081
return Success(msg='密码修改成功')
5182

5283

@@ -55,7 +86,12 @@ def change_user_password(uid):
5586
@Logger(template='管理员删除了一个用户') # 记录日志
5687
@admin_required
5788
def delete_user(uid):
58-
UserDAO().remove_user(uid)
89+
user = manager.user_model.get(id=uid)
90+
if user is None:
91+
raise NotFound(msg='用户不存在')
92+
# user.delete(commit=True)
93+
# 此处我们使用硬删除,一般情况下,推荐使用软删除即,上一行注释的代码
94+
user.hard_delete(commit=True)
5995
return Success(msg='操作成功')
6096

6197

@@ -64,34 +100,60 @@ def delete_user(uid):
64100
@admin_required
65101
def update_user(uid):
66102
form = UpdateUserInfoForm().validate_for_api()
67-
UserDAO().update(uid, form)
103+
104+
user = manager.user_model.get(id=uid)
105+
if user is None:
106+
raise NotFound(msg='用户不存在')
107+
if user.email != form.email.data:
108+
exists = manager.user_model.get(email=form.email.data)
109+
if exists:
110+
raise ParameterException(msg='邮箱已被注册,请重新输入邮箱')
111+
with db.auto_commit():
112+
user.email = form.email.data
113+
user.group_id = form.group_id.data
68114
return Success(msg='操作成功')
69115

70116

71117
@admin_api.route('/disable/<int:uid>', methods=['PUT'])
72118
@route_meta(auth='禁用用户', module='管理员', mount=False)
73119
@admin_required
74120
def trans2disable(uid):
75-
UserDAO().change_status(uid, 'active')
121+
_change_status(uid, 'active')
76122
return Success(msg='操作成功')
77123

78124

79125
@admin_api.route('/active/<int:uid>', methods=['PUT'])
80126
@route_meta(auth='激活用户', module='管理员', mount=False)
81127
@admin_required
82128
def trans2active(uid):
83-
UserDAO().change_status(uid, 'disable')
129+
_change_status(uid, 'disable')
84130
return Success(msg='操作成功')
85131

86132

87133
@admin_api.route('/groups', methods=['GET'])
88134
@route_meta(auth='查询所有权限组及其权限', module='管理员', mount=False)
89135
@admin_required
90136
def get_admin_groups():
91-
groups_info, total_nums = GroupDAO().get_groups_info()
137+
start, count = paginate()
138+
groups = manager.group_model.query.filter().offset(
139+
start).limit(count).all()
140+
if groups is None:
141+
raise NotFound(msg='不存在任何权限组')
142+
143+
for group in groups:
144+
auths = db.session.query(
145+
manager.auth_model.auth, manager.auth_model.module
146+
).filter_by(soft=False, group_id=group.id).all()
147+
148+
auths = [{'auth': auth[0], 'module': auth[1]} for auth in auths]
149+
res = _split_modules(auths)
150+
setattr(group, 'auths', res)
151+
group._fields.append('auths')
152+
153+
total_nums = get_total_nums(manager.group_model)
92154

93155
return jsonify({
94-
"collection": groups_info,
156+
"collection": groups,
95157
'total_nums': total_nums
96158
})
97159

@@ -100,15 +162,26 @@ def get_admin_groups():
100162
@route_meta(auth='查询所有权限组', module='管理员', mount=False)
101163
@admin_required
102164
def get_all_group():
103-
groups = GroupDAO().get_all()
165+
groups = manager.group_model.get(one=False)
166+
if groups is None:
167+
raise NotFound(msg='不存在任何权限组')
104168
return jsonify(groups)
105169

106170

107171
@admin_api.route('/group/<int:gid>', methods=['GET'])
108172
@route_meta(auth='查询一个权限组及其权限', module='管理员', mount=False)
109173
@admin_required
110174
def get_group(gid):
111-
group = GroupDAO().get_single_info(gid)
175+
group = manager.group_model.get(id=gid, one=True, soft=False)
176+
if group is None:
177+
raise NotFound(msg='分组不存在')
178+
auths = db.session.query(
179+
manager.auth_model.auth, manager.auth_model.module
180+
).filter_by(soft=False, group_id=group.id).all()
181+
auths = [{'auth': auth[0], 'module': auth[1]} for auth in auths]
182+
res = _split_modules(auths)
183+
setattr(group, 'auths', res)
184+
group._fields.append('auths')
112185
return jsonify(group)
113186

114187

@@ -118,7 +191,18 @@ def get_group(gid):
118191
@admin_required
119192
def create_group():
120193
form = NewGroup().validate_for_api()
121-
GroupDAO().new_group(form)
194+
exists = manager.group_model.get(name=form.name.data)
195+
if exists:
196+
raise Forbidden(msg='分组已存在,不可创建同名分组')
197+
with db.auto_commit():
198+
group = manager.group_model.create(name=form.name.data, info=form.info.data)
199+
db.session.flush()
200+
201+
for auth in form.auths.data:
202+
meta = find_auth_module(auth)
203+
if meta:
204+
manager.auth_model.create(auth=meta.auth, module=meta.module, group_id=group.id)
205+
122206
return Success(msg='新建分组成功')
123207

124208

@@ -127,7 +211,10 @@ def create_group():
127211
@admin_required
128212
def update_group(gid):
129213
form = UpdateGroup().validate_for_api()
130-
GroupDAO().update_group(gid, form)
214+
exists = manager.group_model.get(id=gid)
215+
if not exists:
216+
raise NotFound(msg='分组不存在,更新失败')
217+
exists.update(name=form.name.data, info=form.info.data, commit=True)
131218
return Success(msg='更新分组成功')
132219

133220

@@ -136,7 +223,14 @@ def update_group(gid):
136223
@Logger(template='管理员删除一个权限组') # 记录日志
137224
@admin_required
138225
def delete_group(gid):
139-
GroupDAO().remove_group(gid)
226+
exist = manager.group_model.get(id=gid)
227+
if not exist:
228+
raise NotFound(msg='分组不存在,删除失败')
229+
if manager.user_model.get(group_id=gid):
230+
raise Forbidden(msg='分组下存在用户,不可删除')
231+
# 删除group拥有的权限
232+
manager.auth_model.query.filter(manager.auth_model.group_id == gid).delete()
233+
exist.delete(commit=True)
140234
return Success(msg='删除分组成功')
141235

142236

@@ -145,7 +239,16 @@ def delete_group(gid):
145239
@admin_required
146240
def dispatch_auth():
147241
form = DispatchAuth().validate_for_api()
148-
AuthDAO().patch_one(form)
242+
one = manager.auth_model.get(group_id=form.group_id.data, auth=form.auth.data)
243+
if one:
244+
raise Forbidden(msg='已有权限,不可重复添加')
245+
meta = find_auth_module(form.auth.data)
246+
manager.auth_model.create(
247+
group_id=form.group_id.data,
248+
auth=meta.auth,
249+
module=meta.module,
250+
commit=True
251+
)
149252
return Success(msg='添加权限成功')
150253

151254

@@ -154,7 +257,16 @@ def dispatch_auth():
154257
@admin_required
155258
def dispatch_auths():
156259
form = DispatchAuths().validate_for_api()
157-
AuthDAO().patch_all(form)
260+
with db.auto_commit():
261+
for auth in form.auths.data:
262+
one = manager.auth_model.get(group_id=form.group_id.data, auth=auth)
263+
if not one:
264+
meta = find_auth_module(auth)
265+
manager.auth_model.create(
266+
group_id=form.group_id.data,
267+
auth=meta.auth,
268+
module=meta.module
269+
)
158270
return Success(msg='添加权限成功')
159271

160272

@@ -163,7 +275,13 @@ def dispatch_auths():
163275
@admin_required
164276
def remove_auths():
165277
form = RemoveAuths().validate_for_api()
166-
AuthDAO().remove_auths(form)
278+
279+
with db.auto_commit():
280+
db.session.query(manager.auth_model).filter(
281+
manager.auth_model.auth.in_(form.auths.data),
282+
manager.auth_model.group_id == form.group_id.data
283+
).delete(synchronize_session=False)
284+
167285
return Success(msg='删除权限成功')
168286

169287

@@ -175,6 +293,27 @@ def _split_modules(auths):
175293
res.append({key: list(group)})
176294
return res
177295

296+
297+
def _change_status(uid, active_or_disable='active'):
298+
user = manager.user_model.get(id=uid)
299+
if user is None:
300+
raise NotFound(msg='用户不存在')
301+
302+
active_or_not = UserActive.NOT_ACTIVE.value \
303+
if active_or_disable == 'active' \
304+
else UserActive.ACTIVE.value
305+
306+
if active_or_disable == 'active':
307+
if not user.is_active:
308+
raise Forbidden(msg='当前用户已处于禁止状态')
309+
310+
elif active_or_disable == 'disable':
311+
if user.is_active:
312+
raise Forbidden(msg='当前用户已处于激活状态')
313+
314+
with db.auto_commit():
315+
user.active = active_or_not
316+
178317
# --------------------------------------------------
179318
# --------------------Abandon-----------------------
180319
# --------------------------------------------------

app/api/cms/log.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
:license: MIT, see LICENSE for more details.
44
"""
55

6-
from flask import jsonify
7-
from lin.core import route_meta
6+
from flask import jsonify, request
7+
from lin import db
8+
from lin.core import route_meta, Log
9+
from lin.exception import NotFound, ParameterException
810
from lin.jwt import group_required
911
from lin.redprint import Redprint
12+
from lin.util import paginate
13+
from sqlalchemy import text
1014

11-
from app.dao.log import LogDAO
1215
from app.validators.forms import LogFindForm
1316

1417
log_api = Redprint('log')
@@ -20,7 +23,16 @@
2023
@group_required
2124
def get_logs():
2225
form = LogFindForm().validate_for_api()
23-
logs, total_nums = LogDAO().get_by_paginate(form)
26+
start, count = paginate()
27+
logs = db.session.query(Log).filter()
28+
if form.name.data:
29+
logs = logs.filter(Log.user_name == form.name.data)
30+
if form.start.data and form.end.data:
31+
logs = logs.filter(Log.time.between(form.start.data, form.end.data))
32+
total_nums = logs.count()
33+
logs = logs.order_by(text('time desc')).offset(start).limit(count).all()
34+
if not logs:
35+
raise NotFound(msg='没有找到相关日志')
2436
return jsonify({
2537
"total_nums": total_nums,
2638
"collection": logs
@@ -33,7 +45,19 @@ def get_logs():
3345
@group_required
3446
def get_user_logs():
3547
form = LogFindForm().validate_for_api()
36-
logs, total_nums = LogDAO().search_by_keyword(form)
48+
keyword = request.args.get('keyword', default=None, type=str)
49+
if keyword is None or '':
50+
raise ParameterException(msg='搜索关键字不可为空')
51+
start, count = paginate()
52+
logs = Log.query.filter(Log.message.like(f'%{keyword}%'))
53+
if form.name.data:
54+
logs = logs.filter(Log.user_name == form.name.data)
55+
if form.start.data and form.end.data:
56+
logs = logs.filter(Log._time.between(form.start.data, form.end.data))
57+
total_nums = logs.count()
58+
logs = logs.order_by(text('time desc')).offset(start).limit(count).all()
59+
if not logs:
60+
raise NotFound(msg='没有找到相关日志')
3761
return jsonify({
3862
"total_nums": total_nums,
3963
"collection": logs
@@ -44,5 +68,9 @@ def get_user_logs():
4468
@route_meta(auth='查询日志记录的用户', module='日志')
4569
@group_required
4670
def get_users():
47-
users = LogDAO().get_users_by_paginate()
71+
start, count = paginate()
72+
user_names = db.session.query(Log.user_name).filter_by(
73+
soft=False).group_by(text('user_name')).having(
74+
text('count(user_name) > 0')).offset(start).limit(count).all()
75+
users = [user_name[0] for user_name in user_names]
4876
return jsonify(users)

0 commit comments

Comments
 (0)