
简介面向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课设想借鉴分层架构的学生代码能跑但答辩没底的人第一次想跑通JSPServletMySQL组合的新手。先说一个反直觉的结论压缩包的价值不在能跑而在跑通之后你还讲得清楚。代码是静态的答辩时老师的每句追问都是动态的。2. 拆开JavaWeb课程设计的技术底牌分层架构、版本选型与数据库建模拿到压缩包的第一件事不是解压跑代码而是先把技术栈盘清楚。一个JavaWeb课设的代码质量好不好看三样东西分层是否清楚、版本是否匹配、数据库设计是否完整。这一章就按这三样拆开讲后面跑环境、写文档才会顺手。2.1 为什么课程设计偏爱JSPServletJDBC分层架构你打开src目录大概率会看到这种包结构entity放实体类、dao放数据库操作、service放业务逻辑、servlet接收请求、util放工具类JSP页面放在web目录下。这就是经典的JavaWeb分层从Java课程设计案例源码里拆出来的骨架绝大多数都是这样。我第一次做课设时也纠结为什么不直接SpringBoot后来被答辩老师问了一句Servlet生命周期是什么就明白了框架把这些过程封装成了黑匣子而课程设计恰恰要求你把黑匣子打开。请求链路一句话就能讲清浏览器把表单提交给ServletServlet调用ServiceService调用DAODAO用JDBC操作MySQL再把结果原路返回最后由JSP渲染。答辩时老师让你画流程图本质上画的就是这条链路。所以无论源码里类名叫什么你能在十分钟内把一条登录请求从URL到数据库的调用链在代码里指出来这门课的底线就守住了。那到底该选JSPServlet还是SSM我的判断标准很简单如果压缩包里只有web目录和src目录没有applicationContext.xml也没有pom.xml那就是纯JSPServlet如果根目录有pom.xml说明是Maven托管的SpringMVC工程这时候要找spring-mvc.xml、spring-mybatis.xml。两种技术栈的文档写法不一样SSM的文档要把Spring容器管理Bean写进总体设计里但答辩时的考点是一致的请求怎么进来、数据怎么查、页面怎么渲染。2.2 环境版本选型为什么JDK8Tomcat8.5MySQL5.7是默认组合写课设的人一般会把自己能跑通的版本写进环境说明.txt但你电脑上未必一致。理想的组合是JDK8配Tomcat8.5配MySQL5.7理由是Tomcat 8.5对应Servlet 3.1规范JSP生命周期完全符合课本讲的模型MySQL 5.7不会引入MySQL 8的驱动类名变更也不用处理时区参数。组合JDKTomcatMySQL驱动类需要特别注意最省事1.88.5.x5.7com.mysql.jdbc.Driver基本零配置常见适配1.89.0.x8.0com.mysql.cj.jdbc.Driverurl加serverTimezone新机器11/179.0.x8.0com.mysql.cj.jdbc.DriverProject Structure语言级别降回8如果电脑只装了JDK17不要慌。在Project Structure里把Project SDK和Modules的Language level都选到8Tomcat用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)而不是floatfloat在金额计算上会有误差答辩老师抓这个很准第二order_item冗余了product_name和当时价格商品改价后历史订单不受影响第三订单状态只用TINYINT一个数字位表示状态流转写进文档里比拆五张订单状态表好讲得多。外键我一般不建议在表上强制加课程设计阶段级联删除容易把数据删穿代码里控制外键逻辑更安全。还有一点拿到SQL脚本先不急着执行把每张表的字段名和src/entity下的实体类属性对一遍userId和user_id这种下划线到驼峰的转换有没有写对。实体类里字段对不上时MyBatis会报参数错误JSPServlet反而没事因为手写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目录下找jarmysql-connector-java和c3p0这两个jar必须存在。很多课程设计源码包是从别处导出的lib目录却是空的这种项目即使导入成功也跑不起来解决方式是去Maven中央仓库下载对应版本jar放进去或者干脆换一个完整的源码包继续。3.2 配置数据库连接db.properties与JdbcUtils五个必调参数配置数据库连接是JavaWeb项目完整案例里最需要调整的部分因为账号密码一定和你本地不一样。连接配置一般集中在db.properties和JdbcUtils.java里。MySQL 5.7常见的配置写成这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/shop_db?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456 # C3P0连接池参数 c3p0.initialPoolSize5 c3p0.maxPoolSize20 c3p0.minPoolSize5 c3p0.checkoutTimeout3000MySQL 8要做的改动jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/shop_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456两个配置放一起对比差别就是驱动类从.jdbc.变成.cj.jdbc.url里多出serverTimezone和allowPublicKeyRetrieval。前者是MySQL 8.0对时区的强制要求后者是8.0.3之后对握手过程的放行这两个不改报错时很难读懂堆栈。useSSLfalse一定要保留否则会有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 namemysql这里就写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图里每个实体名CtrlF搜一遍再把每个字段在对应CREATE TABLE里核对一遍。关系线上标注的1和N要回到第2.3节的表结构理解用户1对多订单订单1对多订单明细分类1对多商品。这是把多对多拆成一对多的经典设计答辩时被问到为什么有两个订单表就用这条思路回答。提示画完ER图立刻对照建表SQL跑一遍用Navicat里逆向表到模型自动生成的图作为底稿比自己徒手画保险得多。时序图不用画完整系统只画下单流程就够用户、购物车JSP、OrderServlet、OrderService、t_order、t_order_item四条生命线之间五条消息。这张图画出来老师对你系统设计的信任度会明显不一样。4.3 答辩高频追问Top5对应的代码位置和标准回答答辩老师的追问有很强的套路性总结下来就是五个问题。考前把代码定位练熟每个问题都能在两分钟内指给他看。第一个购物车存哪里答购物车数据放在Session里键名是cartCartItem实体里有productId、quantity、price。局限是服务器重启或Session过期会丢改进方向是存Cookie或落库。别只说后半句老师问的是你知不知道代价。第二个订单状态是怎么流转的打开t_order表的status字段答0未支付、1已支付、2已发货、3已完成、4已取消只有已取消可以从任意非终态跳转。然后翻到OrderService里的updateStatus方法告诉他状态流转都集中在这个方法里。第三个扣库存会不会超卖如果代码只是先查库存再UPDATE你就承认存在风险并给出改进SQLUPDATE 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。原因启动的是空TomcatIDEA运行配置的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.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/shop_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue另一处容易被忽略如果项目用的是c3p0-config.xml而db.properties只是摆设要检查两个文件的url有没有都改。改完连接池配置后最好把Tomcat整个停掉再启动连接池在第一次初始化时会缓存配置光刷新页面不会重新加载。5.3 现象三表单提交、JSP显示全是中文乱码现象页面标题和商品描述全是问号或方框表单提交后在数据库里也是乱码。原因三层编码有一处断了——JSP页面本身不是UTF-8Servlet读不到UTF-8MySQL连接url没带编码参数。单独修任何一层都不能根治。解决第一层JSP页面顶部统一写pageEncodingUTF-8和contentTypetext/html;charsetUTF-8。第二层web.xml加一个全局编码过滤器filter filter-nameencodingFilter/filter-name filter-classorg.apache.catalina.filters.SetCharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping如果Tomcat版本里没有这个内置过滤器类就自己写一个FilterdoFilter里两行代码request.setCharacterEncoding(UTF-8); chain.doFilter(request, response); 再把url-pattern配成/*。第三层数据库连接url里保证useUnicodetruecharacterEncodingutf8建表SQL用utf8mb4。三层统一后再乱码检查MySQL的my.ini里有没有default-character-setgbk这类旧配置。5.4 现象四商品图片路径404上传的图片不显示现象后台能上传图片商品列表里的图片却裂开或者图片能显示但一刷新就丢。原因上传代码把图片写到了项目外部的磁盘目录比如D:/upload/xxx.jpg而页面里的img标签写的是localhost:8080/xxx.jpg浏览器按应用路径去找根本不在Tomcat的发布目录里。解决开发期最省事的方式是把上传目录直接放到web/upload下img标签用相对路径/upload/xxx.jpg访问。如果原设计非要外部目录不可就在Tomcat的server.xml的Host节点内加虚拟目录映射Context docBaseD:/upload path/upload reloadabletrue/加完后重启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脚本开始按冒烟清单把登录、下单、扣库存、后台维护商品全部点一遍再把文档和源码逐页对照一次。这套流程看起来笨但它保证了我在讲台上不会看到任何一个非预期页面。课程设计分数是代码、文档、表达的综合结果把对着代码讲流程练到条件反射分数自然落在它能落在的地方。希望帮到你。本文还有配套的精品资源点击获取