diff --git a/.flaskenv b/.flaskenv index e69de29..90f0b44 100644 --- a/.flaskenv +++ b/.flaskenv @@ -0,0 +1,5 @@ +FLASK_APP=app.py +FLASK_ENV=development +FLASK_DEBUG=1 +FLASK_RUN_HOST = 127.0.0.1 +FLASK_RUN_PORT = 5000 \ No newline at end of file diff --git a/app.py b/app.py index a5622a5..a1f5ba5 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,17 @@ from applications import create_app +from flask_migrate import Migrate +from applications.extensions import db +from applications.common.utils.init_databases import init_db app = create_app() +migrate = Migrate(app, db) + + +@app.cli.command() +def init(): + init_db() + + if __name__ == '__main__': app.run() diff --git a/applications/__init__.py b/applications/__init__.py index 2592ddf..2cdcdec 100644 --- a/applications/__init__.py +++ b/applications/__init__.py @@ -1,8 +1,6 @@ import os - from flask import Flask from flask_uploads import configure_uploads - from applications.common.utils.upload import photos from applications.configs import common from applications.extensions import init_plugs diff --git a/applications/common/admin/dept_curd.py b/applications/common/admin/dept_curd.py index ba5b05f..64049a9 100644 --- a/applications/common/admin/dept_curd.py +++ b/applications/common/admin/dept_curd.py @@ -1,6 +1,7 @@ from applications.common.utils.validate import xss_escape from applications.extensions import db -from applications.models import Dept, DeptSchema +from applications.models import Dept +from applications.schemas import DeptSchema from applications.models import User from applications.common.curd import model_to_dicts diff --git a/applications/common/admin/dict_curd.py b/applications/common/admin/dict_curd.py index 8f674c6..e935546 100644 --- a/applications/common/admin/dict_curd.py +++ b/applications/common/admin/dict_curd.py @@ -1,6 +1,7 @@ from applications.common.utils.validate import xss_escape from applications.extensions import db -from applications.models import DictType, DictData, DictTypeSchema, DictDataSchema +from applications.models import DictType, DictData +from applications.schemas import DictTypeSchema, DictDataSchema from applications.common.curd import model_to_dicts diff --git a/applications/common/admin/file_curd.py b/applications/common/admin/file_curd.py index dd1fa53..98071fb 100644 --- a/applications/common/admin/file_curd.py +++ b/applications/common/admin/file_curd.py @@ -4,7 +4,8 @@ from sqlalchemy import desc from applications.common.utils.upload import photos from applications.extensions import db -from applications.models import Photo, PhotoSchema +from applications.models import Photo +from applications.schemas import PhotoSchema from applications.common.curd import model_to_dicts diff --git a/applications/common/admin/index_curd.py b/applications/common/admin/index_curd.py index f75bbef..f43a151 100644 --- a/applications/common/admin/index_curd.py +++ b/applications/common/admin/index_curd.py @@ -3,7 +3,7 @@ from flask import session, make_response, current_app from flask_login import current_user from applications.common.utils.gen_captcha import gen_captcha -from applications.models.admin_power import PowerSchema +from applications.schemas import PowerSchema # 授权路由存入session diff --git a/applications/common/admin/power_curd.py b/applications/common/admin/power_curd.py index da7c9d0..071cb5a 100644 --- a/applications/common/admin/power_curd.py +++ b/applications/common/admin/power_curd.py @@ -1,6 +1,7 @@ from applications.common.utils.validate import xss_escape from applications.extensions import db -from applications.models.admin_power import Power, PowerSchema2 +from applications.models.admin_power import Power +from applications.schemas import PowerSchema2 from applications.models import Role from applications.common.curd import model_to_dicts diff --git a/applications/common/admin/role_curd.py b/applications/common/admin/role_curd.py index 22c06ef..6abb6fb 100644 --- a/applications/common/admin/role_curd.py +++ b/applications/common/admin/role_curd.py @@ -1,9 +1,10 @@ from sqlalchemy import and_ - from applications.common.utils.validate import xss_escape from applications.extensions import db -from applications.models import Role, RoleSchema -from applications.models.admin_power import Power, PowerSchema2 +from applications.models import Role +from applications.schemas import RoleSchema +from applications.models.admin_power import Power +from applications.schemas import PowerSchema2 from applications.models import User # 获取角色对象 diff --git a/applications/common/admin/user_curd.py b/applications/common/admin/user_curd.py index 2fb4ab9..375fe37 100644 --- a/applications/common/admin/user_curd.py +++ b/applications/common/admin/user_curd.py @@ -2,7 +2,8 @@ from flask import jsonify from flask_login import current_user from sqlalchemy import and_, desc from applications.extensions import db -from applications.models import User, UserSchema +from applications.models import User +from applications.schemas import UserSchema from applications.models import Role from applications.models import AdminLog diff --git a/applications/common/utils/__init__.py b/applications/common/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/init_databases.py b/applications/common/utils/init_databases.py similarity index 93% rename from test/init_databases.py rename to applications/common/utils/init_databases.py index da05eb4..4df4903 100644 --- a/test/init_databases.py +++ b/applications/common/utils/init_databases.py @@ -1,14 +1,9 @@ -import sys from dotenv import dotenv_values - -sys.path.append('../') import sqlparse import pymysql - config = dotenv_values('.env') - # MySql配置信息 -HOST = config.get('MYSQL_PASSWORD') or '127.0.0.1' +HOST = config.get('MYSQL_HOST') or '127.0.0.1' PORT = config.get('MYSQL_PORT') or 3306 DATABASE = config.get('MYSQL_DATABASE') or 'PearAdminFlask' USERNAME = config.get('MYSQL_USERNAME') or 'root' @@ -60,7 +55,7 @@ def init_db(): return if init_database(): print('数据库%s创建成功' % str(DATABASE)) - execute_fromfile('pear.sql') + execute_fromfile(BASE_DIR + '../../../test/pear.sql') print('表创建成功') print('欢迎使用pear-admin-flask,请使用 flask run 命令启动程序') diff --git a/applications/models/__init__.py b/applications/models/__init__.py index fb50403..2d3fd14 100644 --- a/applications/models/__init__.py +++ b/applications/models/__init__.py @@ -1,9 +1,9 @@ -from .admin_dept import Dept, DeptSchema -from .admin_dict import DictType, DictData, DictTypeSchema, DictDataSchema -from .admin_log import AdminLog, LogSchema -from .admin_photo import Photo, PhotoSchema -from .admin_power import Power, PowerSchema, PowerSchema2 -from .admin_role import Role, RoleSchema +from .admin_dept import Dept +from .admin_dict import DictType, DictData +from .admin_log import AdminLog +from .admin_photo import Photo +from .admin_power import Power +from .admin_role import Role from .admin_role_power import role_power -from .admin_user import User, UserSchema +from .admin_user import User from .admin_user_role import user_role diff --git a/applications/models/admin_dept.py b/applications/models/admin_dept.py index b4826e6..7ecb516 100644 --- a/applications/models/admin_dept.py +++ b/applications/models/admin_dept.py @@ -1,6 +1,5 @@ import datetime -from applications.extensions import db, ma -from marshmallow import fields, validate +from applications.extensions import db class Dept(db.Model): @@ -16,16 +15,4 @@ class Dept(db.Model): remark = db.Column(db.Text, comment="备注") address = db.Column(db.String(255), comment="详细地址") create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间') - update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间') - - -class DeptSchema(ma.Schema): # 序列化类 - deptId = fields.Integer(attribute="id") - parentId = fields.Integer(attribute="parent_id") - deptName = fields.Str(attribute="dept_name") - leader = fields.Str() - phone = fields.Str() - email = fields.Str(validate=validate.Email()) - address = fields.Str() - status = fields.Str(validate=validate.OneOf(["0", "1"])) - sort = fields.Integer() + update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间') \ No newline at end of file diff --git a/applications/models/admin_dict.py b/applications/models/admin_dict.py index 29da3c0..84723cf 100644 --- a/applications/models/admin_dict.py +++ b/applications/models/admin_dict.py @@ -1,7 +1,5 @@ import datetime - -from applications.extensions import db, ma -from marshmallow import fields +from applications.extensions import db class DictType(db.Model): @@ -25,23 +23,4 @@ class DictData(db.Model): enable = db.Column(db.Integer, comment='是否开启') remark = db.Column(db.String(255), comment='备注') create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间') - update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间') - - -class DictTypeSchema(ma.Schema): # 序列化类 - id = fields.Str(attribute="id") - typeName = fields.Str(attribute="type_name") - typeCode = fields.Str(attribute="type_code") - description = fields.Str(attribute="description") - createTime = fields.Str(attribute="create_time") - updateName = fields.Str(attribute="update_time") - remark = fields.Str() - enable = fields.Str() - - -class DictDataSchema(ma.Schema): # 序列化类 - dataId = fields.Str(attribute="id") - dataLabel = fields.Str(attribute="data_label") - dataValue = fields.Str(attribute="data_value") - remark = fields.Str() - enable = fields.Str() + update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间') \ No newline at end of file diff --git a/applications/models/admin_log.py b/applications/models/admin_log.py index d2339bb..a77dd79 100644 --- a/applications/models/admin_log.py +++ b/applications/models/admin_log.py @@ -1,7 +1,5 @@ import datetime -from applications.extensions import db, ma -from marshmallow import fields - +from applications.extensions import db class AdminLog(db.Model): __tablename__ = 'admin_admin_log' @@ -13,16 +11,4 @@ class AdminLog(db.Model): ip = db.Column(db.String(255)) success = db.Column(db.Integer) user_agent = db.Column(db.Text) - create_time = db.Column(db.DateTime, default=datetime.datetime.now) - - -class LogSchema(ma.Schema): # 序列化类 - id = fields.Integer() - method = fields.Str() - uid = fields.Str() - url = fields.Str() - desc = fields.Str() - ip = fields.Str() - user_agent = fields.Str() - success = fields.Bool() - create_time = fields.DateTime() + create_time = db.Column(db.DateTime, default=datetime.datetime.now) \ No newline at end of file diff --git a/applications/models/admin_photo.py b/applications/models/admin_photo.py index 299e932..0293958 100644 --- a/applications/models/admin_photo.py +++ b/applications/models/admin_photo.py @@ -1,7 +1,5 @@ import datetime - -from applications.extensions import db, ma -from marshmallow import fields +from applications.extensions import db class Photo(db.Model): @@ -11,14 +9,4 @@ class Photo(db.Model): href = db.Column(db.String(255)) mime = db.Column(db.CHAR(50), nullable=False) size = db.Column(db.CHAR(30), nullable=False) - create_time = db.Column(db.DateTime, default=datetime.datetime.now) - - -class PhotoSchema(ma.Schema): - id = fields.Integer() - name = fields.Str() - href = fields.Str() - mime = fields.Str() - size = fields.Str() - ext = fields.Str() - create_time = fields.DateTime() + create_time = db.Column(db.DateTime, default=datetime.datetime.now) \ No newline at end of file diff --git a/applications/models/admin_power.py b/applications/models/admin_power.py index d0835b7..be6a6f4 100644 --- a/applications/models/admin_power.py +++ b/applications/models/admin_power.py @@ -1,6 +1,5 @@ import datetime -from applications.extensions import db, ma -from marshmallow import fields +from applications.extensions import db class Power(db.Model): @@ -17,33 +16,3 @@ class Power(db.Model): create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间') update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间') enable = db.Column(db.Integer, comment='是否开启') - - -# 权限models序列化类 -class PowerSchema(ma.Schema): - id = fields.Integer() - title = fields.Str(attribute="name") - type = fields.Str() - code = fields.Str() - href = fields.Str(attribute="url") - openType = fields.Str(attribute="open_type") - parent_id = fields.Integer() - icon = fields.Str() - sort = fields.Integer() - create_time = fields.DateTime() - update_time = fields.DateTime() - enable = fields.Integer() - - -class PowerSchema2(ma.Schema): # 序列化类 - powerId = fields.Str(attribute="id") - powerName = fields.Str(attribute="name") - powerType = fields.Str(attribute="type") - powerUrl = fields.Str(attribute="url") - openType = fields.Str(attribute="open_type") - parentId = fields.Str(attribute="parent_id") - icon = fields.Str() - sort = fields.Integer() - create_time = fields.DateTime() - update_time = fields.DateTime() - enable = fields.Integer() diff --git a/applications/models/admin_role.py b/applications/models/admin_role.py index 802d4ff..718a5d2 100644 --- a/applications/models/admin_role.py +++ b/applications/models/admin_role.py @@ -1,6 +1,5 @@ import datetime -from applications.extensions import db, ma -from marshmallow import fields +from applications.extensions import db class Role(db.Model): @@ -15,15 +14,3 @@ class Role(db.Model): create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间') update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间') power = db.relationship('Power', secondary="admin_role_power", backref=db.backref('role')) - - -class RoleSchema(ma.Schema): - id = fields.Integer() - roleName = fields.Str(attribute="name") - roleCode = fields.Str(attribute="code") - enable = fields.Str() - remark = fields.Str() - details = fields.Str() - sort = fields.Integer() - create_at = fields.DateTime() - update_at = fields.DateTime() diff --git a/applications/models/admin_user.py b/applications/models/admin_user.py index 0883e77..e8e278f 100644 --- a/applications/models/admin_user.py +++ b/applications/models/admin_user.py @@ -1,9 +1,7 @@ import datetime from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash -from applications.extensions import db, ma -from marshmallow import fields -from applications.models import Dept +from applications.extensions import db class User(db.Model, UserMixin): @@ -25,20 +23,3 @@ class User(db.Model, UserMixin): def validate_password(self, password): return check_password_hash(self.password_hash, password) - - -# 用户models的序列化类 -class UserSchema(ma.Schema): - id = fields.Integer() - username = fields.Str() - realname = fields.Str() - enable = fields.Integer() - create_at = fields.DateTime() - update_at = fields.DateTime() - dept = fields.Method("get_dept") - - def get_dept(self, obj): - if obj.dept_id != None: - return Dept.query.filter_by(id=obj.dept_id).first().dept_name - else: - return None diff --git a/applications/schemas/__init__.py b/applications/schemas/__init__.py new file mode 100644 index 0000000..70fe53e --- /dev/null +++ b/applications/schemas/__init__.py @@ -0,0 +1,7 @@ +from .admin_user import UserSchema +from .admin_role import RoleSchema +from .admin_power import PowerSchema, PowerSchema2 +from .admin_dict import DictDataSchema, DictTypeSchema +from .admin_dept import DeptSchema +from .admin_log import LogSchema +from .admin_photo import PhotoSchema diff --git a/applications/schemas/admin_dept.py b/applications/schemas/admin_dept.py new file mode 100644 index 0000000..5a50ef7 --- /dev/null +++ b/applications/schemas/admin_dept.py @@ -0,0 +1,14 @@ +from applications.extensions import ma +from marshmallow import fields, validate + + +class DeptSchema(ma.Schema): + deptId = fields.Integer(attribute="id") + parentId = fields.Integer(attribute="parent_id") + deptName = fields.Str(attribute="dept_name") + leader = fields.Str() + phone = fields.Str() + email = fields.Str(validate=validate.Email()) + address = fields.Str() + status = fields.Str(validate=validate.OneOf(["0", "1"])) + sort = fields.Integer() diff --git a/applications/schemas/admin_dict.py b/applications/schemas/admin_dict.py new file mode 100644 index 0000000..9ebd202 --- /dev/null +++ b/applications/schemas/admin_dict.py @@ -0,0 +1,21 @@ +from applications.extensions import ma +from marshmallow import fields + + +class DictTypeSchema(ma.Schema): + id = fields.Str(attribute="id") + typeName = fields.Str(attribute="type_name") + typeCode = fields.Str(attribute="type_code") + description = fields.Str(attribute="description") + createTime = fields.Str(attribute="create_time") + updateName = fields.Str(attribute="update_time") + remark = fields.Str() + enable = fields.Str() + + +class DictDataSchema(ma.Schema): + dataId = fields.Str(attribute="id") + dataLabel = fields.Str(attribute="data_label") + dataValue = fields.Str(attribute="data_value") + remark = fields.Str() + enable = fields.Str() diff --git a/applications/schemas/admin_log.py b/applications/schemas/admin_log.py new file mode 100644 index 0000000..49aaf67 --- /dev/null +++ b/applications/schemas/admin_log.py @@ -0,0 +1,14 @@ +from applications.extensions import ma +from marshmallow import fields + + +class LogSchema(ma.Schema): + id = fields.Integer() + method = fields.Str() + uid = fields.Str() + url = fields.Str() + desc = fields.Str() + ip = fields.Str() + user_agent = fields.Str() + success = fields.Bool() + create_time = fields.DateTime() diff --git a/applications/schemas/admin_photo.py b/applications/schemas/admin_photo.py new file mode 100644 index 0000000..e1122ca --- /dev/null +++ b/applications/schemas/admin_photo.py @@ -0,0 +1,12 @@ +from applications.extensions import ma +from marshmallow import fields + + +class PhotoSchema(ma.Schema): + id = fields.Integer() + name = fields.Str() + href = fields.Str() + mime = fields.Str() + size = fields.Str() + ext = fields.Str() + create_time = fields.DateTime() diff --git a/applications/schemas/admin_power.py b/applications/schemas/admin_power.py new file mode 100644 index 0000000..1c433fa --- /dev/null +++ b/applications/schemas/admin_power.py @@ -0,0 +1,32 @@ +from applications.extensions import ma +from marshmallow import fields + + +# 权限models序列化类 +class PowerSchema(ma.Schema): + id = fields.Integer() + title = fields.Str(attribute="name") + type = fields.Str() + code = fields.Str() + href = fields.Str(attribute="url") + openType = fields.Str(attribute="open_type") + parent_id = fields.Integer() + icon = fields.Str() + sort = fields.Integer() + create_time = fields.DateTime() + update_time = fields.DateTime() + enable = fields.Integer() + + +class PowerSchema2(ma.Schema): # 序列化类 + powerId = fields.Str(attribute="id") + powerName = fields.Str(attribute="name") + powerType = fields.Str(attribute="type") + powerUrl = fields.Str(attribute="url") + openType = fields.Str(attribute="open_type") + parentId = fields.Str(attribute="parent_id") + icon = fields.Str() + sort = fields.Integer() + create_time = fields.DateTime() + update_time = fields.DateTime() + enable = fields.Integer() diff --git a/applications/schemas/admin_role.py b/applications/schemas/admin_role.py new file mode 100644 index 0000000..2fea8b3 --- /dev/null +++ b/applications/schemas/admin_role.py @@ -0,0 +1,14 @@ +from applications.extensions import ma +from marshmallow import fields + + +class RoleSchema(ma.Schema): + id = fields.Integer() + roleName = fields.Str(attribute="name") + roleCode = fields.Str(attribute="code") + enable = fields.Str() + remark = fields.Str() + details = fields.Str() + sort = fields.Integer() + create_at = fields.DateTime() + update_at = fields.DateTime() diff --git a/applications/schemas/admin_user.py b/applications/schemas/admin_user.py new file mode 100644 index 0000000..66319e0 --- /dev/null +++ b/applications/schemas/admin_user.py @@ -0,0 +1,20 @@ +from applications.extensions import ma +from marshmallow import fields +from applications.models import Dept + + +# 用户models的序列化类 +class UserSchema(ma.Schema): + id = fields.Integer() + username = fields.Str() + realname = fields.Str() + enable = fields.Integer() + create_at = fields.DateTime() + update_at = fields.DateTime() + dept = fields.Method("get_dept") + + def get_dept(self, obj): + if obj.dept_id != None: + return Dept.query.filter_by(id=obj.dept_id).first().dept_name + else: + return None diff --git a/applications/view/admin/admin_log.py b/applications/view/admin/admin_log.py index b30271b..cc68c6a 100644 --- a/applications/view/admin/admin_log.py +++ b/applications/view/admin/admin_log.py @@ -3,7 +3,8 @@ from sqlalchemy import desc from applications.common.utils.http import table_api from applications.common.utils.rights import authorize -from applications.models import AdminLog, LogSchema +from applications.models import AdminLog +from applications.schemas import LogSchema from applications.common.curd import model_to_dicts admin_log = Blueprint('adminLog', __name__, url_prefix='/admin/log') diff --git a/applications/view/admin/dict.py b/applications/view/admin/dict.py index a9ee920..b9e2c71 100644 --- a/applications/view/admin/dict.py +++ b/applications/view/admin/dict.py @@ -1,5 +1,4 @@ from flask import Blueprint, render_template, request, jsonify - from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.rights import authorize from applications.common.utils.validate import xss_escape diff --git a/applications/view/department/__init__.py b/applications/view/department/__init__.py index 677dc8e..fcfb72a 100644 --- a/applications/view/department/__init__.py +++ b/applications/view/department/__init__.py @@ -4,7 +4,7 @@ from marshmallow import INCLUDE from applications.common.utils.http import success_api, fail_api from applications.common.utils.rights import authorize from applications.common.utils.validate import check_data -from applications.models import DeptSchema +from applications.schemas import DeptSchema from applications.common.admin import dept_curd as dept_curd dept_bp = Blueprint('dept', __name__, url_prefix='/dept') diff --git a/applications/view/index/__init__.py b/applications/view/index/__init__.py index 382c14f..b07be4c 100644 --- a/applications/view/index/__init__.py +++ b/applications/view/index/__init__.py @@ -1,6 +1,4 @@ -from flask import Blueprint - -index_bp = Blueprint('Index', __name__, url_prefix='/') +from applications.view.index.index import index_bp from . import index diff --git a/applications/view/index/index.py b/applications/view/index/index.py index 53d8a0b..8278bca 100644 --- a/applications/view/index/index.py +++ b/applications/view/index/index.py @@ -1,6 +1,6 @@ -from flask import render_template +from flask import render_template, Blueprint -from . import index_bp +index_bp = Blueprint('Index', __name__, url_prefix='/') @index_bp.route('/')