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

基于C#+SQL Server2008 开发三层架构(CS界面)图书管理系统

图书管理系统

一、项目背景及意义

当今由于信息技术的飞速发展,图书馆作为社会知识信息媒介的功能日益重要,网络环境下的信息资源建设知识仓库的设计,开放存取学术交流模式,知识管理系统,智能检索,数字参考咨询,数字图书馆领域成为图书馆系统的研究方向。

管理发展至今,综合发展的整体趋势已日渐明显。引进新方法,吸收新思想是促进图书馆系统发展的必要条件。因此,图书馆系统的研究要坚持理论与技术相融合,开展跨学科的交叉研究;要坚持理论与实践相结合,而对现实,回答现实所提出的最迫切的问题;要坚持基础研究和应用研究,前者对后者起指导作用,后者反过来对前者起丰富和发展的作用;要正确处理现实、历史、理论三者之间的关系,这是推进管理系统研究的重要方法。

二、需求分析

2.1 现状分析

以往,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较繁琐。在借书时,读者首先将要借的书好借阅证交给工作人员,然后工作人员将每本书的信息卡片好读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,然后工作人员根据图书信息找到相应的书卡好借阅证,并填写相应的还书信息。

学校图书馆有许多书,如果靠人工的方式来进行管理,那么工作量会非常大。图书的统计和管理会成为让人头疼的问题,读者借阅图书进行登记也会十分的不方便。这时,利用计算机来为我们进行这些统计管理的工作,可以给我们的生活带来大大的便利,并且提高工作效率。由于条件有限,只能使用键盘输入书的信息,所以在输入图书的ISBN号时有些麻烦。所以在课设里,采用了图书编号。在现实生活中,采用扫描的方式录入ISBN号会更加准确,高效。

2.2 系统功能需求

图书管理系统是针对图书馆工作人员开发的管理软件,实现对图书信息、用户信息的管理功能。

本系统主要能够完成以下功能:

  • 图书信息管理(查询、修改、新增、删除)
  • 用户信息管理(查询、修改、新增、删除)
  • 借书操作、还书操作、续借操作、借书记录查看
  • 图书和用户分类管理(查询、修改、新增、删除)

2.3 系统设计目标

  • 系统中的数据表设计合理、高效、数据冗余少
  • 软件界面友好、安全性高
  • 易于维护、方便升级

三、系统可行性分析

3.1 技术可行性

图书管理系统的开发环境是Visual Studio 2010、Microsoft SQL Server 2008R2 SP3。系统是应用C/S的交互方式实现,本系统具有稳定性、安全性、美观性、先进性。系统现阶段的发展过程中,利用现有的人力物力是完全具备的能力开发出来的,作为阶段性产品,日后的发展空间大,实现方法逐步简单容易,所以图书管理系统的技术上是完全可行的。在当前的限制条件下,该系统的功能目标能达到。

3.2 经济可行性

计算机专业师生团队可以进行日常的系统维护,工作量少,经济支出少。

3.3 操作可行性

所有界面具有风格统一,不同栏目的页面文字风格统一,重点突出图书管理平台的特点,系统页面友好,操作简单,即使没有计算机基础的老师也很好上手。

四、使用的相关技术

4.1 C#

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是一种安全的、稳定的、简单的、优雅的,由C和C衍生出来的面向对象的编程语言。它在继承C和C强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

4.2 SQL server

SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是2017年份推出的SQL SERVER 2017。

五、系统详细设计

5.1 总体设计

以Microsoft SQL Server 2008R2 sp3、Visual Studio 2010作为开发环境,使用数据库技术以及.net开发技术,从用C#三层架构:表现层(UI(User Interface))、业务逻辑层(BLL(Business Logic Layer))、数据访问层(DAL(Data Access Layer))再加上实体类库(Model),开发此图书管理系统。

5.2 数据库设计

5.2.1 数据流图

图5.1 数据流图

5.2.2 数据字典

Admin表

BookInfo表

BookType表

BorrowReturn表

Class表

Department表

Reader表

ReaderType表

