Python入门自学进阶-Web框架——33、瀑布流布局与组合查询

2023-05-16

一、瀑布流,是指页面布局中,在显示很多图片时,图片及文字大小不相同,导致页面排版不美观

如上图,右边的布局,因为第一行第一张图片过长,第二行的第一张被挤到第二列了。示例:

def flow(request):
    user_list = [
        {'name': '张1三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦死打法撒飞洒的飞洒烦死哒防守打法噶三群老油条烦死哒范德萨分散发士大夫士大夫是打发发防守打法烦死哒防守打法噶第三方三'},
        {'name': '张2三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油'},
        {'name': '张3三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦分打发发防守打法撒飞洒的飞洒烦死哒防守打法噶第三'},
        {'name': '张4三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦死哒范德萨分散发士大夫士大夫是打发发防守打法烦死哒防守打法噶第三方三'},
        {'name': '张5三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦死哒范德萨分散发士大夫士大夫是打发发防守打法'},
        {'name': '张6三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦死哒范洒的飞洒烦死哒防守打法噶第三方三'},
        {'name': '张7三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一群老油条烦死哒范德萨分散发士大夫士大夫是打发发防守打噶第三方三'},
        {'name': '张8三', 'src': '/static/image/1.jpg', 'company': '特事特办中国特色一公司','summary': '一法撒飞洒的飞洒烦死哒防守打法噶第三方三'},
    ]
    return render(request,"flow.html",{'user_list':user_list})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container{
            width: 900px;
            margin: 0 auto;
        }
        .container .item{
            width: 300px;
            float: left;
        }
        .container .item img{
            width: 200px;
            height: 180px;
        }
        .container .item p{
            padding-left: 10px;
            padding-right: 40px;
        }
    </style>
</head>
<body>
    <div class="container">
        {% for row in user_list %}
            <div class="item">
                <img src="{{ row.src }}">
                <p>{{ row.name }}</p>
                <p>{{ row.summary }}</p>
            </div>
        {% endfor %}
    </div>
</body>
</html>

此时显示如下:

很不美观,解决方法,是先将页面分为三个div,让后让图片依次在三个div中排放。

纯静态HTML实现:

<div class="container">
        <div style="width: 900px;margin: 0 auto;">
            <div style="width: 280px;float: left;">

                <div class="item">
                    <img src="{{ user_list.0.src }}">
                    <p>{{ user_list.0.name }}1</p>
                    <p>{{ user_list.0.summary }}<br>fdsafdsafd<br>safsdafsd<br>afsdaff<br>assdf</p>
                </div>
                <div class="item">
                    <img src="{{ user_list.0.src }}">
                    <p>{{ user_list.0.name }}4</p>
                    <p>{{ user_list.0.summary }}<br>fdsafdsafd<br>safsdafsd<br>afsdaff<br>assdf</p>
                </div>
            </div>
            <div style="width: 280px;float: left;">
                <div class="item">
                    <img src="{{ user_list.0.src }}">
                    <p>{{ user_list.0.name }}2</p>
                    <p>{{ user_list.0.summary }}</p>
                </div>
                <div class="item">
                    <img src="{{ user_list.0.src }}">
                    <p>{{ user_list.0.name }}5</p>
                    <p>{{ user_list.0.summary }}<br>fdsafdsafd<br>safsdafsd<br>afsdaff<br>assdf</p>
                </div>
            </div>
            <div style="width: 280px;float: left;">
                <div class="item">
                    <img src="{{ user_list.0.src }}">
                    <p>{{ user_list.0.name }}3</p>
                    <p>{{ user_list.0.summary }}</p>
                </div>
            </div>

        </div>
    </div>

