DashGo零基础入门 纯Python的管理系统搭建
DashGo学习笔记
一、简介
DashGo是一款完全基于Python的开发管理后台的开源项目。
二、使用方法
1.创建应用
应用,即一个新的网页页面,开发者可以设计该网页页面的所有组件及其样式。所有的应用都需要定义到项目文件夹src/dash_view/application中,通过新建一个.py文件实现app的创建。
DashGo中根据应用脚本在application中的层级来划分其属于几级标题:
- 若
myapp.py直接位于application文件夹中,则该应用为一级应用
# src/dash_view/application/myapp.pyfrom common.utilities.util_menu_access import MenuAccessimport feffery_antd_components as fac# 一级菜单的标题、图标和显示顺序title = '我的单页应用'icon = 'antd-rocket'order = 5# 权限定义access_metas = ('我的单页应用-页面','我的单页应用-功能1',)# 渲染页面内容def render_content(menu_access: MenuAccess, **kwargs):return fac.AntdCenter(fac.AntdSpace([fac.AntdTitle('这是一个一级菜单应用!', level=2),fac.AntdText('点击菜单直接进入,无需展开子菜单'),], direction='vertical'),style={'marginTop': '100px'})
-
若想要该应用位于某个二级菜单下,例如在
管理(一级菜单)下有两个二级应用用户管理、接口管理。则需要在application文件夹下添加一个文件夹(命名规则暂时不确定),并创建3个py脚本,分别是__init__.py、userManager.py、interfaceManager.py,其中__init_.py定义一级菜单
# 一级菜单的标题、图标和显示顺序title = '管理'icon = 'antd-audit'# order = 9999即将该一级菜单的顺序为9999,一般情况下就是最后一个order = 9999
userManager.py和interfaceManager中则定义二级菜单(即该应用)的页面,例如:
# 二级菜单的标题、图标和显示顺序
title = '我的应用1'
icon = None
order = 2
logger = Log.get_logger(__name__)# 定义该应用中的权限组件
def access_metas():return ('应用1-基础权限','应用1-权限1','应用1-权限2',)def render_content(menu_access: MenuAccess, **kwargs):return fac.AntdFlex([*([Card(fac.AntdStatistic(title='展示',value=fuc.FefferyCountUp(end=100, duration=3),),title='应用1-权限1',)]# 如果登录用户拥有该权限 则显示if menu_access.has_access('应用1-权限1')# 否则该组件不显示else []),*([Card(fac.AntdStatistic(title='展示',value=fuc.FefferyCountUp(end=200, duration=3),),title='应用1-权限2',)]# 同上 进行权限验证,拥有权限则显示,否则不显示if menu_access.has_access('应用1-权限2')else []),],wrap='wrap',)
2.应用注册
创建应用后还需要注册应用。通过在src/config/access_factory.py中将需要注册的应用的添加到apps变量中,例如:
apps = [subapp2, subapp1]
注册应用后,是不会将该应用的访问权限授予任何人的,包括系统管理员自己,如果想要:
1.将该应用权限设置为某种角色默认拥有的
可以在access_factory.py中的角色默认权限中配置:
# 基础默认权限,主页和个人中心,每人都有,无需分配
default_access_meta = ('个人信息-页面','工作台-页面','监控页-页面',
)# 团队管理员默认权限
group_access_meta = ('团队授权-页面',)# 系统管理员默认权限
admin_access_meta = ('用户管理-页面','角色管理-页面','团队管理-页面','公告管理-页面','任务管理-页面','任务日志-页面','通知接口-页面','监听接口-页面',
)# 内置可以分配的权限
assignable_access_meta = ('任务管理-页面','任务日志-页面',
)
2.将该应用权限设置为分配后才可以拥有的
在这种情况下,不需要做任何操作,只需要保证应用创建和注册无误,此后在系统管理员的权限管理部分可以分配这部分权限。
但是我们发现似乎在上面提到的默认分配权限中有一个变量
assignable_access_meta中的权限也是可以分配的。这个变量的意义是,在管理员的权限分配树中会默认过滤掉所有自动分配的权限if access_meta in (default_access_meta, admin_access_meta, group_access_meta):continue # 不显示在权限树中因此如果希望将某些自动分配的权限也可以通过手动分配给其他用户,就需要将其保存在该变量中
3.应用界面绘制
4.角色创建管理
在DashGo中默认为三种角色身份:普通用户、团队管理员、系统管理员。这三种角色拥有自己的默认权限,但是在实际业务中可能不知这三种角色,如果我们需要创建新的角色,可以按照下面的步骤进行:
-
定义新角色的自动分配权限
在
src/config/access_factory.py中创建新的自动分配权限# 【新增】编辑者默认权限 editor_access_meta = ('公告管理-页面','任务管理-页面', )需要注意的是:
- 权限名称必须在某个应用的
access_metas()中定义 - 如果权限不存在,系统启动时会报错
- 权限名称必须在某个应用的
-
更新权限检查逻辑
修改
src/config/access_factory.py的check_access_meta()方法outliers = (set(cls.default_access_meta) | set(cls.group_access_meta) | set(cls.admin_access_meta)| set(cls.editor_access_meta) # 【新增】 ) - set(cls.get_dict_access_meta2menu_item().keys()) -
实现权限分配逻辑
编辑
src/common/utilities/util_menu_access.py的get_extra_access_meta()方法,使用户拥有某个角色时,自动赋予该角色的默认权限。@staticmethod def get_extra_access_meta(user_roles) -> List[str]:from config.access_factory import AccessFactoryextra_access_metas = []# admin角色添加默认权限if 'admin' in user_roles:extra_access_metas.extend(AccessFactory.admin_access_meta)# 【新增】editor角色添加默认权限if 'editor' in user_roles:extra_access_metas.extend(AccessFactory.editor_access_meta)return extra_access_metas -
更新权限树显示逻辑
if (access_meta in (*AccessFactory.default_access_meta, *AccessFactory.admin_access_meta, *AccessFactory.group_access_meta,*AccessFactory.editor_access_meta #【新增】)and access_meta not in AccessFactory.assignable_access_meta ):continue # 不显示在权限树中该操作使得自动分配的这些属性不会出现在权限树中,则相关权限只能被指定角色用户所有,如果希望这些权限也能分配给其他角色的用户,需要将相关权限添加至
assignable_access_meta中。 -
在前端创建角色
-
登录系统(使用 admin 账号)
-
进入
权限管理→角色管理 -
点击
新建角色 -
填写信息:
-
角色名称:
editor(必须与代码中定义的一致) -
角色状态:启用
-
角色描述:编辑者角色
-
菜单权限:勾选需要的额外权限(默认权限会自动拥有)
-
- 点击
确定
-
5.数据库配置
DashGo默认使用的是sqlite数据库,一般我们使用MySQL,为此我们需要修改相关配置:
在src/config/dashgo.ini修改数据库配置
[SqlDbConf]
RDB_TYPE = mysql # 改为 mysql
# sqlite
SQLITE_DB_PATH = ../app.db
# mysql
HOST = 127.0.0.1 # MySQL 服务器地址
PORT = 3306 # MySQL 端口
USER = root # MySQL 用户名
PASSWORD = 你的MySQL密码 # 改为你的实际密码
DATABASE = 你的数据库名 # 数据库名称
POOL_SIZE = 5 # 连接池大小
使用系统演示初始化脚本
# 安装依赖
pip install pymysql# 登录数据库
mysql -u root -p# 创建数据库
-- 创建数据库(使用 UTF-8 编码)
CREATE DATABASE dashgo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 查看数据库是否创建成功
SHOW DATABASES;-- 退出 MySQL
EXIT;# 切换到 src 目录
cd src# 创建数据库表
python -c "from database.sql_db.conn import create_rds_table; create_rds_table()"# 初始化管理员账号
python -c "from database.sql_db.conn import init_rds_data; init_rds_data()"# 启动应用
python app.py
