马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
网上手机销售系统开发实战笔记:从需求分析到SSM+Layui落地的完整记录 一、项目背景与需求分析
1 T4 R r9 A, ? C) b0 A9 E9 O6 b# Z
P& a6 N' J- r9 |- a手机是目前更新换代最快的消费电子产品之一,线上销售已经成为手机销售的主流渠道。一个功能完整的网上手机销售系统,需要覆盖商品展示、搜索筛选、购物车、下单支付、用户评价、后台管理等完整的电商业务链路。本项目就是围绕这一场景,从零搭建一套B/S架构的手机销售平台。
8 O. i/ @9 y, D2 i* V K在需求分析阶段,我们将系统角色划分为两类:普通用户和管理员。普通用户可以浏览手机商品、按条件搜索筛选、查看商品详情、加入购物车、立即购买、发表评论、在线留言、管理个人订单;管理员负责商品的增删改查、公告发布、订单管理等运营工作。系统还设计了积分体系,用户购买商品可以获得积分,增加用户粘性。" I3 Z- ?+ P& s& R+ k; i2 C$ \# i' y
图1 手机商城前台商品展示界面 二、技术选型与架构设计
# j" N- V6 S& v7 D9 Y; E0 b; V( S: \- K6 l* C M" _$ ]
后端选择SSM框架组合(Spring+SpringMVC+MyBatis),这是Java Web开发中最经典的轻量级框架组合,学习资料丰富,开发效率高。前端采用Layui框架,这是一款采用原生JavaScript编写的UI组件库,界面简洁美观,组件丰富,非常适合后台管理系统和中小型电商前台的快速开发。数据库使用MySQL 5.7+,服务器使用Tomcat 8.5。 K5 u4 b [. p U0 r2 E
) G/ s/ ^" x+ s( E* |5 [* Q层级9 Z4 X/ S* \5 ~; y
|
8 G S( b- N6 f5 c技术选型
7 P9 w3 C* `2 c+ [1 G | . S( c% i: P) ^) x/ W& W- n4 X: o
说明9 m9 E5 B4 Y# k' R+ B
| 7 t7 Z9 U0 Q! S% F" y% K' z
前端框架 t7 m B& M6 w
|
$ @- d- h4 i$ D# V8 d: D% vLayui + jQuery0 g% a% R: g V0 L* }% ~
| $ m, r% [( v# l5 v
轻量级UI组件库,模块化加载,适合快速开发! l) \+ W7 }5 \ v6 ]$ f- k
|
. Z+ @9 i! s1 B% S' U# g2 R后端框架
# p s8 o( d$ c/ \ |
7 ]& ~; m2 j: U0 xSSM(Spring+SpringMVC+MyBatis)
1 s- |/ r, D( Q. K+ X: T' Q# z |
8 e2 f) I8 j+ d7 h经典Java Web三层架构,轻量灵活
1 X5 G# `2 u2 O" T2 U | ' Q w* I0 w8 I8 Z/ {! s; v& K
数据库 L3 F6 i z& {2 x, E, ~
|
% C; A1 f9 G$ Z# C, z0 V9 z3 R1 UMySQL 5.7++ r- d" C; }& w& `. m
|
8 |. \# U: ]& Q1 `; w) I( W! E开源关系型数据库,性能稳定0 C! E# Z$ \1 R) ?
| 5 e# `0 X1 \/ g
服务器
" z& _4 ~1 `! s' b1 v3 f0 F* A | 3 i8 x0 P! t: ~, S
Tomcat 8.5
2 o# f- }7 G, i& } | 0 c& g0 k; s- X1 _2 e
轻量级Servlet容器
U0 D8 h( G7 E* l: t7 g: T |
- q+ |% [! p3 x3 ?! u* I. {开发工具( n2 i/ ]& c7 K1 d6 L
| 8 [) p4 V6 ?: T3 W n E
IDEA + Navicat
. a) z5 p4 a/ c7 r( o | $ g% @1 b+ R. b1 Q" }
主流Java IDE和数据库管理工具
% x3 F8 B8 l3 y& v. N3 \ | % [2 u' C a# x' H! {1 x
JDK版本- r0 p$ W" j2 E8 {- f" ~
|
5 K4 V2 \. x0 H) bJDK 8
- |! y) d& @7 b4 A6 u5 |: {5 \) j |
* k P3 a0 H2 g; N, j1 L兼容性最好的LTS版本
2 i' ^& o& O2 H9 m8 A | 2 M% M; Q5 B8 ^5 o/ F9 X* O
图2 SSM项目单体架构分层示意图 架构上采用标准的MVC三层模式:Controller层接收前端请求、参数绑定和视图跳转;Service层处理业务逻辑,如下单时的库存扣减、积分计算、订单生成;Mapper层通过MyBatis操作数据库。Spring负责依赖注入和声明式事务管理,确保下单等关键操作的原子性。- _' h' e6 V0 b6 e0 c. k+ B
三、数据库设计
/ ^- j) I# D% g& ~7 ]! j, {4 w$ q% }7 z+ y% s) c1 s
数据库设计是电商系统的核心,需要围绕"用户-商品-订单"这条主线展开。本系统的核心表包括用户表、手机商品表、购物车表、订单表、评论表、留言表、公告表等。以下是几张核心表的结构设计:
: v3 J1 b8 t1 B% J, t9 d3.1 手机商品表(phone)
4 t. l6 l. y' s
# X) o0 Q$ {* z* E. a+ y; M
/ H1 G3 Y( w. c; FCREATE TABLE `phone` (/ b5 ]$ q& { {: ]/ b5 d* F* t
`id` INT PRIMARY KEY AUTO_INCREMENT,( A# [: G" _+ W/ Q X
`name` VARCHAR(100) NOT NULL COMMENT '手机名称',
8 d* M* ?' {" w) g( r% _ `image` VARCHAR(255) COMMENT '商品图片',
/ m' ^: l& S' h5 R4 e/ ] `type` VARCHAR(50) COMMENT '手机类型',
2 b0 ]2 D3 S7 P$ } O, o/ T `is_new` TINYINT DEFAULT 0 COMMENT '是否新品 0否 1是',8 J0 z. @: E0 ^+ J* S5 E$ t# ^
`is_special` TINYINT DEFAULT 0 COMMENT '是否特价 0否 1是',5 Z6 @, d# h% d) D7 V
`stock` INT DEFAULT 0 COMMENT '库存数量',% [% C6 M) i" l! O# o) r
`original_price` DECIMAL(10,2) COMMENT '原价',; U4 B! |' Z0 y0 v/ L$ a- o: V% }
`current_price` DECIMAL(10,2) NOT NULL COMMENT '现价',
1 m& o0 z+ G. A9 _; q& s* z `points` INT DEFAULT 0 COMMENT '购买获得积分',! Y2 ^# w" c; N. ~0 J. v0 ~& h
`description` TEXT COMMENT '手机简介',
& b7 ^0 A9 y4 y. L `views` INT DEFAULT 0 COMMENT '点击次数',
) U1 s6 Z+ e/ l) s2 R `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,% I( Z) J) d. K2 s# P! ]0 m
INDEX idx_type (`type`),; Z: W% L0 f) |5 L+ w$ I4 d" l
INDEX idx_new (`is_new`),
# [+ r; k9 ~3 P9 j" R$ [9 Q INDEX idx_special (`is_special`)
4 q" t3 H1 X+ z% G# I$ E) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='手机商品表';, w! _$ \. ~$ @0 X
3.2 订单表(orders)
3 i4 D* g) ~4 w5 R2 P0 ^6 x- O5 j& x2 B9 B
# j5 K9 w7 a4 Y( c: UCREATE TABLE `orders` (4 [: Q3 i6 @) y# f, b* }
`id` INT PRIMARY KEY AUTO_INCREMENT,$ G: N7 H) K: d$ [, H* ^2 o
`order_no` VARCHAR(50) NOT NULL UNIQUE COMMENT '订单编号',
8 G$ [4 o: N( W `user_id` INT NOT NULL COMMENT '用户ID', d8 k4 c3 u) c+ K% Q, L
`phone_id` INT NOT NULL COMMENT '商品ID',
6 I3 \$ |; g6 X `quantity` INT NOT NULL COMMENT '购买数量',3 p! l1 y6 z ]/ C* X% B; U$ }
`total_price` DECIMAL(10,2) NOT NULL COMMENT '订单总价',
6 r* N4 |" i5 E. S `status` TINYINT DEFAULT 0 COMMENT '订单状态 0待付款 1已付款 2已发货 3已完成',
" q" E% q( |' P* o" J( e `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,6 z: B. J# {6 w. v
INDEX idx_user (`user_id`),/ @* k z4 U' \& Y1 @
INDEX idx_status (`status`)0 t7 {" C! @$ l+ e. D
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';$ K* n, X# u- c' \5 E2 f8 d
3.3 购物车表(cart)
0 r, X. ]8 |! x& g( U5 c6 ~* O) @* d$ c0 O$ L, ^
9 k6 n$ w4 p4 f: B
CREATE TABLE `cart` (
m- z, z+ m# h9 Y F5 ~; E `id` INT PRIMARY KEY AUTO_INCREMENT,4 z% O# D- B8 Y, f; B# Q
`user_id` INT NOT NULL COMMENT '用户ID',
; \0 H- j7 |- o( b! _ {; v/ n `phone_id` INT NOT NULL COMMENT '商品ID',: P/ \. R, W- W1 ?4 O- P
`quantity` INT DEFAULT 1 COMMENT '数量',2 L& r. ^3 L2 _1 z6 p
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,. v2 q$ A+ c. @; V
UNIQUE KEY uk_user_phone (`user_id`, `phone_id`),
' y' i3 A4 f3 B INDEX idx_user (`user_id`)
, S4 Z! Z* i" t1 Q9 y- F5 i% ^; G) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='购物车表';
3 ?' o E5 J3 S6 I. n数据库设计的几个关键点:一是商品表用is_new和is_special两个布尔字段标记新品和特价,便于前台筛选和后台运营;二是购物车表用user_id+phone_id做联合唯一索引,同一商品在购物车中只保留一条记录,通过quantity累加数量;三是订单表独立存储订单快照信息,避免商品价格变动影响历史订单;四是所有查询字段都建立了索引,保证列表页和搜索页的查询性能。+ `8 K2 `. C) f9 x
四、前台核心功能实现
O! A4 i1 K) q
3 h+ |$ h/ C: R4.1 商品浏览与搜索筛选5 l: q7 }; d3 Q; [6 J
4 `, s* D$ ?& ?. B `+ f
商品列表页支持按手机类型筛选(全部、类型1-4),也支持多条件组合搜索:手机名称关键词、是否新品、是否特价。搜索条件通过表单提交到Controller,Service层使用MyBatis动态SQL拼接查询条件,实现灵活的条件查询。列表页采用Layui的流式布局展示商品卡片,每张卡片显示商品图片、名称、价格等信息。1 h( b% r6 D8 z' p2 ?: o
<!-- MyBatis动态SQL搜索 -->- b1 K; U u7 N. e, A
<select id="searchPhones" resultType="Phone">. o% ]1 |; ^, H C0 i& b
SELECT * FROM phone
3 g0 A: X6 \2 r$ z <where>
8 H9 c, J& [; l w <if test="name != null and name != ''">
# w( n/ o- C8 e0 }# X% e AND name LIKE CONCAT('%', #{name}, '%')
4 B+ T- \& K0 y- A </if>) [) O1 E# y' D0 v U
<if test="isNew != null">
( e/ |8 y c4 G AND is_new = #{isNew}
2 M) ?* M% ]& D" h </if>* q, \3 L8 [' Z6 b7 f
<if test="isSpecial != null">' y: N& F" `0 {) b" Y; w9 c) A$ e9 ~
AND is_special = #{isSpecial}
7 }8 `0 E O/ U. e9 E9 ?& { </if>
, t* ?# k& Y% y6 N <if test="type != null and type != ''">
0 v. |" \% k- U) t) Y2 U0 `, ~6 b AND type = #{type}' o! V# n0 X0 L/ Y" Z5 U! r
</if>0 P: z: o9 X( ~2 [: H9 n* U0 h
</where>) H- C! X# X o
ORDER BY create_time DESC8 g: Y# h9 _0 S
</select>
5 I2 B. n$ d* u5 q6 w+ ~4.2 商品详情与点击量统计/ N& p0 b; @7 y& X4 O( }8 K6 ?
4 o4 m9 Q) O/ A1 \+ e9 a点击商品进入详情页,展示完整的商品信息:手机名称、类型、是否新品、是否特价、库存、原价、现价、购买获得积分、点击次数、商品简介,以及评论区。每次访问详情页时,点击次数字段views自动加1,用于统计商品热度,可后续用于热门推荐排序。
4 ]; z* H- a. L3 r$ L1 ^4.3 购物车与下单
5 Q$ y6 H( n7 Y, Z
& P/ X# L4 _/ n0 |: a用户在详情页可以选择购买数量,点击"添加到购物车"或"立即购买"。添加购物车时,如果该商品已在购物车中则数量累加,否则新增一条记录。立即购买直接跳转到订单确认页,提交后生成订单,同时扣减库存、增加用户积分。下单成功后弹出提示"下单成功,点击确定后跳转我的订单页面"。& \0 r* l* C) ]. ?# N
// 下单业务逻辑(事务控制)
- H+ y. i4 w3 E9 r@Transactional0 q( q1 T ?& b% b2 N& g; f" {$ p$ e
public Map<String, Object> placeOrder(Integer userId, Integer phoneId, Integer quantity) {
& Q" ?; P# P, C. p D$ y; j& q# N Map<String, Object> result = new HashMap<>();; Z& }0 Y& H. _5 M: v7 H ^
// 1.检查库存
& b3 K) ^( _. u) A- \ Phone phone = phoneMapper.selectById(phoneId);' q% X+ y1 f& @6 N2 g6 j
if (phone.getStock() < quantity) {1 K; N# k+ k( \+ i
result.put("code", 1);; C' u, r: S) d7 f! w8 K
result.put("msg", "库存不足");9 p) W& a2 @1 n' H& l
return result;0 j/ b9 V% w3 P: w1 h
}
, ^( b( _9 i4 g( K0 B! V // 2.扣减库存
N( x2 k* E# S phoneMapper.decreaseStock(phoneId, quantity);
5 v# k9 f* x8 {: z* M* y // 3.生成订单
) O! o7 A. e; J: K6 p Orders order = new Orders();* ?: x6 I) U: B% F5 p- Y! |
order.setOrderNo("ORD" + System.currentTimeMillis());, e* [- ?- C% F Y! ?6 }+ ]
order.setUserId(userId);
& P4 E. ~5 F3 V( W5 P6 x/ T- J7 c order.setPhoneId(phoneId);
0 k" }/ Y- }: @. G9 C1 ~/ f3 F2 l& i3 I, F order.setQuantity(quantity);
) k% A9 k, ?) s% @5 ?% \ ^ order.setTotalPrice(phone.getCurrentPrice().multiply(new BigDecimal(quantity)));: M. B n' D3 h2 g+ h+ I7 K$ A
order.setStatus(0);
! @5 v; y$ i" o6 x( M orderMapper.insert(order);! E. X% ]# p/ p/ e3 d8 t# L. h: C
// 4.增加用户积分
# a& e' Y2 z: g+ p: Q7 Q2 R userMapper.addPoints(userId, phone.getPoints() * quantity);- O. `/ o, E {" |0 S
result.put("code", 0); `3 S+ I- q4 o7 N6 c
result.put("msg", "下单成功");
: J1 U8 J& f7 k0 a2 y result.put("orderNo", order.getOrderNo());: g7 r/ M! t0 a, ~
return result;
5 {5 `0 M5 u% O. g( ]}
3 |* t2 _! W% b, `4 ^4.4 评论与留言
6 @0 X; l) e6 |- U! R, h0 ]3 v; _- C( M1 Q. U4 Z7 R
商品详情页底部有评论区,用户可以发表评价,管理员可以回复评论。留言板是独立的公开交流区,用户可以发布留言标题和内容,其他用户可以查看,管理员可以回复。评论和留言都按时间倒序排列,提升互动体验。/ u6 F4 Z2 Y$ q- Q
五、后台管理功能实现) m. |3 N5 Q8 V
' p) A/ z Y" }6 m7 N图3 后台商品列表管理界面 5.1 商品管理
) {5 ` o3 v( p$ W( C" A: U/ ^% s8 X9 g
后台商品管理以表格形式展示所有手机商品,列包括:商品图片、名称、类型、是否新品、是否特价、库存、原价、现价、积分、点击次数、操作。管理员可以新增、编辑、删除商品,编辑页面支持上传商品图片、设置新品/特价标签、调整价格和库存等。商品管理是后台最核心的功能,直接影响前台展示。
; L @) D; ^/ d8 V0 A! C- I0 R0 h5.2 公告管理
0 b. V9 [3 t. m
7 ], s9 `1 N6 l8 {* J6 V. ?公告管理支持新增公告、修改公告、删除公告。公告在前台首页展示,用于发布促销活动、新品上架、系统维护等通知信息。公告内容支持富文本编辑,可以插入图片和格式化文字。9 W; v ?3 m/ B# j$ N8 e5 k
5.3 订单管理
7 H" |6 d. o" E3 G4 ~
3 H4 D6 H) S; c' v) p7 z管理员可以查看所有订单,按订单状态筛选(待付款、已付款、已发货、已完成),可以更新订单状态(如标记发货)。订单管理是电商运营的核心环节,确保交易流程顺畅。* s: ^! g9 b* ~( G6 i( w4 Q
六、开发中的关键技术点% l; X2 z: Y/ I; U
) D1 c/ y1 ~# X# g6.1 积分体系设计
0 i/ y: s# ^2 M2 W7 _+ T* S
. G( K. ^8 c( m. G6 w* J系统设计了购买获得积分的机制,每件商品设置一个积分值(points字段),用户下单成功后,积分累加到用户账户。积分可以后续扩展为积分兑换、会员等级等功能。积分计算放在下单事务中,确保与订单生成的原子性。
6 ~! E1 c( k" t+ L9 b6 U% P6.2 新品与特价标签
0 [. n7 Y* z' I
' \' r! r1 x4 ?- X商品表中的is_new和is_special两个字段是运营的重要工具。新品标签用于展示新上架的手机,特价标签用于促销活动。前台列表页可以按这两个条件筛选,商品详情页也会显示对应的标签,提升营销效果。
. L1 i' D8 o2 e6.3 Layui前端组件化
, o. k0 H, ]+ ?! ~$ g; x( |( x0 g1 @% B9 E
前端使用Layui的模块化加载机制,通过layui.use()引入需要的模块(如layer弹窗、form表单、table表格)。Layui的form模块提供了表单验证、下拉框、开关等组件,table模块可以快速渲染数据表格,layer模块提供弹窗提示,大大提升了前端开发效率。" u* i% K& ~* p. {4 f
6.4 文件上传 r) r( P- D0 [2 d
- d% h5 T2 e. B x
商品图片和用户头像都需要文件上传功能。SpringMVC通过配置CommonsMultipartResolver实现文件上传,Controller中用MultipartFile接收,保存到服务器upload目录,将相对路径存入数据库。前台通过img标签直接引用路径显示图片。! M+ A, i& @+ _! C( v- G, Q
七、部署与运行步骤
! m0 c7 P% c; O. _6 F$ r" z6 d. C$ C: F' a) h0 S9 L6 M
2 C* n0 G# i& h; W e" g
1. 环境准备:安装JDK 8、MySQL 5.7+、Tomcat 8.5,配置JAVA_HOME和CATALINA_HOME环境变量。
% G7 `; e6 P" D- q/ F8 _2. 数据库初始化:创建数据库phone_shop,执行项目中的SQL脚本创建表结构和初始测试数据。, A# I0 \% M6 @+ M. o
3. 项目导入:用IDEA打开项目,修改jdbc.properties中的数据库连接地址、用户名、密码。5 ~' c- C( o+ M5 w K6 t6 L
4. 上传目录配置:确保项目中配置的文件上传目录存在且有写入权限。
H( u3 F3 d# C, j: E, D! ]5. 部署运行:在IDEA中配置Tomcat Server,将项目部署到Tomcat,启动服务。
- T/ Q! z2 h2 U/ H- _0 `" o6. 访问系统:浏览器打开http://localhost:8080/项目名,前台首页直接访问,后台管理使用admin账号登录。
0 L/ Z* D& O4 M3 ]. O$ t2 A八、开发踩坑与优化记录
7 Z, q1 T) O- y- f
) h; E6 n: O& v3 \ Y% {3 _, v2 q* y" w- a5 i+ P! d9 ]& A) ~
第一,事务管理。最初下单操作没有加@Transactional注解,遇到库存扣减成功但订单生成失败的情况,导致数据不一致。后来在Service层的下单方法上加了@Transactional注解,确保库存扣减、订单生成、积分增加三个操作要么全部成功要么全部回滚。
, m7 R) S+ z. Y1 y0 h' O第二,动态SQL拼接。搜索功能最初用if-else拼接SQL字符串,容易出错且难以维护。后来改用MyBatis的动态SQL标签(where、if、choose),代码更清晰,也避免了SQL注入风险。$ }7 |6 {& ?/ ?0 G* O. J
第三,购物车重复添加。最初没有加联合唯一索引,用户重复点击"加入购物车"会生成多条记录。后来在cart表加了user_id+phone_id的联合唯一索引,同时在Service层判断是否已存在,存在则更新数量,不存在则新增。
6 E0 G( {5 ]" y& A* J第四,Layui模块加载。最初在页面中直接使用layer.alert(),但没有先layui.use("layer"),导致报错。后来统一在页面顶部用layui.use()引入需要的模块,在回调函数中使用,解决了模块未加载的问题。( `# g2 N5 w# ?% Q7 e9 w
第五,图片路径问题。开发环境和生产环境的上传目录路径不同,最初写死了绝对路径,部署后图片无法显示。后来改成相对路径,通过配置文件指定上传目录,前台用上下文路径拼接,解决了环境差异问题。5 V2 P- b8 J$ H/ J! ?
九、同类选题的拓展方向3 z' }( c8 z$ P; m: f$ k/ d% _
3 N4 Z J" X2 D9 i8 ^! ]
如果你对电商系统开发感兴趣,这个选题还有不少可以深入的角度:
7 k) O; c9 _% \/ w/ |) J' q* t9 M& o1. 接入在线支付。目前系统只模拟了下单流程,接入支付宝沙箱或微信支付后,可以实现真实的支付流程,研究支付回调、订单状态同步等技术。% H! r$ f1 A+ D/ J, _
2. 秒杀功能实现。针对特价手机设计秒杀活动,研究高并发下的库存超卖问题,使用Redis缓存、分布式锁、消息队列等技术方案。3 T% `9 B6 ^6 F B% p. x
3. 商品推荐系统。基于用户浏览历史和购买记录,用协同过滤算法实现个性化商品推荐,提升转化率。
; L$ h1 d& z" p) {- o; u' c4. 前后端分离重构。将前端从JSP改为Vue.js,后端提供RESTful API,研究前后端分离架构和JWT认证。
$ @ d4 t* |+ s: U% Y {5. 多品类电商平台。从手机单一品类扩展到多品类(数码、家电、服饰),设计SKU体系、分类管理、属性模板等通用电商功能。
* {' b/ w8 I, X, H% V/ i& v L9 y" \十、写在最后$ o* X. j ]$ o
2 Z4 }" p: g r$ [3 r+ J& z网上手机销售系统是一个非常典型的电商项目,覆盖了商品管理、搜索筛选、购物车、下单、评论、留言、后台管理等完整的业务流程。从技术角度看,它展示了SSM框架在实际项目中的完整应用,包括动态SQL、事务管理、文件上传、Layui前端组件化等常见技术点;从业务角度看,它包含了积分体系、新品/特价标签等电商运营元素。
! T- x' }! m" t( s6 S资料中包含完整的项目源码、数据库脚本、10000字以上的设计论文,拿到手可以直接导入IDEA运行,也可以在基础上根据自己的需求扩展功能。适合计算机科学与技术、软件工程、电子商务等专业的同学做课程设计或毕业设计参考。需要的同学可以在附件中下载全套资料。; E7 u/ J8 i9 o
8 \. s1 i: j I# v$ |
关键词标签:网上手机销售系统 电商平台 SSM框架 Layui 购物车 订单管理 MySQL Java Web 积分体系 毕业设计
: z" J+ T7 N. }% R% Y; R, ?8 j+ D+ [, K
|