From 54708377074de61e80955a036d19da8474cc24d8 Mon Sep 17 00:00:00 2001 From: zhengxinonly Date: Wed, 21 Jul 2021 02:19:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor(api):=E5=89=8D=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=8D=8A=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/__init__.py | 20 ------ applications/extensions/__init__.py | 2 +- applications/templates/admin/file/photo.html | 60 +++++++++++++++-- .../templates/admin/file/photo_add.html | 65 ------------------- applications/templates/admin/login.html | 2 +- applications/templates/admin/user/avatar.html | 2 +- applications/templates/index/index.html | 10 ++- applications/view/__init__.py | 30 +++++---- applications/view/department/__init__.py | 4 -- applications/view/file/__init__.py | 51 +++++++++++++++ applications/view/file/file.py | 55 +++------------- applications/view/index/__init__.py | 26 +++++--- applications/view/index/index.py | 8 --- .../{system/logs.py => logs_view/__init__.py} | 8 +-- applications/view/passport/__init__.py | 59 ++--------------- applications/view/passport/api.py | 53 +++++++++++++++ applications/view/rights/__init__.py | 15 +++-- applications/view/rights/right.py | 11 ++-- applications/view/roles/__init__.py | 24 +++++++ applications/view/roles/_utils.py | 12 ++-- applications/view/roles/role.py | 28 ++------ applications/view/system/__init__.py | 15 ----- applications/view/system/index.py | 19 ------ applications/view/users/__init__.py | 59 ++++------------- applications/view/users/profile.py | 16 ++--- applications/view/users/user_view.py | 48 +++++++++++++- 26 files changed, 338 insertions(+), 364 deletions(-) delete mode 100644 applications/templates/admin/file/photo_add.html delete mode 100644 applications/view/index/index.py rename applications/view/{system/logs.py => logs_view/__init__.py} (90%) create mode 100644 applications/view/passport/api.py delete mode 100644 applications/view/system/__init__.py delete mode 100644 applications/view/system/index.py diff --git a/applications/__init__.py b/applications/__init__.py index 7a6ea03..2b47f44 100644 --- a/applications/__init__.py +++ b/applications/__init__.py @@ -30,29 +30,9 @@ def create_app(config_name=None): configure_uploads(app, photos) logo() - register_shell(app) return app -def register_shell(app: Flask): - @app.cli.command() - def create(): - """测试关系""" - from .extensions import db - from .models import Power, User - from .models import PowerSchema - power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类 - user = User.query.get(1) - power_list = [] - for role in user.role: - if role.enable: - for power in role.power: - # 权限被启用 - if power.enable and power: - power_list.append(power) - power_dict = sorted(power_list, key=lambda i: i['sort']) - - def logo(): print(''' _____ _ _ ______ _ _ diff --git a/applications/extensions/__init__.py b/applications/extensions/__init__.py index d248209..9b0765c 100644 --- a/applications/extensions/__init__.py +++ b/applications/extensions/__init__.py @@ -11,5 +11,5 @@ def init_plugs(app: Flask) -> None: init_login_manager(app) init_databases(app) init_template_directives(app) - init_error_views(app) + # init_error_views(app) register_script(app) diff --git a/applications/templates/admin/file/photo.html b/applications/templates/admin/file/photo.html index c194c56..ffe736b 100644 --- a/applications/templates/admin/file/photo.html +++ b/applications/templates/admin/file/photo.html @@ -10,6 +10,29 @@
+ + +{#添加文件内容#} + + {% include 'admin/common/footer.html' %} \ No newline at end of file + + \ No newline at end of file diff --git a/applications/templates/admin/file/photo_add.html b/applications/templates/admin/file/photo_add.html deleted file mode 100644 index 20d343b..0000000 --- a/applications/templates/admin/file/photo_add.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - {% include 'admin/common/header.html' %} - - - -
-
-
-
-
- 新增图片 -
-
-
- - - -
-
-
-
-
-
-{% include 'admin/common/footer.html' %} - - - \ No newline at end of file diff --git a/applications/templates/admin/login.html b/applications/templates/admin/login.html index 35c51c9..fc18b93 100644 --- a/applications/templates/admin/login.html +++ b/applications/templates/admin/login.html @@ -61,7 +61,7 @@ btn.stop(function () { if (result.success) { popup.success(result.msg, function () { - location.href = "{{ url_for('admin.index') }}" + location.href = "{{ url_for('index.admin_index') }}" }) } else { popup.failure(result.msg, function () { diff --git a/applications/templates/admin/user/avatar.html b/applications/templates/admin/user/avatar.html index 2d1f166..8ecacfa 100644 --- a/applications/templates/admin/user/avatar.html +++ b/applications/templates/admin/user/avatar.html @@ -65,7 +65,7 @@ formData.append('fileToken', timeStamp) $.ajax({ method: 'post', - url: '/admin/file/upload', //用于文件上传的服务器端请求地址 + url: '/file/upload', //用于文件上传的服务器端请求地址 data: formData, processData: false, contentType: false, diff --git a/applications/templates/index/index.html b/applications/templates/index/index.html index bb31903..86c53b5 100644 --- a/applications/templates/index/index.html +++ b/applications/templates/index/index.html @@ -23,10 +23,14 @@
- +
- +
  • 首页 diff --git a/applications/view/__init__.py b/applications/view/__init__.py index 36c9ee7..0a10759 100644 --- a/applications/view/__init__.py +++ b/applications/view/__init__.py @@ -1,13 +1,21 @@ -from applications.view.system import register_system_views -from applications.view.index import register_index_views -from applications.view.passport import register_passport_views -from applications.view.rights import register_rights_view -from applications.view.department import register_dept_views +from flask import Flask + +from .department import dept_bp +from .file import file_bp +from .index import index_bp +from .logs_view import logs_bp +from .passport import passport_bp +from .rights import rights_bp +from .roles import role_bp +from .users import users_bp -def init_view(app): - register_system_views(app) - register_index_views(app) - register_rights_view(app) - register_passport_views(app) - register_dept_views(app) +def init_view(app: Flask): + app.register_blueprint(dept_bp) + app.register_blueprint(file_bp) + app.register_blueprint(index_bp) + app.register_blueprint(logs_bp) + app.register_blueprint(passport_bp) + app.register_blueprint(rights_bp) + app.register_blueprint(role_bp) + app.register_blueprint(users_bp) diff --git a/applications/view/department/__init__.py b/applications/view/department/__init__.py index 9f5082d..3a4bf0e 100644 --- a/applications/view/department/__init__.py +++ b/applications/view/department/__init__.py @@ -11,10 +11,6 @@ dept_bp = Blueprint('dept', __name__, url_prefix='/dept') dept_api = Api(dept_bp) -def register_dept_views(app): - app.register_blueprint(dept_bp) - - @dept_bp.get('/') @authorize("admin:dept:main", log=True) def main(): diff --git a/applications/view/file/__init__.py b/applications/view/file/__init__.py index e69de29..0c566f4 100644 --- a/applications/view/file/__init__.py +++ b/applications/view/file/__init__.py @@ -0,0 +1,51 @@ +import os + +from flask import Blueprint, request, render_template, current_app +from flask_restful import marshal +from sqlalchemy import desc + +from applications.common.serialization import photo_fields +from applications.common.utils.http import table_api, success_api, fail_api +from applications.common.utils.rights import authorize +from applications.extensions import db +from applications.models import Photo + +file_bp = Blueprint('file', __name__, url_prefix='/file') + + +# 图片管理 +@file_bp.get('/') +@authorize("admin:file:main", log=True) +def index(): + return render_template('admin/file/photo.html') + + +# 图片数据 +@file_bp.get('/table') +@authorize("admin:file:main", log=True) +def table(): + page = request.args.get('page', type=int) + limit = request.args.get('limit', type=int) + photo_paginate = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit, error_out=False) + data = marshal(photo_paginate.items, photo_fields) + return table_api(data=data, count=photo_paginate.total) + + +# 图片批量删除 +@file_bp.route('/batchRemove', methods=['GET', 'POST']) +@authorize("admin:file:delete", log=True) +def batch_remove(): + ids = request.form.getlist('ids[]') + photo_name = Photo.query.filter(Photo.id.in_(ids)).all() + upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") + for p in photo_name: + os.remove(upload_url + '/' + p.name) + photo = Photo.query.filter(Photo.id.in_(ids)).delete(synchronize_session=False) + db.session.commit() + if photo: + return success_api(msg="删除成功") + else: + return fail_api(msg="删除失败") + + +from . import file diff --git a/applications/view/file/file.py b/applications/view/file/file.py index ef27bbd..a34d160 100644 --- a/applications/view/file/file.py +++ b/applications/view/file/file.py @@ -1,43 +1,19 @@ -import os -from flask import Blueprint, request, render_template, jsonify, current_app, make_response -from flask_restful import Api, Resource, marshal -from sqlalchemy import desc +from flask import request, jsonify +from flask_restful import Api, Resource -from applications.common.serialization import photo_fields -from applications.common.utils.http import fail_api, success_api, table_api +from applications.common.utils.http import fail_api, success_api from applications.common.utils.rights import authorize -from applications.extensions import db -from applications.models import Photo +from applications.view.file import file_bp +from applications.view.file._utils import upload_one, delete_photo_by_id -from applications.view.file._utils import delete_photo_by_id, upload_one - -file_bp = Blueprint('file', __name__, url_prefix='/file') file_api = Api(file_bp) -# 图片管理 -@file_bp.get('/') -@authorize("admin:file:main", log=True) -def index(): - return render_template('admin/file/photo.html') - - -# 图片数据 -@file_bp.get('/table') -@authorize("admin:file:main", log=True) -def table(): - page = request.args.get('page', type=int) - limit = request.args.get('limit', type=int) - photo_paginate = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit, error_out=False) - data = marshal(photo_paginate.items, photo_fields) - return table_api(data=data, count=photo_paginate.total) - - @file_api.resource('/upload') class Upload(Resource): - @authorize("admin:file:add", log=True) - def get(self): - return make_response(render_template('admin/file/photo_add.html')) + # @authorize("admin:file:add", log=True) + # def get(self): + # return make_response(render_template('admin/file/photo_add.html')) @authorize("admin:file:add", log=True) def post(self): @@ -66,18 +42,3 @@ class Upload(Resource): return fail_api(msg="删除失败") -# 图片批量删除 -@file_bp.route('/batchRemove', methods=['GET', 'POST']) -@authorize("admin:file:delete", log=True) -def batch_remove(): - ids = request.form.getlist('ids[]') - photo_name = Photo.query.filter(Photo.id.in_(ids)).all() - upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") - for p in photo_name: - os.remove(upload_url + '/' + p.name) - photo = Photo.query.filter(Photo.id.in_(ids)).delete(synchronize_session=False) - db.session.commit() - if photo: - return success_api(msg="删除成功") - else: - return fail_api(msg="删除失败") diff --git a/applications/view/index/__init__.py b/applications/view/index/__init__.py index ad62adf..3fc4835 100644 --- a/applications/view/index/__init__.py +++ b/applications/view/index/__init__.py @@ -1,14 +1,24 @@ from flask import Blueprint +from flask import render_template +from flask_login import login_required, current_user -index_bp = Blueprint('index', __name__, url_prefix='/') - -from . import index +index_bp = Blueprint('index', __name__) -def register_index_views(app): - """ - 初始化蓝图 +@index_bp.route('/') +def index(): + return render_template('index/index.html') - """ - app.register_blueprint(index_bp) +# 首页 +@index_bp.get('/admin') +@login_required +def admin_index(): + return render_template('admin/index.html', user=current_user) + + +# 控制台页面 +@index_bp.get('/admin/welcome') +@login_required +def welcome(): + return render_template('admin/console/welcome.html') diff --git a/applications/view/index/index.py b/applications/view/index/index.py deleted file mode 100644 index 53d8a0b..0000000 --- a/applications/view/index/index.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import render_template - -from . import index_bp - - -@index_bp.route('/') -def index(): - return render_template('index/index.html') diff --git a/applications/view/system/logs.py b/applications/view/logs_view/__init__.py similarity index 90% rename from applications/view/system/logs.py rename to applications/view/logs_view/__init__.py index e3f424b..5243301 100644 --- a/applications/view/system/logs.py +++ b/applications/view/logs_view/__init__.py @@ -7,16 +7,16 @@ from applications.common.utils.http import table_api from applications.common.utils.rights import authorize from applications.models import AdminLog -admin_log = Blueprint('logs', __name__, url_prefix='/logs') +logs_bp = Blueprint('logs', __name__, url_prefix='/logs') -@admin_log.get('/') +@logs_bp.get('/') @authorize("admin:log:main") def index(): return render_template('admin/admin_log/main.html') -@admin_log.get('/login_log') +@logs_bp.get('/login_log') @authorize("admin:log:main") def login_log(): page = request.args.get('page', type=int) @@ -30,7 +30,7 @@ def login_log(): return table_api(data=data, count=log_paginate.total) -@admin_log.get('/access_log') +@logs_bp.get('/access_log') @authorize("admin:log:main") def operate_log(): page = request.args.get('page', type=int) diff --git a/applications/view/passport/__init__.py b/applications/view/passport/__init__.py index e856c02..7ff048c 100644 --- a/applications/view/passport/__init__.py +++ b/applications/view/passport/__init__.py @@ -1,17 +1,10 @@ -from flask import Blueprint, session, redirect, url_for, render_template, request, make_response -from flask_login import current_user, login_user, login_required, logout_user -from flask_restful import Resource, Api, reqparse -from applications.common.admin_log import login_log -from applications.common.utils.http import fail_api, success_api -from applications.models import User +from flask import Blueprint, session +from flask_login import login_required, logout_user + +from applications.common.utils.http import success_api from ._utils import get_captcha_image, add_auth_session passport_bp = Blueprint('passport', __name__, url_prefix='/passport') -passport_api = Api(passport_bp) - - -def register_passport_views(app): - app.register_blueprint(passport_bp) # 获取验证码 @@ -22,47 +15,6 @@ def get_captcha(): return resp -@passport_api.resource('/login') -class Login(Resource): - login_req = reqparse.RequestParser(bundle_errors=True) - login_req.add_argument('username', type=str, help='请输入用户名', required=True) - login_req.add_argument('password', type=str, help='请输入密码', required=True) - login_req.add_argument('captcha', type=str, help='请输入验证码', required=True) - - def get(self): - if current_user.is_authenticated: - return redirect(url_for('admin.index')) - - return make_response(render_template('admin/login.html')) - - def post(self): - - req = self.login_req.parse_args() - - s_code = session.get("code", None) - - if req.captcha != s_code: - return fail_api(msg="验证码错误") - user = User.query.filter_by(username=req.username).first() - - if user is None: - return fail_api(msg="不存在的用户") - - if user.enable is 0: - return fail_api(msg="用户被暂停使用") - - if user.validate_password(req.password): - # 登录 - login_user(user) - # 记录登录日志 - login_log(request, uid=user.id, is_access=True) - # 存入权限 - add_auth_session() - return success_api(msg="登录成功") - login_log(request, uid=user.id, is_access=False) - return fail_api(msg="用户名或密码错误") - - # 退出登录 @passport_bp.post('/logout') @login_required @@ -70,3 +22,6 @@ def logout(): logout_user() session.pop('permissions') return success_api(msg="注销成功") + + +from . import api diff --git a/applications/view/passport/api.py b/applications/view/passport/api.py new file mode 100644 index 0000000..ba41d07 --- /dev/null +++ b/applications/view/passport/api.py @@ -0,0 +1,53 @@ +from flask import session, redirect, url_for, request +from flask_login import current_user, login_user +from flask_restful import Resource, reqparse, Api +from applications.common.admin_log import login_log +from applications.common.utils.http import fail_api, success_api +from applications.models import User +from . import passport_bp +from ._utils import add_auth_session + +from flask import render_template, make_response + +passport_api = Api(passport_bp) + + +@passport_api.resource('/login') +class Login(Resource): + login_req = reqparse.RequestParser(bundle_errors=True) + login_req.add_argument('username', type=str, help='请输入用户名', required=True) + login_req.add_argument('password', type=str, help='请输入密码', required=True) + login_req.add_argument('captcha', type=str, help='请输入验证码', required=True) + + def get(self): + if current_user.is_authenticated: + return redirect(url_for('admin.index')) + # TODO 分离视图操作 最终实现接口登录与视图登录两套逻辑 + return make_response(render_template('admin/login.html')) + + def post(self): + + req = self.login_req.parse_args() + + s_code = session.get("code", None) + + if req.captcha != s_code: + return fail_api(msg="验证码错误") + user = User.query.filter_by(username=req.username).first() + + if user is None: + return fail_api(msg="不存在的用户") + + if user.enable is 0: + return fail_api(msg="用户被暂停使用") + + if user.validate_password(req.password): + # 登录 + login_user(user) + # 记录登录日志 + login_log(request, uid=user.id, is_access=True) + # 存入权限 + add_auth_session() + return success_api(msg="登录成功") + login_log(request, uid=user.id, is_access=False) + return fail_api(msg="用户名或密码错误") diff --git a/applications/view/rights/__init__.py b/applications/view/rights/__init__.py index a95846d..b048f07 100644 --- a/applications/view/rights/__init__.py +++ b/applications/view/rights/__init__.py @@ -1,12 +1,17 @@ -from flask import Blueprint, Flask +from flask import Blueprint, render_template from flask_restful import Api +from ...common.utils.rights import authorize + rights_bp = Blueprint('rights', __name__, url_prefix='/rights') rights_api = Api(rights_bp) + +@rights_bp.get('/') +@authorize("admin:power:main", log=True) +def index(): + return render_template('admin/rights/main.html') + + from . import routes from . import right - - -def register_rights_view(app: Flask): - app.register_blueprint(rights_bp) diff --git a/applications/view/rights/right.py b/applications/view/rights/right.py index 4f75942..04b1116 100644 --- a/applications/view/rights/right.py +++ b/applications/view/rights/right.py @@ -1,4 +1,4 @@ -from flask import render_template, request, jsonify, make_response +from flask import request, jsonify from flask_restful import Resource, reqparse from . import rights_bp, rights_api @@ -8,6 +8,9 @@ from ...common.utils.rights import authorize from ...extensions import db from ...models import Power, Role +# TODO 分离视图操作 +from flask import render_template, make_response + parser_power = reqparse.RequestParser(bundle_errors=True) parser_power.add_argument('icon', type=str) parser_power.add_argument('openType', type=str, dest='open_type') @@ -19,12 +22,6 @@ parser_power.add_argument('powerUrl', type=str, dest='power_url') parser_power.add_argument('sort', type=int, dest='sort') -@rights_bp.get('/') -@authorize("admin:power:main", log=True) -def index(): - return render_template('admin/rights/main.html') - - @rights_bp.get('/data') @authorize("admin:power:main", log=True) def data(): diff --git a/applications/view/roles/__init__.py b/applications/view/roles/__init__.py index e69de29..cb75587 100644 --- a/applications/view/roles/__init__.py +++ b/applications/view/roles/__init__.py @@ -0,0 +1,24 @@ +from flask import Blueprint, render_template + +from applications.common.utils.rights import authorize + +from applications.view.roles._utils import remove_role, batch_remove_role + +role_bp = Blueprint('role', __name__, url_prefix='/admin/role') + + +# 角色而管理 +@role_bp.get('/') +@authorize("admin:role:main", log=True) +def main(): + return render_template('admin/role/main.html') + + +# 角色授权操作 +@role_bp.get('/power/') +@authorize("admin:role:power", log=True) +def power(_id): + return render_template('admin/role/power.html', id=_id) + + +from . import role \ No newline at end of file diff --git a/applications/view/roles/_utils.py b/applications/view/roles/_utils.py index fe1e596..fd66358 100644 --- a/applications/view/roles/_utils.py +++ b/applications/view/roles/_utils.py @@ -2,9 +2,9 @@ from applications.extensions import db from applications.models import Power, Role, User -def remove_role(_id): +def remove_role(role_id): """ 删除角色 """ - role = Role.query.filter_by(id=_id).first() + role = Role.query.filter_by(id=role_id).first() # 删除该角色的权限 power_id_list = [] for p in role.power: @@ -19,12 +19,12 @@ def remove_role(_id): users = User.query.filter(User.id.in_(user_id_list)).all() for u in users: role.user.remove(u) - r = Role.query.filter_by(id=_id).delete() + r = Role.query.filter_by(id=role_id).delete() db.session.commit() return r -def batch_remove_role(ids): +def batch_remove_role(role_ids): """ 批量删除 """ - for _id in ids: - remove_role(_id) + for role_id in role_ids: + remove_role(role_id) diff --git a/applications/view/roles/role.py b/applications/view/roles/role.py index d82b84f..bc311ef 100644 --- a/applications/view/roles/role.py +++ b/applications/view/roles/role.py @@ -1,29 +1,22 @@ -from flask import Blueprint, render_template, jsonify, make_response +from flask import jsonify from flask_login import login_required - -from flask_restful import Resource, Api, reqparse +from flask_restful import Resource, Api, reqparse, marshal from applications.extensions import db from applications.models import Role, Power from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.rights import authorize -from flask_restful import reqparse, marshal - from applications.common.serialization import power_fields -from applications.view.roles._utils import remove_role, batch_remove_role +from . import role_bp +from ._utils import remove_role, batch_remove_role + +# TODO 分离视图操作 +from flask import render_template, make_response -role_bp = Blueprint('role', __name__, url_prefix='/admin/role') role_api = Api(role_bp) -# 角色而管理 -@role_bp.get('/') -@authorize("admin:role:main", log=True) -def main(): - return render_template('admin/role/main.html') - - # 表格数据 @role_bp.get('/data') @authorize("admin:role:main", log=True) @@ -87,13 +80,6 @@ class AddRole(Resource): return success_api(msg="成功") -# 角色授权操作 -@role_bp.get('/power/') -@authorize("admin:role:power", log=True) -def power(_id): - return render_template('admin/role/power.html', id=_id) - - @role_api.resource('/role_power/') class RolePower(Resource): diff --git a/applications/view/system/__init__.py b/applications/view/system/__init__.py deleted file mode 100644 index fcd30e5..0000000 --- a/applications/view/system/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import Flask - -from applications.view.system.logs import admin_log -from applications.view.system.index import admin_bp -from applications.view.file.file import file_bp -from applications.view.roles.role import role_bp -from applications.view.users import users_bp - - -def register_system_views(app: Flask): - app.register_blueprint(admin_bp) - app.register_blueprint(users_bp) - app.register_blueprint(file_bp) - app.register_blueprint(admin_log) - app.register_blueprint(role_bp) diff --git a/applications/view/system/index.py b/applications/view/system/index.py deleted file mode 100644 index da838fc..0000000 --- a/applications/view/system/index.py +++ /dev/null @@ -1,19 +0,0 @@ -from flask import Blueprint, render_template -from flask_login import login_required, current_user - -admin_bp = Blueprint('admin', __name__, url_prefix='/admin') - - -# 首页 -@admin_bp.get('/') -@login_required -def index(): - user = current_user - return render_template('admin/index.html', user=user) - - -# 控制台页面 -@admin_bp.get('/welcome') -@login_required -def welcome(): - return render_template('admin/console/welcome.html') diff --git a/applications/view/users/__init__.py b/applications/view/users/__init__.py index 1c4f048..71b9b0f 100644 --- a/applications/view/users/__init__.py +++ b/applications/view/users/__init__.py @@ -1,52 +1,12 @@ -from flask import Blueprint, request, render_template -from flask_restful import Api, reqparse +from flask import Blueprint, render_template +from flask_login import login_required, current_user +from flask_restful import Api +from sqlalchemy import desc -from applications.common.utils.http import table_api from applications.common.utils.rights import authorize -from applications.models import Role, User, Dept +from ...models import AdminLog users_bp = Blueprint('users', __name__, url_prefix='/users') -user_api = Api(users_bp) - - -# 用户分页查询 -@users_bp.get('/data') -@authorize("admin:user:main", log=True) -def data(): - parser = reqparse.RequestParser() - parser.add_argument('page', type=int, default=1) - parser.add_argument('limit', type=int, default=10) - parser.add_argument('realName', type=str, dest='real_name') - parser.add_argument('username', type=str) - parser.add_argument('deptId', type=int, dest='dept_id', default=0) - - res = parser.parse_args() - - filters = [] - - if res.real_name: - filters.append(User.realname.like('%' + res.real_name + '%')) - if res.username: - filters.append(User.username.like('%' + res.username + '%')) - if res.dept_id: - filters.append(User.dept_id == res.dept_id) - - paginate = User.query.filter(*filters).paginate(page=res.page, - per_page=res.limit, - error_out=False) - - dept_name = lambda dept_id: Dept.query.filter_by(id=dept_id).first().dept_name - user_data = [{ - 'id': item.id, - 'username': item.username, - 'realname': item.realname, - 'enable': item.enable, - 'create_at': item.create_at, - 'update_at': item.update_at, - 'dept': dept_name(item.dept_id), - } for item in paginate.items] - - return table_api(data=user_data, count=paginate.total) # 用户增加 @@ -56,5 +16,14 @@ def get(): return render_template('admin/user/main.html') +@users_bp.get('/center') +@login_required +def center(): + user_logs = AdminLog.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by( + desc(AdminLog.create_time)).limit(10) + return render_template('admin/user/profile.html', user_info=current_user, user_logs=user_logs) + + +user_api = Api(users_bp) from . import profile, _utils from . import user_view diff --git a/applications/view/users/profile.py b/applications/view/users/profile.py index 0a6b016..f80a320 100644 --- a/applications/view/users/profile.py +++ b/applications/view/users/profile.py @@ -1,22 +1,15 @@ # 个人中心 -from flask import render_template, request, make_response, jsonify +from flask import request, jsonify from flask_login import login_required, current_user from flask_restful import Resource, reqparse -from sqlalchemy import desc from applications.common.utils.http import fail_api, success_api from applications.extensions import db -from applications.models import User, AdminLog +from applications.models import User from applications.view.users import users_bp, user_api - -@users_bp.get('/center') -@login_required -def center(): - user_info = current_user - user_logs = AdminLog.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by( - desc(AdminLog.create_time)).limit(10) - return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs) +# TODO 分离视图操作 +from flask import render_template, make_response @user_api.resource('/avatar') @@ -39,7 +32,6 @@ class Avatar(Resource): @users_bp.put('/updateInfo') @login_required def update_info(): - parser = reqparse.RequestParser() parser.add_argument('realname', type=str, dest='real_name') parser.add_argument('remark', type=str) diff --git a/applications/view/users/user_view.py b/applications/view/users/user_view.py index affc18e..62e6ae4 100644 --- a/applications/view/users/user_view.py +++ b/applications/view/users/user_view.py @@ -1,12 +1,15 @@ -from flask import render_template, request, make_response +from flask import request from flask_restful import Resource, reqparse from applications.extensions import db -from applications.common.utils.http import fail_api, success_api +from applications.common.utils.http import fail_api, success_api, table_api from applications.common.utils.rights import authorize -from applications.models import User, Role +from applications.models import User, Role, Dept from applications.view.users import user_api, users_bp, _utils +# TODO 分离视图操作 +from flask import render_template, make_response + @user_api.resource('/add') class Users(Resource): @@ -127,3 +130,42 @@ def user_enable(): else: return fail_api(msg="出错啦") return message + + +@users_bp.get('/data') +@authorize("admin:user:main", log=True) +def data(): + parser = reqparse.RequestParser() + parser.add_argument('page', type=int, default=1) + parser.add_argument('limit', type=int, default=10) + parser.add_argument('realName', type=str, dest='real_name') + parser.add_argument('username', type=str) + parser.add_argument('deptId', type=int, dest='dept_id', default=0) + + res = parser.parse_args() + + filters = [] + + if res.real_name: + filters.append(User.realname.like('%' + res.real_name + '%')) + if res.username: + filters.append(User.username.like('%' + res.username + '%')) + if res.dept_id: + filters.append(User.dept_id == res.dept_id) + + paginate = User.query.filter(*filters).paginate(page=res.page, + per_page=res.limit, + error_out=False) + + dept_name = lambda dept_id: Dept.query.filter_by(id=dept_id).first().dept_name + user_data = [{ + 'id': item.id, + 'username': item.username, + 'realname': item.realname, + 'enable': item.enable, + 'create_at': item.create_at, + 'update_at': item.update_at, + 'dept': dept_name(item.dept_id), + } for item in paginate.items] + + return table_api(data=user_data, count=paginate.total)