当前位置: 首页 > news >正文

10步打造完美ASP.NET、Web API和控制台应用程序文件夹结构

一、前言

在大型项目中,合理的文件夹结构是项目成功的关键之一。一个好的文件夹结构就像是一座井然有序的图书馆,每一本书(代码文件)都有其固定的位置,让人能迅速找到所需。它可以让团队成员更容易理解和维护代码,减少代码冲突,提高开发效率。想象一下,在一个没有规划的项目里,各种文件杂乱无章地堆砌在一起,新成员加入时,光是弄清楚代码的布局就得花费大量时间,更别提高效开发了。接下来,我们将详细介绍如何在ASP.NET、Web API 和控制台应用程序中组织文件夹结构,带你开启高效编程之旅。

二、ASP.NET文件夹结构组织

2.1 基本文件夹结构

一个典型的ASP.NET项目文件夹结构如下:

MyProject/
├── Controllers/
│   ├── HomeController.cs
│   └── AccountController.cs
├── Models/
│   ├── User.cs
│   └── Product.cs
├── Views/
│   ├── Home/
│   │   └── Index.cshtml
│   └── Account/
│       └── Login.cshtml
├── App_Start/
│   ├── RouteConfig.cs
│   └── BundleConfig.cs
├── Filters/
│   └── AuthorizeAttribute.cs
├── Scripts/
│   └── site.js
├── Content/
│   └── site.css
├── Properties/
│   └── launchSettings.json
├── wwwroot/
│   ├── css/
│   ├── js/
│   └── img/
├── App_Data/
│   └── database.mdf
├── Tests/
│   └── UnitTests.cs
├── bin/
└── MyProject.csproj

2.2 详细解释

  • Controllers:存放所有控制器类文件,每个控制器负责处理特定的请求。就好比是餐厅里的服务员,根据客人(用户请求)的不同需求,引导他们到相应的餐桌(处理逻辑),例如HomeController负责处理与首页相关的请求,AccountController则专注于账户相关操作。

  • Models:存放所有模型类文件,模型类用于表示数据结构。可以将其想象成工厂里的模具,定义了产品(数据)的形状和规格,像User模型类对应着用户的数据结构,包含用户的各种属性,如Id、Name、Email等。

  • Views:存放所有视图文件,每个视图文件对应一个控制器的操作。它是用户直接看到的界面,如同舞台上的表演,不同的场景(视图)由对应的演员(控制器操作)触发,比如Home控制器的Index操作对应的视图文件Index.cshtml,用于展示首页的内容。

  • App_Start:存放应用程序启动时需要初始化的配置文件,如路由配置和捆绑配置。这就像是汽车的启动装置,在启动时要设定好行驶路线(路由)以及资源的加载方式(捆绑),确保应用程序能按照预定的规则运行。

  • Filters:存放过滤器类文件,用于处理请求和响应的预处理和后处理。类似于安检门,在请求进入和响应出去之前进行检查和过滤,比如AuthorizeAttribute过滤器可以用于验证用户是否有权限访问某些资源。

  • Scripts:存放 JavaScript 文件。这些文件为网页增添动态交互效果,如同魔术师手中的道具,让页面变得更加生动有趣,site.js可能包含页面的一些特效、表单验证等交互逻辑。

  • Content:存放 CSS 文件和其他静态资源。它决定了网页的外观样式,就像化妆师为演员化妆,通过site.css等文件设置字体、颜色、布局等,让页面美观大方。

  • Properties:存放项目属性文件,如launchSettings.json。这是项目的 “身份证”,记录了项目启动的相关设置,如开发环境下的端口号等信息。

  • wwwroot:存放静态文件,如图片、JavaScript 和 CSS 文件。这里是网页的素材库,浏览器可以直接访问其中的资源,为页面提供丰富的视觉和交互元素。

  • App_Data:存放数据库文件和其他数据文件。相当于仓库,存储着应用程序运行所需的数据,如database.mdf是数据库文件,存放着用户信息、业务数据等。

  • Tests:存放单元测试文件。这是项目的质检员,通过编写各种测试用例,对代码的各个模块进行检测,确保代码质量,如UnitTests.cs可以对控制器、模型等进行功能测试。

  • bin:存放编译后的输出文件。是代码编译后的 “成品区”,编译好的程序集等文件存放在这里,供运行时使用。

  • MyProject.csproj:项目的配置文件。它是项目的 “管家”,管理着项目的依赖项、编译选项、引用的库等信息,确保项目能够正确构建和运行。

