将数据操作全部改为迁移脚本

This commit is contained in:
zhengxinonly
2021-06-14 02:10:29 +08:00
parent 9e8a5357be
commit d7c7237cd4
37 changed files with 452 additions and 536 deletions
+20 -1
View File
@@ -30,10 +30,29 @@ def create_app(config_name=None):
configure_uploads(app, photos)
logo()
register_shell(app)
return app
def register_shell(app: Flask):
@app.cli.command()
def create():
"""测试关系"""
from .extensions import db
from .models import Power, User
from .models import PowerSchema
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
user = User.query.get(1)
power_list = []
for role in user.role:
if role.enable:
for power in role.power:
# 权限被启用
if power.enable and power:
power_list.append(power)
power_dict = sorted(power_list, key=lambda i: i['sort'])
def logo():
print('''
_____ _ _ ______ _ _
+1 -1
View File
@@ -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.models.rights.power import PowerSchema
# 授权路由存入session
@@ -1,6 +1,6 @@
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models.admin_power import Power, PowerSchema2
from applications.models.rights.power import Power, PowerSchema2
from applications.models import Role
from applications.common.curd import model_to_dicts
+1 -1
View File
@@ -3,7 +3,7 @@ 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.rights.power import Power, PowerSchema2
from applications.models import User
# 获取角色对象
+2
View File
@@ -1,5 +1,6 @@
from flask import Flask
from .init_databases import register_script
from .init_sqlalchemy import db, ma, init_databases
from .init_login import init_login_manager
from .init_debug_tool import init_debug_tool
@@ -13,3 +14,4 @@ def init_plugs(app: Flask) -> None:
init_databases(app)
init_template_directives(app)
init_error_views(app)
register_script(app)
@@ -0,0 +1,304 @@
from flask import Flask
def add_data(fields, data_list, obj):
from applications.extensions import db
for _data in data_list:
dept = obj()
for key, value in dict(zip(fields, _data)).items():
setattr(dept, key, value)
db.session.add(dept)
db.session.commit()
def create_dept_data():
"""创建化部门数据"""
from applications.models import Dept
_data_list = [
(1, 0, '总公司', 1, '就眠仪式', '12312345679', '123qq.com', 1, None, '这是总公司', None, '2021-06-01 17:23:20'),
(4, 1, '济南分公司', 2, '就眠仪式', '12312345678', '1234qq.com', 1, None, '这是济南', '2021-06-01 17:24:33',
'2021-06-01 17:25:19'),
(5, 1, '唐山分公司', 4, 'mkg', '12312345678', '123@qq.com', 1, None, '这是唐山', '2021-06-01 17:25:15',
'2021-06-01 17:25:20'),
(7, 4, '济南分公司开发部', 5, '就眠仪式', '12312345678', '123@qq.com', 1, None, '测试', '2021-06-01 17:27:39',
'2021-06-01 17:27:39'),
(8, 5, '唐山测试部', 6, 'mkg', '12312345678', '123@qq.com', 1, None, '测试部', '2021-06-01 17:28:27',
'2021-06-01 17:28:27'),
]
_fields = ['id', 'parent_id', 'dept_name', 'sort', 'leader', 'phone', 'email', 'status', 'remark', 'address',
'create_at', 'update_at']
add_data(_fields, _data_list, Dept)
def create_admin_dict_data():
from applications.models import DictData, DictType
_fields = ['id', 'data_label', 'data_value', 'type_code', 'is_default', 'enable', 'remark', 'create_time',
'update_time', ]
_data_list = [
(8, '', 'boy', 'user_sex', None, 1, '男 : body', '2021-04-16 13:36:34', '2021-04-16 14:05:06'),
(9, '', 'girl', 'user_sex', None, 1, '女 : girl', '2021-04-16 13:36:55', '2021-04-16 13:36:55'),
]
add_data(_fields, _data_list, DictData)
_fields = ['id', 'type_name', 'type_code', 'description', 'enable', 'create_time', 'update_time', ]
_data_list = [
(1, '用户性别', 'user_sex', '用户性别', 1, None, '2021-04-16 13:37:11')
]
add_data(_fields, _data_list, DictType)
def create_admin_photo():
from applications.models import Photo
_fields = [
'id',
'name',
'href',
'mime',
'size',
'create_time',
]
_data_list = [
(3, '6958819_pear-admin_1607443454_1.png',
'http://127.0.0.1:5000/_uploads/photos/6958819_pear-admin_1607443454_1.png', 'image/png', '2204',
'2021-03-19 18:53:02'),
(17, '1617291580000.jpg', 'http://127.0.0.1:5000/_uploads/photos/1617291580000.jpg', 'image/png', '94211',
'2021-04-01 23:39:41'),
]
add_data(_fields, _data_list, Photo)
def create_admin_power():
from applications.models import Power
_data_list = \
[
(1, '系统管理', '0', '', None, None, '0', 'layui-icon layui-icon-set-fill', 1, None, None, 1),
(3, '用户管理', '1', 'admin:user:main', '/admin/user/', '_iframe', '1',
'layui-icon layui-icon layui-icon layui-icon layui-icon-rate', 1, None, None, 1),
(4, '权限管理', '1', 'admin:power:main', '/admin/power/', '_iframe', '1', None, 2, None, None, 1),
(9, '角色管理', '1', 'admin:role:main', '/admin/role', '_iframe', '1', 'layui-icon layui-icon-username', 2,
'2021-03-16 22:24:58', '2021-03-25 19:15:24', 1),
(
12, '系统监控', '1', 'admin:monitor:main', '/admin/monitor', '_iframe', '1',
'layui-icon layui-icon-vercode', 5,
'2021-03-18 22:05:19', '2021-03-25 19:15:27', 1),
(13, '日志管理', '1', 'admin:log:main', '/admin/log', '_iframe', '1', 'layui-icon layui-icon-read', 4,
'2021-03-18 22:37:10', '2021-06-03 11:06:25', 1),
(17, '文件管理', '0', '', '', '', '0', 'layui-icon layui-icon-camera', 2, '2021-03-19 18:56:23',
'2021-03-25 19:15:08', 1),
(18, '图片上传', '1', 'admin:file:main', '/admin/file', '_iframe', '17', 'layui-icon layui-icon-camera', 5,
'2021-03-19 18:57:19', '2021-03-25 19:15:13', 1),
(21, '权限增加', '2', 'admin:power:add', '', '', '4', 'layui-icon layui-icon-add-circle', 1,
'2021-03-22 19:43:52',
'2021-03-25 19:15:22', 1),
(22, '用户增加', '2', 'admin:user:add', '', '', '3', 'layui-icon layui-icon-add-circle', 1,
'2021-03-22 19:45:40',
'2021-03-25 19:15:17', 1),
(23, '用户编辑', '2', 'admin:user:edit', '', '', '3', 'layui-icon layui-icon-rate', 2, '2021-03-22 19:46:15',
'2021-03-25 19:15:18', 1),
(24, '用户删除', '2', 'admin:user:remove', '', '', '3', 'layui-icon None', 3, '2021-03-22 19:46:51',
'2021-03-25 19:15:18', 1),
(25, '权限编辑', '2', 'admin:power:edit', '', '', '4', 'layui-icon layui-icon-edit', 2, '2021-03-22 19:47:36',
'2021-03-25 19:15:22', 1),
(26, '用户删除', '2', 'admin:power:remove', '', '', '4', 'layui-icon layui-icon-delete', 3,
'2021-03-22 19:48:17',
'2021-03-25 19:15:23', 1),
(27, '用户增加', '2', 'admin:role:add', '', '', '9', 'layui-icon layui-icon-add-circle', 1,
'2021-03-22 19:49:09',
'2021-03-25 19:15:24', 1),
(28, '角色编辑', '2', 'admin:role:edit', '', '', '9', 'layui-icon layui-icon-edit', 2, '2021-03-22 19:49:41',
'2021-03-25 19:15:25', 1),
(
29, '角色删除', '2', 'admin:role:remove', '', '', '9', 'layui-icon layui-icon-delete', 3,
'2021-03-22 19:50:15',
'2021-03-25 19:15:26', 1),
(30, '角色授权', '2', 'admin:role:power', '', '', '9', 'layui-icon layui-icon-component', 4,
'2021-03-22 19:50:54',
'2021-03-25 19:15:26', 1),
(31, '图片增加', '2', 'admin:file:add', '', '', '18', 'layui-icon layui-icon-add-circle', 1,
'2021-03-22 19:58:05',
'2021-03-25 19:15:28', 1),
(32, '图片删除', '2', 'admin:file:delete', '', '', '18', 'layui-icon layui-icon-delete', 2,
'2021-03-22 19:58:45',
'2021-03-25 19:15:29', 1),
(44, '数据字典', '1', 'admin:dict:main', '/admin/dict', '_iframe', '1', 'layui-icon layui-icon-console', 6,
'2021-04-16 13:59:49', '2021-04-16 13:59:49', 1),
(45, '字典增加', '2', 'admin:dict:add', '', '', '44', 'layui-icon ', 1,
'2021-04-16 14:00:59', '2021-04-16 14:00:59', 1),
(46, '字典修改', '2', 'admin:dict:edit', '', '', '44', 'layui-icon ', 2, '2021-04-16 14:01:33',
'2021-04-16 14:01:33', 1),
(47, '字典删除', '2', 'admin:dict:remove', '', '', '44', 'layui-icon ', 3, '2021-04-16 14:02:06',
'2021-04-16 14:02:06', 1),
(48, '部门管理', '1', 'admin:dept:main', '/dept', '_iframe', '1', 'layui-icon layui-icon-group', 3,
'2021-06-01 16:22:11', '2021-06-01 16:22:11', 1),
(49, '部门增加', '2', 'admin:dept:add', '', '', '48', 'layui-icon None', 1, '2021-06-01 17:35:52',
'2021-06-01 17:36:15', 1),
(50, '部门编辑', '2', 'admin:dept:edit', '', '', '48', 'layui-icon ', 2, '2021-06-01 17:36:41',
'2021-06-01 17:36:41', 1),
(51, '部门删除', '2', 'admin:dept:remove', '', '', '48', 'layui-icon None', 3, '2021-06-01 17:37:15',
'2021-06-01 17:37:26', 1),
]
_fields = [
'id',
'name',
'type',
'code',
'url',
'open_type',
'parent_id',
'icon',
'sort',
'create_time',
'update_time',
'enable',
]
add_data(_fields, _data_list, Power)
def create_admin_role():
from applications.models import Role
_fields = [
'id',
'name',
'code',
'remark',
'details',
'sort',
'create_time',
'update_time',
'enable',
]
_data_list = [
(1, '管理员', 'admin', None, '管理员', 1, None, None, 1),
(2, '普通用户', 'common', None, '只有查看,没有增删改权限', 2, '2021-03-22 20:02:38', '2021-04-01 22:29:56', 1),
]
add_data(_fields, _data_list, Role)
def create_admin_role_power():
from applications.models import user_role
from applications.extensions import db
_data_list = [
(237, 1, 1),
(238, 3, 1),
(239, 4, 1),
(240, 9, 1),
(241, 12, 1),
(242, 13, 1),
(243, 17, 1),
(244, 18, 1),
(245, 21, 1),
(246, 22, 1),
(247, 23, 1),
(248, 24, 1),
(249, 25, 1),
(250, 26, 1),
(251, 27, 1),
(252, 28, 1),
(253, 29, 1),
(254, 30, 1),
(255, 31, 1),
(256, 32, 1),
(257, 44, 1),
(258, 45, 1),
(259, 46, 1),
(260, 47, 1),
(261, 48, 1),
(262, 49, 1),
(263, 50, 1),
(264, 51, 1),
(265, 1, 2),
(266, 3, 2),
(267, 4, 2),
(268, 9, 2),
(269, 12, 2),
(270, 13, 2),
(271, 17, 2),
(272, 18, 2),
(273, 44, 2),
(274, 48, 2),
]
# add_data(_fields, _data_list, UserRole)
for data in _data_list:
db.session.execute('insert into admin_role_power VALUES (%s, %s, %s);' % data)
db.session.commit()
def create_admin_user():
from applications.models import User
_fields = [
'id',
'username',
'password_hash',
'create_at',
'update_at',
'enable',
'realname',
'remark',
'avatar',
'dept_id',
]
_data_list = [
(1, 'admin', 'pbkdf2:sha256:150000$raM7mDSr$58fe069c3eac01531fc8af85e6fc200655dd2588090530084d182e6ec9d52c85',
None, '2021-06-01 17:28:55', 1, '超级管理', '要是不能把握时机,就要终身蹭蹬,一事无成!',
'http://127.0.0.1:5000/_uploads/photos/1617291580000.jpg', 1),
(7, 'test', 'pbkdf2:sha256:150000$cRS8bYNh$adb57e64d929863cf159f924f74d0634f1fecc46dba749f1bfaca03da6d2e3ac',
'2021-03-22 20:03:42', '2021-06-01 17:29:47', 1, '超级管理', '要是不能把握时机,就要终身蹭蹬,一事无成',
'/static/admin/admin/images/avatar.jpg', 1),
(8, 'wind', 'pbkdf2:sha256:150000$skME1obT$6a2c20cd29f89d7d2f21d9e373a7e3445f70ebce3ef1c3a555e42a7d17170b37',
'2021-06-01 17:30:39', '2021-06-01 17:30:52', 1, '', None, '/static/admin/admin/images/avatar.jpg', 7),
]
add_data(_fields, _data_list, User)
def create_admin_user_role():
from applications.extensions import db
_data_list = [
(21, 1, 1),
(22, 7, 2),
(24, 8, 2),
]
# add_data(_fields, _data_list, UserRole)
for data in _data_list:
db.session.execute('insert into admin_user_role VALUES (%s, %s, %s);' % data)
db.session.commit()
def create_example():
from applications.models import DictData
_fields = []
_data_list = []
add_data(_fields, _data_list, DictData)
def register_script(app: Flask):
@app.cli.command()
def init_db():
"""数据库初始化"""
create_dept_data()
create_admin_dict_data()
create_admin_photo()
create_admin_power()
create_admin_role()
create_admin_role_power()
create_admin_user()
create_admin_user_role()
@app.cli.command()
def turn():
from applications.extensions import db
db.drop_all()
db.create_all()
@@ -1,6 +1,7 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_migrate import Migrate
from marshmallow import fields
from marshmallow.validate import (
URL, Email, Range, Length, Equal, Regexp,
@@ -47,8 +48,10 @@ fields.Boolean.default_error_messages = {
db = SQLAlchemy()
ma = Marshmallow()
migrate = Migrate()
def init_databases(app: Flask):
db.init_app(app)
ma.init_app(app)
migrate.init_app(app, db)
+9 -9
View File
@@ -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_role_power import role_power
from .admin_user import User, UserSchema
from .admin_user_role import user_role
from .dept import Dept, DeptSchema
from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema
from .log import AdminLog, LogSchema
from applications.models.file.photo import Photo, PhotoSchema
from applications.models.rights.power import Power, PowerSchema, PowerSchema2
from applications.models.rights.role import Role, RoleSchema
from applications.models.rights.role_power import role_power
from applications.models.users.employee import User, UserSchema
from applications.models.rights.user_role import user_role
@@ -11,13 +11,15 @@ class Power(db.Model):
code = db.Column(db.String(30), comment='权限标识')
url = db.Column(db.String(255), comment='权限路径')
open_type = db.Column(db.String(10), comment='打开方式')
parent_id = db.Column(db.Integer, comment='父类编号')
parent_id = db.Column(db.Integer, db.ForeignKey("admin_power.id"), comment='父类编号')
icon = db.Column(db.String(128), comment='图标')
sort = db.Column(db.Integer, 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='更新时间')
enable = db.Column(db.Integer, comment='是否开启')
parent = db.relationship("Power", remote_side=[id]) # 自关联
# 权限models序列化类
class PowerSchema(ma.Schema):
+1 -1
View File
@@ -33,7 +33,7 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<div class="layui-input-block">x`
<input type="text" value="{{ dept.email }}" name="email" lay-verify="title" autocomplete="off"
placeholder="请输入标题"
class="layui-input">
+1
View File
@@ -58,6 +58,7 @@
<div id="sideMenu"></div>
</div>
</div>
<!-- 内容主题 -->
<div class="layui-body">
<div id="content"></div>
</div>
+2 -2
View File
@@ -93,7 +93,7 @@
dtree.renderSelect({
elem: '#selectParent',
url: '/admin/power/selectParent',
url: '{{ url_for('rights.select_parent') }}',
method: 'get',
selectInputName: { nodeId: 'parentId', context: 'powerName' },
skin: 'layui',
@@ -126,7 +126,7 @@
form.on('submit(power-save)', function (data) {
data.field.icon = 'layui-icon ' + data.field.icon
$.ajax({
url: '/admin/power/save',
url: '{{ url_for('rights.save') }}',
data: JSON.stringify(data.field),
dataType: 'json',
contentType: 'application/json',
+3 -3
View File
@@ -105,7 +105,7 @@
dtree.renderSelect({
elem: '#selectParent',
url: '/admin/power/selectParent',
url: '{{ url_for('rights.select_parent')}}',
method: 'get',
selectInputName: { nodeId: 'parentId', context: 'powerName' },
skin: 'layui',
@@ -138,7 +138,7 @@
form.on('submit(power-save)', function (data) {
data.field.icon = 'layui-icon ' + data.field.icon
$.ajax({
url: '/admin/power/update',
url: '{{ url_for('rights.update') }}',
data: JSON.stringify(data.field),
dataType: 'json',
contentType: 'application/json',
@@ -191,7 +191,7 @@
}
}
window.init("{{ power.type}}")
window.init("{{ power.type }}")
})
</script>
<script>
+3 -3
View File
@@ -92,7 +92,7 @@
let treetable = layui.treetable
let popup = layui.popup
let MODULE_PATH = '/admin/power/'
let MODULE_PATH = '/rights/'
window.render = function () {
treetable.render({
@@ -105,7 +105,7 @@
treeDefaultClose: true,
toolbar: '#power-toolbar',
elem: '#power-table',
url: '/admin/power/data',
url: '{{ url_for('rights.data') }}',
page: false,
cols: [
[
@@ -180,7 +180,7 @@
}
let loading = layer.load()
$.ajax({
url: '/admin/power/' + operate,
url: MODULE_PATH + operate,
data: JSON.stringify({ powerId: this.value }),
dataType: 'json',
contentType: 'application/json',
-2
View File
@@ -4,7 +4,6 @@ from applications.view.admin.admin_log import admin_log
from applications.view.admin.dict import admin_dict
from applications.view.admin.index import admin_bp
from applications.view.admin.file import admin_file
from applications.view.admin.power import admin_power
from applications.view.admin.role import admin_role
from applications.view.admin.user import admin_user
from applications.view.admin.monitor import admin_monitor_bp
@@ -16,6 +15,5 @@ def register_admin_views(app: Flask):
app.register_blueprint(admin_file)
app.register_blueprint(admin_monitor_bp)
app.register_blueprint(admin_log)
app.register_blueprint(admin_power)
app.register_blueprint(admin_role)
app.register_blueprint(admin_dict)
+1
View File
@@ -3,6 +3,7 @@ from flask import Blueprint, Flask
rights_bp = Blueprint('rights', __name__, url_prefix='/rights')
from . import routes
from . import view
def register_rights_view(app: Flask):
@@ -1,37 +1,37 @@
from flask import Blueprint, render_template, request, jsonify
from applications.common.admin import power_curd
from applications.common.utils.http import success_api, fail_api
from applications.common.utils.rights import authorize
from flask import render_template, request, jsonify
admin_power = Blueprint('adminPower', __name__, url_prefix='/admin/power')
from . import rights_bp
from ...common.admin import rights_curd
from ...common.utils.http import success_api, fail_api
from ...common.utils.rights import authorize
@admin_power.get('/')
@rights_bp.get('/')
@authorize("admin:power:main", log=True)
def index():
return render_template('admin/power/main.html')
@admin_power.get('/data')
@rights_bp.get('/data')
@authorize("admin:power:main", log=True)
def data():
power_data = power_curd.get_power_dict()
power_data = rights_curd.get_power_dict()
res = {
"data": power_data
}
return jsonify(res)
@admin_power.get('/add')
@rights_bp.get('/add')
@authorize("admin:power:add", log=True)
def add():
return render_template('admin/power/add.html')
@admin_power.get('/selectParent')
@rights_bp.get('/selectParent')
@authorize("admin:power:main", log=True)
def select_parent():
power_data = power_curd.select_parent()
power_data = rights_curd.select_parent()
res = {
"status": {"code": 200, "message": "默认"},
"data": power_data
@@ -41,19 +41,19 @@ def select_parent():
# 增加
@admin_power.post('/save')
@rights_bp.post('/save')
@authorize("admin:power:add", log=True)
def save():
req = request.json
power_curd.save_power(req)
rights_curd.save_power(req)
return success_api(msg="成功")
# 权限编辑
@admin_power.get('/edit/<int:_id>')
@rights_bp.get('/edit/<int:_id>')
@authorize("admin:power:edit", log=True)
def edit(_id):
power = power_curd.get_power_by_id(_id)
power = rights_curd.get_power_by_id(_id)
icon = str(power.icon).split()
if len(icon) == 2:
icon = icon[1]
@@ -63,22 +63,22 @@ def edit(_id):
# 权限更新
@admin_power.put('/update')
@rights_bp.put('/update')
@authorize("admin:power:edit", log=True)
def update():
res = power_curd.update_power(request.json)
res = rights_curd.update_power(request.json)
if not res:
return fail_api(msg="更新权限失败")
return success_api(msg="更新权限成功")
# 启用权限
@admin_power.put('/enable')
@rights_bp.put('/enable')
@authorize("admin:power:edit", log=True)
def enable():
_id = request.json.get('powerId')
if id:
res = power_curd.enable_status(_id)
res = rights_curd.enable_status(_id)
if not res:
return fail_api(msg="出错啦")
return success_api(msg="启用成功")
@@ -86,12 +86,12 @@ def enable():
# 禁用权限
@admin_power.put('/disable')
@rights_bp.put('/disable')
@authorize("admin:power:edit", log=True)
def dis_enable():
_id = request.json.get('powerId')
if id:
res = power_curd.disable_status(_id)
res = rights_curd.disable_status(_id)
if not res:
return fail_api(msg="出错啦")
return success_api(msg="禁用成功")
@@ -99,10 +99,10 @@ def dis_enable():
# 权限删除
@admin_power.delete('/remove/<int:_id>')
@rights_bp.delete('/remove/<int:_id>')
@authorize("admin:power:remove", log=True)
def remove(_id):
r = power_curd.remove_power(_id)
r = rights_curd.remove_power(_id)
if r:
return success_api(msg="删除成功")
else:
@@ -110,9 +110,9 @@ def remove(_id):
# 批量删除
@admin_power.delete('/batchRemove')
@rights_bp.delete('/batchRemove')
@authorize("admin:power:remove", log=True)
def batch_remove():
ids = request.form.getlist('ids[]')
power_curd.batch_remove(ids)
rights_curd.batch_remove(ids)
return success_api(msg="批量删除成功")