diff --git a/pear_admin/apis/department.py b/pear_admin/apis/department.py index 6270479..83d3918 100644 --- a/pear_admin/apis/department.py +++ b/pear_admin/apis/department.py @@ -1,6 +1,7 @@ from flask import Blueprint, request from flask_sqlalchemy.pagination import Pagination +from pear_admin.common.utils.responses import JsonResponse from pear_admin.extensions import db from pear_admin.orms import DepartmentORM @@ -26,17 +27,11 @@ def department_list(): # son_data["isParent"] = True child_data["children"].append(son_data) ret.append(child_data) - return {"code": 0, "message": "请求权限数据成功", "data": ret} + return JsonResponse().set_body(ret).set_msg("请求权限数据成功").ok() q = db.select(DepartmentORM) pages: Pagination = db.paginate(q, page=page, per_page=per_page) - - return { - "code": 0, - "msg": "获取部门数据成功", - "data": [item.json() for item in pages.items], - "count": pages.total, - } + return JsonResponse().set_table(pages).set_msg("获取部门数据成功").ok() @department_api.post("/department") @@ -46,7 +41,7 @@ def create_department(): del data["id"] department = DepartmentORM(**data) department.save() - return {"code": 0, "msg": "新增部门成功"} + return JsonResponse().set_msg("新增部门成功").ok() @department_api.put("/department/") @@ -55,14 +50,15 @@ def change_department(rid): del data["id"] department_obj = DepartmentORM.query.get(rid) - for key, value in data.items(): - setattr(department_obj, key, value) + for column in DepartmentORM.__table__.columns: + if column.name in data: + setattr(department_obj, column.name, data[column.name]) department_obj.save() - return {"code": 0, "msg": "修改部门成功"} + return JsonResponse().set_msg("修改部门成功").ok() @department_api.delete("/department/") def del_department(rid): department_obj = DepartmentORM.query.get(rid) department_obj.delete() - return {"code": 0, "msg": "删除删除成功"} + return JsonResponse().set_msg("删除删除成功").ok() diff --git a/pear_admin/apis/passport.py b/pear_admin/apis/passport.py index 2a828d7..9f5dcf0 100644 --- a/pear_admin/apis/passport.py +++ b/pear_admin/apis/passport.py @@ -9,6 +9,7 @@ from flask_jwt_extended import ( jwt_required, ) +from pear_admin.common.utils.responses import JsonResponse from pear_admin.extensions import db from pear_admin.orms import RightsORM, RoleORM, UserORM @@ -24,9 +25,9 @@ def login_in(): ).scalar() if not user: - return {"message": "用户不存在", "code": -1}, 401 + return JsonResponse().set_msg("用户不存在").failure(), 401 if not user.check_password(data["password"]): - return {"message": "用户密码错误", "code": -1}, 401 + return JsonResponse().set_msg("用户密码错误").failure(), 401 access_token = create_access_token(user) refresh_token = create_refresh_token(user) @@ -46,7 +47,7 @@ def login_in(): @passport_api.route("/logout", methods=["GET", "POST"]) @jwt_required() def logout(): - return {"msg": "退出登录成功", "code": 0} + return JsonResponse().set_msg("退出登录成功").ok() @passport_api.get("/menu") diff --git a/pear_admin/apis/rights.py b/pear_admin/apis/rights.py index ea02e31..7f9c08e 100644 --- a/pear_admin/apis/rights.py +++ b/pear_admin/apis/rights.py @@ -3,6 +3,7 @@ from copy import deepcopy from flask import Blueprint, request from flask_jwt_extended import jwt_required +from pear_admin.common.utils.responses import JsonResponse from pear_admin.extensions import db from pear_admin.orms import RightsORM @@ -38,7 +39,8 @@ def rights_list(): else: tree_dict[rights_dict["pid"]].append(rights_dict) - return {"code": 0, "data": tree_dict.get(0)} + return JsonResponse().set_body(tree_dict.get(0)).ok() + if t == "treetable": # tree table 数据 page = request.args.get("page", type=int, default=1) per_page = request.args.get("per_page", type=int, default=10) @@ -63,8 +65,8 @@ def rights_list(): data["children"].append(child_data) data["isParent"] = True ret.append(data) - return {"code": 0, "msg": "请求权限数据成功", "count": pages.total, "data": ret} - return {"code": 0, "msg": "请求权限数据成功,"} + return JsonResponse().set_msg("请求权限数据成功").set_body(ret).ok() + return JsonResponse().set_msg("请求权限数据成功").ok() @rights_api.post("/rights") @@ -77,7 +79,7 @@ def create_rights(): data["sort"] = int(data["sort"]) rights_obj = RightsORM(**data) rights_obj.save() - return {"code": 0, "msg": "新增权限数据成功"} + return JsonResponse().set_msg("新增权限数据成功").ok() @rights_api.put("/rights/") @@ -90,7 +92,7 @@ def change_rights(rid): for key, value in data.items(): setattr(rights_obj, key, value) rights_obj.save() - return {"code": 0, "msg": "修改权限数据成功"} + return JsonResponse().set_msg("修改权限数据成功").ok() @rights_api.delete("/rights/") @@ -98,4 +100,4 @@ def change_rights(rid): def delete_rights(rid): rights_obj = RightsORM.query.get(rid) rights_obj.delete() - return {"code": 0, "msg": "删除权限数据成功"} + return JsonResponse().set_msg("删除权限数据成功").ok() diff --git a/pear_admin/apis/role.py b/pear_admin/apis/role.py index ddb1596..aef9bb6 100644 --- a/pear_admin/apis/role.py +++ b/pear_admin/apis/role.py @@ -1,6 +1,7 @@ from flask import Blueprint, request from flask_sqlalchemy.pagination import Pagination +from pear_admin.common.utils.responses import JsonResponse from pear_admin.extensions import db from pear_admin.orms import RightsORM, RoleORM @@ -14,13 +15,7 @@ def role_list(): q = db.select(RoleORM) pages: Pagination = db.paginate(q, page=page, per_page=per_page) - - return { - "code": 0, - "msg": "获取角色数据成功", - "data": [item.json() for item in pages.items], - "count": pages.total, - } + return JsonResponse().set_table(pages).set_msg("获取角色数据成功").ok() @role_api.post("/role") @@ -30,7 +25,7 @@ def create_role(): del data["id"] role = RoleORM(**data) role.save() - return {"code": 0, "msg": "新增角色成功"} + return JsonResponse().set_msg("新增角色成功").ok() @role_api.put("/role/") @@ -42,14 +37,14 @@ def change_role(rid): for key, value in data.items(): setattr(role_obj, key, value) role_obj.save() - return {"code": 0, "msg": "修改角色权限成功"} + return JsonResponse().set_msg("修改角色权限成功").ok() @role_api.delete("/role/") def del_role(rid): role_obj = RoleORM.query.get(rid) role_obj.delete() - return {"code": 0, "msg": "删除角色成功"} + return JsonResponse().set_msg("删除角色成功").ok() @role_api.get("/role/role_rights/") @@ -59,11 +54,7 @@ def role_rights(rid): ).scalar() own_rights_list = [r.id for r in role.rights_list] - return { - "code": 0, - "msg": "返回角色权限数据成功", - "data": own_rights_list, - } + return JsonResponse().set_body(own_rights_list).set_msg("删除角色成功").ok() @role_api.put("/role/role_rights/") @@ -79,4 +70,4 @@ def change_role_rights(rid): ).all() role.rights_list = [r[0] for r in rights_obj_list] role.save() - return {"code": 0, "msg": "授权成功"} + return JsonResponse().set_msg("授权成功").ok() diff --git a/pear_admin/apis/user.py b/pear_admin/apis/user.py index abb20b0..a30c3ac 100644 --- a/pear_admin/apis/user.py +++ b/pear_admin/apis/user.py @@ -4,6 +4,7 @@ from flask import Blueprint, request from flask_jwt_extended import current_user, jwt_required from flask_sqlalchemy.pagination import Pagination +from pear_admin.common.utils.responses import JsonResponse from pear_admin.extensions import db from pear_admin.orms import RoleORM, UserORM @@ -18,12 +19,7 @@ def user_list(): pages: Pagination = db.paginate(q, page=page, per_page=per_page) - return { - "code": 0, - "msg": "获取用户数据成功", - "data": [item.json() for item in pages.items], - "count": pages.total, - } + return JsonResponse().set_table(pages).set_msg("获取用户数据成功").ok() @user_api.post("/user") @@ -37,7 +33,7 @@ def create_user(): role.create_at = datetime.strptime(create_at, "%Y-%m-%d %H:%M:%S") role.password = "123456" role.save() - return {"code": 0, "msg": "新增用户成功"} + return JsonResponse().set_msg("新增用户成功").ok() @user_api.put("/user/") @@ -51,14 +47,14 @@ def change_user(uid): value = datetime.strptime(value, "%Y-%m-%d %H:%M:%S") setattr(user_obj, key, value) user_obj.save() - return {"code": 0, "msg": "修改用户信息成功"} + return JsonResponse().set_msg("修改用户信息成功").ok() @user_api.delete("/user/") def del_user(rid): user_obj = UserORM.query.get(rid) user_obj.delete() - return {"code": 0, "msg": "删除用户成功"} + return JsonResponse().set_msg("删除用户成功").ok() @user_api.get("/user/user_role/") @@ -68,12 +64,7 @@ def get_user_role(uid): ).scalar() wn_role_list = [r.id for r in user.role_list] - - return { - "code": 0, - "msg": "返回角色权限数据成功", - "data": wn_role_list, - } + return JsonResponse().set_body(wn_role_list).set_msg("返回角色权限数据成功").ok() @user_api.put("/user/user_role/") @@ -89,14 +80,10 @@ def change_user_role(rid): ).all() user.role_list = [r[0] for r in role_obj_list] user.save() - return {"code": 0, "msg": "授权成功"} + return JsonResponse().set_msg("授权成功").ok() @user_api.get("/user/profile") @jwt_required() def user_profile(): - return { - "code": 0, - "msg": "获取个人数据成功", - "data": current_user.json(), - } + return JsonResponse().set_body(current_user.json()).set_msg("获取个人数据成功").ok() diff --git a/pear_admin/common/utils/response_code.py b/pear_admin/common/utils/response_code.py new file mode 100644 index 0000000..5fcb8d3 --- /dev/null +++ b/pear_admin/common/utils/response_code.py @@ -0,0 +1,49 @@ +from enum import Enum + + +class ResponseCodeEnum(Enum): + """状态码枚举类""" + + ok = (0, "成功") + + error = (400000, "请求错误") + failure = (400000, "请求失败") + image_code_err = (400001, "图形验证码错误") + throttling_err = (400002, "访问过于频繁") + necessary_param_err = (400003, "缺少必传参数") + USER_ERR = (400004, "用户名错误") + PWD_ERR = (400005, "密码错误") + CPWD_ERR = (400006, "密码不一致") + MOBILE_ERR = (400007, "手机号错误") + SMS_CODE_ERR = (400008, "短信验证码有误") + ALLOW_ERR = (400009, "未勾选协议") + SESSION_ERR = (401000, "用户未登录") + + forbid = (403000, "权限禁止") + jwt_expired = (403001, "Token 已过期,请重新登录") + unauthorized = (403003, "Token 已失效,请重新登录") + not_found = (404000, "数据未找到") + + SERVER_ERR = (500000, "服务器异常") + DB_ERR = (500000, "数据错误") + EMAIL_ERR = (500001, "邮箱错误") + TEL_ERR = (500002, "固定电话错误") + NODATA_ERR = (500003, "无数据") + NEW_PWD_ERR = (500004, "新密码错误") + OPENID_ERR = (500005, "无效的 openid") + PARAM_ERR = (500006, "参数错误") + STOCK_ERR = (500007, "库存不足") + + @property + def code(self): + """获取状态码""" + return self.value[0] + + @property + def msg(self): + """获取状态码信息""" + return self.value[1] + + @property + def status_code(self): + return self.value[0] // 1000 diff --git a/pear_admin/common/utils/responses.py b/pear_admin/common/utils/responses.py new file mode 100644 index 0000000..f69891e --- /dev/null +++ b/pear_admin/common/utils/responses.py @@ -0,0 +1,105 @@ +from pear_admin.common.utils.response_code import ResponseCodeEnum + + +class JsonResponse: + """ + JsonResponse 响应体,统一返回前端的格式 + """ + + def __init__(self): + self._data = None + self._code = None + self._msg = None + self._status_code = None + self._error_code = 0 + self._table_data = {} + + def set_body(self, body): + self._data = body + return self + + def set_msg(self, msg): + self._msg = msg + return self + + def set_status_code(self, status_code): + # 设置响应状态码 + self._status_code = status_code + return self + + def set_error_code(self, error_code): + # 单独设置响应错误码 + self._error_code = error_code + return self + + def set_response_code_enum(self, code): + # 设置响应状态码 + self._set_code(code) + return self + + def set_table(self, pages): + self.set_body([item.json() for item in pages.items]) + self._table_data.update( + { + "count": pages.total, + "page": pages.page, + "per_page": pages.per_page, + } + ) + return self + + def set_table_info(self, pages): + self._table_data.update( + { + "count": pages.total, + "page": pages.page, + "per_page": pages.per_page, + } + ) + return self + + def ok(self): + self._set_code(ResponseCodeEnum.ok) + return self._res_result() + + def not_found(self): + self._set_code(ResponseCodeEnum.not_found) + return self._res_result() + + def forbid(self): + self._set_code(ResponseCodeEnum.forbid) + return self._res_result() + + def error(self): + self._set_code(ResponseCodeEnum.error) + return self._res_result() + + def failure(self): + self._set_code(ResponseCodeEnum.failure) + return self._res_result() + + def jwt_expired(self): + self._set_code(ResponseCodeEnum.jwt_expired) + return self._res_result() + + def _set_code(self, code): + # 在内部设置状态码 + if not self._msg: + self._msg = code.msg + if not self._status_code: + self._status_code = code.status_code + self._error_code = code.code + return self + + def _res_result(self): + data = {"code": self._error_code, "msg": self._msg, "data": self._data} + data.update(self._table_data) + return data + + def set_code(self, code): + self._set_code(code) + return self._res_result() + + +if __name__ == "__main__": + print(JsonResponse().set_msg("请求过于频繁").ok()) diff --git a/pear_admin/orms/__init__.py b/pear_admin/orms/__init__.py index 9c26d0f..efcc667 100644 --- a/pear_admin/orms/__init__.py +++ b/pear_admin/orms/__init__.py @@ -6,14 +6,14 @@ from .role import RoleORM from .user import UserORM user_role = db.Table( - "ums_user_role", # 用户-角色中间表名称 + "ums_user_role", # 用户 - 角色中间表名称 db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment="标识"), db.Column("user_id", db.Integer, db.ForeignKey("ums_user.id"), comment="用户编号"), db.Column("role_id", db.Integer, db.ForeignKey("ums_role.id"), comment="角色编号"), ) role_rights = db.Table( - "ums_role_rights", # 用户-权限中间表名称 + "ums_role_rights", # 用户 - 权限中间表名称 db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment="标识"), db.Column("rights_id", db.Integer, db.ForeignKey("ums_rights.id"), comment="用户编号"), db.Column("role_id", db.Integer, db.ForeignKey("ums_role.id"), comment="角色编号"), diff --git a/pear_admin/orms/_base.py b/pear_admin/orms/_base.py index 220fa4b..12da415 100644 --- a/pear_admin/orms/_base.py +++ b/pear_admin/orms/_base.py @@ -11,3 +11,6 @@ class BaseORM(db.Model): def delete(self): db.session.delete(self) db.session.commit() + + def json(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} diff --git a/pear_admin/orms/department.py b/pear_admin/orms/department.py index e3b9237..d1c704e 100644 --- a/pear_admin/orms/department.py +++ b/pear_admin/orms/department.py @@ -5,10 +5,10 @@ from ._base import BaseORM class DepartmentORM(BaseORM): __tablename__ = "ums_department" - id = db.Column(db.Integer, primary_key=True, comment="部门ID") + id = db.Column(db.Integer, primary_key=True, comment="部门 ID") name = db.Column(db.String(50), comment="部门名称") leader = db.Column(db.String(50), comment="负责人") - enable = db.Column(db.Boolean, comment="状态(1开启,0关闭)", default=True) + enable = db.Column(db.Boolean, comment="状态 (1 开启,0 关闭)", default=True) users = db.relationship("UserORM", backref="department") @@ -17,12 +17,3 @@ class DepartmentORM(BaseORM): "DepartmentORM", back_populates="children", remote_side=[id] ) # 自关联 children = db.relationship("DepartmentORM", back_populates="parent") - - def json(self): - return { - "id": self.id, - "pid": self.pid, - "name": self.name, - "leader": self.leader, - "enable": self.enable, - } diff --git a/pear_admin/orms/rights.py b/pear_admin/orms/rights.py index f06f0c0..809adb6 100644 --- a/pear_admin/orms/rights.py +++ b/pear_admin/orms/rights.py @@ -30,20 +30,6 @@ class RightsORM(BaseORM): ) # 自关联 children = db.relationship("RightsORM", back_populates="parent") - def json(self): - return { - "id": self.id, - "name": self.name, - "code": self.code, - "type": self.type, - "url": self.url, - "icon_sign": self.icon_sign, - "status": self.status, - "sort": self.sort, - "open_type": self.open_type, - "pid": self.pid, - } - def menu_json(self): type_map_dict = {"menu": 0, "path": 1} diff --git a/pear_admin/orms/role.py b/pear_admin/orms/role.py index 1f88fc6..51add35 100644 --- a/pear_admin/orms/role.py +++ b/pear_admin/orms/role.py @@ -13,18 +13,9 @@ class RoleORM(BaseORM): rights_ids = db.Column( db.String(512), - comment="权限ids,1,2,5。冗余字段,用户缓存用户权限", + comment="权限 ids,1,2,5。冗余字段,用户缓存用户权限", ) rights_list = db.relationship( "RightsORM", secondary="ums_role_rights", backref=db.backref("role") ) - - def json(self): - return { - "id": self.id, - "name": self.name, - "code": self.code, - "desc": self.desc, - "rights_ids": self.rights_ids, - } diff --git a/pear_admin/orms/user.py b/pear_admin/orms/user.py index 78ea87b..8f74deb 100644 --- a/pear_admin/orms/user.py +++ b/pear_admin/orms/user.py @@ -10,7 +10,7 @@ from ._base import BaseORM class UserORM(BaseORM): __tablename__ = "ums_user" - id = db.Column(db.Integer, primary_key=True, comment="自增id") + id = db.Column(db.Integer, primary_key=True, comment="自增 id") nickname = db.Column(db.String(128), nullable=False, comment="昵称") username = db.Column(db.String(128), nullable=False, comment="登录名") password_hash = db.Column(db.String(102), nullable=False, comment="登录密码") @@ -24,7 +24,7 @@ class UserORM(BaseORM): default=datetime.now, ) department_id = db.Column( - db.Integer, db.ForeignKey("ums_department.id"), default=1, comment="部门id" + db.Integer, db.ForeignKey("ums_department.id"), default=1, comment="部门 id" ) role_list = db.relationship( @@ -35,14 +35,10 @@ class UserORM(BaseORM): ) def json(self): - return { - "id": self.id, - "username": self.username, - "nickname": self.nickname, - "mobile": self.mobile, - "email": self.email, - "create_at": self.create_at.strftime("%Y-%m-%d %H:%M:%S"), - } + create_at = (self.create_at.strftime("%Y-%m-%d %H:%M:%S"),) + data = super().json() + data["create_at"] = create_at + return data @property def password(self): diff --git a/templates/system/department/index.html b/templates/system/department/index.html index ea1ca0e..3b594c0 100644 --- a/templates/system/department/index.html +++ b/templates/system/department/index.html @@ -84,7 +84,7 @@
- +
{ return ``; }, diff --git a/templates/system/role/index.html b/templates/system/role/index.html index b54f76e..e32aeda 100644 --- a/templates/system/role/index.html +++ b/templates/system/role/index.html @@ -180,7 +180,7 @@ elem: "#role-table", id: "role-table", url: "/api/v1/role", // 此处为静态模拟数据,实际使用时需换成真实接口 - height: "full-35", // 最大高度减去其他容器已占有的高度差 + height: "full", // 最大高度减去其他容器已占有的高度差 toolbar: "#role-toolbar", page: true, cols: [ diff --git a/templates/system/user/index.html b/templates/system/user/index.html index 268565b..8b5bca5 100644 --- a/templates/system/user/index.html +++ b/templates/system/user/index.html @@ -157,6 +157,7 @@ action="" id="user-role-form" lay-filter="user-role-form" + style="display: none" >
    @@ -193,7 +194,7 @@ elem: "#user-table", id: "user-table", url: "/api/v1/user", // 此处为静态模拟数据,实际使用时需换成真实接口 - height: "full-35", // 最大高度减去其他容器已占有的高度差 + height: "full", // 最大高度减去其他容器已占有的高度差 toolbar: "#user-toolbar", page: true, cols: [ diff --git a/templates/view/login.html b/templates/view/login.html index fd2fe49..79d1394 100644 --- a/templates/view/login.html +++ b/templates/view/login.html @@ -29,7 +29,7 @@
    Pear Admin Flask