一个基于django框架的SQL 审核系统二次开发

来源:这里教程网 时间:2026-03-01 12:18:58 作者:

发现自己最近已经焦头烂额,每天在各种繁杂的事务中脑袋已经混乱不堪了。凌晨5点30分,失眠,把我在搞的一个SQL 审核的项目理一理,准备新版本更新上线后就不管了。我的大脑容量真的有限了。 这是一个基于github上 https://github.com/hhyo/Archery  的一个依赖 Inception平台 SQL审核系统,我比较喜欢他基于bootstrap 前端的简洁风格。 以下是它所用到的技术依赖:

框架

  • Django
  • Bootstrap
  • jQuery

    前端组件

  • 菜单栏  metisMenu
  • 主题  sb-admin-2
  • 编辑器  ace
  • SQL美化  sql-formatter
  • 表格  bootstrap-table
  • 表格编辑  bootstrap-editable
  • 下拉菜单  bootstrap-select
  • 文件上传  bootstrap-fileinput
  • 时间选择  bootstrap-datetimepicker
  • 日期选择  daterangepicker
  • 开关  bootstrap-switch
  • Markdown展示  marked

    服务端

  • 队列任务  django-q
  • MySQL Connector  mysqlclient-python
  • MsSQL Connector  pyodbc
  • Redis Connector  redis-py
  • PostgreSQL Connector  psycopg2
  • Oracle Connector  cx_Oracle
  • SQL解析/切分/类型判断  sqlparse
  • MySQL Binlog解析/回滚  python-mysql-replication
  • LDAP  django-auth-ldap
  • 序列化  simplejson
  • 时间处理  python-dateutil

    功能依赖

  • 可视化  pyecharts
  • MySQL审核/执行/备份  goInception | inception
  • 数据库审核  Themis
  • MySQL索引优化  SQLAdvisor
  • SQL优化/压缩  SOAR
  • Binlog2SQL  binlog2sql
  • 表结构同步  SchemaSync
  • 慢日志解析展示  pt-query-digest | aquila_v2
  • 大表DDL  gh-ost | pt-online-schema-change
  • MyBatis XML解析  mybatis-mapper2sql
  • RDS管理  aliyun-openapi-python-sdk

    而我的二次开发主要做什么呢? 我从去年就开始在工作穿插着了解这个程序的结构,光在安装调试已经花了不少时间。后来决定推广使用,在关于账号登录这块就不好搞了,该审核系统已经加入LDAP 域登录,公司的域控刚好才刚开始推广,我们大部分的开发还不习惯于域,而公司有自己的单点登录,于是我不得不在单点登录上进行改造,公司单点登录已经提供了接口,而我的认证步骤主要如下:

      访问审核系统后判断未登录便转入单点登录登录接口页面,此时附上自身在单点登录中APPID 

      在单点登录系统上用统一账号登录通过后,单点登录产生token信息跳转回SQL审核系统

      于是SQL 审核系统在接收到token及其他相关信息后再进行判断认证。具体代码片段如下:

    #cwd
    # 登录页面
    def login(request):
        token = request.GET.get('token')
        logouturl = SSO_LOGOUT
        if request.user and request.user.is_authenticated:
            return HttpResponseRedirect('/')
        elif  token is None :
            return HttpResponseRedirect(SSO_INDEX)
        else:
            url = SSO_TOKEN + urllib.parse.quote(token)
            req = urllib.request.Request(url)
            res_data = urllib.request.urlopen(req)
            res = json.loads(res_data.read())
            if res.get('success'):
                username = res.get('loginid')
                userid = res.get('userid')
                auth =   svjAuth(request)
                tokenpwd = auth.getUser(username)
                if tokenpwd['status'] == 0:
                    tokenpwd = tokenpwd['data']
                    result = auth.authenticate(username, tokenpwd)
                    if result['status'] == 0:
                        Users.objects.filter(username=username).update(ssouserid=userid)
                        return HttpResponseRedirect("/")
                elif tokenpwd['status'] == 1:
                    Users.objects.filter(username=username).update(ssouserid=userid)
                    data="用户存在,请联系管理员申请tokenpwdkey"
                    return render(request, 'login.html',{"data":data, "url":logouturl})
                elif tokenpwd['status'] == 2:
                    data = "您还不是SQL审核系统用户,请联系管理员申请注册"
                    return render(request, 'login.html',{"data":data, "url":logouturl})
            else:
                data = "您还不是SQL审核系统用户,请联系管理员申请注册HH"
                return render(request, 'login.html',{"data":data, "url":logouturl})
    

    这里要提一下的是关于在单点登录验证通过后在SQL审核系统需要进行认证,当时想直接绕过django的认证模块直接登录,研究了很长一段时间都还是无法通过,最终使用了比较土的办法来进行认证。 之后,便是工作通知这一模块,archery已经集成邮件,钉钉机器人通知功能,而我需要对其进行改造的是将通知转到公司自己的钉钉工作通知模块,这一模块其实也不是很复杂,同样是调用既有的接口即可,主要代码片段:

        @staticmethod
        def send_oading(url, content, userlist):
            """
            发送oa钉钉消息
            :param url:
            :param content:
            :return:
            """
            head = {"Content-Type": "application/json; charset=UTF-8", 'Connection': 'close'}
            data = {
                "Appid": DING_APPID,
                "Message": "{}".format(content),
                "UserList": "{}".format(userlist),
            }
            #logger.debug(data)
            r = requests.post(url=url, json=data, headers=head)
            r_json = r.json()
            if r_json['Code'] == 200:
               logger.debug('oa钉钉推送成功')
            else:
                logger.error("""oa钉钉推送失败
    错误码:{}
    返回错误信息:{}
    请求url:{}
    请求data:{}""".format(r_json['Code'], r_json['ErrorMessage'], url, data))
    

    之后,因为要走工单话,就必须结合公司的OA流程,于是乎,只能在生成SQL审核工单时将相应信息推送到OA系统中,此时同样是调用OA中发起工单的接口,这里会根据OA自身的需求调用好几个接口,这一阶段开发花费了不少时间。 完成OA工单模块集成之后我们的系统开始推广使用了。 在用是这样的: 在使用一段时间后发现github上已经更新了好几个版本,使用了不少新的功能比如 goInception,加上我发现现有的在提交工单时选择数据库管理起来比较麻烦。原来是通过用户-用户组-关联数据库实例-关联实例所在的库。这样就需要每个小部门组都分配一个数据库实例权限了,我们的数据库数量比较多,所以维护起来比较麻烦。 于是我进行了改造,改成了用户-关联数据库的模式,用户通过权限申请来拥有自己的数据库。 顺便换了个  前端模板,个人表示前端模板这些css,js这些比后端python难搞了好多,这个花费了我不少时间,因为期间我尝试换过好几个模板。新的前端模板,使用了iframe,这里遇到过不少坑,比如刷新保留当前页面问题,需要存储iframe的src路径等 数据库权限申请模块:   SQL 上线提交: 另外,写了段定时去检查定时执行任务的代码,主要的二次开发就是这些了,更多的是希望改造得更加贴合我们的使用习惯,而整个基于核心inception模块还未涉猎,这部分相对比较完善了。详细信息可以去github上了解。 感谢github上前辈们的无私奉献

  • 相关推荐