5.2.3 逻辑结构

  • 管理员(管理员ID,密码,类型,备注)
  • 图书信息(图书ID,书名,入库时间,作者,拼音码,翻译者,语言,页数,价格,印刷版面,存放位置,ISBN码,版本,备注)
  • 图书类型(图书类型ID,图书类型名称)
  • 图书借还(图书借还ID,图书ID,用户ID,借书时间,应还书时间,真实还书时间,罚金,续借次数,备注)
  • 用户班级(班级ID,班级名称)
  • 用户学院(学院ID,学院名称)
  • 用户信息(用户ID,用户姓名,登记时间,有效期,用户类型,学院,班级,身份证号,性别,QQ,电话,Email,地址,备注)
  • 用户学院(用户类型ID,用户类型名称)

5.3 安全性设计

系统有两种管理员:第一种是普通管理员,拥有除管理员管理之外所以权限;第二种是超级管理员,拥有最高权限,可以修改普通管理员。这样的设定使得数据库数据不会被随意篡改。

系统概念设计图

六、方案分析

6.1 可操作性分析

所有页面具有统一的风格,页面文字风格统一,在构思上重点突出图书管理平台的特点,以获得较佳的浏览效率。

6.2 先进性分析

本系统是应用C/S的交互方式实现,从用C#三层架构:表现层(UI(User Interface))、业务逻辑层(BLL(Business Logic Layer))、数据访问层(DAL(Data Access Layer))再加上实体类库(Model),开发此图书管理系统,达到了本系统的稳定性、安全性、美观性性、先进性。

6.3 稳健性分析

系统目前还处在完成最基本功能阶段,不会有大量的用户访问,服务器使用阿里云,稳健性较好。

6.4 可扩展性分析

系统页面简洁,添加新页面很方便,新功能并不会与已有功能相冲突,具有很强的扩展性。而且系统中的数据库可以随学校的规模的变化进行动态的扩充或缩减。

6.5 可维护性分析

程序简单,数据库数据冗余少,使用日志文件等可恢复数据库,可维护性强。

七、系统测试

7.1 测试概述

编写测试用例并进行测试,找出bug并改正。

7.2 测试资源与环境

7.2.1 硬件配置

电脑型号:战神Z6S1

处理器:Intel(R)Core™i7-4720HQ CPU @2.60GHz 2.60GHz

7.2.2 软件配置

操作系统:Windows 10 专业版 64位操作系统

使用软件:Microsoft Visual Studio 2010

SQL server 2008R2 SP3

7.3 测试内容

7.3.1 管理员模块

图7.1 管理员模块

7.3.2 图书管理模块

图7.2 图书管理模块

图7.2 新增图书

7.3.3 用户管理模块

图7.4 用户管理模块

图7.5 用户新增

7.3.4 图书借还模块

图7.6 图书借还

7.3.5 分类管理模块

图7.7 分类管理模块

7.3.6 查询模块

图7.8 图书借还记录

图7.9 查询

八、附录

8.1 部分源码

8.1.1 图书借还

