wip:(重构接口实现方式)

This commit is contained in:
zhengxinonly
2022-05-09 03:30:41 +08:00
parent 8760f21b03
commit 82de7b0273
11 changed files with 71 additions and 106 deletions
+18 -1
View File
@@ -117,4 +117,21 @@ flask init-db
```bash ```bash
flask run flask run
``` ```
## 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` 开发中
-6
View File
@@ -1,6 +0,0 @@
from applications import create_app
app = create_app()
if __name__ == '__main__':
app.run()
+7 -5
View File
@@ -1,22 +1,24 @@
import os import os
from flask import Flask, Blueprint 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 common.utils.upload import photos
from extensions import init_plugs from extensions import init_plugs
from applications.view import init_view
import config
api_bp: Blueprint = Blueprint('api', __name__, url_prefix='/api/v1') api_bp: Blueprint = Blueprint('api', __name__, url_prefix='/api/v1')
from .rights import register_rights_api from .rights import register_rights_api
from .system import register_system_api from .system import FilePhotoAPI, LoginAPI
from .users import register_users_api from .users import register_users_api
register_rights_api(api_bp) register_rights_api(api_bp)
register_users_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: def init_api(app: Flask) -> None:
+3 -9
View File
@@ -1,12 +1,6 @@
from flask_restful import Api from flask import Blueprint
from .file import FilePhotosResource, FilePhotoResource from .file import FilePhotoAPI
from .passport import LoginResource 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/<int:photo_id>')
sys_api.add_resource(LoginResource, '/passport/login')
+35 -39
View File
@@ -1,26 +1,40 @@
import os from flask import request, jsonify
from flask.views import MethodView
from flask import request, jsonify, current_app
from flask_restful import Resource
from sqlalchemy import desc from sqlalchemy import desc
from common.utils.http import fail_api, success_api, table_api from common.utils.http import fail_api, success_api, table_api
from common.utils.upload import upload_one, delete_photo_by_id from common.utils.upload import upload_one, delete_photo_by_id
from extensions import db
from models import PhotoModel from models import PhotoModel
class FilePhotosResource(Resource): class FilePhotoAPI(MethodView):
def get(self): def get(self, photo_id):
page = request.args.get('page', type=int) if photo_id is None:
limit = request.args.get('limit', type=int) page = request.args.get('page', type=int)
photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at) limit = request.args.get('limit', type=int)
).paginate(page=page, photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at)
per_page=limit, ).paginate(page=page,
error_out=False) per_page=limit,
data = [ 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, 'id': item.id,
'name': item.name, 'name': item.name,
'href': item.href, 'href': item.href,
@@ -28,11 +42,9 @@ class FilePhotosResource(Resource):
'size': item.size, 'size': item.size,
'ext': item.ext if hasattr(item, 'ext') else "", 'ext': item.ext if hasattr(item, 'ext') else "",
'create_at': str(item.create_at), 'create_at': str(item.create_at),
} for item in photo_paginate.items },
] 'total': 1, },
return table_api(result={'items': data, code=0)
'total': photo_paginate.total, },
code=0)
def post(self): def post(self):
if 'file' in request.files: if 'file' in request.files:
@@ -50,28 +62,12 @@ class FilePhotosResource(Resource):
return jsonify(res) return jsonify(res)
return fail_api() 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): def delete(self, photo_id):
res = delete_photo_by_id(photo_id) res = delete_photo_by_id(photo_id)
if res: if res:
return success_api(message="删除成功") return success_api(message="删除成功")
else: else:
return fail_api(message="删除失败") return fail_api(message="删除失败")
def put(self, photo_id):
pass
+3 -2
View File
@@ -1,7 +1,8 @@
from flask import render_template, make_response from flask import render_template, make_response
from flask import session, redirect, url_for from flask import session, redirect, url_for
from flask.views import MethodView
from flask_login import current_user, login_user 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.gen_captcha import add_auth_session
from common.utils.http import fail_api, success_api from common.utils.http import fail_api, success_api
@@ -9,7 +10,7 @@ from common.utils.rights import record_logging
from models import UserModel from models import UserModel
class LoginResource(Resource): class LoginAPI(MethodView):
def get(self): def get(self):
if current_user.is_authenticated: if current_user.is_authenticated:
+5
View File
@@ -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'])
-19
View File
@@ -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")
-15
View File
@@ -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;
}
}
-7
View File
@@ -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
-3
View File
@@ -1,3 +0,0 @@
cd /home/ubuntu/pear-admin-flask
source venv/bin/activate
exec gunicorn -c gunicorn.conf.py "applications:create_app()"