2.3 示例代码

以下是部分关键代码示例:

using System.Web.Mvc;
namespace MyProject.Controllers
{public class HomeController : Controller{// GET: Homepublic ActionResult Index(){return View();}}
}

这段代码定义了一个名为HomeController的控制器,它继承自Controller基类,有一个Index方法,当用户访问应用程序的根路径(对应Home控制器的Index操作)时,该方法返回对应的视图。

namespace MyProject.Models
{public class User{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }}
}

这里定义了一个User模型类,包含Id、Name、Email三个属性,用于表示用户的数据结构,在应用程序的不同层之间传递用户相关的数据。

@model MyProject.Models.User
@{ViewBag.Title = "Home Page";
}
<h1>Welcome, @Model.Name!</h1>
<p>Email: @Model.Email</p>

这是Views/Home/Index.cshtml视图文件的部分代码,通过@model指令指定该视图使用的模型为MyProject.Models.User,然后在页面中展示了用户的姓名和邮箱信息,实现了数据从模型到视图的展示。

三、Web API 文件夹结构组织

3.1 基本文件夹结构

一个典型的 Web API 项目文件夹结构如下:

MyWebApi/
├── Controllers/
│   ├── UsersController.cs
│   └── ProductsController.cs
├── Models/
│   ├── User.cs
│   └── Product.cs
├── DTOs/
│   ├── UserDto.cs
│   └── ProductDto.cs
├── Services/
│   ├── UserService.cs
│   └── ProductService.cs
├── Repositories/
│   ├── UserRepository.cs
│   └── ProductRepository.cs
├── Interfaces/
│   ├── IUserService.cs
│   └── IProductService.cs
├── Migrations/
│   └── InitialCreate.cs
├── App_Start/
│   ├── WebApiConfig.cs
│   └── FilterConfig.cs
├── Filters/
│   └── ValidateModelAttribute.cs
├── Helpers/
│   └── Utility.cs
├── Properties/
│   └── launchSettings.json
├── wwwroot/
│   ├── css/
│   ├── js/
│   └── img/
├── Tests/
│   └── UnitTests.cs
├── bin/
└── MyWebApi.csproj