//查询BorrowReturn表信息
public DataSet selectHostory(BorrowReturn b, string radioName, String cboBorrowTimeType, Boolean checkTime)
{string sql = string.Format(@"select BookInfo.BookId as 'BookId',Reader.UserId as 'UserId',BookName,UserName,BookTypeName,UserTypeName,Gender,IdentityCard,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount from BorrowReturninner join BookInfo on BookInfo.BookId=BorrowReturn.BookIdinner join Reader on Reader.UserId=BorrowReturn.UserIdinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdinner join ReaderType on ReaderType.UserTypeId=Reader.UserTypeIdwhere BookInfo.BookId like '%{0}%' and Reader.UserId like '%{1}%' ", b.BookId, b.UserId);if (radioName == "全部"){}else if (radioName == "已借"){sql += " and FactReturnTime	is  null ";}else if (radioName == "已还"){sql += " and FactReturnTime	is not null ";}return DBhelp.Create().ExecuteAdater(sql);
}//查询BorrowReturn表全部信息
public DataSet AllBorrowReturn()
{string sql = @"select BookInfo.BookId as 'BookId',Reader.UserId as 'UserId',BookName,UserName,BookTypeName,UserTypeName,Gender,IdentityCard,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount from BorrowReturninner join BookInfo on BookInfo.BookId=BorrowReturn.BookIdinner join Reader on Reader.UserId=BorrowReturn.UserIdinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdinner join ReaderType on ReaderType.UserTypeId=Reader.UserTypeId";return DBhelp.Create().ExecuteAdater(sql);
}//查询图书BorrowReturn表(表连接)
public DataSet selectBorrowReturn(string BookId)
{string sql = @"select BookInfo.BookId,BookName,Reader.UserId,UserName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from BookInfoinner join BorrowReturn on BorrowReturn.BookId=BookInfo.BookIdinner join Reader on Reader.UserId=BorrowReturn.UserId where BookInfo.BookId=@BookId ";SqlParameter[] sp ={new SqlParameter("@BookId",BookId)};return DBhelp.Create().ExecuteAdater(sql, sp);
}//用户借阅记录
public DataSet ReaderBorrowReturn(string UserId)
{string sql = @"select BorrowId,Reader.UserId as 'UserId',UserName,BookInfo.BookId as 'BookId',BookName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from Readerinner join BorrowReturn on BorrowReturn.UserId=Reader.UserIdinner join BookInfo on BookInfo.BookId=BorrowReturn.BookIdwhere Reader.UserId=@UserId and FactReturnTime is null ";SqlParameter[] sp ={new SqlParameter("@UserId",UserId)};return DBhelp.Create().ExecuteAdater(sql, sp);
}//用户历史借阅记录
public DataSet ReaderBorrowReturn1(string UserId)
{string sql = @"select BorrowId,Reader.UserId as 'UserId',UserName,BookInfo.BookId as 'BookId',BookName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from Readerinner join BorrowReturn on BorrowReturn.UserId=Reader.UserIdinner join BookInfo on BookInfo.BookId=BorrowReturn.BookIdwhere Reader.UserId=@UserId and FactReturnTime is not null ";SqlParameter[] sp ={new SqlParameter("@UserId",UserId)};return DBhelp.Create().ExecuteAdater(sql, sp);
}//还书
public int ReturnBook(int BorrowReturnId)
{string sql = @"update BorrowReturn set FactReturnTime=@FactReturnTime,RenewCount=0 where BorrowId=@BorrowId";SqlParameter[] sp ={new SqlParameter("@FactReturnTime",DateTime.Now),new SqlParameter("@BorrowId",BorrowReturnId)};return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
}//借书
public int BorrowBook(BorrowReturn b)
{string sql = "proc_BorrowBook";Console.WriteLine(b.BookId);SqlParameter[] sp ={new SqlParameter("@BorrowId",DbType.Int32),new SqlParameter("@BookId",b.BookId),new SqlParameter("@UserId",b.UserId),new SqlParameter("@BorrowTime",b.BorrowTime),new SqlParameter("@ReturnTime",b.ReturnTime),new SqlParameter("@Fine",b.Fine),new SqlParameter("@RenewCount",b.RenewCount),new SqlParameter("@BorrowRemark",b.BorrowRemark),new SqlParameter("@ReturnValue",DbType.Int32)};sp[0].Direction = ParameterDirection.Output;sp[sp.Length - 1].Direction = ParameterDirection.ReturnValue;DBhelp.Create().ExecuteNonQuery(sql, CommandType.StoredProcedure, sp);b.BorrowId = (int)sp[0].Value;return (int)sp[sp.Length - 1].Value;
}//续借
public int RenewBook(BorrowReturn b)
{string sql = @"update BorrowReturn set ReturnTime=dateadd(month,3,ReturnTime),RenewCount=RenewCount+1 where BorrowId=@BorrowId";SqlParameter[] sp ={new SqlParameter("@BorrowId",b.BorrowId)};return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
}

8.1.2 图书管理及查询

