这次我们来看一个很典型的大学生期末课程设计项目:基于 ASP.NET 的新闻管理系统。技术栈是 C# + SQL Server,界面部分用 ASP.NET 来完成。为什么这个项目值得单独写一篇?因为新闻管理系统几乎覆盖了 Web 开发的基础闭环——前台展示、分类筛选、详情页、后台登录、增删改查、分页、搜索、评论管理。把这些跑通,课程设计的核心功能点就齐了。
文章不会只停留在“能跑”的层面。我会把数据库设计、连接字符串配置、前台页面、后台管理、常见报错排查和答辩演示建议全部拆开讲。如果你正在找 asp.net 课程设计源码,或者想自己从零写一个新闻管理系统但不知道如何下手,这篇文章可以直接收藏备用。
先给一个整体判断:这个项目不需要高配电脑,Visual Studio + SQL Server 即可本地运行;没有复杂算法,重点在业务逻辑和数据库操作;完成度取决于你把哪些功能做完整。下面按开发顺序展开。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | C# 课程设计 / 毕业设计基础项目 |
| 技术栈 | ASP.NET(Web Forms 或 MVC 5)、C#、SQL Server |
| 开发工具 | Visual Studio 2019/2022、SQL Server Management Studio(SSMS) |
| 主要功能 | 新闻浏览、分类筛选、关键字搜索、新闻详情、后台登录、新闻发布、分类管理、评论管理 |
| 角色权限 | 普通游客浏览前台;管理员登录后台进行内容管理 |
| 数据库 | SQL Server,核心表不少于 4 张:用户表、新闻表、分类表、评论表 |
| 启动方式 | Visual Studio 按 F5 启动,或 IIS 部署 |
| 是否支持 API | 可以扩展 ASP.NET Web API,但基础版本不需要 |
| 是否支持批量任务 | 后台可按分类批量删除,也可写批量导入功能 |
| 适合场景 | 大学生期末课程设计、ASP.NET 入门练手、SQL Server 数据库课程设计 |
这个项目的重点不是技术难度,而是理解 Web 系统的数据流转:浏览器发起请求,ASP.NET 页面处理逻辑,C# 代码调用 ADO.NET 操作 SQL Server,最后把数据绑定到界面控件。把这条链路理清,课程设计答辩基本就稳了。
2. 适用场景与使用边界
2.1 适合谁
- 计算机相关专业大学生,期末需要交一个数据库/Web 课程设计。
- 正在自学 ASP.NET + C# + SQL Server 的初学者,需要一个完整项目练手。
- 需要给别人做简单内容展示系统的开发者,可以用它做基础框架再扩展。
2.2 能解决什么问题
新闻管理系统通过一个项目把数据库设计、数据绑定、登录验证、增删改查、分页搜索、权限区分全部串联起来。对课程设计来说,老师最看重的是你能否讲清楚表结构设计原因、存储过程/参数化查询的使用、前台和后台如何通过 Session 区分权限。这套项目正好覆盖这些点。
2.3 不适合什么场景
- 高并发新闻门户:ASP.NET Web Forms 单体应用不适合直接扛大规模流量。
- 前后端分离架构:如果要求 Vue + Web API,需要额外改造。
- 移动端优先的产品:本项目是桌面浏览器导向。
2.4 使用边界与合规提醒
- 项目内不要存储任何真实用户隐私数据,演示数据使用虚构内容。
- 如果后续商用或上线,必须重写安全校验,并确认内容版权。
- 管理后台账号不要使用弱口令,课程设计演示完建议重置。
3. 环境准备与前置条件
下面给出一套我在校园网环境下跑通类似项目常用的环境组合。不同机器版本略有差异,但思路一致。
| 环境项 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Windows 10 / 11 | SQL Server 和 VS 在 Windows 下最省心 |
| Visual Studio | 2019 或 2022 Community | 免费,自带 ASP.NET 开发模板和 IIS Express |
| .NET Framework | 4.6.1 或 4.7.2 | MVC 5 项目常用 |
| SQL Server | 2019 / 2022 Express 或 Developer | Express 免费,功能足够课程设计 |
| SSMS | 最新版本即可 | 用于建库、建表、执行 SQL 脚本 |
| 浏览器 | Chrome / Edge | 调试页面用 |
| 磁盘空间 | 至少 10GB 剩余 | VS 和 SQL Server 安装占用较大 |
3.1 SQL Server 安装注意点
- 安装时选择“混合模式”或“Windows 身份验证模式”。课程设计建议直接用 Windows 身份验证,连接字符串里不需要用户名密码,省去很多麻烦。
- 如果选择 SQL Server 身份验证,请记住 sa 密码,后续连接字符串要用。
- 安装完成后打开“SQL Server 配置管理器”,确认 SQL Server 服务正在运行。很多“无法连接数据库”的问题就是服务没启动。
- 如果安装过程中遇到“句柄无效”之类的报错,先干净卸载,关闭杀毒软件,以管理员身份重新运行安装程序。
3.2 Visual Studio 组件确认
安装 VS 时勾选“ASP.NET 和 Web 开发”工作负载。否则创建项目时找不到 ASP.NET Web 应用程序模板。
4. 数据库设计与初始化脚本
先设计数据库,再写代码。这是数据库课程设计的基本顺序。
4.1 表结构设计
新闻管理系统的核心表如下:
- 管理员表 Admin:AdminId、UserName、Password
- 新闻分类表 Category:CategoryId、CategoryName
- 新闻表 News:NewsId、Title、Content、CategoryId、PublishTime、Author
- 评论表 Comment:CommentId、NewsId、Content、UserName、CreateTime
关系如下:
- Category 与 News:一对多,一个分类下有多条新闻。
- News 与 Comment:一对多,一条新闻下有多条评论。
4.2 建库建表 SQL
打开 SSMS,新建数据库 NewsDB,然后执行以下脚本:
CREATE DATABASE NewsDB; GO USE NewsDB; GO CREATE TABLE Admin ( AdminId INT IDENTITY(1,1) PRIMARY KEY, UserName NVARCHAR(50) NOT NULL UNIQUE, Password NVARCHAR(100) NOT NULL ); GO CREATE TABLE Category ( CategoryId INT IDENTITY(1,1) PRIMARY KEY, CategoryName NVARCHAR(50) NOT NULL UNIQUE ); GO CREATE TABLE News ( NewsId INT IDENTITY(1,1) PRIMARY KEY, Title NVARCHAR(200) NOT NULL, Content NVARCHAR(MAX) NOT NULL, CategoryId INT NOT NULL, Author NVARCHAR(50) NULL, PublishTime DATETIME NOT NULL DEFAULT GETDATE(), CONSTRAINT FK_News_Category FOREIGN KEY (CategoryId) REFERENCES Category(CategoryId) ); GO CREATE TABLE Comment ( CommentId INT IDENTITY(1,1) PRIMARY KEY, NewsId INT NOT NULL, UserName NVARCHAR(50) NOT NULL, Content NVARCHAR(500) NOT NULL, CreateTime DATETIME NOT NULL DEFAULT GETDATE(), CONSTRAINT FK_Comment_News FOREIGN KEY (NewsId) REFERENCES News(NewsId) ); GO INSERT INTO Admin (UserName, Password) VALUES ('admin', '123456'); INSERT INTO Category (CategoryName) VALUES ('IT资讯'), ('综合新闻'), ('校园动态'); GO密码字段实际开发要加密存储,课程设计阶段可以先明文,但答辩时最好主动说明“正式环境必须使用哈希加密”,这是加分项。
4.3 插入测试数据
手动插入几条新闻,方便测试前台展示:
USE NewsDB; GO INSERT INTO News (Title, Content, CategoryId, Author, PublishTime) VALUES ('ASP.NET入门教程发布', '本文介绍ASP.NET开发环境搭建...', 1, '张三', GETDATE()), ('SQL Server 2019安装指南', '详细说明SQL Server的安装步骤...', 1, '李四', GETDATE()), ('校园春季运动会圆满结束', '学校于本周举办春季运动会...', 3, '王五', GETDATE()); GO5. 创建 ASP.NET 项目并配置连接字符串
5.1 新建项目
打开 Visual Studio,选择“创建新项目”,搜索 ASP.NET,选择“ASP.NET Web 应用程序(.NET Framework)”。
如果使用 Web Forms,模板选择“Web Forms”;如果使用 MVC,选择“MVC”。下面以 MVC 5 为例展示代码结构,Web Forms 的核心数据访问代码完全一致。
5.2 配置连接字符串
打开项目中的 Web.config,在<connectionStrings>节点里添加数据库连接。默认连接方式(Windows 身份验证):
<connectionStrings> <add name="NewsDBConnectionString" connectionString="Data Source=.;Initial Catalog=NewsDB;Integrated Security=True;" providerName="System.Data.SqlClient" /> </connectionStrings>使用 SQL Server 身份验证时:
<connectionStrings> <add name="NewsDBConnectionString" connectionString="Data Source=.;Initial Catalog=NewsDB;User ID=sa;Password=你的密码;" providerName="System.Data.SqlClient" /> </connectionStrings>Data Source=.表示本机默认实例。如果你安装的是命名实例,比如SQLEXPRESS,需要写成Data Source=.\SQLEXPRESS。
5.3 封装数据访问帮助类
无论 Web Forms 还是 MVC,都建议封装一个 SQLHelper 类,统一处理连接、执行命令、返回 DataTable。下面是一个课程设计够用的封装:
using System.Configuration; using System.Data; using System.Data.SqlClient; public class SQLHelper { private static string connStr = ConfigurationManager.ConnectionStrings["NewsDBConnectionString"].ConnectionString; public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (parameters != null) { cmd.Parameters.AddRange(parameters); } SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (parameters != null) { cmd.Parameters.AddRange(parameters); } conn.Open(); return cmd.ExecuteNonQuery(); } } } }注意:SQLHelper 里ConfigurationManager需要引用System.Configuration.dll。如果编译报错找不到 ConfigurationManager,在项目中右键“引用” -> “添加引用” -> 搜索 Configuration,勾选 System.Configuration。
6. 前台功能实现
前台面向游客,展示新闻列表、新闻详情和评论。
6.1 新闻列表页
以 MVC 为例,HomeController 的 Index 方法读取新闻列表:
using System.Data; using System.Web.Mvc; public class HomeController : Controller { public ActionResult Index() { string sql = "SELECT n.NewsId, n.Title, n.PublishTime, n.Author, c.CategoryName " + "FROM News n INNER JOIN Category c ON n.CategoryId = c.CategoryId " + "ORDER BY n.PublishTime DESC"; DataTable dt = SQLHelper.ExecuteDataTable(sql); return View(dt); } }视图里用表格展示,标题列加超链接跳转到详情页:
@model System.Data.DataTable <table class="table table-bordered"> <thead> <tr> <th>标题</th> <th>分类</th> <th>作者</th> <th>发布时间</th> </tr> </thead> <tbody> @foreach (System.Data.DataRow row in Model.Rows) { <tr> <td><a href="/Home/Detail?id=@row["NewsId"]">@row["Title"]</a></td> <td>@row["CategoryName"]</td> <td>@row["Author"]</td> <td>@row["PublishTime"]</td> </tr> } </tbody> </table>6.2 新闻详情页与评论展示
详情页读取单条新闻,同时读取该新闻下的评论列表:
public ActionResult Detail(int id) { string sqlNews = "SELECT * FROM News WHERE NewsId = @NewsId"; DataTable dtNews = SQLHelper.ExecuteDataTable(sqlNews, new System.Data.SqlClient.SqlParameter("@NewsId", id)); if (dtNews.Rows.Count == 0) { return HttpNotFound(); } string sqlComment = "SELECT * FROM Comment WHERE NewsId = @NewsId ORDER BY CreateTime DESC"; DataTable dtComment = SQLHelper.ExecuteDataTable(sqlComment, new System.Data.SqlClient.SqlParameter("@NewsId", id)); ViewBag.News = dtNews.Rows[0]; return View(dtComment); }提交评论时,使用参数化 SQL,防止 SQL 注入:
[HttpPost] public ActionResult AddComment(int newsId, string userName, string content) { string sql = "INSERT INTO Comment (NewsId, UserName, Content, CreateTime) " + "VALUES (@NewsId, @UserName, @Content, GETDATE())"; SqlParameter[] parameters = { new SqlParameter("@NewsId", newsId), new SqlParameter("@UserName", userName), new SqlParameter("@Content", content) }; SQLHelper.ExecuteNonQuery(sql, parameters); return RedirectToAction("Detail", new { id = newsId }); }6.3 分类筛选与关键字搜索
分类筛选在 SQL 里加 WHERE 条件:
SELECT n.NewsId, n.Title, n.PublishTime, n.Author, c.CategoryName FROM News n INNER JOIN Category c ON n.CategoryId = c.CategoryId WHERE c.CategoryId = @CategoryId ORDER BY n.PublishTime DESC关键字搜索使用 LIKE。这里要提醒,LIKE 在课程设计里演示可以,但数据量大时性能差,答辩时可以提一句“生产环境建议使用全文索引或 Elasticsearch”。
SELECT * FROM News WHERE Title LIKE @keyword OR Content LIKE @keyword ORDER BY PublishTime DESC参数写法:
string keyword = "%" + searchKey.Trim() + "%"; SqlParameter parameter = new SqlParameter("@keyword", keyword);7. 后台管理功能实现
后台只有管理员能访问。使用 Session 判断登录状态。
7.1 登录功能
登录页提交用户名和密码,查询 Admin 表:
public ActionResult Login(string userName, string password) { string sql = "SELECT * FROM Admin WHERE UserName = @UserName AND Password = @Password"; SqlParameter[] parameters = { new SqlParameter("@UserName", userName), new SqlParameter("@Password", password) }; DataTable dt = SQLHelper.ExecuteDataTable(sql, parameters); if (dt.Rows.Count > 0) { Session["AdminName"] = userName; return RedirectToAction("Index", "Admin"); } ViewBag.Error = "用户名或密码错误"; return View(); }退出登录时清除 Session:
public ActionResult Logout() { Session.Clear(); return RedirectToAction("Login"); }后台基类或者每个 Action 里做登录校验:
public ActionResult Index() { if (Session["AdminName"] == null) { return RedirectToAction("Login"); } // 继续加载后台数据 }7.2 新闻管理
后台新闻管理页显示新闻列表,支持删除、编辑、新增。其中删除新闻时要同步删除该新闻下的评论,避免外键冲突:
DELETE FROM Comment WHERE NewsId = @NewsId; DELETE FROM News WHERE NewsId = @NewsId;建议使用事务保证两条删除同时成功:
public static void DeleteNews(int newsId) { string sql = "BEGIN TRANSACTION; " + "DELETE FROM Comment WHERE NewsId = @NewsId; " + "DELETE FROM News WHERE NewsId = @NewsId; " + "COMMIT;"; SqlParameter parameter = new SqlParameter("@NewsId", newsId); SQLHelper.ExecuteNonQuery(sql, parameter); }7.3 分类管理
分类管理比较简单,核心就是分类表的增删改查。要注意:删除分类前,先判断该分类下是否还有新闻。如果有,提示“请先删除或移动该分类下的新闻”。
SELECT COUNT(*) FROM News WHERE CategoryId = @CategoryId;7.4 分页与批量删除
为了体现课程设计深度,建议做分页。分页 SQL 用ROW_NUMBER():
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY PublishTime DESC) AS RowNum, * FROM News ) AS T WHERE RowNum BETWEEN @startIndex AND @endIndex;批量删除可以用复选框 + IN 条件:
string ids = "1,3,5"; string sql = "DELETE FROM News WHERE NewsId IN (" + ids + ")";注意,拼接 IN 列表时,ids必须经过严格校验,只允许数字和逗号。更安全的做法是使用表值参数或逐条删除,课程设计用逐条循环即可:
foreach (int id in selectedIds) { DeleteNews(id); }8. 扩展 Web API 与批量任务思路
虽然课程设计不要求做前后端分离,但如果你想体现扩展能力,可以加一个 ASP.NET Web API 控制器,对外提供新闻数据接口。这样答辩时可以说“系统支持接口化扩展”。
8.1 新闻查询接口示例
新建 ApiController:
using System.Data; using System.Web.Http; public class NewsApiController : ApiController { public IHttpActionResult Get() { string sql = "SELECT NewsId, Title, Author, PublishTime FROM News ORDER BY PublishTime DESC"; DataTable dt = SQLHelper.ExecuteDataTable(sql); return Json(dt); } public IHttpActionResult Get(int id) { string sql = "SELECT * FROM News WHERE NewsId = @NewsId"; DataTable dt = SQLHelper.ExecuteDataTable(sql, new System.Data.SqlClient.SqlParameter("@NewsId", id)); if (dt.Rows.Count == 0) { return NotFound(); } return Json(dt.Rows[0]); } }本地启动后,接口地址类似:
http://localhost:端口/api/NewsApi http://localhost:端口/api/NewsApi/18.2 Python 调用测试
接口调试可以直接用浏览器,也可以用 Python requests:
import requests url = "http://localhost:5000/api/NewsApi" response = requests.get(url, timeout=10) print(response.status_code) print(response.text)实际端口以 Visual Studio 启动时显示的 IIS Express 端口为准。需要把代码里的地址换成你自己的端口。
这种扩展思路适合答辩时展示,说明你不仅会写页面,还理解接口化设计。
9. 资源占用与性能观察
这个项目不涉及 GPU 显存,资源观察集中在 CPU、内存和数据库连接。
9.1 本地开发资源占用
Visual Studio + SQL Server 同时运行时,内存占用通常在 2GB 到 4GB 之间,主要看是否开启了 IIS Express 调试进程。打开任务管理器,可以看到以下进程:
devenv.exe:Visual Studio 主进程,占用较高。iisexpress.exe:本地 Web 服务器进程。sqlservr.exe:SQL Server 数据库引擎进程。
如果电脑内存只有 8GB,建议关闭其他大型软件,只保留 VS、SSMS 和浏览器。
9.2 SQL Server 内存占用过高
SQL Server 默认会占用大量内存作为缓存,这是正常现象,不是异常。如果机器内存紧张,可以设置内存上限:
打开 SSMS,右键服务器实例 -> 属性 -> 内存,把“最大服务器内存”设置为 1024MB 或 2048MB。
也可以通过 SQL 设置:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'max server memory', 2048; RECONFIGURE;9.3 性能观察方法
- 在页面代码里用
Stopwatch统计 SQL 执行耗时。 - 在 SQL Server Profiler 中追踪慢查询。
- 用 Windows 任务管理器或资源监视器观察内存和磁盘占用。
如果新闻列表查询变慢,先检查是否缺少索引。给News表的CategoryId和PublishTime添加非聚集索引是简单有效的优化:
CREATE NONCLUSTERED INDEX IX_News_CategoryId ON News(CategoryId); CREATE NONCLUSTERED INDEX IX_News_PublishTime ON News(PublishTime DESC);9.4 避免端口冲突
Visual Studio 使用 IIS Express 时,端口是随机分配的。如果启动后浏览器打不开页面,或者出现“端口被占用”,可以修改项目属性中的调试端口:
右键项目 -> 属性 -> Web -> 项目 Url,修改为http://localhost:8080/之类的空闲端口。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 页面提示无法连接数据库 | SQL Server 服务未启动 | 打开 SQL Server 配置管理器,查看服务状态 | 启动 SQL Server 服务,并设为自动启动 |
| 登录时提示“用户名或密码错误” | Admin 表无数据或密码不一致 | 在 SSMS 中执行 SELECT 查看数据 | 插入正确账号,或检查是否写错表名 |
| 页面数据不显示 | 数据库连接字符串错误 | 检查 Web.config 中的 Data Source | 把 Data Source 改为.或.\SQLEXPRESS |
| 编译报错“无法加载一个或多个请求的类型” | 缺少引用或版本不一致 | 查看错误列表中的详细程序集名称 | 添加对应 NuGet 包或程序集引用 |
| 运行时报“句柄无效” | 通常是 SQL Server 安装问题或 VS 调试器问题 | 查看 Windows 事件日志、SQL Server 错误日志 | 重新安装 SQL Server 或修复 Visual Studio |
| 修改页面后浏览器显示旧页面 | 浏览器缓存 | Ctrl+F5 强制刷新 | 正常现象 |
| 删除新闻时报外键冲突 | 评论表仍有关联数据 | 检查 Comment 表数据 | 先删除评论,再删除新闻 |
| 页面样式丢失 | 路由或虚拟目录配置错误 | 查看控制台网络请求 | 使用相对路径引用 CSS/JS |
| SQL Server 安装失败 | 系统残留旧实例、杀毒软件干扰 | 查看安装日志 | 干净卸载后以管理员身份重装 |
| 后台不带登录就能访问 | 缺少 Session 校验 | 检查后台 Action 是否都有权限判断 | 添加统一权限过滤器 |
| 输入搜索关键字报 SQL 错误 | LIKE 参数未拼接 % | 调试查看 SQL 语句 | 在关键字前后拼接 %,使用参数化查询 |
SQL Server 安装过程中最容易踩坑的是实例名不一致。安装时如果选择了命名实例,后面连接字符串写Data Source=.\SQLEXPRESS,如果写错就连接不上。查看本机实例名的方法:在 SSMS 登录窗口的服务器名称下拉框中可以看到。
11. 最佳实践与课程设计建议
11.1 代码规范
- 数据库访问统一走 SQLHelper,不要在页面代码里直接创建 SqlConnection。
- SQL 语句一律使用参数化查询,不要拼接字符串。数据库课程设计答辩时,老师很可能会问 SQL 注入问题,参数化查询是标准答案。
- 命名规范:数据库表名用单数,字段用驼峰或下划线,保持一致。
11.2 项目目录结构
建议按下面方式组织:
NewsSystem/ ├── Web.config ├── App_Data/ ├── Models/ ├── Controllers/ ├── Views/ │ ├── Home/ │ │ ├── Index.cshtml │ │ └── Detail.cshtml │ └── Admin/ │ ├── Login.cshtml │ ├── Index.cshtml │ └── NewsEdit.cshtml ├── Scripts/ ├── Content/ └── App_Code/ └── SQLHelper.cs如果使用 Web Forms,把 .aspx 页面和 .aspx.cs 代码文件分组存放即可。
11.3 答辩演示准备工作
- 准备 5~8 条测试新闻,覆盖不同分类,方便演示分类筛选。
- 准备 2 条评论数据,演示评论展示和删除。
- 先演示前台浏览,再演示后台登录,最后重点讲数据库表结构和关系。
- 提前演练一遍删除分类时被外键约束阻止的情况,讲清楚为什么不能直接删,这是加分项。
11.4 功能扩展方向
如果时间充裕,可以继续扩展:
- 新闻缩略图上传。
- 管理员分级别权限。
- 新闻浏览量统计。
- 使用存储过程封装复杂查询。
- 使用 LINQ to SQL 或 Entity Framework 替代 ADO.NET。
- 导出新闻数据为 Excel。
其中把 ADO.NET 换成 Entity Framework 是很好的扩展方向,能体现你对 ORM 的理解。
11.5 安全与合规提醒
课程设计项目同样要注意基本安全规范:
- 后台管理不要使用过于简单的密码。
- 不要在页面明文显示数据库连接字符串中的密码。
- 评论功能需要做内容审核,避免发布违法或不实信息。
- 本地演示数据不要使用真实人物或真实敏感新闻。
12. 总结与下一步
这个基于 ASP.NET 的新闻管理系统最适合作为大学生期末课程设计。它的价值不在于代码多复杂,而在于用最直接的方式把 Web 开发的核心链路串联起来:建库建表、配置连接、数据查询、前台展示、后台管理、权限验证、分页搜索。跑通这套流程,你就能回答大多数 C# 和 SQL Server 相关问题。
最先应该验证的功能是数据库连接是否正常。连不上数据库,后面所有页面都是空白的。最容易踩的坑有两个:SQL Server 服务没启动,以及连接字符串里的 Data Source 写错。建议把这两项写在项目 README 里,后面再打开项目时一眼就能找到问题。
如果你是用这个项目交课程设计,答辩前建议亲手把建表 SQL 和 SQLHelper 类的代码流程完整讲一遍。老师问到“你的系统如何防止 SQL 注入”“删除新闻为什么先删评论”“分页是怎么实现的”这三个问题都能答上来,成绩不会差。
后续扩展方向建议先做新闻图片上传和浏览量统计,这两个功能工作量不大,但能让系统看起来更完整。想深入的话,再尝试把数据库访问层替换成 Entity Framework,配合 ASP.NET MVC 做一次重构,你的 C# 开发能力会上一个台阶。