• Django实现自动发布(2视图-服务版本查找和新增)


    前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查。先在服务的管理页面做一个入口,如下图:

    需要在上一步的服务管理页面增加按钮、按钮方法,点击按钮跳转时要打开一个新的页面,所以还要增加对应的页面视图。

    页面方法

    templates/microservice/service.html 的标签<script type="text/html" id="barDemo">后面 增加内容

      <a class="layui-btn layui-btn-xs " lay-event="version">版本管理</a>
    

    相应的点击方法也加到工具条事件:

    if (layEvent === 'version') {
      handleShowVersion(obj);
    }
    
    function handleShowVersion(obj){
      var url = '{% url "page_service_versions" 0 %}';
      url = url.replace('0', obj.data.id);
      layer.open({
        type: 2, // 0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        content: url,    // 设置跳转的url,跳转到对应的页面
        area: ["80%", "100%"],
        shadeClose: true, // 点击弹出层的shade可关闭弹出层
      })
    }
    

    页面视图

    增加一个文件 templates/microservice/version.html

    class ServiceVersionPageView(generic.DetailView):
        template_name = 'microservice/version.html'
        model = MicroService
        pk_url_kwarg = 'service_id'
    

    以及页面视图对应的url:

      url(r'^service/(?P<service_id>[0-9]+)/versions/$', views.ServiceVersionPageView.as_view(), name='page_service_versions'),
    
    

    点击页面按钮即可弹出一个新的窗口,不过目前的页面没有内容,现在就把版本管理添加到页面。

    版本管理

    查询

    版本的查询和服务类似,就直接贴代码了:

    class ServiceVersionApi(generic.View):
        def get(self, request, service_id):
            query = request.GET
            page = query.get('page', 1)
            limit = query.get('limit', 20)
    
            try:
                service = MicroService.objects.get(pk=service_id)
            except MicroService.DoesNotExist:
                return JsonResponse({'msg': '资源不存在', status=404)
    
            versions = MicroServiceVersion.objects.filter(microservice=service)
            paginator = Paginator(versions, limit)
            pdata = paginator.page(page)
            data = [{
                'id': item.id,
                'name': item.microservice.name,
                'language': item.microservice.language,
                'description': item.description,
                'version': item.version,
                'status': item.get_status_display(),
                'created_by': item.created_by.username,
                'created': item.created,
            } for item in pdata]
    
            return JsonResponse({
              'data': data,
              'count': versions.count(),
              'code': 0,
            })
    

    相应的url:

    url(r'^microservice/(?P<service_id>[0-9]+)/versions/$', views.ServiceVersionApi.as_view(),
            name='api_microservice_versions'),
    

    创建

    由于我们是通过git来创建版本,所以版本的创建是在后台完成,我们也可以在页面触发构建任务来创建版本
    页面触发时,我们唯一要填的参数就是分支,不填则默认master

    这里有个小技巧: 先创建一个版本号为当前时间戳的版本,传递给任务作为参数,在收到回调后更新任务状态和版本号

        def post(self, request, service_id):
            ref = request.POST.get('branch', 'master').strip()
            desc = request.POST.get('description', '').strip()
            try:
                service = MicroService.objects.get(pk=service_id)
            except MicroService.DoesNotExist:
                return JsonResponse({'msg': '资源不存在'}, status=404)
    
            version = MicroServiceVersion.objects.create(
                microservice=service,
                version='building-' + str(time.time()), # 当前时间戳
                created_by=request.user,
                description=desc,
                ref=ref
            )
    
            build_params = {
                'variables[SERVICE_ID]': service.id,
                'variables[VERSION_ID]': version.id,
                'variables[SERVICE_NAME]': service.name,
                'variables[USERNAME]': request.user.username,
            }
            try:
                r = requests.post(service.build_url, data=build_params, timeout=10)
            except requests.exceptions.Timeout:
                return JsonResponse({'msg': '调用git 超时'}, status=417)
    
            if r.status_code >= 200 and r.status_code < 300:
                rdata = r.json()
                return JsonResponse(rdata, status=200)
            return JsonResponse({'msg': '创建任务失败{}'.format(r.content)})
    

    相关的页面和js代码比较多,放到 这里

  • 相关阅读:
    [洛谷P4725]【模板】多项式对数函数
    [洛谷P4841]城市规划
    [洛谷P4346][CERC2015]ASCII Addition
    [洛谷P3978][TJOI2015]概率论
    [洛谷P4656][CEOI2017]Palindromic Partitions
    [洛谷P4889]kls与flag
    [洛谷P3810]【模板】三维偏序(陌上花开)
    [洛谷P2613]【模板】有理数取余
    [bzoj4945][Noi2017]游戏
    [洛谷P4151][WC2011]最大XOR和路径
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/12008195.html
Copyright © 2020-2023  润新知