Django学习记录08——图表及文件上传案例

1.图表Echarts的应用

Apache ECharts

1.1 使用方法

引用echarts.js即可到官方文档中查询使用

1.2 常用图标的使用

图表展示页面的部署(主要展示折线图、柱状图、饼图)

{% block content %}
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">折线图</h3>
            </div>
            <div class="panel-body">
                <div id="m1" style="width: 100%;height:500px;"></div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-8">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">柱状图</h3>
                    </div>
                    <div class="panel-body">
                        <div id="m2" style="width: 100%;height:400px;"></div>
                    </div>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">饼图</h3>
                    </div>
                    <div class="panel-body">
                        <div id="m3" style="width: 100%;height:400px;"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

使用方法

var myChart = echarts.init(document.getElementById('m1')); 基于准备好的dom,初始化echarts实例 根据id获取展示的位置

option = {官方文档获取 }; 指定图表的配置项和数据

myChart.setOption(option); 使用刚指定的配置项和数据显示图表。

1.2.1 折线图

  • 官方文档代码

在这里插入图片描述

option = {
  title: {
    text: 'Stacked Line'
  },
  tooltip: {
    trigger: 'axis'
  },
  legend: {
    data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
  },
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  toolbox: {
    feature: {
      saveAsImage: {}
    }
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      name: 'Email',
      type: 'line',
      stack: 'Total',
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
      name: 'Union Ads',
      type: 'line',
      stack: 'Total',
      data: [220, 182, 191, 234, 290, 330, 310]
    },
    {
      name: 'Video Ads',
      type: 'line',
      stack: 'Total',
      data: [150, 232, 201, 154, 190, 330, 410]
    },
    {
      name: 'Direct',
      type: 'line',
      stack: 'Total',
      data: [320, 332, 301, 334, 390, 330, 320]
    },
    {
      name: 'Search Engine',
      type: 'line',
      stack: 'Total',
      data: [820, 932, 901, 934, 1290, 1330, 1320]
    }
  ]
};
  • 使用

在html中id为m1的标签,展示折线图

    <script type="text/javascript">
        $(function () {
            initLine();
        })

        //初始化折线图
        function initLine() {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('m1'));
            // 指定图表的配置项和数据
            var option = {
                title: {
                    text: '分公司上半年业绩'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: [数据]
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                toolbox: {
                    feature: {
                        saveAsImage: {}
                    }
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: [数据]//待后端传来的数据
                },
                yAxis: {
                    type: 'value'
                },
                series: [数据]//待后端传来的数据
            };
            //使用ajax请求从后台获取数据
            $.ajax({
                url: '/chart/line',
                type: 'get',
                dataType: 'json',
                success: function (res) {
                    //在此对图标的x轴,y轴,图例等进行赋值
                    if (res.status) {
                        //重新赋值
                        option.legend.data = res.data.legend_data;
                        option.xAxis.data = res.data.x_data;
                        option.series = res.data.series;

                        // 使用刚指定的配置项和数据显示图表。
                        myChart.setOption(option);
                    }

                }
            })

        }
    </script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_line(request):
   """构造折线图"""
   # 模拟从数据库获取数据
   legend_data = ['公司1', '公司2', '公司3', '公司4', '公司5']
   x_data = ['1月份', '2月份', '3月份', '4月份', '5月份', '6月份']
   series = [
       {
           'name': '公司1',
           'type': 'line',
           'stack': 'Total',
           'data': [120, 1322, 1201, 134, 920, 2320, 210]
       },
       {
           'name': '公司2',
           'type': 'line',
           'stack': 'Total',
           'data': [220, 1832, 191, 2324, 290, 3230, 310]
       },
       {
           'name': '公司3',
           'type': 'line',
           'stack': 'Total',
           'data': [1510, 2232, 201, 1524, 190, 330, 410]
       },
       {
           'name': '公司4',
           'type': 'line',
           'stack': 'Total',
           'data': [3230, 332, 3021, 334, 3930, 330, 320]
       },
       {
           'name': '公司5',
           'type': 'line',
           'stack': 'Total',
           'data': [820, 932, 901, 934, 1290, 1330, 1320]
       }
   ]

   data_dict = {
       'status': True,
       'data': {
           'legend_data':legend_data,
           'x_data': x_data,
           'series': series,
       }
   }
   return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.legend.data = res.data.legend_data;
option.xAxis.data = res.data.x_data;
option.series = res.data.series;

1.2.2 柱状图

  • 官方文档代码

在这里插入图片描述

option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150, 80, 70, 110, 130],
      type: 'bar'
    }
  ]
};
  • 使用

