ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JavaWeb购物商城项目从配置到部署:JDK、Tomcat、MySQL实战避坑指南

JavaWeb购物商城项目从配置到部署:JDK、Tomcat、MySQL实战避坑指南 简介面向JavaWeb学习者的购物商城实战项目以Java与MySQL为基础采用MVC设计模式和动态代理模式适合巩固Web基础并将知识融入完整业务流程。项目覆盖核心交易链路主页热销商品、商品搜索、详情页库存与评价、立即购买、购物车增减与结算下单包含库存校验、重复提交防护等细节后台支持会员管理、商品批量上下架、库存维护与订单发货。资源共613个文件压缩包约16.85MB主要包含Java源码、JSP页面、JS/CSS前端资源、图片素材、依赖包及SQL数据库脚本便于导入运行和二次开发目录划分清楚方便按模块检索学习。已有21951人学习/下载。借助该源码可快速搭建可运行的购物商城直观理解分层架构与代理模式的真实应用也可参考订单状态流转、后台管理等常见设计思路。1. 接手 JavaWeb 购物商城项目先别急着点运行把它当成一次交付来啃一个 JavaWeb 购物商城项目完整源码MySQL 数据库最能骗人的不是代码而是压缩包里那句“导入即可运行”。我接过好几份这样的课程设计和毕业设计源码结构基本同构JSP Servlet JDBC MySQL功能围绕用户注册登录、商品浏览、购物车、下单和后台管理展开。对新手来说它最大的价值不是学到什么高深架构而是拿到一个能完整跑通的参照系前端页面、数据库表、Session、事务每一步都能对上。对想把它变成自己作品的人来说难点不在功能而在环境JDK、Tomcat、MySQL、IDEA 的版本只要错一个就可能花一下午查一个玄学报错。这篇就按我实际交付的顺序从环境配置讲到数据库脚本注入再讲到代码结构和部署避坑最后给一套把项目从“能运行”改成“能交付”的做法希望能省掉你走弯路的时间。2. 用 IDEA 运行 JavaWeb 项目配置JDK、Tomcat、MySQL、依赖一次对齐跑 JavaWeb 商城源码最常见的失败原因不是代码逻辑而是四个东西没有对齐JDK、Tomcat、MySQL、JDBC 驱动。下面按我每次接手源码的顺序来配置。先判断工程形态再装数据库最后导入工程改路径这一套做完启动阶段的问题基本能消灭九成。2.1 先分清手里是 Maven 工程还是传统 Web 工程收到源码先做两步看根目录有没有pom.xml看src下有没有web.xml。有pom.xml说明是 Maven 工程依赖可以自动下载没有则源码根目录通常带一个lib文件夹依赖需要手动导入。两种工程在 IDEA 里的导入方式完全不同混着操作就是第一个坑。打开命令行先把环境底细查一遍我一般会执行java -version javac -version mvn -version echo %JAVA_HOME%第一行确认 JRE第二行确认 JDK 编译器版本第三行确认 Maven 可用最后一行看JAVA_HOME是否指向 JDK 而不是 JRE。老一点的项目里JAVA_HOME被指向 JRE 的现象很常见Maven 和 Tomcat 都会因此启动失败。这套命令没有副作用任何机器都可以先跑一遍。如果工程带pom.xml先在 IDEA 里 File → Open 直接选根目录IDEA 识别到 Maven 后会自动导入依赖。老工程常用依赖就集中在下面这一段dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependencymysql-connector-java的版本要和你本机 MySQL 匹配MySQL 5.7 可以用 5.1.49MySQL 8.0 以上最好直接上 8.0.33否则后面一定会遇到认证插件报错。javax.servlet-api用了provided范围意思是编译时需要、运行时不打包因为 Tomcat 自己带了一套 Servlet 实现打了反而可能版本冲突。没有 Maven 的工程更麻烦一些。项目根目录下有lib文件夹时在 IDEA 里做两步Project Structure → Libraries → 加号 → Java把lib整个目录选进去然后 Project Structure → Artifacts → 选中项目的 Web Application 展开后的 Output Layout把lib目录以 Copy of 的方式加到WEB-INF/lib下。很多人只做了第一步运行时照样报ClassNotFoundException原因就是 Artifact 没带上依赖。2.2 MySQL 安装5.7 还是 8.x决定你要不要多交调试费商城项目的数据库脚本通常按 MySQL 5.7 写的字符集、SQL 模式、认证方式都是旧习惯。装 MySQL 前先看源码里的连接驱动和 SQL 语句驱动是 5.x数据库就老老实实用 5.7.44驱动是 8.xMySQL 8.0 或 8.4 都行。不要从第三方博客给的 mysql 下载地址随手点一个安装包能选官方安装包就选官方能选 LTS 就选 LTS。我第一次跑通这类项目用的是 mysql 5.7.44 的 zip 免安装版整个安装配置过程其实就三步解压、初始化、启动。mysqld --initialize-insecure --usermysql --basedirD:/mysql-5.7.44 --datadirD:/mysql-5.7.44/data net start mysql--initialize-insecure会生成一个空密码的 root 用户适合本地开发。如果用--initialize不带 insecure初始化日志里会随机生成密码密码存在data目录下的.err日志里新手容易找不到。初始化之后用net start mysql启动服务如果提示服务不存在需要先执行mysqld --install把 MySQL 注册成 Windows 服务。MySQL 8.4.11 LTS 我也在几台新机器上用过初始化方式差别不大但默认认证插件改成了caching_sha2_password老项目里的 5.x JDBC 驱动连上去会直接报错。我一般建议跑课程设计类源码时优先用 MySQL 5.7等把业务逻辑吃透了再换 8.x不要在新旧认证方式上浪费时间。启动成功后立刻执行一次mysql -uroot -p能进命令行说明安装没问题后面所有数据库操作都从命令行先过一遍。2.3 导入源码后必改的三处路径jdbc.properties、web.xml、字符集环境装好后源码导入 IDEA 还要改三处。第一处是数据库连接配置这类项目里通常叫jdbc.properties、db.properties或jdbc.java里面写着数据库地址、账号、密码。jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/shop?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456注意jdbc.driver的值驱动是 8.x 时com.mysql.jdbc.Driver虽然还能用但已经标记废弃建议改成com.mysql.cj.jdbc.Driver。URL 里的serverTimezoneAsia/Shanghai在 MySQL 8.x 下几乎必加不加会报时区错误。characterEncodingutf8这一项必须保留后面乱码问题一大半靠它兜底。第二处是web.xml里的欢迎页和 Servlet 映射路径。老源码里经常写死/shop/index.jsp如果你部署时的 Application context 不叫shop访问就直接 404。IDEA 里 Run → Edit Configurations → Tomcat Server → Deployment → Application context 改成/shop或者把web.xml里的映射路径同步改掉二选一不能两边不一致。第三处是确认源码里的上传目录、日志目录没有被写死成别人机器上的绝对路径例如C:/Users/admin/Desktop这类不改的话运行到上传商品图片功能就会翻车。3. 数据库初始化从 MySQL 脚本到可联调数据照着 SQL 敲通整张业务网数据库是购物商城项目的黑匣子代码跑不通时大家习惯怀疑代码但实际上大量问题出在库没建对、脚本没导入干净、表结构和代码实体对不上。本章从建库讲到连接池参数每一步都给出可以直接执行的命令。3.1 建库建用户字符集、排序规则与权限先建库不要直接用 root 连业务库。小商城项目虽然单机开发但建一个独立账号能防止后面误删其他库也方便在GRANT里把读写边界限定清楚。CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER shoplocalhost IDENTIFIED BY shop123; GRANT ALL PRIVILEGES ON shop.* TO shoplocalhost; FLUSH PRIVILEGES;utf8mb4比utf8多出来的部分是四字节字符支持商品名称里如果出现特殊符号utf8会存不进去或变成乱码。COLLATE utf8mb4_general_ci是大小写不敏感的比较规则商城搜索关键词时不至于因为大小写查不到结果。如果你要在商品名上做精确排序排序规则选择会影响ORDER BY的表现这点到第五章再展开。给shop用户授权时shop.*表示只允许该用户操作 shop 库localhost限定了来源地址。若源码里配置的数据库地址是127.0.0.1这里用localhost没问题如果以后要放到远程服务器还得再建一个shop%账号否则只能本机连。CONCAT 一下CREATE USER shop% IDENTIFIED BY shop123;这样前后一致。3.2 导入商城数据脚本source 命令与常见中断拿到源码里的shop.sql后不建议用 Navicat 直接双击运行因为脚本里可能有分隔符问题、存储过程定义、中文注释编码问题。我习惯先用命令行导入错误信息更直接。mysql -ushop -pshop123 shop D:/sql/shop.sql进入 MySQL 后也可以用source命令source D:/sql/shop.sql;这两种方式等价。导入过程中最常遇到的三类中断第一是脚本里包含创建数据库语句但当前账号没有对应权限第二是字符集不匹配脚本头部没有SET NAMES utf8mb4导致中文数据导入后变乱码第三是脚本末尾有重复的DROP TABLE如果表不存在就会报错中断。前两种修复很直接用有权限的账号导入或者给脚本头部加一行SET NAMES utf8mb4;。第三种如果中断在中途不要反复从头导先把相关表DROP干净再重新执行。mysql 数据库常用命令其实就那么几条show databases;看库use shop;切库show tables;看表desc goods;看表结构。导入完成后我习惯先执行select count(*) from goods;确认商品表有数据再执行select * from orders limit 5;确认订单表结构能查。数据量对不上时优先怀疑脚本被中断过而不是代码有问题。3.3 商品表与订单表的结构设计参考商城项目的表设计大同小异核心是用户表、商品表、购物车表、订单表、订单明细表五张。老项目里常见的设计问题是不用外键、金额用float、库存允许负数这些在课程设计里能跑通但真要改造成可交付项目时都要返工。表名用途关键字段常见坑user用户id, username, password, nickname密码明文存储goods商品id, name, price, stock, image价格用 decimalcart_item购物车id, user_id, goods_id, count会话购物车可能不入库orders订单id, user_id, total_amount, status状态用 int 维护order_item订单明细id, order_id, goods_id, count, price下单后价格要冗余建商品表的语句可以参考下面这段字段注释都写在 SQL 里方便和源码里的实体类字段对账CREATE TABLE goods ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品ID, name VARCHAR(120) NOT NULL COMMENT 商品名称, price DECIMAL(10,2) NOT NULL COMMENT 售价单位元, stock INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 库存默认值0, image VARCHAR(255) DEFAULT NULL COMMENT 图片相对路径, status TINYINT NOT NULL DEFAULT 1 COMMENT 1上架 0下架, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表;stock INT UNSIGNED NOT NULL DEFAULT 0里DEFAULT 0直接覆盖了标题里经常搜到的“mysql 设置默认值为 0”的场景。给字段加默认值能省掉很多插入时字段缺失的报错。UNSIGNED保证库存不可能为负下单扣库存时即使忘记判断数据库层也能拦住一部分非法数据。价格用DECIMAL(10,2)不要用float否则金额累加会出现19.2000001这种结果。create_time用DEFAULT CURRENT_TIMESTAMP插入时少写一个字段。3.4 JDBC 驱动版本和连接池参数运行时报错先看这里传统 JavaWeb 项目很多不用连接池直接在 DAO 里DriverManager.getConnection()这种方式每查一次数据库就创建一次连接商城这种有频繁查询的场景跑起来很吃力。稍微完整一点的源码会用 DBCP 或 C3P0 连接池参数集中在db.properties里。jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/shop?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameshop jdbc.passwordshop123 # 连接池参数 initialSize5 maxActive20 maxWait3000initialSize5是启动时预创建的连接数maxActive20是最大活跃连接数maxWait3000是等待连接的超时毫秒数。商城做压力测试时maxActive太小会频繁超时太大又会把数据库连接数打满本地开发先用 20 就好。这段配置里最容易踩坑的是jdbc.driver和jdbc.url版本不匹配的报错信息到第五章细讲。4. 代码结构拆解登录、购物车与下单背后的数据流数据库通了接下来要把源码读懂。很多人拿到一个 javaweb 项目完整案例后第一件事是点 Run跑通了就觉得自己掌握了但这个习惯在商城项目上会吃亏。商城代码里最值得拆讲的是三段登录与拦截、购物车、下单扣库存。这三段串起 Session、集合、事务、锁是面试和改造都绕不开的地方。4.1 登录校验和页面拦截Session 状态与 Filter 的长尾老 JavaWeb 购物商城的登录逻辑通常是 Servlet 接收表单参数查一次数据库再把用户对象塞进 Session。核心代码长这样protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username req.getParameter(username); String password req.getParameter(password); User user userDao.findByUsernameAndPassword(username, password); if (user ! null) { req.getSession().setAttribute(LOGIN_USER, user); resp.sendRedirect(req.getContextPath() /goods?actionlist); } else { req.setAttribute(error, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); } }关键点是登录成功后的两条路setAttribute把用户放进 SessionsendRedirect重定向到商品列表页。这里用重定向而不是forward是为了防止刷新页面时表单重复提交。LOGIN_USER这个名字在源码里通常是常量后面所有页面判断登录状态都靠它。但只把用户塞进 Session 不够还要拦截未登录用户。老项目一般用 Filter 实现public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; Object user request.getSession().getAttribute(LOGIN_USER); if (user null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, resp); }这个 Filter 放到web.xml里拦截/cart/*、/order/*这类需要登录的路径。新手经常漏配chain.doFilter(req, resp)导致页面空白或者一直转圈。还有一版常见的写法是过滤器只拦 JSP 不拦 Servlet结果用户直接访问/goods?actionaddCart绕过了登录页这属于web.xml里url-pattern配错了范围。4.2 购物车Session 里的 HashMap 是多数小商城的首选购物车有两种实现存内存和存数据库。小商城项目一般选前者把购物车对象直接放在 Session 里。用 Map 的好处是增删改查都是 O(1)而且不需要连数据库页面响应很快。参考写法如下MapInteger, CartItem cart (MapInteger, CartItem) session.getAttribute(CART); if (cart null) { cart new HashMapInteger, CartItem(); session.setAttribute(CART, cart); } CartItem item cart.get(goodsId); if (item null) { item new CartItem(goods, 1); cart.put(goodsId, item); } else { item.setCount(item.getCount() 1); }购物车里的键是商品 ID值是“商品 数量”的CartItem。加入购物车时先判断这个商品是不是已经在车里在就数量加一不在就新建一个条目。session.getAttribute(CART)每次都强转MapInteger, CartItem如果源码里存的是ListCartItem强转就会报ClassCastException这也是别人改过的源码最容易埋雷的地方。Session 购物车的好处是简单坏处是服务端重启购物车就丢。如果项目要求“用户关掉浏览器再打开购物车还在”那就得建cart_item表按用户 ID 持久化。课程设计阶段不建议一上来就做持久化购物车先把内存版跑通把页面交互理清楚再决定要不要改。4.3 下单扣库存事务、行锁与存储过程的取舍购物车结算之后进入下单逻辑这是整个商城最需要小心的一段。核心是三步查库存、扣库存、生成订单。简单写法是三条 SQL 连在一起但必须放在同一个事务里否则扣了库存订单没生成就是脏数据。我建议直接看源码里的下单 DAO 或 Service找到事务边界在哪个方法上。START TRANSACTION; SELECT stock FROM goods WHERE id 1 FOR UPDATE; UPDATE goods SET stock stock - 1 WHERE id 1 AND stock 0; INSERT INTO orders (user_id, total_amount, status) VALUES (1, 199.00, 0); INSERT INTO order_item (order_id, goods_id, count, price) VALUES (LAST_INSERT_ID(), 1, 1, 199.00); COMMIT;SELECT ... FOR UPDATE是行锁锁住id 1这行防止两个用户同时下单把库存扣成负数。UPDATE ... WHERE id 1 AND stock 0是第二道保险即使行锁没生效这条更新条件也能挡住库存不足的写入。LAST_INSERT_ID()拿到的是当前连接刚生成的订单 ID用来关联订单明细。mysql 锁的分类背起来很熟全局锁、表锁、行锁、间隙锁真正落到商城项目里就是这一句FOR UPDATE。老项目里还有一种做法是把下单逻辑写成 mysql 存储过程一个CALL create_order(...)搞定事务。遇到这种源码要留个心眼存储过程在单库单表时非常好用但以后要分库分表或者加缓存存储过程会成为改造阻力。5. 常见问题与避坑排查从 500 到乱码六个真实故障现场跑 JavaWeb 购物商城源码遇到的大部分报错都不是代码逻辑问题而是环境一致性问题。下面六个坑是我在这些项目里见到次数最多的每条按现象、原因、解决的顺序写排查时可以照着过。5.1 HTTP 500 或 ClassNotFoundException依赖没有进 Artifact现象IDEA 启动 Tomcat 后浏览器访问首页直接 HTTP 500控制台滚动一堆ClassNotFoundException常见的是com.mysql.jdbc.Driver或某个 Servlet 类。原因项目根目录下的lib没有打进最终的 Artifact。IDEA 里虽然能看到依赖但运行 Tomcat 时实际加载的是 WEB-INF/lib 目录下的 jar两个位置不一致。解决打开 Project Structure → Artifacts → 选择项目对应的 Web Application 模块在 Output Layout 里找到 WEB-INF 下的 lib点击加号 → Copy of → 选中模块依赖或lib目录重新 Build → Rebuild重启 Tomcat。不要只调 Library 不调 Artifact这两个地方必须同时有。5.2 中文乱码页面、请求、响应三层字符集少配一层都不行现象商品名称显示成问号注册的用户名存进 MySQL 变成乱码AJAX 返回的中文在浏览器里是乱码。最迷惑的是有时候首页正常、查询结果乱码有时候只有新增的数据乱码。原因乱码是链路里某一层字符集不统一。JSP 页面声明了 UTF-8但 Servlet 读取请求参数时没有设置或者数据库表是 latin1但连接 URL 写了 utf8又或者 Tomcat 接收 POST 和 GET 的编码方式不同。解决三层都固定成 UTF-8。JSP 头部写% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %在 Filter 的doFilter最前面加request.setCharacterEncoding(UTF-8)和response.setContentType(text/html; charsetUTF-8)JDBC URL 里保持useUnicodetruecharacterEncodingutf8。数据库已经乱码的数据先查建表语句的DEFAULT CHARSET不是 utf8mb4 就重建表再导数据不要试图用replace函数修复那是给自己挖更大的坑。5.3 MySQL 8 连接失败caching_sha2_password 和驱动版本现象Tomcat 启动后第一次访问数据库报错Public Key Retrieval is not allowed随后是Unable to load authentication plugin caching_sha2_password。用 Navicat 连同一个库却完全正常。原因MySQL 8 默认认证插件是caching_sha2_password而源码里的 JDBC 驱动还是 5.1.x根本不认识这个认证方式。Navicat 因为自带新协议所以能连不代表你的 Java 驱动也支持。解决升级驱动到mysql-connector-java8.0.33或者把 URL 加上allowPublicKeyRetrievaltrueuseSSLfalse。如果不想动驱动就在 MySQL 里执行ALTER USER shoplocalhost IDENTIFIED WITH mysql_native_password BY shop123;把账号认证方式改回旧协议。两者选一个就行不要同时改否则排查时又多了个变量。5.4 商品列表排序不稳定MySQL 不会按你“以为的顺序”返回结果现象同一句SELECT * FROM goods;第一次执行和第二次执行结果顺序不一样有时候按 ID 排有时候看起来乱序。后台管理系统里“按销量排序”“按最新排序”单击几次后顺序开始漂移。原因没有ORDER BY的时候MySQL 不保证返回顺序。它可能走全表扫描、可能走索引优化器会按它认为成本最低的方式执行执行计划一变顺序就变。这不是玄学是 SQL 写得不够严谨。解决所有需要稳定顺序的查询都显式写ORDER BY。按价格排就写ORDER BY price ASC按时间排就写ORDER BY create_time DESC。如果数据量大记得在排序字段上建索引否则 MySQL 需要额外做 filesort。这里要区分“默认排序”和“索引顺序”的差异商品表只建了主键索引那么不加排序条件时按主键顺序返回只是巧合不能当成既定行为依赖。5.5 UPDATE 误操作把全表改了没有事务和 WHERE 的代价现象在客户端里执行了UPDATE goods SET price 99;忘了写 WHERE全站商品变成同一个价格。更惨的是执行完发现不能还原因为翻遍源码和日志都没有备份。原因MySQL 默认是自动提交模式一条 UPDATE 执行成功就立即提交。老项目又普遍没有备份习惯误操作后没有后悔药可吃。解决开发环境尽量别用自动提交命令行里先执行SET autocommit 0;每次更新前先SELECT确认影响范围再执行 UPDATE确认无误后手动COMMIT。误操作后如果还没退出当前会话可以尝试ROLLBACK回滚一旦提交了就只能靠备份恢复了。这个习惯必须养成比任何数据库调优技巧都重要。5.6 8080 端口被占用与 IDEA 热部署失败现象Tomcat 启动瞬间报Port 8080 was already in use或者启动成功但修改 JSP 后刷新页面不生效必须重启 Tomcat。原因上一个 Tomcat 实例没关干净或者系统里别的进程占用了 8080。热部署失败则是因为 IDEA 的 Tomcat 配置里 On Update Action 选了 Restart Server修改 JSP 和修改 Java 类都强制重启。解决命令行执行netstat -ano | findstr 8080找到占用端口的 PID然后用taskkill /PID 进程号 /F清理。热部署在 Run → Edit Configurations → Tomcat Server 里把 On Update Action 和 On Frame Deactivation 都改成 Update classes and resources这样 JSP 改动直接生效Java 类改动会尝试热替换如果热替换失败再手动重启。6. 跑通之后把源码商城项目从“能运行”提到“能交付”源码能跑起来只是起点真正值得做的是把项目改造成你能掌控的状态。我对这类源码型商城的习惯是不要急着加功能先做三件事成本低、收益大。第一件事全局搜索System.out.println按出镜率从高到低逐个换成日志。登录、下单、支付回调这类关键路径现在打印的内容几乎为零出了事只能靠肉眼盯控制台。用 SLF4J 加一行声明就能开工private static final Logger log LoggerFactory.getLogger(LoginServlet.class);然后把关键入参、执行结果、耗时三样打进去。源码和笔记里讲的“上线看日志排错”指的就是这个。没有日志的商城线上等于盲人摸象。第二件事把 MySQL 慢查询日志打开看看哪条 SQL 是拖后腿的。执行SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; SHOW VARIABLES LIKE slow_query_log%;long_query_time 1表示超过一秒的查询会被记录。对商城来说订单表、商品表的查询如果经常超过一秒一般是索引没建对。在命令行执行EXPLAIN SELECT * FROM orders WHERE user_id 1 ORDER BY create_time DESC;看type是不是ALL是的话就补索引。第三件事写一条 curl 冒烟脚本把登录到商品列表这一段固定下来每次改完代码先跑一遍curl -i -X POST http://127.0.0.1:8080/shop/login \ -d usernametestpassword123456 \ -H Content-Type: application/x-www-form-urlencoded响应里出现302和Set-Cookie就说明登录链路是通的能省掉一半手工点击。这三个动作做完这个商城项目才真正从“别人给的源码”变成“你能改、能查、能说明白”的交付物。我在这类项目上踩过的最深一个坑是拿到源码后先去改页面样式结果上线当天才发现连日志都没有那次之后我给自己定了条规矩先让系统可观测再谈功能优化。希望帮到你。本文还有配套的精品资源点击获取
返回列表