测试管理 flask 测试管理平台中集成百度脑图

Jerry li · 2018年12月14日 · 最后由 zhn3431223-github 回复于 2019年07月04日 · 4401 次阅读

前言

在调研如何在测试平台中管理测试点拆分列表,相中了百度脑图的开源框架 https://github.com/fex-team/kityminder-editor ,于是尝试集成到我们的测试平台中。 以下是集成过程中一些关键点记录。

思路:

经过分析,大致需要以下功能:

  • 1. 脑图管理模块。基本的增删改查功能。 其中重点是需要将脑图的内容保存到数据库和读取展现。
  • 2. 复制功能。 便于将已存在的旧版测试点列表复制为新的版本进行编辑。

开发过程:

1. 在数据库中设计新表,用以保存脑图内容。

设计字段包括: id,module,name,description,content 。

2. 在 flask 中分别增加相关的新增、编辑、查询、删除、复制等 html 页面、view 和 js 方法。

这部分是常规的功能,只需要在原有其他模块的基础上复制、修改即可。
重点: 脑图的基本信息编辑和脑图内容编辑分开在两个页面处理。 其中脑图基本信息(名称、备注等)是 flask 新开发的页面,而脑图内容则使用 kityminder-editor 提供的页面。

3. 脑图内容编辑展示:

直接使用 kityminder-editor 提供的页面。 在安装好 kityminder-editor 相关依赖后, 需要做的开发是脑图内容(json 格式的数据)的导出和导入。

3.1 数据导出保存:

kityminder-editor 提供了对应的数据导出方法: editor.minder.exportJson() 。 因此,只需要在页面中加一个 保存 按钮,并将导出的内容保存到数据库即可。

index.html 文件中 新增保存按钮:

<button id="exportData" onclick="exportData()">保存</button>

js 中的对应保存方法:

function exportData(){
    var jsonData=editor.minder.exportJson();
    jsonData = JSON.stringify(jsonData);
    console.log(jsonData);
    var minder_id = document.getElementById('minderId').value;
    $.ajax(
    {
        url: "/save_test_minder_content.json",
        data:{"content":jsonData,"id":minder_id},
        type: "post",
        dataType:"json",
        beforeSend:function()
        {
        return true;
        },
        success:function(data)
        {
        if(data)
        {
            // 解析json数据
            var data = data;
            if(data.code==200){
            alert('success!');
            // alert
            }else{
            alert('code is :'+data.code+' and message is :'+data.msg);
            }
        }

        else
        {
        alert('操作失败');
        }
        },
        error:function()
        {
        alert('请求出错');
        },
        complete:function()
        {
        // $('#tips').hide();
        }
});

}

3.2 脑图数据导入:

kityminder-editor 中 同样提供了数据导入方法: editor.minder.importJson(json),所以第一选择是使用该方法来导入从数据库中读取的脑图内容。

遇到的问题:

尝试后发现, kityminder-editor 提供的页面中会自动加载上一次保存的内容, 无法自动触发 editor.minder.importJson(json) 方法来导入新数据。

解决过程:

研究 kityminder-editor 相关代码发现,在页面中编辑脑图内容时,会自动将脑图内容保存到 localStorage 中: localStorage.__dev_minder_content 。 因此,如果要每次打开不同的脑图数据都自动加载新的数据内容,只需要在页面初始化时替换掉 localStorage 中的对应值即可。

对应 js 代码:

if (data.content!='{}'){    //  如果脑图内容不为空
                if (refreshJson==1){  // 如果是手动刷新, 则直接调用  importJson 方法导入新数据
                editor.minder.importJson(JSON.parse(data.content));
                alert('刷新成功!');
                }else {
                    window.localStorage.__dev_minder_content=data.content;   // 如果是新打开页面,将查询内容直接替换掉 localstorage 中保存的历史记录
                    }
            }else{
                localStorage.removeItem('__dev_minder_content');     // 如果新查询的脑图内容为空, 则直接删除 localstorage 的key ,重新初始化脑图内容
                if (refreshJson==1){
                   alert('刷新成功!');
                }
            }

集成效果:

查询页:

新增脑图信息页:

脑图内容编辑:

共收到 15 条回复 时间 点赞

能不能共享下修改好的 index.html 和 js~我改了下好像不太成功。。。

这个可以多人协作编辑吗?

bauul 回复

目前只是做了数据加载和保存,暂时不支持多人协作

Jerry li 回复

加了按钮和输入框后,数据怎么保存到数据库中啊?
能不能贴下 save_test_minder_content.json 的代码~~谢谢了

zlp 回复

后台的保存吗?

@mod.route('/save_test_minder_content.json', methods=['POST', 'GET'])
@user.authorize
def save_test_minder_content():
    log.log().logger.info(request)
    if request.method == 'GET':
        log.log().logger.info('post')
        return redirect("/test_minders")
    if request.method == 'POST':
        info = request.values
        log.log().logger.info('info :%s' %info)
        id = viewutil.getInfoAttribute(info,'id')
        content = viewutil.getInfoAttribute(info,'content')
        minder_id = ''
        if content == '':
            message =  '必填字段不得为空!'
            code = 500
        else:
            test_minder_manage.test_minder_manage().update_test_minder(id=id, fieldlist=['content'],valueList=[content])
            message = 'success!'
            code = 200
        result = jsonify({'code': code, 'msg': message})
        log.log().logger.info(result)
        log.log().logger.info('code is : %s'%code)
        return result
zlp 回复

大致的流程:

  • js 将界面上的内容通过 ajax 发送到后台接口。
  • 后台 view 里接收到对应数据后,保存到数据库。
Jerry li 回复

嗯,有点不太清楚,这样做的话 ajax 会向默认的 3000 端口请求这个/save_test_minder_content 接口
后台服务是在另外的端口 8000。。。怎么做到前后台在同个端口起服务额= =我直接向 8000 这个端口请求的话就报下面的错误,好像是 ajax 不能跨域啥的

Jerry li 回复

我用的后台框架是 django 的,flask 的@mod.route是何作用啊?

zlp 回复

你可以研究下 ajax 如何跨域
我是直接放在 flask 里面的,没有启动新的服务,所以没有跨域的问题

zlp 回复

mod route 就是控制路由

@mod.route('/save_test_minder_content.json', methods=['POST', 'GET'])
@user.authorize
def save_test_minder_content():

意思你访问 /save_test_minder_content.json ,就会跑到 save_test_minder_content() 方法里

Jerry li 回复

谢谢回答~~~
比较好奇你是怎么起的服务,我是用 grunt dev 起的脑图的前台,然后 django 起的后台。
flask 能把这两个合在一起?

zlp 回复

最终编译出来就是一些 html 、js、 css 文件啊, flask 本身就是一个容器,所以直接把这些文件放到 flask 的静态文件目录里调用就可以了

Jerry li 回复

明白了~~~3Q

脑图集成部分代码已提交:
https://github.com/jerrylizilong/autotest_platform

使用说明:

  1. 更新源码
  2. 数据库中执行以下命令新增表: https://github.com/jerrylizilong/autotest_platform/blob/master/init.sql 的 test_minder 表:

这个 minderId 在页面上没有找到呢!

16楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册