SpringBoot+Vue+Layui动漫商城管理系统全栈实战开发
发布时间:2026/9/24 22:21:10来源:尧图网络
1. 为什么我要从零手写这套动漫商城而不是直接套开源模板先说点大实话。接触过很多做Java课程设计或者毕业设计的朋友大家一开始的思路基本都是去GitHub、码云上找个现成的商城项目clone下来改改logo交差。但真正打开那些所谓的开源商城你会发现要么是代码停留在SSH时代要么前后端耦合严重压根跑不起来要么就是故意缺个关键模块让你加群付费。这套动漫商城管理系统最初就是在这种反复踩坑之后决定从零手写一版真正能跑、能改、能答辩的全栈项目。整个项目定位非常明确SpringBoot后端 Vue前端 Layui管理后台 MySQL数据库。商城用户端用Vue实现SPA单页应用提供动漫周边的浏览、搜索、购物车、下单、支付模拟、个人中心等功能管理后台用Layui实现给管理员提供商品管理、订单处理、用户管理、数据统计等能力。前后端通过RESTful API通信代码结构清晰注释完整SQL脚本自带测试数据拿到手之后只需要改一个数据库连接配置就能直接启动。这套方案在实际开发中解决了一个很典型的矛盾Vue写用户端体验好、交互流畅但对于不擅长JavaScript的管理后台来说Layui这种面向jQuery的轻量框架反而更高效。很多人在简历上写熟悉Vue但真正让他一个星期内独立写出一个带表格、表单、弹窗、文件上传的管理界面大概率会卡在组件的海洋里。而Layui的模块化设计几乎就是为后端开发人员量身定制的。这也是我为什么坚持Vue做前台、Layui做后台的架构——分工明确、开发效率高、答辩时也更好讲清楚每一个页面的技术选型理由。这篇文章我会把整个项目的设计思路、数据库表结构、后端接口设计、前后端关键代码、环境配置全过程以及我实际运行中踩过的坑完整地拆开讲给你听。2. 技术栈分工Layui管后台Vue管商城SpringBoot做桥梁2.1 双端架构是怎么确定的先聊技术选型。这套系统的核心诉求是动漫商城 后台管理天然分成两个端。用户端要的是购物体验——商品列表加载流畅、详情页交互丰富、购物车角标实时更新这正好是Vue的强项。Vue的双向数据绑定和组件化开发让我在维护商品筛选、分页、购物车状态这些复杂交互时不需要手动操作DOM省掉了大量jQuery时代让人头疼的代码。管理端就不一样了。管理员的操作场景是产品上下架、订单审核、用户禁用核心是表格 表单 弹窗这些功能Layui封装得非常完善。layui.table支持数据表格的异步加载、排序、分页、行内编辑layui.form提供了丰富的表单控件和自定义验证layui.layer解决弹窗问题只需要一行代码。而且Layui是基于jQuery的后端开发人员不需要重新啃一遍Vue的响应式原理就能快速上手。选择双端架构还有一个很实际的理由拆分以后前后端接口可以完全解耦。用户端和管理端各用各的域名访问路径后端只提供JSON数据。这样不管以后是想把用户端换成小程序还是把管理端换成React都不用动服务端逻辑。2.2 SpringBoot在后端扮演的角色SpringBoot在整个项目中是标准的胶水层。它负责接收前端请求、处理业务逻辑、读写MySQL数据库再以JSON格式返回结果。我用的是SpringBoot 2.x版本集成了以下核心组件组件作用Spring Web MVC处理RESTful请求路由MyBatis-Plus数据库ORM层简化CRUDMySQL ConnectorJDBC驱动JWTjjwt用户登录状态无状态校验Lombok简化实体类冗余代码Hutool文件上传、验证码等工具类SpringBoot最让我省心的地方是自动配置。以前用SSH写项目光配置Spring和Hibernate的XML就要写几百行SpringBoot把这些约定成了默认值。比如数据源配置只需要在application.yml里填上URL、用户名、密码它就能自动创建DataSource和SqlSessionFactory。这样我可以把更多精力放在业务本身。2.3 三个端之间是如何通信的这个项目的通信模型很标准前端通过AJAX/Fetch发送HTTP请求后端统一处理并返回Result对象前端再根据返回数据渲染页面。但有两个细节值得注意第一用户端和管理端用的接口前缀不同。用户端走/api开头管理端走/admin开头这样在拦截器层面就能做权限区分。第二登录校验用的是JWT令牌。用户在商城登录成功后会拿到一个加密的token之后每次请求都在请求头带Authorization: Bearer token后端拦截器验签通过才放行。管理端登录则额外维护一个Session方便Layui后台页面做自动登录状态检查。实际开发中我建议你把接口文档先定下来再写代码哪怕只是简单的表格。前后端并行开发时接口字段一旦对不上联调阶段会非常痛苦。这个项目里的所有接口都遵循统一的返回格式{ code: 200, message: 成功, data: {...} }前端判断code是否为200再决定渲染逻辑。3. MySQL十二张表是怎么一次设计到位的3.1 从业务反推表结构数据库设计是整套系统的地基。我见过太多课程设计项目表建得乱七八糟外键乱飞最后直接导致订单查不出来、商品删不掉。这套动漫商城在设计数据库时遵循了一个原则从业务场景反推表结构。商城核心业务链路是用户浏览商品 → 加入购物车 → 提交订单 → 模拟支付 → 管理员发货。围绕这条链路我拆出了用户表、商品表、分类表、购物车表、订单表、订单明细表、收货地址表。再加上商城运营需要的轮播图表、公告表、商品评论表以及管理端的管理员表和操作日志表一共十二张核心表。3.2 核心表的设计细节与字段含义用户表member用户表是商城端所有业务的起点。这里存了用户的登录账号、密码、昵称、头像、手机号、邮箱、状态和注册时间。两个细节值得提密码字段我用的MD5加盐存储盐值就是用户ID防止数据库泄露后密码被反查状态字段用tinyint类型1表示正常0表示禁用管理员可以随时封禁刷单账号。商品表goods商品表是整个系统中字段最多的表包含了商品名称、所属分类、价格、原价、库存、销量、主图、轮播图、商品详情、上下架状态、创建时间等。价格字段在Java中对应BigDecimal在数据库中对应decimal(10,2)这是一个很多新手会忽略的地方——如果用double存价格浮点数精度问题会导致计算结果出现莫名其妙的小数位。商品详情字段我用的是text类型存储富文本内容。订单设计的一点心得订单相关的设计是很多课程设计的重灾区。很多人会把订单和商品直接耦合在一张表里买三件商品就生成三条订单这完全错了。我的做法是拆成主表和明细表订单表orders只存订单编号、用户ID、总金额、订单状态、收货信息、下单时间订单明细表order_item存每一件商品的快照信息包括商品ID、当时的价格、数量。为什么要存商品快照而不是直接关联商品表因为商品是可以改价、下架、删除的如果订单只是引用商品表查历史订单时价格就会变掉。这是一个非常经典的电商设计思想答辩时讲出来会是一个加分项。订单状态我用整数存0待支付、1已支付待发货、2已发货、3已完成、4已取消。用整数而不是字符串的原因是排序方便、判断方便而且状态流转只有固定的几个方向业务逻辑层可以做严格的校验。3.3 SQL脚本中预置了哪些数据项目的SQL脚本位于sql/anime_mall.sql导入后自动创建数据库、数据表并插入基础数据。预置数据包括一个管理员账号默认用户名admin密码123456、一个测试用户账号、8个动漫分类手办、模型、挂画、毛绒玩具、文具用品、服饰、cosplay道具、轻小说、每个分类下若干商品以及一张商城首页轮播图的假数据。为什么我花时间造这些假数据因为一个没有数据的商城页面看起来就像没写完一样尤其是答辩/演示场景下打开首页一片空白第一印象就崩了。预置数据是为了让你能直接从演示效果开始而不是先四处找商品图片。商品图片链接我放的都是一些占位图片服务如果你在本地跑没有外网可以把图片换成images/目录下本地的占位图。3.4 数据库交互层的实现方式数据库访问层用的是MyBatis-Plus框架。它最实用的功能是内置了通用Mapper——只要继承BaseMapperT接口简单的增删改查方法全都自带不需要写一行SQL。我在需要联表查询的地方比如订单列表需要关联用户表查出用户昵称、关联明细表查出商品名称才手写XML SQL。MyBatis-Plus的分页插件集成非常简单只要配置一个MybatisPlusInterceptor类注册分页插件即可。分页查询的时候传入current页码和size每页条数框架自动帮你在SQL后面拼上LIMIT语句同时返回总记录数。这比原生MyBatis的手动分页高效太多而且查询结果封装成Page对象后直接就可以转化成统一返回格式。4. 后端接口的权限控制与业务闭环SpringBoot核心代码4.1 统一返回结果与全局异常——前端联调的定心丸后端接口设计上第一件事就是定义统一返回结果类ResultT。它的结构简单code状态码、message提示信息、data数据载体。成功时code200业务异常时code500未登录时code401。这样前端只需要判断一次返回结构不需要针对每个接口写不同的解析逻辑。第二个重要组件是全局异常处理器RestControllerAdvice。为什么要做全局异常因为如果不做统一拦截代码里一个NullPointerException就会导致接口返回一个Tomcat默认的错误页面前端拿到的不是JSON解析直接就崩了。用全局异常处理器兜底之后所有未捕获异常都会转化为{ code: 500, message: 系统异常 }返回给前端同时把完整堆栈打印到后端日志里方便排查。我建议你给前端返回的message不要直接抛异常原文一是错误堆栈信息太专业二是可能泄露代码路径。4.2 JWT用户鉴权——无状态登录怎么做用户端使用的是JWT无状态登录方案。登录流程是这样的用户提交账号密码 → Controller层调用Service校验 → 校验通过后生成一个包含用户ID和过期时间的token串返回给前端 → 前端把token存到localStorage → 每次请求在请求头带上token → 后端拦截器解析token并放行。关键代码逻辑如下// JwtUtil.java 核心方法 public static String generateToken(Integer userId, String username) { Calendar calendar Calendar.getInstance(); calendar.add(Calendar.DATE, 7); // 有效期7天 return Jwts.builder() .setId(String.valueOf(userId)) .setSubject(username) .setExpiration(calendar.getTime()) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }管理端我没有使用JWT而是用Session。原因是管理后台是传统的多页面应用Layui每个页面都需要校验登录状态用Session天然支持。管理员登录一次Session里存入管理员对象后续页面通过拦截器检查Session是否为空来判定是否在线。两种认证方式并存其实也体现了技术选型中合适比新潮更重要的道理。4.3 购物车到订单的完整业务闭环购物车和下单是整个后端最核心的业务逻辑我把它完整跑通的流程写成这样的步骤加入购物车前端传入goodsId和quantity后端先查询商品库存如果库存充足判断购物车表中是否已有该商品——有则累加数量无则新增记录。提交订单前端传入购物车条目ID列表和收货地址ID后端开启事务批量生成订单和订单明细扣减商品库存清空购物车。模拟支付这个项目不做真实支付对接用一个模拟支付接口直接修改订单状态从待支付变为已支付待发货同时累加商品销量。订单查询用户端根据memberId查询订单列表并关联出明细管理端根据订单号、用户名、状态等条件筛选。事务是这里最容易出数据一致性问题的点。下单过程涉及多张表的写操作——写订单表、写明细表、扣库存、清购物车——任何一个环节失败都会导致脏数据。我在OrderServiceImpl的提交订单方法上加了Transactional(rollbackFor Exception.class)注解只要方法内抛出任何异常事务自动回滚Mate全部恢复原状。rollbackFor的值必须设为Exception.class因为Spring默认只在遇到RuntimeException时才回滚遇到检查型异常不会回滚。这是一个很容易被忽略的坑。4.4 文件上传商品图片是怎么处理的商品管理必然涉及图片上传。Layui的upload模块和Vue封装的上传组件都可以直接对接后端的/admin/goods/upload接口。后端接收MultipartFile文件先校验文件类型和后缀只允许jpg、png、gif、webp然后按日期分目录存储文件名用UUID重新生成防止重名覆盖。# application.yml 文件上传相关配置 file: upload-path: /usr/local/upload/ access-path: /upload/**这里有个关键点图片上传到本地磁盘后前端访问图片需要一个URL映射。SpringBoot默认的静态资源路径不包括外部磁盘目录需要配置一个资源映射器Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocator(file: fileUploadPath); } }这样上传的图片就能通过http://localhost:8080/upload/xxx.jpg访问到了。如果你直接把图片存在resources/static下每次重启都会清空非常不适合实战项目。5. 前端两层皮Vue商城的组件化实现与Layui后台的表格化开发5.1 Vue商城端的页面路由与状态管理前端商城部分我用的Vue 2 Vue Router Vuex Axios的组合。Vue 2在这个场景下足够了生态成熟、教程多遇到问题随处可以搜到答案。项目启动后在localhost:8080上运行通过Vue Router管理页面跳转。首页路由是/home展示轮播图、推荐商品、分类入口。商品列表页是/shop支持按分类筛选、关键词搜索、价格排序和分页。商品详情页是/goods/:id展示大图轮播、价格库存、商品参数以及加入购物车和立即购买按钮。购物车页面挂在/cart支持修改数量、取消选择、计算总价。结算页/checkout需要用户登录选好收货地址后点击提交订单。用户相关页面包括登录注册、个人中心、订单列表、评价页面。商城端的核心状态是购物车数据通过Vuex统一管理。每次加入购物车、更新数量、清空购物车都会触发commit同步到state页面组件通过mapState或者mapGetters读取状态。这样带来的好处是跨组件通信非常干净——不需要通过事件总线层层传参而且刷新页面时再从localStorage恢复购物车状态用户不会因为手滑刷新丢失数据。Vue端的接口请求统一封装在src/utils/request.js里。这个文件里用Axios创建了一个实例设置了基础URL开发环境通过vue.config.js配置代理到http://localhost:8080然后在请求拦截器里给每个请求头加上本地的token。响应拦截器里统一处理code不为200的情况比如token过期就跳转到登录页。5.2 Vue组件化实践商品卡片是怎么复用的Vue的组件化开发是这套前端代码里最有说服力的部分。我把商品卡片封装成一个名为GoodsCard的组件用在首页推荐商品、列表页、搜索结果页三个地方一套代码多处复用。!-- GoodsCard.vue 简化的商品卡片组件 -- template div classgoods-card clickgoDetail el-image :srcgoods.cover fitcover lazy / div classgoods-name{{ goods.name }}/div div classgoods-price{{ goods.price }}/div el-button typedanger sizemini click.stopaddCart加入购物车/el-button /div /template封装的技巧在于组件只通过props接收商品对象来决定展示什么通过emit把加入购物车等操作抛给父组件去处理。这样父组件可以是首页只展示推荐商品、列表页展示分类商品或者搜索页展示搜索结果组件本身完全无业务逻辑只负责展示和交互事件的上抛。这种容器组件和展示组件分离的做法是Vue工程化的基石。5.3 Layui后台的模块化用法管理后台采用Layui 2.x实现页面结构是一个典型的后台布局顶部导航、左侧菜单、右侧内容区。Layui的laytpl模板引擎配合table模块可以快速渲染数据列表。以商品管理页面为例核心代码思路是table.render({ elem: #goodsTable, url: /admin/goods/list, method: post, page: true, cols: [[ { field: id, title: ID, width: 60 }, { field: name, title: 商品名称 }, { field: price, title: 价格, width: 80 }, { field: stock, title: 库存, width: 80 }, { field: status, title: 状态, width: 80, templet: #statusTpl }, { title: 操作, width: 150, toolbar: #barDemo } ]] });表格数据源对接后端分页接口Layui的table模块会自动发送page和limit参数后端返回的记录列表和总数它也能自动识别渲染。需要说明的是Layui table默认的数据格式是{ code: 0, msg: , count: 100, data: [...] }这里的code必须是0才表示成功。但后端统一返回的code是200所以我在后端的分页返回结果里做了适配——分页接口返回PageResult对象其中code字段设置为0。这是Layui与后台接口联调时最典型的坑稍后我会再强调。Layui的form模块负责管理端所有表单校验。新增编辑商品使用弹窗弹窗里是表单HTML通过form.on(submit(saveGoods))监听提交事件然后使用$.ajax把数据POST到后端。因为Layui后端管理页面涉及大量弹出层我建议你善用layer.open的content内联HTML方式而不是每个表单都做独立页面这样操作路径短维护起来也更集中。5.4 ECharts数据统计面板是怎么接的管理后台的首页我做了一个数据概览面板统计今日订单数、总用户数、商品总数、待发货订单数同时用ECharts柱状图展示近7天销售额趋势、饼图展示商品分类占比。ECharts是通过npm安装后在Layui后台的独立页面中引入的后端提供两个聚合查询接口/admin/dashboard/sales返回近7天的每日销售额/admin/dashboard/category返回分类销售占比。这两个接口是MySQL聚合查询的典型用法。销售额统计用的是SUM和GROUP BY DATE_FORMAT(create_time,%Y-%m-%d)分类占比用的了JOIN商品分类表和订单明细表后按分类分组求和。这里要注意一个细节订单表中金额字段是decimal类型聚合后返回给前端的数值在Jackson序列化时可能会变成科学计数法的double需要在字段类型上用BigDecimal接收或者给后端实体类的getter加上JsonSerialize(using ToStringSerializer.class)注解确保数字以字符串形式返回避免精度丢失。6. 拿到源码之后怎么快速跑起来亲测无误的启动手册6.1 本地环境准备清单在运行这个项目之前先检查电脑里装齐了以下环境软件版本要求用途JDK1.8或以上运行SpringBootMaven3.6后端依赖管理MySQL5.7或8.0数据库Node.js12Vue前端构建IDEA / VS Code最新版开发工具这里特别提醒MySQL 8.0用户MySQL 8的驱动路径是com.mysql.cj.jdbc.Driver而5.7是com.mysql.jdbc.Driver。我项目里用的是8.0驱动如果你本地是8.0连接串里的serverTimezoneAsia/Shanghai必须保留否则启动时区会报错。如果你习惯用5.7记得替换pom.xml里的MySQL依赖版本和驱动配置。6.2 后端启动三步走第一步创建数据库并导入脚本。打开MySQL命令窗口执行source命令mysql -u root -p source /你的绝对路径/sql/anime_mall.sql;导入成功后可以用SHOW TABLES;验证一下如果看到12张表说明导入了。第二步修改数据库连接配置。打开src/main/resources/application.yml把spring.datasource.url、username、password改成你自己本地的数据库账号密码。第三步启动后端。推荐用IDEA直接打开项目等待Maven下载依赖首次可能5-10分钟然后运行AnimeMallApplication.java的main方法。控制台出现Tomcat started on port(s): 8080就说明后端启动成功。后端启动后可以用浏览器直接访问http://localhost:8080/admin/login.html如果能看到管理员登录页面说明后端、数据库、模板引擎都正常。6.3 前端启动两步走打开Vue商城端项目文件先用命令行安装依赖npm install这一步国内网络环境下建议先配置npm淘宝镜像再执行否则可能卡在某个包的下载上。安装时间取决于网络速度一般3-10分钟。安装完成后启动开发服务器npm run serve看到App running at Local: http://localhost:8081表示启动成功。浏览器打开这个地址就能看到商城首页。为什么是8081而不是8080因为我提前在vue.config.js里配置了代理把前端的请求转发到后端的8080端口规避了跨域问题。实际生产环境部署时一般会用Nginx做反向代理把静态资源和API路径统一代理出去但现在开发阶段Vue CLI自带的代理最省事。6.4 默认账号和演示路径商城用户端注册一个账号即可登录或者用预置测试账号test/123456管理后台浏览器访问http://localhost:8080/admin/login.html账号admin/123456演示时我建议的路径是先展示商城首页 → 点进一个商品详情 → 加入购物车 → 去结算提交订单 → 切到后台把订单发货 → 回到前台在个人中心看到订单状态变化。这样一整个闭环走下来就是最完整的演示流程。7. 实际跑完这个项目我踩过的那些坑附排查思路7.1 Layui表格数据格式不兼容这是接入Layui后台时第一个炸掉的坑。我后端统一返回code200表示成功但Layui table默认只认code0。我一开始没有适配前端表格既不渲染数据也不报错只在控制台看到一条红色的Table error。排查了很久才发现是状态码约定不同。解决方案后端的PageResult类专门设置code0并结合Layui的parseData方法在表格渲染时重新定义数据结构解析规则。如果你的后端已经封装了统一返回结构你也可以在table.render里配置parseData: function(res) { return { code: res.code 200 ? 0 : 1, msg: res.message, count: res.data.total, data: res.data.records } }这样最简单不需要动后端代码。7.2 Vue开发环境的跨域问题Vue运行在8081端口后端在8080端口浏览器默认禁止跨域AJAX请求。如果直接请求http://localhost:8080/api/goods/list控制台会报Access-Control-Allow-Origin相关错误。解决方式我在vue.config.js里配置了proxy代理devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这样前端请求/api/goods/list时Vue CLI开发服务器会将它转发到后端的http://localhost:8080/api/goods/list浏览器端完全没有跨域概念。这里要重点强调changeOrigin一定要设置为true否则代理的请求头里Host字段还是前端域名后端如果配置了域名白名单校验就会被拒绝。7.3 MySQL 8.0时区问题导致连接失败我第一次用MySQL 8跑这个项目时启动直接报错The server time zone value Öйú±ê׼ʱ¼ä is unrecognized。这是因为MySQL 8的时区配置和JDBC驱动的时区校验不兼容。解决办法很简单在数据库连接URL后面加上?serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf-8。这也是我在application.yml里预设的配置如果你复制项目连接串不小心删掉了serverTimezone很容易踩这个坑。另外连接MySQL 8.0时pom.xml里的驱动依赖也应该用com.mysql:mysql-connector-j这个新坐标老坐标mysql:mysql-connector-java在更高版本中已经停止维护。如果你多项目切换注意看清版本对应关系。7.4 商品图片上传后访问404文件上传成功后前端页面上图片始终404。这个问题出在静态资源映射上——SpringBoot默认只映射classpath:/static/目录外部磁盘路径不在默认静态资源范围内。前文我已经写了WebMvcConfig配置类来解决。如果你自定义了WebMvcConfigurationSupport资源映射器方法可能会失效因为继承这个类会导致SpringBoot的自动配置被覆盖。我最后是单独封装了WebMvcConfigurer实现类并保证不添加EnableWebMvc注解问题才彻底解决。7.5 订单超时未支付的状态处理订单支付的模拟很简单但订单超时未支付怎么处理很多课程设计都没考虑这一步。实际电商平台都会设定15-30分钟的支付超时时间超时后自动取消订单、释放库存。我在这套系统里用的是定时任务方案Scheduled(cron 0 */5 * * * *)每5分钟扫描一次查询订单创建时间超过30分钟且状态为待支付的订单批量改成已取消状态同时恢复库存。这个定时任务逻辑虽然简单但如果你不自己加演示时可能存在历史脏订单管理端的待支付订单列表会越积越多。这个功能顺带也体现了SpringBoot对企业级开发的支持一个注解就能启动定时任务一行配置就能开启异步调用。答辩时完全可以把这一点作为我的项目考虑了真实业务场景的证明。8. 如何把这份源码变成你自己的项目拿到源码不是终点能把它改造成自己的项目、应付课程答辩或者毕业设计才是更重要的能力。这套源码改造成本很低因为它结构和命名都还算规范替换一下前后端的Logo、标题和分类数据再调整主题色它就能化身成潮玩商城、手办商城、汉服商城甚至宠物用品商城。具体来说改造时优先改这几个位置前端Vue项目里的public/index.html标题、首页轮播图、src/config下的商城名称配置后端application.yml里的应用名和端口数据库里category表的数据——把动漫周边相关的分类改成你想要的分类即可。如果项目名要改IDEA里全局替换项目名和包名是常规操作用CtrlShiftR全局搜索替换即可。如果你拿这套源码做毕业设计我还建议你在文档里补充三部分内容一是系统的需求分析包括可行性分析和用例图二是数据库设计的ER图三是系统测试章节至少包含功能测试用例表和结论。技术亮点方面可以重点描述JWT无状态认证、订单事务一致性、定时任务处理超时订单、双前端架构的选型理由这四点这些是答辩评委普遍关注的维度。另外跑项目之前先看一遍README.md里面我已经写了项目结构说明、启动步骤和默认账号。看一遍再动手能避免很多低级错误——比如有人用Eclipse打开Maven项目不知道要导入为Maven工程有人mysql密码输错导致反复连接失败这些都能靠仔细阅读文档避免。最后我想说做项目最忌讳的是复制粘贴但不知道在干嘛。这套系统里每个模块、每个文件、每个配置项你都要能说上来是干什么的哪怕只弄懂其中80%对自己能力的提升也是实打实的——毕竟写简历的时候每一项技能都得经得起深挖。
网站建设高端定制企业官网