//查询BookInfo表
public List<BookInfo> selectBookInfo()
{string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeId";List<BookInfo> list = new List<BookInfo>();SqlDataReader reader = DBhelp.Create().ExecuteReader(sql);while (reader.Read()){BookInfo b = new BookInfo();b.BookId = reader.GetString(0);b.BookName = reader.GetString(1);b.TimeIn = reader.GetDateTime(2);b.BookType = new BookType();b.BookType.BookTypeName = reader.GetString(3);b.Author = reader.GetString(4);b.PinYinCode = reader.GetString(5);b.Translator = reader.GetString(6);b.Language = reader.GetString(7);b.BookNumber = reader.GetString(8);b.Price = reader.GetString(9);b.Layout = reader.GetString(10);b.Address = reader.GetString(11);b.ISBN = reader.GetString(12);b.Versions = reader.GetString(13);b.BookRemark = reader.GetString(14);list.Add(b);}reader.Close();return list;
}//根据ID查询bookinfo表
public List<BookInfo> selectBookInfo(string BookId)
{string sql = @"select BookId,BookName,TimeIn,BookTypeId,Author,PinYinCode,Translator,Language,BookNumber, Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo where BookId=@BookId";SqlParameter[] sp ={new SqlParameter("@BookId",BookId)};SqlDataReader reader = DBhelp.Create().ExecuteReader(sql, sp);List<BookInfo> list = new List<BookInfo>();while (reader.Read()){BookInfo b = new BookInfo();b.BookId = reader.GetString(0);b.BookName = reader.GetString(1);b.TimeIn = reader.GetDateTime(2);b.BookTypeId = reader.GetInt32(3);b.Author = reader.GetString(4);b.PinYinCode = reader.GetString(5);b.Translator = reader.GetString(6);b.Language = reader.GetString(7);b.BookNumber = reader.GetString(8);b.Price = reader.GetString(9);b.Layout = reader.GetString(10);b.Address = reader.GetString(11);b.ISBN = reader.GetString(12);b.Versions = reader.GetString(13);b.BookRemark = reader.GetString(14);list.Add(b);}reader.Close();return list;
}//查询BookInfo表
public DataSet selectBookInfo1()
{string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId";return DBhelp.Create().ExecuteAdater(sql);
}
public DataSet selectBook;//查询BookInfo表 目前可以借阅的图书
public DataSet selectBookInfo2(string BookId)
{string sql = @"select BookInfo.BookId as 'BookId',BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdwhere BookInfo.BookId like '%'+@BookId+'%' and BookInfo.BookId not in(select BookId from BorrowReturn where FactReturnTime is null )";SqlParameter[] sp ={new SqlParameter("@BookId",BookId)};return DBhelp.Create().ExecuteAdater(sql, sp: sp);
}//根据条件查询bookinfo表
public DataSet selectBookInfo1(int index)
{string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdwhere BookType.BookTypeId=@BookTypeId";SqlParameter[] sp ={new SqlParameter("@BookTypeId",index)};return DBhelp.Create().ExecuteAdater(sql, sp);
}//根据条件查询bookinfo表
public DataSet selectBookInfo1(string A, string B)
{string sql = string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdwhere {0} like '%{1}%'", A, B);return DBhelp.Create().ExecuteAdater(sql);
}//查询BookInfo表 带全部查询(表中所有相关的字段)
public DataSet selectBookInfo1(List<string> list, string B)
{string sql = "";for (int i = 0; i < list.Count; i++){if (i != list.Count - 1){sql += string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdwhere {0} like '%{1}%' union  ", list[i], B);}else{sql += string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfoinner join BookType on BookType.BookTypeId=BookInfo.BookTypeIdwhere {0} like '%{1}%' ", list[i], B);}}return DBhelp.Create().ExecuteAdater(sql);
}//添加图书信息
public int AddBookInfo(BookInfo book)
{string sql = @"insert into BookInfo select @BookId,@BookName,@TimeIn,@BookTypeId,@Author,@PinYinCode,@Translator,@Language,@BookNumber,@Price,@Layout,@Address,@ISBN,@Versions,@BookRemark";SqlParameter[] sp ={new SqlParameter("@BookId",book.BookId),new SqlParameter("@BookName",book.BookName),new SqlParameter("@TimeIn",book.TimeIn),new SqlParameter("@BookTypeId",book.BookTypeId),new SqlParameter("@Author",book.Author),new SqlParameter("@PinYinCode",book.PinYinCode),new SqlParameter("@Translator",book.Translator),new SqlParameter("@Language",book.Language),new SqlParameter("@BookNumber",book.BookNumber),new SqlParameter("@Price",book.Price),new SqlParameter("@Layout",book.Layout),new SqlParameter("@Address",book.Address),new SqlParameter("@ISBN",book.ISBN),new SqlParameter("@Versions",book.Versions),new SqlParameter("@BookRemark",book.BookRemark),};return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
}//修改图书信息
public int ExitBookInfo(BookInfo book)
{string sql = @"update BookInfo set BookName=@BookName,TimeIn=@TimeIn,BookTypeId=@BookTypeId, Author=@Author,PinYinCode=@PinYinCode,Translator=@Translator,Language=@Language,BookNumber=@BookNumber,Price=@Price,Layout=@Layout,Address=@Address,ISBN=@ISBN,Versions=@Versions,BookRemark=@BookRemarkwhere BookId=@BookId";SqlParameter[] sp ={new SqlParameter("@BookName",book.BookName),new SqlParameter("@TimeIn",book.TimeIn),new SqlParameter("@BookTypeId",book.BookTypeId),new SqlParameter("@Author",book.Author),new SqlParameter("@PinYinCode",book.PinYinCode),new SqlParameter("@Translator",book.Translator),new SqlParameter("@Language",book.Language),new SqlParameter("@BookNumber",book.BookNumber),new SqlParameter("@Price",book.Price),new SqlParameter("@Layout",book.Layout),new SqlParameter("@Address",book.Address),new SqlParameter("@ISBN",book.ISBN),new SqlParameter("@Versions",book.Versions),new SqlParameter("@BookRemark",book.BookRemark),new SqlParameter("@BookId",book.BookId)};return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
}//根据Id删除
public int DeleteBookInfo(string BookId)
{string sql = @"delete from BorrowReturn where BookId=@BookIddelete from BookInfo where BookId=@BookId";SqlParameter[] sp ={new SqlParameter("@BookId",BookId)};return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
}

