2024-07-29 11:43:52 +08:00

232 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime
import random
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin,AnonymousUserMixin
from . import db, login_manager
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import current_app
class Permission:
FOLLOW = 1
COMMENT = 2
WRITE = 4
DETECT=8
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
default = db.Column(db.Boolean, default=False, index=True)
permissions = db.Column(db.Integer)
users = db.relationship('User', backref='role', lazy='dynamic')
def __init__(self, **kwargs):
super(Role, self).__init__(**kwargs)
if self.permissions is None:
self.permissions = 0
@staticmethod
def insert_roles():
roles = {
'User': [Permission.FOLLOW, Permission.COMMENT, Permission.WRITE],
'Doctor': [Permission.FOLLOW, Permission.COMMENT,
Permission.WRITE, Permission.DETECT,
],
}
default_role = 'User'
for r in roles:
role = Role.query.filter_by(name=r).first()
if role is None:
role = Role(name=r)
role.reset_permissions()
for perm in roles[r]:
role.add_permission(perm)
role.default = (role.name == default_role)
db.session.add(role)
db.session.commit()
def add_permission(self, perm):
if not self.has_permission(perm):
self.permissions += perm
def remove_permission(self, perm):
if self.has_permission(perm):
self.permissions -= perm
def reset_permissions(self):
self.permissions = 0
def has_permission(self, perm):
return self.permissions & perm == perm
def __repr__(self):
return '<Role %r>' % self.name
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
name = db.Column(db.String(64))
location = db.Column(db.String(256))
about_me = db.Column(db.Text())
last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
avatar_color = db.Column(db.String(10))
has_avatar = db.Column(db.Boolean, default=False)
sex = db.Column(db.String(5))
phone=db.Column(db.String(15))
age=db.Column(db.Integer)
department=db.Column(db.String(128))
id_number= db.Column(db.String(64))
posts=db.relationship('Post',backref='author',lazy='dynamic') #user表与comment为1对多 即可通过一篇文章获得一个作者(用户)
comments = db.relationship('Comment', backref='author', lazy='dynamic')
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
if self.role is None:
default_role = Role.query.filter_by(default=True).first()
self.role = default_role
def can(self, perm):
return self.role is not None and self.role.has_permission(perm)
def is_administrator(self):
return self.can(Permission.ADMIN)
@property
def is_authenticated(self):
return True if self.id else 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)
def get_random_color(self):
colors = ['red', 'blue', 'orange','green']
return random.choice(colors)
def ping(self):
self.last_seen = datetime.utcnow()
db.session.add(self)
db.session.commit()
def __repr__(self):
return '<User %r>' % self.username
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Text, nullable=False)
content = db.Column(db.Text, nullable=False)
img_count = db.Column(db.Integer, default=0)
collect_num = db.Column(db.Integer, default=0)
comment_num = db.Column(db.Integer, default=0)
like_num = db.Column(db.Integer, default=0)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) #一个人可以发多个文章,但每篇文章对应一个用户
comments=db.relationship('Comment',backref='post',lazy='dynamic')
class AnonymousUser(AnonymousUserMixin):
def can(self, permissions):
return False
def is_administrator(self):
return False
login_manager.anonymous_user = AnonymousUser
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class Comment(db.Model):
__tablename__ = 'comments'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))
class DocComment(db.Model):
__tablename__ = 'doccomments'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
doc_id = db.Column(db.Integer, db.ForeignKey('users.id'))
star_num=db.Column(db.Integer,default=5)
class Like(db.Model):
__tablename__ = 'likes'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))
class Collect(db.Model):
__tablename__ = 'collects'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))
class Feedback(db.Model):
__tablename__='feedbacks'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
feedback=db.Column(db.Text, nullable=False)
class Workday(db.Model):
__tablename__ = 'workday'
id = db.Column(db.Integer, primary_key=True)
doc_id=db.Column(db.Integer, db.ForeignKey('users.id'))
date=db.Column(db.Date, index=True) #工作日期
morning_num=db.Column(db.Integer, default=0)
temp_morning=db.Column(db.Integer, default=0)
afternoon_num=db.Column(db.Integer, default=0)
temp_afternoon = db.Column(db.Integer, default=0)
cost=db.Column(db.Integer, default=30)
class Appointment(db.Model):
__tablename__='appointment'
id = db.Column(db.Integer, primary_key=True)
patient_id = db.Column(db.Integer, db.ForeignKey('users.id'))
doc_id = db.Column(db.Integer, db.ForeignKey('users.id'))
date=db.Column(db.Date, index=True) #预约日期
time=db.Column(db.Integer, default=-1)
email = db.Column(db.String(256), index=True)
id_number = db.Column(db.String(256))
name = db.Column(db.String(256))
gender = db.Column(db.String(256))
location = db.Column(db.String(256))
phone = db.Column(db.String(256))
age = db.Column(db.Integer)
cost=db.Column(db.Integer)
num = db.Column(db.Integer)
class Call_number(db.Model):
__tablename__ = 'call_numbers'
id=db.Column(db.Integer, primary_key=True)
appointment_id = db.Column(db.Integer, db.ForeignKey('appointment.id'), unique=True)
notified = db.Column(db.Boolean, default=False)
call_time=db.Column(db.DateTime, default=datetime.utcnow)
class Report(db.Model):
__tablename__='reports'
id = db.Column(db.Integer, primary_key=True)
appointment_id = db.Column(db.Integer, db.ForeignKey('appointment.id'), unique=True)
diagnosis_result=db.Column(db.String(256))
diagnosis_date=db.Column(db.String(64))
diagnosis_advice=db.Column(db.Text, nullable=False)
diagnosis_sign=db.Column(db.String(64))
class Private_message(db.Model):
__tablename__ = 'private_messages'
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey('users.id'))
recipient_id= db.Column(db.Integer, db.ForeignKey('users.id'))
body=db.Column(db.Text)
time = db.Column(db.DateTime, default=datetime.now)