LLM开发之自动编码系统实战开发(一)-- MiniRBAC 集成

前言🎇

首先这个系统呢,俺们目前是还没有做好的,但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目:AutoDevOps-oups 的另一个升级版本(当然这个项目的完整博文系列才刚刚开始更新,先前项目做完了,但是一致没有更新文档,和拆解博文)。首先在技术上呢,我们这次是直接打算采用正常的技术进行开发,也就是比较主流的FastAPI + Vue3 的技术进行开发,当然这个版本还是一个基本的前后端分离版本,只有微服务版本的话,这个是没有的,但是熟练掌握云原生的你一定知道,其实这个版本是可以满足需求的,只是整体授权认证那边需要改动。那么我们整个项目的灵感其实是源于下面这个项目,但是很遗憾的是,这个项目是完全闭源的,在今年五月份的时候无意中发现了这个项目的存在。但是那个时候忙着答辩还有公司入职的一些事情就没有处理(说实话,贼后悔没有选择另一家公司)。之后就是无穷无尽的上班,饼子大事多钱少离家远全占了,好了废话不多说,我们继续出发,我们现在要做的呢,就是实现下面的这个系统的效果,同时增加对每个页面的一个对话式的系统修改,换一句话说,我们要实现的效果是:

  1. 按照需求生成需求文档
  2. 根据需求文档去生成系统
  3. 结合系统和新的需求去生成新的功能与调整

那么这个三个其实我们在先前提到的项目当中是实现了的,但是为什么需要重新做一个,原因很简单,先前我们是使用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的并且没有做过多封装,便于我们修改

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huterox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值