3.2 详细解释

  • Controllers:存放所有 API 控制器类文件,每个控制器负责处理特定的 API 请求。就像是交通枢纽的调度员,根据不同的路线请求(API 请求),指引车辆(数据)去往相应的目的地,例如UsersController处理与用户相关的 API 操作,像获取用户列表、查询单个用户信息等。

  • Models:存放所有模型类文件,模型类用于表示数据结构。如同建筑蓝图,定义了数据的架构,User模型类规定了用户数据有哪些字段,如Id、Name、Email等,为数据的存储和传输提供了模板。

  • DTOs:存放数据传输对象(DTO)类文件,用于在客户端和服务器之间传输数据。可以把它想象成快递包裹,将服务器端的数据精心打包,按照客户端能够理解的方式进行封装,避免直接暴露内部复杂的数据结构,UserDto可能只包含客户端需要展示的用户部分信息,减少不必要的数据传输。

  • Services:存放业务逻辑类文件,每个服务类负责处理特定的业务逻辑。这是项目的 “智囊团”,例如UserService包含了用户注册、登录验证、用户信息修改等业务逻辑,将复杂的业务规则封装在其中,使得控制器能专注于请求处理。

  • Repositories:存放数据访问类文件,每个仓库类负责与数据库进行交互。相当于数据库的 “管家”,UserRepository负责执行与用户数据相关的数据库操作,如查询用户、插入新用户、更新用户信息等,将数据库操作细节封装起来,提高代码的可维护性。

  • Interfaces:存放接口文件,用于定义服务和仓库的契约。就像是电器的插头标准,确保不同组件之间能够正确连接和交互,IUserService接口定义了UserService应该实现的方法,让依赖注入等机制能更方便地管理组件间的关系。

  • Migrations:存放数据库迁移文件,用于管理数据库 schema 的变化。好比是城市的规划变更记录,随着项目发展,数据库结构可能需要调整,迁移文件记录了从一个版本到另一个版本的数据库结构变化过程,方便团队协作和版本管理。

  • App_Start:存放应用程序启动时需要初始化的配置文件,如路由配置和过滤器配置。这是项目启动的 “导航仪”,WebApiConfig.cs配置 API 的路由规则,确保请求能准确找到对应的控制器和操作方法,FilterConfig.cs设置过滤器,对请求和响应进行预处理和后处理。

  • Filters:存放过滤器类文件,用于处理请求和响应的预处理和后处理。类似工厂的质检环节,在数据流入流出时进行检查和过滤,ValidateModelAttribute过滤器可以验证传入 API 的数据是否符合模型定义,若不符合则提前返回错误信息,避免无效数据进入业务逻辑层。

  • Helpers:存放辅助类文件,用于提供常用的工具方法。如同工具箱,里面装着各种实用工具,Utility类可能包含一些通用的字符串处理、日期处理等方法,供项目的其他部分复用,提高开发效率。

  • Properties:存放项目属性文件,如launchSettings.json。这是项目的 “配置档案”,记录了项目启动的环境设置,如开发环境下运行的端口号、是否启用调试等信息。

  • wwwroot:存放静态文件,如图片、JavaScript 和 CSS 文件。这里是 Web API 对外展示的 “橱窗”,虽然 Web API 主要侧重于数据接口,但有时也可能需要提供一些静态资源,如接口文档的样式文件等,浏览器可以直接访问其中的资源。

  • Tests:存放单元测试文件。这是项目的 “体检中心”,针对各个组件编写测试用例,确保UsersController的每个 API 方法、UserService的业务逻辑、UserRepository的数据访问等都能正常工作,保障项目质量。

  • bin:存放编译后的输出文件。是代码编译后的 “成品区”,编译好的程序集等文件存放在这里,供运行时使用。

  • MyWebApi.csproj:项目的配置文件。它是项目的 “管家”,管理着项目的依赖项、编译选项、引用的库等信息,确保项目能够正确构建和运行。

3.3 示例代码

以下是部分关键代码示例:

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using MyWebApi.Models;
using MyWebApi.Services;
namespace MyWebApi.Controllers
{public class UsersController : ApiController{private readonly IUserService _userService;public UsersController(IUserService userService){_userService = userService;}// GET: api/Userspublic IEnumerable<User> Get(){return _userService.GetAllUsers();}// GET: api/Users/5public User Get(int id){return _userService.GetUserById(id);}// POST: api/Userspublic void Post([FromBody]User user){_userService.AddUser(user);}// PUT: api/Users/5public void Put(int id, [FromBody]User user){_userService.UpdateUser(id, user);}// DELETE: api/Users/5public void Delete(int id){_userService.DeleteUser(id);}}
}

这段UsersController代码继承自ApiController,通过依赖注入获取IUserService实例,然后根据不同的 HTTP 请求方法(GET、POST、PUT、DELETE),调用对应的UserService方法来处理用户数据的查询、新增、更新和删除操作。例如,Get方法用于获取所有用户列表,当客户端发送GET请求到api/Users路径时,会返回所有用户信息。

using System.Collections.Generic;
using MyWebApi.Models;
namespace MyWebApi.Services
{public interface IUserService{IEnumerable<User> GetAllUsers();User GetUserById(int id);void AddUser(User user);void UpdateUser(int id, User user);void DeleteUser(int id);}
}

IUserService接口定义了用户服务应该具备的方法,这是一种契约,确保实现该接口的类(如UserService)必须提供这些方法的具体实现,使得代码的依赖关系更加清晰,便于维护和扩展。

using System.Collections.Generic;
using System.Linq;
using MyWebApi.Models;
namespace MyWebApi.Services
{public class UserService : IUserService{private readonly List<User> _users = new List<User>{new User { Id = 1, Name = "Alice", Email = "alice@example.com" },new User { Id = 2, Name = "Bob", Email = "bob@example.com" }};public IEnumerable<User> GetAllUsers(){return _users;}public User GetUserById(int id){return _users.FirstOrDefault(u => u.Id == id);}public void AddUser(User user){user.Id = _users.Max(u => u.Id) + 1;_users.Add(user);}public void UpdateUser(int id, User user){var existingUser = _users.FirstOrDefault(u => u.Id == id);if (existingUser!= null){existingUser.Name = user.Name;existingUser.Email = user.Email;}}public void DeleteUser(int id){var userToDelete = _users.FirstOrDefault(u => u.Id == id);if (userToDelete!= null){_users.Remove(userToDelete);}}}
}

UserService类实现了IUserService接口,内部使用一个简单的List模拟数据库存储用户数据。GetAllUsers方法返回所有用户列表,GetUserById根据传入的id查找并返回对应的用户,AddUser向列表中添加新用户并分配唯一Id,UpdateUser更新指定id用户的信息,DeleteUser删除指定id的用户,这些方法体现了对用户数据的基本业务操作逻辑。

四、控制台应用程序文件夹结构组织

MyConsoleApp/
├── Program.cs
├── Models/
│   ├── User.cs
│   └── Product.cs
├── Services/
│   ├── UserService.cs
│   └── ProductService.cs
├── Repositories/
│   ├── UserRepository.cs
│   └── ProductRepository.cs
├── Interfaces/
│   ├── IUserService.cs
│   └── IProductService.cs
├── Helpers/
│   └── Utility.cs
├── Config/
│   └── appsettings.json
├── Logs/
│   └── log.txt
├── Tests/
│   └── UnitTests.cs
├── bin/
└── MyConsoleApp.csproj

4.2 详细解释

