ASP.NET供应商管理系统实战:从Excel台账到Web端协作开发

发布时间:2026/10/18 12:58:55
ASP.NET供应商管理系统实战:从Excel台账到Web端协作开发 简介ASP.NET供应商管理系统是一套面向计算机专业毕业设计与企业供应链管理学习的Web应用源码基于C#与ASP.NET框架开发帮助解决供应商信息分散、评价与沟通缺乏统一平台的问题。资源包共386个文件约1.77MB以173个gif界面素材、90个js脚本、51个html页面、26个css样式及12个cs核心代码为主另含aspx页面、dll组件、数据库mdf与ldf文件等覆盖前端展示、业务逻辑与数据存储各层。系统围绕供应商分类管理、信息录入与查询、评价管理、留言沟通及用户权限分配等模块展开采用MVC架构组织代码结构清晰便于二次开发与功能扩展。已有388人学习下载适合需要完整毕设方案、想理解ASP.NET三层架构与SQL Server数据交互的读者参考可据此梳理模块划分、权限设计与数据库表结构快速搭建可运行的供应商管理原型。1. 供应商管理系统的真实开发场景从Excel台账到Web端协作如果你接触过中小型企业的采购部门大概率见过这样的场景供应商信息散落在十几个Excel文件里合同到期靠人脑记忆询价记录翻聊天记录才能找到。这套ASP.NET供应商管理系统就是冲着这个痛点来的——把供应商档案、合同管理、询价记录、评估打分统一收进一个Web后台用C#和ASP.NET技术栈实现。它适合谁正在做C#毕业设计、需要一套完整可运行项目参考的同学以及想拿它当脚手架改造成企业内部工具的开发。整个项目结构清晰分层明确拿来就能跑改起来也不费劲。2. 技术选型与架构拆解为什么用ASP.NET WebForms而不是MVC2.1 技术栈的取舍逻辑这套系统选的是ASP.NET WebForms不是现在更流行的ASP.NET MVC或Core。原因很直接对于毕业设计或企业内部小工具来说WebForms的开发效率极高——拖控件、写事件、后台直接绑定数据一个页面从零到能用可能只需要半小时。而MVC虽然架构更干净但视图、控制器、路由配置一套下来对新手不够友好。数据库用的是SQL Server通过ADO.NET直接访问没有上Entity Framework。这同样是务实的选择EF虽然能省去写SQL的功夫但一旦出问题调试链路太长对刚入门的开发者来说反而增加心智负担。直接写SQL、用SqlConnection和SqlDataReader每一步都看得见摸得着。项目整体是典型的三层结构表现层aspx页面 后台cs文件负责界面渲染和用户交互业务逻辑层BLL文件夹下的类处理供应商编号生成、合同到期提醒等逻辑数据访问层DAL文件夹下的类封装所有SQL操作这种分层方式虽然不如DDD那么精细但对于一个供应商管理系统来说已经足够把职责分清楚。2.2 目录结构一览SupplierMgr/ ├── App_Data/ # 数据库文件附加MDF用 ├── BLL/ # 业务逻辑层 │ ├── SupplierBLL.cs │ ├── ContractBLL.cs │ └── EvaluationBLL.cs ├── DAL/ # 数据访问层 │ ├── SqlHelper.cs # 数据库连接与执行封装 │ ├── SupplierDAL.cs │ └── ContractDAL.cs ├── Model/ # 实体类 │ ├── Supplier.cs │ └── Contract.cs ├── Admin/ # 后台管理页面 │ ├── SupplierList.aspx │ ├── SupplierEdit.aspx │ └── ContractManage.aspx ├── Web.config # 连接字符串与配置 └── Global.asax # 应用启动逻辑这个结构的好处是找代码不用猜。要改供应商列表的展示逻辑直接去Admin/SupplierList.aspx要改数据查询去DAL/SupplierDAL.cs。对于二次开发来说定位问题的路径非常短。2.3 数据库表设计核心表有四张表名用途关键字段Supplier供应商档案SupplierID, Name, Contact, Phone, CategoryContract合同记录ContractID, SupplierID, StartDate, EndDate, AmountInquiry询价记录InquiryID, SupplierID, Product, Price, InquiryDateEvaluation评估打分EvalID, SupplierID, QualityScore, DeliveryScore, ServiceScore表之间通过SupplierID关联查询时用JOIN串联。比如要查某个供应商的所有合同就是SELECT * FROM Contract WHERE SupplierIDid简单直接。3. 核心模块代码逐段拆解从数据库连接到页面渲染3.1 数据库连接封装SqlHelper所有数据库操作都走这个类避免在每个DAL里重复写连接字符串和异常处理// DAL/SqlHelper.cs public class SqlHelper { // 从Web.config读取连接字符串方便部署时修改 private static readonly string connStr ConfigurationManager.ConnectionStrings[SupplierDB].ConnectionString; // 执行增删改返回受影响行数 public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn new SqlConnection(connStr)) { SqlCommand cmd new SqlCommand(sql, conn); if (parameters ! null) cmd.Parameters.AddRange(parameters); conn.Open(); return cmd.ExecuteNonQuery(); } } // 执行查询返回DataTable public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn new SqlConnection(connStr)) { SqlDataAdapter adapter new SqlDataAdapter(sql, conn); if (parameters ! null) adapter.SelectCommand.Parameters.AddRange(parameters); DataTable dt new DataTable(); adapter.Fill(dt); return dt; } } }这里有两个关键点一是用using确保连接自动释放避免连接池耗尽二是参数化查询防止SQL注入。很多新手写DAL时喜欢拼字符串比如SELECT * FROM Supplier WHERE Name name 这在供应商名称含单引号时直接报错而且有安全风险。用SqlParameter传参是必须养成的习惯。3.2 供应商列表页的数据绑定后台列表页用的是GridView控件后台cs里绑定数据// Admin/SupplierList.aspx.cs protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindGrid(); } } private void BindGrid() { // 调用BLL层获取所有供应商 DataTable dt SupplierBLL.GetAllSuppliers(); gvSupplier.DataSource dt; gvSupplier.DataBind(); } // 删除按钮的事件处理 protected void gvSupplier_RowDeleting(object sender, GridViewDeleteEventArgs e) { int supplierId Convert.ToInt32(gvSupplier.DataKeys[e.RowIndex].Value); // 先检查是否有未完成的合同 if (ContractBLL.HasActiveContract(supplierId)) { ClientScript.RegisterStartupScript(GetType(), alert, alert(该供应商存在未到期合同无法删除);, true); return; } SupplierBLL.DeleteSupplier(supplierId); BindGrid(); }这段代码里有个容易忽略的细节删除供应商前先检查是否有未到期合同。如果不做这个校验直接删掉供应商合同表里的记录就变成了孤儿数据后续查询会出问题。这个校验逻辑放在BLL层页面只负责调用和提示。3.3 合同到期提醒的实现合同到期提醒是这个系统里比较实用的功能逻辑不复杂但容易写漏// BLL/ContractBLL.cs public static DataTable GetExpiringContracts(int daysAhead) { // 查询未来N天内到期的合同 string sql SELECT c.ContractID, s.Name AS SupplierName, c.EndDate, c.Amount, DATEDIFF(DAY, GETDATE(), c.EndDate) AS DaysLeft FROM Contract c INNER JOIN Supplier s ON c.SupplierID s.SupplierID WHERE c.EndDate BETWEEN GETDATE() AND DATEADD(DAY, days, GETDATE()) ORDER BY c.EndDate ASC; SqlParameter[] parameters { new SqlParameter(days, daysAhead) }; return SqlHelper.ExecuteQuery(sql, parameters); }DATEDIFF算出剩余天数前端用不同颜色标注7天内红色、30天内黄色。这个功能在首页仪表盘上展示采购人员一登录就能看到哪些合同快到期了。3.4 供应商评估打分模块评估模块允许对供应商的质量、交期、服务三个维度打分最后算加权平均// BLL/EvaluationBLL.cs public static decimal CalculateTotalScore(int supplierId) { string sql SELECT AVG(QualityScore * 0.4 DeliveryScore * 0.35 ServiceScore * 0.25) FROM Evaluation WHERE SupplierID sid; SqlParameter[] parameters { new SqlParameter(sid, supplierId) }; object result SqlHelper.ExecuteScalar(sql, parameters); return result DBNull.Value ? 0 : Convert.ToDecimal(result); }权重分配是质量40%、交期35%、服务25%这个比例可以根据企业实际需求在代码里调整。如果要做成可配置的可以把权重存到一张配置表里但毕业设计阶段硬编码也够用。4. 避坑与常见问题排查那些年踩过的数据库和部署坑4.1 数据库附加失败版本不兼容现象拿到项目后在SQL Server里附加App_Data下的MDF文件提示“数据库版本661无法打开此服务器支持655及更低版本”。原因MDF文件是用更高版本的SQL Server创建的本机安装的是低版本。解决要么升级本机SQL Server到相同或更高版本要么在项目里改用SQL脚本建库——把表结构和初始数据导出成.sql文件在低版本里执行一遍。我一般会在App_Data里同时放MDF和建库脚本哪个能用用哪个。4.2 连接字符串配置错误现象页面打开就报“未将对象引用设置到对象的实例”或者“配置系统未能初始化”。原因Web.config里的连接字符串名称和代码里读的不一致或者Data Source写错了。解决检查Web.config中connectionStrings节点的name属性确保和SqlHelper里ConfigurationManager.ConnectionStrings[SupplierDB]的键名完全一致。Data Source如果是本机Express版写成.\SQLEXPRESS如果是完整版写localhost或.。4.3 GridView分页后删除数据错行现象列表翻到第二页点删除删掉的却是第一页对应位置的数据。原因GridView的DataKeyNames没有设置或者删除事件里用了e.RowIndex而不是DataKeys。解决在aspx页面里给GridView加上DataKeyNamesSupplierID删除时用gvSupplier.DataKeys[e.RowIndex].Value获取真实ID。这个坑很隐蔽因为第一页测试时完全正常翻页后才暴露。4.4 中文乱码问题现象供应商名称在数据库里显示正常但在页面上变成问号或乱码。原因Web.config里没有统一编码或者数据库字段用了varchar而不是nvarchar。解决Web.config加globalization requestEncodingutf-8 responseEncodingutf-8/数据库建表时中文字段一律用nvarchar不要用varchar。如果已经建了表用ALTER语句改字段类型。4.5 发布到IIS后404错误现象本地VS里跑得好好的发布到IIS后所有页面都打不开。原因ASP.NET没有在IIS里注册或者应用程序池的.NET版本不对。解决以管理员身份运行aspnet_regiis -i注册ASP.NET检查应用程序池的.NET CLR版本是否设为v4.0。如果是Windows Server还要确认“ASP.NET”功能已安装。5. 二次开发与改造思路从能跑到好用5.1 把硬编码的权重改成可配置前面评估模块的权重是写死在SQL里的。如果要让不同企业自己调权重可以加一张Config表CREATE TABLE EvalConfig ( ConfigKey NVARCHAR(50) PRIMARY KEY, ConfigValue DECIMAL(5,2) ); -- 初始化 INSERT INTO EvalConfig VALUES (QualityWeight, 0.40); INSERT INTO EvalConfig VALUES (DeliveryWeight, 0.35); INSERT INTO EvalConfig VALUES (ServiceWeight, 0.25);然后在BLL里先读配置再拼SQL。这样改起来不用动代码后台加个配置页面就行。5.2 增加操作日志现在系统里谁删了供应商、谁改了合同没有任何记录。加一张Log表在BLL的增删改方法里统一写日志public static void WriteLog(string userId, string action, string detail) { string sql INSERT INTO OperationLog (UserId, Action, Detail, LogTime) VALUES (uid, act, detail, GETDATE()); SqlParameter[] parameters { new SqlParameter(uid, userId), new SqlParameter(act, action), new SqlParameter(detail, detail) }; SqlHelper.ExecuteNonQuery(sql, parameters); }调用时传当前登录用户和操作描述。这个改动不大但对后续排查问题帮助很大。5.3 导出Excel功能采购部门经常需要把供应商列表导出来发给领导。用NPOI库可以不用装Office就能生成Excel// 在SupplierList页面加一个导出按钮 protected void btnExport_Click(object sender, EventArgs e) { DataTable dt SupplierBLL.GetAllSuppliers(); NPOI.HSSF.UserModel.HSSFWorkbook workbook new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.ISheet sheet workbook.CreateSheet(供应商列表); // 创建表头和数据行... Response.ContentType application/vnd.ms-excel; Response.AddHeader(Content-Disposition, attachment;filenamesuppliers.xls); workbook.Write(Response.OutputStream); Response.End(); }NPOI的API稍微有点繁琐但胜在稳定不依赖服务器装Excel。5.4 改造时的验证方法每次改完代码不要只点一遍页面就完事。我一般会走这三步第一步用不同角色的账号登录确认权限控制没被改坏第二步在供应商列表页做一次增删改查的完整流程看数据是否一致第三步打开SQL Server Profiler看实际执行的SQL有没有性能问题比如有没有漏加索引导致全表扫描。这三步走完基本能覆盖大部分回归问题。从那以后我每次改完DAL层的代码都强制走一遍“增删改查翻页导出”的完整流程再也不敢只测第一页了。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询