diff --git a/common/model.py b/common/model.py index 59908d0..242584d 100644 --- a/common/model.py +++ b/common/model.py @@ -2,7 +2,6 @@ import datetime from entrance.extensions import db from sqlalchemy.orm import relationship -from sqlalchemy import Table from sqlalchemy import ForeignKey from sqlalchemy.orm import backref from marshmallow_sqlalchemy import SQLAlchemyAutoSchema @@ -38,7 +37,7 @@ class CurdModel(BaseModel): Column = db.Column -Table = Table +Table = db.Table relationship = relationship ForeignKey = ForeignKey backref = backref @@ -87,5 +86,4 @@ Enum = db.Enum ARRAY = db.ARRAY JSON = db.JSON - -SQLAlchemyAutoSchema=SQLAlchemyAutoSchema +SQLAlchemyAutoSchema = SQLAlchemyAutoSchema diff --git a/common/utils/mail.py b/common/utils/mail.py index eddc666..fbbab0a 100644 --- a/common/utils/mail.py +++ b/common/utils/mail.py @@ -1,9 +1,9 @@ from flask_mail import Message -from applications.extensions.init_mail import mail - - # send_mail(subject='title', recipients=['123@qq.com'], content='body') +from entrance.extend.mail import mail + + def send_mail(subject, recipients, content): try: message = Message(subject=subject, recipients=recipients, body=content) diff --git a/common/view.py b/common/view.py index 555b105..1cf2419 100644 --- a/common/view.py +++ b/common/view.py @@ -4,35 +4,22 @@ from flask.views import MethodViewType, MethodView class Blueprint(FlaskBlueprint): - # Order in which the methods are presented in the spec - HTTP_METHODS = ["OPTIONS", "HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"] - - DEFAULT_LOCATION_CONTENT_TYPE_MAPPING = { - "json": "application/json", - "form": "application/x-www-form-urlencoded", - "files": "multipart/form-data", - } - - - def __init__(self, *args, **kwargs): - self.description = kwargs.pop("description", "") - super().__init__(*args, **kwargs) self._endpoints = [] def add_url_rule( - self, - rule, - endpoint=None, - view_func=None, - provide_automatic_options=None, - *, - parameters=None, - tags=None, - **options, + self, + rule, + endpoint=None, + view_func=None, + provide_automatic_options=None, + *, + parameters=None, + tags=None, + **options, ): if view_func is None: @@ -75,5 +62,6 @@ class Blueprint(FlaskBlueprint): for bp in bp_lists: self.register_blueprint(bp) + class View(MethodView): - pass \ No newline at end of file + pass diff --git a/entrance/extend/migrate.py b/entrance/extend/migrate.py index 6752984..44c3405 100644 --- a/entrance/extend/migrate.py +++ b/entrance/extend/migrate.py @@ -1,7 +1,17 @@ from flask_migrate import Migrate from entrance.extend.orm import db -# from entrance.models import model_lists <-- 这一行不要删除 -from entrance.models import model_lists +# from entrance.models import model_lists +from modules.sys.models.user_role import user_role +from modules.sys.models.role_power import role_power +from modules.sys.models.dict import DictType, DictData +from modules.sys.models.admin_log import AdminLog +from modules.sys.models.photo import Photo +from modules.sys.models.power import Power +from modules.sys.models.role import Role +from modules.sys.models.dept import Dept + +from modules.sys.models.user import User migrate = Migrate(db=db, directory='entrance/migrations') + diff --git a/entrance/extensions.py b/entrance/extensions.py index dda9946..7bff922 100644 --- a/entrance/extensions.py +++ b/entrance/extensions.py @@ -1,6 +1,5 @@ from flask import Flask -from entrance.extend.mail import mail from entrance.extend.orm import db from entrance.extend.migrate import migrate @@ -8,5 +7,3 @@ from entrance.extend.migrate import migrate def init_extensions(app: Flask): db.init_app(app) migrate.init_app(app) - mail.init_app(app) - diff --git a/entrance/migrations/versions/8293d5eb9040_.py b/entrance/migrations/versions/8293d5eb9040_.py new file mode 100644 index 0000000..4dafc34 --- /dev/null +++ b/entrance/migrations/versions/8293d5eb9040_.py @@ -0,0 +1,168 @@ +"""empty message + +Revision ID: 8293d5eb9040 +Revises: d51040631f21 +Create Date: 2022-01-23 15:56:22.001914 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '8293d5eb9040' +down_revision = 'd51040631f21' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('sys_admin_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('method', sa.String(length=10), nullable=True), + sa.Column('uid', sa.Integer(), nullable=True), + sa.Column('url', sa.String(length=255), nullable=True), + sa.Column('desc', sa.Text(), nullable=True), + sa.Column('ip', sa.String(length=255), nullable=True), + sa.Column('success', sa.Integer(), nullable=True), + sa.Column('user_agent', sa.Text(), nullable=True), + sa.Column('create_time', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_dept', + sa.Column('id', sa.Integer(), nullable=False, comment='部门ID'), + sa.Column('parent_id', sa.Integer(), nullable=True, comment='父级编号'), + sa.Column('dept_name', sa.String(length=50), nullable=True, comment='部门名称'), + sa.Column('sort', sa.Integer(), nullable=True, comment='排序'), + sa.Column('leader', sa.String(length=50), nullable=True, comment='负责人'), + sa.Column('phone', sa.String(length=20), nullable=True, comment='联系方式'), + sa.Column('email', sa.String(length=50), nullable=True, comment='邮箱'), + sa.Column('status', sa.Integer(), nullable=True, comment='状态(1开启,0关闭)'), + sa.Column('remark', sa.Text(), nullable=True, comment='备注'), + sa.Column('address', sa.String(length=255), nullable=True, comment='详细地址'), + sa.Column('create_at', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_at', sa.DateTime(), nullable=True, comment='创建时间'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_dict_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('data_label', sa.String(length=255), nullable=True, comment='字典类型名称'), + sa.Column('data_value', sa.String(length=255), nullable=True, comment='字典类型标识'), + sa.Column('type_code', sa.String(length=255), nullable=True, comment='字典类型描述'), + sa.Column('is_default', sa.Integer(), nullable=True, comment='是否默认'), + sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'), + sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'), + sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_dict_type', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('type_name', sa.String(length=255), nullable=True, comment='字典类型名称'), + sa.Column('type_code', sa.String(length=255), nullable=True, comment='字典类型标识'), + sa.Column('description', sa.String(length=255), nullable=True, comment='字典类型描述'), + sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'), + sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_photo', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('href', sa.String(length=255), nullable=True), + sa.Column('mime', sa.CHAR(length=50), nullable=False), + sa.Column('size', sa.CHAR(length=30), nullable=False), + sa.Column('create_time', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_power', + sa.Column('id', sa.Integer(), nullable=False, comment='权限编号'), + sa.Column('name', sa.String(length=255), nullable=True, comment='权限名称'), + sa.Column('type', sa.String(length=1), nullable=True, comment='权限类型'), + sa.Column('code', sa.String(length=30), nullable=True, comment='权限标识'), + sa.Column('url', sa.String(length=255), nullable=True, comment='权限路径'), + sa.Column('open_type', sa.String(length=10), nullable=True, comment='打开方式'), + sa.Column('parent_id', sa.Integer(), nullable=True, comment='父类编号'), + sa.Column('icon', sa.String(length=128), nullable=True, comment='图标'), + sa.Column('sort', sa.Integer(), nullable=True, comment='排序'), + sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'), + sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_role', + sa.Column('id', sa.Integer(), nullable=False, comment='角色ID'), + sa.Column('name', sa.String(length=255), nullable=True, comment='角色名称'), + sa.Column('code', sa.String(length=255), nullable=True, comment='角色标识'), + sa.Column('enable', sa.Integer(), nullable=True, comment='是否启用'), + sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'), + sa.Column('details', sa.String(length=255), nullable=True, comment='详情'), + sa.Column('sort', sa.Integer(), nullable=True, comment='排序'), + sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_user', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='用户ID'), + sa.Column('username', sa.String(length=20), nullable=True, comment='用户名'), + sa.Column('realname', sa.String(length=20), nullable=True, comment='真实名字'), + sa.Column('avatar', sa.String(length=255), nullable=True, comment='头像'), + sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'), + sa.Column('password_hash', sa.String(length=128), nullable=True, comment='哈希密码'), + sa.Column('enable', sa.Integer(), nullable=True, comment='启用'), + sa.Column('dept_id', sa.Integer(), nullable=True, comment='部门id'), + sa.Column('create_at', sa.DateTime(), nullable=True, comment='创建时间'), + sa.Column('update_at', sa.DateTime(), nullable=True, comment='创建时间'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_role_power', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='标识'), + sa.Column('power_id', sa.Integer(), nullable=True, comment='用户编号'), + sa.Column('role_id', sa.Integer(), nullable=True, comment='角色编号'), + sa.ForeignKeyConstraint(['power_id'], ['sys_power.id'], ), + sa.ForeignKeyConstraint(['role_id'], ['sys_role.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('sys_user_role', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='标识'), + sa.Column('user_id', sa.Integer(), nullable=True, comment='用户编号'), + sa.Column('role_id', sa.Integer(), nullable=True, comment='角色编号'), + sa.ForeignKeyConstraint(['role_id'], ['sys_role.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['sys_user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.drop_table('admin_test') + op.drop_table('admin_user') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('admin_user', + sa.Column('id', mysql.INTEGER(display_width=11), autoincrement=True, nullable=False, comment='用户ID'), + sa.Column('username', mysql.VARCHAR(collation='utf8mb4_general_ci', length=20), nullable=True, comment='用户名'), + sa.PrimaryKeyConstraint('id'), + mysql_collate='utf8mb4_general_ci', + mysql_default_charset='utf8mb4', + mysql_engine='MyISAM' + ) + op.create_table('admin_test', + sa.Column('id', mysql.INTEGER(display_width=11), autoincrement=True, nullable=False, comment='ID'), + sa.Column('name', mysql.VARCHAR(collation='utf8mb4_general_ci', length=20), nullable=True, comment='名'), + sa.PrimaryKeyConstraint('id'), + mysql_collate='utf8mb4_general_ci', + mysql_default_charset='utf8mb4', + mysql_engine='MyISAM' + ) + op.drop_table('sys_user_role') + op.drop_table('sys_role_power') + op.drop_table('sys_user') + op.drop_table('sys_role') + op.drop_table('sys_power') + op.drop_table('sys_photo') + op.drop_table('sys_dict_type') + op.drop_table('sys_dict_data') + op.drop_table('sys_dept') + op.drop_table('sys_admin_log') + # ### end Alembic commands ### diff --git a/entrance/models.py b/entrance/models.py index ad48e09..18f87cc 100644 --- a/entrance/models.py +++ b/entrance/models.py @@ -1,21 +1,25 @@ -from modules.sys.models.admin_dept import Dept -from modules.sys.models.admin_dict import DictType, DictData + +from modules.sys.models.user_role import user_role +from modules.sys.models.role_power import role_power +from modules.sys.models.dict import DictType, DictData from modules.sys.models.admin_log import AdminLog -from modules.sys.models.admin_photo import Photo -from modules.sys.models.admin_power import Power -from modules.sys.models.admin_role import Role -from modules.sys.models.admin_role_power import role_power -from modules.sys.models.admin_user import User -from modules.sys.models.admin_user_role import user_role +from modules.sys.models.photo import Photo +from modules.sys.models.power import Power +from modules.sys.models.role import Role +from modules.sys.models.dept import Dept + +from modules.sys.models.user import User + model_lists: list = [ + role_power, + user_role, Dept, DictType, DictData, AdminLog, Photo, Power, Role, - role_power, User, - user_role + ] diff --git a/modules/sys/models/admin_dept.py b/modules/sys/models/dept.py similarity index 100% rename from modules/sys/models/admin_dept.py rename to modules/sys/models/dept.py diff --git a/modules/sys/models/admin_dict.py b/modules/sys/models/dict.py similarity index 100% rename from modules/sys/models/admin_dict.py rename to modules/sys/models/dict.py diff --git a/modules/sys/models/admin_photo.py b/modules/sys/models/photo.py similarity index 95% rename from modules/sys/models/admin_photo.py rename to modules/sys/models/photo.py index b2eec42..06bedaf 100644 --- a/modules/sys/models/admin_photo.py +++ b/modules/sys/models/photo.py @@ -17,4 +17,4 @@ class AdminLogSchema(SQLAlchemyAutoSchema): class Meta: model = Photo include_fk = True - load_instance = True \ No newline at end of file + load_instance = True diff --git a/modules/sys/models/admin_power.py b/modules/sys/models/power.py similarity index 100% rename from modules/sys/models/admin_power.py rename to modules/sys/models/power.py diff --git a/modules/sys/models/admin_role.py b/modules/sys/models/role.py similarity index 83% rename from modules/sys/models/admin_role.py rename to modules/sys/models/role.py index ab95c0b..0c9843b 100644 --- a/modules/sys/models/admin_role.py +++ b/modules/sys/models/role.py @@ -1,5 +1,5 @@ import datetime -from common.model import BaseModel, Column, String, Integer, DateTime, relationship, SQLAlchemyAutoSchema +from common.model import BaseModel, Column, String, Integer, DateTime, relationship, SQLAlchemyAutoSchema, backref class Role(BaseModel): @@ -13,10 +13,11 @@ class Role(BaseModel): sort = Column(Integer, comment='排序') create_time = Column(DateTime, default=datetime.datetime.now, comment='创建时间') update_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间') - power = relationship('Power', secondary="admin_role_power", backref=backref('role')) + power = relationship('Power', secondary="sys_role_power", backref=backref('role')) + class RoleSchema(SQLAlchemyAutoSchema): class Meta: model = Role include_fk = True - load_instance = True \ No newline at end of file + load_instance = True diff --git a/modules/sys/models/admin_role_power.py b/modules/sys/models/role_power.py similarity index 52% rename from modules/sys/models/admin_role_power.py rename to modules/sys/models/role_power.py index a2e9419..9f96acf 100644 --- a/modules/sys/models/admin_role_power.py +++ b/modules/sys/models/role_power.py @@ -3,6 +3,6 @@ from common.model import Column, Table, Integer, ForeignKey role_power = Table( "sys_role_power", Column("id", Integer, primary_key=True, autoincrement=True, comment='标识'), - Column("power_id", Integer, ForeignKey("admin_power.id"), comment='用户编号'), - Column("role_id", Integer, ForeignKey("admin_role.id"), comment='角色编号'), + Column("power_id", Integer, ForeignKey("sys_power.id"), comment='用户编号'), + Column("role_id", Integer, ForeignKey("sys_role.id"), comment='角色编号'), ) diff --git a/modules/sys/models/admin_user.py b/modules/sys/models/user.py similarity index 93% rename from modules/sys/models/admin_user.py rename to modules/sys/models/user.py index ae28566..2a277dc 100644 --- a/modules/sys/models/admin_user.py +++ b/modules/sys/models/user.py @@ -17,7 +17,7 @@ class User(BaseModel, UserMixin): dept_id = Column(Integer, comment='部门id') create_at = Column(DateTime, default=datetime.datetime.now, comment='创建时间') update_at = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间') - role = relationship('Role', secondary="admin_user_role", backref=backref('user'), lazy='dynamic') + role = relationship('Role', secondary="sys_user_role", backref=backref('user'), lazy='dynamic') def set_password(self, password): self.password_hash = generate_password_hash(password) diff --git a/modules/sys/models/admin_user_role.py b/modules/sys/models/user_role.py similarity index 52% rename from modules/sys/models/admin_user_role.py rename to modules/sys/models/user_role.py index d884bb2..01c194f 100644 --- a/modules/sys/models/admin_user_role.py +++ b/modules/sys/models/user_role.py @@ -3,6 +3,6 @@ from common.model import Table, Column, Integer, ForeignKey user_role = Table( "sys_user_role", Column("id", Integer, primary_key=True, autoincrement=True, comment='标识'), - Column("user_id", Integer, ForeignKey("admin_user.id"), comment='用户编号'), - Column("role_id", Integer, ForeignKey("admin_role.id"), comment='角色编号'), + Column("user_id", Integer, ForeignKey("sys_user.id"), comment='用户编号'), + Column("role_id", Integer, ForeignKey("sys_role.id"), comment='角色编号'), )