diff --git a/.gitignore b/.gitignore index f448ef8a1ca6a16a36f429910296d6d5cd3afc89..a43744be6ca378348220385a3d8486f5cecda0e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea __pycache__/ *env/ -migrations/ \ No newline at end of file +migrations/ +*.log \ No newline at end of file diff --git a/config.py b/config.py index bc51b441364a88040128b6f0fbc66f40ec0b8e3f..c91cf8e9f3c1349d714fddf20b5d1d72e9001b0f 100644 --- a/config.py +++ b/config.py @@ -8,7 +8,7 @@ LOG_LEVEL = logging.WARN # mysql 配置 MYSQL_USERNAME = "root" -MYSQL_PASSWORD = "root" +MYSQL_PASSWORD = "123456" MYSQL_HOST = "127.0.0.1" MYSQL_PORT = 3306 @@ -29,3 +29,6 @@ JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=1) # 获取项目根目录 root_path = os.path.dirname(os.path.abspath(__file__)) + +# 配置jsonify返回json的编码支持中文 +JSON_AS_ASCII = False diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pear_admin/__init__.py b/pear_admin/__init__.py index 092ec8df12992e084284ca2e0b08e33eb2d61dc2..0f4724f74dc5db2f2ec3eac1186f575faad26d27 100644 --- a/pear_admin/__init__.py +++ b/pear_admin/__init__.py @@ -5,11 +5,13 @@ import config from pear_admin.api import register_api from pear_admin.extensions import db, register_extensions from pear_admin.orms import DepartmentORM, PermissionORM, RoleORM, UserORM +from pear_admin.utils.logs_utils import setup_log from pear_admin.views import register_blueprint def create_app() -> Flask: app = Flask("pear-admin-flask") + setup_log() app.config.from_object(config) register_extensions(app) register_api(app) diff --git a/pear_admin/api/auth_api.py b/pear_admin/api/auth_api.py index 9a1f4790af4c5a58aaac1cee0525af8655342043..fe35210835814aafa07a52a77120e55483db3810 100644 --- a/pear_admin/api/auth_api.py +++ b/pear_admin/api/auth_api.py @@ -23,11 +23,25 @@ class LoginApi(MethodView): password = request.json.get("password") captcha_code = request.json.get("captcha_code") image_code_uuid = request.json.get("image_code") - + if not all([username, password, captcha_code, image_code_uuid]): + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } user: UserORM = UserORM.find_by_username(username) - + if not user: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } code = redis_client.get(f"image_code_{image_code_uuid}") - if code != captcha_code: + if str(code) != captcha_code: return { "meta": { "code": RetCode.CAPTCHA_CODE_ERR.code, @@ -75,6 +89,7 @@ class LoginApi(MethodView): class LogoutApi(MethodView): @jwt_required() def post(self): + response = make_response( { "meta": { diff --git a/pear_admin/api/department_api.py b/pear_admin/api/department_api.py index a5276b35d5601607068a575a0cf80b4a691d60de..4cb9c9c106f74bc1590cdb03a5ed7b049eb25582 100644 --- a/pear_admin/api/department_api.py +++ b/pear_admin/api/department_api.py @@ -5,6 +5,7 @@ from flask_pydantic import validate from pear_admin.models import DepartmentModel, PaginationModel from pear_admin.orms import DepartmentORM +from pear_admin.utils.response_code import RetCode class DepartmentApi(MethodView): @@ -12,11 +13,34 @@ class DepartmentApi(MethodView): def get(self, did, query: PaginationModel): if did: dept: DepartmentORM = DepartmentORM.find_by_id(did) + if not dept: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } return dict(success=True, message="ok", dept=dept.json()) else: department_list: list[DepartmentORM] = DepartmentORM.query.all() - + if not department_list: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } action = request.args.get("action") + if not action: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } if action == "tree": return { "status": {"code": 200, "message": "默认"}, @@ -37,6 +61,14 @@ class DepartmentApi(MethodView): @validate() def post(self, body: DepartmentModel): + if not body: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } department = DepartmentORM() department.pid = (body.pid,) department.name = (body.name,) @@ -57,7 +89,23 @@ class DepartmentApi(MethodView): @validate() def put(self, did, body: DepartmentModel): + if not all([did, body]): + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } department: DepartmentORM = DepartmentORM.find_by_id(did) + if not department: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } department.pid = body.pid department.name = body.name department.sort = body.sort @@ -75,7 +123,23 @@ class DepartmentApi(MethodView): } def delete(self, did): + if not did: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } ret: DepartmentORM = DepartmentORM.find_by_id(did) + if not ret: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } ret.delete_from_db() if ret: return { @@ -94,6 +158,14 @@ class DepartmentApi(MethodView): def batch_remove_api(): ids = request.json.get("ids") + if not ids: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } id_list = ids.split(",") for did in id_list: DepartmentORM.delete_by_id(did) diff --git a/pear_admin/api/role_api.py b/pear_admin/api/role_api.py index f856e0b519ad963c761c9151e2dd63e6324cd8cb..a3b9aecd41b0b6d1cdf074de2ad40ece0ca9c93e 100644 --- a/pear_admin/api/role_api.py +++ b/pear_admin/api/role_api.py @@ -14,6 +14,14 @@ from pear_admin.utils.response_code import RetCode class RoleApi(MethodView): @validate() def get(self, rid, query: PaginationModel): + if not query: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } filters = [] if query.query: filters.append(RoleORM.username.like("%" + query.query + "%")) @@ -39,6 +47,14 @@ class RoleApi(MethodView): @jwt_required() @validate() def post(self, body: RoleModel): + if not body: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } role = RoleORM() role.name = body.name role.desc = body.desc @@ -54,7 +70,23 @@ class RoleApi(MethodView): @jwt_required() @validate() def put(self, rid, body: RoleModel): + if not all([rid, body]): + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } role = RoleORM.query.get(rid) + if not role: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } role.name = body.name role.desc = body.desc role.save_to_db() @@ -69,6 +101,14 @@ class RoleApi(MethodView): @jwt_required() @validate() def delete(self, rid): + if not rid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } # 用户项目演示 if rid in [1, 2, 3]: return { @@ -79,6 +119,14 @@ class RoleApi(MethodView): }, } role: RoleORM = RoleORM.find_by_id(rid) + if not role: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } role.delete_from_db() return { "meta": { @@ -93,6 +141,14 @@ class PermissionApi(MethodView): def get(self, pid): if pid: permission: PermissionORM = PermissionORM.query.get(pid) + if not permission: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } return { "result": { "permission": [permission.json()], @@ -104,6 +160,14 @@ class PermissionApi(MethodView): } else: permission_list: list[PermissionORM] = PermissionORM.query.all() + if not permission_list: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } _type = request.args.get("type") if _type == "dtree": # 树形菜单分配权限 rets = [permission.json() for permission in permission_list] @@ -146,6 +210,14 @@ class PermissionApi(MethodView): @jwt_required() @validate() def post(self, body: PermissionModel): + if not body: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } permission: PermissionORM = PermissionORM() permission.pid = body.pid permission.permission_name = body.name @@ -166,6 +238,14 @@ class PermissionApi(MethodView): @jwt_required() @validate() def put(self, pid, body: PermissionModel): + if not all([pid, body]): + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } if pid <= 11: return { "meta": { @@ -174,6 +254,14 @@ class PermissionApi(MethodView): }, } permission = PermissionORM.query.get(pid) + if not permission: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } permission.pid = body.pid permission.name = body.name permission.code = body.code @@ -193,6 +281,14 @@ class PermissionApi(MethodView): @jwt_required() @validate() def delete(self, pid): + if not pid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } if pid <= 11: return { "meta": { @@ -201,6 +297,14 @@ class PermissionApi(MethodView): }, } permission: PermissionORM = PermissionORM.query.get(pid) + if not permission: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } permission.delete_from_db() return { "meta": { @@ -211,7 +315,23 @@ class PermissionApi(MethodView): def role_permission(rid): + if not rid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } role: RoleORM = RoleORM.query.get(rid) + if not role: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } ids: str = request.json.get("ids") per_arr = PermissionORM.query.filter(PermissionORM.id.in_(ids.split(","))).all() role.permission = [] @@ -227,7 +347,23 @@ def role_permission(rid): def permission_enable(pid): + if not pid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头数据缺少", + "status": "fail", + }, + } permission = PermissionORM.find_by_id(pid) + if not permission: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } enable = request.json.get("enable") permission.enable = enable permission.save_to_db() diff --git a/pear_admin/api/users_api.py b/pear_admin/api/users_api.py index 5c6abb59d25cd85f218e07803f1cca5882849b7c..434f5507a9184d3e58d5fc2c5ef9e403549ec2ca 100644 --- a/pear_admin/api/users_api.py +++ b/pear_admin/api/users_api.py @@ -8,12 +8,20 @@ from flask_sqlalchemy import Pagination from pear_admin.models import DepartmentModel, PaginationModel, UserModel from pear_admin.orms import DepartmentORM, RoleORM, UserORM +from pear_admin.utils.response_code import RetCode class UserApi(MethodView): @validate() def get(self, uid, query: PaginationModel): - + if not query: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头缺少", + "status": "fail", + }, + } filters = [] if query.query: filters.append(UserORM.username.like("%" + query.query + "%")) @@ -38,6 +46,14 @@ class UserApi(MethodView): @jwt_required() @validate() def post(self, body: UserModel): + if not body: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头缺少", + "status": "fail", + }, + } user = UserORM() user.username = body.username user.nickname = body.nickname @@ -63,7 +79,23 @@ class UserApi(MethodView): @jwt_required() @validate() def put(self, uid, body: UserModel): + if not all([uid, body]): + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头缺少", + "status": "fail", + }, + } user = UserORM.find_by_id(uid) + if not user: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } user.username = body.username user.nickname = body.nickname if body.password: @@ -90,6 +122,14 @@ class UserApi(MethodView): @jwt_required() def delete(self, uid): + if not uid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头缺少", + "status": "fail", + }, + } if uid in [1, 2, 3]: return { "meta": { @@ -98,6 +138,14 @@ class UserApi(MethodView): }, } user: UserORM = UserORM.find_by_id(uid) + if not user: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } user.delete_from_db() return { "meta": { @@ -109,8 +157,24 @@ class UserApi(MethodView): def user_role(uid): roles: list[RoleORM] = RoleORM.query.all() + if not uid: + return { + "meta": { + "code": RetCode.NECESSARY_PARAM_ERR.value, + "message": "请求头缺少", + "status": "fail", + }, + } if request.method == "GET": user: UserORM = UserORM.find_by_id(uid) + if not user: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } rets = [] for role in roles: if role in user.role: diff --git a/pear_admin/orms/department.py b/pear_admin/orms/department.py index 3725e8869e4b09b07609ffced2604c8fbccabb3d..a0c820a6ea4a63d5897644138f82e3c2a32617a3 100644 --- a/pear_admin/orms/department.py +++ b/pear_admin/orms/department.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from flask import current_app + from pear_admin.extensions import db +from pear_admin.utils.response_code import RetCode class DepartmentORM(db.Model): @@ -37,12 +40,47 @@ class DepartmentORM(db.Model): def save_to_db(self): db.session.add(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } def delete_from_db(self): db.session.delete(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } @classmethod def delete_by_id(cls, did): - cls.find_by_id(did).delete_from_db() + dpm = cls.find_by_id(did) + if not dpm: + return { + "meta": { + "code": RetCode.NODATA_ERR.value, + "message": "无数据", + "status": "fail", + }, + } + dpm.delete_from_db() diff --git a/pear_admin/orms/permission.py b/pear_admin/orms/permission.py index eb7d0da4d715c36a6245f08f1663be80473cd632..e5a8fb8abaddf38434d3664b58227981d11927b2 100644 --- a/pear_admin/orms/permission.py +++ b/pear_admin/orms/permission.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from flask import current_app + from pear_admin.extensions import db +from pear_admin.utils.response_code import RetCode class PermissionORM(db.Model): @@ -60,8 +63,34 @@ class PermissionORM(db.Model): def save_to_db(self): db.session.add(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } def delete_from_db(self): db.session.delete(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } diff --git a/pear_admin/orms/role.py b/pear_admin/orms/role.py index ca2e2a7b6cf28d233b06c9b697c18fb55194b0a0..3dd689ebb08df95def953ce1e269612f393c2d14 100644 --- a/pear_admin/orms/role.py +++ b/pear_admin/orms/role.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- from datetime import datetime +from flask import current_app + from pear_admin.extensions import db +from pear_admin.utils.response_code import RetCode class RoleORM(db.Model): @@ -34,8 +37,34 @@ class RoleORM(db.Model): def save_to_db(self): db.session.add(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } def delete_from_db(self): db.session.delete(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } diff --git a/pear_admin/orms/user.py b/pear_admin/orms/user.py index 9107e6fcb9fcb99173ae977883c6e1958487c618..0c353df863988ecad49004c890fa05d0f3d793fd 100644 --- a/pear_admin/orms/user.py +++ b/pear_admin/orms/user.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- from datetime import datetime +from flask import current_app from werkzeug.security import check_password_hash, generate_password_hash from pear_admin.extensions import db +from pear_admin.utils.response_code import RetCode class UserORM(db.Model): @@ -75,8 +77,34 @@ class UserORM(db.Model): def save_to_db(self): db.session.add(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } def delete_from_db(self): db.session.delete(self) - db.session.commit() + try: + db.session.commit() + except Exception as e: + # 添加log + current_app.logger.error(e) + # 滚回操作 + db.session.rollback() + return { + "meta": { + "code": RetCode.DB_ERR.value, + "message": "提交失败", + "status": "fail", + }, + } diff --git a/pear_admin/utils/logs_utils.py b/pear_admin/utils/logs_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ec72fe0812f1749ce0df416691d0dd8435c4c18a --- /dev/null +++ b/pear_admin/utils/logs_utils.py @@ -0,0 +1,21 @@ +import logging +from logging.handlers import RotatingFileHandler + +from config import LOG_LEVEL + + +def setup_log(): + """配置日志""" + + # 设置日志的记录等级 + logging.basicConfig(level=LOG_LEVEL) # 调试debug级 + # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限 + file_log_handler = RotatingFileHandler( + "logs/log.log", maxBytes=1024 * 1024 * 100, backupCount=10 + ) + # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息 + formatter = logging.Formatter("%(levelname)s %(filename)s:%(lineno)d %(message)s") + # 为刚创建的日志记录器设置日志记录格式 + file_log_handler.setFormatter(formatter) + # 为全局的日志工具对象(flask app使用的)添加日志记录器 + logging.getLogger().addHandler(file_log_handler) diff --git a/pear_admin/views/__init__.py b/pear_admin/views/__init__.py index d5a1b5112c084d0e308846f46a92158c2852906e..454ea95fbb4c66987ab3e051b75eba3471e8216a 100644 --- a/pear_admin/views/__init__.py +++ b/pear_admin/views/__init__.py @@ -11,6 +11,7 @@ from flask import ( Blueprint, Flask, abort, + current_app, make_response, redirect, render_template, @@ -29,6 +30,11 @@ def register_blueprint(app: Flask): app.register_blueprint(view_bp) +@view_bp.get("/favicon.ico") +def favicon(): + return current_app.send_static_file("favicon.ico") + + @view_bp.get("/") @jwt_required(optional=True) def index(): diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3dbbf3375012028cee418c22f15249eed58cede Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/js/pear_admin_flask.js b/static/js/pear_admin_flask.js index 6f525bbef884d20e8920d9c48c9fafd7a866f55f..9f0afc3321ff2de1d6004ee541da7b32dc0020fa 100644 --- a/static/js/pear_admin_flask.js +++ b/static/js/pear_admin_flask.js @@ -1,131 +1,135 @@ function generateUUID() { - var d = new Date().getTime(); - if (window.performance && typeof window.performance.now === 'function') { - d += performance.now(); //use high-precision timer if available - } - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, - function(c) { - var r = (d + Math.random() * 16) % 16 | 0; - d = Math.floor(d / 16); - return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); - }); - return uuid; + var d = new Date().getTime(); + if (window.performance && typeof window.performance.now === 'function') { + d += performance.now(); //use high-precision timer if available + } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, + function(c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; } function formatDate(value) {//调用时间戳为日期显示 - let date = new Date(value); - let y = date.getFullYear(); //获取年份 - let month = date.getMonth() + 1; //获取月份 - month = month < 10 ? '0' + month : month; //月份不满10天显示前加0 - let d = date.getDate(); //获取日期 - d = d < 10 ? '0' + d : d; //日期不满10天显示前加0 + let date = new Date(value); + let y = date.getFullYear(); //获取年份 + let month = date.getMonth() + 1; //获取月份 + month = month < 10 ? '0' + month : month; //月份不满10天显示前加0 + let d = date.getDate(); //获取日期 + d = d < 10 ? '0' + d : d; //日期不满10天显示前加0 - //也可以获取更精准时间 - let h = date.getHours(); //小时 - let m = date.getMinutes(); //分 - let s = date.getSeconds(); //秒 - return y + '-' + month + '-' + d + ' ' + h + ':' + m + ':' + s; - //let ls = date.getMilliseconds() //毫秒 + //也可以获取更精准时间 + let h = date.getHours(); //小时 + let m = date.getMinutes(); //分 + let s = date.getSeconds(); //秒 + return y + '-' + month + '-' + d + ' ' + h + ':' + m + ':' + s; + //let ls = date.getMilliseconds() //毫秒 } function parseData(res) { // res 即为原始返回的数据 - return { - 'code': res.meta.status === 'success' ? 0 : 1, //解析接口状态 - 'msg': res.meta.message, //解析提示文本 - 'data': res.result.department_list, //解析数据列表 - }; + return { + 'code': res.meta.status === 'success' ? 0 : 1, //解析接口状态 + 'msg': res.meta.message, //解析提示文本 + 'data': res.result.department_list, //解析数据列表 + }; } /**封装请求接口**/ async function request(method, url, data = {}) { - const options = { - method: method, - headers: { - 'Content-Type': 'application/json', - // 'Authorization': `Bearer ${localStorage.getItem('jwt')}`, - }, - body: JSON.stringify(data), - }; - const response = await fetch(url, options); - return await response.json(); + const options = { + method: method, + headers: { + 'Content-Type': 'application/json', + // 'Authorization': `Bearer ${localStorage.getItem('jwt')}`, + }, + body: JSON.stringify(data), + }; + const response = await fetch(url, options); + return await response.json(); } async function get_api(url, data) { - return request('GET', url, data); + return request('GET', url, data); } async function post_api(url, data) { - return request('POST', url, data); + return request('POST', url, data); } async function put_api(url, data) { - return request('PUT', url, data); + return request('PUT', url, data); } async function delete_api(url, data) { - return request('DELETE', url, data); + return request('DELETE', url, data); } async function logout() { - return await post_api('/api/private/v1/logout'); + let option = { + 'method': 'POST', + }; + return await post_api('/api/private/v1/logout', option); } async function login(data) { - return await post_api('/api/private/v1/login', data); + let result = await post_api('/api/private/v1/login', data) + return await result; } async function create_user(data) { - return post_api(`/api/private/v1/user/`, data); + return post_api(`/api/private/v1/user/`, data); } async function remove_user(uid) { - return await delete_api(`/api/private/v1/user/${uid}`); + return await delete_api(`/api/private/v1/user/${uid}`); } async function update_user(uid, data) { - return await put_api(`/api/private/v1/user/${uid}`, data); + return await put_api(`/api/private/v1/user/${uid}`, data); } async function batch_remove_department(data) { - return await delete_api(`/api/private/v1/department/batch_remove`, data); + return await delete_api(`/api/private/v1/department/batch_remove`, data); } async function create_department(data) { - return await post_api(`/api/private/v1/department/`, data); + return await post_api(`/api/private/v1/department/`, data); } async function remove_department(did) { - return await delete_api(`/api/private/v1/department/${did}`); + return await delete_api(`/api/private/v1/department/${did}`); } async function update_department(did, data) { - return put_api(`/api/private/v1/department/${did}`, data); + return put_api(`/api/private/v1/department/${did}`, data); } async function create_permission(data) { - return await post_api(`/api/private/v1/permission/`, data); + return await post_api(`/api/private/v1/permission/`, data); } async function remove_permission(pid) { - return await delete_api(`/api/private/v1/permission/${pid}`); + return await delete_api(`/api/private/v1/permission/${pid}`); } async function update_permission(pid, data) { - return await put_api(`/api/private/v1/permission/${pid}`, data); + return await put_api(`/api/private/v1/permission/${pid}`, data); } async function enable_permission(pid, data) { - return await put_api(`/api/private/v1/permission/${pid}/enable`, data); + return await put_api(`/api/private/v1/permission/${pid}/enable`, data); } async function create_role(data) { - return await post_api(`/api/private/v1/role/`, data); + return await post_api(`/api/private/v1/role/`, data); } async function remove_role(rid) { - return await delete_api(`/api/private/v1/role/${rid}`); + return await delete_api(`/api/private/v1/role/${rid}`); } async function update_role(rid, data) { - return await put_api(`/api/private/v1/role/${rid}`, data); + return await put_api(`/api/private/v1/role/${rid}`, data); } \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index d0680ff4ae56b8f1b6b316e60f2376c6d2b68e1d..b67469c45e5e7333243f0cc9d83b205e881c2993 100644 --- a/templates/index.html +++ b/templates/index.html @@ -102,35 +102,36 @@ \ No newline at end of file diff --git a/templates/login.html b/templates/login.html index f516255c9365497c192c8d39245a65ef76a2ce45..a2d9b27bafad5279b6e9d1b1497733f847c7c812 100644 --- a/templates/login.html +++ b/templates/login.html @@ -19,13 +19,16 @@
- +
- +
- +
@@ -43,82 +46,80 @@ \ No newline at end of file