在html中id为m2的标签,展示柱状图

    <script type="text/javascript">
        $(function () {
            initBar();
        })

        //初始化柱状图
	function initBar() {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('m2'));

            // 指定图表的配置项和数据
            var option = {
                title: {
                    text: '员工业绩',
                    left: 'center',
                },
                tooltip: {},
                //图例
                legend: {
                    data: [数据],//待后端传来的数据
                    bottom: 0,
                },
                //x轴
                xAxis: {
                    data: []  //待后端传来的数据
                },
                //y轴
                yAxis: {},
                series: []  //待后端传来的数据

            };
            //使用ajax请求从后台获取数据
            $.ajax({
                url: '/chart/bar',
                type: 'get',
                dataType: 'json',
                success: function (res) {
                    //在此对图标的x轴,y轴,图例等进行赋值
                    if (res.status) {
                        //重新赋值
                        option.legend.data = res.data.legend;
                        option.xAxis.data = res.data.x_data;
                        option.series = res.data.series;

                        // 使用刚指定的配置项和数据显示图表。
                        myChart.setOption(option);
                    }

                }
            })
        }
    </script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_bar(request):
   # 模拟数据库获取图表数据   以下可使用数据库获取
   legend = ['YQY', 'WYT']
   x_data = ['1月', '2月', '3月', '4月', '5月', '6月']
   series = [
       {
           'name': 'YQY',
           'type': 'bar',
           'data': [5, 20, 36, 10, 10, 20],
       },
       {
           'name': 'WYT',
           'type': 'bar',
           'data': [15, 40, 86, 90, 22, 88]
       }
   ]

   data_dict = {
       'status': True,
       'data': {
           'legend': legend,
           'x_data': x_data,
           'series': series,
       }
   }
   return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.legend.data = res.data.legend;
option.xAxis.data = res.data.x_data;
option.series = res.data.series;

1.2.2 饼状图

  • 官方文档代码

在这里插入图片描述

option = {
  title: {
    text: 'Referer of a Website',
    subtext: 'Fake Data',
    left: 'center'
  },
  tooltip: {
    trigger: 'item'
  },
  legend: {
    orient: 'vertical',
    left: 'left'
  },
  series: [
    {
      name: 'Access From',
      type: 'pie',
      radius: '50%',
      data: [
        { value: 1048, name: 'Search Engine' },
        { value: 735, name: 'Direct' },
        { value: 580, name: 'Email' },
        { value: 484, name: 'Union Ads' },
        { value: 300, name: 'Video Ads' }
      ],
      emphasis: {
        itemStyle: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: 'rgba(0, 0, 0, 0.5)'
        }
      }
    }
  ]
};
  • 使用

在html中id为m3的标签,展示饼状图

    <script type="text/javascript">
        $(function () {
            initPie();
        })

        //初始化饼状图
    function initPie() {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('m3'));

            // 指定图表的配置项和数据
            var option = {
                title: {
                    text: '部门预算',
                    subtext: '副标题',
                    left: 'center'
                },
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    orient: 'vertical',
                    left: 'left',
                    bottom: 0,
                },
                series: [
                    {
                        name: '预算',
                        type: 'pie',
                        radius: '50%',
                        data: [], //待后端传来的数据
                        emphasis: {
                            itemStyle: {
                                shadowBlur: 10,
                                shadowOffsetX: 0,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    }
                ]
            };

            //使用ajax请求从后台获取数据
            $.ajax({
                url: '/chart/pie',
                type: 'get',
                dataType: 'json',
                success: function (res) {
                    //在此对图标的x轴,y轴,图例等进行赋值
                    if (res.status) {
                        //重新赋值
                        /*
                        series: [{name: '预算',type: 'pie',radius: '50%',data: [],}]
                        series 是一个仅有一个字典元素的列表,
                        series[0]取列表第一个元素,也就是这个字典
                        series 为仅含有一个字典元素的列表,series[0].data表示取出series列表的第一个字典元素的data键
                         */
                        option.series[0].data = res.data;

                        // 使用刚指定的配置项和数据显示图表。
                        myChart.setOption(option);
                    }

                }
            })
        }
    </script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_pie(request):
   '''构造饼图数据'''
   # 模拟从数据库获取数据
   series_data = [
       {'value': 1048, 'name': 'IT部门'},
       {'value': 735, 'name': '销售部'},
       {'value': 580, 'name': '宣传部'},
   ]
   data_dict = {
       'status': True,
       'data': series_data,
   }
   return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.series[0].data = res.data;

2.文件的上传

2.1 基础操作

