排序、过滤、分页、分组
Contoso 大学示例 Web 应用程序演示如何使用实体框架(EF)Core 2.0 和 Visual Studio 2017 创建 ASP.NET Core 2.0 MVC Web 应用程序。 如欲了解更多本教程相关信息,请参阅 入门 在前面的教程,你实现了一组 Student 实体的基本 CRUD 页面。 在本节中,您将向 Student 列表页添加排序、 筛选和分页功能, 还将创建一个进行简单分组的页面。 下图显示本节中将会完成的页面。 用户可以点击列标题进行排序。 重复点击列标题将排序在升序和降序之间切换。
将列排序链接添加到学生索引页 (Student Index)
要在学生索引页中添加排序,需要更改 Students 控制器中的 Index 的方法,并添加代码到 Students Index 视图。
在 Index 方法中添加排序功能
在 StudentsController.cs,替换 Index 方法为以下代码:
public async Task Index(string sortOrder)
{
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
var students = from s in _context.Students
select s;
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
return View(await students.AsNoTracking().ToListAsync());
}
代码从 URL 中接收 sortOrder 查询参数,此查询参数由 ASP.NET Core MVC 提供。参数是值为 "Name" 或 "Date" 的字符串,有时候后面会带有下划线和字符串 "desc" 来指定降序顺序。 默认排序顺序为升序。 第一次请求索引页时,没有附加查询字符串。 在默认的 Switch default 方法中按 LastName 排序。 当用户单击列标题,相应的 sortOrder 将会出现在查询字符串中。 两个 ViewData 元素 ( NameSortParm 和 DateSortParm )供视图用于配置列标题超链接查询字符串。
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
当前排序情况
LastName 链接
Date 链接
LastName 升序
降序
升序
LastName 降序
升序
升序
Date 升序
升序
降序
Date 降序
升序
升序
这是三元选择语句。 如果 sortOrder 参数为 null 或为空,NameSortParm 应设置为 "name_desc"; 否则,设置为一个空字符串。 这两个语句在视图中用于设置列标题超链接,如下所示:
当前排序情况
LastName 链接
Date 链接
LastName 升序
降序
升序
LastName 降序
升序
升序
Date 升序
升序
降序
Date 降序
升序
升序
方法中使用 LINQ to Entities 指定排序列。 在进行 Switch 判断前, 创建 IQueryables 变量, 在判断之后, 调用 ToListAsync 方法。 在创建和修改 IQueryable 变量过程中,查询并不会真正发送到数据库,直到你通过调用一个类似 ToListAsync 的方法将 IQueryable 变量转化为一个集合。 因此,在这段代码中,只当返回 View 语句执行时,查询才真正发生。 这样的代码可能导致出现非常多的列变量,在本系列最后一个教程中将告诉你如何在变量中传递排序列名。
在学生索引视图中添加列标题超链接
为了添加列标题超链接,替换 Views/Students/Index.cshtml 文件中的代码为如下代码:
@Html.DisplayNameFor(model => model.LastName)
@Html.DisplayNameFor(model => model.FirstMidName)
@Html.DisplayNameFor(model => model.EnrollmentDate)
代码使用 ViewData 属性中的信息建立超链接中的查询字符串。 运行应用程序中,选择 Student 菜单,然后单击 Last name 和 Enrollement Date 列标题,以验证排序是否生效。
在学生索引视图中添加搜索框
要在学生索引页面中添加过滤功能,您需要在视图中添加一个文本框和一个提交按钮,并在 Index 方法中做相应修改。 文本框中,你将输入要在名字和姓氏字段中搜索的字符串。
在 Index 方法中添加过滤功能
在StudentsController.cs,替换 Index 方法替换为以下代码
public async Task Index(string sortOrder, string searchString)
{
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
ViewData["CurrentFilter"] = searchString;
var students = from s in _context.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.Contains(searchString)
|| s.FirstMidName.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
return View(await students.AsNoTracking().ToListAsync());
}
在 Index 方法中添加 searchString 参数,此参数值来自刚刚加入视图中的文本框。同时,在 LINQ 语句中添加一个 Where 子句来选择名字 (first name 和 last name)中包含查询字符串的学生。Where 子句仅当查询字符串中有值时才生效。
备注
在这里, 您在 IQueryable 对象上调用 Where 方法, 过滤将在服务器上进行。某些情况下,您也可能是对内存集合调用 Where 方法。(例如,假设你将 _context.Students 的引用,从 EF Dataset 修改为一个返回 IEnumerable 的仓储方法。)查询结果通常是相同的,但在某些情况下可能会有所不同。 例如,.NET Framework 实现的 Contains 方法默认区分大小写。但 SQL Server 中这取决于 SQL Server 实例的排序规则设置,该设置默认为不区分大小写。 您可以调用 ToUpper 来进行测试显式不区分大小写的方法:Where (s = > s.LastName.ToUpper()。Contains(searchString.ToUpper())
。 这将确保如果稍后你修改代码为使用返回 IEnumerable 对象的仓储 Repository,而不是返回 IQueryable 对象时,结果保持相同。 (当您在 IEnumerable 集合上调用 Contains 方法时,使用的是 .NET Framework 实现; 而在 IQueryable 对象上,则使用 database provider 实现。) 但是,这个解决方案将对性能产生负面影响。 ToUpper
代码将在 TSQL 查询语句的 Where 条件中加入函数调用,进而导致 SQL 优化器停止使用索引。 假设 SQL 主要安装为不区分大小写,最好是避免 ToUpper 代码,直到您迁移到区分大小写的数据存储区。
在 Index 视图中添加搜索框
在Views/Student/Index.cshtml,在 标签前加入如下代码,创建一个标题、一个文本框和一个搜索按钮。
代码使用
标签,添加搜索文本框和按钮。默认情况下,
标签使用 POST
方法进行数据提交,参数在消息正文而不是 URL 查询字符串中传递。通过指定使用 GET
方法,窗体数据通过 URL 查询字符串进行传递,这是的用户可以对 URL 创建书签。 W3C 准则建议,在未导致更新的操作中,使用 GET
方法。 运行应用程序中,选择 Student 菜单,输入任意搜索字符,并点击“搜索”按钮,以验证过滤功能生效。
请注意在 URL 中包含了搜索字符串。
http://localhost:5813/Students?SearchString=an
如果您将本页面加入书签,下次使用书签时,您将得到过滤后的列表。在 Form
标签中添加的 method="get"
是产生查询字符串的原因。 在此阶段,如果您单击列标题进行排序,你将丢失搜索框中输入的过滤查询。 在下一部分中将修复此问题。
在学生索引视图中添加分页功能
要在学生索引页中添加分页功能,您将创建一个 PaginatedList
类,在类中使用 Skip
和 Take
语句实现在服务器过滤数据,而不是获取数据表的所有数据行。然后再对 Index
做一些更改,再 Index
视图中添加分页按钮。下图中展示了分页按钮。
在项目文件夹中,创建
PaginatedList.cs
,然后键入下面的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace ContosoUniversity
{
public class PaginatedList : List
{
public int PageIndex { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(List items, int count, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
this.AddRange(items);
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 1);
}
}
public bool HasNextPage
{
get
{
return (PageIndex < TotalPages);
}
}
public static async Task> CreateAsync(IQueryable source, int pageIndex, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList(items, count, pageIndex, pageSize);
}
}
}
代码中,CreateAsync
方法获取分页大小及页码,再 IQueryable
对象上使用相应的 Skip
和 Take
语句。 在 IQueryable
上调用 ToListAsync
后, 返回一个只包含请求页的列表。 属性 HasPreviousPage
及 HasNextPage
用于启用或禁用 “上一页” 和 “下一页” 按钮。 在 PaginatedList
中使用 CreateAsync
方法而不是构造函数的原因是构造函数无法运行异步代码。 ACreateAsync方法用于而不是一个构造函数创建PaginatedList对象,因为构造函数不能运行异步代码。
在 Index
方法中添加分页功能
在 StudentsController.cs
,替换 Index
方法替换为以下代码。
public async Task Index(
string sortOrder,
string currentFilter,
string searchString,
int? page)
{
ViewData["CurrentSort"] = sortOrder;
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewData["CurrentFilter"] = searchString;
var students = from s in _context.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.Contains(searchString)
|| s.FirstMidName.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 3;
return View(await PaginatedList.CreateAsync(students.AsNoTracking(), page ?? 1, pageSize));
}
代码在方法中添加了 page, sortOrder, currentFilter 三个参数。 第一次显示页面,或如果用户未单击分页或排序链接,则所有参数将都为 null
。 单击分页链接时,如果页变量将包含要显示的页码。 ViewData("CurrentSort") 保存当前排序以供视图使用。在视图的分页链接中包含排序,翻页的时候才能保持排序不变。 ViewData("CurrentFilter")保存当前过滤字符串以供视图使用。在视图的分页链接中包含过滤字符串,翻页额时候才能保持过滤不变。 如果在分页期间,搜索字符串被更改,因为新的过滤导致显示不同的数据,页码必须被重置为第一页。在文本框中输入并按下提交按钮时,搜索字符串改变。在这种情况下,searchString 参数不为空。
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
在 Index
方法结尾, PaginatedList.CreateAsync
方法转化学生查询至一个支持分页功能的单页学生集合,然后这个集合被传递给视图。
return View(await PaginatedList.CreateAsync(students.AsNoTracking(), page ?? 1, pageSize));
PaginatedList.CreateAsync
方法使用参数 page
(页码)和pageSize
(页大小)作为参数。 page
参数后的两个 ?
代表 null 合并运算符
。null 合并运算符
定义了可为空类型的默认值;page ?? 1
表达式意味着,如果 page
具有一个值(不为空),则返回 page
, 如果为空则返回 1
。
在 Index
视图中添加分页链接
在 Views/Students/Index.cshtml
,替换为以下代码。
@model PaginatedList
@{
ViewData["Title"] = "Index";
}
Index
Create New
Last Name
First Name
Enrollment Date
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.LastName)
@Html.DisplayFor(modelItem => item.FirstMidName)
@Html.DisplayFor(modelItem => item.EnrollmentDate)
Edit |
Details |
Delete
}
@{
var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";
var nextDisabled = !Model.HasNextPage ? "disabled" : "";
}
Previous
Next
译者注:Markdown 语法无法实现代码内高亮,如不清楚修改的位置,请参考微软原文。 页面顶部的 @model
指定视图现在获取 PaginatedList
对象而不是 List
对象。 列标题上的链接使用查询字符串将当前的搜索字符串传递到控制器,以便用户可以在过滤后的结果中进行排序:
Enrollment Date
The paging buttons are displayed by tag helpers: 分页按钮使用 tag helpers
进行显示
Previous
运行应用并转到 Student 页面。
在不同排序状态下点击分页链接,以确认分页功能正常工作。然后尝试搜索后再分页,验证分页功能在不同排序和过滤条件下都正常工作。
创建一个显示学生统计信息的关于页面
在 Contoso 大学网站的 About
页面, 将显示每天有多少学生进行注册,这需要对数据进行分组,并在分组上做计算。要完成此任务,您需要执行以下操作:
创建一个用于传递数据到视图的 ViewModel 类。
修改 HomeController
中的 About
方法。
修改 About
视图。
创建 ViewModel 类
在 Models
文件夹中创建一个 SchoolViewModels
文件夹 在这个新的文件夹中,添加一个文件名为 EnrollmentDateGroup.cs
的类,并输入以下代码:
using System;
using System.ComponentModel.DataAnnotations;
namespace ContosoUniversity.Models.SchoolViewModels
{
public class EnrollmentDateGroup
{
[DataType(DataType.Date)]
public DateTime? EnrollmentDate { get; set; }
public int StudentCount { get; set; }
}
}
修改 HomeController
在 HomeController.cs
文件, 顶部加入如下语句:
using Microsoft.EntityFrameworkCore;
using ContosoUniversity.Data;
using ContosoUniversity.Models.SchoolViewModels;
在类中添加一个数据库上下文变量 _context, ASP.NET Core 依赖注入将为此变量提供实例。
public class HomeController : Controller
{
private readonly SchoolContext _context;
public HomeController(SchoolContext context)
{
_context = context;
}
将 About 方法替换为以下代码:
public async Task About()
{
IQueryable data =
from student in _context.Students
group student by student.EnrollmentDate into dateGroup
select new EnrollmentDateGroup()
{
EnrollmentDate = dateGroup.Key,
StudentCount = dateGroup.Count()
};
return View(await data.AsNoTracking().ToListAsync());
}
LINQ 语句将 Student 实体进行分组,计算每个分组中的实体数量,并将结果存放在 EnrollmentDateGroup
ViewModel 对象中。
备注
在 EF Core 1.0 版本中, 整个结果集返回到客户端,并在客户端上进行分组。在某些情况下,这会导致性能问题。请使用实际生产环境规模的数据测试性能,如有必要,使用原始 SQL 在服务器进行分组。 有关如何使用原始的 SQL 的信息,请参阅本系列最后一个教程。
修改 About
视图
替换 Views/Home/About.cshtml 为如下代码:
@model IEnumerable
@{
ViewData["Title"] = "Student Body Statistics";
}
Student Body Statistics
Enrollment Date
Students
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.EnrollmentDate)
@item.StudentCount
}
运行应用,转至 About 页面。 每个日期的学生注册数量显示于表格中。
小结
在本教程中,你已了解如何执行排序、 筛选、 分页和分组。 在下一步的教程中,你将了解如何通过使用迁移来处理数据模型更改。
你可能感兴趣的:(ASP.NET Core MVC 和 Entity Framework Core 入门教程 - 排序、过滤、分页、分组(三))
Spring Boot 项目 90% 存在这 15 个致命漏洞,你的代码在裸奔吗?
风象南
原创随笔 java spring boot 后端 web安全 系统安全
文章首发公众号【风象南】SpringBoot作为一款广泛使用的Java开发框架,虽然为开发者提供了诸多便利,但也并非无懈可击,其安全漏洞问题不容忽视。本文将深入探讨SpringBoot常见的安全漏洞类型、产生原因以及相应的解决方案,帮助开发者更好地保障应用程序的安全。1.SQL注入漏洞漏洞描述:当应用程序使用用户输入的数据来构建SQL查询时,如果没有进行适当的过滤或转义,攻击者就可以通过构造恶意的
「MySQL」日期时间格式化函数 DATE_FORMAT() 的使用详解
m0_74823827
mysql adb android
目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、DATE_FORMAT()语法DATE_FORMAT()是MySQL中用于格式化日期时间的函数:语法:DATE_FORMAT(date,format_string)date:需要格式化的日期化时间值,一般是需要被格式化的日期时间类型(datetime类),但也可以是日期时间形式的字符串form
SQL-触发器(trigger)的详解以及代码演示
m0_74823827
面试 学习路线 阿里巴巴 sql 数据库 服务器
一、触发器的概念触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器(针对每一行数据变化)或语句级触发器(针对整个SQL语句的变化),行级触发器允许对每一行单独处理,而语句级触发器则在整个操作完成后执行一次。触发器的功能强化约束:触发器能够实现比CHECK语句更
H743定时器输出PWM波方法(基于STM32CubeMX)
NW嵌入式开发
单片机开发 stm32 定时器 PWM模式
0工具准备1.STM32CubeMX2.《STM32H743参考手册中文版》3.《stm32h743xi数据手册》1前言本文介绍基于STM32CubeMX,使用stm32h743xi,使用TIM15的通道2输出PWM波的方法。2H743定时器输出PWM波方法(基于STM32CubeMX)《STM32H743参考手册中文版》对PWM模式的描述如下:其中,有关PWM模式1和模式2的介绍见TIM15_C
B3843 [GESP202306 三级] 密码合规
一台Redmi Note 12 Pro
算法 c++ 数据结构
题目描述网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求:。只能由a∼z之间26个小写字母、A∼Z之间26个大写字母、0∼9之间10个数字以及!@#$四个特殊字符构成。密码最短长度:6个字符,密码最大长度:12个字符。大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。输入格式输入一行不含空格的字符串。约定长度不超过100。该字符串被
Opencv之计算机视觉一
闭月之泪舞
计算机视觉 计算机视觉 opencv python
一、环境准备使用opencv库来实现简单的计算机视觉。需要安装两个库:opencv-python和opencv-contrib-python,版本可以自行选择,注意不同版本的opencv中的某些函数名和用法可能不同pipinstallopencv-python==3.4.18.65-ihttps://pypi.tuna.tsinghua.edu.cn/simplepipinstallopencv-
STM8L1xx利用定时器实现毫秒和微妙延时
荣070214
STM8单片机 单片机 毫秒和微妙延时
采用单片机的定时计数器进行毫秒和微妙级延时,精度较准。检测溢出时产生的标志位来判断延时到达。下面以STM8L101芯片为例及配合代码说明。一、实现原理:1、初始化Timer2时钟源(附上相应代码)voidTIM2Init(void){TIM2_DeInit();CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);TIM2->CR1&=((ui
定时器TIM配置微妙延时函数
寅双木
软件 笔记 单片机 stm32 定时器 TIM 延时函数 微妙延时
定时器TIM配置微妙延时函数文章目录定时器TIM配置微妙延时函数`开胃小菜(BOOT0、BOOT1)``Boot0``Boot1(如果有)``三种定时器``高级控制定时器(TIM1,TIM8)``通用定时器(TIM2,TIM3,TIM4,TIM5)``基本定时器(TIM6,TIM7)``TIM6配置Delay_us()``Prescaler(分频系数)``CounterMode(计数模式)``Co
自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析
赛卡
自动驾驶 自动驾驶 数学建模 python numpy matplotlib 算法
在自动驾驶系统的车辆动力学建模中,自行车模型(BicycleModel)和更复杂的汽车模型(如双轨模型或多体动力学模型)各有其适用场景和优缺点。以下是两者的详细对比及选择原因解析:1.模型定义与核心差异特性自行车模型复杂汽车模型(如双轨模型)简化假设将四轮车辆简化为两轮(前轮转向,后轮驱动)考虑四轮独立运动、悬架系统、轮胎侧偏特性自由度2-3自由度(位置x,y,航向角θ)6+自由度(含横向、俯仰、
【今日EDA行业分析】2025年3月21日
知梦EDA
EDA行业分析 大数据 人工智能 半导体 EDA 行业分析
智算时代EDA行业新变局:技术突围与生态重构一、EDA产业格局剧变:技术壁垒与地缘博弈交织在半导体产业链的宏大版图中,EDA工具宛如数字时代的“工业母机”,其重要性伴随芯片复杂度的指数级攀升而愈发显著。据SEMI数据显示,2023年全球EDA市场规模成功突破200亿美元大关,中国本土市场增速更是达到了18%。然而,Synopsys、Cadence、Mentor这三大行业巨头依旧牢牢占据着超过85%
后端安全可靠性
Small踢倒coffee_氕氘氚
python自学 笔记 经验分享
第一步应该提到参数化查询,也就是预编译语句。这是最有效的方法,比如用PDO或者预处理语句来分离数据和指令。然后,ORM框架也是一个好办法,因为它们通常自动处理参数化,减少手写SQL的机会。接下来,输入验证和过滤很重要。虽然不能完全依赖,但白名单验证比如只允许特定字符,或者转义特殊字符,比如MySQL的mysqli_real_escape_string。不过要注意转义不是绝对安全,尤其是不同数据库有
每日一题一一Leetcode128. 最长连续序列 - 力扣
Blue.ztl
写写算法 leetcode 算法 数据结构
每日一题一一Leetcode128.最长连续序列-力扣作者:blue时间:2025.3.14128.最长连续序列-力扣(LeetCode)本题的要求是:给定一个未排序的整数数组nums,找出其中数字连续的最长序列(不要求序列元素在原数组中连续)的长度。本题用排序加遍历的方法非常容易解决,但是算法的效率太低。本题正真的解题思路如下,首先,数组中是有可能出现重复的数字,但是重复的数字其实并不影响我们找
Flowable 6.6.0应用指南 - Flowable UI应用安装
月满闲庭
# 应用指南中英文对照版
培训视频推荐CSDN上提供了Flowable6.6.0的系列培训视频课程,欢迎有兴趣的朋友前往学习。《Flowable流程入门课程》《Flowable流程高级课程》《Flowable从入门到精通》Flowable6.6.0用户指南相关文档下载BPMN用户指南第一部分-中文PDF精编版BPMN用户指南第二部分-中文PDF精编版BPMN用户指南第三部分-中文PDF精编版应用程序指南-中文PDF精编版应
区块链在医疗数据共享中的应用:解锁安全与透明的新维度
Echo_Wish
人工智能 前沿技术 区块链 安全
区块链在医疗数据共享中的应用:解锁安全与透明的新维度近年来,区块链技术在金融领域取得了显著的突破,然而,它的潜力不仅仅局限于数字货币和支付领域。随着医疗数据的数字化和信息化程度不断提升,区块链技术在医疗数据共享中的应用正逐渐成为一个热门话题。区块链以其去中心化、不可篡改、透明且高效的特点,为医疗行业的数据管理提供了全新的解决方案,尤其是在患者隐私保护、数据共享以及医疗服务的透明度方面。那么,区块链
XPipe:一款新型开源终端管理神器
修己xj
工具 开源
最近,一位朋友在使用Docker时遇到了一个问题:他对宿主机与容器之间的文件复制以及在容器内执行命令等操作感到困惑。这让我开始思考,如果有一款远程管理工具能够直接连接到容器内部,操作是否会变得更加便捷?恰巧,今天在浏览GitHub时,我发现了这样一款名为XPipe的工具。工具介绍XPipe是一款创新的Shell连接中心和远程文件管理器,它能够让你从本地机器轻松访问整个服务器基础设施。这款工具运行在
入门级带你实现一个安卓智能家居APP(2)kotlin版本
一粒程序米
android kotlin 智能家居 WiFi 单片机
前言上一篇写过java版本的实现,这一篇就写一下kotlin版本的吧。效果展示本APP是通过tcp/ip协议与连了WiFi的单片机通信。其实除了主活动类和新建项目时有一丢丢不同,其他的都是一样的哈~第一步:你得会一点点kotlin基础,建议看一本书,是郭霖大神些的《第一行代码》第三版,里面除了安卓的基础教学,还有kotlin的。第二步:建议看一本书,是郭霖大神些的《第一行代码》,先入门安卓基础。不
C语言-排序
<三木>
C/C++杂碎的知识点 c语言 算法 数据结构
C语言-排序冒泡排序选择排序冒泡排序两两比较,大的放后面。每比较一轮,记录交换的次数。当交换的次数为零时,则表示排序完成。chara[10]={9,5,1,2,4,7,6,8,3,0};9大于5交换59124768309大于1交换51924768309大于2交换51294768309大于4交换51249768309大于7交换51247968309大于6交换51247698309大于8交换51247
【C++开源库】tinyxml2解析库使用介绍
小庞在加油
C++知识 c++ 开源 tinyxml2解析库
TinyXML-2是一个在C++中使用的轻量级、简单且高效的XML解析库。它由LeeThomason开发,旨在提供快速解析和生成XML数据的功能,同时保持代码的简洁性和易于使用。TinyXML-2支持多种编译器和平台,包括Windows、Linux和macOS。特点与优势简单易用:TinyXML-2提供了直观的API,使得解析和生成XML文档变得简单。高性能:它经过优化,能够快速解析大型XML文件
vscode设置console.log的快捷输出方式
活宝小娜
vscode vscode ide 编辑器
vscode设置console.log的快捷输出方式编辑器中输入clg回车,可以直接输出console.log,并且同步输出变量的字符串和值1、打开vscode点击左上角的文件2、找到首选项3、点击用户代码配置4、在顶部输入框种输入javas,选择JavaScript选项5、打开里面注释的代码,写入如下内容{//Placeyoursnippetsforjavascripthere."Printto
深度学习 Deep Learning 第8章 深度学习优化
odoo中国
AI编程 人工智能 深度学习 人工智能 优化
深度学习第8章深度学习的优化章节概述本章深入探讨了深度学习中的优化技术,旨在解决模型训练过程中面临的各种挑战。优化是深度学习的核心环节,直接关系到模型的训练效率和最终性能。本章首先介绍了优化在深度学习中的特殊性,然后详细讨论了多种优化算法,包括随机梯度下降(SGD)、动量法、Nesterov动量法、AdaGrad、RMSProp和Adam等。此外,还探讨了参数初始化策略、自适应学习率方法以及二阶优
GPT-4o mini TTS:OpenAI 推出轻量级文本转语音模型!情感操控+白菜价冲击配音圈
蚝油菜花
每日 AI 项目与应用实例 开源 人工智能
❤️如果你也关注AI的发展现状,且对AI应用开发感兴趣,我会每日分享大模型与AI领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!AI在线答疑->智能检索历史文章和开源项目->丰富的AI工具库->每日更新->尽在微信公众号->搜一搜:蚝油菜花️“声优连夜转行送外卖!OpenAI新模型每分钟语音成本仅9分钱”大家好,我是蚝油菜花。当同行还在用机械音合成器折磨听众时,这个AI怪物已
Dify-Plus:企业级AI管理核弹!开源方案吊打SaaS,额度+密钥+鉴权系统全面集成
蚝油菜花
每日 AI 项目与应用实例 人工智能 开源 开源人工智能
❤️如果你也关注AI的发展现状,且对AI应用开发感兴趣,我会每日分享大模型与AI领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!AI在线答疑->智能检索历史文章和开源项目->丰富的AI工具库->每日更新->尽在微信公众号->搜一搜:蚝油菜花“CTO集体失眠!这个开源项目让企业AI管理进入上帝模式”大家好,我是蚝油菜花。当同行还在为API调用次数和预算超支扯皮时,这个国产神器已
【深入理解 SpringBoot3】第一弹:SpringBoot3 快速入门
敖云岚
spring boot 后端 java
一、SpringBoot是什么SpringBoot帮我们简单、快速地创建一个独立的、生产级别的Spring应用大多数SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术。特性:直接嵌入Tomcat、Jetty或Undertow(无需部署war包)提供可选的starter(场景启动器)简化应用的整合实现按需的自动配置Spring以及第三方库(约定大于配置):appli
我们应该用尼古拉特斯拉的振动和频率的角度去观察整个世界包括电机万物的旋转呢?
热爱电气
数学建模
我不能去否定任何科学,也不能说谁的定义不准确,但是我坚信而我想的是是否粒子之间的自旋会扰动时空产生概率性的量子涨落现象呢?那么我们可以想办法设想一下结合尼古拉特斯拉的引力论1.特斯拉的哲学基础:振动、能量与介质特斯拉的理论体系以三个核心概念为基础振动是一切现象的本质:物质是能量的一种振动形式,不同频率的振动对应不同的物质态。以太假说:宇宙中存在一种充满空间的“介质”(以太),它是电磁波和引力的传播
MyBatis——基于MyBatis注解的学生管理程序
基础较差的cs菜鸟
JavaEE实验 mybatis java mysql
MyBatis——基于MyBatis注解的学生管理程序Resourcedao层pojo层utils层测试层实验要求 本实验要求根据学生表在数据库中创建一个s_student表,根据班级表在数据库中创建一个c_class表,班级表c_class和学生表s_student是一对多的关系。实验内容表1学生表(s_student)学生编号(id)学生名称(name)学生年龄(age)所属班级(cid)1
MySQL 中 int (1) 和 int (10) 的区别详解
阿贾克斯的黎明
游戏开发 mysql 数据库
目录MySQL中int(1)和int(10)的区别详解在MySQL数据库的使用过程中,我们创建数据表时经常会用到整数类型,比如int。而细心的开发者可能会注意到,int后面可以跟一个数字,像int(1)和int(10),这两者到底有什么区别呢?今天我们就来深入探讨一下。在MySQL中,int类型后面括号里的数字M,代表的是显示宽度,最大取值为255。需要明确的是,这个显示宽度和该类型可以存储的范围
360 最新Android面试题及参考答案
大模型大数据攻城狮
android 安卓面经 安卓面试 dex结构 hook技术 Binder aosp
一个activity只能有一个进程么【对进程的理解】在Android中,一个Activity并不只能有一个进程。进程是操作系统进行资源分配和调度的一个独立单位。从原理上来说,Android系统允许开发者通过在AndroidManifest.xml文件中的标签设置android:process属性,来指定Activity运行在不同的进程中。例如,如果有一个对性能要求很高的多媒体播放Activity,
下载安装新版Android studio4.1.3无法启动的问题
kaolagirl
Android studio 前端
我原来的AndroidStudio是2.3.3版本的,想更新成最新版,然后就把之前的卸载了,安装一路顺畅,没什么问题,就在我启动的时候进度条到80%就不动了,真的搞了一整天,然后突然看到【yijiaodingqiankun】博主的文章,让我解决了,真的太感谢了!启动不起来的原因是因为,新版的AndroidStudio更换了某些配置的文件夹,和之前的有冲突,还有就是之前的配置文件和新版有冲突,也可能
springboot基于bs 架构的母婴用户商城全程服务管理系统(源码+lw+部署文档+讲解等)
源码哆哆V+ymhydo
Java毕设优质源码 spring boot 架构 后端
具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代码的耦合性,大大提高了软件质量,面向切面编程(AOP)主要是应用动态代理的技术对代码逻辑进行分离,可以实现对代码的重用,适
事务回滚核心技术
KBkongbaiKB
java
一、事务回滚的数学本质与核心挑战1.1事务状态机模型操作执行持久化完成系统故障事务回滚ActivePartiallyCommittedCommittedFailedAborted1.2核心技术挑战矩阵问题维度单机事务分布式事务原子性保证存储引擎WAL日志二阶段提交协议隔离性实现MVCC多版本控制全局锁调度机制可见性管理事务ID版本链向量时钟同步回滚触发条件SQL执行异常/死锁网络分区/节点故障二、
Js函数返回值
_wy_
js return
一、返回控制与函数结果,语法为:return 表达式;作用: 结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二、返回控制语法为:return;作用: 结束函数执行,返回调用函数,而且把undefined作为函数的结果 在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性
MySQL 的 char 与 varchar
bylijinnan
mysql
今天发现,create table 时,MySQL 4.1有时会把 char 自动转换成 varchar
测试举例:
CREATE TABLE `varcharLessThan4` (
`lastName` varchar(3)
) ;
mysql> desc varcharLessThan4;
+----------+---------+------+-
Quartz——TriggerListener和JobListener
eksliang
TriggerListener JobListener quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208624 一.概述
listener是一个监听器对象,用于监听scheduler中发生的事件,然后执行相应的操作;你可能已经猜到了,TriggerListeners接受与trigger相关的事件,JobListeners接受与jobs相关的事件。
二.JobListener监听器
j
oracle层次查询
18289753290
oracle;层次查询;树查询
.oracle层次查询(connect by)
oracle的emp表中包含了一列mgr指出谁是雇员的经理,由于经理也是雇员,所以经理的信息也存储在emp表中。这样emp表就是一个自引用表,表中的mgr列是一个自引用列,它指向emp表中的empno列,mgr表示一个员工的管理者,
select empno,mgr,ename,sal from e
通过反射把map中的属性赋值到实体类bean对象中
酷的飞上天空
javaee 泛型 类型转换
使用过struts2后感觉最方便的就是这个框架能自动把表单的参数赋值到action里面的对象中
但现在主要使用Spring框架的MVC,虽然也有@ModelAttribute可以使用但是明显感觉不方便。
好吧,那就自己再造一个轮子吧。
原理都知道,就是利用反射进行字段的赋值,下面贴代码
主要类如下:
import java.lang.reflect.Field;
imp
SAP HANA数据存储:传统硬盘的瓶颈问题
蓝儿唯美
HANA
SAPHANA平台有各种各样的应用场景,这也意味着客户的实施方法有许多种选择,关键是如何挑选最适合他们需求的实施方案。
在 《Implementing SAP HANA》这本书中,介绍了SAP平台在现实场景中的运作原理,并给出了实施建议和成功案例供参考。本系列文章节选自《Implementing SAP HANA》,介绍了行存储和列存储的各自特点,以及SAP HANA的数据存储方式如何提升空间压
Java Socket 多线程实现文件传输
随便小屋
java socket
高级操作系统作业,让用Socket实现文件传输,有些代码也是在网上找的,写的不好,如果大家能用就用上。
客户端类:
package edu.logic.client;
import java.io.BufferedInputStream;
import java.io.Buffered
java初学者路径
aijuans
java
学习Java有没有什么捷径?要想学好Java,首先要知道Java的大致分类。自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE
APP推广
aoyouzi
APP 推广
一,免费篇
1,APP推荐类网站自主推荐
最美应用、酷安网、DEMO8、木蚂蚁发现频道等,如果产品独特新颖,还能获取最美应用的评测推荐。PS:推荐简单。只要产品有趣好玩,用户会自主分享传播。例如足迹APP在最美应用推荐一次,几天用户暴增将服务器击垮。
2,各大应用商店首发合作
老实盯着排期,多给应用市场官方负责人献殷勤。
3,论坛贴吧推广
百度知道,百度贴吧,猫扑论坛,天涯社区,豆瓣(
JSP转发与重定向
百合不是茶
jsp servlet Java Web jsp转发
在servlet和jsp中我们经常需要请求,这时就需要用到转发和重定向;
转发包括;forward和include
例子;forwrad转发; 将请求装法给reg.html页面
关键代码;
req.getRequestDispatcher("reg.html
web.xml之jsp-config
bijian1013
java web.xml servlet jsp-config
1.作用:主要用于设定JSP页面的相关配置。
2.常见定义:
<jsp-config>
<taglib>
<taglib-uri>URI(定义TLD文件的URI,JSP页面的tablib命令可以经由此URI获取到TLD文件)</tablib-uri>
<taglib-location>
TLD文件所在的位置
JSF2.2 ViewScoped Using CDI
sunjing
CDI JSF 2.2 ViewScoped
JSF 2.0 introduced annotation @ViewScoped; A bean annotated with this scope maintained its state as long as the user stays on the same view(reloads or navigation - no intervening views). One problem w
【分布式数据一致性二】Zookeeper数据读写一致性
bit1129
zookeeper
很多文档说Zookeeper是强一致性保证,事实不然。关于一致性模型请参考http://bit1129.iteye.com/blog/2155336
Zookeeper的数据同步协议
Zookeeper采用称为Quorum Based Protocol的数据同步协议。假如Zookeeper集群有N台Zookeeper服务器(N通常取奇数,3台能够满足数据可靠性同时
Java开发笔记
白糖_
java开发
1、Map<key,value>的remove方法只能识别相同类型的key值
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"a");
map.put(2,"b");
map.put(3,"c"
图片黑色阴影
bozch
图片
.event{ padding:0; width:460px; min-width: 460px; border:0px solid #e4e4e4; height: 350px; min-heig
编程之美-饮料供货-动态规划
bylijinnan
动态规划
import java.util.Arrays;
import java.util.Random;
public class BeverageSupply {
/**
* 编程之美 饮料供货
* 设Opt(V’,i)表示从i到n-1种饮料中,总容量为V’的方案中,满意度之和的最大值。
* 那么递归式就应该是:Opt(V’,i)=max{ k * Hi+Op
ajax大参数(大数据)提交性能分析
chenbowen00
Web Ajax 框架 浏览器 prototype
近期在项目中发现如下一个问题
项目中有个提交现场事件的功能,该功能主要是在web客户端保存现场数据(主要有截屏,终端日志等信息)然后提交到服务器上方便我们分析定位问题。客户在使用该功能的过程中反应点击提交后反应很慢,大概要等10到20秒的时间浏览器才能操作,期间页面不响应事件。
根据客户描述分析了下的代码流程,很简单,主要通过OCX控件截屏,在将前端的日志等文件使用OCX控件打包,在将之转换为
[宇宙与天文]在太空采矿,在太空建造
comsci
我们在太空进行工业活动...但是不太可能把太空工业产品又运回到地面上进行加工,而一般是在哪里开采,就在哪里加工,太空的微重力环境,可能会使我们的工业产品的制造尺度非常巨大....
地球上制造的最大工业机器是超级油轮和航空母舰,再大些就会遇到困难了,但是在空间船坞中,制造的最大工业机器,可能就没
ORACLE中CONSTRAINT的四对属性
daizj
oracle CONSTRAINT
ORACLE中CONSTRAINT的四对属性
summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,如何利用约束本身的属性来处理这些问题呢?本文详细介绍了约束的四对属性: Deferrable/not deferrable, Deferred/immediate, enalbe/disable, validate/novalidate,以及如
Gradle入门教程
dengkane
gradle
一、寻找gradle的历程
一开始的时候,我们只有一个工程,所有要用到的jar包都放到工程目录下面,时间长了,工程越来越大,使用到的jar包也越来越多,难以理解jar之间的依赖关系。再后来我们把旧的工程拆分到不同的工程里,靠ide来管理工程之间的依赖关系,各工程下的jar包依赖是杂乱的。一段时间后,我们发现用ide来管理项程很不方便,比如不方便脱离ide自动构建,于是我们写自己的ant脚本。再后
C语言简单循环示例
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i;
int count = 0;
int sum = 0;
float avg;
for (i=1; i<=100; i++)
{
if (i%2==0)
{
count++;
sum += i;
}
}
avg
presentModalViewController 的动画效果
dcj3sjt126com
controller
系统自带(四种效果):
presentModalViewController模态的动画效果设置:
[cpp]
view plain
copy
UIViewController *detailViewController = [[UIViewController al
java 二分查找
shuizhaosi888
二分查找 java二分查找
需求:在排好顺序的一串数字中,找到数字T
一般解法:从左到右扫描数据,其运行花费线性时间O(N)。然而这个算法并没有用到该表已经排序的事实。
/**
*
* @param array
* 顺序数组
* @param t
* 要查找对象
* @return
*/
public stati
Spring Security(07)——缓存UserDetails
234390216
ehcache 缓存 Spring Security
Spring Security提供了一个实现了可以缓存UserDetails的UserDetailsService实现类,CachingUserDetailsService。该类的构造接收一个用于真正加载UserDetails的UserDetailsService实现类。当需要加载UserDetails时,其首先会从缓存中获取,如果缓存中没
Dozer 深层次复制
jayluns
VO maven po
最近在做项目上遇到了一些小问题,因为架构在做设计的时候web前段展示用到了vo层,而在后台进行与数据库层操作的时候用到的是Po层。这样在业务层返回vo到控制层,每一次都需要从po-->转化到vo层,用到BeanUtils.copyProperties(source, target)只能复制简单的属性,因为实体类都配置了hibernate那些关联关系,所以它满足不了现在的需求,但后发现还有个很
CSS规范整理(摘自懒人图库)
a409435341
html UI css 浏览器
刚没事闲着在网上瞎逛,找了一篇CSS规范整理,粗略看了一下后还蛮有一定的道理,并自问是否有这样的规范,这也是初入前端开发的人一个很好的规范吧。
一、文件规范
1、文件均归档至约定的目录中。
具体要求通过豆瓣的CSS规范进行讲解:
所有的CSS分为两大类:通用类和业务类。通用的CSS文件,放在如下目录中:
基本样式库 /css/core
C++动态链接库创建与使用
你不认识的休道人
C++ dll
一、创建动态链接库
1.新建工程test中选择”MFC [dll]”dll类型选择第二项"Regular DLL With MFC shared linked",完成
2.在test.h中添加
extern “C” 返回类型 _declspec(dllexport)函数名(参数列表);
3.在test.cpp中最后写
extern “C” 返回类型 _decls
Android代码混淆之ProGuard
rensanning
ProGuard
Android应用的Java代码,通过反编译apk文件(dex2jar、apktool)很容易得到源代码,所以在release版本的apk中一定要混淆一下一些关键的Java源码。
ProGuard是一个开源的Java代码混淆器(obfuscation)。ADT r8开始它被默认集成到了Android SDK中。
官网:
http://proguard.sourceforge.net/
程序员在编程中遇到的奇葩弱智问题
tomcat_oracle
jquery 编程 ide
现在收集一下:
排名不分先后,按照发言顺序来的。
1、Jquery插件一个通用函数一直报错,尤其是很明显是存在的函数,很有可能就是你没有引入jquery。。。或者版本不对
2、调试半天没变化:不在同一个文件中调试。这个很可怕,我们很多时候会备份好几个项目,改完发现改错了。有个群友说的好: 在汤匙
解决maven-dependency-plugin (goals "copy-dependencies","unpack") is not supported
xp9802
dependency
解决办法:在plugins之前添加如下pluginManagement,二者前后顺序如下:
[html]
view plain
copy
<build>
<pluginManagement