相关文章:

基于C#+SQL Server2008 开发三层架构(CS界面)图书管理系统

图书管理系统 一、项目背景及意义 当今由于信息技术的飞速发展&#xff0c;图书馆作为社会知识信息媒介的功能日益重要&#xff0c;网络环境下的信息资源建设知识仓库的设计&#xff0c;开放存取学术交流模式&#xff0c;知识管理系统&#xff0c;智能检索&#xff0c;数字参…...

AIGC简化文件管理:Python自动重命名Word和PDF文件

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…...

产线工控安全之防勒索病毒杀手锏

在当今数字化时代&#xff0c;数据安全已成为企业运营中不可或缺的一部分。勒索病毒和内部泄密事件的频发&#xff0c;使得企业必须采取更为严格的安全措施来保护其关键数据和运营系统。苏州深信达网络科技推出的MCK主机加固解决方案&#xff0c;正是为了应对这些挑战而设计的。…...

超详细超实用!!!网站开发页面适配360浏览器兼容模式

云风网 云风笔记 云风知识库 开发网站偶尔会遇到需要兼容ie的需求&#xff0c;这里以360浏览器为例&#xff0c;360浏览器是基于Chrome和IE双核浏览器&#xff0c;在极速模式下是跟谷歌浏览器内核一致的&#xff0c;兼容模式下的内核是IE内核。这里尤其是360兼容模式下&#x…...

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …...

Redis:缓存击穿

缓存击穿(热点key)&#xff1a; 部分key(被高并发访问且缓存重建业务复杂的)失效,无数请求会直接到数据库&#xff0c;造成巨大压力 1.互斥锁&#xff1a;可以保证强一致性 线程一&#xff1a;未命中之后&#xff0c;获取互斥锁&#xff0c;再查询数据库重建缓存&#xff0c;写…...

一文说清什么是数据仓库

01 数据仓库的概念 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员开发出了“商业数据仓库”。本质上&#xff0c;数据仓库试图提供一种从操作型系统到决策支持环境的数据流架构模型。 目前对数据仓库&#xff08;Data Warehouse&#xff09;的标准定义&a…...