html上传页面

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="text" name="username">
    <input type="file" name="avatar">
    <input type="submit" value="提交">
</form>
def upload_file(request):
    if request.method == 'GET':
        return render(request, 'upload_file.html')
    
    file_object = request.FILES['photo']  # 获取文件对象
    print(file_object.name)  # 获取文件名称

    # 生成文件名为file_object.name的文件
    f = open(file_object.name, mode='wb')
    # 由于文件在内存一块一块的存储,利用循环遍历每一块,写入f中
    for chunk in file_object.chunks():  # chunks()读取文件对象的内容
        f.write(chunk)
    f.close()
    return HttpResponse('上传成功')

request.POST 返回所有数据的组成的数据对象
request.FILES返回所有文件组成的数据对象

enctype="multipart/form-data"   
form标签中若不加此字段,上传的文件以文件名的形式通过request.POST传过来:
<QueryDict: {'csrfmiddlewaretoken': ['6oGNXjBGaHzqFGywRFd7JQWXrY7fQwB6cEURubTTxemKDA789nRjb3Kv5MEgYnOE'], 'username': ['123'], 'photo': ['20220829_20471734.jpg']}>

form标签加上此字段,上传的文件以文件的形式通过request.FILES传过来
<MultiValueDict: {}>

file_object = request.FILES['photo'] 获取文件对象(input框中name为photo的输入数据)
file_object.name 获取文件名称

f = open(file_object.name, mode='wb') 生成文件名为file_object.name的文件

# 由于文件在内存一块一块的存储,利用循环遍历每一块,写入f中
for chunk in file_object.chunks():  # chunks()读取文件对象的内容
	f.write(chunk)
f.close()

选择上传的图片后,点击提交按钮,图片会以post的方式传入视图函数,通过file_object = request.FILES['photo']获取文件对象,并且chunks()读取文件对象的内容,最终将图片下载到项目目录中

2.2通过文件批量上传数据

将excel中存在部门批量添加到部门列表中

在这里插入图片描述

部门页面增加批量上传按钮

<form method="post" enctype="multipart/form-data" action="/depart/multi">
	{% csrf_token %}
	<div class="form-group">
		<input type="file" name="exc">
	</div>
	<input type="submit" value="上传" class="btn-primary btn-sm">
</form>
def depart_multi(request):
    """批量添加excel文件内的数据"""
    # 1.获取上传的文件对象
    file_object = request.FILES.get("exc")
    print(file_object)
    # 2.对象传递给openpyxl,有openpyxl读取文件内容
    wb = load_workbook(file_object)
    sheet = wb.worksheets[0] # 获取表
    print(sheet) #<Worksheet "Sheet1">
    print(sheet.cell(2,1).value) #部门1

    # 3.循环获取每一个数据
    # 遍历sheet的每一行,从第二行开始
    for row in sheet.iter_rows(min_row=2):
        # 获取每行第一列的值
        title = row[0].value
        # 先判断部门是否存在
        flag = models.Department.objects.filter(title=title).exists()
        if not flag:
            models.Department.objects.create(title=title)
    return redirect('/depart/list')

file_object = request.FILES.get("exc") 获取上传的文件对象

wb = load_workbook(file_object)对象传递给openpyxl,有openpyxl读取文件内容

sheet = wb.worksheets[0] 获取表

sheet.iter_rows(min_row=2) 遍历sheet的每一行,从第二行开始

2.3 ModelForm实现文件上传

2.3.1 media的应用

  • static,存放静态文件的路径,包括:CSS、JS、项目图片。
  • media,用户在前端上传的数据的目录(文件均存在此文件的子文件中)。

media的启用

url.py中配置

from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    
	re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
    
]

settings.py中配置

import os

MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

完成操作后,可以通过http://localhost:8000/media/xxx 来访问文件(xxx表示文件相对media的位置)

2.3.2 ModelForm实现city展示案例

models.py

class City(models.Model):
    """城市"""
    name = models.CharField(max_length=32,verbose_name="名称")
    count = models.IntegerField(verbose_name="人口")
    # 虽是FileField,但是本质上还是charField
    img = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

img = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

**upload_to = xxx 上传到 media/xxx目录中(不写默认上传到media目录) **

此时上传的图片自动存储到media/city/1.png

ModelForm定义

class UpMoldelForm(BootStrapModelForm):
    bootstrap_exclude_fields = ['img']

    class Meta:
        model = models.City
        fields = ['name', 'count', 'img']

bootstrap_exclude_fields = ['img'] img字段不使用BootStrapModelForm的输入框样式

city_add.html

{% extends 'layout.html' %}

