From 82de7b02739dc799d237bf6167e3f0fadbbfd944 Mon Sep 17 00:00:00 2001 From: zhengxinonly Date: Mon, 9 May 2022 03:30:41 +0800 Subject: [PATCH] =?UTF-8?q?wip:(=E9=87=8D=E6=9E=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++- app.py | 6 --- applications/__init__.py | 12 +++--- applications/system/__init__.py | 12 ++---- applications/system/file.py | 74 ++++++++++++++++----------------- applications/system/passport.py | 5 ++- common/__init__.py | 5 +++ gunicorn.conf.py | 19 --------- pear-nginx.conf | 15 ------- pear-supervisor.conf | 7 ---- start.sh | 3 -- 11 files changed, 71 insertions(+), 106 deletions(-) delete mode 100644 app.py delete mode 100644 gunicorn.conf.py delete mode 100644 pear-nginx.conf delete mode 100644 pear-supervisor.conf delete mode 100644 start.sh diff --git a/README.md b/README.md index 6463eba..66d673a 100644 --- a/README.md +++ b/README.md @@ -117,4 +117,21 @@ flask init-db ```bash flask run -``` \ No newline at end of file +``` + +## Git 贡献提交规范 + +- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)) + - `feat` 增加新功能 + - `fix` 修复问题/BUG + - `style` 代码风格相关无影响运行结果的 + - `perf` 优化/性能提升 + - `refactor` 重构 + - `revert` 撤销修改 + - `test` 测试相关 + - `docs` 文档/注释 + - `chore` 依赖更新/脚手架配置修改等 + - `workflow` 工作流改进 + - `ci` 持续集成 + - `types` 类型定义文件更改 + - `wip` 开发中 \ No newline at end of file diff --git a/app.py b/app.py deleted file mode 100644 index a5622a5..0000000 --- a/app.py +++ /dev/null @@ -1,6 +0,0 @@ -from applications import create_app - -app = create_app() - -if __name__ == '__main__': - app.run() diff --git a/applications/__init__.py b/applications/__init__.py index 1f2f719..a7decf6 100644 --- a/applications/__init__.py +++ b/applications/__init__.py @@ -1,22 +1,24 @@ import os from flask import Flask, Blueprint -from common.flask_uploads import configure_uploads +import config +from applications.view import init_view +from common import register_api +from common.flask_uploads import configure_uploads from common.utils.upload import photos from extensions import init_plugs -from applications.view import init_view -import config api_bp: Blueprint = Blueprint('api', __name__, url_prefix='/api/v1') from .rights import register_rights_api -from .system import register_system_api +from .system import FilePhotoAPI, LoginAPI from .users import register_users_api register_rights_api(api_bp) register_users_api(api_bp) -register_system_api(api_bp) +register_api(LoginAPI, 'login_api', '/passport/login', pk='_id', app=api_bp) +register_api(FilePhotoAPI, 'photo_api', '/file/photo', pk='photo_id', app=api_bp) def init_api(app: Flask) -> None: diff --git a/applications/system/__init__.py b/applications/system/__init__.py index e650928..f368f5c 100644 --- a/applications/system/__init__.py +++ b/applications/system/__init__.py @@ -1,12 +1,6 @@ -from flask_restful import Api +from flask import Blueprint -from .file import FilePhotosResource, FilePhotoResource -from .passport import LoginResource +from .file import FilePhotoAPI +from .passport import LoginAPI -def register_system_api(api_bp): - sys_api = Api(api_bp) - - sys_api.add_resource(FilePhotosResource, '/file/photos') - sys_api.add_resource(FilePhotoResource, '/file/photo/') - sys_api.add_resource(LoginResource, '/passport/login') diff --git a/applications/system/file.py b/applications/system/file.py index 335798d..7f69036 100644 --- a/applications/system/file.py +++ b/applications/system/file.py @@ -1,26 +1,40 @@ -import os - -from flask import request, jsonify, current_app -from flask_restful import Resource +from flask import request, jsonify +from flask.views import MethodView from sqlalchemy import desc from common.utils.http import fail_api, success_api, table_api from common.utils.upload import upload_one, delete_photo_by_id -from extensions import db from models import PhotoModel -class FilePhotosResource(Resource): +class FilePhotoAPI(MethodView): - def get(self): - page = request.args.get('page', type=int) - limit = request.args.get('limit', type=int) - photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at) - ).paginate(page=page, - per_page=limit, - error_out=False) - data = [ - { + def get(self, photo_id): + if photo_id is None: + page = request.args.get('page', type=int) + limit = request.args.get('limit', type=int) + photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at) + ).paginate(page=page, + per_page=limit, + error_out=False) + data = [ + { + 'id': item.id, + 'name': item.name, + 'href': item.href, + 'mime': item.mime, + 'size': item.size, + 'ext': item.ext if hasattr(item, 'ext') else "", + 'create_at': str(item.create_at), + } for item in photo_paginate.items + ] + return table_api(result={'items': data, + 'total': photo_paginate.total, }, + code=0) + else: + # 显示一张图片 + item = PhotoModel.query.get(photo_id) + return table_api(result={'items': { 'id': item.id, 'name': item.name, 'href': item.href, @@ -28,11 +42,9 @@ class FilePhotosResource(Resource): 'size': item.size, 'ext': item.ext if hasattr(item, 'ext') else "", 'create_at': str(item.create_at), - } for item in photo_paginate.items - ] - return table_api(result={'items': data, - 'total': photo_paginate.total, }, - code=0) + }, + 'total': 1, }, + code=0) def post(self): if 'file' in request.files: @@ -50,28 +62,12 @@ class FilePhotosResource(Resource): return jsonify(res) return fail_api() - def delete(self): - """图片批量删除""" - # TODO bugs 图片删除失败 - ids = request.form.getlist('ids[]') - photo_name = PhotoModel.query.filter(PhotoModel.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 = PhotoModel.query.filter(PhotoModel.id.in_(ids)).delete(synchronize_session=False) - db.session.commit() - if photo: - return success_api(message="删除成功") - else: - return fail_api(message="删除失败") - - -class FilePhotoResource(Resource): - """图片数据""" - def delete(self, photo_id): res = delete_photo_by_id(photo_id) if res: return success_api(message="删除成功") else: return fail_api(message="删除失败") + + def put(self, photo_id): + pass diff --git a/applications/system/passport.py b/applications/system/passport.py index 2799f1f..abdcc9f 100644 --- a/applications/system/passport.py +++ b/applications/system/passport.py @@ -1,7 +1,8 @@ from flask import render_template, make_response from flask import session, redirect, url_for +from flask.views import MethodView from flask_login import current_user, login_user -from flask_restful import Resource, reqparse +from flask_restful import reqparse from common.gen_captcha import add_auth_session from common.utils.http import fail_api, success_api @@ -9,7 +10,7 @@ from common.utils.rights import record_logging from models import UserModel -class LoginResource(Resource): +class LoginAPI(MethodView): def get(self): if current_user.is_authenticated: diff --git a/common/__init__.py b/common/__init__.py index e69de29..15f337a 100644 --- a/common/__init__.py +++ b/common/__init__.py @@ -0,0 +1,5 @@ +def register_api(view, endpoint, url, pk='id', pk_type='int', app=None): + view_func = view.as_view(endpoint) + app.add_url_rule(url, defaults={pk: None}, view_func=view_func, methods=['GET', ]) + app.add_url_rule(url, view_func=view_func, methods=['POST', ]) + app.add_url_rule(f'{url}<{pk_type}:{pk}>', view_func=view_func, methods=['GET', 'PUT', 'DELETE']) diff --git a/gunicorn.conf.py b/gunicorn.conf.py deleted file mode 100644 index 4aa61bf..0000000 --- a/gunicorn.conf.py +++ /dev/null @@ -1,19 +0,0 @@ -import os -import multiprocessing - -bind = '0.0.0.0:8000' -backlog = 512 -chdir = os.path.dirname(os.path.abspath(__file__)) -timeout = 30 -worker_class = 'sync' - -workers = multiprocessing.cpu_count() * 2 + 1 -threads = 2 -loglevel = 'info' -access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' - -if not os.path.exists('logs'): - os.mkdir('logs') - -accesslog = os.path.join(chdir, "logs/gunicorn_access.log") -errorlog = os.path.join(chdir, "logs/gunicorn_error.log") diff --git a/pear-nginx.conf b/pear-nginx.conf deleted file mode 100644 index 10cb659..0000000 --- a/pear-nginx.conf +++ /dev/null @@ -1,15 +0,0 @@ -server { - listen 80 default_server; - access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; - - location / { - proxy_pass http://127.0.0.1:8000; # 转发的地址,即Gunicorn运行的地址 - proxy_redirect off; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } -} \ No newline at end of file diff --git a/pear-supervisor.conf b/pear-supervisor.conf deleted file mode 100644 index 4c8fb6e..0000000 --- a/pear-supervisor.conf +++ /dev/null @@ -1,7 +0,0 @@ -[program:pear] -command=bash /home/ubuntu/pear-admin-flask/start.sh -user=root -autostart=true -autorestart=true -stopasgroup=true -killasgroup=true \ No newline at end of file diff --git a/start.sh b/start.sh deleted file mode 100644 index a852590..0000000 --- a/start.sh +++ /dev/null @@ -1,3 +0,0 @@ -cd /home/ubuntu/pear-admin-flask -source venv/bin/activate -exec gunicorn -c gunicorn.conf.py "applications:create_app()"