【算法】哈希表相关

【ps】本篇有 5 道 leetcode OJ。 一、算法简介 哈希表是一种存储数据的容器&#xff0c;可以快速查找某个元素&#xff0c;其查找的时间复杂度为 O(1)&#xff0c;非常合适需要频繁查找某一个元素的场景。其具体用法为&#xff1a; 直接使用底层为哈希表的 STL 容器。用数组…...

企微机器人:企业数字化转型的得力助手

在数字化转型的浪潮中&#xff0c;企业对于提高运营效率、降低人力成本的需求日益迫切。企微机器人&#xff0c;作为基于企业微信平台开发的一种智能工具&#xff0c;以其高度自动化、灵活性强、安全性高和易于使用的特点&#xff0c;迅速成为企业内部的得力助手。本文将深入探…...

Linux编程之socket入门教程 socket通讯原理

在Linux网络编程中&#xff0c;套接字Socket是进程间通信的基础&#xff0c;用来在网络上不同主机间进行数据的发送和接收。套接字作为一种抽象的接口&#xff0c;它屏蔽了底层网络协议的复杂性&#xff0c;使得开发者可以专注于数据的传输。以下将详细介绍Linux网络编程中的So…...

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…...

【C++ 高频面试题】构造函数和析构函数你了解多少呢?

文章目录 1. 什么是构造函数和析构函数2. 构造函数和析构函数可以是虚函数吗3. 构造函数有哪几种4. 深拷贝和浅拷贝的区别 1. 什么是构造函数和析构函数 &#x1f427; 构造函数&#xff1a; 构造函数是在创建对象时自动调用的特殊成员函数。 目的&#xff1a;初始化对象的成…...

linux中vim介绍以及常用命令大全

前言 在Linux系统中&#xff0c;Vim是一个功能强大的文本编辑器&#xff0c;它广泛应用于服务器管理、脚本编写和程序开发中。Vim拥有两种模式&#xff1a;命令模式和插入模式。了解和掌握常用的Vim命令对于提高文本编辑效率至关重要。本文将详细介绍Vim的常用命令&#xff0c…...

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…...

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…...

UI自动化测试痛点解决方案

前言 UI自动化测试可以快速、准确地执行大量的测试用例&#xff0c;减少人工测试所需的时间和劳动力。能够在短时间内完成多个测试用例的执行&#xff0c;提高测试的效率和速度。但是UI自动化有个最大的痛点。当前端界面发生变化时&#xff0c;往往页面元素定位也会改变&#…...

如何将QAD系统EDI模块无缝迁移到知行之桥?

什么是QAD系统&#xff1f; QAD&#xff08;Quality, Applications, Development&#xff09;系统&#xff0c;是专为制造业设计的一款ERP软件&#xff0c;主要包含供应链管理、生产管理、财务和客户管理等业务功能&#xff0c;这家公司1979年成立于美国&#xff0c;目前在汽车…...

Linux学习-ELK(一)

配置三台elasticsearch服务器 安装包 elasticsearch.j2 报错 #---执行rsync命令报以下错误 [rootes1 ~]# rsync -av /etc/hosts 192.168.29.172:/etc/hosts root192.168.29.172s password: bash: rsync: 未找到命令 rsync: connection unexpectedly closed (0 bytes receive…...

Selenium事件监听

引言 你一定总是渴望从WebDriver中获得更多的日志信息,以便调试你的脚本或记录更多有关测试的信息。这里为你提供了解决方案:EventFiringWebDriver 和 WebDriverEventListener。EventFiringWebDriver 是一个类,用于包装你的WebDriver以抛出事件,而WebDriverEventListener是…...

视频写作入门:9个步骤开始您的视频日志并与观众建立真实的联系

视频博客&#xff08;vlogging&#xff09;通过视频内容帮助你独特的声音和故事被听到&#xff0c;这能与你的观众建立强烈而有意义的联系&#xff0c;从而促进你的业务发展。使用光年AI平台&#xff0c;你可以将业务场景无缝接入AI能力&#xff0c;轻松实现私域流量的增长。 …...

