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

news2024/9/25 11:20:04

文章目录

  • 前言🎇
  • MiniRBAC
    • 部署启动
    • 日志修改
    • 更换Mysql
      • 创建数据库
      • 数据库连接
      • 修改查询
  • Next ✨

前言🎇

首先这个系统呢,俺们目前是还没有做好的,但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目: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的并且没有做过多封装,便于我们修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 消息机制Handler完全解析(一)

提到Handler相信即使你是刚入行的android开发也会用过,可能你会觉得很简单,但是Handler中包含的内容真的不是你理解的那么简单,可能有些工作3-5年的同学也没有对其有很深入的了解。但Handler在android中的地位非常重要,并且几乎是…

图解Kafka | 5张图讲透Kafka 消费者交付语义

Kafka 消费者交付语义指的是 Kafka 消费者在处理消息时如何保证消息的可靠性和一致性。这涉及到消息是否被丢失、重复处理或者按顺序消费。 Kafka消费者交付语义有三种,即: 最多一次至少一次精确一次 当消费者组/消费者从 Kafka 消费数据时&#xff0…

昂科烧录器支持Airoha达发科技的蓝牙音频芯片AB1568

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中Airoha达发科技的蓝牙音频芯片AB1568已经被昂科的通用烧录平台AP8000所支持。 AB1568是一款获得蓝牙5.3和LE音频认证的单芯片解决方案,包含一个ARM Cortex-M4F应用…

香蕉梨:自然的甜蜜宝藏

在水果的缤纷世界里,有一种独特的存在,它融合了香蕉的软糯与梨子的清甜,那便是令人惊艳的香蕉梨。 食家巷香蕉梨,外形圆润可爱,色泽金黄中带着一抹清新的嫩绿,宛如大自然精心雕琢的艺术品。当你拿起一个香蕉…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日,时间过得很快,2024…

PowerShell | git log 中文乱码问题解决

总结一下: 乱码核心问题就是对不上编码.改成对应编码即可. 明白‌LESSCHARSET环境变量‌是用来设置less命令的字符集编码的。当在命令行中使用less命令查看文件时,如果文件包含非ASCII字符(如中文),可能会出现乱码问题。通过设置…

SpringBoot+Vue实现大文件上传(断点续传-前端控制)

SpringBootVue实现大文件上传(断点续传) 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI 2 问题 在前一篇文章,我们写了分片上传来实现大文件上传,存在一个问题就是,中间失败的话需要重新上传&#…

QT WIN11 FluentUI APP开发

代码 import QtQuick import QtQuick.Controls import FluentUIItem {property bool autoPlay: trueproperty int loopTime: 2000property var modelproperty Component delegateproperty bool showIndicator: trueproperty int indicatorGravity : Qt.AlignBottom | Qt.Align…

【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

STM32(六):定时器——输出比较实验

PWM驱动呼吸灯 源码: #include "stm32f10x.h" // Device headervoid PWM_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟TIM_InternalClockConfig(TIM2);//选择时基单元的时钟TIM_TimeBaseInitTypeDef TI…

怎么管控终端电脑上的移动端口

管控终端电脑上的移动端口,尤其是USB等移动端口,是确保企业数据安全和提升网络管理效率的重要手段。 一、使用注册表编辑器禁用USB端口(适用于Windows系统) 打开注册表编辑器: 同时按下“WinR”组合键,打…

【C++从小白到大牛】C++智能指针的使用、原理和分类

目录 1、我们为什么需要智能指针? 2、内存泄露 2.1 什么是内存泄漏,内存泄漏的危害 2.2如何避免内存泄漏 总结一下: 3.智能指针的使用及原理 3.1 RAII 3.2关于深拷贝和浅拷贝更深层次的理解: 3.3 std::auto_ptr 3.4 std::unique_pt…

《黑神话:悟空》登顶全球:游戏行业投资新风向与投资洞察

目录 引言 一、原创IP的崛起:文化共鸣与市场潜力 1《黑神话:悟空》的原创IP魅力 2 原创IP在游戏行业中的重要性 3 原创IP成为新的投资热点 4 文化共鸣的关键作用 二、高质量内容为王:技术与创新的双重驱动 1 《黑神话:悟空》的高质量内容展示 2…

Java接口interface(内含练习)

为什么有接口? 接口就是一种规则,更侧向是一种行为 接口的定义和使用 接口用关键字interface来定义 public interface 接口名{} 接口不能实例化 接口和接口之间是实现关系,通过implements关键字表示 public class 类名 implements 接口…

浅谈线性表——链表

文章目录 一、ArrayList的缺陷二、什么是链表?三、自我实现一个单向不带头非循环结构的链表3.1、实现代码3.2、代码解析 四、自我实现一个双向不带头非循环结构的链表4.1、实现代码 一、ArrayList的缺陷 前面学习了顺序表,顺序表在知道下标时可以快速的…

python应用之random模块(居然还有那么多的随机算法函数)

random 是 Python 的一个常用的内置模块,模块提供了生成随机数的功能,包含了多种生成随机数的函数,比如生成随机整数、随机浮点数、从序列中随机选择元素等。 使用 random模块 要使用 random模块,直接导入它即可。 import rand…

spring揭秘09-aop03-aop织入器织入横切逻辑与自动织入

文章目录 【README】【1】spring aop的织入【1.1】使用ProxyFactory 作为织入器【1.2】基于接口的代理(JDK动态代理,目标类实现接口)【补充】 【1.2】基于类的代理(CGLIB动态代理,目标类没有实现接口)【1.2…

Nginx: 配置项之autoIndex模块与Nginx变量

autoIndex模块 autoindex模块它所实现的一个基本功能,是当用户请求以 / 结尾式的URL,它会列出对应的目录结构比如说, 在实际的生态环境中,内部系统可能经常需要为用户提供一些下载功能。可能需要列出来某一个磁盘上的一个文件, 比…

【D-DCVRP】求解DCVRP改进贪婪算法(三)

一、Held-Harp模型 海尔德和卡尔普在1970年提出景点模型,用于求解TSP问题的最优解下界 该模型同样可以用于DCVRP问题,既有定理1成立。 定理1:根据Held-Karp模型使用向量 π = ( 0 , π 1 , π 2 , ⋯   , π n ) \pi=(0,\pi_1,\pi_2,\cdots,\pi_n) π=(0,π1​,π2​,⋯…

Datawhale第五期夏令营-CV竞赛

CV竞赛 0.赛事报名租用4090 1.开始运行下载文件提交结果 2.内容解释赛题背景赛题目标社会价值评分规则baseline精读代码什么是YOLO 主要代码内容精读使用Ultraalytics运行代码 0.赛事报名 赛事官网:https://www.marsbigdata.com/competition/details?id3839107548872 租用40…