Skip to content

Commit b4f840b

Browse files
committed
refactor: 添加DAO层,分离视图函数中数据库相关的业务逻辑
1 parent 58b43dc commit b4f840b

10 files changed

Lines changed: 524 additions & 294 deletions

File tree

app/api/cms/admin.py

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

10-
from flask import jsonify, request
10+
from flask import jsonify
11+
from lin.core import get_ep_infos, route_meta
12+
from lin.exception import Success
13+
from lin.jwt import admin_required
1114
from lin.log import Logger
12-
1315
from lin.redprint import Redprint
14-
from lin.core import get_ep_infos, manager, find_auth_module, route_meta, find_user
15-
from lin.jwt import admin_required
16-
from lin.util import paginate
17-
from lin.db import db, get_total_nums
18-
from lin.enums import UserSuper, UserActive
19-
from lin.exception import NotFound, Forbidden, Success, ParameterException
2016

17+
from app.dao.auth import AuthDAO
18+
from app.dao.group import GroupDAO
19+
from app.dao.user import UserDAO
2120
from app.validators.forms import NewGroup, DispatchAuth, DispatchAuths, RemoveAuths, UpdateGroup, ResetPasswordForm, \
2221
UpdateUserInfoForm
2322

@@ -35,157 +34,81 @@ def authority():
3534
@route_meta(auth='查询所有用户', module='管理员', mount=False)
3635
@admin_required
3736
def get_admin_users():
38-
start, count = paginate()
39-
group_id = request.args.get('group_id')
40-
condition = {'super': UserSuper.COMMON.value, 'group_id': group_id} if group_id else {
41-
'super': UserSuper.COMMON.value}
42-
users = db.session.query(manager.user_model, manager.group_model.name) \
43-
.filter_by(soft=True, **condition) \
44-
.join(manager.group_model, manager.user_model.group_id == manager.group_model.id) \
45-
.offset(start).limit(count).all()
46-
user_and_group = []
47-
for user, group_name in users:
48-
setattr(user, 'group_name', group_name)
49-
user._fields.append('group_name')
50-
user.hide('update_time', 'delete_time')
51-
user_and_group.append(user)
52-
# 有分组的时候就加入分组条件
53-
# total_nums = get_total_nums(manager.user_model, is_soft=True, super=UserSuper.COMMON.value)
54-
total_nums = get_total_nums(manager.user_model, is_soft=True, **condition)
37+
user_and_group, total_nums = UserDAO().get_all()
5538
return jsonify({
5639
"collection": user_and_group,
57-
# 超级管理员不算入总数
5840
'total_nums': total_nums
5941
})
6042

6143

62-
@admin_api.route('/password/<int:id>', methods=['PUT'])
44+
@admin_api.route('/password/<int:uid>', methods=['PUT'])
6345
@route_meta(auth='修改用户密码', module='管理员', mount=False)
6446
@admin_required
65-
def change_user_password(id):
47+
def change_user_password(uid):
6648
form = ResetPasswordForm().validate_for_api()
67-
user = find_user(id=id)
68-
if user is None:
69-
raise NotFound(msg='用户不存在')
70-
with db.auto_commit():
71-
user.reset_password(form.new_password.data)
49+
UserDAO().reset_user_password(uid, form.new_password.data)
7250
return Success(msg='密码修改成功')
7351

7452

75-
@admin_api.route('/<int:id>', methods=['DELETE'])
53+
@admin_api.route('/<int:uid>', methods=['DELETE'])
7654
@route_meta(auth='删除用户', module='管理员', mount=False)
7755
@Logger(template='管理员删除了一个用户') # 记录日志
7856
@admin_required
79-
def delete_user(id):
80-
user = manager.user_model.get(id=id)
81-
if user is None:
82-
raise NotFound(msg='用户不存在')
83-
# user.delete(commit=True)
84-
# 此处我们使用硬删除,一般情况下,推荐使用软删除即,上一行注释的代码
85-
user.hard_delete(commit=True)
57+
def delete_user(uid):
58+
UserDAO().remove_user(uid)
8659
return Success(msg='操作成功')
8760

8861

89-
@admin_api.route('/<int:id>', methods=['PUT'])
62+
@admin_api.route('/<int:uid>', methods=['PUT'])
9063
@route_meta(auth='管理员更新用户信息', module='管理员', mount=False)
9164
@admin_required
92-
def update_user(id):
65+
def update_user(uid):
9366
form = UpdateUserInfoForm().validate_for_api()
94-
user = manager.user_model.get(id=id)
95-
if user is None:
96-
raise NotFound(msg='用户不存在')
97-
if user.email != form.email.data:
98-
exit = manager.user_model.get(email=form.email.data)
99-
if exit:
100-
raise ParameterException(msg='邮箱已被注册,请重新输入邮箱')
101-
with db.auto_commit():
102-
user.email = form.email.data
103-
user.group_id = form.group_id.data
67+
UserDAO().update(uid, form)
10468
return Success(msg='操作成功')
10569

10670