使用豆包MarsCode 编写 Node.js 全栈应用开发实践

以下是「豆包MarsCode 体验官」优秀文章&#xff0c;作者狼叔。 欢迎更多用户使用豆包MarsCode 并分享您的产品使用心得及反馈、创意项目开发等&#xff0c;【有奖征集&#xff5c;人人都是豆包MarsCode 测评官&#xff01;】活动正在火热进行中&#xff0c;欢迎大家投稿参加&a…...

Spring Cloud全解析:熔断之Hystrix执行流程

Hystrix执行流程 每次调用创建一个新的HystrixCommand&#xff0c;把依赖调用封装在run()方法中执行execute()/queue做同步或异步调用判断熔断器(circuit-breaker)是否打开&#xff0c;如果打开则执行fallback进行降级策略&#xff0c;如果关闭继续执行判断线程池/队列/信号量…...

大模型算法岗,面试百问百答,7天3个offer拿到手!

导读 大模型时代很多企业都在开发自己的大模型&#xff0c;这直接刺激了大模型岗位的需求。本文为大家整理了大模型面试相关的知识点&#xff0c;希望对大家面试求职有所帮助。 今天分享大模型面试相关知识点&#xff0c;持续更新。 1. RAG技术体系的总体思路 数据预处理->…...

代码随想录算法day32 | 动态规划算法part05 | 完全背包,518. 零钱兑换 II, 377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)

完全背包理论基础 本题力扣上没有原题&#xff0c;大家可以去卡码网第52题 (opens new window)去练习&#xff0c;题意是一样的。 完全背包 有N件物品和一个最多能背重量为W的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是 value[i] 。每件物品都有无限个&…...

【Linux 从基础到进阶】自动化备份与恢复策略

自动化备份与恢复策略 在 Linux 运维中,数据的安全性至关重要,自动化备份与恢复策略是保障系统和数据安全的核心环节。无论是系统配置文件、用户数据、数据库还是应用程序日志,备份和恢复都能为系统灾难恢复、数据丢失等突发情况提供可靠的解决方案。 本文将介绍如何在 Ce…...

前端打包装包——设置镜像

1、打包失败&#xff0c;因为没装包&#xff0c;装包失败&#xff0c;因为装包的源错误 npm config get registry npm config set registry https://registry.npmmirror.com/npm install npm run build还是失败&#xff0c;因为缺少了包&#xff0c;在package.json文件中没有包…...

volatile 的作用?是否具有原子性,对编译器有什么影响?什么情况下一定要用 volatile, 能否和 const 一起使用?

目录 1. volatile 的作用 2. 是否具有原子性 3. 对编译器的影响 4.volatile 的使用场景 5.volatile 和 const 的组合 1. volatile 的作用 防止编译器优化&#xff1a;volatile 告诉编译器&#xff0c;变量的值可能会在程序的其他地方&#xff08;如硬件中断、其他线程等&…...

iPhone 16分辨率,屏幕尺寸,PPI 详细数据对比 iPhone 16 Plus、iPhone 16 Pro、iPhone 16 Pro Max

史上最全iPhone 机型分辨率&#xff0c;屏幕尺寸&#xff0c;PPI详细数据&#xff01;已更新到iPhone 16系列&#xff01; 点击放大查看高清图 &#xff01;...

FunASR搭建语音识别服务和VAD检测

搭建ASR语音识别服务&#xff08;含VAD检测&#xff09;教程 在本文中&#xff0c;我将为大家详细介绍如何搭建一套基于FunASR的ASR&#xff08;语音识别&#xff09;服务&#xff0c;并集成VAD&#xff08;语音活动检测&#xff09;。该服务使用阿里达摩院的模型&#xff0c;…...

设计一个支持多线程写入的并发日志记录系统:C++实战指南

设计一个支持多线程写入的并发日志记录系统&#xff1a;C实战指南 在现代软件开发中&#xff0c;日志记录是一个至关重要的功能&#xff0c;它帮助开发者调试、监控和维护系统。然而&#xff0c;在多线程环境中&#xff0c;日志记录系统需要处理多个线程同时写入日志的问题&am…...