以下是一个详细的模型代码示例,包括用户、角色、权限、资源等模型的定义和关系:
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from datetime import datetime
db = SQLAlchemy()
class User(UserMixin, db.Model):
"""
用户模型
"""
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
email = db.Column(db.String(128), unique=True, nullable=False)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False)
created_at = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
class Role(db.Model):
"""
角色模型
"""
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, nullable=False)
permissions = db.relationship('Permission', backref='role', lazy='dynamic')
class Permission(db.Model):
"""
权限模型
"""
__tablename__ = 'permissions'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, nullable=False)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False)
resources = db.relationship('Resource', backref='permission', lazy='dynamic')
class Resource(db.Model):
"""
资源模型
"""
__tablename__ = 'resources'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, nullable=False)
path = db.Column(db.String(128), nullable=False)
permission_id = db.Column(db.Integer, db.ForeignKey('permissions.id'), nullable=False)
上述代码中定义了四个模型,分别为用户、角色、权限和资源。用户和角色之间是一对多的关系,即一个角色可以对应多个用户。角色和权限之间也是一对多的关系,即一个角色可以有多个权限。权限和资源之间是一对多的关系,即一个权限可以对应多个资源。
在上述代码中,用户模型还继承了Flask-Login提供的UserMixin类,用于实现用户登录认证功能。同时,还定义了一些属性和方法,如密码加密、密码校验等,以及一些关系属性,如用户和角色之间的关系。在实际应用中,还需要根据业务需求进行适当的扩展和优化。