107-
@admin_api.route('/disable/<int:id>', methods=['PUT'])
71+
@admin_api.route('/disable/<int:uid>', methods=['PUT'])
10872
@route_meta(auth='禁用用户', module='管理员', mount=False)
10973
@admin_required
110-
def trans2disable(id):
111-
user = manager.user_model.get(id=id)
112-
if user is None:
113-
raise NotFound(msg='用户不存在')
114-
if not user.is_active:
115-
raise Forbidden(msg='当前用户已处于禁止状态')
116-
with db.auto_commit():
117-
user.active = UserActive.NOT_ACTIVE.value
74+
def trans2disable(uid):
75+
UserDAO().change_status(uid, 'active')
11876
return Success(msg='操作成功')
11977

12078

121-
@admin_api.route('/active/<int:id>', methods=['PUT'])
79+
@admin_api.route('/active/<int:uid>', methods=['PUT'])
12280
@route_meta(auth='激活用户', module='管理员', mount=False)
12381
@admin_required
124-
def trans2active(id):
125-
user = manager.user_model.get(id=id)
126-
if user is None:
127-
raise NotFound(msg='用户不存在')
128-
if user.is_active:
129-
raise Forbidden(msg='当前用户已处于激活状态')
130-
with db.auto_commit():
131-
user.active = UserActive.ACTIVE.value
82+
def trans2active(uid):
83+
UserDAO().change_status(uid, 'disable')
13284
return Success(msg='操作成功')
13385

13486

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

15698

157-
def _split_modules(auths):
158-
auths.sort(key=itemgetter('module'))
159-
tmps = groupby(auths, itemgetter('module'))
160-
res = []
161-
for key, group in tmps:
162-
res.append({key: list(group)})
163-
return res
164-
165-
16699
@admin_api.route('/group/all', methods=['GET'])
167100
@route_meta(auth='查询所有权限组', module='管理员', mount=False)
168101
@admin_required
169102
def get_all_group():
170-
groups = manager.group_model.get(one=False)
171-
if groups is None:
172-
raise NotFound(msg='不存在任何权限组')
103+
groups = GroupDAO().get_all()
173104
return jsonify(groups)
174105

175106

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

191114

@@ -195,73 +118,43 @@ def get_group(id):
195118
@admin_required
196119
def create_group():
197120
form = NewGroup().validate_for_api()
198-
exist = manager.group_model.get(name=form.name.data)
199-
if exist:
200-
raise Forbidden(msg='分组已存在,不可创建同名分组')
201-
with db.auto_commit():
202-
group = manager.group_model.create(name=form.name.data, info=form.info.data)
203-
db.session.flush()
204-
for auth in form.auths.data:
205-
meta = find_auth_module(auth)
206-
if meta:
207-
manager.auth_model.create(auth=meta.auth, module=meta.module, group_id=group.id)
121+
GroupDAO().new_group(form)
208122
return Success(msg='新建分组成功')
209123

210124

211-
@admin_api.route('/group/<int:id>', methods=['PUT'])
125+
@admin_api.route('/group/<int:gid>', methods=['PUT'])
212126
@route_meta(auth='更新一个权限组', module='管理员', mount=False)
213127
@admin_required
214-
def update_group(id):
128+
def update_group(gid):
215129
form = UpdateGroup().validate_for_api()
216-
exist = manager.group_model.get(id=id)
217-
if not exist:
218-
raise NotFound(msg='分组不存在,更新失败')
219-
exist.update(name=form.name.data, info=form.info.data, commit=True)
130+
GroupDAO().update_group(gid, form)
220131
return Success(msg='更新分组成功')
221132

222133

223-
@admin_api.route('/group/<int:id>', methods=['DELETE'])
134+
@admin_api.route('/group/<int:gid>', methods=['DELETE'])
224135
@route_meta(auth='删除一个权限组', module='管理员', mount=False)
225136
@Logger(template='管理员删除一个权限组') # 记录日志
226137
@admin_required
227-
def delete_group(id):
228-
exist = manager.group_model.get(id=id)
229-
if not exist:
230-
raise NotFound(msg='分组不存在,删除失败')
231-
if manager.user_model.get(group_id=id):
232-
raise Forbidden(msg='分组下存在用户,不可删除')
233-
# 删除group拥有的权限
234-
db.session.query(manager.auth_model).filter(manager.auth_model.group_id == id).delete()
235-
exist.delete(commit=True)
138+
def delete_group(gid):
139+
GroupDAO().remove_group(gid)
236140
return Success(msg='删除分组成功')
237141

238142

239143
@admin_api.route('/dispatch', methods=['POST'])
240144
@route_meta(auth='分配单个权限', module='管理员', mount=False)
241145
@admin_required
242146
def dispatch_auth():
243-
form = DispatchAuth()
244-
form.validate_for_api()
245-
one = manager.auth_model.get(group_id=form.group_id.data, auth=form.auth.data)
246-
if one:
247-
raise Forbidden(msg='已有权限,不可重复添加')
248-
meta = find_auth_module(form.auth.data)
249-
manager.auth_model.create(group_id=form.group_id.data, auth=meta.auth, module=meta.module, commit=True)
147+
form = DispatchAuth().validate_for_api()
148+
AuthDAO().patch_one(form)
250149
return Success(msg='添加权限成功')
251150