这就实现了瀑布流,使用模板渲染:最初想法如下

       <div style="width: 900px;margin: 0 auto;">
            {%  for row in user_list %}
            <div style="width: 300px;float: left;">
                {% if forloop.counter%3 == 1 %}   {# 这里出错 #}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            </div>
            <div style="width: 300px;float: left;">
                {% if forloop.counter%3 == 2 %}   {# 这里出错 #}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            </div>
            <div style="width: 300px;float: left;">
                {% if forloop.counter%3 == 0 %}   {# 这里出错 #}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            </div>
            {% endfor %}
        </div>

取模操作%无法在模板中使用,因为使用到了if语句,自定义标签不能用在模板if语句中,所以只能考虑使用过滤器filter:

<div class="container">
            <div style="width: 300px;float: left">
            {%  for row in user_list %}
                {% if forloop.counter|mymod:'3,1' %}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}{{ forloop.counter }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            {% endfor %}
            </div>
            <div style="width: 300px;float: left;">
            {%  for row in user_list %}
                {% if forloop.counter|mymod:'3,2' %}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}{{ forloop.counter }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            {% endfor %}
            </div>
            <div style="width: 300px;float: left;">
            {%  for row in user_list %}
                {% if forloop.counter|mymod:'3,0' %}
                <div class="item">
                    <img src="{{ row.src }}">
                    <p>{{ row.name }}{{ forloop.counter }}</p>
                    <p>{{ row.summary }}</p>
                </div>
                {% endif %}
            {% endfor %}
            </div>
        </div>
# 过滤器
from django import template

register = template.Library()

@register.filter
def mymod(v1,v2):
    n1,n2 = v2.split(',')

    if v1%int(n1) == int(n2):
        return True
    return False

以上是模板渲染,使用了多次的循环,效率不是很好。

使用JS实现,使用Ajax发送一个请求,得到数据,然后在js中进行余数的判断和前端的生成。

二、组合搜索/组合筛选

简单的组合搜索如下图:

建立相应的model:

from django.db import models
# Create your models here.

class Level(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Category(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name

class Video(models.Model):
    lv = models.ForeignKey(Level,on_delete=models.DO_NOTHING)
    cg = models.ForeignKey(Category,on_delete=models.DO_NOTHING)

    title = models.CharField(verbose_name="标题",max_length=64)
    summary = models.CharField(verbose_name="简介",max_length=128)
    img = models.ImageField(verbose_name="图片",upload_to="./static/images/video")
    href = models.CharField(verbose_name="视频地址",max_length=256)

    create_date = models.DateTimeField(auto_now_add=True)

创建路由项,这里查询的条件组合在路由项中,如下:

path('video-<int:cg_id>-<int:lv_id>.html',views.video,name='video_alais'),

cg_id代表种类的id,lv_id代表级别的id

对应的视图函数:

def video(req,*args,**kwargs):
    condition = {}
    for k,v in kwargs.items():
        if v != 0:
            condition[k] = v
    print(condition)
    category_list = models.Category.objects.all()
    level_list = models.Level.objects.all()

    result = models.Video.objects.filter(**condition)
    return  render(req,'video.html',{
        'category_list':category_list,
        'level_list':level_list,
        'result':result,
        'arg_dict':kwargs,
    })

前端模板文件video.html:

{% load tagandfilter %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .filter a {
            display: inline-block;
            margin: 5px;
            padding: 3px 5px;
        }
        .filter a.active{
            background-color: brown;
            color: white;
        }
    </style>
</head>
<body>
    <h1>筛选条件</h1>
    <div class="filter">
        <div>
            {% total_tag arg_dict "cg_id" %}:
            {% for item in category_list %}
                {% categroy_tag item arg_dict %}
            {% endfor %}
        </div>
        <div>
            {% total_tag arg_dict "lv_id" %}:
            {% for item in level_list %}
                {% level_tag item arg_dict %}
            {% endfor %}
        </div>
    </div>

    <h1>查询结果</h1>
    <div class="content">
        {% for item in result %}
        <div style="width:180px;height:200px;float: left">
            <img width="150px" height="200px" src="{{ item.img }}">
            <p>{{ item.title }}</p>
            <p>{{ item.summary }}</p>
            <p>{{ item.create_date }}</p>
        </div>
        {% endfor %}
    </div>
</body>
</html>

模板中使用了自定义标签:

@register.simple_tag
def categroy_tag(obj,arg_dict):
    '''
    生成种类的A标签
    :param obj:
    :param arg_dict:
    :return:
    '''

    url = reverse("video_alais",kwargs={'cg_id':obj.id,'lv_id':arg_dict.get('lv_id')})

    if obj.id == arg_dict.get('cg_id'):
        tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)
    else:
        tag = "<a  href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)

@register.simple_tag
def level_tag(obj,arg_dict):
    '''
    生成级别的A标签
    :param obj:
    :param arg_dict:
    :return:
    '''
    url = reverse("video_alais", kwargs={'lv_id': obj.id, 'cg_id': arg_dict.get('cg_id')})
    if obj.id == arg_dict.get('lv_id'):
        tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)
    else:
        tag = "<a  href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)

@register.simple_tag
def total_tag(arg_dict,key):
    if key == 'cg_id':
        url = reverse("video_alais", kwargs={'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
    elif key == 'lv_id':
        url = reverse("video_alais", kwargs={'lv_id': 0, 'cg_id': arg_dict.get('cg_id')})
    else:
        url = ""
    tag = "<a  href='%s'>全部:</a>" %(url)
    return mark_safe(tag)

增加一个关联表:Direction,与种类表形成多对多关系:

class Direction(models.Model):
    name = models.CharField(max_length=32)
    d_2_c = models.ManyToManyField("Category")

使分类根据方向动态变化:大体如下

因为多了一个方向的选择项,路由项修改如下:

path('video2-<int:dr_id>-<int:cg_id>-<int:lv_id>.html',views.video2,name='video_alais2'),

视图函数views.video2:

def video2(req,*args,**kwargs):
    condition = {}
    dr_id = kwargs.get('dr_id')
    cg_id = kwargs.get('cg_id')
    lv_id = kwargs.get("lv_id")
    # 可能的请求:
    # 0-0-0.html 方向、分类、级别都是全部
    # 1-0-0.html 方向选择了1,分类、级别是全部,此时分类应该根据方向列出有哪些分类
    # 1-2-0.HTML 方向选择了1,分类选择了2,级别全部;分类先要根据方向列出可能的分类,在根据分类选择video
    #            还有一种可能,方向选择了1,而1方向对应的分类没有2,此时应该处理成分类为全部,即0

    direction_list = models.Direction.objects. all()
    level_list = models.Level.objects.all()

    if dr_id == 0:
        # 未选择方向
        category_list = models.Category.objects.all()
        if cg_id == 0:
            pass   # 未选择分类 - 未选择方向
        else:
            # 选择了分类 - 未选择方向
            models.Video.objects.filter(cg_id = cg_id)
            condition['cg_id'] = cg_id
    else:
        # 选择了方向,将方向对应的分类项查询出来,对象的集合,是QuerySet
        category_list = models.Category.objects.filter(direction=dr_id)
        # 选取其中的id字段对象集合
        v = category_list.values_list('id')
        # print(v.query)  # 打印出查询的SQL语句
        cg_id_list = list(zip(*v))[0]  # id字段集合形成元组,即(1,2,3)的样子
        if cg_id == 0:
            # 未选择分类 - 选择了方向
            # 这种情况下,选择的条件就是选择全部分类id在cg_id_list元组中的所有video
            # 即在此方向下的所有分类都要查询出来
            condition['cg_id__in'] = cg_id_list
        else:
            # 选择了分类,并且分类在cg_id_list中
            if cg_id in cg_id_list:
                condition['cg_id'] = cg_id
            else:  # 选择了分类,并且分类不在cg_id_list中,这时就选择全部cg_id_list的全部
                condition['cg_id__in'] = cg_id_list
                kwargs['cg_id'] = 0

    if lv_id != 0:  # 级别是单独的
        condition['lv_id'] = lv_id

    result = models.Video.objects.filter(**condition)  # 根据条件最终查询的video结果集合

    return  render(req,'video2.html',{
        'direction_list':direction_list,
        'category_list':category_list,
        'level_list':level_list,
        'result':result,
        'arg_dict':kwargs,
    })

前端模板video2.html

{% load tagandfilter %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .filter a {
            display: inline-block;
            margin: 5px;
            padding: 3px 5px;
        }
        .filter a.active{
            background-color: brown;
            color: white;
        }
    </style>
</head>
<body>
    <h1>筛选条件</h1>
    <div class="filter">
        <div>
            {% total_tag_2 arg_dict "dr_id" %}
            {% for item in direction_list %}
               <!-- if kwargs.dr_id = item.id
                    加入样式
                else:
                    没有样式
                -->
                {% dr_tag item arg_dict %}
            {% endfor %}
        </div>
        <div>
            {% total_tag_2 arg_dict "cg_id" %}
            {% for item in category_list %}
            {% cg_tag item arg_dict %}
            {% endfor %}
        </div>
        <div>
            {% total_tag_2 arg_dict "lv_id" %}
            {% for item in level_list %}
                {% lv_tag item arg_dict %}
            {% endfor %}
        </div>
    </div>

    <h1>查询结果</h1>
    <div class="content">
        {% for item in result %}
        <div style="width:180px;height:200px;float: left">
            <img width="150px" height="200px" src="{{ item.img }}">
            <p>{{ item.title }}</p>
            <p>{{ item.summary }}</p>
            <p>{{ item.create_date }}</p>
        </div>
        {% endfor %}
    </div>
</body>
</html>

自定义的标签:

@register.simple_tag
def dr_tag(obj,arg_dict):
    '''
    生成A标签
    :param obj:
    :param arg_dict:
    :return:
    '''
    url = reverse('video_alais2',kwargs={'dr_id':obj.id,'cg_id':arg_dict.get('cg_id'),'lv_id':arg_dict.get('lv_id')})
    if obj.id == arg_dict.get('dr_id'):
        tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)
    else:
        tag = "<a  href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)

@register.simple_tag
def cg_tag(obj,arg_dict):
    '''
    生成A标签
    :param obj:
    :param arg_dict:
    :return:
    '''
    url = reverse('video_alais2',kwargs={'dr_id':arg_dict.get('dr_id'),'cg_id':obj.id,'lv_id':arg_dict.get('lv_id')})
    if obj.id == arg_dict.get('cg_id'):
        tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)
    else:
        tag = "<a  href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)

@register.simple_tag
def lv_tag(obj,arg_dict):
    '''
    生成A标签
    :param obj:
    :param arg_dict:
    :return:
    '''
    url = reverse('video_alais2',kwargs={'dr_id':arg_dict.get('dr_id'),'cg_id':arg_dict.get('cg_id'),'lv_id':obj.id})
    if obj.id == arg_dict.get('lv_id'):
        tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)
    else:
        tag = "<a  href='%s'>%s</a>" %(url,obj.name)
        return mark_safe(tag)

@register.simple_tag
def total_tag_2(arg_dict,key):
    if key == 'dr_id':
        url = reverse("video_alais2", kwargs={'dr_id':0,'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
    elif key == 'cg_id':
        url = reverse("video_alais2", kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
    elif key == 'lv_id':
        url = reverse("video_alais2", kwargs={'dr_id':arg_dict.get('dr_id'),'lv_id': 0, 'cg_id': arg_dict.get('cg_id')})
    else:
        url = ""
    if arg_dict.get(key) == 0:
        tag = "<a  class='active' href='%s'>全部:</a>" %(url,)
    else:
        tag = "<a  href='%s'>全部:</a>" % (url,)
    return mark_safe(tag)

主要的环节是逻辑上根据方向、分类、级别的选择,动态显示各个项,然后在综合条件下选择出video。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python入门自学进阶-Web框架——33、瀑布流布局与组合查询 的相关文章

  • 【ESP32_FreeRTOS篇】

    FreeRTOS 是一款 开源免费 的实时操作系统 xff0c 遵循的是 GPLv2 43 的许可协议 这里说 到的开源 xff0c 指的是你可以免费得获取到 FreeRTOS 的源代码 xff0c 且当你的产品使用了 FreeRTOS 且
  • 通过xmanager连接linux远程主机桌面

    1 效果图 xff1a 远程linux桌面版主机 xff0c 此处是虚拟机 xff1a 使用xmanager xbrowser 连接后的界面 xff1a 2 使用方法 xff1a linux服务器端配置修改 xff1a a 修改gnome配
  • setTimeout()和setInterval()详解

    JavaScript是单线程语言 xff0c 但是它可以通过设置超时值和间歇时间值来指定代码在特定的时刻执行 超时值是指在指定时间之后执行代码 xff0c 间歇时间值是指每隔指定的时间就执行一次代码 超时调用 超时调用使用window对象的
  • Centos 7.6安装Xfce+VNC Server

    Centos 7 6安装Xfce 43 VNC Server 工作环境安装xface安装 VNC Server在云服务器控制台中设置安全组规则使用VNC Viewer连接云服务器 工作环境 华为云服务器 操作系统 xff1a CentOS
  • C++和C语言的区别是什么?

    首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是对C语言的扩充和延伸 xff0c 并且对C语言提供后向兼容的能力 C 43 43 这个词在中国大陆的程序员圈子中通常被读做 C加加 xff0c 而西
  • ubuntu18.0.4安装pip3及虚拟环境virtualenv详细教程

    1 ubuntu安装pip3 该命令是修复安装及补全那些缺少的软件 xff1a sudo apt get f install 安装pip3 xff1a sudo apt get install python3 pip升级pip3 xff1a
  • 什么是子网掩码,如何判断两个IP是不是同一网段

    1 xff1a 什么是子网掩码 xff1f 子网掩码不能单独存在 xff0c 它必须结合IP地址一起使用 子网掩码只有一个作用 xff0c 就是将某个IP地址划分成网络地址和主机地址两部分 说的通俗的话 xff0c 就是用来分割子网和区分那
  • 利用esp-8266实现wifi攻击

    0x00 前言 之前在b站上看到这个wifi模块的攻击视频感觉挺有意思 xff0c 就在某宝上入了一个拿回来玩玩 0x01 外观 转接头需要自己另外买 0x03 编译程序 https anky cc esp8266 deauther wif
  • 如何从 JavaScript 对象中删除属性?

    问题描述 xff1a 给定一个对象 xff1a let myObject span class token operator 61 span span class token punctuation span span class toke
  • 在 Git 中推送提交时消息“src refspec master does not match any”

    问 xff1a 我克隆我的存储库 xff1a git clone ssh span class token operator span span class token operator span span class token oper
  • Qt编译、链接和运行参数的设置

    Qt编译 链接和运行参数的设置 Qt笔记 使用 Qt Creator 集成开发环境构建和运行程序是一件非常简单的事情 xff0c 一个按钮或者一个快捷键搞定全部 xff0c 通过 Qt Creator使用教程 xff08 简明版 xff09
  • 常用Linux命令行技巧

    结果以表格形式输出 column t 比如 xff1b span class token function mount span span class token operator span column t 默认分隔符为空格 xff0c
  • CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解

    点击下方卡片 xff0c 关注 CVer 公众号 AI CV重磅干货 xff0c 第一时间送达 转载自 xff1a 新智元 编辑 xff1a LRS 导读 ImageNet见证了计算机视觉发展的辉煌历程 xff0c 在部分任务性能已超越人类
  • Java异常处理的九个最佳实践

    1 确保在Finally程序块中完成资源释放或者使用Try With语句 比如对于InputStream xff0c 当我们使用完毕 xff0c 我们要确保资源被正确关闭 xff0c 比如下面我们常见的错误用法 xff0c 不要在try模块
  • CodeMirror使用笔记

    最近因工作需要 xff0c 在项目中使用了CodeMirror代码编辑器 xff0c 以下是使用笔记 首先 xff0c 看下最终的效果 引入基本的需要资源 lt script src 61 34 lt 61 request getConte
  • JAVA注解

    Java注解Annotations主要用于为目标程序提供额外补充的说明信息 注解以 64 符号标识注解并不改变编译程序的行为注意可以为程序元素 xff1a 实例变量 构造方法 方法或者类添加元数据信息注解并不是单纯的注释 xff0c 但却可
  • ubuntu中GitLab的安装与配置

    这里 xff0c 我们采用离线安装的方式安装GitLab 首先 xff0c 我们从清华大学开源软件镜像站中下载软件包 xff0c 用户可根据实际的服务器操作系统版本来选择不同的镜像资源 xff0c 这里我们以ubuntu为例 执行命令sud
  • Jenkins使用笔记

    本章简单记录Jenkins的使用笔记 首先 xff0c 我们从官网中下载安装介质 xff0c 可以看到这里有适合各种操作系统版本的安装源介质 xff0c 简单起见 xff0c 我们直接下载一个通用的war程序包 执行命令java jar j
  • GitLab 与 Jenkins 持续集成实践

    首先 xff0c 我们简单说明下我们的部署环境 xff1a GitLab xff1a 192 168 43 61 Jenkins xff1a 192 168 43 116 Jenkins中系统设置中 xff0c 配置GitLab连接信息 x
  • Linux下免密认证登录失败原因总结

    事件背景 A机器已经生产rsa密钥且已经将public key添加到B机器 root ssh authorized keys xff0c 但是从A机器上ssh root 64 B机器时仍然需要输入密码 xff0c 即无密码认证失败 原因总结

随机推荐

  • 公钥添加到authorized_keys到文件中之后仍无法免密登陆

    接上一章 xff0c 关于Linux下免密登陆失败 xff0c 这里找了Stackoverflow上关于这个问题的讨论 xff1a Adding public key to ssh authorized keys does not log
  • Java 8 中的List排序

    按字母顺序排序字符串列表 List lt String gt cities 61 Arrays asList 34 Milan 34 34 london 34 34 San Francisco 34 34 Tokyo 34 34 New D
  • Microservices vs SOA - 微服务与SOA

    开始之前 xff0c 我们先简单看下单体架构 SOA与微服务之间的区别 xff0c 如下图所示 xff1a 简单来讲 xff0c 对于单体架构 xff0c 其就像一个超大容器 xff0c 容器内集中包含了该应用的所有软件组件 xff0c 并
  • Python 机器学习8:sklearn 聚类算法

    1 K Means算法是一种广泛使用的聚类算法 from sklearn cluster import KMeans K Means是聚焦于相似的无监督的算法 xff0c 以距离作为数据对象间相似性度量的标准 xff0c 即数据对象间的距离
  • 什么是微服务——微服务架构体系介绍

    Why Microservices 回答这个问题前 xff0c 我们先看下之前大行其道的单体架构 Monolithic Architecture xff0c 对于非专业人士来讲 xff0c 所谓的单体架构 xff0c 其就像一个超大容器 x
  • 微服务架构特征

    一个典型的微服务架构 xff08 MSA xff09 通常包含以下组件 xff1a 客户端 xff1a 微服务架构着眼于识别各种不同的类型的设备 xff0c 以及在此设备上进行的各种管理操作 xff1a 搜索 构建 配置等等身份标识提供者
  • 微服务架构系列——API服务网关

    本章我们简单介绍微服务架构下的API服务网关 xff0c 本章我们将讨论以下话题 xff1a 什么是API服务网关为什么需要API服务网关API服务网关的工作机制 处理横切关注点 当我们在开发设计大型软件应用时 xff0c 我们一般都会采用
  • Java之keytool命令学习

    Java Keytool is a key and certificate management utility It allows users to manage their own public private key pairs an
  • HashMap 与 HashTable的区别

    HashMap 实现了Map接口非线程同步 xff0c 非线程安全不允许重复键键和值均允许为null HashMap lt Interger String gt employeeHashmap 61 new HashMap lt Integ
  • 如何避免敏捷失败?

    很多人都听说敏捷 xff0c 有些人知道敏捷是什么 xff0c 有些人也尝试过敏捷 xff0c 本章中将列举出一些常见的错误敏捷实践 xff0c 如果想要避免敏捷失败 xff0c 建议还是要对照下你所在的敏捷团队中有没有类似的敏捷实践 xf
  • 一个人有文化,到底有多重要?

    关于什么是文化 xff0c 我最最欣赏的回答 xff0c 是作家梁晓声的四句概括 xff1a 根植于内心的修养 xff0c 无需提醒的自觉 xff0c 以约束为前提的自由 xff0c 为别人着想的善良 01 一位叫做 Judy 的空姐 xf
  • MyBatis动态SQL中Map参数处理

    在MyBatis中 xff0c 如果我们需要传递两个参数 xff0c 有一种方式是通过Map作为传入参数 xff0c 在动态SQL中 xff0c 我们需要对传入的Map参数中的值进行判断 xff0c 然后进行动态SQL的条件拼接处理 假设我
  • MyBatis框架下防止SQL注入

    与传统的ORM框架不同 xff0c MyBatis使用XML描述符将对象映射到SQL语句或者存储过程中 xff0c 这种机制可以让我们更大的灵活度通过SQL来操作数据库对象 xff0c 因此 xff0c 我们必须小心这种便利下SQL注入的可
  • 使用android 视频解码mediaCodec碰到的几个问题

    问题1 mediaCodec dequeueInputBuffer一直返回 1 xff0c APP现象 xff1a 视屏卡屏 原因 xff1a 这是因为inputbuffer的内容有误 xff0c 导致无法解码 可通过设延时时间解决 xff
  • 云计算思维导图

    根据近期的云计算学习心得 xff0c 将云计算部分内容制作成思维导图 xff0c 方便于广大云计算学习者作为辅导讲义 xff01 思维导图内容主要包含 xff1a 1 云计算概述 2 云体系结构 3 网络资源 4 存储资源 5 硬件介绍 6
  • 路由器重温——串行链路链路层协议积累

    对于广域网接口来说 xff0c 主要的不同或者说主要的复杂性在于理解不同接口的物理特性以及链路层协议 xff0c 再上层基本都是 IP 协议 xff0c 基本上都是相同的 WAN口中的serial接口主要使用点对点的链路层协议有 xff0c
  • 路由器重温——PPPoE配置管理-2

    四 配置设备作为PPPoE服务器 路由器的PPPoE服务器功能可以配置在物理以太网接口或 PON 接口上 xff0c 也可配置在由 ADSL 接口生成的虚拟以太网接口上 1 配置虚拟模板接口 虚拟模板接口VT和以太网接口或PON接口绑定后
  • Python入门自学进阶——1--装饰器

    理解装饰器 xff0c 先要理解函数和高阶函数 首先要明白 xff0c 函数名就是一个变量 xff0c 如下图 xff0c 定义一个变量名和定义一个函数 xff0c 函数名与变量名是等价的 既然函数名就是一个变量名 xff0c 那么在定义函
  • Python入门自学进阶-Web框架——21、DjangoAdmin项目应用

    客户关系管理 以admin项目为基础 xff0c 扩展自己的项目 一 创建项目 二 配置数据库 xff0c 使用mysql数据库 xff1a 需要安全mysqlclient模块 xff1a pip install mysqlclient D
  • Python入门自学进阶-Web框架——33、瀑布流布局与组合查询

    一 瀑布流 xff0c 是指页面布局中 xff0c 在显示很多图片时 xff0c 图片及文字大小不相同 xff0c 导致页面排版不美观 如上图 xff0c 右边的布局 xff0c 因为第一行第一张图片过长 xff0c 第二行的第一张被挤到第