  • Program.cs:项目的入口文件,包含Main方法。它就像是一场音乐会的指挥家,是整个控制台应用程序启动的起点,程序从这里开始按部就班地执行,在Main方法里可以初始化各种服务、加载配置,然后调用相应的业务逻辑。

  • Models:存放所有模型类文件,模型类用于表示数据结构。类似于建筑的基石,定义了数据的基本形态,User模型类描述了用户数据的构成,有哪些字段,为数据在程序中的流转提供了统一的模板。

  • Services:存放业务逻辑类文件,每个服务类负责处理特定的业务逻辑。这是项目的 “大脑中枢”,UserService负责处理用户相关的业务,如用户注册、登录验证、信息修改等复杂操作,将业务规则封装在其中,使得程序的逻辑清晰,易于维护。

  • Repositories:存放数据访问类文件,每个仓库类负责与数据库进行交互。相当于数据库的 “搬运工”,UserRepository负责从数据库中获取用户数据、将新用户数据存入数据库、更新或删除用户数据等操作,把数据库操作细节隐藏起来,提高代码的可维护性和可测试性。

  • Interfaces:存放接口文件,用于定义服务和仓库的契约。就像是不同设备之间的接口标准,确保服务类和仓库类能够按照统一的规范进行交互,IUserService接口规定了UserService应该实现的方法,方便进行依赖注入等操作,让代码结构更加灵活。

  • Helpers:存放辅助类文件,用于提供常用的工具方法。如同工具箱里的各种工具,Utility类可能包含一些文件读写、字符串处理、日期格式化等通用方法,供项目的其他部分复用,避免重复造轮子,提高开发效率。

  • Config:存放配置文件,如appsettings.json。这是项目的 “配置宝库”,可以配置数据库连接字符串、日志级别、应用程序的一些运行参数等,使得应用程序在不同环境下能够灵活运行,通过修改配置文件,无需改动代码就能调整程序的行为。

  • Logs:存放日志文件。它是程序运行的 “日记本”,记录着程序运行过程中的关键信息,如错误信息、重要操作的记录等,方便在出现问题时排查故障,了解程序的运行轨迹,log.txt里详细记录着每一次的异常、警告以及一些关键业务的执行情况。

  • Tests:存放单元测试文件。这是项目的 “质检员”,针对各个组件编写测试用例,确保UserService的业务逻辑正确、UserRepository的数据访问无误等,保障项目质量,就像对产品的各个零部件进行严格检测,只有通过测试的代码才能进入正式的运行环境。

