django学习记录07——订单案例(复选框+ajax请求)
1.订单的数据表
1.1 数据表结构

1.2 数据表的创建
models.py
class Order(models.Model):"""订单号"""oid = models.CharField(max_length=64, verbose_name="订单号")title = models.CharField(max_length=64, verbose_name="名称")price = models.FloatField(verbose_name="价格")status_choice = ((1,"待支付"),(2,"已支付"),)status = models.SmallIntegerField(verbose_name="状态",choices=status_choice,default=1)admin = models.ForeignKey(verbose_name="管理员",to="Admin",on_delete=models.CASCADE)
status字段采用choice方式,获取值特别注意使用`get_status_display````admin`作为外键,使订单表与管理员连接,自动创建admin_id字段,采用级联删除方式。
获取admin表username字段的方法
直接 .字段- 在admin中设置默认返回username,
def __str__(self): return self.username
2.订单案例的实现
2.1 订单案例功能概述
将订单的展示、订单的增加、订单的更新、订单的删除等功能集成到一个页面中。增加和删除页面使用模态框实现,增删改查均使用Ajax请求进行数据传输。
2.2 订单案例总页面和列表展示功能
oeder_list
def order_list(request):queryset = models.Order.objects.all()form = OrderModelForm()page_object = Pagination(request, queryset)context = {'queryset': page_object.query_set,'form': form,'page_str': page_object.createHtml()}return render(request, "order_list.html", context)
queryset = models.Order.objects.all()获取数据库数据
form = OrderModelForm()向前端传输构造的表单,用与增加更新页面的形成
page_object = Pagination(request, queryset)分页组件的应用
order_list.html
{% extends 'layout.html' %}{% block content %}...<!-- 新建 /编辑订单的对话框-->.........<!--删除订单的对话框-->.........<!-- 数据展示 --><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>价格</th><th>状态</th><th>管理员</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.oid }}</td><td>{{ obj.title }}</td><td>{{ obj.price }}</td><td>{{ obj.get_status_display }}</td><td>{{ obj.admin.username }}</td><td>......</td></tr>{% endfor %}</tbody></table></div><ul class="pagination">{{ page_str }}</ul></div>
{% endblock %}{% block js %}
...
...
...
{% endblock %}
<td>{{ obj.get_status_display }}</td>choice字段的数据展示
<td>{{ obj.admin.username }}</td>外键各字段的展示方法
<ul class="pagination"> {{ page_str }} </ul>分页功能
2.3 订单增加与订单更新功能
由于增加和更新都是用复选框,而且一般情况下增加页面和更新页面可以各使用一个复选框,但本文将增加页面和更新页面集成到一个复选框中。
增加和更新功能集成到一个复选框中,并且两个功能都需要创建数据输入的表单。不同的是,增加功能相对较简单,更新功能需要获取待更新数据的id,并且将待更新数据旧数据填充到表单中
因此增加和更新功能复选框的区分标准是是否定义了待删除数据id
2.3.1 复选框的生成
order_list.html
{% extends 'layout.html' %}{% block content %}<div style="margin-bottom: 10px"><div><input type="button" class="btn btn-primary" value="新建订单1" data-toggle="modal" data-target="#Modal"><input id="addShow" type="button" class="btn btn-primary" value="新建订单2"></div></div><!-- 新建 /编辑订单的对话框--><div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h4 class="modal-title" id="myModalLabel"></h4></div><div class="modal-body"><form id="formAdd"><div class="clearfix">{% for field in form %}<div class="col-xs-6"><div class="form-group" style="position: relative;margin-bottom: 20px;"><label>{{ field.label }}</label>{{ field }}<span class="error-msg" style="color: red"></span></div></div>{% endfor %}</div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button><button id="btnSave" type="button" class="btn btn-primary">保 存</button></div></div></div></div><!--删除订单的对话框-->......<!-- 数据展示 -->......
{% endblock %}{% block js %}
...
...
{% endblock %}
2.3.2复选框的内容
<div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h4 class="modal-title" id="myModalLabel"></h4></div><div class="modal-body">正常的modelForm表单构造</div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button><button id="btnSave" type="button" class="btn btn-primary">保 存</button></div></div></div></div>
ModelForm的表单构造,由order_list视图函数传来的form来实现
2.3.3增加订单绑定复选框
<div><input type="button" class="btn btn-primary" value="新建订单1" data-toggle="modal" data-target="#Modal"><input id="addShow" type="button" class="btn btn-primary" value="新建订单2">
</div>
- 新建订单1按钮,采用官方文档给的唤醒复选框的方法
data-target="#Modal"直接写复选框的id即可 - 新建订单2按钮,采用jQuery+js进行唤醒复选框
<script type="text/javascript">var UPDATE_ID;$(function () {//增加订单按钮bindBtnaddShow();})function bindBtnaddShow() {$('#addShow').click(function () {//由于添加和更新使用同一个对话框,每次点击要清除表单//成功后清除表单// $("#formAdd")jQuery对象无重置功能 $("#formAdd")[0] Dom对象,有重置功能$("#formAdd")[0].reset();//根据对话框的id,更改对话框标题$('#myModalLabel').text('新建订单');// 点击新建按钮,显示对话框$('#Modal').modal('show');})}</script>
加载页面自动执行函数
$(function () {//增加订单按钮bindBtnaddShow(); })
$('#addShow').click(function () { })将id为addshow的按钮绑定以下事件
$('#myModalLabel').text('新建订单');由于增加与更新共用复选框,因此可以根据不同请求对id为myModalLabel的标签的文本进行赋值
$('#Modal').modal('show');显示id=model的复选框
2.3.4 更新订单绑定复选框
<td><input uid="{{ obj.id }}" type="button" class="btn btn-warning btn-sm updateShow" value="编辑">
</td>
设置属性uid,表示待操作数据的id
<script type="text/javascript">//全局变量存储待更新/删除的订单idvar DELETE_ID;var UPDATE_ID;$(function () {bindBtnupdateShow();})function bindBtnupdateShow() {$('.updateShow').click(function () {//由于添加和更新使用同一个对话框,每次点击要清除表单//成功后清除表单// $("#formAdd")jQuery对象无重置功能 $("#formAdd")[0] Dom对象,有重置功能$("#formAdd")[0].reset();//获取待更新的数据idUPDATE_ID = $(this).attr('uid')//更新窗口需要展示待更新数据各字段,因此需要利用ajax请求获取相关信息$.ajax({url: '/order/details',type: 'get',data: {uid: UPDATE_ID,},dataType: 'JSON',success: function (res) {// 数据存在,弹出编辑对话框if (res.status) {//将对应数据填充到input输入框中$.each(res.data, function (name, value) {console.log(name, value);//找到id为id_name的下一个标签,对value赋值$("#id_" + name).val(value);})//根据对话框的id,更改对话框标题$('#myModalLabel').text('编辑订单');// 点击新建按钮,显示对话框$('#Modal').modal('show');} else {alert(res.error)}}})})}
</script>
- 加载页面自动执行函数
$(function () {//增加订单按钮bindBtnupdateShow(); })
- 更新复选框的展示
$('.updateShow').click(function () { })将class为updateshow的按钮绑定以下事件,使用class是因为每条数据均有一个更新按钮
获取待更新数据的基本信息并填充的到更新复选框的输入框中
UPDATE_ID = $(this).attr('uid')获取待更新的数据id- 更新窗口需要展示待更新数据各字段,因此需要利用ajax请求获取相关信息
$.ajax({url: '/order/details', //请求地址type: 'get',data: {uid: UPDATE_ID, //传输带更改的数据id},dataType: 'JSON',success: function (res) { // 数据存在,弹出编辑对话框if (res.status) {//将对应数据填充到input输入框中$.each(res.data, function (name, value) {//找到id为id_name的下一个标签,对value赋值$("#id_" + name).val(value);})//根据对话框的id,更改对话框标题$('#myModalLabel').text('编辑订单');// 点击新建按钮,显示对话框$('#Modal').modal('show');} else {alert(res.error)}}})
getdetails视图函数def order_details(request):uid = request.GET.get('uid')# 方式2 采用value 使查询数据库时按需返回并组成字典# 若不加first 返回queryset类型row_dict = models.Order.objects.filter(id=uid).values('title', 'price', 'status').first()print(row_dict)if not row_dict:data_dict = {'status': False, 'error': '数据不存在'}return HttpResponse(json.dumps(data_dict))data_dict = {'status': True,'data': row_dict,}print(json.dumps(data_dict)) # {"status": true, "date": {"title": "1111", "price": 2222.0, "status": 2}}return HttpResponse(json.dumps(data_dict))根据id查询数据的两种方式
- 方式1 返回数据对象
若不加first 返回queryset类型row_object = models.Order.objects.filter(id=uid).first()if not row_object:data_dict = {'status': False, 'error': '数据不存在'}return HttpResponse(json.dumps(data_dict))data_dict = {'status': True,'date': {'title': row_object.title,'price': row_object.price,'status': row_object.status,}}print(json.dumps(data_dict)) # {"status": true, "date": {"title": "1111", "price": 2222.0, "status": 2}}return HttpResponse(json.dumps(data_dict))
- 方式2 采用value 使查询数据库时按需返回并组成字典
# 若不加first 返回queryset类型 # 加value和first 返回字典类型row_dict = models.Order.objects.filter(id=uid).values('title', 'price', 'status').first()print(row_dict)if not row_dict:data_dict = {'status': False, 'error': '数据不存在'}return HttpResponse(json.dumps(data_dict))data_dict = {'status': True,'data': row_dict,}print(json.dumps(data_dict)) # {"status": true, "date": {"title": "1111", "price": 2222.0, "status": 2}}return HttpResponse(json.dumps(data_dict))主要使用方式二
订单字段主要有名称、订单号、价格、状态和负责人,对于订单号让系统自动生成、负责人由当前登录用户确定(在
order_updat视图函数实现)Ajax请求获取待修改数据的信息并打开复选框
//将对应数据填充到input输入框中 $.each(res.data, function (name, value) { //找到id为id_name的下一个标签,对value赋值$("#id_" + name).val(value); })利用ModelForm生成的input输入框,id形式均为id_xxx,因此遍历视图函数传来的字典数据,并根据id给其value属性赋值
$('#Modal').modal('show');找到id为Model的复选框,显示
2.3.5 增加与更新的保存实现
order_list
{% extends 'layout.html' %}{% block content %}
...
...<!-- 新建 /编辑订单的对话框-->
...<div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button><button id="btnSave" type="button" class="btn btn-primary">保 存</button></div>
...<!--删除订单的对话框-->
...
...<!-- 数据展示 -->
...
...
{% endblock %}{% block js %}<script type="text/javascript">//全局变量存储待删除的订单idvar DELETE_ID;var UPDATE_ID;$(function () {...bindBtnSaveEvent();})function bindBtnSaveEvent() {$('#btnSave').click(function () {console.log(UPDATE_ID)if (UPDATE_ID) {//更新操作doUpdate();} else {//编辑操作doAdd();}})}function doAdd() {UPDATE_ID = 0;$(".error-msg").empty();$.ajax({url: '/order/add',type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if (res.status) {//alert("添加成功");//成功后清除表单// $("#formAdd")jQuery对象无重置功能 $("#formAdd")[0] Dom对象,有重置功能//$("#formAdd")[0].reset();//关闭添加框//$('#myModal').modal('hide');//成功后刷新页面,更新展示列表location.reload();} else {$.each(res.errors, function (name, data) {// console.log(name,data);//找到id为id_name的下一个标签,给赋予文本$("#id_" + name).next().text(data[0]);})}}})}function doUpdate() {$.ajax({// 由于data传输的是整个表单,因此传输待修改的数据id时,利用urlurl: '/order/update' + '?uid=' + UPDATE_ID,type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if (res.status) {location.reload();} else {$.each(res.errors, function (name, data) {// console.log(name,data);//找到id为id_name的下一个标签,给赋予文本$("#id_" + name).next().text(data[0]);})}}})}</script>
{% endblock %}
- 按钮绑定
data-dismiss="modal"取消按钮绑定 点击取消,关闭复选框
id="btnSave"保存通过id绑定jQueryfunction bindBtnSaveEvent() {$('#btnSave').click(function () {console.log(UPDATE_ID)if (UPDATE_ID) {//更新操作doUpdate();} else {//编辑操作doAdd();}})}根据保存按钮传来的UPDATE_ID来判断操作类型
2.3.5.1 增加
doAdd()
function doAdd() {UPDATE_ID = 0;$(".error-msg").empty();$.ajax({url: '/order/add',type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if (res.status) {location.reload();} else {$.each(res.errors, function (name, data) {//找到id为id_name的下一个标签,给赋予文本$("#id_" + name).next().text(data[0]);})}}})}
order_add()
def order_add(request):form = OrderModelForm(request.POST)if form.is_valid():# 由于post请求未传来oid的数据,因此oid的数据需手动添加# print(form.cleaned_data) {'title': 'dadw', 'price': 123.0, 'status': 1, 'admin': <Admin: WYT>}# 随机生成oid(当前日期+四位随机数)oid = datetime.datetime.now().strftime('%Y%m%d%H%M') + str(random.randint(1000, 9999))########### 手动对某个字段添加数据的方法# form.instance.字段 = 数据form.instance.oid = oid# 对于管理员字段,自动填写为当前登录的用户,而不是用户输入# form.instance.admin_id = 当前用户登录的id(利用session), admin为外键,默认生成admin_id# request.session.get('info')['id']————当前用户登录的idform.instance.admin_id = request.session.get('info')['id']form.save()data_dict = {'status': True}return HttpResponse(json.dumps(data_dict))data_dict = {'status': False, 'errors': form.errors}return HttpResponse(json.dumps(data_dict, ensure_ascii=False))
订单字段主要有名称、订单号、价格、状态和负责人,对于订单号让系统自动生成、负责人由当前登录用户确定
- 订单号
oid = datetime.datetime.now().strftime('%Y%m%d%H%M') + str(random.randint(1000, 9999))随机生成oid(当前日期+四位随机数)手动对某个字段添加数据的方法
form.instance.字段 = 数据 form.instance.oid = oid
- 负责人
对于管理员字段,自动填写为当前登录的用户,而不是用户输入
form.instance.admin_id = 当前用户登录的id(利用session), admin为外键,默认生成admin_id
request.session.get('info')['id']————当前用户登录的id
form.instance.admin_id = request.session.get('info')['id']
- json返回
HttpResponse(json.dumps(data_dict, ensure_ascii=False))等同于
return JsonResponse(data_dict)
2.3.5.2 更新
doUpdate()
function doUpdate() {$.ajax({url: '/order/update' + '?uid=' + UPDATE_ID,type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if (res.status) {location.reload();} else {$.each(res.errors, function (name, data) {// console.log(name,data);//找到id为id_name的下一个标签,给赋予文本$("#id_" + name).next().text(data[0]);})}}})
}
url: '/order/update' + '?uid=' + UPDATE_ID,由于data传输的是整个表单,因此传输待修改的数据id时,利用url
order_update()
@csrf_exempt
def order_update(request):uid = request.GET.get('uid')print(uid)row_object = models.Order.objects.filter(id=uid).first()# 此处row_object 无需判断是否存在 查找待删除id的信息时已校验(order_details)form = OrderModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()data_dict = {'status': True}return HttpResponse(json.dumps(data_dict))data_dict = {'status': False,'errors': form.errors}return HttpResponse(json.dumps(data_dict))
2.4 订单的删除
2.4.1 删除确认复选框的显示
{% extends 'layout.html' %}{% block content %}
...
...<!--删除订单的对话框--><div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="alert alert-danger alert-dismissible fade in" role="alert"><h4>是否删除该数据!!!</h4><p style="text-align: right"><button type="button" class="btn btn-danger btnDelete">确 定</button><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button></p></div></div></div><!-- 数据展示 -->
....
....
<td>{# 设置属性uid,表示待操作数据的id #}<input uid="{{ obj.id }}" type="button" class="btn btn-warning btn-sm updateShow" value="编辑"><input uid="{{ obj.id }}" type="button" class="btn btn-danger btn-sm deleteShow" value="删除">
</td>
....</div>
{% endblock %}
<input uid="{{ obj.id }}" type="button" class="btn btn-danger btn-sm deleteShow" value="删除">此按钮绑定复选框显示,并且将待删除的数据通过属性uid传输。function bindBtndeleteShow() {$('.deleteShow').click(function () {$('#deleteModal').modal('show');//获取待删除订单的id// $(this)获取当前标签[$('.deleteShow')]//attr() 方法设置或返回被选元素的属性值 返回uid属性的值DELETE_ID = $(this).attr('uid')})}
$('.deleteShow').click(function () { })点击所有class为deleteShow的按钮执行以下操作
$('#deleteModal').modal('show');点击删除按钮,显示删除警告框
(this)获取当前标签[$('.deleteShow')]
attr() 方法设置或返回被选元素的属性值 返回uid属性的值
DELETE_ID = $(this).attr('uid')获取待删除订单的id
2.4.2 删除的实现
<!--删除订单的对话框--><div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="alert alert-danger alert-dismissible fade in" role="alert"><h4>是否删除该数据!!!</h4><p style="text-align: right"><button type="button" class="btn btn-danger btnDelete">确 定</button><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button></p></div></div></div>
<button type="button" class="btn btn-danger btnDelete">确 定</button>此按钮绑定删除Ajax请求
<button type="button" class="btn btn-default" data-dismiss="modal">取 消</button>此按钮绑定取消复选框
function bindBtndeleteEvent() {$('.btnDelete').click(function () {$.ajax({url: '/order/delete', type: 'get',data: {uid: DELETE_ID},dataType: 'JSON',success: function (res) {if (res.status) {//alert("删除成功")//关闭删除框$('#deleteModal').modal('hide');//待删除的数据id置空DELETE_ID = 0;//更新展示数据,页面刷新location.reload();} else {alert(res.error)}}})})}
url: '/order/delete', 或 /order/delete?uid=? 或"/order/" + DELETE_ID + "/delete"uid的传输方法,data传输或者url传输
$('#deleteModal').modal('hide');关闭删除复选框
2.5 数据库获取数据方式对比
想要去数据库中获取数据时:对象/字典
- 对象,当前行的所有数据。
row_object = models.Order.objects.filter(id=uid).first()
row_object.id
row_object.title
- 字典,{“id”:1,“title”:“xx”}
row_dict = models.Order.objects.filter(id=uid).values("id","title").first()
- queryset = [obj,obj,obj,]
queryset = models.Order.objects.all()
- queryset = [ {‘id’:1,‘title’:“xx”},{‘id’:2,‘title’:“xx”}, ]
queryset = models.Order.objects.all().values("id","title")
- queryset = [ (1,“xx”),(2,“xxx”), ]
queryset = models.Order.objects.all().values_list("id","title")
相关文章:
django学习记录07——订单案例(复选框+ajax请求)
1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…...
Qt 定时器事件
文章目录 1 定时器事件1.1 界面布局1.2 关联信号槽1.3 重写timerEvent1.4 实现槽函数 启动定时器 2 定时器类 项目完整的源代码 QT中使用定时器,有两种方式: 定时器类:QTimer定时器事件:QEvent::Timer,对应的子类是QTi…...
LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解
编者按:随着 LLM 赋能越来越多需要实时决策和响应的应用场景,以及用户体验不佳、成本过高、资源受限等问题的出现,大模型高效推理已成为一个重要的研究课题。为此,Baihai IDP 推出 Pierre Lienhart 的系列文章,从多个维…...
JavaEE进阶(15)Spring原理:Bean的作用域、Bean的生命周期、Spring Boot自动配置(加载Bean、SpringBoot原理分析)
接上次博客:JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)-CSDN博客 目录 关于Bean的作用域 概念 Bean的作用域 Bean的生命周期 源码阅读 Spring Boot自动配置 Spring 加载Bean 问题描述 原因分析 …...
ELK-介绍及Elasticsearch集群搭建
ELK是三个开源软件的缩写,分别为Elasticsearch、Logstash、kibana它们都是开源软件。后来新增了一个FileBeat,它是一个轻量及的日志收集处理工具,因为Logstash由java程序开发,比较消耗内存资源,后来将Logstash使用go语…...
保障数据安全,提升性能:探秘Redis AOF持久化机制在在线购物网站的应用
AOF(Append-Only File)日志介绍 Redis使用AOF持久化来保证数据的可靠性。AOF日志是一个追加写文件,记录了所有对Redis数据进行修改的命令。 AOF的常规用途 通常,人们将Redis的AOF用于将后端数据库中的数据存储在内存中…...
魔众智能AI系统v2.1.0版本支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini)
支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini) [新功能] 系统全局消息提示 UI 全新优化 [新功能] JS 库增加【ijs】类型字符串,支持默认可执行代码 [新功能] 分类快捷操作工具类 CategoryUtil [新功能…...
抖音视频评论区用户采集工具使用教程
抖音视频评论区用户采集工具是一款用于收集抖音视频评论区用户信息的工具。通过该工具,用户可以提取抖音视频评论区的用户昵称、评论内容、点赞数等信息,并进行数据分析和统计。该工具可以帮助用户了解抖音视频评论区的用户特点和评论趋势,提…...
c 不同类型指针的转换
int 指针与unsigned char类型指针互转 #include <stdio.h> #include <stdlib.h>int main(void){int a(0x1<<24)|(0x2<<16)|(0x3<<8)|0x4; //0x1020304printf("16进制:%x\n",a);u_int8_t *p(u_int8_t *)&a; //int指针转为unsig…...
16 PyTorch 神经网络基础【李沐动手学深度学习v2】
1. 模型构造 在构造自定义块之前,我们先回顾一下多层感知机的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯…...
java数据结构与算法刷题-----LeetCode216. 组合总和 III
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路 此题是77题的扩展题,仅仅加了一个条件而已&…...
vscode remote ssh 连接 ubuntu/linux报错解决方法
1、问题: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fin…...
Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解
1.Normalizer(归一化)(更加推荐使用) 优点:将每个样本向量的欧几里德长度缩放为1,适用于计算样本之间的相似性。 缺点:只对每个样本的特征进行缩放,不保留原始数据的分布形状。 公式…...
覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式
页面中修改el-menu 设置background-color"transparent",menu菜单下的背景图片则能正常显示了 <el-menuclass"el-menu-demo"mode"horizontal"background-color"transparent"><el-menu-item index"1">…...
接口自动化测试从入门到高级实战!
接口测试背景和必要性 接口测试是测试系统组件间接口(API)的一种测试,主要用于检测内部与外部系统、内部子系统之间的交互质量,其测试重点是检查数据交换、传递的准确性,控制和交互管理过程,以及系统间相互…...
【STC8A8K64D4开发板】第2-14讲:I2C总线的应用
第2-14讲:I2C总线的应用 学习目的了解I2C总线的特点。掌握I2C地址的定义,对I2C地址要有深刻的了解,之后再看到I2C接口设备中描述的7位地址或8位地址,不会再有疑惑。掌握STC8A8K64D4系列单片机I2C的特点以及编程方法。掌握通过I2C读…...
前端框架的发展史
随着互联网技术的飞速发展和用户需求的日益增长,前端开发作为构建用户界面和交互体验的关键环节,经历了从简单到复杂、从静态到动态的演变过程。在这个过程中,前端框架作为提升开发效率和代码质量的重要工具,也经历了多个阶段的发…...
Unity Hololens2开发|(二)MRTK3导入和配置
目录 1.从 MRTK3 模板项目开始2.从新项目开始2.1 创建新的 Unity 项目2.2 使用混合现实功能工具导入所需的依赖项和 MRTK3 包2.3 打开 Unity 项目2.4 在导入后配置 MRTK 配置文件2.5 配置 OpenXR 相关设置2.6 使用模板项目资源1.从 MRTK3 模板项目开始 获取并试用 MRTK3 最简单…...
VMware下载与安装
准备一个Linux的系统,成本最低的方式就是在本地安装一台虚拟机,VMware是业界最好用的虚拟机软件之一 官网:https://www.vmware.com/ 下载页面:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html …...
9、Linux-安装JDK、Tomcat和MySql
目录 一、安装JDK 1、传输JDK文件(.tar.gz) 2、解压 3、备份环境变量 4、配置环境变量 5、重新加载环境变量 6、验证(java -version) 二、安装Tomcat 1、传输文件,解压到/usr/local 2、进入Tomcat的bin目录 …...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
