项目初次提交
This commit is contained in:
14
apps/vadmin/auth/models/__init__.py
Normal file
14
apps/vadmin/auth/models/__init__.py
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : __init__.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 简要说明
|
||||
|
||||
|
||||
from .m2m import vadmin_auth_user_roles, vadmin_auth_role_menus, vadmin_auth_user_depts, vadmin_auth_role_depts
|
||||
from .menu import VadminMenu
|
||||
from .role import VadminRole
|
||||
from .user import VadminUser
|
||||
from .dept import VadminDept
|
31
apps/vadmin/auth/models/dept.py
Normal file
31
apps/vadmin/auth/models/dept.py
Normal file
@ -0,0 +1,31 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023/10/23 13:41
|
||||
# @File : dept.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 部门模型
|
||||
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
from db.db_base import BaseModel
|
||||
from sqlalchemy import String, Boolean, Integer, ForeignKey
|
||||
|
||||
|
||||
class VadminDept(BaseModel):
|
||||
__tablename__ = "vadmin_auth_dept"
|
||||
__table_args__ = ({'comment': '部门表'})
|
||||
|
||||
name: Mapped[str] = mapped_column(String(50), index=True, nullable=False, comment="部门名称")
|
||||
dept_key: Mapped[str] = mapped_column(String(50), index=True, nullable=False, comment="部门标识")
|
||||
disabled: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否禁用")
|
||||
order: Mapped[int | None] = mapped_column(Integer, comment="显示排序")
|
||||
desc: Mapped[str | None] = mapped_column(String(255), comment="描述")
|
||||
owner: Mapped[str | None] = mapped_column(String(255), comment="负责人")
|
||||
phone: Mapped[str | None] = mapped_column(String(255), comment="联系电话")
|
||||
email: Mapped[str | None] = mapped_column(String(255), comment="邮箱")
|
||||
|
||||
parent_id: Mapped[int | None] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("vadmin_auth_dept.id", ondelete='CASCADE'),
|
||||
comment="上级部门"
|
||||
)
|
41
apps/vadmin/auth/models/m2m.py
Normal file
41
apps/vadmin/auth/models/m2m.py
Normal file
@ -0,0 +1,41 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : m2m.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 关联中间表
|
||||
|
||||
from db.db_base import Base
|
||||
from sqlalchemy import ForeignKey, Column, Table, Integer
|
||||
|
||||
|
||||
vadmin_auth_user_roles = Table(
|
||||
"vadmin_auth_user_roles",
|
||||
Base.metadata,
|
||||
Column("user_id", Integer, ForeignKey("vadmin_auth_user.id", ondelete="CASCADE")),
|
||||
Column("role_id", Integer, ForeignKey("vadmin_auth_role.id", ondelete="CASCADE")),
|
||||
)
|
||||
|
||||
|
||||
vadmin_auth_role_menus = Table(
|
||||
"vadmin_auth_role_menus",
|
||||
Base.metadata,
|
||||
Column("role_id", Integer, ForeignKey("vadmin_auth_role.id", ondelete="CASCADE")),
|
||||
Column("menu_id", Integer, ForeignKey("vadmin_auth_menu.id", ondelete="CASCADE")),
|
||||
)
|
||||
|
||||
vadmin_auth_user_depts = Table(
|
||||
"vadmin_auth_user_depts",
|
||||
Base.metadata,
|
||||
Column("user_id", Integer, ForeignKey("vadmin_auth_user.id", ondelete="CASCADE")),
|
||||
Column("dept_id", Integer, ForeignKey("vadmin_auth_dept.id", ondelete="CASCADE")),
|
||||
)
|
||||
|
||||
vadmin_auth_role_depts = Table(
|
||||
"vadmin_auth_role_depts",
|
||||
Base.metadata,
|
||||
Column("role_id", Integer, ForeignKey("vadmin_auth_role.id", ondelete="CASCADE")),
|
||||
Column("dept_id", Integer, ForeignKey("vadmin_auth_dept.id", ondelete="CASCADE")),
|
||||
)
|
||||
|
67
apps/vadmin/auth/models/menu.py
Normal file
67
apps/vadmin/auth/models/menu.py
Normal file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : menu.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 菜单模型
|
||||
|
||||
|
||||
from db.db_base import BaseModel
|
||||
from sqlalchemy import String, Boolean, Integer, ForeignKey
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
|
||||
class VadminMenu(BaseModel):
|
||||
__tablename__ = "vadmin_auth_menu"
|
||||
__table_args__ = ({'comment': '菜单表'})
|
||||
|
||||
title: Mapped[str] = mapped_column(String(50), comment="名称")
|
||||
icon: Mapped[str | None] = mapped_column(String(50), comment="菜单图标")
|
||||
redirect: Mapped[str | None] = mapped_column(String(100), comment="重定向地址")
|
||||
component: Mapped[str | None] = mapped_column(String(255), comment="前端组件地址")
|
||||
path: Mapped[str | None] = mapped_column(String(50), comment="前端路由地址")
|
||||
disabled: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否禁用")
|
||||
hidden: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否隐藏")
|
||||
order: Mapped[int] = mapped_column(Integer, comment="排序")
|
||||
menu_type: Mapped[str] = mapped_column(String(8), comment="菜单类型")
|
||||
parent_id: Mapped[int | None] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("vadmin_auth_menu.id", ondelete='CASCADE'),
|
||||
comment="父菜单"
|
||||
)
|
||||
perms: Mapped[str | None] = mapped_column(String(50), comment="权限标识", unique=False, index=True)
|
||||
|
||||
"""以下属性主要用于补全前端路由属性,"""
|
||||
noCache: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="如果设置为true,则不会被 <keep-alive> 缓存(默认 false)",
|
||||
default=False
|
||||
)
|
||||
breadcrumb: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)",
|
||||
default=True
|
||||
)
|
||||
affix: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="如果设置为true,则会一直固定在tag项中(默认 false)",
|
||||
default=False
|
||||
)
|
||||
noTagsView: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="如果设置为true,则不会出现在tag中(默认 false)",
|
||||
default=False
|
||||
)
|
||||
canTo: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="设置为true即使hidden为true,也依然可以进行路由跳转(默认 false)",
|
||||
default=False
|
||||
)
|
||||
alwaysShow: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
comment="""当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式,
|
||||
只有一个时,会将那个子路由当做根路由显示在侧边栏,若你想不管路由下面的 children 声明的个数都显示你的根路由,
|
||||
你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由(默认 true)""",
|
||||
default=True
|
||||
)
|
30
apps/vadmin/auth/models/role.py
Normal file
30
apps/vadmin/auth/models/role.py
Normal file
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : role.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 角色模型
|
||||
|
||||
from sqlalchemy.orm import relationship, Mapped, mapped_column
|
||||
from db.db_base import BaseModel
|
||||
from sqlalchemy import String, Boolean, Integer
|
||||
from .menu import VadminMenu
|
||||
from .dept import VadminDept
|
||||
from .m2m import vadmin_auth_role_menus, vadmin_auth_role_depts
|
||||
|
||||
|
||||
class VadminRole(BaseModel):
|
||||
__tablename__ = "vadmin_auth_role"
|
||||
__table_args__ = ({'comment': '角色表'})
|
||||
|
||||
name: Mapped[str] = mapped_column(String(50), index=True, comment="名称")
|
||||
role_key: Mapped[str] = mapped_column(String(50), index=True, comment="权限字符")
|
||||
data_range: Mapped[int] = mapped_column(Integer, default=4, comment="数据权限范围")
|
||||
disabled: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否禁用")
|
||||
order: Mapped[int | None] = mapped_column(Integer, comment="排序")
|
||||
desc: Mapped[str | None] = mapped_column(String(255), comment="描述")
|
||||
is_admin: Mapped[bool] = mapped_column(Boolean, comment="是否为超级角色", default=False)
|
||||
|
||||
menus: Mapped[set[VadminMenu]] = relationship(secondary=vadmin_auth_role_menus)
|
||||
depts: Mapped[set[VadminDept]] = relationship(secondary=vadmin_auth_role_depts)
|
72
apps/vadmin/auth/models/user.py
Normal file
72
apps/vadmin/auth/models/user.py
Normal file
@ -0,0 +1,72 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : user.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 用户模型
|
||||
|
||||
from datetime import datetime
|
||||
from sqlalchemy.orm import relationship, Mapped, mapped_column
|
||||
from db.db_base import BaseModel
|
||||
from sqlalchemy import String, Boolean, DateTime
|
||||
from passlib.context import CryptContext
|
||||
from .role import VadminRole
|
||||
from .dept import VadminDept
|
||||
from .m2m import vadmin_auth_user_roles, vadmin_auth_user_depts
|
||||
|
||||
pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
|
||||
|
||||
|
||||
class VadminUser(BaseModel):
|
||||
__tablename__ = "vadmin_auth_user"
|
||||
__table_args__ = ({'comment': '用户表'})
|
||||
|
||||
avatar: Mapped[str | None] = mapped_column(String(500), comment='头像')
|
||||
telephone: Mapped[str] = mapped_column(String(11), nullable=False, index=True, comment="手机号", unique=False)
|
||||
email: Mapped[str | None] = mapped_column(String(50), comment="邮箱地址")
|
||||
name: Mapped[str] = mapped_column(String(50), index=True, nullable=False, comment="姓名")
|
||||
nickname: Mapped[str | None] = mapped_column(String(50), nullable=True, comment="昵称")
|
||||
password: Mapped[str] = mapped_column(String(255), nullable=True, comment="密码")
|
||||
gender: Mapped[str | None] = mapped_column(String(8), nullable=True, comment="性别")
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True, comment="是否可用")
|
||||
is_reset_password: Mapped[bool] = mapped_column(
|
||||
Boolean,
|
||||
default=False,
|
||||
comment="是否已经重置密码,没有重置的,登陆系统后必须重置密码"
|
||||
)
|
||||
last_ip: Mapped[str | None] = mapped_column(String(50), comment="最后一次登录IP")
|
||||
last_login: Mapped[datetime | None] = mapped_column(DateTime, comment="最近一次登录时间")
|
||||
is_staff: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否为工作人员")
|
||||
wx_server_openid: Mapped[str | None] = mapped_column(String(255), comment="服务端微信平台openid")
|
||||
is_wx_server_openid: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否已有服务端微信平台openid")
|
||||
|
||||
roles: Mapped[set[VadminRole]] = relationship(secondary=vadmin_auth_user_roles)
|
||||
depts: Mapped[set[VadminDept]] = relationship(secondary=vadmin_auth_user_depts)
|
||||
|
||||
@staticmethod
|
||||
def get_password_hash(password: str) -> str:
|
||||
"""
|
||||
生成哈希密码
|
||||
:param password: 原始密码
|
||||
:return: 哈希密码
|
||||
"""
|
||||
return pwd_context.hash(password)
|
||||
|
||||
@staticmethod
|
||||
def verify_password(password: str, hashed_password: str) -> bool:
|
||||
"""
|
||||
验证原始密码是否与哈希密码一致
|
||||
:param password: 原始密码
|
||||
:param hashed_password: 哈希密码
|
||||
:return:
|
||||
"""
|
||||
return pwd_context.verify(password, hashed_password)
|
||||
|
||||
def is_admin(self) -> bool:
|
||||
"""
|
||||
获取该用户是否拥有最高权限
|
||||
以最高权限为准
|
||||
:return:
|
||||
"""
|
||||
return any([i.is_admin for i in self.roles])
|
Reference in New Issue
Block a user