252151

253152
@admin_api.route('/dispatch/patch', methods=['POST'])
254153
@route_meta(auth='分配多个权限', module='管理员', mount=False)
255154
@admin_required
256155
def dispatch_auths():
257-
form = DispatchAuths()
258-
form.validate_for_api()
259-
with db.auto_commit():
260-
for auth in form.auths.data:
261-
one = manager.auth_model.get(group_id=form.group_id.data, auth=auth)
262-
if not one:
263-
meta = find_auth_module(auth)
264-
manager.auth_model.create(group_id=form.group_id.data, auth=meta.auth, module=meta.module)
156+
form = DispatchAuths().validate_for_api()
157+
AuthDAO().patch_all(form)
265158
return Success(msg='添加权限成功')
266159

267160

@@ -270,13 +163,18 @@ def dispatch_auths():
270163
@admin_required
271164
def remove_auths():
272165
form = RemoveAuths().validate_for_api()
273-
with db.auto_commit():
274-
db.session.query(manager.auth_model) \
275-
.filter(manager.auth_model.auth.in_(form.auths.data),
276-
manager.auth_model.group_id == form.group_id.data) \
277-
.delete(synchronize_session=False)
166+
AuthDAO().remove_auths(form)
278167
return Success(msg='删除权限成功')
279168

169+
170+
def _split_modules(auths):
171+
auths.sort(key=itemgetter('module'))
172+
tmps = groupby(auths, itemgetter('module'))
173+
res = []
174+
for key, group in tmps:
175+
res.append({key: list(group)})
176+
return res
177+
280178
# --------------------------------------------------
281179
# --------------------Abandon-----------------------
282180
# --------------------------------------------------

app/api/cms/log.py

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

6-
from flask import request, jsonify
7-
from sqlalchemy import text
8-
from lin.redprint import Redprint
6+
from flask import jsonify
7+
from lin.core import route_meta
98
from lin.jwt import group_required
10-
from lin.exception import NotFound, ParameterException
11-
from lin.db import db
12-
from lin.util import paginate
13-
from lin.core import Log, route_meta
9+
from lin.redprint import Redprint
10+
11+
from app.dao.log import LogDAO
1412
from app.validators.forms import LogFindForm
1513

1614
log_api = Redprint('log')
@@ -22,16 +20,7 @@
2220
@group_required
2321
def get_logs():
2422
form = LogFindForm().validate_for_api()
25-
start, count = paginate()
26-
logs = db.session.query(Log).filter()
27-
if form.name.data:
28-
logs = logs.filter(Log.user_name == form.name.data)
29-
if form.start.data and form.end.data:
30-
logs = logs.filter(Log.time.between(form.start.data, form.end.data))
31-
total_nums = logs.count()
32-
logs = logs.order_by(text('time desc')).offset(start).limit(count).all()
33-
if logs is None or len(logs) < 1:
34-
raise NotFound(msg='没有找到相关日志')
23+
logs, total_nums = LogDAO().get_by_paginate(form)
3524
return jsonify({
3625
"total_nums": total_nums,
3726
"collection": logs
@@ -43,20 +32,8 @@ def get_logs():
4332
@route_meta(auth='搜索日志', module='日志')
4433
@group_required
4534
def get_user_logs():
46-
keyword = request.args.get('keyword', default=None, type=str)
47-
if keyword is None or '':
48-
raise ParameterException(msg='搜索关键字不可为空')
49-
start, count = paginate()
5035
form = LogFindForm().validate_for_api()
51-
logs = db.session.query(Log).filter(Log.message.like(f'%{keyword}%'))
52-
if form.name.data:
53-
logs = logs.filter(Log.user_name == form.name.data)
54-
if form.start.data and form.end.data:
55-
logs = logs.filter(Log._time.between(form.start.data, form.end.data))
56-
total_nums = logs.count()
57-
logs = logs.order_by(text('time desc')).offset(start).limit(count).all()
58-
if logs is None or len(logs) < 1:
59-
raise NotFound(msg='没有找到相关日志')
36+
logs, total_nums = LogDAO().search_by_keyword(form)
6037
return jsonify({
6138
"total_nums": total_nums,
6239
"collection": logs
@@ -67,9 +44,5 @@ def get_user_logs():
6744
@route_meta(auth='查询日志记录的用户', module='日志')
6845
@group_required
6946
def get_users():
70-
start, count = paginate()
71-
user_names = db.session.query(Log.user_name).filter_by(soft=False) \
72-
.group_by(text('user_name')).having(text('count(user_name) > 0')).offset(start) \
73-
.limit(count).all()
74-
res = [user_name[0] for user_name in user_names]
75-
return jsonify(res)
47+
users = LogDAO().get_users_by_paginate()
48+
return jsonify(users)

0 commit comments

Comments
 (0)