  • bin:存放编译后的输出文件。是代码编译后的 “成品区”,编译好的程序集等文件存放在这里,供运行时使用,当程序启动时,会从这里加载可执行文件,让程序跑起来。

  • MyConsoleApp.csproj:项目的配置文件。它是项目的 “管家”,管理着项目的依赖项、编译选项、引用的库等信息,确保项目能够正确构建和运行,比如引入外部的数据库驱动库、日志框架等依赖,都要在这个文件里进行配置。

4.3 示例代码

以下是部分关键代码示例:

using System;
using MyConsoleApp.Services;
namespace MyConsoleApp
{class Program{static void Main(string[] args){var userService = new UserService();var users = userService.GetAllUsers();Console.WriteLine("Users:");foreach (var user in users){Console.WriteLine($"Name: {user.Name}, Email: {user.Email}");}}}
}

这段Program.cs代码是控制台应用程序的入口,在Main方法中,首先实例化UserService,然后调用其GetAllUsers方法获取所有用户信息,并将用户的姓名和邮箱打印到控制台,展示了从服务获取数据并进行简单输出的过程。

using System.Collections.Generic;
using MyConsoleApp.Models;
namespace MyConsoleApp.Services
{public interface IUserService{IEnumerable<User> GetAllUsers();}
}

IUserService接口定义了用户服务应该具备的获取所有用户的方法,为服务类的实现提供了统一的契约,使得其他组件可以依赖这个接口进行编程,而不用担心具体的实现细节。

using System.Collections.Generic;
using MyConsoleApp.Models;
namespace MyConsoleApp.Services
{public class UserService : IUserService{private readonly List<User> _users = new List<User>{new User { Id = 1, Name = "Alice", Email = "alice@example.com" },new User { Id = 2, Name = "Bob", Email = "bob@example.com" }};public IEnumerable<User> GetAllUsers(){return _users;}}
}

UserService类实现了IUserService接口,内部使用一个简单的List模拟数据库存储用户数据,GetAllUsers方法返回这个列表,模拟从数据库获取所有用户数据的操作,体现了业务逻辑层对数据的处理和提供对外接口的功能。

五、打造完美文件夹结构的 10 个通用步骤

5.1 明确项目需求与架构

在着手构建文件夹结构之前,要对项目需求进行全方位剖析。比如开发一个电商项目,需考虑商品展示、用户购物流程、支付体系、订单管理等功能模块。依据项目规模,判断是小型创业项目快速迭代,还是大型企业级应用严谨架构;考虑团队协作模式,是分布式团队远程协作,还是集中办公紧密沟通。基于这些确定项目架构,如采用经典的三层架构(表现层、业务逻辑层、数据访问层),还是微服务架构将功能拆分为多个独立服务,为后续文件夹规划奠定基础。

5.2 按职责划分文件夹

依据代码功能分类创建文件夹,这是让项目井然有序的关键。数据模型相关代码统一归入 “Models” 文件夹,它如同建筑蓝图,定义了数据的结构,像用户模型、商品模型等。业务逻辑放入 “Services” 文件夹,这里是项目的 “智囊团”,处理订单创建、用户注册登录等复杂业务。数据访问操作集中在 “Repositories” 文件夹,负责与数据库对接,执行数据的增删改查。如此一来,开发人员能迅速定位所需代码,如在电商项目中找商品数据操作,直奔 “Repositories” 下与商品相关类。

5.3 规范文件夹命名

统一、表意清晰的命名规则至关重要。文件夹名采用复数形式,清晰表明其包含内容,如 “Controllers”“Models”。遵循通用命名习惯,配置文件放 “Config”,辅助工具类放 “Helpers”,避免使用晦涩难懂缩写或随意名称。在团队协作时,新成员看到规范命名就能快速领会文件夹用途,减少沟通成本,提升开发效率。

5.4 分离关注点

每个文件夹应专注单一职责,杜绝代码混杂。“Controllers” 只处理请求转发与响应,不涉及业务逻辑细节;“Models” 纯粹定义数据结构,不含业务规则。以博客系统为例,文章控制器只负责接收用户对文章的操作请求,将数据传递给服务层处理,不操心文章数据如何存储,保持职责纯粹,后续维护升级时,能迅速定位问题代码,修改一处不影响其他功能。

5.5 合理规划层级

采用浅层扁平结构,避免文件夹层级过深。一般三层左右为宜,如项目根目录下一级是功能模块文件夹,再下一级是对应功能的具体分类文件夹。过深层级会让文件查找困难,像在多层嵌套找一个特定工具类,犹如大海捞针。合理层级让代码导航便捷,开发人员能快速在相关层级找到目标文件。

5.6 处理静态文件

针对不同程序类型妥善安排静态文件位置。在ASP.NET中,图片、JavaScript、CSS 等静态文件放 “wwwroot” 文件夹,浏览器可直接访问,便于前端页面渲染。Web API 虽主要提供数据接口,但有时也需静态资源,类似处理,将相关文件规整存放,确保访问顺畅,如接口文档的样式文件放对应位置,提升接口可读性。

5.7 管理配置文件

将配置文件集中存放,便于统一管理与维护。ASP.NET的应用程序启动配置放 “App_Start”,包含路由、捆绑配置等;控制台应用程序的配置,如数据库连接字符串、日志级别设置,放 “Config” 文件夹下的 “appsettings.json”。开发不同环境(开发、测试、生产)时,能便捷切换配置,避免因配置散落各处导致遗漏或错误。

5.8 重视测试文件夹

专门设立 “Tests” 文件夹存放测试文件,涵盖单元测试、集成测试等。测试是项目质量保障,为代码编写配套测试用例,如对 Web API 的控制器方法测试请求响应正确性,对业务逻辑类测试复杂业务规则。持续运行测试,能及时发现代码变更引入的问题,保障项目稳定可靠,每次代码提交前跑一遍测试,确保新功能不破坏原有功能。

5.9 持续优化调整

项目在迭代开发中,需求变更、技术升级不可避免,文件夹结构要随之优化。依据代码异味、团队反馈,如某个文件夹文件过多过杂,需重新拆分;发现新功能模块与现有结构不契合,及时调整布局。定期回顾结构合理性,让文件夹结构始终适配项目发展,保持代码库健康。

5.10 团队协作与沟通

团队成员务必遵循统一文件夹结构规范,这是项目有序推进的基石。新成员加入时,安排培训讲解结构要点;开发过程中,若对结构有分歧或改进建议,及时沟通交流。利用版本控制系统提交说明、团队会议等,确保大家理解并遵守结构约定,避免个人随意变更导致混乱,让文件夹结构有效落地,助力项目成功。

六、总结

在ASP.NET、Web API 和控制台应用程序开发中,合理的文件夹结构是项目成功的基石。ASP.NET项目通过清晰划分控制器、模型、视图等文件夹,让 Web 应用开发有条不紊;Web API 项目借助专门的 DTOs、Repositories 等文件夹,高效处理数据交互与业务逻辑;控制台应用程序虽结构相对简洁,但合理布局模型、服务、配置等文件夹同样关键。遵循本文的 10 个步骤,明确需求、规范命名、分离职责、重视测试并持续优化,能让代码可读性、可维护性大幅提升,减少团队协作的摩擦。希望大家将这些方法运用到实际项目,打造出结构精良的应用程序,开启高效编程之旅。

相关文章:

10步打造完美ASP.NET、Web API和控制台应用程序文件夹结构

一、前言 在大型项目中&#xff0c;合理的文件夹结构是项目成功的关键之一。一个好的文件夹结构就像是一座井然有序的图书馆&#xff0c;每一本书&#xff08;代码文件&#xff09;都有其固定的位置&#xff0c;让人能迅速找到所需。它可以让团队成员更容易理解和维护代码&…...

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…...

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…...

Trimble自动化激光监测支持历史遗产实现可持续发展【沪敖3D】

故事桥&#xff08;Story Bridge&#xff09;位于澳大利亚布里斯班&#xff0c;建造于1940年&#xff0c;全长777米&#xff0c;横跨布里斯班河&#xff0c;可载汽车、自行车和行人往返于布里斯班的北部和南部郊区。故事桥是澳大利亚最长的悬臂桥&#xff0c;是全世界两座手工建…...

深入解析 C++ 类型转换

简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程&#xff0c;但太费劲了&#xff0c;这里有个非常简便的好方法&#xff0c;分享给大家。 1. 导入QXlsx库 转载链接 &#xff1a;https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…...

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…...

全面掌握APT、Vim和GCC:Ubuntu软件管理与开发指南

文章目录 Ubuntu 软件包管理器Ubuntu 软件包管理的基本概念常用的软件包管理器APTAPT常用命令 vimVim 的基本概念Vim 的工作模式Vim 的基本操作 gcc/gUbuntu 安装 gcc / g编译知识使用方法动静态函数库 Ubuntu 软件包管理器 在 **Ubuntu** 系统中&#xff0c;软件包管理器用于…...

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …...

【Ubuntu与Linux操作系统:七、系统高级管理】

第7章 系统高级管理 7.1 Linux进程管理 进程是Linux系统中的基本运行单位&#xff0c;代表一个正在执行的程序。Linux通过进程管理实现多任务并发处理&#xff0c;支持用户高效利用系统资源。 1. 进程的基本概念&#xff1a; 进程状态&#xff1a;进程在运行过程中可能处于运…...

多线程面试相关

线程基础知识 线程与进程的区别 并行和并发的区别 创建线程的方式 Runnable和Callable有什么区别 run()方法和start()方法的区别 小结 线程包含哪些状态&#xff0c;各个状态之间如何变化 线程按顺序执行 notify()和notifyAll()的区别 Java中的wait方法和sleep方法的不同 如何…...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…...

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…...

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…...

基于微信小程序的食堂线上预约点餐系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法初学者(图的存储)链式前向星

知识储备&#xff1a;概念&#xff0c;存储&#xff0c;遍历&#xff0c;最短路&#xff0c;最小生成树&#xff0c;拓扑排序-关键路径 图的存储&#xff1a;邻接矩阵&#xff0c;邻接表&#xff0c;十字链表&#xff0c;多重邻接表&#xff0c;边集数组 其中&#xff1a;邻接…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

Leetcode 3419. Minimize the Maximum Edge Weight of Graph

Leetcode 3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路 这一题我的思路就是二分法&#xff0c;找到能够完成遍历的临界值即可。 但是自己实际在…...

深入理解数据库索引及其优化策略

数据库作为现代应用系统的核心组件之一&#xff0c;如何高效地存储和检索数据成为开发者关注的焦点。 在处理大规模数据时&#xff0c;数据库索引 是提升查询性能的关键技术之一。本文将深入探讨数据库索引的工作原理、常见类型、创建索引的策略以及如何优化索引&#xff0c;以…...

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…...

css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…...

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…...

IntelliJ IDEA 主题插件

在 IntelliJ IDEA 中&#xff0c;有很多优秀的主题插件可以帮助你改变 IDE 的外观和配色方案&#xff0c;使得开发过程更加愉悦和高效。以下是一些非常受欢迎和实用的 主题插件&#xff0c;以及如何安装和使用它们的步骤&#xff1a; &#x1f31f; 流行主题插件推荐 1️⃣ Ma…...

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中&#xff0c;Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中&#xff0c;而认证信息&#xff08;比如 Session 或身份令牌&#xff09;通常是保存在 Cookie 中&#xff0c;多个应用实例需要共享这些 Cookie …...

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…...

快速上手Git——Windows系统下Git的安装与简单使用流程

一、Git的下载和安装 Git官网链接&#xff1a;https://git-scm.com/ 进入官网后选择Downloads 选择与系统相符合的版本下载&#xff0c;这里我使用的是windows系统 然后点击下载 根据流程安装完成后&#xff0c;使用以下命令查看git版本 git -v运行结果&#xff1a; 二、…...

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…...

linux--防火墙 iptables 双网卡 NAT 桥接

linux--防火墙 iptables 双网卡 NAT 桥接 1 介绍1.1 概述1.2 iptables 的结构 2 四表五链2.1 iptables 的四表filter 表&#xff1a;过滤规则表&#xff0c;默认表。nat 表&#xff1a;地址转换表。mangle 表&#xff1a;修改数据包内容。raw 表&#xff1a;原始数据包表。 2.2…...

C#反射的应用案例与讲解

C# 反射 文章目录 C# 反射前言案例展示将对象转为字典测试用例执行效果代码讲解 HasValue扩展测试用例执行效果代码讲解 反射的底层逻辑反射的原理反射的基本概念反射常用的API和方法GetType类Activator类PropertyInfo类EventInfo 类MemberInfo类MethodInfo类 反射的优缺点优点…...

Mysql常见知识点

Mysql是最常用的数据库了。 1、什么是关系型数据库&#xff1f; 关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#…...

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…...

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…...

计算机网络 (37)TCP的流量控制

前言 计算机网络中的TCP&#xff08;传输控制协议&#xff09;流量控制是一种重要机制&#xff0c;用于确保数据在发送方和接收方之间的传输既高效又稳定。 一、目的 TCP流量控制的主要目的是防止发送方发送数据过快&#xff0c;导致接收方无法及时处理&#xff0c;从而引起数据…...

Windows10下安装vue2.0项目所需环境

一、Node.js版本管理器NVM安装 1.下载NVM安装包 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。目前最新版…...

使用Cilium/eBPF实现大规模云原生网络和安全

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 抽象 1 Trip.com 云基础设施 1.1 分层架构 1.2 更多细节 2 纤毛在 Trip.com 2.1 推出时间表 2.2 自定义 2.3 优化和调整 2.3.1 解耦安装 2.3.2 避免重试/重启风暴 2.3.3 稳定性优先 2…...

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…...

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史&#x1f60e; &#xff08;连接复用 队头阻塞 服务器推送 2进制分帧&#xff09; 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构&#xff1a;起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…...

MySQL不使用子查询的原因

MySQL不使用子查询的原因及优化案例 目录 MySQL不使用子查询的原因及优化案例 目录不推荐使用子查询和JOIN的原因解决方案优化案例 案例1&#xff1a;查询所有有库存的商品信息案例2&#xff1a;使用EXISTS优化子查询案例3&#xff1a;使用JOIN代替子查询案例4&#xff1a;优化…...

网络编程(1)

网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&#…...

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…...

【python:文件->统计飞鸟集单词个数】

主函数.py fopen("飞鸟集.txt",r,encoding"UTF-8")#只读方式打开 contentf.read()# 提取全文,将文件内容字符串对象返回给content dccontent.split("\n")#对字符串调用分割符切割 print(dc) f.close() # 统计单词频率 ofnumcontent.count("…...

解决SpringBoot无法使用JDK8问题

解决SpringBoot无法使用JDK8问题 现状解决方案 现状 使用idea创建springboot项目无法选择java8。原因是23年11月的spring更新后就明确了不在支持java8版本的项目创建&#xff0c;但是目前为止很多公司开发还在用java8&#xff0c;导致会有问题的产生。 解决方案 使用idea创…...

论文导读 | 数据库系统中基于机器学习的基数估计方法

背景 基数估计任务是在一个查询执行之前预测其基数&#xff0c;基于代价的查询优化器&#xff08;Cost Based Optimizer&#xff09;将枚举所有可能的执行计划&#xff0c;并利用估计的基数选出期望执行代价最小的计划&#xff0c;从而完成查询优化的任务。 然而&#xff0c;…...

Shader->LinearGradient线性渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…...

Unity打包+摄像机组件

转换场景 使用程序集&#xff1a;using UnityEngine.SceneManagement; 切换场景相关代码&#xff1a;SceneManager.LoadScene(1);//括号内可放入场景名称&#xff0c;场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…...

Git 命令代码管理详解

一、Git 初相识&#xff1a;版本控制的神器 在当今的软件开发领域&#xff0c;版本控制如同基石般重要&#xff0c;而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造&#xff0c;最初是为了更好地管理 Linux 内核源代码。随着时间的推移&#xff0c;Git 凭借…...

游戏引擎学习第78天

Blackboard: Position ! Collision “网格” 昨天想到的一个点&#xff0c;可能本来就应该想到&#xff0c;但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的&#xff0c;每天不需要全程关注&#xff0c;通常只是在晚上思考&#xff0c;因此有时我们可能不能那么…...