{% block content %}
    <div class="panel panel-default">
        <div class="panel-heading">{{ title }}</div>
        <div class="panel-body">
            <form class="form" method="post" enctype="multipart/form-data" novalidate>
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        <label>{{ field.label }}</label>
                        {{ field }}
                        <span style="color: red">{{ field.errors.0 }}</span>
                        {#                        field.errors.0显示第一条错误即可#}
                    </div>
                {% endfor %}
                <input type="submit" class="btn btn-success" value="提交">
            </form>
        </div>
    </div>
{% endblock %}

视图函数city_add()

def upload_ModelForm(request):
    """ 上传文件和数据"""
    if request.method == 'GET':
        # 构造添加输入框
        form = UpMoldelForm()
        context = {
            'form': form,
            'title': 'ModelForm',
        }
        return render(request, 'upload_ModelForm.html', context)
    form = UpMoldelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 对于文件来说,自动保存定义时的路径位置  默认在media下  (media/city)
        # 保存文件的路径和名称   img:city/blog.png
        form.save()
        return redirect("/upload/city_list")
    context = {
        'form': form,
        'title': 'ModelForm',
    }
    return render(request, 'upload_ModelForm.html', context)

form = UpMoldelForm(data=request.POST, files=request.FILES) 获取前端的数据及文件

form.save() 在ModelForm中直接使用此语句进行保存数据到数据库**(数据库文件字段保存文件的路径和名称 img:city/blog.png)**

对于文件来说,自动保存定义时的路径位置 默认在media下 (media/city)

city_list.html

{% extends 'layout.html' %}

{% block content %}
    <div style="margin-bottom: 10px">
        <a type="button" class="btn btn-success" href="/upload/ModelForm"><span class="glyphicon glyphicon-plus-sign"
                                                                         aria-hidden="true"></span> 添加城市</a>

    </div>
    <div class="panel panel-default">
        <div class="panel-heading">城市列表</div>
        <div class="bs-example" data-example-id="hoverable-table">
            <table class="table table-hover">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>名称</th>
                    <th>人口</th>
                    <th>Logo</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <td>{{ obj.id }}</td>
                        <td>{{ obj.name }}</td>
                        <td>{{ obj.count }}</td>
                        <td>
                            {# obj.img图片相对于media的路径 #}
                            <img src="/media/{{ obj.img }}" style="height: 40px">
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
{% endblock %}

city_list()的视图函数

def city_list(request):
    queryset = models.City.objects.all()
    return render(request, "city_list.html", {'queryset': queryset})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434851.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

李沐动手学习深度学习——4.1练习

1. 计算pReLU激活函数的导数。 pReLU激活函数公式根据课本有如下&#xff1a; p R e L U ( x ) max ⁡ ( 0 , x ) α min ⁡ ( 0 , x ) \mathrm{pReLU}(x) \max(0, x)\alpha \min(0,x) pReLU(x)max(0,x)αmin(0,x) 对应的函数图像为: 对应的导数计算为&#xff1a; d p R…

github双因子认证

最近换了个安卓手机&#xff0c;打算让之前的苹果手机退役了&#xff0c;所以需要重新搞GitHub的Two-factor authentication 步骤如下&#xff1a; 1. 访问安全中心 https://github.com/settings/security 2. 点击Authenticator app右侧按钮 3. 下载腾讯身份验证器&#xff…

解密程序员的“藏宝图”:我的祖传代码大公开

程序员是如何看待“祖传代码”的&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一位充满好奇心和分享热情的程序员。今天&#xff0c;我要为大家揭开我心中的“藏宝图”——那些我认为值得传世的祖传代码。让我们一同踏上这场奇妙的代码冒险之旅吧&#xff01; 宝物一…

WMS仓储管理系统在电子企业中的应用效果如何

一、WMS仓储管理系统的概念与重要性 在当今信息化与自动化的时代&#xff0c;仓储管理不再仅仅是简单的物品存储和分发。仓库作为供应链中的核心环节&#xff0c;其管理效率和准确性直接影响到企业的运营成本和客户满意度。WMS仓储管理系统应运而生&#xff0c;成为电子企业提…

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 刷题https://leetcode.cn/problems/fibonacci-number/description/文章讲解https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解https://www.bilibili.com/video/BV…

微服务如何保证对外接口的安全?可以这样做!

如果你的微服务需要向第三方开放接口&#xff0c;如何确保你提供的接口是安全的呢&#xff1f; 1. 什么是安全接口 通常来说&#xff0c;要将暴露在外网的 API 接口视为安全接口&#xff0c;需要实现防篡改和防重放的功能。 1.1 什么是篡改问题&#xff1f; 1.1.1 如何解决篡…

GEE 依照范围裁剪 下载Sentinel-2数据

0. GEE介绍 Google Earth Engine&#xff08;GEE&#xff09; 是由Google开发的一种云端平台&#xff0c;旨在提供强大的地理空间数据处理和分析工具。GEE集成了大量的遥感影像数据和地理空间数据集&#xff0c;以及高性能的计算资源&#xff0c;使用户能够在云端高效地进行大规…

【深度学习笔记】 5_9 含并行连结的网络(GoogLeNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.9 含并行连结的网络&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet的网络结…

Pycharm与Anaconda安装

网址&#xff1a; Pycharm&#xff1a;https://www.jetbrains.com/pycharm/ Anaconda&#xff1a;https://www.anaconda.com/download/ 官网下载速度太慢可以选择到清华源下载&#xff1a;https://repo.anaconda.com/archive/ 一&#xff1a;Anaconda安装 安装&#xff1a; …

Android开发社招面试经验,大佬带你看源码

程序员的劫 最近&#xff0c;又被程序员年龄的事情刷屏了。37岁被公司优化&#xff0c;找工作几个月都没有很好的归属&#xff0c;所谓的小公司还看不上。等等类似的话题变成了程序员的吐槽固定标题&#xff0c;无论是程序员&#xff0c;还是其他行业人员&#xff0c;都可以就…

把简单留给用户,把复杂交给 AI

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿&#xff08;Luke&#xff09;分享了对 AI 与数据行业的一些战略思考&#xff0c;以及对中美企业服务市场的见解&#xff0c;引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技术应用风起云涌…

开发一个小程序需要多少钱

【腾讯云】 爆款2核2G3M云服务器首年 61元&#xff0c;叠加红包再享折上折 要做小程序的小伙伴们福利来啦&#xff01; 抢购方式&#xff1a; 方式一&#xff1a;直达链接》点我直接抢购 方式二&#xff1a;长按住识别以下官方二维码直接抢购 01 小程序认证 根据微信公众平台…

1.2_1 分层结构、协议、接口和服务

1.2_1 分层结构、协议、接口和服务 &#xff08;一&#xff09;为什么要分层&#xff1f; 主机A如果想要向主机B发送文件&#xff0c;则一定要经过中间的一些介质、链路。 发送文件前要完成的工作&#xff1a; 1.发起通信的计算机必须将数据通信的通路进行激活。 所谓的激活&a…

经典算法----折半查找

二、经典算法之折半查找 很多同学对于二分法就是&#xff1a;一看就会&#xff0c;一写就废&#xff01;&#xff01;&#xff01;&#xff01; 易错点1&#xff1a;以下循环方式写哪一个&#xff1f; 方案一&#xff1a;while(left<right) 方案二&#xff1a;while(left…

[蓝桥杯 2017 省 A] 油漆面积 Java代码及一些个人理解

[蓝桥杯 2017 省 A] 油漆面积 题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个…

uniapp小程序获取位置权限(不允许拒绝)

需求 小程序上如果需要一些定位功能&#xff0c;那么我们需要提前获取定位权限。我们页面的所有功能后续都需要在用户同意的前提下进行&#xff0c;所以一旦用户点了拒绝&#xff0c;我们应该给予提示&#xff0c;并让用于修改为允许。 实现 1.打开手机GPS 经过测试发现即使…

Java精品项目--第6期基于SpringBoot的茶叶商城的设计分析与实现

项目技术栈 SpringBootMavenMySQLJAVAMybatis-PLusVue.js&#xff08;非前后端分离&#xff09;Element-UI&#xff08;非前后端分离&#xff09;… 表截图 项目截图

Pygame教程05:帧动画原理+边界值检测,让小球来回上下运动

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

MES系统是怎么进行数据采集的?

在MES管理系统中&#xff0c;数据采集作为最基础也最为关键的一环&#xff0c;对于实现生产过程的透明化、可控好以及优化生产流程具有重要意义。 mes系统是怎么采集数据的? 一、PLC类数据采集&#xff1a;使用C#或C直接编程访问PLC(不需要花钱买组态软件或第三方软件) 二、…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter测试的详细解析

3.2.4.3 自定义starter测试 阿里云OSS的starter我们刚才已经定义好了&#xff0c;接下来我们就来做一个测试。 今天的课程资料当中&#xff0c;提供了一个自定义starter的测试工程。我们直接打开文件夹&#xff0c;里面有一个测试工程。测试工程就是springboot-autoconfigurat…