SpringBoot+Vue智能家居销量数据分析:Java毕设前后端分离完整实战
发布时间:2026/10/2 9:01:12来源:尧图网络
做Java Web方向的毕业设计最怕的就是题目看着挺大真正动手却不知道从哪一步开始。今天要聊的这套“SpringBootVue 智能家居销量数据分析”就是目前很典型的前后端分离毕设案例后端用SpringBoot提供接口前端用Vue搭建页面配合SQL脚本初始化数据库、接口文档约定前后端联调把智能家居产品的销量分析做成一个能直接演示的系统。这套资源在jrabo平台被整理成“完整源码SQL脚本接口文档”的格式恰好覆盖了从数据库到后端再到前端展示的完整链路。对正在找毕设题目的同学来说它的价值很明确题目不偏门技术栈常用数据可视化效果好答辩时拿得出手。本文我会从需求拆解、数据库设计、接口实现、前端图表、部署排查一条线把这个项目彻底讲透。1. 项目整体设计与技术选型思路1.1 从标题到需求的拆解过程拿到这个题目先别急着写代码把标题拆成几个关键词来理解智能家居、销量数据、分析、毕设。“智能家居”定义业务范围对应商品表里存的是智能音箱、智能门锁、智能摄像头、各类传感器、智能插座这类产品而不是普通日用品。“销量数据”定义了系统的核心数据对象是订单和订单明细所有功能都要围绕卖了多少、卖了多少钱、什么最好卖来展开。“分析”两个字决定了系统不是简单做增删改查而是要有统计报表、趋势曲线、排行占比。“毕设”则意味着我们要兼顾工程完整度、代码规范性和答辩可演示性单说技术多深其实不重要重要的是每个环节都要能讲清楚。把这几层需求展开以后系统功能自然就清晰了商品管理模块、订单管理模块、统计分析模块、登录权限模块。其中统计分析模块是核心亮点要支持按时间维度看销售趋势、按品类看销量占比、按商品看Top10排行、按地区看销量分布。这套项目在jrabo平台上通常打包为一个完整的资源集后端SpringBoot源码、前端Vue源码、数据库SQL脚本、接口文档说明。站在学习者的角度看源码只是第一步更重要的是理解它为什么这么设计。下面我把每个环节的设计思路和实操要点展开讲。1.2 为什么是SpringBootVue而不是老牌SSH组合直接说结论SpringBootVue是目前Java Web毕设里性价比最高的一套组合既不会过于复杂到无法收尾又符合企业对主流技术栈的预期。早几年常见的SSHStruts2SpringHibernate或者SSMSpringSpringMVCMyBatis当然也能做这类系统但问题在于SSM的配置太繁琐光是XML配置和web.xml就够新手折腾几天界面层用JSP的话页面和后端逻辑耦合在一起调试体验差改一个页面跳转经常要重启整个Tomcat。SpringBoot通过自动配置和内置Tomcat把“启动一个Web应用”这件事简化成了运行一个main方法这对毕设来说非常友好。Vue则解决了前端展示的问题。智能家居销量分析这种系统天生需要图表用传统JSP配合后端模板渲染要么引入乱七八糟的静态资源要么用服务端拼接JSON再交给我们自己处理写起来很别扭。Vue的核心优势是组件化开发和数据驱动视图一个销售趋势页面就是一个.vue组件里面放一个图表容器数据由axios异步请求拿到再交给图表渲染开发体验明显更顺畅。另外考虑到毕设评分SpringBootVue这个组合在答辩时也有话题可聊。老师通常会问“为什么用前后端分离”“Vue路由怎么传参”“跨域怎么处理”这些都是有明确答案的常规问题总比被追问“你怎么解决JSP里散乱脚本的维护问题”要好处理得多。面试方面SpringBoot、Vue的考点也远比SSH多。1.3 前后端分离的优势以及毕设场景下的取舍前后端分离的核心是前端只负责渲染页面和交互后端只负责提供JSON数据接口。两边通过HTTP接口通信。智能家居销量分析系统的界面通常包含布局导航、登录页、图表页、报表页如果全塞进后端模板里项目结构会非常臃肿前端和后端同学也不好并行开发。分离架构下页面可以独立部署甚至用Vue CLI脚手架热更新开发改代码立刻能看到效果。后端也可以独立测试不用关心页面长什么样只要接口返回的JSON符合约定就行。但毕设场景下要有个取舍不要为了“分离”而分离。有些同学把系统拆成微服务甚至加上消息队列反而给自己挖坑。这套项目保持单体后端加Vue前端即可数据量不大、业务逻辑也不复杂单体能解决的事情就不要引入过多中间件让流量问题留到生产环境再说。我的建议是把时间花在数据统计的准确性、图表展示的完整性和代码规范上这些才是能看出技术功力的地方。2. 数据库设计与SQL脚本的关键要点2.1 表结构设计从订单数据反推业务模型智能家居销量数据分析系统数据基础在订单表。设计数据库的时候我习惯先想清楚“要分析什么”再倒推需要哪些表。本系统的分析维度包括时间趋势、商品销量、品类占比、区域分布。那么核心表至少要这几张表名用途关键字段users登录用户user_id、username、passwordcategory商品分类category_id、category_nameproducts智能家居商品goods_id、goods_name、category_id、price、brandorders订单主表order_id、order_no、user_id、order_time、region、total_amount、statusorder_items订单明细item_id、order_id、goods_id、quantity、priceorders和order_items是核心建议在order_no上加唯一索引在order_time上建普通索引因为销量趋势分析一定会有按时间范围过滤的查询。order_items里的quantity用于统计销量price是下单时候的商品单价不能直接取products表的当前价格否则历史订单统计出来会不准。这里有一个细节很多人容易忽略统计销售额时要基于orders表的total_amount还是基于order_items的quantity*price去累加两种方式理论上应该一致但如果订单有优惠、满减或退款主表和明细表就会对不上。对于毕设项目SQL脚本里生成的模拟数据不会搞这么复杂但设计表结构时最好保留status字段后续如果要扩展可以处理退款和取消订单体现你的设计前瞻性。2.2 模拟数据怎么造才显得真实可信销量分析的展示效果完全取决于数据质量。如果SQL脚本里只有几百条订单图表画出来就是一条条锯齿一样的短线几乎看不出趋势答辩效果会差很多。所以初始化脚本里模拟数据的规模要合适我的经验是生成两年24个月的订单数据每月订单量从3000到8000不等整体呈现缓慢上升趋势同时在6月、11月设置明显的大促峰值。具体做法可以在SQL脚本里用存储过程循环生成也可以先用后端程序批量插入。比如商品表放20个智能家居商品覆盖智能音箱、智能门锁、摄像头、烟雾报警器、智能插座等常见品类价格分布在99元到2999元之间。订单生成时让每个月的订单量按规律变化1月到5月平稳增长6月因618大促冲高7月回落后再缓慢爬升双十一所在月份达到全年最高。区域字段可以设置华东、华南、华北、华中等几个值让不同区域销量有明显差异比如华东地区智能家居渗透率高销量占比自然偏大。模拟数据具备这种结构性特征生成的图表才会有“分析”的感觉而不是随机噪声。我当时是写了一个Java工具类一次性生成SQL文件再导入数据库因为纯SQL写循环容易出错控制变量也麻烦。2.3 SQL脚本的格式、字符集和导入注意事项SQL脚本是项目的起点前人栽树后人乘凉脚本写规范了后面能省很多事。导入的时候第一件事就是检查字符集。项目里一定要用utf8mb4避免商品名称里有特殊符号时出现乱码。连接MySQL时URL也要加上characterEncodingutf8否则中文数据显示出来可能是问号。脚本建议按顺序执行先创建数据库再建表最后插入模拟数据。创建表时要加上IF NOT EXISTS模拟数据脚本加上事务保护万一中间报错可以整体回滚。外键约束要加但也不要滥用order_items、orders、products之间加外键没问题因为数据是程序控制写入的不会出现删除主表数据时明细没处理的情况。下面是一个核心的orders表DDL示例CREATE TABLE orders ( order_id bigint NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单编号, user_id int NOT NULL COMMENT 下单用户ID, order_time datetime NOT NULL COMMENT 下单时间, region varchar(20) DEFAULT NULL COMMENT 收货区域, total_amount decimal(10,2) NOT NULL COMMENT 订单总金额, status tinyint DEFAULT 0 COMMENT 订单状态 0正常 1取消 2退款, PRIMARY KEY (order_id), UNIQUE KEY uk_order_no (order_no), KEY idx_order_time (order_time) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT订单主表;订单明细表则要记录sku维度数据CREATE TABLE order_items ( item_id bigint NOT NULL AUTO_INCREMENT, order_id bigint NOT NULL COMMENT 订单ID, goods_id int NOT NULL COMMENT 商品ID, quantity int NOT NULL COMMENT 购买数量, price decimal(10,2) NOT NULL COMMENT 成交单价, PRIMARY KEY (item_id), KEY idx_goods_id (goods_id), KEY idx_order_id (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单明细表;建表时COMMENT字段一定写清楚等到写接口文档或者做答辩PPT时直接照着表结构就能说明业务含义不用再翻代码。3. 后端SpringBoot接口设计与接口文档编写3.1 模块划分与RESTful接口清单后端工程我一般按controller、service、mapper、entity、common五层组织。controller负责接收请求和参数校验service写业务和统计逻辑mapper连接MySQLcommon放统一返回结果类和异常处理器。智能家居销量分析系统的核心接口设计如下接口方法路径说明用户登录POST/api/user/login校验账号密码返回token商品列表GET/api/product/list分页查询商品销量趋势GET/api/statistics/sales/trend按时间范围返回销量和销售额品类占比GET/api/statistics/sales/category按品类聚合销量占比商品排行GET/api/statistics/sales/ranking返回销量Top10商品区域分布GET/api/statistics/sales/region按区域聚合订单量核心指标GET/api/statistics/sales/overview返回总销售额、总销量、客单价接口路径用名词复数形式HTTP方法表达动作参数一律通过查询字符串传递并通过DTO接收不要把原生HttpServletRequest裸露到service层。登录这里有个常见做法JWT生成token前端把token存到localStorage每次请求在Authorization头携带。毕设阶段这样做完全够用也没必要上Spring Security那么重的安全框架写一个拦截器校验token即可。但要注意如果演示时刷新页面token过期用户会被踢回登录页需要提前设置稍微长一点的过期时间比如24小时免得演示现场出糗。3.2 销量统计接口不是简单的SELECT COUNT销量趋势接口是最能体现数据分析功力的地方。前端传startDate和endDate后端要返回一段日期序列对应的销售额和销量比如按“天”粒度返回30天的记录按“月”粒度返回12个月的记录。接口返回的数据结构可以设计成{ code: 200, message: success, data: [ { date: 2024-01-01, salesAmount: 152300.00, salesCount: 320 }, { date: 2024-01-02, salesAmount: 158000.00, salesCount: 335 } ] }SQL部分不能用简单的SELECT date(order_time), SUM(total_amount) FROM orders GROUP BY date(order_time)因为如果某天没有订单这个天就不会出现在结果集里图表上就会出现断点。毕设级别的处理方案有两种一是让SQL按天补零思路是构造一个日期维表再左连接二是在Java层处理查出聚合结果后用Map存放再遍历日期序列把缺失的日期填成0。我推荐第二种因为更直观也不依赖额外的维表。具体实现思路是把查询结果集转换成MapLocalDate, SalesVO然后从startDate循环到endDate每次都从Map里取值取不到就返回一个date对应0金额0销量的VO对象。这样前端拿到的数据天然就是连续的ECharts画出来也好看。商品排行接口相对简单直接对order_items按goods_id分组求和SELECT goods_id, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_amount FROM order_items GROUP BY goods_id ORDER BY total_quantity DESC LIMIT 10;这里需要注意如果一个订单同时买了三个同款智能插座order_items里可以拆成三行也可以在quantity字段直接填3。两种方式统计结果一致但从宽度管理角度尽量让一行记录代表一个订单中的一个商品quantity通常为1如果为N就要警惕订单重复统计了。3.3 接口文档该怎么写才能让前后端不打架接口文档在这套资源里是标配但很多同学平时写代码根本没写过文档等到和前端联调才明白这件事有多重要。我在jrabo平台上看到这类完整项目时最看重的是接口文档这部分的完整度。写接口文档不需要盯着规范的复杂格式核心要写清楚五件事路径、方法、请求参数、返回示例、错误码。我自己习惯在项目根目录放一个README.md按模块把接口列出来一个接口一个表格再加上统一返回Result类的JSON示例。统一返回格式这步别偷懒。最好写一个Result 泛型类包含code、message、data三个字段。状态码可以自定义200成功401未登录500服务器异常。尤其是前端axios拦截器会依赖这个结构做统一错误提示结构越统一前端越好写。如果项目时间允许可以集成Swagger自动生成在线接口文档。毕设级别我个人不强制因为集成Swagger要处理注解和依赖版本兼容有时候配错了反而浪费时间。手动维护一份Markdown接口文档既能锻炼表达能力又能在答辩时拿得出手演示的时候照着文档讲接口设计思路老师会觉得你是真理解项目的。4. 前端Vue实现与数据可视化图表展示4.1 页面路由设计从登录页到分析看板前端工程用Vue CLI或Vite脚手架创建项目结构按views、components、router、api、utils拆包。智能家居销量分析系统的页面不多核心路由可以这样设计const routes [ { path: /login, component: Login }, { path: /, component: Layout, redirect: /dashboard, children: [ { path: dashboard, component: Dashboard }, { path: trend, component: SalesTrend }, { path: ranking, component: SalesRanking }, { path: category, component: CategoryAnalysis }, { path: product, component: ProductList } ] } ];布局页面用嵌套路由承载侧边栏导航和顶部栏只写一次子页面通过router-view渲染。登录页登录成功后跳转到dashboard。在日常学习中需要练习路由参数传递的同学这里也是一个好样例比如从商品列表点击某个商品希望跳到商品详情页并携带商品ID就可以在router.push里带query参数详情页用route.query.goodsId接收。如果后端做了菜单权限也可以做动态路由登录后根据后端返回的菜单权限递归生成路由表用router.addRoute动态注册。对毕设来说把静态路由做清楚就已经足够动态路由可以作为加分项写在文档里但不必强行实现因为会显著增加复杂度。4.2 axios封装与跨域配置前后端联调的第一步前端和后端开发时地址一般不同前端开发服务器跑在5173Vite默认或8080Vue CLI默认后端接口跑在8080或9090。开发环境下直接请求http://localhost:8080/api/xxx必然触发跨域所以要用代理解决。Vue CLI项目里在vue.config.js中配置devServer.proxymodule.exports { devServer: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } };Vite项目则在vite.config.js中配置server.proxy写法类似。配置完成后前端代码里请求路径写成/api/user/login开发服务器会自动把请求转发到后端浏览器的同源限制被避开了原理就是前端服务端代替浏览器向后端发请求再返回给前端。axios的封装也很有必要。创建一个request.js文件给axios设置baseURL、超时时间、请求拦截器附上token和响应拦截器统一处理业务code。这样业务代码里只需要写api.salesTrend(params).then(res { this.chartData res.data; });不用在每个组件里重复处理错误。封装的时候要注意拦截器里判断code200才resolve否则reject并且统一提示message这样接口报错前端页面不会白屏用户也能看到具体原因。4.3 ECharts图表怎么把后端JSON渲染成分析面板销量数据分析系统的重头戏在图表。ECharts是目前绕不开的可视化库npm install echarts然后在需要的组件里按需导入或者全局注册。趋势图推荐用折线图x轴是日期y轴有两个系列销售额和销量。由于销售额可能是销量的几十倍两个系列共用一个y轴会让曲线高度差异过大建议用双y轴配置左边y轴显示销售额右边y轴显示销量。ECharts的yAxis属性支持数组分别配置即可。饼图用来展示品类占比数据来自/api/statistics/sales/category。后端返回的格式可能是[{name: 智能音箱, value: 4800}, {name: 智能门锁, value: 2300}]这个格式恰好可以直接作为ECharts饼图的data省去了前端转换的功夫。所以后端设计接口时多考虑前端展示结构比让前端拿到原始数据自己拼要友好得多。柱状图展示区域销量对比一个区域一根柱子颜色可以深浅区分华东最亮、其他区域依次变淡。图表变化还可以加个动画效果ECharts默认就有答辩的时候演示起来很加分。一个比较容易踩的坑是在mounted里发请求之后立即初始化图表结果数据还没回来图表是空的。解决办法是在请求回调里调用setOption或者用v-if/loading状态控制图表容器的渲染时机。还有一点如果图表容器设置了100%高度而父容器高度为0图表会显示不出来记得给div设置一个明确的高度比如400px。5. 销量数据分析的核心指标与计算细节5.1 常用分析指标的定义与统计口径销量数据分析常见的指标有总销量、总销售额、订单量、客单价、同比、环比、商品销售排行、品类占比。这些指标看似简单但统计口径如果含糊“分析”就失去了意义。总销量指所有订单明细中quantity的累计。总销售额指有效订单status为正常的total_amount累计。订单量指orders表的行数。客单价就是总销售额除以订单量表示平均每个订单里消费者花了多少钱。智能家居产品的特点是客单价高但购买低频一个消费者家里可能只买一次智能门锁所以客单价普遍在几百到上千元。时间对比分析要区分同比和环比。同比是跟去年同期比环比是跟上个周期比。比如2024年11月的销售额同比就是对比2023年11月环比就是对比2024年10月。计算方式统一为(本期值 - 上期值) / 上期值 * 100%。上期值为0时这个比值是没有意义的在Java代码里一定要做除零判断否则直接报ArithmeticException演示时就尴尬了。销量的时间粒度要根据查询范围动态调整查询一周数据按天统计查询一年数据按月统计查询三年数据按季度统计。我当时的实现是判断入参的startDate和endDate之间相差多少天超过一年就按month粒度聚合。这个逻辑放在service层前端不用关心接口参数只需要接收起止时间。5.2 排名和占比用SQL还是用Java算商品排行和品类占比两种计算方式都可以实现选择标准是数据量和SQL的可读性。数据量几万条的时候直接在SQL里GROUP BY ORDER BY LIMIT就好性能完全没有问题。如果数据量达到百万级以后再考虑用Java内存计算也不迟反而会让代码复杂。所以我的建议是SQL能做聚合的就交给SQLJava只做数据装配和补零。比如品类占比的SQLSELECT c.category_name AS name, SUM(oi.quantity) AS value FROM order_items oi JOIN products p ON oi.goods_id p.goods_id JOIN category c ON p.category_id c.category_id GROUP BY c.category_id ORDER BY value DESC;这条SQL返回的结果直接映射成List 再转成ECharts饼图需要的name-value数组就行。注意JOIN顺序要写清楚内连接去掉了没有匹配品类的商品避免出现null分类。商品排行里有一个容易出错的地方如果要按销量Top10统计同时还要展示该商品的总销售额那么排序字段是用quantity还是用amount两种口径得出的榜单不一样。按销量排便宜的智能插座可能排第一按销售额排贵价的智能门锁可能居首。我的建议是排行榜里同时展示两个指标排序主键按销量但也把销售额展示出来这样图表信息更丰富答辩时也能解释出“卖得多不一定赚钱单价高的商品贡献金额更大”这样的分析洞察。5.3 分析结果怎么落地从一个业务场景看数据价值数据分析系统如果只是把数据画成图多少有点“为了分析而分析”。落地到智能家居业务里这套数据的价值是可以支撑选品和库存决策的。比如我们按季度对品类做对比分析发现智能音箱的销量占比持续上升而智能插座稳定但客单价低。同时再看价格带数据可以进一步分析哪个价格区间销量最好比如999元以上的智能门锁明显卖得比599元以下的好说明消费者更信任高端产品。用SQL脚本生成的模拟数据里可以预设这种趋势。比如智能门锁的销量逐年增长智能音箱在双十一爆发摄像头在年中大促后平稳走低。这些规律并不复杂但分析出来之后页面上的结论性文字和图表对得上才显得像真正的“数据分析”。这部分在毕设里的呈现方式是“业务洞察”在页面下方放一个分析卡片写一句“本月智能门锁销量环比增长23.5%主要受新品上市带动建议提升备货量”马上就把项目的档次提升了。这也是这套项目和其他纯管理系统的最大区别很有参考价值。6. 部署运行与常见问题排查实录6.1 本地环境准备与启动顺序拿到这套源码以后第一步不是打开IDEA就跑而是先把环境理清楚。我用下来最稳定的环境组合是JDK 1.8、Maven 3.6、Node 14/16、MySQL 5.7/8.0、Vue CLI或Vite对应版本。JDK版本不要一味追新SpringBoot默认配置如果版本和JDK不匹配会出现各种奇怪报错。启动顺序建议固定为先导入SQL脚本再启动后端最后启动前端。数据库脚本用Navicat或命令行执行执行成功后检查一下关键表的数据量确认orders表有几万条数据再往后走。后端启动有几种方式IDEA直接运行main方法、命令行mvn spring-boot:run、或者先mvn clean package打成jar再java -jar运行。推荐最后一种方式因为和服务器部署一致不容易出现“本地能跑打包后不能跑”的问题。生产环境跑jar前记得看application.yml里的数据库地址、用户名、密码和时区配置spring: datasource: url: jdbc:mysql://localhost:3306/smart_home?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456前端启动在项目目录执行npm install安装依赖然后npm run dev看到提示说明启动成功。如果npm install很慢可以把registry切换到国内的npm镜像一条命令解决npm config set registry https://registry.npmmirror.com。6.2 最常见的几个坑以及我的排查思路我帮别人调试这类项目时遇到频率最高的报错就那几类这里列出来你遇到的时候可以直接对号入座。第一个是后端启动报数据库无法连接。错误信息通常是Access denied for user或者Communications link failure。检查三件事密码是否和URL里一致、MySQL服务是否启动、远程连接权限是否允许root从任意主机登录。很多同学用MySQL 8时会遇到认证插件问题可以在连接URL里加allowPublicKeyRetrievaltrue解决。第二个是前端请求接口报跨域或404。如果是开发环境检查proxy配置的target是否指向了后端实际端口路径是否带上了/api前缀。如果看到前端Network面板显示Request URL是http://localhost:3000/api/xxx而不是http://localhost:8080/api/xxx多半是proxy没生效重启前端开发服务器就好了。如果是生产环境部署后出现跨域就需要在Nginx里配置反向代理了。第三个是图表不显示或者数据为空。先用浏览器的Network面板看看接口返回的JSON是否正常如果正常则多半是数据结构对不上。ECharts的series.data是一个数组如果后端返回的是一个Object而不是数组图表自然空白。确认数据结构后再到组件里看图表初始化是不是在数据返回之前执行的加一个loading标记逐条排查。第四个是Maven依赖下载慢或无法下载。检查settings.xml里的mirror是否配置了阿里云镜像建议直接配全局mirror稳定省心。6.3 Docker部署扩展与答辩演示建议如果想把项目做得再完整一点可以把后端和前端分别打包成Docker镜像用docker-compose一键起服务。这里给一个后端Dockerfile示例FROM openjdk:8-jdk-alpine COPY target/smart-home.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, /app.jar]前端打包后是静态文件可以用nginx镜像承载再把dist目录拷贝进去。docker-compose里一般包含mysql、app、nginx三个服务数据库用挂载卷保证数据初始化脚本能自动执行。这套方案演示的时候非常稳只要对方机器有Docker环境克隆代码后docker-compose up -d就全起来了比在本地捣鼓环境要可靠得多。答辩演示时我个人有个心得提前准备一套固定演示路径比如先看总览指标再点进销量趋势切换时间范围让折线图变化再切到品类占比最后导出结论。演示过程控制在8到10分钟节奏要跟着图表的视觉变化走老师只要看到图表在动、数据在变就能直观感受到系统是真实运行的而不是PPT截图。平时自己演练时多留意接口响应时间如果某个统计接口超过3秒才返回多半是SQL少建了索引现场演示会很尴尬。我个人从这套项目里体会最深的一点是Java Web毕设最容易翻车的不是代码写不出来而是“各个模块拼不到一起”。数据库、后端、前端、接口文档任何一环脱节都会导致整个项目瘫痪。所以拿到这类完整源码不要急着全部跑起来先按模块拆开理解确认每一层之间怎么对接再动手改造成自己的内容。把表结构理清、接口文档过一遍、前端路由串一遍你就已经完成项目的一大半了。
网站建设高端定制企业官网