前言🎇
首先这个系统呢,俺们目前是还没有做好的,但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目:AutoDevOps-oups 的另一个升级版本(当然这个项目的完整博文系列才刚刚开始更新,先前项目做完了,但是一致没有更新文档,和拆解博文)。首先在技术上呢,我们这次是直接打算采用正常的技术进行开发,也就是比较主流的FastAPI + Vue3 的技术进行开发,当然这个版本还是一个基本的前后端分离版本,只有微服务版本的话,这个是没有的,但是熟练掌握云原生的你一定知道,其实这个版本是可以满足需求的,只是整体授权认证那边需要改动。那么我们整个项目的灵感其实是源于下面这个项目,但是很遗憾的是,这个项目是完全闭源的,在今年五月份的时候无意中发现了这个项目的存在。但是那个时候忙着答辩还有公司入职的一些事情就没有处理(说实话,贼后悔没有选择另一家公司)。之后就是无穷无尽的上班,饼子大事多钱少离家远全占了,好了废话不多说,我们继续出发,我们现在要做的呢,就是实现下面的这个系统的效果,同时增加对每个页面的一个对话式的系统修改,换一句话说,我们要实现的效果是:
- 按照需求生成需求文档
- 根据需求文档去生成系统
- 结合系统和新的需求去生成新的功能与调整
那么这个三个其实我们在先前提到的项目当中是实现了的,但是为什么需要重新做一个,原因很简单,先前我们是使用Streamlit 来进行实现。所以这就导致,我们如果要直接可视化系统去修改实现起来是比较困难的,因此这就导致我们需要切换我们的技术栈去实现它。同时发现下面这个演示的系统效果还是不错的,所以我们对着抄就好了。再加上,在未来我们也方便去集成其他的组件,毕竟使用streamlit开发的局限性还是太大了。反正都是全干工程师,对咱们来说不都是一样的嘛~😏
MiniRBAC
首先这个项目呢,是一个基于FastAPI+Vue3实现的一个基础的架子系统。那么为什么需要这个系统呢,很简单,就像刚刚演示的别人的系统一样,我们得现有一个基本的系统页面。我们可以选择自己去编写一个项目,但是既然有开源的,那么我们当然还是拿过来进行修改会更快一点。同时这个项目具备了基础的雏形,我们如果需要使用它去直接开发一个管理系统之类的也是非常快的。
原项目地址:https://github.com/zy7y/mini-rbac
那么毫无疑问第一件事情,先下载源码之后进行解压:
虽然作者是使用的3.9.7版本的Python 但是我们在后面会使用到的组件需要更高的版本(主要是我们先前那个代码生成的项目是基于3.10进行开发的)所以我这里本地就直接使用3.10了。
部署启动
废话不多说,我们先开始启动部署
首先我们分别打开到前端和后端项目,这个文件目录自己看着放,我这里是改名子了,先前有个文本生成视频的项目,叫做Money Printer 那么这里我们这个项目未来开源的时候就叫BeesMoney,一键生成系统,一键完成交付😏:
安装依赖
pip install -r requirements.txt
这里使用这个指令下载我们的包:
npm install --registry=http://registry.npmmirror.com
当一切准备妥当之后,运行项目:
后端启动端口为 8080
swagger地址 为: 127.0.0.1:8080/docs
之后启动前端,这里启动会有点慢:
默认登录账号密码:
admin
123456
日志修改
由于原作者是在Mac上开发的项目,因此当我们在Windows上使用这个项目的时候我们的日志会出现乱码和报错。因此我们在这里需要修改一下我们日志的配置。
只需要设置编码即可,这里将我们的代码直接复制即可:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# 创建一个 FileHandler,用于写入日志文件
handler = logging.FileHandler('app.log',encoding='utf-8')
handler.setLevel(logging.INFO)
# 设置日志格式
formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(message)s")
handler.setFormatter(formatter)
# 添加 FileHandler 到日志处理器中
logger.addHandler(handler)
更换Mysql
在原项目当中,使用的是sqlLite,在这里我们需要使用到mysql。
pip install tortoise-orm pymysql
pip3 install asyncmy
创建数据库
在这里直接执行下面这个sql语句就可以了。
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL DEFAULT 1,
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`path` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`type` smallint(6) NOT NULL,
`component` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`pid` int(11) NULL DEFAULT NULL,
`identifier` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`api` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_sys_menu_identifier`(`identifier` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES (1, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '系统面板', 'DashboardOutlined', '/dashboard', 0, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (2, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '系统管理', 'AppstoreOutlined', '/system', 0, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (3, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户管理', 'TeamOutlined', '/system/user', 1, '/system/user/user.vue', 2, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (4, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色管理', 'UserOutlined', '/system/role', 1, '/system/role/role.vue', 2, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (5, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '菜单管理', 'MenuOutlined', '/system/menu', 1, '/system/menu/menu.vue', 2, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (6, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '数据面板', 'AreaChartOutlined', '/dashboard/index', 1, '/dashboard/index/index.vue', 1, NULL, NULL, NULL);
INSERT INTO `sys_menu` VALUES (7, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户详情', NULL, NULL, 3, NULL, 3, 'user:get', '/user/{pk}', 'GET');
INSERT INTO `sys_menu` VALUES (8, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户列表', NULL, NULL, 3, NULL, 3, NULL, '/user', 'GET');
INSERT INTO `sys_menu` VALUES (9, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户查询', NULL, NULL, 2, NULL, 3, 'user:query', '/user/query', 'POST');
INSERT INTO `sys_menu` VALUES (10, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户新增', NULL, NULL, 2, NULL, 3, 'user:create', '/user', 'POST');
INSERT INTO `sys_menu` VALUES (11, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户删除', NULL, NULL, 2, NULL, 3, 'user:delete', '/user/{pk}', 'DELETE');
INSERT INTO `sys_menu` VALUES (12, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '用户更新', NULL, NULL, 2, NULL, 3, 'user:update', '/user/{pk}', 'PUT');
INSERT INTO `sys_menu` VALUES (13, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '查询角色拥有权限', NULL, NULL, 3, NULL, 4, NULL, '/role/{rid}/menu', 'GET');
INSERT INTO `sys_menu` VALUES (14, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色列表', NULL, NULL, 3, NULL, 4, NULL, '/role', 'GET');
INSERT INTO `sys_menu` VALUES (15, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色查询', NULL, NULL, 2, NULL, 4, 'role:query', '/role/query', 'POST');
INSERT INTO `sys_menu` VALUES (16, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色新增', NULL, NULL, 2, NULL, 4, 'role:create', '/role', 'POST');
INSERT INTO `sys_menu` VALUES (17, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色删除', NULL, NULL, 2, NULL, 4, 'role:delete', '/role/{pk}', 'DELETE');
INSERT INTO `sys_menu` VALUES (18, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '角色更新', NULL, NULL, 2, NULL, 4, 'role:update', '/role/{pk}', 'PUT');
INSERT INTO `sys_menu` VALUES (19, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '菜单列表', NULL, NULL, 3, NULL, 5, NULL, '/menu', 'GET');
INSERT INTO `sys_menu` VALUES (20, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '菜单新增', NULL, NULL, 2, NULL, 5, 'menu:create', '/menu', 'POST');
INSERT INTO `sys_menu` VALUES (21, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '菜单更新', NULL, NULL, 2, NULL, 5, 'menu:update', '/menu/{pk}', 'PUT');
INSERT INTO `sys_menu` VALUES (22, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '菜单删除', NULL, NULL, 2, NULL, 5, 'menu:delete', '/menu/{pk}', 'DELETE');
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL DEFAULT 1,
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_sys_role_name`(`name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (1, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', '超管', '全部权限');
INSERT INTO `sys_role` VALUES (2, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 'users', 'users');
-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL DEFAULT 1,
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`rid` int(11) NOT NULL,
`mid` int(11) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_sys_role_menu_rid_mid`(`rid` ASC, `mid` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_role_menu
-- ----------------------------
INSERT INTO `sys_role_menu` VALUES (1, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 1);
INSERT INTO `sys_role_menu` VALUES (2, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 2);
INSERT INTO `sys_role_menu` VALUES (3, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 3);
INSERT INTO `sys_role_menu` VALUES (4, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 4);
INSERT INTO `sys_role_menu` VALUES (5, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 5);
INSERT INTO `sys_role_menu` VALUES (6, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 6);
INSERT INTO `sys_role_menu` VALUES (7, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 7);
INSERT INTO `sys_role_menu` VALUES (8, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 8);
INSERT INTO `sys_role_menu` VALUES (9, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 9);
INSERT INTO `sys_role_menu` VALUES (10, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 10);
INSERT INTO `sys_role_menu` VALUES (11, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 11);
INSERT INTO `sys_role_menu` VALUES (12, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 12);
INSERT INTO `sys_role_menu` VALUES (13, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 13);
INSERT INTO `sys_role_menu` VALUES (14, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 14);
INSERT INTO `sys_role_menu` VALUES (15, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 15);
INSERT INTO `sys_role_menu` VALUES (16, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 16);
INSERT INTO `sys_role_menu` VALUES (17, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 17);
INSERT INTO `sys_role_menu` VALUES (18, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 18);
INSERT INTO `sys_role_menu` VALUES (19, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 19);
INSERT INTO `sys_role_menu` VALUES (20, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 20);
INSERT INTO `sys_role_menu` VALUES (21, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 21);
INSERT INTO `sys_role_menu` VALUES (22, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 22);
INSERT INTO `sys_role_menu` VALUES (23, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 2, 3);
INSERT INTO `sys_role_menu` VALUES (24, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 2, 2);
INSERT INTO `sys_role_menu` VALUES (25, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 2, 1);
INSERT INTO `sys_role_menu` VALUES (26, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 2, 6);
INSERT INTO `sys_role_menu` VALUES (27, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 2, 7);
INSERT INTO `sys_role_menu` VALUES (28, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 2, 8);
INSERT INTO `sys_role_menu` VALUES (29, 1, '2022-10-04 10:48:51', '2022-10-04 10:48:51', 2, 10);
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL DEFAULT 1,
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`username` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`nickname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_sys_user_username`(`username` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 'admin', 'Huterox', '$2b$12$prEQ6ahnaxRk1M1aISECYefzDJeivejx6I3xeI.nztUj51lvdmv8S');
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL DEFAULT 1,
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`rid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES (1, 9, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 1);
INSERT INTO `sys_user_role` VALUES (2, 1, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 2, 1);
INSERT INTO `sys_user_role` VALUES (3, 5, '2022-10-04 10:23:49', '2022-10-04 10:23:49', 1, 1);
SET FOREIGN_KEY_CHECKS = 1;
这里的话,我将sqllite的数据库内容转换为myslq8.0的了,之后我们修改下面两个文件:
数据库连接
现在我们需要修改我们的 数据库连接,主要在这里:
from tortoise import Tortoise
from tortoise.backends.mysql import MySQLClient
# async def init_orm():
# """初始化orm"""
# await Tortoise.init(db_url="sqlite://mini.db", modules={"models": ["models"]})
# await Tortoise.generate_schemas()
async def init_orm():
"""初始化orm"""
# host: 数据库服务器地址
# port: 数据库端口,默认是3306
# database: 数据库名
# user: 数据库用户名
# password: 数据库密码
db_url = "mysql://root:123456@127.0.0.1:3306/bees-money"
# 初始化Tortoise ORM,指定数据库类型为MySQL,并指定数据库实体所在包路径
await Tortoise.init(
db_url=db_url,
modules={'models': ['models']}
)
# 生成数据库表结构
await Tortoise.generate_schemas()
async def close_orm():
"""关闭orm"""
await Tortoise.close_connections()
修改查询
之后就是修改我们的查询,sqllite 默认使用:(?) 来设置参数,但是mysql是 %s
因此的话,我们需要进行修改:
直接把这个代码粘贴过去:
"""数据库通用查询方法"""
from tortoise import connections
from models import MenuModel, RoleMenuModel, RoleModel, UserModel, UserRoleModel
class DbHelper:
def __init__(self, model):
"""
初始化
:param model: 模型类 orm model
"""
self.model = model
def __filter(self, kwargs: dict):
"""
过滤数据,默认过滤数据
:param kwargs:
:return:
"""
return self.model.filter(**kwargs)
async def select(self, kwargs: dict = None):
"""
查询符合条件的第一个对象, 查无结果时返回None
:param kwargs: kwargs: {"name:"7y", "id": 1}
:return: select * from model where name = "7y" and id = 1 limit 1
"""
if kwargs is None:
kwargs = {}
return await self.__filter(kwargs).first()
async def update(self, filters: dict = None, updates: dict = None):
"""
更新单条数据
:param filters: 条件字典 {"id":1,"status__not": 9}
:param updates: 待更新数据 {"status": 5}
:return: 0 失败, 1 成功
"""
return await self.__filter(filters).update(**updates)
async def delete(self, pk: int) -> int:
"""
逻辑删除单条数据, status -> 9
:param pk: 数据id
:return: 0 是删除 失败, 1是删除成功
"""
filters = {"id": pk}
updates = dict(status=9)
return await self.update(filters=filters, updates=updates)
async def insert(self, data: dict):
"""
新增一条数据
:param data: 模型字典
:return: 新增之后的对象
"""
return await self.model.create(**data)
async def selects(
self, offset: int, limit: int, kwargs: dict = None, order_by: str = "-created"
) -> dict:
"""
条件分页查询数据列表, 支持排序
Args:
offset: 偏移量
limit: 数量
kwargs: 条件 {}
order_by: 排序,默认为None, 传入 -字段名 降序 字段名升序
SQL => select * from model where xx=xx ... order by xx limit offset, limit
Returns:
{"items": Model列表, "total": "数量"}
"""
if kwargs is None:
kwargs = {}
objs = self.__filter(kwargs).all()
if order_by is not None:
objs = objs.order_by(order_by)
return dict(
items=await objs.offset(offset).limit(limit), total=await objs.count()
)
async def inserts(self, objs: list):
"""
批量新增数据
:param objs: 模型列表
:return:
"""
await self.model.bulk_create([self.model(**obj) for obj in objs])
@classmethod
async def raw_sql(cls, sql: str, args: list = None):
"""
手动执行SQL
:param sql:
:param args: sql参数
:return:
"""
db = connections.get("default")
if args is None:
args = []
return await db.execute_query_dict(sql, args)
UserDao = DbHelper(UserModel)
RoleDao = DbHelper(RoleModel)
UserRoleDao = DbHelper(UserRoleModel)
MenuDao = DbHelper(MenuModel)
RoleMenuDao = DbHelper(RoleMenuModel)
async def has_roles(uid):
"""
获取用户角色信息,激活的角色升序
:param uid: 用户id
:return:
"""
# sql = """select r.id, r.name, ur.status from sys_role as r , sys_user_role as ur where r.id = ur.rid and
# ur.uid = (?) and r.status = 1 and ur.status !=9 order by ur.status desc
# """
sql = """SELECT r.id, r.name, ur.status
FROM sys_role AS r, sys_user_role AS ur
WHERE r.id = ur.rid AND ur.uid = %s AND r.status = 1 AND ur.status != 9
ORDER BY ur.status DESC"""
return await UserRoleDao.raw_sql(sql, [uid])
async def has_user(username):
"""
通过用户名检索数据是否存在
:param username:
:return:
"""
return await UserDao.select({"username": username, "status__not": 9})
async def has_permissions(rid, is_menu=False):
"""
根据角色ID查到当前拥有的接口权限
:param rid: 角色ID
:param is_menu: 是否是菜单,默认不是 -》接口
:return:
"""
filters = "m.api, m.method"
if is_menu:
filters = "m.id, m.name, m.icon, m.path, m.type, m.component, m.pid, m.identifier, m.api, m.method"
sql = f"""
select {filters}
FROM sys_menu as m, sys_role_menu as srm WHERE m.id = srm.mid
AND srm.rid = %s and m.status != 9 and srm.status !=9 order by m.id asc"""
return await RoleMenuDao.raw_sql(sql, [rid])
此时我们的项目就修改为了mysql
Next ✨
做到这里当然还不够,我们只是做了个基本的启动,实际上,我们要做的是对整个项目重新进行修改,下一步,我们要对整个后端进行重构,而对于前端,这个我们将修改基本的样式等等。好吧,这里我承认我之所以使用这个项目作为基础,是因为我懒得重新写一套RBAC对应的前端了,我们先前的模板是Vue2的,但是它提供了Vue3的并且没有做过多封装,便于我们修改