简介:面向JavaWeb课程设计场景,这份源码包提供了一套电商后台管理系统完整项目,适合计算机专业学生完成课程设计、毕业设计或项目实战训练。代码结构清晰,包含后端Java业务代码、前端Vue页面以及HTML/CSS/JS等静态资源,能够呈现电商后台常见的商品、订单、用户管理等功能模块,便于理解前后端交互与管理流程。其中Java源文件承载主要业务逻辑,Vue负责管理界面,CSS与JS辅助样式和交互,配置文件和文档则帮助快速搭建运行环境。压缩包共62个文件,Java文件34个、Vue文件9个,另有JS、CSS、图片、字体、配置文件与说明文档,整体大小约65.22MB,解压后按文档指引即可运行。资源附带完整课程设计文档,可作为编写设计报告与答辩PPT的参考;代码完整度高,下载后无需二次修改就能启动,已有336人学习下载,适合直接借鉴或在此基础上扩展功能。
1. 拿到这份"电商后台管理系统"源码包,先别急着解压:JavaWeb课程设计的交付逻辑
"基于javaweb的电商后台管理系统源码+文档(95分以上课程设计).zip",在学生下载目录里很常见。它不是一键启动的软件,而是一套课程设计交付物:源码实现功能,文档讲圆设计,两者凑齐才能应付系统演示、报告、答辩三道关卡。
它覆盖课程设计的核心诉求:商品浏览、购物车、下单、后台管理页面,一个完整业务闭环,不是十几个静态页面拼成的玩具。三类人需要它:JavaWeb课设想借鉴分层架构的学生,代码能跑但答辩没底的人,第一次想跑通JSP+Servlet+MySQL组合的新手。
先说一个反直觉的结论:压缩包的价值不在"能跑",而在跑通之后你还讲得清楚。代码是静态的,答辩时老师的每句追问都是动态的。
2. 拆开JavaWeb课程设计的技术底牌:分层架构、版本选型与数据库建模
拿到压缩包的第一件事不是解压跑代码,而是先把技术栈盘清楚。一个JavaWeb课设的代码质量好不好,看三样东西:分层是否清楚、版本是否匹配、数据库设计是否完整。这一章就按这三样拆开讲,后面跑环境、写文档才会顺手。
2.1 为什么课程设计偏爱JSP+Servlet+JDBC分层架构?
你打开src目录,大概率会看到这种包结构:entity放实体类、dao放数据库操作、service放业务逻辑、servlet接收请求、util放工具类,JSP页面放在web目录下。这就是经典的JavaWeb分层,从Java课程设计案例源码里拆出来的骨架,绝大多数都是这样。我第一次做课设时也纠结为什么不直接SpringBoot,后来被答辩老师问了一句"Servlet生命周期是什么"就明白了:框架把这些过程封装成了黑匣子,而课程设计恰恰要求你把黑匣子打开。
请求链路一句话就能讲清:浏览器把表单提交给Servlet,Servlet调用Service,Service调用DAO,DAO用JDBC操作MySQL,再把结果原路返回,最后由JSP渲染。答辩时老师让你画流程图,本质上画的就是这条链路。所以无论源码里类名叫什么,你能在十分钟内把一条"登录请求"从URL到数据库的调用链在代码里指出来,这门课的底线就守住了。
那到底该选JSP+Servlet还是SSM?我的判断标准很简单:如果压缩包里只有web目录和src目录,没有applicationContext.xml也没有pom.xml,那就是纯JSP+Servlet;如果根目录有pom.xml,说明是Maven托管的SpringMVC工程,这时候要找spring-mvc.xml、spring-mybatis.xml。两种技术栈的文档写法不一样,SSM的文档要把"Spring容器管理Bean"写进总体设计里,但答辩时的考点是一致的:请求怎么进来、数据怎么查、页面怎么渲染。
2.2 环境版本选型:为什么JDK8+Tomcat8.5+MySQL5.7是默认组合
写课设的人一般会把自己能跑通的版本写进环境说明.txt,但你电脑上未必一致。理想的组合是JDK8配Tomcat8.5配MySQL5.7,理由是:Tomcat 8.5对应Servlet 3.1规范,JSP生命周期完全符合课本讲的模型;MySQL 5.7不会引入MySQL 8的驱动类名变更,也不用处理时区参数。
| 组合 | JDK | Tomcat | MySQL | 驱动类 | 需要特别注意 |
|---|---|---|---|---|---|
| 最省事 | 1.8 | 8.5.x | 5.7 | com.mysql.jdbc.Driver | 基本零配置 |
| 常见适配 | 1.8 | 9.0.x | 8.0 | com.mysql.cj.jdbc.Driver | url加serverTimezone |
| 新机器 | 11/17 | 9.0.x | 8.0 | com.mysql.cj.jdbc.Driver | Project Structure语言级别降回8 |
如果电脑只装了JDK17,不要慌。在Project Structure里把Project SDK和Modules的Language level都选到8,Tomcat用9.0版本,项目照样能跑。报invalid source release: 17这类错,就是语言级别没降下来。这一步属于IDEA运行JavaWeb项目配置里最容易被忽略的一环,很多人代码没问题,卡在这里一小时。
2.3 数据库建模:用户、商品、订单、订单明细四张表的设计要点
数据库设计基本决定了文档里ER图长什么样。打开压缩包里的sql脚本,你大概率会看到这几张核心表。课设电商,表可以多一点少一点,但用户、商品、订单、订单明细这四张必须齐全,购物车反而常常不建表。为什么?因为课程设计的购物车用Session存就够了,数据库里只需存"已经确定购买"的订单。
CREATE DATABASE shop_db DEFAULT CHARACTER SET utf8mb4; USE shop_db; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL COMMENT '存的是加密摘要', email VARCHAR(100), phone VARCHAR(20), status TINYINT DEFAULT 1 COMMENT '1=正常,0=禁用', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, sort INT DEFAULT 0 ); CREATE TABLE t_product ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL, name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, image VARCHAR(255) COMMENT '商品图片相对路径', description TEXT ); CREATE TABLE t_order ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL, user_id INT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0 COMMENT '0未支付 1已支付 2已发货 3已完成 4已取消', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, product_id INT NOT NULL, product_name VARCHAR(100), price DECIMAL(10,2), quantity INT NOT NULL );这段建表SQL有三个要点值得留意。第一,price用DECIMAL(10,2)而不是float,float在金额计算上会有误差,答辩老师抓这个很准;第二,order_item冗余了product_name和当时价格,商品改价后历史订单不受影响;第三,订单状态只用TINYINT一个数字位表示,状态流转写进文档里,比拆五张订单状态表好讲得多。外键我一般不建议在表上强制加,课程设计阶段级联删除容易把数据删穿,代码里控制外键逻辑更安全。
还有一点:拿到SQL脚本先不急着执行,把每张表的字段名和src/entity下的实体类属性对一遍,userId和user_id这种下划线到驼峰的转换有没有写对。实体类里字段对不上时,MyBatis会报参数错误,JSP+Servlet反而没事,因为手写rs.getInt("user_id")只认列表名。这份对照关系,到第4章写数据库设计说明时还要再用一次。
3. 用IDEA把JavaWeb课设跑通:从导入检查到冒烟验证的完整配置路径
跑通环境是整个课程设计最花时间的环节,而且往往不是代码问题。这一章按我自己的操作顺序来讲:解压检查、配置数据库连接、配置Tomcat、最后系统验证。照着做,一小时左右能见到登录页。
3.1 导入IDEA前先检查三件事:SQL脚本、JDK版本、依赖方式
解压前先看一眼压缩包文件列表。常见结构里有sql或db目录、src、web、docs、以及一个环境说明txt。如果有环境说明,第一件事是把它读完,它比网上任何教程都更接近这份代码本来的运行方式。接下来把项目解压到一个英文路径下,比如D:/projects/shop。中文路径这个问题听起来像玄学,但Tomcat在Windows下遇到中文目录会报各种编码错误,IDEA的编译输出目录也会出问题,翻车率极高。
打开IDEA点File → Open,选解压出的根目录,等它完成索引。此时要判断依赖方式:看根目录有没有pom.xml。有pom说明是Maven项目,IDEA识别后会自动下载依赖,你要观察右下角进度;没有pom就去WEB-INF/lib目录下找jar,mysql-connector-java和c3p0这两个jar必须存在。很多课程设计源码包是从别处导出的,lib目录却是空的,这种项目即使导入成功也跑不起来,解决方式是去Maven中央仓库下载对应版本jar放进去,或者干脆换一个完整的源码包继续。
3.2 配置数据库连接:db.properties与JdbcUtils,五个必调参数
配置数据库连接是JavaWeb项目完整案例里最需要调整的部分,因为账号密码一定和你本地不一样。连接配置一般集中在db.properties和JdbcUtils.java里。MySQL 5.7常见的配置写成这样:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&useSSL=false jdbc.username=root jdbc.password=123456 # C3P0连接池参数 c3p0.initialPoolSize=5 c3p0.maxPoolSize=20 c3p0.minPoolSize=5 c3p0.checkoutTimeout=3000MySQL 8要做的改动:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=123456两个配置放一起对比,差别就是驱动类从.jdbc.变成.cj.jdbc.,url里多出serverTimezone和allowPublicKeyRetrieval。前者是MySQL 8.0对时区的强制要求,后者是8.0.3之后对握手过程的放行,这两个不改,报错时很难读懂堆栈。useSSL=false一定要保留,否则会有SSL握手警告,虽然不影响连接,但答辩现场控制台飘一排红色警告很影响印象分。
package com.example.shop.util; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class JdbcUtils { // 默认读取classpath下的c3p0-config.xml private static DataSource ds = new ComboPooledDataSource("mysql"); public static Connection getConnection() throws SQLException { // 每次从连接池取,用完要归还,不能close整个池 return ds.getConnection(); } public static DataSource getDataSource() { return ds; } }JdbcUtils的关键不是抓连接,而是static代码块里只初始化一次数据源。很多改过课设的人会把ComboPooledDataSource new进getConnection方法里,连接池变成摆设。另外注意构造参数,如果c3p0-config.xml里配置的是<named-config name="mysql">,这里就写new ComboPooledDataSource("mysql"),名字不一致会直接抛Bean找不到的异常。连接池初始化一次,之后每次getConnection都从池里取,这是它和DriverManager方式最大的区别。
3.3 配置Tomcat部署:war exploded、Application context,三个关键选项
数据库配好后配置Tomcat。Run → Edit Configurations → 点左上角加号,在列表底部或搜索框里找到Tomcat Server → Local。这一步就卡住过很多人,IDEA新版本把Tomcat分类收起来了,直接在搜索栏输入Tomcat会更快。
进去之后有三处必须核对。第一,Application server旁边点Configure,选Tomcat的安装根目录,注意是带conf和bin的那一层。第二,切到Deployment页签,点加号选Artifact,这里有两个同名前缀的项,务必选带(exploded)的那个。war模式要打包再解压,改一次JSP就要重启一遍;exploded模式把编译产物直接丢给Tomcat,配合On Update action选Update resources,改完JSP刷新页面就能看到效果。第三,Deployment下面有个Application context输入框,默认会带一个项目名,我建议改成/,这样访问URL里/项目名这段就没了,项目里所有写死路径的跳转都不容易404。
提示:出现"Error during artifact deployment"时,90%是Deployment页签没添加Artifact,或者Application context路径冲突。先看控制台前两行,再检查这两处。
启动前再看一眼Tomcat Server Settings里的HTTP port,默认8080,如果被占用改成8088。这些配置项的名字在不同IDEA版本里略有差异,但位置都在Run Configuration窗口。这一个选择过程就是网上常说的IDEA运行JavaWeb项目配置,但真正不踩坑的关键就上面三条。
3.4 跑通后先验证五个功能点:冒烟清单到控制台黑匣子
能跳转到登录页,项目才叫跑通。别急着截图写文档,先按顺序过一遍冒烟清单,把核心链路打通。任何一个环节报错,后面所有截图都是废的。
| 顺序 | 功能 | 操作 | 预期结果 |
|---|---|---|---|
| 1 | 登录 | 用已有账号密码提交 | 跳转首页或后台 |
| 2 | 退出登录 | 点击退出按钮 | Session销毁,回登录页 |
| 3 | 商品列表 | 打开首页商品区 | 图片、价格、库存正常显示 |
| 4 | 加入购物车 | 点加购再打开购物车页 | 数量、小计计算正确 |
| 5 | 下单 | 购物车结算生成订单 | 库存扣减,订单状态变待支付 |
冒烟清单跑完后,把项目里现有的测试账号整理出来,文档里登录演示要用。如果登录就报500,把控制台异常堆栈复制出来,从第一行Caused by往前找,遇到SQLException就直接把SQL语句掏出来在Navicat里跑一遍,十有八九是表名拼错或字段不存在。这种把控制台堆栈当黑匣子的定位方式,比瞎改代码快得多。
4. 把文档写成95分答辩稿:报告结构、ER图自查与高频追问应答
源码能跑是及格线,文档和答辩才是拉开差距的部分。这一章讲文档怎么写才不露怯,以及答辩前怎么把五个高频问题练熟。文档的核心不是字数多,而是每一章都能在源码里找到对应证据。
4.1 课程设计报告的结构套路:每个章节放什么证据
课程设计报告的骨架通常是七段式:需求分析、总体设计、数据库设计、详细设计、系统实现、测试、结论与体会。每个章节必须有对应源码证据,否则老师一眼看出是编的。
| 章节 | 核心内容 | 源码里对应什么 |
|---|---|---|
| 需求分析 | 用户角色、功能用例 | 列出URL路由与页面功能 |
| 总体设计 | 系统架构图与分层说明 | src下的servlet、service、dao包 |
| 数据库设计 | ER图 + 表结构说明 | sql脚本与entity实体类 |
| 详细设计 | 核心流程与关键代码 | index.jsp到DAO的调用链 |
| 系统实现 | 页面截图 + 代码说明 | 运行截图与标注 |
| 测试 | 用例表 + 结果 | 冒烟清单的验证结果 |
| 结论与体会 | 遇到的问题及解决 | 踩坑记录 |
需求分析别写"系统具有高效性、安全性"这种没证据的套话。写清楚两类用户:前台访客能注册、浏览、加购、下单;后台管理员能登录、维护商品、处理订单。借助黑马JavaWeb笔记里常用的用例描述方式,把用例名统一成"商品管理用例""订单处理用例",术语前后一致,答辩老师听着顺耳。
详细设计部分是拿分重点。挑一条核心链路,建议用登录:用户在index.jsp输入账号、表单POST到LoginServlet、LoginServlet调UserService、UserService调UserDao、UserDao通过JdbcUtils拿连接执行SQL、返回User对象、session存标记、跳转首页。每一步截图或贴关键行,这一段写透了,后面所有功能描述都可以复用这套话术。
4.2 ER图、用例图、时序图:怎么画得和代码对得上
画图工具用draw.io或ProcessOn都行,重点是关系和数据字典要和SQL脚本一致。最容易翻车的三个地方我列一下:ER图里的实体名和表名不一致,比如实体叫Order而表叫orders;字段数量对不上,SQL里12个字段图里只画8个;最隐蔽的是关系线画错,订单明细本应是订单和商品之间的关联表,却画成订单和商品直接多对多。
自查方法很笨但有效:打开SQL脚本,把ER图里每个实体名Ctrl+F搜一遍,再把每个字段在对应CREATE TABLE里核对一遍。关系线上标注的1和N,要回到第2.3节的表结构理解:用户1对多订单,订单1对多订单明细,分类1对多商品。这是"把多对多拆成一对多"的经典设计,答辩时被问到"为什么有两个订单表"就用这条思路回答。
提示:画完ER图立刻对照建表SQL跑一遍,用Navicat里"逆向表到模型"自动生成的图作为底稿,比自己徒手画保险得多。
时序图不用画完整系统,只画下单流程就够:用户、购物车JSP、OrderServlet、OrderService、t_order、t_order_item四条生命线之间五条消息。这张图画出来,老师对你系统设计的信任度会明显不一样。
4.3 答辩高频追问Top5:对应的代码位置和标准回答
答辩老师的追问有很强的套路性,总结下来就是五个问题。考前把代码定位练熟,每个问题都能在两分钟内指给他看。
第一个:购物车存哪里?答:购物车数据放在Session里,键名是cart,CartItem实体里有productId、quantity、price。局限是服务器重启或Session过期会丢,改进方向是存Cookie或落库。别只说后半句,老师问的是你知不知道代价。
第二个:订单状态是怎么流转的?打开t_order表的status字段,答:0未支付、1已支付、2已发货、3已完成、4已取消,只有已取消可以从任意非终态跳转。然后翻到OrderService里的updateStatus方法,告诉他状态流转都集中在这个方法里。
第三个:扣库存会不会超卖?如果代码只是先查库存再UPDATE,你就承认存在风险并给出改进SQL:
UPDATE t_product SET stock = stock - 1 WHERE id = ? AND stock > 0;受影响行数为0时就说明有人抢先扣掉了最后一件。这是行锁和乐观锁的最简应用,答出来是直接加分项。
第四个:密码安全吗?如果源码里是明文存储,答辩前一定要改,见第6章的第一个升级。改完后你就有底气说:登录流程里做MD5摘要,数据库存的是摘要不是明文。老师如果再追问碰撞和加盐,你可以说课程设计做的是静态盐MD5,生产环境会用BCrypt,承认边界比吹牛安全。
第五个:后台权限怎么控制?答:后台所有/admin/*路径被一个Filter拦截,Session里没有管理员标记就重定向到登录页。找到那个Filter,把url-pattern指给老师看,这道题就过了。
这五个问题准备完,你的结论与体会章节就有素材了:可以写购物车基于Session存在重启丢失问题,后续考虑存Cookie或Redis;密码采用MD5加盐,生产环境应升级BCrypt。总结里写自己知道边界,比写"完美实现了所有功能"可信得多。
5. 避坑与常见问题排查:JavaWeb启动失败与运行时异常的五个真实场景
按上面流程走,大部分项目能起来。真正磨人的是启动成功但功能异常。下面五条是我在做JavaWeb课程设计过程中踩过的坑,按出现频率排,每条按现象、原因、解决整理。
5.1 现象一:Tomcat启动成功但浏览器404,项目没部署上去
现象:控制台没有任何报错,Tomcat正常启动,但访问localhost:8080显示Tomcat默认首页,访问/index.jsp直接404。
原因:启动的是空Tomcat,IDEA运行配置的Deployment页签里根本没加Artifact。另一个常见版本是加了Artifact但选成了war包,IDEA会把war包重新解压到一个临时目录,访问路径和你项目实际路径对不上。
解决:打开Run → Edit Configurations,点Deployment页签,点加号,Artifact选带(exploded)的项,Application context填/。重新启动后看控制台有没有"Deployment of web application"的完成日志,有才算部署成功。注意要Stop再Start,不要点Rerun图标,Rerun有时不触发重新部署。
5.2 现象二:MySQL 8连接报deprecated或Public Key Retrieval is not allowed
现象:启动项目后第一次请求数据库,控制台报Loading class 'com.mysql.jdbc.Driver' is deprecated,或Communications link failure,或Public Key Retrieval is not allowed。
原因:本地MySQL是8.0,而项目里驱动类还是连接5.7的旧写法。MySQL 8.0把驱动类从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver,同时引入新的认证插件,在不允许获取公钥时会拒绝非SSL连接。
解决:改db.properties文件的两行:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true另一处容易被忽略:如果项目用的是c3p0-config.xml而db.properties只是摆设,要检查两个文件的url有没有都改。改完连接池配置后,最好把Tomcat整个停掉再启动,连接池在第一次初始化时会缓存配置,光刷新页面不会重新加载。
5.3 现象三:表单提交、JSP显示全是中文乱码
现象:页面标题和商品描述全是问号或方框;表单提交后在数据库里也是乱码。
原因:三层编码有一处断了——JSP页面本身不是UTF-8,Servlet读不到UTF-8,MySQL连接url没带编码参数。单独修任何一层都不能根治。
解决:第一层,JSP页面顶部统一写pageEncoding="UTF-8"和contentType="text/html;charset=UTF-8"。第二层,web.xml加一个全局编码过滤器:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>如果Tomcat版本里没有这个内置过滤器类,就自己写一个Filter,doFilter里两行代码:request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); 再把url-pattern配成/*。第三层,数据库连接url里保证useUnicode=true&characterEncoding=utf8,建表SQL用utf8mb4。三层统一后再乱码,检查MySQL的my.ini里有没有default-character-set=gbk这类旧配置。
5.4 现象四:商品图片路径404,上传的图片不显示
现象:后台能上传图片,商品列表里的图片却裂开;或者图片能显示,但一刷新就丢。
原因:上传代码把图片写到了项目外部的磁盘目录,比如D:/upload/xxx.jpg,而页面里的img标签写的是localhost:8080/xxx.jpg,浏览器按应用路径去找,根本不在Tomcat的发布目录里。
解决:开发期最省事的方式是把上传目录直接放到web/upload下,img标签用相对路径/upload/xxx.jpg访问。如果原设计非要外部目录不可,就在Tomcat的server.xml的Host节点内加虚拟目录映射:
<Context docBase="D:/upload" path="/upload" reloadable="true"/>加完后重启Tomcat生效。注意这个Context的path要以/开头,docBase写绝对路径。课程设计里如果不想动server.xml,把上传逻辑的保存路径改到项目内即可,改动量只有一行字符串。
5.5 现象五:Tomcat启动一闪而过或IDEA报端口占用
现象:双击startup.bat窗口闪一下就消失;IDEA启动时报"Port 8080 is already in use"。
原因:闪退最常见的是8080或8005端口被其他进程占了,Tomcat无法完成启动。另一个常见原因是JDK环境变量没配,但那样会打印明显错误而不是闪退。
解决:在Windows命令行里执行:
netstat -ano | findstr 8080 taskkill /PID 进程号 /F找到占用8080的PID后taskkill。macOS和Linux对应命令是lsof -i:8080和kill -9 PID。如果8080被某个常驻程序占用,直接把Tomcat的HTTP端口改成8088更省事。改端口的完整要领是改server.xml里的三处:8005是Tomcat关闭端口,8080是HTTP端口,8009是AJP端口,三者都不能和其他服务冲突,只改8080有一半概率还会死在8005上。
注意:IDEA里改了server.xml后要重启Tomcat一次,不要用热更新,server.xml改动不触发自动重载。
6. 答辩前一天的三个低成本升级:密码加盐、商品分页、后台访问控制
如果明天就答辩,今天只剩一天,别想重构代码。三件事性价比最高:给密码加盐、给商品列表加分页、给后台路径加访问控制。
| 升级点 | 改前 | 改后 | 答辩怎么讲 |
|---|---|---|---|
| 密码加盐 | 明文存库 | MD5加盐 | 数据安全底线,摘要不可逆 |
| 商品分页 | 全量查列表 | LIMIT分页 | 大数据量下的查询优化 |
| 后台授权 | 靠页面链接隐蔽 | Filter拦截 | 权限校验与统一入口 |
密码加盐的代码不需要任何第三方jar,用JDK自带的MessageDigest实现:
public class Md5Util { private static final String SALT = "shop2024"; public static String encrypt(String password) { String target = SALT + password + SALT; char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; try { byte[] bytes = MessageDigest.getInstance("MD5") .digest(target.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(hexDigits[(b >> 4) & 0x0f]); sb.append(hexDigits[b & 0x0f]); } return sb.toString(); } catch (Exception e) { throw new RuntimeException("MD5加密失败", e); } } }SALT可以写死一个固定值,课程设计够用;生产环境要改成每个用户随机盐。改完后把SQL脚本里已有的密码字段更新成加密后的值,否则原账号全部登录不上。可以在测试类里写个main方法批量生成摘要,再UPDATE进去。登录和注册的Servlet里,把原来直接setString(password)的地方替换成Md5Util.encrypt(password)。
分页的改法更简单:商品查询SQL加上LIMIT ? OFFSET ?,前端在index.jsp的商品列表循环外画一组页码链接,后端用一个PageBean整理pageNo、pageSize、totalCount和list。分页是"性能优化"类追问的标准回答素材,也是系统实现章节最值得贴代码的地方。Filter访问控制已经在4.3节讲过,这里只有一个注意点:放行登录页、注册页和CSS、JS等静态资源,别把样式也拦了,否则后台页面打开全是裸样式。
我习惯在答辩前一天做一次完整演练:从删库、建库、跑SQL脚本开始,按冒烟清单把登录、下单、扣库存、后台维护商品全部点一遍,再把文档和源码逐页对照一次。这套流程看起来笨,但它保证了我在讲台上不会看到任何一个非预期页面。课程设计分数是代码、文档、表达的综合结果,把对着代码讲流程练到条件反射,分数自然落在它能落在的地方。希望帮到你。
本文还有配套的精品资源,点击获取