您现在的位置是:网站首页> 编程资料编程资料
go-cqhttp权限管理系统的实现代码_Golang_
                     2023-05-26
                415人已围观
                
                2023-05-26
                415人已围观
            
简介 go-cqhttp权限管理系统的实现代码_Golang_
权限管理系统
一、 概述
在写好我们的智能聊天功能之后,大家有没有感觉很烦呢?感觉这个机器人在群里面一直被艾特,一直被戳一戳。那么,我们有没有一种方法,使得其在群里面的权限可控呢?
或许大家看到这个问题就想到了一个方法,那就是通过python文件,但是使用python文件保存的话有一个缺点,那就是修改配置文件后,需要重新运行我们的项目,这会让我们觉得很麻烦!
那么,还有没有更好的方法呢?给大家一分钟时间思考……好,大家思考出来了吗?我的想法是,将权限存储到数据库中,当我们需要调用这个功能的时候,通过调用数据库,来判断是否有进行这项功能的权限!这里,我们选择的是mysql数据库,关于对数据库的操作,我已经给大家准备好了!
- mysql数据库的安装:linux 中安装数据库的方法
- mysql基本语法:关于数据库操作的基本语法
- SQLAchemy 常用操作:使用ORM操作数据库
看到SQLAchemy,就应该有小伙伴要说了,既然我们看了mysql的基本语法,我们完全可以通过SQL语句来操作我们的数据库,为什么需要使用ORM来操作数据库呢?其实不然,我们使用SQL操作数据库的话,就无法处理一些高并发的操作了,会造成严重的阻塞,使用SQLAchemy可以创建数据库连接池,缓解服务器的压力,同时ORM对于一些不是很熟悉SQL的小伙伴来说比较友好。
好了,相信大家也看完了上面对数据库的操作的文章了,同时也看完了我写的关于flask的全部文章了,废话不多说了,来开始实现我们的权限管理系统
展示一下我的目录结构:
|-- App | |-- exts.py | |-- __init__.py | |-- models.py | |-- script.py | |-- settings.py | `-- views | |-- goCqhttp.py | |-- __init__.py |-- app.py
二、 创建表
1、 创建
在实现权限管理系统之前,我们肯定是需要创建相应的数据表来存储我们的数据的
我们使用flask-sqlachemy来实现orm,同时快速生成表
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "models.py" __time__ = "2022/9/11 19:56" from App.exts import db class Group(db.Model): # 创建一个群的表 __tablename__ = "group" id = db.Column(db.INTEGER, primary_key=True, autoincrement=True) name = db.Column(db.String(200), nullable=True) qqId = db.Column(db.String(20), nullable=False, unique=True, index=True) isDetect = db.Column(db.BOOLEAN, default=True) # 是否开启,进行逻辑删除 auth = db.Column(db.SmallInteger, default=0) # 在群里面的的地位,默认为群成员,1为管理员,2为群主 def __init__(self, name, qqId): self.name = name self.qqId = qqId class GroupAuthority(db.Model): # 创建一个权限管理表 __tablename__ = "groupAuth" id = db.Column(db.INTEGER, primary_key=True, autoincrement=True) chat = db.Column(db.INTEGER, default=0, nullable=False) # 是否开启智能聊天的功能 welcome = db.Column(db.INTEGER, default=1, nullable=False) # 是否开启新成员入群欢迎的功能 banTalk = db.Column(db.INTEGER, default=0) # 群禁言功能,以及消息撤回功能 click = db.Column(db.INTEGER, default=1) # 戳一戳功能,默认开启 smallFunction = db.Column(db.INTEGER, default=1) # 是否开启小功能,如疫情数据查询等 dailyBrief = db.Column(db.INTEGER, default=0) # 是否开启每日简报功能 groupId = db.Column(db.INTEGER, db.ForeignKey("group.id", ondelete="CASCADE")) # 外键约束,同时进行级联删除 auth2group = db.relationship("Group", backref=db.backref("group2auth")) # 使用代理 def __init__(self, is_privade=False, chat=None, welcome=None, bantalk=None, click=None, smallFunction=None, dailyBrief=None): if is_privade: self.chat = chat self.welcome = welcome self.banTalk = bantalk self.click = click self.smallFunction = smallFunction self.dailyBrief = dailyBrief 在这里,我使用group表作为主表,用来存放各群的数据,同时将机器人对各群的权限存储到另一张表中,因为是一对一的关系,我们使用同时对表使用外键约束来关联主表以及子表
2、 生成
把表的结构创建完后,我们来创建主程序,用来生成我们创建的表
在exts.py文件中写入:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "exts.py" __time__ = "2022/9/11 23:39" from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate db = SQLAlchemy() # 操作数据库 def init_exts(app): db.init_app(app) Migrate().init_app(app, db) # 使用app初始化Migrate app.config["db"] = db
在settings.py中写入:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "settings.py" __time__ = "2022/9/11 19:17" class Config: """基础的配置字""" SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/bot?charset=utf8" SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ECHO = True SUPER_USER = ["3500515050", ] # 超级用户,其可以私发消息给机器人,管理机器人对所有群的权限,当然也可以存储到数据库中,这里为了方便,存储在配置文件中,大家可根据这篇文章执行实现 ADMIN = 3500515050 # 开发者 class Help: """帮助文档""" ADMIN_HELP = """开发者命令提示: 1 添加群:\n/admin:add QQ群号 QQ群名 2. 删除功能:\n/admin:delete QQ群号 3 查找功能:\n/admin:get QQ群号 4. 获取所有群:\n/admin:show 5. 修改权限命令:\n/admin:changeAuth QQ群号 |聊天功能|入群欢迎|管理群|戳一戳|拓展功能|定时功能|(比如110011)\n 如果还是有问题,请与开发人员联系哦!""" GROUP_ADMIN = """[CQ:at,qq=%d]命令提示: 1. 查看群权限:\n/admin:get 2. 修改群权限:\n/admin:change |聊天功能|入群欢迎|管理群|戳一戳|拓展功能|定时功能|(比如#admin:change# 110011)\n 如果还是有问题,请与开发人员联系哦!""" class ProductConfig(Config, Mes, Url): """生产环境配置""" pass class DevelopConfig(Config, Mes, Url): """开发环境配置""" DEBUG = True envs = { "product": ProductConfig, "develop": DevelopConfig } 在views/__init__.py中写入:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "__init__.py.py" __time__ = "2022/9/11 19:30" from App.views.goCqhttp import AcceptMes from flask_restful import Api def init_app(app): api = Api(app) api.add_resource(AcceptMes, "/", endpoint="index")
在views/goCqhttp.py中写入:
# !/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "goCqhttp.py" __time__ = "2022/9/11 19:57" from flask_restful import Resource from flask import request import asyncio from App.events.private import PriChatMes from App.events.group import GroupChatMes from App.events.groupAndPri import GroupAndPri from flask import current_app from App.models import Group from App.events.groupAndPri import Command from App.script.requests_tools import Sender class AcceptMes(Resource): def post(self): pass # 后面主要是通过这个接口来对消息的分发
在App/__init__.py中 写入
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "__init__.py.py" __time__ = "2022/9/11 14:25" from flask import Flask from App.settings import envs from App.views import init_app from App.exts import init_exts def create_app(env): app = Flask(__name__) app.config.from_object(envs.get(env)) init_exts(app) init_app(app) # 将路由传入app中 return app
在app.py中写入:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = "A.L.Kun" __file__ = "app.py" __time__ = "2022/9/11 19:17" from App import create_app from flask_script import Manager app = create_app("develop") manage = Manager(app) if __name__ == '__main__': manage.run() 然后,我们的基本框架就搭建好了,就将我们写好的模型映射到数据库中
3、 映射
在项目的根目录运行这个代码:
flask db init # 初始化操作 flask db migrate # 迁移操作 flask db upgrade # 更新操作
然后,我们的数据表就更新完成了
三、 增删改查
首先,我们先不考虑如何监控我们的QQ消息,通过消息来操控我们的数据库,我们先来实现通过代码直接对权限数据的修改
为了方便,我们就直接在script.py中写入我们的函数,可以根据文章的顺序来添加
1、 群管理
1.1 增加群
from flask import current_app from App.models import Group, GroupAuthority from base64 import b64decode # 对中文进行编码 async def add(gid, nick): # 传入QQ群号和qq群的昵称就可以添加了 session = current_app.config["db"].session data = session.query(Group).filter_by(qqId=gid).first() # 首先查看一下数据库中是否收录了这个群 if data is None: # 如果没有则添加,同时,也检查其是否有逻辑删除 g = Group(nick, gid) # 创建一个群 g.group2auth = [GroupAuthority()] # 给群赋予默认的权限 session.add(g) # 添加到数据库中 session.commit() # 提交事务 return { "status": 200 } # 返回状态码 # 如果群存在,直接修改群名,以及使其可以检测到 data.isDetect = True data.name = nick session.commit() return { "status": 300, "error": "该群号已存在!", } 1.2 删除群
async def delete(gid): db = current_app.config["db"] session = db.session group = session.query(Group).filter(db.and_(Group.qqId == gid, Group.isDetect)).first() if group: group.isDetect = False session.commit() return "删除成功" return "该群不存在"
这里使用的是逻辑删的删除,使得程序无法访问到该数据,即代表删除效果,同时,数据也保存了下来
1.3 展示功能
async def show(): session = current_app.config["db"].session data = [f"|_ {b64decode(i.name).decode()} _|_ {i.qqId} _|_ {'yes' if i.isDetect else 'no'} _|" for i in session.query(Group).all()] return "\n".join(data) 2、 权限管理
2.1 展示权限
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- golang RPC包原理和使用详细介绍_Golang_
- Golang常用包使用介绍_Golang_
- Golang安装和使用protocol-buffer流程介绍_Golang_
- Go+Redis实现延迟队列实操_Golang_
- Golang操作命令行的几种方式总结_Golang_
- GO CountMinSketch计数器(布隆过滤器思想的近似计数器)_Golang_
- Golang实现解析JSON的三种方法总结_Golang_
- 利用Go语言实现轻量级OpenLdap弱密码检测工具_Golang_
- Redis BloomFilter布隆过滤器原理与实现_Golang_
- Golang自旋锁的相关介绍_Golang_
点击排行
本栏推荐
 
 
                                
                                                         
                                
                                                         
                                
                                                         
    