From 945f746d97229df683c61bdab717e4ee49193603 Mon Sep 17 00:00:00 2001 From: zhengxinonly Date: Sat, 3 Jul 2021 01:43:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- applications/templates/admin/file/photo.html | 270 ++++++++++++++++++ .../templates/admin/file/photo_add.html | 65 +++++ applications/view/file/__init__.py | 0 applications/view/file/_utils.py | 26 ++ applications/view/file/file.py | 83 ++++++ applications/view/system/__init__.py | 2 +- 7 files changed, 446 insertions(+), 2 deletions(-) create mode 100644 applications/templates/admin/file/photo.html create mode 100644 applications/templates/admin/file/photo_add.html create mode 100644 applications/view/file/__init__.py create mode 100644 applications/view/file/_utils.py create mode 100644 applications/view/file/file.py diff --git a/README.md b/README.md index 367a316..9edafdc 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ Pear Admin Flask git clone https://gitee.com/pear-admin/pear-admin-flask # 切换分支 -git checkout v2 +git checkout mini ``` ##### 2. 安装依赖 diff --git a/applications/templates/admin/file/photo.html b/applications/templates/admin/file/photo.html new file mode 100644 index 0000000..c194c56 --- /dev/null +++ b/applications/templates/admin/file/photo.html @@ -0,0 +1,270 @@ + + + + 图片上传 + {% include 'admin/common/header.html' %} + + +
+
+
+
+
+ + + + + +{% include 'admin/common/footer.html' %} + \ No newline at end of file diff --git a/applications/templates/admin/file/photo_add.html b/applications/templates/admin/file/photo_add.html new file mode 100644 index 0000000..20d343b --- /dev/null +++ b/applications/templates/admin/file/photo_add.html @@ -0,0 +1,65 @@ + + + + {% include 'admin/common/header.html' %} + + + +
+
+
+
+
+ 新增图片 +
+
+
+ + + +
+
+
+
+
+
+{% include 'admin/common/footer.html' %} + + + \ No newline at end of file diff --git a/applications/view/file/__init__.py b/applications/view/file/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/applications/view/file/_utils.py b/applications/view/file/_utils.py new file mode 100644 index 0000000..b62ebe3 --- /dev/null +++ b/applications/view/file/_utils.py @@ -0,0 +1,26 @@ +import os +from flask import current_app +from applications.common.utils.upload import photos +from applications.extensions import db +from applications.models import Photo + + +def upload_one(photo, mime): + filename = photos.save(photo) + file_url = photos.url(filename) + + upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") + size = os.path.getsize(upload_url + '/' + filename) + photo = Photo(name=filename, href=file_url, mime=mime, size=size) + db.session.add(photo) + db.session.commit() + return file_url + + +def delete_photo_by_id(_id): + photo_name = Photo.query.filter_by(id=_id).first().name + photo = Photo.query.filter_by(id=_id).delete() + db.session.commit() + upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") + os.remove(upload_url + '/' + photo_name) + return photo diff --git a/applications/view/file/file.py b/applications/view/file/file.py new file mode 100644 index 0000000..ef27bbd --- /dev/null +++ b/applications/view/file/file.py @@ -0,0 +1,83 @@ +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 applications.common.serialization import photo_fields +from applications.common.utils.http import fail_api, success_api, table_api +from applications.common.utils.rights import authorize +from applications.extensions import db +from applications.models import Photo + +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 post(self): + if 'file' in request.files: + photo = request.files['file'] + mime = request.files['file'].content_type + file_url = upload_one(photo=photo, mime=mime) + + res = { + "msg": "上传成功", + "code": 0, + "success": True, + "data": + {"src": file_url} + } + return jsonify(res) + return fail_api() + + @authorize("admin:file:delete", log=True) + def delete(self): + _id = request.form.get('id') + res = delete_photo_by_id(_id) + if res: + return success_api(msg="删除成功") + else: + 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/system/__init__.py b/applications/view/system/__init__.py index af97c17..fcd30e5 100644 --- a/applications/view/system/__init__.py +++ b/applications/view/system/__init__.py @@ -2,7 +2,7 @@ from flask import Flask from applications.view.system.logs import admin_log from applications.view.system.index import admin_bp -from applications.view.upload.file import file_bp +from applications.view.file.file import file_bp from applications.view.roles.role import role_bp from applications.view.users import users_bp