class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True, index=True) username = db.Column(db.String(10), unique=True) phone = db.Column(db.String(30), default="无") email = db.Column(db.String(30), default="无") country = db.Column(db.String(10), default="中国") area = db.Column(db.String(10), default="北京") key = db.Column(db.String(16)) create_at = db.Column(db.DateTime) updated_at = db.Column(db.DateTime) messages = db.relationship('Message', back_populates='author', cascade='all') rooms = db.relationship('Room', back_populates='users', secondary=assist_table) @classmethod def create_user(cls): user = cls() db.session.add(user) db.session.commit() user.username = '******' + str(user.id) generate_avatar(user.username, 'chatroom/static/avatars/user/{}.png'.format(user.id)) db.session.commit() return user def is_master(self, room): if room.master_id == self.id: return True else: return False def join_room(self, key, name): room = Room.query.filter_by(key=key).filter_by(name=name).first() if room is None or room in self.rooms: return None self.rooms.append(room) db.session.commit() return room def send_message(self, type_, content, room): new_message = Message(type_, content) room.messages.append(new_message) self.messages.append(new_message) db.session.add(new_message) db.session.commit() return new_message def __init__(self): # generate a 16-length random string as token key self.key = "".join(random.choice(string.ascii_letters + string.digits) for i in range(16)) self.create_at = datetime.utcnow() self.updated_at = self.create_at
class Message(db.Model): id = db.Column(db.String(36), primary_key=True, index=True) content = db.Column(db.Text, index=True) timestamp = db.Column(db.DateTime) updated = db.Column(db.DateTime, default=datetime.utcnow()) author_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True) room_id = db.Column(db.String(36), db.ForeignKey('room.id'), index=True) author = db.relationship('User', back_populates='messages') room = db.relationship('Room', back_populates='messages') def __init__(self, content, author_id, room_id): self.id = str(uuid1()) self.content = content self.author_id = author_id self.room_id = room_id self.timestamp = datetime.utcnow()
class Message(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) type = db.Column(db.Enum('text', 'picture', 'file')) content = db.Column(db.String(300)) create_at = db.Column(db.DateTime) updated_at = db.Column(db.DateTime) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) author = db.relationship('User', back_populates='messages') room_id = db.Column(db.Integer, db.ForeignKey('room.id')) room = db.relationship('Room', back_populates='messages') def __init__(self, type_, content): self.type = type_ self.content = content self.create_at = datetime.utcnow() self.updated_at = self.create_at
class Room(db.Model): id = db.Column(db.String(36), primary_key=True, index=True) name = db.Column(db.String(20), unique=True, index=True) introduce = db.Column(db.Text) timestamp = db.Column(db.DateTime) updated = db.Column(db.DateTime, default=datetime.utcnow()) messages = db.relationship('Message', back_populates='room', cascade='all') owner_id = db.Column(db.Integer, db.ForeignKey('user.id')) owner = db.relationship('User', back_populates='rooms_owned') users = db.relationship('User', secondary=assist_table, back_populates='rooms') avatar = 1 def set_avatar(self, file): pass def __init__(self, name, introduce=None): self.id = str(uuid1()) self.name = name if introduce is None: self.introduce = ' ' else: self.introduce = introduce
class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True, index=True) username = db.Column(db.String(10), unique=True, index=True) register_at = db.Column(db.DateTime, default=datetime.utcnow()) updated = db.Column(db.DateTime, default=datetime.utcnow()) password_hash = db.Column(db.String(128)) phone = db.Column(db.String(30), unique=True) # 添加短信验证和格式验证 messages = db.relationship('Message', back_populates='author', cascade='all') rooms_owned = db.relationship('Room', back_populates='owner', cascade='all') # 若拥有聊天室则不能删除用户 avatar = 1 rooms = db.relationship('Room', secondary=assist_table, back_populates='users') def set_avatar(self, file): pass def set_password(self, password): self.password_hash = generate_password_hash(password) def validate_password(self, password): return check_password_hash(self.password_hash, password) def __init__(self, username, password, phone): self.username = username self.set_password(password) # if validate_phone(phone): # self.phone = phone self.phone = phone
class Room(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True, index=True) name = db.Column(db.String(10), unique=True, index=True) introduce = db.Column(db.String(100)) topic = db.Column(db.String(100)) key = db.Column(db.String(20)) create_at = db.Column(db.DateTime) updated_at = db.Column(db.DateTime) master_id = db.Column(db.Integer) messages = db.relationship('Message', back_populates='room', cascade='all') users = db.relationship('User', back_populates='rooms', secondary=assist_table) @classmethod # move to User's method def create_room(cls, name=None, introduce="无", key="123456", topic="无"): room = cls() db.session.add(room) db.session.commit() if name is None: room.name = 'room' + str(room.id) else: room.name = name room.introduce = introduce room.key = key room.topic = topic room.master_id = g.user.id g.user.rooms.append(room) generate_avatar(room.name, 'chatroom/static/avatars/room/{}.png'.format(room.id)) db.session.commit() return room def __init__(self): self.create_at = datetime.utcnow() self.updated_at = self.create_at